﻿var __Rules__ = [];
var __i__ = 0;
function ZXValidator(_json){
    var encoded = $.toJSON(_json);
    __Rules__[__i__] = $.evalJSON(encoded);
    __i__ ++;
    
    for(var _ruleId in __Rules__)
    {
        $.each(__Rules__[_ruleId].rules, function(i,item){
            var _rule = __Rules__[_ruleId].rules[i];
            
            if (_rule.type == "email") 
            {
		        __ZXAddFocusEvent(_rule);
                
                $(_rule.id).blur(function() 
                    {
                        __ZXAddBlurEvent(_rule)
                        var _mesaj = "";
                        if (_rule.required)
                        {
                            if (__isEmpty($(_rule.id).val()))
                            {
                                _mesaj = _rule.message;
                            }
                            else if (!__isValidEmail($(_rule.id).val()))
                            {
                                _mesaj = _rule.failure_message;
                            }
                        }
                        else
                        {
                            if (__isEmpty($(_rule.id).val()))
                            {
                                _mesaj = "";
                            }
                            else if (!__isValidEmail($(_rule.id).val()))
                            {
                                _mesaj = _rule.failure_message;
                            }
                        }
                        
                        if (_mesaj != "") {
                            __ZXWriteValidatorError(_rule, _mesaj);
                        }
                    });
		    }
    		
    		
            if (_rule.type == "string") 
            {
                __ZXAddFocusEvent(_rule);
                
                if (_rule.max != undefined)
                {
                    $(_rule.id).attr("maxlength", _rule.max);
                }
                
                $(_rule.id).blur(function() 
                    {
                        __ZXAddBlurEvent(_rule);
                        
                        var _isError = false;
                        var _text = $(_rule.id).val();
                        
                        if (_rule.required)
                        {
                            if (__isEmpty(_text))
                            {
                                __ZXWriteValidatorError(_rule, _rule.message);
                                _isError = true;
                            }
                        }
                        if (!_isError && _rule.len != undefined && _rule.len_message != undefined)
                        {
                            if (_text.length != _rule.len)
                            {
                                __ZXWriteValidatorError(_rule, _rule.len_message);
                                _isError = true;
                            }
                        }
                        if (!_isError && _rule.min != undefined)
                        {
                            if (_text.length < _rule.min)
                            {
                                __ZXWriteValidatorError(_rule, _rule.len_message);
                                _isError = true;
                            }
                        }
                        if (!_isError && _rule.max != undefined)
                        {
                            if (_text.length > _rule.max)
                            {
                                __ZXWriteValidatorError(_rule, _rule.len_message);
                                _isError = true;
                            }
                        }
                    });
            }
            
            
            if (_rule.type == "combobox") 
            {
                __ZXAddFocusEvent(_rule);
                
                $(_rule.id).blur(function() 
                    {
                        __ZXAddBlurEvent(_rule)

                        var _tagName = $(_rule.id)[0].tagName.toUpperCase();
                        if (_tagName == "SELECT")
                        {
                            if (_rule.required && ($(_rule.id).val() == 0 || $(_rule.id).val() == null))
                            {
                                __ZXWriteValidatorError(_rule, _rule.message);
                            }
                        }
                    });
            }
            
            
            if (_rule.type == "compare") 
            {
                __ZXAddFocusEvent(_rule);
                
                $(_rule.id).blur(function() 
                    {
                        __ZXAddBlurEvent(_rule)

                        var _v1 = $(_rule.id).val();
                        var _v2 = $(_rule.compareTo).val();
                        if (_v1 != _v2)
                        {
                            __ZXWriteValidatorError(_rule, _rule.message);
                        }
                    });
            }
	    });
	}
}

function __isEmpty(val) {
    return !/\S/.test(val); 
} 
function __isValidEmail(str) {
     return Boolean(str.match(/^([a-z0-9]+[\._\-]?){1,3}([a-z0-9])*\@([a-z0-9]+[\.\-]?){1,3}([a-z0-9])*\.[a-z]{2,6}$/i));
}; 

function __isEmptyV(id,errMsg){
	this.el= $(id);
	this.isValid= function(){
		var isValid= true;
		if(__isEmpty($(id).val())){
			this.error= errMsg;
			isValid= false;
		}
		return isValid;
	} 
};

function __isValidEmailV(id,errMsg){
    this.el= $(id);     
	this.isValid= function(){
		var isValid= true;         
		if(!__isValidEmail($(id).val())) {             
			this.error= errMsg;             
			isValid= false;         
		}         
		return isValid;     
	} 
}; 

function __ZXAddFocusEvent(_rule){
    $(_rule.id).focus(function() {
	    $(_rule.id).css({ border: "1px solid green"});
    });
}

function __ZXAddBlurEvent(_rule){
    var _targetId = _rule.target == undefined? _rule.id : _rule.target;
    $(_targetId).parent().find('#x_err').remove();
    $(_rule.id).removeAttr("style");
}

function __ZXWriteValidatorError(_rule, _mesaj)
{
    var _targetId = _rule.target == undefined? _rule.id : _rule.target;
    var _messageStyle = _rule.err_message_style == undefined ? {"color": "red"}: _rule.err_message_style;
    $("<span/>").attr("id", "x_err").html(_mesaj).css(_messageStyle).appendTo($(_targetId).parent());
    if (_rule.err_id_style != undefined)
    {
        $(_rule.id).css(_rule.err_id_style);
    }
    else
    {
        $(_rule.id).css({ border: "1px dotted red" });
    }
    this.__isValid__ = false;
}

function ZXValid(_grup) {
    this.__isValid__ = true;
    for (var _ruleId in __Rules__)
    {
        $.each(__Rules__[_ruleId].rules, function(i,item){
            var _rule = __Rules__[_ruleId].rules[i];
            if (_rule.grup == undefined || _grup == undefined || _rule.grup == _grup)
            {
                $(_rule.id).blur();
            }
        });
    }
    return this.__isValid__;
}