function MPGObject() {
	this.isID = false;
	this.isAll = false;
	this.isLayer = false;
	this.home_url = "http://www.mpgomatic.com/best_gas_mileage_car.html";
	this.base_url = "http://www.mpgomatic.com/mpgomatic/";
	
	if(document.getElementById) this.isID = true;
	else {
		if(document.all) this.isAll = true;
		else {
			if((navigator.appName.indexOf('Netscape') != -1) && (parseInt(navigator.appVersion) == 4)) this.isLayer = true;
		}
	}
}
var MPG = new MPGObject();

MPGObject.prototype.$ = function(pElementID) {
	if(MPG.isID) return document.getElementById(pElementID);
	if(MPG.isAll) return document.all[pElementID]; 
	if(MPG.isLayer) return document.layers[pElementID];
	return null;
}
MPGObject.prototype.$$ = function(pElementID) {
	var vObject = MPG.$(pElementID);
	if(!vObject) return null;
	if(!vObject.style) return vObject;
	if(MPG.isID || (!MPG.isID && MPG.isAll)) return (vObject.style);
	return vObject;
}
MPGObject.prototype.$A = function(pObject, pEvent, pFc) {
	if(pObject.addEventListener) pObject.addEventListener(pEvent, pFc, false); 
	else if(pObject.attachEvent) pObject.attachEvent("on" + pEvent, pFc);
}
MPGObject.prototype.getCookie = function(pName, pDefault) {
	var vStart = document.cookie.indexOf(pName + "=");
	var vValueSeparatorIndex = (pName + "=").indexOf("=") + 1;
	if(vStart >= 0) {
		var vEnd = document.cookie.indexOf(";", vStart);
		if(vEnd < 0) vEnd = document.cookie.length;
		return document.cookie.substring((vStart + vValueSeparatorIndex), vEnd);
	}
	return pDefault;
}
MPGObject.prototype.setCookie = function(pName, pValue, pExpireHours) {
	document.cookie = pName + "=" + escape(pValue) + "; expires=" + (new Date((new Date()).getTime() + (pExpireHours * 3600000))).toGMTString();
}

/*
<head>
	<link rel="stylesheet" href="http://www.mpgomatic.com/mpgomatic/mpgomatic.css" type="text/css" />
	<script src="http://www.mpgomatic.com/mpgomatic/mpgomatic.js" type="text/javascript></script>
</head>
<body>
...
<div id="mpgomatic"></div><script type="text/javascript">MPG.load("mpgomatic");</script>
...
</body>
*/
MPGObject.prototype.load = function(pElementID) {
	try {
		var vContainer = MPG.$(pElementID);
		if(vContainer) {
			for(var vLoop = (vContainer.childNodes.length - 1); vLoop >= 0; vLoop--) vContainer.removeChild(vContainer.childNodes[vLoop]);
			
			vContainer.className = "mpgomatic";
			
			var vObject = document.createElement("img");
			vContainer.appendChild(vObject);
			vObject.id = "mpg_units_button";
			vObject.src = MPG.base_url + "art/mpg.png";
			MPG.$A(vObject, "click", MPG.toggle_units);
			
			vObject = document.createElement("img");
			vContainer.appendChild(vObject);
			vObject.id = "mpg_units";
			vObject.src = MPG.base_url + "art/kpl_head.png";
			if(MPG.getCookie("units", "mpg") == "kpl") MPG.toggle_units();
			
			var vForm = document.createElement("form");
			vContainer.appendChild(vForm);
			vForm.action = "#";
			vForm.onsubmit = "return false;";
			
			vObject = document.createElement("input");
			vForm.appendChild(vObject);
			vObject.id = "mpg_ocpg";
			vObject.className = "mpg_field";
			vObject.type = "text";
			
			vObject = document.createElement("input");
			vForm.appendChild(vObject);
			vObject.id = "mpg_ompg";
			vObject.className = "mpg_field";
			vObject.type = "text";
			
			vObject = document.createElement("input");
			vForm.appendChild(vObject);
			vObject.id = "mpg_omd";
			vObject.className = "mpg_field";
			vObject.type = "text";
			
			vObject = document.createElement("div");
			vForm.appendChild(vObject);
			vObject.id = "mpg_ocpm";
			vObject.className = "mpg_field mpg_calc_field";
			
			vObject = document.createElement("div");
			vForm.appendChild(vObject);
			vObject.id = "mpg_otc";
			vObject.className = "mpg_field mpg_calc_field";
			
			
			vObject = document.createElement("input");
			vForm.appendChild(vObject);
			vObject.id = "mpg_ncpg";
			vObject.className = "mpg_field";
			vObject.type = "text";
			
			vObject = document.createElement("input");
			vForm.appendChild(vObject);
			vObject.id = "mpg_nmpg";
			vObject.className = "mpg_field";
			vObject.type = "text";
			
			vObject = document.createElement("input");
			vForm.appendChild(vObject);
			vObject.id = "mpg_nmd";
			vObject.className = "mpg_field";
			vObject.type = "text";
			
			vObject = document.createElement("div");
			vForm.appendChild(vObject);
			vObject.id = "mpg_ncpm";
			vObject.className = "mpg_field mpg_calc_field";
			
			vObject = document.createElement("div");
			vForm.appendChild(vObject);
			vObject.id = "mpg_ntc";
			vObject.className = "mpg_field mpg_calc_field";
			
			
			vObject = document.createElement("div");
			vForm.appendChild(vObject);
			vObject.id = "mpg_scpm";
			vObject.className = "mpg_field mpg_savings_field";
			
			vObject = document.createElement("div");
			vForm.appendChild(vObject);
			vObject.id = "mpg_stc";
			vObject.className = "mpg_field mpg_savings_field";
			
			MPG.make_field("mpg_ocpg");
			MPG.make_field("mpg_ompg");
			MPG.make_field("mpg_omd");
			MPG.make_field("mpg_ncpg");
			MPG.make_field("mpg_nmpg");
			MPG.make_field("mpg_nmd");
			
			vObject = document.createElement("img");
			vContainer.appendChild(vObject);
			vObject.id = "mpg_savings";
			vObject.src = MPG.base_url + "art/savings_grey.png";
			
			vObject = document.createElement("a");
			vContainer.appendChild(vObject);
			vObject.id = "mpg_goto_site";
			vObject.href = MPG.home_url;
			vObject.target = "_blank";
			MPG.$A(vObject, "mouseover", function(pEvent) { MPG.$("mpg_goto_site_img").src = MPG.base_url + "art/button_hover.png"; });
			MPG.$A(vObject, "mouseout", function(pEvent) { MPG.$("mpg_goto_site_img").src = MPG.base_url + "art/button.png"; });
			//MPG.$A(vObject, "click", function(pEvent) { MPG.$("mpg_goto_site_img").src = MPG.base_url + "art/button_click.png"; document.location = MPG.home_url; MPG.$("mpg_goto_site").src = MPG.base_url + "art/button.png"; });
			
			var vImage = document.createElement("img");
			vObject.appendChild(vImage);
			vImage.id = "mpg_goto_site_img";
			vImage.src = MPG.base_url + "art/button.png";
		}
	} catch(e) { }
}

MPGObject.prototype.toggle_units = function() {
	var vObject = MPG.$("mpg_units_button");
	if(vObject.src.match(/kpl.png$/i)) {
		vObject.src = MPG.base_url + "art/mpg.png";
		MPG.$("mpg_units").style.visibility = "hidden";
		MPG.setCookie("units", "mpg", (30 * 24));
	} else {
		vObject.src = MPG.base_url + "art/kpl.png";
		MPG.$("mpg_units").style.visibility = "visible";
		MPG.setCookie("units", "kpl", (30 * 24));
	}
	
}
MPGObject.prototype.make_field = function(pObjectID) {
	var vObject = MPG.$(pObjectID);
	if(vObject) {
		MPG.$A(vObject, "blur", function(pEvent) {
			vObject.value = vObject.value.to_field_value((vObject.id.match(/cpg$/)) ? "$" : "");
			vObject.num_value = vObject.value.to_numerical_value();
			
			if((vObject.id == "mpg_ocpg") || (vObject.id == "mpg_omd")) {
				var vRelation = MPG.$(vObject.id.replace(/_o/, "_n"));
				if(vRelation) {
					vRelation.value = vObject.value
					vRelation.num_value = vObject.num_value;
				}
			}
			MPG.recalculate_values();
		}, true);
	}
}
MPGObject.prototype.setInnerText = function(pObject, pValue) {
	if(pObject) {
		for(var vLoop = (pObject.childNodes.length - 1); vLoop >= 0; vLoop--) pObject.removeChild(pObject.childNodes[vLoop]);
		pObject.appendChild(document.createTextNode(pValue));
	}
}

MPGObject.prototype.recalculate_values = function() {
	var vOldValues = MPG.recalculate_line_values("o");
	var vNewValues = MPG.recalculate_line_values("n");
	
	if((vOldValues.length >= 3) && (vNewValues.length >= 3)) {
		var vObject = MPG.$("mpg_scpm");
		if(vObject) MPG.setInnerText(vObject, ("" + (vOldValues[3] - vNewValues[3])).to_field_value("$$"));
		vObject = MPG.$("mpg_stc");
		if(vObject) MPG.setInnerText(vObject, ("" + (vOldValues[4] - vNewValues[4])).to_field_value("$-"));
		MPG.$("mpg_savings").src = MPG.base_url + "art/savings.png";
	} else {
		var vObject = MPG.$("mpg_scpm");
		if(vObject) MPG.setInnerText(vObject, "");
		vObject = MPG.$("mpg_stc");
		if(vObject) MPG.setInnerText(vObject, "");
		MPG.$("mpg_savings").src = MPG.base_url + "art/savings_grey.png";
	}
}
MPGObject.prototype.recalculate_line_values = function(pPrefix) {
	var vResult = new Array();
	var vObject = MPG.$("mpg_" + pPrefix + "cpg");
	if(vObject && !isNaN(vObject.num_value)) vResult[vResult.length] = vObject.num_value;
	vObject = MPG.$("mpg_" + pPrefix + "mpg");
	if(vObject && !isNaN(vObject.num_value)) vResult[vResult.length] = vObject.num_value;
	vObject = MPG.$("mpg_" + pPrefix + "md");
	if(vObject && !isNaN(vObject.num_value)) vResult[vResult.length] = vObject.num_value;
	
	if(vResult.length >= 3) {
		vObject = MPG.$("mpg_" + pPrefix + "cpm");
		if(vObject) {
			vResult[vResult.length] = ("" + (vResult[0] / vResult[1])).to_numerical_value(true);
			MPG.setInnerText(vObject, ("" + vResult[3]).to_field_value("$$"));
		}
		vObject = MPG.$("mpg_" + pPrefix + "tc");
		if(vObject) {
			vResult[vResult.length] = ("" + (vResult[3] * vResult[2])).to_numerical_value();
			MPG.setInnerText(vObject, ("" + vResult[4]).to_field_value("$-"));
		}
	} else {
		vObject = MPG.$("mpg_" + pPrefix + "cpm");
		if(vObject) MPG.setInnerText(vObject, "");
		vObject = MPG.$("mpg_" + pPrefix + "tc");
		if(vObject) MPG.setInnerText(vObject, "");
	}
	
	return vResult;
}

String.prototype.to_numerical_value = function(pLong) {
	if(this == "") return Number.isNaN;
	var vValue = this.replace(/[$,]/, "");
	var vTokens = (pLong ? vValue.match(/(\d+)\.(\d{4})\d*/) : vValue.match(/(\d+)\.(\d{3})\d*/));
	if(!vTokens || (vTokens.length < 3)) return parseFloat(vValue);
	vValue = parseInt(vTokens[1]);
	var vLastDigit = (pLong ? 3 : 2);
	if(parseInt(vTokens[2].substr(vLastDigit)) >= 5) {
		if(pLong) vValue += (parseFloat("0." + vTokens[2].substr(0, vLastDigit)) + 0.001);
		else vValue += (parseFloat("0." + vTokens[2].substr(0, vLastDigit)) + 0.01);
	} else vValue += (parseFloat("0." + vTokens[2].substr(0,vLastDigit)));
	return parseFloat(vValue);
}
String.prototype.to_field_value = function(pType) {
	var vNumber = this.to_numerical_value((pType == "$$"));
	if(isNaN(vNumber)) return "";
	var vValue = ("" + vNumber);
	if(pType == "$-") return "$" + vNumber.toFixed(0).number_format();
	if((pType == "$") || (pType == "$$")) return "$" + vNumber.toFixed(((pType == "$$") ? 3 : 2)).number_format();
	return vValue.number_format();
}
String.prototype.number_format = function() {
	var vTokens = this.split('.');
	var vWhole = vTokens[0];
	var vDecimals = vTokens.length > 1 ? '.' + vTokens[1] : '';
	var vRE = /(\d+)(\d{3})/;
	while (vRE.test(vWhole)) vWhole = vWhole.replace(vRE, '$1,$2');
	if(vWhole == "") vWhole = "0";
	return vWhole + vDecimals;
}

