/// <reference path="jQuery.intellisense.js"/>
/// <reference path="xeko.js"/>
/// <reference path="messaging.js"/>

$(document).ready(function() {
	
	xeko.widgets.missions.loadMissions();
	
	$("#navMissionsHotspotMap").click(function(e)
	{
		e.preventDefault();
		$("#navMissionsHotspotMapDiv").show();
		$("#navMissionsHotspotMapDivDiv").show();
	});

	$("#navMissionsHotspotImagemapClose").click(function(e)
	{
		e.preventDefault();
		$("#navMissionsHotspotMapDiv").hide();
		$("#navMissionsHotspotMapDivDiv").hide();
	});
	
	// Page must be re-rendered upon login
	xeko.events.notify("xeko.widgets.missions.loadMissions", "login");

});

xeko.widgets.missions = {
	"missionsXml": "",
	"totalItems": 0,
	"currentPage": 1,
	"numPages": 1,
	"itemsPerPage": 4,
	"itemsLoaded": false,
	"suggestedActivities": {},
	"thermoColors" : [ "green", "blue", "orange" ],
	"openItem": function(itemId)	// shows expanded divs, and collapses any open div
	{
		// close all other items
		$(".missionsItem").each(function() {
			var thisItemId = $(this).attr("id").substr("missionsItem".length);
			if (thisItemId.length > 0 && thisItemId != itemId) xeko.widgets.missions.closeItem(thisItemId);
		});

		$("div#missionsItem" + itemId + " .missionItemBriefing").hide("fast");

		$("div#missionsItem" + itemId + " .missionItemFull").show("slow");
		$("div#missionsItem" + itemId + " .missionItemLists").show("slow");
		$("div#missionsItem" + itemId + " .missionItemBars").show("slow");
		$("div#missionsItem" + itemId + " .missionItemClose").show("slow");
	},
	"closeItem": function(itemId)	// hides expanded divs
	{
		$("div#missionsItem" + itemId + " .missionItemLists").hide("fast");
		$("div#missionsItem" + itemId + " .missionItemBars").hide("fast");
		$("div#missionsItem" + itemId + " .missionItemClose").hide("fast");
		$("div#missionsItem" + itemId + " .missionItemFull").hide("fast");
		
		$("#missionsItem" + itemId + " .missionItemBriefing").show("slow");
	},
	"loadMissions": function() {
	
		// Load and cache Missions XML
		$.ajax(
		{
			method: "get",
		//	url: "/interface/xml/TEMP_StaticMissions.xml",
			url: "/widgets/widget.Missions.handler.php?type=getmissions",
			beforeSend: function() {
				$("#missionsLoading ~ div").hide();
				$("#missionsLoading").show();
			},
			complete: function() {
				$("#missionsLoading ~ div").show();
				$("#missionsLoading").hide()
			},
			success: function(xml) {
				// success?
				if ($("mission", xml).length > 0) {
					// Cache XML for pagination & sorting
					xeko.widgets.missions.missionsXml = xml;
					xeko.widgets.missions.totalItems = $("mission", xml).length;
					
					xeko.paging.init(
						"missions", 
						xeko.widgets.missions.totalItems, 
						xeko.widgets.missions.itemsPerPage, 
						"#missionsNavBarRange", 
						".missionsNavBarPagination", 
						"Missions",
						"xeko.widgets.missions.renderMissions()"
					);

					xeko.debug.trace('rendering missions...');
					xeko.widgets.missions.renderMissions();
					xeko.debug.trace('missions rendered.');
				}
				else {
					// No missions loaded
					xeko.widgets.missions.throwError(null, xeko.messaging.error.MISSIONS_LOAD_ERROR);
				}
			},
			error: function(xmlHttpRequest, status, err) {
				if (xmlHttpRequest.status > 0) xeko.widgets.missions.throwError(null, xeko.messaging.error.MISSIONS_LOAD_ERROR);
			}
		});
	},
	"renderMissions": function() {
		xeko.paging.construct("missions");

		// Remove all existing items
		$("#missionsItem ~ div").remove();	// Does not work in jquery1.3.2 !!
		xeko.widgets.missions.itemsLoaded = false;

		// Add Missions to the DOM
		var currentItem = 1;
		
		$("mission", xeko.widgets.missions.missionsXml).each(function() {

			if (xeko.paging.isInRange(currentItem, "missions")) {
				var guid = $(this).attr("id");
				var tagName = xeko.utilities.removeSpaces($("tag>value", this).text());
				var title = $("name:first", this).text();
				var description = $("description:first", this).text();
				var briefingtext = $("briefingtext:first", this).text();
				var isSaved = ($("saved", this).text() == "true") ? true : false;

				/************************************************************
				* Clone the template div and append to the DOM with unique ID
				************************************************************/
				var itemDiv = $("#missionsItem").clone().appendTo("#missions");
				xeko.widgets.missions.appendGuidToId(itemDiv, guid);
				
				// Error container
				var errorElm = $("#missionItemError", itemDiv)
				xeko.widgets.missions.appendGuidToId(errorElm, guid);

				// Image
				var iconSrc = "/images/g/g_mission_" + tagName + ".png";
				$("img.missionItemIcon", itemDiv).attr("src", iconSrc);

				// Title
				$(".missionItemHeader", itemDiv).text(title);
				
				// Briefing
				$(".missionItemBriefing", itemDiv).prepend(briefingtext);
				
				// See More link
				$(".missionItemSeeMore", itemDiv).click(function(e)
				{
					e.preventDefault();
					xeko.widgets.missions.openItem(guid);
				});

				// Description text
				var fullDiv = $(".missionItemFull", itemDiv);
				fullDiv.prepend(xeko.utilities.addLineBreaks(description));
				
				// Rewards
				var rewardsBoxDiv = $(".missionItemRewardsBox", itemDiv);
				var rewardsDiv = $(".missionItemRewards", itemDiv);
				var highestPointValue = 0;
				var reward = {};
				var numberOfRewardsBoxes = 0;
				$("rewards>reward", this).each(function()
				{
					// Total points for this mission will be whichever reward has the highest point value
					var thisPointValue = parseInt($("triggervalue", this).text());
					if (thisPointValue > highestPointValue) highestPointValue = thisPointValue;
					
					// If this reward type is a badge, add it to the collection
					if ($("rewardtype", this).text() == "Badge")
					{
						var badgeId = $("badge>imageidentifier", this).text();
						var imgSrc = "/images/badges/g_badge_" + badgeId + ".png"
						reward[numberOfRewardsBoxes] = "<div class=\"missionItemReward\"><img src=" + imgSrc + " alt=\"\" /></div>";
						numberOfRewardsBoxes++;
					}
					
					// If this reward type is a digital card, add it to the collection
					if ($("rewardtype", this).text() == "Digital Card")
					{
						// Not supported yet
					}
				});
				
				// Which size box is needed for the Rewards?
				var rewardsBgType;
				if ((highestPointValue > 0 && numberOfRewardsBoxes > 0) || numberOfRewardsBoxes > 2)
				{
					// points + at least one reward
					// or more than two rewards
					rewardsBgType = "Wide";
				}
				else
				{
					rewardsBgType = "Narrow";
				}
				
				// Bounding box for rewards
				rewardsBoxDiv.addClass("missionItemRewards" + rewardsBgType);
				
				// Add points, if applicable
				if (highestPointValue > 0)
				{
					rewardsDiv.append(
						"<div class=\"missionItemPoints\">" + 
						xeko.utilities.formatPoints(highestPointValue) +
						"<small>points</small>" +
						"</div>"
						);
				}
				
				// Add rewards, if applicable
				for (var i = 0; i < numberOfRewardsBoxes; i++)
				{
					// add separator if there is already content in the div
					if (rewardsDiv.children().length > 0)
					{
						rewardsDiv.append(
							"<img " + 
							"src=\"/images/g/g_mission_box_divider.gif\" " + 
							"alt=\"\" " + 
							"class=\"missionItemRewardDivider\" " + 
							"/>"
						);
					}
					
					// add the reward
					rewardsDiv.append(reward[i]);
				}
				
				// Mission objectives
				var numObjectives = 0;
				var totalPercent = 0;
				$("missionobjectives>missionobjective", this).each(function()
				{
					var objectiveName = $("name", this).text();
					var objectiveText = $("objectivetext", this).text();
					var objectiveBrief = $("briefingtext", this).text();
					var objectivePercent = parseInt($("percentcomplete", this).text());
					objectivePercent = isNaN(objectivePercent) ? 0 : objectivePercent;
					objectivePercent = (objectivePercent > 100) ? 100 : objectivePercent;
					
					
					// Progress bar
					var thermoIndex = (numObjectives % 3);
					var thermoColor = xeko.widgets.missions.thermoColors[thermoIndex];
					var thermoLevel = Math.floor(objectivePercent / 10) * 10;
					var thermoLevelAlt = thermoLevel + "%";
					thermoLevel = (thermoLevel == 0) ? 10 : thermoLevel;	// No image exists for zero
					var progressSrc = "/images/g/g_thermometer_" + thermoColor + "_" + thermoLevel + ".gif";
					
					// Main objective text
					$(".missionItemObjectives", itemDiv).append("<li>" + objectiveText + "</li>");
					
					// Add a progress bar
					$(".missionItemBars", itemDiv).append(
						"<div>" + objectiveBrief + "</div>" +
						"<img src=\"" + progressSrc + "\" alt=\"" + thermoLevelAlt + "\" />"
					);
					
					totalPercent += objectivePercent;
					
					numObjectives++;
				});
				
				// Mission progress indicator
				var progressSrc;
				if (totalPercent == 0) progressSrc = "/images/g/g_bar_inprogress.gif";
				else if (totalPercent / numObjectives == 100) progressSrc = "/images/g/g_bar_complete.gif";
				else progressSrc = "/images/g/g_bar_almostthere.gif";
				$(".missionItemProgress", itemDiv).attr("src", progressSrc);
				
				// Accept this mission
				if (isSaved) {
					xeko.widgets.missions.showSaved(guid);
				}
				else {
					$(".missionItemAccept", itemDiv).click(function(e)
					{
						e.preventDefault();
						xeko.widgets.missions.acceptMission(guid);
					});
				}
				
				// Suggested Activities and Related Links -- are there custom links?
				$("extraitems>item", this).each(function()
				{
					if ($(this).attr("type") == "suggestedactivity")
					{
						var label = $("label", this).text();
						var url = $("url", this).text();
						
						$(".missionItemSuggested", itemDiv).append(
							"<li>" + 
							"<a href=\"" + url + "\">" +
							label +
							"</a></li>"
						);
					}
					else if ($(this).attr("type") == "relatedlink")
					{
						var label = $("label", this).text();
						var url = $("url", this).text();
						
						$(".missionItemRelated", itemDiv).append(
							"<li>" + 
							"<a href=\"" + url + "\">" +
							label +
							"</a></li>"
						);
					}
				});
				
				// Suggested Activites -- if no custom items were specified, use Challenges matching the tag
				if ($(".missionItemSuggested", itemDiv).children().length < 1)
				{
					if (xeko.widgets.missions.suggestedActivities[guid] == null)
					{
						// Lookup has not yet been performed; fetch and cache
						$.ajax(
						{
							method: "get",
							url: "/widgets/widget.Challenges.handler.php?type=getrelatedchallenges&tags=" + tagName,
							success: function(xml) {
								// success?
								if ($("challenge", xml).length > 0) {
									var count = 0;
									$("challenge", xml).each(function()
									{
										// Limit to three
										if (count < 3)
										{
											var challengeGuid = $(this).attr("id");
											var challengeTitle = $("title", this).text();
											var challengeHref = "/challenges/" + challengeGuid;
											
											xeko.widgets.missions.suggestedActivities[guid] = "<li>" + 
																						"<a href=\"" + challengeHref + "\">" +
																						challengeTitle +
																						"</a></li>";
											
											$(".missionItemSuggested", itemDiv).append(xeko.widgets.missions.suggestedActivities[guid]);
										}
										count++;
									});
								}
								else {
									// No challenges loaded
									xeko.debug.trace('No challenges for this tag: ' + tagName);
									xeko.widgets.missions.suggestedActivities[guid] = "";
									$(".missionItemSuggestedH4", itemDiv).hide();
									$(".missionItemSuggested", itemDiv).hide();
								}
							},
							error: function(xmlHttpRequest, status, err) {
								if (xmlHttpRequest.status > 0) {
									xeko.widgets.missions.suggestedActivities[guid] = "";
									$(".missionItemSuggestedH4", itemDiv).hide();
									$(".missionItemSuggested", itemDiv).hide();
								}
							}
						});
					}
					else
					{
						// Load from cache
						if (xeko.widgets.missions.suggestedActivities[guid].length > 0)
							$("div.challengesRelatedChallenges>ul", itemDiv).append(xeko.widgets.missions.suggestedActivities[guid]);
						else
						{
							$(".missionItemSuggestedH4", itemDiv).hide();
							$(".missionItemSuggested", itemDiv).hide();
						}
					}
				}
				
				// Related Links -- if no custom items were specified, items in the <cards> collection
				if ($(".missionItemRelated", itemDiv).children().length < 1)
				{
					$("cards>card", this).each(function()
					{
						var xekoName = $("name", this).text();
						var xekoCardId = $("classiccardid", this).text();
						var xekoHref = "/xekopedia#" + xekoCardId;
						
						$(".missionItemRelated", itemDiv).append(
							"<li>" + 
							"<a href=\"" + xekoHref + "\">" +
							xekoName +
							"</a></li>"
						);
					});
				}
				
				// Hide Related Links if there are still no items
				if ($(".missionItemRelated", itemDiv).children().length < 1)
				{
					xeko.debug.trace('No related links');
					$(".missionItemRelatedH4", itemDiv).hide();
					$(".missionItemRelated", itemDiv).hide();
				}
				
				// Close link
				$(".missionItemClose", itemDiv).click(function(e)
				{
					e.preventDefault();
					xeko.widgets.missions.closeItem(guid);
				});
			}
			currentItem++;
		});

		this.itemsLoaded = true;
//		this.setFavorites();
	},
	"acceptMission": function(itemId) {
		$.ajax(
		{
			method: "get",
			url: "/widgets/widget.Missions.handler.php",
			data: "type=savefavorite&missionguid=" + itemId,
			beforeSend: function() { xeko.lightbox.show(xeko.strings.MISSION_FAV_WAIT, true, "SaveMissionFav") },
			complete: function() { xeko.lightbox.hide("SaveMissionFav"); },
			success: function(xml) {
				// success?
				if ($("agentfavorite", xml).length > 0) {
					// Save success
					xeko.widgets.missions.hideError(itemId);
					xeko.widgets.missions.showSaved(itemId);
				}
				else {
					xeko.widgets.missions.hideError(itemId);
					xeko.widgets.missions.throwError(itemId, xeko.messaging.error.MISSIONS_ACCEPT_ERROR);
				}
			},
			error: function(xmlHttpRequest, status, err) {
				if (xmlHttpRequest.status > 0) xeko.widgets.missions.throwError(itemId, xeko.messaging.error.MISSIONS_ACCEPT_ERROR);
			}
		});
	},
	"showSaved": function(itemId) {
		$("#missionsItem" + itemId + " .missionItemAccept").hide("normal", function() {
			$("#missionsItem" + itemId + " .missionItemAccepted").show("slow");
		});
	},
	"pageTo": function(n) {
		if (parseInt(n) > 0 && parseInt(n) <= xeko.widgets.missions.numPages) {
			xeko.widgets.missions.currentPage = parseInt(n);
			xeko.widgets.missions.renderMissions();
			$("html").scrollTop(0);
		}
	},
	"pageBy": function(n) {
		xeko.widgets.missions.pageTo(xeko.widgets.missions.currentPage + parseInt(n));
	},
	"appendGuidToId": function($elm, guid) {
		var id = $elm.attr("id");
		$elm.attr("id", id + guid);
	},
	"throwError": function(itemId, msg) {
		if (itemId) $("p#missionItemError" + itemId).text(msg).show();
		else $("p#missionsError").text(msg).show();
	},
	"hideError": function(itemId) {
		if (itemId) $("p#missionItemError" + itemId).hide();
		else $("p#missionsError").hide();
	}
};