/*****************************************************************************************************************/
/**Invocacion para cada tabla que querramos ordenar															    **/
/**poner tipo de datos por cada columna ordenable, sino "None"												    **/
/**Tipos de datos: "Number","CaseInsensitiveString","Date","DateTime","MonthYear","String","Currency","None"    **/
/**Utilizar currency para moneda y porcentajes																	**/
/**Codigo a poner en el script php																				**/
/**<script type="text/javascript">																				**/
/**var st1 = new SortableTable(tabla,																			**/
/**["String", "Number", "Number", "Number","String", "Number","String", "Currency", "Currency", "Currency"]);	**/
/**</script>																									**/
/*****************************************************************************************************************/

// Order_2.js de Mario modificado por Leo

var arr_estilos = new Array();
var arr_clases  = new Array();
var pTable=null;
var ruta='../pics/';
var menos="expand0.gif";
var mas="expand1.gif";
var arr_trs=new Array();

function cambiaimagen(obj,idrow,pos,idtbl,class1,class2,reasign_ids)
{
   var tr=document.getElementById(idtbl).tBodies[0].firstChild;
   if(obj.src.match(menos)) // El grupo está expandido. Oculto sus elementos.
   {
      obj.src = ruta + mas;
      do
         if ((tr.nodeName == 'TR') && (tr.id.match(idrow) != null))
            tr.style.display = "none";
      while ((tr = tr.nextSibling) != null);
   }
   else // El grupo está contraído. Muestro sus elementos.
   {
      obj.src = ruta + menos;
      if (document.all && !SortableTable.opera)
      {
         do
            if ((tr.nodeName == 'TR') && (tr.id.match(idrow) != null))
            {
               tr.style.display = "block";
               tr.className = "show_explorer";
            }
         while ((tr = tr.nextSibling) != null);
      }
      else
      {
         do
            if ((tr.nodeName == 'TR') && (tr.id.match(idrow) != null))
            {
               tr.style.display = "table-row";
               tr.className = "show_mozila";
           	}
        	while ((tr = tr.nextSibling) != null);
      }
   }
   pintatrs(idtbl,class1,class2,reasign_ids);
}

/*function cambiaimagen_old(obj,idrow,pos,idtbl,class1,class2,reasign_ids) {

//  var cont=1;
    var tr=document.getElementById(idrow+'1');
    if(obj.src.match(menos)){//oculto
        obj.src=ruta+mas;
     	  do
           if (tr.nodeName == 'TR') tr.style.display = "none";
        while (((tr = tr.nextSibling) != null) && (tr.id.match(idrow) != null));

    }else{//muestro
        obj.src=ruta+menos;
        if(document.all&&!SortableTable.opera){
           	do
               if (tr.nodeName == 'TR')
               {
                  tr.style.display = "block";
                  tr.className = "show_explorer";
               }
            while (((tr = tr.nextSibling) != null) && (tr.id.match(idrow) != null));

        }else{
           	do {
               if (tr.nodeName == 'TR')
               {
                  tr.style.display = "table-row";
                  tr.className = "show_mozila";
               }
           	} while (((tr = tr.nextSibling) != null) && (tr.id.match(idrow) != null));
        }
    }
    pintatrs(idtbl,class1,class2,reasign_ids);
}*/

function isOpera() {
   	var ua = navigator.userAgent;
	return /Opera/.test(ua);
}
function isSafari() {
	var ua = navigator.userAgent;
	return /Safari/.test(ua);
}
function isFirefox() {
	var ua = navigator.userAgent;
	return navigator.product == "Gecko" && !( this.isOpera() || this.isSafari() );
}
function isIEWin() {
	var ua = navigator.userAgent;
	return window.external && /Win/.test(ua);
}
function isIEMac() {
	var ua = navigator.userAgent;
  	return window.external && /Mac/.test(ua);
}
// funcion que indique si la fila esta oculta con el display
function fila_desplegada(fila) {
	if (isFirefox()) {
		if (fila.style.display=="none") return false; else return true;
	} else if (isIEWin()) {
		if (fila.currentStyle.display=="none") return false; else return true;
	} else if (isSafari())
		if (/display: none/.test(fila.style.cssText)) return false; else return true;
	
}
// funcion que indique si la fila tiene visibility hidden
function fila_visible(fila) {
	if (fila.style.visibility=="hidden") return false; else return true;
}
// combina los dos estilos para saber si no se ve la fila
function fila_oculta(fila) {
	if (!fila_visible(fila) || !fila_desplegada(fila)) return true; else return false;
}

function pintatrs(idtabla,clase1,clase2,reasign_ids) {
	//alert("pintatrs idtabla="+idtabla+" clase1="+clase1+" clase1="+clase2);
	var trId;
	var trIdAct = null;
	var cont = 1;

	var contador=0;
	var tabla=document.getElementById(idtabla);
	var filas=document.getElementById(idtabla).tBodies[0].rows.length;
	for (fila=0;fila<filas;fila++)
	{
	   var tr = tabla.tBodies[0].rows[fila];

		if (!fila_oculta(tr))
		{
			if (contador % 2 == 0)
			{
			   tr.className = clase1;
			   /*
			   tr.className.replace(new RegExp(clase2),'');
			   tr.className.replace(new RegExp(clase1),'');
			   tr.className += " " + clase1;// + " " + tr.className;
			   */
			}
			else
			{
			   tr.className = clase2;
			   /*
			   tr.className.replace(new RegExp(clase2),'');
			   tr.className.replace(new RegExp(clase1),'');
			   tr.className += " " + clase2;// + " " + tr.className;
			   */
			}
			contador++;
		}

      if (reasign_ids) {
		   trId = tabla.tBodies[0].rows[fila].id;
   		if (trId.match(trIdAct) == null) {
   		   trIdAct = trId;
   		   cont = 1;
   		}
   		else {
   		   tabla.tBodies[0].rows[fila].id = trIdAct + '-' + cont;
   		   cont++;
   		}
      }
	}
}

function SortableTable(oTable, oSortTypes, oId, oPag, oCan) {
   pTable=oTable;
	this.sortTypes = oSortTypes || [];
	this.sortColumn = null;
	this.colDescending = [];
	this.id=oId;
	this.ini=0;
	this.tope=oTable.tBodies[0].rows.length;
   this.observers=new Array();
   if ((typeof(oCan)!="undefined")&&(oCan>0))	this.can=oCan;
	else this.can=this.tope;

	if (typeof(document.getElementById(oPag))!="undefined" && typeof(oPag)!='undefined'){
		this.pag=document.getElementById(oPag);
		this.texto_paginacion=this.pag.rows[1].cells[0].innerHTML;
	}else{
		this.pag="";
		this.texto_paginacion="";
	}

	var oThis = this;
	for(var i=0;i<oTable.tHead.rows[0].cells.length;i++){
		if ((typeof(oSortTypes[i])!='undefined')&&(oSortTypes[i]!='None')) oTable.tHead.rows[0].cells[i].style.cursor='pointer';
	}

   var arr_tbl=oTable.getElementsByTagName('tr');
   var l=arr_tbl.length;
   for(var i=0;i<l;i++){
      arr_clases[arr_tbl[i].id]  = arr_tbl[i].className;
      arr_estilos[arr_tbl[i].id] = arr_tbl[i].style.display;
	}

	this._headerOnclick = function (e) {
		oThis.headerOnclick(e);
	};

	if (oTable) {
		this.setTable( oTable );
		this.document = oTable.ownerDocument || oTable.document;
	} else {
		this.document = document;
	}

	// solo IE necesita esto
	var win = this.document.defaultView || this.document.parentWindow;
	this._onunload = function () {
		oThis.destroy();
	};
	if (win && typeof win.attachEvent != "undefined") {
		win.attachEvent("onunload", this._onunload);
	}

	if(this.pag!=null){
		this.genPag(0,0,this.can);
	}
}


SortableTable.gecko = navigator.product == "Gecko";
SortableTable.msie = /msie/i.test(navigator.userAgent);
SortableTable.safari = /safari/i.test(navigator.userAgent);
SortableTable.opera=(navigator.userAgent.indexOf("Opera")!=-1)?1:0;
SortableTable.removeBeforeSort = SortableTable.gecko;


SortableTable.prototype.onsort = function () {};

// por defecto sort order. true -> descendiente, false -> ascendente
//SortableTable.prototype.defaultDescending = true;
SortableTable.prototype._sortTypeInfo = {};

SortableTable.prototype.setTable = function (oTable) {
	if ( this.tHead )
		this.uninitHeader();
	this.element = oTable;
	this.setTHead( oTable.tHead );
	this.setTBody( oTable.tBodies[0] );
};

SortableTable.prototype.setTHead = function (oTHead) {
		if (this.tHead && this.tHead != oTHead )
			this.uninitHeader();
		this.tHead = oTHead;
		this.initHeader( this.sortTypes );
};

SortableTable.prototype.setTBody = function (oTBody) {
	this.tBody = oTBody;
};

SortableTable.prototype.setSortTypes = function ( oSortTypes ) {
	if ( this.tHead )
		this.uninitHeader();
	this.sortTypes = oSortTypes || [];
	if ( this.tHead )
		this.initHeader( this.sortTypes );
};

SortableTable.prototype.initHeader = function (oSortTypes) {

	if (!this.tHead) return;
	var cells = this.tHead.rows[0].cells;
	var doc = this.tHead.ownerDocument || this.tHead.document;
	this.sortTypes = oSortTypes || [];
    var l = cells.length;
    for(var i=0;i<l;i++){
        switch (this.sortTypes[i]){
          case "Number":
          case "Ratio":
          case "Date":
          case "Currency":
          case "MonthYear":
          case "DateTime":
          case "Hora":
          	this.colDescending[i]=true;
            break;
          default :
           this.colDescending[i]=false;
        }
	}

	var c;
	for (var i = 0; i < l; i++) {
		c = cells[i];

		if (this.sortTypes[i] != null && this.sortTypes[i] != "None") {
			if (this.sortTypes[i] != null)
				c._sortType = this.sortTypes[i];
			if (typeof c.addEventListener != "undefined")
				c.addEventListener("click", this._headerOnclick, false);
			else if (typeof c.attachEvent != "undefined")
				c.attachEvent("onclick", this._headerOnclick);
			else
				c.onclick = this._headerOnclick;
		} else {
			//c.setAttribute( "_sortType", oSortTypes[i] );
			c._sortType = "None";
		}
	}
};

// remueve eventos
SortableTable.prototype.uninitHeader = function () {
	if (!this.tHead) return;
	var cells = this.tHead.rows[0].cells;
	var l = cells.length;
	var c;
	for (var i = 0; i < l; i++) {
		c = cells[i];
		if (c._sortType != null && c._sortType != "None") {
			if (typeof c.removeEventListener != "undefined")
				c.removeEventListener("click", this._headerOnclick, false);
			else if (typeof c.detachEvent != "undefined")
				c.detachEvent("onclick", this._headerOnclick);
			c._sortType = null;
			c.removeAttribute( "_sortType" );
		}
	}
};

SortableTable.prototype.headerOnclick = function (e) {

    var arr_tbl=pTable.getElementsByTagName('tr');
    var l=arr_tbl.length;
    for(var i=0;i<l;i++){
		 //alert(arr_tbl[i].id+' - '+arr_tbl[i].className+' - '+arr_tbl[i].style.display);
         arr_clases[arr_tbl[i].id]  = arr_tbl[i].className;
         arr_estilos[arr_tbl[i].id] = arr_tbl[i].style.display;
	}

	// encuentra los TH del tbody
	var el = e.target || e.srcElement;
	while (el.tagName != "TH")
		el = el.parentNode;

	this.sort(SortableTable.msie || SortableTable.safari ? SortableTable.getCellIndex(el) : el.cellIndex);

	if (this.pag!=null) this.genPag(1,0);
};

SortableTable.getCellIndex = function (oTd) {

	var cells = oTd.parentNode.childNodes
	var l = cells.length;
	var i;
	for (i = 0; cells[i] != oTd && i < l; i++)
		;
	return i;
};

SortableTable.prototype.getSortType = function (nColumn) {
	return this.sortTypes[nColumn] || "String";
};

SortableTable.prototype.sort = function (nColumn, bDescending, sSortType) {

	if (!this.tBody) {
		return;
	}

	if (sSortType == null)
		sSortType = this.getSortType(nColumn);
	if (sSortType == "None")
		return;


	/*if (bDescending == null) {
		if (this.sortColumn != nColumn) {
			if(nColumn == 1 || nColumn == 2 || nColumn == 3){
				this.descending = !this.defaultDescending;
			}else{
				this.descending = this.defaultDescending;
            }
		} else{
			this.descending = !this.descending;
        }
	}
	else {
		this.descending = bDescending;
	} */

    if (bDescending == null) {
        if (this.sortColumn == nColumn) {
		  this.colDescending[nColumn] = !this.colDescending[nColumn];
        }
	}
	else {
		this.colDescending[nColumn] = bDescending;
	}

    this.sortColumn = nColumn;
	if (typeof this.onbeforesort == "function")
		this.onbeforesort();
	var f = this.getSortFunction(sSortType, nColumn);
	var a = this.getCache(sSortType, nColumn);
	var tBody = this.tBody;
	a.sort(f);
	if (this.colDescending[nColumn]) {
		a.reverse();
	} else {

	}
	if (SortableTable.removeBeforeSort) {
		// remueve del doc
		var nextSibling = tBody.nextSibling;
		var p = tBody.parentNode;
		p.removeChild(tBody);
	}

	var l = a.length;
	for (var i = 0; i < l; i++) {
		var elemento=tBody.appendChild(a[i].element);
		tBody.appendChild(a[i].element);
	}
	// inserta en un nuevo orden
	var Objetos = Array();
	var subObjetos = Array();
	var cantidadSubobjetos = Array();
	var estilos = "odd";
	for (var i = 0; i < l; i++) {

		if(a[i].element.id.indexOf("-") != -1) { // si tiene subelementos
			var objetoPrincipal = a[i].element.id.substring(0, a[i].element.id.indexOf("-"));
			if(typeof cantidadSubobjetos[objetoPrincipal] == "undefined")
				cantidadSubobjetos[objetoPrincipal] = 0;

            subObjetos[a[i].element.id] = a[i].element;
			cantidadSubobjetos[objetoPrincipal] += 1;
		} else {
			var elemento=a[i];
			Objetos.push(a[i].element);
            /*a[i].element.className=estilos;
			estilos = (estilos=="") ? "odd" : "";*/
		}
        if(a[i].element.id!=''){
            a[i].element.className=arr_clases[a[i].element.id];
            a[i].element.style.display=arr_estilos[a[i].element.id];
        }else{
            a[i].element.className=estilos;
			estilos = (estilos=="") ? "odd" : "";
        }
		tBody.appendChild(a[i].element);
	}

	if (SortableTable.removeBeforeSort) {
		p.insertBefore(tBody, nextSibling);
	}

	this.destroyCache(a);

	if (typeof this.onsort == "function")
		this.onsort();

  // Array 2 es un array asociativo que guarda a su vez un array de todos los elementos de un objeto
  var array_2=Array();
  for (i=0; i<Objetos.length;i++) {
  	ticker=0;
  	subcache=new Array();
  	contador=0;
  	array_1=Array(); // Array de elementos dentro de una categoria
  	if(typeof Objetos[i] != "undefined" && typeof cantidadSubobjetos[Objetos[i].id] != "undefined"){

			// Genera el subcache de subelementos para despues ordenarlo
/**/		for(var z=1;z<=cantidadSubobjetos[Objetos[i].id];z++) {
								var s = subObjetos[Objetos[i].id+"-"+z];
								subcache[contador] = {
									value:		this.getRowValue(s, sSortType, nColumn),
									element:	s
								};
								contador++;
			 }

			 // Ordena el subcache de elementos
			var f = this.getSortFunction(sSortType, nColumn);
			subcache.sort(f);
			if (this.colDescending[nColumn]) {
			     	subcache.reverse();
			}

			// Invierte el orden de almacenamiento en el array asociativo para despues mostrarse
			array_1=Array();
			for (var z=subcache.length-1;0<=z;z--) {
				var cache=subcache[z];
				array_1.push(cache.element);
			}
			array_2[Objetos[i].id]=array_1;

  	}
  }

 	 // Reordena los subelementos que estan guardados en el array_2
	 for(i=0; i < Objetos.length;i++) {
		if(typeof Objetos[i] != "undefined" && typeof cantidadSubobjetos[Objetos[i].id] != "undefined"){

			var array_tmp=array_2[Objetos[i].id]; // Lee el array asociativo y lo inserta
			for (var elemento in array_tmp) {
				var s=array_tmp[elemento];
				 tBody.insertBefore(s,Objetos[i].nextSibling);
			}

		}
	}

    pintatrs(pTable.id,'odd','');

};


SortableTable.prototype.asyncSort = function (nColumn, bDescending, sSortType) {
	var oThis = this;
	this._asyncsort = function () {
		oThis.sort(nColumn, bDescending, sSortType);
	};
	window.setTimeout(this._asyncsort, 1);
};

SortableTable.prototype.getCache = function (sType, nColumn) {

	if (!this.tBody) return [];
	var rows = this.tBody.rows;
	var l = rows.length;
	var a = new Array(l);
	var r=rows[0];
	for (var i = 0; i < l; i=i+1) {
		r = rows[i];
		if (SortableTable.safari){
			tmp= r.style.display;
			r.style.display='table-row';
		}
		a[i] = {
			value:		this.getRowValue(r, sType, nColumn),
			element:	r
		};
		if (SortableTable.safari){
			r.style.display=tmp;
		}
	};
	return a;
};

SortableTable.prototype.destroyCache = function (oArray) {
	var l = oArray.length;
	for (var i = 0; i < l; i++) {
		oArray[i].value = null;
		oArray[i].element = null;
		oArray[i] = null;
	}
};

SortableTable.isHiddenParam = function (sType) {
		if (sType.substring(0,2).toLowerCase()=="o:") return true; else return false;
}

SortableTable.getHiddenValue = function (cell) {
		//var patron=/.*>(.*)<.*/;
		var patron_ie=/<DIV.*class=hidden style=\"DISPLAY: none\">(.*)?<\/DIV>/;
		var patron_firefox=/<div.*class=\"hidden\" style=\"display: none;\">(.*)?<\/div>/;

	  	if (SortableTable.safari) {
			var div=cell.childNodes;
			for (var z=0;z<=div.length-1;z++) {
					if (div[z].nodeName="DIV" && div[z].CLASS=="hidden") return SortableTable.getInnerText(div[z]);
			}
			return "";
		} else {
		if (cell.innerHTML.match(patron_ie) || cell.innerHTML.match(patron_firefox)) {
			var resultado=cell.innerHTML.match(patron_ie);
			if (resultado != null ) {
					return resultado[1];
			} else {
					resultado=cell.innerHTML.match(patron_firefox);
					return resultado[1];
			}
		} else {
			return "";
		}
	}
}


SortableTable.prototype.getRowValue = function (oRow, sType, nColumn) {
	if (this._sortTypeInfo[sType] && this._sortTypeInfo[sType].getRowValue)
		return this._sortTypeInfo[sType].getRowValue(oRow, nColumn);
	var s;
	var c = oRow.cells[nColumn];



	// Lineas agregadas por Leonardo Caraballo para ordenar por campos ocultos
	if (SortableTable.isHiddenParam(sType)) { 	// si se trata de un parametro oculto
		s=SortableTable.getHiddenValue(c);      // obtiene el valor oculto
		return this.getValueFromString(s,sType);
	}

	if (typeof c != "undefined" && c != null ) {
		if (typeof c.innerText != "undefined") {
			s = c.innerText;
		} else {
			s = SortableTable.getInnerText(c);
		}
		return this.getValueFromString(s, sType);
	} else {
		if (oRow>0) {
			return this.getRowValue(oRow-1,sType,nColumn);
		} else {
			return "";
		}
	}
};


SortableTable.getInnerText = function (oNode) {
	var s = "";
	var cs = oNode.childNodes;
	var l = cs.length;
	for (var i = 0; i < l; i++) {
		switch (cs[i].nodeType) {
			case 1: //ELEMENTO NODO
				s += SortableTable.getInnerText(cs[i]);
				break;
			case 3:	//TEXTO DEL NODO
				s += cs[i].nodeValue;
				break;
		}
	}
	return s;
};

SortableTable.prototype.getValueFromString = function (sText, sType) {
	if (this._sortTypeInfo[sType])
		return this._sortTypeInfo[sType].getValueFromString( sText );
	return sText;
	};

SortableTable.prototype.getSortFunction = function (sType, nColumn) {
	if (this._sortTypeInfo[sType])
		return this._sortTypeInfo[sType].compare;
	return SortableTable.basicCompare;
};

SortableTable.prototype.destroy = function () {
	this.uninitHeader();
	var win = this.document.parentWindow;
	if (win && typeof win.detachEvent != "undefined") {	// solo IE necesita
		win.detachEvent("onunload", this._onunload);
	}
	this._onunload = null;
	this.element = null;
	this.tHead = null;
	this.tBody = null;
	this.document = null;
	this._headerOnclick = null;
	this.sortTypes = null;
	this._asyncsort = null;
	this.onsort = null;
};

SortableTable.prototype.addSortType = function (sType, fGetValueFromString, fCompareFunction, fGetRowValue) {
	this._sortTypeInfo[sType] = {
		type:				sType,
		getValueFromString:	fGetValueFromString || SortableTable.idFunction,
		compare:			fCompareFunction || SortableTable.basicCompare,
		getRowValue:		fGetRowValue
	};
};

// remueve el sorttype de todas las instanciass del SortableTable
SortableTable.prototype.removeSortType = function (sType) {
	delete this._sortTypeInfo[sType];
};

SortableTable.prototype.setPaginar = function (tipo,can) {
	if ((tipo=='can')&&(!isNaN(can))){
		can=parseInt(can,10);
		this.can=can;
		this.ini=0;
	}else{
		if (tipo=='pagina'){
			can=parseInt(can,10);
			this.ini=can;
		}
	}
	this.doPaginar();
};


SortableTable.prototype.doPaginar = function () {

	for(var i=0;i<this.tBody.rows.length;i++){
		if((i>=this.ini)&&(i<(this.ini+this.can))){
            /*descomentar*/
			/*if ((document.all)&&!SortableTable.opera)
                this.tBody.rows[i].style.display='block';
			else
                this.tBody.rows[i].style.display='table-row';*/
		} else {
      	this.tBody.rows[i].style.display='none';
         /*if ((document.all)&&!SortableTable.opera)
         	this.tBody.rows[i].style.display='block';
			else
            this.tBody.rows[i].style.display='table-row';*/
		}
	}

};


SortableTable.prototype.genPag = function (flag, start_item, per_page) {

  if ((typeof(per_page)=="undefined")||(per_page=="")) per_page=this.can;
  switch (flag){
  case 0:
  	this.setPaginar('can',per_page,1);
	break;
  case 1:
	this.setPaginar('pagina',start_item);
	break;
  }
  num_items=this.tope;
  page_string="";
  on_page=0;
  total_pages = Math.ceil(num_items/per_page);
  disabled=((this.tope==0)?' disabled ':' ');
  if (total_pages == 1 ) {
  	on_page=1;
    disable_select = "style=\"background-color: #D4D0C8;\" disabled";
    page_string = " <select style=\"font: 8pt Arial\" name=no_necesito_nombre "+disable_select+"><option value=0>"+set_lang['pagina']+" 1</select>";
  } else {
    on_page = Math.floor(start_item / per_page)+1;
    page_string += " <select style=\"font: 8pt Arial\" name=start "+disabled+" onChange=\""+this.id+".genPag(1,this.value)\">";
    for(var i = 1; i <total_pages+1; i++) {
      if (i == on_page) {
	page_string += '<option value='+(( i - 1 ) * per_page )+' selected>'+set_lang['pagina']+' '+i ;
      } else {
	page_string += '<option value='+(( i - 1 ) * per_page )+'>'+set_lang['pagina']+' '+i ;
      }
    }
	page_string += "</select>";
  }
  array_resultados = Array(5,10,20,50,100);

  select_resultados_por_pagina = "<select name=resultados_por_pagina "+disabled+
    "style=\"font: 8pt Arial\" onChange=\""+this.id+".genPag(0,\'\',this.value);"+this.id+".updateObserver(this.value);\">";
  for (var z=0;z<array_resultados.length;z++) {
    if (per_page==array_resultados[z]) {
      select_resultados_por_pagina += "<option value="+array_resultados[z]+" selected>"+array_resultados[z]+"</option>";
	  LoadURL('/inc/refresh_ajax.php?cadena=paginacion_cantidad|'+array_resultados[z]);
    } else {
      select_resultados_por_pagina += "<option value="+array_resultados[z]+">"+array_resultados[z]+"</option>";
    }
  }
  select_resultados_por_pagina += "</select>";

  end_item=start_item+per_page;
  if (end_item>num_items){
    end_item=num_items;
  }

  if(this.pag!=''){
	  var tmp_texto=this.texto_paginacion;
	  tmp_texto=tmp_texto.replace('{inicio}', on_page);
	  tmp_texto=tmp_texto.replace('{final}', total_pages);
	  this.pag.rows[1].cells[0].innerHTML=tmp_texto;
	  this.pag.rows[1].cells[1].innerHTML=page_string;
	  this.pag.rows[1].cells[4].innerHTML=select_resultados_por_pagina;
  }

};

SortableTable.prototype.addObserver = function (obs) {
    this.observers[this.observers.length]=obs;
};
SortableTable.prototype.updateObserver = function (valor) {
    for(var x=0;x<this.observers.length;x++){
        this.observers[x].value=valor;
    }
};


SortableTable.basicCompare = function compare(n1, n2) {
	if (n1.value < n2.value)
		return -1;
	if (n2.value < n1.value)
		return 1;
	return 0;
};
SortableTable.currency = function (s) {
	rExp = "/[^0-9"+_signo_puntodecimal_+"\-]/gi";
	rExp=eval(rExp);
	s = s.replace(rExp,'');
	rExp = /,/gi;
	s = s.replace(rExp,'.');
	s = parseFloat(s,10);
	if (isNaN(s)) s=0;
	return s;
};

SortableTable.ratio = function (s) {
	rExp = /\s/gi;
	if(s!="" && s!="0:0") {
		s = s.replace(rExp,'');
		s=s.split(':');
		s[0] = parseInt(s[0]);
		s[1] = parseInt(s[1]);
		if(s[1] > 0) {
			return parseFloat(s[0]+"."+(10000000 - s[1]));
		} else
			return 1;
	} else
		return 1;
};


//
//SortableTable.ratio = function (s) {
//	rExp = /\s/gi;
//	s = s.replace(rExp,'');
//	s=s.split(':');
//	r="000000"+s[0];
//	r1="000000"+s[1];
//	r=r.substring(r.length-6);
//	r1=r1.substring(r1.length-6);
//	s=r+":"+r1;
//	return s;
//};




SortableTable.idFunction = function (x) {
	return x;
};

SortableTable.toUpperCase = function (s) {
	return s.toUpperCase();
};

SortableTable.toDate = function (s) {
	rExp = /\s/gi;
    s = s.toString();
	s = s.replace(rExp,'');
	if (s.match(/(\d\d)\/(\d\d)\/(\d{4})|(\d{2})/)){
		var m=1;var d=0;
		if (_lang_idioma=='en') {m=0;d=1;}
		var parts = s.split("/");
   		var d = new Date(parts[m]+"/"+parts[d]+"/"+parts[2]);
	}else{
      if (s.match(/(\d\d)\-(\d\d)\-(\d{4})|(\d{2})/)){
		var m=1;var d=0;
		if (_lang_idioma=='en') {m=0;d=1;}
		var parts = s.split("-");
   		var d = new Date(parts[m]+"-"+parts[d]+"-"+parts[2]);
	   }else{ d=0;}
    }
	return d.valueOf();
};
SortableTable.toDateTime = function (s) {
	if (s.match(/(\d\d)\/(\d\d)\/(\d{4}) (\d\d):(\d\d):(\d\d)/)){
		var m=1;var e=0;
		if (_lang_idioma=='en') {m=0;e=1;}
		s = s.split(" ");
		var parts = s[0].split("/");
        var d = new Date(0);
		d.setFullYear(parts[2]);
		d.setDate(parts[e]);
		d.setMonth(parts[m] - 1);
		var parts2 = s[1].split(":");
		d.setHours(parts2[0]);
		d.setMinutes(parts2[1]);
		d.setSeconds(parts2[2]);

     }else{
       if(s.match(/(\d\d)\-(\d\d)\-(\d{4}) (\d\d):(\d\d):(\d\d)/)){
		var m=1;var e=0;
		if (_lang_idioma=='en') {m=0;e=1;}
		s = s.split(" ");
		var parts = s[0].split("-");
        var d = new Date(0);
		d.setFullYear(parts[2]);
		d.setDate(parts[e]);
		d.setMonth(parts[m] - 1);
		var parts2 = s[1].split(":");
		d.setHours(parts2[0]);
		d.setMinutes(parts2[1]);
		d.setSeconds(parts2[2]);
	   }else{
		d=1111111111111111111111;
	   }
    }
	return d.valueOf();
};
SortableTable.toHora = function (s) {
 rExp = /\s/gi;
	s = s.replace(rExp,'');
	s=s.split(':');
	s[0] = parseInt(s[0]);
	s[1] = parseInt(s[1]);
	return parseFloat((s[0]*60)+s[1]);
};

SortableTable.toDateMonthYear = function (s) {
	rExp = /\s/gi;
	s = s.replace(rExp,'');
	s=s.split("-");
	s[0]=meses[s[0]];
	s=new Date(s[0]+"/01/"+s[1]);
	return s.valueOf();
};

// agregue tipo de ordenar
SortableTable.prototype.addSortType("Indice", Number);
SortableTable.prototype.addSortType("Number", Number);
SortableTable.prototype.addSortType("o:Number", Number);
SortableTable.prototype.addSortType("CaseInsensitiveString", SortableTable.toUpperCase);
SortableTable.prototype.addSortType("o:CaseInsensitiveString", SortableTable.toUpperCase);
SortableTable.prototype.addSortType("Date", SortableTable.toDate);
SortableTable.prototype.addSortType("o:Date", SortableTable.toDate);
SortableTable.prototype.addSortType("String");
SortableTable.prototype.addSortType("o:String");
SortableTable.prototype.addSortType("Currency", SortableTable.currency);
SortableTable.prototype.addSortType("o:Currency", SortableTable.currency);
SortableTable.prototype.addSortType("Ratio", SortableTable.ratio);
SortableTable.prototype.addSortType("o:Ratio", SortableTable.ratio);
SortableTable.prototype.addSortType("MonthYear", SortableTable.toDateMonthYear);
SortableTable.prototype.addSortType("o:MonthYear", SortableTable.toDateMonthYear);
SortableTable.prototype.addSortType("DateTime", SortableTable.toDateTime);
SortableTable.prototype.addSortType("o:DateTime", SortableTable.toDateTime);
SortableTable.prototype.addSortType("Hora", SortableTable.toHora);
SortableTable.prototype.addSortType("o:Hora", SortableTable.toHora);
// None para no ordenar

