var form_save_last_form_initted = null;
function initForm(form_obj){
	form_save_last_form_initted = form_obj
	// Inits prompts
	for(var i=0; i<form_obj.elements.length; i++){
		var field = form_obj.elements[i];
		if (field.name.split("_prompt").length > 1 ){
			var prompt_field = field;
			var target_field = form_obj[field.name.split("_prompt")[0]];
			initPrompt(target_field, prompt_field.value);
		}
	} 
}

function getFieldLabel(field_obj){

	//alert(field_obj)
	
	var str_label = "";	
	if (field_obj.name){
		var field_name = field_obj.name;
	} else {
		var field_name = "";
	}
	
	var form = field_obj.form
	
	// Might be a req field (For a radio group)
	//if (field_name.split("_req").length  > 1 ){
	field_name = field_name.split("_req").join("");
	//////////////////////////////////////////////}
	
	if (form[field_name + "_label"]){
		str_label = form[field_name + "_label"].value;
	} else {
		str_label = convertFieldNameToLabel(field_name);
	}
	
	return str_label;
		
}


function initPrompt(obj_field, str_prompt ){
	
	obj_field["str_prompt"] = str_prompt;
	
	obj_field.onfocus = function(){
		if (this.value == this.str_prompt ){
			this.value = "";
		}	
			<!---- Custom ---------------------->
		if (this.name == "friends_name"){
			showReferDetails();
		} else if (this.name == "subscribe_email_address"){
			showNewsletterDetails();
		}
		<!---- Custom (x)---------------------->
	}	
	
	obj_field.onblur = function(){
		if (this.value.length < 1 ){
			this.value = this.str_prompt;
		}
	}
	
	if (obj_field.value.length<1){
		obj_field.value = str_prompt;						
	}	
	
} 



function isOneRadioGroupFieldChecked(form_obj){
	for (var i=0; i < form_obj.length; i++){
	   if (form_obj[i].checked) {
	 		return true;  
	   }	   
	}
	return false;
}


function submitForm(form_obj){
	
	
	
	var bln_is_valid = true;
	var arr_msg = [];
	var arr_msg_field_id = [];
	
	////////////// Reset prompts /////////////////////////////////////	
	for(var i=0; i<form_obj.elements.length; i++){
		
		var field = form_obj.elements[i];
		
		if (field.name.split("_prompt").length > 1 ){
			var prompt_field = field;
			var target_field = form_obj[field.name.split("_prompt")[0]];
			if (target_field.value == prompt_field.value){
				target_field.value = "";
			}
		}
		
	}
	
	for(var i=0; i<form_obj.elements.length; i++){
		
		var field = form_obj.elements[i];
		
		//////////////////////////////////////////////////////////
		if (field.name.split("_req").length > 1 ){
			var req_field = field;
			var target_field = form_obj[field.name.split("_req")[0]]; 
			

			
			
			if (req_field.value.length > 0 ){
			
			
				if (!target_field){
					alert("Warning: field not found [" +field.name.split("_req")[0] + "]");
				} else {
				
				
					var str_req =String( req_field.value ).toLowerCase();
					if (str_req.split("string").length > 1 || str_req.split("email").length > 1){
						var test_obj = testStringField(target_field, req_field)
						if (!test_obj["success"]){
							bln_is_valid = false;
							arr_msg[arr_msg.length] = test_obj["message"];
							arr_msg_field_id[arr_msg_field_id.length] = test_obj["field_id"];
						}
					} else if (str_req.split("radio").length > 1){
						var test_obj = testRadioField(target_field, req_field)
						if (!test_obj["success"]){
							bln_is_valid = false;
							arr_msg[arr_msg.length] = test_obj["message"];
							arr_msg_field_id[arr_msg_field_id.length] = test_obj["field_id"];
						}				
					} else if (str_req.split("select").length > 1){
										
						var test_obj = testSelectField(target_field, req_field)
						if (!test_obj["success"]){
							bln_is_valid = false;
							arr_msg[arr_msg.length] = test_obj["message"];
							arr_msg_field_id[arr_msg_field_id.length] = test_obj["field_id"];
						}
					} else if (str_req.split("number").length > 1){
						var test_obj = testNumberField(target_field, req_field)
						if (!test_obj["success"]){
							bln_is_valid = false;
							arr_msg[arr_msg.length] = test_obj["message"];
							arr_msg_field_id[arr_msg_field_id.length] = test_obj["field_id"];
						}
					} else if (str_req.split("checkbox_group").length > 1){
						var test_obj = testCheckboxGroupField(target_field, req_field)
						if (!test_obj["success"]){
							bln_is_valid = false;
							arr_msg[arr_msg.length] = test_obj["message"];
							arr_msg_field_id[arr_msg_field_id.length] = test_obj["field_id"];
						}
					} else if (str_req.split("postcode").length > 1){
						var test_obj = testPostcodeField(target_field, req_field)
						if (!test_obj["success"]){
							bln_is_valid = false;
							arr_msg[arr_msg.length] = test_obj["message"];
							arr_msg_field_id[arr_msg_field_id.length] = test_obj["field_id"];
						}
					}else if (str_req.split("phone").length > 1){
						var test_obj = testPhoneNumberField(target_field, req_field)
						if (!test_obj["success"]){
							bln_is_valid = false;
							arr_msg[arr_msg.length] = test_obj["message"];
							arr_msg_field_id[arr_msg_field_id.length] = test_obj["field_id"];
						}
					} else if (str_req.split("custom:").length > 1){
						
						str_req = String( req_field.value );
						
						var str_function_name = String(str_req.split("custom:")[1]);
						str_function_name = str_function_name.split("(").join("");
						str_function_name = str_function_name.split("(").join("");
						str_function_name = str_function_name.split(" ").join("");
						str_function_name = str_function_name.split(";").join("");
						str_function_name = str_function_name.split("\"").join("");
						str_function_name = str_function_name.split("'").join("");
						
						if (eval("window." + str_function_name)){						
							var test_obj = eval("window." + str_function_name)(target_field, req_field);						
							if (!test_obj["success"]){
								bln_is_valid = false;
								arr_msg[arr_msg.length] = test_obj["message"];
								arr_msg_field_id[arr_msg_field_id.length] = test_obj["field_id"];
							}
						} 
					}
				}
			}
		}
		//////////////////////////////////////////////////////////
	}
	if (bln_is_valid){
		
		if (eval("window.onSuccess_" + form_obj.id )) {
			eval("window.onSuccess_" + form_obj.id )();
		}
		
	
		
		form_obj.submit();
		
	} else {
		initForm(form_obj);		
		
		if (form_obj[arr_msg_field_id[0]]){
			if (form_obj[arr_msg_field_id[0]].focus){
				form_obj[arr_msg_field_id[0]].focus();
			}
		}		
		
		if(eval("window.onError_" + form_obj.id )){
		
			eval("window.onError_" + form_obj.id )(arr_msg, arr_msg_field_id);
			
		} else {
		
			var str = "";
			str = "Please change the following fields to continue.\n\n" ;
			for (var i = 0 ; i < arr_msg.length ; i++){
				str+= " - " + arr_msg[i] + "\n"
			}
			//			
			alert(str);
		}
	}
	
}


function isEmailAddressValid(str){
	var filter  = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
	if (filter.test(str)){
		return true;
	} else {
		return false;
	}
}


function convertFieldNameToLabel(str){
	str = String(str)
	str = str.toLowerCase();
	var arr = str.split("_");
	var lbl = "";
	for (var j = 0 ; j < arr.length ; j++){
		if (j > 0 ){
			lbl+=" ";
		}
		lbl+= arr[j].charAt(0).toUpperCase() + arr[j].substr(1);			
	}
	return lbl;
}


function e(id){
	return document.getElementById(id)?document.getElementById(id):false;
}

///////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////// TEST FUCTIONS //////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////

function testSelectField(target_field, req_field){
	var success = false;
	if (target_field.selectedIndex > 0){
		success = true;
	}
	
	var str_return_message = ""
	if (!success){
		str_return_message = "#field_name# requires a selection";
	}
	
	var return_obj = new Object();
	
	return_obj["success"] = success;
	return_obj["message"] = str_return_message.split("#field_name#").join(getFieldLabel(req_field));	
	return_obj["field_id"] = target_field.name;	
	
	return return_obj;
}

function testCheckboxGroupField(target_field, req_field){
	var success = true;	
	var str_name = req_field.name.split("_req").join("");;	
	var i = 0;
	var check_total = 0;

	for (var i = 0 ; i  <  9999 ; i++){
		if (e(str_name + "_" + String(i))) {
			if (e(str_name + "_" + String(i)).checked){
				check_total++;
			}
		} else {
			break;
		}	
	}
	//alert("?" + check_total)
	
	var str_req =String(req_field.value).toLowerCase();
	var str_min = Number(str_req.split("|checkbox_group")[0]);
	var str_max = Number(str_req.split("checkbox_group|")[1]);
	if (isNaN(str_min) && isNaN(str_max)){
		str_min = 1;
	}
	
	var str_return_message = ""
	
	if (!isNaN(str_min) && !isNaN(str_max)){		
		if (check_total < str_min || check_total > str_max){
			success = false;
			if (str_min == str_max ){
				str_return_message = "#field_name# requires " + str_min + " selections"
			} else {			
				str_return_message = "#field_name# requires between " + str_min + " and " + str_max + " selections";
			}
		}
	} else if (!isNaN(str_min)){
		
		if ( check_total < str_min){
			if(str_min == 1 ){
				success = false;
				str_return_message = "#field_name# requires a selection";
			} else {
				success = false;
				str_return_message = "#field_name# requires at least " + str_min + " selections";
			}
		}	
		
		
	} else if (!isNaN(str_max)){
	
		if ( check_total > str_max){
			success = false;
			str_return_message = "#field_name# requires a maximum of " + str_max + " selections";
		}
		
	}
	
	var return_obj = new Object();
	
	return_obj["success"] = success;
	return_obj["message"] = str_return_message.split("#field_name#").join(getFieldLabel(req_field));	
	return_obj["field_id"] = str_name;	
	
	return return_obj;
}

function testRadioField(target_field, req_field){
	var success = false;
	for (var i  = 0 ; i  < target_field.length  ; i++){
		if (target_field[i].checked){
			success = true;
		}

	}
	var str_return_message = ""
	if (!success){
		str_return_message = "#field_name# requires a selection";
	}
	
	var return_obj = new Object();
	
	return_obj["success"] = success;
	return_obj["message"] = str_return_message.split("#field_name#").join(getFieldLabel(req_field));	
	return_obj["field_id"] = req_field.name.split("_req").join("");	
	
	return return_obj;
}


function testNumberField(target_field, req_field){
	var success = true;
	var str_req =String( req_field.value ).toLowerCase();

	var str_min = Number(str_req.split("|number")[0]);
	var str_max = Number(str_req.split("number|")[1]);	
	
	var str_target_val = target_field.value;
	var num_target_val = Number(target_field.value);
	var str_return_message = "";
	
	if (str_target_val.length  < 1 || isNaN(num_target_val)  ){
		success = false;
		str_return_message = "#field_name# requires a numeric value";
	} else {
		if(!isNaN(str_min) && !isNaN(str_max)){
			
			if (num_target_val < str_min || num_target_val > str_max ){
				success = false;
				str_return_message = "#field_name# requires a numeric value between "+str_min+" and " + str_max;		
			}
						
		} else if (isNaN(str_min)){
		
			if (num_target_val < str_min || num_target_val > str_max ){
				success = false;
				str_return_message = "#field_name# requires a numeric value under or equal to " + str_max;		
			}
			
		} else if (isNaN(str_max)){
		
			if (num_target_val < str_min  ){
				success = false;
				str_return_message = "#field_name# requires a numeric value over or equal to "+ str_min
			}				
			
		}	
	}
	
	var return_obj = new Object();
	return_obj["success"] = success;
	return_obj["message"] = str_return_message.split("#field_name#").join(getFieldLabel(target_field));	
	return_obj["field_id"] = target_field.name;
	return return_obj;
}

function testPhoneNumberField(target_field, req_field, str_req_value){
	
	if (req_field){
		var str_req = String( req_field.value ).toLowerCase();
	} else if (str_req_value != null){
		var str_req = str_req_value.toLowerCase();
	} else {
 		var	str_req = "phone"; 
	}	

	cleanUpPhoneNumber(target_field);

	var success = true;
		
	var str_return_message = "";
	
	var str_current_value = String(target_field.value);
	var str_tmp_val = str_current_value;
	
	var str_current_val_length = str_current_value.length
	
	
	
	var int_min = Number(str_req.split("|phone")[0]);
	var int_max = Number(str_req.split("phone|")[1]);
	
	str_tmp_val = str_tmp_val.split("(").join("");
	str_tmp_val = str_tmp_val.split(")").join("");
	str_tmp_val = str_tmp_val.split("+").join("");
	str_tmp_val = str_tmp_val.split("-").join("");
	str_tmp_val = str_tmp_val.split(" ").join("");
	
	if (isNaN(int_min) && isNaN(int_max)){
		int_min  = 8;
	}
	
	var int_tmp_val = Number(str_tmp_val);
	var str_val_digits = String(int_tmp_val).length
	if (str_current_value.length < 1){
		success = false;
		str_return_message = "#field_name# requires a valid phone number";
	} else if (isNaN(int_tmp_val)){
		success = false;
		str_return_message = "#field_name# requires a valid phone number ";
	} else if (!isNaN(int_min) && !isNaN(int_max)){ 
		
		if (str_val_digits < int_min || str_val_digits > int_max){
			if (int_min == int_max){
				success = false;
				str_return_message = "#field_name# requires " + int_min + " numerical digits" ;
			} else {
				success = false;
				str_return_message =  "#field_name# requires between " + int_min + " and " +int_max+ " numerical digits" ;
			}
		}
	} else if (!isNaN(int_min)){
		if (str_val_digits < int_min){
			success = false;
			str_return_message =  "#field_name# requires at least " + int_min + " numerical digits"
		}	
	} else if (!isNaN(int_max)){
		if (str_val_digits > int_max){
			success = false;
			str_return_message =  "#field_name# requires no more than " + int_max + " numerical digits"
		}	
	
	}
	
	
	str_return_message = str_return_message.split("#field_name#").join(getFieldLabel(target_field));
	var return_obj = new Object();
	return_obj["success"] = success;
	return_obj["message"] = str_return_message;	
	return_obj["field_id"] = target_field.name;	
	
	return return_obj;
}
	
	
function testPostcodeField(target_field, req_field){

	cleanUpPostcode(target_field);

	var success = true;
	var str_return_message = "";
	var str_current_value = String(target_field.value);
	var int_current_value = Number(str_current_value);
	var str_current_val_length = str_current_value.length
	var str_req = String( req_field.value ).toLowerCase();
	var int_min = Number(str_req.split("|postcode")[0]);
	var int_max = Number(str_req.split("postcode|")[1]);	
	
	if (isNaN(int_min) && isNaN(int_max)){
		int_min = 4
		int_max = 4
	} 	
	
	if (isNaN(int_current_value) || str_current_value.length < 1 ){
		success = false;
		if (int_min == int_max){
			success = false;
			str_return_message = "#field_name# requires a " + int_min + " digit number"
		} else {
			success = false;		
			str_return_message = "#field_name# requires a numeric value";
		}
				
	} else if (!isNaN(int_min) && !isNaN(int_max)){
		if (str_current_val_length < int_min || str_current_val_length > int_max ){
			
			if (int_min == int_max){
				success = false;
				str_return_message = "#field_name# requires a " + int_min + " digit number"
			} else {
				success = false;
				str_return_message = "#field_name# requires between " + int_min +" and " + int_max + " digits"  		
			}			
		}
	} else if (!isNaN(int_min)){
		if (str_current_val_length < int_min ){
			success = false;
			str_return_message = "#field_name# requires at least " + int_min + " digits"
		}
	} else if (!isNaN(int_max)){
		if (str_current_val_length > int_max ){
			success = false;
			str_return_message = "#field_name# requires no more than " + int_max + " digits"
		}		
	}
	
	var return_obj = new Object();
	
	str_return_message = str_return_message.split("#field_name#").join(getFieldLabel(target_field));
	
	return_obj["success"] = success;
	return_obj["message"] = str_return_message;	
	return_obj["field_id"] = target_field.name;	
	
	return return_obj;
}




function testStringField(target_field, req_field, str_req_value){
	
	if (req_field){
		var str_req = String( req_field.value ).toLowerCase();
	} else if (str_req_value != null ){
		var str_req = str_req_value.toLowerCase();
	} else {
		var str_req = "string";
	}
	

	if (str_req.split("email").length > 1){
		cleanUpEmail(target_field);
		var str_min = Number(str_req.split("|email")[0]);
		var str_max = Number(str_req.split("email|")[1]);	
	} else {
		var str_min = Number(str_req.split("|string")[0]);
		var str_max = Number(str_req.split("string|")[1]);						
	}
	
	if (isNaN(str_min) && isNaN(str_max)){
		str_min = 1;
	}
	
	var str_current_val = target_field.value;
	var bln_this_field_is_ok = true;
	var str_return_message = "";
								
	if (!isNaN(str_min)){
		if (str_min > 0 ){								
			if (str_current_val.length < str_min){			
				if (str_min == 1){
					str_return_message = "#field_name# requires a value";									
				} else {
					str_return_message = "#field_name# requires a value of at least " + str_min + " characters";
				}			
				bln_this_field_is_ok = false;				
			}
		}
	} 
	
	if (bln_this_field_is_ok){
		if (!isNaN(str_max)){
			if (str_max > 0){
				if (str_current_val.length > str_max){													
					str_return_message = "#field_name# requires a value of no more than " + str_max + " characters";
					bln_this_field_is_ok = false;
				}
			}							
		}						
	}
	
	if (bln_this_field_is_ok){
		if (str_req.split("email").length > 1 ){
			if (!isEmailAddressValid(str_current_val)){
				str_return_message = "#field_name# requires a valid email address";
				bln_this_field_is_ok = false;
			}
		}
	}
	
	// Work out the label
	
	var return_obj = new Object();
	
	str_return_message = str_return_message.split("#field_name#").join(getFieldLabel(target_field));
	
	return_obj["success"] = bln_this_field_is_ok;
	return_obj["message"] = str_return_message;	
	return_obj["field_id"] = target_field.name;	
	
	return return_obj;
	
}

///////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////// CLEANUP FUCTIONS ///////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////


function cleanUpPostcode(field_obj){
	str_val = field_obj.value
	str_val = str_val.split(" ").join("")
	field_obj.value = str_val
}

function cleanUpPhoneNumber(field_obj){
	str_val = field_obj.value
	while ( str_val.split("  ").length > 1 ){
		str_val = str_val.split("  ").join(" ")
	}
	field_obj.value = str_val
}

function cleanUpEmail(field_obj){
	var str_val = field_obj.value;
	str_val = str_val.split(" ").join("");
	field_obj.value = str_val;
}

///////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////// SERVER INTERACTION FUCTIONS ////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////

function onServerResponse(success, form_id, arr_field_names){

	
	
	var form_obj = window.document[form_id];		
	if (success){
		
		// Look for custom success function
		// Else alert form submitted ok
 		if (window["onSubmitSuccess_" + form_id ]){
			window["onSubmitSuccess_" + form_id ]();			
		} else {			
			alert("Form submitted successfully.");
			form_obj.reset();
			initForm(form_obj); 
			if (window["onReset_" + form_id ]){
				window["onReset_" + form_id ]();
			}
			
		}		
	} else {
		
		var arr_error_messages = new Array();		
		for (var i = 0; i < arr_field_names.length ; i++){			
			var field_obj = form_obj[arr_field_names[i]]
			var str_label =  getFieldLabel(field_obj);
			var str_message =  str_label + " requires a valid value";			
			arr_error_messages[arr_error_messages.length] = str_message;		
		}		
		if (window["onError_" + form_id ]){
			window["onError_" + form_id ](arr_error_messages, arr_field_names);			
		} else {
			var str = "";
			str = "Please change the following fields to continue.\n\n" ;
			for (var i = 0 ; i < arr_error_messages.length ; i++){
				str+=" - " + arr_error_messages[i] + "\n"
			}
			alert(str);					
		}			
	}
} 

		  
///////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////// AUTOMATICALLY FILL FIELDS ////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////


if (true){	


var int_form_key_counter = "";	  
function form_key_check(key) {	
	
	if (!key) {
		key = event;
		key.which = key.keyCode;
	}
	
	// Press cntrl 5 times	
	if (key.which == 17){
		int_form_key_counter++;
		if (int_form_key_counter > 4){
			form_autoFillRequiredFields();  
		}
	} else {
		int_form_key_counter = 0;
	}
	
	
}

function form_autoFillRequiredFields(){
	var form_obj = form_save_last_form_initted;
	for(var i=0; i<form_obj.elements.length; i++){
		
		var field = form_obj.elements[i];
		
		//////////////////////////////////////////////////////////
		if (field.name.split("_req").length > 1 ){
			var req_field = field;
			var target_field = form_obj[field.name.split("_req")[0]]; 
			if (req_field.value.length > 0 ){
						
				if (!target_field){
					alert("Warning: field not found [" +field.name.split("_req")[0] + "]");
				} else {
				
				
					var str_req =String( req_field.value ).toLowerCase();
					if (str_req.split("string").length > 1 ) {						
						target_field.value = getFieldLabel(target_field)+form_getRandomInt(1);
					} else if (str_req.split("email").length > 1){
						target_field.value = "email" + form_getRandomInt(2) + "@address" + form_getRandomInt(2) + ".com";
					} else if (str_req.split("radio").length > 1){

						var int_random_checked = Math.floor( Math.random() * target_field.length);
						target_field[int_random_checked].checked = true;						
						
					} else if (str_req.split("select").length > 1){
						target_field.selectedIndex = Math.ceil(Math.random() * (target_field.options.length-1))		
						
					} else if (str_req.split("number").length > 1){
						target_field.value =form_getRandomInt(5);
					} else if (str_req.split("checkbox_group").length > 1){
						
						var int_random_checked = Math.floor( Math.random() * target_field.length);
						target_field[int_random_checked].checked = true;
						
					} else if (str_req.split("postcode").length > 1){
						target_field.value =form_getRandomInt(4);
					}else if (str_req.split("phone").length > 1){
						target_field.value =form_getRandomInt(8);
					} 
				}
			}
		}
		//////////////////////////////////////////////////////////
	}

}

function form_getRandomInt(str_length){
	return  Math.round(Math.random() * (Math.pow(10,str_length)) );
}

document.onkeydown = form_key_check;

}


