var MIN_YEAR = 2008;
var MAX_YEAR = 2015;

var BASE = "";
var HREF = "";
var MODE = 'photo';
var YEAR = 0;
var MONTH = 0;
var DAY = 0;
var MINI_CAL_YEAR = 0;
var MINI_CAL_MONTH = 0;
var CALENDAR_YEAR = 0;
var CALENDAR_MONTH = 0;
var RANKING_YEAR = 0;
var RANKING_MONTH = 0;
var RANKING_TYPE = 'bijo';
var MONTH_NAMES = ["jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec"];
var SEARCH_RESULTS = [];
var HOLIDAYS = {};

$(function(){
  showCalendar();
  loadTweet();

  // ランキング
  var today = new Date();
  if(today.getFullYear() == RANKING_YEAR && today.getMonth() == (RANKING_MONTH - 1)){
    showRankingPrev();
  }else{
    showRanking();
  }

  // プロフィールのティッカー
  $("#profile_ticker").liScroll({travelocity: 0.05});
  $("#profile_ticker").click(function(){
    $.scrollTo(".prof", {duration:1000});
  });

  // 写真のスライド
  $("#coda-slider-1").codaSlider({
    dynamicTabs: false,
    dynamicArrows: false
  });

  // ミニカレンダー
  $("#mini_cal").hide();
  $(".koyomi").hover(initMiniCalendar, hideMiniCalendar);
  $("#mini_cal").hover(showMiniCalendar, hideMiniCalendar);
  $("#mini_cal_prev").click(showMiniCalendarPrev);
  $("#mini_cal_next").click(showMiniCalendarNext);

  // カレンダー
  $("#calendar_prev").click(showCalendarPrev);
  $("#calendar_next").click(showCalendarNext);
  $("#calendar_prev_year").click(showCalendarPrevYear);
  $("#calendar_next_year").click(showCalendarNextYear);

  // ランキング
  $("#blog_ranking").click(showBlogRanking);
  $("#bijo_ranking").click(showBijoRanking);
  $("#ranking_prev_year").click(showRankingPrevYear);
  $("#ranking_next_year").click(showRankingNextYear);
  $("#ranking_prev").click(showRankingPrev);
  $("#ranking_next").click(showRankingNext);

  // 検索結果
  $("#search_result_pick").hide();
  $(".search_result_item").hover(pickSearchResult, hideSearchResult);

  // プレースホルダー
  $("body").TextfieldPlaceholders;

  // fullscreen (lightbox)
  $(".fullscreen a").lightBox({
    imageLoading: BASE+'/images/lightbox-ico-loading.gif',
    imageBtnPrev: BASE+'/images/lightbox-btn-prev.gif',
    imageBtnNext: BASE+'/images/lightbox-btn-next.gif',
    imageBtnClose: BASE+'/images/lightbox-btn-close.gif',
    imageBlank: BASE+'/images/lightbox-blank.gif'
  });
  $(".fullscreen").mouseover(switchFullscreenLink);

  // 投票
  $(".btn_vote").click(vote);
});

function init(base, href, mode, year, month, day, holidays)
{
  BASE = base;
  HREF = href;
  MODE = mode;
  YEAR = year;
  MONTH = month;
  DAY = day;
  MINI_CAL_YEAR = year;
  MINI_CAL_MONTH = month;
  CALENDAR_YEAR = year;
  CALENDAR_MONTH = month;
  RANKING_YEAR = year;
  RANKING_MONTH = month;
  HOLIDAYS = holidays;
}

function setSearchResults(data)
{
  SEARCH_RESULTS = data;
}

function loadTweet(){
  var url = "http://search.twitter.com/search.json?callback=?";
  var param = {q: "@bijogoyomi OR from:bijogoyomi", rpp: 6};
  $.getJSON(url, param, function(tl) {
    for(var i = 0; i < tl.results.length; i++) {
      var target = "bijogoyomi_tweet";
      var replyUrl = "http://twitter.com/?status=@bijogoyomi&in_reply_to=bijogoyomi&in_reply_to_status_id=" + tl.results[i].id;
      var reply = $("<a>").attr("target", target).attr("href", replyUrl).text("返信");
      var tweetUrl = "javascript:shareTwitter()";
      var tweet = $("<a>").attr("href", tweetUrl).text("ツイート");
      var link = $("<span>").addClass("link");
      link.append(reply).append(tweet);

      var text = tl.results[i].text;
      text = text.replace(/(https?:\/\/[-_.!~*'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)/g, '<a target="_blank" href="$1">$1</a>');
      var span = $("<span>").addClass("twit_kiji").html(text);
      span.append(link);
      $(".twit_list").append(span);
    }
  });
}

function shareTwitter()
{
  var url = "http://twitter.com/share?url=" + encodeURIComponent(window.location.href);
  window.open(url, "bijogoyomi_tweet");
}

function shareFacebook()
{
  var url = "http://www.facebook.com/sharer.php?u=" + encodeURIComponent(window.location.href);
  window.open(url, "bijogoyomi_facebook");
}

function initMiniCalendar()
{
  MINI_CAL_YEAR = YEAR;
  MINI_CAL_MONTH = MONTH;
  showMiniCalendar();
}

function showMiniCalendar()
{
  var month = MINI_CAL_MONTH - 1;
  var date = new Date(MINI_CAL_YEAR, month, 1);

  // 年月の表示
  $("#mini_cal_year").text(MINI_CAL_YEAR);
  $("#mini_cal_month").text(MINI_CAL_MONTH);

  // 日付を削除
  $("#mini_cal .mini_day").remove();

  // 最初の行
  var tr = $("<tr>").addClass("mini_day");
  for(var i = 0; i < 7; i ++){
    if(i < date.getDay()){
      tr.append($("<td>").html("<br>"));
    }else{
      tr.append(createMiniCalendarTd(date));
      date.setDate(date.getDate()+1);
    }
  }
  $("#mini_cal tr.dow").after(tr);
  while(date.getMonth() == month || date.getDay() != 0){
    if(date.getDay() == 0) tr = $("<tr>").addClass("mini_day");
    if(date.getDay() == 6) $("#mini_cal tr.mini_day:last").after(tr);
    if(date.getMonth() == month){
      tr.append(createMiniCalendarTd(date));
    }else{
      tr.append($("<td>").html("<br>"));
    }
    date.setDate(date.getDate()+1);
  }

  // 表示
  $("#mini_cal").fadeIn();
}

function hideMiniCalendar()
{
  $("#mini_cal").fadeOut();
}

function createMiniCalendarTd(date)
{
  var a = $("<a>").append(date.getDate()).attr("href", HREF + "/" + formatDate(date));
  var td = $("<td>").append(a);
  if(date.getDay() == 0 || isHoliday(date)) td.addClass("mini_sun");
  if(date.getDay() == 6) td.addClass("mini_sat");
  return td;
}

function showCalendar()
{
  var month = CALENDAR_MONTH - 1;

  // 今日の日付
  var today = new Date();
  // 先頭(先月の最後の日曜日から)
  var start = new Date(CALENDAR_YEAR, month, 1);
  start.setDate((start.getDay() * -1) + 1);
  // 最後(来月の最初の土曜日まで)
  var end = new Date(CALENDAR_YEAR, month + 1, 0);
  end.setDate(end.getDate() + (6 - end.getDay()));
  // 日数を算出
  var days = ((end.getTime() - start.getTime()) / (1000*60*60*24)) + 1;

  // 画像URL
  var weekUrl = BASE + "/img/calendar/week.gif";

  // table タグと曜日ヘッダ
  var table = $("<table>").attr("width", 617);
  if(MODE == "photo"){
    table.addClass("cal_box");
  }else{
    table.addClass("cal_box_movie");
  }
  table.html('<tr><td colspan="7"><img src="' + weekUrl + '"></td></tr>');

  var param = CALENDAR_YEAR + "-" + ("0"+CALENDAR_MONTH).slice(-2);
  $.get(BASE+"/api/month.php", {date: param }, function(data){
    // カレンダー
    var videoThumbnails = {};
    for(var i = 0; i < days; i ++){
      var date = new Date(start.getFullYear(), start.getMonth(), start.getDate());
      date.setDate(date.getDate() + i);

      if(date.getDay() == 0) tr = $("<tr>");

      var td = $("<td>").addClass("day_" + date.getDate()).attr("width", 88);
      if(date.getMonth() == month){
        var number = $("<img>").addClass("index_num");

        // 曜日毎の処理
        if(date.getDay() == 0 || isHoliday(date)){
          td.addClass("sun");
          if(MODE == 'movie') number.attr("src", BASE + "/img/calendar/index_m_sun_" + date.getDate() + ".png");
          else                number.attr("src", BASE + "/img/calendar/index_sun_" + date.getDate() + ".png");
        }else if(date.getDay() == 6){
          td.addClass("sat");
          if(MODE == 'movie') number.attr("src", BASE + "/img/calendar/index_m_sat_" + date.getDate() + ".png");
          else                number.attr("src", BASE + "/img/calendar/index_sat_" + date.getDate() + ".png");
        }else{
          td.addClass("w");
          if(MODE == 'movie') number.attr("src", BASE + "/img/calendar/index_m_" + date.getDate() + ".png");
          else                number.attr("src", BASE + "/img/calendar/index_" + date.getDate() + ".png");
        }

        var selector = "bijo[day="+date.getDate()+"]";

        // サムネイル
        var thumbnail = $(data).find(selector).attr("thumbnail");
        // YouTube Vidoe Id
        var videoId = $(data).find(selector).attr("youtube");

        // アンカー
        var anchor = $("<a>").attr("href", HREF + "/" + formatDate(date));

        if(MODE == 'photo' && thumbnail){
          anchor.append($("<img>").addClass("index_photo").attr("src", thumbnail));
          anchor.append(number);
          td.append(anchor);
        }else if(MODE == 'movie' && videoId && $(data).find(selector + " video").length > 0){
          videoThumbnails[videoId] = Array($(data).find(selector + " video").length);
          var index = 0;
          $(data).find(selector + " video").each(function(){
            videoThumbnails[videoId][index++] = { src: $(this).attr("thumbnail"), from: "50% 50% 0.53x", to: "50% 50% 0.53x", time: 1 };
          });
          var slideshow = $("<div>");
          slideshow.css("width", "64px").css("height", "48px");
          slideshow.addClass("videoThumbnail").attr("video", videoId);
          slideshow.hide();
          anchor.append($("<img>").addClass("index_photo").attr("src", videoThumbnails[videoId][0].src));
          anchor.append(slideshow);
          anchor.append(number);
          td.append(anchor);
        }
      }else{
        td.addClass("n");
      }
      tr.append(td);

      if(date.getDay() == 6) table.append(tr);
    }

    // カレンダー末尾
    var tr = $("<tr>");
    for(var i = 0; i < 7; i ++){
      var td = $("<td>").addClass("f").html("&nbsp;");
      tr.append(td);
    }
    table.append(tr);

    $("#calendar_container").fadeOut("fast", function(){
      $("#calendar_container").empty();
      $("#calendar_container").append(table);
      $("#calendar_container").fadeIn();

      // 動画サムネイルのスライドショー
      $(".videoThumbnail").each(function(){
        var videoId = $(this).attr("video");
        $(this).crossSlide({ fade: 0.2 }, videoThumbnails[videoId]);
        $(this).closest("a").hover(function(){
          $("img:first", this).hide();
          $(".videoThumbnail", this).crossSlideRestart();
          $(".videoThumbnail", this).show();
        },
        function(){
          $("img:first", this).show();
          $(".videoThumbnail", this).crossSlideStop();
          $(".videoThumbnail", this).hide();
        });
      });
      // スライドショーを1秒後に停止
      //   crossSlide 関数呼び出し直後では停止しないため
      setTimeout(function(){
        $(".videoThumbnail").each(function(){
          $(this).crossSlideStop()
        });
      }, 3000);
    });
  });

  // 年月の画像を差し替え

  $("#calendar_year").attr("src", BASE+"/img/calendar/nen_"+CALENDAR_YEAR+".gif");
  $("#calendar_month").attr("src", BASE+"/img/calendar/tuki_"+CALENDAR_MONTH+".gif");
  $("#calendar_month_name").attr("src", BASE+"/img/calendar/tuki_"+MONTH_NAMES[month]+".gif");
}

function formatDate(date, delim)
{
  if(delim == undefined) delim = "/";
  var year = date.getFullYear();
  var month = ("0" + (date.getMonth() + 1)).slice(-2);
  var day = ("0" + date.getDate()).slice(-2);
  return year + delim + month + delim + day;
}

function showRanking(year, month)
{
  if(RANKING_TYPE == "bijo"){
    showBijoRanking();
  }else if(RANKING_TYPE == "blog"){
    showBlogRanking();
  }
}

function showBlogRanking()
{
  RANKING_TYPE = "blog";
  $("#blog_ranking").removeClass("off");
  $("#bijo_ranking").addClass("off");

  $("#ranking_box").empty();
  $("#ranking_box").load(BASE+"/ranking.php", {"ranking": "blog", "date": RANKING_YEAR+"-"+RANKING_MONTH});
  $("#ranking_year").attr("src", BASE+"/img/ranking/nen_"+RANKING_YEAR+".gif");
  $("#ranking_month").attr("src", BASE+"/img/ranking/tuki_"+RANKING_MONTH+".gif");
}

function showBijoRanking()
{
  RANKING_TYPE = "bijo";
  $("#blog_ranking").addClass("off");
  $("#bijo_ranking").removeClass("off");

  $("#ranking_box").empty();
  $("#ranking_box").load(BASE+"/ranking.php", {"ranking": "bijo", "date": RANKING_YEAR+"-"+RANKING_MONTH});
  $("#ranking_year").attr("src", BASE+"/img/ranking/nen_"+RANKING_YEAR+".gif");
  $("#ranking_month").attr("src", BASE+"/img/ranking/tuki_"+RANKING_MONTH+".gif");
}

/**
 *
 * カレンダー年月
 *
 */
function showCalendarPrev()
{
  if(CALENDAR_YEAR == MIN_YEAR && CALENDAR_MONTH == 1) return false;
  CALENDAR_MONTH --;
  if(CALENDAR_MONTH == 0){
    CALENDAR_YEAR --;
    CALENDAR_MONTH = 12;
  }
  showCalendar();
  return false;
}

function showCalendarNext()
{
  if(CALENDAR_YEAR == MAX_YEAR && CALENDAR_MONTH == 12) return false;
  CALENDAR_MONTH ++;
  if(CALENDAR_MONTH == 13){
      CALENDAR_YEAR ++;
      CALENDAR_MONTH = 1;
  }
  showCalendar();
  return false;
}

function showCalendarPrevYear()
{
  if(CALENDAR_YEAR == MIN_YEAR) return false;
  CALENDAR_YEAR --;
  showCalendar();
  return false;
}

function showCalendarNextYear()
{
  if(CALENDAR_YEAR == MAX_YEAR) return false;
  CALENDAR_YEAR ++;
  showCalendar();
  return false;
}

/**
 *
 *  ランキング年月
 *
 */
function showRankingPrev()
{
  if(RANKING_YEAR == MIN_YEAR && RANKING_MONTH == 1) return false;
  RANKING_MONTH --;
  if(RANKING_MONTH == 0){
    RANKING_YEAR --;
    RANKING_MONTH = 12;
  }
  showRanking();
  return false;
}

function showRankingNext()
{
  if(RANKING_YEAR == MAX_YEAR && RANKING_MONTH == 12) return false;
  RANKING_MONTH ++;
  if(RANKING_MONTH == 13){
      RANKING_YEAR ++;
      RANKING_MONTH = 1;
  }
  showRanking();
  return false;
}

function showRankingPrevYear()
{
  if(RANKING_YEAR == MIN_YEAR) return false;
  RANKING_YEAR --;
  showRanking();
  return false;
}

function showRankingNextYear()
{
  if(RANKING_YEAR == MAX_YEAR) return false;
  RANKING_YEAR ++;
  showRanking();
  return false;
}

/**
*
*  ミニカレンダー
*
*/
function showMiniCalendarPrev()
{
  if(MINI_CAL_YEAR == MIN_YEAR && MINI_CAL_MONTH == 1) return false;
  MINI_CAL_MONTH --;
  if(MINI_CAL_MONTH == 0){
    MINI_CAL_YEAR --;
    MINI_CAL_MONTH = 12;
  }
  showMiniCalendar();
  return false;
}

function showMiniCalendarNext()
{
  if(MINI_CAL_YEAR == MAX_YEAR && MINI_CAL_MONTH == 12) return false;
  MINI_CAL_MONTH ++;
  if(MINI_CAL_MONTH == 13){
    MINI_CAL_YEAR ++;
    MINI_CAL_MONTH = 1;
  }
  showMiniCalendar();
  return false;
}

function pickSearchResult()
{
  var id = $(this).attr("bijo");
  var pick = $("#search_result_pick");

  // データの設定
  var result = SEARCH_RESULTS[id];
  $("#search_result_link").attr("href", BASE+"/index.php/"+result.date);
  $("#search_result_thumbnail").attr("src", result.pick_thumbnail);
  $("#search_result_name").text(result.name);
  $("#search_result_date").text(result.date);
  if(result.video_id){
    $("#search_result_movie").attr("href", BASE+"/movie.php/"+result.date).show();
  }else{
    $("#search_result_movie").hide();
  }
  $("#search_result_photo").attr("href", BASE+"/index.php/"+result.date);
  $("#search_result_home").text(result.home);
  $("#search_result_age").text(result.age);
  $("#search_result_blood").text(result.blood);
  $("#search_result_constellation").text(result.constellation);

  // タグの移動
  pick.remove();
  $(this).css("z-index", 150);
  $(this).append(pick);
  pick.show();

}
function hideSearchResult()
{
  $(this).css("z-index", '');
  $("#search_result_pick").hide();
}

function switchFullscreenLink()
{
  var hash = window.location.hash;
  if(hash == "") return;

  var index = parseInt(hash.substring(1)) - 1;
  if(index < 0) index = 0;

  $(".fullscreen a").hide();
  $(".fullscreen a:eq("+index+")").show();
}

function vote()
{
  var date = new Date(YEAR, MONTH - 1, DAY);

  $.ajaxSetup({cache: false});
  $.get(BASE+"/api/vote.php", { "date": formatDate(date, "-")}, function(data){
    $("#vote_box").empty();
    $("#vote_box").append($("<img>").attr("src", BASE+"/img/profile/btn_thanks.jpg"));
  });
  return false;
}

function isHoliday(date)
{
  return (HOLIDAYS[formatDate(date, "-")] == undefined ? false : true);
}
