	var wait = true;
	Object.extend(Event, {
	  trigger : function(element, event, fakeEvent) {
	    element = $(element);
	    fakeEvent = fakeEvent || { type :  event };
	    this.observers.each(function(cache) {
	      if (cache[0] == element && cache[1] == event)
	        cache[2].call(element, fakeEvent);
	    });
	  }
	});
	
	var regTypeArray = new Array("regNumber", "regYear", "regPlate");
	var validator = null;
	
	function getVehicleData(level, veh_id) {
		
		if(veh_id != "null") {
    		var regYear = 0;
    		if($("regDate").value.split('/')[2]) {
    			regYear = $("regDate").value.split('/')[2];
    		}
    	
    		$(level + "_loader").show();
    		new Ajax.Request("../ajax/rpc.php?s=" + gbl_site_id + "&method=get_" + level + "s&v_id=" + veh_id + "&regYear=" + regYear, { 
    			onComplete: function(e) {
    				$(level).disabled = false;
    				$(level).focus();
    				$(level + "_loader").hide();
    				if(Cookie.get(level)) {
    					$(level).value = Cookie.get(level);
    				}
    				wait = true;
    			}	
    		});
		}
		
	}
	
	function cascadeVehicleData() {
		

		if($("manufacturer").selectedIndex > 0) {
			Event.trigger("manufacturer", "change");
		}
	}
	
	function disableLowerLevels(count) {
		
		switch(count) {
			
			case 3:
				$("model").disabled = true;
			case 2:
				$("variant").disabled = true;
			case 1:
				$("derivative").disabled = true;
		}
		
	
	}
	
	function toggleNewFields() {

			document.getElementsByClassName("used_field").each(function(i) {
				i.disabled = $("isnew").checked;
				// require regdate for non-new (old) vehicles
			
			if( i.id == "regDate" || i.id == "vehicleMileage" ) {
				( $("isnew").checked ) ? i.removeClassName("required") : i.addClassName("required");
			}
			
			});										
	
	}
	
	function getVehicleFromVRM()
	{
		if(validator)
			validator.reset();

		$("frmRegNo").value = $("frmRegNo").value.replace( /\s/g, "" );
		Cookie.set("frmRegNo", $("frmRegNo").value);
		var t = new RegExp(/^[A-Z0-9]{2,7}/);
		if( t.test($("frmRegNo").value) ) {
		
			$("vrm_loader").show();
			new Ajax.Request("../ajax/rpc.php?method=vrm_lookup&s="+gbl_site_id+"&vrm=" + $("frmRegNo").value, { 
				onComplete: function(e) {
					$("vrm_loader").hide();
				}	
			});
		} else {
			alert("Please check your registration number is valid and try again");
		}
	}
	
	function getVehicleFromVRMFinish() {
		$("manufacturer").disabled = false;
		alert("updated");
	}
	
  	function enableByClass(classname) {
		document.getElementsByClassName(classname).each(
			function(i) {
				i.removeClassName("dim");
				if(i.disabled != undefined)
					i.disabled = false;
			});
	}
	
	function disableByClass(classname) {
		document.getElementsByClassName(classname).each(
			function(i) {
				i.addClassName("dim");
				if(i.disabled != undefined)
					i.disabled = true;
			});
	}
	
	function toggleRegFields(on) {
		
		regTypeArray.each( function(e) {
			if(e == on) {
				enableByClass(e + "Field");
			} else {
				disableByClass(e + "Field");
			}
		});
		Cookie.set("toggleOn", on);
	}
	
	function populateRegYearDropdown() {
		$("regYearDropdown").length = 1;
		if($("regPlateDropdown").selectedIndex > 0) {
			
			var i = 1;
			var years = $("regPlateDropdown").value.split(",")
			
			years.each(
				function(s) {
				
					var strDate = "01/03/";
					if(years.length == 2) {
						strDate = (i == 1) ? "01/09/" : "01/01/";
					}
					
					 
					$("regYearDropdown").options[i] = new Option( s, strDate + s);
					i++;
			});
			$("regYearDropdown").disabled = false;
		} else {
			$("regYearDropdown").disabled = true;
		}
	}

	function toggleIsNew(on) {
		var currentTime = new Date();
		var month 	= ((currentTime.getMonth() + 1) < 10) ? '0' + (currentTime.getMonth() + 1) : currentTime.getMonth() + 1;
		
		var day		= (currentTime.getDate() < 10) ? '0' + currentTime.getDate() : currentTime.getDate();
		var year 	= currentTime.getFullYear();
			if(on) {
				$("isnew").value = "true";
				Cookie.set("isnew", $("isnew").value);
				$("imgIsNew").src = gbl_image_path + "checked.gif";
				$("imgIsUsed").src = gbl_image_path + "unchecked.gif";
				$("regDate").value = day + "/" + month + "/" + year;
				//disableByClass("regPlateField");
				//disableByClass("regYearField");
				//disableByClass("regNumberField");
				//enableByClass("manual_vehicle");																	
			} else {
				$("isnew").value = "false";
				Cookie.set("isnew", $("isnew").value);
				$("imgIsNew").src = gbl_image_path + "unchecked.gif";
				$("imgIsUsed").src = gbl_image_path + "checked.gif";
				//enableByClass("regNumberField");
				//disableByClass("regPlateField");
				//disableByClass("regYearField");
				if((!Cookie.get("derivative")) || (Cookie.get("derivative") == 'null')) 
				{
					//disableByClass("manual_vehicle");
				}																	
				if($("regDate").value == day + "/" + month + "/" + year)
				{
					$("regDate").value 		= "";
				}
			}
	
	}
									
	function toggleIsPrivate(on) {
		if(on) {
			$("isPrivate").value = "true";
			Cookie.set("isPrivate", $("isPrivate").value);
			$("imgIsDealer").src = gbl_image_path + "unchecked.gif";
			$("imgIsPrivate").src = gbl_image_path + "checked.gif";																				
		} else {
			$("isPrivate").value = "false";
			Cookie.set("isPrivate", $("isPrivate").value);
			$("imgIsDealer").src = gbl_image_path + "checked.gif";
			$("imgIsPrivate").src = gbl_image_path + "unchecked.gif";
		}
	
	}
	
	function initialise() {
		
	
		// add change handlers
		Event.observe("manufacturer", "change", function(e) {  Cookie.set(Event.element(e).id, Event.element(e).value); disableLowerLevels(3); getVehicleData("model", $("manufacturer").value); });
		Event.observe("model", "change", function(e) { Cookie.set(Event.element(e).id, Event.element(e).value); disableLowerLevels(2); getVehicleData("variant", $("model").value); })
		Event.observe("variant", "change", function(e) { Cookie.set(Event.element(e).id, Event.element(e).value);  disableLowerLevels(1); getVehicleData("derivative", $("variant").value); })
		Event.observe("derivative", "change", function(e) {Cookie.set(Event.element(e).id, Event.element(e).value); })
		Event.observe("btn_get_vehicle", "click", function(e){ 
			
				if( !$("frmRegNo").disabled ) {
					disableByClass("manual_vehicle");
					new Effect.BlindUp('vehicleNotFound', {duration: 0.2, queue: 'end'});
					getVehicleFromVRM();
				} 
			});
		Event.observe("frmRegNo", "blur", function(e){ Event.element(e).value = Event.element(e).value.toUpperCase() });
		//Event.observe("instructionContainerC", "click", function(e){ toggleIsNew(false); toggleRegFields("regPlate"); enableByClass("manual_vehicle");});
		//Event.observe("instructionContainerB", "click", function(e){ toggleIsNew(false); toggleRegFields("regYear"); enableByClass("manual_vehicle");});
		//Event.observe("instructionContainerA", "click", function(e){ toggleIsNew(false); toggleRegFields("regNumber"); disableByClass("manual_vehicle");});
		
		Event.observe("regPlateDropdown", "change", function(e){ populateRegYearDropdown();  });
		Event.observe("regYearDropdown", "change", function(e){ $("regDate").value = $("regYearDropdown").value; });
		
		Event.observe("btnIsNew", "click", function(e) { toggleIsNew(true); } );
		Event.observe("btnIsUsed", "click", function(e) { toggleIsNew(false); } );
		Event.observe("btnIsNewLink", "click", function(e) { toggleIsNew(true); } );
		Event.observe("btnIsUsedLink", "click", function(e) { toggleIsNew(false); } );
	
		if($("btnIsDealer") != undefined ) {
			Event.observe("btnIsDealer", "click", function(e) { toggleIsPrivate(false); } );
			Event.observe("btnIsPrivate", "click", function(e) { toggleIsPrivate(true); } );
			Event.observe("btnIsDealerLink", "click", function(e) { toggleIsPrivate(false); } );
			Event.observe("btnIsPrivateLink", "click", function(e) { toggleIsPrivate(true); } );
			Event.observe("timeframe", "change", function(e){ $("timeframeString").value = $("timeframe").options[$("timeframe").selectedIndex].text} );
		}
		
		
		// Loop through each form element and prepopulate the value if found
		$("calculation").getElements().each(function(i) {
			
			if(Cookie.get(i.id)) {
				if(i.type == "checkbox") {
					(Cookie.get(i.id) == "true") ? i.checked = true : i.checked = false;
					if(i.id == "isnew" &&  Cookie.get(i.id)) toggleNewFields(); 
				} else if(i.id == "regPlateDropdown") {
					populateRegYearDropdown();
				} else {
					i.value = Cookie.get(i.id);
				}
			}
			
			// Add an event listener to store the changes in a cookie
			if(i.type == "checkbox") {
				Event.observe(i, "blur", function(e) {  Cookie.set(Event.element(e).id, Event.element(e).checked)});
			} else {
				Event.observe(i, "blur", function(e) {  Cookie.set(Event.element(e).id, Event.element(e).value)});
			}
		});
		
		// Cascade the vehicle boxes based on the cookie values
		if(Cookie.get("manufacturer")) {
			getVehicleData("model", Cookie.get("manufacturer"));
		}
		if(Cookie.get("model")) {
			getVehicleData("variant", Cookie.get("model"));
		}
		if(Cookie.get("variant")) {
			getVehicleData("derivative", Cookie.get("variant"));
			enableByClass("manual_vehicle");
		}
		
		// set the string from the cookie selected timeframe box
		if($("timeframe").options) {
			$("timeframeString").value = $("timeframe").options[$("timeframe").selectedIndex].text
		}
		
		
		// get the value of the vehicle selection method used and toggle it to on
		if( Cookie.get("toggleOn")) {	
			toggleRegFields(Cookie.get("toggleOn"));
			enableByClass("manual_vehicle");
		} else {
			toggleRegFields("regPlate");
			enableByClass("manual_vehicle");
		}
				// switch the tick boxes to match the cookie
		toggleIsNew($("isnew").value == "true");
		
		if($("btnIsDealer") != undefined) {
			toggleIsPrivate($("isPrivate").value == "true");
		}
		
		// add the validation library to the form, with the additional telephone validator
		Validation.add( 'validate-telephone', 'Please enter a valid telephone number with numbers only and between 10 and 15 digits in length', function(v) {
			return Validation.get('IsEmpty').test(v) ||  (!/[^\d]/.test(v) && v.length > 10 && v.length < 16);
		});
		 validator =  new Validation('calculation');
		 
		 
		// http://linked.yourcarloan.co.uk/site/<id>/<manufacturer> uses this to prepopulate manufacturer
		if( $("auto_manufacturer").value != "" && $("manufacturer").selectedIndex == 0 ) { 
		 
			$A($("manufacturer").options).each( function (e) {
				if($("auto_manufacturer").value.toUpperCase() == e.text) {
					e.selected = true;
				}	
			});
			
			enableByClass("manual_vehicle");
			getVehicleData("model",$("manufacturer").value);
		 }

	}
	
	// initialise the JS once the page is fully loaded
	Event.observe(window, "load", function(e){ initialise(); } );
	
