// JavaScript Document
/*	Author: Kalianto Wong
	Version: 1.0
	Year: 2007
	Filename: KForm.js
	Desc: Contains two objects KForm and mouse objects.
	Tested for IE 6 and IE 7, Mozilla Firefox 2.0.x	
*/

var mouse = {

	init: function(ev) {
		if(document.all){
			this.ev = ev;
			this.x = ev.clientX;
			this.y = document.body.scrollHeight;
			this.target = ev.target;
			
		} else {
			this.ev = window.event;
			this.x = ev.pageX;
			this.y = ev.pageY;
			this.target = ev.srcElement;
		}
	
		/*
		this.e = (e) ? e : window.event;
		this.x = (e.pageX) ? e.pageX : e.clientX;
		this.y = (e.pageY) ? e.pageY : e.clientY;	
		this.target = (e.target) ? e.target : e.srcElement;
		*/
	},

	getX: function(e){
		
		var e = new mouse.init(e);
		return e.x;
		
	},
	
	getY: function(e){
		
		var e = new mouse.init(e);
		return e.y;
		
	}
	
	// Use:
	/*
	var offX = mouse.getX(event);
	*/
};

var KForm = {
	
	/* This variable value will be assigned in validate function, it holds the reference to the form object */
	eForm: '',
	/* This variable k_count holds the number of error happened, if 0 means no error */
	k_count: 0,
	
	
	error: {"errmsg" : "Error found", "type" : "required" },
	
	/* Email validation member, contain error message, function name to validate email */
	k_email: {"errmsg" : "Email is required", "type" : "email", "func" : "checkmail", "errmsg2" : "Email is invalid" },

	/* Standard date check */
	datecheck: {"errmsg" : "Date is required", "type" : "datecheck", "datetype" : "dd-mm-yyyy",  "errmsg2" : "Date must be in dd-mm-yyyy format" },

	/* Standard time check */
	timecheck: {"errmsg" : "Time is required", "type" : "timecheck", "timetype" : "hh:mm",  "errmsg2" : "Time format is invalid" },


	/* This is the error icon */
	error_pic: '<img src="/KForm/images/error.jpg" width="16" height="16" style="vertical-align:middle">&nbsp;&nbsp;',
	
	/*This is the close button to hide the error box after it appear */
	close_btn: '<div style="text-align:center"><a href="#" onclick="KForm.CloseBox();return false;"><img src="/KForm/images/closebutton.gif" border="0" alt="Close"></a></div>',
	/* This is the div id where the error will be displayed */
	error_div: 'KForm_error',
	
	/* Change this to any function if k_count = 0, if no error, this function will be called */
	save_func: 'KForm.SubmitForm',
	
	message: '',
	
	/* Validate form input base on criteria set above */
	validate: function(f){
		KForm.k_count = 0;
		KForm.eForm = "document."+f.name;
		var name = '';
		for(var i = 0; i<f.elements.length;i++){
			name = f.elements[i].name;
			value = f.elements[i].value;
			
			if(typeof(KForm[name]) != "undefined"){
				//alert(name+"-"+value); 
				result = KForm.check(name,value);
				if(result == true){
					KForm.showMsg(name);
					KForm.k_count += 1;
					break;
				} 
			}
		}
		// If no error happened
		if(KForm.k_count == 0) {
			eval(KForm.save_func+"("+KForm.eForm+")");
		}
	},
	
	/* Check email function, check if email is empty, and valid */
	checkmail: function(name,value){

		if(value == "") return true;
		else {
			
			apos=value.indexOf("@");
			dotpos=value.lastIndexOf(".");
		
			if (apos<1||dotpos-apos<2||value.length-dotpos<2) {
				 KForm[name].message = "Email is invalid";
			  	return true;
			} else return false;
	
		}		
	},
	
	/* Check if input field is empty or not */
	check: function(name,value){
		//If field is empty
		//alert(name+"-"+value);
		if(KForm[name].type == "required"){
			if(value == "") {
				KForm[name].message = KForm[name].errmsg;
				return true;
			} else return false;
		}
		
		/* If field is supposed to hold some value (for select box) */
		if(KForm[name].type == "valuecheck"){
			if(value == KForm[name].checkvalue) {
				KForm[name].message = KForm[name].errmsg;
				return true;
			} else return false;
		}
		
		//if check field return true, which mean error
		//For email or function 
		if(KForm[name].type == "func" || KForm[name].type == "email"){
			//alert(KForm[name].func);
			if(value == "") {
				KForm[name].message = KForm[name].errmsg;
				return true;
			} else if(eval("KForm."+KForm[name].func+"('"+name+"','"+value+"')")) {
				KForm[name].message = KForm[name].errmsg2;
				return true;
			} else return false;
		}
		
		//For regular expression check
		if(KForm[name].type == "regex"){
			if(KForm[name].pattern.test(value)) return false;
			else return true;
		}
		
		//For date check
		if(KForm[name].type == "datecheck"){
			if(value == "") {
				KForm[name].message = KForm[name].errmsg;
				return true;
			} else if(KForm[name].datetype == "dd-mm-yyyy" || KForm[name].datetype == "mm-dd-yyyy"){	
				var pattern = /^\d{2}-\d{2}-\d{4}$/;
				if(pattern.test(value)) {
					return false;
				} else {
					KForm[name].message = KForm[name].errmsg2;
					return true;
				}
			}
		}

		if(KForm[name].type == "timecheck"){
			if(value == "") {
				KForm[name].message = KForm[name].errmsg;
				return true;
			} 
			
			if(KForm[name].timetype == "hh:mm"){	
				var pattern = /^\d{2}:\d{2}$/;
				if(pattern.test(value)) {
					return false;
				} else {
					KForm[name].message = KForm[name].errmsg2;
					return true;
				}
			} 
			
			if(KForm[name].timetype == "hh:mm:ss"){	
				var pattern = /^\d{2}:\d{2}:\d{2}$/;
				if(pattern.test(value)) {
					return false;
				} else {
					KForm[name].message = KForm[name].errmsg2;
					return true;
				}
			} 

		}

	},
	
	/* display error message */
	showMsg: function(name){
		
		KForm.focusfield = name;
		//alert(KForm[name].errmsg);	
		//$(KForm.error_div).className = 'KForm_show';
		var offX = mouse.getX(KForm.eventclick);
		var offY = mouse.getY(KForm.eventclick);
		//alert(offY);
		//alert(offX);
		
		$(KForm.error_div).style.top = (offY-250)+"px";
		$(KForm.error_div).style.left = (offX+100)+"px";
		$(KForm.error_div).innerHTML = KForm.error_pic+KForm[name].message+"<br/><br/>"+KForm.close_btn;
		//$(name).focus();
		$j("#"+KForm.error_div).show("normal");
	},

	
	
	element2query: function(f){	
	//Change form element to query string for xmlhttprequest
		var fields = f.elements;
		var qs = '';
		
		for(var i = 0; i < fields.length; i ++){
			qs+=fields[i].name+"="+fields[i].value+"&";
		}	
		qs = qs.substring(0,qs.length-1);
		
		return qs;
	
	},
	
	/* Standard function for form submit if no error happen */
	SubmitForm: function(f){
		//alert("submitting form"+f.name+" to "+KForm.url);
		f.action = KForm.url;
		f.submit();
	
	},
	
	CloseBox: function(){
		
		//$(KForm.error_div).className = "KForm_hide";
		$j("#"+KForm.error_div).hide("normal");
		$(KForm.focusfield).focus();
		KForm.focusfield = '';
		
		
	}
};

