var HomeSlideshowData = {
  instance: null,
  FORCE_LEFT: 1,
  FORCE_RIGHT: 2,
  SLIDE_WIDTH: 911
};

var HomeSlideshow = Class.create({
  
  /* // slide data example:
  {
    "label":"Master's Series",
    "daterange":"Fri 24 & Sat 25 September",
    "location":"Perth Concert Hall",
    "description":"Lorem ipsum dolor sit amet, consectetue adipiscing elit, nibh euismod tincidunt ut laore dolore magna aliquam erat sit am consectetuer<\/p>\r\n\r\n",
    "link":"#",
    "linklabel":"Information & Tickets",
    "image":"\/img\/hometile.jpg"
  }
  */
  
  // ELEMENTS_____
  // slidesContainer
  // controlLeft
  // controlRight
  
  // PROPERTIES___
  // currSlide
  // currIndex
  // isTransitioning
  // slideDataArray // main JSON data
  // autoplayExecuter
  
  initialize: function(slideDataJSON) {
    
    this.slideDataArray  = slideDataJSON;
    this.currIndex       = 0;
    this.isTransitioning = false;
    
    this.slidesContainer = $("homeSlideshowItems");
    this.controlRight    = $("homeSlideshowNext");
    this.controlLeft     = $("homeSlideshowPrev");
    
    this.controlLeft.observe("click", this.doLeftClick.bind(this));
    this.controlRight.observe("click", this.doRightClick.bind(this));
    
    this.currSlide = this.slideForIndex(0);
    
    this.slideDataArray.each(function(dataObject){
      
      var img = new Element("img").setAttribute("src", dataObject.image);
      
    }.bind(this));
    
    
    if (this.slideDataArray.length > 1) {
      
      this.autoplayExecuter = new PeriodicalExecuter(this.doAutoplayExecuter.bind(this), 5);
    };
    
    this.slidesContainer.update(this.currSlide);
    
    HomeSlideshowData.instance = this;
  },
  
  doAutoplayExecuter: function(pe) {
    var nextUp;
    if (this.currIndex + 1 == this.slideDataArray.length) {
      nextUp = 0;
    } else {
      nextUp = this.currIndex + 1;
    }
    
    this.updateDisplayForIndex(nextUp, HomeSlideshowData.FORCE_RIGHT);
    this.currIndex = nextUp;
  },
  
  stopAutoplay: function() {
    if (this.autoplayExecuter) {
      this.autoplayExecuter.stop();
      this.autoplayExecuter = null;
    }
  },
  
  slideForIndex: function(index) {
    var slideData = this.slideDataArray[index];
    var element = new Element("div").addClassName("homeSlideshowItem");
    
    var mainImage;
    
    if (slideData.isFullWidthImage) {
      
      mainImage = new Element("a").addClassName("homeSlideshowFullImage").setStyle({
        backgroundImage: "url('" + slideData.image + "')"
      });
      
    } else {
      
      mainImage = new Element("a").addClassName("homeSlideshowHalfImage").setStyle({
        backgroundImage: "url('" + slideData.image + "')"
      });
      
      var d = new Element("div").addClassName("homeSlideshowDetailsContainer");
      var series   = new Element("div").addClassName("homeSlideshowSeries").update(slideData.label || "");
      var date     = new Element("div").addClassName("homeSlideshowDate").update(slideData.daterange || "");
      var location = new Element("div").addClassName("homeSlideshowLocation").update(slideData.location || "");
      var details  = new Element("div").addClassName("homeSlideshowDetails").update(slideData.description || "");
      
      d.insert(series);
      d.insert(date);
      d.insert(location);
      d.insert(details);
      
      if (slideData.linklabel && slideData.link) {
        var link = new Element("a", {href: slideData.link}).setStyle({color:"#FFF"}).addClassName("homeSlideshowLink").update(slideData.linklabel);
        d.insert(link);
      };
      
      element.insert(d);
    }
    
    if (slideData.link) {
      mainImage.setAttribute("href", slideData.link);
    };
    element.insert(mainImage);
    
    return element;
  },
  
  updateDisplayForIndex: function(index, forceDirection) {
    
    var currSlide = this.currSlide;
    
    this.isTransitioning = true;
    
    var newSlide = this.slideForIndex(index);
    
    var startingPos;
    switch (forceDirection) {
      case HomeSlideshowData.FORCE_LEFT:
        startingPos = -HomeSlideshowData.SLIDE_WIDTH;
        break;
      case HomeSlideshowData.FORCE_RIGHT:
        startingPos = HomeSlideshowData.SLIDE_WIDTH;
        break;
      default:
        startingPos = (index < this.currIndex) ? -HomeSlideshowData.SLIDE_WIDTH : HomeSlideshowData.SLIDE_WIDTH;
        break;
      }
    
    newSlide.setStyle({left:startingPos + "px"});
    
    this.slidesContainer.insert(newSlide);
    
    new Effect.Parallel([
      new Effect.Morph(newSlide, { style: {left: "0px"} }),
      new Effect.Morph(currSlide, { style: {left: startingPos * -1 + "px"} })
    ], {
      duration: 0.8,
      afterFinish: function(event) {
        this.isTransitioning = false;
        currSlide.remove();
      }.bind(this)
    });
    
    this.currSlide = newSlide;
  },
  
  doLeftClick: function(event) {
    
    this.stopAutoplay();
    
    if (!this.isTransitioning) {
      var newIndex = (this.currIndex - 1 >= 0) ? this.currIndex - 1 : this.slideDataArray.length - 1;
      this.updateDisplayForIndex(newIndex, HomeSlideshowData.FORCE_LEFT);
      this.currIndex = newIndex;
    };
  },
  doRightClick: function(event) {
    
    this.stopAutoplay();
    
    if (!this.isTransitioning) {
      var newIndex = (this.currIndex + 1 < this.slideDataArray.length) ? this.currIndex + 1 : 0;
      this.updateDisplayForIndex(newIndex, HomeSlideshowData.FORCE_RIGHT);
      this.currIndex = newIndex;
    };
  }
  
});
