function onionformgotopage(nform,npage) {
	//this function will submit the form to a page id
	var formobject = document.getElementById(nform);
	onionshowpageloader("Loading");
	document.location = onionaddqueryitem("formpage",npage,formobject.action);	
}

function onionformselectradio(nobject,nindex) {
	if (nobject.length == undefined) {
		nobject.checked = true;
	} else {
		nobject[nindex].checked = true;
	}
}

function onionformselectcheckbox(nid) {
	nobject = oniongetelement(nid);
	if (nobject != undefined) {
		if (nobject.checked == true) {
			nobject.checked = false;
		} else {
			nobject.checked = true;
		}
	}
}

function onionsubmittopopup(nform,ntitle,nurl,nwidth,nheight,nresizable,nscrollbars) {
	//default values
	if (nresizable == undefined) { var nresizable = true; }
	if (nscrollbars == undefined) { var nscrollbars = true; }
	
	//get form object
	var formobject = oniongetelement(nform);
	
	//remember the forms target
	var oldtarget = formobject.target;
	var oldaction = formobject.action;
	
	//create a popup
	onionpopup(ntitle,"",nwidth,nheight,nresizable,nscrollbars);
	
	//change target to popup window title
	formobject.action = nurl;
	formobject.target = ntitle;
	
	//submit the form
	formobject.submit();
	
	//restore the target
	formobject.target = oldtarget;
	formobject.action = oldaction
	
	//return click block
	return false;
}

function onionformcheckall(nid,nmatch) {
	//checks all checkboxes in a form
	var onionform = oniongetelement(nid);
	
	for(index=0; index < onionform.elements.length; index++) {
		if (onionform.elements[index].type == "checkbox") {
			if (onionform.elements[index].name.indexOf(nmatch,0) == 0) {
				if (onionform.elements[index].disabled == false) {
					onionform.elements[index].checked = true;
				}
			}
		}
	}
}

function onionformuncheckall(nid,nmatch) {
	//checks all checkboxes in a form
	var onionform = oniongetelement(nid);
	
	for(index=0; index < onionform.elements.length; index++) {
		if (onionform.elements[index].type == "checkbox") {
			if (onionform.elements[index].name.indexOf(nmatch,0) == 0) {
				if (onionform.elements[index].disabled == false) {
					onionform.elements[index].checked = false;
				}
			}
		}
	}
}

function onionformsubmit(nid) {
	var onionform = oniongetelement(nid);
	
	var firstinputerrorbox="",errorbox,build,onionindex,onionerrors,onionname,oniontitle,onionvalue,oniontype,onionmaxlength,onionminlength,onionrequired,onioncompare,onionerrorbox;
	
	// update any FCK instances.
	if (typeof(FCKeditorAPI) != "undefined") {
		
		var instances = FCKeditorAPI.Instances;
		var i;
		
		for(i in FCKeditorAPI.Instances) {
			
			if (FCKeditorAPI.Instances[i].IsDirty())
				FCKeditorAPI.Instances[i].UpdateLinkedField();
			
		}
		
	}
	
	var errors = new Array();
	
	//validate the form
	for (inputindex=0; inputindex < onionform.elements.length; inputindex++) {
		//alert("type = "+onionform.elements[inputindex].oniontype);
		if (onionform.elements[inputindex].oniontype != undefined) {
			//get onion properties
			onionname = onionform.elements[inputindex].name;
			oniontype = onionform.elements[inputindex].oniontype;
			oniontitle = onionform.elements[inputindex].oniontitle;
			onionmaxlength = onionform.elements[inputindex].onionmaxlength;
			onionminlength = onionform.elements[inputindex].onionminlength;
			onionrequired = onionform.elements[inputindex].onionrequired;
			onioncompare = onionform.elements[inputindex].onioncompare;
			onionerrorbox = onionform.elements[inputindex].onionerrorbox;
			
			//get value wit hspecial cases
			switch(oniontype) {
				case "folderpickpreview":
					//get value
					onionvalue = "";
					for(index=0; index < onionform.elements.length; index++) {
						if (onionform.elements[index].name == onionname) {
							if (onionform.elements[index].checked) {
								onionvalue = onionform.elements[index].value;
								break;
							}
						}
					}
					//escape
					onionvalue = onionvalue.replace("'","\\'");					
					break;
				case "radio":
					//get value
					onionvalue = "";
					for(index=0; index < onionform.elements.length; index++) {
						if (onionform.elements[index].name == onionname) {
							if (onionform.elements[index].checked) {
								onionvalue = onionform.elements[index].value;
								break;
							}
						}
					}
					//escape
					onionvalue = onionvalue.replace("'","\\'");					
					break;
				case "textarea":
					//get value
					onionvalue = onionform.elements[inputindex].value.replace("\n","\\n");
					//escape
					onionvalue = onionvalue.replace("'","\\'");
					break;
				case "simpletext":
					//get value
					onionvalue = onionform.elements[inputindex].value;
					//escape
					onionvalue = onionvalue.replace("'","\\'");
					break;
				case "checkbox":
					//get value
					onionvalue = oniongetelement(onionname).checked;
					break;
				default:
					//get value
					onionvalue = onionform.elements[inputindex].value;
					//escape
					onionvalue = onionvalue.replace("'","\\'");
					break;
			}
			
			// replace all CR LF with just a LF!!!!!
			onionvalue = onionvalue.replace(/\r\n/g,"\\n");
			
			//call validation function
			var s = "onionerrors = onionformvalidate_"+oniontype+"('"+onionvalue+"',"+onionminlength+","+onionmaxlength+","+onionrequired+",'"+onioncompare+"');";
			eval(s);
			
			// validate file in filelist
			// checks to see if the filename is in the filelist of files in this dir.
			// if it is, make an error.
			if (oniontype == "upload") {
				var filelist = eval("filelist_"+onionname);
				var filename = onionvalue.substring(onionvalue.lastIndexOf("\\")+1);
				if (filename.length > 0) {
					for(var i=0;i<filelist.length;i++) {
						if (filename == filelist[i]) {
							if (onionerrors) {
								onionerrors.push("file already exists");
							} else {
								onionerrors = ["file already exists"];
							}
						}
					}
				}
			}
			
			//add error to error array if it exists
			if (onionerrors != undefined && onionerrors.length > 0) {
				//create new object to store error information
				onionindex = errors.length;
				errors[onionindex] = new Object();
				errors[onionindex].name = onionname;
				errors[onionindex].title = oniontitle;
				errors[onionindex].messages = onionerrors;
				
				//display inline errors
				if (onionform.onionerrorsinline) {
					if (onionerrorbox != undefined) {
						//loop through messages
						build = "<ul class=\"onionformerrors\">\n";
						for(messageindex = 0; messageindex < errors[onionindex].messages.length; messageindex++) {
							build += "<li>"+errors[onionindex].messages[messageindex]+"</li>\n";
						}
						build += "</ul>\n";
						
						oniongetelement(onionerrorbox).innerHTML = build;
						
						//set first input error box
						if (firstinputerrorbox == "") {
							firstinputerrorbox = onionname;
						}
					}
				}
				
				//modify class
				onionform.elements[inputindex].className = onionform.onionclassbad;
				
				//check to see if this input needs to modify the class of linked objects
				if (onionform.elements[inputindex].onionmodifyclasslist != undefined) {
					for(list = 0; list < onionform.elements[inputindex].onionmodifyclasslist.length;list++) {
						if (onionform.elements[inputindex].onionmodifyclasslist[list] != undefined) {
							onionform.elements[inputindex].onionmodifyclasslist[list].className = onionform.onionclassbad;
						}
					}
				}
				
			} else {
				//reset class
				if (onionrequired) {
					var changeclass = onionform.onionclassrequired;
				} else {
					var changeclass = onionform.onionclassgood;
				}
				
				onionform.elements[inputindex].className = changeclass;
				
				//check to see if this input needs to modify the class of linked objects
				if (onionform.elements[inputindex].onionmodifyclasslist != undefined) {
					for(list = 0; list < onionform.elements[inputindex].onionmodifyclasslist.length;list++) {
						if (onionform.elements[inputindex].onionmodifyclasslist[list] != undefined) {
							onionform.elements[inputindex].onionmodifyclasslist[list].className = changeclass;
						}
					}
				}
				
				//reset errorbox
				if (oniongetelement(onionerrorbox) != undefined) { oniongetelement(onionerrorbox).innerHTML = ""; }
			}
		}
	}
	
	//check for found errors
	if (errors.length == 0) {
		//submit the form
		onionshowpageloader("Loading");
		return true;
	} else {
		//halt the form and display errors
		var build;
		//add errors to global error list
		errorbox = oniongetelement(onionform.onionerrorbox);
		if (errorbox != undefined) {
			build = "<ul class=\"onionformerrors\">\n";
			for(errorindex=0; errorindex < errors.length; errorindex++) {
				for(messageindex=0; messageindex < errors[errorindex].messages.length; messageindex++) {
					build += "<li>"+errors[errorindex].title+" "+errors[errorindex].messages[messageindex]+"</li>\n";
				}
			}
			
			errorbox.innerHTML = build;
		}
		
		//navigate page to error marker
		if (onionform.onionerrorsinline && firstinputerrorbox != "") {
			//try and navigate to inline input error
			document.location.hash = "anchor_"+firstinputerrorbox;
		} else {
			//navigate to error box
			document.location.hash = "anchor_"+onionform.onionerrorbox;
		}
		
		return false;
	}
}

// --- form validation classes ---
//these functions are speciffic validation classes for the varying import form types
function onionformvalidatebase(nerrors,nvalue,nmin,nmax,nrequired,ncompare) {
	//base validation rules
	//test maximum size
	if (nmax > 0 && nvalue.length > nmax) { nerrors[nerrors.length] = "too long, maximum length is "+nmax; }
	//test minimum size
	if (nmin > 0 && nvalue.length < nmin) { nerrors[nerrors.length] = "too short, minimum length is "+nmin; }
	//test required
	if (nrequired && nvalue.length == 0) { nerrors[nerrors.length] = "Required"; }
	//compare
	if (ncompare.length > 0) {
		var compare = oniongetelement(ncompare);
		if (compare != undefined && compare.value != nvalue) { nerrors[nerrors.length] = "doesnt match "+compare.oniontitle+" field"; }
	}
}

function onionformvalidate_humanvalidation(nvalue,nmin,nmax,nrequired,ncompare) {
	var errors = new Array();
	
	//default validation
	onionformvalidatebase(errors,nvalue,nmin,nmax,nrequired,ncompare);

	//return errors
	if (errors.length > 0) { return errors; }
}

//color
function onionformvalidate_color(nvalue,nmin,nmax,nrequired,ncompare) {
	var errors = new Array();
	
	//default validation
	onionformvalidatebase(errors,nvalue,nmin,nmax,nrequired,ncompare);
	
	//type validation
	if (nvalue.length > 0 && nvalue != "transparent" && !/^\#{1}[0-9abcdefABCDEF]{6}$/.test(nvalue)) { errors[errors.length] = "invalid color"; }

	//return errors
	if (errors.length > 0) { return errors; }
}

//image
function onionformvalidate_image(nvalue,nmin,nmax,nrequired,ncompare) {
	var errors = new Array();
	
	//default validation
	onionformvalidatebase(errors,nvalue,nmin,nmax,nrequired,ncompare);

	//return errors
	if (errors.length > 0) { return errors; }
}

//folder
function onionformvalidate_folder(nvalue,nmin,nmax,nrequired,ncompare) {
	var errors = new Array();
	
	//default validation
	onionformvalidatebase(errors,nvalue,nmin,nmax,nrequired,ncompare);

	//return errors
	if (errors.length > 0) { return errors; }
}

//file
function onionformvalidate_file(nvalue,nmin,nmax,nrequired,ncompare) {
	var errors = new Array();
	
	//default validation
	onionformvalidatebase(errors,nvalue,nmin,nmax,nrequired,ncompare);

	//return errors
	if (errors.length > 0) { return errors; }
}

//hidden
function onionformvalidate_hidden(nvalue,nmin,nmax,nrequired,ncompare) {
}

//textarea
function onionformvalidate_textarea(nvalue,nmin,nmax,nrequired,ncompare) {
	var errors = new Array();
	
	//default validation
	onionformvalidatebase(errors,nvalue,nmin,nmax,nrequired,ncompare);

	//return errors
	if (errors.length > 0) { return errors; }
}

function onionformvalidate_html(nvalue,nmin,nmax,nrequired,ncompare) {
	var errors = new Array();
	
	//default validation
	onionformvalidatebase(errors,nvalue,nmin,nmax,nrequired,ncompare);

	//return errors
	if (errors.length > 0) { return errors; }
}

function onionformvalidate_htmltext(nvalue,nmin,nmax,nrequired,ncompare) {
	var errors = new Array();
	
	//default validation
	onionformvalidatebase(errors,nvalue,nmin,nmax,nrequired,ncompare);

	//return errors
	if (errors.length > 0) { return errors; }
}

function onionformvalidate_comment(nvalue,nmin,nmax,nrequired,ncompare) {
	var errors = new Array();
	
	//default validation
	onionformvalidatebase(errors,nvalue,nmin,nmax,nrequired,ncompare);

	//return errors
	if (errors.length > 0) { return errors; }
}

//richtext
function onionformvalidate_richtext(nvalue,nmin,nmax,nrequired,ncompare) {
	var errors = new Array();
	
	//default validation
	onionformvalidatebase(errors,nvalue,nmin,nmax,nrequired,ncompare);

	//return errors
	if (errors.length > 0) { return errors; }
}

function onionformvalidate_simpletext(nvalue,nmin,nmax,nrequired,ncompare) {
	var errors = new Array();
	
	//default validation
	onionformvalidatebase(errors,nvalue,nmin,nmax,nrequired,ncompare);

	//return errors
	if (errors.length > 0) { return errors; }
}

//calendar
function onionformvalidate_calendar(nvalue,nmin,nmax,nrequired,ncompare) {
	var errors = new Array();
	
	//default validation
	onionformvalidatebase(errors,nvalue,nmin,nmax,nrequired,ncompare);

	//return errors
	if (errors.length > 0) { return errors; }
}

//listmaker
function onionformvalidate_listmaker(nvalue,nmin,nmax,nrequired,ncompare) {
	var errors = new Array();
	
	//default validation
	onionformvalidatebase(errors,nvalue,nmin,nmax,nrequired,ncompare);

	//return errors
	if (errors.length > 0) { return errors; }
}

//text
function onionformvalidate_text(nvalue,nmin,nmax,nrequired,ncompare) {
	var errors = new Array();
	
	//default validation
	onionformvalidatebase(errors,nvalue,nmin,nmax,nrequired,ncompare);

	//return errors
	if (errors.length > 0) { return errors; }
}

// section
function onionformvalidate_section(nvalue,nmin,nmax,nrequired,ncompare) {
	var errors = new Array();
	
	//default validation
	onionformvalidatebase(errors,nvalue,nmin,nmax,nrequired,ncompare);

	//return errors
	if (errors.length > 0) { return errors; }
}

// article
function onionformvalidate_article(nvalue,nmin,nmax,nrequired,ncompare) {
	var errors = new Array();
	
	//default validation
	onionformvalidatebase(errors,nvalue,nmin,nmax,nrequired,ncompare);

	//return errors
	if (errors.length > 0) { return errors; }
}

function onionformvalidate_toggle(nvalue,nmin,nmax,nrequired,ncompare) {

	var errors = new Array();
	
	//default validation
	onionformvalidatebase(errors,nvalue,nmin,nmax,nrequired,ncompare);
	
	//type validation

	//return errors
	if (errors.length > 0) { return errors; }
}

//folderpickpreview
function onionformvalidate_folderpickpreview(nvalue,nmin,nmax,nrequired,ncompare) {

	var errors = new Array();
	
	//default validation
	onionformvalidatebase(errors,nvalue,nmin,nmax,nrequired,ncompare);
	
	//type validation

	//return errors
	if (errors.length > 0) { return errors; }
}

//radio
function onionformvalidate_radio(nvalue,nmin,nmax,nrequired,ncompare) {

	var errors = new Array();
	
	//default validation
	onionformvalidatebase(errors,nvalue,nmin,nmax,nrequired,ncompare);
	
	//type validation

	//return errors
	if (errors.length > 0) { return errors; }
}

//slider
function onionformvalidate_slider(nvalue,nmin,nmax,nrequired,ncompare) {
	var errors = new Array();
	
	//default validation
	//onionformvalidatebase(errors,nvalue,nmin,nmax,nrequired,ncompare);
	
	//type validation
	if (nvalue.length > 0 && !/^[0-9\.]+$/.test(nvalue)) { errors[errors.length] = "invalid slider number"; }
	if (nmin > 0 && nvalue < nmin) { errors[errors.length] = "Value too small"; }
	if (nmax > 0 && nvalue > nax) { errors[errors.length] = "Value too large"; }

	//return errors
	if (errors.length > 0) { return errors; }
}

//number
function onionformvalidate_number(nvalue,nmin,nmax,nrequired,ncompare) {
	var errors = new Array();
	
	//default validation
	onionformvalidatebase(errors,nvalue,nmin,nmax,nrequired,ncompare);
	
	//type validation
	if (nvalue.length > 0 && !/^[\-0-9\.\,]+$/.test(nvalue)) { errors[errors.length] = "invalid number"; }

	//return errors
	if (errors.length > 0) { return errors; }
}


//seftext
function onionformvalidate_seftext(nvalue,nmin,nmax,nrequired,ncompare) {
	var errors = new Array();
	
	//default validation
	onionformvalidatebase(errors,nvalue,nmin,nmax,nrequired,ncompare);
	
	//type validation
	if (nvalue.length > 0 && !/^[a-zA-Z0-9\-\_]+$/.test(nvalue)) { errors[errors.length] = "Disallowed charaters found. Please only use a-z, 0-9, - and _"; }

	//return errors
	if (errors.length > 0) { return errors; }
}




//username
function onionformvalidate_username(nvalue,nmin,nmax,nrequired,ncompare) {
	var errors = new Array();
	
	//default validation
	onionformvalidatebase(errors,nvalue,nmin,nmax,nrequired,ncompare);
	
	//type validation
	if (nvalue.length > 0 && !/^[a-zA-Z0-9]+$/.test(nvalue)) { errors[errors.length] = "invalid username, alphanumerics only"; }

	//return errors
	if (errors.length > 0) { return errors; }
}

function onionformvalidate_name(nvalue,nmin,nmax,nrequired,ncompare) {
	var errors = new Array();
	
	//default validation
	onionformvalidatebase(errors,nvalue,nmin,nmax,nrequired,ncompare);
	
	//type validation
	if (nvalue.length > 0 && !/^[a-zA-Z0-9\s]+$/.test(nvalue)) { errors[errors.length] = "invalid name, alphanumerics only"; }

	//return errors
	if (errors.length > 0) { return errors; }
}

//subject
function onionformvalidate_subject(nvalue,nmin,nmax,nrequired,ncompare) {
	var errors = new Array();
	
	//default validation
	onionformvalidatebase(errors,nvalue,nmin,nmax,nrequired,ncompare);
	
	//type validation
	if (nvalue.length > 0 && !/^[a-zA-Z0-9\s\_\-\#\:\[\]\.\*\(\)\{\}\%\!\"\£\$\&\+\=\<\>\,\;]+$/.test(nvalue)) { errors[errors.length] = "invalid name, alphanumerics only"; }

	//return errors
	if (errors.length > 0) { return errors; }
}

//password
function onionformvalidate_password(nvalue,nmin,nmax,nrequired,ncompare) {
	var errors = new Array();
	
	//default validation
	onionformvalidatebase(errors,nvalue,nmin,nmax,nrequired,ncompare);

	//type validation
	
	//return errors
	if (errors.length > 0) { return errors; }
}

function onionformvalidate_submit(nvalue,nmin,nmax,nrequired,ncompare) {

}

//field name
function onionformvalidate_fieldname(nvalue,nmin,nmax,nrequired,ncompare) {
	var errors = new Array();
	
	//default validation
	onionformvalidatebase(errors,nvalue,nmin,nmax,nrequired,ncompare);

	//type validation
	if (nvalue.length > 0 && !/^[a-zA-Z0-9\-\_]+$/.test(nvalue)) { errors[errors.length] = "invalid field name, only the following characters allowed a-z 0-9 _ -"; }
	
	//check for numeric
	if (onionis_numeric(nvalue)) { errors[errors.length] = "invalid field name, cant contain <u>only</u> numbers"; }
	
	//return errors
	if (errors.length > 0) { return errors; }
}

function onionformvalidate_foldername(nvalue,nmin,nmax,nrequired,ncompare) {
	var errors = new Array();
	
	//default validation
	onionformvalidatebase(errors,nvalue,nmin,nmax,nrequired,ncompare);

	//type validation
	if (nvalue.length > 0 && !/^[A-Za-z0-9\s\'\_\!\(\)\-]+$/.test(nvalue)) { errors[errors.length] = "invalid, alphanumerics \' _ ! ( ) - only"; }
	
	//check for numeric
	if (onionis_numeric(nvalue)) { errors[errors.length] = "invalid, cant contain <u>only</u> numbers"; }
	
	//return errors
	if (errors.length > 0) { return errors; }
}

//email
function onionformvalidate_email(nvalue,nmin,nmax,nrequired,ncompare) {
	var errors = new Array();
	
	//default validation
	onionformvalidatebase(errors,nvalue,nmin,nmax,nrequired,ncompare);

	//type validation
	if (nvalue.length > 0 && !/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(nvalue)) { errors[errors.length] = "invalid email"; }
	
	//return errors
	if (errors.length > 0) { return errors; }
}

function onionformvalidate_website(nvalue,nmin,nmax,nrequired,ncompare) {
	var errors = new Array();
	
	//default validation
	onionformvalidatebase(errors,nvalue,nmin,nmax,nrequired,ncompare);

	//type validation
	
	//return errors
	if (errors.length > 0) { return errors; }
}

function onionformvalidate_upload(nvalue,nmin,nmax,nrequired,ncompare) {
	var errors = new Array();
	
	if (nrequired && !nvalue) {
		errors[errors.length] = "Required";
	}

	if (errors.length > 0) { return errors; }
}

//hidden
function onionformvalidate_dropdown(nvalue,nmin,nmax,nrequired,ncompare) {
	var errors = new Array();
	
	//default validation
	onionformvalidatebase(errors,nvalue,nmin,nmax,nrequired,ncompare);

	//return errors
	if (errors.length > 0) { return errors; }
}

function onionformvalidate_region(nvalue,nmin,nmax,nrequired,ncompare) {
	var errors = new Array();
	
	//default validation
	onionformvalidatebase(errors,nvalue,nmin,nmax,nrequired,ncompare);

	//return errors
	if (errors.length > 0) { return errors; }
}

function onionformvalidate_country(nvalue,nmin,nmax,nrequired,ncompare) {
	var errors = new Array();
	
	//default validation
	onionformvalidatebase(errors,nvalue,nmin,nmax,nrequired,ncompare);

	//return errors
	if (errors.length > 0) { return errors; }
}


//checkbox
function onionformvalidate_checkbox(nvalue,nmin,nmax,nrequired,ncompare) {
	var errors = new Array();
	
	//default validation
	//onionformvalidatebase(errors,nvalue,nmin,nmax,nrequired,ncompare);
	if (nrequired && nvalue=="false") errors[errors.length] = "Required";
	
	//type validation
	//return errors
	if (errors.length > 0) { return errors; }
}

//get functions
function oniongetradiovalue(nid) {
	var elements = oniongetelementsbyname(nid);
	
	if (elements == undefined || elements.length == 0) {
		return "";
	} else {
		for(var i = 0; i < elements.length; i++) {
			if(elements[i].checked) {
				return elements[i].value;
			}
		}
	}
}
