/**************************************************** * Funciones de submit ****************************************************/function FormSubmitter(formName, formCbs){	this.formName = formName;	this.form = document[formName];	this.formCbs = formCbs;}function bloqueaWindow(){	Dialog.info("Enviando datos, por favor espere ...",               {windowParameters: {className: "alert_lite",width:250, height:100}, showProgress: true});}/** * Comproba los datos antes de ejecutar la acción. * Se suele utilizar para modificar un registro desde la ficha. */FormSubmitter.prototype.valida_busca = function(accion){		this.form.accion.value = accion;	this.form.issearch.value = 1;		validateInServerForm();	return false;		if (this.formCbs.isValidAlert() && this.formCbs.isCompleteAlert()) {		this.form.accion.value = accion;		this.form.issearch.value = 1;		this.formCbs.submit();		this.form.submit();		//return true;	}	return false;}/** * Comproba los datos antes de ejecutar la acción. * Se suele utilizar para modificar un registro desde la ficha. */FormSubmitter.prototype.valida_ejecuta = function(accion){	bloqueaWindow();	this.form.accion.value = accion;	validateInServerForm();	return false;}/** * Comproba los datos antes de ejecutar la acción. * Se suele utilizar para modificar un registro desde la ficha. */FormSubmitter.prototype.valida_ejecuta_tab = function(accion,regMatch){	this.form.accion.value = accion;	validateInServerForm(regMatch);	return false;}/** * Ejecuta la acción sin confirmación ni comprobación. * Sin pasar el id: se suele utilizar para volver al listado. * Pasando el id: Se suele utilizar para ir del listado a una ficha. */FormSubmitter.prototype.ejecuta = function(accion, id){	this.form.accion.value = accion;	this.form.id.value = id;	this.form.submit();}FormSubmitter.prototype.ejecutaInNewWindow = function(accion, id){	var odlAccion = this.form.accion.value;	var oldId = this.form.id.value;	this.form.target = "_blank";	this.form.accion.value = accion;	this.form.id.value = id;	this.form.submit();	this.form.target = "_self";	this.form.accion.value = odlAccion;	this.form.id.value = oldId;	}FormSubmitter.prototype.ejecutaInNewWindowNewDest = function(accionNew, id, newUrl){	var odlAccion = this.form.accion.value;	var oldId = this.form.id.value;		this.form.action = newUrl;	this.form.target = "_blank";	this.form.accion.value = accionNew;	this.form.id.value = id;	this.form.submit();	this.form.target = "_self";	this.form.action = '';		this.form.accion.value = odlAccion;	this.form.id.value = oldId;	}/** * Cambia el target del form. */FormSubmitter.prototype.setTarget = function(dest){	this.form.action = dest;	}/** * Pide una confirmación antes de ejecutar la acción. * Sin pasar id: Se suele utilizar para eliminar un registro desde la ficha. * Pasando un id: Se suele utilizar para eliminar un registro desde el listado. */FormSubmitter.prototype.confirma = function(accion, id){	var accionTest = accion;	if (accion.indexOf('.') > 0) {		accionTest = accion.split('.');		accionTest = accionTest[1];	}		if (accionTest.substr(0,3) == "del") {		//"Confirme que desea eliminar el registro.";		msg = MENSAJES['confirmDel'];	}		if (accionTest.substr(0,4) == "send") {		//"Confirme que desea enviar el registro";		msg = MENSAJES['confirmSend'];	}		if ( confirm(msg) ) {		this.ejecuta(accion, id);		return true;	} else {		return false;	}}/** * Pide una confirmación antes de eliminar una foto. */FormSubmitter.prototype.eliminar_foto = function(memname){	if ( confirm(MENSAJES['confirmDelFile']) ) {		this.form.accion.value = "delfoto:" + memname;		this.form.submit();	}}FormSubmitter.prototype.eliminar_fotoAjax = function(memname){	if ( confirm(MENSAJES['confirmDelFile']) ) {		this.form.accion.value = "ajaxDelfoto:" + memname;		var valsForm = ''; //Form.serialize(document.f);		valsForm = 'accion=' + "ajaxDelfoto:" + memname;		valsForm += '&id=' + this.form.id.value;		valsForm += '&' + memname + '=' + this.form.elements[memname].value;				var opt = {				// Use POST				method: 'post',				asynchronous:true,				// Send this lovely data				postBody: valsForm,				// Handle successful response				onSuccess: function(t) {					document.f.elements[memname].value = 0;					new Effect.BlindUp('contenedor_' + memname);					// $('contenedor_' + memname).style.display = 'none';									}			};		new Ajax.Request(this.form.action, opt);	}}/** * Pide una confirmación antes de eliminar una foto. */FormSubmitter.prototype.eliminar_file = function(memname){	if ( confirm(MENSAJES['confirmDelFile']) ) {		this.form.accion.value = "delfile:" + memname;		this.form.submit();	}}FormSubmitter.prototype.eliminar_fileAjax = function(memname){	if ( confirm(MENSAJES['confirmDelFile']) ) {		var oldAccion = this.form.accion.value;		this.form.accion.value = "ajaxDelfile:" + memname;		var valsForm = Form.serialize(document.f);		valsForm = valsForm.split('accion_').join('boton_');		//var valsForm = ''; //Form.serialize(document.f);		//valsForm = 'accion=' + "ajaxDelfile:" + memname;		//valsForm += '&id=' + this.form.id.value;		//valsForm += '&' + memname + '=' + this.form.elements[memname].value;		this.form.accion.value = oldAccion;		//alert(valsForm);		var opt = {				// Use POST				method: 'post',				asynchronous:true,				// Send this lovely data				postBody: valsForm,				// Handle successful response				onSuccess: function(t) {					//alert(t.responseText);					document.f.elements['F_' + memname].value = '';					new Effect.BlindUp('contenedor_' + memname);					// $('contenedor_' + memname).style.display = 'none';									}			};		new Ajax.Request(this.form.action, opt);	}}/** * Recarga la página ajustando el orden de la columna 'by'. */FormSubmitter.prototype.paginate = function(by){	var currBy = this.form.orderBy.value;	if (currBy == by) {		this.form.orderDir.value =			(this.form.orderDir.value == 'DESC') ? 'ASC' : 'DESC';	} else {		this.form.orderDir.value = 'ASC';	}	this.form.orderBy.value = by;		this.form.submit();}// pone a 0 el formulario dejando los hidden sin resetearfunction resetForm(objForm){	for(var i = 0;i < objForm.elements.length;i ++){		var obj = objForm.elements[i];		switch(obj.type){			case "select-one":				if(obj.name != 'regsPerPage'){					obj.selectedIndex = 0;				}				break;			case "select-multiple":				obj.selectedIndex = -1;				break;			case "checkbox":				obj.checked = false;				break;			case "text":			case "file":			case "textarea":				obj.value = "";				break;		}			}	//return true;}/**************************************************** * ChangeCallbacks ****************************************************//** * Colección de callback de cambios en la página */function ChangeCallbacks(){	this.cbChange = new Array();}/** * Adición de un callback de cambio * * El callback se añade a la colección. Se llamará cada vez * que cambia un elemento, aunque no tenga nada que ver con * este callback. El callback es el encargado de hacer la * diferencia. * * @param Function un callback definido en la página * @param HtmlFormElement  */ChangeCallbacks.prototype.addChangeCallback = function(callback){	var pos = this.cbChange.length;	this.cbChange[pos] = callback;}// Crea un objeto globalvar oChangeCallbacks = new ChangeCallbacks();/** * Callback de cambio general * * Esta función se registra para ser llamada cada vez  * que se cambia un elemento del formulario. */function __formHasChanged(el) { 	if(document.f && document.f.is_modified) { 		document.f.is_modified.value = 'cambiado'; 	} }// Registra el callbackoChangeCallbacks.addChangeCallback(__formHasChanged);/*function __autoCheck(el){	oFormCallbacks.autoCheck(el.name);}oChangeCallbacks.addChangeCallback(__autoCheck);*//** * Event Handler para los cambios * * Se añade a cada elemento del formulario con el código: * <input ... onchanged='changed(this)' /> */function changed(el){	if(el != '[object Event]'){		validateInServer(el);	}else{		validateInServer(this);	}}function getNameMember(member){	if(!member) return member;	if(!oFormCallbacks.configMembers[member]){		// es un array ??		var arr = member.split("[");				member = arr[0];		member = member.replace('Out','In');	}		return member;}function getValueMember(el){	var member = getNameMember(el.name);		if (document.f.elements[member]) return el.value;	var elementList = Form.getElements(document.f);		var val = '' ;	for(var i = 0; i < elementList.length; i++){		if (elementList[i].name){			if(elementList[i].name.substr(0,member.length) == member){				if(elementList[i].checked) val = 1;			}		}	}	return val;}function multiselSelect(elName,onOff){	if(onOff !== false) onOff = true;	var selFrom = document.f[elName + "[]"];	var optFrom = selFrom.options;	for(var f=0; f<optFrom.length; f++) {		optFrom[f].selected = onOff;	}}// validacion AJAXfunction validateInServer(el){			var member = getNameMember(el.name);	//alert(member);	if(!oFormCallbacks.configMembers[member]) return;	//alert(member);	var isEnabled = oFormCallbacks.configMembers[member].a_enabled;	if(!isEnabled) return;		var tipo = oFormCallbacks.configMembers[member].a_tipo;	var title = oFormCallbacks.configMembers[member].a_errorMsg;	var required = oFormCallbacks.configMembers[member].a_required;	var format = oFormCallbacks.configMembers[member].a_format;		var valSerialize = '';		if((tipo=='multienum' || tipo=='multiforkey') && format == 'select'){		multiselSelect(member);	}			if((tipo == 'foto' || tipo == 'file')){		valSerialize = '&valSer_' + member + '=' + (el.value);	}		if((tipo=='text') && format == 'RTE'){		// puede que este asi definido pero el navegador no soporte el RTE		if($('hdn' + member)){			updateRTE(member);			var textoRte = $('hdn' + member).value;			valSerialize += '&valSer_' + member + '=' + (textoRte);		}	}			var valsForm = Form.serialize(document.f);		var opt = {				// Use POST				method: 'post',				asynchronous:true,				// Send this lovely data				postBody: 'accionJS=validaMember&member='+member+'&a_format='+format+''+valSerialize+'&a_tipo='+tipo+'&a_title='+title+'&a_required='+required + '&' + valsForm,				// Handle successful response				onSuccess: function(t) {					showResponse(t.responseText,el);				}			};		new Ajax.Request('../utilidades/validator.php', opt);	}function validateInServerForm(regMatch){	var isTab = false;	if(regMatch){		var re = new RegExp(regMatch,"gm");		isTab = true;	}		var serStr = '';	var tipo = '';	var format = '';	var valSerialize = '';	var isEnabled = true;	for(var i in oFormCallbacks.configMembers){				if(isTab){			if (!(i.match(re))) continue;		}				tipo = oFormCallbacks.configMembers[i].a_tipo;		format = oFormCallbacks.configMembers[i].a_format;		isEnabled = oFormCallbacks.configMembers[i].a_enabled;				if(!isEnabled) continue;								if((tipo=='multienum' || tipo=='multiforkey') && format == 'select'){			var member = getNameMember(i);			multiselSelect(member);		}			if((tipo=='foto' || tipo=='file')){			var member = getNameMember(i);			valSerialize += '&valSer_' + member + '=' + (document.f.elements[member].value);		}		if((tipo=='text') && format == 'RTE'){			var member = getNameMember(i);			updateRTE(member);			var textoRte = $('hdn' + member).value;			valSerialize += '&valSer_' + member + '=' + (textoRte);					}				serStr += i +'##';				for(var z in oFormCallbacks.configMembers[i]){			serStr += z +'|' + oFormCallbacks.configMembers[i][z] + '||';		}				serStr += '##';	}		var valsForm = Form.serialize(document.f);	//alert(valsForm);	var opt = {				// Use POST				method: 'post',				asynchronous:true,				// Send this lovely data				postBody: 'accionJS=validaForm&config='+serStr + valSerialize + '&' + valsForm,				// Handle successful response				onSuccess: function(t) {					showResponseForm(t.responseText);				}			};		new Ajax.Request('../utilidades/validator.php', opt);}function showResponseForm(res){	// alert(res);	var hasError = false;	var partes = res.split("||");	var focusFirst = '';	for(var i = 0; i < partes.length; i++){		if(partes[i] == '') continue;		var campoValor = partes[i].split("|");				if(campoValor[0] == '') continue;				if(oFormCallbacks.configMembers[campoValor[0]]){			if(oFormCallbacks.configMembers[campoValor[0]].a_format == 'radio'){				var el = document.f.elements[campoValor[0]][0];			}else{				var el = document.f.elements[campoValor[0]];			}					}else{			// alert(campoValor[0] + ' no esta en la config');		}				showResponse(campoValor[1],el);				if(campoValor[1] != 'OKY'){			if(focusFirst == '') focusFirst = el;			hasError = true;		}	}		if(hasError){		//Field.focus(focusFirst);		//Field.select(focusFirst); //focusFirst.focus();		Dialog.closeInfo();		alert(MENSAJES['error_form']);	}else{				if(typeof updateRTEs == 'function') updateRTEs();				s.form.submit();	}}function showResponse(res,el){	if(!el || !el.name){		return;	}		var member = getNameMember(el.name);		var spanError = $('err_' + member);		var hasError = false;	var nameLabel = member;		var elToInsert = el;		var tipo = oFormCallbacks.configMembers[member].a_tipo;	var format = oFormCallbacks.configMembers[member].a_format;		if(tipo == 'date'){		elToInsert = $('cal_icon_' + member);	}	if(tipo == 'daterange'){		elToInsert = $('H_' + member + '_1');	}	if(format == 'radio' || format == 'checks'){		elToInsert = $('ul_' + member);	}	if(format == 'select' && (tipo == 'multienum' || tipo == 'multiforkey')){		elToInsert = $('ins_' + member);		nameLabel = member.substr(0,member.length-2);	}	if(tipo == 'foto' || tipo == 'file'){		elToInsert = $('ins_' + member);	}			if(res == 'OKY'){		if(spanError){			new Effect.BlindUp(spanError,    		{ duration: 0.2, afterFinish: Element.remove(spanError) });		}	}else{				hasError = true;		if(oFormCallbacks.config.showErrorsText){			if(!spanError){				spanError = '<span id="err_' + member + '" class="errorField"><br />' + res + '<\/span>';				if(oFormCallbacks.config.errorPosition == 'after'){					var anchoLabel = Element.getDimensions('L__' + nameLabel).width;										spanError = '<div id="err_' + member + '" class="errorField" style="display:none;padding-left:'+ anchoLabel + 'px;">' + res + '<\/div>';					new Insertion.After(elToInsert, spanError);										new Effect.Appear($('err_' + member));				}				if(oFormCallbacks.config.errorPosition == 'before'){					new Insertion.Before(elToInsert, spanError);				}				if(oFormCallbacks.config.errorPosition == 'top'){					new Insertion.Top(elToInsert, spanError);				}				if(oFormCallbacks.config.errorPosition == 'bottom'){					new Insertion.Bottom($('L__' + nameLabel), spanError);				}				new Effect.Appear('err_' + member);			}else{				spanError.innerHTML = ' ' + res;				new Effect.Appear('err_' + member);				//alert(res);			}		}	}		// falta asignar el label	if(hasError == false){		assignLabel(nameLabel,'completed');	}else{		assignLabel(nameLabel,'problem');	}	}// Associated functions/** * Change checkbox state when clicking on its label * * @param string name of the checkbox * @todo add the function in the 'onclick' of the label of the corresponding checkbox */function toggleCheckboxOld(elName) {	thisCheckbox = document.f[elName];	thisCheckbox.checked = !(thisCheckbox.checked);	changed(thisCheckbox);}function toggleCheckbox(elName,idDl) {	thisCheckbox = document.f[elName +'['+idDl+']'];	thisCheckbox.checked = !(thisCheckbox.checked);	changed(thisCheckbox);}/** * Change radio button state when clicking on its label * * @param string name of the radio button group * @param string value of this particular radio button */function setSelectedRadioButton(elName, radioValue) {	radioArray = document.f[elName];	if(!radioArray.length) {		radioArray.checked = true;		changed(radioArray);		return;		}	for (i = 0; i < radioArray.length; i++) {		if (radioArray[i].value == radioValue) {			radioArray[i].checked = true;			break;		}	}	changed(radioArray[i]);}/** * Shows a popup window with a calendar in flash * * @param string name of the form * @param string name of the field to receive the selected date */function showCalendar(form,campo){	var f = (document.forms[form].elements[campo].value);	fecha = f.split("-");	d = fecha[0];	m = fecha[1]-1;	y = fecha[2];	win = newWindow('../inc/base/miniCal.php?y='+y+'&m='+m+'&d='+d+'&form='+form+'&campo='+campo,'Calendario',150,150,'');}/** * Fills the field with a given date * * @param string name of the form * @param string name of the field to receive the date * @param mixed date to put into field */function setDate(form,campo,fecha){	elInput = (document.forms[form].elements[campo]);		fecha = fecha.split("-");	var d = eval(fecha[0]);	var m = eval(fecha[1]);	var y = fecha[2];	if(d<10) d = '0'+d;	if(m<10) m = '0'+m; 	elInput.value = d + '-' + m + '-' + y;	elInput.focus();	//campo = campo.substring(1,500);	assignLabel(campo,"completed");		var spanError = $('err_' + campo);	if(spanError){			new Effect.BlindUp(spanError,    		{ duration: 0.2, afterFinish: Element.remove(spanError) });		}	}function getFormValues(){	valsForm = {};	objForm = document.f;	for(var i = 0;i < objForm.elements.length;i ++){		var obj = objForm.elements[i];		switch(obj.type){			case "select-one":				val = obj.selectedIndex;				break;			case "radio":				if(obj.checked == true){					val = obj.value;				}				break;			case "text":			case "file":			case "textarea":				val = obj.value;				break;			case "select-multiple":				numOptions = (obj.options.length);				valArr = new Array;				for (z = 0; z < numOptions; z++) {					valArr[z] = obj.options[z].text;				}				val = valArr;				break;			default:				val = null;				break;		}				if(val != null){			valsForm[obj.name] = val;		}	}	return valsForm;}function checkFormChanges(){	newValuesForm = getFormValues();	var formChanges = new Array;	for (var i in oldValuesForm){		if(oldValuesForm[i] != newValuesForm[i]){			if(typeof oldValuesForm[i] == 'object'){				valsOld = new Array;				valsNew = new Array;				cambiado = false;				for (var h in oldValuesForm[i]){					if(oldValuesForm[i][h] != newValuesForm[i][h]){						valsOld[valsOld.length] = oldValuesForm[i][h];						valsNew[valsNew.length] = newValuesForm[i][h];						cambiado = true;					}				}				if(cambiado ==true){					formChanges[formChanges.length] = i + '\n  old:'+ valsOld +'\n  new:' + valsNew;				}			}else{				formChanges[formChanges.length] = i + '\n  old:'+oldValuesForm[i] +'\n  new:' + newValuesForm[i];			}		}	}	//alert(formChanges.join('\n'));}function assignLabel(formElementName,labelName){	var label = (document.getElementById('L__'+formElementName)) ? document.getElementById('L__'+formElementName) : '';	var errorSpan = (document.getElementById('err_'+formElementName)) ? document.getElementById('err_'+formElementName) : '';	var campo = (document.getElementById(formElementName)) ? document.getElementById(formElementName) : '';	if(label != ''){		var clasesLabel = label.className.split(" ");		clasesLabel[0] = labelName;		label.className = clasesLabel.join(" "); //labelName;	}	if(errorSpan != '' && labelName != 'problem'){		//errorSpan.style.display  = 'none';	}	if(campo != '' && labelName != 'problem'){		if(campo.type == 'text') campo.className = 'inputText';	}	return true;}/**************************************************** * FormCallbacks ****************************************************//** * FormCallbacks *  * @param string nombre del formulario */function FormCallbacks(formName){	this.formName = formName;	this.configMembers = {};		this.config = {};}FormCallbacks.prototype.setConfig = function(pShowErrorsText,pErrorPosition){	this.config.showErrorsText = false;	if(pShowErrorsText == '1') this.config.showErrorsText = true;	this.config.errorPosition = pErrorPosition;}FormCallbacks.prototype.addValidateCallback = function(formElementName, pTipo, pFormat, pRequired, pErrorMsg, pEnabled, pExtraParam){	var fila = {};	fila.a_tipo = pTipo;	fila.a_format = pFormat;	fila.a_required = pRequired;	fila.a_errorMsg = pErrorMsg;	fila.a_enabled = false;	if(pEnabled == '1') fila.a_enabled = true;		var paramsExtra = '0';	if(pExtraParam) paramsExtra = pExtraParam;	fila.a_params = paramsExtra;		this.configMembers[formElementName] = fila;	}function alerta(){	alert(this.name);}FormCallbacks.prototype.enable = function(formElementName){	this.configMembers[formElementName].a_enabled = true;}FormCallbacks.prototype.disable = function(formElementName){	this.configMembers[formElementName].a_enabled = false;}FormCallbacks.prototype.observeForm = function(){	var els = Form.getElements(document[this.formName]);	for(var i = 0; i < els.length; i++)	{				if(els[i].type == 'hidden') continue;				if(els[i].type == 'radio' || els[i].type == 'checkbox'){			//Event.observe(els[i], "click", changed, false);			els[i].onclick = function(){changed(this);};		}else{			if(els[i].type == 'select-multiple'){				// en los multiples el changed se aplicara al mover de uno a otro en el script moveSelectBox.js				continue;			}			//Event.observe(els[i], "change", changed, false);			els[i].onchange = function(){changed(this);};		}	}		var radiosChecks = document.getElementsByClassName("checkRadioInput");	radiosChecks.each(function(value, index){	//for(var i in radiosChecks){		var elLabel = radiosChecks[index].nextSibling;				var arr = (radiosChecks[index].id).split("__");		var nombre = arr[0];		var idDl = '';		if(arr[1]){			idDl = arr[1];		}		if(radiosChecks[index].type == 'radio'){			Event.observe(elLabel, "click", function() { setSelectedRadioButton(nombre,idDl); }, false);		}else{			Event.observe(elLabel, "click", function() { toggleCheckbox(nombre,idDl);return false; }, false);		}			});}// returns true if the data is validFormCallbacks.prototype.submit = function(){	var oForm = document[this.formName];	for(i in this.cbOnSubmit) {		if (this.enabled[i])			var msg = this.cbOnSubmit[i](i, oForm);	}}var oFormCallbacks = new FormCallbacks();/**************************************************** * MISC ****************************************************//** * Gets the value of the specified parameter in the cookie. * * @param string name of the desired parameter. * @return string value of that parameter or null if cookie does not exist. */function getCookie(name){    var dc = document.cookie;    var prefix = name + "=";    var begin = dc.indexOf("; " + prefix);    if (begin == -1)    {        begin = dc.indexOf(prefix);        if (begin != 0) return null;    }    else    {        begin += 2;    }    var end = document.cookie.indexOf(";", begin);    if (end == -1)    {        end = dc.length;    }    return unescape(dc.substring(begin + prefix.length, end));}