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