var MENSAJES = { "confirmDel": "Confirme que desea eliminar el registro.", "confirmDelEstadoOneReg": "Existe __XX__ pedido con este estado que pasará automáticamente a estado No Disponible. ¿Desea realmente eliminar?.", "confirmDelEstadoMoreReg": "Existen __XX__ pedidos con este estado que pasarán automáticamente a estado No Disponible. ¿Desea realmente eliminar?.", "confirmDelTipoDocOneReg": "Existe __XX__ documento con este tipo que pasará automáticamente a estar Sin Tipo. ¿Desea realmente eliminar?.", "confirmDelTipoDocMoreReg": "Existen __XX__ documentos con este tipo que pasarán automáticamente a estar Sin Tipo. ¿Desea realmente eliminar?.", "confirmDelFechaOneReg": "Existe __XX__ pedido con esta fecha que dejará de tenerla definitivamente. ¿Desea realmente eliminar?.", "confirmDelFechaMoreReg": "Existen __XX__ pedidos con esta fecha que dejarán de tenerla definitivamente. ¿Desea realmente eliminar?.", "confirmSend": "Confirme que desea enviar el registro", "confirmDelFile": "Confirme que desea eliminar el fichero", "revisar": "Por favor revise los siguientes campos", "obligatorios": "Los siguientes campos son obligatorios", "formato_fechas": "El formato de fechas debe ser uno de los siguientes:\n - dd-mm-yyyy\n - ddmmyyyy\n - dd/mm/yyyy"};/**************************************************** * Funciones de submit ****************************************************/ function FormSubmitter(formName, formCbs) { this.formName = formName; this.form = document[formName]; this.formCbs = formCbs; } /** * 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) { 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) { if (this.formCbs.isValidAlert() && this.formCbs.isCompleteAlert()) { this.form.accion.value = accion; this.formCbs.submit(); this.form.submit(); return true; } return false; } /** * XX */ FormSubmitter.prototype.valida = function(accion) { var res = this.formCbs.isValidAlert() && this.formCbs.isCompleteAlert(); return res; } /** * 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(); } /** * 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 msg = ''; var posStart = 1 + accion.indexOf('.'); if (accion.substr(posStart,3) == "del") { //"Confirme que desea eliminar el registro."; msg = MENSAJES['confirmDel']; } if (accion.substr(posStart,4) == "send") { //"Confirme que desea enviar el registro"; msg = MENSAJES['confirmSend']; } if (accion.substr(posStart,7) == "descart") { //"Confirme que desea enviar el registro"; msg = MENSAJES['confirmDescart']; } if (accion.substr(posStart,6) == "public") { //"Confirme que desea enviar el registro"; msg = MENSAJES['confirmDescart']; } if ( msg!='' && confirm(msg) ) { this.ejecuta(accion, id); return; } else { return; } } /* FormSubmitter.prototype.confirma = function(accion, id) { var msg = ''; for(i in this.confirmMsgFuncs) { msg = this.confirmMsgFuncs[i](accion); if (msg != '') break; } if ( msg!='' && confirm(msg) ) { this.ejecuta(accion, id); return true; } else { return false; } } function MsgFuncDel(accion) { var posStart = 1 + accion.indexOf('.'); if (accion.substr(posStart,3) == "del") { msg = MENSAJES['confirmDel']; //"Confirme que desea eliminar el registro."; } } function MsgFuncSend(accion) { var posStart = 1 + accion.indexOf('.'); if (accion.substr(posStart,4) == "send") { msg = MENSAJES['confirmSend']; //"Confirme que desea enviar el registro"; } } FormSubmitter.prototype.addConfirmMsgFunc(func) { this.confirmMsgFuncs[this.confirmMsgFuncs.length] = func; } en el constructor: this.addConfirmMsgFunc(MsgFuncDel); this.addConfirmMsgFunc(MsgFuncSend); */ /** * Pide una confirmación antes de eliminar una foto. */ FormSubmitter.prototype.ActionsDelFoto = new Array(); FormSubmitter.prototype.setActionDelFoto = function (memname, accion) { this.ActionsDelFoto[memname] = accion; } FormSubmitter.prototype.eliminar_foto = function(memname) { if ( confirm(MENSAJES['confirmDelFile']) ) { var accion = this.ActionsDelFoto[memname]; accion = accion!=null ? accion : 'delfoto'; this.form.accion.value = accion + ':' + memname; this.form.submit(); } } /** * 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(); } } /** * 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: * */ function changed(el) { for(i in oChangeCallbacks.cbChange) { oChangeCallbacks.cbChange[i](el); } } // 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 toggleCheckbox(elName) { thisCheckbox = document.f[elName]; 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]; 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") } 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) { label = (document.getElementById('L__'+formElementName)) ? document.getElementById('L__'+formElementName) : ''; if(label != ''){ label.className = labelName; } return true; } /**************************************************** * FormCallbacks ****************************************************/ /** * FormCallbacks * * @param string nombre del formulario */ function FormCallbacks(formName) { this.formName = formName; this.cbIsValid = new Array(); this.invalidMsg = new Array(); this.cbIsComplete = new Array(); this.incompleteMsg = new Array(); this.cbOnSubmit = new Array(); this.enabled = new Array(); this.cbAutoCheck = new Array(); } FormCallbacks.prototype.addValidateCallback = function(formElementName, callback, errorMsg) { this.cbIsValid[formElementName] = callback; this.invalidMsg[formElementName] = errorMsg; this.enabled[formElementName] = true; } FormCallbacks.prototype.addRequiredCallback = function(formElementName, callback, errorMsg) { this.cbIsComplete[formElementName] = callback; this.incompleteMsg[formElementName] = errorMsg; this.enabled[formElementName] = true; } FormCallbacks.prototype.addSubmitCallback = function(formElementName, callback, errorMsg) { this.cbOnSubmit[formElementName] = callback; this.enabled[formElementName] = true; } FormCallbacks.prototype.enable = function(formElementName) { this.enabled[formElementName] = true; } FormCallbacks.prototype.disable = function(formElementName) { this.enabled[formElementName] = false; } // returns true if the data is valid FormCallbacks.prototype.isValidAlert = function() { var oForm = document[this.formName]; var msgArray = new Array(); for(i in this.cbIsValid) { if (this.enabled[i] && !this.cbIsValid[i](i, oForm)) msgArray[msgArray.length] = (this.invalidMsg[i]); } if (msgArray.length > 0) { var msg = MENSAJES['revisar'] + "\n- " + msgArray.join(",\n- ") + "."; alert(msg); return false; } return true; } // returns true if the data is valid FormCallbacks.prototype.isValidThisTab = function() { var oForm = document[this.formName]; var msgArray = new Array(); for(i in this.cbIsValid) { if (i.match(/^__tab/)) continue; if (this.enabled[i] && !this.cbIsValid[i](i, oForm)) return false; } return true; } // returns true if the data is complete FormCallbacks.prototype.isCompleteAlert = function() { var oForm = document[this.formName]; var msgArray = new Array(); for(i in this.cbIsComplete) { if (this.enabled[i] && !this.cbIsComplete[i](i, oForm)) { msgArray[msgArray.length] = (this.incompleteMsg[i]); } } if (msgArray.length > 0) { var msg = MENSAJES['obligatorios'] + "\n- " + msgArray.join(",\n- ") + "."; alert(msg); return false; } return true; } // returns true if the data is complete FormCallbacks.prototype.isCompleteThisTab = function() { var oForm = document[this.formName]; var msgArray = new Array(); for(i in this.cbIsComplete) { if (i.match(/^__tab/)) continue; if (this.enabled[i] && !this.cbIsComplete[i](i, oForm)) return false; } return true; } /** * returns true if all 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); } } // returns true if the data is valid FormCallbacks.prototype.autoCheck = function(formElementName) { elName = formElementName; if(elName.substr(0,1)=="_"){ elName = elName.substr(1,100); } var oForm = document[this.formName]; labelClass = "optional"; if (this.enabled[elName]){ if(this.cbIsValid[elName]!= null) { if(!this.cbIsValid[elName](elName, oForm)) { labelClass = 'problem'; }else{ labelClass = 'completed'; } } if(this.cbIsComplete[elName]!= null) { if(!this.cbIsComplete[elName](elName, oForm)) { labelClass = 'problem'; }else{ if(labelClass != 'problem'){ labelClass = 'completed'; } } } } assignLabel(elName,labelClass); return true; } var oFormCallbacks = new FormCallbacks(); /**************************************************** * Callbacks ****************************************************/ // ######### base ########## function cbIsValid_base(elName, form) { return true; } function cbIsComplete_base(elName, form) { if (form.elements[elName] == null || form.elements[elName].value == '') { return false; } return true; } function cbOnSubmit_base(elName, form) { return true; } // ######### int ########## function cbIsValid_int(elName, form) { if (!form.elements[elName]) alert("No element " + elName); return !isNaN(form.elements[elName].value); } function cbIsComplete_int(elName, form) { return cbIsComplete_base(elName, form) } function cbOnSubmit_int(elName, form) { return cbOnSubmit_base(elName, form) } // ######### string ########## function cbIsValid_string(elName, form) { return cbIsValid_base(elName, form) } function cbIsComplete_string(elName, form) { return cbIsComplete_base(elName, form) } function cbOnSubmit_string(elName, form) { return cbOnSubmit_base(elName, form) } // ######### text ########## function cbIsValid_text(elName, form) { return cbIsValid_base(elName, form) } function cbIsComplete_text(elName, form) { updateRTE(elName); return cbIsComplete_base(elName, form) } function cbOnSubmit_text_RTE(elName, form) { updateRTE(elName); return cbOnSubmit_base(elName, form) } // ######### email ########## function cbIsValid_email(elName, form) { var emailStr = form.elements[elName].value; if (emailStr == '') return true; var re = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,})+$/; return re.test(emailStr); } function cbIsComplete_email(elName, form) { return cbIsComplete_base(elName, form) } function cbOnSubmit_email(elName, form) { return cbOnSubmit_base(elName, form) } // ######### date ########## function cbIsComplete_date_text(elName, form) { var date = form.elements['_' + elName].value; return date != ''; } function cbIsValid_date_text(elName, form) { if (form.elements['_'+elName] == null) { alert('element _'+elName+' missing'); } var date = form.elements['_'+elName].value; if(date=="" || date=="00-00-0000") return true; var objRegExp = /^\d{1,2}(\-|\/)\d{1,2}\1\d{4}$/; if (objRegExp.test(date)) { pos = date.length-5; strSeparator = date.substring(pos,pos+1) // el separador arrayDate = date.split(strSeparator); arrayLookup = { '01' : 31,'03' : 31, '04' : 30,'05' : 31,'06' : 30,'07' : 31, '08' : 31,'09' : 30,'10' : 31,'11' : 30,'12' : 31}; intDay = eval(arrayDate[0]); if(arrayDate[1].length == 1){ mesTxt = '0' + arrayDate[1]; }else{ mesTxt = arrayDate[1]; } if(mesTxt<1) return false; //check si el mes tiene esos dias if(arrayLookup[mesTxt] != null) { if(intDay <= arrayLookup[mesTxt] && intDay != 0){ return true; //found in lookup table, good date }else{ return false; } } //check febrero intYear = eval(arrayDate[2]); if( ((intYear % 4 == 0 && intDay <= 29) || (intYear % 4 != 0 && intDay <=28)) && intDay !=0){ return true; //Feb. had valid number of days }else{ return false; } }else{ return false; } } function cbIsValid_date_combo(elName, form) { var d = form['_'+elName+'[2]'].value; var selm = form['_'+elName+'[1]']; var m = selm.selectedIndex + 1; var y = form['_'+elName+'[0]'].value; if (d.match(/\d{1,2}/) && d>0 && d<=31 && y.match(/^(\d{2}|\d{4})$/)) { return true; } } function cbIsComplete_date(elName, form) { var elType = null; if (form['_'+elName] != null) elType = 'text'; if (form['_'+elName+'[0]'] != null) elType = 'combo'; switch(elType) { case 'combo': return true; case 'text': var date = form.elements['_' + elName].value; return date != ''; } return false; } function cbOnSubmit_date(elName, form) { var elType = null; if (form['_'+elName] != null) elType = 'text'; if (form['_'+elName+'[0]'] != null) elType = 'combo'; switch(elType) { case 'text': var fecha = form['_'+elName].value; form[elName].value = fecha.split("-").reverse().join("-"); break; case 'combo': var d = form['_'+elName+'[2]'].value; var selm = form['_'+elName+'[1]']; var m = selm.selectedIndex + 1; var y = form['_'+elName+'[0]'].value; form[elName].value = y+'-'+m+'-'+d; break; } } // ######### datetime ########## function cbIsValid_datetime_combo(elName, form) { } function cbIsValid_datetime_text(elName, form) { return true; } function cbOnSubmit_datetime(elName, form) { var fecha = form['_'+elName].value; form[elName].value = fecha; } // ######### daterange ########## function cbIsComplete_daterange(elName, form) { return true; } function cbIsValid_daterange(elName, form) { return cbIsValid_date_text(elName+'[0]', form) && cbIsValid_date_text(elName+'[1]', form); } function cbOnSubmit_daterange(elName, form) { cbOnSubmit_date(elName+'[0]', form); cbOnSubmit_date(elName+'[1]', form); } // ######### file ########## function cbIsComplete_file(elName, form) { var file = form.elements[elName].value; var oldfile = form.elements['_'+elName].value; return (file != '' || oldfile != ''); } /** * Checks whether the file (with its path) is valid */ function cbIsValid_file(elName, form) { var file = form.elements[elName].value; file = file.split("\\").join("/").split(":").join("/"); var path = file.split("/"); file = path[path.length - 1]; var objRegExp = /[^a-zA-Z0-9_\. -]/; if (file.match(objRegExp)) { return false; } return true; } // ######### zip ########## function cbIsComplete_zip(elName, form) { return cbIsComplete_file(elName, form); } function cbIsValid_zip(elName, form) { return cbIsValid_file(elName, form); } // ######### forkey ########## function cbIsComplete_forkey(elName, form) { var elements = form.elements; var sel = elements[elName]; if (sel.type == 'hidden') return true; var ok = (sel.selectedIndex>0) || (sel[0].value != ''); return ok; } function cbIsValid_forkey(elName, form) { return cbIsValid_base(elName, form); } // ######### foto ########## /** * Comprueba si el fichero es válido * En realidad sólo verifica que si el fichero existe, es un '.jpg' */ function cbIsComplete_foto(elName, form) { var file = form.elements[elName].value; var oldfile = form.elements[elName +'_foto'].value; return (file != '' || oldfile != ''); } function cbIsValid_foto(elName, form) { fileName = form.elements[elName+"_foto"].value; if (fileName=="") return true; var exts = eval("authFotoExtensions_" + elName); /\.([a-z]+)$/.test(fileName); ext = RegExp.$1; var found = false; var i; for(i in exts) { if (ext == exts[i]) { found = true; break; } } return found; } // ######### decimal ########## function cbIsComplete_decimal(elName, form) { if (form.elements[elName].value == '') { return false; } return true; } function cbIsValid_decimal(elName, form) { return true;//!isNaN(form.elements[elName].value); } // ######### multicheck ########## function cbIsComplete_multicheck(elName, form) { var elements = form.elements; var found = false; for(var i=0; i