/* Video API wrapper for the Cars.com Brightcove integration */

// definition for video object
function bcVideoCode() {
  // assign 'me' to address callbacks and 'this'
  var me = this;
  // playCounter
  me._playCounter = 0;
  me._videoToLoad = false;
  // called when template loads, this function stores a reference to the player and modules.
  this.init = function(experienceID) {
    me.bcExp = brightcove.getExperience(experienceID);
    me.modVP = me.bcExp.getModule(APIModules.VIDEO_PLAYER);
    me.modExp = me.bcExp.getModule(APIModules.EXPERIENCE);
    me.modCon = me.bcExp.getModule(APIModules.CONTENT);
    me.modSoc = me.bcExp.getModule(APIModules.SOCIAL);
    me.modSearch = me.bcExp.getModule(APIModules.SEARCH);
    // register event handlers
    me.modExp.addEventListener(BCExperienceEvent.TEMPLATE_READY, me.onTemplateReady);
    me.modExp.addEventListener(BCExperienceEvent.CONTENT_LOAD, me.onContentLoad);
    me.modCon.addEventListener(BCContentEvent.MEDIA_LOAD, me.onVideoLoad);
    me.modVP.addEventListener(BCVideoEvent.VIDEO_START, me.onVideoPlay);
    me.modVP.addEventListener(BCMediaEvent.CHANGE, me.onMediaChange);
    me.modSearch.addEventListener(BCSearchEvent.RESULT, me.addRelatedTab);
    
    me._playlistToLoad = false;
    var playlistCheck = /playlistID=(\d{11})/i;
    if (playlistCheck.test(location.search)) {
        me._playlistToLoad = Number(location.search.match(playlistCheck)[1]);
    }
  };
  // called when template is ready
  this.onTemplateReady = function(evt) {
    me.tabBar = me.modExp.getElementByID('playlistTabs');
    me.playList = me.modExp.getElementByID('videoList');

    if (me._playlistToLoad) {
        var tabs = me.tabBar.getData();
        for (var i = 0; i < tabs.length; i++) {
            if (tabs[i].id == me._playlistToLoad) {
                me.tabBar.setSelectedIndex(i);
                break;
            }
        }
    }
  };
  // called when content is loaded
  this.onContentLoad = function(evt) {
    if (me._videoToLoad != false) {
      me.loadVid(me._videoToLoad);
      me._videoToLoad = false;
    } 
    else {
      if (me.playList != null) {
        setTimeout( function() { me.playList.setSelectedIndex(0);}, 1000);
      }
    }
  };
  // called when video asset is loaded into player
  this.onVideoLoad = function(evt) {
  };
  this.onVideoPlay = function() {
    me._playCounter++;
    if (me._playCounter > 1) { // reset CRP header for subsequent video plays.
      if (document.getElementById('headerTitleText')) {
        myTitle = document.getElementById('headerTitleText').innerHTML = 'Cars.com Video';
      }
      if (document.getElementById('headerLinks')) {
        document.getElementById('headerLinks').innerHTML = '';
      }
    }
  };
  // helper func to load video... timeout for occasional fail on load
  this.loadVid = function(w) {
    me.modVP.loadVideo(w);
    window.setTimeout(function() { // wait to trigger the correct ad call
      if (!CARS.video.modVP.isPlaying()) { CARS.video.modVP.play(); }
    }, 1000);
  };
  // called when media changes
  this.onMediaChange = function() {
    // update sharing URL
    me.currentVideo = me.modVP.getCurrentVideo();
    me.modSoc.setLink('http://www.cars.com/go/video/index.jsp?videoId='+me.currentVideo.id);
    // load related in CRP
    if ((/video\/player.jsp/).test(window.location.href)) {
    	//me.relatedVideos = me.modSearch.findRelatedVideos(me.currentVideo.id);
    }
  }
  // function for populating a 'related' tab
  this.addRelatedTab = function() { 
    if (!me.relatedTabCreated) {
	    me.relatedPlaylist = {};
	    me.relatedPlaylist.displayName = "Related Videos";
      // me.relatedPlaylist.id = 11111111111111111;
	    me.tabBar.insertTabAt(me.relatedPlaylist, 0);
	  	me.relatedTabCreated = true;
	  }
    me.tabBar.setSelectedIndex(0);
    me.playList.setData(me.relatedVideos.getItems());
  }
}

// create/append code objects
var CARS = CARS || {};
CARS.video = new bcVideoCode();

// callback registration for brightcove player
onTemplateLoaded = function(experienceID) {
  CARS.video.init(experienceID);
};
