var Lazzo = {};

Lazzo.BaseClass = Class.create ({
	
	initialize: function(parameter) {
		if ($('content')) {
			this.__initDomLoaded();
		} else {
			document.observe('dom:loaded', this.__initDomLoaded.bind(this));
		} 
		if (this._init) {
			this._init(parameter);
		}
	},
	
	/*
	 * Always perform this one.
	 * Calls _initDomLoaded on extended class if defined.
	 */
	__initDomLoaded: function(){
		this.baseHref		= $$('base')[0].readAttribute('href');
		this.documentBody	= $(document.body);
		
		if (this._initDomLoaded) {
			this._initDomLoaded();	
		}
		
	},

	_fireEvent: function(eventname, m){
		
		// http://blog.thinkature.com/index.php/2006/11/26/escaping-the-javascript-call-stack-with-settimeout/
		var memo = (m)? m:{};
		var f = function(){document.fire('custom:'+eventname, memo);};
		f.defer();
			
	},
	
	_observe: function(eventname, func) {
		
		document.observe('custom:'+eventname, func);
		
	},
	
	_stopObserving: function(eventname, func) {
		
		document.stopObserving('custom:'+eventname, func);
		
	},
	
	/*
	 * Different from _initDomLoaded. This one must be called specificaly in extended class with function as argument.
	 * This way we prevent a whole lot of unnecessary observers
	 */
	_onWindowResizeCall: function(func) {
		
		Event.observe(document.onresize ? document : window, "resize", func);
	
	}
	
});




Lazzo.getRound = function(){
	var b = $(document.body);
	var r = null;
	$R(1,8).each(function(i) {
		if (b.hasClassName('ronde'+i)) {
			r = i;
			throw $break;
		}
	})
	return r;
}

Lazzo.Navigator = Class.create (Lazzo.BaseClass, {
	
	_initDomLoaded: function() {
		if (this.documentBody.hasClassName('game') && this.documentBody.hasClassName('index') && this.documentBody.hasClassName('canplay')) {
			this._initNavigator();
		}
	},
	
	_initNavigator: function() {
		this.running		= false;
		var content			= $('content');
		var h1nodes 		= content.select('h1');
		var pnodes			= content.select('div.slide');
		this.nrOfSlides		= h1nodes.size();
		this.contentNode	= new Element('div');
		content.insert(this.contentNode);
		this.contentNodes	= [];

		h1nodes.each(function(node, i) {
			var wrapper			= new Element('div', {className:'wrapper'});
			var innerWrapper	= new Element('div');
			wrapper.insert(innerWrapper);
			innerWrapper.insert(node);
			innerWrapper.insert(pnodes[i]);
			this.contentNode.insert(wrapper);
			this.contentNodes.push(wrapper);
			new Scrollblock(innerWrapper);
		}, this);
		
		if ($('movie')) {
			var s1 = new SWFObject('mediaplayer/player-licensed.swf','player','704','349','9');
			s1.addParam('allowfullscreen','false');
			s1.addParam('allowscriptaccess','always');
			s1.addParam('swLiveConnect','true');
			s1.addParam('wmode','opaque');
			s1.addParam('flashvars','file=' + this.baseHref + 'movies/' + Lazzo.getRound() + '.flv&controlbar=none&stretching=exactfit&autostart=true');
			s1.write('movie');
		}
		
		this._createNavNodes();
		content.addClassName('ready');
	},
	
	_isLastSlide: function(slideIndex) {
		if ((slideIndex+1) == this.nrOfSlides) {
			return true;
		} else {
			return false;
		}
	},
	
	_whereIsPlayer: function(node, player) {
		if (!player) return 'nowhere';
		if (player.descendantOf(node)) {
			return 'current';
		} else if (node.previous('div') && player.descendantOf(node.previous('div'))) {
			return 'previous';
		} else if (node.next('div') && player.descendantOf(node.next('div'))) {
			return 'next';
		}
		return 'nowhere';
	},
	
	_insertPrev: function(node, i) {
		var link = new Element('div', {className:'previous'}).update('vorige');
		node.insert(link);
		link.observe('click', this._movePrevious.bind(this, node, i));
	},
	
	_insertNext: function(node, i) {
		var link = new Element('div', {className:'next'}).update('volgende');
		node.insert(link);
		link.observe('click', this._moveNext.bind(this, node, i));
	},

	_movePrevious: function(node, i) {
		if (this.running) {return;}
		this.running = true;
		var player = $('player');			
		var afterfinishDo = Prototype.emptyFunction;
		if (this._whereIsPlayer(node, player) == 'previous') {
			afterfinishDo = function(){player.sendEvent("PLAY","true");};
		}
		if (this._whereIsPlayer(node, player) == 'current') {
			player.sendEvent("PLAY","false");
			//afterfinishDo = function(){player.sendEvent("PLAY","false");};
		}
		var afterfinish = function() {
			this.running = false;
			afterfinishDo();
		}.bind(this);
		new Effect.Move(this.contentNode, { fps:25, transition: Effect.Transitions.sinoidal, duration:2, x: 4900, y: 0, mode: 'relative', afterFinish: afterfinish});
	},
	
	_moveNext: function(node, i) {
		if (this.running) {return;}
		this.running = true;
		var player = $('player');			
		var afterfinishDo = Prototype.emptyFunction;
		
		if (this._whereIsPlayer(node, player) == 'next') {
			afterfinishDo = function(){player.sendEvent("PLAY","true");};
		}
		if (this._whereIsPlayer(node, player) == 'current') {
			player.sendEvent("PLAY","false");
			//afterfinishDo = function(){player.sendEvent("PLAY","false");};
		}
		var afterfinish = function() {
			this.running = false;
			afterfinishDo();
			if (this._isLastSlide(i)) {
				location.href = this.baseHref+'game/start';
			}
		}.bind(this);
		new Effect.Move(this.contentNode, { fps:25, transition: Effect.Transitions.sinoidal, duration:2, x: -4900, y: 0, mode: 'relative', afterFinish: afterfinish});
	},

	_createNavNodes: function() {
		var s = this.nrOfSlides;
		this.contentNodes.each(function(node, i) {
			if (i!=0) this._insertPrev(node, i);
			if (i<s) this._insertNext(node, i);
		}, this);
	}
	
});
Lazzo.navigator = new Lazzo.Navigator();

Lazzo.BuildBackground = Class.create (Lazzo.BaseClass, {
	
	_initDomLoaded: function() {
	
		if (this.documentBody.hasClassName('finish')) {
			var round			= Lazzo.getRound();
			var backgroundround	= round+1;
			var element			= new Element('img', {className:'changebackground', src:this.baseHref+'images/background/game' + backgroundround + '.jpg'});
			element.setOpacity(0);
			$('content').insert({top:element});
			Sound.play(this.baseHref+'sounds/magic-spell.mp3');	
			element.appear({duration:5, delay:2});
			
			// cupboard item
			var cupboardround	= round - 1;
			var cupboard		= $('cupboard');
			var canvas			= $('canvas');
			var txt				= cupboard.down('dt', cupboardround);
			var icon			= cupboard.down('dd', cupboardround);
			
			Effect.Pulsate(icon, { delay: 7 ,pulses: 15, duration: 2 });
			
			var f = function(){
				Sound.play(this.baseHref+'sounds/radarping.mp3');
				canvas.addClassName('visible');
				txt.addClassName('finishedtxt');
				icon.addClassName('finished' + round);
			}.bind(this);
			f.delay(9);
		}
	}
	
	
});
new Lazzo.BuildBackground();

Lazzo.Scroll = Class.create (Lazzo.BaseClass, {
	
	_initDomLoaded: function() {
		var canvas	= $('canvas');
		var hasform	= false;
		if (canvas)	{hasform = canvas.down('form')};
		if (canvas && !hasform) {
			var element = canvas.down('div');
			new Scrollblock(element);			
		}
	}
	
	
});
new Lazzo.Scroll();


Lazzo.DisableLinks = Class.create (Lazzo.BaseClass, {
	
	_initDomLoaded: function() {
		['menu-winnaars'].each(function(link) {
			var l = $(link);
			if (l) {
				l.removeAttribute('href');
			}
		});
	}
	
	
});
new Lazzo.DisableLinks();



Lazzo.GenericTimer = Class.create (Lazzo.BaseClass, {
	
	_init: function(node) {
	
		this.timerNode		= node;
	
		function pad(n){return n<10 ? '0'+n : n;}
		var d						= new Date();

		function getTime(){

			var newtime = new Date (new Date() - d);
			var sec		= pad(newtime.getSeconds());
			var min		= pad(newtime.getMinutes());
			
			return min+':'+sec;
		}
		var timerNode = this.timerNode;
		this.interval = setInterval(function(){timerNode.update(getTime());}, 300);	
	
	},
	
	getElapsed: function() {
		return this.timerNode.innerHTML;
	},
	
	stop: function() {
		clearInterval(this.interval);
	}

});









