/* 
** JavaScript for mastersinleiden.nl
** Requires MooTools Core v1.2.4
** v1.11 - 20100715
** Lodewijk Schutte ~ Low - freelance@loweblog.com
*/

// -----------------------------------------------------------------------
//	Initiate global MIL object - Namespace
// -----------------------------------------------------------------------

var MIL = new Object();

MIL.Default = {
	flashVersion : 7,
	init	: function(){
		$(document.body).addClass('js-on');
		if (location.hash == '#flash') {
			alert(Browser.Plugins.Flash.version);
		}
	}
};


MIL.Language = {
	langs: ['nl', 'en'],
	lines: {
		'close' : ['Sluiten', 'Close'],
		'read_more' : ['Lees verder', 'Read more'],
		'show_graph' : ['Toon grafiek', 'Show graph']
	},
	line: function(key){
		return this.lines[key][this.current] || key;
	},
	init: function(){
		var index = this.langs.indexOf(document.domain.substring(0, 2));
		this.current = (index == -1) ? 0 : index;
	}
};


MIL.Facts = {
	toggle	: function(event) {
		this.element.toggleClass('closed');
		event.preventDefault();
	},
	init	: function() {
		this.element = $('facts');
		if (!this.element) return;
		
		this.trigger = new Element('a', {
			'href'	: '#facts',
			'class'	: 'factsbutton',
			'text'	: 'show/hide facts',
			'events': {
				'click'	: this.toggle.bindWithEvent(this)
			}
		}).inject(this.element);

	}
};


MIL.Calculate = {
	submit	: function(event) {
		this.form.send();
		event.preventDefault();
	},
	show	: function(snippet) {
		this.target.set('html', snippet);
	},
	init	: function() {
		this.form = $('calculate');
		this.target = $('prog-meta-results');
		
		if (!this.form || !this.target) return;

		this.form.addEvent('submit', this.submit.bindWithEvent(this));		
		this.form.set('send',{
			url		: this.form.action,
			onComplete	: this.show.bind(this)
		});
		

	}
};

MIL.SearchForm = {
	form: undefined,
	keywords: undefined,
	invalid: [';','(',')','?'],
	
	sanatize: function(e) {

		var pattern = RegExp(this.invalid.join('|\\'), 'g');
		var val = this.keywords.value.replace(pattern, '').trim();

		if (val.length > 0) {
			this.keywords.value = val;
			this.form.submit();
			e.preventDefault();
		} else {
			return false;
		}
	},

	init: function() {
		this.form = $('search');
		this.keywords = $('q');
		if (!this.form || !this.keywords) return;
		
 		this.form.addEvent('submit',this.sanatize.bindWithEvent(this));
	}
};

MIL.HeaderImage = {
	init: function() {
		var image = $('prog-header');
		var header = $('header');
		
		if (!image || !header) return;
		
		header.setStyle('background-image', 'url('+image.src+')');
		image.destroy();
	}
};


MIL.ModalWindow = {
	open: function(obj, cb) {
		
		// clear existing content
		this.overlay.inject(document.body);
		this.container.inject(document.body);
		
		// reposition container
		this.container.setStyle('top', 75 + window.getScroll().y);

		if ($type(obj) == 'element') {

			// inject new element into container
			this.container.adopt(obj);
			
			// resize to new content
			this.resize(obj.width, obj.height);

			// execute callback function
			if ($type(cb) == 'function') cb();
		
		} else if ($type(obj) == 'string') {

			// Ajax call?

		} else if ($type(obj) == 'boolean') {

			// Something else?

		}

		// add close link
		this.closeLink.inject(this.container);

	},
	resize: function(w, h) {
		this.container.setStyles({
			width: parseInt(w),
			height: parseInt(h),
			marginLeft: -(parseInt(w)/2)
		});
	},
	close: function() {
		this.closeLink.dispose();
		this.overlay.dispose();
		this.container.dispose();
		this.container.empty();
		return false;
	},
	init: function() {
		this.overlay = new Element('div', {
			id: 'mw-overlay',
			styles: {
				background: '#000',
				opacity: 0.5
			},
			events:{
				click:this.close.bind(this)
			}
		});
		this.container = new Element('div', {id: 'mw-container'});
		this.closeLink = new Element('a',{
			id: 'mw-close',
			href: '#close',
			events: {
				click: this.close.bind(this)
			},
			text: MIL.Language.line('close')
		});
	}
};



MIL.PieChart = {
	create: function(ul, modal) {

		var data = '';
		var lis = ul.getElements('li');

		for (var i = 0, l = lis.length; i < l; i++) {
			var txt = lis[i].get('text').trim();
			var m = false;
			if (m = txt.match(/^(.*?):\s*(\d+)%?$/)) {
				data += '<slice title="'+m[1]+'">'+m[2]+'</slice>';
			} 
		}
		
		if (!data) return;
		
		var options = {
			width: (modal?'448':'440'),
			height: (modal?'397':'325'),
			params: {wmode:'opaque'},
			container: (modal?null:ul),
			vars: {
				chart_data: '<pie>'+data+'</pie>',
				settings_file: '/flash/ampie_settings.xml',
				path: '/flash/'
			}
		};

		var swf = new Swiff('/flash/ampie.swf', options);

		if (modal === true) {
			MIL.ModalWindow.open(swf.object);
		}
	},
	init: function() {
		if (Browser.Plugins.Flash.version < MIL.Default.flashVersion) return;
		$$('#primary ul.piechart').each(function(el){
			this.create(el, false);
		}, this);
	}
};

MIL.BarChart = {
	create: function(ul, modal) {

		var data = '', series = '', graphs = '';
		var value = '<value xid="%k">%v</value>';
		var lis = ul.getElements('li');

		for (var i = 0, l = lis.length; i < l; i++) {
			var txt = lis[i].get('text').trim();
			var m = false;
			if (m = txt.match(/^(.*?):\s*(\d+)%?$/)) {
				var val = value.replace('%k', i);
				series += val.replace('%v', m[1]);
				graphs += val.replace('%v', m[2]);
			} 
		}
		
		if (!series) return;
		
		var options = {
			width: (modal?'448':'460'),
			height: (modal?'397':'260'),
			params: {wmode:'opaque'},
			container: (modal?null:ul),
			vars: {
				chart_data: '<chart><series>'+series+'</series><graphs><graph gid="0">'+graphs+'</graph><graphs></chart>',
				settings_file: '/flash/amcolumn_settings.xml',
				path: '/flash/'
			}
		};

		var swf = new Swiff('/flash/amcolumn.swf', options);

		if (modal === true) {
			MIL.ModalWindow.open(swf.object);
		}
	},
	init: function() {
		if (Browser.Plugins.Flash.version < MIL.Default.flashVersion) return;
		$$('#primary ul.barchart').each(function(el){
			this.create(el, false);
		}, this);
	}
};


MIL.Extras = {
	video: function(el) {
		var trigger = el.getElement('a.video');
		
		if (!trigger) return;
		
		trigger.addEvent('click',function(e){
			e.stop();

			var swf = new Swiff('/flash/videoplayer.swf',{
				width: '448',
				height: '397',
				params: {wmode:'opaque'},
				vars: {XMLfile: '/ajax/video/'+trigger.id.split('-')[1]}
			});

			MIL.ModalWindow.open(swf.object);

		});

	},
	piechart: function(el) {
		var ul = el.getElement('ul');
		
		if (!ul || (Browser.Plugins.Flash.version < MIL.Default.flashVersion)) return;
		
		var trigger = new Element('a', {
			href: '#mw-container',
			text: MIL.Language.line('show_graph'),
			events: {click:function(e){
				e.stop();
				MIL.PieChart.create(ul, true);
			}}
		}).addClass('trigger');
		
		trigger.inject(ul, 'after');
		ul.dispose();
	},
	barchart: function(el) {
		var ul = el.getElement('ul');
		
		if (!ul || (Browser.Plugins.Flash.version < MIL.Default.flashVersion)) return;
		
		var trigger = new Element('a', {
			href: '#mw-container',
			text: MIL.Language.line('show_graph'),
			events: {click:function(e){
				e.stop();
				MIL.BarChart.create(ul, true);
			}}
		}).addClass('trigger');
		
		trigger.inject(ul, 'after');
		ul.dispose();
	},
	testimonial: function(el) {
		var quote = el.getElement('blockquote');
		var els = quote.getElements('p, ul');
		
		if (els.length == 1) return;
		
		for (var i = 1; i < els.length; i++) {
			els[i].addClass('hidden');
		}
		
		var trigger = new Element('a',{
			href: '#',
			text: MIL.Language.line('read_more'),
			events: {click:function(e){
				e.stop();
				var div = el.clone();
				
				div.getElements('.hidden').removeClass('hidden');
				div.getElement('a.trigger').dispose();
				
				MIL.ModalWindow.open(div);
			}}
		}).addClass('trigger');
		
		trigger.inject(els[0], 'after');
		
	},
	init: function() {

		// Don't execute on homepage
		if (document.body.id == 'hpage') return;
		
		// Get extras in <div id="secondary">
		var extras = $$('#secondary .extra'),
			total;
		

			
		// No extras? exit
		if (!(total = extras.length)) return;

		for (var i = 0; i < total; i++) {
			extras[i].setAttribute('id', 'extra'+(i+1));
			// Video extras
			if (extras[i].hasClass('video')) {
				this.video(extras[i]);
			}
			// Pie chart extras
			if (extras[i].hasClass('pie')) {
				this.piechart(extras[i]);
			}
			// Bar chart extras
			if (extras[i].hasClass('bar')) {
				this.barchart(extras[i]);
			}
			// Testimonials
			if (extras[i].hasClass('testimonial')) {
				this.testimonial(extras[i]);
			}
		}
	}
};


MIL.Autocompleter = {
	url: '/ajax/autocompleter/',
	options: {
		'indicatorClass': 'loading',
		'width': '200px',
		'autoSubmit': true
	},
	init: function() {
		
		// get autocomplete field
		this.field = $('p-keywords');

		// no field? bail
		if (!this.field) return;

		// Init Autocompleter
		// new Autocompleter.Request.HTML(this.field, this.url, this.options);

	}
};


MIL.HomeSlides = {
	interval: 10, // slide movement interval in seconds
	currentSlide: 1,
	move: function() {
		var left = (this.currentSlide == this.slideCount) ? 0 : -(this.currentSlide * this.slideSize);
		this.fx.start(left);
	},
	moved: function() {
		this.currentSlide = (this.currentSlide == this.slideCount) ? 1 : this.currentSlide + 1;
		this.updateRecord();
	},
	stop: function() {
		window.clearInterval(this.timer);
		this.timer = false;
	},
	start: function() {
		this.timer = window.setInterval(this.move.bind(this), (this.interval * 1000));
	},
	toggle: function() {
		(this.timer) ? this.stop() : this.start();
	},
	updateRecord: function() {
		var txt = '';
		for (var i = 1; i <= this.slideCount; i++) {
			txt += (i == this.currentSlide) ? ' • ' : ' · ';
		}
		this.record.set('text', txt);
	},
	init: function() {
		this.element = $('slides');
		this.slides = $$('.slide');
		
		if (!this.element || this.slides.length <= 1) return;
		
		// get slide width and number
		this.slideSize = this.slides[0].getSize().x;
		this.slideCount = this.slides.length;
		
		this.record = new Element('div',{
			id: 'slidecounter',
			events: {click: this.toggle.bind(this)}
		});
		this.record.inject(this.element.getParent());
		this.updateRecord();
		
		// initiate element styles
		this.element.setStyles({
			'left': 0,
			'width': (this.slideSize * this.slideCount)
		});
	
		// create slide effect
		this.fx = new Fx.Tween(this.element, {property:'left',duration:1000});
		this.fx.addEvent('complete', this.moved.bind(this));
		
		this.start();
	}
};


MIL.LinkTargets = {
	init: function() {
		var A = $$('#content a');
		for (var i = 0, j = A.length; i < j; i++) {
			if (A[i].href.match(/\.(pdf|doc)$/)) {
				A[i].target = '_blank';
			}
		}
	}
};

// -----------------------------------------------------------------------
//	Process inits
// -----------------------------------------------------------------------

(function(){

	for (var i in MIL) {
		if (typeof MIL[i].init == 'function') {
			// Execute init-function onDomReady
			window.addEvent('domready', MIL[i].init.bind(MIL[i]));
		}
	}

})();
