﻿/* JavaScript Document*/

var Setting = {
	expression:{},
	message:{
		"minlen":"最小长度为$1。",
		"maxlen":"最大长度为$1。",
		"minvalue":"最小值为$1。",
		"maxvalue":"最大值为$1。",
		"between":"必须介于$1-$2之间。",
		"int":"必须填写整数",
		"numeric":"必须填写数字",
		"exp":"$1 格式错误。",
		"length":"长度必须是$1",
		"require":"此项不能为空",
		"mustselect":"必须选择一项",
		"minselect":"至少选择$1项",
		"maxselect":"最多选择$1项",
		"equal":"两次输入不一样"
	}
};

var quickVerify={
	"qq":{"exp":/^[0-9]{5,11}$/,"message":"QQ号码格式不正确"},
	"email":{"exp":/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/,"message":"Email地址格式不正确"},
	"mobile":{"exp":/^1[0-9]{10}$/,"message":"移动电话号码格式不正确"},
	"telphone":{"exp":/^[0-9]+\-[0-9]{3,4}\-[0-9]{6,8}(\-[0-9]+)?$/,"message":"电话号码格式不正确"},
	"zipcode":{"exp":/^[0-9]{6}$/,"message":"邮政编码格式不正确"}
};
function FormVerify(form,setting){
	this.form=form ? form : null;
	this.setting=setting ? setting : {};
	this.showDefaultTips=true;
	if(this.setting.expression && this.setting.expression["rel"]){
		this.showDefaultTips = this.setting.expression["rel"]["showDefaultTips"];
	}
	this.autoTrim=true;
	this.style={"_default":"","right":"","error":""};
}

FormVerify.prototype.setStyle=function(_default,right,error){
	this.style["_default"]=_default ? _default : "";
	this.style["right"]=right ? right : "";
	this.style["error"]=error ? error : "";
};
FormVerify.prototype.render=function(form){
	var frm = form ? form : this.form;
	this.form = frm;
	for(var i =0;i<frm.length;i++){
		var name = jo(frm[i]).attr("name");
		if(name){
			var rel = jo(frm[i]).attr("rel");
			rel = rel ? rel :(this.setting.expression[name] ? this.setting.expression[name]["rel"] :"");
			var tips = jo(frm[i]).attr("tips");
			tips = tips ? tips :(this.setting.expression[name] ? this.setting.expression[name]["tips"] : "");
			var err = jo(frm[i]).attr("err");
			err = err ? err :(this.setting.expression[name] ? this.setting.expression[name]["err"] : "");
			if(rel){
				jo(frm[i]).attr("rel",rel).attr("tips",tips).attr("err",err);
				this.bind(frm[i]);
			}
		}
	}
	var _this=this;
	if(jo(frm).find("span[@rel]").length()>0){
		jo(frm).find("span[@rel]").each(function(){
			var rnd = "0000000" + Math.random()*10000000;		
			rnd = rnd.substr(rnd.length-7);
			this.id="jo" + rnd;
			var layer = _this.createLayer(this,this.id);
			if(_this.showDefaultTips && jo(this).attr("rel")){
				jo(layer).attr("class",_this.style["_default"]);		
				/*alert(jo(layer).attr("class"));*/
				jo(layer).css({"display":"block"}).html(jo(this).attr("tips"));
			}
		});
	}
};

FormVerify.prototype.submit=function(fn){
	var frm = this.form;
	var _this=this;
	frm.onsubmit=function(){
		var Verifyed=true;
		for(var i =0;i<frm.length;i++){
			var name = jo(frm[i]).attr("name");
			if(name && jo(frm[i]).attr("rel")){
				var isVerify = _this.Verify(frm[i]);
				Verifyed=isVerify;
					/*break;*/
				if(isVerify){
					jo("#$jo." + frm[i].name).attr("class",_this.style["right"]);
					jo("#$jo." + frm[i].name).css("display","block").html("");	
				}else{
					jo("#$jo." + frm[i].name).attr("class",_this.style["error"]);
					jo("#$jo." + frm[i].name).css("display","block").html(jo(frm[i]).attr("err"));
				}
			}
		}
		
		var group=jo(frm).find("span[@rel]");
		if(group.length()>0){
			group.each(function(){
				var rel = jo(this).attr("rel");
				var id = this.id;
				var layer = jo("#$jo." + id);
				var relObj = _this.parseRel(rel);
				if(relObj["group"]){
					var MSG="";
					var _ty = relObj["group"];
					var minselect = relObj["minselect"] ? parseInt(relObj["minselect"]):0;
					var maxselect = relObj["maxselect"] ? parseInt(relObj["maxselect"]):9999;
					if(relObj["mustselect"]){
						minselect =  relObj["mustselect"]=="true" ? 1 : 0;
					}
					var inputs = jo(this).find("input[@type='" + _ty + "']").ori();
					var checkedCount = 0;
					for(var i=0;i<inputs.length;i++){
						if(inputs[i].checked){checkedCount++;}	
					}
					if(checkedCount<minselect){
						MSG+=_this.setting.message["minselect"].replace(/\$1/igm,minselect);
						layer.attr("class",_this.style["error"]);		
						layer.css({"display":"block"}).html(MSG);
						Verifyed=false;
					}else if(checkedCount>maxselect){
						MSG+=_this.setting.message["maxselect"].replace(/\$1/igm,maxselect);
						layer.attr("class",_this.style["error"]);		
						layer.css({"display":"block"}).html(MSG);
						Verifyed=false;
					}else{
						layer.attr("class",_this.style["right"]);		
						layer.css({"display":"block"}).html("");							
					}
				}
			});
		}
		if(fn){
			return fn.apply(frm,[Verifyed]);
		}else{
			return Verifyed;
		}
	};
};

FormVerify.prototype.parseRel=function(rel){
	var REL={};
	var rellist = rel.split(";");
	if(rellist.length>0){
		for(var i=0;i<rellist.length;i++){
			var key = rellist[i].split(":")[0];
			var value=rellist[i].split(":")[1];
			REL[key]=value;
		}
	}
	return REL;
};

FormVerify.prototype.bind=function(obj){
	if(obj.type=="hidden"){return;}
	var _this=this;
	var ps = ABS(obj);
	ps.x += obj.offsetWidth +5;
	var layer = this.createLayer(obj);
	if(this.showDefaultTips && jo(obj).attr("rel")){
		jo(layer).attr("class",_this.style["_default"]);		
		jo(layer).css({"display":"block"}).html(jo(obj).attr("tips"));
	}
	jo(obj).focus(function(){
		jo(layer).attr("class",_this.style["_default"]);		
		jo(layer).css({"display":"block"}).html(jo(obj).attr("tips"));
	});
	jo(obj).blur(function(){
		jo(layer).css("display","none");
		var isVerify = _this.Verify(this)
		if(isVerify){
			jo("#$jo." + this.name).attr("class",_this.style["right"]);
			jo("#$jo." + this.name).css("display","block").html("");	
		}else{
			jo("#$jo." + this.name).attr("class",_this.style["error"]);
			jo("#$jo." + this.name).css("display","block").html(jo(this).attr("err"));
		}
	});
};

FormVerify.prototype.Verify=function(obj,bol){
	var relObj = this.parseRel(jo(obj).attr("rel"));
	if(!bol){
		if(relObj["self"] && (relObj["self"]=="true")){
			return true;
		}
	}
	var require = (relObj["require"] && relObj["require"]=="true") ? true : false;
	if(relObj.minvalue){relObj["numeric"]="true";}
	if(relObj.maxvalue){relObj["numeric"]="true";}
	if(relObj.between){relObj["numeric"]="true";}
	jo(obj).val(jo(obj).val().trim());	
	var _value = jo(obj).val();
	if(!require && _value==""){
		return true;
	}
	var MSG="";
	var isVerify=true;
	for(var i in relObj){
		var value=_value;
		
		if(i=="fn"){
			var val = window[relObj["fn"]];
			if(val && !val.apply(this,[value])){
				isVerify=false;
				break;
			}
		}
		
		if(i=="equal"){
			var val = this.form[relObj["equal"]];
			if(val && val.value!=value){
				MSG+=this.setting.message["equal"].replace(/\$1/igm,val);
				isVerify=false;
				break;
			}
		}
		if(i=="require"){
			var val = relObj["require"]=="true" ? true : false;
			if(val && value.length<=0){
				MSG+=this.setting.message["require"].replace(/\$1/igm,val);
				isVerify=false;
				break;
			}
		}
		/*Verify minlen*/
		if(i=="minlen"){
			var val = parseInt(relObj["minlen"]);
			if(val==NaN){val=0;}
			if(value.length<val){
				MSG+=this.setting.message["minlen"].replace(/\$1/igm,val);
				isVerify=false;
				break;
			}
		}
		/*Verify maxlen*/
		if(i=="maxlen"){
			var val = parseInt(relObj["maxlen"]);
			if(val==NaN){val=0;}
			if(value.length>val){
				MSG+=this.setting.message["maxlen"].replace(/\$1/igm,val);
				isVerify=false;
				break;
			}
		}
		/*Verify maxlen*/
		if(i=="length"){
			var val = parseInt(relObj["length"]);
			if(val==NaN){val=9999;}
			if(value.length!=val){
				MSG+=this.setting.message["length"].replace(/\$1/igm,val);
				isVerify=false;
				break;
			}
		}				
		/*Verify Exp*/
		if(i=="exp"){
			var val = new RegExp(relObj["exp"],"igm");
			if(!val.test(value)){
				MSG+=this.setting.message["exp"].replace(/\$1/igm,value);
				isVerify=false;
				break;
			}
		}
		
		/*Verify numeric*/
		if(i=="numeric"){
			var val = relObj["numeric"]=="true" ? true : false;
			if(val && isNaN(value)){
				MSG+=this.setting.message["numeric"].replace(/\$1/igm,value);
				isVerify=false;
				break;
			}
		}
		/*Verify int*/
		if(i=="int"){
			var val = relObj["int"]=="true" ? true : false;
			if(val && (isNaN(value) || value.indexOf(".")>=0)){
				MSG+=this.setting.message["int"].replace(/\$1/igm,value);
				isVerify=false;
				break;
			}
		}

		/*Verify quick*/
		if(i=="quick"){
			var mode= relObj["quick"];
			if(quickVerify && quickVerify[mode]){
				var regexp = quickVerify[mode]["exp"];
				if(!regexp.test(value)){
					MSG+=quickVerify[mode]["message"];
					isVerify=false;
					break;
				}
			}
		}
		
		/*Verify minvalue*/
		if(i=="minvalue"){
			value = value * 1;
			var val = relObj["minvalue"];
			if(val==NaN){val=0;}
			if(value<val){
				MSG+=this.setting.message["minvalue"].replace(/\$1/igm,val);
				isVerify=false;
				break;
			}
		}
		
		/*Verify maxvalue*/
		if(i=="maxvalue"){
			value = value * 1;
			var val = relObj["maxvalue"];
			if(val==NaN){val=0;}
			if(value>val){
				MSG+=this.setting.message["maxvalue"].replace(/\$1/igm,val);
				isVerify=false;
				break;
			}
		}

		/*Verify between*/
		if(i=="between"){
			value = value * 1;
			var val = relObj["between"];
			var minval = val.split("-")[0];
			var maxval = val.split("-")[1];
			if(minval==NaN){minval=0;}
			if(maxval==NaN){maxval=9999999999999;}
			if(value<minval || value>maxval){
				MSG+=this.setting.message["between"].replace(/\$1/igm,minval).replace(/\$2/igm,maxval);
				isVerify=false;
				break;
			}
		}

	}
	this.message = MSG;
	return isVerify;
};

FormVerify.prototype.createLayer=function(obj,fromid){
	var layer = document.createElement("div");
	document.body.appendChild(layer);
	layer.id="$jo." + (fromid ? fromid : obj.name);
	var ps = ABS(obj);
	ps.x += obj.offsetWidth +5;
	jo(layer).css({"left":ps.x + "px","top":ps.y + "px","position":"absolute","display":"none"});
	return layer;
};

function ABS(a){
	var b = { x: a.offsetLeft, y: a.offsetTop};
	a = a.offsetParent;
	while (a) {
		b.x += a.offsetLeft;
		b.y += a.offsetTop;
		a = a.offsetParent;
	}
	return b;
} 

String.prototype.gb=function(){return escape(this.toString());};
String.prototype.utf8=function(){return encodeURIComponent(this.toString()).replace(/\%([0-9a-zA-Z]{2})/ig,function(s){return s.toLowerCase()});};
String.prototype.unUtf8=function(){return decodeURIComponent(this.toString());};
String.prototype.reg=function(r){return r.test(this.toString());};
String.prototype.left=function(len){return this.substr(0,len);};
String.prototype.right=function(len){return this.substr(this.length-len,len);};
String.prototype.mid=function(start,len){return this.substr(start-1,len);};
String.prototype.trim=function(trimstr){var _temp=this;var reg= trimstr ? new RegExp(trimstr) : /\s/;while(reg.test(_temp.right(1))){_temp = _temp.left(_temp.length-1);}while(reg.test(_temp.left(1))){_temp = _temp.right(_temp.length-1);}return _temp;};
