


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 popup = {
	initialize: function(eventObject) {
		if ($('popup_content')) {
			$$('img.JS_popupOpen').invoke('observe','click',popup.openPopup);
			$$('.JS_popupClose').invoke('observe','click',popup.closePopup);
			popup.closePopup();
		}
	},
	openPopup: function(eventObject) {
		$('popup_windowName').update(this.readAttribute('popupTitle'));
		$('popup_content').show();
		$('popup_achtergrond').show();
		$('popup_img').src = this.readAttribute('popupImage');
	},
	closePopup: function(eventObject){
		$('popup_windowName').update('Een moment geduld a.u.b.');
		$('popup_content').hide();
		$('popup_achtergrond').hide();
		$('popup_img').src = "images/popup_loading.gif";
	}
}

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





var retailerList = {
	settings: {},
	initialize: function(){
		$$('.dealer_calcProximityForPostcode').each(function(elem){
			elem.observe('click',retailerList.calcProximityForPostcode);
			elem.observe('retailerList:click',retailerList.calcProximityForPostcode)
		});
		if($$('.dealer_calcProximityForPostcode').length && $('googleMaps')){
			new Ajax.Request('bouwpakket/pagina/speciaal/retailer/bouwsteen_01/markers.php', {
					method:'get',
					parameters: {
						'__requestBy': 'js'
					},
					onSuccess: function(transport){
						markerlist = eval(transport.responseText);
						$(markerlist).each(function(marker){
								gMapsObject.processMarker(marker);
							})
					}
				});
		}
	},
	calcProximityForPostcode: function(eventObject){
		retailerList.settings = {
			postcodeElem: $(this.readAttribute("postcodeId")),
			proximityElem: $(this.readAttribute("proximityId")),
			targetContainer: $(this.readAttribute("targetContainer")),
			errorElem: $(this.readAttribute("errorMessage"))
		}
		if((!retailerList.settings.postcodeElem)||(!retailerList.settings.proximityElem)||(!retailerList.settings.targetContainer)){
			console.log('could not complete request, missing elements');
			return false;	
		}
		eventObject.stop();
		
		if(retailerList.settings.postcodeElem.value.match(/^[0-9]{4}\s?[a-z|A-Z]{2}$/)){
			retailerList.settings.postcodeElem.removeClassName(formValidation.errorClass);
			if(retailerList.settings.errorElem) {
				retailerList.settings.errorElem.hide();
			}
			var zoomlevel = parseInt($(retailerList.settings.proximityElem.options[retailerList.settings.proximityElem.selectedIndex]).readAttribute('googleZoomLevel'));
			gMapsObject.calcProximityToPostcode(retailerList.settings.postcodeElem.value, zoomlevel, retailerList.updateContainer);
		} else {
			if(retailerList.settings.errorElem) {
				retailerList.settings.errorElem.show();
			}
			retailerList.settings.postcodeElem.addClassName(formvalueIncorrectClassExtention);
		}
	},
	updateContainer: function(latitude, longitude){
		new Ajax.Updater($(retailerList.settings.targetContainer), $('basePath').readAttribute('href') + 'retailerList' , {
			asynchronous: true,
			method: 'get',
			parameters: {
				'proximity' 	: retailerList.settings.proximityElem.value,
				'latitude' 		: latitude,
				'longitude' 	: longitude,
				'randomize' 	: Math.random(),
				'__requestBy'	: 'js'
			}
		})
	}
}

document.observe('dom:loaded',function(eventObject){
	if($('googleMaps') && $('googleMaps').hasClassName('retailer')) { 
		gMapsObject.loadGoogleMaps();
		retailerList.initialize();
		$$('.dealer_calcProximityForPostcode').each(function(elem){
			if($F(elem.readAttribute('postcodeId'))){
				elem.fire('retailerList:click');
			}
		});
	}		
});








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);





var carrousel = {
	initialize: function() {
		$$('.JS_carrousel .JS_carrouselHeader a.JS_moveCarrousel').invoke('observe','click',carrousel.click_controller);
		$$('.JS_carrousel .JS_carrouselHeader a.JS_moveCarrousel').invoke('observe','carrousel:click',carrousel.click_controller);
		if($$('.JS_carrousel .JS_carrouselHeader a.JS_moveCarrousel').length){
      $$('.JS_carrousel .JS_carrouselHeader a.JS_moveCarrousel')[0].addClassName('JS_active');
    }
		$$('.JS_carrousel .JS_carrouselBody').each(function(carrouselAlinea) {
				carrouselAlinea.setStyle({
						width: (carrouselAlinea.select('.JS_carrouselItem').length * parseInt(carrouselAlinea.select('.JS_carrouselItem')[0].getDimensions().width)) + 'px'
				});
		});
		$$('.JS_carrousel').invoke('observe','mouseout',carrousel.timer.startTimer);
		$$('.JS_carrousel').invoke('observe','mouseover',carrousel.timer.stopTimer);
		carrousel.timer.startTimer();
	},
	timer: {
		timeout: 4000,
		timer: 0,
		nextItem: function() {
			var ControllerButtons = $$('.JS_carrousel .JS_carrouselHeader a.JS_moveCarrousel')
			for (var pos = 0; pos < ControllerButtons.length; pos++) {
				if (ControllerButtons[pos].hasClassName('JS_active')) {
					if (pos == ControllerButtons.length -1) {
						ControllerButtons[0].fire('carrousel:click');
					} else {
						ControllerButtons[pos+1].fire('carrousel:click');
					}
					break;
				}
			};
			carrousel.timer.startTimer();
		},
		
		startTimer: function() {
			carrousel.timer.timer = window.setTimeout('carrousel.timer.nextItem()',carrousel.timer.timeout);
		},
		
		stopTimer: function() {
			window.clearTimeout(carrousel.timer.timer);
			carrousel.timer.timer = 0;
		}
	},
	click_controller: function(eventObject) {
		$$('.JS_carrousel .JS_carrouselHeader a.JS_moveCarrousel').invoke('removeClassName','JS_active');
		this.addClassName('JS_active');
		var carrouselContainer = $(this.readAttribute('carrouselContainer'));
		if (!carrouselContainer) {
			return false;
		};
		var carrouselAlinea = carrouselContainer.select('.JS_carrouselBody')[0];
		var containerWidth = parseInt(carrouselAlinea.select('.JS_carrouselItem')[0].getDimensions().width);
		var wantedContainer = carrouselAlinea.select('.JS_carrouselItem[itemId=' + this.readAttribute('targetItemId') + ']')[0];
		var targetPosition = parseInt(wantedContainer.readAttribute('num')) * parseInt(carrouselAlinea.select('.JS_carrouselItem')[0].getDimensions().width);
		new Effect.Morph(carrouselAlinea, {
				style: 'left: -' + targetPosition + 'px;',
				duration: 0.5
				});
	}
};

document.observe('dom:loaded',carrousel.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);









var photoalbum = {
	settings: {
		extraWidth: 18
	},
	
	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);




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 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);
	});
});






Basket = new Object();
Basket.initialize = function(){
	Basket.assignActions();	
	Basket.processTotals(); 
	Basket.updateContainer();
	Basket.updateCodeContainer();
};

Basket.processMutation = function(e){
	var elem = $(e.target);
	e.stop();
	var itemId 			= elem.getAttribute('itemId');
	var offerId 		= elem.getAttribute('offerId');
	var action 			= elem.getAttribute('action');
	var value 			= elem.tagName == 'INPUT' ? elem.value : elem.getAttribute('reqValue');
	var targetBasket 	= elem.getAttribute('targetBasket') ? elem.getAttribute('targetBasket') : 'defaultBasket';
	var addToValue 		= elem.readAttribute('addToValue');
	var basketElem 		= elem.up('.basketContainer');
	var params = {
		'return' 		: 'productAmount',
		'addToValue' 	: addToValue,
		'action' 		: action,
		'value' 		: value,
		'targetBasket' 	: targetBasket,
		'randomize' 	: Math.random(),
		'inBasket' 		: (basketElem ? 1 : 0),
		'__requestBy'	: 'js'
	};
	if(itemId) { 	params.productId = itemId; };
	if(offerId) { 	params.offerId = offerId; };
	
	new Ajax.Request('php/basket.php' , {
		asynchronous: true,
		method: 'get',
		parameters: params,
		onSuccess: function(transport){
			jsonResponse = transport.responseText.evalJSON();
			console.log(jsonResponse);
			
			if(action=='deleteItem') { Basket.updateContainer(); }
			if(jsonResponse.itemId){
				$(jsonResponse.itemId+'_amountInBasket').value = jsonResponse.productAmount;
				$$('.basket_priceSubTotal[itemId='+jsonResponse.itemId+']').each(function(elem){
					elem.innerHTML = jsonResponse.calculatedPrice_Money;	
				});
			};
			if(jsonResponse.offerId){
				var amountInBasket = $('offer_' + jsonResponse.offerId + '_amountInBasket');
				if(amountInBasket) {
					amountInBasket.value = jsonResponse.productAmount;
				}
				var subTotals = $$('.basket_priceSubTotal[offerId='+jsonResponse.offerId+']');
				if(subTotals.length){
					subTotals.each(function(elem){
						elem.innerHTML = jsonResponse.calculatedPrice_Money;	
					});
				}
			};
			
			if(jsonResponse.allsoAffected.length){
				jsonResponse.allsoAffected.each(function(affectedItem){
						if(affectedItem.itemId){
							var amountInBasket = $(affectedItem.itemId+'_amountInBasket');
							console.log(affectedItem.itemId+'_amountInBasket' , amountInBasket);
							if(amountInBasket){
								amountInBasket.value = affectedItem.productAmount;
								$$('.basket_priceSubTotal[itemId='+affectedItem.itemId+']').each(function(elem){
									elem.innerHTML = affectedItem.calculatedPrice_Money;	
								});
							}
						};
						if(affectedItem.offerId){
							var amountInBasket = $('offer_' + affectedItem.offerId + '_amountInBasket');
							if(amountInBasket) {
								amountInBasket.value = affectedItem.productAmount;
							}
							var subTotals = $$('.basket_priceSubTotal[offerId='+affectedItem.offerId+']');
							if(subTotals.length){
								if(!affectedItem.productAmount){
									Basket.updateContainer();
								} else {
									subTotals.each(function(elem){
										elem.innerHTML = affectedItem.calculatedPrice_Money;	
									});
								}
							} else {
								if(affectedItem.productAmount){
									Basket.updateContainer();
								}
							}
						};
					});
			}	
				
			console.log('processing totals');
			Basket.processTotals(targetBasket);
		},
		onFailure: function(){ 
			console.log('Could not retrieve product - basket information');
		}});
}

Basket.processTotals = function(targetBasket){
	new Ajax.Request('php/basket.php' , {
		asynchronous	: true,
		method			: 'get',
		parameters		: {
			'return' 		: 'totals',
			'targetBasket' 	: targetBasket,
			'randomize' 	: Math.random(),
			'__requestBy'	: 'js'
		},
		onSuccess		: function(transport){
			jsonResponse = transport.responseText.evalJSON();
			console.log("totals are: ", jsonResponse);
			var totalValues = $$('.basket_totalPriceValid').each(function(elem){
				if(jsonResponse.allowTotalPriceUpdate == 'TRUE'){
					elem.innerHTML = jsonResponse.totalSumValid_Money;
				}
			});
			
			
			if(jsonResponse.allowTotalPriceUpdate == 'TRUE'){
				$$('.basket_totalPrice').each(function(elem){
					elem.update(jsonResponse.totalSum_Money);
				});
	
				$$('.basket_shippingCost').each(function(elem){
					elem.update(jsonResponse.shippingCost_Money);
				});
	
				$$('.basket_totalPriceWithShipping').each(function(elem){
					elem.update(jsonResponse.totalSumWithShipping_Money);
				});
	
				$$('.basket_totalPriceCodes').each(function(elem){
					elem.update(jsonResponse.totalSumCodes_Money);
				});
	
				$$('.basket_taxPrice').each(function(elem){
					elem.update(jsonResponse.totalSumTax_Money);
				});
	
				$$('.basket_grossPrice').each(function(elem){
					elem.innerHTML = jsonResponse.totalSumGross_Money;
				});
			}
			$$('.basket_totalLines').each(function(elem){
				elem.innerHTML = jsonResponse.totalLines;
			});
			$$('.basket_totalItems').each(function(elem){
				elem.innerHTML = jsonResponse.totalItems;
			});
			Basket.updateAanbiedingen(jsonResponse.totalSumFreeProduct);
			var basketPriceAccepted 	= jsonResponse.basketPriceAccepted;
			var merchantSelected 		= jsonResponse.merchantSelected;
			var merchantOrderDatesLeft 	= jsonResponse.merchantOrderDatesLeft;
			
			Basket.updateBasketProceedButtons(jsonResponse);
		},
		onFailure: function(){ 
			console.log('Could not retrieve totals - basket information');
		}});
}

Basket.offerRelevantClassName = 'offerRelevant';

Basket.updateAanbiedingen = function(totalSumValid) {
	$$('.basketAanbieding_freeItem').each(function(elem){
		if(elem.hasClassName("hiddenElement")){
			elem.hide();
			if(((!elem.readAttribute('fromPrice')) || (totalSumValid>=parseInt(elem.readAttribute('fromPrice')))) && 
				((!elem.readAttribute('toPrice')) || (totalSumValid<parseInt(elem.readAttribute('toPrice'))))){
				elem.show();
			}
		} else {
			elem.removeClassName(Basket.offerRelevantClassName);
			if(((!elem.readAttribute('fromPrice')) || (totalSumValid>=parseInt(elem.readAttribute('fromPrice')))) && 
				((!elem.readAttribute('toPrice')) || (totalSumValid<parseInt(elem.readAttribute('toPrice'))))){
				elem.addClassName(Basket.offerRelevantClassName);
			}
		}
	});
}

Basket.assignActions = function(){
	var product_mutateButtons = $$('button.basket_mutate');
	product_mutateButtons.each(function(elem){
		if(!elem.assignmentCompleted){
			elem.observe('click',function(e){
				Basket.processMutation(e);
			})								 
		}
		elem.assignmentCompleted = true;
	});
	var product_itemAmounts = $$('input.basket_mutate');
	product_itemAmounts.each(function(elem){
		if(!elem.assignmentCompleted){
			elem.observe('keypress',function(e){
				var charCode = e.keyCode ? e.keyCode : e.which;
				var strChar = String.fromCharCode(charCode);
				if(charCode==13) {
					if(!e.target.value) e.target.value=0;
					Basket.processMutation(e);
					window.event? event.returnValue = false : e.preventDefault(); 
					return false;
				}
				if((!strChar.match(/[0-9]/))&&(charCode!=8)&&(charCode!=46)) {
					window.event? event.returnValue = false : e.preventDefault();
					return false;
				}
			});
			elem.observe('change',function(e){
				if(!e.target.value) e.target.value=0;
				Basket.processMutation(e);
			});
			elem.assignmentCompleted = true;
		}
	});
	var product_itemAdds = $$('form.basket_addItem');
	product_itemAdds.each(function(elem){
		if(!elem.assignmentCompleted){
			elem.observe('submit',function(e){
				e.stop(); 
				var elementsInForm = elem.getElementsByTagName('input');
				var query = new Hash();
				for(var iElem = 0; iElem < elementsInForm.length; iElem++){
					if(elementsInForm[iElem].getAttribute('name')){
						query.set(elementsInForm[iElem].getAttribute('name'),elementsInForm[iElem].value);
					}
				}
				query.set('targetBasket', (query.get('targetBasket') ? query.get('targetBasket') : 'defaultBasket'));
				query.set('randomize', Math.random());
				query.set('return','operationStatus');
				query.set('__requestBy','js');
				new Ajax.Request('php/basket.php' , {
					asynchronous: true,
					method: 'get',
					parameters: query,
					onSuccess: function(transport){
						jsonResponse = transport.responseText.evalJSON();
						
						Basket.processTotals(query.get('targetBasket'));
						Basket.updateContainer();
						$$('.basket_addItem .errorMessage').each(function(errorElem){
							errorElem.hide();
							if(errorElem.hasClassName('unknownItem')) {
								if(jsonResponse.productFound != 'SUCCESS') {
									errorElem.show();
								}
							}
						});
						e.target.reset();
					},
					onFailure: function(){ 
						console.log('Could not retrieve product - basket information');
					}});

			})
			elem.assignmentCompleted = true;
		}
	});
	$$('.basketSetExtraData').each(function(elem){
		if(!elem.assignmentCompleted){
			elem.observe('click',function(e){
				e.stop();
				var sourceElem = this;
				var targElems = $w(this.getAttribute('basketExtraDataContainerId'));
				var elementsInContainer = [];
				targElems.each(function(elem){
						if($(elem)){
							var inputs = $(elem).select('input,select,textarea');
							inputs.each(function(inputElem){
									elementsInContainer.push(inputElem);
								});
							
						}
					}); 
				if(elementsInContainer.length){
					var query = new Hash();

					var errorneousFieldFound = false;
					for(var iElem = 0; iElem < elementsInContainer.length; iElem++){
						var containerElem = $(elementsInContainer[iElem]);
						if(elementsInContainer[iElem].readAttribute('name')){
							if((containerElem.readAttribute('type')=='radio')&&(!containerElem.checked)) { 
								continue;
							}
							if(containerElem.readAttribute('fieldValidation')){
								var validated = false;
								if(!(containerElem.readAttribute('type')=='checkbox')){
									var validator = new RegExp(containerElem.readAttribute('fieldValidation'));
									validated = containerElem.value.match(validator)
								} else {
									validated = containerElem.checked;
								}
								if(validated){
									containerElem.removeClassName(formValidation.errorClass);
								} else {
									containerElem.addClassName(formValidation.errorClass);
									errorneousFieldFound = true;
								}
							}
							query.set(containerElem.getAttribute('name'),containerElem.value);
						}
					}

					query.set('targetBasket', (query.get('targetBasket') ? query.get('targetBasket') : 'defaultBasket'));
					query.set('randomize', Math.random());
					query.set('action', 'setExtraData');
					query.set('__requestBy', 'js');
					
					var targetURL = elem.readAttribute('href');
					new Ajax.Request('php/basket.php' , {
						asynchronous: true,
						method: 'get',
						parameters: query,
						onFailure: function(){ 
							console.log('setting extra data failed');
						},
						onSuccess: function(){
							if(!errorneousFieldFound) {
								document.location.href = targetURL;
							}
						}
					});
				
				} else {
					console.log('had no extra data to submit (do the container(s) exist?)');
					var targetURL = elem.readAttribute('href');
					document.location.href = targetURL;
				}
			});
			elem.assignmentCompleted = true;
		};
	});
	$$('form.basket_addCode').each(function(elem){
		if(!elem.assignmentCompleted){
			elem.observe('submit',function(e){
				window.event? event.returnValue = false : e.preventDefault(); 
				var elementsInForm = elem.getElementsByTagName('input');
				var query = new Hash();
				var codeElem;
				for(var iElem = 0; iElem < elementsInForm.length; iElem++){
					if(elementsInForm[iElem].getAttribute('name')){
						query.set(elementsInForm[iElem].getAttribute('name'),elementsInForm[iElem].value);
					}
					if(elementsInForm[iElem].getAttribute('name') == 'code') codeElem = elementsInForm[iElem];
				}
				query.set('targetBasket', (query.get('targetBasket') ? query.get('targetBasket') : 'defaultBasket'));
				query.set('randomize', Math.random());
				query.set('__requestBy', 'js');
				new Ajax.Request('php/codes.php' , {
					asynchronous: true,
					method: 'get',
					parameters: query,
					onSuccess: function(transport){
						Basket.updateCodeContainer();
						$$('.basket_addCode .errorMessage').each(function(errorElem){
							errorElem.hide();
							if(errorElem.hasClassName(transport.responseXML.getElementsByTagName('status')[0].firstChild.nodeValue)) {
								errorElem.show();
							} else {
								errorElem.hide();
							}
						});
						e.target.reset();
					},
					onFailure: function(){ 
						console.log('Could not add code');
					}});
				if(codeElem) {
					codeElem.focus();
					codeElem.select();
				}
			})
			elem.assignmentCompleted = true;
		}
	});
	
	$$('.deleteCode').each(function(elem){
		if(!elem.assignmentCompleted){
			elem.observe('click',function(e){
				new Ajax.Request('php/codes.php' , {
					asynchronous: true,
					method: 'get',
					parameters: {
						'__requestBy' : 'js',
						'action' : 'deleteCode',
						'code' : elem.readAttribute('codeNumber'),
						'targetBasket' : elem.readAttribute('targetBasket'),
						'randomize' : Math.random()},
					onSuccess: function(transport){
						Basket.updateCodeContainer();
					},
					onFailure: function(){ 
						console.log('Could not delete code');
					}});
			});
			elem.assignmentCompleted = true;
		}
	});
	
}
Basket.updateContainer = function(){
	var availableContainers = $$('.basketContainer');
	availableContainers.each(function(elem){
		var targetBasket 	= elem.getAttribute('targetBasket')
			? elem.getAttribute('targetBasket')
			: 'defaultBasket';
		var allowEdit 		= elem.getAttribute('allowEdit');
		new Ajax.Updater(elem, 'php/basket.php' , {
			asynchronous: true,
			method: 'get',
			parameters: {
				'return' 		: 'basket',
				'targetBasket' 	: targetBasket,
				'allowEdit' 	: allowEdit,
				'randomize' 	: Math.random(),
				'__requestBy' 	: 'js'
			},
			onComplete: function(transport){
				Basket.assignActions();
				Basket.processTotals(targetBasket);
			}
		});
	});
}

Basket.updateCodeContainer = function(){
	var availableContainers = $$('.codeContainer');
	availableContainers.each(function(elem){
		var targetBasket = elem.readAttribute('targetBasket')
			? elem.readAttribute('targetBasket')
			: 'defaultBasket';
		var allowEdit = elem.readAttribute('allowEdit');
		
		new Ajax.Updater(elem, 'php/codes.php' , {
			asynchronous: true,
			method: 'get',
			parameters: {
				'return' 		: 'codeList',
				'targetBasket' 	: targetBasket,
				'randomize' 	: Math.random(),
				'allowEdit' 	: allowEdit,
				'__requestBy'	: 'js'
			},
			onComplete: function(transport){
				Basket.assignActions();
				Basket.processTotals(targetBasket);
			}
		});
	});
}
Basket.updateBasketProceedButtons = function(totalsResponseObject){
	var basketpriceAccepted 	= totalsResponseObject.basketPriceAccepted == 'TRUE' ? true : false;
	var merchantSelected 		= totalsResponseObject.merchantSelected == 'TRUE' ? true : false;
	var merchantRequired 		= totalsResponseObject.merchantRequired == 'TRUE' ? true : false;
	var merchantOrderDatesLeft 	= totalsResponseObject.merchantOrderDatesLeft == 'TRUE' ? true : false;
	$$('.JS_basketproceed').each(function(elem){
		if(elem.hasClassName('JS_proceedpayment')){
			if(	basketpriceAccepted &&
				(merchantSelected||(!merchantRequired)) &&
				(merchantOrderDatesLeft||(!merchantRequired))) { elem.show(); }
			else { elem.hide(); };
		}
		if(elem.hasClassName('JS_proceedmerchantselection')){
			if((basketpriceAccepted)&&(!merchantSelected)&&(merchantRequired)) { elem.show(); }
			else { elem.hide(); };
		}
		if(elem.hasClassName('JS_proceedmarchantselection_noDates')){
			if((basketpriceAccepted)&&(merchantSelected)&&(!merchantOrderDatesLeft)&&(merchantRequired)) { elem.show(); }
			else { elem.hide(); };
		}
		if(elem.hasClassName('JS_proceeddenied')){
			if(!basketpriceAccepted) { elem.show(); } 
			else { elem.hide(); };
		}
	});
}




document.observe('dom:loaded', function(eventObject) {
	$$('form.basket_probeCode').each(function(elem) {
		if (!elem.assignmentCompleted) {
			elem.observe('submit',function(e) {
				window.event ? event.returnValue = false : e.preventDefault();
				var elementsInForm = elem.getElementsByTagName('input');
				var query = new Hash();
				for (var iElem = 0; iElem < elementsInForm.length; iElem++) {
					if (elementsInForm[iElem].getAttribute('name')) {
						query.set(elementsInForm[iElem].getAttribute('name'),elementsInForm[iElem].value);
					}
				}
				query.set('randomize', Math.random());
				query.set('__requestBy', 'js');
				$$('form.basket_probeCode .returnResult').each(function(subElem) {
					new Ajax.Updater(subElem, 'php/codes.php' , {
						asynchronous: true,
						method: 'get',
						parameters: query,
						onComplete: function(transport) {
							elem.reset();
						},
						onFailure: function() {
							console.log('Could not probe code');
						}
					});
				});
				return false;
			});
			elem.assignmentCompleted = true;
		}
	});
});


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





