/**
 * writted by lgh
 * 
 * start 2007.4.27
 */
 
 var TYPE = {
	 REQUIRED:["required"," is required."],
	 NUMBER:["number"," is not a valid number."],
	 MAXLENGTH:["maxLength"," is too long."],
	 MINXLENGTH:["minLength"," is too short"],
	 MAXVALUE:["maxValue"," "],
	 MINVALUE:["minValue"," "],
	 INVALIDCHARS:["wrongChars", " contains wrong character(s)."],
     INVALIDDATE:["wrongDate"," Wrong Date."]
 }
var msgObj = new Array();//for message
var msgDispObj = new Array();//for message display
jQuery.fn.validation = function(options){
	var result = false;
    var setting = {
        type:0,      //type: 0 for normal validation,1 for multil-validation;
		mode:0,
		errorClass:"errorClass",
		required:" 不能为空.",
		number:" 必须是数值.",
		maxLength:" 取值太长.",
		minLength:" 取值太短.",
		maxValue:" 取值太大.",
		minValue:" 取值太小.",
		invalidChars:" 包含非法字符.",
		invalidDate:"日期格式错误."
    }

    if(options) {
        jQuery.extend(setting, options);
		TYPE.REQUIRED[1]=setting.required;
		TYPE.NUMBER[1]=setting.number;
		TYPE.MAXLENGTH[1]=setting.maxLength;
		TYPE.MINXLENGTH[1]=setting.minLength;
		TYPE.MAXVALUE[1]=setting.maxValue;
		TYPE.MINVALUE[1]=setting.minValue;
		TYPE.INVALIDCHARS[1]=setting.invalidChars;
		TYPE.INVALIDDATE[1] = setting.invalidDate;
    }
	
	removeErrorMsg(this,setting);
	msgObj.length = 0;
	msgDispObj.length = 0;
	var elements = $("[@validators]",this);//.find("[@validators]");
	result = validate(elements);
	parseMessage(setting);
    
    return result;
}

function removeErrorMsg(setting){
	for(var i=0;i<msgDispObj.length;i++){
		if(msgDispObj[i]!=null)
			$(msgDispObj[i]).remove();
	}
		//$(obj).find("div." + setting.errorClass).remove();
}

function AddMessage(obj,type,fname){//obj is element object,type is error type,such as TYPE.REQUIRED
	var arrayTemp = new Array();
	arrayTemp.push(obj);
	arrayTemp.push(type);
	arrayTemp.push(fname);
	return msgObj.push(arrayTemp);
}

function validate(elements,setting){
	$(elements).each(function(){
		var OBJ = this;
		
		var eTag = $(OBJ).get(0).tagName;		
		//is "SELECT" element
		var isSelect = false;
		if(eTag=="SELECT")
			isSelect = true;
		
		var temp = $(OBJ).attr("validators");

		//JSON方式处理验证类型,例如validators={required:true,maxLength:255}
		var validators = eval("validators=" + temp);
		
		if(validators.name!=null || (validators.type=='datetime' && validators.required==true) ){
			var attrName = validators.name;
			var friendlyName = validators.friendlyname;
			var attrObj = $("[@name='" + attrName +"']").get(0);
			var value = $(attrObj).val();
			for(prop in validators){
				
				if(prop==TYPE.REQUIRED[0]){//for required
					if(validators[prop]==true){
						if(validators.type=='datetime'){
							var yearObj = $("[@name='" + attrName +".year']").get(0);
							var monthObj = $("[@name='" + attrName +".month']").get(0);
							var dayObj = $("[@name='" + attrName +".day']").get(0);
							var yearValue = $(yearObj).val();
							var monthValue = $(monthObj).val();
							var dayValue = $(dayObj).val();
							if(yearValue==-1|| monthValue==-1 || dayValue==-1)
								AddMessage(OBJ,TYPE.INVALIDDATE,friendlyName);
						}else{
							if($.trim(value)==""){//for STRING
								AddMessage(OBJ,TYPE.REQUIRED,friendlyName);
							}else if(isSelect && value=="-1"){//for SELECT
								AddMessage(OBJ,TYPE.REQUIRED,friendlyName);
							}else{//for SPECIAL CHARS
								var re = /\<|\>|\&|\'|\"/;
								if(re.test(value))
									AddMessage(OBJ,TYPE.INVALIDCHARS,friendlyName);//for some special chars,such as:&',<,>
							}//end if
						}//end if
					}//end if
				} //end if
				
				if(prop==TYPE.NUMBER[0]){//for number
					if(validators[prop]==true){
						if($.trim(value)!=""){
							var re = /^(-?\d+)([,\.\d]+)?$/;
							if(!re.test(value))
								AddMessage(OBJ,TYPE.NUMBER,friendlyName);
						}
					}
				} //end if
				
				if(prop==TYPE.MAXLENGTH[0]){//for string max length
					if(value.length>validators[prop])
						AddMessage(OBJ,TYPE.MAXLENGTH,friendlyName);//
				}
				
				if(prop==TYPE.MINXLENGTH[0]){
					//not used yet
				}
				
				if(prop==TYPE.MAXVALUE[0]){
					//not used yet
				}
				
				if(prop==TYPE.MINVALUE[0]){
					//not used yet
				}

			}//end for
		}
	});
	
	if(msgObj.length>0){
		return false;
	}else
		return true;
}

function parseMessage(setting){
	var len = msgObj.length;
	var tempMessage = "";
	for(var i=0;i<len;i++){
		var element = msgObj[i][0];
		var type = msgObj[i][1];

		if(setting.type==0){//for single validation,also muliti-validation
			var fname = msgObj[i][2];
			if(setting.mode==1){
				var tmpObj = $("<div class='" + setting.errorClass + "' style='color:red'>" + type[1] + "</div>");
				$(element).append(tmpObj);
				msgDispObj.push(tmpObj);
			}else{
				tempMessage +=fname + type[1] + "\n";
			}
		}else if(setting.type==1){//for multi-validation
            var td = $(element).parent();
            if($(td).get(0).tagName=="TD"){
                var tr = $(td).parent();
                var hidden = $(tr).find("input[@type='hidden']");
                var hiddenName = $(hidden).attr("name");
                var numTd = $(tr).find("td[@headers='OrdID']");//第几条记录
                var numIndex = $(numTd).text();
                var thID = $(td).attr("headers");
                var fname = $("#" + thID).text();
                
                if(hiddenName=="incRows"){//新增的条目
                    tempMessage += "序号" + numIndex + "(新增): " + fname + type[1] + "\n";
                }else if(hiddenName=="editRows"){//编辑的条目
                    tempMessage += "序号" + numIndex + "(编辑): " + fname + type[1] + "\n";
                }
                               
            }
		}else{
            tempMessage = "输入错误!";
		}
	}
	
	if($.trim(tempMessage)!=""){
		if(setting.mode==0)
			alert(tempMessage);
	}

}
