<?xml version="1.0" encoding="UTF-8"?>
<Module>
<ModulePrefs
	description="Displays the current server status for World of Warcraft."
	title="WoW Server Status"
	directory_title="World of Warcraft (WoW) Server Status"
	author="Benjamin Reed"
	author_affiliation="Reckless Abandon"
	author_email="rangerrick@gmail.com"
	author_link="http://www.racoonfink.com/"
	author_location="Raleigh, NC"
	render_inline="optional"
	screenshot="http://ranger.befunk.com.nyud.net:8080/google/img/screenshot.png"
	thumbnail="http://ranger.befunk.com.nyud.net:8080/google/img/thumbnail.png"
>
	<Require feature="tabs" />
	<Require feature="setprefs" />
	<Require feature="dynamic-height" />
</ModulePrefs>

<UserPref display_name="Continent" name="userConfigContinent" datatype="enum">
	<EnumValue value="US" display_value="United States" />
	<EnumValue value="EU" display_value="European Union" />
</UserPref>
<UserPref display_name="Refresh (Minutes)" name="userConfigRefresh" datatype="string" />
<UserPref name="userConfigServers" datatype="hidden" />

<Content type="html"><![CDATA[
<!--
This work is licensed under a Creative Commons License.

<rdf:RDF xmlns="http://web.resource.org/cc/"
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<Work rdf:about="">
   <dc:type rdf:resource="http://purl.org/dc/dcmitype/Text" />
   <license rdf:resource="http://creativecommons.org/licenses/by/2.0/" />
</Work>

<License rdf:about="http://creativecommons.org/licenses/by/2.0/">
   <permits rdf:resource="http://web.resource.org/cc/Reproduction" />
   <permits rdf:resource="http://web.resource.org/cc/Distribution" />
   <requires rdf:resource="http://web.resource.org/cc/Notice" />
   <requires rdf:resource="http://web.resource.org/cc/Attribution" />
   <permits rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
</License>

</rdf:RDF>
-->
<style type="text/css">
	@import url(http://www.google.com/ig/tablib.css);

	.main {
		background-image: url('http://ranger.befunk.com/google/img/light.jpg');
		background-repeat: repeat;
	}
	.debug { font-size: x-small; }

	tr.odd__MODULE_ID__ { border-style: solid; border-width: 0px 1px 1px 0px; border-color: #D8BF95; }
	tr.even__MODULE_ID__ { border-style: solid; border-width: 0px 1px 1px 0px; border-color: #D8BF95; background-color: #C3AD89; }

	.status_td__MODULE_ID__     { font-size: smaller; text-align: center; }
	.name_td__MODULE_ID__       { font-size: smaller; text-align: left;   }
	.population_td__MODULE_ID__ { font-size: smaller; text-align: left;   }
	.submit_td__MODULE_ID__     { font-size: smaller; text-align: center; width: 18px; }

	.centered { text-align: center; vertical-align: middle; margin: 0 auto; display: table-cell; }
</style>

<script language="JavaScript" src="/ig/modules/todo_content/json.js"></script>
<script language="JavaScript">
	var debugEnabled__MODULE_ID__ = 0;
	var debugCount__MODULE_ID__ = 0;

	var prefs__MODULE_ID__;
	var tabs__MODULE_ID__;

	var userConfigRefresh__MODULE_ID__;
	var userConfigContinent__MODULE_ID__;
	var userConfigServers__MODULE_ID__;
	var debugData__MODULE_ID__ = "";
	var lastRow__MODULE_ID__ = 0;

	var htmlRows__MODULE_ID__ = new Array();

	var lastUpdated__MODULE_ID__ = new Date();
	lastUpdated__MODULE_ID__.setFullYear(1900);

	servers__MODULE_ID__ = new Array();

	// _IG_Analytics("UA-321459-1", "/wow-gadget/" + name);

	var imagePath = new Array();
	imagePath["add"]       = _IG_GetImageUrl("http://ranger.befunk.com/google/img/add.png");
	imagePath["delete"]    = _IG_GetImageUrl("http://ranger.befunk.com/google/img/delete.png");
	imagePath["downarrow"] = _IG_GetImageUrl("http://ranger.befunk.com/google/img/downarrow.gif");
	imagePath["light"]     = _IG_GetImageUrl("http://ranger.befunk.com/google/img/light.jpg");
	imagePath["spinner"]   = _IG_GetImageUrl("http://ranger.befunk.com/google/img/spinner.gif");
	imagePath["uparrow"]   = _IG_GetImageUrl("http://ranger.befunk.com/google/img/uparrow.gif");

	var http_root = "http://ranger.befunk.com.nyud.net:8080/google/wow/";
	//if (debugEnabled__MODULE_ID__ == 1)
	//{
		http_root = "http://ranger.befunk.com/google/wow/";
	//}

	function addItem__MODULE_ID__(name)
	{
		debug__MODULE_ID__("addItem(" + name + ") called");
		var name = _trim(name);
		if (name == "")
			return;
		userConfigServers__MODULE_ID__[name] = true;
		saveServers__MODULE_ID__();
		refreshServerData__MODULE_ID__();
		return false;
	}

	function createLoad__MODULE_ID__(name)
	{
		var returnval = "?";
		var item = getServer(name);
		if (item == null)
			return "";

		if (item.population != null)
		{
			return "<span class=\"" + getAlphaNumeric(item.population) + "__MODULE_ID__\">" + item.population + "</span>";
		}

		return "?";
	}

	function createName__MODULE_ID__(name)
	{
		returnval = "?";
		var item = getServer(name);
		if (item == null)
			return name;

		if (item.name != null)
		{
			returnval = item.name;
		}

		if (item.type != null)
		{
			returnval = returnval + " <span class=\"type_" + getAlphaNumeric(item.type) + "__MODULE_ID__\">(" + item.type + ")</span>";
		}
		return returnval;
	}

	function createRow__MODULE_ID__(name)
	{
		if (name == null)
			return;
		var deletename = getAlphaNumeric(name);
		var html =
			"<tr id=\"row__MODULE_ID__\"" +
			rowClass__MODULE_ID__() + ">" +
			"<td class=submit_td__MODULE_ID__><form class=\"centered\" name=\"removeServerForm__MODULE_ID__\" " +
         "onsubmit=\"return deleteItem__MODULE_ID__('" + deletename + "', false)\">" +
			"<input type=\"image\" src=\"" + imagePath["delete"] + "\" value=\"Del\" " +
			"alt=\"Delete\" name=\"Delete\" " +
			"onclick=\"javascript:deleteItem__MODULE_ID__('" + deletename + "', false)\"></form></td>" +
			"<td class=status_td__MODULE_ID__>" +
			createStatus__MODULE_ID__(name) +
			"</td>" +
			"<td class=name_td__MODULE_ID__>" +
			createName__MODULE_ID__(name) +
			"</td>" +
			"<td class=population_td__MODULE_ID__>" +
			createLoad__MODULE_ID__(name) +
			"</td>" +
			"</tr>";
		return html;
	}

	function createStatus__MODULE_ID__(name)
	{
		var item = getServer(name);
		if (item != null && item.status != null)
		{
			var status = item.status;
			if (status == "up")
			{
				return "<img class=\"centered\" src=\"" + imagePath["uparrow"] + "\" alt=\"Up\" />";
			}
			else if (status == "down")
			{
				return "<img class=\"centered\" src=\"" + imagePath["downarrow"] + "\" alt=\"Down\" />";
			}
		}
		return "<img class=\"centered\" src=\"" + imagePath["spinner"] + "\" alt=\"?\" />";
	}

	function debug__MODULE_ID__(error)
	{
		if (debugEnabled__MODULE_ID__ == 1)
			debugData__MODULE_ID__ = debugData__MODULE_ID__ + "<br />" + error;
		displayTabDebug__MODULE_ID__("debugDiv__MODULE_ID__");
	}

	function deleteItem__MODULE_ID__(name)
	{
		debug__MODULE_ID__("deleteItem(" + name + ") called");
		delete userConfigServers__MODULE_ID__[name];
		refreshServerData__MODULE_ID__();
		displayTabMain__MODULE_ID__("mainDiv__MODULE_ID__");
		saveServers__MODULE_ID__();
		return false;
	}

	function displayTabDebug__MODULE_ID__(tabid)
	{
		if (tabid == null)
			tabid = "debugDiv__MODULE_ID__";

		_gel(tabid).innerHTML = debugData__MODULE_ID__;
		if (self._IG_AdjustIFrameHeight)
			_IG_AdjustIFrameHeight();
	}

	function displayTabMain__MODULE_ID__(tabid)
	{
		if (tabid == null)
			tabid = "mainDiv__MODULE_ID__";

		lastRow__MODULE_ID__ = 0;
		var html = getMainData__MODULE_ID__() + getConfigData__MODULE_ID__();
		if (debugEnabled__MODULE_ID__) {
			html = html + debugCount__MODULE_ID__;
			debugCount__MODULE_ID__ = debugCount__MODULE_ID__ + 1;
		}
		_gel(tabid).innerHTML = html;
		if (self._IG_AdjustIFrameHeight)
			_IG_AdjustIFrameHeight();
	}

	function findServerRows__MODULE_ID__(element, level)
	{
		if (element == null)
		{
			return;
		}

		var skipElements = false;

		// if the node is a <tr>, check for a sub-td with the class "serverStatus1" or "serverStatus2"
		if (element.nodeName != null)
		{
			if (element.nodeName == "TR")
			{
				var myClass;
				var tds = element.getElementsByTagName("TD");
				if (tds != null)
				{
						myClass = tds.item(0).className;
						if (myClass != null)
						{
							if (myClass.substring(0,12) == "serverStatus")
							{
								htmlRows__MODULE_ID__[htmlRows__MODULE_ID__.length] = element;
								skipElements = true;
							}
						}
				}
			}
		}

		if (!skipElements)
		{
			if (element.hasChildNodes())
			{
				for (var i = 0; i < element.childNodes.length; i++)
				{
					findServerRows__MODULE_ID__(element.childNodes[i], level + 1);
				}
			}
		}
	}


	function getAlphaNumeric(name)
	{
		if (name != null)
			return name.replace(/[^a-zA-Z0-9]*/gmi, "").toLowerCase();

		return;
	}

	function getConfigData__MODULE_ID__()
	{
		var html = "<form name=\"newServerForm__MODULE_ID__\" " +
			"onsubmit=\"return addItem__MODULE_ID__(document.newServerForm__MODULE_ID__.newServerInput__MODULE_ID__.value, false)\">" +
			"<table> " +
				"<tr> " +
					"<td style=\"width:100%\"> " +
						"<select id=\"newServerInput__MODULE_ID__\" name=\"newServerInput__MODULE_ID__\" style=\"width:100%\">";

						var items = new Array();
						for (var item in servers__MODULE_ID__)
						{
							items[items.length] = servers__MODULE_ID__[item];
						}
						for (var index in items.sort(sortByName))
						{
							var item = items[index];
							if (item == null)
								continue;

							var name = item.name;
							if (name == null)
								continue;

							if (userConfigServers__MODULE_ID__ == null || !userConfigServers__MODULE_ID__[getAlphaNumeric(name)])
								html = html + "<option value=\"" + getAlphaNumeric(name) + "\">" + _hesc(name) + "</option>";
						}

						html = html +
						"</select> " +
					"</td> " +
					"<td> " +
						"<input type=\"image\" value=\"Add\" alt=\"Add Server\" name=\"Add Server\" " +
							"src=\"" + imagePath["add"] + "\" onclick=\"javascript:addItem__MODULE_ID__( " +
							"document.newServerForm__MODULE_ID__.newServerInput__MODULE_ID__.value, false)\"> " +
					"</td> " +
				"</tr> " +
			"</table></form>";
		return html;
	}

	function getContinent__MODULE_ID__()
	{
		if (userConfigContinent__MODULE_ID__ == null)
		{
			var prefs = new _IG_Prefs(__MODULE_ID__);
			userConfigContinent__MODULE_ID__ = prefs.getString("userConfigContinent");
			if (userConfigContinent__MODULE_ID__ == null || userConfigContinent__MODULE_ID__ == "") {
				userConfigContinent__MODULE_ID__ = 'US';
			}
		}
		return userConfigContinent__MODULE_ID__;
	}

	function getMainData__MODULE_ID__()
	{
		var html = "<table style=\"width:100%\" id=mainTable__MODULE_ID__>" +
			"<tr><th></th><th>Stat</th><th>Server</th><th>Pop</th></tr>";
		var items = new Array();
		for (var item in userConfigServers__MODULE_ID__)
		{
			if (userConfigServers__MODULE_ID__[item] == true)
				items[items.length] = item;
		}
		for (var index in items.sort())
		{
			name = items[index];
			if (name != null)
			{
				html = html + createRow__MODULE_ID__(name);
				// _IG_Analytics("UA-321459-1", "/wow-gadget/" + name);
			}
			else
			{
				continue;
			}
		}
		html = html + "</table>";
		return html;
	}

	function getServer(key)
	{
		var name = getAlphaNumeric(key);
		// debug__MODULE_ID__("getServer(" + name + ") = " + JSON.stringify(servers__MODULE_ID__[name]));
		return servers__MODULE_ID__[name];
	}

	function isOutOfDate()
	{
		var then = lastUpdated__MODULE_ID__.getTime();
		var now = new Date().getTime();
		var interval = userConfigRefresh__MODULE_ID__;

		if (interval == null || isNaN(interval) || interval == 0)
			interval = 5;

		debug__MODULE_ID__("isOutOfDate: using a refresh interval of " + interval + " minutes");
		if ((now - then) > (interval * 60 * 1000))
		{
			debug__MODULE_ID__("isOutOfDate: true");
			return true;
		}

		debug__MODULE_ID__("isOutOfDate: false");
		return false;
	}

	function refreshServerData__MODULE_ID__()
	{
		if (!isOutOfDate())
		{
			debug__MODULE_ID__("refreshServerData: data is not out of date, skipping");
			displayTabMain__MODULE_ID__("mainDiv__MODULE_ID__");
			return;
		}

		debug__MODULE_ID__("refreshServerData: data is out of date, updating");

		if (getContinent__MODULE_ID__() == null)
		{
			displayTabMain__MODULE_ID__("mainDiv__MODULE_ID__");
			return;
		}

		_IG_FetchContent(http_root + getContinent__MODULE_ID__() + "/list",
			function (responseText) {
				debug__MODULE_ID__("refreshServerData: got server list");
				var serverList = JSON.parse(responseText);
				var serverName;
				var serverObject;
				var found = false;
				var fetch_url = http_root + getContinent__MODULE_ID__() + "/status";
				for (var i = 0; i < serverList.length; i++)
				{
					serverName = serverList[i];
					serverObject = {};
					serverObject.name = serverName;
					servers__MODULE_ID__[getAlphaNumeric(serverName)] = serverObject;
					if (userConfigServers__MODULE_ID__ != null && userConfigServers__MODULE_ID__[getAlphaNumeric(serverName)] != null)
					{
						found = true;
						fetch_url = fetch_url + "/" + _esc(serverName);
					}
				}

				if (found == true)
				{
					debug__MODULE_ID__("refreshServerData: updating server data from url " + fetch_url);
					_IG_FetchContent(fetch_url,
						function (responseText_servers) {
							debug__MODULE_ID__("refreshServerData: got server status");
							var serverObjects = JSON.parse(responseText_servers);
							var item;
							for (var i = 0; i < serverObjects.length; i++)
							{
								item = serverObjects[i];
								servers__MODULE_ID__[getAlphaNumeric(item.name)] = item;
							}
							displayTabMain__MODULE_ID__("mainDiv__MODULE_ID__");
						}
					);
				}
				else
				{
					debug__MODULE_ID__("refreshServerData: no updates");
					displayTabMain__MODULE_ID__("mainDiv__MODULE_ID__");
				}
			}
		);

		lastUpdated__MODULE_ID__ = new Date();
	}

	function replaceServers__MODULE_ID__(newServers)
	{
		for (var server in newServers)
		{
			servers__MODULE_ID__[server] = newServers[server];
		}

		for (var server in servers__MODULE_ID__)
		{
			if (newServers[server] == null)
			{
				delete servers__MODULE_ID__[server];
			}
		}
	}

	function rowClass__MODULE_ID__()
	{
		var returnval;
		if (lastRow__MODULE_ID__ % 2 != 0)
			returnval = " class=odd__MODULE_ID__ ";
		else
			returnval = " class=even__MODULE_ID__ ";
		lastRow__MODULE_ID__ = lastRow__MODULE_ID__ + 1;
		return returnval;
	}

	function saveServers__MODULE_ID__()
	{
		prefs__MODULE_ID__.set("userConfigServers", JSON.stringify(userConfigServers__MODULE_ID__));
		lastUpdated__MODULE_ID__.setFullYear(1900);
	}

	function setServer(key, value)
	{
		var name = getAlphaNumeric(key);
		servers__MODULE_ID__[name] = value;
	}

	function sortByValue(a, b)
	{
		var anew = a.toLowerCase();
		var bnew = b.toLowerCase();
		return ((anew < bnew) ? -1 : ((anew > bnew) ? 1 : 0));
	}

	function sortByName(a, b)
	{
		var anew = a.name.toLowerCase();
		var bnew = b.name.toLowerCase();
		return ((anew < bnew) ? -1 : ((anew > bnew) ? 1 : 0));
	}

	function main__MODULE_ID__()
	{
		// set up the tabs
		if (debugEnabled__MODULE_ID__ == 1)
		{
			tabs__MODULE_ID__ = new _IG_Tabs(__MODULE_ID__, "Status");
			tabs__MODULE_ID__.addTab("Status", "mainDiv__MODULE_ID__", displayTabMain__MODULE_ID__);
			tabs__MODULE_ID__.addTab("Debug", "debugDiv__MODULE_ID__", displayTabDebug__MODULE_ID__);
		}

		prefs__MODULE_ID__ = new _IG_Prefs(__MODULE_ID__);

		// set up the data refresh
		userConfigRefresh__MODULE_ID__ = parseFloat(prefs__MODULE_ID__.getString("userConfigRefresh"));
		if (userConfigRefresh__MODULE_ID__ == null || isNaN(userConfigRefresh__MODULE_ID__) || userConfigRefresh__MODULE_ID__ == 0)
		{
			userConfigRefresh__MODULE_ID__ = 5;
			prefs__MODULE_ID__.set("userConfigRefresh", "5");
		}

		var refreshms = userConfigRefresh__MODULE_ID__ * 60 * 1000;
		setInterval('refreshServerData__MODULE_ID__();', refreshms);

		// get the server list
		var userConfigServersstring = prefs__MODULE_ID__.getString("userConfigServers");
		if (userConfigServersstring == "")
		{
			userConfigServers__MODULE_ID__ = {};
		}
		else
		{
			// for testing, wipe out the config
			// userConfigServers__MODULE_ID__ = {};
			userConfigServers__MODULE_ID__ = JSON.parse(userConfigServersstring);
		}

		refreshServerData__MODULE_ID__();
		// displayTabMain__MODULE_ID__("mainDiv__MODULE_ID__");
		displayTabDebug__MODULE_ID__("debugDiv__MODULE_ID__");
		if (self._IG_AdjustIFrameHeight)
			_IG_AdjustIFrameHeight();
	}

	_IG_RegisterOnloadHandler( main__MODULE_ID__ );
</script>
<div class="main" id="mainDiv__MODULE_ID__"></div>
<div class="debug" id="debugDiv__MODULE_ID__" style="display:none"></div>
<div class="eu_status" id="euStatusDiv__MODULE_ID__" style="display:none"></div>
<script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
</script>
<script type="text/javascript">
_uacct = "UA-321459-1";
urchinTracker();
</script>
]]></Content>
</Module>
