/* jQuery.checkform.js
 *
 * check type:
 *  mustInput
 *  mustMoreThan
 *  mustLessThan
 *  mustEqualTo
 *  mustEmail
 *  mustInt
 *  mustFloat
 *  mustSelect
 *  mustCheck
 *  mustRadio:
 *  mustRegular
 *
 */
 
/***************************************************************************************** 
* 2011-11-09 ZD 修改版（根据自己的需要作了些许修改）
* 调用时请注意将在每个调用页加入现在的样式:
* .warning-normal{border: 1px solid #fff; }    
* .warning{border: 1px solid red;background-color:#FCF7B4;}
* 该组样式名称禁止修改，新式可以自行修改。
* 参数说明:
	id:input
	wid:显示提示信息的div框
	msg:提示信息（仅支持一种，如果多种，须单独编写，与本插件不相联  ）
        本处,msg可以是一个函数，即提供了一个函数接口，方便灵活编写验证不通过时的处理	
	msgok：验证通过时的提示，比如用于密码强弱检查方面(同样，可以是函数)	
* 版权声明：基础函数属原作者。新加功能属ZD.	为尊重相关作者的劳动，使用时请注明。
* 改版完成：ZD,2011-11-09
*****************************************************************************************/
jQuery.extend({	
    options: {
        ctrls: [ ],//controls to check         
        success: function() { return; },//When check success,you can do something,such as submit a ajax request
        failed:  function(msg, id){ jQuery.clewMsg(msg, id); } //when check faild                
    },	
	clewMsg: function(msg, id){
	   // alert(msg);
	},	
	checkForm: function(o){	 
		o = jQuery.extend({},jQuery.options,o);
	    var isok = true;
	    
			//zd add
		var getMsgString = function(ctr,msg){
			if (typeof (msg)=="undefinde") return "";
			else if (typeof (msg)=="function") return msg(ctr);
			else if (typeof (msg)=="string") return msg;
			else return "";	
		};
		
	    var flashPrompt = function(ctr){
			var i = 0;						
			var intervalid = setInterval(function(){ 			    
				jQuery("#"+ctr.wid).toggleClass('warning');
				if(i++ > 3){
					clearInterval(intervalid);
					var __x = getMsgString(ctr,ctr.msg);
					jQuery("#"+ctr.wid).addClass('warning').html(__x);
				}
			}, 100);			
		};	
		
	    //check failed, we alert a message, and change the control's style
	    var fail = function(ctr){				
	            isok = false; 
                o.failed(ctr.msg, ctr.id);
                flashPrompt(ctr);
                jQuery("#"+ctr.wid).focus();
                return false;
	        }
	    
	    //check success, we change the control to its original style
	    var succ = function(ctr){
			var _text = getMsgString(ctr,ctr.msgok);				
	            jQuery("#"+ctr.wid).removeClass('warning').html(_text);				
	            return true;
	        }
	    
	    //regular express check
	    var checkRegularExpression = function(val, expression){
				return expression.test(val);
				//var matchArray = val.match(expression);
				//if (matchArray == null){return false;}
				//else return true;
	        }
	        		
		jQuery.each(o.ctrls, function(i, ctr){
		    switch(ctr.type)
		    {
		        case "mustInput":   if(jQuery("#"+ctr.id).val() == "")return fail(ctr); else return succ(ctr);
		        case "mustMoreThan":if(jQuery("#"+ctr.id).val().length < ctr.par)return fail(ctr); else return succ(ctr);
		        case "mustLessThan":if(jQuery("#"+ctr.id).val().length > ctr.par)return fail(ctr); else return succ(ctr);
		        case "mustEqualTo": if(jQuery("#"+ctr.id).val() != jQuery("#"+ctr.par).val())return fail(ctr);else return succ(ctr);
		        case "mustEmail":   if(!checkRegularExpression(jQuery("#"+ctr.id).val(), /\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/))return fail(ctr);else return succ(ctr);
                     case "mustInt":     if(!checkRegularExpression(jQuery("#"+ctr.id).val(), /^[0-9]*$/))return fail(ctr);else return succ(ctr); 
                     case "mustFloat":   if(!checkRegularExpression(jQuery("#"+ctr.id).val(), /^[0-9]+\.{0,1}[0-9]{0,2}$/))return fail(ctr);else return succ(ctr); 
		        case "mustSelect":  if(jQuery("#"+ctr.id).val() == ctr.par)return fail(ctr); else return succ(ctr);
		        case "mustCheck":   if(!jQuery("#"+ctr.id).attr("checked"))return fail(ctr); else return succ(ctr);
		        case "mustRadio":   if(jQuery("input[type='radio'][name='"+ctr.name+"']:checked").length<1)return fail(ctr); else return succ(ctr);
		        case "mustRegular": if(!checkRegularExpression(jQuery("#"+ctr.id).val(), ctr.par))return fail(ctr);else return succ(ctr); 
		    }
		    });		
		
		if(isok) o.success();
		return isok;
	}

});