String.prototype.toProperCase = function() {
	return this.toLowerCase().replace(/^(.)|\s(.)/g, function($1) { return $1.toUpperCase(); });
}

Array.prototype.contains = function(s) {
	for (i = 0; i < this.length; ++i)
		if (this[i] === s) return true;
	return false;
}

function getElementsByClass(searchClass, domNode, tagName) {
	if (domNode == null) domNode = document;
	if (tagName == null) tagName = "*";
	var el = new Array();
	var tags = domNode.getElementsByTagName(tagName);
	var tcl = " " + searchClass + " ";
	for(i = 0, j = 0; i < tags.length; ++i) {
		var test = " " + tags[i].className + " ";
		if (test.indexOf(tcl) != -1)
			el[j++] = tags[i];
	}
	return el;
}

function getXMLString(xy, _str) {
	var str = (_str == undefined) ? '' : _str;
	if (xy.nodeValue == undefined) {
		var multiStr=[], temp = '';
		for (var i = 0; i < xy.childNodes.length; ++i) {
			if (xy.childNodes[i].nodeName.toString().indexOf('#') < 0) {
				var nodeNameStart = '<' + xy.childNodes[i].nodeName, nodeNameEnd ='</' + xy.childNodes[i].nodeName + '>';
				var attsStr = ' ', atts = xy.childNodes[i].attributes;
				if (atts != undefined) {				
					for (var j = 0; j < atts.length; ++j)
						attsStr += atts[j].nodeName + '="' + atts[j].firstChild.nodeValue + '"';
				}
				temp = nodeNameStart + ((attsStr == ' ') ? '' : attsStr) + '>' + getXMLString(xy.childNodes[i], str) + nodeNameEnd;
				multiStr.push(temp);
				str = temp;
			} else {
				str = getXMLString(xy.childNodes[i], str);
				multiStr.push(str);
			}
		}
		str = multiStr.join('');
	} else {
	   return xy.nodeValue;
	}
	return str;
}

function XMLStream() {
	var xmlhttp, bComplete = false;
	if (window.ActiveXObject) {
		try {
			xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
				xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e) {
				return false;
			}
		}
	} else if (window.XMLHttpRequest) {
		try {
			xmlhttp = new XMLHttpRequest();
		} catch (e) {
			return false;
		}
		xmlhttp.overrideMimeType("text/xml");
	}
	
	this.connect = function(sURL, sMethod, sRequest, fDone, pid) {
		bComplete = false;
		sMethod = sMethod.toUpperCase();
		try {
			if (sMethod == "GET") {
				xmlhttp.open(sMethod, sURL+"?"+sRequest, true);
				try {
					xmlhttp.setRequestHeader("Content-Type","text/xml");
					xmlhttp.setRequestHeader("Cache-Control", "no-cache");
				} catch (e) {};
				sRequest = null;
			} else {
				xmlhttp.open(sMethod, sURL, true);
				xmlhttp.setRequestHeader("Connection", "close");
				xmlhttp.setRequestHeader("Method", "POST "+sURL+" HTTP/1.1");
				xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
			}
			xmlhttp.onreadystatechange = function() {
				if (xmlhttp.readyState == 4 && !bComplete) {
					if (xmlhttp.status == 200) {
						bComplete = true;
						var xmldoc = xmlhttp.responseXML;
						if (!xmldoc.documentElement && xmlhttp.responseStream) {
							xmldoc.load(xmlhttp.responseStream);
						}
						fDone(xmldoc, pid);
					}
				}
			};
		xmlhttp.send(sRequest);
		} catch(z) {
			return false;
		}
		return true;
	};
	return this;
}

var menu = new Object();
menu.meat = Array("Chicken Breast", "Salmon", "Hamburger", "Hotdog");
menu.salad = Array("Green Leaf Salad", "Potato Salad", "Pasta Salad", "Broccoli Salad");
menu.dessert = Array("Pumpkin Pie", "Apple Pie", "Sweet Potato Pie");

var sounds = new Object();
sounds.files = Array("graveyard_wind.wav", "sleigh_bells.wav", "turkey_gobble.wav");
sounds.stats = Array(1/5, 1/3, 1/2);

var tabs = new Array("perspective", "events", "gallery", "discussion", "registration");
var clearResponse = true;
var timerID = new Array();
var today = new Date;
var track = "";
var timer;
var galleryX;
var deltaX = 0;
var dragging = false;

timerID[0] = 0;
timerID[1] = 0;

window.onload = function() {
	for (i = 0; i < tabs.length; ++i) {
		var tab = document.createElement("img");
		tab.id = (tabs[i] != "empty") ? "_" + tabs[i] : "";
		tab.src = "images/tab_blank.png";
		tab.style.background = "transparent url(images/tab_" + tabs[i] + ".png) no-repeat top";
		tab.setAttribute("alt", tabs[i]);
		document.getElementById("navigation").appendChild(tab);
		var selected = document.createElement("img");
		selected.src = "images/selected_" + tabs[i] + ".png";
	}
	var dates = getElementsByClass("date", document, "img");
	for (i = 0; i < dates.length; ++i) {
		dates[i].src = "images/date_blank.png";
		dates[i].style.backgroundImage = "url(images/" + dates[i].id + ".png)";
		var strDate = String(dates[i].id).substring(5);
		var objDate = new Date(strDate.substr(0, 4) * 1, (strDate.substr(4, 2) * 1) - 1, strDate.substr(6, 2) * 1);
		if (objDate < today) {
			dates[i].style.backgroundPosition = "top";
		} else {
			dates[i].style.backgroundPosition = "bottom";
		}
	}
	updateDiscussion();
	updateRegistration();
	timerID[0] = setTimeout("getAudio()", Math.round(45000 * Math.random()) + 45000);
};

function getAudio() {
	if (timerID[0])
		clearTimeout(timerID[0]);
	var n = Math.random();
	var x = 1;
	var j;
	for (i = 0; i < sounds.files.length; i++) {
		d = Math.abs(n - sounds.stats[i]);
		if (d < x && track != sounds.files[i]) {
			j = i;
			x = d;
		}
	}
	track = sounds.files[j];
	document.getElementById("audio").innerHTML = "<embed type='audio/wav' src='audio/" + track + "' controller='false' hidden='true' loop='false' autoplay='false' autostart='true' pluginspage='http://www.apple.com/quicktime/download/' />";
	timerID[0] = setTimeout("getAudio()", Math.round(45000 * (1 - n)) + 45000);
	updateDiscussion();
}

function getBounty() {
	if (timerID[1])
		clearTimeout(timerID[1]);
	var food = new XMLStream();
	food.connect("menu.php", "GET", "year=" + today.getFullYear(), function(oXML, sPID) {
		var bounty = oXML.getElementsByTagName("bounty");
		track = bounty[0].firstChild.data;
		document.getElementById("bounty").innerHTML = bounty[0].firstChild.data;
		timerID[1] = setTimeout("getBounty()", 30000);
	}, 1);
}

function navEvent(e) {
	if (e.target) {
		var node = e.target;
	} else {
		var e = window.event
		var node = e.srcElement;
	}
	if (node.id == "navigation") { return false; }
	switch (e.type) {
		case "mouseover":
			node.style.backgroundPosition = "bottom";
			break;
		case "mouseout":
			node.style.backgroundPosition = "top";
			break;
		case "click":
			var header = document.getElementById("header");
			var splash = document.getElementById("splash");
			var welcome = document.getElementById("welcome");
			if (node.id == "splash") {
				splash.src = "images/splash_" + today.getFullYear() + ".png";
				header.style.height = "460px";
				welcome.style.display = "block";
			} else {
				splash.src = "images/header_" + today.getFullYear() + ".png";
				header.style.height = "240px";
				welcome.style.display = "none";
			}
			var tabID = String(node.id).substring(1);
			var tabNodes = document.getElementById("navigation").childNodes;
			if (tabID != "") {
				for (i = 0; i < tabs.length; ++i) {
					var div = document.getElementById(tabs[i]);
					if (tabs[i] == tabID) {
						try {
							div.style.display = "block";
						} catch(error) {
						}
						node.src = "images/selected_" + tabID + ".png";
					} else {
						try {
							div.style.display = "none";
						} catch(error) {
						}
						tabNodes[i].src = "images/tab_blank.png";
					}
				}
			}
			break;
	}
}

function eventsEvent(e) {
	if (e.target) {
		var node = e.target;
	} else {
		var e = window.event
		var node = e.srcElement;
	}
	var d = String(node.id).substring(5);
	switch (e.type) {
		case "mouseover":
			break;
			document.getElementById("event_" + d).style.display = "block";
			node.style.backgroundPosition = "bottom";
		case "click":
			var dates = getElementsByClass("date", node.parentNode, "img");
			for (i = 0; i < dates.length; ++i) {
				var strDate = String(dates[i].id).substring(5);
				var objDate = new Date(strDate.substr(0, 4) * 1, (strDate.substr(4, 2) * 1) - 1, strDate.substr(6, 2) * 1);
				if (strDate != d) {
					dates[i].style.backgroundPosition = "top";
					document.getElementById("event_" + strDate).style.display = "none";
				} else {
					dates[i].style.backgroundPosition = "bottom";
					document.getElementById("event_" + d).style.display = "block";
				}
			}
			break;
	}
}

function galleryLeft() {
	timer = setInterval("document.getElementById('pictures').scrollLeft -= 2", 15);
}

function galleryRight() {
	timer = setInterval("document.getElementById('pictures').scrollLeft += 2", 15);
}

function galleryEvent(e) {
	if (e.target) {
		var node = e.target;
	} else {
		var e = window.event
		var node = e.srcElement;
	}
	switch (e.type) {
		case "mouseover":
			switch (node.id) {
				case "arrow_left": {
					//galleryLeft();
					break;
				}
				case "arrow_right": {
					//galleryRight();
					break;
				}
			}
			break;
		case "mouseout":
			if (node.className == "arrow")
				clearInterval(timer);
			break;
		case "mousedown":
			if (node.className == "picture") {
				galleryX = e.pageX ? e.pageX : e.clientX;
				node.style.cursor = "move";
				dragging = true;
			}
			break;
		case "mouseup":
			if (node.className == "picture" && deltaX != 0) {
				node.style.cursor = "default";
				dragging = false;
				deltaX = 0;
			}
			break;
		case "mousemove":
			if (dragging) {
				var tempX = e.pageX ? e.pageX : e.clientX;
				deltaX = galleryX - tempX;
				document.getElementById('pictures').scrollLeft += deltaX;
				galleryX = tempX;
			}
			break;
		case "selectstart":
		case "dragstart":
			if (e.preventDefault) {
			  e.preventDefault();
			  e.stopPropagation();
			} else {
			  e.returnValue = false;
			  e.cancelBubble = true;
			}
			break;
		case "click":
			switch (node.className) {
				case "date":
					var d = String(node.id).substring(5);
					var gallery = new XMLStream();
					gallery.connect("gallery.php", "GET", "date=" + d, function(oXML, sPID) {
						var pictures = oXML.getElementsByTagName("pictures");
						document.getElementById("pictures").innerHTML = pictures[0].firstChild.data;
						var dates = getElementsByClass("date", node.parentNode, "img");
						for (i = 0; i < dates.length; ++i) {
							var strDate = String(dates[i].id).substring(5);
							var objDate = new Date(strDate.substr(0, 4) * 1, (strDate.substr(4, 2) * 1) - 1, strDate.substr(6, 2) * 1);
							if (objDate < today) {
								dates[i].style.backgroundPosition = "top";
							} else {
								dates[i].style.backgroundPosition = "bottom";
							}
						}
						node.style.backgroundPosition = "bottom";
					}, 2);
			}
			break;
		case "dblclick":
			if (node.className == "picture") {
				window.open(String(node.src).replace(".jpg", ".png"), "_blank", "directories=no,location=no,menubar=no,toolbar=no");
			}
			break;
	}
}

function removeItem(e) {
	if (e.target) {
		var node = e.target;
	} else {
		var e = window.event
		var node = e.srcElement;
	}
	switch (node.name) {
		case "item.remove":
			var nTR = node.parentNode.parentNode;
			var item = nTR.parentNode;
			item.removeChild(nTR);
			break;
	}
}

function removeChildren(id) {
	var parent = document.getElementById(id);
	if (parent.hasChildNodes()) {
		while (parent.childNodes.length >= 1)
			parent.removeChild(parent.firstChild);
	}
}

function getRemoveItem() {
	try {
		var nIMG = document.createElement('<img name="item.remove" class="button inactive" src="images/button_remove.png" onclick="removeItem(event)" />');
	} catch(e) {
		var nIMG = document.createElement("img");
		nIMG.name = "item.remove";
		nIMG.className = "button inactive";
		nIMG.src = "images/button_remove.png";
		if (document.attachEvent) {
			nIMG.attachEvent("onclick", removeItem(event));
		} else {
			nIMG.setAttribute("onclick", "removeItem(event)");
		}
	}
	return nIMG;
}

function addItem(type, option, value) {
	switch (type) {
		case "stuff":
		case "food":
			var items = document.getElementById("optional");
			break;
		default:
			var items = document.getElementById("standard");
			break;
	}
	var index = items.childNodes.length;
	var nTD = new Array();
	try {
		var nTR = document.createElement('<tr name="' + type + '">');
	} catch(e) {
		var nTR = document.createElement("tr");
		nTR.name = type;
	}
	nTD[0] = document.createElement("td");
	nTR.appendChild(nTD[0]);
	if (type != "stuff")
		nTD[0].appendChild(getRemoveItem());
	nTD[1] = document.createElement("td");
	nTR.appendChild(nTD[1]);
	if (type == "stuff") {
		var nText = document.createTextNode(value);
		nTD[1].appendChild(nText);
		nTD[1].style.color = "#111";
		if (index % 2 == 0)
			nTD[1].style.backgroundColor = "#eee";
		nTD[1].style.textAlign = "center";
		nTD[1].style.paddingTop = "2px";
		nTD[1].style.paddingBottom = "2px";
		nTD[1].style.borderRight = "2px solid #fff";
	} else {
		try {
			var nInput = document.createElement('<input name="' + type + '.count" class="short" type="text" value="' + value + '" />');
		} catch(e) {
			var nInput = document.createElement("input");
			nInput.name = type + ".count";
			nInput.className = "short";
			nInput.type = "text";
			nInput.value = value;
		}
		nTD[1].appendChild(nInput);
	}
	nTD[2] = document.createElement("td");
	nTR.appendChild(nTD[2]);
	switch (type) {
		case "stuff":
			var nText = document.createTextNode(option);
			nTD[2].appendChild(nText);
			nTD[2].style.color = "#111";
			if (index % 2 == 0)
				nTD[2].style.backgroundColor = "#eee";
			nTD[2].style.textAlign = "center";
			nTD[2].style.paddingTop = "2px";
			nTD[2].style.paddingBottom = "2px";
			break;
		case "food":
			try {
				var nInput = document.createElement('<input name="' + type + '.count" class="long" type="text" value="' + option + '" />');
			} catch(e) {
				var nInput = document.createElement("input");
				nInput.name = type + ".count";
				nInput.className = "long";
				nInput.type = "text";
				nInput.value = option;
			}
			nTD[2].appendChild(nInput);
			break;
		default:
			try {
				var nSelect = document.createElement('<select name="' + type + '.name">');
			} catch(e) {
				var nSelect = document.createElement("select");
				nSelect.name = type + ".name";
			}
			for (i = 0; i < menu[type].length; i++) {
				var nOption = document.createElement("option");
				nOption.setAttribute("value", menu[type][i]);
				var nText = document.createTextNode(menu[type][i]);
				nOption.appendChild(nText);
				if (menu[type][i] == option)
					nOption.setAttribute("selected", true);
				nSelect.appendChild(nOption);
			}
			nTD[2].appendChild(nSelect);
			break;
	}
	items.appendChild(nTR);
}

function register() {
	var members = document.getElementById("members").getElementsByTagName("input");
	var data = "count=" + members[0].value + "&";
	var standard = new Object();
	standard.servings = document.getElementById("standard").getElementsByTagName("input");
	standard.items = document.getElementById("standard").getElementsByTagName("select");
	standard.list = new Object();
	for (i = 0; i < standard.items.length; ++i) {
		if (standard.list[standard.items[i].value]) {
			standard.list[standard.items[i].value] += standard.servings[i].value * 1;
		} else {
			standard.list[standard.items[i].value] = standard.servings[i].value * 1;
		}
	}
	for (var key in standard.list)
		data += "standard:" + key + "=" + standard.list[key] + "&";
	var optional = new Object();
	optional.items = document.getElementById("optional").getElementsByTagName("input");
	optional.list = new Object();
	for (i = 0; i < optional.items.length; i += 2) {
		if (optional.list[optional.items[i + 1].value]) {
			optional.list[optional.items[i + 1].value] += optional.items[i].value * 1;
		} else {
			optional.list[optional.items[i + 1].value] = optional.items[i].value * 1;
		}
	}
	for (var key in optional.list)
		data += "optional:" + key + "=" + optional.list[key] + "&";
	var submit = new XMLStream();
	submit.connect("register.php", "POST", data, function(oXML, sPID) {
		var message = oXML.getElementsByTagName("message");
		document.getElementById("message").innerHTML = message[0].firstChild.data;
		document.getElementById("carte").style.display = "none";
		document.getElementById("results").style.display = "block";
		updateRegistration();
	}, 1);
}

function updateRegistration() {
	var members = document.getElementById("members").getElementsByTagName("input");
	var update = new XMLStream();
	update.connect("update.php", "POST", "page=registration", function(oXML, sPID) {
		try {
			var count = oXML.getElementsByTagName("count");
			members[0].value = count[0].firstChild.data;
		} catch(error) {
		}
		try {
			removeChildren("standard");
			removeChildren("optional");
		} catch(error) {
		}
		var items = oXML.getElementsByTagName("item");
		for (i = 0; i < items.length; ++i) {
			var fare = items[i].getAttribute("type");
			var name = items[i].getAttribute("name").replace(/_/g, " ");
			var text = items[i].firstChild.data;
			if (fare == "stuff")
				addItem(fare, name, text);
		}
		for (i = 0; i < items.length; ++i) {
			var fare = items[i].getAttribute("type");
			var name = items[i].getAttribute("name").replace(/_/g, " ");
			var text = items[i].firstChild.data;
			if (fare == "standard") {
				var j = i;
				for (var type in menu) {
					if (menu[type].contains(name)) {
						addItem(type, name, text);
						i = j;
						break;
					}
				}
			}
			if (fare == "optional")
				addItem("food", name, text);
		}
	}, 2);
}

function discuss() {
	var comment = document.getElementById("comment").value;
	var signature = document.getElementById("signature").value;
	if (comment == "" || signature == "") {
		alert("Both comment and signature are required.");
		return;
	}
	var data = "comment=" + comment + "&" + "signature=" + signature;
	var submit = new XMLStream();
	submit.connect("discuss.php", "POST", data, function(oXML, sPID) {
		document.getElementById("comment").value = "";
		updateDiscussion();
	}, 3);
}

function updateDiscussion() {
	var update = new XMLStream();
	update.connect("update.php", "POST", "page=discussion", function(oXML, sPID) {
		var comments = oXML.documentElement;
		document.getElementById("comments").innerHTML = getXMLString(comments);
	}, 4);
}
