<!--
//wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
//*** Desembolupat per Sumi Projectes, 06-07-2000            ***
//*** C/Fra Luis de León, 29 – 08203 – Sabadell - Barcelona  ***
//*** www.sumiprojectes.com- Tel 93.712.22.21                ***
//*** sumi.projectes@sumiprojectes.com                       ***
//wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww

/*
MÓDULO DE AUTOVALIDACIÓN DE FORMULARIOS

Este módulo basa su funcionamiento en la nomenclatura que le damos a los nombres 
de los campos o inputs del formulario. Estos nombres podrán ser los que nosotros 
queramos pero con la condición de que lleven un prefijo que indica toda la serie 
de comprobaciones que se requieren para esos campos. EL formulario no necesita nada 
especial, recomiendo pasar el formulario por document.forms[índice] mejor que el 
habitual this.form, solo se deberá evitar la utilización de los tipos submit (se 
definirá con un button que llame a la función formsubmit) y reset (un button que 
llame a formreset), y se deberá poner como nombre del form un nombre cualquiera
con un prefijo que definirá el idioma: E -> español, C -> catalán, I -> Inglés. 
La nomenclatura del nombre cada input constará en los primeros 4 dígitos de una 
serie de caracteres que se han de escoger entre los siguientes rangos:

1er Dígito: TIPO DE INPUT

T:Text, Password, TextArea
S:Select
C:Checkbox
R:RadioButon
H:Hidden
B:Button
X:Archivo.
NOTA:Los tipo hidden y los button solo necesitan este prefijo

2o Dígito: NECESIDAD DE INPUT

Y:Si es un campo imprescindible
N:Si es un campo opcional o innecesario

3er Dígito: COMPROVACION U OPERACION A APLICAR EN un INPUT

I: Es entero?
F: Es un float?
A: Es un alphanumeric?
D: Es una fecha?
H: Es una hora?
E: Es un e-email?
W: Es una URL?
D: Es un Documento de texto (.doc,.txt,.htm,.html)?
I: Es un Documento de imagen (.gif,.jpeg,.jpg)?
S: Es un Documento de sonido (.wav,.mid,.mod,.mp3,.ra)?
V: Es un Documento de video (.avi,.mov,.mpg,.mpeg,.ram,.rm)?
C: Custom por el programador, la operacion se debera llamar filterNOMBRECAMPO
   a esta se le pasara el campo del form en cuestión, no el value, todo.
   Solo es valida para campos de texto.
N: Ninguna operación

4o Dígito: MENSAJE DE ERROR

Y: Utiliza un msj de error genérico
C: Utiliza un texto propio que deberá llamarse tipo_errorNOMBRECAMPO+LETRAIDIOMA
   los tipos de error son:
   	notext: no se ha introducido un texto necesario
		noint: el texto ha de ser un entero
		nofloat: el texto ha de ser un decimal
    nosel: es necesario seleccionar un elemento de un select
N: No utiliza mensajes

EJEMPLOS:
1.-Un campo de texto, necesario, que sea entero y con un mensaje genérico, llamado edad name="TYIYedad"
2.-Un select llamado tipo, no necesario, sin ninguna operación name="SNNNtipo"
3.-Un textarea llamado describ, necesario, con comprobación especial name="TYCNdescrib"
   definiremos la función filterdescrib
4.-Un campo necesario de texto "porcentaje", que compruebe si es entero y utiliza msj custom name="TYICporcentaje"
*/
 
//MENSAJES DE ERROR GENERICOS
notextE="Es necesario introducir un valor en este campo.";
notextC="Es necessari introduir dades en aquest camp.";
notextI="It is necessary to introduce a value in this field.";
nointE="Este campo debe ser un número entero.";
nointC="Aquest camp ha de ser un senser.";
nointI="This field must be a integer number.";
nofloatE="Este campo debe ser un número decimal.";
nofloatC="Aquest camp ha de ser un nombre decimal.";
nofloatI="This field must be a decimal number.";
noalphaE="Este campo debe ser alfanumérico.";
noalphaC="Aquest camp ha de ser alfanuméric.";
noalphaI="This field must be alphanumeric.";
nodateE="Este campo debe ser un fecha. (dd/mm/[yy]yy)";
nodateC="Aquest camp ha de ser una data. (dd/mm/[yy]yy)";
nodateI="This field must be a date. (dd/mm/[yy]yy)";
nohourE="Este campo debe ser una hora. (hh:mm)";
nohourC="Aquest camp ha de ser una hora. (hh:mm)";
nohourI="This field must be a hour. (hh:mm)";
noemailE="Este campo debe ser una dirección de correo electrónico.";
noemailC="Aquest camp ha de ser una adreça de correu electrònic.";
noemailI="This field must be a e-mail.";
nowebE="Este campo debe ser una dirección Web.";
nowebC="Aquest camp no és una adreça Web.";
nowebI="This field must be a Web location.";
noradioE="Debe elegir una de las opciones de entre los diferentes botones de radio.";
noradioC="Ha de escullir una de les opcions de entre els diferents camps de radio."
noradioI="It must choose one of the options of between different radio buttons.";
nocheckE="Es necesario marcar esta casilla de verificación.";
nocheckC="Es necessari marcar aquesta casella de verificació."
nocheckI="It is necessary to mark this checkbox.";
noselE="Es necesario seleccionar un elemento de la lista.";
noselC="Es necesari seleccionar un element de la lista.";
noselI="It is necessary to select an element of the list.";
nofileE="El archivo seleccionado no es del tipo solicitado.";
nofileC="El fitxer seleccionat no és del tipus sol·licitat.";
nofileI="The selected file is not of the required type.";
nullfileE="Es necesario seleccionar un archivo."
nullfileC="Es necesari seleccionar un fitxer."
nullfileI="It is necessary to select a file."


//FUNCION PRINCIPAL DE COMPROBACIONES DE UN FORMULARIO
function formsubmit(form){
 error="";
 idioma=form.name.substr(0,1);
 i=0;
 //recorremos todos los elementos del formulario
 while (i<form.elements.length){
  switch (form.elements[i].name.substr(0,1)){
   case "T"://Es un campo de texto, comprovamos si es campo requerido
            if (form.elements[i].name.substr(1,1)=='Y'){
             if ((form.elements[i].value.length==0)&&(form.elements[i].value=="")) {
              error="notext";
             }
            }
            if (error==""){
            //realizamos las comprobaciones que se nos indique
             switch (form.elements[i].name.substr(2,1)){
              case "I"://Comprobamos si el dato introducido es un entero
                       if (!isInt(form.elements[i].value)&&(form.elements[i].value!="")){
                        error="noint";
                        form.elements[i].select();
                       }
                       break;
              case "F"://comprovamos si el numero introducido es un decimal
                       form.elements[i].value=form.elements[i].value.replace(/,/g,".");
                       if (!isFloat(form.elements[i].value)&&(form.elements[i].value!="")){
                        error="nofloat";
                        form.elements[i].select();
                       }
                       break;
              case "A"://comprovamos si el texto es un alphanumerico
                       if (!isAlpha(form.elements[i].value)&&(form.elements[i].value!="")){
                        error="noalpha";
                        form.elements[i].select();
                       }
                       break;
              case "D"://Comprovamos si es texto es una fecha correcta
                       //sistituimos los caracteres '-' por el caracter '/'
                       form.elements[i].value=form.elements[i].value.replace(/-/g,"/");
                       if (!isDate(form.elements[i].value)&&(form.elements[i].value!="")){
                        error="nodate";
                        form.elements[i].select();
                       }
                       break;
              case "H"://Comprovamos si es texto es una hora correcta
                       if (!isHour(form.elements[i].value)&&(form.elements[i].value!="")){
                        error="nohour";
                        form.elements[i].select();
                       }
                       break;
              case "E"://Comprovamos si es texto es una cuenta email correcta
                       if (!isEmail(form.elements[i].value)&&(form.elements[i].value!="")){
                        error="noemail";
                        form.elements[i].select();
                       }
                       break;
              case "W"://Comprovamos si es texto es una url correcta
                       //quitamos primero el encabezado "http://" por comodidad
                       form.elements[i].value=form.elements[i].value.replace(/http:\/\//g,"");
                       if (!isWeb(form.elements[i].value)&&(form.elements[i].value!="")){
                        error="noweb";
                        form.elements[i].select();
                       }
                       break;
              case "C"://Ejecutamos operaciones definidas por el programador
                       if (form.elements[i].name.substr(2,1)=='C'){
                        if (eval("filter"+form.elements[i].name+"(form.elements[i])")==false) {
                         form.elements[i].select();
                         form.elements[i].focus();
                         return false;
                        }
                       }
                       break;
             }
            }
            break;
   case "S"://Es un select, comprovamos si es campo requerido
            if (form.elements[i].name.substr(1,1)=='Y'){
             if ((form.elements[i].options[form.elements[i].options.selectedIndex].value=="0")) error="nosel"
            }
            break;
   case "R"://Es un radio button, comprovamos si es campo requerido
            if (form.elements[i].name.substr(1,1)=='Y'){
             //recorremos todos los radio butons que tengan ese nombre
             radiotake=false;
             for (j=0;j<form.elements.length;j++) {
              if (form.elements[j].name==form.elements[i].name){
               if (form.elements[j].checked==true) radiotake=true;
              }
             }
             if (!radiotake) error="noradio"
            }
            break;
   case "X"://Es un archivo realizamos la comprovacion de si es necesario
            if (form.elements[i].name.substr(1,1)=="Y"){
             if ((form.elements[i].value.length==0)&&(form.elements[i].value=="")) error="nullfile"
            }
            if (error=="") {
              //comprovamos si la extension es correcta previamente sustituimos una serie de caracteres de escape
              stri=form.elements[i].value.replace(/\\/g,"/").replace(/\./g,":")
              if (form.elements[i].name.substr(2,1)=="D"){
               if ((stri.search(":doc")==-1)&&(stri.search(":txt")==-1)&&(stri.search(":htm")==-1)&&(stri.search(":html")==-1)) error="nofile";
              }else if (form.elements[i].name.substr(2,1)=="I"){
                     if ((stri.search(":gif")==-1)&&(stri.search(":jpg")==-1)&&(stri.search(":jpeg")==-1)) error="nofile";
                    } else if (form.elements[i].name.substr(2,1)=="S"){
                             if ((stri.search(":mid")==-1)&&(stri.search(":mod")==-1)&&(stri.search(":wav")==-1)&&(stri.search(":ra")==-1)&&(stri.search(":mp3")==-1)) error="nofile";
                           } else if (form.elements[i].name.substr(2,1)=="V") {
                                  if ((stri.search(":avi")==-1)&&(stri.search(":mov")==-1)&&(stri.search(":mpg")==-1)&&(stri.search(":mpeg")==-1)&&(stri.search(":ram")==-1)&&(stri.search(":rm")==-1)) error="nofile";
                                 }
            }
            break;
   case "C"://Es un checkbox, comprovamos si es campo requerido
            if (form.elements[i].name.substr(1,1)=='Y'){
             if (form.elements[i].checked==false) error="nocheck"
            }
            break;
   case "H"://Es un campo oculto no se realizan comprobaciones
            break;
   case "B"://Es un boton no se realizan comprobaciones
            break;
   default://Si no es un tipo definido por nosotros, lo obviamos y hacemos submit
           break;
  }
  //Comprovamos si ha existido error y si tiene su propio alert o es uno generico
  if ((error.length!=0)&&(error!="")){
   if (form.elements[i].name.substr(3,1)=="C") eval("alert("+error+form.elements[i].name+idioma+")");
   else if (form.elements[i].name.substr(3,1)=="Y") alert(eval(error+idioma))
   form.elements[i].focus();
   return false;
  }
  //si no ha habido error continuamos con el siguiente campo
  i++;
 }
 //Si los datos son correctos hacemos el submit
 form.submit();
 return true;
}

//FUNCION PARA SABER SI UN NUMERO ES UN ENTERO
function isInt (InString)  {
 var desde=0;
//Quitamos esto porque los ints de esta pagina no admiten negativos
// if (InString.substr(0,1)=="-") desde=1; else desde=0;
 RefString="1234567890";
 for (Count=desde; Count < InString.length; Count++)  {
  TempChar= InString.substring(Count, Count+1);
  if (RefString.indexOf(TempChar,0)==-1) return false;
 }
 if (isNaN(InString)) return false;
 return true;
}

//FUNCION PARA COMPROBAR SI UN CAMPO ES UN NUMERO CON DECIMALES
function isFloat (InString)  {
 var desde;
 if (InString.substr(0,1)=="-") desde=1; else desde=0;
 RefString="1234567890.";
 dot=false;
 for (Count=desde; Count < InString.length; Count++)  {
  TempChar= InString.substring(Count, Count+1);
  if (RefString.indexOf(TempChar, 0)==-1) return false;
  if (TempChar==".") if (dot==true) return false; else dot=true;
 }
 if (isNaN(InString)) return false;
 return true;
}

//FUNCION PARA COMPROBAR SI UN CAMPO ES ALPHANUMERICO
function isAlpha (InString)
{letras="0123456789ABCÇDEFGHIJKLMNÑOPQRSTUVWXYZabcçdefghijklmnñopqrstuvwxyz"
 acentos="ÀÁÂÃÄÅÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåèéêëìíîïðòóôõöùúûüýÿ"
 simbolos="€!¡¿?\ ()[]{}/\\&%~$£#@|¬*-+÷_¼½¾,.·:;<=>'^`´¨*«»ºª¹º²³±©®¤¥¦§µ¶¢×øØÞþßæ’“”\""
 RefString=letras+acentos+simbolos+String.fromCharCode(10, 13)
 for (Count=0; Count < InString.length; Count++)  {
  TempChar= InString.substring(Count, Count+1);
  if (RefString.indexOf(TempChar, 0)==-1) return false;
 }
 return true;
}

//FUNCION PARA SABER SI ES UNA FECHA CORRECTA
function isDate (InString)
{var dia,mes,any;
 if (InString.substr(1,1)=="/") {
  dia=InString.substr(0,1);
  if (InString.substr(3,1)=="/") {
    mes=InString.substr(2,1);any=InString.substr(4);
  } else if (InString.substr(4,1)=="/") {
          mes=InString.substr(2,2);any=InString.substr(5);
         } else return false;
 } else if (InString.substr(2,1)=="/") {
         dia=InString.substr(0,2);
         if (InString.substr(4,1)=="/") {
          mes=InString.substr(3,1);any=InString.substr(5);
         } else if (InString.substr(5,1)=="/") {
                 mes=InString.substr(3,2);any=InString.substr(6);
                } else return false;
        } else return false;
 if ((!isInt(dia))||(!isInt(mes))||(!isInt(any))) return false;
 if ((parseInt(mes,10)<1)||(parseInt(mes,10)>12)) return false;
 if ((parseInt(any,10)<0)||((any.length!=4)&&(any.length!=2))) return false;
 if (any.length==2) if (parseInt(any,10)>=70) any="19" + any; else any="20" + any;
 if (parseInt(mes,10)==2) {
  if ((parseInt(any,10)%4==0)&&((!(parseInt(any,10)%100==0))||(parseInt(any,10)%400==0))) {
   if ((parseInt(dia,10)>29)||(parseInt(dia,10)<1)) return false;
  } else if ((parseInt(dia,10)>28)||(parseInt(dia,10)<1)) return false;
 } else if((parseInt(mes,10)==4)||(parseInt(mes,10)==6)||(parseInt(mes,10)==9)||(parseInt(mes,10)==11)){
          if ((parseInt(dia,10)>30)||(parseInt(dia,10)<1)) return false;
        } else if ((parseInt(dia,10)>31)||(parseInt(dia,10)<1)) return false;
 return true;
}

//FUNCION PARA SABER SI ES UNA HORA CORRECTA
function isHour (InString)
{var hora,min;
 if (InString.substr(1,1)==":") {
  hora=InString.substr(0,1);
  min=InString.substr(2);
 } else if (InString.substr(2,1)==":") {
         hora=InString.substr(0,2);
         min=InString.substr(3);
        } else return false;
 if (isInt(hora)){
  if ((parseInt(hora,10)<0)||(parseInt(hora,10)>23)) return false;
  else {if (isInt(min)) {
         if ((parseInt(min,10)<0)||(parseInt(min,10)>59)) return false;
        }
        else return false;
       }
 } else return false;
 return true;
}

//FUNCION PARA SABER SI UNA DIRECCION DE CORREO ES CORRECTA
function isEmail(InString){
 RefString="0123456789ABCÇDEFGHIJKLMNÑOPQRSTUVWXYZabcçdefghijklmnñopqrstuvwxyz.-_/@"
 arroba=false;
 for (Count=0; Count < InString.length; Count++)  {
  TempChar= InString.substring(Count, Count+1);
  if (RefString.indexOf(TempChar, 0)==-1) return false;
  if (TempChar=="@") if (arroba==true) return false; else arroba=true;
 }
 if (arroba==false) return false;
 return true;
}

//FUNCION PARA SABER SI UNA DIRECCION URL ES CORRECTA
function isWeb(InString){
 RefString="0123456789ABCÇDEFGHIJKLMNÑOPQRSTUVWXYZabcçdefghijklmnñopqrstuvwxyz.-_/@"
 for (Count=0; Count < InString.length; Count++)  {
  TempChar= InString.substring(Count, Count+1);
  if (RefString.indexOf(TempChar, 0)==-1) return false;
 }
 return true;
}

//FUNCION PARA TRATAMIENTO DE RADIOS
function formreset (form){
 //recorremos todos los elementos "reseteables" del formulario
 i=0;
 while (i<form.elements.length){
  switch (form.elements[i].type){
   case "text"://Es un campo de texto
               form.elements[i].value="";
               break;
   case "password"://Es un campo de password
                   form.elements[i].value="";
                   break;
   case "textarea"://Es un textarea
                   form.elements[i].value="";
                   break;
   case "checkbox"://Es un checkbox
                   form.elements[i].checked=false;
                   break;
   case "radio"://Es un radio button
                form.elements[i].checked=false;
                break;
   case "select-one"://Es un select
                     form.elements[i].options.selectedIndex=0;
                     break;
   case "select-multiple"://Es un select
                          form.elements[i].options.selectedIndex=0;
                          break;
  }
  i++;
 }
 return true;
}
//-->
