function validate_form(form_id,form_action,back_color,err_back_color)
{
	/* ----- FORM VALIDATION FUNCTION -----
	CALL FUNCTION WITH:
	 - form_id: ID of form
	 - form_action: Action of form on submit (e.g. submit.php)
	 - back_color: Normal background color of form fields
	 - err_back_color: Color to change background of field to on validation error
	*/

	// DECLARE VARIABLE FOR STORING ERROR MESSAGE
	var validate_error = "";
	var validate_row = 0;

	// DECLARE STANDARD ERROR MESSAGES
	var email_err_msg = "Please enter a valid email address";
	var numonly_err_msg = "This field can only contain numbers";
	var cost_err_msg = "Please enter a valid cost";
	
	// DECLARE REGULAR EXPRESSIONS
	var num_only=/[^0-9]/gi;

	// DECLARE ARRAYS TO STORE FIELDS TO VALIDATE
	var required_fields=new Array();
	var required_errors=new Array();
	var email_fields=new Array();
	var cost_fields=new Array();
	var numonly_fields=new Array();       
	var required_radios=new Array();
	var required_radio_errors=new Array();
	
	var required_rows=new Array();
	var email_rows=new Array();
	var cost_rows=new Array();
	var numonly_rows=new Array();       
	var required_radios_rows=new Array();

	// SET VALIDATION FIELDS BASED ON FORM_ID - NEW CASE FOR EACH FORM
	switch(form_id){
		case "frmContact":
			required_fields[0] = "fmEmail";
			required_fields[1] = "fmComments";
			required_errors[0] = "Required";
			required_errors[1] = "Required";
			required_rows[0] = 2;
			required_rows[1] = 3;
			email_fields[0] = "fmEmail";
			email_rows[0] = 2;
			break;
		case "frmSetup":
			required_fields[0] = "fmName";
			required_fields[1] = "fmEmail";
			required_fields[2] = "fmComments";
			required_errors[0] = "Required";
			required_errors[1] = "Required";
			required_errors[2] = "Required";
			required_rows[0] = 1;
			required_rows[1] = 2;
			required_rows[2] = 6;
			email_fields[0] = "fmEmail";
			email_rows[0] = 2;
			break;
		case "frmComments":
			required_fields[0] = "fmName";
			required_fields[1] = "fmEmail";
			required_fields[2] = "fmComments";
			required_errors[0] = "Required";
			required_errors[1] = "Required";
			required_errors[2] = "Required";
			required_rows[0] = 1;
			required_rows[1] = 2;
			required_rows[2] = 3;
			email_fields[0] = "fmEmail";
			email_rows[0] = 2;
			break;
		case "frmLogin":
			required_fields[0] = "fmEmail";
			required_fields[1] = "fmPassword";
			required_errors[0] = "Required";
			required_errors[1] = "Required";
			required_rows[0] = 1;
			required_rows[1] = 2;
			break;
		case "frmForgotPassword":
			required_fields[0] = "fmEmail";
			required_errors[0] = "Required";
			required_rows[0] = 1;
			break;
		case "frmAccount":
			required_fields[0] = "fmEmail";
			required_fields[1] = "fmName";
			required_errors[0] = "Required";
			required_errors[1] = "Required";
			required_rows[0] = 1;
			required_rows[1] = 2;
			break;
		case "frmUser":
			required_fields[0] = "fmEmail";
			required_fields[1] = "fmName";
			required_errors[0] = "Required";
			required_errors[1] = "Required";
			required_rows[0] = 1;
			required_rows[1] = 2;
			break;
		case "frmZoneHome":
			required_fields[0] = "fmName";
			required_fields[1] = "fmPostcode";
			required_fields[2] = "fmAddress1";
			required_fields[3] = "fmTown";
			required_fields[4] = "fmLaunched";
			required_fields[5] = "fmProfile";
			required_errors[0] = "Required";
			required_errors[1] = "Required";
			required_errors[2] = "Required";
			required_errors[3] = "Required";
			required_errors[4] = "Required";
			required_errors[5] = "Required";
			required_rows[0] = 1;
			required_rows[1] = 2;
			required_rows[2] = 3;
			required_rows[3] = 6;
			required_rows[4] = 13;
			required_rows[5] = 15;
			email_fields[0] = "fmEmail";
			email_rows[0] = 11;
			break;
		case "frmAddZonePromo":
			required_fields[0] = "fmText";
			required_errors[0] = "Required";
			required_rows[0] = 3;
			break;
		case "frmEditZonePromo":
			required_fields[0] = "fmEditText";
			required_errors[0] = "Required";
			required_rows[0] = 10;
			break;
		case "frmNewsHome":
			required_fields[0] = "fmTitle";
			required_fields[1] = "fmDate";
			required_fields[2] = "fmSummary";
			required_errors[0] = "Required";
			required_errors[1] = "Required";
			required_errors[2] = "Required";
			required_rows[0] = 1;
			required_rows[1] = 2;
			required_rows[2] = 3;
			break;
		case "frmGallery":
			required_fields[0] = "fmImage";
			required_errors[0] = "Required";
			required_rows[0] = 1;
			break;
		case "frmExtrasLargeHeading":
			required_fields[0] = "fmHeading";
			required_errors[0] = "Required";
			required_rows[0] = 1;
			break;
		case "frmEventHome":
			required_fields[0] = "fmTitle";
			required_fields[1] = "fmDateFrom";
			required_fields[2] = "fmSummary";
			required_errors[0] = "Required";
			required_errors[1] = "Required";
			required_errors[2] = "Required";
			required_rows[0] = 1;
			required_rows[1] = 2;
			required_rows[2] = 4;
			break;
		case "frmCaseHome":
			required_fields[0] = "fmTitle";
			required_fields[1] = "fmSummary";
			required_errors[0] = "Required";
			required_errors[1] = "Required";
			required_rows[0] = 1;
			required_rows[1] = 3;
			break;
		case "frmFAQ":
			required_fields[0] = "fmTitle";
			required_fields[1] = "fmText";
			required_errors[0] = "Required";
			required_errors[1] = "Required";
			required_rows[0] = 1;
			required_rows[1] = 2;
			break;
		case "frmPageHome":
			required_fields[0] = "fmTitle";
			required_errors[0] = "Required";
			required_rows[0] = 1;
			break;
		case "frmZonePageHome":
			required_fields[0] = "fmTitle";
			required_errors[0] = "Required";
			required_rows[0] = 2;
			break;
		case "frmAddHomemedia":
			required_fields[0] = "fmTitle";
			required_fields[1] = "fmSubheading";
			required_fields[2] = "fmMedia";
			required_fields[3] = "fmText";
			required_errors[0] = "Required";
			required_errors[1] = "Required";
			required_errors[2] = "Required";
			required_errors[3] = "Required";
			required_rows[0] = 1;
			required_rows[1] = 2;
			required_rows[2] = 3;
			required_rows[3] = 4;
			break;
		case "frmAddSetupStep":
			required_fields[0] = "fmImage";
			required_errors[0] = "Required";
			required_rows[0] = 3;
			break;
		case "frmKeepitgoingHome":
			required_fields[0] = "fmTitle";
			required_fields[1] = "fmDate";
			required_fields[2] = "fmSummary";
			required_fields[3] = "fmLinkhref";
			required_fields[4] = "fmLinktext";
			required_errors[0] = "Required";
			required_errors[1] = "Required";
			required_errors[2] = "Required";
			required_errors[3] = "Required";
			required_errors[4] = "Required";
			required_rows[0] = 1;
			required_rows[1] = 2;
			required_rows[2] = 3;
			required_rows[3] = 4;
			required_rows[4] = 5;
			break;
		case "frmPopupHome":
			required_fields[0] = "fmTitle";
			required_fields[1] = "fmContent";
			required_errors[0] = "Required";
			required_errors[1] = "Required";
			required_rows[0] = 1;
			required_rows[1] = 2;
			break;
		case "frmHomeCollected":
			required_fields[0] = "fmCollected";
			required_errors[0] = "Required";
			required_rows[0] = 1;
			break;
		case "frmAddZoneMedia":
			required_fields[0] = "fmMedia";
			required_errors[0] = "Required";
			required_rows[0] = 2;
			break;
		case "frmEstablishedZones":
			required_fields[0] = "fmNumber";
			required_errors[0] = "Required";
			required_rows[0] = 1;
			break;
	}
	
	// RESET FIELD BACKGROUNDS
	
	var counter;
	for (i=0;i<required_fields.length;i++){
		document.getElementById(required_fields[i]).style.background = back_color;}
	for (i=0;i<email_fields.length;i++){
		document.getElementById(email_fields[i]).style.background = back_color;}
	for (i=0;i<numonly_fields.length;i++){
		document.getElementById(numonly_fields[i]).style.background = back_color;}
	for (i=0;i<cost_fields.length;i++){
		document.getElementById(cost_fields[i]).style.background = back_color;}	

	for (i=0;i<required_rows.length;i++){
		document.getElementById("tdError"+required_rows[i]).innerHTML = "&nbsp;";}
	for (i=0;i<email_rows.length;i++){
		document.getElementById("tdError"+email_rows[i]).innerHTML = "&nbsp;";}
	for (i=0;i<numonly_rows.length;i++){
		document.getElementById("tdError"+numonly_rows[i]).innerHTML = "&nbsp;";}
	for (i=0;i<cost_rows.length;i++){
		document.getElementById("tdError"+cost_rows[i]).innerHTML = "&nbsp;";}
	for (i=0;i<required_radios_rows.length;i++){
		document.getElementById("tdError"+required_radios_rows[i]).innerHTML = "&nbsp;";}
	
	// WHEN VALIDATING FIELDS, IT CHECKS IF IT HAS A VALUE BEFORE SENDING AN ERROR, AS IT MAY NOT BE A REQUIRED FIELD
	// VALIDATION IS ORDERED SO THAT REQUIRED FIELD ERRORS ARE DISPLAYED FIRST
	// VALIDATION CHECKS WHETHER FIELD IS ENABLED - THAT WAY REQUIRED FIELDS THAT ARE DISABLED WILL NOT BE VALIDATED AND CAN BE LEFT EMPTY
	
	var some_checked = 0;
	for (counter=0;counter<required_radios.length;counter++){
		radio_len = eval("document." + form_id + "." + required_radios[counter] + ".length");
		for (i = 0; i<radio_len; i++){
			if (eval("document." + form_id + "." + required_radios[counter] + "["+ i +"].checked")){
				some_checked = 1;
			}
		}
		if (some_checked == 0){
			validate_error = required_radio_errors[counter];
			validate_row = required_radios_row[counter];			
			break;
		}
		some_checked = 0;
	}

	// VALIDATE COST FIELDS
	for (counter=0;counter<cost_fields.length;counter++){
		if (document.getElementById(cost_fields[counter]).disabled==false && document.getElementById(cost_fields[counter]).value!="" && !validate_cost(cost_fields[counter])){
			document.getElementById(cost_fields[counter]).style.background=err_back_color;
			document.getElementById(cost_fields[counter]).focus();
			validate_error=cost_err_msg;
			validate_row = cost_rows[counter];
			break;
		}
	}
	
	// VALIDATE NUMBER ONLY FIELDS
	for (counter=0;counter<numonly_fields.length;counter++){
		if (document.getElementById(numonly_fields[counter]).disabled==false && document.getElementById(numonly_fields[counter]).value!="" && document.getElementById(numonly_fields[counter]).value.match(num_only)){
			document.getElementById(numonly_fields[counter]).style.background=err_back_color;
			document.getElementById(numonly_fields[counter]).focus();
			validate_error=numonly_err_msg;
			validate_row = numonly_rows[counter];
			break;
		}
	}
	
	// VALIDATE EMAIL FIELDS
	for (counter=0;counter<email_fields.length;counter++){
		if (document.getElementById(email_fields[counter]).disabled==false && document.getElementById(email_fields[counter]).value!="" && !validate_email(email_fields[counter])){
			document.getElementById(email_fields[counter]).style.background=err_back_color;
			document.getElementById(email_fields[counter]).focus();
			validate_error=email_err_msg;
			validate_row = email_rows[counter];
			break;
		}
	}
	
	// VALIDATE REQUIRED FIELDS
	for (counter=0;counter<required_fields.length;counter++){
		if (document.getElementById(required_fields[counter]).disabled==false && document.getElementById(required_fields[counter]).value==""){
			document.getElementById(required_fields[counter]).style.background=err_back_color;
			document.getElementById(required_fields[counter]).focus();
			validate_error=required_errors[counter];
			validate_row = required_rows[counter];
			break;
		}
	}

	// IF A VALIDATION ERROR HAS BEEN GENERATED, DISPLAY TO THE USER, OTHERWISE, SUBMIT THE FORM
	if (validate_error!=""){
		document.getElementById("tdError"+validate_row).innerHTML = validate_error;
	}
	else{
		if (form_action != "ajax"){
			document.getElementById(form_id).action = form_action;
			document.getElementById(form_id).submit();
		}
		else{
			submit_ajax_form(form_id);
		}
	}
}

function validate_email(field)
{
	apos=document.getElementById(field).value.indexOf("@");
	dotpos=document.getElementById(field).value.lastIndexOf(".");
	if (apos<1||dotpos-apos<2){
		return false;}
	else{
		return true;
	}
}

function validate_cost(field)
{
	firstdotpos=document.getElementById(field).value.indexOf(".");
	seconddotpos=document.getElementById(field).value.lastIndexOf(".");
	if (firstdotpos != seconddotpos)  //More than one dot
		return false;
	if (firstdotpos==(document.getElementById(field).value.length-1))  //Dot is last character
		return false;
	if (firstdotpos==0) // Dot is first character
		return false;
	if (firstdotpos==-1)  //Dot is not present
		return false;
	if (document.getElementById(field).value.length-firstdotpos != 3)  //There are not two characters after dot
		return false;
	return true;
}

function submit_ajax_form(form_id){
	
	switch(form_id){
		case "frmContact":
			submit_contact_form();
			break;
		case "frmSetup":
			submit_setup_form();
			break;
		case "frmComments":
			submit_comments_form();
			break;
		case "frmExtrasLargeHeading":
			submit_extras_largeheading_form();
			break;
	}
	
}











function submit_contact_form(){
	
	var fld_name = document.getElementById("fmName").value;
	var fld_email = document.getElementById("fmEmail").value;
	var fld_comments = document.getElementById("fmComments").value;
	
	var getstr = "name="+fld_name+"&email="+fld_email+"&comments="+fld_comments;
	
	var theDiv = document.getElementById("divInitialContent");
	var theMSG = document.getElementById("divFinalContent").innerHTML;
	
	ajax = create_ajax();
	
	ajax.onreadystatechange=function(){
		if (ajax.readyState==4 && ajax.status==200){
			//response = ajax.responseText;
			//alert (response);
			theDiv.innerHTML = theMSG;
		}
	}
	
	theDiv.innerHTML = "<p>Processing...</p>";
	
	run_ajax(ajax,"GET","/_ajax/contact_form.php",getstr);
	
}

function submit_setup_form(){
	
	var fld_name = document.getElementById("fmName").value;
	var fld_email = document.getElementById("fmEmail").value;
	var fld_phone = document.getElementById("fmPhone").value;
	var fld_organisation = document.getElementById("fmOrganisation").value;
	var fld_sector = document.getElementById("fmSector").value;
	var fld_comments = document.getElementById("fmComments").value;
	
	var getstr = "name="+fld_name+"&email="+fld_email+"&phone="+fld_phone+"&organisation="+fld_organisation+"&sector="+fld_sector+"&comments="+fld_comments;
	
	var theDiv = document.getElementById("divInitialContent");
	var theMSG = document.getElementById("divFinalContent").innerHTML;
	
	ajax = create_ajax();
	
	ajax.onreadystatechange=function(){
		if (ajax.readyState==4 && ajax.status==200){
			//response = ajax.responseText;
			//alert (response);
			theDiv.innerHTML = theMSG;
		}
	}
	
	theDiv.innerHTML = "<p>Processing...</p>";
	
	run_ajax(ajax,"GET","/_ajax/setup_form.php",getstr);
	
}

function submit_comments_form(){
	
	var fld_name = document.getElementById("fmName").value;
	var fld_email = document.getElementById("fmEmail").value;
	var fld_comments = document.getElementById("fmComments").value;
	var fld_id = document.getElementById("fmID").value;
	
	var getstr = "name="+fld_name+"&email="+fld_email+"&comments="+fld_comments+"&id="+fld_id;
	
	var theDiv = document.getElementById("divFormContent");
	
	ajax = create_ajax();
	
	ajax.onreadystatechange=function(){
		if (ajax.readyState==4 && ajax.status==200){
			//response = ajax.responseText;
			//alert (response);
			theDiv.innerHTML = "<p>Thank you for your comment.</p>";
			theDiv.innerHTML += "<p>All comments are reviewed by the zone administrator before being published.</p>";
		}
	}
	
	theDiv.innerHTML = "<p>Processing...</p>";
	
	run_ajax(ajax,"GET","/_ajax/comments_form.php",getstr);
	
}

function submit_extras_largeheading_form(){
	
	var fld_heading = document.getElementById("fmHeading").value;
	
	var divExtrasCreated = document.getElementById("divExtrasCreated");
	var ulExtrasCreated = document.getElementById("ulExtrasCreated");
	
	var theDiv = document.getElementById("divInitialContent");
	var theMSG = document.getElementById("divFinalContent").innerHTML;

	theDiv.innerHTML = theMSG;

	var parent = document.getElementById("divCreatedExtras");
	var new_input = document.createElement('input');
	
	new_input.setAttribute('id','fmExtras_LargeHeading_'+extras_largeheadings);
	new_input.setAttribute('name','fmExtras_LargeHeading_'+extras_largeheadings);
	new_input.setAttribute('type','hidden');
	new_input.setAttribute('value',fld_heading);
	
	parent.appendChild(new_input);
	
	divExtrasCreated.style.display = "block";
	new_link = '<li id="li_large_heading_'+extras_largeheadings+'">Large Heading '+extras_largeheadings+'<br />';
	new_link += '<a class="small" href="#insert" onclick="insertAtCursor(document.getElementById(\'fmContent\'), \'\\n&lt;LARGE HEADING '+extras_largeheadings+'&gt;\\n\');">[insert]</a> ';
	new_link += '<a class="small" href="#edit" onclick="">[edit]</a> ';
	new_link += '<a class="small" href="#delete" onclick="delete_extra(document.getElementById(\'fmExtras_LargeHeading_'+extras_largeheadings+'\'),\'large_heading\','+extras_largeheadings+');">[delete]</a></li>';
	ulExtrasCreated.innerHTML += new_link;
	alert (ulExtrasCreated.innerHTML);
	
	extras_largeheadings += 1;
	
}
