/**************************************************************************************

			var gmap = new GMaps();
            gmap.mapType = G_NORMAL_MAP;
            gmap.zoomlevel = 12;
            gmap.GMapLoad(map: HTML Object, directions: HTML Object);
		KML	
			gmap.kmlPath = '/pad/naar/kml/bestanden/?optioneel';
			gmap.showKML('kml.xml');
		COORDS
			gmap.showCoords(latitude:decimal, longtitude:decimal);
		ADDRESS
			gmap.showAddress('Land, Adres, Postcode, Plaats');
			
			
***************************************************************************************/
function GMaps(){	
	var that = this;
	
	var properties = {
		/*Argumenten voor de constructor*/
		objMap : document.createElement('div'),
		objDirections : document.createElement('div'),
		address : 'string',
		mapType : G_NORMAL_MAP,
		zoomlevel : 12,
		latitude : Number,
		longtitude : Number,
		kml : 'string',		
		kmlPath : "/inc/upload/kml/",
		/*Variabelen die intern worden gebruikt*/
		geocoder : null,//GClientGeocoder Object: Voor het ophalen van Coordinaten of Adres gegevens
		map : null,//GMap2 Object: Voor het aanmaken van een mao
		gdir : null,//GDirections Object
		geoXml : null,//GGeoXml Object: Voor het uitlezen van het KML bestand  
		point : null,//GLatLng Object: bepaald punt op de kaart
		timer : null//Timer voor callback functies
	};
	
	this.methods = {
		showMap : function(){
			//Coordinaten bekend? tonen die handel
			if(properties.latitude>0&&properties.longtitude>0)this.showCoords();
			//Kml bestand meegegven? tonen die handel
			else if(properties.kml&&properties.kml!='string'&&(properties.address && properties.address!='string'))this.showKML();
			//Adres bekend? tonen die handel!
			else if(properties.address&&properties.address!='string')this.showAddress();
			//Geen van de boven staande properties zijn meegegeven? errortje tonen
			else{
				alert('Er kan geen Map getoond worden, om een of meer van de volgende redenen:\n\n-\tEr is geen Latitude and geen Longtitude mee gegeven.\n-\tEr is geen KML bestand meegegeven\n-\tEr is geen Adres meegegeven');
				return false;
			}
		},
		
		//Kml Gebruiken op locatie op de kaart te laten zien
		showKML : function(){	
			//Een GGeoXml object voeg geografische content toe van een XML KML bestand.		
			if(properties.kml&&properties.kml!='string')properties.geoXml = new GGeoXml("http://"+document.location.hostname+properties.kmlPath+properties.kml+"?uuid="+Math.random(),this.kmlCallback);
			else{
				alert('Er kan geen Map getoond worden, om de volgende reden:\n\n\tEr is geen KML bestand opgegeven.');
				return false;
			}
		},
		
		//Callback functie voor showKML GGeoXml
		kmlCallback : function(){
			if(properties.timer){
				properties.geoXml.gotoDefaultViewport(properties.map);
				properties.map.addOverlay(properties.geoXml);
				properties.map.setZoom(properties.zoomlevel);
			}else{
				properties.timer = setTimeout(function(){},3000);
			}
		},
		
		
		getAddress : function(){
			if(properties.latitude>0&&properties.longtitude>0){
				//Google Map point aanmaken aan de hand van de coordinaten
				properties.point = new GLatLng(properties.latitude,properties.longtitude);
				//Adres gegevens coordinaten opvragen
				properties.geocoder.getLocations(properties.point, this.setAddress);  	
			}else{
				alert('Adres kan niet worden opgehaald omdat er geen coordinaten zijn gespecificeerd.');
				return false;
			}
		 },
		 
		 //Callback functie voor showCoords geocoder.getLocations
		setAddress : function(address){
			//Addres ophalen uit locatue object
			properties.address = address['Placemark'][0]["address"];  
		},
		
		showCoords : function(){
			//Kaart centreren op locatie
			properties.map.setCenter(properties.point, properties.zoomlevel);
			//Niew marker aanmaken
			marker = new GMarker(properties.point);
			//Marker over kaart heen plaatsen
			properties.map.addOverlay(marker);
			//Informatie venster punt tonen
			marker.openInfoWindowHtml(properties.address);
		},
					
		//Addres om toveren in coordinaten
		showAddress : function(){  
			if(properties.address&&properties.address!='string'){				
				properties.geocoder.getLatLng(properties.address,this.addressCallback);
			}else{
				alert('Er kan geen Map getoond worden, om de volgende reden:\n\n\tEr is geen Adres bekend.');
				return false;
			}
		},
		
		//Callback voor showAddress geocoder.getLatLng
		addressCallback : function(point){
			//point coordinaten die zijn opgehaald
			if(!point){
				alert(properties.address + "  niet gevonden.");
			}else{
				//map centreren op coordinaten met gewenste zoomlevel	
				properties.map.setCenter(point, properties.zoomlevel);
				
				marker = new GMarker(point);
				
				//markers, paths, etc over de map heen plaatsen
				properties.map.addOverlay(marker);
				
				//Informatie venster van de marker openen en adresgegevens in plaatsen
				marker.openInfoWindowHtml(properties.address);  
			}
		},

		//Routeplanner
		setDirections : function(fromAddress, toAddress, locale) {
			if(properties.gdir){
				if(!toAddress&&properties.address)toAddress = properties.address;
				
				//locale: Land code voor specefieke routes.
				if(fromAddress.length>1 && fromAddress.length>1){	
					//Routes in het HTML Object laden.
					properties.gdir.load("from: " + fromAddress + " to: " + toAddress, { "locale": locale, "getPolyline":true })
				}else{
					alert("Voer een adres in en probeer het nogmaals.");
				}
			}else{
				alert('Kan geen route bepalen omdat het HTML object voor de Directions niet is gezet.');
			}
		},
		
				
		//Type Checken
		typeCheck : function(object1, object2){
			//alert(object1);
			if(object1.toString()==object2.toString()){
				return true;
			}
			if(object1.constructor==object2.constructor){
				return true;
			}
			if(typeof object1==typeof object2){
				return true;
			}
			return false;
		}
	};

	/*ARGUMENTEN*/
	
	//Argumenten worden meegegeven als collectionObject
	if(arguments.length==1&&typeof arguments[0]=='object'){		
		errorText = '';
		//Elk argument in een variable stoppen
		for(argument in arguments[0]){
			if(argument in properties && this.methods.typeCheck(properties[argument], arguments[0][argument])){//Checken of het argument bestaat als property en van het jusite type is
				properties[argument] = arguments[0][argument];
			}else{
				errorText += 'Argument ' + argument + ': Is niet van het correcte ' + typeof properties[argument] + ' type.\n';
			}
		}
		//Als een van de argumenten niet van het jusite type is, error weergeven
		if(errorText!==''){
			alert(errorText);
			return false;
		}
	//Argumenten worden los mee gegeven
	}else if(arguments.length>1){
		index = 0;
		errorText = '';
		//Kijken of het Object van de juiste type is en als property zetten, zo niet word er een foutmelding weergegeven
		for(property in properties){
			if(index==arguments.length)break;
			if(this.methods.typeCheck(properties[property], arguments[index])){
				properties[property] = arguments[index];
			}else{
				errorText += 'Argument ' + (index+1) + ': Is niet van het correcte ' + typeof properties[property] + ' type.\n';
			}			
			index++;
		}
		if(errorText!==''){
			alert(errorText);
			return false;
		}
	}else{
		alert('Om GoogleMaps te kunnen intializeren zijn er argumenten vereist.');
		return false;
	}

	GMapLoad = function(){
		if (GBrowserIsCompatible()) {			
			//Centrale Class voor de Api om een map aan te maken.
			properties.map = new GMap2(properties.objMap);
		   
			properties.map.setMapType(properties.mapType);
			
			properties.map.addControl(new GSmallMapControl());
			properties.map.addControl(new GMapTypeControl());
			
			//GClientGeocoder word gebruikt als communicatie middel met de google server om geocodes voor gespecificeerde adressen op te halen.
			properties.geocoder = new GClientGeocoder();			
			//GDirections word gebruikt om route beschrijvingen op te halen en ze in een HML object weer te geven.
			if(properties.objDirections)properties.gdir = new GDirections(properties.map, properties.objDirections);
			
			if(properties.latitude>0&&properties.longtitude>0)getAddress();
			
			that.methods.showMap();
		}
	}(); 
        
}
