/*
 * jQuery superhero data control plugin 0.1
 *
 * http://www.ontecnologia.info/superhero/ui/shdatacontrol
 * http://docs.jquery.com/Plugins/shdatacontrol
 *
 * Copyright (c) 2009 Oscar Emilio Antolinez Collazos
 * 
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 */

(function($) {
	$.widget("ui.shdatacontrol", {
			 
		_init: function() {
			var element=this.element; var o = this.options;	
			
			//Clonar la primera fila
			for(i=1;i<o.rows;i++){
				element.find("tbody > tr:eq(0)").clone().appendTo("tbody");
			}
			//alert(row);
			
			//if(o.url.length > 0)
				this._callURL();
			this._bindEvents();
		},
		
		_movetoPage: function(page){
			var element=this.element; var o = this.options;	
			switch(page){
				case 'first':
					o.page=0;
					break;
				case 'prev':
					if(o.page>0)
						o.page--;
					break;
				case 'next':
					if(o.page<Math.ceil(o.total/o.rows)-1)
						o.page++;
					break;
				case 'last':
					o.page=Math.ceil(o.total/o.rows)-1;
					break;
				default:
					o.page=page;
					break;
			}
			this._callURL();
		},
		
		checkAll: function(action){
			var element=this.element; var o = this.options;	var self=this;
			var pos=element.find("tr.shtableheader").find("th").index(element.find("th#chk"));
			
			element.find("tbody > tr").each(function(r, row){
				if(action=="uncheck"){
					element.find("th#chk").find("a").addClass("uncheck").removeClass("check");
					$(row).removeClass("selected");$(row).removeClass("delete");
					$(row).find("td:eq("+pos+") > a").addClass("uncheck").removeClass("check");
					//rsel=0;
				}
				if(action=="check"){
					element.find("th#chk").find("a").removeClass("uncheck").addClass("check");
					$(row).addClass("selected");
					$(row).find("td:eq("+pos+") > a").addClass("check").removeClass("uncheck");
					//rsel=nrows;
				}
			});
			this._trigger('checkAll', null);
		},
		
		readData: function(){
			var element=this.element; var o = this.options;	var self=this;
			
			//Creamos array para conocer la posicion en la tabla de cada celda
			var arrColumns= Array();
			element.find("tr.shtableheader > th").each(function(i){
				arrColumns[i]=$(this).attr("id");
			});
			var dataString = '{"row":[';
			element.find("tbody > tr").each(function(r, row){
				$(row).removeClass("over");
				if($(row).css("display")!="none"){
					dataString += '{ "id": "'+r+'", ';
					dataString += '"class":"'+$(row).attr("class")+'", '
					dataString += '"cell":{';
					$(row).find("td").each(function(c, cell){
						if(element.find("tr.shtableheader > th#"+arrColumns[c]+"").hasClass("datafield")){
							if(arrColumns[c]!="chk"){
								dataString += ' "'+arrColumns[c]+'":"'+element.find("tbody > tr:eq("+r+") > td:eq("+c+") ").html()+'",';
							}
						}
					});
					dataString=dataString.substr(0,(dataString.lastIndexOf(",")-1))+'"}';
					dataString += ' },';
				}
			});
			dataString=dataString.substr(0,(dataString.lastIndexOf(",")-1))+'}';
			dataString += ']}';
			//alert(dataString);
			//eval(dataString);
			return dataString;
		},
		
		_unbindEvents: function(){
			var element=this.element; var o = this.options;	var self=this;
			var pos=element.find("tr.shtableheader").find("th").index(element.find("th#chk"));
			//alert("unbind");
			element.find("th#chk").unbind("click");
			element.find("#delete-button").unbind("click");
			element.find("tbody > tr").each(function(r, row){
				$(row).find("td:eq("+pos+") > a").unbind("click");
			});
			
			//over sobre las filas
			element.find("tbody > tr").unbind("mouseover").unbind("mouseout");
			
			//Accion de los botones de Desplazamiento
			element.find(".first").unbind("click");
			element.find(".prev").unbind("click");
			element.find(".next").unbind("click");
			element.find(".last").unbind("click");
			
			
		},
		
		_bindEvents: function() {
			var element=this.element; var o = this.options;	var self=this;
			var nrows=0; var rsel=0;
			//alert("bind");
			//Check de el encabezado
			var self = this;
			element.find("th#chk").bind("click", function(){
				var action = $(this).find("a").hasClass("check") ? "uncheck" : "check" ;
				if(action=="uncheck"){
					rsel=0;
				}else{
					rsel=nrows;
				}
				self.checkAll(action);
			});
			
			//Accion de los botones de Desplazamiento
			element.find(".first").bind("click", function(){ self._movetoPage('first') });
			element.find(".prev").bind("click", function(){ self._movetoPage('prev') });
			element.find(".next").bind("click", function(){ self._movetoPage('next') });
			element.find(".last").bind("click", function(){ self._movetoPage('last') });
			
			//Acciion para el boton nuevo
			if((o.newaction)!=""){
				element.find("#new-button").bind("click", function(){ eval(o.newaction) });
			}
			
			//Accion para el boton Buscar
			element.find("#search-button").bind("click",function(){
				element.find(".shtablefind").show();
			})
			element.find("#find-field").bind("focus", function(){
				if($(this).val()=="Buscar ..."){
					$(this).val("")
				}
			});
			element.find("#find-field").bind("blur", function(){
				if($(this).val().length==0){
					o.filter="";
					$(this).val("Buscar ...");
				}
			});
			
			
			
			element.find("#find-button").bind("click", function(){
				if(element.find("#find-field").val().length>0 && element.find("#find-field").val()!="Buscar ..." ){
					o.filter=element.find("#find-field").val();
					o.page=0;
					self._callURL();
				}
			});

			//Accion para el boton Refrescar
			element.find("#refresh-button").bind("click",function(){
				self._callURL();
			})
			
			
			//Accion para el boton de borrar
			element.find("#delete-button").bind("click",function(){
				self._unbindEvents();
				element.find("tbody > tr.selected").addClass("delete").removeClass("selected");
				
				element.find(".shtabletop > div.shmessages").html("<p class='warning'>&iquest;Esta seguro que desea elimiar este registro? </button> <button type='button' class='confirm' id='no-button'  href='#'>No</button> <button type='button' class='confirm' id='yes-button' href='#'>Si</button></p>");
				
				element.find("#no-button").bind("click", function(){
					element.find(".shtabletop > div.shmessages").html("<p class='info'>El borrado de datos fue cancelado</p>");
					self.checkAll("uncheck");
					self._bindEvents();
				});

				element.find("#yes-button").bind("click", function(){
					o.data=self.readData();
					self._callURL();
				});

				
			})
			
			//Check de las filas
			element.find("tbody > tr").each(function(r, row){
				var pos=element.find("tr.shtableheader").find("th").index(element.find("th#chk"));//ojo con este index
				if($(row).css("display")!="none") nrows++;
				$(row).find("td:eq("+pos+") > a").bind("click",function(){
					$(this).toggleClass("uncheck").toggleClass("check");
					$(row).toggleClass("selected");
					if($(this).attr("class")=="check")
						rsel++;
					if($(this).attr("class")=="uncheck")
						rsel--;
									
					if(rsel==nrows){
						element.find("th#chk").find("a").removeClass("uncheck").addClass("check");
					}else{
						element.find("th#chk").find("a").removeClass("check").addClass("uncheck");
					}
				})
			});
			
			//over sobre las filas
			element.find("tbody > tr").bind("mouseover", function(){
				$(this).toggleClass("over");
			}).bind("mouseout", function(){
				$(this).toggleClass("over");
			});
			
		},
		
		_showData: function(response) {
			var element=this.element; var o = this.options;	var self=this;
			
			//alert($(response).find("total").text());
			//alert($(response).find("row:eq(2)").find("cell:eq(0)").text());
			//alert(element.find("tbody").html());
			
			
			o.total=$(response).find("total").text();
			o.page=$(response).find("page").text();//Sincroniza la pagina con el servidor
			
			element.find(".pages").remove();
			var start = o.page > 2 ? o.page-2 : 0; 
			var end = (parseInt(o.page,10)+2) < 5 ? Math.ceil(o.total/o.rows)>5 ? 5 : Math.ceil(o.total/o.rows) : parseInt(o.page,10)+3;
			
			
			
			if(end > Math.ceil(o.total/o.rows)){
				end = Math.ceil(o.total/o.rows);
				start = end - 5;
			}
			
			for(i=start;i<end;i++){
				if(i==o.page){
					element.find(".sharrows > ul").find("li:eq(1)").after("<li><a class='pages active' href='#'>"+parseInt(i+1)+"</a></li>");
				}else{
					element.find(".sharrows > ul").find("li:eq(1)").after("<li><a class='pages' href='#'>"+parseInt(i+1)+"</a></li>");
				}
			}
			element.find(".pages").bind("click", function(){ self._movetoPage(parseInt($(this).text()-1)) })
			
			
			
			//Cargamos mensajes
			var pos=((o.page)*o.rows);
			element.find("td.shtablefoot > div.shmessages > p").html("Registro "+(pos+1)+ " al "+parseInt(pos+parseInt($(response).find("records").text()), 10)+" de "+$(response).find("total").text())
			
			//Ocultamos las filas sobrantes
			element.find("tbody > tr").show();
			for(i=parseInt($(response).find("records").text(),10); i<parseInt(element.find("tbody > tr").length,10); i++)
				element.find("tbody > tr:eq("+i+")").hide();
			
			//Creamos array para conocer la posicion en la tabla de cada celda
			//var arrColumns= Array();
			//element.find("tr.shtableheader > th").each(function(i, col){
			//	arrColumns[i]=$(col).attr("id");
			//});
			
			//Vaciamos los datos en la tabla
			$(response).find("row").each(function(r, row){
				$(this).find("cell").each(function(c, cell){
					//alert($(cell).attr("name"));
					//var index = element.find("tr.shtableheader > th#"+$(cell).attr("name")).index();
					//alert(index);
					if($(cell).attr("name")=="chk"){
						if($(cell).text()=="1"){
							element.find("tbody > tr:eq("+r+") > td:eq("+element.find("tr.shtableheader > th#"+$(cell).attr("name")).index()+") > a").toggleClass("uncheck").toggleClass("check");
							element.find("tbody > tr:eq("+r+")").toggleClass("selected");
						}
					}else{
						element.find("tbody > tr:eq("+r+") > td:eq("+element.find("tr.shtableheader > th#"+$(cell).attr("name")).index()+") ").html($(cell).text());
					}
				});
			});
			

		},
		_callURL: function() {
			var element=this.element;
			var o = this.options;
			var self=this;
			
			$.ajax({
				type: "POST",
				url: o.url,
				data: "data="+o.data+"&page="+o.page+"&rows="+o.rows+"&filter="+o.filter,
				dataType: o.type,
				async: false,
				success: function(response){
					//alert(response);
					self.checkAll("uncheck");
					self._showData(response);
				},
				error: function(XMLHttpRequest, textStatus, errorThrown){
					alert("XMLHttpRequest="+XMLHttpRequest.responseText+"\ntextStatus="+textStatus+"\nerrorThrown="+errorThrown);
				}
			});			
		},
		destroy: function() {
			$.widget.prototype.apply(this, arguments); // default destroy
			// now do other stuff particular to this widget
		} 
		
		
	});
	$.extend($.ui.shdatacontrol, {
		totalRecords: 0,
		getter: "readData",
		defaults: {
			url: "",
			data: "", 
			filter: "",
			newaction: "",
			page: 0,
			rows: 10,
			total: 0,
			type: "html"
		}
	});
})(jQuery);