var dealerFinder = new Class({
	Implements: [Options, Events],
	options: {
		googleMapsContainerId  		: 'theMap',
		formCheckBoxWandId 			: 'wand',
		formCheckBoxVloerId 		: 'vloer',
		formCheckBoxCineWallId		: 'cinewall',
		formInputPostcodeId			: 'postcode',
		formInputWoonplaatsId		: 'woonplaats',
		formSelectLandId			: 'land',
		formSubmitButtonId			: 'zoeken',
		googleMapsRouteContainerId	: 'googleMapTextRoute',
		googleApiSettingRadius		: '50',
		pathToGetData				: 'includes/getData.php',
		autoRun						: false
	},
	myData: {
		objGoogleMap 			: null,
		objGoogleMarker			: [],
		objGoogleGeoCoder		: null,
		objGoogleInfoWindow		: null,
		objGoogleRenderer		: null,
		objGoogleDirection		: null,
		objGoogleBounds			: null,
		aGoogleMarkers			: null,
		sLanguage				: 'nl',
		sFrom					: '',
		sTo						: ''
	},
	initialize: function(options){
		this.setOptions(options);
		if(this.checkOptions() === false){ 
		//	console.log('one of the options with *Id where not found! Please check your spelling.'); 
		}
		else if(this.options.autoRun===true){
			this.run(); 
		}
	},
	checkOptions: function(){
		if($(this.options.googleMapsContainerId)==null){ return false; 
		}else if($(this.options.formCheckBoxWandId)==null){ return false; 
		}else if($(this.options.formCheckBoxVloerId)==null){ return false;
		}else if($(this.options.formCheckBoxCineWallId)==null){ return false; 
		}else if($(this.options.formInputPostcodeId)==null){ return false; 
		}else if($(this.options.formInputWoonplaatsId)==null){ return false; 
		}else if($(this.options.googleMapsRouteContainerId)==null){ return false;
		}else if($(this.options.formSelectLandId)==null){ return false;		
		}else if($(this.options.formSubmitButtonId)==null){ return false; }
		else { return true; }
	},
	setSubmitAction: function(){
		var obj = this;
		$(this.options.formSubmitButtonId).addEvent('click', function(){
			if(obj.validateReqFields(obj)===true){  
				obj.googleGetStartLocation(); 
			
				$('formWarning').setStyle('display','none');
				$('Incorrect').setStyle('display','none');
				
				
			}else {  obj.sendErrorMssg('requiredFields'); }
		});
	},
	validateReqFields: function(object){
		if(		($(object.options.formInputPostcodeId).getProperty('value').trim().length < 4) && 
				($(object.options.formInputWoonplaatsId).getProperty('value').trim().length < 2)){ return false;
		}else { return true; }		
	},
	sendErrorMssg: function(type){
		if(type==='requiredFields'){
			$('formWarning').setStyle('display','block');
			$('Incorrect').setStyle('display','block');
			
		}
		if(type==='addressNotFound'){ 
			$('formWarning').setStyle('display','block');
			$('notFound').setStyle('display','block');
		}
		
		this.resetMap();
		
	},
	resetMap: function(){
		
		this.myData.objGoogleRenderer.setPanel(null);
		
		this.myData.objGoogleRenderer = null;
		this.myData.objGoogleMap = null;
		this.myData.objGoogleMarker	= null;
		this.myData.objGoogleMarker = [];
		this.myData.objGoogleGeoCoder = null;
		this.myData.objGoogleInfoWindow = null;
		this.myData.objGoogleRenderer = null;
		this.myData.objGoogleDirection = null;
		this.myData.objGoogleBounds = null;
		this.myData.aGoogleMarkers = null;
		
		this.run();
		
	},
	googleGetStartLocation: function(){
		var obj = this;

		var inputPostcode = $(this.options.formInputPostcodeId).getProperty('value').trim();
		var inputWoonplaats = $(this.options.formInputWoonplaatsId).getProperty('value').trim();
		var inputLand = $(this.options.formSelectLandId).getProperty('value').trim();
				
		var sAddress = inputPostcode+', '+inputWoonplaats+', '+inputLand; 
		
		var geoCoder = new google.maps.Geocoder();
		this.myData.objGoogleGeoCoder = geoCoder;
		geoCoder.geocode({address: sAddress}, function(results, status){
			if(status == google.maps.GeocoderStatus.OK){
				

				obj.myData.sFrom = results[0].formatted_address;
				
				var marker = new google.maps.Marker({
					map: obj.myData.objGoogleMap,
					position: results[0].geometry.location,
					icon: '/images/locations/home.png'
				});
				
				obj.myData.objGoogleMap.panTo(marker.getPosition());
				obj.myData.objGoogleMap.setZoom(11);
				
				obj.googleRemoveMarkers();
				
				obj.googleSearchLocationsNear(results[0].geometry.location);
				obj.myData.objGoogleMarker.push(marker);
				
				$('formWarning').setStyle('display','none');
				$('notFound').setStyle('display','none');
				
				
			}else {
				obj.sendErrorMssg('addressNotFound');
			}
		});

	},
	googleParseXML: function(str){
		if (window.ActiveXObject) {
			var doc = new ActiveXObject('Microsoft.XMLDOM');
			doc.loadXML(str);
			return doc;
		} else if (window.DOMParser) {
			return (new DOMParser).parseFromString(str, 'text/xml');
		}
	},
	googleSearchLocationsNear: function(Location){
		
		var obj = this;
	
		var lat = Location.lat();
		var lng = Location.lng();
			
		var radius 	= this.options.googleApiSettingRadius;
		
		var floor 	= $(this.options.formCheckBoxVloerId).checked;
		var wand 	= $(this.options.formCheckBoxWandId).checked;
		var cine 	= $(this.options.formCheckBoxCineWallId).checked;
		
		
		var myHTMLRequest = new Request.HTML({url:this.options.pathToGetData, onSuccess:function(responseTree,responseElements,responseHTML){

			var xml = obj.googleParseXML(responseHTML);
			var markerNodes = xml.documentElement.getElementsByTagName("marker");
			var bounds = new google.maps.LatLngBounds();
			obj.myData.objGoogleBounds = bounds;
			
			if(markerNodes.length !== 0){
				for(var i=0; i < markerNodes.length; i++){
					var aWand = markerNodes[i].getAttribute("wand");
					var aCinewall = markerNodes[i].getAttribute("cinewall");
					var aFloor = markerNodes[i].getAttribute("floor");
					
					var name = markerNodes[i].getAttribute("name");
					var address = markerNodes[i].getAttribute("address");
					var postcode = markerNodes[i].getAttribute("postcode");
					var plaats = markerNodes[i].getAttribute("plaats");
					var telefoon = markerNodes[i].getAttribute("telefoon");
					
					var website = markerNodes[i].getAttribute("website");
					
					var distance = parseFloat(markerNodes[i].getAttribute("distance"));
					var latlng = new google.maps.LatLng(
						parseFloat(markerNodes[i].getAttribute("lat")),
						parseFloat(markerNodes[i].getAttribute("lng"))
					);
					obj.googleSetNearbyMarkers(latlng, aWand, aCinewall, aFloor, website, name, address, postcode, plaats, telefoon, distance, i, Location);
				}
				obj.myData.objGoogleBounds.extend(Location);
				obj.myData.objGoogleMap.setCenter(obj.myData.objGoogleMarker[0].getPosition());
				obj.myData.objGoogleMap.panToBounds(bounds);				
			}
		}}).get({'lat':lat,'lng':lng,'radius':radius,'floor':floor,'wand':wand,'cine':cine});
	},
	googleSetNearbyMarkers: function(latlng, wand, cinewall, floor, website, name, address, postcode, plaats, telefoon, distance, i, Location){
		
		var obj = this;
		

		if(this.myData.sLanguage ==='nl'){
			var sLangTel 	= 'Tel: ';
			var sLangJa 	= 'Ja';
			var sLangNee	= 'Nee';
			var sLangTitle  = 'Productgroep aanwezig';
			var sLangWand   = 'Wand- en plafondpanelen: ';
			var sLangVloer	= 'Vloeren: ';
			var sLangPlan	= 'Plan Route';
		}else {
			var sLangTel 	= 'T&eacute;l: ';
			var sLangJa 	= 'Oui';
			var sLangNee	= 'Non';
			var sLangTitle  = 'groupe de produits pr&eacute;sents';
			var sLangWand   = 'Lambris: ';
			var sLangVloer	= 'Rev&ecirc;tements de sol: ';
			var sLangPlan	= 'Route Plan';
		}
		
		
		var myText = '';
			myText+= (address.trim())+'<br />';
			myText+= (postcode.trim())+' '+(plaats.trim())+'<br />';
			
			if(telefoon.trim().length > 3 ){
				myText+= sLangTel+(telefoon.trim())+'<br />';
			}else{
				myText+= '<br/>';
			}
			
			
			if(website.trim().length > 1){
				myText+= '<a style="color:green;text-decoration:none;" target="_BLANK" href="http://'+(website.trim())+'/">'+(website.trim())+'</a><br /><br />';
			}else{
				myText+= '<br /><br />';
			}
			myText+= '<b>'+sLangTitle+'</b><br />'
			myText+= sLangWand+((wand.trim()==1 ? sLangJa:sLangNee))+'<br />';
			myText+= sLangVloer+((floor.trim()==1 ? sLangJa:sLangNee ))+'<br />';		
			//myText+= 'Cinewall: '+((cinewall.trim()==1 ? 'Ja':'Nee'))+'<br />';		
			
				
		var myDiv = new Element('div',{'class' : 'infoWindow'});	
		var myH1 = new Element('h1',{'html': (name.trim())});
		var myP	= new Element('p',{
			'html' : myText,
			'styles' : {
				'font-family' : 'Trebuchet MS',
				'color' : '#000'
			}
			});
		
		var myA = new Element('b',{
			'html':sLangPlan,
			'class': 'googleWindmyLink',
			'styles': {
				'cursor':'pointer',
				'display': 'inline-block',
				'color': '#666'
			},
			'events': {
				'click': function(){
					obj.googleCalculateRoute(Location, latlng);
					obj.myData.objGoogleRenderer.setMap(obj.myData.objGoogleMap);
				}
			}			
		});
		
		myH1.inject(myDiv);
		myP.inject(myDiv);
		myA.inject(myDiv);
		
		var sHtml = myDiv;
			
		var marker = new google.maps.Marker({
			map: obj.myData.objGoogleMap,
			position: latlng,
			icon: '/images/locations/location_'+(i+1)+'.png'
		});
		
		google.maps.event.addListener(marker, 'click', function(){
			
			obj.myData.objGoogleGeoCoder.geocode({location: latlng }, function(results,status){
				if(status == google.maps.GeocoderStatus.OK){
					obj.myData.sTo = results[0].formatted_address;
				}
			});
			
			
			obj.myData.objGoogleInfoWindow.setContent(sHtml);
			obj.myData.objGoogleInfoWindow.open(obj.myData.objGoogleMap, marker);
		
		
		});
		
		obj.myData.objGoogleMarker.push(marker);
		
	},
	googleCalculateRoute: function(start, end){
		this.myData.objGoogleRenderer.setPanel($(this.options.googleMapsRouteContainerId));		
		
		var obj = this;
		var request = {
				origin:obj.myData.sFrom, 
				destination:obj.myData.sTo,
				travelMode: google.maps.DirectionsTravelMode.DRIVING
			};
		this.myData.objGoogleDirection.route(request, function(response, status) {
			if (status == google.maps.DirectionsStatus.OK) {
				obj.myData.objGoogleRenderer.setDirections(response);
			}
		});
	},
	googleRemoveMarkers: function(){
		
		this.myData.objGoogleInfoWindow.close();
		this.myData.objGoogleRenderer.setMap(null);
		this.myData.objGoogleRenderer.setPanel(null);
		
		
		for(var i=0; i < this.myData.objGoogleMarker.length; i++){
			this.myData.objGoogleMarker[i].setMap(null);
		}
		this.myData.objGoogleMarker.length = 0;
	},	
	googleInit: function(){
		var latlng = new google.maps.LatLng(50.8792675, 4.7021386);
		
		var myOptions = {
				zoom: 11,
				center: latlng,
				mapTypeId: google.maps.MapTypeId.ROADMAP,
				mapTypeControlOptions: {style: google.maps.MapTypeControlStyle.DEFAULT}		      
		    };
		
		var map = new google.maps.Map(document.getElementById(this.options.googleMapsContainerId), myOptions);
		
		var directionsRenderer = new google.maps.DirectionsRenderer();
		var infoWindow = new google.maps.InfoWindow();
		var directionService = new google.maps.DirectionsService();

		directionsRenderer.setMap(map);
		
		directionsRenderer.setPanel($(this.options.googleMapsRouteContainerId));		
		
		
		this.myData.objGoogleMap = map;
		this.myData.objGoogleRenderer = directionsRenderer;
		
		this.myData.objGoogleInfoWindow = infoWindow;
		this.myData.objGoogleDirection = directionService;
	
	},
	setLanguage: function(str){
		if(str==='fr'){
			this.myData.sLanguage = 'fr';
		}
	},
	run: function(){
		this.setSubmitAction();
		this.googleInit();
	}
});





