var core = {};

function PlayOrPrompt(el) {
  if (window.User && User.loggedIn) {
    el.href="/?playNow="+Page.publicId;
    return true;
  }
  // not logged in
  User.promptForRegister('<p class="alignRight">You need to register an account to watch this, or you can <a href="/logout#login" onclick="parent.User.loginShow();return false">login</a></p>');
  return false;
}
  
core.plugin = {
  watchTimer:0,
  minimumWatchDuration: 20000,
  min_major : 0, min_minor : 9, min_patch : 2,
  currentPlaying : {
    publicId    : "",
    title       : "",  // \n's left in
    description : "", // \n's left in
    duration    : "", // in milliseconds
    thumbnail   : "" // the thumbnail
  },

  currentGroup: {
    type : '', 
    name : "",
    title : "",
    description : ""
 },

 events : {  'onVideoChange' : [], 'onVideoStart' : [], 'onVideoEnd' : [],
             'onReady' : [], 'onPlaylistEmpty' : [], 'onFailure' : [],
             'onFullscreenToggled' : [], 'onAdvertEnd' : [], 'onAdvertStart' : [], 'onCompanionAd' : [], 'onOverlayStart' : [], 'onOverlayEnd' : [], 'muteOnOff' : [] }
};

core.plugin.createEventProxy=function(eventStr) {
  return function(){
    var events=core.plugin.events;
    var eventsLength = events[eventStr].length;
    for (var i = 0; i < eventsLength; i++) {
      try {
        events[eventStr][i](core.plugin.parseEvent(eventStr, arguments));
      } catch(e){
      }
    }
    try {
      document.getElementById('FlashZapper').trigger(eventStr, core.plugin.parseEvent(eventStr, arguments));
    } catch(e){}
  };
};

core.plugin.callback={};

// hide this in a closure to prevent i from becoming a global
(function(){
   for(var i in core.plugin.events){
     if (core.plugin.events[i] instanceof Array) {
       core.plugin.callback[i] = core.plugin.createEventProxy(i);
     }
   }
})();

core.plugin.parseEvent = function(eventStr, arg) {
  if(!arg){
    return;
  }
  switch(eventStr){
    case 'onFailure' :
      return {code : arg[0], url : arg[1]};
    break;
    case 'onCompanionAd' :
      return {adURL: arg[0], ctURL: arg[1], h: arg[2], w:arg[3], resourceType:arg[4]};
    break;
    default :
      if(!arg.length) {
        return;
      }
      return arg[0];
  }
};

core.plugin.getCurrentGroup=function() {
  if (core.plugin.currentGroup.name=="channel") {
    return {name:"channel",id:core.plugin.currentGroup.channel};
  }
  return {name:core.plugin.currentGroup.name};
}

core.plugin.getCurrentShow=function() {
  if (core.plugin.loaded()) {
    var id = core.plugin.jPlug.src();
    if (id) {
      id=core.plugin.fixUpId(id);
      core.plugin.currentPlaying.publicId = id;
      core.plugin.currentPlaying.title = core.plugin.jPlug.joostTitle();
      core.plugin.currentPlaying.description = core.plugin.jPlug.joostDescription();
      core.plugin.currentPlaying.duration = core.plugin.jPlug.duration();
      core.plugin.currentPlaying.thumbnail = core.plugin.jPlug.poster();
      return id;
    }
  }
  return "";
};

core.plugin.loaded = function() {
  // Watch out! Comparing a function to true evaluates to false.
  return core.plugin.jPlug && typeof core.plugin.jPlug.playVideo == 'function';
};

core.plugin.triggerEvent = function(eventStr, arg) {
  var me = core.plugin;
  try {
  var eventArray = me.events[eventStr];
  for(var i = 0; i < eventArray.length; i++){
      if(typeof(eventArray[i]) != 'function'){
        alert('somebody attempted to a event to the plugin, but didnt give didnt put in a function\n' + 'on event : ' + eventStr + '\n the value of it ' + eventArray[i]);
        continue;
      }
      eventArray[i](core.plugin.parseEvent(eventStr, arg));
  }
  } catch(e) {
  }
  try {
    document.getElementById('FlashZapper').trigger(eventStr, arg);
  } catch(e){}
};

core.plugin.switchToAFrame = function() {
  if (core.plugin.jPlug) {
    core.plugin.jPlug.style.display="none";
  }
  var plugPlay=document.getElementById('plugPlay');
  if (plugPlay) {
    plugPlay.style.display="none";
  }

  var aframeEl=document.getElementById('aFrameContainer');
  if (!aframeEl) {
    var el=document.createElement('div');
    el.id="aFrameContainer";
    el.innerHTML='<div class="aFrameContainer"><div id="epgAframe"></div>';
    var player=document.getElementById('player');
    player.appendChild(el);
    var vars={};
    var params={scale:'noScale', salign:'lt', allowNetworkAccess:'always', allowScriptAccess:'always'}; 
    var attributes = { id:'epgRotator', name:'epgRotator'};
    swfobject.embedSWF(Page.AFrameURL, "epgAframe", "640", "360", "9.0.28", "/static/flash/expressInstall.swf", vars, params, attributes );
    if (!window.flashElementsOnPage) {
      flashElementsOnPage=["epgRotator"];
    } else {
      flashElementsOnPage.push("epgRotator");
    }
  } else {
    aframeEl.style.display="block";
  }
};

core.plugin.onPlaylistEmpty = function(){
  var query=(''+location.search);
  if ((''+query).indexOf("_noPlaylistEmpty=1")>-1) {
    return;
  }
  if (window.Page && Page.AFrameURL && Page.AFrameURL!="") {
    core.plugin.switchToAFrame();
    return;
  }
  var name=core.plugin.currentGroup.name;
  if (name=="video") {
    core.plugin.play(core.plugin.currentGroup.publicId);
  }
  if (name=="playlist") {
      playFromZapper(undefined,"featured",true);
  }
  if (name=="random") {
    Lists["random"]=null;
    replayRandom();
    return;
  }
  if (name=="channel") {
    playFromZapper(undefined,"channel",false);
    return;
  }
  playFromZapper(undefined,name,true);
};

core.plugin.onReady = function() {
  var p = document.getElementById('joostplugin');
  var me = core.plugin;
  if (p && !me.jPlug) {
    me.jPlug = p;
    me.version = p.version;
    me.versionFull = p.versionFull;
    window.jp = me.jPlug;
    if (window.User) {
      if (User.loggedIn && window.User_Details) {
        // this really should never fail
        var joostName=window.User_Details.joostName;
        try {
          p.setUser(joostName);
        } catch (e) {
          return false;
        }
      }
    }
  }
  if (window.firstLoadGo) {
    window.firstLoadGo();
  }
};

core.plugin.onVideoStart = function() {
  var id=core.plugin.jPlug.src();
  if (id) {
    id = core.plugin.fixUpId(id);
  }
  if (core.plugin.currentPlaying.publicId!=id) {
    // missed an onVideoChange ??
    core.plugin.triggerEvent("onVideoChange");
  }
  // maybe skip this if the current show is alredy in the querystring?
  if (window.Page && !Page.excludeQueryString) {
    location.hash="id="+core.plugin.getCurrentShow();
    var title=core.plugin.jPlug.joostTitle();
    document.title=title+" - Joost";
  }
  if(window.User && window.User.loggedIn){
    core.plugin.watchTimer=setTimeout(function(){
                                        var url='http://www.joost.com/api/events/add?publicId=' + core.plugin.getCurrentShow() + '&json_function=void';
                                        jsonRequest(url);
               }, core.plugin.minimumWatchDuration);
  }
};

core.plugin.onVideoEnd = function(watchedSeconds) {
  clearTimeout(core.plugin.watchTimer);
  if (isNaN(watchedSeconds)) {
    watchedSeconds=0;
  }
  try {
    position=core.plugin.jPlug.currentTime();
  } catch (e) {
    position=0;
  }
  var duration=core.plugin.currentPlaying.duration;
    var completeView=(duration - position < 10 && duration != 0);
  if (core.plugin.currentGroup.name=="playlist" && completeView) {
    var publicId=core.plugin.currentPlaying.publicId;
    var url='/api/playlist/remove/?publicId=' + publicId + '&json_function=handleRemovePlay';
    jsonRequest(url);
  }
};

core.plugin.onVideoChange = function(noupdate){
  clearTimeout(core.plugin.watchTimer);
  var me = core.plugin;
  var id=me.jPlug.src();
  if (id) {
    me.currentPlaying.publicId = core.plugin.fixUpId(id);
    me.currentPlaying.title = me.jPlug.joostTitle();
    me.currentPlaying.description = me.jPlug.joostDescription();
    me.currentPlaying.duration = me.jPlug.duration();
    me.currentPlaying.thumbnail = me.jPlug.poster();
  } else {
    me.currentPlaying.publicId = "";
    me.currentPlaying.title = "";
    me.currentPlaying.description = "";
    me.currentPlaying.duration = "";
    me.currentPlaying.thumbnail = "";
  }
};

core.plugin.muteOnOff = function(force){
    var me = core.plugin;
    if(!me.loaded()) {
        return false;
     }
    if(force != undefined) {
        if(force) {
            me.jPlug.setMuted(true); 
        } else {
            me.jPlug.setMuted(false);
        }
        return false;
    }
    var state =  me.jPlug.isMuted();
    if(state){
      me.jPlug.setMuted(false);
    } else {
      me.jPlug.setMuted(true);
    }
}

core.plugin.clearEntries = function(){
  var me = core.plugin;
  if(!me.loaded()) {
    return false;
  }
  var ii = me.jPlug.playlistCount();
  for (var i = 0; i < ii; i++) {
    me.jPlug.removeEntry(0);
  }
  me.currentList = null;
  me.startIndex = null;
};

core.plugin.removeEntry = function(publicId,ignorePlaying) {
  var me = core.plugin;
  if(!me.loaded()) {
    return false;
  }
  if (!ignorePlaying) {
    var playing = core.plugin.fixUpId(me.jPlug.src());
    if(playing == publicId){
      me.jPlug.nextEntry();
      return;
    }
  }
  for(var i = 1; i <  me.jPlug.playlistCount(); i++) {
    if(publicId != core.plugin.fixUpId(me.jPlug.getEntry(i))){
      continue;
    }
    me.jPlug.removeEntry(i);
    break;
  }
};

core.plugin.getEntry = function(position) {
  var me = core.plugin;
  if(!me.loaded()) {
    return false;
  }
  return me.fixUpId(me.jPlug.getEntry(position));
};

core.plugin.getInternalPlayList = function() {
  var me = core.plugin;
  if(!me.loaded()) {
    return false;
  }
  var list = [];
  var count=me.jPlug.playlistCount();
  for(var i = 0; i <  count; i++) {
    list.push(core.plugin.fixUpId(me.jPlug.getEntry(i)));
  }
  return list;
}

core.plugin.playList = function(listObj){
  var playingList = listObj.playingList;
  if (!playingList || playingList.length==0) {
    // requested to play nothing..
    return false;
  }
  for (var i=0;i<playingList.length;i++) {
    var item=playingList[i];
    if (item.geoPlayable===false) {
      playingList.splice(i,1);
      continue;
    } else {
      // some playlists might contain artists/channels/series etc.
      if (item.type && item.type!="video") {
        playingList.splice(i,1);
      }
    }
  }
  if (playingList.length==0) {
    return false;
  }
  var publicId=playingList[0].publicId;
  if (!Page.player && publicId!=Page.publicId) {
    if (window.User && User.loggedIn) {
      location="/?playNow="+publicId;
    } else {
      location="/"+publicId;
      return true;
    }
  }
  core.plugin.showPlugin(true);
  if (window.Page && Page.embedded) {
    core.plugin.onReady();
  }
  if(!core.plugin.loaded() ){
    setTimeout(function() {
                 core.plugin.playList(listObj);
               }, 500);
    return true;
  }

  if (core.plugin.getCurrentShow()!=publicId) {
    var link=core.constructLink(publicId);
    if (!link) {
      core.plugin.triggerEvent("onFailure","50000")
        return false;
    }
    core.plugin.playVideo(link);
  }
  for(var i = 1; i < playingList.length; i++) {
    core.plugin.jPlug.addEntry(playingList[i].publicId);
  }
  core.plugin.currentGroup.channel = listObj.channelId;
  core.plugin.currentGroup.name = listObj.id;
  core.plugin.currentGroup.type = 'list';
  return true;
};

core.plugin.foreignAdSuccess = function(success, event) {
  var me = core.plugin;
  if(!me.loaded()){
    return;
  }
}

core.plugin.appendEntries = function(entries) {
  var me = core.plugin;
  if(!me.loaded()){
    return;
  }

  for(var i = 0; i < entries.length; i++) {
    me.jPlug.addEntry(entries[i].publicId);
  }
};

core.plugin.playVideo=function(video) {
  var video=(video+"").replace("joost:///","")
  analyticsTrackEvent("player/toldToPlay/"+video);
  core.plugin.jPlug.playVideo(video);
};

core.plugin.playEntry = function(entry, listId){
  var me = core.plugin;
  me.showPlugin(true);

  if(!me.loaded()){
    setTimeout(function() {
                 me.playEntry(entry, listId);
               }, 300);
    return;
  }

  me.currentGroup.name = listId;
  me.currentGroup.type = entry.type;
  me.currentGroup.publicId = entry.publicId;

  setTimeout(function() {
    core.plugin.playVideo(entry.publicId);
  }, 100);
};

core.plugin.hidePlugin = function() {
  var me = core.plugin;
  if (me.jPlug) {
    me.jPlug.style.visibility="hidden";
  }
  var el=document.getElementById('not_playing_thumb');
  if (el) {
    el.style.display='block';
  }
};

core.plugin.showPlugin = function(hideAframe) {
  if (hideAframe) {
    var aframeEl=document.getElementById('aFrameContainer');
    if (aframeEl) {
      aframeEl.style.display="none";
    }
  }
  try {
    var me = core.plugin;
    if (me.jPlug) {
      me.jPlug.style.display="block";
    }
    var el=document.getElementById('not_playing_thumb');
    if (el) {
      el.style.display='none';
    }
  } catch(e) {}
};

core.plugin.play = function(publicId, listId) {
  var me = core.plugin;
  me.showPlugin(true);
  if(!publicId){
    return;
  }
  if(!me.loaded()){
    setTimeout(function() {
                 me.play(publicId, listId);
    }, 300);
    return;
  }

  var link=core.constructLink(publicId);
  if (!link) {
    core.plugin.triggerEvent("onFailure","50000")
    return;
  }
  core.plugin.playVideo(link);
  if(listId){
    me.currentGroup.name = listId;
  } else {
    me.currentGroup.name = "video";
    me.currentGroup.publicId = publicId;
  }
};

function isDateWrong() {
  if (window.User_Details) {
    var d=window.User_Details.today;
    if (d) {
      var d=d.split('-');
      d=new Date(d[0],d[1]-1,d[2]);
      if (d && Math.abs(d.valueOf()-new Date().valueOf())>20*24*60*60*1000) {
        return true;
      }
    }
  }
  return false;
}

core.plugin.afterFailure = function(lastShowFailed) {
  var query=(''+location.search);
  if ((''+query).indexOf("_stopOnFailure=1")>-1) {
    return;
  }
  setTimeout(function() {
               if (lastShowFailed) {
                 core.plugin.onPlaylistEmpty();
                 return;
               }
               var array=core.plugin.getInternalPlayList();
               if (!array || array.length==0) {
                 core.plugin.onPlaylistEmpty();
                 return;
               }
               core.plugin.jPlug.playCurrentEntry();
             },3000);
};
core.plugin.onFailure = function(error) {
  var me = core.plugin;
  var feedbackEmail='feedback@joost.com';

  if(!error.code){
    return;
  }

  var array=core.plugin.getInternalPlayList();
  lastShowFailed=false;
  if (array.length>0) {
    lastShowFailed=(array[array.length-1]==core.plugin.currentPlaying);
  }

  var code = parseInt(error.code);
  switch(code){
    case 20013 : // failed to create stream
      if (isDateWrong()) {
        core.notifier.addMsg("The date on your computer is wrong, please correct the date and reload.", {style : 'error',duration:1000});
      } else {
        core.notifier.addMsg("Player : Something's wrong. For help, report the error code to "+feedbackEmail+".  " + ' #' + code, {style : 'error'});
        core.plugin.afterFailure(lastShowFailed);;
      }
      break;
    case 20006 : // could not get signatures
    case 20016 : // can't play empty channel
    case 20029 : // backend error checking channel playability
    case 30002 : // can't parse data from backend
    case 30003 : // can't retrieve data from backend
    case 9998 : // invalid URL
    case 9999 : // unknown error
      core.notifier.addMsg("Player : Something's wrong. For help, report the error code to "+feedbackEmail+".  " + ' #' + code, {style : 'error'});
      core.plugin.afterFailure(lastShowFailed);;
    break;
    case 40001 :
      core.notifier.addMsg('Player : Sorry - we can\'t play this due to our <a href="/support/faq/Player-and-Zapper/#Error-adblock">partner\'s rules</a> over ad blockers, please disable your ad blocker and try again.', {html : true,style : 'error'});
      core.plugin.afterFailure(lastShowFailed);;
      break;
    case 20032 : //"The content is not available in the requesting region"
      core.notifier.addMsg("Player : Sorry - we can't play this in your country ... but something good is coming up next." + ' #' + code, {style : 'error'});
      core.plugin.afterFailure(lastShowFailed);;
    break;
    case 20033 : //"The content is not yet available or else has expired" :
      core.notifier.addMsg("Player : Sorry - we can't play this right now ... but something good is coming up next." + ' #' + code, {style : 'error'});
      core.plugin.afterFailure(lastShowFailed);;
    break;
    case 20034 : //"The content has not yet been published or else has been removed"
      core.notifier.addMsg("Player : Sorry - this is not available ... but something good is coming up next." + ' #' + code, {style : 'error'});
      core.plugin.afterFailure(lastShowFailed);;
    break;
  case 50000 :
    core.notifier.addMsg("We tried to play nothing. #"+code, {style : 'error',duration:4});
    core.plugin.afterFailure(lastShowFailed);;
    default :
      core.notifier.addMsg("Player : Something's wrong. For help, report the error code to "+feedbackEmail+".  " + ' #' + code, {style : 'error'});
      core.plugin.afterFailure(lastShowFailed);;
    break;
  }
};

core.plugin.addValue = function(id, value){
  var me = core.plugin;
  if(!me.loaded()){
    return false;
  }
  // XXX When this returns do some stuff here.
  me.jPlug.setValue(id, value);
  return true;
};

core.plugin.getValue = function(id) {
  var me = core.plugin;
  if(!me.loaded()){
    return false;
  }
  try {
    return me.jPlug.getValue(id);
  } catch(e) {
    return false;
  }
};

core.plugin.events['onVideoStart'].push(function() {
      analyticsTrackEvent("video/Flashvideo/play/"+core.plugin.getCurrentShow()+encodeURIComponent(neatenTitle(core.plugin.currentPlaying.title)));
    });
core.plugin.events['onAdvertStart'].push(function() {
      analyticsTrackEvent("player/advert/start");
    });
core.plugin.events['onAdvertEnd'].push(function() {
      analyticsTrackEvent("player/advert/end");
    });
core.plugin.events['onFailure'].push(function(error) {
      var publicId=core.plugin.currentPlaying.publicId;
      analyticsTrackEvent("player/failure/"+publicId+"/"+error.code);
    });
core.plugin.events['onVideoChange'].push(core.plugin.onVideoChange);
core.plugin.events['onPlaylistEmpty'].push(core.plugin.onPlaylistEmpty);
core.plugin.events['onFailure'].push(core.plugin.onFailure);
core.plugin.events['onVideoStart'].push(core.plugin.onVideoStart);
core.plugin.events['onVideoEnd'].push(core.plugin.onVideoEnd);
core.plugin.events['muteOnOff'].push(core.plugin.muteOnOff);
core.plugin.events['onReady'].push(function() {analyticsTrackEvent("player/ready"); });
core.plugin.events['onReady'].push(core.plugin.onReady);

core.plugin.fixUpId = function(id) {
  var str=id.substring(id.lastIndexOf('/') + 1, 1000)
  if (str.indexOf('#')>0) {
    str=str.substring(0,str.indexOf('#'));
  }
  return str;
};

window.onbeforeunload=function() {
  if (core.plugin && core.plugin.loaded() && core.plugin.jPlug.currentTime()>0) {
    var d=new Date();
    d.setTime(d.getTime()+60*60*24*7);
    var cookie="replay="+core.plugin.getCurrentShow()+"#"+core.plugin.jPlug.currentTime()+";domain=joost.net;expires="+d.toGMTString();
    document.cookie=cookie;
  }
};

core.plugin.isFullScreen=function() {
  return core.plugin.loaded() && core.plugin.jPlug.fullscreen();
};

core.constructLink=function(publicId) {
  if (!publicId || publicId=="") {
    return false;
  }
  var link="joost:///"+publicId;
  if (window.Page && publicId==Page.publicId) {
    var hash=(''+location.hash).substring(1);
    var start=hash.match(/(?:^|,)(?:start=\d+)/gim);
    if (start) {
      link=link+"#start="+parseInt(start[0].split('=')[1],10);
    }
  } else {
    if (!core.plugin.firstPlay) {
      if (document.cookie.match(/replay=([^;]*)/g)) {
        var str=(RegExp.$1).split('#');
        core.plugin.firstPlay=true;
        var id=str[0];
        if (id==publicId) {
          var loc=str[1];
          link="joost:///"+publicId+"#start="+(Number(loc)*1000);
        }
      }
    }
  }
  return link;
};

core.notifier = {
  msgStack : []
}

core.notifier.addMsg = function(msgObj, optionsObj) {
  if (!optionsObj.duration) {
    optionsObj.duration=10;
  }
  if (optionsObj.duration<4) {
    optionsObj.duration=4;
  }
  this.msgStack.push({msg : msgObj, options : optionsObj});

  if(this.counter) {
    return;
  }

  this.counter = setInterval(function() {
                                if(core.notifier.msgStack.length == 0){
                                  core.notifier.cleanCounter = setTimeout(core.notifier.close, (optionsObj.duration-3)*1000);
                                  clearInterval(core.notifier.counter);
                                  core.notifier.counter = false;
                                  return;
                                }
                                core.notifier.displayMsg();
                            }, 3000);

  core.notifier.displayMsg();

  clearTimeout(core.notifier.cleanCounter);
};

core.notifier.displayMsg = function() {
  var errorHtml = document.getElementById('blockTopError');
  var notificationHTML = document.getElementById('blockTopNotification');

  if(!errorHtml || !notificationHTML){
    return;
  }

  errorHtml.style.display = 'none';
  notificationHTML.style.display = 'none';

  var msgObj = core.notifier.msgStack.shift();
  var msgHTML = (msgObj.options.style == 'error') ? errorHtml : notificationHTML;
  var outElement = msgHTML.getElementsByTagName('div')[0];
  if(msgObj.options.html){
    outElement.innerHTML = '<p>' + msgObj.msg + '</p>';
  } else {
    outElement.innerHTML = '<p>' + escapeHTML(msgObj.msg) + '</p>';
  }
  msgHTML.style.display = 'block';

};

core.notifier.close = function() {
  document.getElementById('blockTopError').style.display = 'none';
  document.getElementById('blockTopNotification').style.display = 'none';
};
var Search={};

var searchPage = {
  api: { search : 'http://search.joost.com/search/select' },
  startPrefix : 0,
  itemsPerPage : 20,
  isNewSearch : true,
  type : 'v',
  defaultSortByField : 'score desc',
  defaultLayoutField : 'list',
  defaultFilters : {
    'runtime':'all', 'category_facet':'all', 'publisher':'all', 'artist_facet':'all',
    'series_facet':'all', 'venue_facet':'all', 'genre_facet':'all',
    'subgenre_facet':'all', 'language_facet':'all' },
  country : undefined,
  syndicated : true,
  audioLanguages : {
    'en' : 'English', 'da':'Danish', 'sv':'Swedish', 'de':'German', 'fr':'French', 'es':'Spanish', 'fi':'Finnish',
    'no':'Norwegian', 'zh':'Chinese', 'it':'Italian', 'nl':'Dutch', 'ja':'Japanese', 'hi':'Hindi', 'pt':'Portuguese'
    }
};

searchPage.sortByField = searchPage.defaultSortByField;
searchPage.layoutField = searchPage.defaultLayoutField;
searchPage.filters = mixin({}, searchPage.defaultFilters);

searchPage.init = function(){
  var me = searchPage;
  me.searchResultsList = byid('searchResultList');
  me.searchSubTitle = byid('searchSubTitle');
  me.userNavigationSearchInput = byid('userNavigationSearchInput');
  me.noResultMsg = byid('searchNoResultMsg');
  me.spellingMsg = byid("searchSpellingMsg");
  me.spellingMsgDiv = byid("searchSpelling");
  me.mainSearchInput = byid('mainSearchInput');
  me.mainSearchType =  byid('mainSearchType');

  if (window.Page && window.Page.searchService) {
    me.api.search=window.Page.searchService;
    me.isNewSearch=window.Page.isNewSearch;
  }

  me._applyHashToFilters();

    if (me.isNewSearch) {
    me.itemsPerPage = searchPage.itemsPerPage;
    me.startPrefix = 1;
    me.type = window.Page.searchType;
  }
  me.playlistBtn = {};
  me.search();
};

searchPage.search = function() {
  var me = searchPage;
  me.category = window.Page.searchCategory;
  me.searchTerms = window.Page.searchTerms;
  me.start = window.Page.searchStart;

  
  me.searchUrl = me.api.search + '?spellcheck=true&json_function=searchPage.handleResponse&q=' + encodeURIComponent(me.searchTerms);
  me.searchLink = '/search?q=' + encodeURIComponent(me.searchTerms);
  me.terms = me.searchTerms;
  me._addFilters();
  
    me._updateInputs();

        var searchStart = Math.max(me.start - me.startPrefix, 1 - me.startPrefix);
  jsonRequest(me.searchUrl + '&start=' + searchStart);
};

searchPage.playSearch = function(link){
  var me = searchPage;
  link.href = "/?playSearch=" + encodeURIComponent(me.searchTerms) + "&filter=" + me.filterStr.replace(/&/g, ',');
  return true;
};

searchPage._addFilters = function() {
  var me = searchPage;
  if (!me.isNewSearch) return;
  var params = [];
  var filter = [];
  var type = me.type == 'c' ? '(channel OR series)' : 'video';
  params.push('fq=type:' + encodeURIComponent(type));
  if (me.sortByField != undefined) {
    params.push('sort=' + encodeURIComponent(me.sortByField));
    filter.push('sort=' + encodeURIComponent(me.sortByField));
  }
  if (me.layoutField != undefined) {
    params.push('layout=' + encodeURIComponent(me.layoutField));
  }
  if (me.country != undefined) {
    params.push('fq=country:' + encodeURIComponent(me.country));
    filter.push('fq=country:' + encodeURIComponent(me.country));
  }
  for (var key in me.filters) {
    var value = me.filters[key];
    if (value != 'all') {
            if (key != 'runtime') value = '"' + value + '"';
      params.push('fq=' + encodeURIComponent(key) + ':' + encodeURIComponent(value));
      filter.push('fq=' + encodeURIComponent(key) + ':' + encodeURIComponent(value));
    }
  }
  params.push('rows=' + searchPage.itemsPerPage);
  if (me.syndicated) {
    params.push('syndicated=true');
      }
  me.filterStr = filter.join('&');
  me.searchUrl = me.searchUrl + '&' + params.join('&');
  me.searchLink = me.searchLink + '&type=' + me.type;
};

searchPage.clear = function() {
  var me = searchPage;
  me.noResultMsg.style.display = (!length) ? 'block' : 'none';
  me.searchResultsList.innerHTML='';
};

searchPage._extractSpellingSuggestion = function(response){
  if(!response.spellcheck || !response.spellcheck.suggestions || !response.spellcheck.suggestions.length)
    return undefined;

  var sugg = response.spellcheck.suggestions;

        for(var i = sugg.length-2; i >= 0; i-=2){
    if(sugg[i] == "collation"){
      return sugg[i+1];
    }
  }
  return undefined;
};

searchPage._getResponseData = function(response) {
  var me = searchPage;
  var r = { result:[], start:1 - me.startPrefix, found:0, qtime:undefined };
  if (me.isNewSearch && response.response) {
    me._updateFilters(response);
    r.results = response.response.docs;
    r.start = response.response.start + 1;
    r.found = response.response.numFound;
    r.end = Math.min(r.start + me.itemsPerPage - 1, r.found);
    r.qtime =  response.responseHeader.QTime / 1000;
    r.spelling = me._extractSpellingSuggestion(response);
  } else if (response.search) {
    r.results = response.search.results;
    r.start = 1 + (parseInt(response.search.start, searchPage.itemsPerPage) || 0);
    r.found = response.search.found;
    r.end = Math.min(r.start + me.itemsPerPage - 1, r.found);
    r.qtime = undefined;
  } else {
      }
  return r;
};

searchPage.handleResponse = function(response) {
  var me = searchPage;
  var r = me._getResponseData(response);
  var length = r.results.length;
  me.noResultMsg.style.display = (!length) ? 'block' : 'none';
  me._toggleSpelling(!length && r.spelling, r.spelling);
  me.searchResultsList.innerHTML='';
  for(var i = 0; i < length; i++){
          r.results[i].publicationDate = r.results[i].issued;
  }
  if (me.layoutField=="list") {
    me.searchResultsList.innerHTML=renderVideoListWide(r.results, [
            {"title": "Add to My Queue", "href": "#", "onclick": "epgPage.addToList(event, 'playlist', '%i', 'video_%i'); return false;", "icon": "miniButtonQueueAdd16","nolabel": "true"},
            {"title": "Add to favorites", "href": "#", "onclick" : "epgPage.addToList(event, 'favorites', '%i', 'video_%i'); return false;", "icon": "miniButtonAddToFavorites16", "nolabel": "true"}
          ]);
  } else {
    me.searchResultsList.innerHTML=renderVideoListWideThumbs(r.results, [
            {"title": "Add to My Queue", "href": "#", "onclick": "epgPage.addToList(event, 'playlist', '%i', 'video_%i'); return false;", "icon": "miniButtonQueueAdd16","nolabel": "true"},
            {"title": "Add to favorites", "href": "#", "onclick" : "epgPage.addToList(event, 'favorites', '%i', 'video_%i'); return false; return false;", "icon": "miniButtonAddToFavorites16","nolabel": "true"}
          ]);
  }
  fixPNG();

  me.updateEpg(r.found, length, me.terms, r.start, r.end, r.qtime);
  me._applyFiltersToHash();
  paginateRender("searchPaginationBottom",
                 r.found,
                 r.start,
                 me.itemsPerPage,
                 "/search?" + "q=" + encodeURIComponent(me.terms) + "&type=" + encodeURIComponent(me.type) + "&start=",
                 "#" + getUrlHash());

};

searchPage._toggleSpelling = function(shown, message){
  var me = searchPage;
  if(shown && message) {
    searchPage.spellingMsg.innerHTML = message;
    searchPage.spellingMsg.href = "/search?" + "q=" + encodeURIComponent(message);
  }
  window[shown ? "show" : "hide"](searchPage.spellingMsgDiv);
};


searchPage.updateEpg = function(found,count,terms,start,end, qtime){
  var me = searchPage;
  if(terms.length > 30) {
    terms = terms.substr(0,30) + '...';
  }

  var status;
  if (found == 0) {
    status = 'We did not find any results for "<strong>' + escapeHTML(terms) + '</strong>"';
      } else {
    status = 'Results ' +
        ((found && found > 0) ? ('<strong>' + start + ' - ' + end + '</strong> of <strong>' + found + '</strong> for "<strong>' + escapeHTML(terms) + '</strong>"') : '');           } 

  me.searchSubTitle.innerHTML = status;
  document.title = 'Search results for "' + terms + '" - Joost';
};

searchPage._updateInputs = function() {
  var me = searchPage;
  if (me.isNewSearch) {
    me.mainSearchInput.value = me.terms;
    me.userNavigationSearchInput.value = '';
  } else {
    me.userNavigationSearchInput.value = me.terms;
  }
}


searchPage.sortBy = function(field) {
  searchPage.sortByField = field;
  window.Page.searchStart = 0;
  searchPage.search();
};

searchPage.layout = function(field) {
  searchPage.layoutField = field;
  searchPage.search();
};

searchPage.filterBy = function(field) {
  var a = /([^:]+):(.+)/.exec(field);   searchPage.filters[a[1]] = a[2];
  window.Page.searchStart = 0;
  searchPage.search();
};

searchPage._updateFilters = function(rsp) {
    var me = searchPage;
    var filtersNode = byid('filters');
    var sortByBlockTop = byid('sortByBlockTop');
    var layoutBlockTop = byid('layoutBlockTop');
    if (rsp.response.docs.length == 0) {
        filtersNode.innerHTML = '&nbsp;';         return;
    }
    var facet_fields = rsp.facet_counts.facet_fields;
    var facet_queries = rsp.facet_counts.facet_queries;

    var sorters = me._createSortOptions(me.sortByField);
    var layout = me._createLayoutOptions(me.layoutField);
    
    var title = "<h2>Narrow results by</h2>";
    var venue = me._createFilter('Venue', 'venue_facet', facet_fields.venue_facet, undefined);
    var genre = me._createFilter('Genre', 'genre_facet', facet_fields.genre_facet, undefined);
    var subgenre = me._createFilter('Sub-genre', 'subgenre_facet', facet_fields.subgenre_facet, undefined);
    var publisher = ''; 
        var isMusicSelected = (me.filters['venue_facet'].toLowerCase() == 'music');
    var artist = ( isMusicSelected ? me._createFilter('Artist', 'artist_facet', facet_fields.artist_facet, undefined) : '');
    var language = me._createFilter('Language', 'language_facet', facet_fields.language_facet, me.audioLanguages);
    var series = me._createFilter('Series', 'series_facet', facet_fields.series_facet, undefined);
    var runtime = me._createRuntimeFilter(facet_queries);
    filtersNode.innerHTML = [title, venue, genre, subgenre, publisher, series, artist, language, runtime].join('');
    //sortByBlockTop.innerHTML = sorters;

    var type = me.type == 'c' ? 'channel' : 'video';
    if (type=="video") {
      sortByBlockTop.innerHTML = me._createPlayAll();
    } else {
      sortByBlockTop.innerHTML = "";
    }
    layoutBlockTop.innerHTML = '<p class="floatRight">' + sorters + layout + '</p>';
};

        
searchPage._createPlayAll = function(sort_key) {
    return '<p class="buttons floatLeft"><a class="actionButton miniButtonPlayAll16" title="Play Search" onclick="return searchPage.playSearch(this);" href="#">' +
           '<img alt="Play Search" src="/static/transparent.gif"/><span class="label labelImage">Play All</span>' +
           '</a></p>';
};

searchPage._createSortOptions = function(sort_key) {
    var me = searchPage;
    var isVideoSelected = (me.type == 'v');
    var isSeriesSelected = (me.filters['series_facet'] != 'all');
    return ['Sort by: <select id="sortBy" onchange="searchPage.sortBy(this.value)" style="margin: 0 30px 0 0;">',
                me._createSortOption('mostRecent desc', 'Most Recent', sort_key),
        isSeriesSelected ? me._createSortOption('episode asc', 'Episode: First to last', sort_key) : '',
        isSeriesSelected ? me._createSortOption('episode desc', 'Episode: Last to first', sort_key) : '',
        isVideoSelected ? me._createSortOption('duration desc', 'Duration: Longest first', sort_key) : '',
        isVideoSelected ? me._createSortOption('duration asc', 'Duration: Shortest first', sort_key) : '',
        me._createSortOption('score desc', 'Relevance', sort_key),
        '</select>'].join('');
}

searchPage._createSortOption = function (key, label, current_key) {
    return [
    '<option value="', key, '"',
    (key == current_key ? ' selected' : ''),
    '>', label, '</option>' ].join('');
}

searchPage._createLayoutOptions = function(layout_key) {
    var me = searchPage;
    var layout;

    return ['<span class="buttons">View:',
        searchPage._createLayoutOption('list', 'imageButtonsViewmodeList', 'Show as a list', layout_key),
        searchPage._createLayoutOption('thumbnail', 'imageButtonsViewmodeThumbs', 'Show as thumbnails', layout_key),
        '</span>'].join('');
}

searchPage._createLayoutOption = function (key, layoutClassName, label, current_key) {
    return [' <a title="', label ,'" class="imageButtons ', layoutClassName , (key == current_key ? 'Selected' : ''),
        '" onclick="searchPage.layout(\'', key, '\'); return false;" href="#"><img alt="', label ,'" src="/static/transparent.gif"/></a> '].join('');
}


searchPage._createFilterItem = function(id, selected, value, count) {
    return ['<dd id="', id, '"><a href="#" ', ( id == selected ? 'class="selected"' : ''),
        ' title="Refine by \'', escapeHTML(value),  '\'"',
        ' onclick="searchPage.filterBy(this.parentNode.id); return false;">',
        id == selected ? '&#187;&#160;' : '',
        value, '</a>', count == undefined ? '' : (' (' + count + ')'), '</dd>'].join('');
}

searchPage._createRuntimeFilter = function(facet_queries) {
    var is_empty = true;      var me = searchPage;
    var runtime = '<dl><dt>&#9660; Duration</dt>';
    var runtime_keys = ['runtime:[* TO 5]', 'runtime:[6 TO 20]', 'runtime:[21 TO 40]', 'runtime:[41 TO *]'];
    var runtime_values = ['< 5 min', '5-20 min', '20-40 min', '> 40 min'];
    runtime += me._createFilterItem('runtime:all', 'runtime:' + me.filters['runtime'], 'All', undefined);
    for (i = 0; i < runtime_keys.length; i++) {
        var key = runtime_keys[i];
        if (facet_queries[key] != 0) {
            is_empty = false;
            runtime += me._createFilterItem(key, 'runtime:' + me.filters['runtime'], runtime_values[i], facet_queries[key]);
        }
    }
    runtime += '</dl>';
    return is_empty ? '' : runtime;
}

searchPage._createFilter =  function(title, modifier, field, mapping) {
    if (!field || field.length == 0) {
        return '';
    }
                    var selected = modifier + ':' + searchPage.filters[modifier];
    var data = ['<dl><dt>&#9660; ',  title, "</dt>"];
    data[data.length] = searchPage._createFilterItem(modifier + ':all', selected, 'All', undefined);
    for (var i = 0; i < field.length; i += 2) {
        var key = field[i];
        var label = mapping == undefined ? key.replace(/_/g, ' ') : mapping[key];         if (label == undefined) continue;         data[data.length] = searchPage._createFilterItem(modifier + ':' + key, selected, label, field[i + 1]);
    }
    data[data.length] = '</dl>';
    return data.join('');
}

searchPage._applyHashToFilters = function() {
  var vals = hashAsObj();
  var me = searchPage;
  if(vals["sortby"]) me.sortByField = vals["sortby"];
  if(vals["layout"]) me.layoutField = vals["layout"];

  var filters = me.filters;
  var defs = me.defaultFilters;
  for(var x in defs){
    if(vals[x] && (vals[x] !== defs[x])) filters[x] = vals[x];
  }

};

searchPage._applyFiltersToHash = function() {
  var qs = [];

  if(searchPage.sortByField !== searchPage.defaultSortByField){
    qs[qs.length] = "sortby=" + encodeURIComponent(searchPage.sortByField);
  }
  if(searchPage.layoutField !== searchPage.defaultLayoutField){
    qs[qs.length] = "layout=" + encodeURIComponent(searchPage.layoutField);
  }

  var filters = searchPage.filters;
  var defFilters = searchPage.defaultFilters;

  for(var x in filters){
    if(filters[x] !== defFilters[x]){
      qs[qs.length] = encodeURIComponent(x) + "=" + encodeURIComponent(filters[x]);
    }
  }
        window.location.hash = "#" + qs.join("&");

};

var Ads={ promoId:undefined};
Ads.onVideoChange=function() {
  var id = core.plugin.getCurrentShow();
  if (Ads.promoId=="") {
    Ads.promoId=id;
  } else {
    if (id!="" && Ads.promoId != id && !core.plugin.isFullScreen()) {
      Ads.promoId=id;
      var el=window.frames['promo_300x250'];
      if (el) {
        var rndNum=""+Math.floor(Math.random()*100000000)+"00000000";
        rndNum=rndNum.substr(0,8);
        el.location="http://2775c.v.fwmrm.net/ad/g/1?nw=10101&pvrn="+rndNum+"&csid=promo_300x250&resp=ad;;ptgt=s&envp=g_iframe&slid=promo_300x250&w=300&h=250";
      }
    }
  }
}
if (window.core && core.plugin && core.plugin.events) {
  core.plugin.events['onVideoChange'].push(Ads.onVideoChange);
}

var coreAdverts = {};

coreAdverts.init = function() {
  if(!core || !core.plugin) {
    return;
  }
  
  core.plugin.events['onVideoChange'].push(function(){ coreAdverts.setDefaultAdvert()});
  core.plugin.events['onAdvertStart'].push(function(){ coreAdverts.setDefaultAdvert()});
  core.plugin.events['onCompanionAd'].push(function(){ coreAdverts.onCompanionAd(arguments[0])});
  core.plugin.events['onAdvertEnd'].push(function(){coreAdverts.onAdvertEnd()});
  core.plugin.events['onOverlayEnd'].push(function(){coreAdverts.onAdvertEnd()}); // nothing different done on overlay end as advert end.
  
  if (!window.flashElementsOnPage) {
    window.flashElementsOnPage=["companionAdvert"];
  } else {
    window.flashElementsOnPage.push("companionAdvert");
  }
};

coreAdverts.onCompanionAd = function(advertObj){
  var me = coreAdverts;
  me.currentAdvertObj = advertObj;
  coreAdverts.onShowAdvert();
}

coreAdverts.setDefaultAdvert = function() {
  coreAdverts.currentAdvertObj = { adURL : "/static/flash/sponsorImage.jpg", resourceType : ''};
};

coreAdverts.onAdvertEnd = function(){
  var htmlAdvert =  byid('companionAdvert');
  if(!htmlAdvert){
    return;
  }
  htmlAdvert.style.display = "none";
  var iframes=htmlAdvert.getElementsByTagName("iframe");
  coreAdverts.onCloseAdvert();
  for (var i=0;i<iframes.length;i++) {
    iframes[i].parentNode.removeChild(iframes[i]);
  }
};

coreAdverts.onCloseAdvert = function(){
  var flashZapper = byid('FlashZapper'); 
  var htmlAdvert = byid('companionAdvert');
  if(!htmlAdvert || !flashZapper) {
    return;
  }
  htmlAdvert.style.display = "none";
  flashZapper.style.height = "360px";
};

coreAdverts.onShowAdvert = function() {
  var me = coreAdverts;
  var flashZapper = byid('FlashZapper');
  var htmlAdvert = byid('companionAdvert');
  if(!flashZapper || !htmlAdvert) {
    return;
  }
  
  flashZapper.style.height = "40px";
  htmlAdvert.style.display = "block";

  var resourceType = me.currentAdvertObj.resourceType;
  var adURL = me.currentAdvertObj.adURL, ctURL = me.currentAdvertObj.ctURL;
  if(typeof(resourceType) == 'string' && resourceType.indexOf('application/') != -1) {
    ctURL = escape(ctURL);
    me.loadIframeContent('<script type="text/javascript" src="/swfobject.js"></script><div id="fA">' + 
                         '</div><script type="text/javascript"> window.onload = function() {if(window.swfobject) window.swfobject.embedSWF("' + adURL + 
                         '", "fA", "300", "250", "8.0.0","", {clickTag: "' + ctURL +
                         '", clickTAG:"' + ctURL + '", clicktag :"' + ctURL + '"}, {allowscriptaccess:"always", quality:"high"});}</script>');
  } else if(typeof(resourceType) == 'string' && (resourceType.match(/(static)|(img)|(png)|(gif)|(jpg)|(jpeg)/i) != null || resourceType.indexOf('image/') != -1)) {
    me.loadIframeContent(["<a target='_blank' href='", ctURL,"'><img style='visibility:hidden;border:0px;' onload='this.style.visibility=\"visible\"' src='", adURL ,"'></a>"].join(''))
  } else if(typeof(resourceType) == 'string' &&  (resourceType=="text/html_doc_lit_ns_wc_fw" || adURL.match(/^((http)|(\/static))/i) == null) ){
    me.loadIframeContent(adURL);
  } else {
    me.loadIframeContent("<a><img style='visibility:hidden;border:0px;' onload='this.style.visibility=\"visible\"' src='/static/flash/sponsorImage.jpg'></a>")
  }
};

coreAdverts.loadIframeContent = function(content) {
  var iframeParent = byid('companionAdvert');
  if(!iframeParent) {
    return;
  }
  var iframes=iframeParent.getElementsByTagName("iframe");
  if (iframes.length!=0) {
    for (var i=0;i<iframes.length;i++) {
      iframes[i].parentNode.removeChild(iframes[i]);
    }
  }
  var divWraper=document.createElement('div');
  divWraper.style.marginTop="20px";
  divWraper.style.marginLeft="10px";
  
  var iframeHTML=document.createElement('iframe');
  iframeHTML.frameBorder=0;
  iframeHTML.scrolling="no";
  iframeHTML.style.border="0px none";
  iframeHTML.style.height="250px";
  iframeHTML.style.width="300px";
  iframeHTML.style.marginTop="20px";
  iframeHTML.style.marginLeft="10px";
  iframeParent.appendChild(iframeHTML); 
  content = '<html><head><title>Advertisement</title><head>' + 
            '<body marginwidth="0" marginheight="0" topmargin="0" leftmargin="0">'+content+'</body></html>';
  iframeHTML.contentWindow.document.open();
  iframeHTML.contentWindow.document.write(content);
  iframeHTML.contentWindow.document.close();
};

coreAdverts.init();
var PageShows={};
var loaderDataCallback=[];
var currentLoader={};
var currentRandomType="";
var RandomAccessCount=0;
var Lists={};
var oldLists={};
var playableList="";
var playlistRemoveAll='/api/playlist/remove/?remove=all&json_function=loaderDataCallback.a%c';
Loader={ metadataProvider:'/api/metadata/get/%i?json_function=loaderDataCallback.a%c',
         featured:'/api/featured/fav/get?json_function=loaderDataCallback.a%c',
         favorites:'/api/favorites/get?json_function=loaderDataCallback.a%c',
         playlist:'/api/playlist/get?json_function=loaderDataCallback.a%c',
         popular:'/api/feeds/popular?json_function=loaderDataCallback.a%c',
         recent:'/api/feeds/recent?json_function=loaderDataCallback.a%c',
         random:'http://search.joost.com/search/select?spellcheck=false&sort=random%r%20asc&rows=18&%f&json_function=loaderDataCallback.a%c&fq=type%3Avideo',
         favorites_friend:'/api/favorites/get/%j/?json_function=loaderDataCallback.a%c',
         playlist_name:'/api/userPlaylist/get?playlistName=%n&json_function=loaderDataCallback.a%c',
         playlist_friend_name:'/api/userPlaylist/get/%j/?playlistName=%n&json_function=loaderDataCallback.a%c',
         list:'http://search.joost.com/search/select?spellcheck=false&sort=random%r%20asc&rows=18&json_function=loaderDataCallback.a%c',
         search:'http://search.joost.com/search/select?spellcheck=false&q=%q&rows=25&json_function=loaderDataCallback.a%c&fq=type%3Avideo&'
};


function accessContent(publicId,listId,sublistId) {
  if (listId=="playlist" && sublistId=="clear") {
    var index=loaderDataCallback.length;
    loaderDataCallback.push(true);
    loaderDataCallback['a'+index]=function(response) { 
      Lists["playlist"]=null;
      var listObj={success:false,id:"playlist",entries :[],listTitle:""};
      var el=document.getElementById('FlashZapper');
      if (el) {
        el.showContent(listObj);
      }
    };
    if (window.User && !User.loggedIn) {
        User.promptForLogin('<h1>To use queue or favorites, you must be logged in</h1>');
        return;
    }
    var url=playlistRemoveAll.replace(/%c/gm,index);
    jsonRequest(url);
    return;
  }
  
  var channelId;
  if (!publicId) {
    if (listId=="random") {
                              if (RandomAccessCount==0) {
        Lists["random"]=null;
        RandomAccessCount=1;
      } else {
        RandomAccessCount=0;
      }
    } else {
      Lists["random"]=null;
    }
    if (listId=="channel") {
      var curGrp=core.plugin.getCurrentGroup();
      if (curGrp.name=="channel") {
        channelId=curGrp.id;
      } else {
        var entryId=core.plugin.getCurrentShow();
        if (entryId!="") {
          var entry=PageShows[entryId];
          if (entry) {
            if (entry.channels.length>0) {
              channelId=entry.channels[0].publicId;
            }
          } else {
            if (entryId==Page.publicId) {
              channelId=Page.channelId;
            }
          }
        } else {
          entryId=Page.publicId;
        }
        if (!channelId) {
          channelId=Page.channelId;
        }
      }
      if (channelId) {
        if (Lists["channel"] && Lists["channel"].publicId) {
          var el=document.getElementById('FlashZapper');
          if (el) {
            el.showContent(Lists[listId]);
          }
          return;
        }
        getZapperData('channel',channelId);
      } else {
          loaderDataCallback.push(true);
          var listObj=singleShowListObject(entryId);
          Lists["channel"]=listObj;
          if (listObj) {
            var el=document.getElementById('FlashZapper');
            if (el) {
              el.showContent(listObj);
          }
        } else {
          if (Lists["channel"]) {
            var el=document.getElementById('FlashZapper');
            if (el) {
              el.showContent(Lists[listId]);
            }
          }
        }
      }
    } else {
      if (Lists[listId]) {
          currentLoader.type = listId;
          var el=document.getElementById('FlashZapper');
          if (el) {
            el.showContent(Lists[listId]);
          }
      } else {
        if (listId=="playlist" || listId=="favorites") {
          if (window.User && !User.loggedIn) {
            var el=document.getElementById('FlashZapper');
            if (el) {
              listObj={success:false,id:listId,entries :[]}
              el.showContent(listObj);
              el.showCategory("featured");
            }
            User.promptForLogin('<h1>To use queue or favorites, you must be logged in</h1>');
            return;
          }
        }
        getZapperData(listId,sublistId);
      }
    }
  } else {
    if (Page.redirectPlays) {
      location="/"+publicId;
      return;
    }
    playFromZapper(publicId,listId);
  }
  return false;
}

function getChannelForShowZapperData(type,channelId,playImmediate,publicId,joostName,playlistName) {
  var index=loaderDataCallback.length;
  loaderDataCallback.push(true);
  loaderDataCallback['a'+index]=function(response) { 
    if (response.success && response.entry) {
      if (response.entry.channels && response.entry.channels.length>0) {
        var newChannelId=response.entry.channels[0].publicId;
        getZapperData(type,newChannelId,playImmediate,publicId,joostName,playlistName);
        return;
      }
      PageShows[response.entry.publicId]=response.entry; 
      var listObj=singleShowListObject(response.entry.publicId);
      if (listObj) {
                var el=document.getElementById('FlashZapper');
        if (el) {
          el.showCategory("channel");
          el.showContent(listObj);
        }
        var playlist={playingList:listObj.entries,id:"channel"};
        if (!core.plugin.playList(playlist)) {
          core.plugin.triggerEvent("onFailure",50004);
        }
      }
    } else {
      // failed to get the show.
      core.plugin.triggerEvent("onFailure",50005);
    }
  };
  var url=Loader.metadataProvider.replace(/%i/gm,publicId).replace(/%c/gm,index);
  if (window.MetadataRoot) {
    url=window.MetadataRoot+url;
  }
  jsonRequest(url);
}

function getZapperData(type,channelId,playImmediate,publicId,joostName,playlistName) {
  analyticsTrackEvent("loader/"+type+"/"+channelId+"/"+playImmediate+"/"+publicId);
  if (!type || type=="" && playImmediate) {
    if (publicId && publicId!=-1) {
      type="channel";
    } else {
      type="featured";
    }
  }
  if (!playImmediate && currentLoader.type==type) {
        if (currentLoader.channelId==channelId) {
      return;
    }
  }
  currentLoader={type:type,channelId:channelId};
  if (type=='channel') {
    if (channelId==-1) {
      getChannelForShowZapperData(type,channelId,playImmediate,publicId,joostName,playlistName);
      return;
    }
    var url=Loader.metadataProvider.replace(/%i/gm,channelId);
  } else {
    var urlP=Loader[type];
    if (urlP) {
      url=urlP;
      if (type.indexOf('_')) {
        url=url.replace(/%j/gm,joostName).replace(/%n/gm,playlistName);
      }
    }
  }
  if (url) {
    var index=loaderDataCallback.length;
    loaderDataCallback.push(true);
    loaderDataCallback['a'+index]=function(response) { loaderDataCallbackFn(index,type,response,playImmediate,publicId,channelId); };
    if (type=='random') {
      var randomType=channelId;
      if (randomType=="roll") {
        randomType=currentRandomType;
      }
      currentRandomType=randomType;
      var facet="";
      if (randomType) {
        facet="fq="+encodeURIComponent('venue_facet:"'+randomType+'"');
      }
      url=url.replace(/%f/gm,facet);
    }
    if (type=='random' || type=='list') {
      url=url.replace(/%r/gm,Math.random());
    }
    if (type=='search') {
      url=url.replace(/%q/gm,channelId);
    }
    url=url.replace(/%c/gm,index);
    if (window.MetadataRoot && url.indexOf(':')<0) {
      url=window.MetadataRoot+url;
    }
    jsonRequest(url);
  } else {
    // unknown type being requested
    core.plugin.triggerEvent("onFailure",50003);
  }
}

function loaderDataCallbackFn(index,type,response,playImmediate,publicId,channelId) {
  var sendToZapper=(index==loaderDataCallback.length-1) || playImmediate;
  var listObj; var addedEntry=[];
  
  //fix up search
  if (response.response) {
    response=response.response;
    response.success=response.numFound>0;
    response.entries=response.docs;
  }
  if (type=='channel' || type=='video') {
    listObj=response.entry;
    listObj.entries=listObj.shows;
    listObj.channelId=listObj.publicId;
    listObj.id='channel';
    if (type=='channel') {
      listObj.listTitle="Channel: "+listObj.title;
    }
    PageShows[listObj.publicId]=listObj;
  } else {
    listObj=response;
    listObj.id=type;
  }
    if (type.indexOf('_')>0) {
    type="list";
    listObj.id=type;
        publicId=listObj.entries[0].publicId;
  }
  if (type=="random") {
    listObj.randomType=channelId;
    currentLoader.channelId="";
  }

  var oldList=oldLists[type];
  if (oldList && oldList.entries) {
      var oldEntries = oldList.entries;
      if (listObj.entries.length>0) {
           for(entry in listObj.entries){
           var chk = true;
               for(var i=0;i<oldEntries.length && chk;i+=1) {
                   if(listObj.entries[entry].publicId==oldEntries[i].publicId) {
                        chk=false;
                        break;
                   }
               }
          if(chk)
          addedEntry.push(listObj.entries[entry]);
          };
      }
  }
  
  Lists[type]=listObj;
  if (listObj && sendToZapper) {
    var el=document.getElementById('FlashZapper');
    if (el) {
      if (el.showCategory) {
        el.showCategory(type);
      }
      if (el.showContent) {
        el.showContent(listObj);
      }  
    }
  }
  
  if (playImmediate) {
    if (listObj.entries.length>0) {
      Lists[type]=listObj;
      playFromZapper(publicId,type);
    } else {
        if (type!="featured") {
        playFromZapper(undefined,"featured");
      } else {
        playFromZapper(undefined,"random");
      }
    }
  } else if (listObj.entries.length>0 && playableList == type) {
      if(addedEntry && addedEntry.length>0) {
          core.plugin.appendEntries(addedEntry);
      }
  }
}

function singleShowListObject(id) {
  if (!id) {
    return null;
  }
  if (PageShows[id]) {
    var show=PageShows[id];
  } else {
    if (id==Page.publicId) {
      show={ type:"video",publicId:id,title:Page.title,description:Page.description,thumbnail:Page.thumbnail,listTitle:"" };
    }
  }
  if (show) {
    return {success:true,id:"channel",entries :[ show ],listTitle:"",channelId:id};
  }
  return null;
}

function playFromZapper(publicId,listId,random) {
  var listObj=Lists[listId];
  playableList = listId;
  if (listObj && listObj.entries) {
    var found=false;
    var entries=listObj.entries;
    var length=entries.length;
    if (!publicId || publicId==-1 && length>0) {
      if (random) {
         entries.sort(function() { return Math.random()-0.5; });
      }
      var playlist={playingList:entries,id:listId};
      if (listId=="channel") {
        playlist.channelId=listObj.channelId;
      }
      if (!core.plugin.playList(playlist)) {
        core.plugin.triggerEvent("onFailure",50004);
      };
      return;
    }
    for (var i=0;i<length;i++) {
      var item=listObj.entries[i];
      if (item.publicId==publicId) {
        if (item.type && item.type!="video") {
          location="/?playNow="+publicId;
          return;
        }
        var playlist={playingList:listObj.entries.slice(i,length),id:listId}
        if (listId=="channel") {
          playlist.channelId=listObj.channelId;
        }
        core.plugin.playList(playlist);
        return;
      }
    }
    if (publicId) {
      var showList=singleShowListObject(publicId);
      if (showList) {
        if (!core.plugin.playList(showList)) {
          core.plugin.triggerEvent("onFailure",50004);
        }
        return;
      } else {
        if (length>0) {
          var playlist={playingList:listObj.entries,id:listId}
          core.plugin.playList(playlist);
          return;
        }
      }
    }
        core.plugin.triggerEvent("onFailure",50001);
  } else {
    if (Loader[listId]) {
      getZapperData(listId,-1,true,-1);
    } else {
      core.plugin.triggerEvent("onFailure",50002);
    }
  }
}

Loader.clearZapper=function(list) {
  var listObj=Lists[list];
  oldLists[list]=listObj;
  Lists[list]=false;
  var el=document.getElementById('FlashZapper');
  
  if (el) {
    if (el.getZapperCurrentCategory()==list) {
      currentLoader.type=null;
      el.showCategory(list);
    }
  }
  
};

function searchInputProxy(searchTerm,playImmediate) {
  getZapperData("search",encodeURIComponent(searchTerm),playImmediate);
}

function replayRandom() {
  var index=loaderDataCallback.length;
  loaderDataCallback.push(true);
  loaderDataCallback['a'+index]=function(response) { loaderDataCallbackFn(index,"random",response,true); };
  var url=Loader["random"].replace(/%c/gm,index).replace(/%r/gm,Math.random());
  var facet="";
  var randomType=currentRandomType;
  if (randomType) {
    facet="fq="+encodeURIComponent('venue_facet:"'+randomType+'"');
  }
  url=url.replace(/%f/gm,facet);
  currentLoader={type:"random",channelId:randomType};
  jsonRequest(url);
}
