var searchCond = {}; // 検索条件
var VIEW_COUNT = 20;  // 画面に表示する件数
var MAX_COMMENT_NUM = 50;
var PREVIOUS_SORT = "relevance";
var PREVIOUS_CATEGORY = "root";

// --- initialize ---
$(function() {

  //$("#videos").hide();
  $("#sideMenu").hide();

  $("#sort > .sortMenu a#relevance").addClass("activeSort");
  $("#categoryMenu a#"+PREVIOUS_CATEGORY).addClass("activeCategory");

  // --- event handler ---
  // search
  $("#ajaxSearch").submit(function(){
    searchNew({"keyword": $("#keyword").val()});
      $("#keyword").select();
      return false;
  });

  //category
  $("#categoryMenu  li  a").click(function(){
    //searchHistory({"keyword": this.id, "page":1});
    //$("#categoryMenu #" + PREVIOUS_CATEGORY).removeClass("activeCategory");
    $("#categoryMenu .activeCategory").removeClass("activeCategory");
    if (!(this.id == "wasedasai2008") && !(this.id == "root")) {
      //$("#top").hide();
      $("#top").css({'display': 'none'});
      $("#videos").show();
      $("#sideMenu").show();
      searchNew({"keyword": this.id, "page":1});
      $("#categoryMenu #" + this.id).addClass("activeCategory");
      PREVIOUS_CATEGORY = this.id;
    } else if (this.id == "wasedasai2008") {
      $("#top").css({'display': 'none'});
      $("#videos").show();
      $("#sideMenu").show();
      searchOfficial({"keyword": "", "page":1});
      $("#categoryMenu #" + this.id).addClass("activeCategory");
      PREVIOUS_CATEGORY = this.id;
    } else {
      $("#videos").hide();
      $("#sideMenu").hide();
      $("#top").show();
      $("#categoryMenu #" + this.id).addClass("activeCategory");
      PREVIOUS_CATEGORY = this.id;
    }
  });


  // sort
  $("#sort > .sortMenu  a").click(function() {
    $("#sort > .sortMenu  .activeSort").removeClass("activeSort");
    //$("#sort > .sortMenu  #" + PREVIOUS_SORT).removeClass("activeSort");
    $("#sort > .sortMenu  #" + this.id).addClass("activeSort");
    //if (PREVIOUS_CATEGORY != "wasedasai2008") {
      if (PREVIOUS_CATEGORY != "#videos_official") {
      searchHistory({"orderby": this.id, "page":1});
    } else {
      searchOfficial({"orderby": this.id, "page":1});
    }
    PREVIOUS_SORT = this.id;
  });

  // previous
  $("#previous").click(function(){
    if (searchCond.page <= 1) return;
    searchHistory({"page": searchCond.page-1});
  });

  // next
  $("#next").click(function(){
    if (searchCond.page*VIEW_COUNT+1 > searchCond.total) return;
    searchHistory({"page": searchCond.page+1});
  });

  // category
  $("#category > li > a").click(function(){
    //searchHistory({"keyword": this.id, "page":1});
    if (!(this.id == "wasedasai2008"))
      searchNew({"keyword": this.id, "page":1});
  });

  $("#category > li > #wasedasai2008").click(function() {
    searchOfficial({"keyword": "", "page":1});
    PREIVOUS_CATEGORY = "wasedasai2008";
  });

  // clear
  $("#clear").click(function(){
    $("#history > ul").empty();
    $("#videos").empty();
    $("#result").empty();
  });

  // focus on search text box
  $("#keyword").focus();

  //searchNew({"keyword": "早稲田"});
});

// --- new search ---
function searchNew(cond) {
  search({
    "keyword": cond.keyword,
    "page": 1,
    "orderby": "relevance",
    "fromHistory": false
    });
}

function searchOfficial(cond) {
  searchPlaylists({
    "keyword": cond.keyword,
    "page":cond.page,
    "orderby": "updated",
    "fromHistory": false
  });
}

// --- search history ---
function searchHistory(cond) {
  //if ($("#history li").size() == 0) return;
  search($.extend({}, searchCond, cond, {"fromHistory": true}));
}

// --- get most *** feed --


// --- search ---
function search(cond) {
  // 検索条件の検査
  if (cond == null) return;
  /*
  if (cond.keyword == null || cond.keyword.length == 0) {
    alert("検索キーワードを入力してください。");
    return;
  }*/

  // searching result index
  var index = (cond.page-1)*VIEW_COUNT+1;
  var tags = {};

  // save search condition
  $.extend(searchCond, cond);

  // initialize thumbnail
  //$("#videos").text("Loading...");

  // define ajax process
  $.ajax({
    dataType: "jsonp",
    data: {
      "vq": "早稲田 " + cond.keyword,
      "orderby": cond.orderby,
      "start-index": index,
      "max-results": VIEW_COUNT,
      "alt":"json-in-script"
    },
    cache: true,
    url: "http://gdata.youtube.com/feeds/api/videos",
    success: function (data) {
      // clear thumbnail
      if (PREVIOUS_CATEGORY) {
	$(PREVIOUS_CATEGORY).empty();
      }
      $("#videos").empty();
      $("#categoryTags").empty();

      // get and display search result number
      searchCond.total = parseInt(data.feed.openSearch$totalResults.$t,10);
      showTotal(index, searchCond.total);

      // if result is 0
      if (searchCond.total == 0) {
        return;
      }

      // refer entry and generate thumbnails
      $.each(data.feed.entry, function(i,item){
        var random = Math.floor(Math.random()*4);
	$.each(item.media$group.media$keywords.$t.split(','), function (j, word) {
	  if (j <= 3 && !(word in tags)) {
	  tags[word] = word;
	  }
	});

          $("<div/>").addClass("thumbnail")
	    .append(
	      $("<div/>").addClass("videoInfo")
		//.append($("<img/>").attr("src", item.media$group.media$thumbnail[random].url))
		.append($("<img/>").attr("src", item.media$group.media$thumbnail[2].url))
		.append("<br />")
		//.append($("<span/>").addClass("duration").text(((m<10)?"0"+m:m) + ":" + ((s<10)?"0"+s:s)))
		.append($("<span/>").addClass("duration").text(durationToTime(item.media$group.yt$duration.seconds)))
		.append("<br />")
		.append("再生: ")
		.append($("<span/>").addClass("viewCount").text(((item.yt$statistics == null) ? "0" : item.yt$statistics.viewCount)))
		.append($("<br />"))
		.append("評価: ")
		.append($("<span/>").addClass("rating").text(((item.gd$rating)? item.gd$rating.average : "---")  + "/5"))
		.append($("<br />"))
		.append("評価者: ")
		.append($("<span/>").addClass("numRaters").text((item.gd$rating)? item.gd$rating.numRaters : "なし"))
	    )
	    .append(
	      ($("<div/>").addClass("videoSummary")
	       .append($("<span/>").addClass("published").text("投稿日: " + item.published.$t.replace(/^(\d{4})-(\d{2})-(\d{2}).*/, "$1年$2月$3日")))
		.append("<br />")
	       .append($("<span/>").addClass("title").append($("<a/>").attr("href", "/watch/" + item.id.$t.split("/")[6] + "/").text(item.title.$t.slice(0, 30) + ((item.title.$t.length > 30)? "...": ""))))
		.append("<br />")
		.append($("<span/>").addClass("description").text(item.content.$t.slice(0,MAX_COMMENT_NUM) + ((item.content.$t.length > MAX_COMMENT_NUM) ? "..." : "")))
		//.append($("<div/>").addClass("keywords").text(item.media$keywords.$t)
	    )
	  )
	 //.click(function(){window.open(item.media$group.media$player[0].url, null)})
	  .appendTo("#videos");
	  //.appendTo($(".ui-tabs-selected a").attr("href"));


        });
	for (var tag in tags) {
	  $("<span/>").addClass("tag")
	  .append($("<a/>").attr("href", "/search/" + tag + "/").text(tag))
	  .appendTo("#categoryTags");
	}

      PREVIOUS_CATEGORY = $(".ui-tabs-selected a").attr("href");
      //alert($(".ui-tabs-selected a").attr("href"));

      // add search history
      //if (!cond.fromHistory) {
        //addHistory($("#videos img:first").clone(), cond.keyword);
      //}
    }
  });
}


function searchPlaylists(cond) {
  // 検索条件の検査
  if (cond == null) return;
  /*
  if (cond.keyword == null || cond.keyword.length == 0) {
    alert("検索キーワードを入力してください。");
    return;
  }*/

  // searching result index
  var index = (cond.page-1)*VIEW_COUNT+1;
  var tags = {};

  // save search condition
  $.extend(searchCond, cond);

  // initialize thumbnail
  //$("#videos").text("Loading...");

  // define ajax process
  $.ajax({
    dataType: "jsonp",
    data: {
      // "vq": "早稲田 " + cond.keyword,
      "orderby": cond.orderby,
      "start-index": index,
      "max-results": VIEW_COUNT,
      "alt":"json-in-script"
    },
    cache: true,
    url: "http://gdata.youtube.com/feeds/api/playlists/0458915307CED87E",
    success: function (data) {
      // clear thumbnail
      if (PREVIOUS_CATEGORY) {
	$(PREVIOUS_CATEGORY).empty();
      }
      $("#videos").empty();
      $("#categoryTags").empty();

      // get and display search result number
      searchCond.total = parseInt(data.feed.openSearch$totalResults.$t,10);
      showTotal(index, searchCond.total);

      // if result is 0
      if (searchCond.total == 0) {
        return;
      }

      // refer entry and generate thumbnails
      $.each(data.feed.entry, function(i,item){
        var random = Math.floor(Math.random()*4);
	$.each(item.media$group.media$keywords.$t.split(','), function (j, word) {
	  if (j <= 3 && !(word in tags)) {
	  tags[word] = word;
	  }
	});

          $("<div/>").addClass("thumbnail")
	    .append(
	      $("<div/>").addClass("videoInfo")
		//.append($("<img/>").attr("src", item.media$group.media$thumbnail[random].url))
		.append($("<img/>").attr("src", item.media$group.media$thumbnail[2].url))
		.append("<br />")
		//.append($("<span/>").addClass("duration").text(((m<10)?"0"+m:m) + ":" + ((s<10)?"0"+s:s)))
		.append($("<span/>").addClass("duration").text(durationToTime(item.media$group.yt$duration.seconds)))
		.append("<br />")
		.append("再生: ")
		.append($("<span/>").addClass("viewCount").text(((item.yt$statistics == null) ? "0" : item.yt$statistics.viewCount)))
		.append($("<br />"))
		.append("評価: ")
		.append($("<span/>").addClass("rating").text(((item.gd$rating)? item.gd$rating.average : "---")  + "/5"))
		.append($("<br />"))
		.append("評価者: ")
		.append($("<span/>").addClass("numRaters").text((item.gd$rating)? item.gd$rating.numRaters : "なし"))
	    )
	    .append(
	      ($("<div/>").addClass("videoSummary")
	       .append($("<span/>").addClass("published").text("更新日: " + item.updated.$t.replace(/^(\d{4})-(\d{2})-(\d{2}).*/, "$1年$2月$3日")))
	       .append("<br />")
	       .append($("<span/>").addClass("title").append($("<a/>").attr("href", "/watch/" + item.link[0].href.split("?v=")[1] + "/").text(item.title.$t.slice(0, 30) + ((item.title.$t.length > 30)? "...": ""))))
		.append("<br />")
		.append($("<span/>").addClass("description").text(item.content.$t.slice(0,MAX_COMMENT_NUM) + ((item.content.$t.length > MAX_COMMENT_NUM) ? "..." : "")))
		//.append($("<div/>").addClass("keywords").text(item.media$keywords.$t)
	    )
	  )
	 //.click(function(){window.open(item.media$group.media$player[0].url, null)})
	  .appendTo("#videos");
	  //.appendTo($(".ui-tabs-selected a").attr("href"));


        });
	for (var tag in tags) {
	  $("<span/>").addClass("tag")
	  .append($("<a/>").attr("href", "/search/" + tag + "/").text(tag))
	  .appendTo("#categoryTags");
	}

      PREVIOUS_CATEGORY = $(".ui-tabs-selected a").attr("href");
      //alert($(".ui-tabs-selected a").attr("href"));

      // add search history
      //if (!cond.fromHistory) {
        //addHistory($("#videos img:first").clone(), cond.keyword);
      //}
    }
  });
}


function durationToTime(duration) {
  var m = Math.floor(duration/60);
  var s = Math.floor(duration%60);
  var time =  ( ((m < 10)? "0"+m : m) + ":" + ((s < 10)? "0"+s : s) );

  return time;
}


// --- display search result number ---
function showTotal(index, total) {
  $("#total").empty();
  $("#current").empty();
  //$("#result").append($("<span/>").addClass("displayInfo").text(
  $("#current").text(
    ((total == 0) ? 0 : index)
      + "-"
      + (index+VIEW_COUNT > total ? total : index+VIEW_COUNT-1)
  );

  //$("#result").append($("<span/>").addClass("total").text(
  $("#total").text(
      //+ " / "
      total
      + "件"
  //));
  );
}

// --- add search history ---
function addHistory(img, keyword) {
  // search keyword exists on history
  var exists = $.grep($("#history li"), function(item, index){
    return ($(item).children(".key").text() == keyword);
  });

  if (exists.length == 0) {    // not exists
    $("<li/>")
      .append(img).append("<br/>")
      .append($("<span/>").addClass("key").append(keyword))
      .append(
        $("<a/>").addClass("del").append("[x]")
          .click(function(){
            $(this).parent().remove();
              if (searchCond.keyword == keyword) {
                $("#videos").empty();
                $("#result").empty();
	      }
	  })
      )
      .click(function(){searchHistory({"keyword":keyword, "page":1, "orderby":"relevance"});})
      .prependTo("#history > ul");
  } else {    // exists
    $(exists)
      .prependTo($(exists).parent())
      .children("img").attr("src", img.attr("src"));
  }
}