﻿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);
}

function initMask() {
    jQuery('li.postalcode input').mask('a9a 9a9');
    jQuery('li.phone input').mask('(999) 999-9999? x9999');
    
    jQuery('input.postalcode').mask('a9a 9a9');
    jQuery('input.phone').mask('(999) 999-9999? x9999');
}

getNormColor = function(color) {
    
    if(color.indexOf('#') != -1) color = color.substring(1,7);
    else color = rgbToHex(color);
    
    return color;
}

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,
        onError:null
    }, options);

    var _element = jQuery(this);
    
    //ajout de l'image à droite des inputs
    //apparaît en cas d'erreur
    jQuery('li.required', _element).each(function(){
        jQuery(this).append('<span class="error-img"></span>');
        
        jQuery('label', this).each(function(obj){
            jQuery(this).html('<span class="mandatory">*</span> ' + jQuery(this).html());
        });
    });
    
    /*jQuery('li.required').each(function(){
        jQuery(this).append('<span class="error-img"></span>');
    });
    
    jQuery('li.optional-required').each(function(){
        jQuery(this).append('<span class="error-img"></span>');
    });
    
   
    jQuery("li.required :input").focus( function(e){
        jQuery(this).parent().removeClass('error');
    });*/
    
    /*jQuery(".numeric").keyup( function(e){
        
        //allow only numbers
        this.value = this.value.replace(/[^\d]/g, '');
        
    });*/
    
    jQuery(":input", _element).each(function(obj){
        if(jQuery(this).attr('mask') != undefined) {
            jQuery(this).mask(jQuery(this).attr('mask'));
        }
    });
    
    //validation de tous les email
    function emailExist(emailLi) {
        var result = true;
        
        for(i=0; i<emailLi.length; i++)
        {
            var $requiredInput = jQuery(emailLi[i]).children(':input:first');
            
            var $oldInput = jQuery(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 = jQuery(emailLi).find('.email-already-in-use');
                            
                        if(!response) {
                            result = false;
                            jQuery(emailLi[i]).addClass('error');
                            $infoBulle.show();
                        }
                        else {
                            jQuery(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
            jQuery(emailLi).find('.email-already-in-use').hide();
            
            var requiredInput = jQuery(emailLi[i]).children(':input');
            var filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
            
            if(jQuery(requiredInput).val() != "") {
                if (!filter.test(jQuery(requiredInput).val())) { 
                    result = false;
                    jQuery(emailLi[i]).addClass('error');
                }
                else {
                    jQuery(emailLi[i]).removeClass('error');
                }
            }
        }
        
        return result;
    }
    
    function compareAllInput(compareLi){
        var result = true;
        
        for(i=0; i<compareLi.length; i++) {
            
            var input = jQuery(compareLi[i]).children(':input');
            var comparedInput = '#' + jQuery(input).attr('compare');
            var comparedLi = jQuery(comparedInput).parent();
            
            if( jQuery(comparedInput).val() != jQuery(input).val() || ( ( jQuery(compareLi[i]).hasClass('optional-required') || jQuery(compareLi[i]).hasClass('required') ) && input.val() == "" ) ) {
                result = false;
                jQuery(compareLi[i]).addClass('error');
                jQuery(comparedLi).addClass('error');
            }
            else {
                jQuery(compareLi[i]).removeClass('error');
            }
        }
        
        return result;
    }
    
    function validateAllPhone(phoneLi){
        var result = true;
        
        for(i=0; i<phoneLi.length; i++)
        {
            var input = jQuery(phoneLi[i]).children(':input');
            
            if(!validatePhoneNumber( jQuery(input).val()))  {
                result = false;
                jQuery(phoneLi[i]).addClass('error');
            }
            else {
                jQuery(phoneLi[i]).removeClass('error');
            }
        }
        
        return result;
    }
    
    function validateAllZip(ZipLi){
        var result = true;
        
        for(i=0; i<ZipLi.length; i++)
        {
            var input = jQuery(ZipLi[i]).children(':input');
            
            if(!validateZipCode(jQuery(input).val())) {
                result = false;
                jQuery(ZipLi[i]).addClass('error');
            }
            else {
                jQuery(ZipLi[i]).removeClass('error');
            }
        }
        
        return result;
    }
    
    function validateAllPostalCode(PostalCode){
        var result = true;
        
        for(i=0; i<PostalCode.length; i++)
        {
            var input = jQuery(PostalCode[i]).children(':input');
            
            if(!validatePostalCode(jQuery(input).val())) {
                result = false;
                jQuery(PostalCode[i]).addClass('error');
            }
            else {
                jQuery(PostalCode[i]).removeClass('error');
            }
        }
        
        return result;
    }
    
    function validateAllRequired(requiredLi){
        var result = true;
        
        for(i=0; i<requiredLi.length; i++)
        {   
            var requiredInput = jQuery(requiredLi[i]).find(':input');
            var resultLi = true;
            
            if(jQuery(requiredInput[0]).attr("type") == "radio") { resultLi = false; result = false; }
            
            for(j=0; j<requiredInput.length; j++) {
                
                var type = jQuery(requiredInput[j]).attr('type');
                var value = jQuery(requiredInput[j]).val();
                
                switch(type) {
                    case 'checkbox':
                        if(!jQuery(requiredInput[j]).attr('checked')) {result = false;resultLi = false;}
                    break;
                    
                    case 'radio':
                        
                        var groupName = jQuery(requiredInput[j]).attr('name');
                        var $radioGroup = jQuery('input[name='+ groupName +']');
                        
                        for(k=0; k<$radioGroup.length; k++) {
                            if(jQuery($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 == jQuery(requiredInput[j]).attr('title')) {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) jQuery(requiredLi[i]).addClass('error');
            else jQuery(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 = jQuery(optionalUl[i]).children("li.optional");
            var optionalInput = jQuery(optionalLi).find(':input');
            var type = jQuery(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 = jQuery("li.optional-required");
                var resultRequired = validateAllRequired(requiredLi);
                
                //validation de tous les email
                var emailLi = jQuery("li.optional-email");
                var resultEmail = validateAllEmail(emailLi);
                
                //comparaison de deux input
                var compareLi = jQuery("li.optional-compare");
                var resultCompare = compareAllInput(compareLi);
                
                //validation du téléphone
                var phoneLi = jQuery("li.optional-phone");
                var resultPhone = validateAllPhone(phoneLi);
                
                //validation du code postal
                var ZipLi = jQuery("li.optional-zip");
                var resultZip = validateAllZip(ZipLi);
                
                //validation des input optionel, s'il y a lieu
                var optionalUl = jQuery("ul.optional-optional");
                var resultOptional = validateAllOptional(optionalUl);
                
                if(!resultRequired || !resultEmail || !resultCompare || !resultPhone || !resultZip) result = false;
            }
            //enleve la class error
            else {
                jQuery(optionalUl[i]).children("li.error").each(function(){
                    jQuery(this).removeClass('error')
                });
            }
        }
        
        return result;
    }
    
    function isFormValid() {
        
        var requiredLi = jQuery("li.required", _element);
        var resultRequired = validateAllRequired(requiredLi);
        
        //validation de tous les email
        var emailLi = jQuery("li.email", _element);
        var resultEmail = validateAllEmail(emailLi);
        
        //vérifie que l'email est unique
        var emaiExistlLi = jQuery("li.email-exist", _element);
        if(resultEmail) {
            resultEmail = emailExist(emaiExistlLi);
        }
        
        //comparaison de deux input
        var compareLi = jQuery("li.compare", _element);
        var resultCompare = compareAllInput(compareLi);
        
        //validation du téléphone
        var phoneLi = jQuery("li.phone", _element);
        var resultPhone = validateAllPhone(phoneLi);
        
        //validation du zip code
        var ZipLi = jQuery("li.zip", _element);
        var resultZip = validateAllZip(ZipLi);
        
        //validation du code postal
        var PostalCode = jQuery("li.postalcode", _element);
        var resultPostalCode = validateAllPostalCode(PostalCode);
        
        //validation des input optionel, s'il y a lieu
        var optionalUl = jQuery("ul.optional", _element);
        var resultOptional = validateAllOptional(optionalUl);
        
        
        
        /*test de la ligne de code suivante :*/
        if(jQuery('li.error', _element).length > 0) {
            jQuery(jQuery('li.error :input', _element)[0]).focus();
            if(settings.onError != null) settings.onError();
            return false;
        }
        else {return true;}
    }
    
    if(settings.submit) {
        jQuery(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 = jQuery($postBackLink[i]);
            
            $link.click(function(e){
                var result = isFormValid();
                
                return result;
            });
        }
        
    }
    
    if(settings.onEnter) {
        
        //add event on enter key
        jQuery('ul.form li input', _element).keydown(function(e){
            var enter = 13;
            
            if(e.which == enter) {
                if(settings.submit) {
                    jQuery('form').submit();
                }
                else if(settings.postBackLink != null) {
                    var args = jQuery(settings.postBackLink).getDoPostBackArgs();
                    
                    if (isFormValid()) {
                        
                        var result = true;
                        if(settings.onSuccess) {
                            result = settings.onSuccess();
                        }
                        
                        if(result) __doPostBack(args.args0, args.args1);
                        
                        return result;
                    }
                    
                    return false;
                }
            }
        });
    }
    return this;

}

jQuery.fn.getDoPostBackArgs = function() {
    var $link = jQuery(this),
        href = $link.attr('href'),
        temp = "";
    
    
    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, "")};
}
