    var debug= false;

     // validates a field is not blank
     function validateIsChecked(formObj, fieldName, fieldLabel){
        var fieldObj= eval("formObj['"+fieldName+"']");
        
        if(fieldObj.type=="checkbox" && fieldObj.checked== false){
	        alert("Debes marcar la casilla '"+fieldLabel+"' para continuar");
	        return false;
        }
        
        return true;
     }
     
     // validates a field is not blank
     function validateNotBlank(formObj, fieldName, fieldLabel){
        var fieldObj= eval("formObj['"+fieldName+"']");
        var msgStr= "El campo "+fieldLabel+" es obligatorio";
        if(disallowBlank(fieldObj, msgStr, true))
            return false;
        
        return true;
     }
     
     function validateNonZero(formObj, fieldName, fieldLabel){
        var fieldObj= eval("formObj['"+fieldName+"']");
        
        if(fieldObj.options[fieldObj.selectedIndex].value== "0") {
            var msgStr= "Debes elegir un valor para el campo "+fieldLabel+".";
            alert(msgStr);
            return false;
        }
        
        return true;
     }
     
     // validates a field contains a non blank valid email
     function validNotBlankEmail(formObj, fieldName, fieldLabel){       
        if(!validateNotBlank(formObj, fieldName, fieldLabel))
            return false;
        
        return validEmail(formObj, fieldName, fieldLabel);
    }
     // validates a field contains a non blank valid dni
     function validNotBlankDni(formObj, fieldName, fieldLabel){       
        if(!validateNotBlank(formObj, fieldName, fieldLabel))
            return false;
        
        return validDni(formObj, fieldName, fieldLabel);
    }
     // validates a field contains a non blank valid phone
     function validNotBlankPhone(formObj, fieldName, fieldLabel){       
        if(!validateNotBlank(formObj, fieldName, fieldLabel))
            return false;
        
        return validPhone(formObj, fieldName, fieldLabel);
    }
    
    // validates a field contains a non blank valid password
     function validNotBlankPassword(formObj, fieldName, fieldLabel){       
        if(!validateNotBlank(formObj, fieldName, fieldLabel))
            return false;
        
        return validPassword(formObj, fieldName, fieldLabel);
    }
    
    function validDni(formObj, fieldName, fieldLabel){
        var fieldValue= eval("formObj['"+fieldName+"'].value");
        if(isBlank(fieldValue))
            return true;
        
        var msg= "El NIF no es válido. Debe contener (como máximo) 8 dígitos seguidos de una letra, sin espacios, guiones o cualquier otro simbolo.";
        
        // Check length
        if(fieldValue.length> 9)
        {
            alert(msg);
            return false;
        }
        
        // Check digits
        for(i=0; i< fieldValue.length-1; i++){
            if(!isDigit(fieldValue.charAt(i))){
                alert(msg);
                return false;
            }
        }
        
        // Check last letter
        var last= fieldValue.charAt(fieldValue.length-1).toUpperCase();
        var lastArray="TRWAGMYFPDXBNJZSQVHLCKET";
        var pos = fieldValue.substring(0, fieldValue.length-1) % 23 
        var teorical = lastArray.charAt(pos);
        if(teorical!= last){
            alert(fieldLabel +": La letra no es válida.");
            return false;
        }

        return true;
    }

    function validCIF(formObj, fieldName, fieldLabel){return true;}

    function validTResidecia(formObj, fieldName, fieldLabel){
        var fieldValue= eval("formObj['"+fieldName+"'].value");
        if(isBlank(fieldValue))
            return true;

        var msg= "Tarjeta de residencia no válida. Debe empezar por X, seguidos  de 7 números y una letra, sin espacios, guiones o cualquier otro simbolo.";

        if(fieldValue.length == 0){
            alert(msg);
            return false;
        }
        if( fieldValue.charAt(0) != 'x' && fieldValue.charAt(0) != 'X'){
           alert(msg);
           return false;
        }
        if(fieldValue.length != 9)
        {
            alert(msg);                                                             
            return false;
        }

        // Check digits
        for(i=1; i< fieldValue.length-1; i++){
            if(!isDigit(fieldValue.charAt(i))){
                alert(msg);
                return false;
            }
        }

        // Check last letter
        var last= fieldValue.charAt(fieldValue.length-1).toUpperCase();
        var lastArray="TRWAGMYFPDXBNJZSQVHLCKET";
        var pos = fieldValue.substring(1, fieldValue.length-1) % 23
        var teorical = lastArray.charAt(pos);
        if(teorical!= last){
            alert(fieldLabel +": La letra no es válida.");
            return false;
        }

        return true;
    }
    
    function validPhone(formObj, fieldName, fieldLabel){
        var fieldValue= eval("formObj['"+fieldName+"'].value");
        if(isBlank(fieldValue))
            return true;
        
        
        var msg= "El campo "+fieldLabel+ " no contiene un teléfono válido. Debe contener 9 dígitos, sin espacios, guiones o cualquier otro simbolo.";
        
        // Check length
        if(fieldValue.length!= 9)
        {
            alert(msg);
            return false;
        }
        
        // Check digits
        for(i=0; i< fieldValue.length; i++){
            if(!isDigit(fieldValue.charAt(i))){
                alert(msg);
                return false;
            }
        }
        
        return true;
    }
    
    function validPassword(formObj, fieldName, fieldLabel){
        var fieldValue= eval("formObj['"+fieldName+"'].value");
        if(isBlank(fieldValue))
            return true;
        
        var msg= "El campo "+fieldLabel+ " debe contrener al menos 4 caracteres";
        
        // Check length
        if(fieldValue.length< 4)
        {
            alert(msg);
            return false;
        }
        
        return true;
     }

     function validDate(formObj, fieldsPrefix, fieldLabel){
        var fieldDay= eval("formObj['"+fieldsPrefix+"Day"+"']");
        var fieldMonth= eval("formObj['"+fieldsPrefix+"Month"+"']");
        var fieldYear= eval("formObj['"+fieldsPrefix+"Year"+"']");

        var dayStr= fieldDay.value;
        var monthStr= fieldMonth.value;
        var yearStr= fieldYear.value;

        // Check completeness
        var anyBlank= false;
        var anyNotBlank= false;
        if(isBlank(dayStr))
            anyBlank= true;
        else
            anyNotBlank= true;
        if(isBlank(monthStr))
            anyBlank= true;
        else
            anyNotBlank= true;
        if(isBlank(yearStr))
            anyBlank= true;
        else
            anyNotBlank= true;

        if(anyBlank== true){
            if(anyNotBlank== true){
                // Some fields are blank and some are not.
                alert("El campo "+fieldLabel+" está incompleto.");
                if(isBlank(dayStr))
                    fieldDay.focus();
                else if(isBlank(monthStr))
                    fieldMonth.focus();
                else
                    fieldYear.focus();
                return false;
            } else
                // All fields are blank
                return true;
        }

        // Check if values are integers
        if(!isInteger(dayStr)){
            alert("Introduzce sólo digitos en el campo "+fieldLabel);
            fieldDay.focus();
            return false;
        }
        if(!isInteger(monthStr)){
            alert("Introduzce sólo digitos en el campo "+fieldLabel);
            fieldMonth.focus();
            return false;
        }
        if(!isInteger(yearStr)){
            alert("Introduce sólo digitos en el campo "+fieldLabel);
            fieldYear.focus();
            return false;
        }

        var day= parseInt(dayStr);
        var month= parseInt(monthStr);
        var year= parseInt(yearStr);

        if(year<1900 || year> 2100){
            alert("El año del campo "+fieldLabel+" debe estar entre el año 1900 y el 2100");
            fieldYear.focus();
            return false;
        }

        if(month<1 || month>12){
            alert("Mes inválido en el campo "+fieldLabel+". Debe estar entre 1 y 12.");
            fieldMonth.focus();
            return false;
        }

        var bisiesto= year%4==0 && (year%100!= 0 || year%400== 0);
        if(bisiesto)
            var monthDays= new Array(31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
        else
            var monthDays= new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);

        if(day<1 || day>monthDays[month-1]){
            alert("Dia no válido en el campo "+fieldLabel+". Para el mes "+month+" debe estar entre 1 y "+monthDays[month-1]);
            fieldDay.focus();
            return false;
        }

        return true;
     }
     
     function conditionalNotBlankValidation(form, fieldName, fieldLabel, condition){
        if(eval(condition)){
            return validateNotBlank(form, fieldName, fieldLabel);
        }
        
        return true; // no need to validate as condition was false
     }
     
     function conditionalNonZeroValidation(form, fieldName, fieldLabel, condition){
        if(eval(condition)){
            return validateNonZero(form, fieldName, fieldLabel);
        }
        
        return true; // no need to validate as condition was false
     }
     
     function doMatch(formObj, fieldNames, fieldLabels){
        var pos= fieldNames.indexOf(',');
        var field1= fieldNames.substring(0, pos);
        var field2= fieldNames.substring(pos+1);
        
        var fieldValue1= eval("formObj['"+field1+"'].value");
        var fieldValue2= eval("formObj['"+field2+"'].value");
        
        var doMatch= fieldValue1 == fieldValue2;
        if(doMatch == false){
            pos= fieldLabels.indexOf(',');
            var fieldLabel1= fieldLabels.substring(0, pos);
            var fieldLabel2= fieldLabels.substring(pos+1);
        
            alert("Los campos "+fieldLabel1+" y "+fieldLabel2+" deben coincidir");
            eval("formObj['"+field1+"'].focus()");
        }
        
        return doMatch;
     }
     
     
     // validates a field is blank or contains a valid email
     function validEmail(formObj, fieldName, fieldLabel){
        var fieldValue= eval("formObj['"+fieldName+"'].value");
        if(isBlank(fieldValue))
            return true; // empty is valid
       // pattern = /^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$/;
      //  goodEmail =  pattern.exec(fieldValue);
        goodEmail =  checkEmail(fieldValue);
        if(goodEmail){
        return true;
        }else{
        alert("El campo "+fieldLabel+" no contiene un correo electrónico válido.");
        eval("formObj['"+fieldName+"'].focus()");
        return false;
        }
     }

      function checkEmail(emailStr) {
       if (emailStr.length == 0) {
           return true;
       }
       var emailPat=/^(.+)@(.+)$/;
       var specialChars="\\(\\)<>@,;:\\\\\\\"\\.\\[\\]";
       var validChars="\[^\\s" + specialChars + "\]";
       var quotedUser="(\"[^\"]*\")";
       var ipDomainPat=/^(\d{1,3})[.](\d{1,3})[.](\d{1,3})[.](\d{1,3})$/;
       var atom=validChars + '+';
       var word="(" + atom + "|" + quotedUser + ")";
       var userPat=new RegExp("^" + word + "(\\." + word + ")*$");
       var domainPat=new RegExp("^" + atom + "(\\." + atom + ")*$");
       var matchArray=emailStr.match(emailPat);
       if (matchArray == null) {
           return false;
       }
       var user=matchArray[1];
       var domain=matchArray[2];
       if (user.match(userPat) == null) {
           return false;
       }
       var IPArray = domain.match(ipDomainPat);
       if (IPArray != null) {
           for (var i = 1; i <= 4; i++) {
              if (IPArray[i] > 255) {
                 return false;
              }
           }
           return true;
       }
       var domainArray=domain.match(domainPat);
       if (domainArray == null) {
           return false;
       }
       var atomPat=new RegExp(atom,"g");
       var domArr=domain.match(atomPat);
       var len=domArr.length;
       if ((domArr[domArr.length-1].length < 2) ||
           (domArr[domArr.length-1].length > 3)) {
           return false;
       }
       if (len < 2) {
           return false;
       }
       return true;
    }

    // validates a form, where an array named [form.name]ValidatedFields
    // exist. Each entrance of the array is an array with 3 values: fieldName, 
    // fieldLabel and validationFuncionName and a 4th optional field: condition
    // to satisfy before checking field. If condition is not satisfied, form
    // field is not evaluated; otherwise, field is checked
    function validateForm(submitButton){
        var form= submitButton.form;
        var isValid= _validateForm(form);

        if(isValid== true){
            submitButton.value="Enviando...";
            form.submit();
            submitButton.disabled= true;
        } else {
            submitButton.disabled= false;
        }

        return false;
    }

    function _validateForm(form){
        var formName= form.name;
        var validatedFieldsArrayName= formName + "ValidatedFields";
        var validatedFieldsArray= eval(validatedFieldsArrayName);
        
        var i;
        for(i= 0; i < validatedFieldsArray.length; i++){
            // Read static data
            var field = validatedFieldsArray[i];
            var fieldName= field[0];
            var fieldLabel= field[1];
            var fieldValidationFunctionName= field[2];
            if(field.length >= 4){
                var fieldValidationCondition= field[3];
            }else
                var fieldValidationCondition= "true";
                


             if(eval(fieldValidationCondition))
            {
	            // Check if field exists (helps developing)
                if(debug)
    	            alert("validating: Field name: "+fieldName);

	            // Validate field
	            var otherArgs= "";
	            for(j=4; j< field.length; j++)
	                otherArgs += ", '" + field[j] + "'";            
	            var validationLine= fieldValidationFunctionName+"(form, '"+fieldName +"', '"+fieldLabel+"'"+otherArgs+");";
	            if(debug)
	                alert(validationLine);
	            if(eval(validationLine)==false){
	                if(debug)
	                    alert("Field not valid: "+ fieldName);

                    if(fieldValidationFunctionName!="validDate" && fieldValidationFunctionName!="doMatch"){
                        var fieldObj= eval("form['"+fieldName+"']");
                        if(fieldObj.type=="text"||fieldObj.type=="textarea"||fieldObj.type=="password") {
                            fieldObj.select();
                        }
                        fieldObj.focus();
                    }

	                return false;
	            }
            }
        }
        
        return true;
    }