﻿//auto registry form validator
$(document).ready(function () {
    $("form").each(function () {
        AddFormValidator($(this));
        }
    )
});

function AddFormValidator(form) {
        //create validator from the form
        form.validate({
            errorLabelContainer: form.find(".validateMessageContainer")
        });
        addRules(form);
        //validator group
        $.each($(this).find("input:submit"), function (i, v) {
            if ($(v).attr("validatorGroup")) {
                $(v).bind("click", function () {
                    form.data('validator').resetForm();
                    form.data('validator').settings.messages = {};
                    addRules(form, $(v).attr("validatorGroup"));
                });
            }
        });
 
}

function addRules(form, group) {
    form.find("input[validator],textarea[validator],select[validator]").each(function () {
        var input = $(this);
        var validator = input.attr("validator");
        $.each(validator.split(' '), function (i, v) {
            if (v != "") {
                var inputGroups = input.attr("validatorGroup") + " ";
                if (inputGroups && group && inputGroups.indexOf(group + " ") < 0) {
                    input.rules("remove", v);
                }
                else {
                    input.rules("add", v);
                }
            }
        });
    });
}

jQuery.validator.setDefaults({

    heightLightForLable: true,

    errorClass: "inputHighlight",

    errorElement: "li",

    debug: false
});


//override the default validator settings
jQuery.fn.extend({
    validatorSetting: function (options) {
        var defaultSettings = $(this).data('validator').settings;
        jQuery.extend(defaultSettings, options);
    }
});

jQuery.validator.addMethod("checkTo", function (value, element, param) {     
    return !(element.checked && $(param).val() == '');
}, "Please check at least one animal type for Wag.com emails.");

jQuery.validator.addMethod("SpecialName", function (value, element) {
    var SpecialNameRegex = /^[A-Za-z0-9\ \-\!\@\#\$\%\^\&\*\(\)_\+\=\{\}\[\]\\\|\;''\:\""\,\.\/\<\>\?]+$/
    var tempValue = $.trim(value);
    return this.optional(element) || tempValue != "" && SpecialNameRegex.test(tempValue);
}, "SpecialName invalid");

jQuery.validator.addMethod("userName", function (value, element) {
    if (value.length > 30) return false;
    return this.optional(element) || value != "" && /^[A-Za-z\ \-]+$/.test(value);
}, "Name invalid");

jQuery.validator.addMethod("zipCode", function (value, element) {
    return this.optional(element) || value != "" && /^\d{5}$/.test(value);
}, "Zip Code invalid");

jQuery.validator.addMethod("registerPassword", function (value, element) {
    var digitalReg = new RegExp("\\d");
    var charReg = new RegExp("\\D");
    var pwdReg = /^.{6,}$/;
    var matchDigitalCollection = value.match(digitalReg);
    var matchCharCollection = value.match(charReg);
    if (pwdReg.test(value) && matchDigitalCollection && matchCharCollection) {
        return true;
    }
    else {
        return false;
    }
}, "Password invalid");

jQuery.validator.addMethod("requiredSelectMonth", function (value, element) {     
    if (typeof (value) == undefined) { return false; }
    if (value.length <= 0) return false;
    var digitalReg = new RegExp("\\d");
    return digitalReg.test(value);
}, "month is required");

jQuery.validator.addMethod("requiredSelectYear", function (value, element) {
    if (typeof (value) == undefined) { return false; }
    if (value.length <= 0) return false;
    var digitalReg = new RegExp("\\d");
    return digitalReg.test(value);
}, "Year is required");

jQuery.validator.addMethod("phone", function (value, element) {
    if (value) {
        value = value.replace(/\D/g, "").replace(/^[01]{1,}/, "");
        if (value.length >= 10)
            value = "(" + value.substring(0, 3) + ")" + value.substring(3, 6) + "-" + value.substring(6, 10);
    }
    element.value = value;
    var phoneReg = new RegExp("(\\([2-9]\d{2}\\)|(\\d{3}-))\\d{3}-\\d{4}");
    var replaceReg = /[^\d.\d]/g;
    var result = phoneReg.test(value);
    if (!result) {
        var number = value.replace(replaceReg, '');
        if (number.length == 10) {
            phoneReg = new RegExp("[2-9]\\d{9}");
            result = phoneReg.test(number);
        }
    }
    return result;
}, "Phone number invalid");

jQuery.validator.addMethod("addressValidator", function (value, element) {
    var addressReg = new RegExp("([^\x20-\x7E])+");
    return addressReg.test(value);
},"Address invalid");

jQuery.validator.addMethod("NumberValidator", function (value, element) {
    var numberReg = new RegExp("[-]?[1-9][0-9]{0,9}");
    return numberReg.test(value);
}, "Number invalid");

jQuery.validator.addMethod("ExpirationDateValidator", function (value, element) {
    var yearObj = $("#" + element[0].form.id).find("select[validator*='requiredSelectYear']");
    var monthObj = $("#" + element[0].form.id).find("select[validator*='requiredSelectMonth']");
    var validatorLabel = $("#" + element[0].form.id).find("label[for='"+ yearObj.attr("id") +"']");
    var year = yearObj.val();
	var month = monthObj.val();
    var isDate = new Date();
	var nowYear = isDate.getFullYear();
	var nowMonth = isDate.getMonth() + 1;
	var IsExpired = false;

	year = parseInt(year == "" ? 0 : year);
	month = parseInt(month == "" ? 0 : month);
	nowYear = parseInt(nowYear);
	nowMonth = parseInt(nowMonth);
	IsExpired = (month > 12
			|| year < nowYear
			|| (year == nowYear && month < nowMonth));
    if (IsExpired) {
		validatorLabel.addClass("invalid");
	}
	else {
		validatorLabel.removeClass("invalid");
	}
    return !IsExpired;
}, "Expiration Date invalid");

jQuery.validator.addMethod("multiEmail", function (value, element) {
    var emails = value.split(";");
    var isValidate = true;
    var RegExp = /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i;
    for (var i= 0; i <= emails.length - 1; i++) {
        var mail = emails[i];
        isValidate = (mail != "" && RegExp.test($.trim(mail)));
        if (isValidate == false)
            break;
    }
    return isValidate;
}, "MultiEmail invalid");

//render the validationResult from server
function renderValidationResult(validationResult) {
    var validationItems = jQuery.parseJSON(validationResult);
    $.each(validationItems, function (i, v) {
        var element = $("#" + v.Id);
        if (element.length == 0) {
            element = $("input[name='" + v.Id + "']");
        }
        if (v.Value) {
            element.val(v.Value.split(','));
        }
        if (v.Message) {
            var form = element.is("form") ? element : $("#" + element[0].form.id);
            var validator = form.data('validator') || jQuery.validate({ errorLabelContainer: form.find(".validateMessageContainer") });
            validator.settings.highlight.call(validator, element[0], validator.settings.errorClass, validator.settings.validClass);
            validator.showLabel.call(validator, element[0], v.Message)
        }
    });
}


//Start of Input with Tip and Error Message
(function($) {
    $.fn.tipBox = function(options){

        var settings = $.extend({}, $.fn.tipBox.defaults, options);

        return this.each(function(){
            var inputObj = $(this);
            var tipBoxID = $(this).attr("id") + "_TipMessage";

            inputObj.attr("tip","required");

            inputObj.bind("showTip",function(){
                showInputTip();//Tip is shown
            }).bind("removeTip",function(){
                closeInputTip();//Tip is hiden
            });

            if (inputObj.attr("type") != "checkbox"){
                if (settings.focusTip){
                    inputObj.bind("focus",function(){
                        showInputTip();
                    });
                }

                inputObj.bind("blur",function(){
                    closeInputTip();
                });
            }

            function showInputTip(){
                if (inputObj.attr("type") == "checkbox"){
                    addCheckboxTip();//add yellow box behind the checkbox
                    return;
                }
                var tipContent = "";
                var top = 0;
                var left = 0;
                var width = 0;
                var afterInput = inputObj;

                if ($(settings.afterInput).length > 0)
                    afterInput = $(settings.afterInput);

                switch(settings.tipType){
                    case "email":
                        tipContent = "You must enter a valid email address";
                        top += 2;
                        width = 184;
                        break;
                    case "password":
                    case "verifyPassword":
                        tipContent = "Your password must:"
                                    + "<ul>"
                                    + "<li>&bull; be at least 6 characters long</li>"
                                    + "<li>&bull; include both alpha & numeric characters</li>"
                                    + "</ul>";
                        top -= 19;
                        width = 200;
                        break;
                    case "zipcode":
                        tipContent = "Your postal code allows us to give you delivery estimates";
                        top -= 4;
                        width = 160;
                        break;
                    default:
                        break;
                };
                if (tipContent=="")
                    return;
                //Create a new Tip
                if ($("#" + tipBoxID).length > 0)
                    $("#" + tipBoxID).remove();
                afterInput.after('<span id="'+ tipBoxID +'" class="inputTipBox"><span class="tipContent" style="width:'+ width +'px; top:'+ top +'px; left:'+ left +'px;">'+ tipContent +'</span></span>');
            }

            function closeInputTip(){
                if (inputObj.attr("type") == "checkbox"){
                    removeCheckboxTip();// remove yellow box behind the checkbox
                    return;
                }
                if ($("#" + tipBoxID).length > 0)
                    $("#" + tipBoxID).remove();
            }

            function addCheckboxTip(){
                if (inputObj.parent().attr("class").indexOf("checkboxOutbox") < 0)
                    inputObj.wrap("<span class='checkboxOutbox'></span>");
                inputObj.parents(".checkboxOutbox").removeClass("checkboxHighlightBox").addClass("checkboxHighlightBox");
            }

            function removeCheckboxTip(){
                inputObj.parents(".checkboxOutbox").removeClass("checkboxHighlightBox");
            }
        });
    }
    //Default settings
    $.fn.tipBox.defaults = {
	    focusTip:true,
        tipType:"",
        tipLabel:"",
        afterInput:""
    };
    $.fn.extend({
        showTip:function(){
            return this.trigger("showTip");
        },
        removeTip:function(){
            return this.trigger("removeTip");
        }
    });
})(jQuery);
