/**
 * @author Bruno Bornsztein <bruno@missingmethod.com>
 * extra slider functionality added by topazmedia
 * @copyright 2007 Curbly LLC
 * @package Glider
 * @license MIT
 * @url http://www.missingmethod.com/projects/glider/
 * @version 0.0.3
 * @dependencies prototype.js 1.5.1+, effects.js
 */

/*  Thanks to Andrew Dupont for refactoring help and code cleanup - http://andrewdupont.net/  */

Glider = Class.create();
Object.extend(Object.extend(Glider.prototype, Abstract.prototype), {
    initialize: function(wrapper, options){
        this.scrolling  = false;
        this.sliderscrolling = false;
        this.slider = false;

        this.wrapper    = $(wrapper);
        this.scroller   = this.wrapper.down('div.scroller');
        this.sections   = this.wrapper.getElementsBySelector('div.section');
        // this.maxWidth   = 1; // Die Breite, die die Summe der Sctions beansprucht
        this.options    = Object.extend({
            duration: 1.0,
            frequency: 3
        }, options || {});
        var foo = 0;
        this.sections.each( function(section, index) {
            section._index = index;
            foo = index;
        });
        this.maxWidth = (foo)*816;
        this.numberOfSections = foo;
        
        this.events = {
            click: this.click.bind(this)
        };
	    
        this.addObservers();
			
        if(this.options.initialSection) this.moveTo(this.options.initialSection, this.scroller, {
            duration:this.options.duration
        });  // initialSection should be the id of the section you want to show up on load
        if(this.options.autoGlide) this.start();
            
			
    },
	
    addObservers: function() {
        var controls = this.wrapper.getElementsBySelector('div.controls a');
        controls.invoke('observe', 'click', this.events.click);

        // FIXME: Den Slider als zusätzlichen Observer hinzufügen
    },

    click: function(event) {
        this.stop();
        var element = Event.findElement(event, 'a');
        if (this.scrolling) this.scrolling.cancel();
        if (this.sliderscrolling) this.sliderscrolling.cancel();
        this.moveTo(element.href.split("#")[1], this.scroller, {
            duration:this.options.duration
        });
        Event.stop(event);
    },

    moveTo: function(element, container, options){
        this.current = $(element);
        
        Position.prepare();
        var containerOffset = Position.cumulativeOffset(container),
        elementOffset = Position.cumulativeOffset($(element));

        this.scrolling 	= new Effect.SmoothScroll(container,
        {
            duration:options.duration,
            x:(elementOffset[0]-containerOffset[0]),
            y:(elementOffset[1]-containerOffset[1])
            });

        // FIXME: Dynamisieren des Slider Scrolls
        
        if (options.ignoreSlider != true) {
            var sliderMaxLeft = parseInt($('follow').getWidth() - $('ship').getWidth());
            var sliderLeft =  (elementOffset[0]-containerOffset[0]) / this.maxWidth* sliderMaxLeft;
            
            this.sliderscrolling 	=  new Effect.Morph('ship', {style:"left:"+sliderLeft+"px;", duration: 0.7});
        } else if (this.sliderscrolling) {
            this.sliderscrolling.cancel();
        }
        
        
        
        return false;
    },
		
    next: function(){
        if (this.current) {
            var currentIndex = this.current._index;
            var nextIndex = (this.sections.length - 1 == currentIndex) ? 0 : currentIndex + 1;
        } else var nextIndex = 1;

        this.moveTo(this.sections[nextIndex], this.scroller, {
            duration: this.options.duration
        });
    },
	
    previous: function(){
        if (this.current) {
            var currentIndex = this.current._index;
            var prevIndex = (currentIndex == 0) ? this.sections.length - 1 :
            currentIndex - 1;
        } else var prevIndex = this.sections.length - 1;

        this.moveTo(this.sections[prevIndex], this.scroller, {
            duration: this.options.duration
        });
    },

    moveToS: function(sectionid) {
        var index = sectionid-1;
        
        if (this.sections[index]) {
            this.moveTo(this.sections[index], this.scroller, {
                duration: this.options.duration
            });            
        } else {
            return false;
        }
    },

    stop: function() {
        clearTimeout(this.timer);
    },
	
    start: function() {
	
        this.periodicallyUpdate();
    },

    follow: function(slider, slidercontainer) {
        if (this.scrolling) this.scrolling.cancel();
        if (this.sliderscrolling) this.sliderscrolling.cancel();
        var temp1 = Element.positionedOffset($('follow'));
        var temp2 = Element.positionedOffset($('ship'));
        var posLeft = temp2[0] - temp1[0]; // Der Abstand des Sliders von rechts
        var totalLength = $('follow').getWidth() - $('ship').getWidth();
        var activeSection =  (posLeft / totalLength * this.numberOfSections).round();
        this.moveTo(this.sections[activeSection], this.scroller, {
            duration:this.options.duration,
            ignoreSlider:true
        });
        //Event.stop(event);
    },
		
    periodicallyUpdate: function() {
	
        if (this.timer != null) {
            clearTimeout(this.timer);
            this.next();
        }
        this.timer = setTimeout(this.periodicallyUpdate.bind(this), this.options.frequency*1000);
    }

});

Effect.SmoothScroll = Class.create();
Object.extend(Object.extend(Effect.SmoothScroll.prototype, Effect.Base.prototype), {
    initialize: function(element) {
  
        this.element = $(element);
        var options = Object.extend({
            x:    0,
            y:    0,
            mode: 'absolute'
        } , arguments[1] || {}  );
        this.start(options);
    },
    setup: function() {
        if (this.options.continuous && !this.element._ext ) {
            this.element.cleanWhitespace();
            this.element._ext=true;
            this.element.appendChild(this.element.firstChild);
        }
   
        this.originalLeft=this.element.scrollLeft;
        this.originalTop=this.element.scrollTop;
   
        if(this.options.mode == 'absolute') {
            this.options.x -= this.originalLeft;
            this.options.y -= this.originalTop;
        }
    },
    update: function(position) { // some topaz hooks
        // tpz ie fix for readmore pages
        var scrL = this.options.x * position + this.originalLeft
        if (ltIE8) {
          if (position == 1 && scrL == 0) {
              fixReadMoreIE('show');
          } else if (this.originalLeft == 0) {
              fixReadMoreIE('hide');
              
          }
        }
        // tpz end
        this.element.scrollLeft = this.options.x * position + this.originalLeft;
        this.element.scrollTop  = this.options.y * position + this.originalTop;
        // topazmedia IE trouble fixer. HEy, yes, position is already relatiev.
        // But IE 7 a& 6 simply forget. Yes, Always ! forget, after having rendered..
        if (ltIE8) {
          if (scrL%816 == 0) {
            $$("ul.showcaseV").each(
              function(showcaseul) {
                showcaseul.setStyle("position:relative");
              }
            );
          }
        }
    }
});
