
var photoalbum = {
	settings: {
		extraWidth: 5
	},
	
	initialize: function() {
	
		photoalbum.elements = {
			navigation			: $$('.JS_photoalbum .JS_navigation a'),
			albums				: $$('.JS_photoalbum'),
			thumbnailContainers	: $$('.JS_photoalbum .JS_thumbnails'),
			thumbnails			: $$('.JS_photoalbum .JS_thumbnails a')
		};
		photoalbum.elements.navigation.invoke('observe','click',photoalbum.click_controller);
		photoalbum.elements.thumbnails.invoke('observe','click',photoalbum.click_image);
		photoalbum.elements.thumbnailContainers.each(function(thumbnailContainer){
				var thumbnailContainerWidth = (
						thumbnailContainer.select('a').length *
						(parseInt(thumbnailContainer.select('a')[0].getDimensions().width) + photoalbum.settings.extraWidth)
					);
				thumbnailContainer.down('div').setStyle({
					width: thumbnailContainerWidth + 'px',
					position: 'absolute'
				});
			});
		photoalbum.elements.albums.each(photoalbum.determineNavigationVisibility);
	},
	click_controller: function(eventObject){
		var thisAlbum = this.up('.JS_photoalbum');
		if(!thisAlbum) {
			return false;
		};
		var action = this.readAttribute('JS_action');
		photoalbum.move(action,thisAlbum);
		
		eventObject.stop();
		return false;
	},
	move: function(action,thisAlbum){
		var imageContainerSlider = thisAlbum.select('.JS_thumbnails div')[0];
		var imageDimension, moveByChanging, sliderDimension, containerDimension;
		imageDimension 		= parseInt(imageContainerSlider.select('a')[0].getDimensions().width);
		sliderDimension 	= imageContainerSlider.getDimensions().width;
		containerDimension 	= imageContainerSlider.up().getDimensions().width;
		if(!imageDimension) {
			return false;
		}
		if(action == 'first'){
			new Effect.Morph(imageContainerSlider, {
				style		: 'left:0px;',
				duration	: 0.5 ,
				afterFinish	: function(eventObject){
					photoalbum.determineNavigationVisibility(thisAlbum);
				}
			});
		};
		if(action == 'previous'){
			var currentPosition = parseInt(imageContainerSlider.getStyle('left').replace(/[^\d\-]/g,''));
			var targetPosition 	= ((currentPosition + imageDimension + photoalbum.settings.extraWidth) <= 0)
					? (currentPosition + imageDimension + photoalbum.settings.extraWidth)
					: 0;
			new Effect.Morph(imageContainerSlider, {
				style		: 'left:' + targetPosition + 'px;',
				duration	: 0.5 ,
				afterFinish	: function(eventObject){
					photoalbum.determineNavigationVisibility(thisAlbum);
				}
			});
		};
		if(action == 'next'){
			var currentPosition = parseInt(imageContainerSlider.getStyle('left').replace(/[^\d\-]/g,''));
			var minDimension 	= (-sliderDimension + containerDimension);
			var targetPosition = ((currentPosition - imageDimension) >= minDimension)
				? (currentPosition - imageDimension - photoalbum.settings.extraWidth)
				: minDimension + photoalbum.settings.extraWidth;
			new Effect.Morph(imageContainerSlider, {
				style		: 'left:' + targetPosition + 'px;',
				duration	: 0.5 ,
				afterFinish	: function(eventObject){
					photoalbum.determineNavigationVisibility(thisAlbum);
				}
			});
		};
		if(action == 'last'){
			new Effect.Morph(imageContainerSlider, {
				style		: 'left:' + (-sliderDimension + containerDimension) + 'px;',
				duration	: 0.5,
				afterFinish	: function(eventObject){
					photoalbum.determineNavigationVisibility(thisAlbum);
				}
			});
		};
		
	},
	determineNavigationVisibility: function(thisAlbum){
		var imageContainerSlider = thisAlbum.down('.JS_thumbnails div');
		if(!imageContainerSlider) {
			return false;
		}
		var sliderDimension 		= imageContainerSlider.getDimensions().width;
		var containerDimension 		= imageContainerSlider.up().getDimensions().width;
		var currentPosition 		= parseInt(imageContainerSlider.getStyle('left').replace(/[^\d\-]/g,''));
		var thumbnailContainerWidth = (
				thisAlbum.select('.JS_thumbnails a').length *
				(parseInt(thisAlbum.select('.JS_thumbnails a')[0].getDimensions().width) + photoalbum.settings.extraWidth));
		if(thisAlbum.down('.JS_thumbnails').getDimensions().width < (thumbnailContainerWidth-photoalbum.settings.extraWidth)){
			thisAlbum.select('.JS_navigation a.previous').invoke((
				(currentPosition == 0)
				? 'hide'
				: 'show'));
			console.log(currentPosition, -sliderDimension + containerDimension);
			thisAlbum.select('.JS_navigation a.next').invoke(
				currentPosition == (-sliderDimension + containerDimension + photoalbum.settings.extraWidth)
				? 'hide'
				: 'show');
			
		}
		else {
			thisAlbum.select('.JS_navigation a').invoke('hide');
		}
	},
	click_image: function(eventObject){
		var thisAlbum = this.up('.JS_photoalbum');
		var targetImg = thisAlbum.down('.JS_image img');
		if(targetImg) {
			targetImg.setAttribute('src', this.readAttribute('JS_image'));
			targetImg.setAttribute('title', this.down('img').readAttribute('title'));
			targetImg.setAttribute('alt', this.down('img').readAttribute('alt'));
		}
		var imageContainerSlider = thisAlbum.down('.JS_thumbnails div');
		var slideWidth 				= parseInt(imageContainerSlider.select('a')[0].getDimensions().width);
		var containerDimension 		= imageContainerSlider.up().getDimensions().width;
		var currentPosition 		= parseInt(imageContainerSlider.getStyle('left').replace(/[^\d\-]/g,''));
		var offsetPosition 			= eventObject.element().positionedOffset()[0];
		if ((-currentPosition + containerDimension - slideWidth) <= offsetPosition) {
			photoalbum.move('next', thisAlbum);
		}
		else if((-currentPosition + slideWidth) > offsetPosition) {
			console.log(currentPosition, slideWidth, offsetPosition);
			photoalbum.move('previous', thisAlbum);
		}
	}
}
	
Event.observe(window,'load',photoalbum.initialize);




var BaseUrlFix = {
	initialize: function(eventObject){
		var baseTag = $$('base')[0];
		if (baseTag){
			if(baseTag.readAttribute('href')){
				BaseUrlFix.fixHashLocations();
			}
		}
	},
	fixHashLocations: function(parentElement){
		elementsToScan = parentElement
			? parentElement.select('a')
			: $$('a');
		elementsToScan.each(function(anchor){
			var anchorLocation = anchor.readAttribute('href');
			if (anchorLocation && anchorLocation.charAt(0) == '#'){
				if (!anchor.retrieve('hashLocationFixApplied')){
					console.log('attaching eventhandlers for', anchor);
					anchor.observe('click', BaseUrlFix._events.clickHashTag);
					anchor.store('hashLocationFixApplied', true);					
				}
			}
		});
	},
	_events: {
		clickHashTag: function(eventObject){
			eventObject.stop();
			var anchor = eventObject.element();
			document.location.hash = anchor.readAttribute('href').substr(1);
		}
	}
};

document.observe('dom:loaded', BaseUrlFix.initialize);









document.observe('dom:loaded',function(eventObject){
		var queryString = document.location.search.toQueryParams();
		if(queryString.autoPrint == 'true'){
			window.print();
		}
	});
document.observe('dom:loaded',function(){
		$$('.icon.print').invoke('observe','click',function(eventObject){
				window.print();
			});
	});







var gMapsObject = {
	data: {
		startPos: 			null,
		startZoom: 			null,
		map: 				null,
		geocoder: 			null,
		userPoint: 			null,
		bezoekerIcon: 		null,
		startingPosition: 	null,
		mapId: 				'googleMaps',
		points: 			[],
		latlngs: 			[],
		bounds: 			null
	},
	loadGoogleMaps: function() {
		if (GBrowserIsCompatible()) {
			if(gMapsObject.data['startingPosition'].latlng){
				gMapsObject.data['startPos'] = gMapsObject.data['startingPosition'].latlng;
			}
			else {
				gMapsObject.data['startPos'] = gMapsObject.data['startingPosition']
					? new GLatLng(gMapsObject.data['startingPosition'].latitude,gMapsObject.data['startingPosition'].longitude)
					: new GLatLng(52.167194,5.232041);
			}
			gMapsObject.data['startZoom'] = gMapsObject.data['startingPosition'] ? gMapsObject.data['startingPosition'].zoomlevel : 8;
			gMapsObject.data['map'] = new GMap2($(gMapsObject.data['mapId']));
			gMapsObject.data['geocoder'] = new GClientGeocoder();
			gMapsObject.data['bezoekerIcon'] = new GIcon(G_DEFAULT_ICON);
			gMapsObject.data['bezoekerIcon'].image = "http://gmaps-samples.googlecode.com/svn/trunk/markers/blue/blank.png";
	
			gMapsObject.data['map'].setCenter(gMapsObject.data['startPos'], gMapsObject.data['startZoom']);
			gMapsObject.data['map'].addControl(new GLargeMapControl());
			var mapControl = new GMapTypeControl();
			gMapsObject.data['map'].addControl(mapControl);
			gMapsObject.data['points'].each(gMapsObject.processMarker);
			
		}
	},
	setStartPos: function(latitude,longitude,zoomlevel){
		gMapsObject.data['startingPosition'] = {
			latitude: latitude, 
			longitude:longitude, 
			zoomlevel:zoomlevel
		};
	},
	addMarker: function(icon){
		if(!gMapsObject.data.bounds) {
			gMapsObject.data.bounds = new GLatLngBounds();
		}
		gMapsObject.data['points'].push(icon);
		var latlng = new GLatLng(icon.latitude,icon.longitude);
		gMapsObject.data.latlngs.push(latlng);
		

	},
	setMapToCenter: function(zoomLevel) {
		for(var iLatlng = 0; iLatlng < gMapsObject.data.latlngs.length; iLatlng++){
			console.log(gMapsObject.data.latlngs[iLatlng]);
			gMapsObject.data.bounds.extend(gMapsObject.data.latlngs[iLatlng]);
		}
		
		var center = gMapsObject.data.bounds.getCenter();
		
		console.log(center);
		gMapsObject.data['startingPosition'] = {
			latlng: 	center, 
			zoomlevel:	zoomLevel
		};
		
	},
	processMarker: function(newMarker) {
		var latlng = new GLatLng(newMarker.latitude,newMarker.longitude);
		var markerOptions = {
			icon: (newMarker.icon ? new GIcon(G_DEFAULT_ICON,newMarker.icon) : new GIcon(G_DEFAULT_ICON))
		};
		markerOptions.icon.shadow = '';
		
		var marker = new GMarker(latlng, markerOptions);
		
		gMapsObject.data['map'].addOverlay(marker);
		GEvent.addListener(marker, "click", function() {
			marker.openInfoWindowHtml(newMarker.message);
			}
		);
	},
	calcProximityToPostcode: function(postcode, zoomlevel, callbackFunction){
		if (gMapsObject.data['geocoder']) {
			gMapsObject.data['geocoder'].getLatLng(
				postcode + ', netherlands',
				function(point) {
					if (!point) {
						if($('geocoderRespondedFalse')) {
							$('geocoderRespondedFalse').show();
						}
						gMapsObject.data['map'].setCenter(new GLatLng(52.167194,5.232041), 6);
					} else {
						if($('geocoderRespondedFalse')) {
							$('geocoderRespondedFalse').hide();
						}
						gMapsObject.data['map'].setCenter(point, zoomlevel);
						markerOptions = { icon:gMapsObject.data['bezoekerIcon'] };
						var marker = new GMarker(point,markerOptions);
						gMapsObject.data['map'].addOverlay(marker);
						GEvent.addListener(marker, "click", function() {
							marker.openInfoWindowHtml('Door u ingevoerde postcode: ' + postcode);
						});
						
						callbackFunction(point.lat(), point.lng());
					}
				}
			);
		}
	}
}

document.observe('dom:loaded',function(eventObject){
		if($('googleMaps')) { 
			gMapsObject.loadGoogleMaps();
		}		
	});





var ConfirmBox = {
	initiate: function(eventObject) {
		$$('.JS_confirmBox').invoke(
			'observe',
			'click',
			ConfirmBox._events.clickedForConfirm
		);
	},
	_events: {
		clickedForConfirm: function(eventObject){
			var elem = eventObject.element();
			var confirmMessage = elem.getAttribute("confirmMessage").replace(/\\n/,"\n");
			
			if(!confirmMessage){
				return false;
			}
			
			if (!confirm(confirmMessage)) {
				eventObject.stop();
				return false;
			}
		}
	}
}

document.observe('dom:loaded', ConfirmBox.initiate);





var AutoJump = {
	initiate: function(){
		$$('select.JS_autoJump').invoke(
			'observe',
			'change',
			AutoJump._events.changedSelect
		);
	},
	_events: {
		changedSelect: function(eventObject){
			document.location.href = this.getValue();
		}
	}
};

document.observe('dom:loaded', AutoJump.initiate);






var Paginator = {
	initialize: function(eventObject){
		$$('.JS_paginator form a').invoke('observe', 'click', Paginator.events.submitForm);
		$$('.JS_paginator select').invoke('observe', 'change', Paginator.events.changePulldown);
	},
	events: {
		submitForm: function(eventObject){
			eventObject.stop();
			
			var elem = eventObject.element();
			var form = elem.up('form');
			
			var wantedAction = elem.tagName == 'A'
				? elem.readAttribute('href')
				: elem.value;
			
			form.setAttribute('action', wantedAction);
			form.submit();
		},
		changePulldown: function(eventObject){
			var pulldown = eventObject.element();
			if (pulldown.up('form')) {
				Paginator.events.submitForm(eventObject);
			}
			else {
				document.location.href = pulldown.value;
			}
		}
	}
}

document.observe('dom:loaded', Paginator.initialize);





var validator = Class.create({
	
	_pathUpToErrorElem: 'div, tr',
	_errorClass: 'JS_checkInput',
	_errorClassForm: 'JS_formValidatedFalse',
	_validationTypes: {},
	_validationFields: {},
	_observers: [],
	_formName: '',
	__form: '',
	__formElements: [],
	
	consoleMessages: {
		info: {
			matchFailed: 'field did not pass validation',
			preventedSubmit: 'prevented the field from submitting',
			attachedObserver: 'attached an extra observer'
		},
		warning: {
			illegalValidationMethod: 'could not validate field due to unknown validationmethod',
			invalidPattern: 'Pattern was not a proper regular expression',
			unknownCallback: 'Callbackfunction not found'
		},
		error: {
			noFormName: 'validation called without formname, aborting',
			formNotFound: 'The form could not be found, aborting validation'
		}
	},
	initialize: function(formName){
		this._formName = formName;
		if(!this._formName) {
			console.error(this.consoleMessages.error.noFormName);
			return false;
		};
		document.observe('dom:loaded',this.__attachElements.bind(this));
	},
	
	__attachElements: function(eventObject){
		this.__form = $(this._formName);
		if(!this.__form){
			console.error(this.consoleMessages.error.formNotFound, this._formName);
			return;
		}
		this.__formElements = this.__form.select('input','textarea','select','button');
		this.__formElements.each(this.__attachPossibleObservers,this);
		this.__form.select('input[type=submit]','input[type=button]','submit','button','input[type=image]')
					.invoke('observe','click',this.__attemptSubmit.bind(this));
		this.__formElements.invoke('fire','validation:initialized');
	},
	__attachPossibleObservers: function(formElem){
		var elemName = formElem.readAttribute('name');
		if(elemName){
			this._observers.each(function(observer){
				if(observer.field == elemName) {
					var callback = eval(observer.callback);
					if(!callback) {
						console.warn(this.consoleMessages.warning.unknownCallback);
					}
					else {
						formElem.observe(observer.event, bekendVan);
						formElem.observe('validation:initialized', bekendVan);
					}
				}
			});
		}
	},
	
	__attemptSubmit: function(eventObject){
		var preventSubmit = false;
		var formElements = this.__formElements;
		var combinedElements = {};
		formElements.each(function(formElem){
				var originalName = formElem.readAttribute('name');
				if(originalName){
					var name = originalName.replace(/\[[Y|m|d|H|i]{0,1}\]/g,'');
					if(combinedElements[name]) {
						if(Object.isArray(combinedElements[name])) {
							combinedElements[name].push(formElem);
						} else {
							combinedElements[name] = [combinedElements[name],formElem];
						}
					} else {
						combinedElements[name] = formElem;
					}
				}
			});

		$H(combinedElements).each(function(elem){
				var name = elem.key;
				var formElem = elem.value;
				if(this._validationFields.get(name)){
					if(Object.isArray(formElem)){
						var fieldValue = formElem.invoke('getValue').compact().join(',');
					} else {
						var fieldValue = formElem.getValue();						
					}
					if(this._validationTypes[this._validationFields.get(name)]){
						var matchAgainst = this._validationTypes[this._validationFields.get(name)];
					}
					else {
						console.warn(this.consoleMessages.warning.illegalValidationMethod);
						return;
					}
					var queryElem = Object.isArray(formElem) ? formElem[0] : formElem;
					switch(matchAgainst.type){
						case 'match':
							var pattern = eval(matchAgainst.pattern);
							if(!pattern) {
								console.warn(this.consoleMessages.warning.invalidPattern, matchAgainst.pattern);
								return;
							}
							if(fieldValue && fieldValue.match(pattern)){
								queryElem.up(this._pathUpToErrorElem).removeClassName(this._errorClass);
							}
							else {
								console.info(this.consoleMessages.info.matchFailed, fieldValue, formElem, matchAgainst);
								queryElem.up(this._pathUpToErrorElem).addClassName(this._errorClass);
								preventSubmit = true;
							}
							break;
						case 'matchAndEqual':
							var pattern = eval(matchAgainst.pattern);
							if(!pattern) {
								console.warn(this.consoleMessages.warning.invalidPattern, matchAgainst.pattern);
								return;
							}
							if(fieldValue && fieldValue.match(pattern)){
								combinedElements[name].up(this._pathUpToErrorElem).removeClassName(this._errorClass);
							}
							else {
								console.info(this.consoleMessages.info.matchFailed, fieldValue, formElem, matchAgainst);
								queryElem.up(this._pathUpToErrorElem).addClassName(this._errorClass);
								preventSubmit = true;
							}
							if(combinedElements[name].getValue() == combinedElements[name+matchAgainst.suffix].getValue()){
								combinedElements[name+matchAgainst.suffix].up(this._pathUpToErrorElem).removeClassName(this._errorClass);
							}
							else {
								console.info(this.consoleMessages.info.matchFailed, fieldValue, formElem, matchAgainst);
								combinedElements[name+matchAgainst.suffix].up(this._pathUpToErrorElem).addClassName(this._errorClass);
								preventSubmit = true;
							}
							break;
						case 'date':
							var currentlySelected = {
								year: formElem.find(function(elem){ return elem.readAttribute('name').match(/\[Y\]/); }).getValue(),
								month: formElem.find(function(elem){ return elem.readAttribute('name').match(/\[m\]/); }).getValue(),
								day: formElem.find(function(elem){ return elem.readAttribute('name').match(/\[d\]/); }).getValue()
							};
							var dd = new Date(currentlySelected.year, currentlySelected.month, 0);
							var lastDayOfMonth = dd.getDate();
							if(currentlySelected.day > lastDayOfMonth) {
								console.info(this.consoleMessages.info.matchFailed, fieldValue, formElem, currentlySelected);
								formElem[0].up(this._pathUpToErrorElem).addClassName(this._errorClass);
								preventSubmit = true;
								break;
							}
							else {
								formElem[0].up(this._pathUpToErrorElem).removeClassName(this._errorClass);
							}
							if(matchAgainst.required){
								if(!currentlySelected.year || !currentlySelected.month || !currentlySelected.day){
									console.info(this.consoleMessages.info.matchFailed, fieldValue, formElem, currentlySelected);
									formElem[0].up(this._pathUpToErrorElem).addClassName(this._errorClass);
									preventSubmit = true;
									break;
								}
								else {
									formElem[0].up(this._pathUpToErrorElem).removeClassName(this._errorClass);
								}
							}
							break;
					}
				}
			},this);
		if(preventSubmit) {
			this.__form.addClassName(this._errorClassForm);
			console.info(this.consoleMessages.info.preventedSubmit);
			eventObject.stop();
			return false;
		} else {
			this.__form.removeClassName(this._errorClassForm);
		}
		return true;
	},
	loadValidationTypes: function(validationTypes) {
		this._validationTypes = validationTypes;
	},
	loadValidationFields: function(validationFields) {
		console.log('attaching observers',validationFields);
		this._validationFields = $H(validationFields);
	},
	attachObservers:  function(observers){
		this._observers = observers;
	}
	
});






var SlideShow = Class.create({
	slideshow	: null,
	slides		: [],
	current		: 0,
	
	initialize: function(slideshow){
		this.slideshow = $(slideshow);
		
		if(!this.slideshow) {
			console.log('constructor aangeroepen van slideshow zonder element', slideshow);
			return false;
		}
		
		this.slides 	= this.slideshow.childElements();
		this.current 	= 0;
		this.timeout 	= parseInt(this.slideshow.readAttribute('slideshow_time')) * 1000;
		
		if (this.slides.length == 1){
			console.log('slideshow aangeroepen met maar 1 slide', slideshow);
			return false;
		}
		
		if (!this.timeout){
			console.log('slideshow aangeroepen zonder een transitietijd', slideshow);
			return false;
		}
		this.correctZIndices();
		this.slideshow.select('img').invoke('show');
		setTimeout(
			(function(){this.next();}).bind(this),
			this.timeout
		);
	},
	correctZIndices: function(){
		for (var i = 0; i < this.slides.length; i++) {
			var slide = this.slides[(this.current + i) % this.slides.length];
			slide.style.zIndex = this.slides.length - i;
		}
	},
	
	next: function() {
		this.correctZIndices();
		Effect.Fade(this.slides[this.current], {
			afterFinish: function(effect) {
				effect.element.style.zIndex = 0;
				Element.show(effect.element);
				Element.setOpacity(effect.element, 1);
			}
		});
		this.current = (this.current + 1) % this.slides.length;
		
		setTimeout(
			(function(){this.next();}).bind(this),
			this.timeout
		);
	}
});
Event.observe(window, "load", function(eventObject) {
	$$('.JS_slideshow').each(function(elem) {
		new SlideShow(elem);
	});
});






var Tabs = {
	initialize: function(eventObject){
		$$('.JS_tabs .JS_option').invoke(
			'observe',
			'click',
			Tabs._events.clickTab
		);
	},
	_events: {
		clickTab: function(eventObject){
			eventObject.stop();
			
			var elem 				= eventObject.element();
			var alineaNo 			= elem.readAttribute('alineaNo');
			var parentTabContainer 	= elem.up('.JS_tabs');
			parentTabContainer
				.select('.JS_option', '.JS_tab')
				.invoke('removeClassName','JS_active');
			elem.addClassName('JS_active');
			parentTabContainer
				.down('.JS_tab[alineaNo=' + alineaNo + ']')
				.addClassName('JS_active');
		}
	}
};

document.observe('dom:loaded', Tabs.initialize);




