var			CALC_MAX_CART_ITEMS = 150;
var			CALC_SERIAL_RECORD_SEPARATOR = '|';
var			CALC_SERIAL_DATA_SEPARATOR = ';';
var			CALC_COOKIE_NAME = 'carbon_calculator';
var			CALC_TAB_COOKIE_NAME = 'carbon_calculator_tab';
var			MONTHS_IN_YEAR = 12;
var			COST_PER_TONNE = 20.00;
var			ANNUAL_COST_PER_TONNE = 16.67;

var			g_cookies_ok = false;

var			g_vehicle = new Calc_Vehicle;
var			g_home = new Calc_Home;
var			g_flight = new Calc_Flight;
var			g_profile = new Calc_Profile;

var			g_reseller_id = '';


// ========================================================================== //
//
// Profile Object
//
// Manages this items that have been added to the user's Carbon Profile.
//
// ========================================================================== //

function Calc_Profile()
{
	this.items = new Array();
	this.carbon_total = 0;
	this.save_cookie_data = true;
	
	// ---------------------------------------------------------------------- //
	/*	Profile::recalc
		
	*/
	// ---------------------------------------------------------------------- //
	
	this.recalc = function ( )
	{
		var			len = this.items.length;
		this.carbon_total = 0;
		
		for( var i = 0; i < len; i++ )
			this.carbon_total += parseFloat( this.items[i].carbon_tons );
		
		document.getElementById( 'calc_profile_total' ).innerHTML = this.carbon_total.toFixed(2);
	}
	

	// ---------------------------------------------------------------------- //
	/*	Profile::add_item
	
	*/
	// ---------------------------------------------------------------------- //

	this.add_item = function ( obj, save_cookie_data )
	{
		if( obj.recalc )
			obj.recalc();
		
		var			len = this.items.length;
		
		if( len > CALC_MAX_CART_ITEMS )
		{
			alert( "Sorry; You have exceeded the maximum number of items you can have in your profile. This item cannot be added." );
			return;
		}
		this.items[len] = new Object();
		this.items[len].type = obj.type;
		this.items[len].name = obj.name;
		this.items[len].carbon_tons = obj.carbon_tons;
		
		var	carbon_profile_items = document.getElementById( 'calc_profile_items' );
		
		if( carbon_profile_items.rows[0].cells.length == 1 )	// Delete the default text
			carbon_profile_items.deleteRow(0);
		
		var	row_num = carbon_profile_items.rows.length;
		var new_row = carbon_profile_items.insertRow( -1 );
		new_row.id = 'profile_item_' + row_num;
		
		var new_cell = new_row.insertCell( -1 );
		new_cell.innerHTML = "<img width='16' height='15' alt='" + obj.type.substr(0,1) + "' src='img/calculator/icons/" + obj.type + ".gif' />";
		new_cell.className = 'icon';

		new_cell = new_row.insertCell( -1 );
		new_cell.innerHTML = obj.name.substr( 0, 16 ); // No more than 16 chars.
		new_cell.className = 'heading';
	
		new_cell = new_row.insertCell( -1 );
		new_cell.innerHTML = obj.carbon_tons.toFixed(2);
		new_cell.className = 'data';
	
		new_cell = new_row.insertCell( -1 );
		new_cell.innerHTML = "<a href='#' onclick='g_profile.remove_item( this ); return false;'><img width='13' height='13' alt='x' src='img/calculator/icons/remove.gif' /></a>";
		new_cell.className = 'remove';
		
		// SUMMARY -----------------------------------------------------------//

		var	carbon_offset_items = document.getElementById( 'calc_offset_items' );
		
		if( carbon_offset_items.rows[0].cells.length == 1 )		// Delete the default text
			carbon_offset_items.deleteRow(0);
		
		row_num = carbon_offset_items.rows.length;
		new_row = carbon_offset_items.insertRow( -1 );
		new_row.id = 'calc_offset_item_' + row_num;
		
		new_cell = new_row.insertCell( -1 );
		new_cell.innerHTML = "<img width='16' height='15' title='" + obj.type + "' alt='" + obj.type.substr(0,1) + "' src='img/calculator/icons/" + obj.type + ".gif' />";
		new_cell.className = 'kind';
		
		new_cell = new_row.insertCell( -1 );
		new_cell.innerHTML = obj.name.substr( 0, 16 ); // No more than 16 chars.
		new_cell.className = 'heading';
		
		new_cell = new_row.insertCell( -1 );
		new_cell.innerHTML = obj.carbon_tons.toFixed(2);
		new_cell.className = 'carbon';
		
		// Referrers start with summary items unchecked.
		var checked = (url_get( 'ref' ) != '') ? '' : " checked='checked' "
		new_cell = new_row.insertCell( -1 );
		new_cell.innerHTML = "<input type='checkbox' id='calc_item_cost_chk_" + row_num + "' class='checkbox' " + checked + " value='" + obj.carbon_tons + "' onclick='summary_recalc( this );' />\r";
		new_cell.className = 'offset';
		
		this.recalc();
		
		obj.add_count++;
		if( obj.initialize )
			obj.initialize();
		
		if( save_cookie_data && this.save_cookie_data )	// if we aren't currently pulling from the cookies.
			set_cookie( CALC_COOKIE_NAME, this.serialize(), 60 );
	}
	
	
	// ---------------------------------------------------------------------- //
	/*	Profile::serialize
	
	*/
	// ---------------------------------------------------------------------- //
	
	this.serialize = function ()
	{
		var				len = this.items.length;
		var				serialized = 'v100';
		
		if( len > CALC_MAX_CART_ITEMS )
			len = CALC_MAX_CART_ITEMS;
		
		for( var i = 0; i < len; i++ )
			serialized +=	CALC_SERIAL_RECORD_SEPARATOR +
							this.items[i].type + CALC_SERIAL_DATA_SEPARATOR + 
							this.items[i].name + CALC_SERIAL_DATA_SEPARATOR + 
							this.items[i].carbon_tons;
		
		return serialized;
	}
	
	
	// ---------------------------------------------------------------------- //
	/*	Profile::unserialize
	
	*/
	// ---------------------------------------------------------------------- //
	
	this.unserialize = function ( serial_data )
	{
		cart_items = serial_data.split( CALC_SERIAL_RECORD_SEPARATOR );
		
		var				version = cart_items[0];
		var				len = cart_items.length - 1;
		var				cart_item;
		
		this.items.length = 0;		// Reset array to 0;
		for( var i = 1; i <= len; i++ )
		{
			fields = cart_items[i].split( CALC_SERIAL_DATA_SEPARATOR );
			cart_item = new Object();
			cart_item.type = fields[0];
			cart_item.name = fields[1];
			cart_item.carbon_tons = parseFloat( fields[2] );
			
			this.add_item( cart_item, false );
		}
	}
	
	
	// ---------------------------------------------------------------------- //
	/*	Profile::remove_item
		
	*/
	// ---------------------------------------------------------------------- //
	
	this.remove_item = function ( elem )
	{
		var carbon_item_row = elem.parentNode.parentNode;
		var carbon_profile_items = carbon_item_row.parentNode;
		var n = carbon_item_row.rowIndex;
		
		this.items.splice( n, 1 );
		carbon_profile_items.deleteRow( n );
		
		if( this.items.length == 0 )
			this.reset();
		else
		{
			set_cookie( CALC_COOKIE_NAME, this.serialize(), 60 );
			this.recalc();
		}
		
		// Summary
		
		var summary_items = document.getElementById( 'calc_offset_items' );
		summary_items.deleteRow( n );
	}


	// ---------------------------------------------------------------------- //
	/*	Profile::reset
		
	*/
	// ---------------------------------------------------------------------- //
	
	this.reset = function ( )
	{
		// A far simpler reset.
		set_cookie( CALC_COOKIE_NAME, '', 60 );
		window.location = 'calculator.php';
	}

} /* Profile Object */


// ========================================================================== //
// Car Object
// ========================================================================== //

function Calc_Vehicle()
{
	this.type = 'vehicle';
	this.name = 'Vehicle';
	this.carbon_tons = 0;
	this.data_object = 0;
	this.add_count = 1;
	
	// ---------------------------------------------------------------------- //
	/*	Vehicle::initialize
	
	*/
	// ---------------------------------------------------------------------- //
	
	this.initialize = function()
	{
		this.car_make_loader = document.getElementById( 'calc_car_make_loader' );
		this.car_model_loader = document.getElementById( 'calc_car_model_loader' );
		this.car_year_elem = document.getElementById( 'calc_car_efficiency_year' );
		this.car_make_elem = document.getElementById( 'calc_car_efficiency_make' );
		this.car_model_elem = document.getElementById( 'calc_car_efficiency_model' );
		this.car_efficiency_elem = document.getElementById( 'calc_car_efficiency' );

		this.name = 'Vehicle';
		document.getElementById( 'calc_car_carbon_name' ).value = this.name + ' ' + this.add_count;

		this.carbon_tons = 0;
		this.reset_model_selector();
		
		document.getElementById( 'calc_chk_efficiency_1' ).checked = true;
		document.getElementById( 'calc_chk_efficiency_2' ).checked = false;
		this.change_efficiency_calc();
		document.getElementById( 'calc_car_efficiency_by_size' ).selectedIndex = '';
		
		this.recalc();
	}
	
	
	// ---------------------------------------------------------------------- //
	/*	Vehicle::recalc
	
	*/
	// ---------------------------------------------------------------------- //
	
	this.recalc = function ()
	{
		var 		MILE_TO_KILOMETER_RATIO = 1.609344;
		var			LITRE_TO_GALLON_RATIO = 0.264172052;
		var			MPG_IMP_TO_LP100KM = 282.48084932;
		var			MPG_US_TO_LP100KM = 235.21451088;
		
		// Total distance traveled.
		var commute_dist = get_form_float( 'calc_car_commute_dist', '0' );
		var commute_unit = parseFloat( document.getElementById( 'calc_car_commute_unit' ).value );
		var commute_type = parseFloat( document.getElementById( 'calc_car_commute_type' ).value );
		var commute_day_freq = get_form_int( 'calc_car_commute_day_freq', '0' );
		var commute_week_freq = get_form_int( 'calc_car_commute_week_freq', '0' );
		var commute_total = commute_dist * commute_unit * commute_type * commute_day_freq * commute_week_freq;
		
		var extra_dist = get_form_float( 'calc_car_extra_dist', '0' );
		var extra_unit = parseFloat( document.getElementById( 'calc_car_extra_unit' ).value );
		var extra_freq = parseFloat( document.getElementById( 'calc_car_extra_freq' ).value );
		var extra_total = extra_dist * extra_unit * extra_freq;
	
		var distance_total_kms = Math.round( commute_total + extra_total );
		var distance_total_miles = Math.round( (commute_total + extra_total) / MILE_TO_KILOMETER_RATIO );
		
		var car_total_kms_elem = document.getElementById( 'calc_car_total_kms' );
		car_total_kms_elem.innerHTML = '' + distance_total_kms + ' (' + distance_total_miles + ')';
		
		// Total fuel burned
		var eff_unit = document.getElementById( 'calc_car_efficiency_unit' ).value;
		var eff_rate = get_form_float( 'calc_car_efficiency', '0' );
		
		var term_length = get_form_int( 'calc_car_term_length', '0' );
		var term_unit = document.getElementById( 'calc_car_term_unit' ).value;

		var	efficiency_lpk = 0;

		if( eff_rate )
		{
			if( eff_unit == 'lp100k' )
				efficiency_lpk = eff_rate / 100;
			else if( eff_unit == 'mpg-us' )
				efficiency_lpk = (MPG_US_TO_LP100KM / eff_rate) / 100;
			else if( eff_unit == 'mpg-imp' )
				efficiency_lpk = (MPG_IMP_TO_LP100KM / eff_rate) / 100;
		}
		
		var burn_litres = distance_total_kms * efficiency_lpk;
		var burn_gallons = burn_litres * LITRE_TO_GALLON_RATIO;
		
		document.getElementById( 'calc_car_fuel_burned' ).innerHTML = Math.round( burn_litres ) + ' (' + Math.round( burn_gallons ) + ')';
		
		// Total carbon created
		var tons_per_litre = document.getElementById( 'calc_car_efficiency_fuel' ).value;
		this.carbon_tons = (tons_per_litre * burn_litres) * (term_length / term_unit);
		
		document.getElementById( 'calc_car_carbon' ).innerHTML = this.carbon_tons.toFixed(2);
		this.name = document.getElementById( 'calc_car_carbon_name' ).value;
		
		if( this.carbon_tons > 0 )
		{
			document.getElementById( 'calc_car_add_to_profile' ).disabled = false;
			document.getElementById( 'calc_car_add_to_profile' ).className = 'yellow';
		}
		else
		{
			document.getElementById( 'calc_car_add_to_profile' ).disabled = true;
			document.getElementById( 'calc_car_add_to_profile' ).className = '';
		}

/*
		if( this.add_count > 1 )
			document.getElementById( 'calc_car_continue' ).disabled = false;
		else
			document.getElementById( 'calc_car_continue' ).disabled = true;
*/
	}
	
	// ---------------------------------------------------------------------- //
	/*	Vehicle::get_model_data
		
	*/
	// ---------------------------------------------------------------------- //
	
	this.get_model_data = function ( changed_elem )
	{
		this.car_make_loader.style.display = 'none';
		this.car_model_loader.style.display = 'none';

		if( changed_elem !== this.car_make_elem )
			this.car_make_elem.selectedIndex = 0;
		
		this.car_model_elem.selectedIndex = 0;
		
		//document.getElementById( 'calc_car_efficiency_by_size' ).selectedIndex = '';
		//this.car_efficiency_elem.value = '0.0';
		
		if( this.car_year_elem.value != '' )
		{
			this.car_make_elem.disabled = false;
			
			var			car_make = this.car_make_elem.value;
			
			if( this.data_object != 0 )
				document.body.removeChild( this.data_object );
			
			this.data_object		= document.createElement('script');
			this.data_object.type	= 'text/javascript';
			this.data_object.src	= 'calc_get_model_data.php?year=' + this.car_year_elem.value;
			if( car_make != '' )
			{
				this.data_object.src += '&make=' + car_make;
				this.car_model_loader.style.display='inline';
			}
			else
				this.car_make_loader.style.display='inline';
			
			document.body.appendChild( this.data_object );
			return;
		}
		else
		{
//			this.car_make_elem.selectedIndex = 0;
			this.car_make_elem.disabled = true;
		}
		
		// Make was reset to no-selection so reset the model menu.
		var elem = this.car_model_elem;
		elem.selectedIndex = 0;
		elem.disabled = true;
		elem.options.length = 1;
		elem.options[0].text = 'Car Model...';
		elem.options[0].value = '';
		
		this.car_efficiency_elem.value = '0.0';
	}

	// ---------------------------------------------------------------------- //
	/*	Vehicle::process_vehicle_data
		
		Called when vehicle data is returned from database.
	*/
	// ---------------------------------------------------------------------- //
	
	this.process_vehicle_data = function ( data, type )
	{
		var elem = document.getElementById( 'calc_car_efficiency_' + type );
		var len = data.length;
		elem.options.length = 0;
		
		for( var i = 0; i < len; i++ )
		{
			elem.options.length++;
			elem.options[i].value = data[i][0];
			elem.options[i].text = data[i][1];
		}
		
		elem.selectedIndex = 0;
		elem.disabled = false;

		this.car_make_loader.style.display = 'none';
		this.car_model_loader.style.display = 'none';
	}


	// ---------------------------------------------------------------------- //
	/*	Vehicle::reset_model_selector
	
	*/
	// ---------------------------------------------------------------------- //
	
	this.reset_model_selector = function ()
	{
		this.car_year_elem.selectedIndex = '';
	
		this.car_make_elem.selectedIndex = '';
		this.car_make_elem.disabled = true;
		
		this.car_model_elem.selectedIndex = '';
		this.car_model_elem.disabled = true;
	
		this.car_efficiency_elem.value = '0.0';
	}
	
	
	// ---------------------------------------------------------------------- //
	/*	Vehicle::set_efficiency_by_model
	
	*/
	// ---------------------------------------------------------------------- //
	
	this.set_efficiency_by_model = function ( elem )
	{
		var			LP100K_INDEX = 0;
		var			MPG_IMP_INDEX = 1;
		var			MPG_US_INDEX = 2;
		var			GASOLINE_INDEX = 0;
		var			DIESEL_INDEX = 1;
		var			car_model_name = elem.options[elem.selectedIndex].text;
		
		if( car_model_name.substr( car_model_name.length - 6, 6 ) == 'Diesel' )
			document.getElementById( 'calc_car_efficiency_fuel' ).selectedIndex = DIESEL_INDEX;
		else
			document.getElementById( 'calc_car_efficiency_fuel' ).selectedIndex = GASOLINE_INDEX;
			
		this.car_efficiency_elem.value = (elem.value * 100).toFixed(2);
		document.getElementById( 'calc_car_efficiency_unit' ).selectedIndex = LP100K_INDEX;
		document.getElementById( 'calc_car_carbon_name' ).value = car_model_name;
	
		this.recalc();
	}
	

	// ---------------------------------------------------------------------- //
	/*	Vehicle::change_efficiency_calc
	
	*/
	// ---------------------------------------------------------------------- //
	
	this.change_efficiency_calc = function ( elem )
	{
		var		chk_efficiency_1 = document.getElementById( 'calc_chk_efficiency_1' );
		var		chk_efficiency_2 = document.getElementById( 'calc_chk_efficiency_2' );
		var		efficiency_1 = document.getElementById( 'calc_car_efficiency_1' );
		var		efficiency_2 = document.getElementById( 'calc_car_efficiency_2' );
		var		efficiency_2a = document.getElementById( 'calc_car_efficiency_2a' );
		var		efficiency_2b = document.getElementById( 'calc_car_efficiency_2b' );

		efficiency_1.style.display = 'none';
		efficiency_2.style.display = 'none';
		efficiency_2a.style.display = 'none';
		efficiency_2b.style.display = 'none';
		
		if( chk_efficiency_1.checked )
		{
			efficiency_2.style.display = 'block';
			
			if( chk_efficiency_2.checked )
				efficiency_2b.style.display = 'block';
			else
				efficiency_2a.style.display = 'block';
		}
		else
		{
			efficiency_1.style.display = 'block';
			chk_efficiency_2.checked = false;
		}
		
		document.getElementById( 'calc_car_efficiency_by_size' ).selectedIndex = 0;
		this.reset_model_selector();
		this.recalc();
	}
	
	// ---------------------------------------------------------------------- //
	/*	Vehicle::set_efficiency_by_size
	
	*/
	// ---------------------------------------------------------------------- //
	
	this.set_efficiency_by_size = function ( elem )
	{
		var			GASOLINE_INDEX = 0;
		var			DIESEL_INDEX = 1;
		var			name = elem.options[elem.selectedIndex].text;
	
		this.reset_model_selector();
		
		document.getElementById( 'calc_car_carbon_name' ).value = name;
		
		if( name.substr( name.length - 6, 6 ) == 'Diesel' )
			document.getElementById( 'calc_car_efficiency_fuel' ).selectedIndex = DIESEL_INDEX;
		else
			document.getElementById( 'calc_car_efficiency_fuel' ).selectedIndex = GASOLINE_INDEX;
		
		this.car_efficiency_elem.value = elem.value;
		document.getElementById( 'calc_car_efficiency_unit' ).selectedIndex = 0;
		
		this.recalc();
	}
	
	
	// ---------------------------------------------------------------------- //
	/*	Vehicle::no_data
		
	*/
	// ---------------------------------------------------------------------- //
	
	this.no_data = function ( year, make )
	{
		this.car_make_loader.style.display = 'none';
		this.car_model_loader.style.display = 'none';

		alert( "Sorry. We have no model data for '" + make + "' vehicles from " + year + ".\n\nPlease try using the alternate car selector below." );
		
		this.reset_model_selector();
		this.recalc();
	}
	
} /* Car Object */


// ========================================================================== //
// Home Object
// ========================================================================== //

function Calc_Home()
{
	this.type = 'home';
	this.name = 'Home';
	this.carbon_tons = 0;
	this.elec_carbon_rate = 0;
	this.data_object = 0;
	//this.canada_home_sizes = new Array( 0, 675, 1000, 1400, 1800, 2500, 4000, 6000 );
	//this.canada_rates_by_sq_ft = new Array( 0, 0.009780, 0.001859, 0.002493, 0.013655, 0.001902, 0.008953, 0.006252, 0.006252, 0.004461, 0.005804, 0.001795, 0.008908, 0.006252 );
	this.add_count = 1;
	
	// ---------------------------------------------------------------------- //
	/*	Home::initialize
	
	*/
	// ---------------------------------------------------------------------- //
	
	this.initialize = function ()
	{
		document.getElementById( 'calc_home_elec_country' ).selectedIndex = 0;
		this.change_location();
		
		this.type = 'home';
		this.name = 'Home';
		document.getElementById( 'calc_home_carbon_name' ).value = this.name + ' ' + this.add_count;
		this.partial_reset();
	}


	// ---------------------------------------------------------------------- //
	/*	Home::partial_reset
	
	*/
	// ---------------------------------------------------------------------- //
	
	this.partial_reset = function ( )
	{
		document.getElementById( 'calc_home_chk_simple' ).checked = false;
		document.getElementById( 'calc_home_chk_simple_2' ).checked = false;
		document.getElementById( 'calc_home_detailed' ).style.display = 'block';
		document.getElementById( 'calc_home_simple' ).style.display = 'none';
		document.getElementById( 'calc_home_simple_2' ).style.display = 'none';
		
		this.field_reset();
	}
	

	// ---------------------------------------------------------------------- //
	/*	Home::field_reset
	
	*/
	// ---------------------------------------------------------------------- //

	this.field_reset = function ()
	{
		document.getElementById( 'calc_home_simple_size' ).value = 0;
		document.getElementById( 'calc_home_approx_size' ).selectedIndex = 0;
		
		document.getElementById( 'calc_home_elec_green' ).selectedIndex = 0;
		document.getElementById( 'calc_home_elec_usage' ).value = 0;
		document.getElementById( 'calc_home_elec_period' ).selectedIndex = 0;

		document.getElementById( 'calc_home_gas_usage' ).value = 0;
		document.getElementById( 'calc_home_gas_unit' ).selectedIndex = 0;
		document.getElementById( 'calc_home_gas_period' ).selectedIndex = 0;

		document.getElementById( 'calc_home_oil_usage' ).value = 0;
		document.getElementById( 'calc_home_oil_unit' ).selectedIndex = 0;
		document.getElementById( 'calc_home_oil_period' ).selectedIndex = 0;

		document.getElementById( 'calc_home_propane_usage' ).value = 0;
		document.getElementById( 'calc_home_propane_unit' ).selectedIndex = 0;
		document.getElementById( 'calc_home_propane_period' ).selectedIndex = 0;
		
		document.getElementById( 'calc_home_carbon' ).innerHTML = '0.00';
		
		this.recalc();
	}


	// ---------------------------------------------------------------------- //
	/*	Home::recalc
	
	*/
	// ---------------------------------------------------------------------- //
	
	this.recalc = function ()
	{
		if( document.getElementById( 'calc_home_chk_simple' ).checked )
		{
			var		country_elem = document.getElementById( 'calc_home_elec_country' );
			var		country_name = country_elem.options[country_elem.selectedIndex].text;
			
			if( country_name == 'Canada' )
			{
				var square_feet = 0;
				var carbon_psf = document.getElementById( 'calc_home_elec_province' ).value.split( '/');
				carbon_psf = parseFloat( carbon_psf[1] );
				
				if( document.getElementById( 'calc_home_chk_simple_2' ).checked )
				{
					square_feet = document.getElementById( 'calc_home_approx_size' ).value.split( '/' );
					square_feet = parseInt( square_feet[1] );
				}
				else
				{
					square_feet = get_form_float( 'calc_home_simple_size' ) *
						parseFloat( document.getElementById( 'calc_home_simple_unit' ).value );
				}
				
				this.carbon_tons = square_feet * carbon_psf;
			}
			else
				this.carbon_tons = parseFloat( document.getElementById( 'calc_home_approx_size' ).value );
		}
		else
		{
			var		elec_green_power = parseFloat( document.getElementById( 'calc_home_elec_green' ).value );
			var		elec_usage = get_form_int( 'calc_home_elec_usage', 0 );
			var		elec_usage_period = get_form_int( 'calc_home_elec_period', 0 );
			var		elec_carbon_tons = elec_green_power * elec_usage * elec_usage_period * this.elec_carbon_rate;
			
			var		gas_usage = get_form_int( 'calc_home_gas_usage', 0 );
			var		gas_unit = get_form_float( 'calc_home_gas_unit', 0 );
			var		gas_period = get_form_int( 'calc_home_gas_period', 0 );
			var		gas_carbon_tons = gas_usage * gas_unit * gas_period;
			
			var		oil_usage = get_form_int( 'calc_home_oil_usage', 0 );
			var		oil_unit = get_form_float( 'calc_home_oil_unit', 0 );
			var		oil_period = get_form_int( 'calc_home_oil_period', 0 );
			var		oil_carbon_tons = oil_usage * oil_unit * oil_period;

			var		propane_usage = get_form_int( 'calc_home_propane_usage', 0 );
			var		propane_unit = get_form_float( 'calc_home_propane_unit', 0 );
			var		propane_period = get_form_int( 'calc_home_propane_period', 0 );
			var		propane_carbon_tons = propane_usage * propane_unit * propane_period;
			
			this.carbon_tons = elec_carbon_tons + gas_carbon_tons + oil_carbon_tons + propane_carbon_tons;
		}

		document.getElementById( 'calc_home_carbon' ).innerHTML = this.carbon_tons.toFixed(2);
		this.name = document.getElementById( 'calc_home_carbon_name' ).value;
		
		if( this.carbon_tons > 0 )
		{
			document.getElementById( 'calc_home_add_to_profile' ).disabled = false;
			document.getElementById( 'calc_home_add_to_profile' ).className = 'yellow';
		}
		else
		{
			document.getElementById( 'calc_home_add_to_profile' ).disabled = true;
			document.getElementById( 'calc_home_add_to_profile' ).className = '';
		}
/*		
		if( this.add_count > 1 )
			document.getElementById( 'calc_home_continue' ).disabled = false;
		else
			document.getElementById( 'calc_home_continue' ).disabled = true;
*/
	}
	
	
	// ---------------------------------------------------------------------- //
	/*	Home::change_location
	
	*/
	// ---------------------------------------------------------------------- //

	this.change_location = function()
	{
		var		country_elem = document.getElementById( 'calc_home_elec_country' );
		var		country_name = country_elem.options[country_elem.selectedIndex].text;
		var		province_elem = document.getElementById( 'calc_home_elec_province' );
		var		state_elem = document.getElementById( 'calc_home_elec_state' );
		var		checkbox_area_elem = document.getElementById( 'calc_home_chk_simple_area' );
		
		this.partial_reset();
		
		if( country_name == 'Canada' )
		{
			state_elem.disabled = true;
			state_elem.style.display = 'none';
			state_elem.selectedIndex = 0;
			province_elem.style.display = 'inline';
			province_elem.disabled = false;
			this.elec_carbon_rate = parseFloat( province_elem.value );
			if( checkbox_area_elem != undefined )
			{
				var		prov = province_elem[province_elem.selectedIndex].text;
				if( prov == "Select..." || prov == "NU" || prov == "NT" || prov == "YK" )
					checkbox_area_elem.style.display = 'none';
				else
					checkbox_area_elem.style.display = 'inline';
			}
		}
		else if( country_name == 'USA' )
		{
			state_elem.style.display = 'inline';
			state_elem.disabled = false;
			province_elem.style.display = 'none';
			province_elem.selectedIndex = 0;
			province_elem.disabled = true;
			this.elec_carbon_rate = parseFloat( state_elem.value );
			if( checkbox_area_elem != undefined )
				checkbox_area_elem.style.display = 'none';
		}
		else
		{
			if( country_name == 'Country...' )
				state_elem.style.display = 'inline';
			else
				state_elem.style.display = 'none';
			state_elem.disabled = true;
			state_elem.selectedIndex = 0;
			province_elem.style.display = 'none';
			province_elem.selectedIndex = 0;
			province_elem.disabled = true;
			this.elec_carbon_rate = parseFloat( country_elem.value );
			if( checkbox_area_elem != undefined )
				checkbox_area_elem.style.display = 'none';
		}
		
		document.getElementById( 'calc_home_simple_2' ).style.display = 'none';
		
		if( this.elec_carbon_rate != 0 )
		{	
			if( g_reseller_id != '' )
			{
				document.getElementById( 'calc_home_simple_2' ).style.display = 'block';
				document.getElementById( 'calc_home_chk_simple' ).checked = true;
				document.getElementById( 'calc_home_chk_simple_2' ).checked = true;
			}
			else
				document.getElementById( 'calc_home_calculations' ).style.display = 'block';
		}
		else
			document.getElementById( 'calc_home_calculations' ).style.display = 'none';

		this.recalc();
	}

	// ---------------------------------------------------------------------- //
	/*	Home::change_home_calc
	
	*/
	// ---------------------------------------------------------------------- //
	
	this.change_home_calc = function ( )
	{
		var			simple = document.getElementById( 'calc_home_simple' );
		var			simple_1 = document.getElementById( 'calc_home_simple_1' );
		var			simple_2 = document.getElementById( 'calc_home_simple_2' );
		var			detailed = document.getElementById( 'calc_home_detailed' );
		var			chk_simple = document.getElementById( 'calc_home_chk_simple' );
		var			chk_simple_2 = document.getElementById( 'calc_home_chk_simple_2' );
		

		this.field_reset();
		
		if( chk_simple.checked )
		{
			simple.style.display = 'block';
			detailed.style.display = 'none';
			
			var		country_elem = document.getElementById( 'calc_home_elec_country' );
			var		country_name = country_elem.options[country_elem.selectedIndex].text;
			
			if( country_name == 'Canada' )
			{
				// document.getElementById( 'calc_home_chk_simple_2_area' ).style.display = 'block';
				
				if( chk_simple_2.checked )
				{
					simple_1.style.display = 'none';
					simple_2.style.display = 'block';
				}
				else
				{
					simple_1.style.display = 'block';
					simple_2.style.display = 'none';
				}
			}
			else
			{
				chk_simple_2.checked = true;
				simple_1.style.display = 'none';
				simple_2.style.display = 'block';
				document.getElementById( 'calc_home_chk_simple_2_area' ).style.display = 'none';
			}

		}
		else
		{
			simple.style.display = 'none';
			simple_1.style.display = 'none';
			detailed.style.display = 'block';
		}
		
		this.recalc();
	}

} /* Home Object */


// ========================================================================== //
// Flight Object
// ========================================================================== //

function Calc_Flight ()
{
	this.type = 'flight';
	this.name = 'Flight';
	this.carbon_tons = 0;
	this.data_object = 0;
	this.add_count = 1;
	
	// ---------------------------------------------------------------------- //
	/*	Flight::initialize
	
	*/
	// ---------------------------------------------------------------------- //
	
	this.initialize = function ()
	{
		this.name = 'Flight';
		this.carbon_tons = 0;
		
		this.city_from_elem = document.getElementById( 'calc_flight_city_from' );
		this.city_to_elem = document.getElementById( 'calc_flight_city_to' );
		this.from_loader = document.getElementById( 'calc_flight_from_loader' );
		this.to_loader = document.getElementById( 'calc_flight_to_loader' );
		
		document.getElementById( 'calc_flight_country_from' ).selectedIndex = 0;
		document.getElementById( 'calc_flight_country_to' ).selectedIndex = 0;
		document.getElementById( 'calc_flight_total_distance' ).value = 0;
		this.city_from_elem.selectedIndex = '';
		this.city_from_elem.disabled = true;
		this.city_to_elem.selectedIndex = '';
		this.city_to_elem.disabled = true;
		document.getElementById( 'calc_flight_carbon_name' ).value = this.name + ' ' + this.add_count;

		this.recalc();
		
	}
	
	// ---------------------------------------------------------------------- //
	/*	Flight::recalc
	
	*/
	// ---------------------------------------------------------------------- //
	
	this.recalc = function ()
	{
		var legs = document.getElementById( 'calc_flight_type' ).value;
		var passengers = get_form_int( 'calc_flight_passengers', 1 );
		var distance = get_form_int( 'calc_flight_total_distance', 0 );
		var unit = document.getElementById( 'calc_flight_unit' ).value;
		var trips = get_form_int( 'calc_flight_trip_count', 1 );
		var carbon_rate = 0.00011;
		
		if( distance < 500 )
			carbon_rate = 0.00014;
		else if( distance < 1600 )
			carbon_rate = 0.00012;
		
		this.carbon_tons = carbon_rate * legs * passengers * distance * unit * trips;
		document.getElementById( 'calc_flight_carbon' ).innerHTML = this.carbon_tons.toFixed(2);
		this.name = document.getElementById( 'calc_flight_carbon_name' ).value;
		
		if( this.carbon_tons > 0 )
		{
			document.getElementById( 'calc_flight_add_to_profile' ).disabled = false;
			document.getElementById( 'calc_flight_add_to_profile' ).className = 'yellow';
		}
		else
		{
			document.getElementById( 'calc_flight_add_to_profile' ).disabled = true;
			document.getElementById( 'calc_flight_add_to_profile' ).className = '';
		}

/*
		if( this.add_count > 1 )
			document.getElementById( 'calc_flight_continue' ).disabled = false;
		else
			document.getElementById( 'calc_flight_continue' ).disabled = true;
*/
	}
	
	// ---------------------------------------------------------------------- //
	/*	Flight::get_airport_data
		
	*/
	// ---------------------------------------------------------------------- //
	
	this.get_airport_data = function ( from_to )
	{
		var				flight_country = document.getElementById( 'calc_flight_country_' + from_to );

		this.from_loader.style.display = 'none';
		this.to_loader.style.display = 'none';
		
		if( flight_country.value != '' )
		{
			if( this.data_object != 0 )
				document.body.removeChild( this.data_object );
			
			this.data_object		= document.createElement('script');
			this.data_object.type	= 'text/javascript';
			this.data_object.src	= 'calc_get_airport_data.php?country=' + flight_country.value + '&type=' + from_to;
			
			if( from_to == 'to' )
			{
				document.getElementById( 'calc_flight_carbon_name' ).value = flight_country.options[flight_country.selectedIndex].text;
				this.to_loader.style.display = 'inline';
			}
			else
				this.from_loader.style.display = 'inline';
			
			document.body.appendChild( this.data_object );
		}
		else
		{
			var elem = document.getElementById( 'calc_flight_city_' + from_to );
			elem.selectedIndex = 0;
			elem.disabled = true;
			elem.options.length = 1;
			elem.options[0].text = 'Select City, Airport...';
			elem.options[0].value = '';
		}
	}
	
	// ---------------------------------------------------------------------- //
	/*	Flight::process_airport_data
		
		Called when airport data is returned from database.
	*/
	// ---------------------------------------------------------------------- //
	
	this.process_airport_data = function ( data, type )
	{
		var elem = document.getElementById( 'calc_flight_city_' + type );
		var len = data.length;
		
		elem.style.width = 'auto';
		elem.options.length = 0;
		
		for( var i = 0; i < len; i++ )
		{
			elem.options.length++;
			elem.options[i].value = data[i][0];
			elem.options[i].text = data[i][1];
		}
		
		elem.selectedIndex = 0;
		elem.disabled = false;
		
		this.from_loader.style.display = 'none';
		this.to_loader.style.display = 'none';
	}


	// ---------------------------------------------------------------------- //
	/*	Flight::city_helper
		
	*/
	// ---------------------------------------------------------------------- //
	
	this.set_distance = function ()
	{
		var				to = this.city_to_elem.value;
		var				from = this.city_from_elem.value;
		
		if( from != '' && to != '' )
		{
			var lat_long = from.split( '/' );
			var from_lat = parseFloat( lat_long[0] );
			var from_long = parseFloat( lat_long[1] );
			
			lat_long = to.split( '/' );
			var to_lat = parseFloat( lat_long[0] );
			var to_long = parseFloat( lat_long[1] );
			
			var distance = this.get_distance( from_lat, from_long, to_lat, to_long );
			document.getElementById( 'calc_flight_total_distance' ).value = Math.round( distance );
			document.getElementById( 'calc_flight_unit' ).options.selectedIndex = 0;
		}
		
		this.recalc();
	}

	// ---------------------------------------------------------------------- //
	/*	Flight::get_distance
		
		Longitude and latitude coordinates should be entered in radians.
	*/
	// ---------------------------------------------------------------------- //
	
	this.get_distance = function ( lat1, long1, lat2, long2 )
	{
		var			EARTH_RADIUS = 6371;
		
		var			lat_delta = lat1 - lat2;
		var			long_delta = long1 - long2;
		var			a = Math.sin( lat_delta/2 ) * Math.sin( lat_delta/2 ) +
						Math.cos( lat1 ) * Math.cos( lat2 ) * Math.sin( long_delta/2 ) * Math.sin( long_delta/2 );
		var			c = 2 * Math.atan2( Math.sqrt( a ), Math.sqrt( 1-a ) );
		var			distance = EARTH_RADIUS * c;
		
		return distance;
	}

	// ---------------------------------------------------------------------- //
	/*	Flight::no_data
		
	*/
	// ---------------------------------------------------------------------- //
	
	this.no_data = function ( country_name )
	{
		this.from_loader.style.display = 'none';
		this.to_loader.style.display = 'none';

		alert( "Sorry. We were unable to retrieve city and airport information for '" + country_name + ".'" );
		
		this.reset_model_selector();
		this.recalc();
	}
}


// ========================================================================== //
// General Carbon Calculator functions
// ========================================================================== //

// -------------------------------------------------------------------------- //
/*	calc_initialize

*/
// -------------------------------------------------------------------------- //

function calc_initialize()
{
	g_vehicle.initialize();
	g_flight.initialize();
	g_home.initialize();
	
	var				carbon_data = '';
	var				selected_tab = '';
	var				reseller_type = url_get( 'rs' );
	
	if( reseller_type == '' )	// Only if a reseller isn't specified
	{
		carbon_data = get_cookie( CALC_COOKIE_NAME );
		selected_tab = get_cookie( CALC_TAB_COOKIE_NAME);
	}
	else
		g_profile.save_cookie_data = false;
	
	if( carbon_data && carbon_data != '' )
	{
		g_profile.unserialize( carbon_data );
		g_cookies_ok = true;
	}
	else
		g_cookies_ok = cookie_test();
	
	
	var		override_tab = url_get( 'tab' );		// Did their url direct them to a specific tab?
	if( override_tab != '' )
		selected_tab = override_tab + '_calculator';
	
	if( (reseller_type == 'home') || (reseller_type == 'vehicle') ||  (reseller_type == 'flight') )
	{
		selected_tab = reseller_type + '_calculator';
		g_reseller_id = url_get( 'id' );
		document.getElementById( 'calc_car_efficiency_2_chk' ).style.display = 'none';
		document.getElementById( 'calc_custom_plan_area' ).style.display = 'none';
		document.getElementById( 'calc_dealer_area' ).style.display = 'block';
	}
	else
	{
		document.getElementById( 'calc_car_term' ).style.display = 'none';
		document.getElementById( 'calc_dealer_area' ).style.display = 'none';
	}

	
	if( !selected_tab || selected_tab == '' )
	{
		selected_tab = 'home_calculator';
		g_reseller_id = url_get( 'id' );
	}
	
	calc_switch( selected_tab );
}


// -------------------------------------------------------------------------- //
/*	propegate_offset_counts()
	
	2008.04.26 - 4:05am
	Not the most elegant way to do this, but this isn't an ideal time to
	go changing the object structure (and risk introducing a bug).
*/
// -------------------------------------------------------------------------- //
/*
function propegate_offset_counts()
{
	var		profile_item_count = g_profile.items.length;
	var		homes = 0, vehicles = 0, flights = 0;
	
	for( var i = 0; i < profile_item_count; i++ )
	{
		if( g_profile.items[i].type == 'home' )
			homes++;
		else if( g_profile.items[i].type == 'vehicle' )
			vehicles++;
		else if( g_profile.items[i].type == 'flight' )
			flights++;
	}
	
	if( document.getElementById( 'number_of_offset_homes' ) )
		document.getElementById( 'number_of_offset_homes' ).value = homes;
	if( document.getElementById( 'number_of_offset_vehicles' ) )
		document.getElementById( 'number_of_offset_vehicles' ).value = vehicles;
	if( document.getElementById( 'number_of_offset_flights' ) )
		document.getElementById( 'number_of_offset_flights' ).value = flights;
	if( document.getElementById( 'total_carbon_offset' ) )
		document.getElementById( 'total_carbon_offset' ).value = g_profile.carbon_total.toFixed(2);

	return true;
}
*/
// -------------------------------------------------------------------------- //
/*	calc_switch_calculator()

*/
// -------------------------------------------------------------------------- //

function calc_switch( target_id )
{
	document.getElementById( 'vehicle_calculator' ).style.display = 'none';
	document.getElementById( 'home_calculator' ).style.display = 'none';
	document.getElementById( 'flight_calculator' ).style.display = 'none';
	document.getElementById( 'calculator_summary' ).style.display = 'none';
	document.getElementById( 'no_cookies' ).style.display = 'none';

	if( !g_cookies_ok )
	{
		document.getElementById( 'no_cookies' ).style.display = 'block';
		return;
	}

	
	document.getElementById( 'vehicle_calculator_tab' ).className = 'vehicle';
	document.getElementById( 'home_calculator_tab' ).className = 'home';
	document.getElementById( 'flight_calculator_tab' ).className = 'flight';
	document.getElementById( 'calculator_summary_tab' ).className = 'summary';
	
	document.getElementById( target_id ).style.display = 'block';
	document.getElementById( target_id + '_tab' ).className = document.getElementById( target_id + '_tab' ).className + ' selected';
	
	set_cookie( CALC_TAB_COOKIE_NAME, target_id );
	
	if( target_id == 'calculator_summary' )
	{
		document.getElementById( 'profile_tally' ).style.display = 'none';
		document.getElementById( 'offset_now' ).style.display = 'inline';
		summary_recalc();
	}
	else
	{
		document.getElementById( 'profile_tally' ).style.display = 'inline';
		document.getElementById( 'offset_now' ).style.display = 'none';
	}
}


// -------------------------------------------------------------------------- //
/*	open_home_help()

*/
// -------------------------------------------------------------------------- //

function open_home_help()
{
	day = new Date();
	id = day.getTime();
	eval("page" + id + " = window.open( 'calculator_home_help.html', '" + id + 
		"', 'toolbar=0,scrollbars=0,location=0,statusbar=0,menubar=0,resizable=0,width=400,height=200,left = 400,top = 300');");
}


// -------------------------------------------------------------------------- //
/*	summary_recalc()

*/
// -------------------------------------------------------------------------- //

function summary_recalc()
{
	var			len = document.getElementById( 'calc_offset_items' ).rows.length;
	var			total_carbon = 0;
	var			homes = 0, vehicles = 0, flights = 0;
	
	for( var i = 0; i < len; i++ )
	{
		var			chk_elem = document.getElementById( 'calc_item_cost_chk_' + i );
		
		if( chk_elem != undefined && chk_elem.checked )
		{
			total_carbon += parseFloat( chk_elem.value );
			
			var			type = $( '#calc_offset_item_' + i + ' td.kind img' ).attr('title');
			
			if( type == 'home' )
				homes++;
			else if( type == 'vehicle' )
				vehicles++;
			else if( type == 'flight' )
				flights++;
		}
	}
	
	if( total_carbon == 0 )
		document.getElementById( 'calc_summary_sign_up' ).style.display='none';
	else
		document.getElementById( 'calc_summary_sign_up' ).style.display='block';

	document.getElementById( 'calc_offset_total' ).innerHTML = total_carbon.toFixed(2);
	
	var			one_time_cost = (total_carbon * COST_PER_TONNE).toFixed(2);
	var			monthly_cost = ((total_carbon * COST_PER_TONNE) / MONTHS_IN_YEAR).toFixed(2);
	var			annual_cost = (total_carbon * ANNUAL_COST_PER_TONNE).toFixed(2);
	
	document.getElementById( 'monthlyPrice' ).value = monthly_cost;
	document.getElementById( 'yearlyPrice' ).value = annual_cost;
	document.getElementById( 'oneTimePrice' ).value = one_time_cost;
	document.getElementById( 'monthlyPrice_text' ).innerHTML = monthly_cost;
	document.getElementById( 'yearlyPrice_text' ).innerHTML = annual_cost;
	document.getElementById( 'oneTimePrice_text' ).innerHTML = one_time_cost;
	document.getElementById( 'dealer_oneTimePrice_text' ).innerHTML = one_time_cost;
	
	document.getElementById( 'number_of_offset_homes' ).value = homes;
	document.getElementById( 'number_of_offset_vehicles' ).value = vehicles;
	document.getElementById( 'number_of_offset_flights' ).value = flights;
	document.getElementById( 'total_carbon_offset' ).value = g_profile.carbon_total.toFixed(2);
}


// ========================================================================== //
// General functions
// ========================================================================== //

// -------------------------------------------------------------------------- //
/*	show_message

*/
// -------------------------------------------------------------------------- //

var		msgs = new Array();
var		MSG_NO_CAR_DATA = 0;

msgs[0] = 'No car data.';

function show_message( id, msg_id )
{
	var			nothing;
}

// -------------------------------------------------------------------------- //
/*	get_form_float

*/
// -------------------------------------------------------------------------- //

function get_form_float( id, reset_value )
{
	var			id_elem = document.getElementById( id );
	var			id_value = 0;
	
	if( id_elem !== undefined )
	{
		id_value = parseFloat( id_elem.value );

		if( isNaN( id_value ) || (id_value < 0) )
		{
			id_value = 0;
			id_elem.value = reset_value;
			try{ id_elem.focus(); } catch (e) {} 
		}
		else
			id_elem.value = id_value; // Send back the parsed data to clean the field.
	}
	
	return id_value;
}

// -------------------------------------------------------------------------- //
/*	get_form_int

*/
// -------------------------------------------------------------------------- //

function get_form_int( id, reset_value )
{
	var			id_elem = document.getElementById( id );
	var			id_value = 0;
	
	if( id_elem !== undefined )
	{
		id_value = parseInt( id_elem.value );

		if( isNaN( id_value ) || (id_value < 0) )
		{
			id_value = reset_value;
			id_elem.value = reset_value;
			try{ id_elem.focus(); } catch (e) {} 
		}
		else
			id_elem.value = id_value; // Send back the parsed data to clean the field.
	}
	
	return id_value;
}


// -------------------------------------------------------------------------- //
/*	cookie_test

*/
// -------------------------------------------------------------------------- //

function cookie_test()
{
	set_cookie( 'cookie_test', '1' );
	var result = get_cookie( 'cookie_test' );
	
	if( result )
	{
		delete_cookie( 'cookie_test' );
		return true;
	}
	
	return false;
}
	

// -------------------------------------------------------------------------- //
/*	get_cookie

*/
// -------------------------------------------------------------------------- //

function get_cookie( name )
{
	var start = document.cookie.indexOf( name + '=' );
	var len = start + name.length + 1;

	if( ( !start ) && ( name != document.cookie.substring( 0, name.length ) ) )
		return null;

	if( start == -1 )
		return null;

	var end = document.cookie.indexOf( ';', len );
	if( end == -1 )
		end = document.cookie.length;

	return unescape( document.cookie.substring( len, end ) );
}
	
// -------------------------------------------------------------------------- //
/*	set_cookie

*/
// -------------------------------------------------------------------------- //

function set_cookie( name, value, expires, path, domain, secure )
{
	var today = new Date();

	today.setTime( today.getTime() );
	if( expires )
		expires = expires * 1000 * 60 * 60 * 24;
	
	var expires_date = new Date( today.getTime() + (expires) );

	document.cookie = name + '=' + escape( value ) +
		( ( expires ) ? ';expires='+expires_date.toGMTString() : '' ) +
		( ( path ) ? ';path=' + path : '' ) +
		( ( domain ) ? ';domain=' + domain : '' ) +
		( ( secure ) ? ';secure' : '' );
}

// -------------------------------------------------------------------------- //
/*	delete_cookie

*/
// -------------------------------------------------------------------------- //

function delete_cookie( name, path, domain )
{
	if( get_cookie( name ) )
	{
		document.cookie = name + '=' + 
			( ( path ) ? ';path=' + path : '') +
			( ( domain ) ? ';domain=' + domain : '' ) +	
			';expires=Thu, 01-Jan-1970 00:00:01 GMT';
	}
}


// -------------------------------------------------------------------------- //
/*	url_get

*/
// -------------------------------------------------------------------------- //

function url_get( id )
{
  id = id.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
  var regexS = "[\\?&]"+ id +"=([^&#]*)";
  var regex = new RegExp( regexS );
  var results = regex.exec( window.location.href );
  if( results == null )
    return '';
  else
    return results[1];
}
