$.fn.updateTablePager = function() {
	return this.each(function() {
		if (this.tableWidget) {
			document.getElementById(this.tableWidget).update()
		}
	});
};

jQuery.fn.tablePager = function(options){
	settings = jQuery.extend({
		sourceURL: '',
		dataContainerTag: '',
		dataTag: '',
		custonLineRender: '',
		colunms: [],
		oddColor:'#E6EAEE',
		showSearchTool:true,
		nextButtonText:'',
		prevButtonText:'',
		filtersTP: [],
		rowCallBack:'',
		updateSuccess:'',
		updateFail:'',
		forceUpdate:false
	}, options);

	return this.each(function(){
		var table = this;
		if(table.tableWidget){
			if(settings.forceUpdate){
				document.getElementById(this.tableWidget).dataSource = settings.sourceURL;
				document.getElementById(this.tableWidget).update();
				return true;
			}
			jQuery(table).updateTablePager();
			return true;
		}
		var tableWidget = document.createElement('div');
		jQuery(tableWidget).generateId();
		tableWidget.id = table.id + tableWidget.id ;
		table.tableWidget = tableWidget.id;

		tableWidget.parseResponseXML = function(xml){
			tableWidget.pages = parseInt(jQuery(tableWidget.dataContainerTag, xml).attr('pages')) ;
			if (typeof(tableWidget.updateSuccess) == 'function') {
				tableWidget.updateSuccess(jQuery(tableWidget.dataContainerTag, xml));
			}
			jQuery("tbody", table).empty();
			jQuery(table.tBodies).each(function(){table.removeChild(this)});
			var nBody = document.createElement('tbody');
			jQuery(tableWidget.dataTag, xml).each(function(){
				var tr = document.createElement('tr');
				jQuery(tr).hover(
					function() {
						$(this).addClass('ui-state-highlight');
					},
					function() {
						$(this).removeClass('ui-state-highlight');
					}
				)
				
				var dataLine;
				dataLine = this;
				jQuery(tableWidget.columns).each(function(){
					td = document.createElement('td');
					if(this.visible === false){
						$(td).css('display','none');
					}
					if(this.align){
						td.align= this.align;
					}
					 
					if (typeof(this.renderFn) == 'function') {
						var lineValues = Array();
						jQuery(dataLine.childNodes).each(function(){
							var atrib = this.nodeName;
							if (this.firstChild) {
								lineValues[atrib] = this.firstChild.nodeValue;
							}else{
								lineValues[atrib] = '';
							}
						});
						celData = this.renderFn(lineValues);
						}
					else {

						celData = '';
						if (this.name != '') {
							celData = jQuery(this.name, dataLine).text();
						}
						
					}

					jQuery(td).append(celData);
					tr.appendChild(td);
				});
				if(typeof(tableWidget.rowCallBack) == 'function' ){
					var lineValues = Array();
					jQuery(dataLine.childNodes).each(function(){
						var atrib = this.nodeName;
						if (this.firstChild) {
							lineValues[atrib] = this.firstChild.nodeValue;
						}else{
							lineValues[atrib] = '';
						}
					});
					tableWidget.rowCallBack(tr,lineValues);
				}
				nBody.appendChild(tr);
			});
			table.appendChild(nBody);
		}
		
		tableWidget.update = function(){
			jQuery('.ui-widget-overlay',tableWidget).show();
			var postData = {};
			if(tableWidget.useFilter ){
				postData = tableWidget.filterObject;	
			}
			postData['pageNumber'] = tableWidget.page;
			postData['searchValue'] = tableWidget.searchValue;
			postData['totalPage'] = tableWidget.pages;
			postData['itemsPerPage'] = tableWidget.itemsPerPage;
			try{
				sortColunms = []
				for(sortValue in tableWidget.sortColunms){
					sortColunms.push(tableWidget.sortColunms[sortValue]);
				}
				postData['sort[]'] = sortColunms;
			}catch(e){
				
			}
			

			jQuery.ajax({
				type: 'POST',
				async: false,
				url: tableWidget.dataSource,
				data:postData,
				dataType: 'xml',
				success:tableWidget.parseResponseXML
			});
			jQuery('.ui-widget-overlay',tableWidget).hide();
			tableWidget.updatePager();
		};
		
		tableWidget.drawPager = function(){
			var divPager = document.createElement('div');
			divPager.className = 'tablePager-navi-container';
			var status = jQuery('<span class="tablePager-status"/>').appendTo(divPager);
			var prev = jQuery('<a class="tablePager-prev dt-button ui-state-default ui-corner-all">&nbsp;<img class="ui-icon" src="/images/icons/arrow_left.png"/></a>').appendTo(divPager);
			var navi = jQuery('<span class="tablePager-navi"/>').appendTo(divPager);
			var next = jQuery('<a class="tablePager-next dt-button ui-state-default ui-corner-all">&nbsp;<img class="ui-icon" src="/images/icons/arrow_right.png"/></a>').appendTo(divPager);
			var clear = jQuery('<div style="clear:both"/>').appendTo(divPager);
			prev.click(function(){if (tableWidget.page > 1){tableWidget.page--;tableWidget.update();}});
			next.click(function(){if (tableWidget.page < tableWidget.pages){tableWidget.page++;tableWidget.update()}});
			jQuery('.ui-state-default', divPager).hover(function(){
				if (jQuery(this).hasClass('ui-state-default')) jQuery(this).addClass('ui-state-hover');
			}, function(){
				jQuery(this).removeClass('ui-state-hover');
			});
			tableWidget.appendChild(divPager);
		};

		tableWidget.updatePager = function(){
			if(tableWidget.pages > 1){
				jQuery('.tablePager-navi-container',tableWidget).show();
			}else{
				jQuery('.tablePager-navi-container',tableWidget).hide();
				return;
			}
			jQuery('.tablePager-status',tableWidget).text('Pag. '+tableWidget.page +' de '+tableWidget.pages);
			var startPage = 1;
			var endPage = 1;
			startPage = tableWidget.page < 4 ? 1 : tableWidget.page - 2;
			endPage = tableWidget.page < 4 ? 5 :  tableWidget.page + 2 ;
			if(endPage > tableWidget.pages  ){
				endPage = tableWidget.pages;
				startPage = endPage - 2;
			}
			if(startPage == 0) startPage = 1;
			
			navi = jQuery('.tablePager-navi',tableWidget);
			navi.empty();
			for(i = startPage ;i < endPage + 1 ; i ++){
				pageButton = jQuery('<a class="dt-button ui-corner-all">'+i+'</a>').appendTo(navi);
				if(tableWidget.page == i){
					pageButton.addClass('ui-state-default ui-state-hover');
				}else{
					pageButton.data('page',i);
					pageButton.click(function(){tableWidget.page=jQuery(this).data('page');tableWidget.update()});
				}
			}
			prev = jQuery('.tablePager-prev',tableWidget);
			next = jQuery('.tablePager-next',tableWidget)
			if (tableWidget.page == 1) {
				prev.removeClass('ui-state-default');
				prev.removeClass('ui-state-hover');
				jQuery('img',prev).hide();
			}else{
				prev.addClass('ui-state-default');
				jQuery('img',prev).show();
			}
			if (tableWidget.page == tableWidget.pages) {
				next.removeClass('ui-state-default');
				next.removeClass('ui-state-hover');
				jQuery('img',next).hide();
			}else{
				jQuery('img',next).show();
				next.addClass('ui-state-default');
			}
		};

		tableWidget.search = function(searchValue){
			tableWidget.page = 1;
			tableWidget.pages = 0;
			tableWidget.searchValue = jQuery.trim(searchValue) ;
			if(!tableWidget.useFilter && tableWidget.searchValue == '') return;
			jQuery('.refreshTablePagerButton',tableWidget).show();
			tableWidget.update();
		};

		tableWidget.addFilterTP = function(key,value){
			tableWidget.filterObject[key]=jQuery.trim(value);
		};

		tableWidget.headerClick = function(colunmName,colunm){
			colunmName = colunmName;
			if(tableWidget.multiSort == false){
				tmpColumnSort = tableWidget.sortColunms[colunmName];
				tableWidget.sortColunms = [];
				tableWidget.sortColunms[colunmName] = tmpColumnSort;
				jQuery('th span.ui-icon', tableWidget).addClass('ui-icon-carat-2-n-s');
				jQuery('th span.ui-icon', tableWidget).removeClass('ui-icon-triangle-1-s');
				jQuery('th span.ui-icon', tableWidget).removeClass('ui-icon-triangle-1-n');
			}
			
			switch(tableWidget.sortColunms[colunmName]){
				case colunmName+':A':
					tableWidget.sortColunms[colunmName] = colunmName+':D';
					jQuery('.ui-icon',colunm).removeClass('ui-icon-triangle-1-n');
					jQuery('.ui-icon',colunm).addClass('ui-icon-triangle-1-s');
					
				break;
				case colunmName+':D':
					delete tableWidget.sortColunms[colunmName];
					jQuery('.ui-icon',colunm).addClass('ui-icon-carat-2-n-s');
					jQuery('.ui-icon',colunm).removeClass('ui-icon-triangle-1-s');
				break;
				default:
					tableWidget.sortColunms[colunmName] = colunmName+':A';
					jQuery('.ui-icon',colunm).addClass('ui-icon-triangle-1-n');
					jQuery('.ui-icon',colunm).removeClass('ui-icon-carat-2-n-s');
				break;
			}
			tableWidget.update();
		}

		tableWidget.init = function(){
			jQuery(table).before(tableWidget);
			tableWidget.filterObject = {};
			tableWidget.filtersTP = [{}];
			tableWidget.page = 1;
			tableWidget.pages = 0;
			tableWidget.dataSource = settings.sourceURL;
			tableWidget.dataContainerTag = settings.dataContainerTag;
			tableWidget.dataTag = settings.dataTag;
			tableWidget.columns = settings.colunms;
			tableWidget.searchValue = '';
			tableWidget.rowCallBack = settings.rowCallBack;
			tableWidget.updateSuccess = settings.updateSuccess;
			tableWidget.multiSort = false;
			tableWidget.filtersTP = settings.filtersTP;
			tableWidget.sortColunms = [];
			tableWidget.style.position='relative';
			itemsPerPage = tablePagerReadCookie('itemsPerPager_'+tableWidget.id);
			tableWidget.itemsPerPage=itemsPerPage!=''? parseInt(itemsPerPage):30;
			var divOverLay = document.createElement('div');
			divOverLay.className = 'ui-widget-overlay';
			jQuery(divOverLay).css('z-index','999');
			tableWidget.page = 1;
			var divToolContainer = document.createElement('div');
			divToolContainer.className = 'tablePager-tools-container';
			if(settings.showSearchTool == true){
				var inputSearch = jQuery('<input type="text" class="TablePagerSearchText"/>')
					.keypress(function(e){
						if (e.which == 13 && this.value != '') {
							tableWidget.search(this.value);
						}
					});
				divToolContainer.appendChild(inputSearch.get(0));
				if (tableWidget.filtersTP.length > 0) {
					var divFilterContainer = document.createElement('div');
					jQuery(divFilterContainer).css('display','none');
					jQuery(divFilterContainer).addClass('filterContainer');
					jQuery(tableWidget.filtersTP).each(function(){
						divFilter = document.createElement('div');
						jQuery(divFilter).addClass('filter');
						inputFilter = document.createElement('input');
						inputFilter.name = this.name;
						inputFilter.id = this.name;
						inputFilter.type = 'text';					
						labelFilter = document.createElement('label');
						labelFilter.innerHTML = this.label;
						if(this.type == 'date'){
							inputFilter.size = '12';
							if(systemSettings.dateFormat=='d-m-Y'){
								dateFormat = 'dd-mm-yy'
							}else{
								dateFormat = 'mm/dd/yy';
							}  ;
							
							jQuery(inputFilter).datepicker({ dateFormat: dateFormat });
						}
						if(this.type == 'option'){
							inputFilter = document.createElement('select');
							inputFilter.name = this.name;
							inputFilter.id = this.name;
							try {
								if (this.dataSource.url) {
									var dataSourceURL = this.dataSource.url;
									var dataSourceNode = this.dataSource.node;
									var Options =[];
									Options.push({value:'',label:''});
									jQuery.ajax({
										type: 'GET',
										async: false,
										url: dataSourceURL,
										dataType: 'xml',
										success: function(responseXML){
											jQuery(dataSourceNode, responseXML).each(function(){
												newOption = {
													value: jQuery(this).attr('value'),
													label: jQuery(this).text()
												};
												Options.push(newOption);
											})
										}
									});
									this.options = Options;
								}
							}catch(err){}
							jQuery(this.options).each(function(){
								var op = document.createElement('option');
								op.value = this.value;
								op.innerHTML = this.label;
								inputFilter.appendChild(op);
							});
						}
						divFilter.appendChild(labelFilter);
						divFilter.appendChild(inputFilter);
						divFilterContainer.appendChild(divFilter);
					});
					divToolContainer.appendChild(divFilterContainer);
				}
				buttonSearch = jQuery('<a class="dt-button ui-state-default dt-button-icon-left ui-corner-all TablePagerSearchButton"><img class="ui-icon" src="/images/icons/magnifier.png"/>Buscar</a>')
					.click(function(){
						if (typeof(divFilter) != 'undefined') {
							jQuery('input,select', divFilter).each(function(){
								tableWidget.addFilterTP(this.name, this.value);
							})
						}
						tableWidget.search(inputSearch.get(0).value);
					});
				divToolContainer.appendChild(buttonSearch.get(0));
				if (tableWidget.filtersTP.length > 0) {
					buttonOpenFilter = jQuery('<a style="margin-right:5px" class="dt-button dt-button-icon-left ui-corner-all ui-state-default TablePagerAvanceSearchButton"><img class="ui-icon" src="/images/icons/filter.png"/>B&uacute;squeda avanzada</a>');
					buttonOpenFilter.click(function(){
							if(jQuery(divFilterContainer).css('display') == 'none'){
								inputSearch.value = '';
								tableWidget.useFilter = true;
								jQuery(this).addClass('ui-state-active');
							}else{
								jQuery('input',divFilterContainer).val('');
								jQuery(this).removeClass('ui-state-active');
								tableWidget.useFilter = false;
							};
						jQuery(inputSearch).toggle();
						jQuery(divFilterContainer).toggle();
					});
					
					divToolContainer.appendChild(buttonOpenFilter.get(0));
				}
				buttonRefresh = jQuery('<a style="display:none;" class="dt-button dt-button-icon-left ui-corner-all ui-state-default refreshTablePagerButton"><img class="ui-icon" src="/images/icons/arrow_refresh.png"/>Volver al listado completo</a>')
					.click(function(){
						inputSearch.val('');
						tableWidget.searchValue = '';
						if (typeof(divFilter) != 'undefined') {
							jQuery('input,select', divFilter).val('');
							
							jQuery('input,select', divFilter).each(function(){
								tableWidget.addFilterTP(this.name, this.value);
							})
						}
						jQuery(this).hide();
						tableWidget.update();
					});
				divToolContainer.appendChild(buttonRefresh.get(0));
				divClear = jQuery('<div style="clear:both"/>');
				divToolContainer.appendChild(divClear.get(0));
			}
			tableWidget.appendChild(divOverLay);
			tableWidget.appendChild(divToolContainer);
			tableWidget.appendChild(table);
			tableWidget.drawPager();
			var divTablePagerSettings =  document.createElement('div');
			divTablePagerSettings.className = 'colmnSettings';
			columnShowHideButtom = document.createElement('span');
			columnShowHideButtom.className = 'ui-icon ui-icon-wrench';
			$(columnShowHideButtom).css('float','right');
			var divSettingsItems =  document.createElement('div');
			if(isNaN(tableWidget.itemsPerPage)){
				tableWidget.itemsPerPage = 30;
			}
			jQuery(divSettingsItems).append('<hr/>Lineas por pagina:&nbsp;<span class="TablePagerItemsPerPage">'+tableWidget.itemsPerPage+'</span><ul style="display:none" class="TablePagerItemsPerPage"><li>10</li><li>20</li><li>30</li><li>50</li></ul><hr />');
			jQuery('span.TablePagerItemsPerPage',divSettingsItems).click( function(){jQuery('ul.TablePagerItemsPerPage').toggle();});
			jQuery('ul.TablePagerItemsPerPage li',divSettingsItems).click(function(){
				jQuery('span.TablePagerItemsPerPage',divSettingsItems).html(this.innerHTML);
				tableWidget.itemsPerPage = parseInt(this.innerHTML);
				tablePagerCreateCookie('itemsPerPager_'+tableWidget.id,tableWidget.itemsPerPage,365);
				jQuery('ul.TablePagerItemsPerPage').hide();
				tableWidget.page = 1;
				tableWidget.update();
			});
			$(divTablePagerSettings).mouseenter(function(){
				jQuery(this).css('width','200px');
				jQuery(divSettingsItems).show();
			});
			$(divTablePagerSettings).mouseleave(function(){
				jQuery(this).css('width','18px');
				$(divSettingsItems).hide('fast');
			});

			divTablePagerSettings.appendChild(columnShowHideButtom);
			var columnShowHideUL = document.createElement('ul');
			$(divSettingsItems).css('display','none');
			divSettingsItems.appendChild(columnShowHideUL);
			divTablePagerSettings.appendChild(divSettingsItems);
			tableWidget.appendChild(divTablePagerSettings);
			var index = 1;


			try {
				jQuery(tableWidget.columns).each(function(i){
					tableHeaders = jQuery('th', tableWidget);
					var headerHTML = tableHeaders[i].innerHTML;
					if (this.sort) {
						var colunmName = this.name;
						jQuery(tableHeaders[i]).prepend('<span style="float:left;cursor:pointer" class="ui-icon ui-icon-carat-2-n-s"/>');
						jQuery(tableHeaders[i]).click(function(){
							tableWidget.headerClick(colunmName,this);
						});
					}
					if(this.visible === true || this.visible === false){
						
						
						columnCookie = tablePagerReadCookie(this.name+tableWidget.id);
						if(columnCookie == 'false'){
							this.visible = false;
						}
						if(columnCookie == 'true'){
							this.visible = true;
						}
						var columnShowHideLI = document.createElement('li');
						$(columnShowHideLI).addClass('cheked');
						if(this.visible === false){
							jQuery(tableHeaders[i]).hide();
							$(columnShowHideLI).removeClass('cheked');
						}
						columnShowHideLI.innerHTML = headerHTML;

						jQuery(columnShowHideLI).click(function(){
							$('tr',tableWidget ).each(function(){$('td:eq(' + i + ')',this).toggle();});
							CurrentHeader = $('th:eq(' + i + ')',tableWidget ).toggle();
							if(CurrentHeader.css('display') == 'none'){
								$(this).removeClass('cheked');
								tableWidget.columns[i].visible = false;
								tablePagerCreateCookie(tableWidget.columns[i].name+tableWidget.id,false,365);
							}else{
								$(this).addClass('cheked');
								tableWidget.columns[i].visible = true;
								tablePagerCreateCookie(tableWidget.columns[i].name+tableWidget.id,true,365);
							}
						});
						columnShowHideUL.appendChild(columnShowHideLI);
					}
				});
			}catch(e){
				
			}
			divTableContatiner = document.createElement('div');
			jQuery(divTableContatiner).css('clear','both');
	
			tableWidget.update();
		}

	tableWidget.init();
	});
	
};

jQuery.fn.tablePager.update = function(){
	jQuery(this)[0].update();
}

function tablePagerCreateCookie(name,value,days) {
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	document.cookie = name+"="+value+expires+"; path=/";
}

function tablePagerReadCookie(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}

function tablePagerEraseCookie(name) {
	createCookie(name,"",-1);
}
