var xmlHttp;
var xmlHttpST;
var xmlDoc;

var aWeekday=new Array();
aWeekday[0]="Domingo";
aWeekday[1]="Lunes";
aWeekday[2]="Martes";
aWeekday[3]="Miércoles";
aWeekday[4]="Jueves";
aWeekday[5]="Viernes";
aWeekday[6]="Sábado";
aWeekday[7]="Domingo";

var aMonth=new Array();
aMonth[1]="Ene";
aMonth[2]="Feb";
aMonth[3]="Mar";
aMonth[4]="Abr";
aMonth[5]="May";
aMonth[6]="Jun";
aMonth[7]="Jul";
aMonth[8]="Ago";
aMonth[9]="Sep";
aMonth[10]="Oct";
aMonth[11]="Nov";
aMonth[12]="Dic";

var aMonthFull=new Array();
aMonthFull[1]="Enero";
aMonthFull[2]="Febrero";
aMonthFull[3]="Marzo";
aMonthFull[4]="Abril";
aMonthFull[5]="Mayo";
aMonthFull[6]="Junio";
aMonthFull[7]="Julio";
aMonthFull[8]="Agosto";
aMonthFull[9]="Septiembre";
aMonthFull[10]="Octubre";
aMonthFull[11]="Noviembre";
aMonthFull[12]="Diciembre";


////// VARIABLE TEMPORAL luego debe ser sustituida por un campo dentro de un archivo de configuracion
var gPeriodoActual = 7 // Corresponde al periodo actual que será calificado en el boletin
///////////////////////////////////////////////////////////////////////////////////////////////////


var gDataFormTargetFrame // Celda donde se mostrará el resultado primario de una consulta
var gDataGridTargetFrame // Celda donde se mostrará el resultado secundario de una consulta

var strBrowser;


//###############################################################################################################
// DATA FORM
//###############################################################################################################

function _CreateDataForm(aFormArgs,sHttpName) { 

	// gDataForms será un array global que almacenará la definición de cada datafor que se vaya creando en la aplicación
	// será un array asociativo que se accederá por el nombre de cada dataform
	if (typeof gDataForms=='undefined') {gDataForms = new Array();}


	if ((typeof sHttpName=='undefined') || (sHttpName==null)) {sHttpName = "CDF_Http";}

	eval("var "+sHttpName + " = GetXmlHttpObject()");
	if (eval(sHttpName) !==null) {
		//frn = Form name, ej. "DataForm"
		if(typeof aFormArgs["frn"] == "undefined") {var frn="DataForm";} else {var frn=aFormArgs["frn"];}
				
		
		// valores por defecto de los parametros que serán enviados para la construcción del DataForm
		var default_args = {
			'fld' : "",		// fld = field list, ej. "F_CODEST|F_NOMEST|..."
			'afl' : "",		// afl = additional field list, se colocarán en otra sección del dataform "
			'tbl' : "",		// tbl = table list, ej. "t_estudiantes AS est|t_docentes|..."
			'cla' : null,   // cla = sql clause, ej. "WHERE F_CODEST=..."
			'pfl' : 1,		// pfl = Campos primarios del data form
			'pfr' : true,		// pfr = priary fields required (si no es requerido y se deja en blaco se tomará como un alta)
			'fti' : null,   // fti = Form title, título que será colocado al data form
			'fcl' : "DataForm", //fcl = form class, clase que se desea asociar con todos los elementos del data form
			'fty' : null, 	// fty = field types, para definir tipo de control a utilizar (por defecto TEXT)
			'lay' : "A",	// lay = layout (A, descripciones izquierda control. B, descripciones sobre control)
			'suf' : true, 	// suf = show undefined fields, mostrará los campos aunque no esten definidos en configDatabase.xml
			'fml' : 50,		// fml = Field Max Length, los campos que superen este límite se editarán en TEXTAREA			
			'col' : 2,		// col = Cantidad de columnas del dataform
			'img' : true,   // si se mostrará la imagen asociada al objeto
			'nfu' : null,	// función que se ejecutará luego de PrimaryKeyChange
			'tab' : 0,		// numero inicial de tabindex, por defecto (0)
			'reg' : "yes"
		};

		for(var index in default_args) {
			if ((typeof aFormArgs[index]=="undefined")  || (aFormArgs[index]==null)) aFormArgs[index] = default_args[index];
		}

		var url="../common/createDataForm.php";
		url=url+"?frn="+frn;
		
		for(var index in default_args) {
			if (aFormArgs[index]!=null) {
				url=url+"&"+index+"="+encodeURIComponent(aFormArgs[index]);
			}
		}
		url=url+"&sid="+Math.random();

		if (typeof aFormArgs["sNextFunc"]=="undefined") {aFormArgs["sNextFunc"] = null; }
		if (typeof aFormArgs["sAfterSave"]=="undefined") { aFormArgs["sAfterSave"] = null; }
		if (typeof aFormArgs["aButtons"]=="undefined") {aFormArgs["aButtons"]= new Array(true,true,true);}

		// se guarda la definición del dataform en el array global
		gDataForms[frn] = aFormArgs;

//a(url);		
		var oFunc = function (){if (eval(sHttpName+".readyState == 4")) {_CreateFormRequest(frn,eval(sHttpName));}}
		eval(sHttpName+".onreadystatechange = oFunc;");
			
		document.body.style.cursor='wait';
		eval(sHttpName+".open('GET',url,true)");
		eval(sHttpName+".send(null)");

	} else {
		alert ("El navegador no soporta solicitudes HTTP!");
	} 
}


function _CreateFormRequest(sFormName,CDF_Http) {

	document.body.style.cursor='auto';
	
	var sTarFrame = gDataForms[sFormName]["sTarFrame"];
	document.getElementById(sTarFrame).innerHTML = CDF_Http.responseText;
		
	if (gDataForms[sFormName]["aButtons"][0]) {
		var sGuardar = "_InsertFormRecord('"+sFormName+"');";
		_CreateButton("div"+sFormName+"ButtRight","btn"+sFormName+"Guardar","Guardar",sGuardar,null,"../ecollege/img/icons/btnGuardar.png");
	}

	if (gDataForms[sFormName]["aButtons"][1]) {
		var sEliminar = "_DeleteFormRecord('"+sFormName+"');";
		_CreateButton("div"+sFormName+"ButtRight","btn"+sFormName+"Eliminar","Eliminar",sEliminar,null,"../ecollege/img/icons/btnBorrar.png");
		if (!gDataForms[sFormName]["cla"]) {
			document.getElementById("btn"+sFormName+"Eliminar").disabled = true;		
		}
	}


	// Se ubica el foco en el primer habilitado disponible y se agregará el calendario al costado de los campos de tipo DATE
	var oForm = document.getElementById("frm"+sFormName);
	var iTabIndex = 100;
	for (var x=0;x<oForm.length;x++){
		
		var sName = oForm.elements[x].id;
		var sType = oForm.elements[x].type.toLowerCase();

		if ((sType == 'text') || (sType == 'textarea') || (sType == 'select-one') || 
			(sType == 'password') || (sType == 'select')|| (sType == 'checkbox')) {

			// el campo con tabindex más bajo y esté habilitado quedará con el foco
			if ((!oForm.elements[x].disabled) && (oForm.elements[x].tabIndex<iTabIndex)) {
				oForm.elements[x].focus();
				iTabIndex = oForm.elements[x].tabIndex;
			}
			
			// en los campos de tipo date agregará el calendario a la derecha del mismo
			if ((sType == 'text') && (oForm.elements[x].alt.substr(4)=='date')){
				var btnName = 'btnDate_'+sName;
				Calendar.setup({inputField:sName,ifFormat:"%d-%m-%Y",button:btnName,showOthers:true});
			}
		}
	}

	if (gDataForms[sFormName]["aButtons"][2]) {
		var sBorrar = "_ClearFormFields('"+sFormName+"');";
		_CreateButton("div"+sFormName+"ButtLeft","btn"+sFormName+"Borrar","Borrar Campos",sBorrar,null,"../ecollege/img/icons/btnBorrarCampos.png");
	}


	// ejecuta la funcion recibida dentro de la variable
	if (gDataForms[sFormName]["sNextFunc"]) {eval(gDataForms[sFormName]["sNextFunc"]);} 


}

function _DataFormAdditionalFields(sFormName) {
	
	var oDiv = document.getElementById("div"+sFormName+"AddFields");
	
	if (oDiv.style.height=='100%') {
		oDiv.style.height = '0px';
	} else {
		oDiv.style.height = '100%';
	}

}

//##########################################################################################################

function _PrimaryKeyChanged(sFormName,sTable,sPk,sValue,bShowImage,sNextFunc,sImgPath,sImgExt)  {
//a(sFormName+" "+sPk+" "+sValue);

	// borra los controles antes de buscar el registro
	_ClearFormFields(sFormName,sValue);

	if (sValue!="") { // si no se ha dejado el campo en blanco

		var xmlHttp = GetXmlHttpObject();
		
		if (xmlHttp){
	
			if (typeof bShowImage == 'undefined') {bShowImage=true;}
		
			var url="../common/getRecordsXML.php";
			url=url+"?usr=";
			url=url+"&pwd="; // si no se envia fld getRecordXML utiliza '*'
			url=url+"&tbl="+sTable;  
			url=url+"&cla="+"WHERE "+sPk+"='"+sValue+"'";
			url=url+"&att="+"1";
	//a(url);
			xmlHttp.onreadystatechange=function (){if (xmlHttp.readyState == 4) {_PrimaryKeyChangedRequest(sFormName,sTable,sValue,bShowImage,sNextFunc,sImgPath,sImgExt,xmlHttp);}};
			document.body.style.cursor='wait';
			xmlHttp.open("GET",url,true);
			xmlHttp.send(null);	
	
		} else { 
			alert ("El Navegador no soporta solicitudes HTTP");
		} 
	} else {
		if ((typeof sNextFunc!='undefined') && (sNextFunc!='null') && (sNextFunc!=null)) {eval(sNextFunc);}
	}
	
}

function _PrimaryKeyChangedRequest(sFormName,sTable,sValue,bShowImage,sNextFunc,sImgPath,sImgExt,xmlHttp) { 
//a(sFormName);

	document.body.style.cursor='auto';

	var xmlDoc=xmlHttp.responseXML;

	eDoc = xmlDoc.getElementsByTagName("record");

	var sKeyValue = sValue;

	// Se cargan los controles del formulario con los valores del registro obtenido
	var oForm=document.getElementById("frm"+sFormName);
	// convierte a mayuscula el campo clave, ya que todas las claves deberán estar en mayusculas
	oForm.elements[0].value = oForm.elements[0].value.toUpperCase();

	if (eDoc.length==1) { // si se encontro el registro


		// habilita el botón de eliminado
		if (document.getElementById("btn"+sFormName+"Eliminar")) {
			document.getElementById("btn"+sFormName+"Eliminar").disabled = false;		
		}

		for (var z=(oForm.length-1); z>=0; z--){
			var sType = oForm.elements[z].type.toLowerCase();
			if ((sType=='text') || (sType=='textarea') || (sType=='password') || (sType=='select-one') || (sType=='checkbox')) {


				var sName = oForm.elements[z].name;								
				
				// quita el nombre del dataform que está concatenado delante delnombre del campo
				var sFldName = sName.substr(sFormName.length);
				
				var node = xmlDoc.getElementsByTagName(sFldName)[0];

				var nodeValue = node.childNodes[0].nodeValue;
				var nodeType = node.attributes.getNamedItem("type").value;

				if ((nodeValue!="null") && (nodeValue != "empty")) {
					
					// para los campos de tipo date se deberá reacomodar la información
					if (nodeType=='date') {
						nodeValue = nodeValue.substr(8,2) + "-" + nodeValue.substr(5,2) + "-" + nodeValue.substr(0,4);
					}
	
					if (sType=='checkbox') {
						if (nodeValue=='1') {
							document.getElementById(sName).checked = true;
						} else {
							document.getElementById(sName).checked = false;
						}
					} else {
						document.getElementById(sName).value = nodeValue;
					}
	
					// si el control es un SELECT y tiene un metodo onchange asociado será ejecutado
//					if (sType == 'select-one') {
						if ((z>0) && (document.getElementById(sName).onchange)) {
							document.getElementById(sName).onchange();
						}
//					}
					// si alguno de los campos siguientes a la clave tiene dato quiere decir que el registro fue encontrado
//				} else {
					// el campo clave nunca será borrado
//					if (z>0) {document.getElementById(sName).value = "";}
				}

			}
		}

		if (bShowImage) {
			
			
			if (!sImgPath) {sImgPath = "img/"+sTable.toLowerCase()+"/";}
			if (!sImgExt) {sImgExt = ".jpg";}
			
			sImgName = sKeyValue.toLowerCase();
			var oTD = document.getElementById("div"+sFormName+"ImageInner");
		
	//a(sImgPath+"/"+sTable+"/"+sImgName+sImgExt);
			oTD.innerHTML = "<img ID='img"+sFormName+"Image' src='"+sImgPath+sImgName+sImgExt+"' class='DataForm' width='150px' "
						  + " height='150px' onclick='_FichaEstudiante(\""+sKeyValue+"\")' "
						  + "OnError='_LoadGenericImage(\""+oTD.id+"\",\""+sFormName+"\",\""+sImgPath+"\",\""+sKeyValue+"\")'/>";
			
			// si el campo clave no se encuentra vacío se habilitará la subida de imagen
			if (oForm.elements[0].value.trim()!="") {
				// se define el nombre de la imagen que será subida, se corresponderá con el valor del campo clave
				document.getElementById("TARGET_FILE_NAME").value = sImgName+sImgExt;
			} else {
				// se define el nombre de la imagen que será subida, se corresponderá con el valor del campo clave
				document.getElementById("TARGET_FILE_NAME").value = "";
				document.getElementById("FILE_NAME").disabled = true;
			}
	
		}

	} else {

		// si no se requiere la introducción del campo clave, significa que cualquier clave introducida debe existir
		// o se deja en blaco, o se introduce un valor que exista en la bd.
		if (!gDataForms[sFormName]["pfr"]) {
			alert("El código introducido no existe");
			oForm.elements[0].value = "";
			oForm.elements[0].focus();
		} 
	}

	if ((typeof sNextFunc!='undefined') && (sNextFunc!='null') && (sNextFunc!=null)) {eval(sNextFunc);}


} 

function _LoadGenericImage(sTdId,sFormName,sImgPath,sKeyValue) {

	var oTD = document.getElementById(sTdId);	
	oTD.innerHTML = "<img ID='img"+sFormName+"Image' src='"+sImgPath+"generic.jpg' class='DataForm' width='150px' "
				  + " height='150px' onclick='_FichaEstudiante(\""+sKeyValue+"\")' />";

}


//##########################################################################################################


function _InsertFormRecord(sFormName) { 

	if (!_ValidateFormRecord(sFormName)) {
		return;
	}
	
	var xmlHttp = GetXmlHttpObject();

	if (xmlHttp!==null) {
		
		iPriFld = gDataForms[sFormName]["pfl"]==null ? 1 : gDataForms[sFormName]["pfl"];

// Las tablas de relaciones tendrán más de un campo clave		
		var url="../common/insertRecord.php";
		
		var sFieldNames="";
		var sFieldValues="";
		var oForm=document.getElementById("frm"+sFormName);
		for (var x=0;x<oForm.length;x++){
			
			var sName = oForm.elements[x].name;
			var sType = oForm.elements[x].type.toLowerCase();


			if ((sType=='text') || (sType=='textarea') || (sType=='select-one') || 
				(sType=='password') || (sType=='hidden') || (sType=='checkbox')) {

				// quita el nombre del dataform que está concatenado delante del nombre del campo
				var sFldName = sName.substr(sFormName.length);
				sFieldNames += sFldName + "|";	
				// si el campo primario 
				if ((sType == 'text') && (oForm.elements[x].alt.substr(1,1)=='1')){
					// se buscara si esta definido el array de busqueda para eliminarlo
					// asi se voverá a cargar el array la próxima vez que el usuario solicite la lista de ayuda
					if (typeof gSearchArray[sFldName]!='undefined') {gSearchArray[sFldName] = undefined;}
				}				

				var sValue = _GetElementValue(oForm.elements[x]);
				sFieldValues += sValue + "|";	
			}
		}

		prm ="fld="+encodeURIComponent(sFieldNames.substr(0,(sFieldNames.length)-1))
			+"&tbl="+encodeURIComponent(gDataForms[sFormName]["tbl"])
			+"&pfl="+encodeURIComponent(gDataForms[sFormName]["pfl"])  // Cantidad de campos primarios (tablas que tiene más de un campo clave)
			+"&del="
			+"&fld1="+encodeURIComponent(sFieldValues.substr(0,(sFieldValues.length)-1));
			
//a("/common/insertRecord.php?"+prm);

		xmlHttp.onreadystatechange=function (){if (xmlHttp.readyState == 4) {
				_InsertFormRecordRequest(sFormName,xmlHttp);}};

		document.body.style.cursor='wait';
		xmlHttp.open("POST",url,true);
		xmlHttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
		xmlHttp.send(prm);
	} else {
		alert ("El navegador no soporta solicitudes HTTP!");
	} 

}

function _InsertFormRecordRequest(sFormName,xmlHttp) { 

	document.body.style.cursor='auto';
	
	// quita el salto de linea al final de la linea de respuesta
	var sRequest = xmlHttp.responseText.replace(/[\n\r\t]/g,"");				

	var aRequest = sRequest.split("|");
	
	if (aRequest[0]==1) {
		// si se ha definido una función a ejecutar luego de guardar será ejecutada
		if (gDataForms[sFormName]["sAfterSave"]!=null) { 
			eval(gDataForms[sFormName]["sAfterSave"]+"(sRequest)");
		} else {
			alert("Los datos se guardaron correctamente");
			if (aRequest[2]==1) { // si se trata de un alta se borrarán los campos del dataform
				_ClearFormFields(sFormName);		
			}
		}
	} else {	
		alert("Se ha producido un error al guardar los datos");
	}
		
}

//##########################################################################################################


function _ValidateFormRecord(sFormName) {
	
	var oForm=document.getElementById("frm"+sFormName);

	for (var i=0;i<oForm.length;i++){

		if (!oForm.elements[i].disabled) {
			
			var sName = oForm.elements[i].name;
			var sType = oForm.elements[i].type.toLowerCase();
//a(sName);	
			if ((sType != 'button') && (sType != 'hidden') && (sType != 'checkbox')) {

				var sIsNumeric = '0';
				var sNotNull = '0';
				var sIsPrimary = '0';

				if ((sType == 'textarea') || (sType == 'select-one')) {					
					sValue = _RemoveInvalidCharacters(oForm.elements[i].value);
					if (document.getElementById("div"+sName)) {
						var sProp = document.getElementById("div"+sName).innerHTML;
						sIsNumeric = sProp.substr(0,1);
						sNotNull = document.getElementById("div"+sName).innerHTML.substr(2,1);
					}
				} else {					
					sValue = _RemoveInvalidCharacters(oForm.elements[i].value);
					sIsNumeric = oForm.elements[i].alt.substr(0,1);
					sIsPrimary = oForm.elements[i].alt.substr(1,1);
					sNotNull = oForm.elements[i].alt.substr(2,1);
				}
				
				document.getElementById(sName+'_Help').innerHTML = "";
		
				if (sNotNull=='1' && sValue=='') {// text field				
					document.getElementById(sName+'_Help').innerHTML = "El campo es requerido";
					return false;
				}				
				
				if (sIsNumeric==1 && sValue!='' && !IsNumeric(sValue)) {
					document.getElementById(sName+'_Help').innerHTML = "El campo debe ser numérico";
					return false;			
				}			
				
				if (sIsPrimary==1) {
					if (!(/^[-a-zA-Z0-9_]*$/.test(sValue))) {
						document.getElementById(sName+'_Help').innerHTML = "Sólo números, letras o guiones";
						return false;
					}
				}
			
				// los campos SELECT no es necesario validarlos, ya que las opciones son fijas
				if (sType != 'select-one') {	
					// quita el nombre del dataform que está concatenado delante delnombre del campo
					var bTmp = _Validate(sFormName,sName,sValue,sIsPrimary);
//					eval("var bTmp = _Validate(sFormName,'"+sName+"','"+sValue+"')");
				} else { 
					var bTmp=true; 
				}

				if (!bTmp) {return false;}			 
			}
		}
			
	}

	return true;
}


function _Validate(sFormName,sName,sValue,sIsPrimary) {
//alert(sFormName+" "+sFieldId+" "+sValue);


	sIsPrimary = typeof sIsPrimary=='undefined' ? 0 : sIsPrimary;

	var sFldName = sName.substr(sFormName.length);


	var tmpResult = true;
		
	
 	// Si se ha definido función de validación para el campo actual será ejecutada
	if (eval("typeof " + sFldName + "_Validation == 'function'")) {	
		eval("tmpResult = " + sFldName+"_Validation(sName,sValue)");
	}


	// Si se ha pasado la validación de campo se avlua si existe un array de valores posibles
	if (tmpResult) {
		// si el campo no esta vacío, no se trata de una clave primaria, y existe un array para su validación
		if ((sValue!="") && (sIsPrimary!=1) && (typeof gSearchArray[sFldName]!="undefined")) {
			if (typeof gSearchArray[sFldName][sValue] !='undefined') {		
				document.getElementById(sFormName+sFldName+"_Help").innerHTML = gSearchArray[sFldName][sValue];	
			} else {
				document.getElementById(sFormName+sFldName+"_Help").innerHTML = "El código introducido no existe";	
				tmpResult =  false;
			}
		}
	}


	return tmpResult;
}


//##########################################################################################################

function _DeleteFormRecord(sFormName){ 

	if (confirm("Confirma la eliminación del registro ?")) {

		xmlHttp = GetXmlHttpObject();
		if (xmlHttp!=null) {

			iPriFld = gDataForms[sFormName]["pfl"]==null ? 1 : gDataForms[sFormName]["pfl"];
			
			var x=document.getElementById("frm"+sFormName);
			
			// quita el nombre del dataform que está concatenado delante delnombre del campo
			var sFName =  x.elements[0].id.substr(sFormName.length)
			var sHFldNames = sFName;
			var sHFldValues = _GetElementValue(x.elements[0]);

			// se buscara si esta definido el array de busqueda para eliminarlo
			// asi se voverá a cargar el array la próxima vez que el usuario solicite la lista de ayuda
			if (typeof gSearchArray[sFName]!='undefined') {gSearchArray[sFName] = undefined;}
		
			for (var i=1; i<iPriFld; i++) {
				// quita el nombre del dataform que está concatenado delante delnombre del campo
				sFName =  x.elements[i].id.substr(sFormName.length);
				sHFldNames += "|" + sFName;
				sHFldValues += "|" + _GetElementValue(x.elements[i]);

				// se buscara si esta definido el array de busqueda para eliminarlo
				// asi se voverá a cargar el array la próxima vez que el usuario solicite la lista de ayuda
				if (typeof gSearchArray[sFName]!='undefined') {gSearchArray[sFName] = undefined;}
			}
						
			
			var url="../common/deleteRecord.php";
			url=url+"?HFld="+sHFldNames;		// Header Field Names
			url=url+"&HTbl="+gDataForms[sFormName]["tbl"];			// Header Tables
			url=url+"&HFlv="+sHFldValues;		// Header Field Values
			url=url+"&DFld=";					// Detail Field Names
			url=url+"&DTbl=";					// Detail Tables
			url=url+"&DFlv=";					// Header Field Values
//a(url);

			xmlHttp.onreadystatechange=function (){if (xmlHttp.readyState == 4) {_DeleteFormRecordRequest(sFormName);}};
			document.body.style.cursor='wait';
			xmlHttp.open("GET",url,true);
			xmlHttp.send(null);
				
		} else {
			alert ("El navegador no soporta solicitudes HTTP!");
		} 

	}
}

function _DeleteFormRecordRequest(sFormName) { 

	document.body.style.cursor='auto';

	// quita el salto de linea al final de la linea de respuesta
	var sRequest = xmlHttp.responseText.replace(/[\n\r\t]/g,"");				

	var aRequest = sRequest.split("|");

	if (aRequest[0]==1) {
		
		if (gDataForms[sFormName]["sAfterSave"]!=null) { eval(gDataForms[sFormName]["sAfterSave"]+"('"+sRequest+"')");}

		_ClearFormFields(sFormName);

		if (gDataForms[sFormName]["sNextFunc"]) {eval(gDataForms[sFormName]["sNextFunc"]);}
		
	} else {	

		alert("No se pudo eliminar el registro, puede que tenga datos relacionados");
	}



}


//##########################################################################################################

function _ClearFormFields(sFormName,sPrimaryValue) {

	window.scrollTo(0,0);

	if (typeof sPrimaryValue=='undefined') {sPrimaryValue=null;}

	if (document.getElementById("btn"+sFormName+"Eliminar")) {
		document.getElementById("btn"+sFormName+"Eliminar").disabled = true;		
	}
	
	var aFields = gDataForms[sFormName]['fld'].split("|");

	var iTabIndex = 9;

	var oForm = document.getElementById("frm"+sFormName);

	for (var x=0;x<oForm.length;x++){

		var sName = oForm.elements[x].id;
		var sType = oForm.elements[x].type.toLowerCase();
		var bPrimary = '0';

		if ((sType=='text') || (sType=='textarea') || (sType=='select-one') || 
			(sType=='password') || (sType=='select') || (sType=='checkbox')) {
			// se determina si el campo es clave primaria o no
			if ((sType == 'text') || (sType == 'password') || (sType == 'checkbox')) {
				var bPrimary = oForm.elements[x].alt.substr(1,1);
			} else if (document.getElementById("div"+sName)) {
				var bPrimary = document.getElementById("div"+sName).innerHTML.substr(1,1);
			}
			
			// si no es el campo primario, o es el primario pero no se ha especificado ningun valor
			if ((bPrimary!='1') || (!sPrimaryValue)) {
		
				var sValue="";
				// para cada campo buscará si se había definido un valor por defecto 
				for (var y=0;y<aFields.length;y++){
					var aTmp = aFields[y].split(":");
					if (sName==aTmp[0]) {
						if (typeof aTmp[2] != 'undefined') {sValue = aTmp[2];}
					}
				}
				
				if (sType=='checkbox') {
					if 	(sValue=='1') {oForm.elements[x].checked=true;} else {oForm.elements[x].checked=false;}
				} else {
					oForm.elements[x].value = sValue;
				}
				
				document.getElementById(sName+"_Help").innerHTML = "";
				
				// el campo con tabindex más bajo y esté habilitado quedará con el foco
				if ((!oForm.elements[x].disabled) && (oForm.elements[x].tabIndex<iTabIndex)) {
					oForm.elements[x].focus();
					iTabIndex = oForm.elements[x].tabIndex;
				}
				
			} else {
				oForm.elements[x].value = sPrimaryValue;
			}
			
		}
	}

	
	// de existir datos relacionados, también se borrará el contenido de los div que contienen dichos datos
	if (typeof gRelations!='undefined') {
		for (var x=0; x<gRelations.length; x++) {
			if (document.getElementById("ADM_Related"+x)) {
				document.getElementById("ADM_Related"+x).innerHTML="";
				document.getElementById("ADM_Related"+x+"Buttons").innerHTML="";
			}
		}
	}
	
	if (document.getElementById("div"+sFormName+"ImageInner")) {
		document.getElementById("div"+sFormName+"ImageInner").innerHTML = "";
	}
}


//##########################################################################################################


function _dataFormfinishFileUpload(sFormName,iResult,sResult,sKeyValue) {

	if (iResult!=1) {
		alert(sResult);	
	} else {
		
		// obtiene el nombre del campo clave a partir de la lista de campos provista al dataform
		sFields = eval(sFormName+'["fld"]');
		sKeyName = sFields.split("|")[0];
		eval(sFormName+'["cla"] = "WHERE '+sKeyName+'=\''+sKeyValue+'\'"');
		eval('_CreateDataForm('+sFormName+')');
	}

}



//##########################################################################################################
// INSERT MULTIPLE RECORDS
//##########################################################################################################


function _InsertMultipleRecords(sFldNames,sTables,iPriFld,aFieldValues,sDeleteCla,sRequestFunc,sNextFunc,sHttpName) {
	if ((typeof sHttpName=='undefined') || (sHttpName==null)) {sHttpName = "IMR_Http";}

	eval("var " + sHttpName + " = GetXmlHttpObject()");
	if (eval(sHttpName) !==null) {
		
		if (!sDeleteCla) {sDeleteCla="";}
	
		var url="../common/insertRecord.php";
		prm="fld="+encodeURIComponent(sFldNames)		
		+"&tbl="+encodeURIComponent(sTables)
		+"&pfl="+encodeURIComponent(iPriFld)  // Cantidad de campos primarios (para las tablas que tiene más de un campo clave
		+"&del="+encodeURIComponent(sDeleteCla);  // Clausula de eliminacion de registros en forma previa al insert (opcional)
		
		for (var i=0;i < aFieldValues.length; i++){
			prm=prm+"&flv" + i + "=" + encodeURIComponent(aFieldValues[i]);
		}	

//a(url+"?"+prm);

		if (sRequestFunc) {
			var oFunc = function (){
				if (eval(sHttpName+".readyState == 4")) {
					document.body.style.cursor='auto';
					// quita el salto de linea al final de la linea de respuesta
					var sReq = eval(sHttpName+".responseText");	
					sReq = sReq.replace(/[\n\r\t]/g,"");	
					eval(sRequestFunc+"(sReq)");
				}
			}
			eval(sHttpName+".onreadystatechange = oFunc;");
			
		} else if (sNextFunc) {
			var oFunc = function (){
				if (eval(sHttpName+".readyState == 4")) {
					document.body.style.cursor='auto';
					eval(sNextFunc);
				}
			}
			eval(sHttpName+".onreadystatechange = oFunc;");
		}
		
		document.body.style.cursor='wait';
		eval(sHttpName+".open('POST',url,true)");
		eval(sHttpName+".setRequestHeader('Content-Type','application/x-www-form-urlencoded')");		
		eval(sHttpName+".send(prm)");

	} else {
		alert ("El navegador no soporta solicitudes HTTP!");
	} 
}


//##########################################################################################################
// INSERT MULTIPLE RECORDS RELATED
//##########################################################################################################


function _InsertMultipleRecordsRelated(sHFldNames,sHTables,iHPriFld,sHFldValues,sDFldNames,sDTables,iDPriFld,aDFldValues,sRequestFunc,sNextFunc) { 

	// NOTA: Si se usa una BD distinta a la BD por defecto, sólo se debe especificar en las tablas de sHTables
	// sHTables = "2#tabla_a|tabla_b"
	// Las tablas del detalle sDTables utilizarán la misma BD.

	if ((typeof sDFldNames=='undefined') || (sDFldNames==null)) {sDFldNames = "";}
	if ((typeof sDTables=='undefined') || (sDTables==null)) {sDTables = "";}
	if ((typeof iDPriFld=='undefined') || (iDPriFld==null)) {iDPriFld = "";}
	if ((typeof aDFldValues=='undefined') || (aDFldValues==null)) {aDFldValues = "";}


	xmlHttp = GetXmlHttpObject();
	if (xmlHttp!==null) {

		var url="../common/insertRecordRelated.php";
		var prm = "HFld="+sHFldNames		// Header Field Names
				+ "&HTbl="+sHTables			// Header Tables
				+ "&HFlv="+encodeURIComponent(sHFldValues)		// Header Field Values
				+ "&HPfl="+iHPriFld 		// Header Primary Fields (para las tablas que tiene más de un campo clave)
				+ "&DFld="+sDFldNames		// Detail Field Names
				+ "&DTbl="+sDTables			// Detail Tables
				+ "&DPfl="+iDPriFld;  		// Detail Primary Fields (para las tablas que tiene más de un campo clave)

		if (aDFldValues!="") {
			for (var i=0;i < aDFldValues.length; i++){
				prm+= "&flv" + i + "=" + encodeURIComponent(aDFldValues[i]);
			}	
		}

		
//a(url+"?"+prm);

		if (sRequestFunc) {
			xmlHttp.onreadystatechange=function (){
				if (xmlHttp.readyState == 4) {
					document.body.style.cursor='auto';
					// quita el salto de linea al final de la linea de respuesta
					sReq = xmlHttp.responseText.replace(/[\n\r\t]/g,"");				

					eval(sRequestFunc+"(sReq)");
				}
			}
		} else if (sNextFunc) {
			xmlHttp.onreadystatechange=function (){
				if (xmlHttp.readyState == 4) {
					document.body.style.cursor='auto';
					eval(sNextFunc);
				}
			}
		}
		document.body.style.cursor='wait';
		xmlHttp.open("POST",url,true);
		xmlHttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
		xmlHttp.send(prm);
	} else {
		alert ("El navegador no soporta solicitudes HTTP!");
	} 
}


//##########################################################################################################
// DELETE  RECORDS
//##########################################################################################################
// Elimina un registro de la tabla principal y opcionalmente los registos de tablas relacionadas

function _DeleteRecords(sHFldNames,sHTables,sHFldValues,sDFldNames,sDTables,sDFldValues,sRequestFunc,sNextFunc,sHttpName){ 

	if ((typeof sHttpName=='undefined') || (sHttpName==null)) {sHttpName = "DR_Http";}
	
	eval(sHttpName + "= GetXmlHttpObject()");
	if (eval(sHttpName) !==null) {

		if (!sDFldNames) {sDFldNames="";} 
		if (!sDTables) {sDTables="";} 
		if (!sDFldValues) {sDFldValues="";} 

		var url = "../common/deleteRecord.php";
		var prm = "HFld="+sHFldNames		// Header Field Names
				+ "&HTbl="+sHTables			// Header Tables
				+ "&HFlv="+sHFldValues		// Header Field Values
				+ "&DFld="+sDFldNames		// Detail Field Names
				+ "&DTbl="+sDTables			// Detail Tables
				+ "&DFlv="+sDFldValues		// Detail Field Values

//a(url+"?"+prm);

		if (sRequestFunc) {
			var oFunc = function (){
				if (eval(sHttpName+".readyState == 4")) {
					document.body.style.cursor='auto';
					// quita el salto de linea al final de la linea de respuesta
					var sReq = eval(sHttpName+".responseText");	
					sReq = sReq.replace(/[\n\r\t]/g,"");	
					eval(sRequestFunc+"(sReq)");
				}
			}
			eval(sHttpName+".onreadystatechange = oFunc;");
			
		} else if (sNextFunc) {
			var oFunc = function (){
				if (eval(sHttpName+".readyState == 4")) {
					document.body.style.cursor='auto';
					eval(sNextFunc);
				}
			}
			eval(sHttpName+".onreadystatechange = oFunc;");
		}


		document.body.style.cursor='wait';
		eval(sHttpName+".open('POST',url,true)");
		eval(sHttpName+".setRequestHeader('Content-Type','application/x-www-form-urlencoded')");		
		eval(sHttpName+".send(prm)");
			
	} else {
		alert ("El navegador no soporta solicitudes HTTP!");
	} 

}


//##########################################################################################################
// DELETE MULTIPLE RECORDS
//##########################################################################################################
// Elimina varios registros de la tabla principal, recibe un array de valores a eliminar

function _DeleteMultipleRecords(sHFldNames,sHTables,aHFldValues,sRequestFunc,sNextFunc,sHttpName){ 

	if ((typeof sHttpName=='undefined') || (sHttpName==null)) {sHttpName = "DR_Http";}
	
	eval(sHttpName + "= GetXmlHttpObject()");
	if (eval(sHttpName) !==null) {

		var url="../common/deleteMultipleRecords.php";
		var prm = "HFld="+sHFldNames		// Header Field Names
				+ "&HTbl="+sHTables;		// Header Tables
		
		for (var x=0; x<aHFldValues.length; x++) {
			prm+= "&HFlv"+x+"="+aHFldValues[x];	
		}
		
//a(url+"?"+prm);

		if (sRequestFunc) {
			var oFunc = function (){
				if (eval(sHttpName+".readyState == 4")) {
					document.body.style.cursor='auto';
					// quita el salto de linea al final de la linea de respuesta
					var sReq = eval(sHttpName+".responseText");	
					sReq = sReq.replace(/[\n\r\t]/g,"");	
					eval(sRequestFunc+"(sReq)");
				}
			}
			eval(sHttpName+".onreadystatechange = oFunc;");
			
		} else if (sNextFunc) {
			var oFunc = function (){
				if (eval(sHttpName+".readyState == 4")) {
					document.body.style.cursor='auto';
					eval(sNextFunc);
				}
			}
			eval(sHttpName+".onreadystatechange = oFunc;");
		}

		document.body.style.cursor='wait';
		eval(sHttpName+".open('POST',url,true)");
		eval(sHttpName+".setRequestHeader('Content-Type','application/x-www-form-urlencoded')");		
		eval(sHttpName+".send(prm)");
			
	} else {
		alert ("El navegador no soporta solicitudes HTTP!");
	} 

}





//########################################################################################################################
// GET RECORDS
//########################################################################################################################

function _GetRecords(sFields,sTables,sClause,sSQL,sReqFunc,sHttpName) { 

	if ((typeof sFields=='undefined') || (sFields==null)) {sFields = "";}
	if ((typeof sTables=='undefined') || (sTables==null)) {sTables = "";}
	if ((typeof sClause=='undefined') || (sClause==null)) {sClause = "";}
	if ((typeof sSQL=='undefined') || (sSQL==null)) {sSQL = "";}
	if ((typeof sHttpName=='undefined') || (sHttpName==null)) {sHttpName = "GR_Http";}
	
	eval("var "+ sHttpName + "= GetXmlHttpObject()");
	if (eval(sHttpName) !==null) {
		
		var url = "../common/getRecordsXML.php";
		var prm = "fld="+sFields	
				+ "&tbl="+sTables
				+ "&cla="+sClause
				+ "&sql="+sSQL;	
//a(url+"?"+prm.replace(/\|/g,","));

		var oFunc = function (){
			if (eval(sHttpName+".readyState == 4")) {eval("_GetRecordsRequest("+sHttpName+",sReqFunc)");}
		}
		eval(sHttpName+".onreadystatechange = oFunc;");

		document.body.style.cursor='wait';
		eval(sHttpName+".open('POST',url,true)");
		eval(sHttpName+".setRequestHeader('Content-Type','application/x-www-form-urlencoded')");		
		eval(sHttpName+".send(prm)");
	} else {
		alert ("El navegador no soporta solicitudes HTTP!");
	} 
}



function _GetRecordsRequest(xmlHttp,sReqFunc) { 
//alert(sReqFunc);
	document.body.style.cursor='auto';

	var xmlDoc=xmlHttp.responseXML;
//	alert("hola");
	var eDoc = xmlDoc.getElementsByTagName("record");
	
	if (eDoc) {
		
		// aGrupos será cargado con todos los grupos del usuario
		var aResult = new Array();

		for (var x=0; x<eDoc.length; x++) {
			
			// por cada registro devuelto se creará una nueva posición en el array.
			aResult[x] = new Array();

			for (var y=0; y<eDoc[x].childNodes.length; y++) {
				// por cada campo devuelto se creará una nueva posición en el array secundario.
				var sFldValue = eDoc[x].childNodes[y].childNodes[0].nodeValue;
				if ((sFldValue=='empty') || (sFldValue=='null')) {sFldValue=null;}
				
				aResult[x][y] = sFldValue;
			}
		}
	}
		
	if (sReqFunc) {eval(sReqFunc+"(aResult);");}
	
}




//##########################################################################################################
// OBTIENE LA FECHA Y HORA DEL SERVIDOR
//##########################################################################################################


function _getServerDate(sReqFunc) {
	
	var xmlHttp = GetXmlHttpObject();
	if (xmlHttp!==null) {
		var url="../common/getServerDate.php";
		
		xmlHttp.onreadystatechange=function() {if (xmlHttp.readyState == 4) {_getServerDateRequest(xmlHttp,sReqFunc);}};
		document.body.style.cursor='wait';		
		xmlHttp.open("GET",url,true);
		xmlHttp.send(null);
	} else {
		alert ("El navegador no soporta solicitudes HTTP!");
	}
}


function _getServerDateRequest(xmlHttp,sReqFunc) { 

	document.body.style.cursor='auto';

	var xmlDoc=xmlHttp.responseXML;
	var eDoc = xmlDoc.getElementsByTagName("date")[0];
	
	var sDate = eDoc.firstChild.nodeValue;
	
	if (sReqFunc) { eval(sReqFunc+"(sDate)");}

}


//##########################################################################################################
// CREATE DATA GRID
//##########################################################################################################


function _CreateDataGrid(aGridArgs) { 


	CDG_xmlHttp= GetXmlHttpObject();
	if (CDG_xmlHttp!=null) {

		//grn = Grid name, ej. "DataGrid"
		if(typeof aGridArgs["grn"] == "undefined") {var grn="DataGrid";} else {var grn=aGridArgs["grn"];}
		// valores por defecto de los parametros que serán enviados para la construcción del DataGrid

		var default_args = {
			'fld' : "",		// fld = field list, ej. "F_CODEST|F_NOMEST|..."
			'tbl' : "",		// tbl = table list, ej. "t_estudiantes AS est|t_docentes|..."
			'cla' : null,   // cla = sql clause, ej. "WHERE F_CODEST=..."
			'fty' : null,   // fty = field types, para incluir valores de las celdas dentro de un control, ej. "TEXT|..."
			'fpr' : null,   // fpr = field properties, eventos o estylos que se quiere asociar con las celdas de cada columna
			'fpx' : null,	// fpx = field prefix, prefijo que se quiere ubicar antes del dato del campo
			'fsx' : null,	// fpx = field sufix, sufijo que se quiere ubicar después del dato del campo
			'cpr' : null,   // cpr = control properties, eventos o estylos que se quiere asociar con el control dentro de una celda
			'fil' : _GetDataGridFilters(grn),   // fil = filter, filtros que son agregados a las clausula sql
			'ord' : null,   // ord = order,  nombre del campo por el cual será ordenada la consulta.
			'lim' : "0,50", // lim = limit, primer registro a mostrar y cantidad de registos mostrados por página
			'fwi' : null,	// fwd = field wifth, ancho en pixeles de cada celda de datos, ej "10|20|50|30"
							// dwh = div Width, ancho del div que contendrá la tabla de datos del datagrid
			'dwi' : document.getElementById(aGridArgs["sTarFrame"]).offsetWidth,	
			'dhe' : null,	// dhe = div Height, alto del div que contendrá la tabla de datos del datagrid
			'hpr' : null,   // hpr = header properties, eventos o estylos que se quiere asociar con el cabezal de cada columna
			'him' : null,   // him = header images, imagenes que se quieren incorporar al cabezal de cada columna			
			'gti' : null,   // gti = grid title, título que será colocado antes que los cabezales de campo
			'gst' : null,   // gst = grid subtitle, título que será colocado antes que los cabezales de campo
			'gcl' : "DataGrid",	//gcl = grid class, clase que se desea asociar con todos los elementos del datagrid
			'pdf' : null,	//pdf = generacion de PDF, pasar "yes" para habilitar el icono de PDF
			'fle' : null,	//fle = PDF fields len, largo de los campos para el PDF
			'fal' : null,	//fle = PDF fields align, alineación de campos para el PDF
			'ref' : null	//ref = Refresh function, de recibir un nombre se creará un botón para ejecutar la función
		};

		for(var index in default_args) {
			if ((typeof aGridArgs[index] == "undefined") || (aGridArgs[index]==null)) aGridArgs[index] = default_args[index];
		}

		var url="../common/createDataGrid.php";
		url=url+"?grn="+grn;
		for(var index in default_args) {
			if (aGridArgs[index]) {
				url=url+"&"+index+"="+encodeURIComponent(aGridArgs[index]);
			}
		}
		if(typeof aGridArgs["sNextFunc"] == "undefined") {var sNextFunc=null;} else {var sNextFunc=aGridArgs["sNextFunc"];}
		if(typeof aGridArgs["bTDAppend"] == "undefined") {var bTDAppend=false;} else {var bTDAppend=aGridArgs["bTDAppend"];}
		if(typeof aGridArgs["aButtons"] == "undefined") {var aButtons=null;} else {var aButtons=aGridArgs["aButtons"];}
		if(typeof aGridArgs["sTarFrame"] == "undefined") {var sTarFrame="tdMainBottom";} else {var sTarFrame=aGridArgs["sTarFrame"];}

		if(typeof aGridArgs["afl"] == "undefined") {var afl=null;} else {var afl=aGridArgs["afl"];}
		if (afl) {
			for( var i=0; i < afl.length; i++ ) { // se agregan los acampos adicionales pasados como parametros opcionales
				if (afl[i]) {
					url=url+"&afl"+(i)+"="+afl[i]; //&afl1=TEXT:Calif:Calificacion:2&afl2=...&afl3=...
				}
			}
		}
		url=url+"&sid="+Math.random();
//a(url);

		CDG_xmlHttp.onreadystatechange=function() {if (CDG_xmlHttp.readyState == 4) {_CreateDataGridRequest(grn,sTarFrame,aButtons,sNextFunc,bTDAppend);}};
		document.body.style.cursor='wait';
		CDG_xmlHttp.open("GET",url,true);
		CDG_xmlHttp.send(null);
		
//		aGridArgs = aDataGridArgs;
	} else {
		alert ("El navegador no soporta solicitudes HTTP!");
	} 
}

function _CreateDataGridRequest(sGridName,sTarFrame,aButtons,sNextFunc,bTDAppend) {

	document.body.style.cursor='auto';
    var oTargetFrame = document.getElementById(sTarFrame);
	
	if (bTDAppend) {
		oTargetFrame.innerHTML = oTargetFrame.innerHTML + CDG_xmlHttp.responseText;
	} else {
		oTargetFrame.innerHTML =  CDG_xmlHttp.responseText;
	}
	if (aButtons) {

		_AddImgButton("td"+sGridName+"RightFooter",aButtons);
	}


	// Si se ha pasado otra función para ejecutar a continuación, es ejecutada
	
	if (sNextFunc) {
		// por si se ha especificado la opcion "repeat" para ejecutar la función cada vez que se redibuje el datagrid
		aNextFunc = sNextFunc.split("|");
		eval(aNextFunc[0]);
	}

	// si se han incluido checkbox dentro del datagrid, se debe de haber definido el vector para su control
	if (eval("typeof " +sGridName+"Check != 'undefined'")) {_LoadDataGridCheckBox(sGridName);}
}


// Retorna un string con los contenidos del cuadros de texto de filtros de un datagrid.
function _GetDataGridFilters(sGridName) {

	var sFldFilters = "|";
	if  (document.getElementById('frm'+sGridName)) { 
		var sFldFilters = "";
		var oForm=document.getElementById('frm'+sGridName);
		for (var i=0;i<oForm.length;i++){
			if ((oForm.elements[i].type == 'text') && (oForm.elements[i].id.substr(0,3) == 'fil')) {
				sFldFilters = sFldFilters + oForm.elements[i].value + "|";	
			}
		}
	}
	
	return sFldFilters;
}


function _EnableDataGridFilter(sGridName,tdFilterName) {
	if (document.getElementById(tdFilterName)) { 
		var oTD = document.getElementById(tdFilterName);
		oTD.innerHTML = "<IMG src='img/icons/filter.png' onclick='_DataGridApplyFilter(\""+sGridName+"\")'/>";	
	}
}

function _DataGridApplyFilter(sGridName) {

	// Como la variable y el nombre del datagrid son iguales, se accede al contenido de la variable a través del nombre del datagrid
	// Al filtrar comienza la consulta desde la primera pagina, porque puede ser que la cantidad de registros devueltos sea menor
	// a la cantidad de registros necesarios para llegar a la página actual
	var aLimits = eval(sGridName+'["lim"].split(",")');
	
	eval(sGridName+'["lim"]="0,'+aLimits[1]+'"'); 
	eval(sGridName+'["fil"] = _GetDataGridFilters(sGridName)');

	// verifica si se ha especificado la opción repeat para sNextFnc, de ser no borra la función para que se vuelva a ejecutar
	if (eval(sGridName+'["sNextFunc"]')) {
		eval('var sNextFunc = '+sGridName+'["sNextFunc"]');
		var aNextFunc = sNextFunc.split("|");
		if ((aNextFunc[1]) && (aNextFunc[1]!="repeat")) {eval(sGridName+'["sNextFunc"]=""');}
	}

	eval('_CreateDataGrid('+sGridName+')');
}


function _ClearDataGridFilter(sGridName,sFilterName) {
	if  (document.getElementById(sFilterName)) { 
		var oObj = document.getElementById(sFilterName);
		oObj.value = "";	
	// como la variable y el nombre del datagrid son iguales, accede al contenido de la variable a través del nombre del datagrid
		eval(sGridName+'["fil"] = _GetDataGridFilters(sGridName)');

		// verifica si se ha especificado la opción repeat para sNextFnc, de ser no borra la función para que se vuelva a ejecutar
		if (eval(sGridName+'["sNextFunc"]')) {
			eval('var sNextFunc = '+sGridName+'["sNextFunc"]');
			var aNextFunc = sNextFunc.split("|");
			if ((aNextFunc[1]) && (aNextFunc[1]!="repeat")) {eval(sGridName+'["sNextFunc"]=""');}
		}
		
		eval('_CreateDataGrid('+sGridName+')');
	}
}


function _SetGridOrderAndLimits(sGridName,sOrder,sLimit) {
//a(sGridName +":"+sOrder+":"+sLimit);
	// como la variable y el nombre del datagrid son iguales, accede al contenido de la variable a través del nombre del datagrid
	eval(sGridName+'["ord"]=sOrder');

	eval(sGridName+'["lim"]=sLimit');
	eval(sGridName+'["fil"]=_GetDataGridFilters(sGridName)');
	
	// verifica si se ha especificado la opción repeat para sNextFnc, de ser no borra la función para que se vuelva a ejecutar
	if (eval(sGridName+'["sNextFunc"]')) {
		eval('var sNextFunc = '+sGridName+'["sNextFunc"]');
		var aNextFunc = sNextFunc.split("|");
		if ((aNextFunc[1]) && (aNextFunc[1]!="repeat")) {eval(sGridName+'["sNextFunc"]=""');}
	}
	eval('_CreateDataGrid('+sGridName+')');
}



function _LoadDataGridCheckBox(sGridName) {

	var oFrm = document.getElementById("frm"+sGridName);
	for (var i=0;i<oFrm.length;i++){
		if (oFrm.elements[i].type.toLowerCase() == 'checkbox') {

			eCheck = oFrm.elements[i];
			sKey = eCheck.id.substring(0,eCheck.id.indexOf("_")); // Extrae la parte "_Check" para quedarse sólo con el código
			
			var bFound = false;
			for ( var x=0; x < eval(sGridName+"Check.length"); x++ ) {
				// verifica si ya existía la clave en el vector de control de los checkbox
				if (eval(sGridName+"Check["+x+"] =='"+ sKey +"'")) {bFound = true; break;}
			}
			if (bFound) {// Si el elemento esta en el vector, y no esta checkeado lo marca
				if (!eCheck.checked) {eCheck.click();}
			} else { // Si el elemento NO estaba en el vector, y estaba checkeado lo desmarca
				if (eCheck.checked) {eCheck.click();}
			}
		
		}
	}
}




function _DataGridCheckBoxClick(sGridName,sKey,bCheck) {
		
	var bFound = false;
	for ( var x=0; x < eval(sGridName+"Check.length"); x++ ) {
		// si el elemento ya se encontraba en el vector será removido
		if (eval(sGridName+"Check["+x+"] =='"+ sKey +"'")) {
			bFound = true;
			break;
		}
	}
	if ((bCheck) && (!bFound)) { // agrega la clave al vector de elementos seleccionados
		eval(sGridName+"Check["+sGridName+"Check.length] ='"+ sKey +"'");
	}
	if ((!bCheck) && (bFound)) {// remueve la clave al vector de elementos seleccionados
		eval(sGridName+"Check.splice("+x+",1)");
	}
//	alert(eval(sGridName+"Check.length"));
}






//########################################################################################################################
// SEARCH ITEM
//########################################################################################################################
// oBtn: objeto
// sSearchTarFrm: id del elemento destino donde se insertará el código seleccionado
// sSearchArrName: array asociativo que se utilizará para la busqueda de elementos
// sSearchArrProp: si el array contiene objetos de una clase, se podrá enumerar las propiedades que se quieren listar.
//			 ejemplo "nombre; apellido; direccion"
// sSearchSQL: en caso de no proveer un array se podrá recibir una consulta que se utilizará para cargar los elementos
// sSearchRef: si se quiere guardar el array resultante de la consulta se podrá pasar un id de referencia, 
// 			   la próxima vez en lugar de ejecutar la consulta se accederá directamente al array.
// sSearchFilter: puede ser un string si se quiere comenzar la busqueda ya aplicando un filtro.
// sSearchReqFunc: función a ejecutar cuando se seleccione un elemento.


function _searchItem(oBtn,sSearchTarFrm,sSearchArrName,sSearchArrProp,sSearchSQL,sSearchRef,sSearchFilter,sSearchReqFunc) {

	if (typeof sSearchTarFrm=='undefined') {sSearchTarFrm=null;}
	if (typeof sSearchArrName=='undefined') {sSearchArrName=null;}
	if (typeof sSearchArrProp=='undefined') {sSearchArrProp=null;}
	if (typeof sSearchSQL=='undefined') {sSearchSQL=null;}
	if (typeof sSearchRef=='undefined') {sSearchRef=null;}
	if (typeof sSearchFilter=='undefined') {sSearchFilter=null;}
	if (typeof sSearchReqFunc=='undefined') {sSearchReqFunc=null;}

	// array global asociativo que contendrá todas las listas de ayuda que vaya solicitando el usuario
	if (typeof gSearchArray=='undefined') {gSearchArray = new Array();}

	// el id del elemento destino se guarda en una variable global para usar posteriormente
	gSearchTarFrm=sSearchTarFrm;

	// si se han recibido una función de retorno será ejecutada si se selecciona un elemento
	if (sSearchReqFunc) {gSearchReqFunc=sSearchReqFunc;} else {gSearchReqFunc=null;}

	// si se ha recibido un nombre de array se guardara en una variable global para usar un funciones siguientes
	if (sSearchArrName) {gSearchArrName=sSearchArrName;} else {gSearchArrName=null;}
	
	// si se han recibido propiedades del array se guardaran en una variable global para usar un funciones siguientes
	if (sSearchArrProp) {gSearchArrProp=sSearchArrProp;} else {gSearchArrProp=null;}

	// si ha recibido un id de referencia se utilizará dicho id para almacenar en el array de busqueda
//	if (sSearchRef) {gSearchRef=sSearchRef;} else {gSearchRef='tmp';}
	
	gSearchRef=sSearchRef;
	// si se ha recibido un nombre de array, el array será cargado en el array de busqueda
//	if (sSearchArrName!=null)  {
//		eval("gSearchArray['"+gSearchRef+"'] = "+sSearchArrName+";");
//	}

	// si ya existe un array para la referencia recibida, o se ha recibido un nombre de array
	if (((gSearchRef) && (typeof gSearchArray[gSearchRef]!="undefined")) || (gSearchArrName)) {	
//a("EXISTE: "+gSearchRef);	
		_searchItemShowDiv(oBtn,sSearchFilter);
	} else if (sSearchSQL!=null){		
//a("NO:");	
		xmlHttp = GetXmlHttpObject();
		if (xmlHttp!==null) {
			var url="../common/getRecordsXML.php" +"?sql=" + sSearchSQL;
//a(url);
			xmlHttp.onreadystatechange=function() {if (xmlHttp.readyState == 4) {_searchItemRequest(oBtn,sSearchFilter);}};
			document.body.style.cursor='wait';
			xmlHttp.open("GET",url,true);
			xmlHttp.send(null);
		} else {
			alert ("El navegador no soporta solicitudes HTTP!");
		}			
	}
	

}


function _searchItemRequest(oBtn,sSearchFilter) {

	document.body.style.cursor='auto';

	xmlDoc=xmlHttp.responseXML;
	eDoc = xmlDoc.getElementsByTagName("record");

	// se creará un array para contener los registros devueltos por la consulta
	gTmpArray = new Array();
	// se recorren todos los registos devueltos
	if (eDoc.length>0) {
		for (var x=0; x<eDoc.length; x++) {
			var sId = eDoc[x].childNodes[0].childNodes[0].nodeValue;
			var sDes = "";
			for (var y=1; y<eDoc[x].childNodes.length; y++) {
				var sTmp = eDoc[x].childNodes[y].childNodes[0].nodeValue;
				if ((sTmp!="empty") && (sTmp!="null")) { sDes+= sTmp + "  "; }
			}
			gTmpArray[sId] = sDes;
		}
	}
	
	if (!gSearchRef) {gSearchRef="tmp";}
	gSearchArray[gSearchRef] = gTmpArray;

	_searchItemShowDiv(oBtn,sSearchFilter);

}


function _searchItemShowDiv(oBtn,sSearchFilter) {

	if (!sSearchFilter) {sSearchFilter="";}	

	var iLeft = _GetAbsoluteLeft(oBtn);
	var iTop = _GetAbsoluteTop(oBtn);

	var sHTML = "<table><tr>"
		  + "<td >Buscar</td>"
		  + "<td ><input type='TEXT' id='tdSearchText' style='width:180px' onkeyup='_searchKeyUpTextBox(event)'></td>"
		  + "</tr><tr>"
		  + "<td id='tdSearchItems' colspan=3><br>"
		  + "<select id='lstSearchItems' name='lstSearchItems' ondblclick='_selectItem()' onkeyup='_searchKeyUpListBox(event)' size=10 style='width:230px' ></select></td>"
		  + "</tr></table>";

	_ShowPopUp("",sHTML,250,iLeft,iTop);

	document.getElementById("tdSearchText").focus();
		
	_showItems();

}



function _searchKeyUpTextBox(e) {
	
	if (typeof t!='undefined') {clearTimeout(t);}
	
	var iKeyCode=null;
	
	if(e && e.which) {
		iKeyCode = e.which;
	} else {
		if(!e && window.event) {e=window.event};
		if(e && e.keyCode) { iKeyCode = e.keyCode;}
	}

	// si se ha presionado arriba o abajo, se cambiará el elemento actual del ListBox
	if ((iKeyCode==38) || (iKeyCode==40)) { 

		var oListBox = document.getElementById("lstSearchItems");
	
		var iItems = document.getElementById("lstSearchItems").options.length;	 
		var iCurrItem = document.getElementById("lstSearchItems").selectedIndex
		
		if (iKeyCode==38) { // flecha arriba
			if (iCurrItem>0) {oListBox.value = oListBox.options[iCurrItem-1].value;}
		} else if (iKeyCode==40) { // flecha abajo
			if (iCurrItem<(iItems-1)) {	oListBox.value = oListBox.options[iCurrItem+1].value;}
		}

	} else if (iKeyCode==13) { 
		// si se ha presionado enter, se devolverá el elemento actualmente seleccionado.
		_selectItem(); 
	} else if (((iKeyCode>=48) && (iKeyCode<=90)) || (iKeyCode==8) || (iKeyCode==46))  { 
		// si se ha introducido un numero o letras, o presionado la tecla backspace o delete, se mostrarán los elementos.
		t = setTimeout("_showItems()",500);
	}
}



function _searchKeyUpListBox(e) {
	var iKeyCode=null;
	
	if(e && e.which) {
		iKeyCode = e.which;
	} else {
		if(!e && window.event) {e=window.event};
		if(e && e.keyCode) { iKeyCode = e.keyCode;}
	}

	if (iKeyCode==13) {
		// si se ha presionado enter, se devolverá el elemento actualmente seleccionado.
		_selectItem(); 
	}

}


function _showItems() {

	var oListBox = document.getElementById("lstSearchItems");

	var sFilter = document.getElementById("tdSearchText").value;
	
	sFilter = sFilter.replace(/á/gi,'a');
	sFilter = sFilter.replace(/é/gi,'e');
	sFilter = sFilter.replace(/í/gi,'i');
	sFilter = sFilter.replace(/ó/gi,'o');
	sFilter = sFilter.replace(/ú/gi,'u');
	sFilter = sFilter.replace(/Á/gi,'A');
	sFilter = sFilter.replace(/É/gi,'E');
	sFilter = sFilter.replace(/Í/gi,'I');
	sFilter = sFilter.replace(/Ó/gi,'O');
	sFilter = sFilter.replace(/Ú/gi,'U');
	sFilter = sFilter.replace(/\s/gi,'.*');

	var sRegExp = new RegExp(sFilter,"i");


	// elimina los elementos anteriores que pudieran estar cargados dentro del listbox
	oListBox.length = 0;

	if (gSearchArrName) {var sArrName = gSearchArrName;} else {var sArrName = 'gSearchArray[gSearchRef]';}

	// muestro los elementos del array recibido filtrando aquellos que no cumplan con el filtro introducido por el usuario
	for (var ItemId in eval(sArrName)) {
		if (ItemId!="indexOf") {	

			// si no se han especificado propiedades del array se tomará directamente el contenido de la clave
			if (gSearchArrProp==null) {
				var sItemName = eval(sArrName+"[ItemId]");
			} else {
				var sItemName = "";
				var aProp = gSearchArrProp.split(";");
				for (var x=0; x<aProp.length; x++) {
					sItemName += eval(sArrName+"[ItemId]."+aProp[x]);
					sItemName += " ";
				}
			}

			var s = sItemName;
			s = s.replace(/á/gi,'a');
			s = s.replace(/é/gi,'e');
			s = s.replace(/í/gi,'i');
			s = s.replace(/ó/gi,'o');
			s = s.replace(/ú/gi,'u');
			s = s.replace(/Á/gi,'A');
			s = s.replace(/É/gi,'E');
			s = s.replace(/Í/gi,'I');
			s = s.replace(/Ó/gi,'O');
			s = s.replace(/Ú/gi,'U');

//			eval("sItemName = gSearchArray[gFieldId]"+"["+ItemId+"]");
			if (s.search(sRegExp)>=0) {	
				_AddOption("lstSearchItems","["+ItemId+"] "+sItemName,ItemId);
			}
		}
	}

	document.getElementById("lstSearchItems").selectedIndex=0;

}


function _hideSearchDiv() {
	if (document.getElementById("divSearch")) {
		document.getElementById("divSearch").style.display="none";
	}
}



function _searchKeyPress() {
	iKeyCode = window.event.keyCode;
}

function _selectItem() {

	var sValue = document.getElementById("lstSearchItems").value;

	_HidePopUp();

	// si se ha definido un elemento destino
	if (gSearchTarFrm) {
		// si existe algun elemento con el id del destino 
		if (document.getElementById(gSearchTarFrm)) {
			var oControl = document.getElementById(gSearchTarFrm);
			if (typeof oControl.value != 'undefined') {
				oControl.value = sValue;
				oControl.onchange(this.value);
			} else {
				oControl.innerHTML = sValue;
			}
		} 
	}

	if (gSearchReqFunc) { eval(gSearchReqFunc+"(sValue,gSearchTarFrm);"); }
	

}



// #####################################################################################################################
// FILE UPLOAD
// #####################################################################################################################


function _fileUpload(aUploadArgs) {

/*
	var sInvalidTypes = "ade|adp|asx|bas|bat|chm|cmd|com|cpl|crt|exe|hlp|hta|inf|ins|isp|js|"
				 	  + "jse|lnk|mda|mdb|mde|mdt|mdw|mdz|msc|msi|msp|mst|ops|pcd|pif|prf|reg|scf|scr|sct|shb|shs|"
				 	  + "url|vb|vbe|vbs|wsc|wsf|wsh";
*/

	var sValidTypes	= "xls|xlsx|ods|"
					+ "doc|docx|odt|"
					+ "ppt|pptx|pps|ppsx|odp|"
					+ "txt|csv|pdf|"
					+ "jpg|jpeg|gif|bmp|png|"
					+ "zip|rar";

	// valores por defecto de los parametros que serán enviados para la construcción del DataForm
	var default_args = {
		'sName' : "FileUpload",		// nombre que será asociado a los elementos de la subida de archivos 
		'sClass' : "FileUpload",	// clase asociada a los elementos de la subida de archivos
		'sTarDir' : "/uploaded",	// directorio por defecto donde se subirán los archivos
//		'bUpload' : true,			// Define si se habilita la subida de archivo
//		'sFileName' : null,			// Nombre de archivo por defecto por si sólo se habilito la introducción de comentario
//		'bComment' : false,			// Define si se habilita el cuadro de texto para introducir comentario
//		'sCommText' : "",			// Comentario por defecto para el texto
		'iMaxSize' : 2097152,		// Tamaño máximo de archivo (2mb)
		'sValTypes' : sValidTypes,	// Extensiones de archivo validas (ej: "TXT|DOC|XLS")
		'sInvTypes' : null,			// Extensiones de archivo invalidas (ej: "EXE|JS")
		'iTextWidth' : 200,   		// largo para el cuadro de texto del nombre de archivo
//		'sOtros1' : null,   		// Dato que será almacenado en el campo F_OT1ARC
//		'sOtros2' : null,   		// Dato que será almacenado en el campo F_OT2ARC
		'bShowResult' : true,   	// define si se mostrará el resultado de la subida exitosa, los errores siempre se mostrarán
		'sTarFrame' : null,   		// elemento donde se mostrará el formulario para la subida de archivos
		'bUploadInFrame': null,		// iFrame que contiene la página, en caso de que el sTarFrame este dentro de un iframe
		'sReqFunc' : null,		   // Función donde se quiere recibir el resultado de la inserción de datos
		'sNextFunc' : null		   // Función a ejecutar luego de la inserción de datos
	};

	for(var index in default_args) {
		if ((typeof aUploadArgs[index] == "undefined") || (aUploadArgs[index] == null)) {
			aUploadArgs[index] = default_args[index];
		}
	}

	if (aUploadArgs["sTarFrame"]) {

		var sClass = aUploadArgs["sClass"];
		var iSize = aUploadArgs["iMaxSize"];
		var sValTyp = aUploadArgs["sValTypes"];
		var sInvTyp = aUploadArgs["sInvTypes"];
		var iTextWidth = aUploadArgs["iTextWidth"];
//		var sCommText = aUploadArgs["sCommText"];

		// variables global que serán utilizadas en funciones siguientes de la subida de archivos
		gUploadName = aUploadArgs["sName"];
//		gUpload = aUploadArgs["bUpload"];
//		gComment = aUploadArgs["bComment"];
		gFileName = aUploadArgs["sFileName"];
		gFileDir = aUploadArgs["sTarDir"];
		sReqFunc = aUploadArgs["sReqFunc"];
		sNextFunc = aUploadArgs["sNextFunc"];
		bShowResult = aUploadArgs["bShowResult"];
		gIframe = aUploadArgs["bUploadInFrame"];
//		gOt1Arg = aUploadArgs["sOtros1"];
//		gOt2Arg = aUploadArgs["sOtros2"];


		var sHTML = "";
		// si se ha habilitado la subida de archivo
//		if (gUpload) {
			
			sHTML += '<DIV id="div'+gUploadName+'Message" class="'+sClass+'Message"></DIV>';
			
			sHTML += '<form id="frm'+gUploadName+'upload" action="../common/fileUpload.php" ';
			sHTML += 'method="post" enctype="multipart/form-data" ';
			sHTML += 'target="fra'+gUploadName+'uploadFrame" onsubmit="_startFileUpload(\''+gUploadName+'\');" > ';
			sHTML += '<div class="'+sClass+'" >';
			sHTML += '<TABLE class="'+sClass+'" ><TR><TD>';
			sHTML += '<input type="hidden" id="MAX_FILE_SIZE" name="MAX_FILE_SIZE" value="'+iSize+'" /> ';
			sHTML += '<input type="hidden" id="UPLOAD_NAME" name="UPLOAD_NAME" value="'+gUploadName+'" /> ';
			sHTML += '<input type="hidden" id="TARGET_FILE_NAME" name="TARGET_FILE_NAME" value="" /> ';
			sHTML += '<input type="hidden" id="dir" name="dir" value="'+gFileDir+'" /> ';
			sHTML += '<input type="file" id="FILE_NAME" name="FILE_NAME" class="'+sClass+'" ';
			if (gIframe==null) {
				sHTML += 'onchange="_validateFileTypes(this.value,\'btn'+gUploadName+'uploadSubmit\',\''+sValTyp+'\',\''+sInvTyp+'\')" /> ';
			} else {
				sHTML += 'onchange="parent._validateFileTypes(this.value,\'btn'+gUploadName+'uploadSubmit\',\''+sValTyp+'\',\''+sInvTyp+'\')" /> ';
			}		
			sHTML += '</TD><TD style="width:50px">';
			sHTML += '<input class="'+sClass+'Submit" type="submit" id="btn'+gUploadName+'uploadSubmit" name="btn'+gUploadName+'uploadSubmit" ';
			sHTML += 'value="Subir Archivo" disabled="disabled"></input> ';
			sHTML += '</TD></TR></TABLE>';
			sHTML += '</div>';
			
			sHTML += '</form>';
				  
			sHTML += '<iframe id="fra'+gUploadName+'uploadFrame" name="fra'+gUploadName+'uploadFrame" src="#" style="width:0;height:0;border:0px solid #fff;"></iframe>';
//		}


/*
		// si se ha habilitado la inroducción de comentario de archivo
		if (gComment) {	
			sHTML += '<DIV class="'+sClass+'Comment" >Comentario (max. 200)<br/> '
				  +	 '<TEXTAREA class="'+sClass+'Comment" id="txt'+gUploadName+'Description" name="txt'+gUploadName+'Description" '
				  +  ' >'+sCommText+'</TEXTAREA>'
				  +  '</DIV>';
		}
*/		
		if (gIframe==null) {
			oTD = document.getElementById(aUploadArgs["sTarFrame"]);
		} else {
			oTD = window.frames[gIframe].document.getElementById(aUploadArgs["sTarFrame"]);
		}		
		oTD.innerHTML = sHTML;

//		if (gUpload) {
			// se repite la línea para que efectivamente tome el foco
			if (gIframe==null) {
				document.getElementById("FILE_NAME").focus();
				document.getElementById("FILE_NAME").focus();
			} else {
				 window.frames[gIframe].document.getElementById("FILE_NAME").focus();
				 window.frames[gIframe].document.getElementById("FILE_NAME").focus();
			}
/*		} else {			
			// si NO se ha habilitado la subida de archivo se creará un botón para guardar el comentario
			_CreateButton(aUploadArgs["sTarFrame"],'btnSaveComment','Guardar',"_saveUploadedFile()");					
		}
*/
	}
//			  + '<input type="hidden" id="RESULT_FUNCTION" name="RESULT_FUNCTION" value="_finishFileUpload" /> '

}




function _validateFileTypes(sFileName,sSubmitId,sValidTypes,sInvalidTypes) {

	var aExt = sFileName.match(/\..+$/);
	
	// Quita el punto inicial
	var sExt = aExt[0].substr(1).toUpperCase();
	var bValidExt = true;
	
	// si se han definido tipos de extensiones invalidas, y la extensión del archivo es una de ellas
	// o si se han definido extensiones validas, y no es una de ellas
	if (((sInvalidTypes!='null') && (sInvalidTypes.toUpperCase().indexOf(sExt)!=-1)) || 
		((sValidTypes!='null') && (sValidTypes.toUpperCase().indexOf(sExt)==-1))) {
		bValidExt=false;
		alert("Tipo de archivo inválido");
	}

	if (bValidExt) {
		if (gIframe==null) {
			document.getElementById(sSubmitId).disabled = false;
		} else {
			window.frames[gIframe].document.getElementById(sSubmitId).disabled = false;
		}	
	} else {
		if (gIframe==null) {
			document.getElementById(sSubmitId).disabled = true;
		} else {
			window.frames[gIframe].document.getElementById(sSubmitId).disabled = true;
		}	
    }
}

function _startFileUpload(sUploadName){

	if (gIframe==null) {
		document.getElementById("div"+sUploadName+"Message").innerHTML = "<img src='img/loader.gif' />";
	} else {
		window.frames[gIframe].document.getElementById("div"+sUploadName+"Message").innerHTML = "<img src='img/loader.gif' />";
	}	
	return true;
}


function _finishFileUpload(sUploadName,iResult,sResult,sFileName,sFileDir,sFileSize) {
	
	// Si la subida fué exitosa, y se especifico no mostrar el resultado
	if (((iResult==1) || (iResult==2)) && (!bShowResult) )  { sResult = "";}
	
	if (gIframe==null) {
		document.getElementById("div"+sUploadName+"Message").innerHTML = sResult;
	} else {
		window.frames[gIframe].document.getElementById("div"+sUploadName+"Message").innerHTML = sResult;
	}	

	// se definen como global, ya que se necesitan en las funciones siguientes
//	gUploadName = sUploadName;
//	gFileName = sFileName;
//	gFileDir = sFileDir;

	// si se ha permitido el ingreso de comentario y el usuario ha introducido algo se guardará el comentario
//	if ((gComment) && (document.getElementById("txt"+sUploadName+"Description").value!="")) {
//		_saveUploadedFile();
//	} else { // en caso contrario se retorna el resultado a la función de request
		eval(sReqFunc+"("+iResult+",'"+sResult+"','"+sFileName+"','"+sFileDir+"','"+sUploadName+"')");
//	}

}






/*######################################################################################################################3
TODA ESTA SECCION ERA PARA CUANDO LOS ARCHIVOS SUBIDOS TAMBIEN SE GUARDABAN EN UNA TABLA

function _searchUploadedFile(sUploadName,sFileName,sFileSize) {
	
	var sFields = "F_NROARC|F_NOMARC";
	var sTables = "t_archivos";
	var sClause = "WHERE F_CODUSR='"+gCodUsr+"' AND F_NOMARC='"+sFileName+"' ";
	
	xmlHttp = GetXmlHttpObject();
	if (xmlHttp!==null) {
		var url="../common/getRecordsXML.php";
		url=url+"?usr="+"root";
		url=url+"&pwd="+"password";
		url=url+"&fld="+sFields;		
		url=url+"&tbl="+sTables;
		url=url+"&cla="+sClause;	
		
		xmlHttp.onreadystatechange=function() {if (xmlHttp.readyState == 4) {_searchUploadedFileRequest(sUploadName,sFileName,sFileSize);}};
		xmlHttp.open("GET",url,true);
		xmlHttp.send(null);
	} else {
		alert ("El navegador no soporta solicitudes HTTP!");
	} 
}

function _searchUploadedFileRequest(sUploadName,sFileName,sFileSize) {

	xmlDoc=xmlHttp.responseXML;
	eDoc = xmlDoc.getElementsByTagName("record");
	if (eDoc) {
		// si el archivo ya existía en la tabla de archivos, se obtendrán sus datos
		if (eDoc.length>0) {			
			var sFileNumber = eDoc[0].childNodes[0].childNodes[0].nodeValue;
			var sFileName = eDoc[0].childNodes[1].childNodes[0].nodeValue;
			// si el archivo ya estaba registrado se invocará la función de request pasada a fileupload
			eval(sReqFunc+"(1,"+sFileNumber+",'"+gFileName+"','"+gUploadName+"')");
		} else {			
			// si el archivo no estaba registrado, se creará el registro correspondiente en la tabla de archivos
			_saveUploadedFile(sUploadName,sFileName,sFileSize)
		}
	}


}


######################################################################################################################*/



// #####################################################################################################################
// FILE DELETE
// #####################################################################################################################


function _fileDelete(sFileName,sRequestFunc,sNextFunc) {

	xmlHttp = GetXmlHttpObject();
	if (xmlHttp!==null) {
				
		var url = "../common/fileDelete.php";
		var prm = "file="+sFileName;
		if (sRequestFunc) {

			xmlHttp.onreadystatechange=function (){if (xmlHttp.readyState == 4) {
				// quita el salto de linea al final de la linea de respuesta
				sReq = xmlHttp.responseText.replace(/[\n\r\t]/g,"");				
				eval(sRequestFunc+"(sReq)");}
				}
		} else if (sNextFunc) {
			xmlHttp.onreadystatechange=function (){if (xmlHttp.readyState == 4) {eval(sNextFunc);}}
		}
		xmlHttp.open("POST",url,true);
		xmlHttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
		xmlHttp.send(prm);

	} else {
		alert ("El navegador no soporta solicitudes HTTP!");
	} 
}

// #####################################################################################################################
// CREATE FOLDER
// #####################################################################################################################


function _createFolder(sPath,sFolder,sRequestFunc,sNextFunc) {

	xmlHttp = GetXmlHttpObject();
	if (xmlHttp!==null) {
				
		// Se quitan los caracteres inválidos que pudieran existir en el nombre de la carpeta
		sFolder = sFolder.replace(/[^-A-Za-z0-9\s_.áéíóúÁÉÍÓÚ\xF1\xD1]/g,"");	
		
		var url = "../common/createFolder.php";
		var prm = "dir="+encodeURIComponent(sPath+sFolder);
		
		if (sRequestFunc) {

			xmlHttp.onreadystatechange=function (){
				if (xmlHttp.readyState == 4) {
				// quita el salto de linea al final de la linea de respuesta				
				sReq = xmlHttp.responseText.replace(/[\n\r\t]/g,"");				
				eval(sRequestFunc+"(sReq)");}
				}
		} else if (sNextFunc) {
			xmlHttp.onreadystatechange=function (){if (xmlHttp.readyState == 4) {eval(sNextFunc);}}
		}
//a(url+"?"+prm);

		xmlHttp.open("POST",url,true);
		xmlHttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
		xmlHttp.send(prm);

	} else {
		alert ("El navegador no soporta solicitudes HTTP!");
	} 
}

// #####################################################################################################################
// DELETE FOLDER
// #####################################################################################################################


function _deleteFolder(sPath,sRequestFunc,sNextFunc) {

	xmlHttp = GetXmlHttpObject();
	if (xmlHttp!==null) {
				
		var url = "../common/deleteFolder.php";
		var prm = "dir="+encodeURIComponent(sPath);
		
		if (sRequestFunc) {

			xmlHttp.onreadystatechange=function (){
				if (xmlHttp.readyState == 4) {
				// quita el salto de linea al final de la linea de respuesta				
				sReq = xmlHttp.responseText.replace(/[\n\r\t]/g,"");				
				eval(sRequestFunc+"(sReq)");}
				}
		} else if (sNextFunc) {
			xmlHttp.onreadystatechange=function (){if (xmlHttp.readyState == 4) {eval(sNextFunc);}}
		}
//a(url+"?"+prm);

		xmlHttp.open("POST",url,true);
		xmlHttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
		xmlHttp.send(prm);

	} else {
		alert ("El navegador no soporta solicitudes HTTP!");
	} 
}


// #####################################################################################################################
// GET DIR FILES
// #####################################################################################################################
// Retorna un Array con todos los archivos del directorio recibido como parámetro


function Directorio( id, nom, tip, tam, fec, hor, path) {
	this.id = id;
	this.nombre = nom;
	this.tipo = tip;
	this.tamano = tam;
	this.fecha = fec;
	this.hora = hor;
	this.path = path;
	this.archivos = new Array();
	this.directorios = new Array();
	this.getDir = _getDir; // devuelve el objeto directorio que se corresponda con el path recibido
}

function Archivo( nom, tip, tam, fec, hor) {
	this.nombre = nom;
	this.tipo = tip;
	this.tamano = tam;
	this.fecha = fec;
	this.hora = hor;
}



function _getDirFiles(sNomDir,bCreateFolder,sPattern,sReqFunc) {
	
	if ((typeof bCreateFolder=='undefined') || (bCreateFolder==null)) { bCreateFolder=false;}
	
	//sPattern (si se utiliza retornará los archivos que cumplan con el patrón, puede ser más de 1. ej "aaa|bbb|ccc")
	if ((typeof sPattern=='undefined') || (sPattern==null)) { sPattern="";}

	xmlHttp = GetXmlHttpObject();
	if (xmlHttp!==null) {
		
		var url = "../common/getFilesXML.php"
		   		+ "?dir="+sNomDir
		   		+ "&cfo="+bCreateFolder
		   		+ "&pat="+sPattern;
//a(url);	
		xmlHttp.onreadystatechange=function() {if (xmlHttp.readyState == 4) {_getDirFilesRequest(sReqFunc);}};
		document.body.style.cursor='wait';
		xmlHttp.open("GET",url,true);
		xmlHttp.send(null);
	} else {
		alert ("El navegador no soporta solicitudes HTTP!");
	} 
}




function _getDirFilesRequest(sReqFunc) {

	document.body.style.cursor='auto';

	xmlDoc = xmlHttp.responseXML;
	
	var aFiles = _createFileTree(xmlDoc.documentElement,"0","");
	
	if (sReqFunc) {eval(sReqFunc+"(aFiles);");}
}

function _createFileTree(eDoc,sId,sPath) {

	var sNomArc = eDoc.getAttribute('name');
	var sTipArc = eDoc.getAttribute('type');
	var sTamArc = eDoc.getAttribute('size');
	var sFecArc = eDoc.getAttribute('date').substr(0,10);
	var sHorArc = eDoc.getAttribute('date').substr(11,5);

	sPath+= "/" + sNomArc;
	
	var oDir = new Directorio(sId, sNomArc, sTipArc, sTamArc, sFecArc, sHorArc, sPath);

	if (eDoc.childNodes.length>0) {
		
		// recorrerá el primer nivel debajo del nodo raíz (nivel 0)
		for (var x=0; x<eDoc.childNodes.length; x++) {
			// se descarta el primer hijo que siempre es el contenido del propio nodo
			
			var oNode = eDoc.childNodes[x];

			if (typeof oNode.tagName != "undefined") {

				sNomArc = oNode.getAttribute('name');
				sTipArc = oNode.getAttribute('type');
				sTamArc = oNode.getAttribute('size');
				sFecArc = oNode.getAttribute('date').substr(0,10);
				sHorArc = oNode.getAttribute('date').substr(11,5);
						
				if (sTipArc == "dir") {
					if ((sNomArc != ".") && (sNomArc != "..")) {
						oDir.directorios[oDir.directorios.length] = _createFileTree(oNode, sId+x, sPath);
					} else {
//						oDir.directorios[oDir.directorios.length] = new Directorio(sId+x, sNomArc, sTipArc, sTamArc, sFecArc, sHorArc, sPath + "/" + sNomArc);						
					}
				} else {
					oDir.archivos[oDir.archivos.length] = new Archivo( sNomArc, sTipArc, sTamArc, sFecArc, sHorArc);
				}
			
			}
			
		}
				
	}
	
	return oDir;
}


function _getDir(sPath) {
	
	// si el path reibido concuerda con el path del directorio actual, se devuelve el directorio actual
	if (this.path == sPath) {
		return this;
	} else {
		if (this.directorios!=null) {
			// en caso contrario se recorrerán todos los directorios debajo de él
			for (var x=0; x<this.directorios.length; x++) {
				var oDir = this.directorios[x].getDir(sPath);
				if (oDir!=null) {return oDir;}
			}
		}
		return null;
	}
}



//##########################################################################################################
// POP UP (Div emergentes para mostrar contenidos)
//##########################################################################################################


function _CreatePopUp(iWidth,iLeft,iTop) {

	if (!document.getElementById("divPopUpOuter")) {
		var oDiv = document.createElement("DIV");
		oDiv.id = "divPopUpOuter";
		oDiv.className = "PopUpOuter" + iWidth;
		document.body.appendChild(oDiv);
	} else {
		var oDiv = document.getElementById("divPopUpOuter");
	}

	var sHTML = "<DIV id='divPopUpHeader' class='PopUpHeader"+iWidth+"'>"
		+ "<TABLE><TR><TD id='tdPopUpHeader' style='width:100%'></TD>"
		+ "<TD><img src='img/icons/close.png' onclick='_HidePopUp()' class='hover' /></TD></TR></TABLE>"
		+ "</DIV>"
		+ "<DIV id='divPopUp' class='PopUp"+iWidth+"'></DIV>"
		+ "<DIV id='divPopUpFooter' class='PopUpFooter"+iWidth+"'></DIV>";
		
	oDiv.innerHTML = sHTML;	

	if (iLeft+iWidth>_GetClientWidth()) {iLeft = _GetClientWidth()-iWidth;}
	
	oDiv.style.left = iLeft + 'px';
	oDiv.style.top = iTop + 'px';

	oDiv.style.display = "block";
	
/*	iOffsetHeight = document.getElementById("divPopUpOuter").offsetHeight;
	if (iTop+iOffsetHeight>_GetClientHeight()) {
		document.getElementById("divPopUpOuter").style.top = (_GetClientHeight()-iOffsetHeight) + "px";
	}	
*/

	
}


function _ShowPopUp(sTitle,sHtml,iWidth,iLeft,iTop) {	
//alert(iLeft+" "+iTop);

	if (!document.getElementById("divPopUpOuter") || document.getElementById("divPopUpOuter").style.display=="none") {
		_CreatePopUp(iWidth,iLeft,iTop);
	}
	
	document.getElementById("tdPopUpHeader").innerHTML = sTitle;
	document.getElementById("divPopUp").innerHTML = sHtml;
	
}

function _HidePopUp() {
	if (document.getElementById("divPopUpOuter")) {
		document.getElementById("divPopUpOuter").style.display="none";
	}
}



//##########################################################################################################
// SEND MAIL
//##########################################################################################################

// ejemplo de invocacion utilizando un vector, también se podria pasar solo la lista de telefonos
function _MessageMail() {
//a();
	 sText = "El alumno [PRM1] obtuvo un [PRM2] en la materia [PRM3]";
	 aReceptors = new Array();
	 
	 aReceptors[0] = new Array ("ghbduy@msn.com","Juan","8","Historia");
	 aReceptors[1] = new Array ("ghbduy@hotmail.com","Luis","7","Matematica"); 

	_SendMail(aReceptors,"info@ecollege.com.uy","prueba",sText);
}

function _SendMail(aReceptors, sSender, sSubject, sPlainText, sType, aAttachments, sReqFunc) { 


	if ((typeof sSubject=='undefined') || (sSubject==null)) {sSubject="";}
	if ((typeof sPlainText=='undefined') || (sPlainText==null)) {sPlainText="";}
	if ((typeof sType=='undefined') || (sType==null)) {sType="1";} // 1 se enviara en formato html

	var aPrm = new Array();

	// si se ha recibido un vector de parametros
	if (aReceptors.length>0) {	
			 
		// si se trata de arrays anidados						 
		if (typeof aReceptors[0]=='object') {		
			// se determina la cantidad de paramatros para inicializar el vector de parámetros
			for (var y=0; y<aReceptors[0].length; y++){
				aPrm[y] = "";
			}
	
			for (var x=0; x<aReceptors.length; x++){
				for (var y=0; y<aReceptors[x].length; y++){
					aPrm[y]+= aReceptors[x][y] + "|";
				}
			}
		} else { // si es un array simple con la lista de mails
			aPrm[0] = "";
			for (var x=0; x<aReceptors.length; x++) {
				aPrm[0]+= aReceptors[x] + "|";
			}
		}		
	}

	// se elimina el último pipe de cada uno de los parámetros
	for (var x=0; x<aPrm.length; x++){
		aPrm[x] = aPrm[x].substr(0,aPrm[x].length-1);
	}

	var sAttachments = "";
	if (aAttachments) {
		for (var x=0; x<aAttachments.length; x++){
			var sFile = aAttachments[x][0]+":"+aAttachments[x][1];
			sAttachments+=	sAttachments=="" ? sFile : "#"+sFile;
		}
	}
		
	xmlHttp = GetXmlHttpObject();
	if (xmlHttp!==null) {

		var url = "../common/sendMail.php";
		var prm = "snd=" + sSender
				+ "&sub="+ encodeURIComponent(sSubject)
				+ "&txt="+ encodeURIComponent(sPlainText)
				+ "&typ="+ sType
				+ "&att="+ encodeURIComponent(sAttachments)
				for (var x=0; x<aPrm.length; x++){
					prm+= "&prm"+x+"="+encodeURIComponent(aPrm[x]);
				}
		
//a(url+"?"+prm);

		xmlHttp.onreadystatechange=function (){
			if (xmlHttp.readyState == 4) {
				document.body.style.cursor='auto';		
				if (sReqFunc) {
					// quita el salto de linea al final de la linea de respuesta
					sReq = xmlHttp.responseText.replace(/[\n\r\t]/g,"");				
					eval(sReqFunc+"('"+sReq+"')");
				}
					
			}
		}

		xmlHttp.open("POST",url,true);
		xmlHttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
		xmlHttp.send(prm);
			
	} else {
		alert ("El navegador no soporta solicitudes HTTP!");
	} 

}




// ejemplo de invocacion utilizando un vector, también se podria pasar solo la lista de telefonos
function _MessageSMS() {

 sText = "El alumno PRM1 obtuvo un PRM2 en la materia PRM3";
 aRecipient = new Array();
 sSQL = "";
 
 aRecipient[0] = new Array ("099973653","Juan","8","Historia");
 aRecipient[1] = new Array ("099631144","Luis","7","Matematica"); 

_SendMessage(sText, aRecipient, sSQL);
}


//##########################################################################################################
// SEND SMS
//##########################################################################################################

function _SendSMS(sText, aRecipient, sSQL, sRequestFunc, sNextFunc) {

	if ((typeof sSQL=='undefined') || (sSQL==null)) {sSQL="";}

	var aPrm = new Array();

	// si se ha recibido un vector de parametros
	if (aRecipient.length>0) {	
			 
		// si se trata de arrays anidados						 
		if (typeof aRecipient[0]=='object') {		
			// se determina la cantidad de paramatros para inicializar el vector de parámetros
			for (var y=0; y<aRecipient[0].length; y++){
				aPrm[y] = "";
			}
	
			for (var x=0; x<aRecipient.length; x++){
				for (var y=0; y<aRecipient[x].length; y++){
					aPrm[y]+= aRecipient[x][y] + "|";
				}
			}
		} else { // si es un array simple con la lista de celulares
			aPrm[0] = "";
			for (var x=0; x<aRecipient.length; x++) {
				aPrm[0]+= aRecipient[x] + "|";
			}
		}		
	}

	// se elimina el último pipe de cada uno de los parámetros
	for (var x=0; x<aPrm.length; x++){
		aPrm[x] = aPrm[x].substr(0,aPrm[x].length-1);
	}

	xmlHttp = GetXmlHttpObject();

	if (xmlHttp != null) {
		var url = "/eCollege/createSMSFile.php";
		var prm = "sql="+sSQL
				+"&txt="+sText;
				for (var x=0; x<aPrm.length; x++){
					prm+= "&prm"+x+"="+aPrm[x];
				}
		
//a(url+"?"+prm);

		xmlHttp.onreadystatechange=function (){
			if (xmlHttp.readyState == 4) {
				document.body.style.cursor='auto';		
				if (sRequestFunc) {
					// quita el salto de linea al final de la linea de respuesta
					sReq = xmlHttp.responseText.replace(/[\n\r\t]/g,"");				
					eval(sRequestFunc+"(sReq)");
				} else if (sNextFunc) {
					eval(sNextFunc);
				}
					
			}
		}

		xmlHttp.open("POST",url,true);
		xmlHttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
		xmlHttp.send(prm);
	} else {
		alert ("El navegador no soporta solicitudes HTTP!");
	} 

}


function _SendMessageRequest() { 
	document.getElementById("tdFooter").innerHTML=xmlHttp.responseText;
}






/*###########################################################################################################################
  INSERCION DE BOTONES
############################################################################################################################*/

function _AddButtons(sButtonContainer) {
	
	var oTD = document.getElementById(sButtonContainer);

	for( var i = 1; i < arguments.length; i++ ) { // los botones pueden ser recibidos en varios parámetros {nom#fun},{nom#fun}..
	
		var aButton = arguments[i].split("#");
		for( var x = 0; x < aButton.length; x+=2 ) { // o varios botones en el mismo parámetro {nom#fun#nom#fun...}
//a("valor "+aButton[0]);

			var oElement = document.createElement("input");   
			oElement.setAttribute("type", "Button");   
			oElement.setAttribute("value", aButton[x]);   
			oElement.setAttribute("name", "btn"+aButton[x]);   
			oElement.setAttribute("id", "btn"+aButton[x]);   
			
			if (gRolUsr == "DEM") {
				if ((aButton[x] == "Guardar") || (aButton[x] == "Eliminar") || (aButton[x] == "Enviar") || (aButton[x] == "Borrar Campos") || (aButton[x] == "Datos Relacionados")) {		
					oElement.setAttribute("disabled", "true");
				}
			}

			oElement.onclick = new Function(aButton[x+1]);
			oTD.appendChild(oElement);
		}
	}
}

function _AddImgButton(sButtonContainer,aButtons) {

	var oTD = document.getElementById(sButtonContainer);

	// aButtons debe ser un array de botones, donde cada elemento debe ser {buttonId#buttonOnclick#buttonImg#buttonOnMouseOver}
	for( var i=0; i<aButtons.length; i++ ) { 
	
		var aBtn = aButtons[i].split("#");
		if (aBtn[0]) {sId=aBtn[0]} else {sId=""};
		if (aBtn[2]) {sImg=aBtn[2]} else {sImg=""};
		
		if (sImg!="") {
			var oElement=document.createElement("img");
			oElement.setAttribute("name", "btn"+sId);   
			oElement.setAttribute("id", "btn"+sId);   
			oElement.setAttribute('src', sImg);
			if ((aBtn[3]) && (aBtn[3]!="")) {
				oElement.onmouseover = new Function("this.src='"+aBtn[3]+"'; this.style.cursor='pointer'");
				oElement.onmouseout = new Function("this.src='"+sImg+"'");
			}
		} else {		
			var oElement = document.createElement("input");   
			oElement.setAttribute("name", "btn"+sId);   
			oElement.setAttribute("id", "btn"+sId);   
			oElement.setAttribute("type", "Button");   
			oElement.setAttribute("value", sId);   
		}
//oElement.setAttribute("disabled", "true");   
	//	alert(aButton[1]);
		if ((aBtn[1]) && (aBtn[1]!="")) {oElement.onclick = new Function(aBtn[1])};
		
		oTD.appendChild(oElement);
		
	}

}



function _CreateButton(sTarFrame,sButtId,sButtDescr,sButtAction,sButtClass,sButtImg,sButtImgOver,bOverWrite) {
	
	// si no se recibe id para el botón se utilizará la descripción agregandole el prefijo btn.
	if ((typeof sButtId=='undefined') || (sButtId==null)) {sButtId='btn'+sButtDescr;}

	if (typeof sButtImg=='undefined') { sButtImg=null;}
	if (typeof sButtImgOver=='undefined') { sButtImgOver=null;}
	if (typeof sButtClass=='undefined') { sButtClass=null;}
	if (typeof sButtAction=='undefined') { sButtAction=null;}
	if (typeof bOverWrite=='undefined') { bOverWrite=null;}


	if (sButtImg) {
		var sColumna = document.createElement('td');
		sColumna.setAttribute('style', 'width:50px;');

		var oElement=document.createElement("img");
		sColumna.appendChild(oElement);
		
		oElement.setAttribute("name", sButtId);   
		oElement.setAttribute("id", sButtId);   
		oElement.setAttribute('src', sButtImg);
		oElement.setAttribute("title", sButtDescr); 
		oElement.onmouseover = new Function("this.style.cursor='pointer'");
		document.getElementById(sTarFrame).appendChild(sColumna);

		
		if (sButtImgOver) {			
			oElement.onmouseover = new Function("this.src='"+sButtImgOver+"'");
			oElement.onmouseout = new Function("this.src='"+sButtImg+"'");
		}
	} else {
		var oElement = document.createElement("input");   
		oElement.setAttribute("name", sButtId);   
		oElement.setAttribute("id", sButtId);   
		oElement.setAttribute("type", "Button");   
		oElement.setAttribute("value", sButtDescr); 
		document.getElementById(sTarFrame).appendChild(oElement);

	}
		
	if (sButtAction) {
		oElement.onclick = new Function(sButtAction);
	}

	if (bOverWrite) {
		document.getElementById(sTarFrame).innerHTML = "";
	}
}






//##########################################################################################################

function _GetElementValue(oElement) {


	sIsNumeric = "0";
	if (oElement.type == 'text'){
		if (oElement.alt.substring(4)=='date') {
			if (oElement.value!="") {
				sValue = oElement.value.substr(6,4) +"-"+ oElement.value.substr(3,2) +"-"+ oElement.value.substr(0,2);			
			} else {
				sValue = "";
			}
		} else {
			sValue = _RemoveInvalidCharacters(oElement.value);
			sIsNumeric = oElement.alt.substr(0,1);
		}
	} else if (oElement.type == 'textarea') {
		sValue = _RemoveInvalidCharacters(oElement.value); // quita caracteres invalidos
	} else if (oElement.type == 'select-one'){
		sValue = oElement.value;
	} else if (oElement.type == 'checkbox'){
		if (oElement.checked) {	sValue = 1; } else {sValue = 0; }
		sIsNumeric = "1";
	} else if (oElement.type == 'password'){
		sValue = oElement.value;
	} else if (oElement.type == 'hidden'){
		sValue = oElement.value;
	}

	if (sValue!="") {
		if (sIsNumeric=='0') {// los valores de los campos que no son numéricos deben ir entre comillas
			sValue = "'" + sValue + "'";
		}
	} else {
		sValue = "null";
	}
//alert("valor: >" + sValue + "<")	
	return sValue;
}

function _ClearContainers()
{
			
	// Redefinición del área de trabajo ---------------------------------------------------------
	var eTable = document.getElementById("tblMain");  

   	var aRows = eTable.getElementsByTagName("tr");   
	for(i = 0; i < aRows.length; ){           
		eTable.deleteRow(i);
	}
}


function _DefineLayout(sCellsLayout,sTargetFrame) {

	if (typeof sTargetFrame!="undefined") {
		document.getElementById(sTargetFrame).innerHTML="";
		var oTable = document.createElement("table");
		oTable.id = "tblMain";
		document.getElementById(sTargetFrame).appendChild(oTable);
	} else {
		_ClearContainers();
		var oTable = document.getElementById("tblMain");  		
	}
		
	var aCells = sCellsLayout.split("|");
	var iRow = 0;
	var iCol = 0;
	for (var x=0; x<aCells.length; x++) {
		if (aCells[x].substr(0,2)=="TR") {
			oRow = oTable.insertRow(iRow++);
			iCol=0;
		} else { 
			if (aCells[x].substr(0,2)=="TD") {
				
				var oCell = oRow.insertCell(iCol++);
				var aProperties = aCells[x].split(":");
				for (var y=1; y<aProperties.length; y++) {
					aPropValue = aProperties[y].split("=");
					var sInnerHtml = "<div id='div"+aPropValue[1]+"' class='materias'></div>";
					if (aPropValue[0].toUpperCase()=="ID") {oCell.id = aPropValue[1]; oCell.innerHTML = sInnerHtml;}
					if (aPropValue[0].toUpperCase()=="STYLE") {oCell.style = aPropValue[1];}
					if (aPropValue[0].toUpperCase()=="WIDTH") {oCell.style.width = aPropValue[1];}
					if (aPropValue[0].toUpperCase()=="HEIGHT") {oCell.style.height = aPropValue[1];}
					if (aPropValue[0].toUpperCase()=="COLSPAN") {oCell.colSpan = aPropValue[1];}
					if (aPropValue[0].toUpperCase()=="ROWSPAN") {oCell.rowSpan = aPropValue[1];}
					if (aPropValue[0].toUpperCase()=="ALIGN") {oCell.style.textAlign = aPropValue[1];}
					if (aPropValue[0].toUpperCase()=="VALIGN") {oCell.style.verticalAlign = aPropValue[1];}
					if (aPropValue[0].toUpperCase()=="BACKGROUNDIMAGE") {oCell.style.backgroundImage = "url("+aPropValue[1]+")";}
					if (aPropValue[0].toUpperCase()=="BACKGROUNDREPEAT") {oCell.style.backgroundRepeat = aPropValue[1];}

				}				
			}
		}
	}

	
}

/*

function _RedefineContainersLayoutA(aWidthHeight) {

	var eTable = document.getElementById("tblMain");   
	eTable.style.background = "url(img/backMain.jpg)"; 

	eTR = eTable.insertRow(0);
	eTD = eTR.insertCell(0);
	eTD.id = "tdMainLeft";
	eTD.style.verticalAlign = "top";
	if (aWidthHeight) {
		if (aWidthHeight[0][0]) {eTD.style.width = aWidthHeight[0][0];}
		if (aWidthHeight[0][1]) {eTD.style.height = aWidthHeight[0][1];}
	}

	eTR = eTable.insertRow(1);
	eTD = eTR.insertCell(0)
	eTD.id = "tdMainMiddle";
	eTD.style.verticalAlign = "top";
	if (aWidthHeight) {
		if (aWidthHeight[1][0]) {eTD.style.width = aWidthHeight[1][0];}
		if (aWidthHeight[1][1]) {eTD.style.height = aWidthHeight[1][1];}
	}
	
	eTR = eTable.insertRow(2);
	eTD = eTR.insertCell(0)
	eTD.id = "tdMainBottom";
	eTD.style.verticalAlign = "top";
	if (aWidthHeight) {
		if (aWidthHeight[2][0]) {eTD.style.width = aWidthHeight[2][0];}
		if (aWidthHeight[2][1]) {eTD.style.height = aWidthHeight[2][1];}
	}

}

function _RedefineContainersLayoutB() {

	var eTable = document.getElementById("tblMain");   
	eTable.style.background = "url(img/backMain.jpg)"; 

	eTR = eTable.insertRow(0);
	eTD = eTR.insertCell(0)
	eTD.id = "tdMainLeft";
	eTD.style.verticalAlign = "top";

	eTD = eTR.insertCell(1)
	eTD.id = "tdMainRight";
	eTD.style.verticalAlign = "top";

	eTR = eTable.insertRow(1);
	eTD = eTR.insertCell(0)
	eTD.id = "tdMainMiddle";
	eTD.style.verticalAlign = "top";
	eTD.colSpan = "2";

	eTR = eTable.insertRow(2);
	eTD = eTR.insertCell(0)
	eTD.id = "tdMainBottom";
	eTD.style.verticalAlign = "top";
	eTD.colSpan = "2";
	

}

function _RedefineContainersLayoutC() {

	var eTable = document.getElementById("tblMain");   
	eTable.style.background = "url(img/backMain.jpg)"; 

	eTR = eTable.insertRow(0);
	eTD = eTR.insertCell(0)
	eTD.id = "tdMainLeft";
	eTD.colSpan = "2";
	eTD.style.verticalAlign = "top";

	eTR = eTable.insertRow(1);
	eTD = eTR.insertCell(0)
	eTD.id = "tdMainBottom";
	eTD.style.verticalAlign = "top";
	
	eTD = eTR.insertCell(1)
	eTD.id = "tdMainRight";
	eTD.style.verticalAlign = "top";

//	eTR = eTable.insertRow(2);
//	eTR.height = "100%";
//	eTD = eTR.insertCell(0)

}


function _RedefineContainersLayoutD(aWidthHeight) {

	var eTable = document.getElementById("tblMain");   
	eTable.style.background = "url(img/backMain.jpg)"; 

	eTR = eTable.insertRow(0);
	eTD = eTR.insertCell(0)
	eTD.id = "tdMainLeft";
	eTD.rowSpan = "3";
	eTD.style.verticalAlign = "top";
	if (aWidthHeight) {
		if (aWidthHeight[0][0]) {eTD.style.width = aWidthHeight[0][0];}
		if (aWidthHeight[0][1]) {eTD.style.height = aWidthHeight[0][1];}
	}
	eTD = eTR.insertCell(1)
	eTD.id = "tdMainRight";
	eTD.colSpan = "2";
	eTD.style.verticalAlign = "top";
	if (aWidthHeight) {
		if (aWidthHeight[1][0]) {eTD.style.width = aWidthHeight[1][0];}
		if (aWidthHeight[1][1]) {eTD.style.height = aWidthHeight[1][1];}
	}
	
	eTR = eTable.insertRow(1);
	eTD = eTR.insertCell(0)
	eTD.id = "tdMainBottomL";
	if (aWidthHeight) {
		if (aWidthHeight[2][0]) {eTD.style.width = aWidthHeight[2][0];}
		if (aWidthHeight[2][1]) {eTD.style.height = aWidthHeight[2][1];}
	}
	eTD.style.verticalAlign = "top";
	eTD = eTR.insertCell(1)
	eTD.id = "tdMainBottomR";
	eTD.style.verticalAlign = "top";
	if (aWidthHeight) {
		if (aWidthHeight[3][0]) {eTD.style.width = aWidthHeight[3][0];}
		if (aWidthHeight[3][1]) {eTD.style.height = aWidthHeight[3][1];}
	}
	eTR = eTable.insertRow(2);
	eTD = eTR.insertCell(0)
	eTD.id = "tdMainBottom";
	eTD.colSpan = "2";
	eTD.style.verticalAlign = "top";
	if (aWidthHeight) {
		if (aWidthHeight[4][0]) {eTD.style.width = aWidthHeight[4][0];}
		if (aWidthHeight[4][1]) {eTD.style.height = aWidthHeight[4][1];}
	}
}


function _RedefineContainersLayoutE(aWidthHeight) {

	var eTable = document.getElementById("tblMain");   
	eTable.style.background = "url(img/backMain.jpg)"; 

	eTR = eTable.insertRow(0);
	eTD = eTR.insertCell(0)
	eTD.id = "tdMainLeft";
	eTD.style.verticalAlign = "top";
	if (aWidthHeight) {
		if (aWidthHeight[0][0]) {eTD.style.width = aWidthHeight[0][0];}
		if (aWidthHeight[0][1]) {eTD.style.height = aWidthHeight[0][1];}
	}

	eTD = eTR.insertCell(1)
	eTD.id = "tdMainRight";
	eTD.rowSpan = "2";
	eTD.style.verticalAlign = "top";
	if (aWidthHeight) {
		if (aWidthHeight[1][0]) {eTD.style.width = aWidthHeight[1][0];}
		if (aWidthHeight[1][1]) {eTD.style.height = aWidthHeight[1][1];}
	}

	eTR = eTable.insertRow(1);
	eTD = eTR.insertCell(0)
	eTD.id = "tdMainBottom";
	eTD.style.verticalAlign = "top";
	if (aWidthHeight) {
		if (aWidthHeight[2][0]) {eTD.style.width = aWidthHeight[2][0];}
		if (aWidthHeight[2][1]) {eTD.style.height = aWidthHeight[2][1];}
	}
	
}

function _RedefineContainersLayoutF(aWidthHeight) {

	var eTable = document.getElementById("tblMain");   
	eTable.style.background = "url(img/backMain.jpg)"; 

	eTR = eTable.insertRow(0);
	eTD = eTR.insertCell(0)
	eTD.id = "tdMainLeft";
	if (aWidthHeight[0][0]) {eTD.style.width = aWidthHeight[0][0];}
	if (aWidthHeight[0][1]) {eTD.style.height = aWidthHeight[0][1];}

	eTD = eTR.insertCell(1)
	eTD.id = "tdMainRight";
	if (aWidthHeight[1][0]) {eTD.style.width = aWidthHeight[1][0];}
	if (aWidthHeight[1][1]) {eTD.style.height = aWidthHeight[1][1];}

}

function _RedefineContainersLayoutG() {

	var eTable = document.getElementById("tblMain");   
	eTable.style.background = "url(img/backMain.jpg)"; 

	eTR = eTable.insertRow(0);
	eTD = eTR.insertCell(0)
	eTD.id = "tdMainLeft";
	eTD.style.verticalAlign = "top";

	eTD = eTR.insertCell(1)
	eTD.id = "tdMainRight";
	eTD.style.verticalAlign = "top";

	eTR = eTable.insertRow(1);
	eTD = eTR.insertCell(0)
	eTD.id = "tdMainMiddle";
	eTD.style.verticalAlign = "top";
	eTD.colSpan = "2";

	eTR = eTable.insertRow(2);
	eTD = eTR.insertCell(0)
	eTD.id = "tdMainBottom";
	eTD.style.verticalAlign = "top";
	eTD.colSpan = "2";

}

*/


function DivInfoHide() {
	document.getElementById("divInfo").style.display="none";
}


function _DisableElements() {
	for( var i = 0; i < arguments.length; i++ ) {
		document.getElementById(arguments[i]).length = 0; // elimina todas las opcines existentes
		document.getElementById(arguments[i]).disabled = true;
	}
}

function _EnableElements() {
	for( var i = 0; i < arguments.length; i++ ) {
			document.getElementById(arguments[i]).disabled = false;
	}
}


function _AppendElement(sType,sFieldName,sFieldDescr,sTdDescrProp,sTdFieldProp,sControlProp) {

	if (!sTdDescrProp) {sTdDescrProp = "";}
	if (!sTdFieldProp) {sTdFieldProp = "";}
	if (!sControlProp) {sControlProp = "";}

	if (sFieldDescr) {
		var sHTML = "<TD ID='"+sFieldName+"_Descr' class='AppendElementDescr' "+sTdDescrProp+">"+sFieldDescr+"</TD>";
	} else {
		var sHTML = "";
	}
	sHTML = sHTML + "<TD ID='"+sFieldName+"_Field' class='AppendElementField' "+sTdFieldProp+">"; 
	if (sType == "SELECT") {
		sHTML = sHTML + "<SELECT ID='"+sFieldName+"' NAME='"+sFieldName+"' size='1' "+sControlProp+">";
//		sHTML = sHTML + "<OPTION value=''></OPTION>";
		sHTML = sHTML +"</SELECT>";
	} else if (sType == "TEXT") {
		sHTML = sHTML + "<INPUT TYPE='TEXT' ID='"+sFieldName+"' NAME='"+sFieldName+"' SIZE='10' VALUE='' "+sControlProp+" />";
	} else if (sType == "RADIO") {
		sHTML = sHTML + "<INPUT TYPE='RADIO' ID='Radio' NAME='Radio' VALUE='"+sFieldName+"' "+sControlProp+" />";
	} else if (sType == "CHECKBOX") {
		sHTML = sHTML + "<INPUT TYPE='CHECKBOX' ID='"+sFieldName+"' NAME='"+sFieldName+"' VALUE='"+sFieldName+"' "+sControlProp+" />";
	}
	sHTML = sHTML + "<SPAN ID="+sFieldName+"_Help' class='AppendElementHelp'></SPAN>"; 
	sHTML = sHTML + "</TD>"; 

	return sHTML;

}




function _AddFormControl(sType,sFieldName,sFieldDescr,sTdDescrProp,sTdFieldProp,sControlProp,sButtFunc,sClass) {

	if (!sTdDescrProp) {sTdDescrProp = "";}
	if (!sTdFieldProp) {sTdFieldProp = "";}
	if (!sControlProp) {sControlProp = "";}

	if ((typeof sClass=='undefined') || (sClass==null)) {sClass = "AddFormControl";}

	var sHTML = "";

	if (sFieldDescr) {
		sHTML+= "<TD ID='"+sFieldName+"_Descr' class='"+sClass+"_Descr' "+sTdDescrProp+">"+sFieldDescr+"</TD>";
	}
	
	sHTML += "<TD ID='"+sFieldName+"_Field' class='"+sClass+"_Field' "+sTdFieldProp+" >"; 
	
	if (sType == "SELECT") {
		sHTML += "<SELECT ID='"+sFieldName+"' NAME='"+sFieldName+"' size='1' "+sControlProp+">";
//		sHTML = sHTML + "<OPTION value=''></OPTION>";
		sHTML += "</SELECT>";
	} else if (sType == "TEXT") {
		sHTML += "<INPUT TYPE='TEXT' ID='"+sFieldName+"' NAME='"+sFieldName+"' SIZE='10' VALUE='' "+sControlProp+" />";
	} else if (sType == "RADIO") {
		sHTML += "<INPUT TYPE='RADIO' ID='Radio' NAME='Radio' VALUE='"+sFieldName+"' "+sControlProp+" />";
	} else if (sType == "CHECKBOX") {
		sHTML += "<INPUT TYPE='CHECKBOX' ID='"+sFieldName+"' NAME='"+sFieldName+"' VALUE='"+sFieldName+"' "+sControlProp+" />";
	}	
	
	if ((typeof sButtFunc!='undefined') && (sButtFunc!=null)) {
		sHTML+= "<img src='img/icons/search.png' "+sButtFunc+" />";
	}

	sHTML += "<SPAN ID='"+sFieldName+"_Text' class='"+sClass+"_Text'></SPAN>"; 
	sHTML += "<SPAN ID='"+sFieldName+"_Help' class='"+sClass+"_Help'></SPAN>"; 
	
	
	sHTML += "</TD>"; 

	return sHTML;

}


function _LoadComboBox(sFields,sTables,sClause,sElement,sDefault,bFullText,bReset,aExtraOptions) {

	if (bFullText==null) {bFullText=1;}
	if (bReset==null) {bReset=1;}
	if (!sClause) {sClause = "";}

	if (bReset) {
		document.getElementById(sElement).length = 0; // elimina todas las opciones existentes
	}

	// aExtraOptions debe ser un vector con elementos adicionales que se quiere agregar al comienzo del combobox
	// cada elemento debe tener dos parametros separados por pipe, ej: "descripcion|codigo"
	if (aExtraOptions) {
		for (var x=0; x<aExtraOptions.length; x++) {
			aExtraOpt = aExtraOptions[x].split("|");
			
			if ((bFullText) && (aExtraOpt[0]!="")) {
				_AddOption(sElement,"["+aExtraOpt[0]+"] "+aExtraOpt[1], aExtraOpt[0]);
			} else {
				_AddOption(sElement,aExtraOpt[1], aExtraOpt[0]);
			}					
		}
		if (sDefault) { // si se provee una opcion por defecto es seleccionada
			document.getElementById(sElement).value = sDefault;
			document.getElementById(sElement).onchange();
		}
		
	}

	if ((sFields) && (sFields!="")) {

		var xmlHttp = GetXmlHttpObject();
		if (xmlHttp!==null) {
			
			document.getElementById(sElement).disabled = true;
			
			var url="../common/getRecordsXML.php";
			url=url+"?usr=";
			url=url+"&pwd=";
			url=url+"&fld="+sFields;		
			url=url+"&tbl="+sTables;
			url=url+"&cla="+sClause;
	//a(url);
			xmlHttp.onreadystatechange=function() {
				if (xmlHttp.readyState == 4) {
					document.body.style.cursor='auto';
					_LoadComboBoxRequest(xmlHttp,sElement,sDefault,bFullText,bReset,aExtraOptions);
				}
			};
			document.body.style.cursor='wait';
			xmlHttp.open("GET",url,true);
			xmlHttp.send(null);
		} else {
			alert ("El navegador no soporta solicitudes HTTP!");
		} 
		
	} else {
		document.getElementById(sElement).disabled = false;		
	}
}

function _LoadComboBoxRequest(xmlHttp,sElement,sDefault,bFullText,bReset,aExtraOptions) {

	var xmlDoc=xmlHttp.responseXML;
	eDoc = xmlDoc.getElementsByTagName("record");
	if (eDoc) {

		_EnableElements(sElement); // Habilita el control para que pueda ser selecionado
		
		for (var x=0; x<eDoc.length; x++) {

			var sCod = eDoc[x].childNodes[0].childNodes[0].nodeValue; // Código 

			var sDes = "";
			if (eDoc[x].childNodes.length > 1) {
				for (var y=1; y<eDoc[x].childNodes.length; y++) {
					sDes = sDes + " " + eDoc[x].childNodes[y].childNodes[0].nodeValue; // Descripción
				}
			} else {
				sDes = sCod;
			}
			if (bFullText) {
				_AddOption(sElement,"["+sCod+"] "+sDes,sCod);
			} else {
				_AddOption(sElement,sDes,sCod);
			}
		}
		
		document.getElementById(sElement).disabled = false;
		
		if (sDefault) { // si se provee una opcion por defecto es seleccionada
			document.getElementById(sElement).value = sDefault;
			document.getElementById(sElement).onchange();
		}
	}
	
	
}


function _AddOption(sElement,sText,sValue,bSelected) {
	
	if (typeof bSelected=='undefined') {bSelected=false;}

	var opt = document.createElement("option");
    document.getElementById(sElement).options.add(opt);
    opt.text = sText;
    opt.value = sValue;
    opt.selected = bSelected;

}

function _EraseComboBox(sElement) {
	document.getElementById(sElement).length = 0; // elimina todas las opciones existentes
}


function _LimitTextArea(oText,iLimit) {

	var sText = oText.value;
	if (sText.length>iLimit) {
		sText = sText.substr(0,iLimit);
		oText.value = sText;
	}
	return sText.length;
}



//##########################################################################################################
// GET XML FILE (lee la estructura de un XML y la almacena en el array global de XML)
//##########################################################################################################




function _getXmlFile(sXmlFile,sXmlDir,sReqFunc) {

	// si el XML no ha sido leido previamente se procederá a su lectura desde el servidor
	if (typeof gXmlFiles[sXmlFile]=='undefined') {
		var xmlDoc = GetXmlHttpObject(sXmlDir+sXmlFile+".xml?nocache=" + new Date().getTime()); 
//a(sXmlDir+sXmlFile+".xml");
		if (xmlDoc!=null) {
			document.body.style.cursor='wait';
			if (strBrowser=="FF") {
				xmlDoc.onload = function () {
					gXmlFiles[sXmlFile] = xmlDoc.documentElement;
					document.body.style.cursor='auto';
					if (sReqFunc) { eval(sReqFunc+"(sXmlFile)"); }
				}
			} else { // strBroser == "IE"

				gXmlFiles[sXmlFile] = xmlDoc.documentElement;
//a("xmlDoc.documentElement:"+xmlDoc.documentElement);			
//a("tagName:"+xmlDoc.documentElement.tagName);			
				document.body.style.cursor='auto';
				if (sReqFunc) { eval(sReqFunc+"(sXmlFile)"); }
			}
		} else {
			if (sReqFunc) { eval(sReqFunc+"(null)"); }
		}
	} else {	
		if (sReqFunc) { eval(sReqFunc+"(sXmlFile)"); }
	}

}


//#####################################################################################################


function GetXmlHttpObject(strXMLFile) { 

	var objXMLHttp=null;
	if (strXMLFile != null) {

		if (window.ActiveXObject) {
			objXMLHttp = new ActiveXObject("Microsoft.XMLDOM");
			strBrowser = 'IE';
			objXMLHttp.async="false";
			objXMLHttp.load(strXMLFile);
			
		} else if (window.XMLHttpRequest){
			try { //Firefox, Mozilla, Opera, etc.
				objXMLHttp = document.implementation.createDocument("","",null);
				strBrowser = 'FF';	
				objXMLHttp.async="false";
				objXMLHttp.load(strXMLFile);
			}
 			catch(e) {
				try { //Google Chrome
					var xmlhttp = new window.XMLHttpRequest();
					xmlhttp.open("GET",strXMLFile,false);
					xmlhttp.send(null);
					objXMLHttp = xmlhttp.responseXML;  					
					strBrowser = 'Chrome';	
				}
				catch(e) {
				   alert(e.message);
  				}
			}
		}

	} else {

		if (window.ActiveXObject) {
			objXMLHttp = new ActiveXObject("Microsoft.XMLHTTP");
			strBrowser = 'IE';
		} else if (window.XMLHttpRequest){
			objXMLHttp = new XMLHttpRequest();
			strBrowser = 'FF';	 
		}
	}
	return objXMLHttp;
}


function _OpenWindow (sAction,sTarget,aKeyValues,sProp,sMethod) {
		
	if (typeof sMethod=='undefined') {var sMethod='GET';}
		
	var oWin = window.open('',sTarget,sProp);
	var myForm = document.createElement("form");
	myForm.method = sMethod ;
	myForm.action = sAction ;
	myForm.target = sTarget;
	//  myForm.onsubmit = myOpenWindow(); 
	for (var k in aKeyValues) {
		var myInput = document.createElement("input");
		myInput.setAttribute("name", k) ;
		myInput.setAttribute("value", aKeyValues[k]);
		myForm.appendChild(myInput) ;
	}
	document.body.appendChild(myForm) ;
	myForm.submit() ;
	document.body.removeChild(myForm) ;
	
	oWin.focus();
	
}


function _QuerySplit(sSQL){
	
	sSQL = sSQL.replace("SELECT", ""); // Quita la clausula SELECT de la consulta
	sSQL = sSQL.replace("FROM", "|"); // Remplaza la clausula FROM por "|" de la consulta
	sSQL = sSQL.replace("WHERE", "|WHERE"); // Remplaza la clausula WHERE por "|WHERE" de la consulta
	
	// Ahora se cuenta con las tres secciones de la consulta separada por "|"
	var aQry = sSQL.split("|");
	
	for (x=0; x < aQry.length; x++) {
		aQry[x] = aQry[x].trim();
	}

	return aQry;

}


function _StatusBar(sMessage) {

	window.status = sMessage;
}


//#####################################################################################################


function a(sText,bReset) {
	
	if (document.getElementById("divMensajeLog")) {
		var oDiv = document.getElementById("divMensajeLog");
	} else {
		var oDiv = document.createElement("div");
		oDiv.id = "divMensajeLog";
		oDiv.style.width = '100px';
		document.body.appendChild(oDiv);
		oDiv.onclick = new Function("aChangeWidth(this)");	
	}
	
	if (bReset) {oDiv.innerHTML = "";}
	
	if (!sText) {
		var aText = arguments.callee.caller.toString().split(")");
		sText = aText[0]+")";
	}
		
	while (sText.length>200) {
		
		
		var oTmpDiv = document.createElement("DIV");	
		oTmpDiv.innerHTML = sText.substr(0,200);
		oDiv.appendChild(oTmpDiv);
		
		sText=sText.substr(200);

	}
		
	var oTmpDiv = document.createElement("DIV");	
	oTmpDiv.innerHTML = sText;
	
	oDiv.appendChild(oTmpDiv);
	
	
//alert(sText);
}

function aChangeWidth(oDiv) {
	if (oDiv.style.width=='100px') {
		oDiv.style.width = '100%';
	}else {
		oDiv.style.width = '100px';
	}
}



function b(sText,bReset) {
	

	if (document.getElementById("divMensajeInfo")) {
		var oDiv = document.getElementById("divMensajeInfo");
	} else {
		var oDiv = document.createElement("div");
		oDiv.id = "divMensajeInfo";
		oDiv.style.width = '100px';
		document.body.appendChild(oDiv);
	}
	
	if (bReset) {oDiv.innerHTML = "";}
	
	if (!sText) {
		var aText = arguments.callee.caller.toString().split(")");
		sText = aText[0]+")";
	}
	
	oDiv.innerHTML = oDiv.innerHTML + "> " + sText + " <br>";
	oDiv.onclick = new Function("bChangeWidth(this)");
	
//alert(sText);
}

function bChangeWidth(oDiv) {
	if (oDiv.style.width=='100px') {
		oDiv.style.width = '100%';
		oDiv.innerHTML = "";
		_showGlobalVars();
			
	}else {
		oDiv.style.width = '100px';
	}
}

function _showGlobalVars() {
		
		b("Usr: "+gCodUsr + "/" + gRolUsr);
		
		b("gAppRoot: "+gAppRoot);
	
		b("------------ gUsrGrupos ");
		_showGrupos(gUsrGrupos);

		b("------------ gGruConfig ");
		_showGruConfig(gGruConfig);

		b("------------ gUsrCursos ");
		_showGlobalArrays(gUsrCursos);
		
		b("------------ gCurConfig ");
		_showConfig(gCurConfig);
	
		b("------------ gAppTiposEval ");
		_showGlobalArrays(gAppTiposEval);
	
		b("------------ gUsrArchivos ");
		_showArchivos(gUsrArchivos);

}



function _showGrupos(aArray,spaces) {

	if (typeof spaces=='undefined') {spaces = "";}		
	
	for (var sObjectId in aArray) {	if (sObjectId!='indexOf') {	


		var filtro = {inasistencias:1, calificaciones:1, id:1, nombre:1, sigla:1, abreviatura:1, curso:1, cupos:1, inicio:1, archivos:1, grupo:1, descripcion:1, url:1, fecha:1, hora:1, tipo:1, tiponombre:1, fechaeva:1, fechacal:1, fechapub:1, estado:1, horaInicio:1, horaFin:1, semana:1};

		if (!(sObjectId in filtro)) {
			if (typeof aArray[sObjectId]!='undefined' && aArray[sObjectId]!=null)  {
				if (typeof aArray[sObjectId]!='object') {
					b(spaces+sObjectId+ ": "+aArray[sObjectId]);
				} else {
					b(spaces+sObjectId);
				}
			}
		}
		
//		if (!(sObjectId in {archivos:1})) {
//			b(spaces+sObjectId);
//		}
		
		
		if (typeof aArray[sObjectId]=='object') {
			if (!(sObjectId in filtro)) {
//				b(spaces+sObjectId);
				_showGrupos(aArray[sObjectId],spaces+"&nbsp;&nbsp;&nbsp;");
			}
		}
	}}

}



function _showEvaluaciones(aArray,spaces) {

	if (typeof spaces=='undefined') {spaces = "";}
	
	for (var x=0; x<aArray.length; x++) {
		b(spaces+aArray[x].id);
	}
}




function _showGlobalArrays(aArray,spaces) {
	
	if (typeof spaces=='undefined') {spaces = "";}
	
	for (var sObjectId in aArray) {
		if (sObjectId!='indexOf') {
			b(spaces+sObjectId);
//			a(spaces+sObjectId+" G"+aArray[sObjectId].generacion+" N"+aArray[sObjectId].nivel+" C"+aArray[sObjectId].color);
			_showGlobalArrays(aArray[sObjectId].contenidos,spaces+"&nbsp;&nbsp;&nbsp;");
			_showGlobalArrays(aArray[sObjectId].horarios,spaces+"&nbsp;&nbsp;&nbsp;");
		}
	} 
}

function _showConfig(aArray,spaces) {
	
	if (typeof spaces=='undefined') {spaces = "";}
	
	for (var sObjectId in aArray) { if (sObjectId!='indexOf') {
			b(spaces+sObjectId + " .nivelGestion " + aArray[sObjectId].nivelGestion 
							  + " / .rangoCalificacion " + aArray[sObjectId].rangoCalificacion  
							  + " / .diasSemana " + aArray[sObjectId].diasSemana  );
	}} 
}

function _showGruConfig(aArray,spaces) {
	
	if (typeof spaces=='undefined') {spaces = "";}
	
	for (var sObjectId in aArray) { if (sObjectId!='indexOf') {
			b(spaces+sObjectId + " .diasSemana " + aArray[sObjectId].diasSemana 
							  + " / .evalAutoMail " + aArray[sObjectId].evalAutoMail  
							  + " / .evalAutoSms " + aArray[sObjectId].evalAutoSms  );
	}} 
}


function _showArchivos(aArray,spaces) {

	if (typeof spaces=='undefined') {spaces = "";}
	
	for (var sObjectId in aArray) {	if (sObjectId!='indexOf') {
			if(typeof aArray[sObjectId]!='string') {
				b(spaces+sObjectId);
			} else {
				b(spaces+sObjectId + " = " + aArray[sObjectId]);
			}
//			a(spaces+sObjectId+" G"+aArray[sObjectId].generacion+" N"+aArray[sObjectId].nivel+" C"+aArray[sObjectId].color);
			if(typeof aArray[sObjectId]=='object') {
				_showArchivos(aArray[sObjectId],spaces+"&nbsp;&nbsp;&nbsp;");
			}
	}} 
}


	
//#####################################################################################################



// recibe el rol de un usuario, y una cadena de roles validos para comparar si el rol del usuario coincide con alguno de ellos
function _RolMatch(sRol,sValidRols) {
	
	aValidRols = sValidRols.split("|");

	var bValid = false;
	for (var x=0; x<aValidRols.length; x++) {
		if ((sRol.substr(0,aValidRols[x].length).toUpperCase()==aValidRols[x].toUpperCase()) && (aValidRols[x]!="")) {
			bValid = true;
			break;
		}
	}
	return bValid;	
}



function encript_decript(text,type) {
	if (type==1) { 
		text= "_" + text;
	} else { 
		text = substr(text,1);
	}
	return text;
}


function ed(text,type) {
	var key = "";

	if (type==1) { 
		for (x=0; x < text.length; x++) {
			tmp =  x % 2 == 0 ? x+2 : -x-2;
			key += getChar(text[x],parseInt((text.length) * tmp/2));
		}
	} else {

		for (x=0; x < text.length; x++) {
			tmp =  x % 2 == 0 ? -x-2 : x+2;
			key += getChar(text[x],parseInt((text.length) * tmp/2));
		}
	}	
//alert(key);
	return key;
}


function getChar(sChar,offset) {
	chars = Math.abs(offset);
	encript = "FazG2JOSoX31lmn584HpqrKL09MNstIef6bAYZij7cdTUvBkuyCDEwxVWghPQR";	
	encriptLen = encript.length;
	
	iPos = encript.indexOf(sChar);
	if (iPos>=0) {
		offset = offset % encriptLen;
		dif = iPos + offset;
		if (dif>(encriptLen-1)) { return encript[dif-encriptLen];
		} else if (dif<0) { return encript[encriptLen+dif];		
		} else { return encript[dif];}
	}
	return sChar;
}


