	var orig_title = document.title;
	var upd_count = 0;
	
	//Dictionary to be sent back to the server
	var status_names = new Array();
	var status_values = new Array();
	var status_reference = new Array();
	
	var request_names = new Array();
	var request_values = new Array();
	
	var display_names = new Array();
	var display_last = new Array();
	
	function set_request_var(name, value) {
		//Return: true if elemented already existed, false otherwise
		for (var x = 0; x < request_names.length; x++) {
			if (request_names[x] == name) {
				request_values[x] = value;
				return true;
			}
		}
		request_names[x] = name;
		request_values[x] = value;
		return false;
	}
	function get_single_request_string(idx) {
		if (request_names[idx] == "" || request_values[idx] == null)
			return "";
		return request_names[idx] + "=" + request_values[idx];
	}
	
	function rem_update_var(name) {
		for (var x = 0; x < status_names.length; x++) {
			if (status_names[x] == name) {
				for (var y = x; y < status_names.length-1; y++) {
						status_names[y] = status_names[y+1];
						status_values[y] = status_values[y+1];
						status_reference[y] = status_values[y+1];
				}
				status_names.length = status_names.length - 1;
				status_values.length = status_names.length;
				status_reference.length = status_names.length;
				return true;
			}
		}
		return false;
	}
	
	function set_update_var(name, value, reference) {
		//Return: true if elemented already existed, false otherwise
		//Sequential search. Which browsers support indexOf again? >.<
		for (var x = 0; x < status_names.length; x++) {
			if (status_names[x] == name) {
				status_values[x] = value;
				status_reference[x] = (reference == true);
				return true;
			}
		}
		status_names[x] = name;
		status_values[x] = value;
		status_reference[x] = (reference == true);
		return false;
	}
	function get_single_update_string(idx) {
		if (status_names[idx] == "" || status_values[idx] == null)
			return "";
		var ret = "";
		if (status_reference[idx]) {
			ret += status_names[idx] + "=" + eval(status_values[idx]);
		} else {
			ret += status_names[idx] + "=" + status_values[idx];
		}
		return ret;
	}
	
	function get_update_string() {
		var ret = "";
		if (status_names.length == 0) {
			return "";
		}
		for (var x = 0; x < status_names.length; x++) {
			if (ret == "")
				ret = get_single_update_string(x);
			else
				ret += "&" + get_single_update_string(x);
		}
		for (var x = 0; x < request_names.length; x++) {
			if (ret == "")
				ret = get_single_request_string(x);
			else
				ret += "&" + get_single_request_string(x);
		}
		request_names = new Array();
		request_values = new Array();
		return ret;
	}
	set_update_var("last", "last_update", true);

	function loadXMLObject(text) {
		var xmlDoc;
		try {
			var parser = new DOMParser();
			xmlDoc = parser.parseFromString(text,"text/xml");
		} catch(e) {
			try {
				xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
				xmlDoc.async = "false";
				xmlDoc.loadXML(text);
			}
			catch(e) {
				alert(e.message);
				return;
			}
		}
		return xmlDoc;
	}
	//This is terrible.
	function XMLtoHTML(xml, use_orig) {
		var build = "";
		if (use_orig) {
			build = "<" + xml.nodeName;
		
			for (var x = 0; x < xml.attributes.length; x++) {
				build += " " + xml.attributes[x].name + "=\"" + xml.attributes[x].value + "\"";
			}
			build += ">";
		}
		
		if (xml.attributes.length > 0) {
		
		}
		
		var nodes = xml.childNodes;
		for (var x = 0; x < nodes.length; x++) {
			if (nodes[x].nodeValue == null)
				build += XMLtoHTML(nodes[x], true);
			else
				build += nodes[x].nodeValue;
		}
		
		if (use_orig)
			build += "</" + xml.nodeName + ">";
		return build;
	}
	function parseXML(text) {
		var xml = loadXMLObject(text);
		var nodes;
		switch(xml.childNodes.length) {
			case 1:
				nodes = xml.childNodes[0].childNodes;
				break;
			case 2:
				nodes = xml.childNodes[1].childNodes;
				break;
			default:
				return false;
		}
		
		for (var x = 0; x < nodes.length; x++) {
			switch (nodes[x].nodeName) {
				case "time":
					last_update = parseInt(nodes[x].childNodes[0].nodeValue);
					break;
				case "disp":
					var id = nodes[x].attributes.getNamedItem("id").value;
					var type;
					try {
						type = nodes[x].attributes.getNamedItem("type").value;
					} catch (e) {
						type = "";
					}
					
					var num;
					try {
						num = parseInt(nodes[x].attributes.getNamedItem("num").value);
					} catch (e) {
						num = -1;
					}
					if (num != -1) {
						var found = -1;
						for(var y = 0; y < display_names.length && found == -1; y++) {
							if (display_names[y] == id) {
								found = y;
							}
						}
						if (found != -1) {
							if (display_last[found] >= num)
								break;
							else
								display_last[found] = num;
						} else {
							display_names[y] = id;
							display_last[y] = num;
						}
					}
					
					var html = XMLtoHTML(nodes[x], false);
					html = html.replace(/<</ig, "&lt;");
					html = html.replace(/>>/ig, "&gt;");
					var disp = document.getElementById(id);
					if (disp != null) {
						switch(type) {
							case "prepend":
								disp.innerHTML = html + disp.innerHTML;
								break;
							case "append":
								disp.innerHTML += html;
								if (disp.style.overflow == "auto")
									setTimeout("var ch = document.getElementById(\"" + id + "\"); ch.scrollTop = ch.scrollHeight;", 1);
									disp.scrollTop = disp.scrollHeight;
								break;
							case "set":
							default:
								disp.innerHTML = html;
						}
						
					}
					var loudness;
					try {
						loudness = nodes[x].attributes.getNamedItem("v").value;
					} catch (e) {
						loudness = "";
					}
					if (loudness != "quiet") {
						upd_count += 1;
						document.title = "[" + upd_count + "] " + orig_title;
					}
					
					break;
				case "freq":
					frequency = parseInt(nodes[x].childNodes[0].nodeValue) * 1000;
					break;
			}
		}
	}
	
	function shide(id) {
		div = document.getElementById(id)
		if (div.style.display == "block") {
			div.style.display = "none";
		} else {
			div.style.display = "block";
		}
	}
	function untarget(id) {
		set_request_var('untarget', id);
		upd_get_updates();
	}
	function upd_got_updates(html) {
		if (html != "")
			parseXML(html);
	}
	function upd_get_updates(regular) {
		ajax(ADDR + "/main/status", get_update_string(), upd_got_updates);
		if (regular == true)
			setTimeout("upd_get_updates(true)", frequency);
	}
	if (frequency < 100)
	 frequency *= 1000;
	setTimeout("upd_get_updates(true)", frequency);
