	/*
	作者:孔小子   kexbar@tom.com
	功能:用于检验Form表单输入值的自定义类.
	版本：1.2
	引用:
		1.使用此类时必须包含javascript的prototype扩展1.4版以上;
		2.自定义一函数,如checkForm,然后在其中包含本类的实例化对象,示例:
			function checkForm(){
				var myFormCheck = new cFormValid( {	input_id1:'s>1',
													input_id2:'e>5',
													input_id3:'u>5',
													input_id4:'n=8'
												  });																					
				return(myFormCheck.getCheck());
			}
			其中,类的构造函数中参数必须是{object_id:'[$1][$2][S3]', ... }格式
			(1)object_id, 代表input域名称;
			(2)$1取值 s, e, u, n,w,l 分别指明为字符串,email,url,数字,有效文字(即除特定符号之外的)类型和类型不限(日期类型没有考虑);
			(3)$2取值 >, <, =, 指明比较符;
			(4)$3, 数值 (输入域长度条件)
			(5)此外，如果给input标签加入一属性"isnull=n(n取值1或0)" ，当isnull=1时则当用户没有给其域输入值就忽略类型和长度判断．
		3.在form标签中写入 onsubmit="return(checkForm());"
	*/
	
	var cFormValid = Class.create();
	cFormValid.prototype = { 
		 field: Array,				// 表单输入域
		 needFormat:Array, 			// 要求格式
		 errMsg:"", 				// 返回错误信息
		 errTag:"",					// 显示错误提醒HTML标记
		 result:true, 				// 返回表单填写结果
		 focusField:"",				// 出错后返回的焦点域
		 
		initialize: function(hashFormInput){
			var h = $H(hashFormInput);
			this.field = h.keys();
			this.needFormat = h.values();
		}, 
		
		/***********************************
		取检查结果
		***********************************/
		getCheck: function(){
			var iSize = this.field.length ;
			var ret = true, obj = Object;
			for(var i=0; i<iSize; i++){
					obj = $(this.field[i]); 
					obj.value = this.trim(obj.value);
					if (this.allowNull(obj) && obj.value == "" ) continue;
					this.checkInput(obj,this.needFormat [i]);
			}  
			try{
				if (this.focusField !=""){				
					$(this.focusField).focus();
				}
			}
			catch(e){
			}
			return(this.result);
		}, 
		
		/***********************************
		检查表单输入域
		***********************************/			
		checkInput : function(objId,strFormat){
			var fieldType = this.getType(strFormat);
			var condition = this.getConditon(strFormat);
			var len = Number(condition.substring(1,condition.length)); 	//取要求域长度
			var cp =  condition.charAt(0);			//取比较运算符
			var check1 = true,check2 = true;
			
			this.errMsg = "";
 			switch(fieldType ){
				case "s":			//字符串

					check1 = this.isString(objId.value);
					break;
				case "w":			//有效文字
					check1 = this.isWord(objId.value);
					break;
				case "n":			//数字
					check1 = this.isNumber(objId.value);
					break;
				case "e":			//email
					check1 = this.isEmail(objId.value);
					break; 
				case "u":			//url
					check1 = this.isUrl(objId.value);
					break;
				case "l":break;		//仅检查长度,忽略类型检查

				default:break;
			} 
			check2 =  this.lenCheck(objId.value,cp,len);
			if(!check1)
			 this.errMsg = "[" + objId.title + "]不能为空或无效!";
			else if(!check2)
				this.errMsg = "[" + objId.title + "]长度不符合要求!";
				
			if (this.errMsg != ""){
					this.errTag = "<span id=err_" + objId.name + " style=color:red;font-size:11px>*" + this.errMsg + "</span>";
					if ($("err_" + objId.name) == undefined){							//判断是否存在错误提醒标签
						new Insertion.After(objId,this.errTag);  							
					}
					$(objId).onkeydown = $(objId).onclick = function(){
							if ($("err_" + objId.name) != undefined){
								$("err_" + objId.name).setAttribute("autocomplete","OFF"); 
								Element.remove("err_" + objId.name); 
							}
					}  
					if(this.focusField == ""){
						 this.focusField = objId;
					}
			}else{
				this.errTag = "";
			}
			
			this.result  = this.result && check1 && check2; 
		}, 
		
		/***********************************
		允许为空否？
		***********************************/				
		allowNull:function(obj){
			var bNull = obj.getAttribute("isnull");
			if (bNull == undefined )
				return (false);
			else
				return(bNull);
		},
		
		/***********************************
		去首尾中英文空格 ,将'"英文半角字符转换成全角符号

		***********************************/					
		trim : function(s){
			//s = s.replace(/　/g," ");
			//s = s.replace(/'/g,"＇");
			//s = s.replace(/"/g,"＂");	// 改中文空格为英文空格
			s = s.replace(/(^\s*)|(\s*$)/g, "") 
			return(s);
		},
		
		/***********************************
		取域合法条件
		***********************************/			
		getConditon : function(s){
  		return(s.substring(1,s.length));
 		},
  
		/***********************************
		取域要求数据类型,n =数字,s=字符串,e= Email,u = 网址, w = 有效文字
		***********************************/	  
		 getType : function (s){
		 	return(s.charAt(0)); 	
		 }, 
		  
		/***********************************
		检查输入内容的长度
		***********************************/			  
		 lenCheck : function (s,cp,len){
				switch(cp){
					case ">": return(s.length > len);break;
					case "<": return(s.length < len);break;
					case "=": return(s.length == len);break;
					default:break;
				}
				return(false);
			}, 

			/***********************************
			数字否?
			***********************************/				
			isNumber:function(s)
			{
				var re;
				re = /^\d+$/;
				return(re.test(s));
			},

			/***********************************
			有效文字否?
			***********************************/							
			isWord: function(s){
			  var re;
			  //re = /[^~!@$%&*=\+\[\]{}\|';:\<\>\/\?]+$/;
			  re = /[^~$&*|(<\/)(\/>)(&gt;)(&lt;)]+$/;
			  return(re.test(s));
			},

			/***********************************
			字符串否?
			***********************************/				
			isString: function (s)
			{
			 var re;
			 re = /^\w+$/;
			 return(re.test(s));
			},
			
			/***********************************
			Email否?
			***********************************/
			isEmail: function (s)
			{  var re;
				 re = /^\w+([-+.]\w+)*@\w+([-.]\w+)*$/i;
				 return(re.test(s));
			}, 
			
			/***********************************
			url否?
			***********************************/				
			isUrl : function (s){
					re = new RegExp("^(http|https|ftp)+://[^\s]*","i");
					return(re.test(s));
			}
};

/*
因需求改变，需要允许在Input域id上使用特殊字符作为名称，如使用[]等，而在cFormValid中直接以Input域id作为对象，
这样它是不允许使用[]等特殊符号的． 
cFormValidEx是对cFormValid的扩充，它是以"input域1:要求格式,input域2:要求格式..."这样的字符串作为对象表单检验参数的．
*/
var cFormValidEx = Class.create();
Object.extend(Object.extend(cFormValidEx.prototype, cFormValid.prototype),{
	field:Array,
	needFormat:Array,
	
	initialize :function(strFormInput){
		var a = strFormInput.split(","); 
		this.field = this.getField(a);
		this.needFormat = this.getNeedFormat(a);
	},
		
	getField: function(a){
		var as = new Array;
		var d =0; 
		for(var i=0; i<a.length; i++){
			d = a[i].indexOf(':');
			as[i] =$(a[i].substring(0,d));			
  	} 
  	return(as);
	},
	
	getNeedFormat:function (a){ 
		var d = 0, len = 0;
		var as = new Array;
		for(var i=0;i<a.length ;i++){
			d = a[i].indexOf(':');
			len = a[i].length;
			as[i] = a[i].substring(d+1,len);
		} 
		return(as);
	} 
});