﻿HHus.Web.ValidationClass = function(parent) {
    var parentControl = parent;
    var m_markerClass = "Marker_message";
    var m_falseValidateClass = "Control_message";
    var that = this;
    this.ErrorArray = new Array();
    function addValidateClass(element) {
        element.removeClass(m_falseValidateClass);
        element.addClass(m_falseValidateClass);
    }

    this.RemoveMarkers = function() {
        $("span." + m_markerClass, parentControl).remove();
    }
    function addMarker() {
        $("." + m_falseValidateClass + ":not(:checkbox)", parentControl).after("<span class='" + m_markerClass + "' style='color:red; float:left'>*</span>");
        /*$("." + m_falseValidateClass + ":checkbox", parentControl).after("<span class='" + m_markerClass + "' style='color:red;'>*</span>");*/
    }

    function clearAll() {
        $("." + m_falseValidateClass, parentControl).removeClass(m_falseValidateClass);
        that.RemoveMarkers();
    }
    this.Validate = function() {
        clearAll();
        var retResult = true;
        var halfRetResult = false;
        var arrayHalf = new Array();

        $("input.halfRequired:checkbox", parentControl).each(function() {
            var curVal = $(this);
            if (curVal.attr("checked")) {
                halfRetResult = true;
            }
            arrayHalf.push($(this));
        });

        $(".halfRequired:not(:checkbox)", parentControl).each(function(pos) {
            var curVal = $.trim(this.value);
            var title = $(this).attr('title');
            if ((curVal != '' && title != curVal)) {
                halfRetResult = true;
            }
            arrayHalf.push($(this));
        });

        if ($(".halfRequired:not(:checkbox)", parentControl).length > 0) {
            if (!halfRetResult) {
                for (var j = 0; j < arrayHalf.length; j++) {
                    addValidateClass(arrayHalf[j]);
                }
                retResult = false;
                if (!that.ErrorArray.contains("halfRequired")) {
                    that.ErrorArray.push("halfRequired");
                }
            }
        }

        if ($(".halfRequired:checkbox", parentControl).length > 0) {
            if (!halfRetResult) {
                for (var j = 0; j < arrayHalf.length; j++) {
                    addValidateClass(arrayHalf[j]);
                    break;
                }
                retResult = false;
                if (!that.ErrorArray.contains("halfRequired")) {
                    that.ErrorArray.push("halfRequired");
                }
            }
        }

        $(".required", parentControl).each(function(pos) {
            var curVal = $.trim(this.value);
            var title = $(this).attr('title');
            if (curVal == '' || title == curVal) {
                retResult = false;
                addValidateClass($(this));
                if (!that.ErrorArray.contains("required")) {
                    that.ErrorArray.push("required");
                }
            }
        });

        $(".email", parentControl).each(function(pos) {
            var curVal = $.trim(this.value);
            var title = $(this).attr('title');
            if (false == /^((([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.test(curVal) && curVal != '' && title != curVal) {
                retResult = false;
                addValidateClass($(this));
                if (!that.ErrorArray.contains("email")) {
                    that.ErrorArray.push("email");
                }
            }
        });

        $(".emailRequired", parentControl).each(function(pos) {
            var curVal = $.trim(this.value);
            var title = $(this).attr('title');
            if (false == /^((([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.test(curVal) && title != curVal) {
                retResult = false;
                addValidateClass($(this));
                if (!that.ErrorArray.contains("emailRequired")) {
                    that.ErrorArray.push("emailRequired");
                }
            }
        });
        
        $(".positiveNumber", parentControl).each(function(pos) {
            var curVal = $.trim(this.value);
            var title = $(this).attr('title');
            if ((false == /^\d+$/.test(curVal) || curVal == 0) && curVal != '' && title != curVal) {
                retResult = false;
                addValidateClass($(this));
                if (!that.ErrorArray.contains("positiveNumber")) {
                    that.ErrorArray.push("positiveNumber");
                }
            }
        });

        $(".postalCode", parentControl).each(function(pos) {
            var curVal = $.trim(this.value);
            var title = $(this).attr('title');
            if (false == /^\d{4}$/.test(curVal) && curVal != '' && title != curVal) {
                retResult = false;
                addValidateClass($(this));
                if (!that.ErrorArray.contains("postalCode")) {
                    that.ErrorArray.push("postalCode");
                }
            }
        });

        $(".postalCodeRequired", parentControl).each(function(pos) {
            var curVal = $.trim(this.value);
            if (false == /^\d{4}$/.test(curVal)) {
                retResult = false;
                addValidateClass($(this));
                if (!that.ErrorArray.contains("postalCodeRequired")) {
                    that.ErrorArray.push("postalCodeRequired");
                }
            }
        });

        $(".mobile", parentControl).each(function(pos) {
            var curVal = $.trim(this.value);
            var title = $(this).attr('title');
            if (false == /(^\d{8}$)|(^380\d{9}$)/.test(curVal.replace(/ /g, '')) && curVal != '' && title != curVal) {
                retResult = false;
                addValidateClass($(this));
                if (!that.ErrorArray.contains("mobile")) {
                    that.ErrorArray.push("mobile");
                }
            }
            else {
                this.value = curVal;
            }
        });

        $(".mobileRequired", parentControl).each(function(pos) {
            var curVal = $.trim(this.value);
            var title = $(this).attr('title');
            if (false == /(^\d{8}$)|(^380\d{9}$)/.test(curVal.replace(/ /g, '')) && title != curVal) {
                retResult = false;
                addValidateClass($(this));
                if (!that.ErrorArray.contains("mobileRequired")) {
                    that.ErrorArray.push("mobileRequired");
                }
            }
            else {
                this.value = curVal;
            }
        });
        
        addMarker();
        return retResult;
    }
}
