﻿var InputObject = function (name, pattern, required, errorMessage, guideMessage, ctrlv, callback) {
    this.Name = name;
    this.Pattern = pattern;
    this.Required = required;
    this.GuideMessage = guideMessage;
    this.ErrorMessage = errorMessage;
    this.GetElement = function () {
        return $('input[name="' + this.Name + '"],textarea[name="' + this.Name + '"]');
    }
    this.IsValid = false;
    this.IsError = false;
    this.IsHidden = function () { return this.GetElement().attr('type') == 'hidden'; };
    this.IsConfirmation = (this.Name.toLowerCase().indexOf('confirm_') == 0);
    this.GetConfirmElement = function () { return (this.IsConfirmation) ? $('*[name="' + this.Name.substring(8, this.Name.length) + '"]') : null; }
    this.CTRLV = (ctrlv != null) ? ctrlv : true;
    this.callBack = callback;
};

var input_Dictionary = new Array();
var Validation = function () { };
var Guide = function () { };

Validation.IsEnabled = false;
Guide.IsEnabled = false;

Guide.Enable = function () {
    Guide.IsEnabled = true;

    $('input').live('focus', function () {
        if ($(this).attr('type') != 'submit') {
            var top = $(this).position().top;

            if ($(this).attr('name') == 'recaptcha_response_field')
                top = $('#recaptcha_response_field').parent().position().top;

            Guide.Display(Guide.GetMessage($(this)), top);
        }
    });

    $('input:hidden').nextAll('a').bind('click focus', function () {
        var input = $(this).parent().find('input:hidden').eq(0);
        var msg = Guide.GetMessage($(input));
        if(msg.length > 0)
            Guide.Display(msg, $(this).parent().position().top);
    });

    //For Chrome
    $('input:file').bind('click', function () { $(this).focus(); });

    var firstInput = $('.activedAlertError').parent().find('input:text,input:password,input:hidden');

    if ($(firstInput).length > 0 && $(firstInput)[0].tagName == 'INPUT') {
        if ($(firstInput).eq(0).attr('type') == 'hidden') {
            var obj = $(firstInput).eq(0).nextAll('a').eq(0);
            var msg = Guide.GetMessage($(firstInput));
            if (msg.length > 0)
                Guide.Display(msg, $(obj).parent().position().top);
        }
        else {
            if ($.browser.msie && $.browser.version != "6.0")
                $(firstInput).eq(0).focus();
        }
    }
}

Guide.Display = function (message, top) {
    $('.Consigne').show();
    $('.Consigne').html(message).css('top', top - 140 + $('#Cont').position().top);
}

Guide.GetMessage = function (element) {
    var name = null;
    name = $(element).attr('name');

    if (name == undefined)
        name = $(element).attr('id');

    var Message = "";
    $.each(input_Dictionary, function (index, value) {
        if (value.Name == name) {
            Message = value.GuideMessage;
            return false;
        }
    });

    return Message;
}

InputObject.GetInstanceByElement = function (obj) {
    return InputObject.GetInstanceByName($(obj).attr('name'));
}

InputObject.GetInstanceByName = function (name) {
    var Instance = null;
    $.each(input_Dictionary, function (index, value) {
        if (value.Name == name) {
            Instance = value;
            return false;
        }
    });
    return Instance;
}

function event_keycode() {
    if (event.ctrlKey) {
        if ((event.keyCode == 86) || (event.keyCode == 118))
            event.returnValue = false;
    }
}

Validation.Enable = function () {
    Validation.IsEnabled = true;
    $('input').blur();

    $('.clickC').bind('click', function () {
        Validation.CurrentInput = InputObject.GetInstanceByElement($(this).parent().find('input:hidden').eq(0));
        Validation.CurrentOldText = $(Validation.GetCurrentElement()).val();
    });

    $('.L_CMB>li').live('click', function () {
        if (Validation.CurrentInput != null) {
            Validation.CurrentNewText = $(Validation.GetCurrentElement()).val();
            Validation.Execute();
        }
    });

    $('input').bind('focus', function () {
        var inputObj = InputObject.GetInstanceByElement($(this));
        if (inputObj != null) {
            //            if (!inputObj.CTRLV)
            //                document.onkeydown = event_keycode;

            Validation.CurrentInput = inputObj;
            Validation.CurrentOldText = $(this).val();
        }
    });

    $('input').bind('keyup', function () {
        Validation.CurrentInput = InputObject.GetInstanceByElement($(this));
        Validation.CurrentNewText = $(Validation.GetCurrentElement()).val();
        Validation.ValidKey();
    });

    $('.BtnNextTape.submit').bind('click', function () {
        if (Validation.IsEnabled) {
            var condition = false;
            var ar = $(this).attr("class").split(" ");
            for (i = 0; i < ar.length; i++) {
                if (ar[i] != "BtnNextTape" && ar[i] != "submit") {
                    c = "." + ar[i].replace("_", "");
                    o = InputObject.GetInstanceByName($(c).attr("name"));

                    if ($(c).parent().attr("class").indexOf("Active") != -1) {
                        Validation.DeleteMessageFromBody(o.Name + "_msg");
                    }
                    else {
                        var id = o.Name + "_msg";
                        var message = o.ErrorMessage;
                        if (!Validation.IsExist(id)) {
                            $(c).parentsUntil('.Zone').parent().parent().find('.AlertError>ul').append('<li id="' + id + '"></li>');
                        }
                        $('#' + id).text(message);

                        //                    Validation.CurrentInput = o;
                        //                    Validation.AddMessageToBody(o.Name + "_msg", o.ErrorMessage);
                    }
                }
            }

            var bloc = $(this).parent().parent().parent();
            if ($(bloc).find('.AlertError>ul>li').length == 0) {
                $('input[type="submit"]').click();
            }
        }
        else
            $('input[type="submit"]').click();
    });
}

function preNextTape(obj, id) {
    if (Validation.IsEnabled) {
        var bloc = $(obj).parent().parent().parent();
        $(bloc).find('.AlertError>ul').empty();
        $.each($(bloc).find('input:text,input:password,input:hidden,input:file,textarea'), function (index, value) {
            name = $(value).attr("name");
            Validation.CurrentInput = InputObject.GetInstanceByName(name);
            if (Validation.CurrentInput != null) {
                if (Validation.CurrentInput.Required && $(Validation.GetCurrentElement()).attr("disabled") != true) {
                    Validation.CurrentNewText = $(Validation.GetCurrentElement()).val();
                    Validation.Execute();
                }
            }
        });

        if ($(bloc).find('.AlertError>ul>li').length == 0 && !$(obj).hasClass("submit"))
            nextTape(id);
    }
    else
        nextTape(id);
}

Validation.Execute = function () {
    if (Validation.IsValid()) {
        Validation.CurrentOldText = Validation.CurrentNewText;
        Validation.DeleteMessage();
        if (Validation.CurrentInput.callBack != null)
            eval(Validation.CurrentInput.callBack + "()");
    }
    else {
        if (Validation.CurrentInput != null) {
            Validation.AddMessage();
        }
    }
}

Validation.ValidKey = function () {
    var name = $(Validation.GetCurrentElement()).attr('name');

    if (Validation.IsValidKey())
        Validation.CurrentOldText = Validation.CurrentNewText;
    else
        $(Validation.GetCurrentElement()).val(Validation.CurrentOldText);
}

Validation.IsValid = function () {
    if (Validation.CurrentInput.IsConfirmation)
        return $(Validation.GetCurrentElement()).val() == $(Validation.CurrentInput.GetConfirmElement()).val()
    else {
        var Pattern = /.*/;
        $.each(Validation.Patterns, function (index, value) {
            if (value[0] == Validation.CurrentInput.Pattern) {
                Pattern = value[2];
                return false;
            }
        });

        if (Validation.CurrentInput.Name == "Document")
            return Pattern.test(Validation.CurrentNewText);

        if (Validation.CurrentNewText != null)
            return Pattern.test(Validation.CurrentNewText) && Validation.hasSpecialCaractere(Validation.CurrentNewText);
        else
            return false;
    }
}

Validation.InputIsValid = function (name) {
    var instance = InputObject.GetInstanceByName(name);
    if (instance != null) {
        var Pattern = /.*/;
        $.each(Validation.Patterns, function (index, value) {
            if (value[0] == instance.Pattern) {
                Pattern = value[2];
                return false;
            }
        });
        var value = $('input[name="' + name + '"]').val();
        return Pattern.test(value) && Validation.hasSpecialCaractere(value);
    }
}

Validation.ValueIsValid = function (name, value) {
    var instance = InputObject.GetInstanceByName(name);
    if (instance != null) {
        var Pattern = /.*/;
        $.each(Validation.Patterns, function (index, value) {
            if (value[0] == instance.Pattern) {
                Pattern = value[2];
                return false;
            }
        });
        return Pattern.test(value) && Validation.hasSpecialCaractere(value);
    }
}

Validation.hasSpecialCaractere = function (val) {
    var Pattern = /.*/;
    $.each(Validation.Patterns, function (index, value) {
        if (value[0] == "Special") {
            Pattern = value[2];
            return false;
        }
    });

    return Pattern.test(val);
}

Validation.IsValidKey = function () {
    var Pattern = /.*/;

    if (Validation.CurrentInput != null) {
        $.each(Validation.Patterns, function (index, value) {
            if (value[0] == Validation.CurrentInput.Pattern) {
                Pattern = value[1];
                return false;
            }
        });
    }

    return (Validation.CurrentNewText != null && Validation.CurrentNewText.length == 0) || (Pattern.test(Validation.CurrentNewText) && Validation.hasSpecialCaractere(Validation.CurrentNewText));
}

Validation.AddMessage = function () {
    var id = Validation.CurrentInput.Name + '_msg';

    Validation.AddMessageToBody(id, Validation.CurrentInput.ErrorMessage);
}

Validation.AddMessageToBody = function (id, message) {

    if (!Validation.IsExist(id)) {
        //        var bloc = $(Validation.GetCurrentElement()).parentsUntil('.Zone').parent().parent();
        //        if ($(bloc).hasClass("Zone2"))
        //            bloc = $(bloc).parent();

        var bloc = $(Validation.GetCurrentElement()).parentsUntil('.BL_SS');
        $(bloc).find('.AlertError>ul').append('<li id="' + id + '"></li>');
    }


    $('#' + id).text(message);
}

Validation.DeleteMessage = function () {
    if (Validation.CurrentInput != null) {
        var id = Validation.CurrentInput.Name + '_msg';

        if (Validation.IsExist(id))
            Validation.DeleteMessageFromBody(id);
    }
}

Validation.DeleteMessageFromBody = function (id) {
    $('#' + id).remove();
}

Validation.IsExist = function (id) {
    if ($('#' + id).length > 0)
        return true;

    return false;
}

Validation.IsDate = function (year, month, day) {
    month = month - 1;
    year -= (year < 2000) ? 1900 : 0;
    var tempDate = new Date(year, month, day);
    return (tempDate.getYear() == year && tempDate.getMonth() == month && tempDate.getDate() == day);
}

Validation.CurrentInput = null;
Validation.GetCurrentElement = function () {
    if (Validation.CurrentInput != null)
        return Validation.CurrentInput.GetElement();
}
Validation.CurrentNewText = "";
Validation.CurrentOldText = "";
Validation.Input = Validation.InputTextElements + Validation.InputPassword + Validation.InputHidden;
//Validation.Patterns = new Array(
//      new Array("Special", /.*/, /^[^<>?&:=]*$/)
//    , new Array("Word", /^[A-Za-àâéèêôùûçÀÂÉÈÔÙÛÇ ]*$/, /^[A-Za-àâéèêôùûçÀÂÉÈÔÙÛÇ ]{2,}$/) // 1+
//    , new Array("Day", /^\d*$/, /^0{0,1}[1-9]{1}$|^[1-2]{1}[0-9]{1}$|^3{1}[0-1]{1}$/) // de 01 ou 1 a 31
//    , new Array("Month", /^\d*$/, /^0{0,1}[1-9]{1}$|^1[0-2]{1}$/) // de 01 ou 1 a 12
//    , new Array("Year", /^\d*$/, /^19[0-9]{2}$|^20[0-9]{2}$/) // de 1900 a 2099
//    , new Array("YearExpir", /^\d*$|^20[0-5][0-9]$/, /^20[0-5][0-9]$/) // de 2000 a 2050
//    , new Array("YY", /^\d*$|^[0-5][0-9]$/, /^[0-5][0-9]$/) // de 00 a 50
//    , new Array("Email", /^[a-zA-Z0-9_.@]*$/, /^\w+([-_.]\w+)*@\w+([-.]\w+)*\.\w+$/)
//    , new Array("Phone", /^\d*$/, /^[0-9]{9,}$/)
//    , new Array("Text", /^.*$/, /^.{6,}$/)
//    , new Array("Password", /^[a-zA-Z0-9@#$%^&+=_]*$/, /^[a-zA-Z0-9@#$%^&+=_]*(?=.{8,32})(?=.*[a-zA-Z])(?=.*\d)[a-zA-Z0-9@#$%^&+=_]*$/)
//    , new Array("Address", /^.*$/, /^.+$/)
//    , new Array("Account", /^\d*$/, /^\d*(?=.{24})(?=.*\d)\d*$/)
//    , new Array("PostCode", /^[a-zA-Z0-9]*$/, /^[a-zA-Z0-9]{4,8}$/)
//    , new Array("ID", /^[a-zA-Z0-9]*$/, /^[a-zA-Z0-9]+$/)
//    , new Array("Number", /^\d*$/, /^\d+$/)
//    , new Array("all", /.*/, /.+/)
//);
