﻿(function($) {
    $.validation = {
        //public properties
        RequiredClass: "Required",
        EmailClass: "Email",

        VerticalOffset: 0,
        HorizontalOffset: 20,

        AlertTemplate: "<div id='ValidateAlert' style='display: none; position: absolute; width: 300px; height: 16px;'><div style='font-size: 11px; font-weight: bold; color: Black; margin: 5px 5px 5px 0px; '>{0}</div></div>",
        RequiredFeedback: "Required.",
        EmailFeedback: "Please verify that this email address is valid.",

        //public functions
        validate: function(selector, callback) {
            $.validation._validate(selector, function(result) {
                if (callback) { callback(result); }
            });
        },

        //private functions
        _validate: function(selector, callback) {
            _ErrorCount = 0;
            selector.each(function(i, n) {
                if ($(this).hasClass($.validation.RequiredClass)) {
                    if ($(this).val().length < 2) {
                        if (i == 0) {
                            $(this).focus();
                        }
                        $.validation._showAlert($(this), $.validation.RequiredFeedback);
                        $(this).bind("keyup", function() {
                            if ($(this).val().length >= 2) {
                                $.validation._hideAlert($(this));
                                $.validation._validate(selector, function() { });
                            }
                        });
                        _ErrorCount++;
                    }
                } else if ($(this).hasClass($.validation.EmailClass)) {
                    if (!$.validation._isValidEmailAddress($(this).val())) {
                        $.validation._showAlert($(this), $.validation.EmailFeedback);
                        $(this).bind("keyup", function() {
                            if ($.validation._isValidEmailAddress($(this).val())) {
                                $.validation._hideAlert($(this));
                                $.validation._validate(selector, function() { });
                            }
                        });
                        _ErrorCount++;
                    }
                }
                if (_ErrorCount == 0) {
                    if (callback) callback(true);
                } else {
                    if (callback) callback(false);
                }
            });
        },

        _showAlert: function(element, feedback) {
            element.addClass("ValidateCurrent");

            $("body").append($.validation._format($.validation.AlertTemplate, feedback));

            $.validation._reposition();
            $("#ValidateAlert").fadeIn(250);
        },

        _hideAlert: function(element) {
            element.unbind();

            $(".ValidateCurrent").removeClass("ValidateCurrent");
            $("#ValidateAlert").remove();
        },

        _reposition: function() {
            var current = $(".ValidateCurrent");
            var pos = current.position();

            var top = (pos.top - 3 + $.validation.VerticalOffset);
            var left = parseInt(pos.left + parseInt(current.css("width").substr(0, current.css("width").length - 2)) + $.validation.HorizontalOffset);

            $("#ValidateAlert").css({
                top: top + 'px',
                left: left + 'px'
            });
        },

        _findCenter: function(element) {
            var str = element.css("width");
            return parseInt(str.substr(0, (str.length - 2)) / 2);
        },

        _format: function(str) {
            for (i = 1; i < arguments.length; i++) {
                str = str.replace('{' + (i - 1) + '}', arguments[i]);
            }
            return str;
        },

        _isValidEmailAddress: function(emailAddress) {
            var pattern = new RegExp(/^(("[\w-\s]+")|([\w-]+(?:\.[\w-]+)*)|("[\w-\s]+")([\w-]+(?:\.[\w-]+)*))(@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$)|(@\[?((25[0-5]\.|2[0-4][0-9]\.|1[0-9]{2}\.|[0-9]{1,2}\.))((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.){2}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\]?$)/i);
            return pattern.test(emailAddress);
        }
    }

})(jQuery);
