var OldBoothSite = {};

OldBoothSite.FeaturesModule = new Class({
   Implements: [Options],
   
   options: {
       scrollSize: 300,
       scrollElementClass: 'scroll'
   },
   
   initialize: function(selector, options) {
       this.setOptions(options);
       
       this.element = $(selector);
       this.scrollElement = new Element('div', {
           'class': this.options.scrollElementClass
       });
       this.elementToScroll = this.element.getElement('ul');
       this.elementToScrollSize = this.elementToScroll.getSize();
       this.parentElementSize = this.elementToScroll.getParent().getSize();
       this.scrollElement.inject(this.element);
       this.scrollStartPosition = this.scrollElement.getPosition(this.scrollElement.getParent());
       this.maxLeft = this.parentElementSize.x-this.elementToScrollSize.x;
       
       this.dragging = false;
       this.startMousePosition = 0;
       
       this.elementToScroll.getParent().addEvent('mousewheel', this.mouseWheel.bindWithEvent(this));
       
       this.scrollElement.addEvent('mousedown', function(event){
           var eventObj = new Event(event);
           eventObj.stopPropagation();
           eventObj.preventDefault();
           
           this.dragging = true;
           this.startMousePosition = eventObj.client.x;
           this.onWindowMouseUp = (function(event){
                var eventObj = new Event(event);
                eventObj.stopPropagation();
                eventObj.preventDefault();
                this.onWindowLeave();
           }.bindWithEvent(this));
           this.onWindowLeave = (function(){
               this.dragging = false;
               document.removeEvent('mouseup', this.onWindowMouseUp);
               document.removeEvent('mousemove', this.windowDragEventFunction);
               document.removeEvent('mouseout', this.onWindowLeave);
           });
           document.addEvent('mouseup', this.onWindowMouseUp);
           document.addEvent('mousemove', this.windowDragEventFunction);
           document.addEvent('mouseout', this.onWindowLeave);
       }.bindWithEvent(this));
       this.windowDragEventFunction = this.mouseDrag.bindWithEvent(this);
       if (Browser.Platform.ipod) {
           var touchHandlerFunction = this.touchHandler.bind(this);
           document.addEventListener('touchstart', touchHandlerFunction, true);
           document.addEventListener('touchmove', touchHandlerFunction, true);
           document.addEventListener('touchend', touchHandlerFunction, true);
           document.addEventListener('touchcancel', touchHandlerFunction, true);
       } else {
           this.scrollElement.getParent().addEvent('mousedown', function(event){
                  var eventObj = new Event(event);
                     eventObj.stopPropagation();
                     eventObj.preventDefault();
                   var position = this.scrollElement.getPosition();
                   var size = this.scrollElement.getSize();
                   if ((eventObj.page.y >= position.y) && (eventObj.page.y < position.y+size.y)) {
                      this.moveScroll(eventObj.page.x-position.x-(size.x/2));
                      this.scrollElement.fireEvent('mousedown', event);
                   }
              }.bindWithEvent(this));
       }
   },
   
   mouseDrag: function(event, element) {
       if (this.dragging == false) return;
       var eventObj = new Event(event);
       eventObj.stopPropagation();
       eventObj.preventDefault();
       var mousePosition = eventObj.client.x;
       var difference = mousePosition - this.startMousePosition;
       this.startMousePosition = mousePosition;
       this.moveScroll(difference);
   },
   
   mouseWheel: function(event) {
       var eventObj = new Event(event);
      eventObj.stopPropagation();
      eventObj.preventDefault();
      this.moveScroll(eventObj.wheel*-10);
   },
   
   moveScroll: function(howManyPixels) {
       var newPosition = this.scrollElement.getPosition(this.scrollElement.getParent());
       newPosition.x += howManyPixels;
       if (newPosition.x < this.scrollStartPosition.x) newPosition.x = this.scrollStartPosition.x;
       if (newPosition.x > this.scrollStartPosition.x+this.options.scrollSize) newPosition.x = this.scrollStartPosition.x+this.options.scrollSize;
        this.scrollElement.setPosition(newPosition);
        
       var difference = newPosition.x - this.scrollStartPosition.x;
       this.elementToScroll.setStyle('left', difference/this.options.scrollSize*this.maxLeft)
   },
   
   touchHandler: function(event)
   {
       var touches = event.changedTouches,
           first = touches[0],
           type = '';
       switch(event.type)
       {
           case 'touchstart': type = 'mousedown'; break;
           case 'touchmove':  type='mousemove'; break;        
           case 'touchend':   type='mouseup'; break;
           default: return;
       }

       var simulatedEvent = document.createEvent('MouseEvent');
       simulatedEvent.initMouseEvent(type, true, true, window, 1, 
                                 first.screenX, first.screenY, 
                                 first.clientX, first.clientY, false, 
                                 false, false, false, 0/*left*/, null);

       first.target.dispatchEvent(simulatedEvent);
       if (this.dragging) {
           event.preventDefault();
       };
   }
});

OldBoothSite.ReviewsModule = new Class({
    Implements: [Options],

       options: {
           switchElementClass: 'dot',
           activeSwitchElementClass: 'active',
           timerDelay: 5000
       },

       initialize: function(selector, options) {
           this.setOptions(options);

           this.element = $(selector);
           this.reviewsElements = $A(this.element.getElements('ul'));
           if (this.reviewsElements.length == 1) {
               return;
           }
           for (var i = this.reviewsElements.length - 1; i >= 1; i--){
            this.reviewsElements[i].setStyle('display', 'block');
            this.reviewsElements[i].setStyle('opacity', '0');
           };
           this.currentPage = 0;
           this.reviewsElements[this.currentPage].toggleClass(this.options.activeSwitchElementClass);
           this.periodicalTimer = this.timerSwitch.periodical(this.options.timerDelay, this);
           this.dotElements = $A([]);
           for (var i = 0; i < this.reviewsElements.length; i++){
              var dot = new Element('div', {'class': this.options.switchElementClass});
              dot.inject(this.element);
              var size = dot.getSize();
              var position = ((i+1)-((this.reviewsElements.length+1)/2.0))*size.x;
              dot.setStyle('marginLeft', position);
              dot.addEvent('mousedown', this.mouseDown.bindWithEvent(this,dot));
              this.dotElements.include(dot);
           };
           this.dotElements[this.currentPage].toggleClass(this.options.activeSwitchElementClass);
       },
       
       mouseDown: function(event, element) {
           this.periodicalTimer = $clear(this.periodicalTimer);
           var index = this.dotElements.indexOf(element);
           this.switchTo(index);
       },
       
       switchTo: function(newPageNumber) {
           if (newPageNumber == this.currentPage) {
               return;
           }
           var currentPage = $(this.reviewsElements[this.currentPage]);
           currentPage.toggleClass(this.options.activeSwitchElementClass);
           currentPage.set('tween', {transition: Fx.Transitions.Sine.easeOut});
           currentPage.tween('opacity', 0.0);
           this.dotElements[this.currentPage].toggleClass(this.options.activeSwitchElementClass);
           var newPage = $(this.reviewsElements[newPageNumber]);
           newPage.toggleClass(this.options.activeSwitchElementClass);    
           newPage.setStyle('opacity', 0.01);
           newPage.set('tween', {transition: Fx.Transitions.Sine.easeIn});
           newPage.tween('opacity', 1.0);
           this.currentPage = newPageNumber;
           this.dotElements[this.currentPage].toggleClass(this.options.activeSwitchElementClass);
       },
       
       timerSwitch: function() {
          var newPage = this.currentPage+1;
          if (newPage == this.reviewsElements.length) {
              newPage = 0;
          }
          this.switchTo(newPage);
       },
});
