var sumly_valtimer = null;
var sumly_tmpvalobj = null;
var sumly_submitedform = null;
var sumly_valele = true;

function sumlyLostFocus(evnt)
{
	var obj;
	if(document.all)
		obj = event.srcElement;
	else
		obj = evnt.target;
	sumly_tmpvalobj = obj;
	sumly_valtimer = setTimeout('sumlyValidateElement()', 200);
}

function sumlyValidateElement()
{
	if(sumly_valele) {
		if(sumly_valtimer)
			clearTimeout(sumly_valtimer);
		if(sumly_tmpvalobj)
			sumlyValidator.Validate(sumly_tmpvalobj,false,true);
	}
	else
		sumly_valele = true;
}

function sumlyGetFocus(evnt)
{
	var obj;
	if(document.all)
		obj = event.srcElement;
	else
		obj = evnt.target;
	var oname = obj.name;
	var oriname = sumlyGetOriginalName(oname);
	if(sumly_tmpvalobj && sumlyGetOriginalName(sumly_tmpvalobj.name) == oriname)
		sumly_tmpvalobj = null;
	if(oriname != oname || obj.type == 'radio') {
		var groups = document.getElementsByName(oname);
		var firstele = document.getElementById(oriname+'[0]');
		if(firstele)
			obj = firstele;
		else
			obj = groups[0];
	}
	with(obj){
		var span1 = document.getElementById("info_"+oriname);
		if(span1)
			sumlyValidator.ShowMessage(obj,getAttribute("msg"),"getfocus");

		var span2 = document.getElementById("name_"+oriname);
		if(span2) {
			var pos = span2.className.lastIndexOf("n-");
			var state = span2.className.substring(pos+2);
			span2.className = span2.className.substring(0,pos+2) + "getfocus";
		}
	}
}

function sumlyGetOriginalName(name)
{
	var pos = name.lastIndexOf("[");
	if(pos > 0)
		return name.substr(0,pos);
	else
		return name;
}

function sumlySBC2DBC(value)
{
	var SBC = ['０','１','２','３','４','５','６','７','８','９','Ａ','Ｂ','Ｃ','Ｄ','Ｅ','Ｆ','Ｇ','Ｈ','Ｉ','Ｊ','Ｋ','Ｌ','Ｍ','Ｎ','Ｏ','Ｐ','Ｑ','Ｒ','Ｓ','Ｔ','Ｕ','Ｖ','Ｗ','Ｘ','Ｙ','Ｚ','ａ','ｂ','ｃ','ｄ','ｅ','ｆ','ｇ','ｈ','ｉ','ｊ','ｋ','ｌ','ｍ','ｎ','ｏ','ｐ','ｑ','ｒ','ｓ','ｔ','ｕ','ｖ','ｗ','ｘ','ｙ','ｚ','．','。','＠','－','：','／'];
	var DBC = ['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','.','.','@','-',':','/'];
	for(var i = 0; i < SBC.length; i ++) {
		while(value.indexOf(SBC[i])!=-1)
			value = value.replace(SBC[i],DBC[i]);
	}
	return value;
}

sumlyValidator = {
	Require : /^[\s|\S]+$/,
	Number : /^\d+$/,
	Integer : /^[+-]?\d+$/,
	Double : /^((([+-]?\d+)(\.\d+)?)|((([+-]?\d+)(\.\d+)?)[eE][+-]?\d+))$/,
	Currency : /^\d+(\.\d+)?$/,
	StandardNumCode : /^[1-9]\d*$/,
	Periods : /^\d{1,2}:\d{2}-\d{1,2}:\d{2}$/mg,

	Word : /^\w+$/,
	WordMinus : /^[\w-]+$/,
	StandardName : /^[a-zA-Z_]\w*$/,
	Letters : /^[A-Za-z]+$/,
	AlphaNum : /^[A-Za-z0-9]+$/,
	Lang : /^[a-z]{2}$/,

	Email : /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/,
	Phone : /^\d+.+$/,
	Url : /^http(s)?:\/\/(([A-Za-z0-9]+\.[A-Za-z0-9]+)|localhost)[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$/,
	Host : /^(\w+([-.]\w+)*\.\w+([-.]\w+)*)|localhost$/,

	qq : /^[1-9]\d{4,8}$/,
	skype : /^[a-zA-Z_][\w-,]{5,31}$/,

	UnSafe : /^(([A-Z]*|[a-z]*|\d*|[-_\~!@#\$%\^&\*\.\(\)\[\]\{\}<>\?\\\/\'\"]*)|.{0,5})$|\s/,
	IsSafe : function(str){return !this.UnSafe.test(str);},
	SafeString : "this.IsSafe(value)",
	Limit : "this.limit(value.length,getAttribute('min'),  getAttribute('max'))",
	Repeat : "value == document.getElementsByName(getAttribute('to'))[0].value",
	Range : "getAttribute('min') < value && value < getAttribute('max')",
	Compare : "this.compare(value,getAttribute('operator'),getAttribute('to'))",
	Custom : "this.Exec(value, getAttribute('regexp'))",
	Group : "this.MustChecked(getAttribute('name'), getAttribute('min'), getAttribute('max'))",
	File : "this.FileExtension(value,getAttribute('fileExt'))",
	FormObject : document.forms[0],
	FileExtension : function(value,fileExt) {
		var sExt=value.substr(value.lastIndexOf(".")+1);
		sExt=sExt.toLowerCase();
		if(fileExt.indexOf(sExt) == -1)
			return false;
		else
			return true;
	},
	ShowMessage : function(theElement,info,state) {
		with(theElement){
			var span1 = document.getElementById("info_"+sumlyGetOriginalName(name));
			if(span1) {
				var pos = span1.className.lastIndexOf("v-");
				span1.className = span1.className.substring(0,pos+2) + state;
				if(info)
					span1.innerHTML = info;
				else
					span1.innerHTML = "";
			}

			var span2 = document.getElementById("name_"+sumlyGetOriginalName(name));
			if(span2) {
				var pos = span2.className.lastIndexOf("n-");
				span2.className = span2.className.substring(0,pos+2) + state;
			}
		}
	},
	Validate : function(theElement,notEmpty,isCall){
		var eletype = theElement.type;
		var isRadio = (eletype == 'radio');
		var isSelect = (eletype == 'select-one');
		var isCheckbox = (eletype == 'checkbox');
		var isMultiSelect = (eletype == 'select-multiple');

		var oname = theElement.name;
		if(!oname)
			return true;
		var oriname = sumlyGetOriginalName(oname);

		if(!isMultiSelect) {
			if(isSelect && oriname != oname) {
				if(document.getElementById(oriname+'[0]'))
					theElement = document.getElementById(oriname+'[0]');
			}
			else {
				var groups = document.getElementsByName(oname);
				theElement = groups[0];
			}
		}

		with(theElement){
			var _dataType = getAttribute("dataType");
			if(typeof(_dataType) == "object" || _dataType == null)
				return true;
			if(_dataType == "Editor") {
				if(document.all && isCall) {
					var wf = window.frames[name+"___Frame"];
					wf.UpdateLinkedField();
					_dataType = "Limit";
				}
				else
					return true;
			}

			var _require = getAttribute("require");

			if(_dataType == 'DateTime') {
				var groups = document.getElementsByTagName('select');
				for(var i = 0; i < groups.length; i ++) {
					if(groups[i].name.substr(0,oriname.length) == oriname) {
						if(_require == "1" && groups[i].value == '') {
							this.ShowMessage(theElement,getAttribute("err"),"err");
							return false;
						}
					}
				}
				this.ShowMessage(theElement,getAttribute("pass"),"pass");
				return true;
			}
			else if(isRadio) {
				if(_require == "1") {
					var groups = document.getElementsByName(name);
					var ischecked = false;
					for(var i = 0; i < groups.length; i ++) {
						if(groups[i].checked) {
							ischecked = true;
							break;
						}
					}
					if(!ischecked) {
						this.ShowMessage(theElement,getAttribute("err"),"err");
						return false;
					}
				}
				else {
					this.ShowMessage(theElement,getAttribute("pass"),"pass");
					return true;
				}
			}
			else if(isSelect && getAttribute("elementType") == 'HierSelect') {
				if(getAttribute("AllKeys")) {
					this.ShowMessage(theElement,getAttribute("pass"),"pass");
					return true;
				}
				if(document.getElementById(oriname + '[0]').value != '') {
					var i = 1;
					while(1) {
						var hs = document.getElementById(oriname + '[' + i +']');
						if(typeof(hs) == "object" && hs != null) {
							if(hs.options.length > 0 && hs.value == '')  {
								this.ShowMessage(theElement,getAttribute("err"),"err");
								return false;
							}
							i ++;
						}
						else
							break;
					}
				}
			}

			if(!notEmpty && (isSelect || isMultiSelect) && options.length == 0)
				return true;

			if(_require == "1" && value == "" && !notEmpty) {
				this.ShowMessage(theElement,getAttribute("msg"),"lostfocus");
				return true;
			}

			if(_dataType == "Require" && _require != "1") {
				this.ShowMessage(theElement,getAttribute("pass"),"pass");
				return true;
			}
			if(_require != "1" && (value == "" || _dataType == 'Url' && value == "http://")) {
				this.ShowMessage(theElement,getAttribute("pass"),"pass");
				return true;
			}
			if(_require == "1" && !isMultiSelect && !isCheckbox && value == "") {
				this.ShowMessage(theElement,getAttribute("err"),"err");
				return false;
			}

			var result;
			if(_dataType == "ConfirmText") {
				_dataType = "Custom";
				theElement.value = value = sumlySBC2DBC(value);
			}
			switch(_dataType){
				case "Repeat":
				case "Range":
				case "Compare":
				case "Custom":
				case "Group": 
				case "Limit":
				case "SafeString":
				case "File":
					result = eval(this[_dataType]);
					break;
				case "Email":
				case "qq":
				case "skype":
				default:
					theElement.value = value = sumlySBC2DBC(value);
					var ii = 0;
					while(1) {
						result = this[_dataType].test(value);
						if(result || ii == 1)
							break;
						ii ++;
					}
					if(result) {
						var min = getAttribute("min");
						var max = getAttribute("max");
						if(min != null || max != null) {
							if(min != null)
								min = Number(min);
							if(max != null)
								max = Number(max);
							switch(_dataType) {
								case "Number":
								case "Integer":
								case "Double":
								case "Currency":
									value = Number(value);
									result = !(min != null && value < min || max != null && value > max);
									break;
								default:
									result = !(min != null && value.length < min || max != null && value.length > max);
							}
						}
					}
			}
			if(result) {
				call = getAttribute("callBack");
				if(call) {
					if(isCall)
						eval(call+"(theElement)");
					else {
						var span = document.getElementById("info_"+sumlyGetOriginalName(name));
						if(span) {
							var pos = span.className.lastIndexOf("v-");
							var state = span.className.substring(pos+2,span.className.length);
							if(state != "pass" && state != "getfocus" && state != "lostfocus")
								return false;
						}
					}
				}
				else
					this.ShowMessage(theElement,getAttribute("pass"),"pass");
				return true;
			}
			else {
				this.ShowMessage(theElement,getAttribute("err"),"err");
				return false;
			}
		}
	},
	ValidateAll : function(theForm){
		sumly_valele = false;
		this.FormObject = theForm || event.srcElement;
		var count = this.FormObject.elements.length;
		var isPassed = true;
		for(var i = 0; i < count; i ++){
			var el = this.FormObject.elements[i];
			if(!el.name)
				continue;
			if(!this.Validate(el,true,false)) {
				isPassed = false;
				window.location.href = '#anchor_' + sumlyGetOriginalName(el.name);
			}
		}
		return isPassed;
	},
	SubmitForm : function(theForm)
	{
		var ret = this.ValidateAll(theForm);
		if(ret == true) {
			this.FormObject = theForm || event.srcElement;
			var count = this.FormObject.elements.length;
			for(var i = 0; i < count; i ++){
				var el = this.FormObject.elements[i];
				if(el.getAttribute("elementType") == "MultiHierSelect") {
					for(var j = 0; j < el.options.length; j++)
						el.options[j].selected = true;
				}
			}

			if(theForm.Submit)
				theForm.Submit.disabled = true;
			else {
				if(sumly_submitedform == theForm.name)
					return false;
				else
					sumly_submitedform = theForm.name;
			}
		}
		return ret;
	},
	limit : function(len, min, max){
		if(min == null)
			min = 0;
		if(max == null)
			max = Number.MAX_VALUE;
		return min <= len && len <= max;
	},
	Exec : function(op, reg){
		return new RegExp(reg,"g").test(op);
	},
	compare : function(op1,operator,op2){
		if(operator != '!=' && operator != '==')
			return eval("op1" + operator + "op2");
		else
			return eval("Number(op1)" + operator + "Number(op2)");
	},
	MustChecked : function(name, min, max){
		var select = document.getElementById(name);
		var groups = document.getElementsByName(name);
		var hasChecked = 0;
		if(min == null)
			min = 0;
		if(!select || select.type.substring(0,6) != 'select') {
			if(max == null)
				max = groups.length;
			for(var i=groups.length-1; i >= 0; i--)
				if(groups[i].checked) hasChecked++;
		}
		else {
			if(max == null)
				max = select.options.length;
			if(select.getAttribute("elementType") == "MultiHierSelect")
				hasChecked = select.options.length;
			else {
				for(var i = 0; i < select.options.length; i++)
					if(select.options[i].selected) hasChecked++;
			}
		}
		return min <= hasChecked && hasChecked <= max;
	}
}

document.write("<iframe name=\"frameCheckForm\" src=\"about:blank\" width=\"0\" height=\"0\" scrolling=\"no\" style=\"border:0px\"></iframe><form name=\"checkDataForm\" method=\"post\" target=\"frameCheckForm\"><input type=\"hidden\" name=\"CheckingData\"></form>");
