﻿
(function() { 
	jQuery.fn.formValidation = function(settings, err_msgs) {

	var iForm = this;
	var err_list = '';

	settings = jQuery.extend({
		version				: '1.1.1',
		email					:	/^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/,
		username				:	/^[a-zA-Z\u4E00-\u9FA5]{1}[a-zA-Z0-9_\u4E00-\u9FA5]{1,19}$/gi,
		password					:	/^[0-9a-zA-Z_\+\=\\\|\,\.\/\?\)\(\*\&\^\%\$\#\@\!\~\;\:\'\"\<\>]{6,20}$/gi,
		answer						:	/^[a-zA-Z0-9_\u4E00-\u9FA5\+\=\\\|\,\.\/\?\)\(\*\&\^\%\$\#\@\!\~\;\:\'\"\<\>]{6,40}$/gi,
		question				:	/^[a-zA-Z0-9_\u4E00-\u9FA5\+\=\\\|\,\.\/\?\)\(\*\&\^\%\$\#\@\!\~\;\:\'\"\<\>]{6,40}$/gi,
		enable				: true,
		err_class			: "bd_tip2",
		ok_class            : "bd_tip1",
		err_list			: false,
		alias					:	'name',
		defval				: 'defval',
		err_message		: "Please fill all required fields! ",
		ajax:"",
		subtn_id: "",
		lang : "",
		needShowTip : false
		
	}, settings);
	
	err_msgs = jQuery.extend({ 
		required	: 'is required',
		mask			: 'Invalid',
		equal			: 'is not equal to'
	}, err_msgs);
	
	
	return iForm.submit( function () {
	        $("#"+settings['subtn_id']).attr("disabled",true);
			settings['enable'] = true;
			err_list = '';
			var err_container = null;
			var frm = true;
			$(this).find('*').filter("input, select").each(function() {
				ret = isValid($(this));
				if (!ret){
					frm = ret;
					$("#"+settings['subtn_id']).removeAttr("disabled");
				}
			});
			
			return frm;
		}).find('*').filter("input, select").each(function() {
		$(this).blur(function() {
		    if(settings['needShowTip']){
		        $('#'+$(this).attr('tipsid')).css("display","none");
		    }
			isValid($(this));
		}).keyup(function(){
		    if (($(this).attr('clearblank') == "true") && $(this).val().indexOf(' ') != -1)
		        $(this).val($(this).val().replace(' ',''));
		}).focus(function(){
		    if(settings['needShowTip']){
		        $('#'+$(this).attr('tipsid')).css("display","");
		        getErrContainer($(this)).css("display","none");
		    }
		}).keydown(function(e){
		    if (($(this).attr('onlynum') == "true"))
		        onlyNum(e);
		});
		
	});

	function getErrContainer(obj){
			return $("#"+obj.attr('errcid'));
	}
		
	function isValid(obj) { // check if field is valid
		var isajaxOk = false;
		if (!settings['enable'])
			return true;
			
		if (mask(obj) && equal(obj) && required(obj) && isValidUserName(obj)) {
		    isajaxOk = true;
		    if(typeof obj != "undefined" && typeof obj.attr("ajax") != "undefined"){
		        var fcallback = function(json){
                    if(json!=null){
                        if(json.ErrorCode == 0){
                            isajaxOk = true;
                        }else{
                            if(!obj.attr("axalias"))
                                obj.attr("xalias",json.ErrorMessage);
                            else
                                obj.attr("xalias",obj.attr("axalias"));
                            isajaxOk = false;
                        }
                    }
		        }
		        ajax(obj,fcallback);
		    }
		}
		
		if(settings['isShowErrTip']){
		    if(isajaxOk){
		        getErrContainer(obj).css("display","none");
		        $('#'+$(obj).attr('tipsid')).css("display","");
		        return true;
		    } else {
			    getErrContainer(obj).html(obj.attr("xalias")).css("display","");
			    $('#'+$(obj).attr('tipsid')).css("display","none");
			    return false;
		    }
		}else{
	        if(isajaxOk){
		        getErrContainer(obj).html('').removeClass(settings['err_class']).addClass(settings['ok_class']).css("display","");
		        return true;
		    } else {
			    getErrContainer(obj).html(obj.attr("xalias")).removeClass(settings['ok_class']).addClass(settings['err_class']).css("display","");
			    return false;
		    }
		}
	}
	//field is required
	function required(obj) {
	    obj.attr("xalias",obj.attr("alias"));						
		if (!(obj.attr('required') == "true"))	//if not required return true
			return true;

		if(obj.is("input[@type=checkbox]")) {		//if checkbox and checked
			var jobj = document.getElementById(obj.attr('id'));	
			if (jobj.checked)
				return true;
		} else if((obj.is("input") || obj.is("select")) && (!obj.is("button"))) // if not empty
			if (obj.val() != '' && (!(defval(obj))))
				return true;	

		if (settings['err_list'])	
			err_list += '- "' + obj.attr(settings['alias']) + '" ' + err_msgs['required'] + '\n';
			
		return false;
	}
	//compare field to mask provided in the extend array
	function mask(obj) { 
		tname = obj.attr('mask');	//read mask name from input field
		obj.attr("xalias",obj.attr("maskAlias"));
		if (tname == undefined || obj.val() == '')
			return true;

		tmask = settings[obj.attr('mask')];	// get mask pattern from settings
		
		ret = tmask.test(obj.val());			//test reg exp
		ret1 = tmask.exec(obj.val());		
		if (ret)
			return true;

		if (settings['err_list'])
			err_list += '- ' + err_msgs['mask'] + ' "' + obj.attr(settings['alias']) + '"\n';
		
		return false;				
	}
	//copare field to another field read from the equal attribute
	function equal(obj) { 
		tname = obj.attr('equal');		//get comparison field
		obj.attr("xalias",obj.attr("equalAlias"));
		tval = $('#'+tname).val();
		
		if (tname == undefined)
			return true;
		
		if (tval == obj.val())
			return true;
		
		if (settings['err_list'])	
			err_list += '- "' + obj.attr(settings['alias']) + '" ' + err_msgs['equal'] + ' ' + $('#'+tname).attr('alias') + '\n';
		return false;
	}
	//compare field with defval attr, make sure that val was altered
	function defval(obj) { 
		tdefval = obj.attr(settings['defval']);		//get comparison field
		tval = obj.val();
		
		if (tdefval == undefined)
			return false;
		
		if (tval != tdefval)
			return false;

		return true;
	}
	
	function ajax(obj, fcallback){
	    var act = obj.attr("ajax");  
        $.ajax({
           async:false,
           type: "GET",
           url: "/ajax.aspx?act="+act+"&data="+encodeURIComponent(obj.val())+"&sitename=www.mdbchina.com&l="+settings['lang'],
           dataType:'json',
           success: function(json){fcallback(json);},
           error : function(){
                alert("System Error!");
            }
         });
        
	}
	
	function onlyNum(evt)
    {
        if(!evt)evt=window.event;
        if(!(evt.keyCode==46)&&!(evt.keyCode==8)&&!(evt.keyCode==37)&&!(evt.keyCode==39))
        if(!((evt.keyCode>=48&&evt.keyCode<=57)||(evt.keyCode>=96&&evt.keyCode<=105)))
            evt.preventDefault();
    } 
    
    function isValidUserName(obj){
        if(obj.attr("id") == "UserNameTBox"){
            obj.attr("xalias",obj.attr("maskAlias"));
            var name = obj.val();
            var len = _getStrActualLen(name);
            if(len < 4 || len > 20){
                return false;
            }
        }
        
        return true;
    }
    
    function _getStrActualLen(sChars)  
    {  
        return sChars.replace(/[^\x00-\xff]/g,"xx").length;  
    }  
	
}
})(jQuery);   