﻿/* 
Incluir el Script
documentEvents.js
*/

var ITValidate = function(strFormName) {
    this.addField = addField;
    this.addFieldEqual = addFieldEqual;
    this.frmName = strFormName;

    checkForm(strFormName);
}

function checkForm(strFormName) {
    $(strFormName).setProperty('isSubmited', 'false'); // Para evitar validaciones antes del submit.
    $(strFormName).addEvent('submit', frmsubmit);
    $(strFormName).setProperty('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 oInput = $(strFormName).elements[strFieldName];

    if (oInput.length > 1 && (oInput[0].type == 'checkbox' || oInput[0].type == 'radio')) {
        var nInput;
        for (var i = 0; i < oInput.length; i++) {
            nInput = $(strFormName).getElementById(oInput[i].id);
            nInput.addEvent('click', frmClick);
            newField(strFormName, nInput, strDivID, strLabelText, strFieldEqual, strFieldType, (i == 0));
        }
    } else {
        newField(strFormName, oInput, strDivID, strLabelText, strFieldEqual, strFieldType, true);
    }
}

function newField(strFormName, oInput, strDivID, strLabelText, strFieldEqual, strFieldType, blnAddToList) {
    var mInput = $(oInput);

    mInput.addEvent('blur', frmBlur);
    mInput.addEvent('change', frmChange);
    mInput.addEvent('keyup', frmKeyUp);

    if (!$(strFormName + '.text' + strDivID)) { strDivID = mInput.name; }

    mInput.oErr = $(strFormName + '.msg' + strDivID);
    mInput.oText = $(strFormName + '.text' + strDivID);
    mInput.label = strLabelText;
    mInput.fieldType = strFieldType;
    mInput.setProperty('frmName', strFormName);

    if (strFieldEqual !== '') {
        var mInputEqual = $(strFieldEqual);
        mInput.inputEqual = mInputEqual;
        mInput.fieldType = strFieldType + 'isEqual';
    }


    if (blnAddToList == true) {
        var strFields = $(strFormName).getProperty('frmFields');
        if (strFields == '-')
            $(strFormName).setProperty('frmFields', mInput.name + ',');
        else {
            $(strFormName).setProperty('frmFields', strFields + mInput.name + ',');
        }
    }
}

function frmFocus(event) {
}

function frmBlur(event) {
    validarValorCampo(event);
}

function frmClick(event) {
    validarValorCampo(event);

    try {
        frmClick_Overrides(event);
    } catch (e) {
    }
}

function frmChange(event) {
    validarValorCampo(event);
}

function frmKeyUp(event) {
    validarValorCampo(event);
}

function validarValorCampo(event) {
    var type = event.type;
    var target = event.target || event.srcElement;
    var isLastSubmit = $(target).form.getProperty('isSubmited');

    if (isLastSubmit == 'true') {
        var msg = ValidarForm(target, target.fieldType);
        IT_MarkField(target, msg);
    }
}

function frmsubmit(event) {
    var blnSubmit = true;
    var blnFocus = false;
    var strMsg = '';

    if (document.MM_ButtonCancelar == true) return;

    var type = event.type;
    var target = event.target || event.srcElement;

    var strFields = $(target.name).getProperty('frmFields');
    $(target.name).setProperty('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(elem, elem.fieldType);

            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.name).focus();
                    } catch (e) {
                        try {
                            $('oEdit' + elem.name).focus();
                        } catch (e) {
                        }
                    }
                    blnFocus = true;
                }
            }
            IT_MarkField(elem, strMsg);
        }
    }

    if (blnSubmit == false) {
        event.stop();
    }

}

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(oField, fieldType) {
    // Los campos disabled no se chequean.
    if (oField.disabled) return '';
    if (oField.type == 'checkbox') {
        var oForm = $(oField.getProperty('frmName'))
        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], oField[j].fieldType);
            if (strMsg == '') { break; }
        }
        oField = oField[0];
    } else { // Resto
        strMsg = ValidarField(oField, fieldType);
    }
    return strMsg;
}

function ValidarField(oField, fieldType) {
    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 != oField.inputEqual.value) error = itTraduccion.GetMensaje('form.fieldsequal', oField.inputEqual.label);
        } else if ((p = fieldType.indexOf('isNumCuenta')) != -1) {
            if (!IT_EsOkCuentaBancaria(val)) error = itTraduccion.GetMensaje('form.numerocuentabancaria');
        /* 3.0.9#lunadepapel */
        } else if (fieldType.indexOf('isFormEvento') != -1) {
        } 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') {
        /* 3.0.9#lunadepapel */
        if (fieldType.indexOf('isFormEvento') != -1) error = itTraduccion.GetMensaje('form.eventorequired');
        else 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.oText.id);
    var oErr = $(field.oErr.id);

    if (!oText.hasClass('error')) {
        oText.addClass('error');
    }

    oErr.set('html', strMsg);
}

function IT_UnMarkError(field) {
    var oText = $(field.oText.id);
    var oErr = $(field.oErr.id);

    if (oText.hasClass('error')) {
        oText.removeClass('error');
        oErr.set('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;
        }
    }
}

//3.0.14#lunadepapel
function InputInterfaz(strIdInputHtml, strIdSelectHtml, strIdBtnMinus, strIdBtnPlus, strIdDiv) {
    this.objInputHtml = $(strIdInputHtml);
    this.objSelectHtml = $(strIdSelectHtml);
    this.objBtnPlus = $(strIdBtnPlus);
    this.objBtnMinus = $(strIdBtnMinus);
    this.objDiv = $(strIdDiv);
    var objInstancia = this;
    this.arrayListaValores = new Array();

    this.AddListaValores = function(strIdListaValores, strListaValores) {
        this.arrayListaValores[strIdListaValores] = strListaValores;
        if (this.objSelectHtml.value == strIdListaValores) this.SetValores(strIdListaValores);
    }
    this.SetValores = function(strIdListaValores) {
        if (strIdListaValores > 0) {
            this.arrayValores = this.arrayListaValores[strIdListaValores].split(',');
            this.strIdListaValoresActual = strIdListaValores;
            this.intCantidadValores = this.arrayValores.length;
            this.Reset();
        }
        else this.Clear();
    }
    this.BtnPlus = function() {
        this.ValidarValor();
        if (this.intPosListaValores < this.intCantidadValores - 1) {
            this.intPosListaValores += 1;
            this.ModificaInput();
        }
    }
    this.BtnMinus = function() {
        this.ValidarValor();
        if (this.intPosListaValores > 0) {
            this.intPosListaValores -= 1;
            this.ModificaInput();
        }
    }
    this.ValidarValor = function() {
        if (this.intCantidadValores > 0) {
            var intIndice = this.arrayValores.indexOf(this.objInputHtml.value);
            if (intIndice == -1) this.Reset();
            else {
                this.intPosListaValores = intIndice;
                this.ModificaInput();
            }
        }
        else this.Clear();
    }
    this.Reset = function() {
        this.intPosListaValores = 0;
        this.ModificaInput();
    }
    this.Clear = function() {
        this.objInputHtml.value = '';
        this.arrayValores = null;
        this.intCantidadValores = 0;
        this.intPosListaValores = 0;
        this.objBtnMinus.setStyle('visibility', 'visible');
        this.objBtnPlus.setStyle('visibility', 'visible');
    }
    this.ModificaInput = function() {
       this.objInputHtml.value = this.arrayValores[this.intPosListaValores];
       this.VisibilidadBtns();
    }
    this.VisibilidadBtns = function() {
        strVisibilityMinus = this.objBtnMinus.getStyle('visibility');
        strVisibilityPlus = this.objBtnPlus.getStyle('visibility');

        if (this.intPosListaValores == 0 && strVisibilityMinus != 'hidden') this.objBtnMinus.setStyle('visibility', 'hidden');
        else if (this.intPosListaValores > 0 && strVisibilityMinus == 'hidden') this.objBtnMinus.setStyle('visibility', 'visible');

        if (this.intPosListaValores == this.intCantidadValores - 1 && strVisibilityPlus != 'hidden') this.objBtnPlus.setStyle('visibility', 'hidden');
        else if (this.intPosListaValores != this.intCantidadValores - 1 && strVisibilityPlus == 'hidden') this.objBtnPlus.setStyle('visibility', 'visible');
    }

    //Manipulación de eventos
    this.objBtnMinus.addEvent('click', function() {
        objInstancia.BtnMinus();
    });
    this.objBtnPlus.addEvent('click', function() {
        objInstancia.BtnPlus();
    });
    this.objSelectHtml.addEvent('change', function() {
        objInstancia.SetValores(this.value);
    });
    this.objInputHtml.addEvent('keyup', function(e) {
        if (e.key == 'up') objInstancia.BtnPlus();
        if (e.key == 'down') objInstancia.BtnMinus();
    });
    this.objInputHtml.addEvent('change', function() {
        objInstancia.ValidarValor()
    });

    //Manipulación de estilos
    this.objSelectHtml.setStyle('width', '80%');
    this.objSelectHtml.setStyle('float', 'left');
    this.objDiv.setStyle('display', 'block');
}
