/*  JavaScript text slideshow, version 0.9
 *  (c) 2008 Matthias Wiede
 *  http://www.mwiede.de/
 *
/*--------------------------------------------------------------------------*/

// Global vars
var slideFadingTime = 1500;
var slideFadingPrecision = 0.05;

function OpacityFader (obj, obj2, time, finishFunc)
{
	this.opacity = 0;
	this.opacity2 = 1;
	this.timer = 0;
	this.obj = obj;
	this.obj2 = obj2;	
	this.precision = slideFadingPrecision;
	this.time = Math.round (time / (1 / this.precision),0);
	this.maxSteps = (1 / this.precision);
	this.stepIdx = 0;
	this.direction = 1;
	this.finishFunc = finishFunc;

	this.onFadingStart = function () {
		var self = this;
		this.opacity  = (this.direction ? 1 : 0);
		this.opacity2 = (this.direction ? 0 : 1);
		setTransparency (this.obj, this.opacity);
		setTransparency (this.obj2, this.opacity2);
		this.timer = setInterval (function () { self.onFadingProgress () }, this.time);
	}
	
	this.onFadingFinish = function () {
		if (this.finishFunc)
			this.finishFunc ();
	}
	
	this.onFadingProgress = function () {
		var self = this;
		var p = this.stepIdx*this.precision;
		// p =  (Math.exp (p)-1) / (Math.E-1);
		// p = Math.pow (p,0.25); 
		if (!this.direction) {			
			this.opacity  = p;
			this.opacity2 = 1-this.opacity;
		}
		else {
			this.opacity2 = p;
			this.opacity  = 1-this.opacity2;
		}
		
		setTransparency (this.obj, this.opacity);
		setTransparency (this.obj2, this.opacity2);
		if (this.stepIdx >= this.maxSteps) {
			clearInterval (this.timer);
			this.onFadingFinish ();
		}
		this.stepIdx++;
	}

	this.startFading = function (direction) {
		this.direction = direction;
		this.stepIdx = 0;
		this.onFadingStart ();
	}
	
	this.stopFading = function () {
		if (this.timer) {
			clearInterval (this.timer);
			this.timer = null;
		}
	}
}


function Slideshow (targetId, textItems, time, effectType, fRandom, fPreload)
{
	this.targetDiv = document.getElementById (targetId);
	this.targetText = this.targetDiv; // .childNodes[0];
	this.overlayDiv = null;
	this.overlayText = null;
	this.fadingTime = slideFadingTime;
	this.effectType = effectType; // 0 = no effect, 1 = fading simple, 2 = fading overlay
	this.slideTime  = time * 1000;
	this.slideTimer = null;
	this.slideIdx = 0;
	this.navOffs = 1;
	this.textItems = textItems;
	this.fader = null; 
	this.fadingDirection = 0;	
	this.fRandom = fRandom;
	this.fPreload = fPreload;
	this.fStop = false;
	this.fFirstStart = false;
	this.fTimedSlide = true;

	this.init = function () {
		var self = this;		


		this.targetText.style.visibility = "hidden";

		if (this.effectType==2) {				
			// Create overlay image
			var text = document.createElement("div");
			var div = document.createElement("div");
			text.style.visibility = "hidden";
	

			// Get correct position 
			var x = this.targetDiv.offsetLeft;
			var y = this.targetDiv.offsetTop;	
			
			text.id = this.targetDiv.id+'_overlay';
			text.style.left = x+'px';
			text.style.top  = y+'px';	
			text.style.position = "absolute";

			// setClass ("add", div, "slideText", "");		

			
			// div.appendChild (text);
			if (this.targetDiv.offsetParent)
				this.targetDiv.offsetParent.appendChild (text);
			else
				document.getElementsByTagName("body")[0].appendChild (text);
			this.overlayText = text;
			this.overlayDiv = div;
		}

	

		// Create Fader
		this.fader = new OpacityFader (this.targetText, this.overlayText, this.fadingTime, 
			function () { self.onFadingFinish () });
	}
	
	this.getRandomIdx = function (prevIdx) {
		var idx = 0;
		do {
			idx = Math.floor(Math.random()*this.textItems.length);
		} while (prevIdx==idx && this.textItems.length>1);
		return idx;
	}

	this.onNextSlide = function () {
		var self = this;
		var flag = true;
		if (this.effectType==1) {
			this.fadingDirection^=1;		
			if (this.fadingDirection==1) {
				flag = false;
				this.fader.startFading (this.fadingDirection); // Fading out
			}
		}
		this.fFirstStart = false;
		if (flag) {
			var prevSlideIdx = this.slideIdx;
			if (this.fRandom) {
				this.slideIdx = this.getRandomIdx (prevSlideIdx);
			}
			else {
				this.slideIdx+=this.navOffs;
				if (this.slideIdx>=this.textItems.length)
					this.slideIdx=0;
				if (this.slideIdx<0)
					this.slideIdx=(this.textItems.length-1);
			}
			this.targetText.innerHTML = document.getElementById (this.textItems[this.slideIdx][0]).innerHTML;
			if (this.overlayText)
				this.overlayText.innerHTML = document.getElementById (this.textItems[prevSlideIdx][0]).innerHTML;
				
			if (this.effectType==0) {
				if (this.fTimedSlide)
					this.menuTimer = setTimeout(function () { self.onNextSlide () }, this.slideTime);
			}
			else
			if (this.effectType==1)
				this.fader.startFading (0); // Fading in
			else
			if (this.effectType==2)
				this.fader.startFading (this.fadingDirection);	
		}
	}
	
	this.showNextSlide = function () {
		this.stopSlideshow ();
		this.navOffs = 1;		
		this.onNextSlide ();
	}
	
	this.showPrevSlide = function () {
		this.stopSlideshow ();
		this.navOffs = -1;
		this.onNextSlide ();
	}

	this.onFadingFinish = function () {
		var self = this;
		var flag = true;
		if (this.effectType==1 && this.fadingDirection==1) {			
			this.onNextSlide ();
			flag = false;
		}
		if (flag && this.fTimedSlide && !this.fStop) {
			this.menuTimer = setTimeout(function () { self.onNextSlide () }, this.slideTime);
		}
	}
	

	
	this.startSlideshow = function (fTimedSlide, slideIdx) {		

		var self = this;
		this.stopSlideshow ();
		this.fStop = false;
		this.fTimedSlide = fTimedSlide;
		this.fFirstStart = true;
		this.fadingDirection = 0;
		this.navOffs = 1;
		this.slideIdx = 0;
		if (slideIdx) {
			if (slideIdx==-1)
				this.slideIdx = this.getRandomIdx (-1);
			else
				this.slideIdx = slideIdx;
		}		
		this.targetText.innerHTML = document.getElementById (this.textItems[this.slideIdx][0]).innerHTML;
			
		setTransparency (this.targetText, 1);
		this.targetText.style.visibility = "visible";
		if (this.overlayText) {			
			setTransparency (this.overlayText, 0);	
			this.overlayText.style.visibility = "visible";
		}
		if (this.effectType==1)
			this.fader.startFading (this.fadingDirection);	
		else {
			if (this.fTimedSlide)
				this.menuTimer = setTimeout(function () { self.onNextSlide () }, this.slideTime);
		}
	}

	this.stopSlideshow = function () {
		this.fStop = true;
		this.fTimedSlide = false;
		if (this.fader)
			this.fader.stopFading ();
		if (this.menuTimer) {		
			clearTimeout (this.menuTimer);
			this.menuTimer=null;
		}	
	}

	this.resumeSlideshow = function () {
		if (this.fStop) {
			this.navOffs = 1;
			this.fStop = false;
			this.fTimedSlide = true;
			this.onNextSlide ();
		}
	}
	this.init ();	
}

function initQuoteSlideshow (seconds, method) 
{ 
	// Create fader array
	items = new Array ();
	var itemCnt = 0;
	while (itemCnt<1000) {
		var id = "slide_content_"+(itemCnt+1);
		if (!document.getElementById (id)) {
			break;
		}
		items[itemCnt] = new Array (id, "");
		itemCnt++;
	}	
	if (itemCnt<=1)
		return;

	if (navigator.appName.indexOf("Opera")!=-1) {
		method = 0;
	}

	// Create slideshow object
	show = new Slideshow (
		"slideshow",    // Slide div		
		items,          // Slide id array
		seconds, 	      // Seconds
		method, 				// Effect: 0 = simple, 1 = fading simple, 2 = fading overlay
		false, 			    // Random
		true 				    // Preload images
	);

	// Start slideshow
	show.startSlideshow (true, -1);
	
}

