

function init()
{
  var findOutMoreCarousel = new PageCarousel();
  findOutMoreCarousel.init('lifeAtStevenson', '.row', '.arrow.smallup', '.arrow.smalldown', 3, true);

  var featuredCoursesCarousel = new PageCarousel();
  featuredCoursesCarousel.init('featured-courses', '.row', '.arrow.smallup', '.arrow.smalldown', 2, true);
  
  var bannerCarousel = new BannerCarousel();
  bannerCarousel.init('homeBanner', '.link-list .link');
  
  var oneTimeTimer = new OneTimeTimer()
  oneTimeTimer.init(bannerCarousel)
}

var OneTimeTimer = function() {
  
  var _bannerElement = null;
  var self = this;
  var _rows = null;
  var counter = 0;
  var stopTimerFlag = false;
  
  this.init = function(bannerElement) {
      _bannerElement = bannerElement;  
     
     document.observe('banner:stopTimer', function(event){
      
       Element.stopObserving(document, 'banner:stopTimer');
       
       stopTimerFlag = true;
     });
     
     document.observe("banner:ready", function(event) {
        
        _rows = _bannerElement.getRows();
        
        new PeriodicalExecuter(function(pe) {
            if(!self.next() || stopTimerFlag)
            {
              pe.stop();
            }

        }, 5);

      });
      



      
  }
  
  this.next = function(){
    if(!stopTimerFlag)
    {
     
      if(counter == _rows.length - 1)
      {
          _bannerElement.clickRow(_rows[0])
          return false;
      }
      else
      {
          counter++;
          _bannerElement.clickRow(_rows[counter])
          return true;
      }
    }
    
  }
  
    /**
   * Send values to say()
   * 
   * 
   */
  this.say = function()
  {
    
    if(arguments.length == 1)
    {
      title = undefined;
      string = arguments[0];
    }
    else
    {
      title = arguments[0];
      string = arguments[1];
    }
    
    try 
    { 
      if(title)
      {
        //console.log(title, string)
      }
      else
      {
        //console.log(string)
      }   
    } 
    catch(err) 
    { 
      //alert(title + ' = ' + string) 
    }; 
  } 
  
}

var BannerCarousel = function() {
   var _args =null;
   var _rows = null;
   var _rowsContainerObject = null;
   var self = this;  
   var currentTop = 0;
   this.ready = false;
   this.rows = null;
   
   
   this.init = function(rowsContainer, repeatEntity)
   {
      
     _args = new Object();

     _args.container = rowsContainer;
     _args.rows = repeatEntity;
     
     Event.observe(window, 'load', this.loadEventHandler);
   }
      
   this.loadEventHandler = function(e)
   {
     self.construct();   
   }
   
   this.construct = function()
   {
 
        _rowsContainerObject   = self.getObject(_args.container);
        currentTop = $($$('.link-list')[0]).offsetTop;
        _rows                  =  self.getObjects(_args.rows);
        _rows.each(function(s, index) {
        var el = $(s).select("h3")[0];
        //console.log("Element" , el)
        Element.observe(el, 'click', self.rowClickHandler);
      });
     
      Element.observe($$('.arrow.down')[0], 'click', self.downClick)
      Element.observe($$('.arrow.up')[0], 'click', self.upClick)
      
      this.rows = _rows;
      this.ready = true;
      document.fire("banner:ready");
      
   }
   
   this.getRows = function(){
      return _rows;  
   }
   
   this.downClick = function() {
        var heightTo = $($$('.link-list')[0].select('.link')[0]).getHeight()
        
        if(self.maxScrollValue())
        {
          
          Element.stopObserving($$('.arrow.down')[0], 'click')
          new Effect.Move($($$('.link-list')[0]), { x: 0, y: (heightTo * -1), mode: 'relative', afterFinish: function() {
              Element.observe($$('.arrow.down')[0], 'click', self.downClick)          
              
               self.maxScrollValue();
              
          }});
        }
   }
   this.upClick = function() {
     var heightTo = $($$('.link-list')[0].select('.link')[0]).getHeight()
      
        var top = $($$('.link-list')[0]).offsetTop;

        if(top < currentTop)
        {
          Element.stopObserving($$('.arrow.up')[0], 'click')
          
          new Effect.Move($($$('.link-list')[0]), { x: 0, y: heightTo, mode: 'relative', afterFinish: function() {      
              Element.observe($$('.arrow.up')[0], 'click', self.upClick);
                 
                 self.maxScrollValue();
          }});
        }
   }
   
   this.maxScrollValue = function(){
      var top = $($$('.link-list')[0]).offsetTop;
      var height = $($$('.link-list')[0]).getHeight();
      var containerHeight = $($$('.link-list-container')[0]).getHeight();
     
      if((top + height) < containerHeight)
        return false;
       
      return true;
   }
   
   function moveTo(container, amount){
      Position.prepare();
      container_y = Position.cumulativeOffset($(container))[1]

      new Effect.Move(container, { x: 0, y: amount, mode: 'absolute' });
      return false;
    }
   
   function fadeOut(element){
       new Effect.Fade(element, 
       { duration:.4});
   }
   function fadeIn(element){
       new Effect.Appear(element, 
       {duration:.4, to:1.0, delay: .45});
   }
   
   this.rowClickHandler = function(el)
   {
     
     var parent = el.element().parentNode.parentNode
     //var parent = $(el).currentTarget.parentNode.parentNode
     document.fire("banner:stopTimer");
     self.clickRow(parent)
   }
   
   this.clickRow = function(linkElement) {
     
      if(!linkElement.hasClassName('active'))
         if(linkElement)
         {
           
           $(linkElement.parentNode).childElements().each(function(s){
             s.removeClassName('active');
           })
           linkElement.addClassName('active')
           
           _rowsContainerObject.select(".image").each(function(s){
           //s.hide()
           
            fadeOut(s);
         
           });
           
          fadeIn( $(linkElement).select('a')[0].rel );//changeBackgroundColor
         //changeImage
         }
   }
  
   this.getObjects = function(element)
   {
        return this._getObjects(element, false)
   }
   
   this.getObject = function(element)
   {
     return this._getObjects(element, true)
   }
   
   this._getObjects = function(element, filter)
   {
       tempEl = null;
       
       switch(typeof(element))
       {
         case 'string':
           tempEl = $(element);
           if(tempEl == 'null')
              tempEl = $$(element)
              
           
           if(tempEl == null)
           {
             tempEl = $(_rowsContainerObject).select(element);
             
             if(filter)
              tempEl = tempEl[0];
           }
           
           //if(tempEl == null)
             // this.say("Element could not be found " + element)
           break;
        case 'object':
           return element;
           break;
        default:
           return element;
       }
       
       return tempEl;
   }
   
  /**
   * Send values to say()
   * 
   * 
   */
  this.say = function()
  {
    
    if(arguments.length == 1)
    {
      title = undefined;
      string = arguments[0];
    }
    else
    {
      title = arguments[0];
      string = arguments[1];
    }
    
    try 
    { 
      if(title)
      {
        //console.log(title, string)
      }
      else
      {
        //console.log(string)
      }   
    } 
    catch(err) 
    { 
      //alert(title + ' = ' + string) 
    }; 
  } 
}



/**
 * rowsContainer = The div of which contains all the child elements acting as rows of visible content.
 *                 This must be the element directly parenting the children elements.
 * repeatEntity  = The elements of which are the rows.
 * backNav       = Element used as the previous view button
 * nextNav       = Element used as the next view button.
 * visibleLimit  = The amount of visible rows to be seen at any given time
 * elementContext= If you would like the left and right nav to by within the context of the main div. pass true.
 */
var PageCarousel = function(){
    var _args =null;
    var _rowsContainerObject = null;
    var _backNav = null;
    var _nextNav = null;
    var _visibleLimit = null;
    var self = this;
    var _rows = null;
    var _firstElement = 0;
    var _childCount = 0;
      
   this.init = function(rowsContainer, repeatEntity, backNav, nextNav, visibleLimit, elementContext)
   {
      
     _args = new Object();

     _args.rowsContainer = rowsContainer;
     _args.rows = repeatEntity;
     _args.backNav = backNav;
     _args.nextNav = nextNav;
     _args.visibleLimit = visibleLimit;
     _args.elementContext = elementContext;
     
     Event.observe(window, 'load', this.loadEventHandler);
   }
   
   this.loadEventHandler = function(e)
   {
     self.construct();   
   }
   
   this.construct = function()
   {
      
     this.childCount = 0;
     this.currentFirstElement = 0;

      _rowsContainerObject   = self.getObject(_args.rowsContainer); 
      _rows                  = self.getObjects(_args.rows); 
      _backNav               = self.getObject(_args.backNav);
      _nextNav               = self.getObject(_args.nextNav);
      _visibleLimit          = self.getObject(_args.visibleLimit);

      /* Count child items. */
      this.childCount = $(_rows).length;
      Element.observe(_backNav[0], 'click', self.backNavClickHandler);
      Element.observe(_nextNav[0], 'click', self.nextNavClickHandler);
      
  
   }
   
   this.backNavClickHandler = function(e){
     
     self.changeView('back')
     
   }
   
   
   this.nextNavClickHandler = function(e){
     self.changeView('next')
   }
   
   /**
    * direction = next / prev
    */
   this.changeView = function(direction)
   {
      var changeValue = (_args.visibleLimit) * -1;
      
      
      if(direction == 'next' || direction >= 1)
         changeValue = _args.visibleLimit;  
       
        var changeTo = self.currentFirstElement + changeValue; 
         
        if(changeTo < 0)
        { 
          self.currentFirstElement = 0;
        }
        else if(changeTo >= self.childCount)
        {
          var mod = self.childCount % 2;
          
          if(mod == 0)
          {
            if (self.childCount <= changeValue) {
                self.currentFirstElement = self.currentFirstElement;
            } else {
                self.currentFirstElement = changeValue;
            }
          }
          else
          {
            self.currentFirstElement = self.childCount - 1;
          }
        }
        else
        {
          self.currentFirstElement += changeValue;
        }
        
        self.showRows(self.currentFirstElement, _args.visibleLimit)
   }
   
   this.showRows = function(from, count) {
     _rows.each(function(s, index) {
        //self.say(index + ': ' + s);
        if(index >= from && index <= (from+count-1))
        {
          fadeIn(s);
        }
        else
        {
          fadeOut(s);
        }
      });
   }
   function fadeOut(element){
       new Effect.Fade(element, 
       { duration:.4});
   }
   function fadeIn(element){
       new Effect.Appear(element, 
       {duration:.4, to:1.0, delay: .45});
   }
    this.childCount = function(val){
      var value = val;
      this.__defineGetter__("value", function(){ return self._childCount; });
      this.__defineSetter__("value", function(val){ self._childCount = val; });
    }
   
   
    this.currentFirstElement = function(val){
      var value = val;
      this.__defineGetter__("value", function(){ return self.getCurrentFirstElement(); });
      this.__defineSetter__("value", function(val){ self.setCurrentFirstElement(val); });
    }
    
    this.setCurrentFirstElement = function(val)
    {
      _firstElement = val
      
    }
    
    this.getCurrentFirstElement = function(){
      return _firstElement;
    }
   
   
   this.getObjects = function(element)
   {
        return this._getObjects(element, false)
   }
   
   this.getObject = function(element)
   {
     return this._getObjects(element, true)
   }
   
   this._getObjects = function(element, filter)
   {
       tempEl = null;
       
       switch(typeof(element))
       {
         case 'string':
           tempEl = $(element); 
           if(tempEl == null)
              tempEl = $(_rowsContainerObject).select(element);
             // tempEl = $$(element)
           
           if(_args.elementContext && tempEl == null)
           {
             tempEl = $(_rowsContainerObject).select(element);
             
             if(filter)
              tempEl = tempEl[0];
           }
           
           if(tempEl == null)
              this.say("Element could not be found " + element)
              
           break;
        case 'object':
           return element;
           break;
        default:
           return element;
       }
       
       return tempEl;
   }
   
  /**
   * Send values to say()
   * 
   * 
   */
  this.say = function()
  {
    
    if(arguments.length == 1)
    {
      title = undefined;
      string = arguments[0];
    }
    else
    {
      title = arguments[0];
      string = arguments[1];
    }
    
    try 
    { 
      if(title)
      {
        //console.log(title, string)
      }
      else
      {
        //console.log(string)
      }   
    } 
    catch(err) 
    { 
     // alert(title + ' = ' + string) 
    }; 
  } 
}

init();

