
var diashow = Class.create( {
	initialize: function (scroller, slides, controls, jumpers, controlStart, controlStop, options) {
		this.scrolling	= false;
		this.scroller	= $(scroller);
		this.slides		= slides;
		this.controls	= controls;
		this.jumpers	= jumpers;
		this.controlStart	= controlStart;
		this.controlStop	= controlStop;

		this.options    = Object.extend({
            duration:           1,
            auto:               false,
            frequency:          3000,
            visibleSlides:      1,
            controlClassName:   'diashow-control',
            jumperClassName:    'diashow-jumper',
			controlStartClassName:   'diashow-start',
			controlStopClassName:   'diashow-stop',
            disabledClassName:  'diashow-disabled',
            selectedClassName:  'diashow-selected',
            circular:           false,
            effect:             'fade',
            transition:         'sinoidal',
			crossfade:			false,
			clickresume:		false

        }, options || {});

        if (this.options.effect == 'fade') {
            this.options.circular = true;
        }

		this.slides.each(function(slide, index) {
			slide._index = index;
        });

		if (this.controls) {
            this.controls.invoke('observe', 'click', this.click.bind(this));
        }

		if (this.jumpers) {
            this.jumpers.invoke('observe', 'click', this.click.bind(this));
        }

		if (this.controlStart) {
            this.controlStart.invoke('observe', 'click', this.click.bind(this));
        }

		if (this.controlStop) {
            this.controlStop.invoke('observe', 'click', this.click.bind(this));
        }

        if (this.options.auto) {
            this.start();
        }

		if (this.options.initial) {
			var initialIndex = this.slides.indexOf($(this.options.initial));
			if (initialIndex > (this.options.visibleSlides - 1) && this.options.visibleSlides > 1) {
				if (initialIndex > this.slides.length - (this.options.visibleSlides + 1)) {
					initialIndex = this.slides.length - this.options.visibleSlides;
				}
			}
            this.moveTo(this.slides[initialIndex]);
		}

	if(this.options.visibleSlides >= this.slides.length && this.options.effect == 'scroll')
		{
		this.deactivateControls();
		}
	},

	click: function (event) {
		this.stop();

		var element = event.findElement('a');

		if (!element.hasClassName(this.options.disabledClassName))
			{
			if (element.hasClassName(this.options.controlClassName))
				{
				eval("this." + element.rel + "()");
				}
            else if (element.hasClassName(this.options.jumperClassName))
            	{
                this.moveTo(element.rel);
                if (this.options.selectedClassName)
                	{
                    this.jumpers.invoke('removeClassName', this.options.selectedClassName);
                    element.addClassName(this.options.selectedClassName);
                	}
            	}
			this.deactivateControls();
        	}

		event.stop();
    },

	moveTo: function (ziel) {
		if (this.options.beforeMove && (typeof this.options.beforeMove == 'function')) {
			this.options.beforeMove();
        }

		this.slides.each(
			function(e){
				if(e.hasClassName('aktiv'))
					{
					aktiv = e;
					}
				});

		this.previous = this.current ? this.current : this.slides[0];
		this.current = $(ziel);

		var scrollerOffset = this.scroller.cumulativeOffset();
		var elementOffset  = this.current.cumulativeOffset();

		if (this.scrolling) {
			this.scrolling.cancel();
		}

	if(this.options.crossfade == true)
		{
		this.scrolling = new Effect.Appear(aktiv, {
			from:   1.0,
			to:     0,
			duration: this.options.duration,
			afterFinish: (function () {
				aktiv.removeClassName('aktiv');
				aktiv.addClassName('inaktiv');
				aktiv.style.display = 'none';
			}
		).bind(this)});

		this.scrolling2 = new Effect.Appear(ziel, {
				from: 0,
				to: 1.0,
				duration: this.options.duration,
				afterFinish: (function () {
					$(ziel).removeClassName('inaktiv');
					$(ziel).addClassName('aktiv');
					if (this.controls) {
						this.activateControls();
					}
					if(this.options.clickresume == true) {
						clearTimeout(this.timer);
						this.timer = setTimeout(this.periodicallyUpdate.bind(this), this.options.frequency);
					}
				}).bind(this)
			});
		}
	else
		{
		this.scrolling = new Effect.Appear(aktiv, {
			from:   1.0,
			to:     0,
			duration: this.options.duration / 2,
			afterFinish: (function () {
				aktiv.removeClassName('aktiv');
				aktiv.addClassName('inaktiv');
				aktiv.style.display = 'none';
				$(ziel).style.display = 'none';
				new Effect.Appear(ziel, {
					from: 0,
					to: 1.0,
					duration: this.options.duration / 2,
					afterFinish: (function () {
						$(ziel).removeClassName('inaktiv');
						$(ziel).addClassName('aktiv');
						if (this.controls) {
							this.activateControls();
						}
						if(this.options.clickresume == true) {
							clearTimeout(this.timer);
							this.timer = setTimeout(this.periodicallyUpdate.bind(this), this.options.frequency);
						}
					}).bind(this)
				});
			}
		).bind(this)});
		}

		return false;
	},

	prev: function () {
		if (this.current) {
			var currentIndex = this.current._index;
			prevIndex = (currentIndex == 0) ? (this.options.circular ? this.slides.length - 1 : 0) : currentIndex - 1;
        } else {
            prevIndex = (this.options.circular ? this.slides.length - 1 : 0);
        }

		if (prevIndex == (this.slides.length - 1) && this.options.circular && this.options.effect != 'fade') {
			this.scroller.scrollLeft =  (this.slides.length - 1) * this.slides.first().getWidth();
			this.scroller.scrollTop =  (this.slides.length - 1) * this.slides.first().getHeight();
			prevIndex = this.slides.length - 2;
        }

		this.moveTo(this.slides[prevIndex]);
		this.jumpers.invoke('removeClassName', this.options.selectedClassName);
		if($(this.jumpers[prevIndex]))
			{
			$(this.jumpers[prevIndex].id).addClassName(this.options.selectedClassName);
			}
	},

	next: function () {
		if (this.current) {
			var currentIndex = this.current._index;
			nextIndex = (this.slides.length - 1 == currentIndex) ? (this.options.circular ? 0 : currentIndex) : currentIndex + 1;
        } else {
            nextIndex = 1;
        }

		if (nextIndex == 0 && this.options.circular && this.options.effect != 'fade') {
			this.scroller.scrollLeft = 0;
			this.scroller.scrollTop  = 0;
			nextIndex = 1;
        }

		if (nextIndex > this.slides.length - (this.options.visibleSlides + 1)) {
			nextIndex = this.slides.length - this.options.visibleSlides;
		}

		this.moveTo(this.slides[nextIndex]);
		this.jumpers.invoke('removeClassName', this.options.selectedClassName);

		if($(this.jumpers[nextIndex]))
			{
			$(this.jumpers[nextIndex].id).addClassName(this.options.selectedClassName);
			}
	},

	first: function () {
		this.moveTo(this.slides[0]);
    },

	last: function () {
		this.moveTo(this.slides[this.slides.length - 1]);
    },

	toggle: function () {
		if (this.previous) {
			this.moveTo(this.slides[this.previous._index]);
        } else {
            return false;
        }
    },

	stop: function () {
		if (this.timer) {
			clearTimeout(this.timer);
		}
	},

	start: function () {
        this.periodicallyUpdate();
    },

	pause: function () {
		this.stop();
		this.activateControls();
    },

	resume: function (event) {
		if (event) {
			var related = event.relatedTarget || event.toElement;
			if (!related || (!this.slides.include(related) && !this.slides.any(function (slide) {return related.descendantOf(slide);}))) {
				this.start();
            }
        } else {
            this.start();
        }
    },

	periodicallyUpdate: function () {
		if (this.timer != null) {
			clearTimeout(this.timer);
			this.next();
        }
		this.timer = setTimeout(this.periodicallyUpdate.bind(this), this.options.frequency);
    },


	deactivateControls: function () {
		this.controls.invoke('addClassName', this.options.disabledClassName);
    	this.jumpers.invoke('addClassName', this.options.disabledClassName);
		this.controlStop.invoke('removeClassName', this.options.disabledClassName);
		this.controlStart.invoke('addClassName', this.options.disabledClassName);

    },

	activateControls: function () {
    	this.controls.invoke('removeClassName', this.options.disabledClassName);
		this.jumpers.invoke('removeClassName', this.options.disabledClassName);
		this.controlStop.invoke('addClassName', this.options.disabledClassName);
		this.controlStart.invoke('removeClassName', this.options.disabledClassName);

    	if(this.options.effect == 'scroll')
	    	{
	    	if(this.current._index == 0)
	    		{
	    		arrayInaktiv = new Array(this.controls[0]);
	   			arrayInaktiv.invoke('addClassName', this.options.disabledClassName);
				}
			letztes = this.current._index + this.options.visibleSlides;

			if(letztes == this.slides.length)
	    		{
	    		arrayInaktiv = new Array(this.controls[1]);
	   			arrayInaktiv.invoke('addClassName', this.options.disabledClassName);
				}
			}
	}
});


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) {
		this.element.scrollLeft = this.options.x * position + this.originalLeft;
		this.element.scrollTop  = this.options.y * position + this.originalTop;
    }
});
