$(document).ready(function(){

    document.ksValidatorMannager = Object();
    document.ksValidatorMannager.messageIsDefined = function(params) {
        return params.message != undefined && params.message != '';
    }

    //ESTO MISMO ES LO QUE HAY QUE HACER EN LOS JS QUE SE AGREGAN
    document.ksValidatorMannager.lenghtValidator = function(fieldControl, params) {
        //Obtención de los valores necesarios del control
        var value = fieldControl.getValue();

        //Casos en los que no se validará
        if (value == null)
            return null;

        //Definición del mensaje a utilizar en caso de falla
        var message;
        if (document.ksValidatorMannager.messageIsDefined(params))
            message = params.message;
        else {
            if (params.min != undefined && params.max != undefined)
                message = KsTranslations.Elcampo + " '" + fieldControl.getLabel() + "' " + KsTranslations.DebeTenerEntre + " " + params.min + " y " + params.max + " " + KsTranslations.Caracteres + ".";
            else if (params.max != undefined)
                message = KsTranslations.Elcampo + " '" + fieldControl.getLabel() + "' " + KsTranslations.DebeTenerMenosDe + " " + params.max + " " + KsTranslations.Caracteres + ".";
            else if (params.min != undefined)
                message = KsTranslations.Elcampo + " '" + fieldControl.getLabel() + "' " + KsTranslations.DebeTenerMasDe + " " + params.min + " " + KsTranslations.Caracteres + ".";
            else
                message = KsTranslations.LaCantidadDeCaracteresDelCampo + " '" + fieldControl.getLabel() + "' " + KsTranslations.NoEsValida ;
        }

        //Casos en que falla
        if (params.min != undefined && value.length < params.min)
            return message;
        if (params.max != undefined && value.length > params.max)
            return message;

        //Validación OK
        return null;
    }

    document.ksValidatorMannager.emailValidator = function(fieldControl, params) {
        //Obtención de los valores necesarios del control
        var value = fieldControl.getValue();

        //Casos en los que no se validará
        if (value == null && value == '')
            return null;

        //Definición del mensaje a utilizar en caso de falla
        var message;
        if (document.ksValidatorMannager.messageIsDefined(params))
            message = params.message;
        else
            message = KsTranslations.Elcampo + " '" + fieldControl.getLabel() + "' " + KsTranslations.DebeSerUnaDireccionDeMailValida + ".";

        //Casos en que falla
        if (!(/^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])$/.test(value)))
            return message;

        //Validación OK
        return null;
    }

    document.ksValidatorMannager.numericValidator = function(fieldControl, params) {
        //Obtención de los valores necesarios del control
        var value = fieldControl.getValue();

        //Casos en los que no se validará
        if (value == null && value == '')
            return null;

        //Definición del mensaje a utilizar en caso de falla
        var message;
        if (document.ksValidatorMannager.messageIsDefined(params))
            message = params.message;
        else
            message = KsTranslations.Elcampo + " '" + fieldControl.getLabel() + "' " + KsTranslations.DebeSerNumerica;

        //Casos en que falla
        if (!(/^[-+]?\d+(\.\d+)?$/.test(value)))
            return message;

        //Validación OK
        return null;
    }

    document.ksValidatorMannager.requiredValidator = function(fieldControl, params) {
        //Obtención de los valores necesarios del control
        var value = fieldControl.getValue();

        //Casos en los que no se validará
        //

        //Definición del mensaje a utilizar en caso de falla
        var message;
        if (document.ksValidatorMannager.messageIsDefined(params))
            message = params.message;
        else {
            message = KsTranslations.Elcampo + " '" + fieldControl.getLabel() + "' " + KsTranslations.NoPuedeEstarVacio + ".";
        }

        //Casos en que falla
        if (value == null || value == "")
            return message;

        //Validación OK
        return null;
    }
});

function FieldControl(control) {
    control.wasValidated = false;

    control._onChangeValueEvents = new Array();

    control.ChangeValue = function(func) {
        var $form = $(control).parents(".ksform");
        if ($form.length == 1) {
            var form = $form[0];
            if (form.FieldChange != undefined)
                form.FieldChange(control, control.getValue());
        }
        if (func == undefined)
            for (i=0; i<control._onChangeValueEvents.length; i++)
                control._onChangeValueEvents[i](control.getValue());
        else
            control._onChangeValueEvents[control._onChangeValueEvents.length] = func;
    }

    control.getLabel = function() {
        var label = $(control).find('label');
        if (label.length > 0)
            return $(control).find('label').html().replace(':', '');
        else
            return control.id;
    }

    control.clearChangeValueEvent = function() {
        control._onChangeValueEvents = new Array();
    }
    
    control.getOriginalValue = function() {
        var json = $(control).find('#original_value').val();
        return eval('(' + json + ')');
    }

    control.getValue = function() {
        var json = $(control).find('#actual_value').val();
        return eval('(' + json + ')');
    }

    control.Validate = function() {
        control.wasValidated = true;
        var inputvalidators = $(control).find('#validators');
        var validationErrors = new Array();
        if (inputvalidators.length > 0) {
            var validators = eval(inputvalidators.val());
            for (var i in validators) {
                var validation =
                    document.ksValidatorMannager[validators[i].name](
                        control,
                        validators[i].params);
                if (validation != null)
                    validationErrors.push(validation);
            }
        }

         if (validationErrors.length > 0) 
             control.ValidationError(validationErrors);
         else
             control.ValidationOK();

        return validationErrors;
    }

    control.ValidationOK = function() {
        $(control).removeClass('ks_validator_error ui-state-error');
        var validationresult = $(control).find('.validationresult');
        if (validationresult.length > 0) {
            validationresult.find("a").attr('title', 'OK');
            validationresult.find("span").html('OK');
            var spanicon = validationresult.find("span.icon");
            spanicon.removeClass("ui-icon ui-icon-alert");
            spanicon.addClass("ui-icon ui-icon-check");
        }
    }

    control.ValidationError = function(validationErrors) {
        $(control).addClass('ks_validator_error');
        var validationresult = $(control).find('.validationresult');

        var textoValidacion = "";
        for (var i in validationErrors) {
            if (textoValidacion != "")
                textoValidacion = textoValidacion + "<br/>";
            textoValidacion = textoValidacion + "\u2022 " + validationErrors[i];
        }
        
        if (validationresult.length == 0) {
            var mainInputName = '';
            var mainInput = $(control).find('.mainInput');
            if (mainInput.length == 1)
                mainInputName = mainInput.attr('id');
            validationresult = $(control)
                                    .append('<label class="validationresult ui-state-error" for="' + mainInputName + '"><a name="validationresult-' + control.id + '" class="tooltip_error"><span class="icon"/><span class="text"></span></a></label>')
                                    .find('.validationresult');
        }
        var a = validationresult.find('a');
        a.attr('title', textoValidacion);
        a.tooltip({
            track: true,
            delay: 0,
            showURL: false,
            showBody: " - ",
            extraClass: "error",
            fade: 250
        });
        validationresult.find("span.text").html(textoValidacion);
        var spanicon = validationresult.find("span.icon");
        spanicon.removeClass("ui-icon ui-icon-check");
        spanicon.addClass("ui-icon ui-icon-alert");
    }

    control.setValue = function(value) {
        //evaluar si el hidden solovisualizacion es true no ejecutar este codigo
        if($(control).find('#solovisualizacion').val()!='true'){
            var prev = control.getValue();
            if (value != prev) {
                $(control).find('#actual_value').val(JSON.stringify(value));                
                control.ChangeValue();
                if (control.wasValidated)
                    control.Validate();
                control.redrawValue(value);
            }
        }
        
    }
    control.redrawValue=function(value){}
    control.isChanged = function() {
        var originalvalue = this.getOriginalValue();
        var newvalue = this.getValue();
        return (originalvalue != newvalue);
    }

    control.refreshValue = function() {
        /*if (console != undefined && console.debug != undefined)
            console.debug('control.refreshValue no definido');*/
    };

    //TODO: hacer esto con eventos
    if (!$.isFunction(control.userAcceptKey)) {
        control.userAcceptKey = function() { };
    }
    if (!$.isFunction(control.userCancelKey)) {
        control.userCancelKey = function() { };
    }

    control.acceptChanges = function() {
        $(control).find('#original_value').val($(control).find('#actual_value').val());
    }

    control.clearValue = function() {
        control.wasValidated = false;
        control.setValue(control.getOriginalValue());
    }
}


$(document).ready(function() {
    $('.FieldControl').each(function(){        
        FieldControl(this);
    });
});
