///////////////
// Klasse: Kiosk
// Author: Markus Auer, ma@adwerba.at
// Benötigt prototype.js und erweiterte moo.fx.js
///////////////

var Kiosk = Class.create();
Kiosk.prototype = {

	// Konstruktor
	initialize: function(params) {
		this.param = {
			boardid:		'board',		// id vom DIV der alle Teaser trägt
			teaserclass:	'teaser',		// Class von den Teasern
			scrolltime:	    500,			// Zeit in ms , welche der Teaser zum Scrollen braucht
			cmdscrolltime:  0,				// Zeit in ms, für befohlenes Scrollen (falls 0, wird normale scrolltime hergenommen)
			viewtime:		0,				// Zeit in ms, bis der nächste Teaser automatisch angezeigt wird (0 = kein autoscrolling)
			wakeuptime:		0,				// Zeit in ms, nach welcher das Autoscrolling wieder aktiviert wird, wenn es durch händisches Scrollen unterbrochen wurde
			transition:		fx.sinopow2,	// bewegungsfunktion
			direction:		'right',		// Richtung des Scrollings
			arrange:		true			// bestimmt ob die einzelnen Teaser automatisch in der Position angeordnet werden
		}
		Object.extend(this.param, params || {});

		var board=$(this.param.boardid);
		// Anzeige startet mit dem ersten Teaser
		this.pos=0;	
		// Standardmässig mal kein automatisches scrollen
		this.auto=null;
		this.wakeup=null;
		// alle Teaser eruieren
		this.teasers = document.getElementsByClassName(this.param.teaserclass, board);
		// index des letzten Teasers ermitteln
		var last = this.teasers.length-1; 
		// prüfen, ob überhaupt teaser da sind
		if (last<0) { return; }
		// Array über alle Teaser erzeugen
		this.allteasers=new Array()
		for (var i = 0; i < this.teasers.length; i++) {
			this.allteasers[i] = this.teasers[i];
		}
		// vorne den letzten Teaser anhängen
		this.allteasers.unshift(board.insertBefore(this.teasers[last].cloneNode(true),this.teasers[0]));
		// hinten den ersten und zweiten Teaser anhängen
		this.allteasers.push(board.appendChild(this.teasers[0].cloneNode(true)));
		this.allteasers.push(board.appendChild(this.teasers[last==0?0:1].cloneNode(true)));
		// Richtung berechnen
		this.horizontal="left,right".indexOf(this.param.direction)>=0;
		this.forward="right,down".indexOf(this.param.direction)>=0;
		// eventuell Elemente Anordnen
		if (this.param.arrange) { this.arrangeTeasers(); }
		// Je nach Ausrichtung mit Width oder Height arbeiten
		var scrollerparams= {duration: this.param.scrolltime, transition: this.param.transition,
			 				 onComplete:this.afterScroll.bind(this) };
		if (this.horizontal) {
			// Offset für die Positionierung berechnen
			this.offset=this.teasers[last].offsetWidth-(board.offsetParent.offsetWidth/2);
			// moo.fx für die bewegung initalisieren
			this.scroller=new fx.Left( board, scrollerparams );
		} else {
			// Offset für die Positionierung berechnen
			this.offset=this.teasers[last].offsetHeight-(board.offsetParent.offsetHeight/2);
			// moo.fx für die Bewegung initalisieren
			this.scroller=new fx.Top( board, scrollerparams );
		}
		// Startpostion des Kiosks setzen
		this.scroller.set(this.calc(this.pos));
		// Autoscrolling aktivieren
		this.usermode=false; 
		this.userstop=false;
		this.afterScroll();
		// Das Scolling-Board anzeigen
		board.style.visibility='visible';
	},

	// zum nächsten Teaser scrollen (nach rechts)
	next: function(auto) { 
		this.doScroll(true,typeof(auto)=='undefined');
	},
		
	// zum vorherigen Teaser scrollen (nach links)
	prev: function(auto) { 
		this.doScroll(false,typeof(auto)=='undefined');
	},

	// Scrollvorgang einleiten
	doScroll: function(forward, userclicked) { 
		if (userclicked) { 
			this.usermode=true; 
			this.scroller.setOptions({duration:this.param.cmdscrolltime?this.param.cmdscrolltime:this.param.scrolltime});
		} else {
			this.scroller.setOptions({duration:this.param.scrolltime});
		}
		if (typeof(this.scroller)=='undefined') { return; }
		if (this.scroller.timer != null) return;
		clearTimeout(this.nextscroll);
		this.userstop=false;
		if (forward)	{
			if (this.pos==this.teasers.length) {
				this.pos=0;
				this.scroller.set(this.calc(this.pos));
			}
			this.pos++;
			this.scroller.custom(this.calc(this.pos-1),this.calc(this.pos));
		} else {
			if (this.pos==0) {
				this.pos=this.teasers.length;
				this.scroller.set(this.calc(this.pos));
			}
			this.pos--;
			this.scroller.custom(this.calc(this.pos+1),this.calc(this.pos));
		}
	},

	afterScroll: function() {
		if (!this.userstop)	{
			var time=this.usermode ? this.param.wakeuptime : this.param.viewtime;
			if (time>0)	{
				this.nextscroll = setTimeout (this.doScroll.bind(this,this.forward,false), time);
			}
		}
		this.usermode=false;
	},

	stop:function() {
		clearTimeout(this.nextscroll);
		this.nextscroll=null;
		this.userstop=true;
	},

	// berechnet die Postion zum angebenen Teaser
	calc: function(n) {
		if (this.horizontal) {
			var x=this.offset;
			for (var i = 0; i < n; i++) {
				x=x+this.teasers[i].offsetWidth;
			}
			return -x-(this.teasers[n%this.teasers.length].offsetWidth/2);
		} else {
			var y=this.offset;
			for (var i = 0; i < n; i++) {
				y=y+this.teasers[i].offsetHeight;
			}
			return -y-(this.teasers[n%this.teasers.length].offsetHeight/2);
		}
	},

	arrangeTeasers: function() {
		if (this.horizontal) {
			var x=0;
			var h=board.offsetParent.offsetHeight;
			for (var i = 0; i < this.allteasers.length; i++) {
				with (this.allteasers[i]) {
					style.position='absolute';
					style.float='none';
					style.left=x;
					style.top=(h-offsetHeight)/2;
				}
				x=x+this.allteasers[i].offsetWidth;
			}
		} else {
			var y=0;
			var w=board.offsetParent.offsetWidth;
			for (var i = 0; i < this.allteasers.length; i++) {
				with (this.allteasers[i]) {
					style.position='absolute';
					style.float='none';
					style.top=y;
					style.left=(w-offsetWidth)/2;
				}
				y=y+this.allteasers[i].offsetHeight;
			}
		}
	}

}
