/*
* Cache van javascripts.script.js
* Created: 2010-08-16 15:49:24
*/

/*
$Author: sjors $
$LastChangedDate: 2006-10-19 14:05:31 +0200 (do, 19 okt 2006) $
$Id: javascripts.js 28 2006-10-19 12:05:31Z sjors $
$Rev: 28 $
*/

var google = 'UA-9615770-2';
if (google) {
	var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
	document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
}

window.addEvent('load', function(e) {
	if (google && _gat) {
		var pageTracker = _gat._getTracker(google);
		pageTracker._initData();
		pageTracker._trackPageview();
	}

	$$('.slider').each(function(sliderdiv) {
		new slider(sliderdiv, false, sliderdiv.getElements('.element')).init();
	});

	var defopen = -1;
	$$('.faq .toggler').each(function(a, i) {
		a.addEvent('click', function(e) {
			e.stop();
		});
		if (defopen == -1 && document.location.href.substr(document.location.href.indexOf('#')) == a.get('href')) {
			defopen = i;
		}
	});
	new Accordion($$('.faq .toggler'), $$('.faq .details'), {
		'display': defopen,
		'alwaysHide': true
	});
});

window.addEvent('domready',function(){

	$(document.body).addClass('js');
	$$('.jsonly').removeClass('jsonly');

	$$('ul#mainmenu ul').each(function(list) {
		list.getElements('li').each(function(el, i) {
			if (i > 0) {
				new Element('li').set('html', '|').inject(el, 'before');
			}
		});
	});

	if ($('project-search')) {
		$$('form#project-search input.submit').setStyle('display', 'none');
	}

	$$('ul#menuhome ul li').each(function(li) {
		li.set('html', '&raquo; ' + li.get('html'));
	});

	$('mainmenu').addEvent('click', function(e) {
  	var el = $(e.target)
  	if (el.tagName.toLowerCase() == 'a') {
			var li = el.getParent('li');
  		if (li.getElement('ul')) {
				$$('ul#mainmenu li.current').removeClass('current');
				li.addClass('current');
			}
  	}
	});

	// Put label in value
	$$('input.labelinside').each(function(inp) {
		var labelvalue = inp.getPrevious('label').setStyle('display', 'none').get('text');
		inp.addEvent('focus', function(e) {
			if (inp.get('value') == labelvalue) {
				inp.set('value', '');
				inp.removeClass('defaultvalue');
			}
		});
		inp.addEvent('blur', function(e) {
			if (inp.get('value') == '' || inp.get('value') == labelvalue) {
				inp.set('value', labelvalue);
				inp.addClass('defaultvalue');
			}
		});
		inp.fireEvent('blur');
	});

	if ($('tagcloud')) {
		new TagCloud('tagcloud').draw();
	}

});

window.addEvent('load',function(){

	new mouseOvers();

	new imageFader($$('div.imgfader img'), {duration: 1500, interval: 7500});

	new imageZoom($$('img.zoom'));

	$$('div.imgfader', 'ul.screenshots li').each(function(el) {
		new Element('img', {
			'src': '/images/navigation/zoom.png',
			'width': '21',
			'height': '18',
			'styles': {
				'position': 'absolute',
				'top': '5px',
				'right': '5px',
				'z-index': 5
			}
		}).inject(el);
	});

	document.addEvent('click', function(e) {
  	var el = $(e.target)
  	if (el.tagName.toLowerCase() != 'a') {
  		el = el.getParent('a');
  	}
  	var newwin = false;

		if (el) {
			newwin = newwin || el.hasClass('newwindow');
			newwin = newwin || el.hasClass('externlink');

			/*if (el.get('href').substring(0, 7) == 'http://' || el.get('href').substring(0, 8) == 'https://') {
				newwin = newwin || el.get('href').indexOf('http://www.nelen-schuurmans.nl');
			}*/

			var downloadsurl = '/downloads/';
			newwin = newwin || el.get('href').substring(0, downloadsurl.length) == downloadsurl;
		}
		if (newwin) {
			e.stop();
			window.open(el.href, '_blank');
		}
	});

	if ($('employee-overview')) {
		new employeeOverview($('employee-overview'));
	}

	if ($('project-search')) {
		function buildQuery() {
			var query = {'request': 'ajax'};
			$$('form#project-search select').each(function(el) {
				if (el.get('value') != 'default' && el.get('value') != 0) {
					query[el.get('name')] = el.get('value');
				}
			});
			return query;
		}
		var reqQO = new Request.JSON({
			url: $('project-search').get('action'),
			onSuccess: function (responseJSON, responseText) {
				$$('form#project-search select').each(function(el) {
					var value = el.get('value');
					if (responseJSON[el.get('name')]) {
						el.getElements('option').each(function(opt, i) {
							if (i > 0) {
								opt.dispose();
							}
						});
						$each(responseJSON[el.get('name')], function(v, k) {
							new Element('option', {
								'value': k
							})
								.set('text', v)
								.inject(el);
						});
						el.set('value', value);
					}
				});
			}
		});
		var req = new Request.HTML({
			url: $('project-search').get('action'),
			onSuccess: function (responseTree, responseElements, responseHTML, responseJavaScript) {
				$('projectlist').removeClass('loading');
				$('projectlist').setStyles({
					'height': 'auto'
				});
				$('projectlist').set('html', responseHTML);

				$$('.nextpages a').each(function(el) {
					el.addEvent('click', function(e) {
						e.stop();
						var oldurl = req.options.url;
						req.options.url = $(e.target).get('href');
						req.get({'request': 'ajax'});
						req.options.url = oldurl;
					});
				});
			},
			onRequest: function() {
				$('projectlist').addClass('loading');
				$('projectlist').setStyles({
					'height': '200px'
				});
				$('projectlist').set('html', '');
			}
		});
		$$('form#project-search select').addEvent('change', function(e) {
			var query = buildQuery();
			req.get(query);
			query.type = 'queryoptions';
			reqQO.get(query);
		});

		$$('.nextpages a').each(function(el) {
			el.addEvent('click', function(e) {
				e.stop();
				var oldurl = req.options.url;
				req.options.url = $(e.target).get('href');
				req.get({'request': 'ajax'});
				req.options.url = oldurl;
			});
		});

		if ($('tagcloud')) {
			$('tagcloud').addEvent('click', function(e) {
				e.stop();
				var target = $(e.target);
				if (target.get('tag') == 'a') {
					$$('form#project-search select').each(function(el) {
						el.set('value', 0);
					});
					var query = {'request': 'ajax'};
					query['tag'] = target.get('href').substring(target.get('href').indexOf('?tag=') + 5);
					req.get(query);
				}
			});
		}
	}

	new pngSupport().replace();

	if ($('breadcrumb')) {
		var split = '....';
		var width = $('breadcrumb').getSize().x;
		$('breadcrumb').setStyle('width', 'auto');
		(function() {
			while (width < $('breadcrumb').getSize().x) {
				// Get biggest element
				var biggestel = null;
				var biggestwidth = 0;
				$$('#breadcrumb li').each(function(el) {
					if (el.getSize().x > biggestwidth) {
						biggestel = el;
						biggestwidth = el.getSize().x;
					}
				});
				var atxt = biggestel.getElement('a').get('text');
				atxt = atxt.replace(split, '');
				var length = (atxt.length / 2);
				atxt = atxt.substring(0, length - split.length) + split + atxt.substring(length + split.length);
				biggestel.getElement('a').set('html', atxt);
			}
		}).delay(100);
	}

});

var employeeOverview = new Class({

	initialize: function(element) {
		this.element  = element;
		this.children = element.getElements('li');
		this.cursort  = 'lastname';

		if (!$('employee-overview-sortfunc') || !$('employee-overview-sortname') || !$('filter-workingarea')) {
			return;
		}

		$('employee-overview-sortname').setStyle('display', 'none');
		$('employee-overview-sortname').addEvent('click', this.sortByName.bindWithEvent(this));
		$('employee-overview-sortfunc').addEvent('click', this.sortByFunc.bindWithEvent(this));
		$('filter-workingarea').addEvent('change', this.filterWA.bindWithEvent(this));
	},

	sortByFunc: function(e) {
		e.stop();
		this.element.setStyle('visibility', 'hidden');
		this.children.sort(this.sortByFuncSort);
		$('employee-overview-sortname').setStyle('display', 'inline');
		$('employee-overview-sortfunc').setStyle('display', 'none');
		this.show('function');
	},

	sortByFuncSort: function(a, b) {
		return a.getElement('span.function').get('text') < b.getElement('span.function').get('text') ? -1 : 1;
	},

	sortByName: function(e) {
		e.stop();
		this.element.setStyle('visibility', 'hidden');
		this.children.sort(this.sortByNameSort);
		$('employee-overview-sortname').setStyle('display', 'none');
		$('employee-overview-sortfunc').setStyle('display', 'inline');
		this.show('lastname');
	},

	sortByNameSort: function(a, b) {
		return a.getElement('span.lastname').get('text') < b.getElement('span.lastname').get('text') ? -1 : 1;
	},

	filterWA: function() {
		this.element.setStyle('visibility', 'hidden');
		if ($('filter-workingarea').get('value') == 'alle') {
			this.children.removeClass('hidden');
		} else {
			this.children.addClass('hidden');
			this.element.getChildren('li.wa-'+$('filter-workingarea').get('value')).removeClass('hidden');
		}
		this.show(this.cursort);
	},

	show: function(sortby) {
		var lastfirst = '';
		var dark = true;
		this.cursort = sortby;
		this.children.each(function(el) {
			if (!el.hasClass('hidden')) {
				if (lastfirst != el.getElement('span.'+sortby).get('text').substring(0, 1)) {
					lastfirst = el.getElement('span.'+sortby).get('text').substring(0, 1)
					el.addClass('firstofset');
					dark = !dark;
				} else {
					el.removeClass('firstofset');
				}

				if (dark) {
					el.addClass('dark');
				} else {
					el.removeClass('dark');
				}
			}
		});

		this.element.adopt(this.children);
		this.element.setStyle('visibility', 'visible');
	}

});

var mouseOvers = new Class({
	initialize: function(elements) {
		elements = elements || $$('img.mouseover');
		elements.each(function(image) {
			if (image.hasClass('specialmo')) {
				image.set('src_mouseover', image.get('class').replace(/.*mouseover=/, ''));
				image.set('src_mouseout',  image.get('src'));
				image.addEvent('mouseenter', this.mouseover);
				image.addEvent('mouseleave', this.mouseout);
				new Asset.image(image.get('src_mouseover'));
			} else {
				var xsrc = image.src;
				if (xsrc.substring(xsrc.length-7, xsrc.length-3) == '_up.')	{
					image.set('src_mouseover', image.get('src').replace(/_up\.([a-z]{3})/, '_ov.$1'));
					image.set('src_mouseout',  image.get('src'));

					image.addEvent('mouseenter', this.mouseover);
					image.addEvent('mouseleave', this.mouseout);

					// Preload
					new Asset.image(image.get('src_mouseover'));
				}
			}
		}, this);
	},
	mouseover: function() {
		this.set('src', this.get('src_mouseover'));
	},
	mouseout: function()	{
		this.set('src', this.get('src_mouseout'));
	}
});

var pngSupport = new Class({

	Implements: [Options],

	options: {
		transparentImage: '/images/pnghack/transparent.gif'
	},

	initialize: function(options) {
		this.setOptions(options);
		this.needed = Browser.Engine.trident4 && Browser.Platform.win;
	},

	replace: function(parentel) {
		if (!this.needed) return;
		if (!parentel) parentel = document;

		parentel.getElements('img').each(function(img) {
			if (img.src.indexOf(this.options.transparentImage) == -1 && img.src.indexOf("png") >= 0) {
				var oldsrc = img.get('src');
				var size = img.getSize();
				img.set('src', this.options.transparentImage);
				img.set('width', size.x);
				img.set('height', size.y);
				img.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + oldsrc + "',sizingMethod='scale')";
			}
		}, this);
	}
});

var slider = new Class({

	Implements: [Options],
	Extends: Fx.Elements,

	options: {
		autotimer: 1000,
		link: 'cancel'
	},

	initialize: function(element, controls, elements, options) {
		this.element = element;
		this.setOptions(options);
		this.nextel = 0;
		this.controls = controls;
		this.elements = elements;
		this.started = false;

		var maxheight = 0;
		this.elements.each(function(el) {
			maxheight = maxheight > el.getSize().y ? maxheight : el.getSize().y;
		}, this);
		this.element.setStyle('height', maxheight);

		if (this.elements.length == 1) {
			return;
		}

		if (this.element.getStyle('position') != 'absolute') {
			this.element.setStyle('position', 'relative');
		}
		this.elements.getFirst().setStyle('z-index', 2);
		this.elements.setStyles({
			'opacity': 0,
			'position': 'absolute',
			'top': 0,
			'left': 0
		});

		var auto = this.element.get('class').match(/auto_([0-9]+)/);
		if (auto) {
			this.options.autotimer = auto[1];
		} else if (this.element.hasClass('noauto')) {
			this.options.autotimer = 0;
		}

		this.controlcont = false;
		if ($('controls-'+this.element.get('id'))) {
			this.controlcont = $('controls-'+this.element.get('id'));
		}

		if (this.controls.length > 0) {
			this.controls.each(function(head, i) {
				if (this.controlcont) {
					head.inject(this.controlcont);
				} else {
					head.inject(this.elements[0], 'before');
				}
				head.addEvent('mouseover', this.slide.bindWithEvent(this, i));
				head.addEvent('click', function(e){e.stop();});
				if (head.hasClass('sliderinit')) {
					this.nextel = i;
				}
			}, this);
		}

		var me = this;
		this.element.addEvent('mouseleave', function() {
			if (me.options.autotimer > 0) {
				this.autoslide = me.doSlide.periodical(me.options.autotimer, me);
			}
		});

		this.element.addEvent('mouseenter', function() {
			$clear(this.autoslide);
		});
	},

	slide: function(e, curel) {
		this.nextel = curel;
		this.doSlide();
		this.element.fireEvent('mouseenter');
	},

	doSlide: function() {
		if (this.elements.length == 0) {
			return;
		}
		if (!this.elements[this.nextel]) {
			this.nextel = 0;
		}

		var obj = {};
		this.elements.each(function(el, i) {
			if (el.getStyle('opacity') != 0 && i != this.nextel) {
				el.setStyle('z-index', 1);
				obj[i] = {'opacity': [el.getStyle('opacity'), 0]};
			} else if (i == this.nextel) {
				obj[i] = {'opacity': [el.getStyle('opacity'), 1]};
				el.setStyle('z-index', 2);
			}
		}, this);
		this.start(obj);

		if (this.controls.length > 0) {
			this.controls.removeClass('active');
			this.controls[this.nextel].addClass('active');
		}
		this.nextel++;
	},

	init: function() {
		if (!this.started) {
			this.started = true;
			this.element.fireEvent('mouseleave');
			this.doSlide();
		}
	}
});

var overlayBg = new Class({

	Implements: [Options],

	options: {
		'id': 'bodyoverlay',
		'opacity': 0.8
	},

	initialize: function(options) {

		var windowscroll = window.getScrollSize();
		this.setOptions(options);

		if (!$(this.options.id)) {
			new Element('div', {
				'id': this.options.id,
				'styles': {
					'opacity': 0,
					'width': windowscroll.x+'px',
					'height': windowscroll.y+'px'
				}
			})
				.injectInside(document.body);
		}

		this.fx = new Fx.Tween($(this.options.id), {duration: 1000});
		//$(this.options.id).addEvent('click', this.hide.bindWithEvent(this));
	},

	show: function() {
		var windowscroll = window.getScrollSize();
		$(this.options.id).setStyles({
			'width': windowscroll.x+'px',
			'height': windowscroll.y+'px'
		});
		this.fx.start('opacity', this.options.opacity);
	},

	hide: function() {
		this.fx.start('opacity', 0);
	}
});

var imageZoom = new Class({

	Implements: [Options],

	options: {
		zoomdiv: 'zoomdiv',
		padding: [15, 10, 5, 10],
		textheight: [15, 15]
	},

	initialize: function(images, options) {
		this.elements = images;
		if (this.elements.length == 0 || !$(this.options.zoomdiv)) {
			return;
		}
		this.setOptions(options);

		this.elements.each(function(thumb, i) {
			var a = thumb.getParent('a');
			a.addEvent('click', this.showImage.bindWithEvent(this, i));
		}, this);

		var windowsize = window.getSize();
		var windowscroll = window.getScroll();

		this.overlay = new overlayBg();

		$(this.options.zoomdiv)
			.setStyles({
				'display': 'block',
				'top': windowscroll.y + (windowsize.y / 2),
				'left': windowscroll.x + (windowsize.x / 2)
			})
			.store('fx',  new Fx.Morph($(this.options.zoomdiv), {duration: 1000, wait: false}))
			.store('fx2', new Fx.Morph($(this.options.zoomdiv), {duration: 1000, wait: false}));

		var me = this;
		$(this.options.zoomdiv).getElement('.close').addEvent('click', function(e) {
			e.stop();
			$(me.options.zoomdiv).retrieve('fx2').start({
				'top': [$(me.options.zoomdiv).getTop(), windowscroll.y + (windowsize.y / 2)],
 				'height': [me.previmgsize.y+'px', 0]
			});
			$(me.options.zoomdiv).retrieve('fx').start.delay(600, $(me.options.zoomdiv).retrieve('fx'), {
				'width': [me.previmgsize.x+'px', 0],
		 		'padding': 0,
		 		'left': [$(me.options.zoomdiv).getLeft(), windowscroll.x + (windowsize.x / 2)]
			});
			me.previmgsize = {x: 0, y: 0};
			me.overlay.hide.delay(1200, me.overlay);
			$(me.options.zoomdiv+'_img').getElement('img').dispose.delay(1200, $(me.options.zoomdiv+'_img').getElement('img'));
			$(me.options.zoomdiv).getElement('.close')   .setStyle('visibility', 'hidden');
			$(me.options.zoomdiv).getElement('.next')    .setStyle('visibility', 'hidden');
			$(me.options.zoomdiv).getElement('.previous').setStyle('visibility', 'hidden');
		});
		$(this.options.zoomdiv).getElement('.next').addEvent('click', function(e) {
			e.stop();
			if (me.elements[me.curimg+1]) {
				me.showImage(e, me.curimg+1);
			}
		});
		$(this.options.zoomdiv).getElement('.previous').addEvent('click', function(e) {
			e.stop();
			if (me.elements[me.curimg-1]) {
				me.showImage(e, me.curimg-1);
			}
		});
	},

	showImage: function(e, idx) {
		if (e && e.target) e.stop();

		var windowsize = window.getSize();
		var windowscroll = window.getScroll();

		this.overlay.show();

		if (!this.previmgsize) {
			this.previmgsize = {x: 0, y: 0};
		}

		var removeimg = $(this.options.zoomdiv+'_img').getElement('img');
		if (removeimg) {
			removeimg.setStyle('z-index', 2);
		}

		this.curimg = idx;

		var me = this;
		var images = new Asset.images([this.elements[idx].getParent('a').getProperty('href')], {onComplete: function() {
			var image = images[0];
			image.setStyles({
				'opacity': 0,
				'z-index': 3
			});
			image.injectInside($(me.options.zoomdiv+'_img'));
			new Fx.Tween(image, {onComplete: function(){if(removeimg) {removeimg.dispose()}}}).start('opacity', 1);
			var imgsize = image.getSize();
			imgsize = {x: imgsize.x, y: imgsize.y+me.options.textheight[0]+me.options.textheight[1]};

			var paddingtb = me.options.padding[0] + me.options.padding[2];
			var paddinglr = me.options.padding[1] + me.options.padding[3];

			$(me.options.zoomdiv).getElement('.close').setStyle('visibility',    'visible');
			$(me.options.zoomdiv).getElement('.next').setStyle('visibility',     me.elements[idx+1]?'visible':'hidden');
			$(me.options.zoomdiv).getElement('.previous').setStyle('visibility', me.elements[idx-1]?'visible':'hidden');
			$(me.options.zoomdiv).getElement('.info').set('html', me.elements[idx].get('alt'));

			var newtop  = windowscroll.y + (windowsize.y - imgsize.y - paddingtb - me.options.textheight[0] - me.options.textheight[1]) / 2;
			var newleft = windowscroll.x + (windowsize.x - imgsize.x - paddinglr) / 2;
			if (newtop  < 0) newtop  = 0;
			if (newleft < 0) newleft = 0;

			$(me.options.zoomdiv).retrieve('fx').start({
				'left': [$(me.options.zoomdiv).getLeft(), newleft],
				'width': [me.previmgsize.x+'px', imgsize.x+'px'],
				'padding-top': [$(me.options.zoomdiv).getStyle('padding-top').toInt(), me.options.padding[0]],
				'padding-right': [$(me.options.zoomdiv).getStyle('padding-right').toInt(), me.options.padding[1]],
				'padding-bottom': [$(me.options.zoomdiv).getStyle('padding-bottom').toInt(), me.options.padding[2]],
				'padding-left': [$(me.options.zoomdiv).getStyle('padding-left').toInt(), me.options.padding[3]]
			});
			$(me.options.zoomdiv).retrieve('fx2').start.delay(800, $(me.options.zoomdiv).retrieve('fx2'), {
				'top': [$(me.options.zoomdiv).getTop(), newtop],
				'height': [me.previmgsize.y+'px', imgsize.y+'px']
			});
			me.previmgsize = imgsize;
		}});
	}
});

var imageFader = new Class({

	Extends: Fx.Elements,

	options: {
		auto: true,
		interval: 10000
	},

	initialize: function(elements, options) {
		this.elements = elements;
		this.setOptions(options);

		this.elements.setStyles({
			'opacity': 0,
			'position': 'absolute',
			'left': 0,
			'top': 0
		});

		if (this.elements[0]) {
			this.elements[0].setStyle('opacity', 1);
			if (this.elements[0].getParent('div').getStyle('position') != 'absolute' && this.elements[0].getParent('div').getStyle('position') != 'relative') {
				this.elements[0].getParent('div').setStyle('position', 'relative');
			}
		}

		this.curel = 0;
		if (this.options.auto) {
			this.auto.periodical(this.options.interval, this);
			this.auto.delay(1000, this);
		}
	},

	auto: function() {
		if (!this.elements[this.curel]) {
			this.curel = 0;
		}
		this.display(this.curel);

		this.curel += 1;
	},

	display: function(idx) {
		var obj = {};
		this.elements.each(function(el, i) {
			if (el.getStyle('opacity') != 0 && i != idx) {
				obj[i] = {'opacity': 0};
				el.setStyle('z-index', 1);
			} else if (i == idx) {
				obj[i] = {'opacity': 1};
				el.setStyle('z-index', 2);
			}
		});
		return this.start(obj);
	}
});

var TagCloud = new Class({

	Implements: [Options],

	options: {
		tagSizes: ['8px', '12px', '18px', '20px', '22px', '24px', '26px', '28px']
	},

  initialize: function(element, options) {
		this.setOptions(options);

		this.element = $(element);
		this.tags = [];

		this.element.getChildren().each(function(el){
			this.addTag(el);
		}, this);

    this.sortTags();
  },

	addTag: function(el) {
		var freq = el.get('class').match(/freq\[(\d+)\]/);

		this.tags.push({
			element: el,
			value: el.get('text'),
			frequency: ((freq && freq[1]) ? freq[1] : 1).toInt()
		});
	},

	sortTags: function() {
    this.tags.sort(function(a, b) {
			return a.value < b.value ? -1 : 1;
		});
  },

	setHighestLowest: function() {
		this.lowest  = 999999;
		this.highest = 0;
		this.numTags = this.options.tagSizes.length;

		this.tags.each(function(tag) {
			if (tag.frequency < this.lowest)  this.lowest  = tag.frequency;
			if (tag.frequency > this.highest) this.highest = tag.frequency;
		}, this);
  },

	getWeight: function(frequency) {
    var pos = Math.floor(
			this.numTags * (frequency-this.lowest) / (this.highest-this.lowest)
    );
		if (pos == this.numTags) pos--;
		return pos;
  },

	draw: function() {
		this.element.set('html', '');

		this.setHighestLowest();
		this.tags.each(function(tag) {
			tag.element.set('html', tag.value);
			tag.element.setStyle('font-size', this.options.tagSizes[this.getWeight(tag.frequency)]);
			tag.element.inject(this.element);
			this.element.set('html', this.element.get('html')+'\n');
		}, this);
	}
});