/* =============================================================================================================
 * Class Validator 验证类
 * Author Steve
 * Create Date: 2005-08-22
 * =============================================================================================================
 * Usage:
 * 类层次:
 *                                          Validator
 *         ┌─────────────┬───┴───────┬──────────┐
 * RequiredFieldValidator	     CompareValidator	     RangeValidator	        RegularExpressionValidator
 *
 * 类属性说明:
 *
 * 类方法说明:
 *   prompt   表单失败输出的提示;
 *
 *
 * 公共函数:
 *
 *
 * 接口函数:
 * boolean checkForm (object form ) 由表单直接调用, 参数为要验证的form对象, 通过验证返回true, 否则返回false;
 *
 * 标签属性:
 * ============================================================
 *
 * 1. 公共属性:
 * ------------------------------------------------------------
 * name : 说明该span标签为验证控件
 * id : 控件的唯一标示
 * type : 指定该控件的类型, 标准的有 RequiredField(非空),Compare(比较),Range(范围),RegularExpression(正则表达式)
 * controlToValidate : 指定要验证的控件
 * disabled : 指定控件是否有效 --暂时不可用
 * errorMessage : 指定控件错误信息 --暂时不可用
 * promptMode : 指定验证信息报告的模式 安静模式quiet(默认)和对话框模式alert
 * text : 指定验证信息报告的内容
 * color : 如果是 promptMode = quiet 则，此属性可以定义输出错误信息的文字颜色，默认为红色
 *
 * 2. RequiredField 控件的属性:
 * ------------------------------------------------------------
 * defaultValue : 指定默认值
 * minLength : 指定非空域的最小字符长度,默认为 1
 *
 * 3. Compare 控件的属性:
 * ------------------------------------------------------------
 * compareToValidate : 指定要比较的控件
 * compareToValue : 指定要比较的值
 * operator : 比较运算符, == <> >= <= > < etc.
 * dataType : 指定数据的类型, String, Integer, Float, Date
 *
 * 4. Range 控件的属性:
 * ------------------------------------------------------------
 * maximumValue : 指定最大值
 * minimumValue : 指定最小值
 * dataType : 指定数据的类型, String, Integer, Float, Date
 *
 * 5. RegularExpression 控件属性:
 * ------------------------------------------------------------
 * defaultPattern : 指定默认的正则表达式模式名-- word , number, email, date, time, datetime
 * validationExpression : 指定正则表达式
 *
 */
/**
 *
 * 注意：每个vilidator必须以</span>结束
 1.非null:<span name="validator" type="RequiredField" id="rf1" controltovalidate="username" text="姓名必须填写"></span>
 2.数据格式校验: <span name="validator" type="regularexpression" id="re55" controltovalidate="email" text="请填写正确的电子邮箱格式" defaultpattern="email"></span>
 3.自定义正则表达式校验:<span name="validator" type="regularexpression" id="re52" controltovalidate="username" text="姓名必须填写为汉字" validationExpression="^[\d]+$"> </span>
 4.范围校验:<span name="validator" type="range" id="re52" controltovalidate="username" text="取值范围错误" maximumvalue="100" minimumvalue="10" datatype="float"> </span>
 5.两个控件值一致性校验:<span name="validator" type="compare" id="re52" controltovalidate="username" comparetovalidate="company" text="数据不一致"  datatype="string" operator="=="></span>
 **/
/////////////////////////////////////// 常量 //////////////////////////////////////
var __Tag_Name = "span";
var __Attr_Id = "id";
var __Attr_Name = "name";
var __Attr_Type = "type";
var __Attr_ControlToValidate = "controltovalidate";
var __Attr_PromptMode = "promptmode";
var __Attr_Text = "text";
var __Attr_Color = "color";
var __Attr_Disabled = "disabled";
var __Attr_ErrorMessage = "errormessage";
var __Attr_CompareToValidate = "comparetovalidate";
var __Attr_CompareToValue = "comparetovalue";
var __Attr_DefaultValue = "defaultvalue";
var __Attr_DefaultPattern = "defaultpattern";
var __Attr_DataType = "datatype";
var __Attr_MaximumValue = "maximumvalue";
var __Attr_MinimumValue = "minimumvalue";
var __Attr_MinLength = "minlength";
var __Attr_Operator = "operator";
var __Attr_ValidationExpression = "validationexpression";
var __Val_Name = "validator";
var __Val_PromptMode_Quiet = "quiet";
var __Val_PromptMode_Alert = "alert";

var __RegExp_Word = /^[a-zA-Z]{1}([a-zA-Z0-9]|[._]){3,19}$/;
var __RegExp_Chinese =/[^\x20-\x80]+/;
var __RegExp_Number = /^[\d]+$/;
var __RegExp_Float = /^[\d]+[\.]?[\d]{0,10}$/;
var __RegExp_Email = /[-\.\w]+@[-\.\w]+\.\w{1,3}/;
var __RegExp_Date = /\d{2,4}-\d{1,2}-\d{1,2}|\d{2,4}\/\d{1,2}\/\d{1,2}|\d{2,4}\.\d{1,2}\.\d{1,2}/;
var __RegExp_Time =/\d{2}:\d{2}:\d{2}/;
var __RegExp_DateTime =  /\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/;
var __RegExp_Image =  /^[A-Z]:\\{1,2}[^/:\*\?<>\|]+\.(jpg|gif|png)$/i;



///////////////////////////////////////////   类声明 和实现 //////////////////////////////////////////////////////

function Validator () {
	this.promptMode 		= __Val_PromptMode_Quiet; 			//提示显示的模式: quiet 标记形式, alert 以消息框形式
	this.id 				= "";				//验证实例的唯一标识
	this.controlToValidate	= null;				//要验证的对象(标记)的标识
	this.errorMessage		= ""; 				//验证对象出错时的错误信息  不可用
	this.disabled 			= false;			//验证对象是否有效   不可用
	this.text 				= "";				//验证对象提示信息内容
	this.color				= "#FF0000";		//提示使用安静模式时，文字标记的颜色
	this.validate			= validate; 		//验证类通用验证方法
	this.prompt				= output; 			//验证类通用的提示方法
}

function validate() {
}

function output () {
	switch (this.promptMode.toLowerCase())
	{
		case __Val_PromptMode_Quiet:
			//安静模式, me是validator控件
			var me = document.getElementById(this.id);
			var ctrl = document.getElementById(this.controlToValidate);
			me.style.color = this.color;
			me.innerHTML = this.text;
			//ctrl.focus();
			break;
		case __Val_PromptMode_Alert:
			//警告模式
			alert(this.text);
			break;
		default:
			throw this.promptMode + "是无效的提示模式";
	}
}

function RequiredFieldValidator() {
	//继承 Validator;
	this.inheritFrom = Validator;
	this.inheritFrom();
	this.defaultValue = "";					//默认值
	this.minLength = 1;						//最小的长度
	this.init = initRequiredField;			//初始化方法
	this.check = checkRequiredField;    	//验证方法
}

function initRequiredField(src) {
	//src 是validator标记对象
	if (! (this.id = src.getAttribute(__Attr_Id)))
		throw "控件错误: 属性 id 是必须的";
	if (! (this.controlToValidate = src.getAttribute(__Attr_ControlToValidate)))
		throw "控件错误: 属性 controlToValidate 是必须的";
	if (! (this.text = src.getAttribute(__Attr_Text)))
		throw "控件错误: 属性 text 是必须的";
	if (src.getAttribute(__Attr_PromptMode)	) this.promptMode	= src.getAttribute(__Attr_PromptMode);
	if (src.getAttribute(__Attr_ErrorMessage)) this.errorMessage = src.getAttribute(__Attr_ErrorMessage);
	if (src.getAttribute(__Attr_Disabled)	) this.disabled		= src.getAttribute(__Attr_Disabled);
	if (src.getAttribute(__Attr_Color)		) this.color		= src.getAttribute(__Attr_Color);
	if (src.getAttribute(__Attr_DefaultValue)) this.defaultValue = src.getAttribute(__Attr_DefaultValue);
	if (src.getAttribute(__Attr_MinLength)	) this.minLength	= parseInt(src.getAttribute(__Attr_MinLength));
}

function checkRequiredField() {
	var ctrl = document.getElementById(this.controlToValidate);
	return (ctrl.value.length >= this.minLength);
}

function CompareValidator() {
	this.inheritFrom = Validator;
	this.inheritFrom();
	this.compareToValidate;			//要比较的对象，标记的标识
	this.compareToValue;			//要比较的值
	this.operator = "Equal";		//比较运算符
	this.dataType = "String"; 		//数据类型
	this.init = initCompare;		//初始化
	this.check = checkCompare;		//验证方法
}

function initCompare(src) {
	//src 是validator标记对象
	if (! (this.id = src.getAttribute(__Attr_Id)))
		throw "控件错误: 属性 id 是必须的";
	if (! (this.controlToValidate = src.getAttribute(__Attr_ControlToValidate)))
		throw "控件错误: 属性 controlToValidate 是必须的";
	if (! (this.text = src.getAttribute(__Attr_Text)))
		throw "控件错误: 属性 text 是必须的";
	if ( ! ( (this.compareToValidate = src.getAttribute(__Attr_CompareToValidate)) ||
	    (this.compareToValue = src.getAttribute(__Attr_CompareToValue)) ) )
		throw "控件错误: 属性 compareToValidate 和 compareToValue 必须有一个不空";
	if (src.getAttribute(__Attr_PromptMode)	) this.promptMode	= src.getAttribute(__Attr_PromptMode);
	if (src.getAttribute(__Attr_ErrorMessage)) this.errorMessage	= src.getAttribute(__Attr_ErrorMessage);
	if (src.getAttribute(__Attr_Disabled)	) this.disabled		= src.getAttribute(__Attr_Disabled);
	if (src.getAttribute(__Attr_Color)		) this.color		= src.getAttribute(__Attr_Color);
	if (src.getAttribute(__Attr_Operator)	) this.operator		= src.getAttribute(__Attr_Operator);
	if (src.getAttribute(__Attr_DataType)	) this.dataType 	= src.getAttribute(__Attr_DataType);
	if (this.compareToValidate)
		this.compareToValue = document.getElementById(this.compareToValidate).value;
}

function checkCompare() {
	var ctrl = document.getElementById(this.controlToValidate);
	var cmpData, cmpToData;
	try {
		cmpData = typeConvertor(ctrl.value, this.dataType);
		cmpToData = typeConvertor(this.compareToValue, this.dataType);

		return compare(cmpData, cmpToData, this.operator);
	}
	catch (e) {
		alert ("比较控件错误:" + e);
		return false;
	}
}

function RangeValidator() {
	this.inheritFrom = Validator;
	this.inheritFrom();
	this.minimumValue = Date.parse("January 1, 1900"); //最小值
	this.maximumValue = Date.parse("January 1, 2100"); //最大值
	this.dataType     = "Date";						   //数据类型
	this.init = initRange;
	this.check = checkRange;
}

function initRange(src) {
	//src 是validator标记对象
	if (! (this.id = src.getAttribute(__Attr_Id)))
		throw "控件错误: 属性 id 是必须的";
	if (! (this.controlToValidate = src.getAttribute(__Attr_ControlToValidate)))
		throw "控件错误: 属性 controlToValidate 是必须的";
	if (! (this.text = src.getAttribute(__Attr_Text)))
		throw "控件错误: 属性 text 是必须的";
	if (src.getAttribute(__Attr_PromptMode)  ) this.promptMode 	 = src.getAttribute(__Attr_PromptMode);
	if (src.getAttribute(__Attr_ErrorMessage)) this.errorMessage = src.getAttribute(__Attr_ErrorMessage);
	if (src.getAttribute(__Attr_Disabled)    ) this.disabled 	 = src.getAttribute(__Attr_Disabled);
	if (src.getAttribute(__Attr_Color)   	 ) this.color		 = src.getAttribute(__Attr_Color);
	if (src.getAttribute(__Attr_MinimumValue)) this.minimumValue = src.getAttribute(__Attr_MinimumValue);
	if (src.getAttribute(__Attr_MaximumValue)) this.maximumValue = src.getAttribute(__Attr_MaximumValue);
	if (src.getAttribute(__Attr_DataType)    ) this.dataType 	 = src.getAttribute(__Attr_DataType);
}

function checkRange() {
	var ctrl = document.getElementById(this.controlToValidate);
	var ctrlData, minData, maxData;
	//alert(this.minimumValue+"%"+this.maximumValue);
	try {
		ctrlData = typeConvertor(ctrl.value, this.dataType);
		minData = typeConvertor(this.minimumValue, this.dataType);
		maxData = typeConvertor(this.maximumValue, this.dataType);
		//alert(minData+"%"+maxData);
		return (ctrlData >= minData && ctrlData <= maxData);
	}
	catch(e) {
		alert("范围控件错误:" + e);
		return false;
	}
}

function RegularExpressionValidator(){
	this.inheritFrom = Validator;
	this.inheritFrom();
	this.validationExpression;
	this.defaultPattern;
	this.init = initRegularExpression;
	this.check = checkRegularExpression;
}

function initRegularExpression(src) {
	//src 是validator标记对象
	var sRegExp;
	if (! (this.id = src.getAttribute(__Attr_Id)))
		throw "控件错误: 属性 id 是必须的";
	if (! (this.controlToValidate = src.getAttribute(__Attr_ControlToValidate)))
		throw "控件错误: 属性 controlToValidate 是必须的";
	if (! (this.text = src.getAttribute(__Attr_Text)))
		throw "控件错误: 属性 text 是必须的";
	if ( ! (  (sRegExp = src.getAttribute(__Attr_ValidationExpression) ) ||
			  (this.defaultPattern = src.getAttribute(__Attr_DefaultPattern))  )  )
		throw "控件错误: 属性 validationExpression 和 defaultPattern 必须有一个不空";
	if (src.getAttribute(__Attr_PromptMode)       ) this.promptMode 	   		= src.getAttribute(__Attr_PromptMode);
	if (src.getAttribute(__Attr_ErrorMessage)     ) this.errorMessage		= src.getAttribute(__Attr_ErrorMessage);
	if (src.getAttribute(__Attr_Disabled)         ) this.disabled 			= src.getAttribute(__Attr_Disabled);
	if (src.getAttribute(__Attr_Color)   		 ) this.color				= src.getAttribute(__Attr_Color);
	if (sRegExp) {
		this.validationExpression = src.getAttribute(__Attr_ValidationExpression);
		this.validationExpression = new RegExp(this.validationExpression);

	}
	else {
		switch(this.defaultPattern.toLowerCase()) {
			case "word":
				this.validationExpression = __RegExp_Word;
				break;
			case "number":
				this.validationExpression = __RegExp_Number;
				break;
			case "float":
				this.validationExpression = __RegExp_Float;
				break;
			case "email":
				this.validationExpression = __RegExp_Email;
				break;
			case "date":
				this.validationExpression = __RegExp_Date;
				break;
			case "time":
				this.validationExpression = __RegExp_Time;
				break;
			case "datetime":
				this.validationExpression = __RegExp_DateTime;
				break;
			case "chinese":
				this.validationExpression = __RegExp_Chinese;
				break;
            case "image":
				this.validationExpression = __RegExp_Image;
				break;
			default:
				throw this.defaultPattern + "是不正确的模式";
				return false;
		}
	}
}

function checkRegularExpression() {
	var ctrl = document.getElementById(this.controlToValidate);
	var ctrlData = ctrl.value;
	if (ctrlData)
		return (this.validationExpression.test(ctrlData));
	else
		return true;
}

function CustomValidator() {
	this.inheritFrom = Validator;
	this.inheritFrom();
	this.init = initCustom;
	this.check = checkCustom;
}

function initCustom(src) {
	//src 是validator标记对象
	if (! (this.id = src.getAttribute(__Attr_Id)))
		throw "控件错误: 属性 id 是必须的";
	if (! (this.controlToValidate = src.getAttribute(__Attr_ControlToValidate)))
		throw "控件错误: 属性 controlToValidate 是必须的";
	if (! (this.text = src.getAttribute(__Attr_Text)))
		throw "控件错误: 属性 text 是必须的";
	if (src.getAttribute(__Attr_PromptMode)  ) this.promptMode 	 = src.getAttribute(__Attr_PromptMode);
	if (src.getAttribute(__Attr_ErrorMessage)) this.errorMessage = src.getAttribute(__Attr_ErrorMessage);
	if (src.getAttribute(__Attr_Disabled)    ) this.disabled 	 = src.getAttribute(__Attr_Disabled);
	if (src.getAttribute(__Attr_Color)       ) this.color		 = src.getAttribute(__Attr_Color);
}

function checkCustom() {
	var ctrl = document.getElementById(this.controlToValidate);
	if (ctrl.value.length > 0 || ctrl.value != "")
		return true;
	else
		return false;
}

function ValidationSummary() {
	//实现
}

function causesValidation() {
	//实现
}

/////////////////////////////////////////////  公共函数   /////////////////////////////////////////////////////


/* 类型转化函数 */
/* 原型 variant typeConvertor (variant dataValue, string dataType) */

/////////////////////////////////////////////////////////////////
// 参数说明
// dataValue 传入字符串类型或者可以直接转为字符串类型的数据
// dataType  传入字符串类型的数据类型描述 :[ Integer | Float | Date | String ]
//
// 返回
// 返回转化后的数据， 错误返回null
/////////////////////////////////////////////////////////////////
function typeConvertor(dataValue, dataType) {
	try {
		var tempV = dataValue.toString();
		var out;
		switch (dataType.toString().toLowerCase()) {
			case "integer":
				out = parseInt(tempV);
				break;
			case "float":
				out = parseFloat(tempV);
				break;
			case "date":
				out = Date.parse(tempV.replace(/-/g,"/"));
				break;
			case "string":
				out = tempV;
				break;
			default:
				throw dataType + "是不正确的数据类型";
				return null;
		}
		return out;
	}
	catch(e) {
		throw "数据类型转化错误:" + e;
		return null;
	}
}

/* 比较函数 */
/* 原型 boolean compare (variant src, variant des , string oper) */

/////////////////////////////////////////////////////////////////
// 参数说明
// src 传入进行比较的源数据
// des 传入进行比较的目标数据
// oper 比较运算符 : [ Equal | NotEqual | GreaterThan | GreaterThanEqual | LessThan | LessThanEqual ]
//					 [( eq | = )|( ne | <> )|( gt | > )|( ge | >= )|( lt | < )|( le | <= )]
//
// 返回
// 返回源数据和目标数据比较的运算的boolean 值， 错误返回false
/////////////////////////////////////////////////////////////////
function compare(src, des, oper){
	switch(oper.toLowerCase()) {
		case "equal":
		case "eq":
		case "==":
			return src == des;
		case "notequel":
		case "ne":
		case "!=":
			return src != des;
		case "greaterthan":
		case "gt":
		case ">":
			return src > des;
		case "greaterthanequal":
		case "ge":
		case ">=":
			return src >= des;
		case "lessthan":
		case "lt":
		case "<":
			return src < des;
		case "lessthanequal":
		case "le":
		case "<=":
			return src <= des;
		default:
			throw oper + "是不正确比较运算符";
			return false;
	}
}

/* 取得 Form 中所有的验证标记 <validator type="..." ...></validator> */
function getFormValidatorTags(src) {//src is Form
	var validatorTag = __Tag_Name;
	var validatorNameAttr = __Val_Name;
	var validatorTags = Array();
	var Tags = src.getElementsByTagName(validatorTag);//getElementsByTagName("tag") Returns a collection of objects with the specified TAGNAME

	var j=0;
	for(var i = 0; i< Tags.length; i++) {
		var nameAttr = Tags[i].getAttribute(__Attr_Name);
		if (nameAttr == __Val_Name) {
			validatorTags[j] = Tags[i];
			j++;
		}
	}
	return validatorTags;
}

function setFormValidator(src) {//src is Form
	var validators = Array();
	var validatorTags = getFormValidatorTags(src);
	for (var i = 0 ; i < validatorTags.length ; i++ ) {
		try {
			var validatorTag = validatorTags[i];
			var ctrlId = validatorTag.getAttribute(__Attr_ControlToValidate);
			var ctrl = document.getElementById(ctrlId);
			validatorTag.innerHTML = "";
			if (ctrl.ondeactivate == null) //给每个要验证的控件加事件
				ctrl.ondeactivate = checkInput;
				//ctrl.attachEvent('ondeactivate', checkInput);
			validators[i] = setValidator(validatorTag);
		}
		catch (e) {
			throw e;
		}
	}
	return validators;
}

function setInputValidator(src) {//src is input tag
	var validators = Array();
	var validatorTags = getFormValidatorTags(src.form);
	var j = 0;
	for(var i = 0 ; i < validatorTags.length ; i++)  {
		var validatorTag = validatorTags[i];
		if (src.id == validatorTag.getAttribute(__Attr_ControlToValidate)){
			try {
				validatorTag.innerHTML = "";
				validators[j++] = setValidator(validatorTag);
			}
			catch(e) {
				throw e;
			}
		}
	}
	return validators;
}

function setValidator(validatorTag) {
	var validator = null;
	switch (validatorTag.getAttribute(__Attr_Type).toLowerCase()) {
		case "requiredfield":
			validator = new RequiredFieldValidator();
			validator.init(validatorTag);
			break;
		case "compare":
			validator = new CompareValidator();
			validator.init(validatorTag);
			break;
		case "range":
			validator = new RangeValidator();
			validator.init(validatorTag);
			break;
		case "regularexpression":
			validator = new RegularExpressionValidator();
			validator.init(validatorTag);
			break;
		default :
			//custom
			validator = new CustomValidator();
			validator.init(validatorTag);
	}
	return validator;
}

function checkInput() {
	src = event.srcElement;
	try {
		var validators = setInputValidator(src); //src is input tag
		for (var i = 0 ; i < validators.length ; i++) {
			var validator = validators[i];
			if (! validator.check()) {
				validator.prompt();
				return false;
			}
		}
		return true;
	}
	catch (e) {
		alert ("Error:" + e);
		return false;
	}
}

//////////////暂时无用///////////////////////////////////
function validateForm(validators) {
	var out = true;
	for (var i = 0 ; i < validators.length ; i++) {
		var validator = validators[i]; //验证对象
		if (! validator.check()){
			validator.prompt();
			out = false;
		}
	}
	return out;
}

/////////////////////////////////////////////   接口函数  ///////////////////////////////////////////////////////
function checkForm(src) {//src 是表单
	try {

		var validators = setFormValidator(src);
		for (var i = 0 ; i < validators.length ; i++) {
			var validator = validators[i];
			var ctrl = document.getElementById(validator.controlToValidate);
			if (! validator.check()){
				validator.prompt();
				ctrl.focus();
				return false;
			}
		}
		return true;
	}
	catch (e) {
		alert("错误:" + e);
		return false;
	}
}
function DrawImage(ImgD,bheight,hwidth){
var image=new Image();
image.src=ImgD.src;
if(image.width>0 && image.height>0){

//if(image.width/image.height>= 260/116){
 // if(image.width>260){
     ImgD.height=bheight;
     ImgD.width=image.width*(bheight/image.height);
	 if(ImgD.width > hwidth){
		
		 ImgD.height = ImgD.height*(hwidth/ImgD.width );
		  ImgD.width = hwidth;
	 }
//  }else{
 //    ImgD.width=image.width;
 //    ImgD.height=image.height;
 // }
/*ImgD.alt="bigpic" */
//}
//else{
//  if(image.height>116){
 //    ImgD.height=116;
 //    ImgD.width=(image.width*116)/image.height;
//  }else{
  //  ImgD.width=image.width;
 //   ImgD.height=image.height;
 // }
//alert(ImgD.width+"uu"+ImgD.height)
/*ImgD.alt="bigpic" */
  //}
  }
}
