/**
 * bam.media.vpp.miniGrid handles loading of data for the mini mlb.tv grid component 
 * on the video landing page.
 *
 * @author Aleksandar Kolundzija
 * @version 1.0a
 */ 

if (typeof bam.media.vpp === "undefined"){ bam.media.vpp = {}; } // for video landing page which doesn't require vpp logic

bam.media.vpp.miniGrid = (function(){
                              
  var _scheduleListDivId = "promoTvScheduleList",
      _scheduleHeadDivId = "promoTvScheduleHead",
      _msgLoading        = "Loading...",
      _msgNoTvGames      = "Updated MLB.TV schedule information coming soon.",
      _msgDataError      = "Unable to retrieve the schedule.<br/>Please try again later.";
      
  /**
   * private function for filtering game data based on presence of mlbtv media,
   * and organizing so that live games are listed first.
   */
  function _getOrganizedData(data){
    var liveGames  = [],
        schedGames = [];
    $.each(data.data.games.game, function(i, curGame){ // each game
      if (bam.object.getDeepValue(curGame, "game_media.homebase.media.0")){
        $.each(curGame.game_media.homebase.media, function(i, curMedia){ // each media node
          if (curMedia.type && curMedia.type.indexOf("mlbtv")>-1 && !curGame._added){ // if has mlbtv
            if (curMedia.state==="MEDIA_ON"){
              liveGames.push(curGame);
              curGame._added = true; // tag as added
              return false;
            }
            else {
              schedGames.push(curGame);
              curGame._added = true; // tag as added
              return false;
            }
          }
        });
        if (curGame._added){
          delete(curGame._added); // clean tag
        }
      }
    });
    return [].concat(liveGames, schedGames);
  }		
  
  /**
   * Private function for getting game time/status.
   */
  function _getGameTime(game, isLiveGame){
    if (isLiveGame){
      return "LIVE";
     }
    if (game.status==="Postponed" || game.status==="Suspended" || game.status==="Cancelled"){ 
      return game.status;
    }
    if (game.event_time==="3:33 AM"){ 
      return game.event_time;
    }
    return game.event_time;
  }
  
  /**
   * Private function for launching media player
   */
  function _getGameLink(game){
    var cfg = {};
    cfg.calendar_event_id = game.calendar_event_id;
    cfg.media_type        = "video";
    bam.media.launchPlayer(cfg);
  }
  
  /**
   * Checks media_state to determine if game is live
   */
  function _isGameLive(game){
    return (game.media_state==="media_on");			
  }
  
  
  var _self = {
    
    /**
     * Displays a message in the grid space. Error/whatever.
     */
    showMsg: function(msg){
      $("#"+_scheduleListDivId).html("<div class='msg'>"+msg+"</div>");
    },
    
    
    /**
     * Renders table with schedule information. 
     * Assigns click handler to live links for launching media player.
     */
    renderGrid: function(rawData){
      var $table = $("<table></table>"),
          $tr,
          html,
          isLiveGame,
          games = _getOrganizedData(rawData);
      // iterate through game nodes and render grid
      if (games.length){
        $.each(games, function(i, curGame){
          isLiveGame = _isGameLive(curGame);
          html = '<tr game_pk="' + curGame.game_pk + '" ' + (isLiveGame ? 'class="liveGame"' : '') + '>' + 
                 '<td class="gameTime">' + _getGameTime(curGame, isLiveGame) + '</td>' + 
                 '<td class="gameMatchup">' + (isLiveGame ? '<a href="#">' : '')+curGame.away_team_name+' @ '+curGame.home_team_name+(isLiveGame ? "</a>" : "")+'</td>'+
                 '<td class="gameVideoLink">' + (isLiveGame ? '<button>Watch</button>' : "&nbsp;")+'</td>'+
                 '</tr>';
          $tr = $(html);
          if (isLiveGame){
            $tr.find(".gameVideoLink button").click(function(){ _getGameLink(curGame); });
            $tr.find(".gameMatchup a").click(function(e){ e.preventDefault(); _getGameLink(curGame); });
          }
          $tr.appendTo($table);
        });
        // inject grid into DOM
        $("#"+_scheduleListDivId).html($table);				
      }
      else {
        _self.showMsg(_msgNoTvGames);
      }
    },
    
    
    /**
     * Loads data for selected day and calls renderGrid to inject into DOM.
     * @param $dayElem jQuery object representing the DOM (li) element
     */
    loadDay: function($dayElem){
      var date       = new Date($dayElem.attr("date")),
          yyyy       = date.getFullYear(),
          mm         = date.getMonth()+1,
          dd         = date.getDate(),
          dataUrl    = "",
          $todaySpan = $("#"+ _scheduleHeadDivId +" h5 span");
      mm = (mm<10) ? "0"+mm : mm;
      dd = (dd<10) ? "0"+dd : dd;
      dataUrl = "/gdcross/components/game/mlb/year_"+yyyy+"/month_"+mm+"/day_"+dd+"/grid.json";
      $dayElem.siblings().removeClass("selected");
      $dayElem.addClass("selected");
      if ($dayElem.is(":first-child")){
        $todaySpan.show();
      }
      else {
        $todaySpan.hide();
      }
      _self.showMsg(_msgLoading);
      $.ajax({
        url      : dataUrl,
        dataType : "json",
        success  : _self.renderGrid,
        error    : function(){ _self.showMsg(_msgDataError); }
      });
    },
    
    
    /**
     * Renders day selector, and assigns click handlers and loads
     * passed day.
     * @param curDate Date Object
     */
    init: function(curDate){
      var dateNavHtml = "";
      for (var i=0,totalDays=7; i<totalDays; i++){
        dateNavHtml += "<li date='"+curDate.toDateString()+"'>"+curDate.toDateString().substring(0,1)+"</li>";
        curDate = new Date(curDate.getTime() + 86400000); // increment to next day
      }
      $("#"+ _scheduleHeadDivId +" ul")
        .append(dateNavHtml)
        .find("li")
        .live("click", function(){
          _self.loadDay($(this));
          bam.tracking.track({
            async: {
              isDynamic    : true,
              compName     : "Video Landing Page MLB.TV Today Schedule",
              compActivity : "VLP: MLB.TV Today Schedule: Day Click", 
              actionGen    : true
            }
          });
        });
      // load first day
      _self.loadDay($("#"+_scheduleHeadDivId+" li:first-child"));		
    }
  
  };
  
  return _self;
  
})();
