﻿function validateZipCode(zip){
    var zipCodePattern = /^\d{5}$|^\d{5}-\d{4}$/;
     return zipCodePattern.test(zip);
}

function validatePostalCode(zip){
    var pattern = /^[a-zA-Z]{1}\d{1}[a-zA-Z]{1}\s\d{1}[a-zA-Z]{1}\d{1}$/;
     return pattern.test(zip);
}

function validateEmail(elementValue){
    var pattern = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
     return pattern.test(elementValue);
}

function validatePhoneNumber(elementValue){
    var phoneNumberPattern = /^\(?(\d{3})\)?[- ]?(\d{3})[- ]?(\d{4})(\s[x]\d{1,4})?$/;

    return phoneNumberPattern.test(elementValue);
}

jQuery.fn.validate = function(options) {
    
    var settings = jQuery.extend({
        name: "ValidateUI",
        submit:true,
        /*jquery link who's gonna postback
        .NET specific*/
        postBackLink:null,
        /*when enter key is stroke, submit/postback the form*/
        onEnter:true,
        //function to execute one the form is validated
        onSuccess:null
    }, options);

    var _element = $(this);
    
    //ajout de l'image à droite des inputs
    //apparaît en cas d'erreur
    $('li.required', _element).each(function(){
        //$(this).append('<span class="error-img"></span>');
        
        $('label', this).each(function(obj){
            $(this).html('<span class="mandatory">*</span> ' + $(this).html());
        });
    });
    
    /*$('li.required').each(function(){
        $(this).append('<span class="error-img"></span>');
    });
    
    $('li.optional-required').each(function(){
        $(this).append('<span class="error-img"></span>');
    });
    
   
    $("li.required :input").focus( function(e){
        $(this).parent().removeClass('error');
    });*/
    
    /*$(".numeric").keyup( function(e){
        
        //allow only numbers
        this.value = this.value.replace(/[^\d]/g, '');
        
    });*/
    
    $("form :input").each(function(obj){
        if($(this).attr('mask') != undefined) {
            $(this).mask($(this).attr('mask'));
        }
    });
    
    //validation de tous les email
    function emailExist(emailLi) {
        var result = true;
        
        for(i=0; i<emailLi.length; i++)
        {
            var $requiredInput = $(emailLi[i]).children(':input:first');
            
            var $oldInput = $(emailLi[i]).children(':input.old-value');
            
            if($requiredInput.val() != ""){
                
                //si jai un old value, compare la valeur courante avec lancienne.
                //si elle est différente, valide le email, sinon ne valide pas,
                //sil ny a pas de old value, valide seulement le email
                if(($oldInput.length > 0 && $requiredInput.val() != $oldInput.val()) || $oldInput.length == 0) {
                
                    var s = new JsonCustomer();
                    
                    try
                    {
                    
                        var response = s.ValidateAccount($requiredInput.val());
                        var $infoBulle = $(emailLi).find('.email-already-in-use');
                            
                        if(!response) {
                            result = false;
                            $(emailLi[i]).addClass('error');
                            $infoBulle.show();
                        }
                        else {
                            $(emailLi[i]).removeClass('error');
                            $infoBulle.hide();
                        }
                    }
                    catch(er) {
                        window.location = "/en-us/connection-error/";
                    }
                    
                }
            }
            
        }
        
        return result;
    }
    
    //validation de tous les email
    function validateAllEmail(emailLi) {
        var result = true;
        
        for(i=0; i<emailLi.length; i++)
        {
            //cache l'infobulle
            $(emailLi).find('.email-already-in-use').hide();
            
            var requiredInput = $(emailLi[i]).children(':input');
            var filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
            
            if($(requiredInput).val() != "") {
                if (!filter.test($(requiredInput).val())) { 
                    result = false;
                    $(emailLi[i]).addClass('error');
                }
                else {
                    $(emailLi[i]).removeClass('error');
                }
            }
        }
        
        return result;
    }
    
    function compareAllInput(compareLi){
        var result = true;
        
        for(i=0; i<compareLi.length; i++) {
            
            var input = $(compareLi[i]).children(':input');
            var comparedInput = '#' + $(input).attr('compare');
            var comparedLi = $(comparedInput).parent();
            
            if( $(comparedInput).val() != $(input).val() || ( ( $(compareLi[i]).hasClass('optional-required') || $(compareLi[i]).hasClass('required') ) && input.val() == "" ) ) {
                result = false;
                $(compareLi[i]).addClass('error');
                $(comparedLi).addClass('error');
            }
            else {
                $(compareLi[i]).removeClass('error');
            }
        }
        
        return result;
    }
    
    function validateAllPhone(phoneLi){
        var result = true;
        
        for(i=0; i<phoneLi.length; i++)
        {
            var input = $(phoneLi[i]).children(':input');
            
            if(!validatePhoneNumber( $(input).val()))  {
                result = false;
                $(phoneLi[i]).addClass('error');
            }
            else {
                $(phoneLi[i]).removeClass('error');
            }
        }
        
        return result;
    }
    
    function validateAllZip(ZipLi){
        var result = true;
        
        for(i=0; i<ZipLi.length; i++)
        {
            var input = $(ZipLi[i]).children(':input');
            
            if(!validateZipCode($(input).val())) {
                result = false;
                $(ZipLi[i]).addClass('error');
            }
            else {
                $(ZipLi[i]).removeClass('error');
            }
        }
        
        return result;
    }
    
    function validateAllPostalCode(PostalCode){
        var result = true;
        
        for(i=0; i<PostalCode.length; i++)
        {
            var input = $(PostalCode[i]).children(':input');
            
            if(!validatePostalCode($(input).val())) {
                result = false;
                $(PostalCode[i]).addClass('error');
            }
            else {
                $(PostalCode[i]).removeClass('error');
            }
        }
        
        return result;
    }
    
    function validateAllRequired(requiredLi){
        var result = true;
        
        for(i=0; i<requiredLi.length; i++)
        {   
            
            var requiredInput = $(requiredLi[i]).find(':input');
            var resultLi = true;
            if($(requiredInput[0]).attr("type") == "radio") { resultLi = false; result = false; }
            
            
            
            for(j=0; j<requiredInput.length; j++) {
                
                var type = $(requiredInput[j]).attr('type');
                var value = $(requiredInput[j]).val();
                
                
                
                switch(type) {
                    case 'checkbox':
                        if(!$(requiredInput[j]).attr('checked')) {result = false;resultLi = false;}
                    break;
                    
                    case 'radio':
                        
                        var groupName = $(requiredInput[j]).attr('name');
                        var $radioGroup = $('input[name='+ groupName +']');
                        
                        for(k=0; k<$radioGroup.length; k++) {
                            if($($radioGroup[k]).attr('checked')) {result = true;resultLi = true;}
                        }
                        
                    break;
                    
                    case 'select-one':
                        if(value === "" || value === "0") {result = false;resultLi = false;}
                    break;
                    
                    case 'text':
                        if(value == "" || value == $(requiredInput[j]).attr('title')) {result = false;resultLi = false;}
                    break;
                    
                    case 'file':
                        if(value == "") {result = false;resultLi = false;}
                    break;
                    
                    
                    case 'password':
                        if(value == "") {result = false;resultLi = false;}
                    break;
                    
                    case 'textarea':
                        if(value == "") {result = false;resultLi = false;}
                    break;
                }
            }
            
            
            if(!resultLi) $(requiredLi[i]).addClass('error');
            else $(requiredLi[i]).removeClass('error');
        }
        
        //console.log(result)
        
        return result;
    }
    
    function validateAllOptional(optionalUl) {
        var result = true;
        
        for(i=0; i<optionalUl.length; i++) {
            
            //valider les input optionel si la dépendance est rempli, coché ou sélectionné
            var optionalLi = $(optionalUl[i]).children("li.optional");
            var optionalInput = $(optionalLi).find(':input');
            var type = $(optionalInput).attr('type');
            var validate = false;
            
            switch(type) {
                case 'checkbox':
                    if(optionalInput[0].checked) validate = true;
                break;
            }
            
            //valide les élément requis
            if(validate) {
                
                var requiredLi = $("li.optional-required");
                var resultRequired = validateAllRequired(requiredLi);
                
                //validation de tous les email
                var emailLi = $("li.optional-email");
                var resultEmail = validateAllEmail(emailLi);
                
                //comparaison de deux input
                var compareLi = $("li.optional-compare");
                var resultCompare = compareAllInput(compareLi);
                
                //validation du téléphone
                var phoneLi = $("li.optional-phone");
                var resultPhone = validateAllPhone(phoneLi);
                
                //validation du code postal
                var ZipLi = $("li.optional-zip");
                var resultZip = validateAllZip(ZipLi);
                
                //validation des input optionel, s'il y a lieu
                var optionalUl = $("ul.optional-optional");
                var resultOptional = validateAllOptional(optionalUl);
                
                if(!resultRequired || !resultEmail || !resultCompare || !resultPhone || !resultZip) result = false;
            }
            //enleve la class error
            else {
                $(optionalUl[i]).children("li.error").each(function(){
                    $(this).removeClass('error')
                });
            }
        }
        
        return result;
    }
    
    function isFormValid() {
        
        var requiredLi = $("li.required", _element);
        var resultRequired = validateAllRequired(requiredLi);
        
        //validation de tous les email
        var emailLi = $("li.email", _element);
        var resultEmail = validateAllEmail(emailLi);
        
        //vérifie que l'email est unique
        var emaiExistlLi = $("li.email-exist", _element);
        if(resultEmail) {
            resultEmail = emailExist(emaiExistlLi);
        }
        
        //comparaison de deux input
        var compareLi = $("li.compare", _element);
        var resultCompare = compareAllInput(compareLi);
        
        //validation du téléphone
        var phoneLi = $("li.phone", _element);
        var resultPhone = validateAllPhone(phoneLi);
        
        //validation du zip code
        var ZipLi = $("li.zip", _element);
        var resultZip = validateAllZip(ZipLi);
        
        //validation du code postal
        var PostalCode = $("li.postalcode", _element);
        var resultPostalCode = validateAllPostalCode(PostalCode);
        
        //validation des input optionel, s'il y a lieu
        var optionalUl = $("ul.optional", _element);
        var resultOptional = validateAllOptional(optionalUl);
        
        
        
        /*test de la ligne de code suivante :*/
        if($('li.error', _element).length > 0) {
            $($('li.error :input', _element)[0]).focus();
            return false;
        }
        else {return true;}
    }
    
    if(settings.submit) {
        $(this).bind("submit", isFormValid);
    }
    
    if(settings.onSuccess && settings.postBackLink != null) {
        var $postBackLink = settings.postBackLink;
        
        $postBackLink.click(function(e){
            
            var result = false;
            
            if(isFormValid()) {
                result = settings.onSuccess();
            }
            
            return result;
        });
        
    }
    else if(!settings.submit && settings.postBackLink != null) {
        
        var $postBackLink = settings.postBackLink;
        
        for(i=0; i < $postBackLink.length; i++) {
            var $link = $($postBackLink[i]);
            
            $link.click(function(e){
                var result = isFormValid();
                return result;
            });
        }
        
    }
    
    if(settings.onEnter) {
        
        //add event on enter key
        $('ul.form li input', _element).keydown(function(e){
            var enter = 13;
            
            if(e.which == enter) {
                if(settings.submit) {
                    $('form').submit();
                }
                else if(settings.postBackLink != null) {
                    var args = $(settings.postBackLink).getDoPostBackArgs();
                    
                    if (isFormValid()) {
                        __doPostBack(args.args0, args.args1);
                    }
                }
            }
        });
    }
    return this;

}

jQuery.fn.getDoPostBackArgs = function() {
    var $link = $(this),
        href = $link.attr('href');
    
    
    if(href != '' && href.indexOf('doPostBack') != -1) {
        temp = href.split('(')[1];
        temp = temp.split(')')[0];
        temp = temp.split(',');
    }
    
    
    return {args0: temp[0].replace(/\'/g, ""), args1: temp[1].replace(/\'/g, "")};
}
