function clearGameSearch() {
  $('#loc-text').val('');
  setCurrSelectedGames([]);
  setCurrSearchedGames("");
}

// --- selected games (right side) ---

var currSelectedGamesArr = new Array();   // the list of games on the right. each one is an object with keys: name, game_id, permalink, icon_url, height, width
var SELECTED_GAMES_PER_PAGE = 5;
var currSelectedGamesPage = 1;
var isSelectedGamesReadOnly = true;   // can they delete games

// caches for loading the read-only game lists - null or undefined means haven't loaded it yet
var premiumSelectedGamesCache = null;
var categoryGamesCache = {};  // key is cat name, val is array of games for the cat
var allGamesCache = null;

// selected categories
var currSelectedCategoriesArr = new Array();  // the game categories that the user selected

function setCurrSelectedGames(newArr) {
  newArr = arrayFilter(newArr, function(v) { return v; });  //remove null game objs
  currSelectedGamesArr = newArr;
  updateCurrSelectedGames(false);
  setSWFGames(newArr);
}

function addToCurrSelectedGames(newGameObj) {
  addArrayToCurrSelectedGames([newGameObj]);
}

function addArrayToCurrSelectedGames(arr, gamesChoiceWhenAsked) {
  if(gamesChoiceWhenAsked && currChooseGamesChoice != gamesChoiceWhenAsked) {
    // the user's been clicking around faster than the server
    return;
  }

  var shouldUpdate = false;

  for(var i = 0; i < arr.length; i++) {
    var newGameObj = arr[i];
    newGameObj.game_id = parseInt(newGameObj.game_id);
    if(!findInCurrSelectedGames(newGameObj)) {
      currSelectedGamesArr.push(newGameObj);
      shouldUpdate = true;
    }
  }

  if(shouldUpdate) {
    updateCurrSelectedGames(true);
  }
}

function removeArrayFromCurrSelectedGames(arr) {
  for(var i = 0; i < arr.length; i++) {
    deleteFromCurrSelectedGames(parseInt(arr[i].game_id));
  }
}

function findInCurrSelectedGames(gameObj) {
  for(var i = 0; i < currSelectedGamesArr.length; i++) {
    if(currSelectedGamesArr[i].game_id == gameObj.game_id) {
      return true;
    }
  }
  return false;
}

// remove the game at index
function deleteFromCurrSelectedGames(game_id) {
  game_id = parseInt(game_id);

  for(var i = 0; i < currSelectedGamesArr.length; i++) {
    if(currSelectedGamesArr[i].game_id == game_id) {
      currSelectedGamesArr.splice(i, 1);
      break;
    }
  }
  updateCurrSelectedGames(true);
}

var gamesCache = {};  // key is type (categories like social or adventure; premium; all), value is array of games
var dontShowCacheOnLoad = {}; // 
function addToReadOnlyGames(type, search_term) {
  if(!gamesCache[type] || search_term) {
    $("#currently-selected-games-spinner").show();
    $("#currently-selected-games-none").hide();
    var oldGamesChoice = currChooseGamesChoice;
    $.get("/publishers/show_feed_service", makeServerArgs({ type: type, format: "json", search_term : search_term }), function(data) {
      $("#currently-selected-games-spinner").hide();
      if(data.games) {
        if(!gamesCache[type]) {
          gamesCache[type] = [];
        }
        gamesCache[type] = gamesCache[type].concat(data.games);

        if(dontShowCacheOnLoad[type]) {
          // this is to prevent when someone checks and unchecks really fast
          dontShowCacheOnLoad[type] = false;
        } else {
          addArrayToCurrSelectedGames(gamesCache[type], oldGamesChoice);
        }
      }
    }, "json");
  } else {
    addArrayToCurrSelectedGames(gamesCache[type]);
  }
}

function removeFromReadOnlyGames(type) {
  // remove the stuff in gamesCache[type] from the selected games list
  if(gamesCache[type]) {
    removeArrayFromCurrSelectedGames(gamesCache[type]);
  } else {
    // when it does load, make sure not to show it
    dontShowCacheOnLoad[type] = true;
  }
}

// navigation stuff
function updateCurrSelectedGames(stayOnSamePage) {
  var page = (stayOnSamePage ? currSelectedGamesPage : 1);
  setCurrSelectedGamesPage(page);

  if(!currSelectedGamesArr.length) {
    $("#currently-selected-games-none").show();
  } else {
    $("#currently-selected-games-none").hide();
  }
}

// page starts counting at 1. this sets the page and also resets.
function setCurrSelectedGamesPage(page) {
  // redraw the page el and show the right games
  var numPages = Math.ceil(parseFloat(currSelectedGamesArr.length) / SELECTED_GAMES_PER_PAGE);
  if(numPages < page && numPages) {
    // can happen if we deleted the last game but wanna stay on the same page
    page = numPages;
  }

  // display the games for this page
  showSelectedGames(page);

  var pageEl = $('#currently-selected-games .paginate');
  if(numPages <= 1) {
    // don't even show pages
    pageEl.hide();

  } else {
    // make the html
    var pageHtml = "Pages: ";
    if(page != 1) {
      pageHtml += "<span onclick='setCurrSelectedGamesPage(" + (page - 1) + ")'>&lt; Prev</span>";
    }

    var pageArr = makePageArr(page, numPages);

    for(var i = 0; i < pageArr.length; i++) {
      pageHtml += " ";

      if(pageArr[i] == "...") {
        pageHtml += "...";
      } else if(pageArr[i] == page) {
        pageHtml += pageArr[i];
      } else {
        pageHtml += "<span onclick='setCurrSelectedGamesPage(" + pageArr[i] + ")'>" + pageArr[i] + "</span>";
      }
    }

    if(page != numPages) {
      pageHtml += " <span onclick='setCurrSelectedGamesPage(" + (page + 1) + ")'>Next &gt;</span>";
    }

    pageEl.show().html(pageHtml);
  }

  currSelectedGamesPage = page;
}

// show games at this page
function showSelectedGames(page) {
  var listEl = $("#currently-selected-games .lst");

  var listHtml = "";
  var startI = (page - 1) * SELECTED_GAMES_PER_PAGE;
  for(var i = startI; i < (startI + SELECTED_GAMES_PER_PAGE) && i < currSelectedGamesArr.length; i++) {
    var g = currSelectedGamesArr[i];
    var isLast = (i == (startI + SELECTED_GAMES_PER_PAGE) - 1 || i == currSelectedGamesArr.length - 1);

    var playGameCode = "launchPlayGame(\"" + g.permalink + "\", " + g.height + ", " + g.width + ");";

    listHtml += "<li " + (isLast ? "class='last'" : "") + "><span ><em><img title='Preview' src='/css/img/zoom_in_24.png' class='icon' onclick='" + playGameCode + "' >";
    if(!isSelectedGamesReadOnly) {
      listHtml += "<img title='Remove' src='/css/img/delete_24.png' class='icon' onclick='deleteFromCurrSelectedGames(\"" + g.game_id + "\");'>";
    }
    listHtml += "</em><img src=\"" + g.icon_url + "\" class='icon' onclick='" + playGameCode + "'><a href='javascript:" + playGameCode + "'>" + g.name + "</a></span></li>";
  }

  listEl.html(listHtml);
}



// --- searched for games (left side) ---

var currSearchedGamesArr = new Array();   // the list of games resulted from the search, showing on the left. each one is an object with keys: name, game_id, permalink
var SEARCHED_GAMES_PER_PAGE = 5;
var currSearchedGamesPage = 1;

function setCurrSearchedGames(queryStr) {
  setSearchedGamesContent([], true);
  $("#num-matches").hide();
  $('#searchResultsQuery').text(queryStr);

  if(!queryStr || queryStr == "") {
    setSearchedGamesContent([]);
  } else {
    $("#search-results-spinner").show();
    $.get("/publishers/search_service", makeServerArgs({ q: queryStr, format: "json" }), function(data) {
      $("#search-results-spinner").hide();
      var games = (data && data.games ? data.games : []);
      setSearchedGamesContent(games, true);
    }, "json");
  }
}

function setSearchedGamesContent(newArr, forceShow) {
  currSearchedGamesArr = newArr;
  setSearchedGamesPage(1);

  var num = currSearchedGamesArr.length;
  if(num || forceShow) {
    $("#select-by-search-keyword-results").show();
    $("#num-matches").show().text(num + " match" + (num == 1 ? "" : "es"));
  } else {
    $("#select-by-search-keyword-results").hide();
  }
}

function setSearchedGamesPage(page) {
  var numPages = Math.ceil(parseFloat(currSearchedGamesArr.length) / SEARCHED_GAMES_PER_PAGE);

  // display the games for this page
  showSearchedGames(page);

  // pagination
  var pageEl = $('#select-by-search-keyword-results .paginate');
  if(numPages <= 1) {
    pageEl.hide();
  } else {
    var pageHtml = "Pages: ";
    if(page != 1) {
      pageHtml += "<span onclick='setSearchedGamesPage(" + (page - 1) + ")'>&lt; Prev</span>";
    }

    var pageArr = makePageArr(page, numPages);

    for(var i = 0; i < pageArr.length; i++) {
      pageHtml += " ";

      if(pageArr[i] == "...") {
        pageHtml += "...";
      } else if(pageArr[i] == page) {
        pageHtml += pageArr[i];
      } else {
        pageHtml += "<span onclick='setSearchedGamesPage(" + pageArr[i] + ")'>" + pageArr[i] + "</span>";
      }
    }

    if(page != numPages) {
      pageHtml += " <span onclick='setSearchedGamesPage(" + (page + 1) + ")'>Next &gt;</span>";
    }

    pageEl.show().html(pageHtml);
  }

  currSearchedGamesPage = page;
}

// show the games at this page
function showSearchedGames(page) {
  var listEl = $("#select-by-search-keyword-results .lst");

  var listHtml = "";
  if(currSearchedGamesArr.length > 0){
    listHtml += "<li class='last'><span onclick='chooseGames(5,true);addAllSearchedGames();'>Add all game results</span></li>";
  }

  var startI = (page - 1) * SEARCHED_GAMES_PER_PAGE;
  for(var i = startI; i < (startI + SEARCHED_GAMES_PER_PAGE) && i < currSearchedGamesArr.length; i++) {
    var g = currSearchedGamesArr[i];
    listHtml += "<li><span ><em><img title='Preview' src='/css/img/zoom_in_24.png' class='icon' onclick='launchPlayGame(\"" + g.permalink + "\", " + g.height + ", " + g.width + ");' ><img src='/css/img/add_24.png' class='icon' title='Add' onclick='addToCurrSelectedGames(currSearchedGamesArr[" + i + "])'></em><img src=\"" + g.icon_url + "\" class='icon'>" + g.name + "</span></li>";
  }

  listEl.html(listHtml);
}

function resetAllSearchedGames() {
  chooseGames(2);
  $('#select-channel-results').hide();
}
function getChannelTerm(){
  search_term = $('#searchResultsQuery').text();
  return search_term;
}

function setChannelTerm(term){
  $('#searchResultsQuery').text(term);
}

function addAllSearchedGames() {
  
  search_term = getChannelTerm();

  addToReadOnlyGames("search", search_term);

  isSelectedGamesReadOnly = true;

  $('#select-channel-results').show();
  $('#searchChannel').text(search_term);
  $('#loc').hide();
  $('#select-by-search-keyword-results').hide();
  
}

// categories
function resetSelectedCategories() {
  currSelectedCategoriesArr = [];
}

function removeFromSelectedCategories(cat) {
  var i = currSelectedCategoriesArr.indexOf(cat);
  if(i != -1) {
    currSelectedCategoriesArr.splice(i, 1);
  }
}
function addToSelectedCategories(cat) {
  currSelectedCategoriesArr.push(cat);
}

//helper function for pagination
function makePageArr(page, numPages) {
  var returner1 = [];
  for(var i = 1; i <= numPages; i++) {
    if((i == 1 || i == 2) || (i == page - 1 || i == page || i == page + 1) || (i == numPages || i == numPages - 1)) {
      returner1.push(i);
    }
  }

  var returner2 = [];
  // put ellipses
  for(var i = 0; i < returner1.length; i++) {
    returner2.push(returner1[i]);
    if((i != returner1.length - 1) && (returner1[i + 1] - returner1[i] > 1)) {
      returner2.push("...");
    }
  }

  return returner2;
}
