/*
PARA CARGAR LOS SCRIPTS COLOCAR DENTRO DE <HEAD> LO SIGUIENTE:
<script src="jacr.js" type="text/javascript"></script>
*/

/*
OCULTA LOS SCRIPTS PARA EXPLORADORES QUE NO LO SOPORTEN, ESTE SCRIPT ABARCA TODOS LOS SCRIPTS
*/
browser = (((navigator.appName == "Netscape") && (parseInt(navigator.appVersion) >= 3 )) || ((navigator.appName == "Microsoft Internet Explorer") && (parseInt(navigator.appVersion) >= 4 )))
if (browser)
{
	/*
	*MANTIENE EL STATUS CON EL NOMBRE SEÑALADO
	*/
	function hidestatus()
	{
		window.status='Juan Antonio Cedillo y Cía., S.C.'
		return true
	}
	if (document.layers)
		document.captureEvents(Event.MOUSEOVER | Event.MOUSEOUT | Event.CLICK)
			document.onmouseover=hidestatus
			document.onmouseout=hidestatus
			document.onclick=hidestatus
	/*
	ILUMINAR CELDAS DE UNA TABLA
	*/
	//Especifica el tipo de celda que se va a iluminar, "TD" o "TR":
	var highlightbehavior="TR"
	var ns6=document.getElementById&&!document.all
	var ie=document.all
	function changeto(e,highlightcolor)
	{
		source=ie? event.srcElement : e.target
			if (source.tagName=="TABLE")
				return
			while(source.tagName!=highlightbehavior && source.tagName!="HTML")
				source=ns6? source.parentNode : source.parentElement
			if (source.style.backgroundColor!=highlightcolor&&source.id!="ignore")
				source.style.backgroundColor=highlightcolor
	}
	function contains_ns6(master, slave)
	{
		while (slave.parentNode)
			if ((slave = slave.parentNode) == master)
				return true;
				return false;
	}
	function changeback(e,originalcolor)
	{
	if(ie&&(event.fromElement.contains(event.toElement) || source.contains(event.toElement) || source.id=="ignore") || source.tagName=="TABLE")
		return
	else if (ns6&&(contains_ns6(source, e.relatedTarget)||source.id=="ignore"))
		return
	if (ie&&event.toElement!=source||ns6&&e.relatedTarget!=source)
		source.style.backgroundColor=originalcolor
	}
	/*
	ESTE ES UN EJEMPLO DE LLAMADA PARA ILUMINAR LA TABLA
	<table onmouseover="changeto(event, 'black')" onmouseout="changeback(event, 'transparent')"> Este es el llamado a la tabla
	changeto (indica el color a cambiar) changeback (indica el color a regresar)
	<td id="ignore"> Esto es para no iluminar alguna celda en especifico, tambien se usa con <tr id="ignore">
	*/
	/*
	AGREGA LA FECHA Y DÍA ACTUAL EN FORMATO: LUNES 01 DE ENERO DE 2007
	*/
	function fecha()
	{
		var mydate=new Date()
		var year=mydate.getYear()
		if (year < 1000)
		year+=1900
		var day=mydate.getDay()
		var month=mydate.getMonth()
		var daym=mydate.getDate()
		if (daym<10)
		daym="0"+daym
		var dayarray=new Array("Domingo", "Lunes", "Martes", "Miercoles", "Jueves", "Viernes", "Sabado")
		var montharray=new Array("Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre")
		document.write("<small><font color='#000000' face='Arial'><b>"+dayarray[day]+" "+daym+" de "+montharray[month]+" de "+year+"</b></font></small>")
	}
	/*
	CREA LA TABLA CON FILTROS
	*/
	var TblId, SearchFlt, SlcArgs;
	TblId = new Array(), SlcArgs = new Array();
	function setFilterGrid(id)
	{
		var tbl = grabEBI(id);
		var ref_row, fObj;
		if(tbl != null && tbl.nodeName.toLowerCase() == "table")
		{
			if(arguments.length>1)
			{
				for(var i=0; i<arguments.length; i++)
				{
					var argtype = typeof arguments[i];
					switch(argtype.toLowerCase())
					{
						case "number":
							ref_row = arguments[i];
							break;
						case "object":
							fObj = arguments[i];
							break;
					}
				}
			}
			ref_row == undefined ? ref_row=2 : ref_row=(ref_row+2);
			var ncells = getCellsNb(id,ref_row);
			tbl.tf_ncells = ncells;
			if(tbl.tf_ref_row==undefined) tbl.tf_ref_row = ref_row;
			tbl.tf_Obj = fObj;
			if( !hasGrid(id) ) AddGrid(id);
		}
	}
	function AddGrid(id)
	{
		TblId.push(id);
		var t = grabEBI(id);
		var f = t.tf_Obj, n = t.tf_ncells;
		var inpclass, fltgrid, displayBtn, btntext, enterkey;
		var modfilter_fn, display_allText, on_slcChange;
		var displaynrows, totrows_text, btnreset, btnreset_text;
		var sort_slc, displayPaging, pagingLength, displayLoader;
		var load_text, exactMatch, alternateBgs, colOperation;
		var rowVisibility, colWidth, bindScript;
		f!=undefined && f["grid"]==false ? fltgrid=false : fltgrid=true;//enables/disables filter grid
		f!=undefined && f["btn"]==true ? displayBtn=true : displayBtn=false;//show/hides filter's validation button
		f!=undefined && f["btn_text"]!=undefined ? btntext=f["btn_text"] : btntext=">>";//defines button text
		f!=undefined && f["enter_key"]==false ? enterkey=false : enterkey=true;//enables/disables enter key
		f!=undefined && f["mod_filter_fn"] ? modfilter_fn=true : modfilter_fn=false;//defines alternative fn
		f!=undefined && f["display_all_text"]!=undefined ? display_allText=f["display_all_text"] : display_allText="";//defines 1st option text
		f!=undefined && f["on_change"]==false ? on_slcChange=false : on_slcChange=true;//enables/disables onChange event on combo-box
		f!=undefined && f["rows_counter"]==true ? displaynrows=true : displaynrows=true;//show/hides rows counter
		f!=undefined && f["rows_counter_text"]!=undefined ? totrows_text=f["rows_counter_text"] : totrows_text="Registros mostrados: ";//defines rows counter text
		f!=undefined && f["btn_reset"]==true ? btnreset=true : btnreset=true;//show/hides reset link
		f!=undefined && f["btn_reset_text"]!=undefined ? btnreset_text=f["btn_reset_text"] : btnreset_text="Reset";//defines reset text
		f!=undefined && f["sort_select"]==true ? sort_slc=true : sort_slc=true;//enables/disables select options sorting
		f!=undefined && f["paging"]==true ? displayPaging=true : displayPaging=false;//enables/disables table paging
		f!=undefined && f["paging_length"]!=undefined ? pagingLength=f["paging_length"] : pagingLength=10;//defines table paging length
		f!=undefined && f["loader"]==true ? displayLoader=true : displayLoader=true;//enables/disables loader
		f!=undefined && f["loader_text"]!=undefined ? load_text=f["loader_text"] : load_text="Cargando...";//defines loader text
		f!=undefined && f["exact_match"]==true ? exactMatch=true : exactMatch=false;//enables/disbles exact match for search
		f!=undefined && f["alternate_rows"]==true ? alternateBgs=true : alternateBgs=true;//enables/disbles rows alternating bg colors
		f!=undefined && f["col_operation"] ? colOperation=true : colOperation=false;//enables/disbles column operation(sum,mean)
		f!=undefined && f["rows_always_visible"] ? rowVisibility=true : rowVisibility=false;//makes a row always visible
		f!=undefined && f["col_width"] ? colWidth=true : colWidth=false;//defines widths of columns
		f!=undefined && f["bind_script"] ? bindScript=true : bindScript=false;
		// props are added to table in order to be easily accessible from other fns
		t.tf_fltGrid = fltgrid;
		t.tf_displayBtn = displayBtn;
		t.tf_btnText = btntext;
		t.tf_enterKey = enterkey;
		t.tf_isModfilter_fn = modfilter_fn;
		t.tf_display_allText = display_allText;
		t.tf_on_slcChange = on_slcChange;
		t.tf_rowsCounter = displaynrows;
		t.tf_rowsCounter_text = totrows_text;
		t.tf_btnReset = btnreset;
		t.tf_btnReset_text = btnreset_text;
		t.tf_sortSlc = sort_slc;
		t.tf_displayPaging = displayPaging;
		t.tf_pagingLength = pagingLength;
		t.tf_displayLoader = displayLoader;
		t.tf_loadText = load_text;
		t.tf_exactMatch = exactMatch;
		t.tf_alternateBgs = alternateBgs;
		t.tf_startPagingRow = 0;
		if(modfilter_fn) t.tf_modfilter_fn = f["mod_filter_fn"];// used by DetectKey fn
		if(fltgrid)
		{
			var fltrow = t.insertRow(0); //adds filter row
			fltrow.className = "fltrow";
			for(var i=0; i<n; i++)// this loop adds filters
			{
				var fltcell = fltrow.insertCell(i);
				//fltcell.noWrap = true;
				i==n-1 && displayBtn==true ? inpclass = "flt_s" : inpclass = "flt";
				if(f==undefined || f["col_"+i]==undefined || f["col_"+i]=="none")
				{
					var inptype;
					(f==undefined || f["col_"+i]==undefined) ? inptype="text" : inptype="hidden";//show/hide input
					var inp = createElm( "input",["id","flt"+i+"_"+id],["type",inptype],["class",inpclass] );
					inp.className = inpclass;// for ie<=6
					fltcell.appendChild(inp);
					if(enterkey) inp.onkeypress = DetectKey;
				}
				else if(f["col_"+i]=="select")
				{
					var slc = createElm( "select",["id","flt"+i+"_"+id],["class",inpclass] );
					slc.className = inpclass;// for ie<=6
					fltcell.appendChild(slc);
					PopulateOptions(id,i);
					if(displayPaging)//stores arguments for GroupByPage() fn
					{
						var args = new Array();
						args.push(id); args.push(i); args.push(n);
						args.push(display_allText); args.push(sort_slc); args.push(displayPaging);
						SlcArgs.push(args);
					}
					if(enterkey) slc.onkeypress = DetectKey;
					if(on_slcChange)
					{
						(!modfilter_fn) ? slc.onchange = function(){ Filter(id); } : slc.onchange = f["mod_filter_fn"];
					}
				}
				if(i==n-1 && displayBtn==true)// this adds button
				{
					var btn = createElm(
																"input",
																["id","btn"+i+"_"+id],["type","button"],
																["value",btntext],["class","btnflt"]
															);
					btn.className = "btnflt";
					fltcell.appendChild(btn);
					(!modfilter_fn) ? btn.onclick = function(){ Filter(id); } : btn.onclick = f["mod_filter_fn"];
				}
			}
		}
		if(displaynrows || btnreset || displayPaging || displayLoader)
		{
			/*** div containing rows # displayer + reset btn ***/
			var infdiv = createElm( "div",["id","inf_"+id],["class","inf"] );
			infdiv.className = "inf";// setAttribute method for class attribute doesn't seem to work on ie<=6
			t.parentNode.insertBefore(infdiv, t);
			if(displaynrows)
			{
				/*** left div containing rows # displayer ***/
				var totrows;
				var ldiv = createElm( "div",["id","ldiv_"+id] );
				displaynrows ? ldiv.className = "ldiv" : ldiv.style.display = "none";
				displayPaging ? totrows = pagingLength : totrows = getRowsNb(id);
				var totrows_span = createElm( "span",["id","totrows_span_"+id],["class","tot"] ); // tot # of rows displayer
				totrows_span.className = "tot";//for ie<=6
				totrows_span.appendChild( createText(totrows) );
				var totrows_txt = createText(totrows_text);
				ldiv.appendChild(totrows_txt);
				ldiv.appendChild(totrows_span);
				infdiv.appendChild(ldiv);
			}
			if(displayLoader)
			{
				/*** div containing loader	***/
				var loaddiv = createElm( "div",["id","load_"+id],["class","loader"] );
				loaddiv.className = "loader";// for ie<=6
				loaddiv.style.display = "none";
				loaddiv.appendChild( createText(load_text) );
				infdiv.appendChild(loaddiv);
			}
			if(displayPaging)
			{
				/*** mid div containing paging displayer ***/
				var mdiv = createElm( "div",["id","mdiv_"+id] );
				displayPaging ? mdiv.className = "mdiv" : mdiv.style.display = "none";
				infdiv.appendChild(mdiv);
				var start_row = t.tf_ref_row;
				var row = grabTag(t,"tr");
				var nrows = row.length;
				var npages = Math.ceil( (nrows - start_row)/pagingLength );//calculates page nb
				var slcPages = createElm( "select",["id","slcPages_"+id] );
				slcPages.onchange = function()
				{
					if(displayLoader) showLoader(id,"");
					t.tf_startPagingRow = this.value;
					GroupByPage(id);
					if(displayLoader) showLoader(id,"none");
				}
				var pgspan = createElm( "span",["id","pgspan_"+id] );
				grabEBI("mdiv_"+id).appendChild( createText(" Page ") );
				grabEBI("mdiv_"+id).appendChild(slcPages);
				grabEBI("mdiv_"+id).appendChild( createText(" of ") );
				pgspan.appendChild( createText(npages+" ") );
				grabEBI("mdiv_"+id).appendChild(pgspan);
				for(var j=start_row; j<nrows; j++)//this sets rows to validRow=true
				{
					row[j].setAttribute("validRow","true");
				}//for j
				setPagingInfo(id);
				if(displayLoader) showLoader(id,"none");
			}
			if(btnreset && fltgrid)
			{
				/*** right div containing reset button **/
				var rdiv = createElm( "div",["id","reset_"+id] );
				btnreset ? rdiv.className = "rdiv" : rdiv.style.display = "none";
				var fltreset = createElm( "a",
																	["href","javascript:clearFilters('"+id+"');Filter('"+id+"');"]
																);
				fltreset.appendChild(createText(btnreset_text));
				rdiv.appendChild(fltreset);
				infdiv.appendChild(rdiv);
			}
		}
		if(colWidth)
		{
			t.tf_colWidth = f["col_width"];
			setColWidths(id);
		}
		if(alternateBgs && !displayPaging)
			setAlternateRows(id);
		if(colOperation)
		{
			t.tf_colOperation = f["col_operation"];
			setColOperation(id);
		}
		if(rowVisibility)
		{
			t.tf_rowVisibility = f["rows_always_visible"];
			if(displayPaging) setVisibleRows(id);
		}
		if(bindScript)
		{
			t.tf_bindScript = f["bind_script"];
			if(	t.tf_bindScript!=undefined &&
				t.tf_bindScript["target_fn"]!=undefined )
			{//calls a fn if defined
				t.tf_bindScript["target_fn"].call(null,id);
			}
		}
	}
	function PopulateOptions(id,cellIndex)
	{
		var t = grabEBI(id);
		var ncells = t.tf_ncells, opt0txt = t.tf_display_allText;
		var sort_opts = t.tf_sortSlc, paging = t.tf_displayPaging;
		var start_row = t.tf_ref_row;
		var row = grabTag(t,"tr");
		var OptArray = new Array();
		var optIndex = 0; // option index
		var currOpt = new Option(opt0txt,"",false,false); //1st option
		grabEBI("flt"+cellIndex+"_"+id).options[optIndex] = currOpt;
		for(var k=start_row; k<row.length; k++)
		{
			var cell = getChildElms(row[k]).childNodes;
			var nchilds = cell.length;
			var isPaged = row[k].getAttribute("paging");
			if(nchilds == ncells){// checks if row has exact cell #
				for(var j=0; j<nchilds; j++)// this loop retrieves cell data
				{
					if(cellIndex==j)
					{
						var cell_data = getCellText(cell[j]);
						// checks if celldata is already in array
						var isMatched = false;
						for(w in OptArray)
						{
							if( cell_data == OptArray[w] ) isMatched = true;
						}
						if(!isMatched) OptArray.push(cell_data);
					}
				}
			}
		}
		if(sort_opts) OptArray.sort();
		for(y in OptArray)
		{
			optIndex++;
			var currOpt = new Option(OptArray[y],OptArray[y],false,false);
			grabEBI("flt"+cellIndex+"_"+id).options[optIndex] = currOpt;
		}
	}
	function Filter(id)
	{
		showLoader(id,"");
		SearchFlt = getFilters(id);
		var t = grabEBI(id);
		t.tf_Obj!=undefined ? fprops = t.tf_Obj : fprops = new Array();
		var SearchArgs = new Array();
		var ncells = getCellsNb(id);
		var totrows = getRowsNb(id), hiddenrows = 0;
		var ematch = t.tf_exactMatch;
		var showPaging = t.tf_displayPaging;
		for(var i=0; i<SearchFlt.length; i++)
			SearchArgs.push( (grabEBI(SearchFlt[i]).value).toLowerCase() );
		var start_row = t.tf_ref_row;
		var row = grabTag(t,"tr");
		for(var k=start_row; k<row.length; k++)
		{
			/*** if table already filtered some rows are not visible ***/
			if(row[k].style.display == "none") row[k].style.display = "";
			var cell = getChildElms(row[k]).childNodes;
			var nchilds = cell.length;
			if(nchilds == ncells)// checks if row has exact cell #
			{
				var cell_value = new Array();
				var occurence = new Array();
				var isRowValid = true;
				for(var j=0; j<nchilds; j++)// this loop retrieves cell data
				{
					var cell_data = getCellText(cell[j]).toLowerCase();
					cell_value.push(cell_data);
					if(SearchArgs[j]!="")
					{
						var num_cell_data = parseFloat(cell_data);
						if(/<=/.test(SearchArgs[j]) && !isNaN(num_cell_data)) // first checks if there is an operator (<,>,<=,>=)
						{
							num_cell_data <= parseFloat(SearchArgs[j].replace(/<=/,"")) ? occurence[j] = true : occurence[j] = false;
						}
						else if(/>=/.test(SearchArgs[j]) && !isNaN(num_cell_data))
						{
							num_cell_data >= parseFloat(SearchArgs[j].replace(/>=/,"")) ? occurence[j] = true : occurence[j] = false;
						}
						else if(/</.test(SearchArgs[j]) && !isNaN(num_cell_data))
						{
							num_cell_data < parseFloat(SearchArgs[j].replace(/</,"")) ? occurence[j] = true : occurence[j] = false;
						}
						else if(/>/.test(SearchArgs[j]) && !isNaN(num_cell_data))
						{
							num_cell_data > parseFloat(SearchArgs[j].replace(/>/,"")) ? occurence[j] = true : occurence[j] = false;
						}
						else
						{
							var regexp;
							if(ematch || fprops["col_"+j]=="select") regexp = new RegExp('(^)'+regexpEscape(SearchArgs[j])+'($)',"gi");
							else regexp = new RegExp(regexpEscape(SearchArgs[j]),"gi");
							occurence[j] = regexp.test(cell_data);
						}
					}
				}
				for(var z=0; z<ncells; z++)
				{
					if(SearchArgs[z]!="" && !occurence[z]) isRowValid = false;
				}
			}
			if(!isRowValid)
			{
				row[k].style.display = "none"; hiddenrows++;
				if( showPaging ) row[k].setAttribute("validRow","false");
			}
			else
			{
				row[k].style.display = "";
				if( showPaging ) row[k].setAttribute("validRow","true");
			}
		}
		t.tf_nRows = parseInt( getRowsNb(id) )-hiddenrows;
		if( !showPaging ) applyFilterProps(id);//applies filter props after filtering process
		if( showPaging ){ t.tf_startPagingRow=0; setPagingInfo(id); }//starts paging process
	}
	function setPagingInfo(id)
	{
		var t = grabEBI(id);
		var start_row = parseInt( t.tf_ref_row );//filter start row
		var pagelength = t.tf_pagingLength;
		var row = grabTag(t,"tr");
		var mdiv = grabEBI("mdiv_"+id);
		var slcPages = grabEBI("slcPages_"+id);
		var pgspan = grabEBI("pgspan_"+id);
		var nrows = 0;
		for(var j=start_row; j<row.length; j++)//counts rows to be grouped
		{
			if(row[j].getAttribute("validRow") == "true") nrows++;
		}
		var npg = Math.ceil( nrows/pagelength );//calculates page nb
		pgspan.innerHTML = npg; //refresh page nb span
		slcPages.innerHTML = "";//select clearing shortcut
		if( npg>0 )
		{
			mdiv.style.visibility = "visible";
			for(var z=0; z<npg; z++)
			{
				var currOpt = new Option((z+1),z*pagelength,false,false);
				slcPages.options[z] = currOpt;
			}
		}
		else
		{
			/*** if no results paging select is hidden ***/
			mdiv.style.visibility = "hidden";
		}
		GroupByPage(id);
	}
	function GroupByPage(id)
	{
		showLoader(id,"");
		var t = grabEBI(id);
		var start_row = parseInt( t.tf_ref_row );//filter start row
		var pagelength = parseInt( t.tf_pagingLength );
		var paging_start_row = parseInt( t.tf_startPagingRow );//paging start row
		var paging_end_row = paging_start_row + pagelength;
		var row = grabTag(t,"tr");
		var nrows = 0;
		var validRows = new Array();//stores valid rows index
		for(var j=start_row; j<row.length; j++)
		//this loop stores valid rows index in validRows Array
		{
			var isRowValid = row[j].getAttribute("validRow");
			if(isRowValid=="true") validRows.push(j);
		}
		for(h=0; h<validRows.length; h++)
		//this loop shows valid rows of current page
		{
			if( h>=paging_start_row && h<paging_end_row )
			{
				nrows++;
				row[ validRows[h] ].style.display = "";
			}
			else row[ validRows[h] ].style.display = "none";
		}
		t.tf_nRows = parseInt(nrows);
		applyFilterProps(id);//applies filter props after filtering process
	}
	function applyFilterProps(id)
	{
		t = grabEBI(id);
		var rowsCounter = t.tf_rowsCounter;
		var nRows = t.tf_nRows;
		var rowVisibility = t.tf_rowVisibility;
		var alternateRows = t.tf_alternateBgs;
		var colOperation = t.tf_colOperation;
		if( rowsCounter ) showRowsCounter( id,parseInt(nRows) );//refreshes rows counter
		if( rowVisibility ) setVisibleRows(id);//shows rows always visible
		if( alternateRows ) setAlternateRows(id);//alterning row colors
		if( colOperation	) setColOperation(id);//makes operation on a col
		showLoader(id,"none");
	}
	function hasGrid(id)
	{
		var r = false, t = grabEBI(id);
		if(t != null && t.nodeName.toLowerCase() == "table")
		{
			for(i in TblId)
			{
				if(id == TblId[i]) r = true;
			}
		}
		return r;
	}
	function getCellsNb(id,nrow)
	{
		var t = grabEBI(id);
		var tr;
		if(nrow == undefined) tr = grabTag(t,"tr")[0];
		else	tr = grabTag(t,"tr")[nrow];
		var n = getChildElms(tr);
		return n.childNodes.length;
	}
	function getRowsNb(id)
	{
		var t = grabEBI(id);
		var s = t.tf_ref_row;
		var ntrs = grabTag(t,"tr").length;
		return parseInt(ntrs-s);
	}
	function getFilters(id)
	{
		var SearchFltId = new Array();
		var t = grabEBI(id);
		var tr = grabTag(t,"tr")[0];
		var enfants = tr.childNodes;
		if(t.tf_fltGrid)
		{
			for(var i=0; i<enfants.length; i++)
				SearchFltId.push(enfants[i].firstChild.getAttribute("id"));
		}
		return SearchFltId;
	}
	function clearFilters(id)
	{
		SearchFlt = getFilters(id);
		for(i in SearchFlt) grabEBI(SearchFlt[i]).value = "";
	}
	function showLoader(id,p)
	{
		var loader = grabEBI("load_"+id);
		if(loader != null && p=="none")
			setTimeout("grabEBI('load_"+id+"').style.display = '"+p+"'",150);
		else if(loader != null && p!="none") loader.style.display = p;
	}
	function showRowsCounter(id,p)
	{
		var totrows = grabEBI("totrows_span_"+id);
		if(totrows != null && totrows.nodeName.toLowerCase() == "span" )
			totrows.innerHTML = p;
	}
	function getChildElms(n)
	{
		if(n.nodeType == 1)
		{
			var enfants = n.childNodes;
			for(var i=0; i<enfants.length; i++)
			{
				var child = enfants[i];
				if(child.nodeType == 3) n.removeChild(child);
			}
			return n;
		}
	}
	function getCellText(n)
	{
		var s = "";
		var enfants = n.childNodes;
		for(var i=0; i<enfants.length; i++)
		{
			var child = enfants[i];
			if(child.nodeType == 3) s+= child.data;
			else s+= getCellText(child);
		}
		return s;
	}
	function getColValues(id,colindex,num)
	{
		var t = grabEBI(id);
		var row = grabTag(t,"tr");
		var nrows = row.length;
		var start_row = parseInt( t.tf_ref_row );//filter start row
		var ncells = getCellsNb( id,start_row );
		var colValues = new Array();
		for(var i=start_row; i<nrows; i++)//iterates rows
		{
			var cell = getChildElms(row[i]).childNodes;
			var nchilds = cell.length;
			if(nchilds == ncells)// checks if row has exact cell #
			{
				for(var j=0; j<nchilds; j++)// this loop retrieves cell data
				{
					if(j==colindex && row[i].style.display=="" )
					{
						var cell_data = getCellText( cell[j] ).toLowerCase();
						(num) ? colValues.push( parseFloat(cell_data) ) : colValues.push( cell_data );
					}
				}
			}
		}
		return colValues;
	}
	function setColWidths(id)
	{
		if( hasGrid(id) )
		{
			var t = grabEBI(id);
			t.style.tableLayout = "fixed";
			var colWidth = t.tf_colWidth;
			var start_row = parseInt( t.tf_ref_row );//filter start row
			var row = grabTag(t,"tr")[0];
			var ncells = getCellsNb(id,start_row);
			for(var i=0; i<colWidth.length; i++)
			{
				for(var k=0; k<ncells; k++)
				{
					cell = row.childNodes[k];
					if(k==i) cell.style.width = colWidth[i];
				}
			}
		}
	}
	function setVisibleRows(id)
	{
		if( hasGrid(id) )
		{
			var t = grabEBI(id);
			var row = grabTag(t,"tr");
			var nrows = row.length;
			var showPaging = t.tf_displayPaging;
			var visibleRows = t.tf_rowVisibility;
			for(var i=0; i<visibleRows.length; i++)
			{
				if(visibleRows[i]<=nrows)//row index cannot be > nrows
				{
					if(showPaging)
						row[ visibleRows[i] ].setAttribute("validRow","true");
					row[ visibleRows[i] ].style.display = "";
				}
			}
		}
	}
	function setAlternateRows(id)
	{
		if( hasGrid(id) )
		{
			var t = grabEBI(id);
			var row = grabTag(t,"tr");
			var nrows = row.length;
			var start_row = parseInt( t.tf_ref_row );//filter start row
			var visiblerows = new Array();
			for(var i=start_row; i<nrows; i++)//visible rows are stored in visiblerows array
				if( row[i].style.display=="" ) visiblerows.push(i);
			for(var j=0; j<visiblerows.length; j++)//alternates bg color
				(j % 2 == 0) ? row[ visiblerows[j] ].className = "even" : row[ visiblerows[j] ].className = "odd";
		}
	}
	function setColOperation(id)
	{
		if( hasGrid(id) )
		{
			var t = grabEBI(id);
			var labelId = t.tf_colOperation["id"];
			var colIndex = t.tf_colOperation["col"];
			var operation = t.tf_colOperation["operation"];
			var outputType =	t.tf_colOperation["write_method"];
			var precision = 2;//decimal precision
			if( (typeof labelId).toLowerCase()=="object"
				&& (typeof colIndex).toLowerCase()=="object"
				&& (typeof operation).toLowerCase()=="object" )
			{
				var row = grabTag(t,"tr");
				var nrows = row.length;
				var start_row = parseInt( t.tf_ref_row );//filter start row
				var ncells = getCellsNb( id,start_row );
				var colvalues = new Array();
				for(var k=0; k<colIndex.length; k++)//this retrieves col values
				{
					colvalues.push( getColValues(id,colIndex[k],true) );
				}
				for(var i=0; i<colvalues.length; i++)
				{
					var result=0, nbvalues=0;
					for(var j=0; j<colvalues[i].length; j++ )
					{
						var cvalue = colvalues[i][j];
						if( !isNaN(cvalue) )
						{
							switch( operation[i].toLowerCase() )
							{
								case "sum":
									result += parseFloat( cvalue );
								break;
								case "mean":
									nbvalues++;
									result += parseFloat( cvalue );
								break;
								//add cases for other operations
							}
						}
					}
					switch( operation[i].toLowerCase() )
					{
						case "mean":
							result = result/nbvalues;
						break;
					}
					if(outputType != undefined && (typeof outputType).toLowerCase()=="object")
					//if outputType is defined
					{
						result = result.toFixed( precision );
						if( grabEBI( labelId[i] )!=undefined )
						{
							switch( outputType[i].toLowerCase() )
							{
								case "innerhtml":
									grabEBI( labelId[i] ).innerHTML = result;
								break;
								case "setvalue":
									grabEBI( labelId[i] ).value = result;
								break;
								case "createtextnode":
									var oldnode = grabEBI( labelId[i] ).firstChild;
									var txtnode = createText( result );
									grabEBI( labelId[i] ).replaceChild( txtnode,oldnode );
								break;
								//other cases could be added
							}
						}
					}
					else
					{
						try
						{
							grabEBI( labelId[i] ).innerHTML = result.toFixed( precision );
						}
						catch(e){ }//catch
					}
				}
			}
		}
	}
	function grabEBI(id)
	{
		return document.getElementById( id );
	}
	function grabTag(obj,tagname)
	{
		return obj.getElementsByTagName( tagname );
	}
	function regexpEscape(s)
	{
		// traite les caractères spéciaux [\^$.|?*+()
		//remplace le carctère c par \c
		function escape(e)
		{
			a = new RegExp('\\'+e,'g');
			s = s.replace(a,'\\'+e);
		}
		chars = new Array('\\','[','^','$','.','|','?','*','+','(',')');
		//chars.each(escape); // no prototype framework here...
		for(e in chars) escape(chars[e]);
		return s;
	}
	function createElm(elm)
	{
		var el = document.createElement( elm );
		if(arguments.length>1)
		{
			for(var i=0; i<arguments.length; i++)
			{
				var argtype = typeof arguments[i];
				switch( argtype.toLowerCase() )
				{
					case "object":
						if( arguments[i].length==2 )
						{
							el.setAttribute( arguments[i][0],arguments[i][1] );
						}
					break;
				}
			}
		}
		return el;
	}
	function createText(node)
	{
		return document.createTextNode( node );
	}
	function DetectKey(e)
	{
		var evt=(e)?e:(window.event)?window.event:null;
		if(evt)
		{
			var key=(evt.charCode)?evt.charCode:
				((evt.keyCode)?evt.keyCode:((evt.which)?evt.which:0));
			if(key=="13")
			{
				var cid, leftstr, tblid, CallFn, Match;
				cid = this.getAttribute("id");
				leftstr = this.getAttribute("id").split("_")[0];
				tblid = cid.substring(leftstr.length+1,cid.length);
				t = grabEBI(tblid);
				(t.tf_isModfilter_fn) ? t.tf_modfilter_fn.call() : Filter(tblid);
			}
		}
	}
	function importScript(scriptName,scriptPath)
	{
		var isImported = false;
		var scripts = grabTag(document,"script");
		for (var i=0; i<scripts.length; i++)
		{
			if(scripts[i].src.match(scriptPath))
			{
				isImported = true;
				break;
			}
		}
		if( !isImported )//imports script if not available
		{
			var head = grabTag(document,"head")[0];
			var extScript = createElm(	"script",
																	["id",scriptName],
																	["type","text/javascript"],
																	["src",scriptPath]
																);
			head.appendChild(extScript);
		}
	}
	function maxchar(what,limit)
	{
		if (what.value.length>=limit)
		return false
	}

	/***
	*MUESTRA LA UBICACION DEL MAPA
	***/
	blank="imagenes/mapa/blank.gif"
	ags="imagenes/mapa/a01.gif"
	bcn="imagenes/mapa/a02.gif"
	bcs="imagenes/mapa/a03.gif"
	camp="imagenes/mapa/a04.gif"
	chps="imagenes/mapa/a05.gif"
	chih="imagenes/mapa/a06.gif"
	coah="imagenes/mapa/a07.gif"
	col="imagenes/mapa/a08.gif"
	dur="imagenes/mapa/a09.gif"
	gto="imagenes/mapa/a10.gif"
	guerr="imagenes/mapa/a11.gif"
	hgo="imagenes/mapa/a12.gif"
	jal="imagenes/mapa/a13.gif"
	mex="imagenes/mapa/a14.gif"
	mich="imagenes/mapa/a15.gif"
	mor="imagenes/mapa/a16.gif"
	nay="imagenes/mapa/a17.gif"
	nl="imagenes/mapa/a18.gif"
	oax="imagenes/mapa/a19.gif"
	pue="imagenes/mapa/a20.gif"
	qro="imagenes/mapa/a21.gif"
	quint="imagenes/mapa/a22.gif"
	slp="imagenes/mapa/a23.gif"
	sin="imagenes/mapa/a24.gif"
	son="imagenes/mapa/a25.gif"
	tab="imagenes/mapa/a26.gif"
	tmps="imagenes/mapa/a27.gif"
	tlax="imagenes/mapa/a28.gif"
	ver="imagenes/mapa/a29.gif"
	yuc="imagenes/mapa/a30.gif"
	zac="imagenes/mapa/a31.gif"
	df="imagenes/mapa/adf.gif"
	function imgout(imgname)
	{
		imgname.src=blank
	}
	function ags1(imgname)
	{
		imgname.src=ags
	}
	function bcn1(imgname)
	{
		imgname.src=bcn
	}
	function bcs1(imgname)
	{
		imgname.src=bcs
	}
	function camp1(imgname)
	{
		imgname.src=camp
	}
	function chps1(imgname)
	{
		imgname.src=chps
	}
	function chih1(imgname)
	{
		imgname.src=chih
	}
	function coah1(imgname)
	{
		imgname.src=coah
	}
	function col1(imgname)
	{
		imgname.src=col
	}
	function dur1(imgname)
	{
		imgname.src=dur
	}
	function gto1(imgname)
	{
		imgname.src=gto
	}
	function guerr1(imgname)
	{
		imgname.src=guerr
	}
	function hgo1(imgname)
	{
		imgname.src=hgo
	}
	function jal1(imgname)
	{
		imgname.src=jal
	}
	function mex1(imgname)
	{
		imgname.src=mex
	}
	function mich1(imgname)
	{
		imgname.src=mich
	}
	function mor1(imgname)
	{
		imgname.src=mor
	}
	function nay1(imgname)
	{
		imgname.src=nay
	}
	function nl1(imgname)
	{
		imgname.src=nl
	}
	function oax1(imgname)
	{
		imgname.src=oax
	}
	function pue1(imgname)
	{
		imgname.src=pue
	}
	function qro1(imgname)
	{
		imgname.src=qro
	}
	function quint1(imgname)
	{
		imgname.src=quint
	}
	function slp1(imgname)
	{
		imgname.src=slp
	}
	function sin1(imgname)
	{
		imgname.src=sin
	}
	function son1(imgname)
	{
		imgname.src=son
	}
	function tab1(imgname)
	{
		imgname.src=tab
	}
	function tmps1(imgname)
	{
		imgname.src=tmps
	}
	function tlax1(imgname)
	{
		imgname.src=tlax
	}
	function ver1(imgname)
	{
		imgname.src=ver
	}
	function yuc1(imgname)
	{
		imgname.src=yuc
	}
	function zac1(imgname)
	{
		imgname.src=zac
	}
	function df1(imgname)
	{
		imgname.src=df
	}



}