/* ################################################################# */
/*                                                                   */
/*  TITLE:        NBC_SLIDESHOW.JS                                   */
/*  VERSION:      1.06                                               */
/*  LAST UPDATED: 2009/11/04                                     */
/*  UPDATED BY:   Viktoriya Eremeeva                                    */
/*    @release 2009-11-19 vicky                                   */

/*  NAMESPACE: SS                                                    */
/*                                                                   */
/*  PUBLIC FUNCTIONS:                                                */
/*    initializeSlideshow()                                          */
/*    handleNavPrevClick()                                           */
/*    handleNavNextClick                                             */
/*    handlePrevThumbSetClick                                        */
/*    handleNextSetClick                                             */
/*    handleThumbClick                                               */
/*    autoAdvanceSlide()                                             */
/*    replaySlideshow()                                              */
/*    resetInterval()                                                */
/*    startAutoplay()                                                */
/*    toggleAutoplay()                                               */
/*    killInterval()                                                 */
/*    togglePrevButtonState()                                        */
/*                                                                   */
/*  PRIVATE FUNCTIONS:                                               */
/*    setupButtons()                                                 */
/*    updateSlide()                                                  */
/*    doScroll()                                                     */
/*    checkThumbNavStatus()                                          */
/*    manageSlideImages()                                            */
/*    showFinalSlide()                                               */
/*    restartAutoplay()                                              */
/*    stopAutoplay()                                                 */
/* 	  nextUp()		                                                 */
/* 	  nssCountDown()                                                 */
/*    nssStopCountDown()											 */
/*                                                                   */
/*  PREREQUISTES:                                                    */
/*    U.$()                                                          */
/*    U.getElementsByClassName()                                     */
/*    U.toggleClass()                                                */
/*    U.addEvent()                                                   */
/*    U.preloadImages()                                              */
/*    rf.AdFrameRefresher()                                          */
/*                                                                   */
/* ################################################################# */

(function() {

if(!window.SS) {
  window['SS'] = {};
}
else {
  return false;
}

var NUM_VISIBLE_THUMBS   = 3;      // the number of thumbs visible in the filmstrip scroll window
var INTERVAL_DURATION    = 20000;  // the delay in ms before the autoplay begins when autoplay is set to begin automatically
var INTERVAL_DURATION_2  = 9000;   // the delay in ms between each successive autoplay advance

  // thumbs constructor; defined in script in nbc_slideshow_resize
var thumbs = new Array();
window['SS']['thumbs'] = thumbs;

var numSlides;
var currentSlideIdx;
var firstVisibleThumbIdx;
var numSlidesDisplayed;
var arrLoadedSlideImages;
var playing;
var timerAP;
var nextSlideIdx;
var finalSlideActive;
var stoppedAtEnd;
var nextCountDown;

function initializeSlideshow() {
    //G.outputDebug2("initializeSlideshow");
  thumbs = U.getElementsByClassName("ssThumb","a",U.$("ssThumbs"));
  numSlides = thumbs.length;
  currentSlideIdx = firstVisibleThumbIdx = numSlidesDisplayed = 1;
  arrLoadedSlideImages = new Array(numSlides);
  setupButtons();
  playing          = false;
  finalSlideActive = false;
  stoppedAtEnd     = false;
  nextCountDown    = false;
  if(U.$("apPlayPauseButton").className == "playing") {
    playing = true;
  }
  doScroll();
    //G.outputDebug2("initializeSlideshow; playing: " + playing);
  if(playing) {
    timerAP = setInterval("SS.startAutoplay()", INTERVAL_DURATION);
  }
}
window['SS']['initializeSlideshow'] = initializeSlideshow;

function setupButtons() {
    // This must be external to any class (none here) and repeated after every user interaction
    // because FF misindexes anchors in the DOM tree when links are added and removed in captions.
    // We us jquery for simplicity because IE uses a non-standard event model.
    // It is safe to remove event listeners even if the event listener has not yet been associated
    //G.outputDebug2("setupButtons");
    // setup a simple prev click
  $('#ssNavPrevLink').unbind('click', SS.handleNavPrevClick);
  $('#ssNavPrevLink').bind('click', SS.handleNavPrevClick);
    // setup a simple next click
  $('#ssNavNextLink').unbind('click', SS.handleNavNextClick);
  $('#ssNavNextLink').bind('click', SS.handleNavNextClick);
    // setup all set prev clicks
  $('#ssPrevThumbSetLink').unbind('click', SS.handlePrevThumbSetClick);
  $('#ssPrevThumbSetLink').bind('click', SS.handlePrevThumbSetClick);
    // setup all set next clicks
  $('#ssNextThumbSetLink').unbind('click', SS.handleNextThumbSetClick);
  $('#ssNextThumbSetLink').bind('click', SS.handleNextThumbSetClick);
    // setup all thumb clicks
  $('#ssThumbs a').each(function() {
    $(this).unbind('click', SS.handleThumbClick);
    $(this).bind('click', SS.handleThumbClick);
  });
}

  // handle a simple prev click
function handleNavPrevClick(e) {
    //G.outputDebug2("handleNavPrevClick");
  currentSlideIdx == 1 ? nextSlideIdx = numSlides : nextSlideIdx = currentSlideIdx - 1;
  if(playing) {
    resetInterval();
  }
  updateSlideOnClick(true);
  return false;
}
window['SS']['handleNavPrevClick'] = handleNavPrevClick;
  
  // handle a simple next click
function handleNavNextClick(e) {
    //G.outputDebug2("handleNavNextClick");
  if(currentSlideIdx == numSlides) {
    showFinalSlide();
  }
  else {
    if(playing) {
      resetInterval();
    }
    nextSlideIdx = currentSlideIdx + 1;
    updateSlideOnClick(true);
  }
  return false;
}
window['SS']['handleNavNextClick'] = handleNavNextClick;

  // handle set prev
function handlePrevThumbSetClick(e) {
    //G.outputDebug2("handlePrevThumbSetClick");
  if(firstVisibleThumbIdx > NUM_VISIBLE_THUMBS) {
    firstVisibleThumbIdx -= NUM_VISIBLE_THUMBS;
  }
  else {
    firstVisibleThumbIdx = 1;
  }
  if(playing) {
    resetInterval();
  }
  doScroll();
  return false;
}
window['SS']['handlePrevThumbSetClick'] = handlePrevThumbSetClick;

  // handle set next
function handleNextThumbSetClick(e) {
    //G.outputDebug2("handleNextThumbSetClick");
  if(firstVisibleThumbIdx + NUM_VISIBLE_THUMBS < numSlides - NUM_VISIBLE_THUMBS + 1) {
    firstVisibleThumbIdx += NUM_VISIBLE_THUMBS;
  }
  else {
    firstVisibleThumbIdx = numSlides - NUM_VISIBLE_THUMBS + 1;
  }
  if(playing) {
    resetInterval();
  }
  doScroll();
  return false;
}
window['SS']['handleNextThumbSetClick'] = handleNextThumbSetClick;

  // handle all thumb clicks
function handleThumbClick(e) {
    //G.outputDebug2("handleThumbClick");
    // get the slide number from the anchor's parent's id, which must be formatted like [sometext]_[someint]
  nextSlideIdx = parseInt(U.$(this).parentNode.getAttribute('id').split('_')[1]);
  if(finalSlideActive) {
    replaySlideshow(nextSlideIdx);
  }
  else {
    if(playing) {
      resetInterval();
    }
    updateSlideOnClick(true);
  }
  return false;
}
window['SS']['handleThumbClick'] = handleThumbClick;

function doScroll() {
    //G.outputDebug2("doScroll");
  $('#ssThumbSetMask').scrollTo($('#ssThumb_' + firstVisibleThumbIdx), 800, {axis:'x'});
  checkThumbNavStatus();
  manageSlideImages();
}

function updateSlide(adrefresh) {
    //G.outputDebug2("updateSlide");
  G.doPixelTracking(84, true);
  numSlidesDisplayed++;
  var currentNodeID = "ssThumb_" + currentSlideIdx;
  var nextNodeID    = "ssThumb_" + nextSlideIdx;
  U.toggleClass(currentNodeID, "selected");
  U.toggleClass(nextNodeID, "selected");
  U.$("ssSlide").style.cssText = "background-image:url(" + SS.thumbs[nextSlideIdx.toString()].fullImage + ");"; // we use this cssText method since setAttribute cannot be used for style in IE
  U.$("slideCredit").innerHTML = SS.thumbs[nextSlideIdx.toString()].credit;
  U.$("ssSlideCaption").innerHTML = SS.thumbs[nextSlideIdx.toString()].caption;
  U.$("slideCount").innerHTML = "Image " + nextSlideIdx + " of " + numSlides;
    // if we are leaving the first slide
  if(currentSlideIdx == 1) {
    togglePrevButtonState();
  }
  currentSlideIdx = nextSlideIdx;
  arrLoadedSlideImages[currentSlideIdx] = true;
    // if we are returning to the first slide
  if(currentSlideIdx == 1) {
    firstVisibleThumbIdx = 1;
    togglePrevButtonState();
  }
  else if(currentSlideIdx == numSlides) {
    firstVisibleThumbIdx = numSlides - NUM_VISIBLE_THUMBS + 1;
    
    
  }
  else {
    firstVisibleThumbIdx = (currentSlideIdx - Math.floor(NUM_VISIBLE_THUMBS/2));
  }
  doScroll();
    // refresh ads
  if(numSlidesDisplayed % 2 == 1 || adrefresh) {
    var rf = new NBC.Helpers();
    rf.AdFrameRefresher("#nbc_ad_970_66_iframe");
    rf.AdFrameRefresher("#nbcad_300x250_iframe");
  }
  setupButtons(); // this is necessary for FF only because of a weird internal FF bug encountered when a caption contains a link
}

function updateSlideOnClick(adrefresh) {
    //G.outputDebug2("updateSlide");
  G.doPixelTracking(51, true);
  numSlidesDisplayed++;
  var currentNodeID = "ssThumb_" + currentSlideIdx;
  var nextNodeID    = "ssThumb_" + nextSlideIdx;
  U.toggleClass(currentNodeID, "selected");
  U.toggleClass(nextNodeID, "selected");
  U.$("ssSlide").style.cssText = "background-image:url(" + SS.thumbs[nextSlideIdx.toString()].fullImage + ");"; // we use this cssText method since setAttribute cannot be used for style in IE
  U.$("slideCredit").innerHTML = SS.thumbs[nextSlideIdx.toString()].credit;
  U.$("ssSlideCaption").innerHTML = SS.thumbs[nextSlideIdx.toString()].caption;
  U.$("slideCount").innerHTML = "Image " + nextSlideIdx + " of " + numSlides;
    // if we are leaving the first slide
  if(currentSlideIdx == 1) {
    togglePrevButtonState();
  }
  currentSlideIdx = nextSlideIdx;
  arrLoadedSlideImages[currentSlideIdx] = true;
    // if we are returning to the first slide
  if(currentSlideIdx == 1) {
    firstVisibleThumbIdx = 1;
    togglePrevButtonState();
  }
  else if(currentSlideIdx == numSlides) {
    firstVisibleThumbIdx = numSlides - NUM_VISIBLE_THUMBS + 1;
    
    
  }
  else {
    firstVisibleThumbIdx = (currentSlideIdx - Math.floor(NUM_VISIBLE_THUMBS/2));
  }
  doScroll();
    // refresh ads
  if(numSlidesDisplayed % 2 == 1 || adrefresh) {
    var rf = new NBC.Helpers();
    rf.AdFrameRefresher("#nbc_ad_970_66_iframe");
    rf.AdFrameRefresher("#nbcad_300x250_iframe");
  }
  setupButtons(); // this is necessary for FF only because of a weird internal FF bug encountered when a caption contains a link
}

function checkThumbNavStatus() {
    //G.outputDebug2("checkThumbNavStatus");
  firstVisibleThumbIdx == 1
    ? U.$("ssPrevThumbSet").style.cssText = "display:none"
    : U.$("ssPrevThumbSet").style.cssText = "display:block";
  firstVisibleThumbIdx <= numSlides - NUM_VISIBLE_THUMBS
    ? U.$("ssNextThumbSet").style.cssText = "display:block"
    : U.$("ssNextThumbSet").style.cssText = "display:none";
}

function manageSlideImages() {
    //G.outputDebug2("manageSlideImages");
  var preloadImageIdx;
  var preloadImageUrl;
  for(i = firstVisibleThumbIdx; i < firstVisibleThumbIdx + NUM_VISIBLE_THUMBS; i++) {
    var temp1 = firstVisibleThumbIdx + NUM_VISIBLE_THUMBS;
    //G.outputDebug2("manageSlideImages: " + i + " < " + temp1);
    if(arrLoadedSlideImages[i] != true) {
      try {
        //G.outputDebug2("SS.thumbs.length: " + SS.thumbs.length);
        preloadImageUrl = SS.thumbs[i.toString()].fullImage;
        //G.outputDebug2("manageSlideImages: inside if; preloadImageUrl: " + preloadImageUrl);
        U.preloadImage(preloadImageUrl);
      }
      catch(err) {
      }
    }
  }
  //G.outputDebug2("leaving manageSlideImages");
  return true;
}

function autoAdvanceSlide() {
    //G.outputDebug2("autoAdvanceSlide; currentSlideIdx: " + currentSlideIdx + "; numSlides: " + numSlides);
  if(currentSlideIdx == numSlides) {
    showFinalSlide();
  }
  else {
    nextSlideIdx = currentSlideIdx + 1;
    updateSlide();
  }
}
window['SS']['autoAdvanceSlide'] = autoAdvanceSlide;

function showFinalSlide() {
    //G.outputDebug2("showFinalSlide");
  if(playing) {
    stopAutoplay();
    stoppedAtEnd = true;
  }
  finalSlideActive = true;
  U.toggleClass("ssFinalSlide", "showIt");
  nextUp();
  } 

//add Next Up functionality
var nssCount = 21; // initial count down value in seconds

function nextUp() {
U.log("next up called");
U.log(suggNextUrl + " is next");
	$("#slideshowCountLayer").show("fast");
	nssTimer = setInterval(nssCountDown, 1000);
	nextCountDown = true;
}
 
function nssCountDown() {
U.log("Next slideshow count down called " + nssCount + " seconds remain");

  if ( nssCount != 0 ) {
	 nssCount = nssCount - 1;
	 	U.log("countdown : " + nssCount + " seconds remain");
	 document.getElementById("container").innerHTML = nssCount;
	 	U.log("container updated to : " + nssCount);
   }
  else {
	 U.log("load new page - count zero!");
	 subsrURL = suggNextUrl;
	 var postURL = subsrURL + "?ssAuto=true";
	 document.getElementById("nssLanguage").innerHTML = "is loading";
     clearInterval(nssTimer);
     nssCount = 21;
     U.log("next url is loading... " + subsrURL);
    // alert(window.location.href + "?ssAuto=true");
     //doPixelTracking(30);
     U.createCookie("finalSlide", "true", 365);
     window.location = subsrURL + "?ssAuto=true";
    
  }  
  
  //if anything in ssUtils is clicked, reset the timer
  
  $("#ssUtils").click(function () {  //stop timer/reset if link is clicked during countdown
	if(nextCountDown){
	  nssCount = 31; 
	}
  });
  
}

function nssStopCountDown() {
	clearInterval(nssTimer);
	$("#slideshowCountLayer").hide("fast");
	nssCount = 21;
	nextCountDown = false;
}
window['SS']['nssStopCountDown'] = nssStopCountDown;

function replaySlideshow(p_nextSlideIdx) {
    //G.outputDebug2("replaySlideshow");
  if(stoppedAtEnd) {
    restartAutoplay();
  }
  finalSlideActive = false;
  if(p_nextSlideIdx) {
    nextSlideIdx = p_nextSlideIdx;
  }
  else {
    nextSlideIdx = 1;
  }
  updateSlide();
  nssStopCountDown();
  nextCountDown = false;
  U.toggleClass("ssFinalSlide", "showIt");
}
window['SS']['replaySlideshow'] = replaySlideshow;

function resetInterval() {
    //G.outputDebug2("resetInterval");
  clearInterval(timerAP);
  timerAP = setInterval("SS.autoAdvanceSlide()", INTERVAL_DURATION_2);
  playing = true;
}
window['SS']['resetInterval'] = resetInterval;

function startAutoplay() {
    //G.outputDebug2("startAutoplay");
  autoAdvanceSlide();
  resetInterval();
}
window['SS']['startAutoplay'] = startAutoplay;

function restartAutoplay() {
    //G.outputDebug2("restartAutoplay");
  resetInterval();
  U.toggleClass("apPlayPauseButton", "playing");
}

function toggleAutoplay() {
    //G.outputDebug2("toggleAutoplay");
  if(playing) {
      //G.outputDebug2("playing");
    stopAutoplay();
  }
  else {
      //G.outputDebug2("not playing; start autoplay");
    startAutoplay();
    U.toggleClass("apPlayPauseButton", "playing");
  }
}
window['SS']['toggleAutoplay'] = toggleAutoplay;

function stopAutoplay() {
    //G.outputDebug2("stopAutoPlay");
  killInterval(timerAP);
  playing = false;
  U.toggleClass("apPlayPauseButton", "playing");
}

function killInterval(timer) {
    //G.outputDebug2("killInterval");
  clearInterval(timer);
  timer = null;
}
window['SS']['killInterval'] = killInterval;

function togglePrevButtonState() {
    //G.outputDebug2("togglePrevButtonState");
  U.toggleClass("ssNavPrev", "inactive");
}
window['SS']['togglePrevButtonState'] = togglePrevButtonState;

})();

  // nbc_gallery sets thisIsAGalleryPage.  If true, create Slideshow upon document.ready
if(thisIsAGalleryPage) {
  $(document).ready(SS.initializeSlideshow);
}
 
