// ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// updated by night.lee
// ye.liy@alibaba-inc.com
/**
*验证超类
*/
var Validation = Class.create();
Validation.prototype = {
	initialize:function (id,message,error,pass) {
		this.id = id;
		this.message = message;
		this.error = error;
		this.pass = pass;
	},
	validate:function () {
		return true;
	}
};

/**
*  正则表达式的校验
*/
var RegexValidation = Class.create();
RegexValidation.prototype = Object.extend(new Validation(), {initialize:function (id, message, error,pass,regex,isNot)
	{
		this.id = id;
		this.message = message;
		this.error = error;
		this.pass = pass;
		this.regex  = regex;
		if(isNot){
			this.isNot = isNot;
		}
		else{
			this.isNot  = false;
		}
	},

	validate:function () {
		if(this.isNot==true){
			return  !this.regex.test($(this.id).value);
		}
		else{
			return  this.regex.test($(this.id).value);
		}
	}
});


/**
* 执行必填验证
*/
var RequiredValidation = Class.create();
RequiredValidation.prototype = Object.extend(new RegexValidation(), {initialize:function (id, message, error,pass)
	{
		this.id = id;
		this.message = message;
		this.error = error;
		this.pass = pass;
		this.regex  = /.+/ ;
	}
});

/**
* 执行必填验证,去掉前后空格
*/
var TrimRequiredValidation = Class.create();
TrimRequiredValidation.prototype = Object.extend(new RegexValidation(), {initialize:function (id, message, error,pass)
	{
		this.id = id;
		this.message = message;
		this.error = error;
		this.pass = pass;
		this.regex  = /.+/ ;
	}
	,
	validate:function () {
		var tmpVar = $F(this.id).replace(/(^\s*)|(\s*$)/g, "");
		return this.regex.test(tmpVar);
	}
});

/**
* 执行邮件地址验证
*/
var EmailValidation = Class.create();
EmailValidation.prototype = Object.extend(new RegexValidation(), {initialize:function (id, message, error,pass)
	{
		this.id = id;
		this.message = message;
		this.error = error;
		this.pass = pass;
		//this.regex = /^[^\s()<>@,;:\/]+@\w[\w\.-]+\.[a-z]{2,}$/i;
		this.regex = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/i;
	}
});
/**
*执行数字验证	Numeric
*/
var NumericValidation = Class.create();
NumericValidation.prototype = Object.extend(new RegexValidation(), {initialize:function (id, message, error, pass)
	{
		this.id = id;
		this.message = message;
		this.error = error;
		this.pass = pass;
		this.regex = /^[0-9]*$/ ;
	}
});
/**
*执行匹配验证
*/
var MatchedValidation = Class.create();
MatchedValidation.prototype = Object.extend(new Validation(), {initialize:function (id,message,error,pass,id2)
	{
		this.id = id;
		this.id2 = id2;
		this.message = message;
		this.error = error;
		this.pass = pass;
	},
	validate:function () {
		return $F(this.id) == $F(this.id2);
	}
});
/**
*中文校验
*/
var ChineseValidation = Class.create();
ChineseValidation.prototype = Object.extend(new RegexValidation(), {initialize:function (id, message, error, pass)
	{
		this.id = id;
		this.message = message;
		this.error = error;
		this.pass = pass;
		this.regex = /^[\x00-\x7F]*$/;
	},
	CtoH:function () {
		var str = $(this.id).value;
		var result = AE.widget.replaceWords(str);
		$(this.id).value = result;
	},
	validate:function () {
		// 全角转半角
		this.CtoH();
		return this.regex.test($(this.id).value);
	}
});
var ChineseRequiredValidation = Class.create();
ChineseRequiredValidation.prototype = Object.extend(new RegexValidation(), {initialize:function (id, message, error, pass)
	{
		this.id = id;
		this.message = message;
		this.error = error;
		this.pass = pass;
		this.regex = /[^\x00-\xff]/;
	}
});
/**
*长度校验
*/
var LengthValidation = Class.create();
LengthValidation.prototype = Object.extend(new Validation(), {initialize:function (id, message, error, pass,minL,maxL)
	{
		this.id = id;
		this.message = message;
		this.error = error;
		this.pass = pass;
		this.minL = minL;
		this.maxL = maxL;
	} ,
	validate:function () {
		return $F(this.id).length >= this.minL && $F(this.id).length <= this.maxL;
	}
});
/**
*长度校验,可以为空
*/
var LengthNotRequiredValidation = Class.create();
LengthNotRequiredValidation.prototype = Object.extend(new Validation(), {initialize:function (id, message, error, pass,minL,maxL)
	{
		this.id = id;
		this.message = message;
		this.error = error;
		this.pass = pass;
		this.minL = minL;
		this.maxL = maxL;
	} ,
	validate:function () {
		return $F(this.id)=="" || ($F(this.id).length >= this.minL && $F(this.id).length <= this.maxL);
	}
});
/**
*包含CJK(双字节字符)的长度校验
*/
var CJKLengthValidation = Class.create();
CJKLengthValidation.prototype = Object.extend(new Validation(), {initialize:function (id, message, error, pass,minL,maxL)
	{
		this.id = id;
		this.message = message;
		this.error = error;
		this.pass = pass;
		this.minL = minL;
		this.maxL = maxL;
	},
	len:function () {
		return $F(this.id).replace(/[^\x00-\xff]/g,"aa").length;
	},
	validate:function () {
		return this.len() >= this.minL && this.len() <= this.maxL;
	}
});


/**
* 组合多个验证
*/
var MultiValidation = Class.create();
MultiValidation.prototype =  Object.extend(new Validation(), {initialize:function ()
	{
		this.id = null;
		this.message = null;
		this.error = null;
		this.pass = null;
		this.list = new Array();
 	},
 	addValidation:function(validation){
 		if(this.list.length==0){
 			this.copyProperty(validation);
 		}
 		this.list.push(validation);
 	},
 	validate:function () {
 		for(i=0;i<this.list.length;i++){
 			var tmp = this.list[i];
 			this.copyProperty (tmp);
 			if(!tmp.validate ()){
 				return false;
 			}
 		}
 		return true;
 	},
 	copyProperty:function(tmp){
 		this.id=tmp.id;
 		this.message = tmp.message;
 		this.error = tmp.error;
 		this.pass = tmp.pass;
 	}
});
/**
* 执行单选验证
*/
var RadioValidation = Class.create();
RadioValidation.prototype = Object.extend(new Validation(),
	{
		validate:function () {
			var arr = eval(this.id);
			//不能命名为i,会和外部循环的i冲突
			for(j=0;j<arr.length;j++){
				if($(arr[j]).checked){
					return true;
				}
			}
			return false;
		}
	}
);
/**
* 验证的中心入口
*/
var EmapValidator = Class.create();
EmapValidator.prototype = {

	initialize:function (validateRenderer) {
		this.validations = new Array();
		this.validateRenderer  = validateRenderer ;
	},

	shortCircuit:function(isShortCircuit){
		this.shortCircuit  = isShortCircuit ;
	},

	addValidation:function (validation) {

		if(this.validations["__"+validation.id]==null){
			this.validations["__"+validation.id] = new MultiValidation();
		}
		this.validations["__"+validation.id].addValidation(validation);

		//this.validations[validation.id]  = validation;
	},

	getErrorMessages:function(){
		var result = new Array();
		for (id in this.validations) {
			var validation = this.validations[id];
			if(validation instanceof Validation){
				var tempResult = validation.validate();
				if(!tempResult){
					result.push(validation.error);
				}
			}
		}
		return result;
	},

	isFieldValid:function(fieldName){
		for (id in this.validations) {
			var validation = this.validations[id];
			if(validation instanceof Validation && validation.id==fieldName){
				//////////
				var tempResult = validation.validate();
				if(tempResult){
					this.validateRenderer.rendererPass(validation);
				}
				else{
					this.validateRenderer.rendererError(validation);
				}
				this.validateRenderer.isFocused=false;
				return tempResult;
			}
		}
	},

	isValid:function (){
		var result = true;
		for (id in this.validations) {
			var validation = this.validations[id];
			if(validation instanceof Validation){
				var tempResult = validation.validate();
				if(tempResult){
					this.validateRenderer.rendererPass(validation);
				}
				else{
					this.validateRenderer.rendererError(validation);
				}
				if(!tempResult){
					result = tempResult ;
				}
				//如果设置了短路检查, 遇到一个错误就停止
				if(this.shortCircuit && !tempResult){
					this.validateRenderer.isFocused=false;
					return tempResult;
				}
			}
		}
		this.validateRenderer.isFocused=false;
		return result;
	}
}	;

/**
* 校验事件捕捉器
*/
var ValidateHandler = Class.create();
ValidateHandler.prototype = {
	initialize:function (emapValidator){
		this.emapValidator = emapValidator;
		for (id in this.emapValidator.validations) {
			var validation = this.emapValidator.validations[id];
			if (validation instanceof Validation) {
			var element = $(id.substr(2)); //小心, 这里由于前面对ID编码(前面加__)所以要去掉才能找到对象

      try{
				if(element.getAttribute("ignoreOnFocus") == null){
					element.onfocus  =  this.handleFocus.bindAsEventListener(this);
				}
				if(element.getAttribute("ignoreOnBlur") == null){
					element.onblur = this.handleBlur.bindAsEventListener(this);
				}
			} catch (E) {}
			}
		}
	},

	handleBlur:function (event) {
		var id = Event.element(event).id;
		var validation = this.emapValidator.validations["__"+id];
		if(validation.validate()){
			this.emapValidator.validateRenderer.rendererPass(validation);
		}
		else{
			this.emapValidator.validateRenderer.rendererError(validation);
		}

	},

	handleFocus:function (event) {
		var id = Event.element(event).id;
		var validation = this.emapValidator.validations["__"+id];
		this.emapValidator.validateRenderer.rendererMessage(validation);
	}
};

/**
*  校验结果渲染器
*/

var ValidateRenderer  = Class.create();
ValidateRenderer.prototype = {
	initialize:function (){},
	//提示信息
	rendererMessage:function(validation){},
	//校验失败
	rendererError:function(validation){},
	//校验成功
	rendererPass:function(validation){}
}

/**
* 弹出提示框
*/
var AlertRenderer = Class.create();
AlertRenderer.prototype = Object.extend (new ValidateRenderer (),
	{
		//校验失败
		rendererError:function(validation){
			alert(validation.error);
		}
	}
);

/**
*  在div中显示提示信息
*/
var InfoRenderer = Class.create();
InfoRenderer.prototype = Object.extend (new ValidateRenderer (),
	{
		getInfoObj:function (validation){
			return $(validation.id+"_info");
		},
		isFocused:false,
		//提示信息
		rendererMessage:function(validation){
			this.getInfoObj(validation).innerHTML = validation.message;
			this.getInfoObj(validation).style.display = 'none';
		} ,
		//校验失败
		rendererError:function(validation){
			if(!this.isFocused){
				
				try{ //need YUI
				var y = YUD.getY(get(validation.id))
				y?null: y = YUD.getY(get(validation.id+"_info"));
				window.scroll(0,y);
				}catch(E){}
				
				try{
					//$(validation.id).focus();
					}catch(E){
				
					}
				
				this.isFocused = true;
				}
			this.getInfoObj(validation).innerHTML = validation.error;
			this.getInfoObj(validation).style.display = '';
		},
		//校验成功
		rendererPass:function(validation){
			this.getInfoObj(validation).innerHTML = validation.pass;
			this.getInfoObj(validation).style.display = 'none';
		}

	}
);