/**
 *	SlideItMoo v1.1 - Image slider
 *	(c) 2007-2010 Constantin Boiangiu <http://www.php-help.ro>
 *	MIT-style license.
 **/	
var SlideItMoo = new Class( {
   Implements : [Events, Options], options : {
      overallContainer : null, elementScrolled : null, thumbsContainer : null, itemsSelector : null, itemsVisible : 5, elemsSlide : null, itemWidth : null, itemHeight : null, navs : {
         fwd : ".SlideItMoo_forward", bk : ".SlideItMoo_back"}
      , slideVertical : false, showControls : 1, transition : Fx.Transitions.linear, duration : 800, direction : 1, autoSlide : false, mouseWheelNav : false, startIndex : null}
   , initialize : function(A) {
      this.setOptions(A); this.elements = $(this.options.thumbsContainer).getElements(this.options.itemsSelector); this.totalElements = this.elements.length; if(this.totalElements <= this.options.itemsVisible) {
         return}
      var B = this.elements[0].getSize(); this.elementWidth = this.options.itemWidth || B.x; this.elementHeight = this.options.itemHeight || B.y; this.currentElement = 0; this.direction = this.options.direction; this.autoSlideTotal = this.options.autoSlide + this.options.duration; if(this.options.elemsSlide == 1) {
         this.options.elemsSlide = null}
      this.begin()}
   , begin : function() {
      this.setContainersSize(); this.myFx = new Fx.Tween(this.options.thumbsContainer, {
         property : (this.options.slideVertical ? "margin-top" : "margin-left"), wait : true, transition : this.options.transition, duration : this.options.duration}
      ); this.addControls(); if(this.options.mouseWheelNav &&!this.options.autoSlide) {
         $(this.options.thumbsContainer).addEvent("mousewheel", function(B) {
            new Event(B).stop(); this.slide( - B.wheel)}
         .bind(this))}
      if(this.options.startIndex && this.options.startIndex > 0 && this.options.startIndex < this.elements.length) {
         for(var A = 1; A < this.options.startIndex; A++) {
            this.rearange()}
         }
      if(this.options.autoSlide && this.elements.length > this.options.itemsVisible) {
         this.startAutoSlide()}
      }
   , resetAll : function() {
      $(this.options.overallContainer).removeProperty("style"); $(this.options.elementScrolled).removeProperty("style"); $(this.options.thumbsContainer).removeProperty("style"); this.stopAutoSlide(); if($defined(this.fwd)) {
         this.fwd.dispose(); this.bkwd.dispose()}
      this.initialize()}
   , setContainersSize : function() {
      var C = {
         }; var B = {
         }; var A = {
         }; if(this.options.slideVertical) {
         B.height = this.options.itemsVisible * this.elementHeight; A.height = this.totalElements * (this.elementHeight + 10)}
      else {
         C.width = this.options.itemsVisible * this.elementWidth + (2 * this.options.navs.width) * this.options.showControls; B.width = this.options.itemsVisible * this.elementWidth; A.width = this.totalElements * (this.elementWidth + 10)}
      $(this.options.overallContainer).set( {
         styles : C}
      ); $(this.options.elementScrolled).set( {
         styles : B}
      ); $(this.options.thumbsContainer).set( {
         styles : A}
      )}
   , addControls : function() {
      if(!this.options.showControls || this.elements.length <= this.options.itemsVisible) {
         return}
      this.fwd = $(this.options.overallContainer).getElement(this.options.navs.fwd); this.bkwd = $(this.options.overallContainer).getElement(this.options.navs.bk); if(this.fwd) {
         this.fwd.addEvent('click', this.slide.pass(1, this))}
      if(this.bkwd) {
         this.bkwd.addEvent('click', this.slide.pass( - 1, this))}
      }
   , slide : function(D) {
      if(this.started) {
         return}
      this.direction = D ? D : this.direction; var A = this.currentIndex(); if(this.options.elemsSlide && this.options.elemsSlide > 1 && this.endingElem == null) {
         this.endingElem = this.currentElement; for(var B = 0; B < this.options.elemsSlide; B++) {
            this.endingElem += D; if(this.endingElem >= this.totalElements) {
               this.endingElem = 0}
            if(this.endingElem < 0) {
               this.endingElem = this.totalElements - 1}
            }
         }
      var C = new Hash(); var E = 0; if(this.options.slideVertical) {
         C.include("margin-top", - this.elementHeight); E = this.direction == 1 ?- this.elementHeight : 0}
      else {
         C.include("margin-left", - this.elementWidth); E = this.direction == 1 ?- this.elementWidth : 0}
      if(this.direction ==- 1) {
         this.rearange(); $(this.options.thumbsContainer).setStyles(C)}
      this.started = true; this.myFx.start(E).chain(function() {
         this.rearange(true); if(this.options.elemsSlide) {
            if(this.endingElem !== this.currentElement) {
               this.slide(this.direction)}
            else {
               this.endingElem = null}
            }
         }
      .bind(this)); this.fireEvent("onChange", A)}
   , rearange : function(A) {
      if(A) {
         this.started = false}
      if(A && this.direction ==- 1) {
         return}
      this.currentElement = this.currentIndex(this.direction); var B = new Hash(); if(this.options.slideVertical) {
         B.include("margin-top", 0)}
      else {
         B.include("margin-left", 0)}
      $(this.options.thumbsContainer).setStyles(B); if(this.currentElement == 1 && this.direction == 1) {
         this.elements[0].injectAfter(this.elements[this.totalElements - 1]); return}
      if((this.currentElement == 0 && this.direction == 1) || (this.direction ==- 1 && this.currentElement == this.totalElements - 1)) {
         this.rearrangeElement(this.elements.getLast(), this.direction == 1 ? this.elements[this.totalElements - 2] : this.elements[0]); return}
      if(this.direction == 1) {
         this.rearrangeElement(this.elements[this.currentElement - 1], this.elements[this.currentElement - 2])}
      else {
         this.rearrangeElement(this.elements[this.currentElement], this.elements[this.currentElement + 1])}
      }
   , rearrangeElement : function(B, A) {
      this.direction == 1 ? B.injectAfter(A) : B.injectBefore(A)}
   , currentIndex : function() {
      var A = null; switch(this.direction) {
         case 1 : A = this.currentElement >= this.totalElements - 1 ? 0 : this.currentElement + this.direction; break; case - 1 : A = this.currentElement == 0 ? this.totalElements - 1 : this.currentElement + this.direction; break}
      return A}
   , startAutoSlide : function() {
      this.startIt = this.slide.bind(this); this.autoSlide = this.startIt.periodical(this.autoSlideTotal, this); this.isRunning = true; this.elements.addEvents( {
         mouseenter : function() {
            $clear(this.autoSlide); this.isRunning = false}
         .bind(this), mouseleave : function() {
            this.autoSlide = this.startIt.periodical(this.autoSlideTotal, this); this.isRunning = true}
         .bind(this)}
      )}
   , stopAutoSlide : function() {
      $clear(this.autoSlide); this.isRunning = false}
   }
); 
