function MpgCalculator()
{

	var calc = null;
	var mpgDropdown = null;
	var advancedLink = null;
	var basicLink = null;
	var currentMode = '';
	var expansionLevel = 0;
	var currentMonthlyCost = 0;
	var currentYearlyCost = 0;
	var currentTotalCost = 0;
	var newMonthlyCost = 0;
	var newYearlyCost = 0;
	var newTotalCost = 0;
	var savingsMonthly = 0;
	var savingsYearly = 0;
	var savingsTotal = 0;
	var inputValid = true;
	var hasInventoryId = false;

	this.Init = function(id, startingMode)
	{
		calc = $(id);
		currentMode = startingMode;
		expansionLevel = 0;//compressed
		advancedLink = calc.select('.navadvanced')[0];
		basicLink = calc.select('.navbasic')[0];
		advancedLink.onclick = this.ChangeView;
		basicLink.onclick = this.ChangeView;
		
		mpgDropdown = $(id + '_Dropdown');
		if (mpgDropdown != null)
		{
			mpgDropdown.onclick = this.DropdownCalculator;
		}
		
		var expand = calc.select('.expander')[0];
		var collapse = calc.select('.collapser')[0];
		expand.onclick = this.Expand;
		collapse.onclick = this.Expand;
		
		var compare = calc.select('.comparebutton')[0];
		compare.onclick = this.Compare;

		var dropdownButton = calc.select('.dropdownClosebutton')[0];
		if (dropdownButton != null)
		{
			dropdownButton.onclick = this.DropdownCalculator;
		}
		
		hasInventoryId = calc.select('.hasinventory')[0].value;
		
		if (hasInventoryId == 'False')
		{
			calc.select('.bnewmpg')[0].className = "data bnewmpg";
			calc.select('.bnewmpgreadonly')[0].style.display = "none";
			calc.select('.anewavgmpg')[0].className = "data anewavgmpg";
			calc.select('.anewavgmpgreadonly')[0].style.display = "none";
			calc.select('.anewavgcity')[0].className = "data anewavgcity";
			calc.select('.anewavgcityreadonly')[0].style.display = "none";
			calc.select('.anewavghwy')[0].className = "data anewavghwy";
			calc.select('.anewavghwyreadonly')[0].style.display = "none";
		}
		else
		{
			calc.select('.bnewmpgreadonly')[0].innerHTML = calc.select('.bnewmpg')[0].value;
		}
		
		calc.select('.bnewmpg')[0].onkeypress = CheckForEnter;
		calc.select('.bcurrentmpg')[0].onkeypress = CheckForEnter;
		calc.select('.bfuelprice')[0].onkeypress = CheckForEnter;
		calc.select('.bavgmiles')[0].onkeypress = CheckForEnter;
	}
	
	this.Compare = function()
	{
		inputValid = true;
		if (currentMode == 'Basic')
		{//basic    ((miles * fuel$) / avgmpg)
			var bCurrentMpg =  FormatInput(calc.select('.bcurrentmpg')[0]);
			var bNewMpg =  FormatInput(calc.select('.bnewmpg')[0]);
			var bFuelPrice =  FormatInput(calc.select('.bfuelprice')[0]);
			var bAvgMiles =  FormatInput(calc.select('.bavgmiles')[0]);
			
			if (inputValid)
			{
				currentYearlyCost = ((bAvgMiles * bFuelPrice) / bCurrentMpg);
				newYearlyCost = ((bAvgMiles * bFuelPrice) / bNewMpg);
				savingsYearly = currentYearlyCost - newYearlyCost;
				savingsMonthly = savingsYearly / 12;
			}
			else
			{
				savingsYearly = 0;
				savingsMonthly = 0;
			}

			calc.select('.monthlyamount')[0].update(FormatCurrency(savingsMonthly.round().abs()));
			calc.select('.yearlyamount')[0].update(FormatCurrency(savingsYearly.round().abs()));	
		}
		else 
		{
			var aCurrentFuelPrice = FormatInput(calc.select('.acurrentfuelprice')[0]);
			var aNewFuelPrice = FormatInput(calc.select('.anewfuelprice')[0]);
			var aAvgMiles = FormatInput(calc.select('.aavgmiles')[0]);
			var aYears = FormatInput(calc.select('.ayears')[0]);
				
			if (expansionLevel == 0)
			{//advanced collapse((miles * fuel$) / avgmpg)	
				var aCurrentAvgMpg = FormatInput(calc.select('.acurrentavgmpg')[0]);
				var aNewAvgMpg = FormatInput(calc.select('.anewavgmpg')[0]);
				
				if (inputValid)
				{
					currentYearlyCost = ((aAvgMiles * aCurrentFuelPrice) / aCurrentAvgMpg);
					newYearlyCost = ((aAvgMiles * aNewFuelPrice) / aNewAvgMpg);
				}
				else
				{
					currentYearlyCost = 0;
					newYearlyCost = 0;
				}
			}
			else if (expansionLevel == 1)
			{//advanced expanded((miles * city% * fuel$) / citympg) + ((miles * hwy% * fuel$) / hwympg)
				var aCurrentAvgCity = FormatInput(calc.select('.acurrentavgcity')[0]);
				var aCurrentAvgHwy = FormatInput(calc.select('.acurrentavghwy')[0]);
				var aNewAvgCity = FormatInput(calc.select('.anewavgcity')[0]);
				var aNewAvgHwy = FormatInput(calc.select('.anewavghwy')[0]);
				var aPctCity = FormatInput(calc.select('.apctcity')[0]);
				var aPctHwy = FormatInput(calc.select('.apcthwy')[0]);
				
				if (inputValid)
				{
					currentYearlyCost = ((aAvgMiles * (aPctCity / 100) * aCurrentFuelPrice) / aCurrentAvgCity) + 
											((aAvgMiles * (aPctHwy / 100) * aCurrentFuelPrice) / aCurrentAvgHwy);
					newYearlyCost = ((aAvgMiles * (aPctCity / 100) * aNewFuelPrice) / aNewAvgCity) + 
										((aAvgMiles * (aPctHwy / 100) * aNewFuelPrice) / aNewAvgHwy);
				}
				else
				{
					currentYearlyCost = 0;
					newYearlyCost = 0;
				}

			}
			
			if (inputValid)
			{
				currentMonthlyCost = currentYearlyCost / 12;
				currentTotalCost = currentYearlyCost * aYears;
				newMonthlyCost = newYearlyCost / 12;
				newTotalCost = newYearlyCost * aYears;
				savingsYearly = currentYearlyCost - newYearlyCost;
				savingsMonthly = savingsYearly / 12;
				savingsTotal = savingsYearly * aYears;
			}
			else
			{
				
			}	
				
			calc.select('.monthlyamount')[0].update(FormatCurrency(savingsMonthly.round().abs()));
			calc.select('.yearlyamount')[0].update(FormatCurrency(savingsYearly.round().abs()));
			calc.select('.totalamount')[0].update(FormatCurrency(savingsTotal.round().abs()));
			calc.select('.currentmonthlycost')[0].update(FormatCurrency(currentMonthlyCost.round()));
			calc.select('.currentyearlycost')[0].update(FormatCurrency(currentYearlyCost.round()));
			calc.select('.currenttotalcost')[0].update(FormatCurrency(currentTotalCost.round()));
			calc.select('.newmonthlycost')[0].update(FormatCurrency(newMonthlyCost.round()));
			calc.select('.newyearlycost')[0].update(FormatCurrency(newYearlyCost.round()));
			calc.select('.newtotalcost')[0].update(FormatCurrency(newTotalCost.round()));
		}
		
		if (savingsYearly < 0)
		{
			calc.select('.monthlylabel')[0].update(calc.select('.monthlylabel')[0].readAttribute('increasetext'));
			calc.select('.yearlylabel')[0].update(calc.select('.yearlylabel')[0].readAttribute('increasetext'));
			calc.select('.totallabel')[0].update(calc.select('.totallabel')[0].readAttribute('increasetext'));
		}
		else
		{
			calc.select('.monthlylabel')[0].update(calc.select('.monthlylabel')[0].readAttribute('savingstext'));
			calc.select('.yearlylabel')[0].update(calc.select('.yearlylabel')[0].readAttribute('savingstext'));
			calc.select('.totallabel')[0].update(calc.select('.totallabel')[0].readAttribute('savingstext'));
		}
	}
	
	this.ChangeView = function()
	{
		var basic = calc.select('.basicinput')[0];
		var advanced = calc.select('.advancedinput')[0];
		
		if (advanced.style.display != 'block')
		{
			currentMode = 'Advanced';
			calc.removeClassName('mpgbase');
			calc.addClassName('mpgadvanced');
			advanced.style.display = 'block';
			basic.style.display = 'none';
			advancedLink.style.display = 'none';
			basicLink.style.display = 'block';
		}
		else
		{
			currentMode = 'Basic';
			calc.removeClassName('mpgadvanced');
			calc.addClassName('mpgbase');
			advanced.style.display = 'none';
			basic.style.display = 'block';
			basicLink.style.display = 'none';
			advancedLink.style.display = 'block';
		}		
		
		// send event to scrollers to recalculate their appearance
		document.fire("Tab:Switch");		
		return false;
	}
	
	this.Expand = function()
	{
		if (expansionLevel == 0)
		{	
			calc.select('.avgmpg')[0].addClassName('hidden');
			calc.select('.avgcity')[0].removeClassName('hidden');
			calc.select('.avghwy')[0].removeClassName('hidden');
			calc.select('.pctcity')[0].removeClassName('hidden');
			calc.select('.pcthwy')[0].removeClassName('hidden');
			expansionLevel = 1;//expanded
		}
		else
		{
			calc.select('.avgmpg')[0].removeClassName('hidden');
			calc.select('.avgcity')[0].addClassName('hidden');
			calc.select('.avghwy')[0].addClassName('hidden');
			calc.select('.pctcity')[0].addClassName('hidden');
			calc.select('.pcthwy')[0].addClassName('hidden');
			expansionLevel = 0;//compressed
		}
		return false;
	}
	
	this.DropdownCalculator = function()
	{
		if (calc.getStyle('display') == 'none')
		{
			calc.setStyle({display: 'block'});
			mpgDropdown.removeClassName('mpgcloseddropdown');
			mpgDropdown.addClassName('mpgopendropdown');
		}
		else
		{
			calc.setStyle({display: 'none'});
			mpgDropdown.removeClassName('mpgopendropdown');
			mpgDropdown.addClassName('mpgcloseddropdown');
		}
		return false;
	}
	
	function FormatCurrency(num)
	{
		var s = num.toString();
		var reversed = ReverseString(s);
		var formattedString = '';
		
		var i = 0;
		var j = 0;
		while (i < reversed.length)
		{
			formattedString += reversed.substring(i,i+1);
			if (j==2 && i+1 < reversed.length)
				formattedString += ',';
			
			if (j == 2)
				j = 0;
			else 
				j++;
				
			i++;
		}
		formattedString += '$';
		
		return ReverseString(formattedString);
	}

	function FormatInput(e)
	{
		var input = e.value;
		input = input.gsub(',','');
		input = input.gsub('\\$','');
		input = input.gsub('%','');
		
		if (isNaN(input) || input == 0 || input == '')
		{
			inputValid = false;
			e.value = 0;
			return '0'
		}
		else
			return input;
	}	

	function ReverseString(s)
	{
		var sArray = s.toArray();
		var reversed = sArray.reverse();
		return reversed.join('');
	}
	
	function CheckForEnter(e)
	{
		var object = window.event ? event : e
		if (object.keyCode == 13)
		{
			var button = calc.select('.comparebutton')[0];
			button.click();
			return false;
		}
	}
	
}


