/** Tunea los focos de los input */
function tunea(type, tag, parentId) {
	if (window.attachEvent) {
		window.attachEvent("onload", function() {
			var sfEls = (parentId==null)?document.getElementsByTagName(tag):document.getElementById(parentId).getElementsByTagName(tag);
			type(sfEls);
		});
	}
}

enfocar = function(sfEls) {
	for (var i=0; i<sfEls.length; i++) {
		if(sfEls[i].onfocus==null){
			sfEls[i].onfocus=function() {
				this.className+=" focus";
			}
			sfEls[i].onblur=function() {
				this.className=this.className.replace(new RegExp(" focus\\b"), "");
			}
		}
	}
}


tunea(enfocar, "INPUT");
tunea(enfocar, "TEXTAREA");

/**
 * Comprueba si algún elemento del radiobutton está marcado.
 */
function isCheckedRadio(radio){
    var i;
    if(!radio){
    	return false;
    }
    else if (radio.length==undefined){
        return radio.checked;
    }
    else{
	    for (i=0;i<radio.length;i++){ 
    	   if (radio[i].checked)
        	   return true;
       	}
    } 
    return false;
}
/**
 * Compara dos fechas y devuelve su relación 
 * (gt->la primera mayor)
 * (lt->la primera menor)
 * (eq->iguales)
 */
function comparaFechas(date1, date2){
	
	if(date2.length > 9){
		fecha2 = new Date();
		
		fecha2.setFullYear(date2.substr(6, 4));
		fecha2.setMonth(date2.substr(3, 2) - 1);
		fecha2.setDate(date2.substr(0, 2));
		
		if(date1 > fecha2){
			return "gt";
		}else if(date1 < fecha2){
			return "lt";
		}else{
			return "eq";
		}
	}else{
		return;
	}
}

/**
 * Cambia el input campo a deshabilitado si disable es true sino
 * se habilita y además le añade la clase recibida.
 */
function changeEnableText(campo, disable, clase){
	if(disable){
		campo.disabled = true;
	}
	else{
		campo.disabled = false;
	}
	campo.className = clase;
}
function establecerFecha(form, fechahora, fecha, hora){
	var campoFechaHora = eval(form.name + "." + fechahora);
	var campoFecha = eval(form.name + "." + fecha);
	var campoHora = eval(form.name + "." + hora);
	var horavalue = campoHora.value;
	if(horavalue.length == 4 ){
		horavalue = "0" + horavalue;
	}
	campoFechaHora.value = campoFecha.value + horavalue;
}

function establecerTextoCombo (form, combo, hidden){
	
	var indiceSel = eval (form.name + "." + combo + ".selectedIndex");
	var seleccion = eval (form.name + "."+combo + "[" + indiceSel + "]");
	var texto =	seleccion.text;
	var hid = eval (form.name+"."+hidden);
	
	hid.value = texto;
	
}

function borrarSeleccionados(form, accion){

	var elementos = document.getElementsByTagName("INPUT");
	var chks = new Array();
	var cChks = "";
	
	for(i=0;i < elementos.length;i++){
		if((elementos[i].type == "checkbox") && (elementos[i].checked)){
			chks.push(elementos[i].name);
		}
	}
	
	cChks = chks.join(",");
	
	form.strChks.value = cChks;
	
	envio(form, accion);
}

function verificarChecks(chk, form){
	
	var elementos = document.getElementsByTagName("INPUT");
	var checks = new Array();
	
	for(var i = 0; i < elementos.length; i++){
		if((elementos[i].type).toUpperCase() == "CHECKBOX"){
			checks.push(elementos[i]);
		}
	}
	
	if((chk.name).toUpperCase() == "CHKTODOS"){
		for(i=0;i < checks.length;i++){
			checks[i].checked = chk.checked;
		}
	}else if(!chk.checked){
			eval("document."+form.name+".chkTodos.checked=false");
		}else{
			var j = 0;
			for(i=0;i < checks.length;i++){
				if(checks[i].checked) 
					j++;
			}
			if(j == checks.length - 1)
				eval("document."+form.name+".chkTodos.checked=true");
		}
}
function doSubmit(fAlta, fBaja, tecla, code){

    var alta = fAlta.value;
    var baja = fBaja.value;

    var fechaAlta = new Date(alta.substring(6), parseInt(alta.substring(3,5))-1, alta.substring(0,2));
    var fechaBaja = new Date(baja.substring(6), parseInt(baja.substring(3,5))-1, baja.substring(0,2));
    	
	    if((tecla) && (code == "13")){

          if(fechaBaja < fechaAlta){
                alert("La fecha de baja no puede ser anterior a la fecha de alta del servicio.");
                
            }else{
                teclaPulsada(code, document.formBajaServicios, 'BajaServicios', false, true);
            }
        }else if(!tecla){
            
            if(fechaBaja < fechaAlta){
                alert("La fecha de baja no puede ser anterior a la fecha de alta del servicio.");
                
            }else{
                confirmar(document.formBajaServicios,'BajaServicios');
            }
        }    
}

/*
 *  Función para capturar el intro como accion directa de formulario
 */
function teclaPulsada(codigo, form, accion, paginado, confirmacion){
    if(codigo == "13"){
        if(paginado){
            enviopaginado(form, accion, 1, {}, {});
        }else if(confirmacion){
			confirmar(form, accion);
        }else{
			envio(form, accion);
        }
    }
    
}

/*
 * Realiza la validación del formulario y pide confirmación de 
 * la acción solicitada.
 * Si se aprueba se realiza el submit. Si no, no ocurre nada.
 */
function confirmar(form, accion){

    if (!validateForm(form, accion)){
		if(window.event != null)
			window.event.returnValue = false;
       return;
    }
    confirmado = confirm("¿Desea seguir adelante?");
    
    if(confirmado){
        envio(form, accion);
    }
    if(window.event != null)
        window.event.returnValue = false;
}

/*
 * Realiza la carga del hidden "uiaction" con la acción a realizar.
 * Si todo es correcto hace el submit del fomulario.
 */
function envio(formulario, accion){
	
	if (!validateForm(formulario, accion)){
		if(window.event != null)
			window.event.returnValue = false;
		return false;
	}
	
	if(formulario.uiaction == undefined){
		oHidden = document.createElement("<INPUT TYPE='HIDDEN' NAME='uiaction'>");

		formulario.appendChild(oHidden);
	}
	
	formulario.uiaction.value = accion;
	
	formulario.submit();
}

/*
 * Envía una acción al servidor incluyendo la información
 * de paginado.
 */
function enviopaginado(formulario, accion, numpagina, campos, valores){
	if (!validateForm(formulario, accion)){
		if(window.event != null)
			window.event.returnValue = false;
		return false;
	}
	
	if(formulario.uiaction == undefined){
		oHidden = document.createElement("<INPUT TYPE='HIDDEN' NAME='uiaction'>");
		paginaHidden = document.createElement("<INPUT TYPE='HIDDEN' NAME='pagina'>");
	
		formulario.appendChild(oHidden);
		formulario.appendChild(paginaHidden);
	}
	
	formulario.uiaction.value = accion;
	formulario.pagina.value = numpagina;

	for(i=0; i<campos.length;i++){
		campos[i].value = valores[i];
	}
	
	formulario.submit();
}

/*
 * Envía una acción al servidor incluyendo la información
 * de paginado y además lo hace en una ventana popup.
 */
function enviopaginadopopup(url, formulario, accion, numpagina, campos, valores, ancho, alto, scroll, menubar){

	if (!validateForm(formulario, accion)){
		if(window.event != null)
			window.event.returnValue = false;

		return;
	}

	formulario.target = "popupWindow";

   	miPopup = window.open(url + "/html/Cargando.htm","popupWindow","height=" + alto + ",width=" + ancho + ",toolbar=no,minimize=no,status=no,menubar=" + menubar + ",location=no,scrollbars="+scroll);
	
	if(formulario.uiaction == undefined){
		oHidden = document.createElement("<INPUT TYPE='HIDDEN' NAME='uiaction'>");
		paginaHidden = document.createElement("<INPUT TYPE='HIDDEN' NAME='pagina'>");

		formulario.appendChild(oHidden);
		formulario.appendChild(paginaHidden);
	}
	
	formulario.uiaction.value = accion;
	formulario.pagina.value = numpagina;

	for(i=0; i<campos.length;i++){
		campos[i].value = valores[i];
	}
	formulario.submit();
    
    formulario.target = "_self";
}


/*
 * Envía una acción al servidor incluyendo la información
 * de paginado y además lo hace en una ventana popup.
 */
function enviofechapopup(url, formulario, accion, ancho, alto, formularioDestino, campoFecha){
	
	//if (!validateForm(formulario, accion)){
	//	return;
	//}

	formulario.target = "popupFecha";

	miPopup = window.open(url + "/html/Cargando.htm","popupFecha","height=" + alto + ",width=" + ancho + ",toolbar=no,minimize=no,status=no,menubar=no,location=no,scrollbars=no");

	if(formulario.uiaction == undefined){
		
		oHidden = document.createElement("<INPUT TYPE='HIDDEN' NAME='uiaction'>");
		
		formulario.appendChild(oHidden);
	}

	if(formulario.fechaHidden == undefined){
		fechaHidden = document.createElement("<INPUT TYPE='HIDDEN' NAME='fechaHidden'>"); 
		formHidden = document.createElement("<INPUT TYPE='HIDDEN' NAME='formHidden'>"); 
		formulario.appendChild(fechaHidden);
		formulario.appendChild(formHidden);
	}
	
	formulario.fechaHidden.value = campoFecha;
	formulario.formHidden.value = formularioDestino;
	

	formulario.uiaction.value = accion;
	
	formulario.submit();
	formulario.target = "_self";
}

/**
 * Comprueba si un NIF es correcto
 * @param pNIF NIF que se quiere validar
 * @return 0 - NIF correcto
 *         1 - El número no puede contener caracteres alfabéticos
 *         2 - El número no puede contener decimales
 *         3 - La letra del NIF no puede ser un valor numérico
 *         4 - La letra del NIF no se corresponde con el número indicado
 *         5 - Error no especificado en la ejecución del JavaScript
 */
function isNIF(pNIF){
    var cLetra;
    var cNumero;
    var cPatron;
    var aPatron;
    //var mensaje = "";

    try{
        if(pNIF.length == 7){
        	pNIF = "00" + pNIF;
        }
        if(pNIF.length == 8){
        	pNIF = "0" + pNIF;
        }
        if(pNIF.length < 9) return false;
        // Separamos el número y lo validamos
        cNumero = pNIF.substr(0,pNIF.length -1)
        if (isNaN(cNumero)) {
            //mensaje = errorNIF(1);
            return false;
        }
        cPatron = /["."]/
        aPatron = cPatron.exec(cNumero)
        if (aPatron != null){
            //mensaje = errorNIF(2);
            return false;
        }
        // Separamos la letra y la validamos
        cLetra = pNIF.toUpperCase().substr(pNIF.length -1,1)
        if (!isNaN(cLetra)){
            //mensaje = errorNIF(3);
            return false;
        }
        // Comprueba que la letra se corresponde con el número
        cPatron = new String("TRWAGMYFPDXBNJZSQVHLCKE")
        if (cLetra != cPatron.substr( (parseInt(cNumero,10) % 23), 1)){
            //mensaje = errorNIF(4);
            return false;
        }
    }catch(e){
        //mensaje = errorNIF(5);
        return false;
    }
    //mensaje = errorNIF(0);
    return true;
}

/**
 * Comprueba si un CIF es correcto
 * @param pCIF CIF que se quiere validar
 * @return 0 - CIF Correcto
 *         1 - El CIF no puede ser numérico
 *         2 - La longitud del CIF debe ser de 9 caracteres alfanuméricos
 *         3 - La letra debe ser un caracter alfabético de los siguientes ABCDEFGHKLMPQSX
 *         4 - El número no puede contener caracteres alfabéticos
 *         5 - El número no puede contener decimales
 *         6 - El dígito de control no puede ser un caracter alfabético para
 *             el CIF indicado
 *         7 - El dígito de control no puede tener un valor numérico para el
 *             CIF indicado
 *         8 - El dígito de control no se corresponde con el número de CIF
 *         9 - Error no especificado en la ejecución del JavaScript
 */
function isCIF(pCIF){
   var cNumero             // Número del documento
   var cLetra              // Letra del documento
   var cDigitoControl      // Dígito de control
   var intDigitoControl    // Valor numérico del dígito de control
   var cPatron             // Patrón de una expresión regular
   var aPatron             // Resultado de evaluar el patrón de la expresión regular
   var intPares            // Suma de las posiciones pares
   var intImpares          // Suma de las posiciones impares
   try{
      // Comprueba que sea una cadena todo el documento
      if (!isNaN(pCIF)) return false; // 1

      if (pCIF.length != 9) return false; // 2

      // Separa la letra que identifica el tipo de persona jurídica y la valida
      cLetra = pCIF.toUpperCase().substr(0,1)
      if (!isNaN(cLetra)) return false; // 3
      cPatron = /["ABCDEFGHKLMPQSX"]/
      aPatron = cPatron.exec(cLetra)
      if (aPatron == null) return false; // 3

      // Separa el número del documento y lo valida
      cNumero = pCIF.toUpperCase().substr(1,pCIF.length -2)
      if (isNaN(cNumero)) return false; // 4
      cPatron = /["."]/
      aPatron = cPatron.exec(cNumero)
      if (aPatron != null) return false; // 5

      // Separa el dígito de control
      cDigitoControl = pCIF.toUpperCase().substr(pCIF.length -1,1)

      var intContador   // Variable auxiliar

      // Suma los dígitos de las posiciones pares
      intPares = 0
      for (intContador = 1;intContador < cNumero.length; intContador += 2){
         intPares += parseInt(cNumero.substr(intContador,1),10)
      }

      var intContador2  // Variable auxiliar

      // Realizamos el cálculo de la suma de las posiciones impares
      intImpares = 0
      for (intContador = 0;intContador < cNumero.length; intContador += 2){
         cPatron = (new Number(parseInt(cNumero.substr(intContador,1),10) * 2)).toString()
         for (intContador2 = 0; intContador2 < cPatron.length; intContador2++){
            intImpares += parseInt(cPatron.substr(intContador2,1),10)
         }
      }

      // Calculamos el valor del dígito de control
      cPatron = (new Number(intPares + intImpares)).toString()
      intDigitoControl = 10 - parseInt(cPatron.substr(cPatron.length -1,1),10)
      if (intDigitoControl == 10) intDigitoControl = 0

      if ((cLetra != 'P') && (cLetra != 'X')){
         if (isNaN(cDigitoControl)) return false; // 6
         if (intDigitoControl != parseInt(cDigitoControl)) return false; // 8
      }else{
         if (!isNaN(cDigitoControl)) return 7
         cPatron = new String("JABCDEFGHI")
         if (cDigitoControl != cPatron.substr(intDigitoControl,1)) return false; // 8
      }

   }catch(e){
      return false; // 9
   }
   return true;
}

/*
 * Funciones de Validaciones diversas
 */
function validateNIF(form) {
                var isValid = true;
                var focusField = null;
                var i = 0;
                var fields = new Array();
                oNIF = new nif();
                for (x in oNIF) {
                    var field = form[oNIF[x][0]];
                    if ((field!=null) && (!field.disabled) &&
						(field.type == 'text' ||
                        field.type == 'textarea')) {
                        
                        var iNIF = oNIF[x][2]("nif");
                        if ((field.value.length > 0) && (!isNIF(field.value))) {
                            if (i == 0) {
                                focusField = field;
                            }
                            fields[i++] = oNIF[x][1];
                            isValid = false;
                        }
                    }
                }
                if (fields.length > 0) {
                   focusField.focus();
                   alert(fields.join('\n'));
                }
                return isValid;
}
function validateCIF(form) {
                var isValid = true;
                var focusField = null;
                var i = 0;
                var fields = new Array();
                oCIF = new cif();
                for (x in oCIF) {
                    var field = form[oCIF[x][0]];
                    if ((field!=null) && (!field.disabled) &&
						(field.type == 'text' ||
                        field.type == 'textarea')) {
                        
                        var iCIF = oCIF[x][2]("cif");
                        if ((field.value.length > 0) && (!isCIF(field.value)) && (!isNIF(field.value))) {
                            if (i == 0) {
                                focusField = field;
                            }
                            fields[i++] = oCIF[x][1];
                            isValid = false;
                        }
                    }
                }
                if (fields.length > 0) {
                   focusField.focus();
                   alert(fields.join('\n'));
                }
                return isValid;
}
function validateFloatRange(form) {
                var isValid = true;
                var focusField = null;
                var i = 0;
                var fields = new Array();
                oRange = new floatRange();
                for (x in oRange) {
                    var field = form[oRange[x][0]];
                    
                    if ((field!=null) && (!field.disabled) &&
						((field.type == 'text' ||
                         field.type == 'textarea') &&
                        (field.value.length > 0))) {
                        
                        var fMin = parseFloat(oRange[x][2]("min"));
                        var fMax = parseFloat(oRange[x][2]("max"));
                        var fValue = parseFloat(field.value);
                        if (!(fValue >= fMin && fValue <= fMax)) {
                            if (i == 0) {
                                focusField = field;
                            }
                            fields[i++] = oRange[x][1];
                            isValid = false;
                        }
                    }
                }
                if (fields.length > 0) {
                    focusField.focus();
                    alert(fields.join('\n'));
                }
                return isValid;
            }

function validateByte(form) {
                var bValid = true;
                var focusField = null;
                var i = 0;
                var fields = new Array();
                oByte = new ByteValidations();
                for (x in oByte) {
                	var field = form[oByte[x][0]];
                	
                    if ((field!=null) && (!field.disabled) &&
						(field.type == 'text' ||
                        field.type == 'textarea' ||
                        field.type == 'select-one' ||
						field.type == 'radio')) {

						var value = '';
						// get field's value
						if (field.type == "select-one") {
							var si = field.selectedIndex;
							if (si >= 0) {
								value = field.options[si].value;
							}
						} else {
							value = field.value;
						}
                        
                        if (value.length > 0) {
                            if (!isAllDigits(value)) {
                                bValid = false;
                                if (i == 0) {
                                    focusField = field;
                                }
                                fields[i++] = oByte[x][1];

                            } else {

	                            var iValue = parseInt(value);
	                            if (isNaN(iValue) || !(iValue >= -128 && iValue <= 127)) {
	                                if (i == 0) {
	                                    focusField = field;
	                                }
	                                fields[i++] = oByte[x][1];
	                                bValid = false;
	                            }
                            }
						}
						
                    }
                }
                if (fields.length > 0) {
                   focusField.focus();
                   alert(fields.join('\n'));
                }
                return bValid;
            }
function validateMaxLength(form) {
                var isValid = true;
                var focusField = null;
                var i = 0;
                var fields = new Array();
                oMaxLength = new maxlength();
                for (x in oMaxLength) {
                    var field = form[oMaxLength[x][0]];
                    
                    if ((field!=null) && (!field.disabled) &&
						(field.type == 'text' ||
						field.type == 'password' ||
                        field.type == 'textarea')) {
                        
                        var iMax = parseInt(oMaxLength[x][2]("maxlength"));
                        if (field.value.length > iMax) {
                            if (i == 0) {
                                focusField = field;
                            }
                            fields[i++] = oMaxLength[x][1];
                            isValid = false;
                        }
                    }
                }
                if (fields.length > 0) {
                   focusField.focus();
                   alert(fields.join('\n'));
                }
                return isValid;
            }
function validateNotEquals(form) {
				var isValid = true;
				var focusField = null;
				var i = 0;
				var fields = new Array();
				oNotEquals = new notequals();

				for (x in oNotEquals) {
					var field = form[oNotEquals[x][0]];
                    
					if ((field!=null) && (!field.disabled) &&
						(field.type == 'text' ||
						field.type == 'select-one' ||
						field.type == 'textarea')) {
						var iNot = oNotEquals[x][2]("notequals");
						
						var value = '';
						// get field's value
						if (field.type == "select-one") {
							var si = field.selectedIndex;
							
							if (si >= 0) {
								value = field.options[si].value;
							}
						} else {
							value = field.value;
						}

						if (value == iNot) {
							if (i == 0) {
								focusField = field;
							}
							fields[i++] = oNotEquals[x][1];
							isValid = false;
						}
					}
				}
				if (fields.length > 0) {
				   focusField.focus();
				   alert(fields.join('\n'));
				}
				return isValid;
			}
function validateRequired(form) {
                var isValid = true;
                var focusField = null;
                var i = 0;
                var fields = new Array();

                oRequired = new required();
                for (x in oRequired) {
                	var field = form[oRequired[x][0]];
                	
                	if ((field!=null) && (!field.disabled) && 
                    	(field.type == 'text' ||
                        field.type == 'textarea' ||
                        field.type == 'file' ||
                        field.type == 'select-one' ||
                        field.type == 'radio' ||
                        field.type == 'password')) {
                        
                        var value = '';
						// get field's value
						if (field.type == "select-one") {
						
                        	var si = field.selectedIndex;
							if (si >= 0) {
								value = field.options[si].value;
							}
						} else {
							value = field.value;
						}
                        
                        if (trim(value).length == 0) {
                        	
	                        if (i == 0) {
	                            focusField = field;
	                        }
	                        fields[i++] = oRequired[x][1];
	                        isValid = false;
                        }
                    }
                }
                if (fields.length > 0) {
                   focusField.focus();
                   alert(fields.join('\n'));
                }
                return isValid;
            }
            
            // Trim whitespace from left and right sides of s.
            function trim(s) {
                return s.replace( /^\s*/, "" ).replace( /\s*$/, "" );
            }
function validateInteger(form) {
                var bValid = true;
                var focusField = null;
                var i = 0;
                var fields = new Array();
                oInteger = new IntegerValidations();
                for (x in oInteger) {
                	var field = form[oInteger[x][0]];

                    if ((field!=null) && (!field.disabled) &&
						(field.type == 'text' ||
                        field.type == 'textarea' ||
                        field.type == 'select-one' ||
                        field.type == 'radio')) {
                        
                        var value = '';
						// get field's value
						if (field.type == "select-one") {
							var si = field.selectedIndex;
						    if (si >= 0) {
							    value = field.options[si].value;
						    }
						} else {
							value = field.value;
						}
                        
                        if (value.length > 0) {
                        
                            if (!isAllDigits(value)) {
                                bValid = false;
                                if (i == 0) {
	                                focusField = field;
	                            }
						        fields[i++] = oInteger[x][1];
						        
                            }else if(value < 0){
									if (i == 0) {
										focusField = field;
									}
									fields[i++] = oInteger[x][1];
									bValid = false;
                            }else{
		                    	var iValue = parseInt(value);
		                        if (isNaN(iValue) || !(iValue >= -2147483648 && iValue <= 2147483647)) {
	    	                    	if (i == 0) {
	        	                    	focusField = field;
	            	                }
	                	            fields[i++] = oInteger[x][1];
	                    	        bValid = false;
		                        }
                            }
                        }
                    }
                }
                if (fields.length > 0) {
                   focusField.focus();
                   alert(fields.join('\n'));
                }
                return bValid;
            }

            function isAllDigits(argvalue) {
                argvalue = argvalue.toString();
                var validChars = "0123456789";
                var startFrom = 0;
                if (argvalue.substring(0, 2) == "0x") {
                   validChars = "0123456789abcdefABCDEF";
                   startFrom = 2;
                } else if (argvalue.charAt(0) == "0") {
                   validChars = "01234567";
                   startFrom = 1;
                } else if (argvalue.charAt(0) == "-") {
                    startFrom = 1;
                }
                
                for (var n = startFrom; n < argvalue.length; n++) {
                    if (validChars.indexOf(argvalue.substring(n, n+1)) == -1) return false;
                }
                return true;
            }
function validateRange(form) {
                return validateIntRange(form);
            }
function validateCreditCard(form) {
                var bValid = true;
                var focusField = null;
                var i = 0;
                var fields = new Array();
                oCreditCard = new creditCard();
                for (x in oCreditCard) {
                    if ((field!=null) && (!field.disabled) &&
						((form[oCreditCard[x][0]].type == 'text' ||
                         form[oCreditCard[x][0]].type == 'textarea') &&
                        (form[oCreditCard[x][0]].value.length > 0))) {
                        if (!luhnCheck(form[oCreditCard[x][0]].value)) {
                            if (i == 0) {
                                focusField = form[oCreditCard[x][0]];
                            }
                            fields[i++] = oCreditCard[x][1];
                            bValid = false;
                        }
                    }
                }
                if (fields.length > 0) {
                    focusField.focus();
                    alert(fields.join('\n'));
                }
                return bValid;
            }

            /**
             * Reference: http://www.ling.nwu.edu/~sburke/pub/luhn_lib.pl
             */
            function luhnCheck(cardNumber) {
                if (isLuhnNum(cardNumber)) {
                    var no_digit = cardNumber.length;
                    var oddoeven = no_digit & 1;
                    var sum = 0;
                    for (var count = 0; count < no_digit; count++) {
                        var digit = parseInt(cardNumber.charAt(count));
                        if (!((count & 1) ^ oddoeven)) {
                            digit *= 2;
                            if (digit > 9) digit -= 9;
                        };
                        sum += digit;
                    };
                    if (sum == 0) return false;
                    if (sum % 10 == 0) return true;
                };
                return false;
            }

            function isLuhnNum(argvalue) {
                argvalue = argvalue.toString();
                if (argvalue.length == 0) {
                    return false;
                }
                for (var n = 0; n < argvalue.length; n++) {
                    if ((argvalue.substring(n, n+1) < "0") ||
                        (argvalue.substring(n,n+1) > "9")) {
                        return false;
                    }
                }
                return true;
            }
function validateDate(form) {
               var bValid = true;
               var focusField = null;
               var i = 0;
               var fields = new Array();
               oDate = new DateValidations();
               for (x in oDate) {
                   var value = (form[oDate[x][0]]==null)?null:form[oDate[x][0]].value;
                   var datePattern = oDate[x][2]("datePatternStrict");
                   
                   if(form[oDate[x][0]]==null);
                   else if ((form[oDate[x][0]].type == 'text' ||
                        form[oDate[x][0]].type == 'textarea') &&
                       (value != null) &&
                       (value.length > 0) &&
                       (datePattern.length > 0)) {
                     var MONTH = "MM";
                     var DAY = "dd";
                     var YEAR = "yyyy";
                     var orderMonth = datePattern.indexOf(MONTH);
                     var orderDay = datePattern.indexOf(DAY);
                     var orderYear = datePattern.indexOf(YEAR);
                     if ((orderDay < orderYear && orderDay > orderMonth)) {
                         var iDelim1 = orderMonth + MONTH.length;
                         var iDelim2 = orderDay + DAY.length;
                         var delim1 = datePattern.substring(iDelim1, iDelim1 + 1);
                         var delim2 = datePattern.substring(iDelim2, iDelim2 + 1);
                         if (iDelim1 == orderDay && iDelim2 == orderYear) {
                            dateRegexp = new RegExp("^(\\d{2})(\\d{2})(\\d{4})$");
                         } else if (iDelim1 == orderDay) {
                            dateRegexp = new RegExp("^(\\d{2})(\\d{2})[" + delim2 + "](\\d{4})$");
                         } else if (iDelim2 == orderYear) {
                            dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})(\\d{4})$");
                         } else {
                            dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})[" + delim2 + "](\\d{4})$");
                         }
                         var matched = dateRegexp.exec(value);
                         if(matched != null) {
                            if (!isValidDate(matched[2], matched[1], matched[3])) {
                               if (i == 0) {
                                   focusField = form[oDate[x][0]];
                               }
                               fields[i++] = oDate[x][1];
                               bValid =  false;
                            }
                         } else {
                            if (i == 0) {
                                focusField = form[oDate[x][0]];
                            }
                            fields[i++] = oDate[x][1];
                            bValid =  false;
                         }
                     } else if ((orderMonth < orderYear && orderMonth > orderDay)) {
                         var iDelim1 = orderDay + DAY.length;
                         var iDelim2 = orderMonth + MONTH.length;
                         var delim1 = datePattern.substring(iDelim1, iDelim1 + 1);
                         var delim2 = datePattern.substring(iDelim2, iDelim2 + 1);
                         if (iDelim1 == orderMonth && iDelim2 == orderYear) {
                             dateRegexp = new RegExp("^(\\d{2})(\\d{2})(\\d{4})$");
                         } else if (iDelim1 == orderMonth) {
                             dateRegexp = new RegExp("^(\\d{2})(\\d{2})[" + delim2 + "](\\d{4})$");
                         } else if (iDelim2 == orderYear) {
                             dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})(\\d{4})$");
                         } else {
                             dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})[" + delim2 + "](\\d{4})$");
                         }
                         var matched = dateRegexp.exec(value);
                         if(matched != null) {
                             if (!isValidDate(matched[1], matched[2], matched[3])) {
                                 if (i == 0) {
                                     focusField = form[oDate[x][0]];
                                 }
                                 fields[i++] = oDate[x][1];
                                 bValid =  false;
                              }
                         } else {
                             if (i == 0) {
                                 focusField = form[oDate[x][0]];
                             }
                             fields[i++] = oDate[x][1];
                             bValid =  false;
                         }
                     } else if ((orderMonth > orderYear && orderMonth < orderDay)) {
                         var iDelim1 = orderYear + YEAR.length;
                         var iDelim2 = orderMonth + MONTH.length;
                         var delim1 = datePattern.substring(iDelim1, iDelim1 + 1);
                         var delim2 = datePattern.substring(iDelim2, iDelim2 + 1);
                         if (iDelim1 == orderMonth && iDelim2 == orderDay) {
                             dateRegexp = new RegExp("^(\\d{4})(\\d{2})(\\d{2})$");
                         } else if (iDelim1 == orderMonth) {
                             dateRegexp = new RegExp("^(\\d{4})(\\d{2})[" + delim2 + "](\\d{2})$");
                         } else if (iDelim2 == orderDay) {
                             dateRegexp = new RegExp("^(\\d{4})[" + delim1 + "](\\d{2})(\\d{2})$");
                         } else {
                             dateRegexp = new RegExp("^(\\d{4})[" + delim1 + "](\\d{2})[" + delim2 + "](\\d{2})$");
                         }
                         var matched = dateRegexp.exec(value);
                         if(matched != null) {
                             if (!isValidDate(matched[3], matched[2], matched[1])) {
                                 if (i == 0) {
                                     focusField = form[oDate[x][0]];
                                  }
                                  fields[i++] = oDate[x][1];
                                  bValid =  false;
                              }
                          } else {
                              if (i == 0) {
                                  focusField = form[oDate[x][0]];
                              }
                              fields[i++] = oDate[x][1];
                              bValid =  false;
                          }
                     } else {
                         if (i == 0) {
                             focusField = form[oDate[x][0]];
                         }
                         fields[i++] = oDate[x][1];
                         bValid =  false;
                     }
                  }
               }
               if (fields.length > 0) {
                  focusField.focus();
                  alert(fields.join('\n'));
               }
               return bValid;
            }

	    function isValidDate(day, month, year) {
	        if (month < 1 || month > 12) {
                    return false;
                }
                if (day < 1 || day > 31) {
                    return false;
                }
                if ((month == 4 || month == 6 || month == 9 || month == 11) &&
                    (day == 31)) {
                    return false;
                }
                if (month == 2) {
                    var leap = (year % 4 == 0 &&
                               (year % 100 != 0 || year % 400 == 0));
                    if (day>29 || (day == 29 && !leap)) {
                        return false;
                    }
                }
                return true;
            }

function validateTime(form){
	var isValid = true;
	var focusField = null;
	var i = 0;
	var fields = new Array();
	oTime = new timeValidation();

	for (x in oTime) {
		var field = form[oTime[x][0]];
			
			if ((field!=null) && (!field.disabled) &&
				(field.type == 'text' &&
				field.value.length > 0)) {
                        
					if(field.value.indexOf(":") == -1){
						if (i == 0) {
							focusField = field;
						}
						fields[i++] = oTime[x][1];
						isValid = false;
                    }else{
						var iHours = field.value.substring(0, field.value.indexOf(":"));
						var iMinutes = field.value.substring(field.value.indexOf(":") + 1, field.value.length);
						if(isNaN(iHours) || isNaN(iMinutes)){
							if (i == 0) {
								focusField = field;
							}
							fields[i++] = oTime[x][1];
							isValid = false;
						}else if (iMinutes.length < 2){
							if (i == 0) {
									focusField = field;
								}
							fields[i++] = oTime[x][1];
							isValid = false;
						}else if ((iHours < 0) || (iHours > 23) || (iMinutes < 0 ) || (iMinutes > 59)) {
								if (i == 0) {
									focusField = field;
								}
								fields[i++] = oTime[x][1];
								isValid = false;
						}
                   }
			}
	}

	if (fields.length > 0) {
		focusField.focus();
		alert(fields.join('\n'));
	}
	return isValid;
}

function validateIntRange(form) {
                var isValid = true;
                var focusField = null;
                var i = 0;
                var fields = new Array();
                oRange = new intRange();
                for (x in oRange) {
                    var field = form[oRange[x][0]];
                    
                    if ((field!=null) && (!field.disabled) &&
						((field.type == 'text' ||
                         field.type == 'textarea') &&
                        (field.value.length > 0))) {
                        
                        var iMin = parseInt(oRange[x][2]("min"));
                        var iMax = parseInt(oRange[x][2]("max"));
                        var iValue = parseInt(field.value);
                        if (!(iValue >= iMin && iValue <= iMax)) {
                            if (i == 0) {
                                focusField = field;
                            }
                            fields[i++] = oRange[x][1];
                            isValid = false;
                        }
                    }
                }
                if (fields.length > 0) {
                    focusField.focus();
                    alert(fields.join('\n'));
                }
                return isValid;
            }
function validateShort(form) {
                var bValid = true;
                var focusField = null;
                var i = 0;
                var fields = new Array();
                oShort = new ShortValidations();
                for (x in oShort) {
                	var field = form[oShort[x][0]];
                	
                    if ((field!=null) && (!field.disabled) &&
							(field.type == 'text' ||
                        field.type == 'textarea' ||
                        field.type == 'select-one' ||
                        field.type == 'radio')) {
                        
                        var value = '';
						// get field's value
						if (field.type == "select-one") {
							var si = field.selectedIndex;
							if (si >= 0) {
								value = field.options[si].value;
							}
						} else {
							value = field.value;
						}
                        
                        if (value.length > 0) {
                            if (!isAllDigits(value)) {
                                bValid = false;
                                if (i == 0) {
                                    focusField = field;
                                }
                                fields[i++] = oShort[x][1];

                            } else {
                        
	                            var iValue = parseInt(value);
	                            if (isNaN(iValue) || !(iValue >= -32768 && iValue <= 32767)) {
	                                if (i == 0) {
	                                    focusField = field;
	                                }
	                                fields[i++] = oShort[x][1];
	                                bValid = false;
	                            }
	                       }
                       }
                    }
                }
                if (fields.length > 0) {
                   focusField.focus();
                   alert(fields.join('\n'));
                }
                return bValid;
            }
function validateFloat(form) {
                var bValid = true;
                var focusField = null;
                var i = 0;
                var fields = new Array();
                oFloat = new FloatValidations();
                for (x in oFloat) {
                	var field = form[oFloat[x][0]];
                	
                    if ((field!=null) && (!field.disabled) &&
						(field.type == 'text' ||
                        field.type == 'textarea' ||
                        field.type == 'select-one' ||
                        field.type == 'radio')) {
                        
                    	var value = '';
						// get field's value
						if (field.type == "select-one") {
							var si = field.selectedIndex;
							if (si >= 0) {
							    value = field.options[si].value;
							}
						} else {
							value = field.value;
						}
                        
                        if (value.length > 0) {
                            // remove ',' and '.' before checking digits
							var comaArray = value.split(',');
							var auxiliar = comaArray.join('');
							var dotArray = auxiliar.split('.');
                            var joinedString = dotArray.join('');
                            
                            if (!isAllDigits(joinedString)) {
                                bValid = false;
                                if (i == 0) {
                                    focusField = field;
                                }
                                fields[i++] = oFloat[x][1];

                            } else {
                            	if((value == 0)||(value < 0)){
									if (i == 0) {
										focusField = field;
									}
									fields[i++] = oFloat[x][1];
									bValid = false;
								}else{
	                            	var iValue = parseFloat(value);
	                            	if (isNaN(iValue)) {
	                                	if (i == 0) {
	                                    	focusField = field;
	                                	}
	                                	fields[i++] = oFloat[x][1];
	                                	bValid = false;
	                            	}
	                            }
                            }
                        }
                    }
                }
                if (fields.length > 0) {
                   focusField.focus();
                   alert(fields.join('\n'));
                }
                return bValid;
            }
function validateEmail(form) {
                var bValid = true;
                var focusField = null;
                var i = 0;
                var fields = new Array();
                oEmail = new email();
                for (x in oEmail) {
                    if ((form[oEmail[x][0]].type == 'text' ||
                         form[oEmail[x][0]].type == 'textarea') &&
                        (form[oEmail[x][0]].value.length > 0)) {
                        if (!checkEmail(form[oEmail[x][0]].value)) {
                            if (i == 0) {
                                focusField = form[oEmail[x][0]];
                            }
                            fields[i++] = oEmail[x][1];
                            bValid = false;
                        }
                    }
                }
                if (fields.length > 0) {
                    focusField.focus();
                    alert(fields.join('\n'));
                }
                return bValid;
            }

            /**
             * Reference: Sandeep V. Tamhankar (stamhankar@hotmail.com),
             * http://javascript.internet.com
             */
            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 > 4)) {
                   return false;
               }
               if (len < 2) {
                   return false;
               }
               return true;
            }
function validateMask(form) {
                var isValid = true;
                var focusField = null;
                var i = 0;
                var fields = new Array();
                oMasked = new mask();
                for (x in oMasked) {
                    var field = form[oMasked[x][0]];
                    
                    if ((field!=null) && (!field.disabled) &&
						((field.type == 'text' || 
                         field.type == 'textarea') && 
                         (field.value.length > 0))) {
                        
                        if (!matchPattern(field.value, oMasked[x][2]("mask"))) {
                            if (i == 0) {
                                focusField = field;
                            }
                            fields[i++] = oMasked[x][1];
                            isValid = false;
                        }
                    }
                }
                
                if (fields.length > 0) {
                   focusField.focus();
                   alert(fields.join('\n'));
                }
                return isValid;
            }

            function matchPattern(value, mask) {
               return mask.exec(value);
            }
function validateMinLength(form) {
                var isValid = true;
                var focusField = null;
                var i = 0;
                var fields = new Array();
                oMinLength = new minlength();
                for (x in oMinLength) {
                    var field = form[oMinLength[x][0]];
                    
                    if ((field!=null) && (!field.disabled) &&
						(field.type == 'text' ||
						field.type == 'password' ||
                        field.type == 'textarea')) {
                        
                        var iMin = parseInt(oMinLength[x][2]("minlength"));
                        if ((trim(field.value).length > 0) && (field.value.length < iMin)) {
                            if (i == 0) {
                                focusField = field;
                            }
                            fields[i++] = oMinLength[x][1];
                            isValid = false;
                        }
                    }
                }
                if (fields.length > 0) {
                   focusField.focus();
                   alert(fields.join('\n'));
                }
                return isValid;
}
function validateMatches(form) {
                var isValid = true;
                var focusField = null;
                var i = 0;
                var fields = new Array();
                oMatches = new matches();

                for (x in oMatches) {
                    var field = form[oMatches[x][0]];

                    if ((field!=null) && (!field.disabled) &&
						(field.type == 'text' ||
                        field.type == 'textarea' ||
                        field.type == 'password')) {
                        
                        var iMatches = form[oMatches[x][2]("matches")];
                        var value = '';
                        value = field.value;

                        if (value != iMatches.value) {
                            if (i == 0) {
                                focusField = field;
                            }
                            fields[i++] = oMatches[x][1];
                            isValid = false;
                        }
                    }
                }
                if (fields.length > 0) {
                   focusField.focus();
                   alert(fields.join('\n'));
                }
                return isValid;
}
function validateAfterDate(form){
	var isValid = true;
	var i = 0;
	var fields = new Array();
                
	oAfterDate = new afterDate();

	for (x in oAfterDate) {
		var field = form[oAfterDate[x][0]];
		var field2 = form[oAfterDate[x][2]("afterDate")];

		if ((field!=null) && (!field.disabled) &&
			(field.type == 'text' ||
			field.type == 'textarea' ||
			field.type == 'hidden')) {
                       
		   var fechaIni = new Date(field.value.substring(6, 10), parseInt(field.value.substring(3,5))-1, field.value.substring(0,2), field.value.substring(10, 12), field.value.substring(13));
		   var fechaFin = new Date(field2.value.substring(6, 10), parseInt(field2.value.substring(3,5))-1, field2.value.substring(0,2), field2.value.substring(10, 12), field2.value.substring(13));

		   if(fechaIni > fechaFin){
				fields[i++] = oAfterDate[x][1];
				isValid = false;
		   }
		}
	}
	if (fields.length > 0) {
	   alert(fields.join('\n'));
	}
	return isValid;
}
function validateAfterToday(form) {
                var isValid = true;
                var focusField = null;
                var i = 0;
                var fields = new Array();
                
                oAfterToday = new aftertoday();

                for (x in oAfterToday) {
                    var field = form[oAfterToday[x][0]];

                    if ((field!=null) && (!field.disabled) &&
						(field.type == 'text' ||
                        field.type == 'textarea')) {
                       
                       var iAfterToday = new Date();
                       
                       iAfterToday.setDate(field.value.substring(0,2));
                       iAfterToday.setMonth(parseInt(field.value.substring(3,5)) - 1);
                       iAfterToday.setFullYear(field.value.substring(6));
                       
                       var iToday = new Date();
                       
                        if (iAfterToday < iToday) {
                          if (i == 0) {
                               focusField = field;
                           }
                           fields[i++] = oAfterToday[x][1];
                           isValid = false;
                       }
                    }
                }
                if (fields.length > 0) {
                   focusField.focus();
                   alert(fields.join('\n'));
                }
                return isValid;
}