/// <reference path="jQuery.intellisense.js"/>
/// <reference path="xeko.js"/>
/// <reference path="messaging.js"/>

var force_error = false;

$(document).ready(function() {
	
	xeko.widgets.missions.renderPage();
	
	$("#navMissionsHotspotMap").click(function(e)
	{
		e.preventDefault();
		$("#navMissionsHotspotMapDiv").show();
	});

	$("#navMissionsHotspotImagemapClose").click(function(e)
	{
		e.preventDefault();
		$("#navMissionsHotspotMapDiv").hide();
	});

});

xeko.widgets.missions = {
  "missionsXml": "",
  "totalItems": 0,
  "currentPage": 1,
  "numPages": 1,
  "itemsPerPage": 4,
  "itemsLoaded": false,
  "favoritesLoaded": false,
  "favorites": ",",
  "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");
  },
  "renderPage": function() {
    xeko.widgets.missions.loadMissions();

  },
  "loadMissions": function() {

    // Load and cache Missions XML
    $.ajax(
		{
		  method: "get",
		  //url: "/interface/xml/TEMP_StaticMissions.xml",
		  url: "/widgets/widget.Missions.handler.php?type=getfavorites",
		  //	beforeSend: function() { xeko.lightbox.show(xeko.strings.LOADING, true, "LoadMissionsXml") },
		  //	complete: function() { xeko.lightbox.hide("LoadMissionsXml"); },
		  beforeSend: function() { },
		  complete: function() { $("#agentMissionsLoading").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
		      $("#missions").before(xeko.messaging.alert.MISSIONS_MINE_NONE);
		    }
		  },
		  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 ??
    $("#missionsItem").siblings("div.missionsItem").remove();
    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();

        /************************************************************
        * 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;


          // 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
        $(".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.debug.trace('Error getting suggested items by tag: ' + status);
								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);

		      // Keep list up to date
		      xeko.widgets.missions.favorites += 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);
		  }
		});
  },
  "setFavorites": function() {
    if (this.favoritesLoaded && this.itemsLoaded) {
      $(".missionsItem").each(function() {
        var thisItemId = $(this).attr("id").substr("missionsItem".length);
        if (xeko.widgets.missions.favorites.indexOf(thisItemId) > 0) xeko.widgets.missions.showSaved(thisItemId);
      });
    }
  },
  "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();
  }
};