/* ***********************************************************
tipcalc.js
Used by Tip Calculator for iPhone
by Danny Goodman (http://dannyg.com/iphone/tipCalc/)
************************************************************ */
// process numeric keypad events
function handleKeyTap(evt) {
	var clickVal = evt.target.title;
	var editMode = true;
	try {
		var textNode = document.getElementById(editObject.id + "Value").firstChild;
		var textValue = textNode.nodeValue;
	}
	catch(e) {
		editMode = false
	}
	switch (clickVal) {
		case "ok" :
			keypadObject.hide();
			textNode.parentNode.className = "entryField";
			recalcObject.calculateTip();
			if (editMode) {
				editObject.clearObject();
			}
			break;
		case "bs" :
			if (textNode.parentNode.className == "entryFieldSelected") {
				textNode.nodeValue = "";
				textNode.parentNode.className = "entryField";
			} else {
				textValue = textValue.substring(0, textValue.length-1)
				textNode.nodeValue = textValue;
			}
			break;
		case "dot" :
			if (textNode.parentNode.className == "entryFieldSelected") {
				textValue = "0.";
				textNode.parentNode.className = "entryField";
			} else if (textValue.indexOf(".") == -1) {
				if (textValue == "") {
					textValue = "0.";
				} else {
					textValue += ".";
				}
			}
			textNode.nodeValue = textValue;
			break;
		default :
			var re1 = /\.\d\d/;
			var re2 = /\d{4}$/;
			if (textNode.parentNode.className == "entryFieldSelected") {
				textNode.parentNode.className = "entryField";
				if (textValue == "0.") {
					textValue += clickVal;
				} else {
					textValue = clickVal;
				}
			} else if (!re1.test(textValue) && !re2.test(textValue)) {
				if (textValue == "" && clickVal == "0") {
					textValue = textValue;
				} else {
					textValue += clickVal;
				}
			}
			textNode.nodeValue = textValue;
	}
}

// edit object
var editObject = {id : null,
	setObject : function(id) {
		var elem = document.getElementById(id);
		elem.className = "editOn";
		editObject.id = id;
		keypadObject.show();
		document.getElementById(id + "Value").className = "entryFieldSelected";
	},
	clearObject: function(id) {
		document.getElementById(editObject.id).className = "editOff";
		document.getElementById(editObject.id + "Value").className = "entryField";
		editObject.id = null;
	},
	ready: function() {
		document.getElementById("foodBevCell").className = "editOff";
		document.getElementById("taxCell").className = "editOff";
	}
};

// toggle edit mode for two editable cells
function toggleEdit(evt) {
	var elem = evt.target;
	if (elem.nodeType != 1) {
		elem = elem.parentNode
	}
	while (elem.tagName != "TD") {
		elem = elem.parentNode;
	}
	if (!editObject.id) {
		editObject.setObject(elem.id);
		keypadObject.show();
	} else if (editObject.id && (editObject.id == elem.id)) {
		editObject.clearObject(elem.id);
		keypadObject.hide();
		recalcObject.calculateTip();
	} else {
		editObject.clearObject(elem.id);
		editObject.setObject(elem.id);
	}
	evt.preventDefault();
	evt.stopPropagation();
}

// recalculation object
var recalcObject = {
	type : "percent",
	percentValue : 2,
	taxValue : 1,
	getPrefs : function() {
		var prefsValue = cookieMgr.getCookie("tipPrefs");
		if (prefsValue) {
			prefsValue = prefsValue.split("/");
			recalcObject.type = prefsValue[0];
			document.getElementById("percent").selectedIndex = recalcObject.percentValue = prefsValue[1];
			document.getElementById("taxMultiple").selectedIndex = recalcObject.taxValue = prefsValue[2];
			if (recalcObject.type == "percent") {
				document.getElementById("prefsRadio1").checked = true;
			} else {
				document.getElementById("prefsRadio2").checked = true;			
			}
		} else {
			// default if no cookie yet present
			document.getElementById("percent").selectedIndex = recalcObject.percentValue;
			document.getElementById("taxMultiple").selectedIndex = recalcObject.taxValue;
			document.getElementById("prefsRadio1").checked = true;
		}
	},
	setPrefs : function() {
		var prefsType = (document.getElementById("prefsRadio1").checked) ? "percent" : "tax";
		var prefsValue = [prefsType, document.getElementById("percent").selectedIndex,
			document.getElementById("taxMultiple").selectedIndex];
		cookieMgr.setCookie("tipPrefs", prefsValue.join("/"));
	},
	calculateTip : function() {
		recalcObject.setPrefs();
		var billData = {subtotal : parseFloat(document.getElementById("foodBevCellValue").firstChild.nodeValue),
						tax : parseFloat(document.getElementById("taxCellValue").firstChild.nodeValue),
						diners : document.getElementById("dinerCount").value,
						tip : 0};
		if (isNaN(billData.subtotal)) {
			document.getElementById("foodBevCellValue").firstChild.nodeValue = "0.00";
			billData.subtotal = 0;
		} else {
			document.getElementById("foodBevCellValue").firstChild.nodeValue = billData.subtotal.toFixed(2);
		}
		if (isNaN(billData.tax)) {
			document.getElementById("taxCellValue").firstChild.nodeValue = "0.00";
			document.getElementById("taxPct").firstChild.nodeValue = "";
			billData.tax = 0;
		} else {
			document.getElementById("taxCellValue").firstChild.nodeValue = billData.tax.toFixed(2);
		}
		if (billData.subtotal > 0) {
			if (recalcObject.type == "percent") {
				billData.tip = (billData.subtotal * (document.getElementById("percent").value / 100)).toFixed(2);
				document.getElementById("tipValue").firstChild.nodeValue = billData.tip;
				document.getElementById("totalValue").firstChild.nodeValue = (billData.subtotal + billData.tax + parseFloat(billData.tip)).toFixed(2);
				document.getElementById("perDinerValue").firstChild.nodeValue = 
					((billData.subtotal + billData.tax + parseFloat(billData.tip)) / billData.diners).toFixed(2);
			} else {
				billData.tip = (billData.tax * (document.getElementById("taxMultiple").value)).toFixed(2);
				document.getElementById("tipValue").firstChild.nodeValue = billData.tip;
				document.getElementById("totalValue").firstChild.nodeValue = (billData.subtotal + billData.tax + parseFloat(billData.tip)).toFixed(2);
				document.getElementById("perDinerValue").firstChild.nodeValue = 
					((billData.subtotal + billData.tax + parseFloat(billData.tip)) / billData.diners).toFixed(2);
			}
			this.calcTaxRate(billData);
		} else {
			document.getElementById("tipValue").firstChild.nodeValue = "-.--";
			document.getElementById("totalValue").firstChild.nodeValue = "-.--";
			document.getElementById("perDinerValue").firstChild.nodeValue = "-.--";
			document.getElementById("taxPct").firstChild.nodeValue = "";
		}
	},
	calcTaxRate : function(billData) {
		if (billData.tax && billData.subtotal) {
			var result = (billData.tax / billData.subtotal) * 100;
			document.getElementById("taxPct").firstChild.nodeValue = "(" + result.toFixed(2) + "%)";
		} else {
			document.getElementById("taxPct").firstChild.nodeValue = "";
		}
	},
	toggleType : function(evt) {
		var elem = evt.target;
		if (elem.id == "prefsRadio1") {
			//elem.src = "radioOn.png";
			//document.getElementById("prefsRadio2").src = "radioOff.png";
			recalcObject.type = "percent";
		} else {
			//elem.src = "radioOn.png";
			//document.getElementById("prefsRadio1").src = "radioOff.png";
			recalcObject.type = "multiple";
		}
		recalcObject.calculateTip();
	}
};

// abstract keypad object
var keypadObject = {keypadID : null,
	show : function() {
		if (keypadObject.keypadID) {
			document.getElementById(keypadObject.keypadID).style.visibility = "visible";
		}
	},
	hide : function() {
		if (keypadObject.keypadID) {
			document.getElementById(keypadObject.keypadID).style.visibility = "hidden";
		}
	},
	init : function(id) {
		keypadObject.keypadID = id;
	}
}

// toggle between main and preferences panels
function flipToPanel(evt) {
	if (evt.target.id == "toPrefs") {
		document.getElementById("prefsTable").style.visibility = "visible";
		document.getElementById("calculationTable").style.visibility = "hidden";
	} else {
		document.getElementById("prefsTable").style.visibility = "hidden";
		document.getElementById("calculationTable").style.visibility = "visible";
	}
}
// set up events and other initializations
function initialize() {
	var keys = document.getElementById("keypadTable").getElementsByTagName("button");
	for (var i = 0; i < keys.length; i++) {
		addEvent(keys[i], "click", handleKeyTap, false);
	}
	addEvent(document.getElementById("foodBevCell"), "click", toggleEdit, false);
	addEvent(document.getElementById("taxCell"), "click", toggleEdit, false);
	addEvent(document.getElementById("dinerCount"), "change", recalcObject.calculateTip, false);
	addEvent(document.getElementById("percent"), "change", recalcObject.calculateTip, false);
	addEvent(document.getElementById("taxMultiple"), "change", recalcObject.calculateTip, false);
	addEvent(document.getElementById("prefsRadio1"), "click", recalcObject.toggleType, false);
	addEvent(document.getElementById("prefsRadio2"), "click", recalcObject.toggleType, false);
	addEvent(document.getElementById("toPrefs"), "click", flipToPanel, false);
	addEvent(document.getElementById("done"), "click", flipToPanel, false);
	keypadObject.init("keypadTable");
	recalcObject.getPrefs();
	editObject.ready();
}
addOnLoadEvent(initialize);
