var AJAX_SCRIPT = "ajax.php";
var PAYMENT_GATEWAY = 'adrenalin'; // Set to 'ecommerce' to go direct to ecommerce gateway, 'adrenalin' to use adrenalin as redirect to ecommerce gateway
var COST_PER_TONNE = 25;
var CONFIRM_MSG = "You are about to be redirected to a secure site for payment.  Click Cancel if you do not wish to continue.";
var RETURN_LINK_URL = "http://www.carbonsmart.com.au/ThankYou.aspx";

if (!window.Carbon) 
	var Carbon = new Object();

Carbon.Methods = {
	// Properties
	map: 		null,
	sliders: 	{},
	responses:  {},
	results: 	{},
	totals: 	{},
	user:		{},
	user_marker: null,
	totalparticipants: 0,
	totaloffset: 0,
	datachanged: 1,
	organisation: {Organisation_ID: 1, Organisation_Unit_ID: 1},
	factors: 	{ 
					// Page 1 factors
					 gas_mj: '0.07', gas_lt: '1.7', gas_ut: '0.24', elec: '1', oil: '3', woodheater: '0.23', woodfire: '5',
					 petrol: '2.6', diesel: '3.0', lpgt: '1.8', air: '0.138', 
					 bin: '2080'
				},
	savings: 	{
					 // Page 2 savings
					 heatingdown: 	{g: 'Heating/Cooling', p: '2.5'},
					 sealgaps: 		{g: 'Heating/Cooling', p: '1'},
					 insulation: 	{g: 'Heating/Cooling', p: '10'},
					 heatingnew: 	{g: 'Heating/Cooling', p: '5'},
					 doubleglaze: 	{g: 'Heating/Cooling', p: '2'},
					 applianceoff:  {g: 'Appliances', p: '2'},
					 lightsoff: 	{g: 'Appliances', p: '.7'},
					 lightsnew: 	{g: 'Appliances', p: '0.05', max: '0.90'},
					 extrafridge: 	{g: 'Appliances', p: '4'},
					 fridgenew: 	{g: 'Appliances', p: '4.5'},
					 washcold: 		{g: 'Bathroom', p: '0.45'},
					 showershort: 	{g: 'Bathroom', p: '.75'},
					 hotwaternew: 	{g: 'Bathroom', p: '16'},
					 carless: 		{g: 'Transport', p: '0.33'},
					 carlitres: 	{g: 'Transport'}, // Special case - see below for calculations
					 wasterecycle:  {g: 'Waste',	 p: '2'},
					 wastecompost:  {g: 'Waste', 	 p: '2'}
				},
	valuemap:   {
					heatingdown: 	{0: 'No', 1: 'Some', 2: 'Yes'}, 
					sealgaps: 		{0: 'No', 1: 'Yes'}, 
					insulation: 	{0: 'No', 1: 'Yes'}, 
					heatingnew: 	{0: 'No', 1: 'Yes'}, 
					doubleglaze: 	{0: 'No', 1: 'Yes'}, 
					lightsoff: 		{0: 'No', 1: 'Yes'}, 
					extrafridge: 	{0: 'No', 1: 'Yes'}, 
					fridgenew: 		{0: 'No', 1: 'Yes'}, 
					applianceoff: 	{0: 'None', 1: 'Some', 2: 'All'}, 
					washcold: 		{0: 'No', 1: 'Some', 2: 'Yes'},
					showershort: 	{0: 'No', 1: 'Yes'},
					hotwaternew: 	{0: 'No', 1: 'Yes'},
					wasterecycle: 	{0: 'No', 1: 'Yes'},
					wastecompost: 	{0: 'No', 1: 'Yes'}
				},
	sections:   ['household', 'transport', 'waste'],
	questions:  {household: ['gas', 'elec', 'oil', 'woodheater', 'woodfire'],
				 transport: ['petrol', 'lpgt', 'diesel', 'air'],
				 waste: ['bin']},

	// -- Methods --

	// Initialisation of the page
	OnLoad: function(options) {
		this.DefaultResults();
		this.RenderFactors();
		this.RenderSliders('step1');
	},
	// Cleanup page (remove google maps)
	OnUnLoad: function(options) {
		
	},
	// Navigation control related functions
	NavOnChange: function(nextPage) {
		// Only save the data if we need to
		if (this.RequireSave()) {
			this.SaveData();
		}
		if (nextPage == 'questions2') {
			this.RenderSliders('step2');
		}
		else if (nextPage == 'questions3') {
			// Show the google maps on the last page if we haven't already
		//	this.ShowMap();
		}
	},
	// Slider functions, called when sliders are moved
	OnSlide: function (value, name) {
		this.UpdateField(value, name);
	},
	OnChange: function (value, name) {
		this.UpdateField(value, name);
	},
	OnChangeDD: function (name) {
		this.UpdateField(this.responses[name], name, 1);
	},
	SetSlider: function (fld, name) {
		var value = fld.value;
		value = RemoveCommas(value);
		this.sliders[name].setValue(value);
	},
	UpdateField: function (value, name, fromdd) {
		// Save the value of the slider to the responses hash
		this.responses[name] = value;
		
		// Now use the factor (first page only) to produce the result
		if (name == 'gas') {
			var gas_result = 0;
		 	// Special case due to three dd options
			if ($F('gas_dd') == 'megajoules') {
				gas_result = value * this.factors['gas_mj'];
			}
			else if($F('gas_dd') == 'litres') {
				gas_result = value * this.factors['gas_lt'];
			}
			else if($F('gas_dd') == 'units') {
				gas_result = value * this.factors['gas_ut'];
			}
			this.results[name] = gas_result;
		}
		else if (this.factors[name])
		{
			this.results[name] = value * this.factors[name];
		}
		// Adjust if it is monthly and multiply out for 12 months
		if ($(name+'_dd') && $F(name+'_dd') == 'Monthly')
		{
			this.results[name] = this.results[name] * 12;
		}
		
		// Updating a div with the value (second page only)
		if ($(name+'_value')) {
			$(name+'_value').update(AddCommas(Math.round(value)));
		}
		// Updating a input box with the value (first page only)
		if ($(name+'_valueinput')) {
			$(name+'_valueinput').value = AddCommas(Math.round(value));
		}
		// Now show the result (first page only)
		if ($(name+'_result')) {
			$(name+'_result').update(AddCommas(Math.round(this.results[name])));
		}
		// Or show the mapped value
		if ($(name+'_mappedvalue')) {
			var map = Carbon.valuemap[name];
			var display = Math.round(value);
			if (map) {
				display = map[value];
			}
			$(name+'_mappedvalue').update(display);
		}

		// --- Now calculate savings --- //
		var	saving = 0;
		var percent = 0;
		var item = this.savings[name];

		if (item && item.g) {

			if (name == 'carlitres') {
				// This is a special case as it depends on the response returned for 'carless'
				var carless_percent = this.responses.carless * this.savings.carless.p;
				if (carless_percent == 0) {
					percent = 33 * value/100;
				}
				else {
					percent = carless_percent * value/100;
				}
				saving = this.totals.overall * (percent/100);
				this.results[name] = saving;
			}
			else {
				percent = (item.p * value);
				if (item.max && percent > item.max) {
					percent = item.max;
				}
				saving = this.totals.overall * percent/100;
			}
			this.results[name] = saving;
		}

		if ($(name+'_percentsaving')) {
			$(name+'_percentsaving').update(Math.round(percent));
		}
		if ($(name+'_kgsaving')) {
			$(name+'_kgsaving').update(AddCommas(Math.round(saving)));
		}

		this.UpdateTotals();
		this.datachanged = 1;
	},

	// Function that sets slider defaults
	SetDefault: function(fld, name) {
		if (name == 'bin') {
			// Set the bin defaults as per the dropdown value
			switch($F(fld)) {
				case 'full': 
					this.sliders[name].setValue(28);
					break;
				case 'half': 
					this.sliders[name].setValue(14);
					break;
				case 'quarter': 
					this.sliders[name].setValue(7);
					break;
			}
		}
	},

	SliderMin: function(name) {
		var min = $A(this.sliders[name].range)[0];
		this.sliders[name].setValue(min);
	},
	SliderMax: function(name) {
		var rangeArray = $A(this.sliders[name].range);
		var max = rangeArray[rangeArray.length-1];
		this.sliders[name].setValue(max);
	},

	// Function to display hints on first page
	ShowHint: function(name) {
		Effect.toggle($(name), 'appear');
	},

	// Function to enable the sliders to operate
	RenderSliders: function(mode) {
		if (mode == 'step1' && !this.sliders.gas) 
		{
			this.sliders.gas 		= new Control.Slider('gas_handle', 'gas_track', {range: $R(0, 200000), 
											onSlide: function(value) {Carbon.OnSlide(value, 'gas')}, 
											onChange: function(value) {Carbon.OnChange(value, 'gas')}
									});
			this.sliders.elec 		= new Control.Slider('elec_handle', 'elec_track', {range: $R(0, 15000), 	
											onSlide: function(value) {Carbon.OnSlide(value, 'elec')},
											onChange: function(value) {Carbon.OnChange(value, 'elec')}
											});
			this.sliders.oil 		= new Control.Slider('oil_handle', 'oil_track', {range: $R(0, 1000), 
											onSlide: function(value) {Carbon.OnSlide(value, 'oil')},
											onChange: function(value) {Carbon.OnChange(value, 'oil')}
											});
			this.sliders.woodheater = new Control.Slider('woodheater_handle', 'woodheater_track', {range: $R(0, 1000), 
											onSlide: function(value) {Carbon.OnSlide(value, 'woodheater')},
											onChange: function(value) {Carbon.OnChange(value, 'woodheater')}
											});
			this.sliders.woodfire	= new Control.Slider('woodfire_handle', 'woodfire_track', {range: $R(0, 1000), 
											onSlide: function(value) {Carbon.OnSlide(value, 'woodfire')},
											onChange: function(value) {Carbon.OnChange(value, 'woodfire')}
											});

			this.sliders.petrol	= new Control.Slider('petrol_handle', 'petrol_track', {range: $R(0, 10000), 
											onSlide: function(value) {Carbon.OnSlide(value, 'petrol')},
											onChange: function(value) {Carbon.OnChange(value, 'petrol')}
											});
			this.sliders.lpgt	= new Control.Slider('lpgt_handle', 'lpgt_track', {range: $R(0, 10000), 
											onSlide: function(value) {Carbon.OnSlide(value, 'lpgt')},
											onChange: function(value) {Carbon.OnChange(value, 'lpgt')}
											});
			this.sliders.diesel	= new Control.Slider('diesel_handle', 'diesel_track', {range: $R(0, 10000), 
											onSlide: function(value) {Carbon.OnSlide(value, 'diesel')},
											onChange: function(value) {Carbon.OnChange(value, 'diesel')}
											});
			this.sliders.air	= new Control.Slider('air_handle', 'air_track', {range: $R(0, 100000), 
											onSlide: function(value) {Carbon.OnSlide(value, 'air')},
											onChange: function(value) {Carbon.OnChange(value, 'air')}
											});

			this.sliders.bin	= new Control.Slider('bin_handle', 'bin_track', {values: [0,1,2,3],range: $R(0, 3), 
											onSlide: function(value) {Carbon.OnSlide(value, 'bin')},
											onChange: function(value) {Carbon.OnChange(value, 'bin')}
											});
			var items = ['gas', 'elec', 'oil', 'woodheater', 'woodfire', 'petrol', 'diesel', 'lpgt', 'air', 'bin'];
			
			for (var i=0; i<items.length; i++) {
				this.sliders[items[i]].setValue(0);
			}
		}
		else if (mode == 'step2' && !this.sliders.heatingdown) {
			this.sliders.heatingdown	= new Control.Slider('heatingdown_handle', 'heatingdown_track', {values: [0,1,2],range: $R(0, 2), 
											onSlide: function(value) {Carbon.OnSlide(value, 'heatingdown')},
											onChange: function(value) {Carbon.OnChange(value, 'heatingdown')}
											});
			this.sliders.sealgaps		= new Control.Slider('sealgaps_handle', 'sealgaps_track', {values: [0,1],
											onSlide: function(value) {Carbon.OnSlide(value, 'sealgaps')},
											onChange: function(value) {Carbon.OnChange(value, 'sealgaps')}
											});
			this.sliders.insulation		= new Control.Slider('insulation_handle', 'insulation_track', {values: [0,1],
											onSlide: function(value) {Carbon.OnSlide(value, 'insulation')},
											onChange: function(value) {Carbon.OnChange(value, 'insulation')}
											});
			this.sliders.heatingnew		= new Control.Slider('heatingnew_handle', 'heatingnew_track', {values: [0,1],
											onSlide: function(value) {Carbon.OnSlide(value, 'heatingnew')},
											onChange: function(value) {Carbon.OnChange(value, 'heatingnew')}
											});
			this.sliders.doubleglaze		= new Control.Slider('doubleglaze_handle', 'doubleglaze_track', {values: [0,1],
											onSlide: function(value) {Carbon.OnSlide(value, 'doubleglaze')},
											onChange: function(value) {Carbon.OnChange(value, 'doubleglaze')}
											});
			this.sliders.lightsoff			= new Control.Slider('lightsoff_handle', 'lightsoff_track', {values: [0,1],
											onSlide: function(value) {Carbon.OnSlide(value, 'lightsoff')},
											onChange: function(value) {Carbon.OnChange(value, 'lightsoff')}
											});
			this.sliders.lightsnew			= new Control.Slider('lightsnew_handle', 'lightsnew_track', {range: $R(0, 20), 
											onSlide: function(value) {Carbon.OnSlide(value, 'lightsnew')},
											onChange: function(value) {Carbon.OnChange(value, 'lightsnew')}
											});
			this.sliders.extrafridge		= new Control.Slider('extrafridge_handle', 'extrafridge_track', {values: [0,1],
											onSlide: function(value) {Carbon.OnSlide(value, 'extrafridge')},
											onChange: function(value) {Carbon.OnChange(value, 'extrafridge')}
											});
			this.sliders.fridgenew			= new Control.Slider('fridgenew_handle', 'fridgenew_track', {values: [0,1],
											onSlide: function(value) {Carbon.OnSlide(value, 'fridgenew')},
											onChange: function(value) {Carbon.OnChange(value, 'fridgenew')}
											});
			this.sliders.applianceoff		= new Control.Slider('applianceoff_handle', 'applianceoff_track', {values: [0,1,2], 
											range: $R(0,2),
											onSlide: function(value) {Carbon.OnSlide(value, 'applianceoff')},
											onChange: function(value) {Carbon.OnChange(value, 'applianceoff')}
											});
			this.sliders.washcold		= new Control.Slider('washcold_handle', 'washcold_track', {values: [0,1,2], range: $R(0,2),
											onSlide: function(value) {Carbon.OnSlide(value, 'washcold')},
											onChange: function(value) {Carbon.OnChange(value, 'washcold')}
											});
			this.sliders.showershort		= new Control.Slider('showershort_handle', 'showershort_track', {values: [0,1],
											onSlide: function(value) {Carbon.OnSlide(value, 'showershort')},
											onChange: function(value) {Carbon.OnChange(value, 'showershort')}
											});
			this.sliders.hotwaternew		= new Control.Slider('hotwaternew_handle', 'hotwaternew_track', {values: [0,1],
											onSlide: function(value) {Carbon.OnSlide(value, 'hotwaternew')},
											onChange: function(value) {Carbon.OnChange(value, 'hotwaternew')}
											});
			this.sliders.carless			= new Control.Slider('carless_handle', 'carless_track', {range: $R(0, 50), 
											onSlide: function(value) {Carbon.OnSlide(value, 'carless')},
											onChange: function(value) {Carbon.OnChange(value, 'carless')}
											});
			this.sliders.carlitres			= new Control.Slider('carlitres_handle', 'carlitres_track', {range: $R(0, 50), 
											onSlide: function(value) {Carbon.OnSlide(value, 'carlitres')},
											onChange: function(value) {Carbon.OnChange(value, 'carlitres')}
											});
			this.sliders.wasterecycle	 	= new Control.Slider('wasterecycle_handle', 'wasterecycle_track', {values: [0,1],
											onSlide: function(value) {Carbon.OnSlide(value, 'wasterecycle')},
											onChange: function(value) {Carbon.OnChange(value, 'wasterecycle')}
											});
			this.sliders.wastecompost		= new Control.Slider('wastecompost_handle', 'wastecompost_track', {values: [0,1],
											onSlide: function(value) {Carbon.OnSlide(value, 'wastecompost')},
											onChange: function(value) {Carbon.OnChange(value, 'wastecompost')}
											});
			var items = ['heatingdown', 'sealgaps', 'insulation', 'heatingnew', 'doubleglaze', 
							'lightsoff', 'lightsnew', 'extrafridge', 'fridgenew', 'applianceoff', 
							'washcold', 'showershort', 'hotwaternew', 'carless', 'carlitres',
							'wasterecycle', 'wastecompost'];

			for (var i=0; i<items.length; i++) {
				this.sliders[items[i]].setValue(0);
			}
		}
	},
	// Function to render the factors against each of the options
	RenderFactors: function() {
		for (j=0; j<this.sections.length; j++)
		{
			var section = this.sections[j];
			for (var i=0; i<this.questions[section].length; i++) 
			{
				name = this.questions[section][i];
				$(name+"_factor").update("x"+this.factors[name]);
			}
		}
	},
	// Function to calculate the totals for emissions
	UpdateTotals: function() {

		// FIRST PAGE
		this.totals.household = this.CalculateSection('household');
		this.totals.transport = this.CalculateSection('transport');
		this.totals.waste	  = this.CalculateSection('waste');
		this.totals.overall   = this.totals.transport+this.totals.household+this.totals.waste;

		$('household_result').update(AddCommas(Math.round(this.totals.household)));
		$('transport_result').update(AddCommas(Math.round(this.totals.transport)));
		$('waste_result').update(AddCommas(Math.round(this.totals.waste)));

		$('total_tonnes_page2').update(Round(this.totals.overall/1000));
		$('total_tonnes_page3').update(Round(this.totals.overall/1000));

		$('total_household_tonnes').update(Round(this.totals.household/1000));
		$('total_transport_tonnes').update(Round(this.totals.transport/1000));
		$('total_waste_tonnes').update(Round(this.totals.waste/1000));
		
		// SAVINGS PAGE
		this.totals.savings_heatingcooling 	= this.CalculateSectionSavings('Heating/Cooling');
		this.totals.savings_appliances 		= this.CalculateSectionSavings('Appliances');
		this.totals.savings_bathroom		= this.CalculateSectionSavings('Bathroom');
		this.totals.savings_transport		= this.CalculateSectionSavings('Transport');
		this.totals.savings_waste			= this.CalculateSectionSavings('Waste');

		$('Heating/Cooling_savings').update(AddCommas(Math.round(this.totals.savings_heatingcooling)));
		$('Heating/Cooling_percent').update(AddCommas(Math.round((this.totals.savings_heatingcooling/this.totals.overall)*100)));

		$('Appliances_savings').update(AddCommas(Math.round(this.totals.savings_appliances)));
		$('Appliances_percent').update(AddCommas(Math.round((this.totals.savings_appliances/this.totals.overall)*100)));

		$('Bathroom_savings').update(AddCommas(Math.round(this.totals.savings_bathroom)));
		$('Bathroom_percent').update(AddCommas(Math.round((this.totals.savings_bathroom/this.totals.overall)*100)));

		$('Transport_savings').update(AddCommas(Math.round(this.totals.savings_transport)));
		$('Transport_percent').update(AddCommas(Math.round((this.totals.savings_transport/this.totals.overall)*100)));

		$('Waste_savings').update(AddCommas(Math.round(this.totals.savings_waste)));
		$('Waste_percent').update(AddCommas(Math.round((this.totals.savings_waste/this.totals.overall)*100)));

		this.totals.overallsavings = this.totals.savings_heatingcooling+this.totals.savings_appliances+this.totals.savings_bathroom+
										this.totals.savings_transport+this.totals.savings_waste;
		$('overall_savings').update(AddCommas(Math.round(this.totals.overallsavings)));
		$('overall_percent').update(AddCommas(Math.round((this.totals.overallsavings/this.totals.overall)*100)));

		// FINAL PAGE
		var total = 0;
		var debug = '';
		if($('offset_household').checked) {
			var value = Round((this.totals.household/1000)*COST_PER_TONNE);
			total += Number(value);
			debug += "HOUSEHOLD: "+value+"<br>";
			$('total_household_dollars').update(AddCommas(value));
		}
		else {
			$('total_household_dollars').update(0);
		}
		if($('offset_transport').checked) {
			var value = Round((this.totals.transport/1000)*COST_PER_TONNE);
			total += Number(value);
			debug += "TRANSPORT: "+value+" => "+this.totals.transport+"<br>";
			$('total_transport_dollars').update(AddCommas(value));
		}
		else {
			$('total_transport_dollars').update(0);
		}
		if($('offset_waste').checked) {
			var value = Round((this.totals.waste/1000)*COST_PER_TONNE);
			total += Number(value);
			debug += "WASTE: "+value+" => "+this.totals.waste+"<br>";
			$('total_waste_dollars').update(AddCommas(value));
		}
		else {
			$('total_waste_dollars').update(0);
		}
		debug += "TOTAL: "+total+"<br>";
		//$('debug').update(debug)
		$('total_overall_dollars').update(AddCommas(Round(Number(total))));
		$('total_value').value = Round(total);
	},
	// Calculates the section total
	CalculateSection: function(section) {
		var result = 0;
		for (i=0; i<this.questions[section].length; i++)
		{
			var name = this.questions[section][i];
			result += this.results[name];
		}
		return result;
	},
	CalculateSectionSavings: function(section) {
		var result = 0;
		$H(this.savings).each(function(pair) {
			if (pair.value.g == section) {
				result += Carbon.results[pair.key];
			}
		});
		if (isNaN(result)) {
			result = 0;
		}
		return result;
	},
	// Zero's out the results when user first starts using calculator
	DefaultResults: function() {
		for (j=0; j<this.sections.length; j++)
		{
			var section = this.sections[j];
			for (i=0; i<this.questions[section].length; i++)
			{
				var name = this.questions[section][i];
				this.results[name] = 0;
			}
		}
	},

	// ----------------------- MAP RELATED METHODS ------------------------- //

	AddUserToMap: function(options) {
		this.user.Post_Code = $F('Post_Code');
		this.user.Email = $F('Email');

		// Save the users details to the database
		new Ajax.Request(AJAX_SCRIPT, {
			parameters: {f: 'UpdateUser', u: $H(this.user).toJSON()}, 
			onComplete: function(transport) {
				var result = transport.responseText.evalJSON();
				
				if (result.Result) {
					Carbon.MapShowUser(result);
				}
				else {
					alert(result.Error);
				}
			}
		});
	},

	// Function to show the user on the map
	MapShowUser: function(data) {
		if (data.Post_Code) {
			var mPoint = new GLatLng(data.lo, data.la);
			this.map.setCenter(mPoint, 7);
			this.user_marker = Carbon.MapMarker(mPoint, data);
			Carbon.map.addOverlay(this.user_marker);
		}
		else {
			alert("The Post Code entered is not registered");
		}
	},

	// Display the google map
	ShowMap: function(options) {

		if (!this.map) {
			// Obtain the data for the points
			new Ajax.Request(AJAX_SCRIPT, {
				parameters: {f: 'MapPoints'},
				onComplete: function(transport) {
					var points = transport.responseText.evalJSON();
					Carbon.map = new GMap2($('ausmap'));
					Carbon.map.addControl(new GSmallMapControl());
					Carbon.map.setCenter(new GLatLng(-29.5, 134), 3);

					for (var i=0; i<points.length; i++) {
						var mPoint = new GLatLng(points[i].lo, points[i].la);
						var marker = Carbon.MapMarker(mPoint, points[i]);
						Carbon.map.addOverlay(marker);
					}
				}
			});
		}
	},

	MapMarker: function(mPoint, data) {
		var icon = new GIcon();
		icon.image = "http://labs.google.com/ridefinder/images/mm_20_blue.png";
		icon.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
		icon.iconSize = new GSize(12, 20);
		icon.shadowSize = new GSize(22, 20);
		icon.iconAnchor = new GPoint(6, 20);
		icon.infoWindowAnchor = new GPoint(5, 1);
		markerOptions = { icon:icon };	
		
		var marker = new GMarker(mPoint, markerOptions);
		
		var popupText = "<b>Postcode "+data.Post_Code+"</b><br>"+AddCommas(data.CNT)+
						" participants with "+AddCommas(Math.round(data.SUM))+" potential kg offset";
//		GEvent.addListener(marker, "click", function () {
//			marker.openInfoWindowHtml(popupText);
//		});
		return marker;
	},
	// ----------------------- PAYMENT RELATED METHODS ------------------------- //
	PurchaseOffset: function(options) {
		// Check we have required data
		if($F('First_Name') == '' || 
		   $F('Last_Name') == '' || 
		   $F('Email') == '' || 
		   $F('Post_Code') == '') {
			alert("Please ensure you have completed all required fields:\n\n * First Name\n * Last Name\n * Email\n * Post Code");
		}
		else {
			this.user.First_Name 	= $F('First_Name');
			this.user.Last_Name 	= $F('Last_Name');
			this.user.Email 		= $F('Email');
			this.user.Post_Code 	= $F('Post_Code');

			var payment_form;

			if (PAYMENT_GATEWAY == 'ecommerce') {
				// Now add the parameters to the Return Link url for the ecommerce gateway - this sends the information
				// to adrenalin so they can personalise the thankyou page
				var return_link = RETURN_LINK_URL + "?" + "firstname="+ this.user.First_Name + "&lastname=" + this.user.Last_Name 
														+ "&email="+ this.user.Email + "&postcode=" + this.user.Post_Code
														+ "&offsetamount=" + $F('total_value');
				$('return_link_url').value = return_link;
				
				payment_form = document.frm_calculator_westpac;
			}
			else {
				// Fill all the values on the form prior to submission to adrenalin
				$('Var_User_ID').value				= this.user.User_ID;
				$('Var_First_Name').value 			= this.user.First_Name;
				$('Var_Last_Name').value			= this.user.Last_Name;
				$('Var_Email_Address').value 		= this.user.Email;
				$('Var_Post_Code').value 			= this.user.Post_Code;
				
				$('Var_Household_Result').value 	= Math.round(this.totals.household);
				$('Var_Transport_Result').value 	= Math.round(this.totals.transport);
				$('Var_Waste_Result').value 		= Math.round(this.totals.waste);
				$('Var_Overall_Result').value 		= Math.round(this.totals.overall);
				
				$('Var_Heating_Saving').value 		= Math.round(this.totals.savings_heatingcooling);
				$('Var_Appliances_Saving').value 	= Math.round(this.totals.savings_appliances);
				$('Var_Bathroom_Saving').value 		= Math.round(this.totals.savings_bathroom);
				$('Var_Transport_Saving').value 	= Math.round(this.totals.savings_transport);
				$('Var_Waste_Saving').value 		= Math.round(this.totals.savings_waste);
				$('Var_Overall_Saving').value 		= Math.round(this.totals.overallsavings)
				
				$('Var_Offset_Amount').value 		= $F('total_value');

				payment_form = document.frm_calculator_adrenalin;
			}
			if(confirm(CONFIRM_MSG)) {
				new Ajax.Request(AJAX_SCRIPT, {
					parameters: {f: 'UpdateUser', u: $H(this.user).toJSON()}, 
					onComplete: function () {
						payment_form.submit();
					}
				});
			}
		}
	},
	// ----------------------- DATA RELATED METHODS ------------------------- //
	RequireSave: function(options) {
		if (this.datachanged) {
			return true;
		}
		else {
			return false;
		}
	},
	SaveData: function(options) {
		new Ajax.Request(AJAX_SCRIPT, {
			parameters: {f: 'SaveData', u: $H(this.user).toJSON(), totals: $H(this.totals).toJSON(), results: $H(this.results).toJSON(), o: $H(this.organisation).toJSON(), responses: $H(this.responses).toJSON()},
			onComplete: function(transport) {
				var result = transport.responseText.evalJSON();
				
				if(result.Result == 1) {
					alert(result.Error);
				}
				else {
					Carbon.user = result.user;
					Carbon.totalparticipants = result.totalparticipants;
					Carbon.totaloffset = result.totaloffset;
					Carbon.datachanged = 0;

					// Now update the totals
					$('mapTotalPeople').update(AddCommas(Math.round(Carbon.totalparticipants)));
					$('mapTotal').update(AddCommas(Math.round(Carbon.totaloffset)));
				}
			}
		});
	}
};

Object.extend(Carbon, Carbon.Methods);

function Round(num)
{
	return num.toFixed(2);
}

function AddCommas(nStr)
{
	nStr += '';
	x = nStr.split('.');
	x1 = x[0];
	x2 = x.length > 1 ? '.' + x[1] : '';
	var rgx = /(\d+)(\d{3})/;
	while (rgx.test(x1)) {
		x1 = x1.replace(rgx, '$1' + ',' + '$2');
	}
	return x1 + x2;
}

function RemoveCommas(str)
{
	var rgx = /\,/;
	while (rgx.test(str))
	{
		str = str.replace(rgx, '');
	}
	return str;
}
