/* 

	200708*pike

		in your page, use 
		
			<script language="javascript" type="text/javascript" src="Forms.js" ></script>
			
			
		and
			
			<form onsubmit="if (self.Forms) return Forms.checkForm(this)">
				<input type="text" jscheck="true" required="true" required-err="Fill this out scumbag!" />
			</form>

		don't rely on javascript checks. 
		javascript sometimes stops working.
		this is for convenience only.
			
*/



	
	var Forms = {	
	

		selectAllOptions	: FRMSelectAllOptions,
		promptNewOption		: FRMPromptNewOption,
		deleteOption		: FRMDeleteOption,
		checkForm 			: FRMCheckForm,
		checkFormElement 	: FRMCheckFormElement,
		clearInput			: FRMClearInput,
		
		
		debug				: FRMDebug,
		debugtype			: (top.document.location.href.indexOf("?tron")!=-1 || 
								top.document.location.href.indexOf("&tron")!=-1)?"alert":"status"

	}
	
	function FRMDebug(msg) {
		if (this.debugtype=="alert" && !confirm(msg)) this.debugtype="status";
		else if (this.debugtype=="status") window.status = msg;
	}
	
	/* --------------
		Form Tools
		
		new attribute on form elements:
		
			jscheck 					- if this evaluates to true, check is performed
			jserror 					- message if jscheck exists, but fails
			required, required-err		- boolean, checks if has value or selection or is checked 
			minlength, minlength-err 	- int, min stringlength
			maxlength, maxlength-err 	- int, max stringlength (but browser catches maxlenth)
			refused, refused-err		- string or csv, checks if value or selection does not contain refused values
			accepted, accepted-err		- string or csv, checks if value or selection contains nothing but accepted values
			refusedchars, refusedchars-err		- string, checks if selected values do not contain refused chars
			acceptedchars, acceptedchars-err	- string, checks if selected values contain nothing but accepted chars
			matchinput, matchinput-err	- html dom id, check if value or selection matches values or selection of refered object
			confirm, confirm-err		- string, ask for confirmation y/n
			zap							- string, if value contains this it is replaced with ""
			ignore						- string, if this equals value, value is zapped to ""
	-----------------*/
	
	function FRMClearInput(formelm,defmsg) {
		if (formelm.value==defmsg) formelm.value="";
	}
	
	function FRMSelectAllOptions(selelm) {
		for (var oc=0;oc<selelm.options.length;oc++) {
			selelm.options[oc].selected=true;
		}
	}
	
	function FRMPromptNewOption(selelm,msg,def) {
		if (!msg) msg = "Enter a new value ..";
		if (!def) def = "";
		var word = top.prompt(msg,def);
		if (word) {
			selelm.options[selelm.options.length] = new Option(word,word);
			selelm.selectedIndex = selelm.options.length-1;
		}
	}
	
	function FRMDeleteOption(selelm,idx) {
		for (var oc=idx;oc<selelm.options.length;oc++) {
			selelm.options[oc]=selelm.options[oc+1];
		}
		selelm.options.length -= 1;
	}
	
	function FRMCheckForm(theform,elmid,siteaccess) {
		if (!siteaccess || siteaccess=="gb" ) base = "";
		else siteaccess = "/"+siteaccess;
		if (!theform) theform = document.forms[0];
		if (theform) {
		
			// exceptional form handling
			if (theform.id=="special") {
				
			}
			
			
			// check elms
			var elm = (elmid)?document.getElementById(elmid):theform;
			if (elm) {
				
				var checks = new Array();
				var inputs = elm.getElementsByTagName("input");
				var selects = elm.getElementsByTagName("select");
				var textareas = elm.getElementsByTagName("textarea");
				for (var ec=0;ec<inputs.length;ec++) 	{ checks[checks.length] = this.checkFormElement(inputs.item(ec)); }
				for (var ec=0;ec<selects.length;ec++)  	{ checks[checks.length] = this.checkFormElement(selects.item(ec)); }
				for (var ec=0;ec<textareas.length;ec++) { checks[checks.length] = this.checkFormElement(textareas.item(ec)); }
			

				// count your false checks
				var success = true;
				var message = "";
				for (var cc=0;cc<checks.length;cc++) {
					if (!checks[cc][0]) {
						success = false;
						// dont do double messages (checkboxes etc)
						if (message.indexOf(checks[cc][1])==-1) message += checks[cc][1];
					}
				}
				
				if (message) message = message.substring(0,message.length-2)+".";
				
				// alert message if errors
				if (!success) {
					alert(message);
					return false;
				} else return true;
		
			} else alert("Error: Can't find element "+elmid);	
		} else  alert("Error: No form to check ?");
		
		return false;

		
	}
	
	function FRMCheckFormElement(formelm) {
		// return a array[boolean:success,string:message]
		var success = true;
		var message = "";
		//alert(formelm.getAttribute("jscheck"));
		if (formelm.getAttribute("jscheck")) {
			if (eval(formelm.getAttribute("jscheck"))) {
				if ( formelm.getAttribute("type")=="checkbox" || formelm.getAttribute("type")=="radio") {
					// checkboxes and radiobuttons
					if (formelm.getAttribute("required")) {
						//alert("radio required");
						// find all form elms with the same name, and see
						// if any one of them is checked
						var havecheck = false;
						//var elmname = formelm.getAttribute("name");
						//alert(elmname);
						//var elmform = formelm.form;
						//alert(elmform);
						var elms = formelm.form[formelm.getAttribute("name")];
						//alert(elms);
						//alert(elms.length);
						for (var ec=0;ec<elms.length;ec++) {
							if (elms[ec].checked) {
								havecheck=true; break;
							}
						}
						if (!havecheck) {
							success = false; 
							message += formelm.getAttribute("required-err")+";\n";
						}
					}
				} else if (formelm.options && !formelm.getAttribute("options")) {
					// option elements
					if (formelm.getAttribute("required")) {
						if (formelm.selectedIndex==-1 || 
							(!formelm.options[formelm.selectedIndex].value 
								&& !formelm.options[formelm.selectedIndex].value)
						) {
							success = false; message += formelm.getAttribute("required-err")+";\n";
						}
					}
					if (formelm.getAttribute("refused")) {
						var refarr = formelm.getAttribute("refused").split(",");
						for (var ec=0;ec<formelm.options.length;ec++) {
							if (formelm.options[ec].selected) {
								var selval = formelm.options[ec].value;
								if (!selval) selval = formelm.options[ec].text;
								for (var rc=0;rc<refarr.length;rc++) {
									if (selval==refarr[rc]) {
										success = false; message += formelm.options[ec].text+": "+formelm.getAttribute("refused-err")+";\n";
									}
								}
							}
						}
					}
					if (formelm.getAttribute("accepted")) {
						var refarr = formelm.getAttribute("accepted").split(",");
						for (var ec=0;ec<formelm.options.length;ec++) {
							if (formelm.options[ec].selected) {
								var selval = formelm.options[ec].value;
								if (!selval) selval = formelm.options[ec].text;
								for (var rc=0;rc<refarr.length;rc++) {
									if (selval!=refarr[rc]) {
										success = false; message += formelm.options[ec].text+": "+formelm.getAttribute("accepted-err")+";\n";
									}
								}
							}
						}
					}
					if (formelm.getAttribute("refusedchars")) {
						var accepted = true;
						for (var ec=0;ec<formelm.options.length;ec++) {
							if (formelm.options[ec].selected) {
								var selval = formelm.options[ec].value;
								for (var cc=0; cc<selval.length;cc++) {
									if (formelm.getAttribute("refusedchars").indexOf(selval.substring(cc,cc+1))!=-1) {
										accepted = false; break;
									}
								}
							}
						}
						if (!accepted) {
							success = false; message += formelm.getAttribute("refusedchars-err")+";\n";
						}
						
					}
					if (formelm.getAttribute("acceptedchars")) {
						var accepted = true;
						for (var ec=0;ec<formelm.options.length;ec++) {
							if (formelm.options[ec].selected) {
								var selval = formelm.options[ec].value;
								for (var cc=0; cc<selval.length;cc++) {
									if (formelm.getAttribute("acceptedchars").indexOf(selval.substring(cc,cc+1))==-1) {
										accepted = false; break;
									}
								}
							}
						}
						if (!accepted) {
							success = false; message += formelm.getAttribute("acceptedchars-err")+";\n";
						}
					}
				} else {
					// all other elements (.value)
					if (formelm.getAttribute("required") && !formelm.value.length) {
						success = false; message += formelm.getAttribute("required-err")+";\n";
					}
					if (formelm.getAttribute("minlength") && formelm.value.length<formelm.getAttribute("minlength")) {
						success = false; message += formelm.getAttribute("minlength-err")+";\n";
					}
					if (formelm.getAttribute("maxlength") && formelm.value.length>formelm.getAttribute("maxlength")) {
						success = false; message += formelm.getAttribute("maxlength-err")+";\n";
					}
					if (formelm.getAttribute("refused") && formelm.value.indexOf(formelm.getAttribute("refused")!=-1)) {
						var accepted = true;
						for (var cc=0; cc<formelm.value.length;cc++) {
							if (formelm.getAttribute("refused").indexOf(formelm.value.substring(cc,cc+1))!=-1) {
								accepted = false; 
							}
						}
						if (!accepted) {
							success = false; message += formelm.getAttribute("refused-err")+";\n";
						}
					}
					if (formelm.getAttribute("accepted")) {
						var accepted = true;
						for (var cc=0; cc<formelm.value.length;cc++) {
							if (formelm.getAttribute("accepted").indexOf(formelm.value.substring(cc,cc+1))==-1) {
								accepted = false; 
							}
						}
						if (!accepted) {
							success = false; message += formelm.getAttribute("accepted-err")+";\n";
						}
					}
					if (formelm.getAttribute("zap") && formelm.value.indexOf(formelm.getAttribute("zap"))!=-1) {
						formelm.value=formelm.value.replace(formelm.getAttribute("zap"),"");
					}
					if (formelm.getAttribute("ignore") && formelm.value== formelm.getAttribute("ignore")) {
						formelm.value="";
					}
				}
				
				// any element
				if (formelm.getAttribute("matchinput")) {
					var srcvalue = formelm.value;
					if (formelm.options) srcvalue = formelm.options[formelm.selectedIndex].value;
					var dstelm = formelm.form[formelm.getAttribute("matchinput")];
					if (dstelm) {
						var dstvalue = dstelm.value;
						if (dstelm.options) dstvalue = dstelm.options[dstelm.selectedIndex].value;
						if (dstvalue!=srcvalue) {
							success = false; message += formelm.getAttribute("matchinput-err")+";\n";
						}
					} else {
						success = false; message += "Can't find matching element '"+formelm.getAttribute("matchinput")+"';\n";
					}
				}
				
				if (formelm.getAttribute("confirm")) {
					if (!confirm(formelm.getAttribute("confirm"))) {
						success = false; message += formelm.getAttribute("confirm-err")+";\n";
					}
				}
			} else {
				success=false; message += formelm.getAttribute("jserr")+";\n";
			}
		} // else dont check
		if (!success && !message) message = "Field "+formelm.name+" does not validate.";
		return [success,message];
	}
	


	
