/* GOOGLE MAPS ................................................

- setDealerMarkers() moet in de pagina aanwezig zijn, anders worden de organisaties niet op de kaart weergegeven.

*/

var myPano;   

var gMapsObject = {
	googleMaps_initialize: function() {
		startpunt = new GLatLng(51.830480000,5.840521000);
		startPivot = {yaw:80,pitch:0};
		myPano = new GStreetviewPanorama(document.getElementById("googleMaps_pano"));
		myPano.setLocationAndPOV(startpunt, startPivot);
    },
	googleMaps_showPanoData: function(startPunt) {
		startPivot = {yaw:80,pitch:0};
		myPano.setLocationAndPOV(startPunt, startPivot);
	},
	data: {
		startPos: null,
		startZoom: null,
		map: null,
		geocoder: null,
		userPoint: null,
		bezoekerIcon: null,
		startingPosition: null,
		mapId: 'googleMaps',
		points: []
	},
	loadGoogleMaps: function() {
		if (GBrowserIsCompatible()) {
			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 : 6;
			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){
		gMapsObject.data['points'].push(icon);
	},
	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(overlay,latlng,overlaylatlng) {
			marker.openInfoWindowHtml(newMarker.message);
			gMapsObject.googleMaps_showPanoData(overlay);
			}
		);
	},
	calcProximityToPostcode: function(postcode, zoomlevel, callbackFunction){
		//clearShapes();
		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);
						// todo : take action on empty return
					} else {
						if($('geocoderRespondedFalse')) {
							$('geocoderRespondedFalse').hide();
						}
						// setting the center
						gMapsObject.data['map'].setCenter(point, zoomlevel);
						// placing an extra marker for the found location
						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());
					}
				}
			);
		}
	}
}



/***************************************************************
* STATIC LINKS
*
* Acts like abstract-class (no inheritance whatsoever) so 
* every script can access it
*
***************************************************************/

StaticLink = new Object();
StaticLink.repository = new Hash();
StaticLink.initialize = function(){
	$$('.staticLink').each(function(elem){
		elem.observe('click',StaticLink.eventHandler);
	});
	$$('a').each(function(elemObj){
		if(!elemObj.hasClassName('staticLink')){
			elemObj.observe('click', function(eventObject){
				if(this.readAttribute('href')){
					StaticLink.redirectDirect(this.readAttribute('href'),this.readAttribute('target'));
				}
				eventObject.stop();
				return false;
			});
		}
	});
}
StaticLink.setLink = function(linkRef,targetUrl) {
	StaticLink.repository.set(linkRef,targetUrl);
}
StaticLink.getLink = function(linkRef) {
	StaticLink.repository.get(linkRef);
}
StaticLink.eventHandler = function(e) {
	var reqLink = e.target.getAttribute('linkRef');
	StaticLink.redirect(reqLink);
}
StaticLink.redirect = function(linkRef) {
	// TODO : improve script with external window feature
	if(!StaticLink.repository.get(linkRef)) return false;
	var reposResult = StaticLink.repository.get(linkRef);
	StaticLink.redirectDirect(reposResult);
}

StaticLink.redirectDirect = function(URLPath,target) {
	if(URLPath.charAt(0) == '#') {
		document.location.hash = URLPath.substr(1);
	} else {
		var baseURL = '';
		$$('base').each(function(element) {
			baseURL = element.readAttribute('href');
		},this);
		if(!URLPath.match(/\:\/\/|mailto\:/)) {
			URLPath=baseURL+URLPath;
		}
		target ? window.open(URLPath,target) : (document.location.href = URLPath);
	}
}


// E-MAIL HANDLING

var emptyString = /^\s*$/ ;
var proceed = 2;

function evalForm(formId,validationScript) {
	if ((validationScript == "") || eval(validationScript)) {
		document.getElementById(formId).submit();
	}
}

function commonCheck(valfield, required) {
	if(!valfield) {
		console.log('let op, een veld kon niet gevonden worden! (validatie is als akkoord behandeld)');
		return false;
	}
	if (!document.getElementById)  return true; 
	if (emptyString.test(valfield.value)) {
		if (required) {
			setfocus(valfield);
			return false;
		}
		else {
			return true;  
		}
	}
	return proceed;
}

function validatePresent(valfield) {
  var stat = commonCheck(valfield, true);
  if (stat != proceed) return false;
  return true;
}
function validateEmail  (valfield, required) {
	var tfld = trim(valfield.value); 
	var email = /^[^@]+@[^@.]+\.[^@]*\w\w$/  ;
	if (!email.test(tfld)) {
		setfocus(valfield);
		return false;
	}
	var email2 = /^[A-Za-z][\w.-]+@\w[\w.-]+\.[\w.-]*[A-Za-z][A-Za-z]$/  ;
	return true;
}
function validateTelnr  (valfield, required) {
	var tfld = trim(valfield.value);  
	var telnr = /^\+?[0-9 ()-]+[0-9]$/  ;
	if (!telnr.test(tfld)) {
		setfocus(valfield);
		return false;
	}
	var numdigits = 0;
	for (var j=0; j<tfld.length; j++)
	if (tfld.charAt(j)>='0' && tfld.charAt(j)<='9') numdigits++;
	if (numdigits<6) {
		setfocus(valfield);
		return false;
	}
	return true;
}

function trim(str) { return str.replace(/^\s+|\s+$/g, ''); }

function setFocusDelayed() { global_valfield.focus(); }
function setfocus(valfield) {
	global_valfield = valfield;
	setTimeout('setFocusDelayed()',100);
}

/* ---------------------------------------------------------------- //
// CONFIRM                                                          //
// ---------------------------------------------------------------- */

function initiate_confirm(e){
	var elem = e.target;
	var confirmMessage = elem.getAttribute("confirmMessage").replace(/\\n/,"\n");
	if(!confirmMessage) return false;
	if(!confirm(confirmMessage)) {
		window.event? event.returnValue = false : e.preventDefault();
		return false;
	}
}



/***************************************************************
* ORDERDATES
***************************************************************/
document.observe('dom:loaded', function(event){
	if($('orderDateSwitcher')){
		$('orderDateSwitcher').observe('change', function (eventObject){
			var currentObject = eventObject.target;
			var targetDate = $(currentObject.options[currentObject.selectedIndex]).readAttribute('targetDate');
			$$('.orderDates').each(function(elem){
				elem.hide();
				if(elem.id == 'date_' + targetDate) {
					elem.show();
					$("order_afhaalDatum_hour").value = elem.value;
				}
			});
		});
		$$('.orderDates').each(function(elem){
			elem.observe('change',function(eventObject){
				$("order_afhaalDatum_hour").value = this.value;
			});
		});
		
		var firstElem = $('date_' + $($('orderDateSwitcher').options[$('orderDateSwitcher').selectedIndex]).readAttribute('targetDate'));
		firstElem.show();
		$("order_afhaalDatum_hour").value = firstElem.value;
	}
});


/***************************************************************
* DOM EVENT LISTNERS
***************************************************************/
document.observe('dom:loaded', function(event){
	StaticLink.initialize();
	/* Basket.initialize(); */

	$$('.confirmBox').each(function(elem){elem.observe('click',initiate_confirm)});
	if($('popup_name')) { popup_hide(); } // dit mag aanvankelijk niet gehide zijn, want dan vertikt je browser de swf te downloaden
});


/* SlideShow */

var SlideShow = Class.create({
	timeout: 850,
	slideshow: null,
	slides: [],
	current: 0,
	initialize: function(slideshow,timeout){
		this.slideshow = $(slideshow);
		if(!this.slideshow) return false;
		this.slides = this.slideshow.select('img');
		this.current = this.slides.length-1;
		this.timeout = timeout;
		setTimeout((function(){this.next();}).bind(this), this.timeout);
	},
	next: 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;
		}
		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 + 850);
	}
});


document.observe('dom:loaded', function(eventObject) {
	$$('.slideshow').each(function(elem){new SlideShow(elem, 3000)});	
});





/* Afbeeldingen */


var images = {
	initialize: function(){
		$$('a.imageContainerController').invoke('observe','click',images.click_controller);		
		$$('a.selectImg').invoke('observe','click',images.click_image);
		$$('.imageContainer.horizontal .imageContainerSlider').each(function(imageContainerSlider){
			imageContainerSlider.setStyle({
				width: (imageContainerSlider.select('a').length * parseInt(imageContainerSlider.select('a')[0].getDimensions().width)) + 'px'
			});
		});
		$$('.imageContainer.vertical .imageContainerSlider').each(function(imageContainerSlider){
			imageContainerSlider.setStyle({
				height: (imageContainerSlider.select('a').length * parseInt(imageContainerSlider.select('a')[0].getDimensions().height)) + 'px'
			});
		});
		// verbergen van de controller knoppen / elementen als ze niet nodig zijn
		$$('.imageContainer').each(function(elem){
			if(elem.hasClassName('horizontal')){
				if(elem.select('.imageContainerSlider')[0].getDimensions().width <= elem.getDimensions().width){
					$$('.imageContainerController[imageContainer=' + elem.readAttribute('id') + ']').invoke('hide');
				}
			} else if(elem.hasClassName('vertical')) {
				if(elem.select('.imageContainerSlider')[0].getDimensions().height <= elem.getDimensions().height){
					$$('.imageContainerController[imageContainer=' + elem.readAttribute('id') + ']').invoke('hide');
				}
			}
		});
	},
	click_controller: function(eventObject){
		var imageContainer = $(this.readAttribute('imageContainer'));
		if(!imageContainer) {
			return false;
		};
		var action = this.readAttribute('action');
		var imageContainerSlider = imageContainer.select('.imageContainerSlider')[0];
		var imageDimension, moveByChanging, sliderDimension, containerDimension;
		if(imageContainer.hasClassName('horizontal')){
			imageDimension = parseInt(imageContainerSlider.select('a')[0].getDimensions().width);
			sliderDimension = imageContainerSlider.getDimensions().width;
			containerDimension = imageContainer.getDimensions().width;
			moveByChanging = 'left';
		} else {
			imageDimension = parseInt(imageContainerSlider.select('a')[0].getDimensions().height);
			sliderDimension = imageContainerSlider.getDimensions().height;
			containerDimension = imageContainer.getDimensions().height;
			moveByChanging = 'top';
		}
		console.log(imageContainerSlider,imageDimension,sliderDimension,containerDimension,moveByChanging);
		if(!(imageDimension && moveByChanging)) {
			console.log('Could not determine imageheight or width. Does the imageContainer have a class horizontal or vertical?');
			return false;
		}
		if(action == 'first'){
			new Effect.Morph(imageContainerSlider, {
				style: moveByChanging + ':0px;',
				duration: 0.5 
			});
		};
		if(action == 'previous'){
			
			var currentPosition = parseInt(imageContainerSlider.getStyle(moveByChanging).replace(/[^\d\-]/g,''));
			var targetPosition = ((currentPosition + imageDimension) <= 0) ? (currentPosition+imageDimension) : 0;
			new Effect.Morph(imageContainerSlider, {
				style: moveByChanging + ':' + targetPosition + 'px;',
				duration: 0.5 
			});
		};
		if(action == 'next'){
			var currentPosition = parseInt(imageContainerSlider.getStyle(moveByChanging).replace(/[^\d\-]/g,''));
			var minDimension = (-sliderDimension + containerDimension);
			var targetPosition = ((currentPosition - imageDimension) >= minDimension) ? (currentPosition-imageDimension) : minDimension;
			new Effect.Morph(imageContainerSlider, {
				style: moveByChanging + ':' + targetPosition + 'px;',
				duration: 0.5 
			});
		};
		if(action == 'last'){
			new Effect.Morph(imageContainerSlider, {
				style: moveByChanging + ':' + (-sliderDimension + containerDimension) + 'px;',
				duration: 0.5 
			});
		};

	},
	click_image: function(eventObject){
		var targetImg = $(this.readAttribute('targetImg'));
		if(targetImg) {
			targetImg.setAttribute('src',this.readAttribute('bigImg'));
		}
	}
}
	
document.observe('dom:loaded',images.initialize);


/* CARROUSEL

0 Meervoudig instantieerbaar maken

*/

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




/* retailers zoeken */

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('template_pagina/speciaal/retailer/select_retailer/markers.php', { method:'get',
					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();
			}
			// get the latitude and longitude an pass them to the updateDealerContainerfunction
			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()
			}
		})
	}
}

document.observe('dom:loaded',function(eventObject){
		
		// kennelijk werkt de volgorde van dom attachen anders in IE7 ten opzichten van de rest van de browsers
		if($('googleMaps')) { 
			gMapsObject.loadGoogleMaps();
			retailerList.initialize();
			$$('.dealer_calcProximityForPostcode').each(function(elem){
				if($F(elem.readAttribute('postcodeId'))){
					elem.fire('retailerList:click');
				}
			});
		}		
	});


/* formulieren */

var formValidation = {
	errorClass: 'error'
};


/* popup */

var popup = {
	initialize: function(eventObject){
		if($('popup_content')){
			$$('img.js_openPopup').invoke('observe','click',popup.openPopup);
			$$('.js_closePopup').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);


/* special verkoop_orders */

document.observe('dom:loaded',function(eventObject){
	var changeDay = $('verkoop_orders_changeDay');
	if(changeDay){
		changeDay.observe('change',function(eventObject){
			var targetUrl = this.readAttribute('targetPage');
			if(targetUrl) {
				document.location.href = targetUrl + '?setDate=' + this.getValue();
			}
		});
	}
});


/* Automatisch printen via de querystring */

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


/* automatisch naar de waarde van een pulldown gaan (url) zodra de pulldown veranderd */

document.observe('dom:loaded',function(eventObject){
		$$('select.js_autoJump').invoke('observe','change',function(eventObject){
				StaticLink.redirectDirect(this.getValue());
			});
	});