$(document).ready(function()
{
	var clientArea = document.getElementById('googlecontainer');
	
	var googlemaps = new GoogleMaps();
	googlemaps.init(clientArea);
	googlemaps.render();
	googlemaps.initAfterRender();
})

GoogleMaps = function(){ }
GoogleMaps.prototype = {
	clientArea:null,
	_mapsCanvas:null,
	_txtInput:null,
	_directionsPanel:null,
	_directions:null,
	_map:null,
	
	init: function(htmlObj){
		this.clientArea = htmlObj;
	},
	
	render: function (){
		var container = document.createElement("div");
		container.style.height = "800px";
		container.style.width = "455px";
		container.style.clear = "both";
		container.style.overflow = "hidden";
		container.style.marginTop = "10px";
		container.style.position = "relative";
						
		this._mapsCanvas= document.createElement("div");
		this._mapsCanvas.style.height = "400px";
		this._mapsCanvas.style.width = "400px";
		this._mapsCanvas.style.border = "solid 1px black";
		
		var controlsArea = document.createElement("div");
		controlsArea.style.marginTop = "10px";
			
		var explain = document.createElement("span");
		explain.innerHTML = "Enter departure location:";
			
		this._txtInput = document.createElement("input");
		this._txtInput.type = "text";
		this._txtInput.style.width = "170px";
        this._txtInput.style.marginLeft = "10px";
		this._txtInput.onkeypress = new Delegate(this, this._txtInputKeyPressEventHandler);

		var btn = document.createElement("button");
		btn.style.marginLeft = "10px";
        btn.style.marginTop = "-7px";
		btn.innerHTML = "Search";
		btn.onclick = new Delegate(this, this._btnClickEventHandler);
		
		this._directionsPanel = document.createElement("div");
		this._directionsPanel.style.height = "350px";
        this._directionsPanel.style.width = "395px";
		this._directionsPanel.style.overflow = "auto";
		this._directionsPanel.style.clear = "both";
		this._directionsPanel.style.float = "left";
		this._directionsPanel.innerHTML = "&nbsp;";
		
		this.clientArea.appendChild(container);
		container.appendChild(this._mapsCanvas);
		container.appendChild(controlsArea);
		controlsArea.appendChild(explain);
		controlsArea.appendChild(this._txtInput);
		controlsArea.appendChild(btn);
		container.appendChild(this._directionsPanel);
		document.getElementById("footer").style.zoom = "1";
	},
	
	_btnClickEventHandler: function(){
		this._mapsSearch();

	},
	
	_txtInputKeyPressEventHandler: function(e){
	/* werkt niet in ie, en voegt niks toe
		if(e.keyCode == "13"){
			this._mapsSearch();
		} */
	}, 
	
	initAfterRender : function() {
		if (GBrowserIsCompatible()) {
			var point = new GLatLng(52.08307,5.18339);
			this._map = new GMap2(this._mapsCanvas);
			this._map.setCenter(point, 10);
			this._map.addControl(new GSmallMapControl());
		    this._map.addOverlay(new GMarker(point));
		}
	},
	
	_mapsSearch: function() {
		this._directionsPanel.innerHTML = "";
		if(this._txtInput.value != ""){
			this._map = new GMap2(this._mapsCanvas);
			this._directions = new GDirections(this._map, this._directionsPanel);
			this._directions.load("from: " + this._txtInput.value + " to: Yalelaan 6, Utrecht, the Netherlands");
			this._map.setUIToDefault();
			GEvent.addListener(this._directions, "error", new Delegate(this, this._handleErrors));
		}
	},
	
	_handleErrors: function (){
		var message = "";
		switch (this._directions.getStatus().code) {
			case G_GEO_UNKNOWN_ADDRESS:
				message = "De locatie van het opgegeven vertrekadres kon niet worden bepaald. Foutcode: " + this._directions.getStatus().code;
				break;
			case G_GEO_SERVER_ERROR:
				message = "Er is iets misgegaan. Maar het is onduidelijk wat. Foutcode: " + this._directions.getStatus().code;
				break;
			case G_GEO_MISSING_QUERY:
				message = "Een parameter ontbreekt. Misschien was er geen vertrekpunt ingevoerd.n Foutcode: " + this._directions.getStatus().code;
				break;
			case G_GEO_BAD_KEY:
				message = "De Google Maps sleutel is ongeldig of de gebruikte sleutel is niet geldig voor dit domein. n Foutcode: " + this._directions.getStatus().code;
				break;
			case G_GEO_BAD_REQUEST:
				message = "De aanvraag voor het plannen van een route is mislukt.n Foutcode: " + gdir.getStatus().code;
				break;
			default:
				message = "Er is iets misgegaan. Maar het is onduidelijk wat de oorzaak is.";
		}
		this._directionsPanel.innerHTML = message;
	}
}

function Delegate(obj, method)
{   
    var orgArgs = [];
    
    for(var i=2; i < arguments.length; i++)
        orgArgs.push(arguments[i]);

    return function(){
        var args = [];
        
        for(var i=0; i < orgArgs.length; i++){
            args.push(orgArgs[i]);
		}
        
        for(var i=0; i < arguments.length; i++){
            args.push(arguments[i]);
		}

		return method.apply(obj, args);
    };
}
