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

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

*/

var gMapsObject = new Object();
gMapsObject.data = new Array();
gMapsObject.data['startPos'] = null;
gMapsObject.data['startZoom'] = null;
gMapsObject.data['map'] = null;
gMapsObject.data['geocoder'] = null;
gMapsObject.data['userPoint'] = null;
gMapsObject.data['bezoekerIcon'] = null;
gMapsObject.data['startingPosition'] = null;
gMapsObject.data['mapId'] = 'googleMaps';
gMapsObject.data['points'] = new Array();

gMapsObject.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(function(propertyList){
			gMapsObject.processMarker(propertyList.latitude,
									  propertyList.longitude,
									  propertyList.message);
		});
	}
}

gMapsObject.setStartPos = function(latitude,longitude,zoomlevel){
	gMapsObject.data['startingPosition'] = {latitude: latitude, 
											longitude:longitude, 
											zoomlevel:zoomlevel};
}

gMapsObject.addMarker = function(latitude,longitude,message){
	gMapsObject.data['points'].push({
		latitude: latitude, 
		longitude: longitude, 
		message: message});
}

gMapsObject.processMarker = function(latitude, longitude, message) {
	var targetLocation = 'http://maps.google.com/maps?f=d&hl=nl&daddr=\'+this.to.value+\'&saddr=\'+this.from.value+\',+Nederland';
	message += '<br />'
	message += '<br />'
	message += '<strong>Bereken de route:</strong><br />'
	message += '<form action="#" onsubmit="window.open(\'' +targetLocation +'\'); return false;">'
	message += '<input type="hidden" name="to" value="' + latitude + ',' + longitude + '"/>uw postcode : <input type="text" name="from" maxLength="6" size="6"> <input type="submit" value="bereken route">'
	message += '</form>'
	var latlng = new GLatLng(latitude,longitude);
	var dealerIcon = new GIcon(G_DEFAULT_ICON);
	var markerOptions = {
		icon:dealerIcon
	};
	var marker = new GMarker(latlng, markerOptions);
	gMapsObject.data['map'].addOverlay(marker);
	GEvent.addListener(marker, "click", function() {
		marker.openInfoWindowHtml(message);
		}
	);
}

gMapsObject.calcProximityToPostcode = function(postcode, targetContainer, proximity, zoomlevel){
	//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);
					});
					
					dealerList.updateDealerContainer(proximity, point.lat(), point.lng(), targetContainer);
				}
			}
		);
	}

}

/***************************************************************
* PRODUCT / BASKETFEATURES
***************************************************************/

Basket = new Object();
Basket.initialize = function(){
	Basket.assignActions();	
	Basket.processTotals(); // this will launch an update of the defaultbasket. If needed, you can run your own targetBasket update afterwards.
	Basket.updateContainer();
	Basket.updateCodeContainer();
};

Basket.processMutation = function(e){
	var elem = e.target;
	window.event? event.returnValue = false : e.preventDefault(); 
	var itemId = elem.getAttribute('itemId');
	var action = elem.getAttribute('action');
	var value = elem.tagName == 'INPUT' ? elem.value : elem.getAttribute('reqValue');
	var targetBasket = elem.getAttribute('targetBasket') ? elem.getAttribute('targetBasket') : 'defaultBasket';
	new Ajax.Request('php/basket.php' , {
		asynchronous: true,
		method: 'get',
		parameters: {
			'return' : 'productAmount',
			'productId' : itemId,
			'action' : action,
			'value' : value,
			'targetBasket' : targetBasket,
			'randomize' : Math.random()
		},
		onSuccess: function(transport){
			// NOTICE : the transaction completed successfully. We want to update several targetted fields in the website with the new information
			if(action=='deleteItem') { Basket.updateContainer(); }
			$(itemId+'_amountInBasket').value = transport.responseXML.getElementsByTagName('productAmount')[0].firstChild.nodeValue;
			$$('.basket_priceSubTotal[itemId='+itemId+']').each(function(elem){
				elem.innerHTML = transport.responseXML.getElementsByTagName('calculatedPrice_Money')[0].firstChild.nodeValue;	
			})
			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()
		},
		onSuccess: function(transport){
			// setting the totalprices
			var totalValues = $$('.basket_totalPrice').each(function(elem){
				if(transport.responseXML.getElementsByTagName('allowTotalPriceUpdate')[0].firstChild.nodeValue == 'TRUE'){
					elem.innerHTML = transport.responseXML.getElementsByTagName('totalSum_Money')[0].firstChild.nodeValue;
				}
			});

			// setting the orderlines
			$$('.basket_totalLines').each(function(elem){
				elem.innerHTML = transport.responseXML.getElementsByTagName('totalLines')[0].firstChild.nodeValue;
			});

			// setting the itemtotals
			$$('.basket_totalItems').each(function(elem){
				elem.innerHTML = transport.responseXML.getElementsByTagName('totalItems')[0].firstChild.nodeValue;
			});
			Basket.updateAanbiedingen(transport.responseXML.getElementsByTagName('totalSumFreeProduct')[0].firstChild.nodeValue);
			
			// updating the proceedbuttons
			var basketPriceAccepted = transport.responseXML.getElementsByTagName('basketPriceAccepted')[0].firstChild.nodeValue;
			var merchantSelected = transport.responseXML.getElementsByTagName('merchantSelected')[0].firstChild.nodeValue;
			var merchantOrderDatesLeft = transport.responseXML.getElementsByTagName('merchantOrderDatesLeft')[0].firstChild.nodeValue;
			/* var userAccepted = transport.responseXML.getElementsByTagName('userAccepted')[0].firstChild.nodeValue; */
			Basket.updateBasketProceedButtons(basketPriceAccepted, merchantSelected, merchantOrderDatesLeft /*, userAccepted*/);
		},
		onFailure: function(){ 
			console.log('Could not retrieve totals - basket information');
		}});
}

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 {
			if(elem.hasClassName(basketAanbieding_freeItemClassExtention)){
				elem.toggleClassName(basketAanbieding_freeItemClassExtention);
			}
			if(((!elem.readAttribute('fromPrice')) || (totalSumValid>=parseInt(elem.readAttribute('fromPrice')))) && 
				((!elem.readAttribute('toPrice')) || (totalSumValid<parseInt(elem.readAttribute('toPrice'))))){
				elem.toggleClassName(basketAanbieding_freeItemClassExtention);
			}
		}
	});
}

Basket.assignActions = function(){
	// Assigning the events to the mutationbuttons
	var product_mutateButtons = $$('button.basket_mutate');
	product_mutateButtons.each(function(elem){
		// only allow assigning buttonactions if the buttonactions wherent allready assigned
		if(!elem.assignmentCompleted){
			elem.observe('click',function(e){
				Basket.processMutation(e);
			})								 
		}
		elem.assignmentCompleted = true;
	});

	// Assigning the events to the mutationfields
	var product_itemAmounts = $$('input.basket_mutate');
	product_itemAmounts.each(function(elem){
		// only allow assigning buttonactions if the buttonactions wherent allready assigned
		if(!elem.assignmentCompleted){
			// ensuring there is only integer input
			elem.observe('keypress',function(e){
				var charCode = e.keyCode ? e.keyCode : e.which;
				var strChar = String.fromCharCode(charCode);
				if(charCode==13) { // filtering the enterkey (for submitting data)
					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)) { // re-enabeling the backspace and deletekey
					window.event? event.returnValue = false : e.preventDefault();  // preventing the eventual action of adding key to field
					return false;
				}
			});	
			// as soon as the user changes the fieldvalues, the basket needs an update
			elem.observe('change',function(e){
				// if the field is left blank we want it to become a zero
				if(!e.target.value) e.target.value=0;
				Basket.processMutation(e);
			});
			elem.assignmentCompleted = true;
		}
	});

	// Assigning the events addItem special
	var product_itemAdds = $$('form.basket_addItem');
	product_itemAdds.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('targetBasket', (query.get('targetBasket') ? query.get('targetBasket') : 'defaultBasket'));
				query.set('randomize', Math.random());
				query.set('return','operationStatus');
				new Ajax.Request('php/basket.php' , {
					asynchronous: true,
					method: 'get',
					parameters: query,
					onSuccess: function(transport){
						Basket.processTotals(query.get('targetBasket'));
						Basket.updateContainer();
						$$('.basket_addItem .errorMessage').each(function(errorElem){
							errorElem.hide();
							// this in case there are more errorMessages
							if(errorElem.hasClassName('unknownItem')) {
								if(transport.responseXML.getElementsByTagName('productFound')[0].firstChild.nodeValue != 'SUCCESS') {
									errorElem.show();
								}
							}
						});
						e.target.reset();
					},
					onFailure: function(){ 
						console.log('Could not retrieve product - basket information');
					}});

			})
			elem.assignmentCompleted = true;
		}
	});
	
	// Assigning the events for extra basketdata
	$$('.basketSetExtraData').each(function(elem){
		if(!elem.assignmentCompleted){
			elem.observe('click',function(e){
				var targElem = $(this.getAttribute('basketExtraDataContainerId'));
				var sourceElem = this;
				if(targElem){
					var elementsInContainer = getElementsByTagNames('input,select,textarea',targElem);
					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){
									if(containerElem.hasClassName(formvalueIncorrectClassExtention)) {
										containerElem.toggleClassName(formvalueIncorrectClassExtention);
									}
								} else {
									if(!containerElem.hasClassName(formvalueIncorrectClassExtention)) {
										containerElem.toggleClassName(formvalueIncorrectClassExtention);
									}
									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');
					new Ajax.Request('php/basket.php' , {
						asynchronous: true,
						method: 'get',
						parameters: query,
						onComplete: function(transport){
							if(!errorneousFieldFound) {
								if(sourceElem.getAttribute('linkRef')){
									// todo : this is ugly...
									StaticLink.redirect(sourceElem.getAttribute('linkRef'));
								}
							}
						},
						onFailure: function(){ 
							console.log('setting extra data failed');
						}
					});
				} else {
					console.log('setting extra data failed, could not find target container');
				}
			});
			elem.assignmentCompleted = true;
		};
	});
	
	// Assigning the events addItem special
	$$('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());
				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: {
						'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';
		new Ajax.Updater(elem, 'php/basket.php' , {
			asynchronous: true,
			method: 'get',
			parameters: {
				'return' : 'basket',
				'targetBasket' : targetBasket,
				'randomize' : Math.random()
			},
			onComplete: function(transport){
				Basket.assignActions();
				Basket.processTotals(targetBasket);
			}
		});
	});
}

Basket.updateCodeContainer = function(){
	var availableContainers = $$('.codeContainer');
	availableContainers.each(function(elem){
		var targetBasket = elem.getAttribute('targetBasket') ? elem.getAttribute('targetBasket') : 'defaultBasket';
		new Ajax.Updater(elem, 'php/codes.php' , {
			asynchronous: true,
			method: 'get',
			parameters: {
				'return' : 'codeList',
				'targetBasket' : targetBasket,
				'randomize' : Math.random()
			},
			onComplete: function(transport){
				Basket.assignActions();
				Basket.processTotals(targetBasket);
			}
		});
	});
}

Basket.updateBasketProceedButtons = function(basketpriceAccepted,merchantSelected,merchantOrderDatesLeft/*, userAccepted*/){
	basketpriceAccepted = basketpriceAccepted == 'TRUE' ? true : false;
	merchantSelected = merchantSelected == 'TRUE' ? true : false;
	merchantOrderDatesLeft = merchantOrderDatesLeft == 'TRUE' ? true : false;
	//userAccepted = userAccepted== 'TRUE' ? true : false;
	$$('.basketproceed').each(function(elem){
		if(elem.hasClassName('proceedpayment')){
			if((basketpriceAccepted)&&(merchantSelected)&&(merchantOrderDatesLeft)/*&&(userAccepted)*/) { elem.show(); }
			else { elem.hide(); };
		}
		/*
		if(elem.hasClassName('proceedidentification')){
			if((basketpriceAccepted)&&(!userAccepted)) { elem.show(); }
			else { elem.hide(); };
		}
		*/
		if(elem.hasClassName('proceedmerchantselection')){
			if((basketpriceAccepted)&&(!merchantSelected)/*&&(userAccepted)*/) { elem.show(); }
			else { elem.hide(); };
		}
		
		if(elem.hasClassName('proceedmarchantselection_noDates')){
			if((basketpriceAccepted)&&(merchantSelected)&&(!merchantOrderDatesLeft)/*&&(userAccepted)*/) { elem.show(); }
			else { elem.hide(); };
		}
		
		if(elem.hasClassName('proceeddenied')){
			if(!basketpriceAccepted) { elem.show(); } 
			else { elem.hide(); };
		}
	});
}


/* CODES */
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());
				$$('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;
		}
	});
});



/***************************************************************
* GET ELEMENT BY TAG NAMES
* todo : hier zal best wel een prototype oplossing voor zijn, 
*        maar ik heb gewoon geen tijd meer
***************************************************************/

function getElementsByTagNames(list,obj) {
	if (!obj) var obj = document;
	var tagNames = list.split(',');
	var resultArray = new Array();
	for (var i=0;i<tagNames.length;i++) {
		var tags = obj.getElementsByTagName(tagNames[i]);
		for (var j=0;j<tags.length;j++) {
			resultArray.push(tags[j]);
		}
	}
	var testNode = resultArray[0];
	if (!testNode) return [];
	if (testNode.sourceIndex) {
		resultArray.sort(function (a,b) {
				return a.sourceIndex - b.sourceIndex;
		});
	}
	else if (testNode.compareDocumentPosition) {
		resultArray.sort(function (a,b) {
				return 3 - (a.compareDocumentPosition(b) & 6);
		});
	}
	return resultArray;
}


/***************************************************************
* 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){
				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.indexOf('://')==-1) {
			URLPath=baseURL+URLPath;
		}
		target ? window.open(URLPath,target) : (document.location.href = URLPath);
	}
}

/***************************************************************
* DEALERS ZOEKEN
***************************************************************/

document.observe('dom:loaded', function(event){
	$$('.dealer_calcProximityForPostcode').each(function(elem){
		elem.observe('click', function(eventObject){
			var currentElem = eventObject.target;
			var postcodeElem = $(currentElem.readAttribute("postcodeId"));
			var proximityElem = $(currentElem.readAttribute("proximityId"));
			var targetContainer = $(currentElem.readAttribute("targetContainer"));
			var errorElem = $(currentElem.readAttribute("errorMessage"));
			
			if((!postcodeElem)||(!proximityElem)||(!targetContainer)){
				console.log('could not complete request, missing elements');
				return false;	
			}
			window.event? event.returnValue = false : eventObject.preventDefault(); 

			var validated = postcodeElem.value.match(new RegExp('^[0-9]{4}\s?[a-z|A-Z]{2}$'))
			if(validated){
				if(postcodeElem.hasClassName(formvalueIncorrectClassExtention)) {
					postcodeElem.toggleClassName(formvalueIncorrectClassExtention);
				}
				if(errorElem) {
					errorElem.hide();
				}
				// get the latitude and longitude an pass them to the updateDealerContainerfunction
				var zoomlevel = parseInt($(proximityElem.options[proximityElem.selectedIndex]).readAttribute('googleZoomLevel'));
				gMapsObject.calcProximityToPostcode(postcodeElem.value, targetContainer, proximityElem.value, zoomlevel);
			} else {
				if(errorElem) {
					errorElem.show();
				}
				if(!postcodeElem.hasClassName(formvalueIncorrectClassExtention)) {
					postcodeElem.toggleClassName(formvalueIncorrectClassExtention);
				}
			}
		});
	});
});

dealerList = new Object();

dealerList.initialize = function(listElem){
	listElem.descendants().each(function(elem){
		if(!elem.readAttribute('assignmentCompleted')) {
			if(elem.hasClassName('dealer_select')){
				elem.observe('onclick',function(eventObject){
					// zorg dat deze dealer is aangeklikt
				});
			}
			elem.writeAttribute('assignmentCompleted',1);
		}
	});
}

dealerList.updateDealerContainer = function(proximity, latitude, longitude, targetContainerElem){
	new Ajax.Updater($(targetContainerElem), 'php/dealer.php' , {
		asynchronous: true,
		method: 'get',
		parameters: {
			'proximity' : proximity,
			'latitude' : latitude,
			'longitude' : longitude,
			'return' : 'dealerList',
			'randomize' : Math.random()
		},
		onComplete: function(transport){
			//dealerList.initialize(targetContainer);
		}
	});
}

// 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 (!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);
}


/* DIVERSEN - form focus */

var currentlyActiveInputRef = false;
var currentlyActiveInputClassName = false;

function highlightActiveInput() {
  if(currentlyActiveInputRef) {
    currentlyActiveInputRef.className = currentlyActiveInputClassName;
  }
  currentlyActiveInputClassName = this.className;
  this.className = 'inputHighlighted';
  currentlyActiveInputRef = this;
}

function blurActiveInput() {
  this.className = currentlyActiveInputClassName;
}

function initInputHighlightScript() {
  var tags = ['INPUT','TEXTAREA'];
  for(tagCounter=0;tagCounter<tags.length;tagCounter++){
    var inputs = document.getElementsByTagName(tags[tagCounter]);
    for(var no=0;no<inputs.length;no++){
      if(inputs[no].className && inputs[no].className=='doNotHighlightThisInput')continue;
      if(inputs[no].tagName.toLowerCase()=='textarea' || (inputs[no].tagName.toLowerCase()=='input' && inputs[no].type.toLowerCase()=='text')){
        inputs[no].onfocus = highlightActiveInput;
        inputs[no].onblur = blurActiveInput;
      }
    }
  }
}

/***************************************************************
* SLIDESHOW
***************************************************************/
function Slideshow(slideshow, timeout) {
  this.slides = [];
  var nl = $(slideshow).getElementsByTagName('div');
  for (var i = 0; i < nl.length; i++) {
    if (Element.hasClassName(nl[i], 'slide')) {
      this.slides.push(nl[i]);
    }
  }
  this.timeout = timeout;
  this.current = 0;

  for (var i = 0; i < this.slides.length; i++) {
    this.slides[i].style.zIndex = this.slides.length - i;
  }

  Element.show(slideshow);
  setTimeout((function(){this.next();}).bind(this), this.timeout + 850);
}
Slideshow.prototype = {
  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);
  }
}

/* ---------------------------------------------------------------- //
// 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;
	}
}


/* ---------------------------------------------------------------- //
// "POPUP"                                                          //
// ---------------------------------------------------------------- */

var flvLoaded = false;

function get_flvPlayer(player){
	// deze antieke manier omdat ome adobe vindt dat het zo moet
	var isIE = navigator.appName.indexOf("Microsoft") != -1;
	return (isIE) ? window[player] : document[player];
}

function popup_show(e) {
	elem = e.target;
	$('popup_name').innerHTML = elem.getAttribute('windowName');
	var targElem = elem.getAttribute('targPlayer') ? $(elem.getAttribute('targPlayer')) : $('popup_img');
	$$('.popup_targElem').each(function(elem){
		if(!elem.hasClassName('popup_toggle')) elem.toggleClassName('popup_toggle');
	});
	if($('popup_achtergrond').hasClassName('popup_toggle')) $('popup_achtergrond').toggleClassName('popup_toggle');
	if($('popup_content').hasClassName('popup_toggle')) $('popup_content').toggleClassName('popup_toggle');
	if(targElem.hasClassName('popup_toggle')) targElem.toggleClassName('popup_toggle');
	if(targElem == $('popup_flv')) {
		get_flvPlayer('popup_flv').playVideo(elem.getAttribute("srcValue"));
		//$('popup_flv').playVideo(elem.getAttribute("srcValue"));
	} else {
		targElem.src = elem.getAttribute("srcValue");
	}
};

function popup_hide() {
	$('popup_name').innerHTML = "";
	$('popup_img').src = "images/popup_loading.gif";
	if(flvLoaded) { get_flvPlayer('popup_flv').pauseResume(); } ;
	flvLoaded = true;
	if(!$('popup_achtergrond').hasClassName('popup_toggle')) { $('popup_achtergrond').toggleClassName('popup_toggle'); };
	if(!$('popup_content').hasClassName('popup_toggle')) { $('popup_content').toggleClassName('popup_toggle'); };

};

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




/***************************************************************
* easter-eggs
***************************************************************/
/*
document.observe('dom:loaded', function(eventObject){
	$('sfeer').observe('click', function(elem){
		Effect.Squish('sfeer');
	});
});
*/

/***************************************************************
* DOM EVENT LISTNERS
***************************************************************/
document.observe('dom:loaded', function(event){
	if($('googleMaps')) { 
		gMapsObject.loadGoogleMaps();
	}
	StaticLink.initialize();
	Basket.initialize();

	$$('.openPopup').each(function(elem){elem.observe('click',popup_show)});
	$$('.closePopup').each(function(elem){elem.observe('click',popup_hide);});
	$$('.popup_targElem').each(function(elem){elem.observe('click',popup_hide);});
	$$('.confirmBox').each(function(elem){elem.observe('click',initiate_confirm)});
	$$('.slideshow').each(function(elem){new Slideshow(elem.id, 3000)});
	if($('popup_name')) { popup_hide(); } // dit mag aanvankelijk niet gehide zijn, want dan vertikt je browser de swf te downloaden
	initInputHighlightScript();
});
