/* ********* Funciones de validacion de formularios ********* */
/*
/* Requiere Prototype JavaScript framework, version 1.6.0.2   */

// Inicia los atributos en el formulario y en los campos
function initialiceForm(p_nameForm){
    var form = $(p_nameForm);

    if(!form.readAttribute("init")){
        form.writeAttribute("init", "true");
        form.getElements().each(function(field) {
            field.writeAttribute("validStatus", "false");
        });
    }
}

// Validacion de formulario
function validateForm(p_nameForm){
    var form = $(p_nameForm);

    // Comprueba que el formulario esté iniciado
    if(!form.readAttribute("init")){
        initialiceForm(p_nameForm);
    }

    var validRemoteField = 0;
    var validError = new Array();
    var count = 0;
    form.getElements().each(function(obj) {

        nameObj = obj.name;
        valueObj = obj.value;
        validType = obj.readAttribute("validType");
        validStatus = obj.readAttribute("validStatus");
        if(validType && (validStatus == "false")){

            statusValidation(nameObj, "init");

            // Deriva a la funcion de validacion correspondiente
            validResult = false;
            switch (validType){
                // Validacion LOCAL
                case "integer":
                    validResult = fieldInteger(valueObj);
                break;

                case "email":
                    validResult = fieldEmail(valueObj);
                break;

                case "required":
                    validResult = fieldRequired(valueObj);
                break;

                case "length":
                    validResult = fieldLength(nameObj);
                break;

                case "select":
                    validResult = fieldSelect(nameObj);
                break;

                case "date":
                    validResult = fieldDate(nameObj);
                break;

                case "equal":
                    validResult = fieldEqual(nameObj);
                break;

                case "check":
                    validResult = fieldCheck(nameObj);
                break;

                // Validacion LOCAL y REMOTA
                case "exist":
                    validResult = fieldExist(nameObj);
                break;

                case "existEmail":
                    validResult = fieldExistEmail(nameObj);
                break;

            }
            if(validResult == true){
                fieldValid(nameObj);
            }
            else{
                validError[count] = validResult;
                fieldInvalid(nameObj, validResult);
            }
        }
        count++;
    });
    if(validError.length == 0){
        return true;
    }
    else{
        return false;
    }
}


/* ********* Funciones que setean el estado de validacion ********* */

function fieldReset(p_nameObj){
    objReset = $(p_nameObj);
    objReset.writeAttribute("validStatus", "false");
    new Form.Element.Observer(objReset, 0.2, function(el, value){
        fieldReset(p_nameObj);
    });
    statusValidation(p_nameObj, "");
}
function fieldValid(p_nameObj){
    objValid = $(p_nameObj);
    objValid.writeAttribute("validStatus", "true");
    new Form.Element.Observer(objValid, 0.2, function(el, value){
        fieldReset(p_nameObj);
    });
    statusValidation(p_nameObj, "valid");
}
function fieldInvalid(p_nameObj, p_error){
    objInvalid = $(p_nameObj);
    objInvalid.writeAttribute("validStatus", "false");
    new Form.Element.Observer(objInvalid, 0.2, function(el, value){
        fieldReset(p_nameObj);
    });
    statusValidation(p_nameObj, p_error);
}


/* ********* Funciones de validacion propiamente dichas ********* */

function fieldCheck(p_nameObj){
    objValid = $(p_nameObj);
    if(objValid.checked){
        return true;
    }
    else{
        return "noCheked";
    }
}
function fieldEqual(p_nameObj){
    objValid = $(p_nameObj);
    objCompare = $(p_nameObj.substring(0,p_nameObj.indexOf("_")));
    if(objCompare.readAttribute("validStatus") == "true"){
        if(objValid.value == objCompare.value){
            return true;
        }
        objValid.value = "";
        return "noEqual";
    }
    objValid.value = "";
    return "noBack";
}
function fieldSelect(p_nameObj){
    objSelect = $(p_nameObj);
    l_index = objSelect.selectedIndex;
    if(objSelect.value == ""){
        return "unSelected";
    }
    if(l_index != -1){
        return true;
    }
    return "unSelected";
}
function fieldDate(p_nameObj){
    return true;
}
// Campo requerido
function fieldRequired(p_string){
    p_string = stringTrim(p_string);
    if(!stringEmpty(p_string)){
        return true;
    }
    return "isEmpty";
}
// Campo numerido entero
function fieldInteger(p_string){
    p_string = stringTrim(p_string);
    if(!stringEmpty(p_string)){
        if((p_string.toString().search(/^-?[0-9]+$/) == 0)){
            return true;
        }
        else{
            return "noInteger";
        }
    }
    return "isEmpty";
}
// Campo e-mail valido
function fieldEmail(p_string){
    p_string = stringTrim(p_string);
    if(!stringEmpty(p_string)){
        if(stringMail(p_string)){
            return true;
        }
        else{
            return "noEmail";
        }
    }
    return "isEmpty";
}

// Campo con largo minimo
function fieldLength(p_nameObj){
    p_obj = $(p_nameObj);
    l_minlength = p_obj.readAttribute("minlength");
    l_value = stringTrim(p_obj.value);
    if(!stringEmpty(l_value)){
        if(l_value.length >= l_minlength){
            return true;
        }
        return "isShort";
    }
    return "isEmpty";
}


/* ********* Funciones de validacion ********* */

// Si existe el campo en la base de datos
function fieldExist(p_nameObj){
    l_obj = $(p_nameObj);
    l_value = stringTrim(l_obj.value);
    if(!stringEmpty(l_value)){
        arguments = l_obj.readAttribute('arguments').toQueryParams();
        arguments['value'] = l_value;
        new Ajax.Request(site_url + arguments.app + '/ajaxvalidate', {
            asynchronous: false,
            method: 'post',
            parameters: arguments,
            onSuccess: function(transport) {
                if(transport.responseText == "true"){
                    result = true;
                }
                else{
                    result = "exist";
                }
            }
        });
    }
    else {
        result = "isEmpty";
    }
    return result;
}

// Si existe el email en la base de datos
function fieldExistEmail(p_nameObj){
    l_obj = $(p_nameObj);
    l_value = stringTrim(l_obj.value);
    if(!stringEmpty(l_value)){
        if(stringMail(l_value)){
            if(!fieldExist(p_nameObj)){
                return "mailExist";
            }
        }
        return "noEmail";
    }
    return "isEmpty";
}


/* ********* Funciones que validan cadenas ********* */

// Email valido
function stringMail(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;
}

// Cadena vacia
function stringEmpty(p_string){
    for(t=0; t < stringTrim(p_string).length; t++){
        if(p_string.charAt(t) != " "){
            return false;
        }
    }
    return true;
}


/* ********* Funciones accesorias de validacion ********* */

// Corta espacios al inicio y final
function stringTrim(string){
    if(string.length > 0){
        string = string.replace(/^s+/, '');
        for (var t = string.length; t > 0; t--) {
            if (/S/.test(string.charAt(t))) {
                string = string.substring(0, t);
                break;
            }
        }
    }
    return string;
}


/* ********* Funcion que muestra el estado de validacion ********* */

var texts = new Array();
texts["noCheked"] = "Selecciona una opcion";
texts["noEqual"] = "No es igual al a la comparacion";
texts["noBack"] = "No se puede comparar";
texts["unSelected"] = "Seleccione una opcion";
texts["isEmpty"] = "Dato obligatorio";
texts["noInteger"] = "No es un numero";
texts["noEmail"] = "No un e-mail valido";
texts["exist"] = "Ya existe";
texts["mailExist"] = "Direccion de mail ya registrada";
texts["isShort"] = "Es corto";

function statusValidation(p_nameObj, p_error){
    p_obj = $(p_nameObj);

    switch (p_error){

        case "valid":
            p_obj.addClassName("ok");
            if(!p_obj.next() || (p_obj.next() && !p_obj.next().hasClassName("stats"))){
                img = new Element('img', { 'src': site_url + 'common/images/ok.gif', 'class': 'stats', 'align': 'top'});
                p_obj.insert({ after : img});
            }
        break;

        case "init":
            p_obj.removeClassName("ok");
            p_obj.removeClassName("error");
        break;

        case "":
            p_obj.removeClassName("ok");
            p_obj.removeClassName("error");
            if(p_obj.next() && p_obj.next().hasClassName("stats")){
                p_obj.next().remove();
            }
        break;

        default:
            p_obj.addClassName("error");
            if(!p_obj.next() || (p_obj.next() && !p_obj.next().hasClassName("stats"))){
                img = new Element('img', { 'src': site_url + 'common/images/error.gif', title:  texts[p_error], 'class': 'stats', 'align': 'top'});
                p_obj.insert({ after : img});
            }
        break;
    }
}

