// lightweight fader to avoid importing all of scriptaculous
function FadeIn(element, opts) {
	var duration = (opts.duration) ? opts.duration: 0.5;
	var to = (opts.to) ? opts.to : 1;
	var delay = parseInt(1000 * ((opts.delay) ? opts.delay : 0.01));

	var t0 = new Date().valueOf();
	element = $(element);
	element.setStyle({opacity: 0});
	this.nextframe = function () {
		var t = (new Date().valueOf() - t0) / 1000.0;
		if (t > duration) {
			// end
			element.setStyle({opacity: to});
			if (opts.onAfter)
				opts.onAfter();
		} else {
			var opacity = to * Math.pow(Math.sin((t / duration) * Math.PI * 0.5), 2);
			element.setStyle({opacity: opacity, display: 'block', visibility: 'visible'});
			setTimeout(this.nextframe.bind(this), 20);
		}
	};
	
	setTimeout(this.nextframe.bind(this), delay);
};

var Slideshow = {
	name: null,
	skipdur: 0,

	init: function () {
		if ($('slideshow') && $('slideshow').select('img').length > 1) {
			Slideshow.name = Slideshow.getName();
		//	Slideshow.restoreState();
			Slideshow.schedule();
		}
	},

	getName: function () {
		var src = $('slideshow').select('img')[0].src;
		var mo = /\/slides\/([^\/]+)\//.exec(src);
		return mo[1];
	},

	saveState: function () {
		var slideshow = $('slideshow');
		var slides = slideshow.select('img');
		var mo = /\/([^\/]+)$/.exec(slides[0].src);
		if (mo) {
			Cookie.set(Slideshow.name + '.frame', mo[1], 2);
			Cookie.set(Slideshow.name + '.time', new Date().getTime(), 2);
		}
	},

	restoreState: function() {
		var frame = Cookie.get(Slideshow.name + '.frame');
		var time = Cookie.get(Slideshow.name + '.time');
		if (!frame) {
			Slideshow.saveState();
			return;
		}
		Slideshow.skipdur = Math.max(0, Math.min(6000, new Date().getTime() - time));
		alert(Slideshow.skipdur);
		var slideshow = $('slideshow');
		var slides = slideshow.select('img');

		for (var i=0; i < slides.length; i++) {
			var slide = slides[i];
			var mo = /\/([^\/]+)$/.exec(slide.src);
			if (mo && mo[1] == frame) {
				break;
			}
			else {
				slideshow.appendChild(slides[i]);
			}
		}

		//set up initial states for the new order
		slides = slideshow.select('img');
		slides[0].removeClassName('waiting');
		for (var i=1; i < slides.length; i++) {
			Slideshow.requeue(slides[i]);
		}
	},

	schedule: function () {
		var slides = $('slideshow').select('img');
		if (!slides.length) return;
		var mo = /\bduration-([0-9]+\.[0-9]*)\b/.exec(slides[0].className);
		var dur = 6.0;
		if (mo)
			dur = parseFloat(mo[1]);
		setTimeout(Slideshow.next, parseInt(dur * 1000 - Slideshow.skipdur));
		Slideshow.skipdur = 0;
	},
	
	next: function () {
		var slideshow = $('slideshow');
		var slides = slideshow.select('img');
		var current = slides[0];
		var next = slides[1];
		current.style.zIndex = 2;
		next.style.zIndex = 3;
		new FadeIn(next, {duration: 1.0,
				  onAfter: function () {
			slideshow.appendChild(current);
			Slideshow.requeue(current);
			Slideshow.saveState();
			Slideshow.schedule();
		}});
		next.removeClassName('waiting');
	},

	requeue: function (slide) {
		slide.setStyle({opacity: 1, zIndex: 1});
	}
};

Event.observe(document, 'dom:loaded', Slideshow.init);
