﻿var GroupTypes =
[
	{
		Id: 0,
		Name: "Archetype",
		LocalizationKey: "TextByArchetypes",
		Group: function(items)
		{
			var g = new Object();

			var k;
			for (k = 0; k < items.length; k++)
			{
				var item = items[k];
				var gobj = g[item.archetype];
				if (!gobj)
				{
					gobj =
					{
						name: item.archetype,
						count: 0,
						items: new Array()
					};

					g[item.archetype] = gobj;
				}

				gobj.count++;
				gobj.items.push(item);
			}

			var res = new Array();
			$.each(g, function(k, v)
			{
				res.push(v);
			});

			res.sort(function(a, b)
			{
				return parseInt(b.count) - parseInt(a.count);
			});

			return res;
		}
	},
	{
		Id: 1,
		Name: "Careers",
		LocalizationKey: "TextByCareers",
		Group: function(items)
		{
			var g = new Object();

			var k;
			for (k = 0; k < items.length; k++)
			{
				var item = items[k];
				var gobj = g[item.careerId];
				if (!gobj)
				{
					gobj =
					{
						name: item.careerName,
						count: 0,
						items: new Array()
					};

					g[item.careerId] = gobj;
				}

				gobj.count++;
				gobj.items.push(item);
			}

			var res = new Array();
			$.each(g, function(k, v)
			{
				res.push(v);
			});

			res.sort(function(a, b)
			{
				return parseInt(b.count) - parseInt(a.count);
			});

			return res;
		}
	},
	{
		Id: 2,
		Name: "Ranks",
		LocalizationKey: "TextByRanks",
		Group: function(items)
		{
			var g = new Object();

			var k;
			for (k = 0; k < items.length; k++)
			{
				var item = items[k];
				var gobj = g[item.rank];
				if (!gobj)
				{
					gobj =
					{
						name: item.rank,
						count: 0,
						items: new Array()
					};

					g[item.rank] = gobj;
				}

				gobj.count++;
				gobj.items.push(item);
			}

			var res = new Array();
			$.each(g, function(k, v)
			{
				res.push(v);
			});

			res.sort(function(a, b)
			{
				return parseInt(b.count) - parseInt(a.count);
			});

			return res;
		}
	},
	{
		Id: 3,
		Name: "Tiers",
		LocalizationKey: "TextByTiers",
		Group: function(items)
		{
			var g = new Object();

			var k;
			for (k = 0; k < items.length; k++)
			{
				var item = items[k];
				var tier = Math.min(4, Math.floor(item.rank / 10) + 1);

				var gobj = g[tier];
				if (!gobj)
				{
					gobj =
					{
						name: "T" + tier + " (" + (10 * (tier - 1)) + " - " + (10 * tier) + ")",
						count: 0,
						items: new Array()
					};

					g[tier] = gobj;
				}

				gobj.count++;
				gobj.items.push(item);
			}

			var res = new Array();
			$.each(g, function(k, v)
			{
				res.push(v);
			});

			res.sort(function(a, b)
			{
				return parseInt(b.count) - parseInt(a.count);
			});

			return res;
		}
	},
	{
		Id: 4,
		Name: "LastLogin",
		LocalizationKey: "TextByLastLogin",
		Group: function(items)
		{
			var g = new Object();

			var k;
			for (k = 0; k < items.length; k++)
			{
				var item = items[k];
				var n = Math.round(DateDiff(ParseDate2(item.lastLogin2), new Date()));
				
				var gobj = g[n];
				if (!gobj)
				{
					gobj =
					{
						name: n > 0 ? Localization["TextDaysAgo"].replace(/\{0\}/ig, n) : Localization["TextLastLoginLessThan24h"],
						n: n,
						count: 0,
						items: new Array()
					};

					g[n] = gobj;
				}

				gobj.count++;
				gobj.items.push(item);
			}

			var res = new Array();
			$.each(g, function(k, v)
			{
				res.push(v);
			});

			res.sort(function(a, b)
			{
				return parseInt(a.n) - parseInt(b.n);
			});

			return res;
		}
	}
];

function GetGroupingComboBoxHtml(level, selectedGrouping)
{
	var html = new Array();

	html.push("<select id='group" + level + "' class='grouping' level='" + level + "'><option value=''>" + Localization["TextNone"].toLowerCase() + "</option>");

	var k;
	var s = parseInt ($.queryString.hash["g" + level]);
	for (k=0; k<GroupTypes.length; k++)
	{
		var v = GroupTypes[k];
		html.push("<option" + (v.Id == s ? " selected='selected'" : "") + " value='" + k + "' groupId='" + v.Id + "'>" + Localization[v.LocalizationKey] + "</option>");
	}

	html.push("</select>");

	return html.join("");
}

function GetGroupingResultHtml(items, level)
{
	var html = new Array();

	var g_val = $("#group" + level).val();
	if (!g_val)
	{
		// generate html for all passed items

		var k;
		for (k = 0; k < items.length; k++)
		{
			var item = items[k];

			var url;
			if (item.id > 0)
				url = "" + item.id;
			else
				url = "javascript:;";

			html.push(
				"<tr>" +
					"<td><img src='/Images/WHO/CareerIcons/" + item.careerId + ".png' style='vertical-align: middle' /> " +
					"<b>");
					
			if (item.id > 0)
				html.push ("<a href='http://www.wardb.com/profile.aspx?id=" + item.id + "' target='_blank'>" + item.name + "</a>");
			else
				html.push (item.name);
					
			html.push ("</b></td>" +
					"<td>" + item.rank + "</td>" +
					"<td>" + item.careerName + "</td>");

			html.push("<td>" + Localization["TextLastLogin"] + " " + item.lastLogin);

			var n = Math.round(DateDiff(ParseDate(item.lastLogin2), new Date()));
			if (n > 0)
				html.push(" (" + Localization["TextDaysAgo"].replace(/\{0\}/ig, n) + ")");
			else
				html.push(" (" + Localization["TextLastLoginLessThan24h"] + ")");

			html.push("</td></tr>");
		}

		var res = html.join("");
		if (res)
			res = "<table class='dataTable' style='margin-top: 10px; margin-bottom: 10px'>" + res + "</table>";

		return res;
	}
	else
	{
		var group_type = GroupTypes[g_val];
		var groupped_items = group_type.Group(items);

		var max = 0;
		var k;
		for (k = 0; k < groupped_items.length; k++)
			max += groupped_items[k].count;

		// group and generate html
		for (k = 0; k < groupped_items.length; k++)
		{
			var g = groupped_items[k];

			html.push("<li class='tn tnP'><div class='statTitle'>");
			if (max > 0)
			{
				var p = Math.round(g.count * 10000 / max) / 100;

				html.push(
					"<div class='gBar' title='" + p + "'>" +
						"<div class='gBarTitle'>" + g.name + ": <span class='sVal'>" + g.count + "</span></div>" +
						"<div class='gBar" + (level + 1) + "' style='width: " + Math.round(p) + "px'>&nbsp;</div>" +
						"&nbsp;<span class='gBarText'>" + Math.round(p) + " %</span>" +
					"</div>");
			}
			else
				html.push(g.name + ": <span class='sVal'>" + g.count + "</span>");

			html.push("</div><div class='tc' style='display: none'>" + GetGroupingResultHtml(g.items, level + 1) + "</div></li>");
		}

		var res = html.join("");
		if (res)
			res = "<ul>" + res + "</ul>";

		return res;
	}
}

$(function()
{
	var initialized = false;

	$.validator({
		group: "guildId",
		targetSelector: "#guildId",
		errorSelector: "#guildIdErr",
		message: Localization["ValidatorErrorMessageRequired"]
	});
	$.validator({
		group: "guildId",
		targetSelector: "#guildId",
		errorSelector: "#guildIdErr",
		type: "regex",
		regex: /^\d+$/i,
		message: Localization["ValidatorErrorMessageMustBeInteger"]
	});
	$.validator({
		group: "guildId",
		targetSelector: "#guildId",
		errorSelector: "#guildIdErr",
		type: "compare",
		targetValue: 0,
		compareType: "greater",
		message: Localization["ValidatorErrorMessageMustBeGreaterThanZero"]
	});

	$("#guildId").clickOnEnter("#butOk");

	$("#butOk").click(function()
	{
		if (!$.validate("guildId"))
			return false;

		$.queryString.hash["id"] = parseInt($("#guildId").val());
		$.queryString.save();

		var lbox = ShowLoadingBox(Localization["TextLoading"]);
		$("#resultView").hide();
		$("#result").html("");
		$("#statusMessage").empty();

		$.jmsajax
		({
			contentType: "application/json; charset=utf-8",
			url: "/WHO/WebServices/Ajax.asmx/GuildStatiscticsLoad",
			data:
			{
				"id": $("#guildId").val()
			},
			cache: false,
			complete: function()
			{
				HideLoadingBox(lbox);
			},
			success: function(data, textStatus)
			{
				if (data.Code != 0)
				{
					ShowMessageBox(Localization["TextError"], data.Data);
					return;
				}

				var data = $.xmlToJSON(data.Data);
				var data_by_names = new Object();
				var k;

				for (k = 0; k < data.Item.length; k++)
				{
					var item = data.Item[k];
					data_by_names[item.name] = item;
				}

				document.title = Localization["PageTitle"].replace(/\{0\}/ig, data.name);
				$("#guildName").html(
					"<h1><a href='http://www.wardb.com/guild.aspx?id=" + data.id + "' target='_blank' class='tdn'>" + data.name + "</a></h1>" +
					Localization["TextMembersTotalCount"] + ": " + data.Item.length + "<br /><br />");

				$("#result").data("data", data).data("dataByNames", data_by_names);
				$("#grouping").trigger("update").trigger("group");
				$("#resultView").show();
			},
			error: function(XMLHttpRequest, textStatus, errorThrown)
			{
				$("#viewWait").hide();

				if (errorThrown)
					ShowMessageBox(Localization["TextError"], errorThrown);
			}
		});

		return false;
	});

	$("#grouping")
	.data("data", new Array())
	.bind("update", function()
	{
		var t = $(this);
		var html = new Array();

		for (k = 0; k < 5; k++)
			html.push(GetGroupingComboBoxHtml(k));

		t.html(html.join("")).find("select.grouping").change(function()
		{
			var t = $(this);
			$.queryString.hash["g" + t.attr("level")] = t.find("option[selected]").attr("groupId");
			$.queryString.save();

			$("#grouping").trigger("group");

			return false;
		});

		return false;
	})
	.bind("group", function()
	{
		var lbox;
		
		try
		{
			lbox = ShowLoadingBox(Localization["TextWorking"]);

			var result = $("#result");
			var data = result.data("data");

			result.html(GetGroupingResultHtml(data.Item, 0));

			$(".tnP", result).click(function()
			{
				var t = $(this);

				t.children(".tc").toggle();
				t.toggleClass("tnP").toggleClass("tnM");

				return false;
			});
		}
		finally
		{
			HideLoadingBox(lbox);
		}

		return false;
	});

	if (!$("#guildId").val())
		$("#guildId").val($.queryString.hash["id"]);

	if (!$("#guildId").val())
		$("#guildId").focus();
	else
		$("#butOk").click();

	initialized = true;
});