platform = "PlayStation3";
mode = "SearchMode";

// Page Interaction
change_platform = function(element) {
  platform = element.innerHTML;
  set_cookie("platform", platform.replace(/\s/g, ""));
  dates = release_dates(games[platform]);
  min_date = dates[0];
  max_date = dates[dates.length - 1];

  $("div.platform").css({color: "#000000", backgroundColor: "#BBBBBB", fontWeight: "normal"});
  $("#title").html(platform + " Release Dates");
  $("#results").html("");

  if (mode == "Search") {
    fuzzy_change($("#fuzzy").val());
  } else {
    fuzzy_search("");
  };

  element.style.backgroundColor = "#0077FF";
  element.style.color = "#FFFFFF";
  element.style.fontWeight = "bold";
};

enter_search_mode = function(element) {
  $("#browse").css({display: "none"});
  $("#search").css({display: "inline"});

  fuzzy_change($("#fuzzy").val());
};

enter_browse_mode = function(element) {
  $("#search").css({display: "none"});
  $("#browse").css({display: "inline"});

  fuzzy_search("");
};

change_mode = function(element) {
  mode = element.innerHTML;
  set_cookie("mode", mode + "Mode");

  if (mode == "Browse") {
    enter_browse_mode();
  } else {
    enter_search_mode();
  }

  $("div.mode").css({color: "#000000", backgroundColor: "#BBBBBB", fontWeight: "normal"});

  element.style.backgroundColor = "#0077FF";
  element.style.color = "#FFFFFF";
  element.style.fontWeight = "bold";
};

// Fuzzy Search
fuzzy_change = function(fuzzy, event) {
  set_cookie("last_search", fuzzy);

  var charCode;

  if(event && event.which){
    charCode = event.which;
  } else if(window.event){
    event = window.event;
    charCode = event.keyCode;
  }

  if (fuzzy.length < 3 && charCode != 13) {
    $("#results").html("<i style=\"font-size: small\">(type at least three characters, or hit enter to force a search)</i>");
  } else {
    fuzzy_search(fuzzy);
  }
}

fuzzy_search = function(fuzzy) {
  regexp = build_regexp(fuzzy);

  var matches = {};
  platform_games = games[platform]
  for (var game in platform_games) {
      if (regexp.test(game)) {
      matches[game] = platform_games[game];
    }
  }

  if (matches.length == 0) {
    $("#results").html("<i style=\"font-size: small\">No matches found.</i>");
  } else {
    render_matches(matches, regexp);
  }
}

build_regexp = function(fuzzy) {
  pattern = "\^";
  for (i = 0; i < fuzzy.length; i++) {
    pattern += "([^" + fuzzy.charAt(i) + "]*)([" + fuzzy.charAt(i) + "])";
  }
  pattern += "(.*)$";

  return new RegExp(pattern, "i");
}

// Rendering
render_matches = function(matches, regexp) {
  $("#results").html("");

  dates = release_dates(matches);
  for (var i = 0; i < dates.length; i++) {
    date = dates[i]
    $("#results").append(render_release_date(date));

    for (var game in matches) {
      if (matches[game].release_date == date) {
        $("#results").append(render_game_link(game, matches[game], regexp));
          $("#results").append("<br>");
      }
    }

    $("#results").append("<br>");
  }
}

render_game_link = function(game_name, game_attributes, regexp) {
  var link = "";
  link += "<a href='" + game_attributes.url + "'>";
  link += render_title_with_matches(game_name, regexp);
  link += "</a>";

  return link;
}

render_title_with_matches = function(game_name, regexp) {
  tokens = regexp.exec(game_name);
  var title = "";
  for (j = 1; j < tokens.length; j++) {
    if (j % 2 == 0) {
          title += "<b>" + tokens[j] + "</b>";
        } else {
          title += tokens[j];
        }
  }

  return title;
}

// Common utility
release_dates = function(games) {
  // There must be a cleaner way to do this
  var release_dates = {};
  for (var game in games) {
    release_dates[games[game].release_date] = games[game].release_date;
  }

  var dates = [];
  for (var date in release_dates) {
    dates.push(date);
  }

  return dates.sort();
}

var days = new Array(
  'Sunday','Monday','Tuesday',
  'Wednesday','Thursday','Friday','Saturday');
var months = new Array(
  'January','February','March','April','May',
  'June','July','August','September','October',
  'November','December');

formatted_date = function(date) {
  var date_string = days[date.getDay()] + ", " +
       months[date.getMonth()] + " " +
       date.getDate() + ", " +
       date.getFullYear();

  return date_string;
}

render_release_date = function(date) {
  var myDate = new Date();
  var date_parts = date.split("-");
  myDate.setFullYear(date_parts[0]);
  myDate.setMonth(date_parts[1] - 1);
  myDate.setDate(date_parts[2]);

  return "<h3>" + formatted_date(myDate) + "</h3>";
}

get_cookie = function(name) {
  if (document.cookie.length > 0) {

    start = document.cookie.indexOf(name + "=");
    if (start != -1) {
      start = start + name.length + 1;
      end = document.cookie.indexOf(";", start);

      if (end == -1) end = document.cookie.length;

      return unescape(document.cookie.substring(start, end));
    }
  }

  return "";
}

get_cookie_with_default = function(name, default_value) {
  value = get_cookie(name);
  return (value == "") ? default_value : value;
}

set_cookie = function(name, value)
{
  var expiry = new Date();
  expiry.setDate(expiry.getDate() + 365);
  document.cookie = name + "=" + escape(value) + ";"
                  + "expires=" + expiry.toUTCString();
}

