/*
 * validator
 *
 * Copyright (c) 2008 hehuihai	(ocean)
 *
 * version 0.4
 *
 * Date: 2008-03-06 10:50:27
 */

//$.fn.enter()

(function($){
	$.global_validator=[];
	for(var i=0;i<5;i++){
		$.global_validator.push({
			result:true,
			className:'',
			submitId:'',
			filter:null,
			enterTagObj:null,
			recoud:[]
		});
	}
	
	$.fn.validator=function(){
		var params=arguments[0] || {};
		params=$.extend({
			groupIndex:0,
			recordObj:null,					//记录每行的验证信息
			isGlobal:true,
			require:false,
			dataType:'',
			eventType:'keyup',
			timeout:0,
			className:'',
			submitId:'',
			isAutoClean:true,				//当输入的值不符合要求时,是否自动清空
			isEnter:true,
			extendParams:{},
			extendFunc:function(){},
			ajax:function(val){},
			success:function(o){},
			error:function(o){}
		},params);
		
		var self=this;
		var dataType=[];
		
		dataType['integer']			= /^(0|[1-9]+[0-9]*)$/;					//正整数 + 0
		dataType['positive_integer']= /^([1-9]+[0-9]*)$/;					//正整数
		
		dataType['float']			= /^((\.)|(\.[0-9]*)|(0\.?)|(0\.[0-9]*)|([1-9]+[0-9]*\.?)|([1-9]+[0-9]*\.[0-9]*))$/;
		
		dataType['number']			= /^\d+$/;
		
		dataType['currency2']		= /^((\.)|(\.[0-9]{0,2})|(0\.?)|(0\.[0-9]{0,2})|([1-9]+[0-9]*\.?)|([1-9]+[0-9]*\.[0-9]{0,2}))$/;		//正整数 + 0 + [.]?[x]{0,2}
		dataType['currency5']		= /^((\.)|(\.[0-9]{0,5})|(0\.?)|(0\.[0-9]{0,5})|([1-9]+[0-9]*\.?)|([1-9]+[0-9]*\.[0-9]{0,5}))$/;		//正整数 + 0 + [.]?[x]{0,5}
		
		dataType['date']			= /^((((1[6-9]|[2-9]\d)\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\d|3[01]))|(((1[6-9]|[2-9]\d)\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\d|30))|(((1[6-9]|[2-9]\d)\d{2})-0?2-(0?[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-))$/;												//短日期(yyyy-MM-DD)格式，基本上把闰年和2月等的情况都考虑进去了
		dataType['datetime']		= /^((((1[6-9]|[2-9]\d)\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\d|3[01]))|(((1[6-9]|[2-9]\d)\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\d|30))|(((1[6-9]|[2-9]\d)\d{2})-0?2-(0?[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-)) (20|21|22|23|[0-1]?\d):[0-5]?\d:[0-5]?\d$/;		//加了时间验证的
		
		dataType['phone']			= /^[0-9]{6,15}$/;
		
		dataType['common']			= /^[A-Za-z0-9_]+$/;					//一般的:subname
		dataType['search']			= /^[A-Za-z0-9_'-]+$/;					//用于搜索的关键字
		
		dataType['string']			= /.+/;									//不能为空	
		dataType['message']			= /^[\w\W]{3,2000}$/;
		
		dataType['user']			= /[0-9_a-zA-Z@#-]/;
		dataType['password']		= /[A-Za-z0-9_]{3,12}/;					//3-12	
		dataType['password2']		= /^(\*{5}|[A-Za-z0-9_]{3,12})$/;		//*{5}|3-12	
		dataType['password_confirm']= /[A-Za-z0-9_]{3,12}/;					//3-12	
		
		dataType['email']			= /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/;
		dataType['email2']			= /^[a-z0-9_\-]+(\.[_a-z0-9\-]+)*@([_a-z0-9\-]+\.)+(com|net|org|biz|info|cn|com.cn|net.cn|org.cn|gov.cn|mobi|name|sh|ac|la|tw|com.tw|hk|com.hk|ws|travel|tm|us|cc|tv|jobs|asia|hn|lc|bz)$/;
		
		dataType['custom']			= (params.extendParams.regexp)?params.extendParams.regexp:/.+/;									//自定义	

		var validate=function(val){
			if(!params.require && val=='')return true;
			return dataType[params.dataType].test(val);
		};
		
		//记录每行的验证信息
		if(params.recordObj && !$.data(params.recordObj[0],'validator')){
			var recordObj=params.recordObj[0];
			var local_validator={
				result:true,
				className:'',
				submitId:params.submitId,
				filter:null,
				enterTagObj:null,
				recoud:[]
			}
			$.data(recordObj,'validator',local_validator);
		}
		
		var className=(params.className)?params.className:$.global_validator[params.groupIndex].className;
		$.each(self,function(i,o){
			//enter to submit
			if(params.isEnter){
				$(o).enter(function(){
					$.global_validator[params.groupIndex].enterTagObj=$(o)[0];
					setTimeout(function(){
						if(params.recordObj){
							params.recordObj.find(params.submitId).trigger('click').focus().trigger('click');
						}else{
							$.validator_submit({
								groupIndex:params.groupIndex
							});
							var submitId =(params.submitId)?params.submitId:$.global_validator[params.groupIndex].submitId;
							$(submitId).trigger('click').focus();//.trigger('click');
						}
					},10);
				});
			}
 			//------------------
			var tag_info={
				tagId:'',
				tagType:'',
				tagObj:null,
				eventType:'',
				className:className
			};
			
			if(params.require){
				$.global_validator[params.groupIndex].result=false;
				
				tag_info={
					tagId:$(o).attr('id') || $(o).attr('name'),
					tagType:o.tagName.toLowerCase(),
					tagObj:o,
					eventType:params.eventType,
					className:className
				};
				
				if(params.isGlobal){
					$.global_validator[params.groupIndex].recoud.push(tag_info);
				}
				
				//记录每行的验证信息
				if(params.recordObj && $(o).val()==''){
					var recordObj=params.recordObj[0];
					var local_validator=$.data(recordObj,'validator');
					local_validator.result=false;
					local_validator.recoud.push(tag_info);
					$.data(recordObj,'validator',local_validator);
				}
			}
			
			//che2($.global_validator[params.groupIndex].recoud)
			
			$(o).bind(params.eventType,function(){
				function func_bind(io){
					var obj=io;
					var iObj=$(obj);
					var val=iObj.val();
					var reg_result=validate(val);
					
					var filter=($.global_validator[params.groupIndex].filter!=null && $.global_validator[params.groupIndex].filter.length>0)?$.global_validator[params.groupIndex].filter:[];
					var noFilter=true;
					for(var i=0;i<filter.length;i++){
						if(filter[i]==obj){
							noFilter=false;
							break;
						}
					}
					
					if(noFilter){
						var ajax_result=params.ajax(val);
						var isAjax=(ajax_result==true || ajax_result==false)?true:false;
						ajax_result=(ajax_result)?true:false;
						
						var judge=false;
						//che2(isAjax+'|'+reg_result+'|'+ajax_result)
						if(isAjax){
							if(reg_result && ajax_result)judge=true;
						}else{
							if(reg_result)judge=true;
						}
						
						if(judge){
							//success
							for(var i=0;i<$.global_validator[params.groupIndex].recoud.length;i++){
								if($.global_validator[params.groupIndex].recoud[i].tagObj==obj){
									$.global_validator[params.groupIndex].recoud=$.array_del($.global_validator[params.groupIndex].recoud,i);
								}
							}
							
							//记录每行的验证信息
							if(params.recordObj){
								var recordObj=params.recordObj[0];
								var local_validator=$.data(recordObj,'validator');
								
								for(var i=0;i<local_validator.recoud.length;i++){
									if(local_validator.recoud[i].tagObj==obj){
										local_validator.recoud=$.array_del(local_validator.recoud,i);
									}
								}
								$.data(recordObj,'validator',local_validator);
							}
							
							//--------
							if(className)iObj.removeClass(className);
							params.success(obj);
						}else{
							//error
							tag_info={
								tagId:$(obj).attr('id') || $(obj).attr('name'),
								tagType:obj.tagName.toLowerCase(),
								tagObj:obj,
								eventType:params.eventType
							};
							var isAdd=true;
							if($.global_validator[params.groupIndex].recoud.length>0){
								for(var i=0;i<$.global_validator[params.groupIndex].recoud.length;i++){
									if($.global_validator[params.groupIndex].recoud[i].tagObj==obj){
										isAdd=false;
										break;
									}
								}
							}
							
							if(isAdd && params.isGlobal)$.global_validator[params.groupIndex].recoud.push(tag_info);
							
							//记录每行的验证信息
							if(params.recordObj){
								var recordObj=params.recordObj[0];
								var local_validator=$.data(recordObj,'validator');
								
								var isAdd=true;
								if(local_validator.recoud.length>0){
									for(var i=0;i<local_validator.recoud.length;i++){
										if(local_validator.recoud[i].tagObj==obj){
											isAdd=false;
											break;
										}
									}
								}
								if(isAdd)local_validator.recoud.push(tag_info);
								$.data(recordObj,'validator',local_validator);
							}
							
							//--------
							if(className)iObj.addClass(className);
							params.error(obj);
						}
						
						$.global_validator[params.groupIndex].result=($.global_validator[params.groupIndex].recoud.length)?false:true;
						
						//记录每行的验证信息
						if(params.recordObj){
							var recordObj=params.recordObj[0];
							var local_validator=$.data(recordObj,'validator');
							local_validator.result=(local_validator.recoud.length)?false:true;
							$.data(recordObj,'validator',local_validator);
						}
					}
					
					//auto clean error value
					if(params.isAutoClean && !reg_result){
						switch(params.eventType){
							case 'keyup':
								iObj.val(val.substring(0,val.length-1));
								break;
							case 'blur':
								iObj.val('');
								break;
							//default:
						}	
						if(iObj.val()!=''){
							setTimeout(function(){
								iObj.trigger(params.eventType);
							},300);
						}
					}
				}
				
				var io=this;
				//timeout
				if(params.timeout>0){
					setTimeout(function(){
						func_bind(io);
					},params.timeout);
				}else{
					func_bind(io);
				}
			});
			
//			//对鼠标事件触发的输入框,需要自动触发一次
//			if(params.recordObj){
//				var local_validator=$.data(recordObj,'validator');
//				if(!local_validator.result){
//					var recoud=local_validator.recoud;
//					for(var i=0;i<recoud.length;i++){
//						$(recoud[i].tagObj).trigger(recoud[i].eventType);
//					}
//				}
//			}
		});
		
		//验证每行的验证信息
		if(params.recordObj && params.submitId){
			var recordObj=params.recordObj[0];
			var local_validator=$.data(recordObj,'validator');
			params.recordObj.find(params.submitId).click(function(){
				var record_stmp=local_validator.recoud;
				var result_stmp=local_validator.result;
				if(!result_stmp){
					var recoud=record_stmp;
					for(var i=0;i<recoud.length;i++){
						var iObj=$(recoud[i].tagObj);
						if(recoud[i].className)iObj.addClass(recoud[i].className);
					}
					if(recoud.length>0){
						$(recoud[0].tagObj).trigger(recoud[0].eventType);
					}
				}
			});
		}
	};
	
	//submit
	$.validator_submit=function(){
		var params=arguments[0] || {};
		params=$.extend({
			groupIndex:0,
			success:function(){},
			error:function(){}
		},params);		
		
		//对鼠标事件触发的输入框,需要自动触发一次
		if(!$.global_validator[params.groupIndex].result){
			var record_filter=$.global_validator[params.groupIndex].recoud;
			for(var i=0;i<record_filter.length;i++){
				$(record_filter[i].tagObj).trigger(record_filter[i].eventType);		//addClass
			}
		}
		
		var filter=($.global_validator[params.groupIndex].filter!=null && $.global_validator[params.groupIndex].filter.length>0)?$.global_validator[params.groupIndex].filter:[];
		
		var filter_arr=function(arr,iobj){
			return $.grep(arr,function(n,i){
				return (n.tagObj==iobj)?false:true;
			}); 			
		};
		
		var record_stmp=[];
		var result_stmp=true;
		if(filter.length>0 && !$.global_validator[params.groupIndex].result){
			record_stmp=$.global_validator[params.groupIndex].recoud;
			for(var i=0;i<filter.length;i++){
				record_stmp=filter_arr(record_stmp,filter[i]);
			}
			result_stmp=(record_stmp.length)?false:true;
		}else{
			record_stmp=$.global_validator[params.groupIndex].recoud;
			result_stmp=$.global_validator[params.groupIndex].result;
		}
		
		//-------------------------
		var reVal=false;
		if(!result_stmp){
			reVal=false;
			var recoud=record_stmp;
			for(var i=0;i<recoud.length;i++){
				var iObj=$(recoud[i].tagObj);
				if(recoud[i].className)iObj.addClass(recoud[i].className);			//addClass
				params.error(recoud[i].tagObj);
			}
			if(recoud.length>0){
				$(recoud[0].tagObj).trigger(recoud[0].eventType);						//addClass
			}
			//che2(recoud)
		}else{
			reVal=true;
		}
		
		return (reVal)?true:false;
	}
})(jQuery);
