/*
 * P-Name  : SeekVForm (JavaScript)
 * Version : 0.01 Beta
 * Author  : Zeuxis Lo
 * Pub-Date: 13/06/2008 18:58
 * Others  : Based On Validator v1.05
 *
 * =========
 * 25/6/2008 16:08
 * [新增] Radio , Checkbox 檢查
 * [新增] 資料確認的需求
 */
SeekVForm = {
	// Var
	Require : {
		message : 'Must input value',
		regExp : /.+/
	},
	Email : {
		message : 'Must contain a valid email address.',
		regExp : /^w+([.-]?w+)*@w+([.-]?w+)*(.w{2,3})+$/
	},
	Url : {
		message : 'Must contain a valid URL address.',
		regExp : /(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/
	},
	Number : {
		message : 'Must contain a valid URL address.',
		regExp : /^\d+$/
	},
	Integer : {
		message : 'Must input integer',
		regExp : /^[-\+]?\d+$/
	},
	Double : {
		message : 'Must input double',
		regExp : /^[-\+]?\d+(\.\d+)?$/
	},
	English : {
		message : 'Must input english only',
		regExp : /^[A-Za-z]+$/
	},
	Chinese : {
		message : 'Must input chinese',
		regExp : /^[\u0391-\uFFE5]+$/
	},
	Username : {
		message : 'Must input english and number, more than 4 charater',
		regExp : /^[a-zA-Z]\w{4,}$/i
	},
	Custom : {
		message : 'Input Data Does Not Match Rule :: Please Conact Admin',
		regExp : "this.Exec(elm.value, elm.getAttribute('regexp'))"
	},
	Filter : {
		message : 'Data Format Error',
		regExp : "this.DoFilter(elm.value, elm.getAttribute('format'))"
	},
	Repeat : {
		message : 'Twice Input Not Match',
		regExp : "elm.value == document.getElementsByName(elm.getAttribute('to'))[0].value"
	},
	Checkboxs : {
		message : 'Must Checked',
		regExp : "this.MustChecked(elm.getAttribute('name'), elm.getAttribute('min'), elm.getAttribute('max'))"	
	},
	Radios : {
		message : 'Must Checked Once',
		regExp : "this.MustChecked(elm.getAttribute('name'), elm.getAttribute('min'), elm.getAttribute('max'))"
	},

	ErrorItem : [document.forms[0]],
	ErrorMessage : ["Error List：\t\t\t\t"],

	// Method
	Validate : function(form, mode) {
		var obj = form || event.srcElement;
		
		this.ErrorMessage.length = 1;
		this.ErrorItem.length = 1;
		this.ErrorItem[0] = obj;

		for(var i=0; i<obj.elements.length; i++) {
			var elm = obj.elements[i];
			var valid = elm.getAttribute('valid');
			var must = elm.getAttribute('must');

			this.ClearState(elm);

			if (typeof(valid) == 'object' || typeof(this[valid]) == 'undefined')  continue;
			if (must == "false" && elm.value == "") continue;

			var msg = elm.getAttribute("msg") == null ? this[valid]['message'] : elm.getAttribute("msg");
			
			switch(valid) {
				case 'Custom': case 'Filter':
				case 'Repeat': case 'Radios':
				case 'Checkboxs':
					if (!eval(this[valid]['regExp'])) this.AddError(i, msg);
				break;
				default: if (!this[valid]['regExp'].test(elm.value)) this.AddError(i, msg); break;
			}

			elm = null;
			msg = null;
			must= null;
		}

		if (this.ErrorMessage.length > 1) {
			mode = mode || 1;
			var errCount = this.ErrorItem.length;
			switch(mode) {
				case 2 :
					for(var i=1;i<errCount;i++) this.ErrorItem[i].style.color = "#FF0000";
				case 1 :
					alert(this.ErrorMessage.join("\n"));
					this.ErrorItem[1].focus();
					break;
				case 3 :
					for(var i=1;i<errCount;i++) {
						try{
							var span = document.createElement("SPAN");
							span.id = "__ErrorMessagePanel";
							span.style.color = "red";
							this.ErrorItem[i].parentNode.appendChild(span);
							span.innerHTML = this.ErrorMessage[i].replace(/\d+:/,"*");
						}catch(e) {
							alert(e.description);
						}
					}
					this.ErrorItem[1].focus();
					break;
				default :
					alert(this.ErrorMessage.join("\n"));
					break;
			}
			mode = null;
			span = null;
			errCount = null;
			return false;
		}
		obj = null;
	},

	AddError : function(index, str) {
		this.ErrorItem[this.ErrorItem.length] = this.ErrorItem[0].elements[index];
		this.ErrorMessage[this.ErrorMessage.length] = this.ErrorMessage.length + ":" + str;
	},

	ClearState : function(elm) {
		with(elm) {
			if (style.color == "red") style.color = "";
			var lastNode = parentNode.childNodes[parentNode.childNodes.length-1];
			if (lastNode.id == "__ErrorMessagePanel") parentNode.removeChild(lastNode);
			lastNode = null;
		}
	},

	Exec : function(str, rule, option) {
		return new RegExp(rule, option || 'g').test(str);
	},

	DoFilter : function(input, filter){
		return this.Exec(input, "^.+\.(?=EXT)(EXT)$".replace(/EXT/g, filter.split(/\s*,\s*/).join("|")), 'gi');
	},

	MustChecked : function(name, min, max){
		var groups = document.getElementsByName(name);
		var hasChecked = 0;
		min = min || 1;
		max = max || groups.length;
		for(var i=groups.length-1;i>=0;i--) {
			if(groups[i].checked) hasChecked++;
		}
		groups = null;
		return min <= hasChecked && hasChecked <= max;
	}
}
