﻿/* 
Incluir el Script
documentEvents.js
*/

var ITValidate = function (strFormName) {
    strFormName = '#' + strFormName;

    this.addField = addField;
    this.addFieldEqual = addFieldEqual;
    this.frmName = strFormName;

    checkForm(strFormName);
}

function checkForm(strFormName) {
    var oform = $(strFormName);

    oform.attr('isSubmited', 'false'); // Para evitar validaciones antes del submit.
    oform.submit(frmsubmit);
    oform.attr('frmFields', '-');
}

function addFieldEqual(strFieldName, strDivID, strLabelText, strFieldEqual, strFieldType) {
    AddNewFields(this.frmName, strFieldName, strDivID, strLabelText, strFieldEqual, strFieldType);
}

function addField(strFieldName, strDivID, strLabelText, strFieldType) {
    AddNewFields(this.frmName, strFieldName, strDivID, strLabelText, '', strFieldType);
}

function AddNewFields(strFormName, strFieldName, strDivID, strLabelText, strFieldEqual, strFieldType) {
    var oform = $(strFormName);
    var oInput = findFields(oform, strFieldName);

    if (oInput.length > 1 && (oInput[0].type == 'checkbox' || oInput[0].type == 'radio')) {
        var nInput;
        for (var i = 0; i < oInput.length; i++) {
            nInput = findFields(oform, oInput[i].id);
            nInput.click(frmClick);
            newField(strFormName, nInput, strDivID, strLabelText, strFieldEqual, strFieldType, (i == 0));
        }
    } else {
        newField(strFormName, oInput, strDivID, strLabelText, strFieldEqual, strFieldType, true);
    }
}

function newField(strFormName, mInput, strDivID, strLabelText, strFieldEqual, strFieldType, blnAddToList) {
    var oform = $(strFormName);

    mInput.blur(frmBlur);
    mInput.change(frmChange);
    mInput.keyup(frmKeyUp);

    if (!$(strFormName + '.text' + strDivID)) { strDivID = mInput.name; }

    mInput.attr('oErr', strFormName + '_msg' + strDivID);
    mInput.attr('oText', strFormName + '_text' + strDivID);
    mInput.attr('label', strLabelText);
    mInput.attr('fieldType', strFieldType);
    mInput.attr('frmName', strFormName);

    if (strFieldEqual !== '') {
        mInput.attr('inputEqual', strFieldEqual);
        mInput.attr('fieldType', strFieldType + 'isEqual');
    }


    if (blnAddToList == true) {
        var strFields = oform.attr('frmFields');
        if (strFields == '-')
            oform.attr('frmFields', mInput.attr('name') + ',');
        else {
            oform.attr('frmFields', strFields + mInput.attr('name') + ',');
        }
    }
}

function findFields(oForm, strFieldName) {
    var elems = oForm.find('[name="' + strFieldName + '"]')

    if (elems == undefined || elems.length == 0)
        elems = oForm.find('[id="' + strFieldName + '"]')

    return elems;
}

function getFieldType(oForm, oInput) {
    return findFields($('#' + oForm.id), oInput.id).attr('fieldType');
}

function getFieldEqual(oForm, oInput) {
    var nEqual = findFields($('#' + oForm.id), oInput.id).attr('inputEqual');
    var jqLabel = findFields($('#' + oForm.id), nEqual).attr('label');
    var oEqual;

    if (nEqual !== undefined) {
        oEqual = oForm.elements[nEqual];
        oEqual.label = jqLabel;
    }

    return oEqual;
}

function frmFocus(eventObject) {
}

function frmBlur(eventObject) {
    validarValorCampo(eventObject);
}

function frmClick(eventObject) {
    validarValorCampo(eventObject);

    try {
        frmClick_Overrides(eventObject);
    } catch (e) {
    }
}

function frmChange(eventObject) {
    validarValorCampo(eventObject);
}

function frmKeyUp(eventObject) {
    validarValorCampo(eventObject);
}

function validarValorCampo(eventObject) {
    var target = eventObject.target || eventObject.srcElement;
    var oForm = target.form;

    var jqForm = $('#' + oForm.name);
    var isLastSubmit = jqForm.attr('isSubmited')

    if (isLastSubmit == 'true') {
        var msg = ValidarForm(oForm, target);
        IT_MarkField(jqForm.find('#' + target.id), msg);
    }
}

function frmsubmit(eventObject) {
    var blnSubmit = true;
    var blnFocus = false;
    var strMsg = '';

    if (document.MM_ButtonCancelar == true) return;

    var target = eventObject.target || eventObject.srcElement;
    var jqForm = $('form#' + target.name);

    var strFields = jqForm.attr('frmFields');
    jqForm.attr('isSubmited', 'true'); // Para evitar validaciones antes del submit.

    if (strFields !== '-') {
        var elems = strFields.split(','); // ojo, Split devuelve 1 registro de más en blanco al final        
        for (var i = 0; i < elems.length - 1; i++) {
            elem = target.elements[elems[i]];
            strMsg = ValidarForm(target, elem);

            if (elem.length > 1 && (elem[0].type == 'checkbox' || elem[0].type == 'radio')) { // CheckBox, Radio, etc.
                elem = elem[0];
            }

            if (strMsg !== '') {
                blnSubmit = false;
                if (blnFocus == false) {
                    try {
                        elem.focus();
                    } catch (e) {
                        try {
                            $('#oEdit' + elem.name).focus();
                        } catch (e) {
                        }
                    }
                    blnFocus = true;
                }
            }
            IT_MarkField(jqForm.find('#' + elem.id), strMsg);
        }
    }

    if (blnSubmit == false) {
        return false;
    }

}

function PonCursor(oField, intPosicion) {
    try {
        if (oField.createTextRange) {   // IE
            var oRange = oField.createTextRange();
            oRange.moveStart("character", intPosicion);
            oRange.moveEnd("character", intPosicion - oField.value.length);
            oRange.select();
        } else if (oField.setSelectionRange) {  // FF
            oField.setSelectionRange(intPosicion, intPosicion);
        }
    } catch (err) {
    }
}

function ValidarForm(oForm, oField) {
    // Los campos disabled no se chequean.
    if (oField.disabled) return '';
    if (oField.type == 'checkbox') {
        oField = oForm.elements[oField.name];
    }

    if (oField.length > 1 && (oField[0].type == 'checkbox' || oField[0].type == 'radio')) { // CheckBox, Radio, etc.
        for (var j = 0; j < oField.length; j++) {
            strMsg = ValidarField(oField[j], getFieldType(oForm, oField[j]));
            if (strMsg == '') { break; }
        }
        oField = oField[0];
    } else { // Resto
        strMsg = ValidarField(oField, getFieldType(oForm, oField), getFieldEqual(oForm, oField));
    }
    return strMsg;
}

function ValidarField(oField, fieldType, oFieldEqual) {
    var nm, val, p, min, max, error;
    error = '';

    nm = oField.name;
    val = oField.value;

    if (val != "" && val != undefined) {
        var formatoFecha = itCultureName == 'en-US' ? 'mm/dd/yyyy' : 'dd/mm/yyyy';

        if (fieldType.indexOf('isEmail') != -1) {
            p = val.indexOf('@');
            if (p < 1 || p == (val.length - 1)) error = itTraduccion.GetMensaje('form.emailrequired');
        } else if (fieldType.indexOf('isDate') != -1) {
            if (!IT_EsFecha(val)) error = itTraduccion.GetMensaje('form.daterequired', formatoFecha);
        } else if (fieldType.indexOf('isRadio') != -1) {
            if (!oField.checked) error = itTraduccion.GetMensaje('form.radiorequired');
        } else if (fieldType.indexOf('isCheck') != -1) {
            if (!oField.checked) error = itTraduccion.GetMensaje('form.fieldrequired');
        } else if (fieldType.indexOf('isTxUCase') != -1) {
            if (!IT_EsTextoUCase(val)) error = itTraduccion.GetMensaje('form.txtucaseonly');
        } else if (fieldType.indexOf('isTxNum') != -1) {
            if (!IT_EsTextoNumero(val)) error = itTraduccion.GetMensaje('form.txtnumberonly');
        } else if ((p = fieldType.indexOf('isTxMin')) != -1) {
            min = fieldType.substring(p + 7);
            if (val.length < min) error = itTraduccion.GetMensaje('form.txtmin', min, val.length);
        } else if ((p = fieldType.indexOf('isTxMax')) != -1) {
            max = fieldType.substring(p + 7);
            if (val.length > max) error = itTraduccion.GetMensaje('form.txtmax', max, val.length);
        } else if ((p = fieldType.indexOf('isDigMin')) != -1) {
            min = fieldType.substring(p + 8);
            if (!IT_EsDigito(val)) error = itTraduccion.GetMensaje('form.numberonly');
            if (val.length < min) error = itTraduccion.GetMensaje('form.numbermin', min, val.length);
        } else if ((p = fieldType.indexOf('isEqual')) != -1) {
            if (val != oFieldEqual.value) error = itTraduccion.GetMensaje('form.fieldsequal', oFieldEqual.label);
        } else if ((p = fieldType.indexOf('isNumCuenta')) != -1) {
            if (!IT_EsOkCuentaBancaria(val)) error = itTraduccion.GetMensaje('form.numerocuentabancaria');
        } else if (fieldType != 'R') {
            if (!IT_EsNumero(val)) error = itTraduccion.GetMensaje('form.numberrequired');
            if (fieldType.indexOf('inRange') != -1) {
                p = fieldType.indexOf(':');
                min = fieldType.substring(8, p);
                max = fieldType.substring(p + 1);
                if (val < min || max < val) error = itTraduccion.GetMensaje('form.numberrange', min, max);
            }
        }
    }
    else if (fieldType.charAt(0) == 'R') {
        error = itTraduccion.GetMensaje('form.fieldrequired');
    }

    return error;
}

function IT_MarkField(field, strMsg) {
    if (strMsg !== '' && strMsg !== undefined) {
        IT_MarkError(field, strMsg);
    } else {
        IT_UnMarkError(field);
    }
}

function IT_MarkError(field, strMsg) {
    var oText = $(field.attr('oText'));
    var oErr = $(field.attr('oErr'));

    if (!oText.hasClass('error')) {
        oText.addClass('error');
    }

    oErr.html(strMsg);
}

function IT_UnMarkError(field) {
    var oText = $(field.attr('oText'));
    var oErr = $(field.attr('oErr'));

    if (oText.hasClass('error')) {
        oText.removeClass('error');
        oErr.html('');
    }
}


/*************************** Reglas validación ****************************************/
/*******************************************************************/

function IT_EsCheckOk(valor, formato) {
    var expresion = new RegExp(formato);
    return expresion.test(valor);
}

function IT_EsFecha(valor) {
    if (itCultureName == 'en-US') {
        formato = '^([1-9]|0[1-9]|1[012])([\.,/,-])([1-9]|0[1-9]|[12][0-9]|3[01])([\.,/,-])(19[0-9][0-9]|20[0-9][0-9]|[0-9][0-9])$' //Date (mm.dd.yyyy, m/d/yyyy, m-d-yyyy)
    } else {
        formato = '^([1-9]|0[1-9]|[12][0-9]|3[01])([\.,/,-])([1-9]|0[1-9]|1[012])([\.,/,-])(19[0-9][0-9]|20[0-9][0-9]|[0-9][0-9])$' //Date (dd.mm.yyyy, d/m/yyyy, d-m-yyyy)
    }
    return IT_EsCheckOk(valor, formato);
}

function IT_EsTextoNumero(valor) {
    var formato = '^(\\w*)$';
    return IT_EsCheckOk(valor, formato);
}

function IT_EsTexto(valor) {
    var formato = '^([a-zA-Z]*)$';
    return IT_EsCheckOk(valor, formato);
}

function IT_EsTextoUCase(valor) {
    var formato = '^([A-Z]*)$';
    return IT_EsCheckOk(valor, formato);
}

function IT_EsNumero(valor) {
    var formato = '^-?([\\d,\.,\,])*$';
    return IT_EsCheckOk(valor, formato);
}

function IT_EsDigito(valor) {
    var formato = '^(\\d*)$';
    return IT_EsCheckOk(valor, formato);
}


function IT_EsOkCuentaBancaria(valor) {
    var intDesc = valor.length - 20;

    var strEntidad = valor.substring(0 + intDesc, 4 + intDesc);
    var strOficina = valor.substring(4 + intDesc, 8 + intDesc);
    var strControl = valor.substring(8 + intDesc, 10 + intDesc);
    var strNumCuenta = valor.substring(10 + intDesc);

    var chkEntidadOficina = DigitoControl('00' + String(strEntidad) + String(strOficina));
    var chkNumCuenta = DigitoControl(strNumCuenta);

    return (chkEntidadOficina + chkNumCuenta) == strControl;
}


function DigitoControl(valor) {
    var valores = new Array(1, 2, 4, 8, 5, 10, 9, 7, 3, 6);
    var control = 0;

    for (i = 0; i <= 9; i++) {
        control += parseInt(valor.charAt(i)) * valores[i];
    }
    control = 11 - (control % 11);
    if (control == 11) {
        control = 0;
    }
    else {
        if (control == 10) {
            control = 1;
        }
    }
    return String(control);
}


function SetSelectedComboOption(ComboID, setValue) {
    var MyComboObject = document.getElementById(ComboID);
    for (i = 0; i < MyComboObject.options.length; i += 1) {
        if (MyComboObject.options[i].value == setValue) {
            MyComboObject.selectedIndex = i;
            return;
        }
    }
}
