validator_v2.js

/**
 * Script General de validación. 
 * jQuery es una dependencia para este script
 * Tigra Form Validator - 08/25/2005 (mm/dd/yyyy)
 * {@link http://www.softcomplex.com/products/tigra_form_validator/}
 * @module Validator
 */

/**
*Expresión regular para mostrar y eliminar caracteres no válidos del tipo Alpha
*/
var valAlphaChar = /[^a-zA-ZñÑáÁéÉíÍóÓúÚ\.\-\@\*\;\#\%\/\=\(\)\$\|\?\_\:,\+\{\}\[\]\\\0x0d\d\t\n\r\f\v ]/g

var re_dt = /^(\d{1,2})\-(\d{1,2})\-(\d{4})$/,
re_tm = /^(\d{1,2})\:(\d{1,2})\:(\d{1,2})$/,

/**
*En esta variable se definen las expresiones regulares para los diferentes tipos de validación,
*lo que se configura en la propiedad f
*/
a_formats = {
    'alpha': /^[a-zA-ZñÑáÁéÉíÍóÓúÚ\.\-\@\*\;\#\%\/\=\(\)\$\|\?\_\:,\+\{\}\[\]\\\0x0d\d\t\n\r\f\v ]*$/,
    'alpha2': /^[1-9][0-9]*$/,
    'alpha3': /^[a-zA-Z\. ]*$/,
    'alpha4': /^[a-zA-Z$ \:\-]*$/,
    'alpha5': /^[1-9a-zA-Z]/,
    'alpha6': /^[a-zA-ZñÑáÁéÉíÍóÓúÚ\.\-\@\*\;\#\%\/\=\(\)\$\|\?\_\:,\+\{\}\[\]\\\0x0d\d\t\n\r\f\v ]*$/,
    'alphanum': /^\w+$/,
    'unsigned': /^\d+$/,
    'integer': /^[\+\-]?\d*$/,
    'real': /^[\+\-]?\d*\.?\d*$/,
    'email': /^[\w-\.]+\@[\w\.-]+\.[a-zA-Z]{2,4}$/,
    'emailDL': /^[\w-\.]+\@[\w\.-]+\.[a-zA-Z]{2,9}$/,//Dominios mas largos
    'phone': /^[\d\.\s\-]+$/,
    'date2': /^\d{1,2}(\/)\d{1,2}\1\d{4}$/,
    'regexp': 'regexp',
    'integerRange': /^[\+\-]?\d*$/,
    'floatRange': /^[\-]?[0-9]+\.?[0-9]*$/,
    'float': /^[\-]?[0-9]+\.?[0-9]*$|^[\-]?[0-9]+\,?[0-9]*$/,
    'calificacion': /^([1-4]([\.][0-9]){0,1})$|^([5]([\.][0]){0,1})$/,
    'date': function (s_date) {
        // check format
        if (!re_dt.test(s_date))
            return false;
        // check allowed ranges	
        if (RegExp.$1 > 31 || RegExp.$2 > 12)
            return false;
        // check number of day in month
        var dt_test = new Date(RegExp.$3, Number(RegExp.$2 - 1), RegExp.$1);
        if (dt_test.getMonth() != Number(RegExp.$2 - 1))
            return false;
        return true;
    },
    'time': function (s_time) {
        // check format
        if (!re_tm.test(s_time))
            return false;
        // check allowed ranges	
        if (RegExp.$1 > 23 || RegExp.$2 > 59 || RegExp.$3 > 59)
            return false;
        return true;
    }
},

/**
*En esta variable se definen los mensajes que tendrán cada tipo de validación en a_formats
*lo que se configura en la propiedad f
*/
a_messages = [
	'- No form name passed to validator construction routine<br>',
	'- No array of "%form%" form fields passed to validator construction routine<br>',
	'- El Formulario "%form%" no se encontró en este documento<br>',
	'- Incomplete "%n%" form field descriptor entry. "l" attribute is missing<br>',
	'- No encontramos el campo "%n%" en el formulario "%form%"<br>',
	'- No encontramos el label con tag (id="%t%")<br>',
	'- Can not verify match. Field "%m%" was not found<br>',
    '- %l%<br>',
	'- "%l%" debe tener %mn% caracteres o mas<br>',
	'- "%l%" no debe tener mas de %mx% caracteres<br>',
	'- El valor seleccionado para "%l%" no es valido<br>',
	'- "%l%" debe ser igual a "%ml%"<br>',
	'- "%l%" y "%ml%" no pueden ser 0<br>',
    '- "%l%" debe ser mayor o igual que %mn%<br>',
    '- "%l%" debe ser menor o igual que %mx%<br>',
]

/** 
*Objeto constructor del validator
*@param {string} s_form Id del elemento <form> a validar
*@param {Object} a_fields objeto Json con la configuración de los campos a validar
*@param {Object} o_cfg Objeto Json con la configuración del validator (funcion de alerta, botón a deshabilitar)
*@param {Object} b_fields Objeto con mensajes personalizados de validación
*/
function validator(s_form, a_fields, o_cfg, b_fields) {
    this.f_error = validator_error;
    this.f_alert = function () { return false };
    if(o_cfg && o_cfg.alert){
        if (o_cfg.alert == 1) {
            if (dhtmlx.alert) {
                this.f_alert = function (s_msg) {
                    dhtmlx.alert(s_msg);
                }
            }
            else {
                this.f_alert = function (s_msg) { alert(s_msg); return false };
            }
        }
        if (typeof o_cfg.alert == 'function') {
            this.f_alert = function (s_msg) { o_cfg.alert(s_msg); return false };
        }
    }

    // check required parameters
    if (!s_form)
        return this.f_alert(this.f_error(0));
    this.s_form = s_form;

    if (!a_fields || typeof (a_fields) != 'object')
        return this.f_alert(this.f_error(1));
    this.a_fields = a_fields;

    if (!b_fields || typeof (b_fields) != 'object')
        return this.f_alert(this.f_error(1));
    this.b_fields = b_fields;

    this.a_2disable = o_cfg && o_cfg['to_disable'] && typeof (o_cfg['to_disable']) == 'object'
		? o_cfg['to_disable']
		: [];

    this.exec = validator_exec;
    this.f_disable = validator_disable_fields;

}


/** 
*Ejecutar la validación basado en la configuración
*@param {Boolean} validar2 true para aplicar la validación basada en la configuración
*@returns {Boolean} true si el formulario es válido, false cuando tiene algún problema
*@example 
    //Esta función es renombrada en el objeto validator como exec
    var vf = new validator('form1', of_fields, of_config, bf_fields);

    if (vf.exec(true))
        return true;
    else
        return false;
*/
function validator_exec(validar2) {
    var o_form = document.forms[this.s_form];
    if (!o_form)
    {
        o_form = document.getElementById(this.s_form)
    }
    if (!o_form)
        return this.f_alert(this.f_error(2));

    b_dom = document.body && document.body.innerHTML;

    // check integrity of the form fields description structure
    for (var n_key in this.a_fields) {
        // check input description entry
        this.a_fields[n_key]['n'] = n_key;
        if (!this.a_fields[n_key]['l'])
            return this.f_alert(this.f_error(3, this.a_fields[n_key]));
        if (o_form.elements)
            o_input = o_form.elements[n_key];
        else
            o_input = document.getElementById(n_key);//o_form.children[n_key]
        if (!o_input)
            return this.f_alert(this.f_error(4, this.a_fields[n_key]));
        this.a_fields[n_key].o_input = o_input;
    }

    // reset labels highlight
    if (b_dom){
        for (var n_key in this.a_fields) {
            jQuery($parentJquery(n_key, 'col')).removeClass('has-error');
        }
    }

    var distRadio = false;

    // collect values depending on the type of the input
    for (var n_key in this.a_fields) {
        var s_value = '';
        o_input = this.a_fields[n_key].o_input;
        if (o_input.type == 'checkbox') // checkbox
            s_value = o_input.checked ? o_input.value : '';
        else if (o_input.value && (o_input.length == null || o_input.length == 1)) // text, password, hidden
            s_value = o_input.value;
        else if (o_input.options) // select
            s_value = o_input.selectedIndex > -1
                ? o_input.options[o_input.selectedIndex].value
                : null;
        else if (o_input.length > 0) // radiobuton
        {
            for (var n_index = 0; n_index < o_input.length; n_index++)
                if (n_index < (o_input.length - 1) && o_input[n_index].name != o_input[n_index + 1].name)
                    distRadio = true;

            for (var n_index = 0; n_index < o_input.length; n_index++) {
                if (o_input[n_index].checked) {
                    s_value = o_input[n_index].value;

                    if (!distRadio)
                        break;

                    if (s_value == undefined || s_value == null) {
                        s_value = "";
                    }

                    this.a_fields[o_input[n_index].name]['v'] = s_value.replace(/(^\s+)|(\s+$)/g, '');
                }
            }
        } 

        if (!distRadio) {
            if (s_value == undefined || s_value == null) {
                s_value = "";
            }

            this.a_fields[n_key]['v'] = s_value.replace(/(^\s+)|(\s+$)/g, '');
        }

        distRadio = false;
    }


    // check for errors
    var n_errors_count = 0,
		n_another, o_format_check;
    for (var n_key in this.a_fields) {
        a_formats[this.a_fields[n_key]['f']]
        o_format_check = this.a_fields[n_key]['f'] && a_formats[this.a_fields[n_key]['f']]
			? a_formats[this.a_fields[n_key]['f']]
			: null;

        if (o_format_check == 'regexp') {
            o_format_check = this.a_fields[n_key]['re'];
        }

        // reset previous error if any
        this.a_fields[n_key].n_error = null;

        // check reqired fields
        if (this.a_fields[n_key]['r'] && !this.a_fields[n_key]['v']) {
            this.a_fields[n_key].n_error = 1;
            n_errors_count++;
        }
        // integer range
        else if ((this.a_fields[n_key]['f'] == 'integerRange')) {
            if (!o_format_check.test(this.a_fields[n_key]['v'])) {
                this.a_fields[n_key].n_error = 4;
                n_errors_count++;
            }
            else if (this.a_fields[n_key]['mn'] && this.a_fields[n_key]['v'] != '' && parseInt(this.a_fields[n_key]['v']) < parseInt(this.a_fields[n_key]['mn'])) {
                this.a_fields[n_key].n_error = 7;
                n_errors_count++;
            }
            else if (this.a_fields[n_key]['mx'] && this.a_fields[n_key]['v'] != '' && parseInt(this.a_fields[n_key]['v']) > parseInt(this.a_fields[n_key]['mx'])) {
                this.a_fields[n_key].n_error = 8;
                n_errors_count++;
            }
        }
        else if ((this.a_fields[n_key]['f'] == 'floatRange')) {
            if (!o_format_check.test(this.a_fields[n_key]['v'])) {
                this.a_fields[n_key].n_error = 4;
                n_errors_count++;
            }
            else if (this.a_fields[n_key]['mn'] && this.a_fields[n_key]['v'] != '' && parseFloat(this.a_fields[n_key]['v']) < parseFloat(this.a_fields[n_key]['mn'])) {
                this.a_fields[n_key].n_error = 7;
                n_errors_count++;
            }
            else if (this.a_fields[n_key]['mx'] && this.a_fields[n_key]['v'] != '' && parseFloat(this.a_fields[n_key]['v']) > parseFloat(this.a_fields[n_key]['mx'])) {
                this.a_fields[n_key].n_error = 8;
                n_errors_count++;
            }
        }
        // check length
        else if (this.a_fields[n_key]['mn'] && this.a_fields[n_key]['v'] != '' && String(this.a_fields[n_key]['v']).length < this.a_fields[n_key]['mn']) {
            this.a_fields[n_key].n_error = 2;
            n_errors_count++;
        }
        else if (this.a_fields[n_key]['mx'] && String(this.a_fields[n_key]['v']).length > this.a_fields[n_key]['mx']) {
            this.a_fields[n_key].n_error = 3;
            n_errors_count++;
        }
        // check format
        else if (this.a_fields[n_key]['v'] && this.a_fields[n_key]['f'] && (
			(typeof (o_format_check) == 'function'
			&& !o_format_check(this.a_fields[n_key]['v']))
			|| (typeof (o_format_check) != 'function'
			&& !o_format_check.test(this.a_fields[n_key]['v'])))
			) {
            this.a_fields[n_key].n_error = 4;
            //codigo felipe callejas
            if (this.a_fields[n_key]['f'] == 'alpha') {
                taObj = this.a_fields[n_key]['v'];
                taLength = this.a_fields[n_key]['v'].length;
                oldLength = 0;
                while (oldLength < taLength) { //validate characters
                    tChar = taObj.charAt(oldLength);
                    if (!o_format_check.test(tChar)) {
                        //alert('Caracter no valido['+tChar+'].');
                        //tStr = taObj;
                        //tail = tStr.substring(oldLength+1);
                        //taObj= tStr.substring(0,oldLength) + tail; taLength--;
                        if (typeof (Ver_Detalle) != "undefined")
                            Ver_Detalle(this.a_fields[n_key]['l'], this.a_fields[n_key]['n']);
                        else
                            Ver_DetallePropio(this.a_fields[n_key]['l'], this.a_fields[n_key]['n']);

                        oldLength = taLength;
                    }
                    else
                    { oldLength++; }
                } 
            }
            //--fin codigo felipe callejas
            n_errors_count++;
        }
        // check match	
        else if (this.a_fields[n_key]['m']) {
            for (var n_key2 in this.a_fields)
                if (n_key2 == this.a_fields[n_key]['m']) {
                    n_another = n_key2;
                    break;
                }
            if (n_another == null)
                return this.f_alert(this.f_error(6, this.a_fields[n_key]));
            if (this.a_fields[n_another]['v'] != this.a_fields[n_key]['v']) {
                this.a_fields[n_key]['ml'] = this.a_fields[n_another]['l'];
                this.a_fields[n_key].n_error = 5;
                n_errors_count++;
            }
        }

        // check and	
        else if (this.a_fields[n_key]['and']) {
            for (var n_key2 in this.a_fields)
                if (n_key2 == this.a_fields[n_key]['and']) {
                    n_another = n_key2;
                    break;
                }
            if (n_another == null)
                return this.f_alert(this.f_error(6, this.a_fields[n_key]));
            if (this.a_fields[n_another]['v'] == '0' && this.a_fields[n_key]['v'] == '0') {
                this.a_fields[n_key]['ml'] = this.a_fields[n_another]['l'];
                this.a_fields[n_key].n_error = 6;
                n_errors_count++;
            }
        }
    }


    // collect error messages and highlight captions for errorneous fields
    var s_alert_message = '<b>Por favor diligencie todos los campos obligatorios:</b></br>',
		e_first_error;

    if (n_errors_count) {
        for (var n_key in this.a_fields) {
            var n_error_type = this.a_fields[n_key].n_error,
				s_message = '';

            if (n_error_type)
                s_message = this.f_error(n_error_type + 6, this.a_fields[n_key]);

            if (s_message) {
                //if (!e_first_error)
                //    e_first_error = o_form.elements[n_key];
                if (!e_first_error) {
                    if (n_key.substring(0, 1).toUpperCase() == 'R' || n_key.substring(0, 1).toUpperCase() == 'C')
                        e_first_error = o_form.elements[n_key][0];
                    else
                        e_first_error = o_form.elements[n_key];
                }
                s_alert_message += s_message + "\n";
                // highlighted state parameters assigned here
                if (b_dom && this.a_fields[n_key]) {
                    jQuery($parentJquery(n_key, 'col')).addClass('has-error');
                }
            }
        }
        //		alert(s_alert_message);
        // set focus to first errorneous field
        //		if (e_first_error.focus && e_first_error.type != 'hidden'  && !e_first_error.disabled)
        //			eval("e_first_error.focus()");
        // cancel form submission if errors detected
        //		return false;
    }
    if (validar2) {
        // check integrity2 of the form fields description structure
        for (var n_key in this.b_fields) {
            // check input description entry
            this.b_fields[n_key]['n'] = n_key;
            if (!this.b_fields[n_key]['l'])
                return this.f_alert(this.f_error(3, this.b_fields[n_key]));
            o_input = o_form.elements[n_key];
            if (!o_input)
                return this.f_alert(this.f_error(4, this.b_fields[n_key]));
            this.b_fields[n_key].o_input = o_input;
        }

        // reset2 labels highlight
        if (b_dom)
            for (var n_key in this.b_fields)
                if (this.b_fields[n_key]['t']) {
                    var s_labeltag = this.b_fields[n_key]['t'], e_labeltag = get_element(s_labeltag);
                    if (!e_labeltag)
                        return this.f_alert(this.f_error(5, this.b_fields[n_key]));
                    this.b_fields[n_key].o_tag = e_labeltag;

                    // normal state parameters assigned here
                    e_labeltag.className = 'tfvNormal';
                }


        // collect2 values depending on the type of the input
        for (var n_key in this.b_fields) {
            var s_value = '';
            o_input = this.b_fields[n_key].o_input;
            if (o_input.type == 'checkbox') // checkbox
                s_value = o_input.checked ? o_input.value : '';
            else if (o_input.value) // text, password, hidden
                s_value = o_input.value;
            else if (o_input.options) // select
                s_value = o_input.selectedIndex > -1
				? o_input.options[o_input.selectedIndex].value
				: null;
            else if (o_input.length > 0) // radiobuton
                for (var n_index = 0; n_index < o_input.length; n_index++)
                    if (o_input[n_index].checked) {
                        s_value = o_input[n_index].value;
                        break;
                    }
            this.b_fields[n_key]['v'] = s_value.replace(/(^\s+)|(\s+$)/g, '');
        }


        // check 2 for errors
        //	var n_errors_count = 0,
        //		n_another, o_format_check;
        for (var n_key in this.b_fields) {
            o_format_check = this.b_fields[n_key]['f'] && a_formats[this.b_fields[n_key]['f']]
			? a_formats[this.b_fields[n_key]['f']]
			: null;

            if (o_format_check == 'regexp') {
                o_format_check = this.a_fields[n_key]['re'];
            }

            // reset previous error if any
            this.b_fields[n_key].n_error = null;

            // check reqired fields
            if (this.b_fields[n_key]['r'] && !this.b_fields[n_key]['v']) {
                this.b_fields[n_key].n_error = 1;
                n_errors_count++;
            }
            // check length
            else if (this.b_fields[n_key]['mn'] && this.b_fields[n_key]['v'] != '' && String(this.b_fields[n_key]['v']).length < this.b_fields[n_key]['mn']) {
                this.b_fields[n_key].n_error = 2;
                n_errors_count++;
            }
            else if (this.b_fields[n_key]['mx'] && String(this.b_fields[n_key]['v']).length > this.b_fields[n_key]['mx']) {
                this.b_fields[n_key].n_error = 3;
                n_errors_count++;
            }
            // check format
            else if (this.b_fields[n_key]['v'] && this.b_fields[n_key]['f'] && (
			(typeof (o_format_check) == 'function'
			&& !o_format_check(this.b_fields[n_key]['v']))
			|| (typeof (o_format_check) != 'function'
			&& !o_format_check.test(this.b_fields[n_key]['v'])))
			) {
                this.b_fields[n_key].n_error = 4;
                n_errors_count++;
                //codigo felipe callejas
                if (this.b_fields[n_key]['f'] == 'alpha') {
                    taObj = this.b_fields[n_key]['v'];
                    taLength = this.b_fields[n_key]['v'].length;
                    oldLength = 0;
                    while (oldLength < taLength) { //validate characters
                        tChar = taObj.charAt(oldLength);
                        if (!o_format_check.test(tChar)) {
                            //alert('Caracter no valido['+tChar+'].');
                            //tStr = taObj;
                            //tail = tStr.substring(oldLength+1);
                            //taObj= tStr.substring(0,oldLength) + tail; taLength--;
                            if (typeof (Ver_Detalle) != "undefined")
                                Ver_Detalle(this.b_fields[n_key]['l'], this.b_fields[n_key]['n']);
                            else
                                Ver_DetallePropio(this.b_fields[n_key]['l'], this.b_fields[n_key]['n']);

                            oldLength = taLength;
                        }
                        else
                        { oldLength++; }
                    } 
                }
                //--fin codigo felipe callejas
            }
            // check match	
            else if (this.b_fields[n_key]['m']) {
                for (var n_key2 in this.b_fields)
                    if (n_key2 == this.b_fields[n_key]['m']) {
                        n_another = n_key2;
                        break;
                    }
                if (n_another == null)
                    return this.f_alert(this.f_error(6, this.b_fields[n_key]));
                if (this.b_fields[n_another]['v'] != this.b_fields[n_key]['v']) {
                    this.b_fields[n_key]['ml'] = this.b_fields[n_another]['l'];
                    this.b_fields[n_key].n_error = 5;
                    n_errors_count++;
                }
            }
            // check and	
            else if (this.b_fields[n_key]['and']) {
                for (var n_key2 in this.b_fields)
                    if (n_key2 == this.b_fields[n_key]['and']) {
                        n_another = n_key2;
                        break;
                    }
                if (n_another == null)
                    return this.f_alert(this.f_error(6, this.b_fields[n_key]));
                if (this.b_fields[n_another]['v'] == '0' && this.b_fields[n_key]['v'] == '0') {
                    this.b_fields[n_key]['ml'] = this.b_fields[n_another]['l'];
                    this.b_fields[n_key].n_error = 6;
                    n_errors_count++;
                }
            }
        }

        // collect 2 error messages and highlight captions for errorneous fields
        //var s_alert_message = '',
        //	e_first_error;

        if (n_errors_count) {
            for (var n_key in this.b_fields) {
                var n_error_type = this.b_fields[n_key].n_error,
				s_message = '';

                if (n_error_type)
                    s_message = this.f_error(n_error_type + 6, this.b_fields[n_key]);

                if (s_message) {
                    if (!e_first_error) {
                        if (n_key.substring(0, 1).toUpperCase() == 'R' || n_key.substring(0, 1).toUpperCase() == 'C')
                            e_first_error = o_form.elements[n_key][0];
                        else
                            e_first_error = o_form.elements[n_key];
                    }
                    s_alert_message += s_message + "\n";
                    // highlighted state parameters assigned here
                    if (b_dom && this.b_fields[n_key].o_tag)
                        this.b_fields[n_key].o_tag.className = 'tfvHighlight';
                }
            }
            //dhtmlx.alert(s_alert_message);
            if (s_alert_message != '') {
                this.f_alert(s_alert_message);
                //dhtmlx.alert("Por favor corrija los campos en rojo");
            }

            // set focus to first errorneous field
            if (e_first_error != null) {
                if (e_first_error.focus && e_first_error.type != 'hidden' && !e_first_error.disabled)
                    eval("e_first_error.focus()");
            }
            // cancel form submission if errors detected
            return false;
        }
    }
    else {
        if (s_alert_message == '') {
            for (n_key in this.a_2disable)
                if (o_form.elements[this.a_2disable[n_key]])
                    o_form.elements[this.a_2disable[n_key]].disabled = true;
            return true;
        } else {
            //dhtmlx.alert("Por favor corrija los campos en rojo");

            //s_alert_message=s_alert_message.replace(/[0{1}]/g,'Seleccione ->');//Corregir cuando valida longitud del texto no rremplace
            //dhtmlx.alert(); //Quitado
            this.f_alert(s_alert_message);
            
            return false;
        }

        // set focus to first errorneous field
        //if (e_first_error.focus && e_first_error.type != 'hidden'  && !e_first_error.disabled)
        //		eval("e_first_error.focus()");
        // cancel form submission if errors detected
    }
    /*
    for (n_key in this.a_2disable)
    if (o_form.elements[this.a_2disable[n_key]])
    o_form.elements[this.a_2disable[n_key]].disabled = true;
    */
    this.f_disable(true);

    return true;
}
// fin function validator

function validator_disable_fields(disable) {
    var o_form = document.forms[this.s_form];

    for (n_key in this.a_2disable)
        if (o_form.elements[this.a_2disable[n_key]])
            o_form.elements[this.a_2disable[n_key]].disabled = disable;
}

function validator_error(n_index) {
    try {
        var s_ = a_messages[n_index], n_i = 1, s_key;
        for (; n_i < arguments.length; n_i++)
            for (s_key in arguments[n_i])
                s_ = s_.replace('%' + s_key + '%', arguments[n_i][s_key]);

        s_ = s_.replace('%form%', this.s_form);
        return s_
    } catch (E) {
        console.error(E);
        return '';
    }
}

function get_element(s_id) {
    return (document.all ? document.all[s_id] : (document.getElementById ? document.getElementById(s_id) : null));
}

function Ver_DetallePropio(Campo, Nombre) {
    o_format_check = /^[a-zA-ZñÑáÁéÉíÍóÓúÚ\.\-\@\*\#\%\/\=\(\)\$\&\?\_\:,\+\{\}\[\]\0x0d\d\t\n\r\f\v ]*$/;
    var detallado = "";
    taObj = document.getElementById(Nombre).value;
    taLength = taObj.length;
    oldLength = 0;
    while (oldLength < taLength) { //validate characters
        tChar = taObj.charAt(oldLength);
        if (!o_format_check.test(tChar)) {
            tChar = "<span style='color: #ff0066;font-size: 14px'><b>[" + tChar + "]</b></span>";
            tStr = taObj;
            tail = tStr.substring(oldLength + 1);
            taObj = tStr.substring(0, oldLength) + tail; taLength--;
        }
        else {
            oldLength++;
        }
        detallado += tChar;
    }
    if ($("ver_errorh") != null || $("ver_errorh") != undefined) {
        $("ver_errorh").innerHTML = "<br> Por favor corrija en el campo <b>" + Campo + "</b> los caractes de color que se muestran a continuación entre []: " + detallado;
    } else {
        var msg = "Por favor corrija en el campo " + Campo + " los caractes de color que se muestran a continuación entre []: " + detallado;
        if (this.f_alert)
            this.f_alert(msg);
        else
            alert(msg);
    }
}

function Ocultar_Detalle() {
    TomeObjeto("ver_error").innerHTML = '';
}


function $parentJquery(elemID, parent) {
    var fName = "[name='" + elemID + "']";
    var obj = document.querySelector(fName);

    if (obj == null) {
        obj = document.querySelector('#' + elemID);
    }

    var parents = jQuery(obj).parents();
    for (var i = 0; i < parents.length; i++) {
        if (parents[i].className.indexOf(parent) != -1) {
            return parents[i];
        }
    }

    return null;
}