
//-------------------------------------------------------------------
//string

function LTrim(sString)
{
while (sString.substring(0,1) == ' ')
    sString = sString.substring(1, sString.length);
    return sString;
}
function RTrim(sString)
{
    while (sString.substring(sString.length-1, sString.length) == ' ')
    sString = sString.substring(0,sString.length-1);
    return sString;
}
function Trim(sString)
{
    while (sString.substring(0,1) == ' ')
    sString = sString.substring(1, sString.length);

    while (sString.substring(sString.length-1, sString.length) == ' ')
    sString = sString.substring(0,sString.length-1);
    
    return sString;
}
function Contains (sString, sValue)
{
    return (-1!=sString.indexOf (sValue, 0));
}

//-------------------------------------------------------------------
//validation

var eValidateType = { 
NoEmpty:"NoEmpty", 
Numbers:"Numbers", 
Text:"Text", 
Email:"Email", 
Date:"Date", 
Time:"Time", 
Phone:"Phone",
DNI:"DNI",
SQLInjection:"SQLInjection",
CreditCard:"CreditCard",
PostalCode:"PostalCode",
NotValue:"NotValue"
};

//returns an error message for a give validation type
function GetValidateErrorMessage (name, type)
{
    switch (type)
    {
        case eValidateType.NoEmpty:         return "El campo " + name + " no puede ser vacío.";
        case eValidateType.Numbers:         return "El campo " + name + " sólo puede contener números.";
        case eValidateType.Text:            return "El campo " + name + " sólo puede contener texto.";
        case eValidateType.Email:           return "El campo " + name + " debe ser un email válido.";
        case eValidateType.Date:            return "El campo " + name + " debe ser una fecha válida con formato dd/mm/aaaa.";
        case eValidateType.Time:            return "El campo " + name + " debe ser una hora válida con formato hh:mm:ss.";
        case eValidateType.DNI:             return "El campo " + name + " debe ser un DNI o CIF válido.";
        case eValidateType.SQLInjection:    return "El campo " + name + " no contiene carácteres permitidos";
        case eValidateType.CreditCard:      return "El campo " + name + " debe ser un número de tarjeta válido xxxx-xxxx-xxxx-xxxx";
        case eValidateType.Phone:           return "El campo " + name + " debe ser un número de teléfono válido. (Sólo números, guiones y espacios)";
        case eValidateType.PostalCode:      return "El campo " + name + " debe ser un código postal válido.";                
        case eValidateType.NotValue:        return "El campo " + name + " no es válido.";
    }
}

//returns true if a value passes validation
function ValidateValue (value, type, param)
{
    // http://www.mis-algoritmos.com/ejemplos/regex.php
    // http://www.microsoft.com/spanish/msdn/articulos/archivo/201205/voices/regex.mspx
    
    value = Trim (value); //trim anyway        
                            
    switch (type)
    {
        case eValidateType.NoEmpty:            
                        
            return (value.length>0);
            
        case eValidateType.Email:            
            
            var reg = /(^[0-9a-zA-Z]+(?:[._][0-9a-zA-Z]+)*)@ ([0-9a-zA-Z]+(?:[._-][0-9a-zA-Z]+)*\.[0-9a-zA-Z]{2,3})$/;            
            return (reg.test(value));

        case eValidateType.SQLInjection:            
                        
            //var reg = /((\%3D)|(=))[^\n]*((\%27)|(\')|(\-\-)|(\%3B)|(;))/i;
            //return (reg.test(value));
            return true;

        case eValidateType.CreditCard:
        
            var reg = /^(\d{4}[- ]){3}\d{4}|\d{16}$/;
            return (reg.test(value));
                    
        case eValidateType.Date:
        
            var reg = /^\d{1,2}\/\d{1,2}\/\d{2,4}$/;
            return (reg.test(value));
            
        case eValidateType.Text:
        
            var reg = /^\d{1,8}$/;
            return (reg.test(value));                                             
            
        case eValidateType.DNI:
        
            var reg = /^\d{1,8}$/;
            return (reg.test(value));
            
        case eValidateType.Numbers:
        
            var reg = /(\d{2})(?:\.(\d{0,2}))?/;
            return (reg.test(value));
                                  
        case eValidateType.Time:
        
            var reg = /^(0[1-9]|1\d|2[0-3]):([0-5]\d):([0-5]\d)$/;
            return (reg.test(value));
                                   
        case eValidateType.Phone:
        
            var reg = /(^[0-9\s\+\-])+$/;
            return (reg.test(value));                                                                     
            
        case eValidateType.PostalCode:
        
            var reg = /^([1-9]{2}|[0-9][1-9]|[1-9][0-9])[0-9]{3}$/;
            return (reg.test(value));                                                                                 
            
        case eValidateType.NotValue:
            
            return (value!=param);

        default:
        
            return true;            
    }
}

function ValidateField(el, type, param)
{
    fieldOK = ValidateValue (el.value, type, param);
    
    //show message
    if (!fieldOK)        
        alert (GetValidateErrorMessage (el.name, type))
            
    return fieldOK;        
}

//returns true if all fields passes validation
//function ValidateForm(formname)
function ValidateForm(frm)
{    
    formOK = true;

    //for each form element
    //frm = document.forms [formname];
    for (var i=0; i<frm.length; i++)
    {
        el = frm.elements [i];

        //get validate type       
        type = el.getAttribute("validate");
        param = el.getAttribute("validateparam");        

        //validate - SQLInjection
        validated = ValidateField (el, eValidateType.SQLInjection);
        
        if (!validated)
            formOK = false;                 

        //validate - type
        validated = ValidateField (el, type, param);
        
        if (!validated)
            formOK = false;                 
        
    }        
    
    //submit the form?
    //alert (ok);
    return formOK;

}