/**
 * Google MyMap EXPO 全般のグローバル変数
 *
 * plotEntries プロット数
 *
 * weeks 週毎>日毎 にワークシートを格納した配列の配列
 *
 * currentWeek 選択中の週のweeksのインデックス
 * currentDay 選択中の週の日のweeksのインデックス
 *
 * workingWeek 選択中の週のワークシートを格納した一時配列
 *
 * targetWeek 読み込む日付のワークシート情報を格納した一時オブジェクト
 *  loaded リストフィードを読み込んだかどうか
 *
 * key おすすめスプレッドシートのkey
 *
 * page エントリ一覧のページナンバー
 * entryLimit エントリ一覧のページあたりのエントリ数
 */
var gmymapexpo = new Object();

/**
 * mymap_recommend.html用の初期化関数。
 * 初期化後、おすすめワークシートを読み込む。
 */
function initRecommend() {
  initMap();

  var select =
      document.getElementById('items').getElementsByTagName('select')[0];
  gmymapexpo.plotEntries = select.value;
  gmymapexpo.currentWeek = 0;
  gmymapexpo.currentDay = 0;
  gmymapexpo.key = 'pZJwZdcoBTuMGrvxlsR6cTw';
  gmymapexpo.entryLimit = 10;
  gmymapexpo.entries = new Array();

  loadRecommendWorksheets();
}

/**
 * おすすめワークシートの読み込み
 */
function loadRecommendWorksheets() {
  loadJson([
            'http://spreadsheets.google.com/feeds/worksheets/',
            gmymapexpo.key,
            '/public/values',
            '?alt=json-in-script',
            '&callback=setRecommendWorksheets'
            ].join(''));
}

/**
 * おすすめワークシートの読み込み後、シート名がrecommendのシートの
 * リストフィードURLを取得。
 * @param json おすすめワークシートフィードのjsonオブジェクト
 */
function setRecommendWorksheets(json) {
  for (var i = 0; i < json.feed.entry.length; i++) {
    var entry = json.feed.entry[i];
    if (entry.title.$t == 'recommend') {
      loadRecommendList(entry.link[0].href);
      break;
    }
  }
}

/**
 * おすすめリストフィードを読み込む。
 * @param href おすすめリストフィードURL
 */
function loadRecommendList(href) {
  loadJson([
            href,
            '?alt=json-in-script',
            '&callback=setRecommendList',
            '&orderby=position',
            '&reverse=true'
            ].join(''));
}

/**
 * おすすめリストフィードから行データを読み込み
 * gmymapexpo.entriesへ格納する。
 * @param json おすすめリストフィードのjsonオブジェクト
 */
function setRecommendList(json) {
  var data = new Array();
  if (json.feed.entry) {
    for (var i = 0; i < json.feed.entry.length; i++) {
      var entry = getRowData(json.feed.entry[i]);
      gmymapexpo.entries.push(entry);
    }
  }
  _plot();
}

/**
 * プロット数に応じてプロットを実行する。
 */
function _plot() {
  listEntries();
  var entries = gmymapexpo.entries;
  if (gmymapexpo.plotEntries != 'all' &&
      entries.length > gmymapexpo.plotEntries) {
    entries = entries.concat().slice(0, gmymapexpo.plotEntries);
  }
  plotMarkers(entries);
  resetZoom();
}

/**
 * プロット数の変更。
 * select.onchangeにアタッチする関数。
 * @param number プロット数
 */
function changePlots(number) {
  gmymapexpo.plotEntries = number;
  _plot();
}

/**
 * エントリ一覧を表示する
 * _plotからのみ呼ばれ、gmymapexpo.pageを0に初期化する
 * @param json 新着ワークシートフィードのjsonオブジェクト
 */
function listEntries() {
  gmymapexpo.page = 0;
  _listEntries();
}

/**
 * エントリ一覧表示のHTML処理
 */
function _listEntries() {
  var entries = gmymapexpo.entries;
  var str = [
             '<h3>',
             '<a href="#mapTitle" onclick="resetZoom(); return false">',
             'Recommended My Maps',
             '</a>',
             '</h3>',
             '<ol>'
             ];
  var start = gmymapexpo.page * gmymapexpo.entryLimit;
  var end = start + gmymapexpo.entryLimit;
  if (end > entries.length) {
    end = entries.length;
  }
  for (var i=start; i<end; i++) {
    var entry = entries[i];
    str = str.concat([
                      '<li>',
                      '<a class="img" onclick="openEntry(',
                      i,
                      ');" href="#mapTitle">',
                      '<img alt="blue" src="images/map-icon-',
                      entry.icon,
                      '.gif"/>',
                      '</a>',
                      '<span>',
                      '<a onclick="openEntry(',
                      i,
                      ');" href="#mapTitle">',
                      entry.title,
                      '</a>',
                      '<br/>',
                      entry.nick,
                      ' ',
                      entry.date.getDate(),
                      '/',
                      (entry.date.getMonth() + 1),
                      '/',
                      entry.date.getFullYear(),
                      '</span>',
                      '</li>'
                      ]);
  }
  str.push('</ol>');
  if (entries.length > gmymapexpo.entryLimit) {
    str = str.concat([
                      '<div id="pageNav">',
                      '<ul>'
                      ]);
    var end = Math.ceil(entries.length / gmymapexpo.entryLimit);
    for (var i=0; i<end; i++) {
      str.push('<li>');
      if (gmymapexpo.page == i) {
        str = str.concat([
                          '<span class="current">',
                          i+1,
                          '</span>'
                          ]);
      } else {
        str = str.concat([
                          '<a href="#mapTitle" onclick="listEntriesByPage(',
                          i,
                          ');">',
                          i+1,
                          '</a>'
                          ]);
      }
      str.push('</li>');
    }
    str = str.concat([
                      '</ul>',
                      '</div>'
                      ]);
  }
  document.getElementById('entries').innerHTML = str.join('');
}

/**
 * pageNavのa.onclickにアタッチする関数。
 * エントリ一覧をページナンバーに従って表示するための前処理。
 * エントリ一覧のインデックスは、0から割り当て直さずそのまま維持する。
 * 表示件数を超えたエントリを一覧する場合にプロットしなおす。
 * @param page 0から始まるページナンバー
 */
function listEntriesByPage(page) {
  gmymapexpo.page = page;
  var entries = gmymapexpo.entries;
  if (gmymapexpo.plotEntries != 'all' &&
      entries.length > gmymapexpo.plotEntries) {
        var _entries = new Array();
        var start = page * gmymapexpo.entryLimit;
        var end = start + gmymapexpo.entryLimit;
        if (end > entries.length) {
          end = entries.length;
        }
        for (var i=start; i<end; i++) {
          _entries[i] = entries[i];
        }
        plotMarkers(_entries);
        resetZoom();
      }
  _listEntries();
}

/**
 * エントリ一覧のa.onclickにアタッチする関数。
 * クリックしたエントリのインフォウィンドウを表示する。
 * @param index エントリ一覧のインデックス
 */
function openEntry(index) {
  openMyMapInfo(index);
}

google.setOnLoadCallback(initRecommend);
