/**
 *  Quick Slide Show
 *
 *  Karl Lynch
 *  Canterbury City Council
 *  August 2010
 *  
 *  @Remarks
 *  
 *  This script will look for any divs on a page with a class 'newsItem'
 *  and arrange them into a scrolling slideshow with links to each news
 *  item.
 *      
 *     
 **/   


      /** Global variables **/
      
      //The news item collection.  This will be populated by any divs on the page with the class 'newsItem'
      var newsItems = null;
      //The current news item on display (zero based)
      var currentItem = 0;
      //The previous news item shown
      var oldItem = null;
      //The function running to change the news article regularly
      var newsChangeInterval = null;
      //The number of milliseconds between news items
      var interval = 5000;
      
      /**
       *  Change the displayed news item on a schedule
       **/             
      function changeNewsItemOnInterval()
      {
        newsChangeInterval = setInterval('changeNewsItem()', interval);
      }
      
      /**
       *  Make a particular news item visible
       *  @param newsItem HTMLElement The news item to show       
       **/             
      function showNewsItem(newsItem)
      {
        $(newsItem).removeClass("hideAccessibly");
        $('.lnkItem' + (currentItem + 1)).addClass('activeNewsItemLink');
        $(newsItem).fadeIn("slow");
      }
      
      /**
       *  Make a particular news item invisible
       *  @param newsItem HTMLElement The news item to hide       
       **/             
      function hideNewsItem(newsItem)
      {
        oldItem = newsItem;
        $(newsItem).fadeOut("slow", function(){
          $(oldItem).addClass("hideAccessibly");
        });
        $('.lnkItem' + (currentItem + 1)).removeClass('activeNewsItemLink');
      }
      
      /**
       *  Builds up a control box of hyperlinks to jump to a particular news item
       **/             
      function buildControlBox()
      {
        var controlsContainer = $('.newsControls');
        var controlsBox = $('<p></p>');
        for(var item = 0; item < newsItems.length; item++)
        {
          var newControl = $('<a>' + (item + 1) + '</a>');
          var itemNumber = item;
          newControl.attr('class','newsItemLink lnkItem' + (item + 1));
          newControl.attr('href', '#');
          newControl.click(function(){
            var itemToGoTo = this.innerText;
            if (itemToGoTo == null){
              itemToGoTo = this.innerHTML;
            }
            goToNewsItem(itemToGoTo -1);
            return false;
          });
          controlsBox.append(newControl);
        }
        controlsContainer.append(controlsBox);
      }
      
      /**
       *  Set up the slide show and display the first news item
       **/             
      function setUpItemsAndShowFirst()
      {
        newsItems = $(".newsItem");
        $(".newsItem").addClass('repositionedItem');
        $(".newsItem").fadeOut(0);
        $(".newsItem").addClass('hideAccessibly');
        $(newsItems[0]).removeClass('hideAccessibly');
        $(newsItems[0]).fadeIn(0);
        buildControlBox();
        $('.lnkItem' + (currentItem + 1)).addClass('activeNewsItemLink');
      }
      
      /**
       *  Set the slide show to pause when moused over
       **/             
      function setUpMouseOverPause()
      {
        $('.newsItem').mouseover(function(){
          clearInterval(newsChangeInterval);
        });
        $('.newsItem').mouseleave(function(){
          changeNewsItemOnInterval()
        });
      }
      
      /**
       *  Swap the current news item for the next one, or go back to the start
       **/             
      function changeNewsItem()
      {
        hideNewsItem(newsItems[currentItem]);
        currentItem++;
        if (currentItem >= newsItems.length){ currentItem = 0; }
        showNewsItem(newsItems[currentItem]);
      }
    
      /**
       *  Go to a specific news item in the news item collection
       *  @param newsItemNumber Int The news item number to go to (zero based)       
       **/             
      function goToNewsItem(newsItemNumber)
      {
	if (newsItemNumber == currentItem){ return; }
        clearInterval(newsChangeInterval);
        hideNewsItem(newsItems[currentItem]);
        currentItem = newsItemNumber;
        showNewsItem(newsItems[newsItemNumber]);
        changeNewsItemOnInterval()
        return false;
      }
    

    
      /**
       *  Run all functions on document load
       **/             
      $(document).ready(function(){
	try{
           setUpItemsAndShowFirst();
           setUpMouseOverPause();
           changeNewsItemOnInterval();
	}
	catch(err){
	   // Do nothing
	}
      });
      

