/* 
 * Copyright Pauls Barkans - http://pbs.lv/ , http://www.paulsbarkans.lv/
 * 
 * Usage:
 * var map = new gmap('map'); //div ID
 * map.load();
 * map.set_center(56.946538, 24.104850, 13); //x, y and zoom
 * marker = map.create_marker(56.946538, 24.104850);
 * marker.enableDragging(); //to make draggable
 * a = map.draw_radius(2, 'km');
 * remove_radius(a);
 *
 * To debug map, load gmap wth second parameter 'true', example:
 * var map = new gmap('map', true);
 * This will put debug info in `map_debug` html element (ust be created).
 * To change this ID, change `this.debug_div = 'map_debug';` to something else.
 */


function gmap(div_element, debug)
{	

	/*
	if(window.location.host!='localhost')
	{
		return;
	}
	*/
	
	this.div_element = div_element;
	if(debug) {
		this.debug = true;
		this.debug_div = 'map_debug';
		document.getElementById('map_debug').innerHTML = '<strong>Debug:</strong>';
	}
	
	this.load = function()
	{
		if (GBrowserIsCompatible()) 
		{
	        this.map = new GMap2(document.getElementById(this.div_element));     
	        
	        //For DEBUG
	        if(this.debug) {
	        	map = this.map;
	        	debug_div = this.debug_div;
	        	
	        	GEvent.addListener(this.map, "click", function(overlay, latlng) {
					document.getElementById(debug_div).innerHTML = document.getElementById(debug_div).innerHTML + '<br />clicked: ' + latlng.toString();
				});
				
				GEvent.addListener(this.map, "moveend", function(overlay, latlng) {
					var center = map.getCenter();
					document.getElementById(debug_div).innerHTML = document.getElementById(debug_div).innerHTML + '<br />map moved. center: ' + center.toString();
				});
				
				GEvent.addListener(this.map, "zoomend", function(oldLevel, newLevel) {
					if(oldLevel) {
						document.getElementById(debug_div).innerHTML = document.getElementById(debug_div).innerHTML + '<br />map zoomed. old level: ' + oldLevel.toString() + ', new level: ' + newLevel.toString();
					}
				});
	        }
	        //end for debug.
	        
	        this.geocoder = new GClientGeocoder();
	        this.map.addControl(new GLargeMapControl());
	
	        var mapControl = new GMapTypeControl();
	        this.map.addControl(mapControl);
	    }
	}
	
	
	this.set_center = function(gps_x, gps_y, zoom_level)
	{
		var zoom_level = typeof(zoom_level) != 'undefined' ? zoom_level : 11;
		this.map.setCenter(new GLatLng(gps_x, gps_y), parseInt(zoom_level));
		
		if(this.debug) {
			var center = this.map.getCenter();
			document.getElementById(this.debug_div).innerHTML = document.getElementById(this.debug_div).innerHTML + '<br />setting map center: '+ center.toString();
		}
	}
	
	
	this.create_marker = function(gps_x, gps_y)
	{
		var point = new GLatLng(gps_x, gps_y);
		var marker = new GMarker(point, {draggable:true});
		marker.disableDragging(); // if draggable would not be true then enableDragging woudln't work. Default disabled by script.
	    this.map.addOverlay(marker);
		return marker;
	}
	
	
	this.add_marker_html = function(marker, html)
	{
		GEvent.addListener(marker, "click", function() {
	        marker.openInfoWindowHtml(html);
	    });
	}
	
	
	this.remove_radius = function(ob)
	{
		this.map.removeOverlay(ob.circle_marker);
		this.map.removeOverlay(ob.circle);
	}
	
	this.draw_radius = function(circle_radius, circle_units) {
		/*
		if(typeof(this.circle_marker)!='undefined')
		{
			this.map.removeOverlay(this.circle_marker);
			this.map.removeOverlay(this.circle);
		}
		*/
		
		var circle_marker = new GMarker(this.map.getCenter(),{draggable:true});
		this.circle_marker = circle_marker; //lai tiktu klāt no remove_radius() metodes.
		
		GEvent.bind(circle_marker, 'dragend', this, function() {
			this.map.removeOverlay(circle_marker);
			this.map.removeOverlay(circle);
			this.map.setCenter(circle_marker.getLatLng()); 
			this.draw_radius(circle_radius, circle_units)
		});
		
		this.map.addOverlay(circle_marker);
		
		var center = this.map.getCenter();
		var bounds = new GLatLngBounds();		
		var circle_points = Array();

		with (Math) {
			if (circle_units == 'km') 
			{
				var d = circle_radius/6378.8;	// radians
			}
			else 
			{ //miles
				var d = circle_radius/3963.189;	// radians
			}
	
			var lat1 = (PI/180)* center.lat(); // radians
			var lng1 = (PI/180)* center.lng(); // radians
	
			for (var a = 0 ; a < 361 ; a++ ) {
				var tc = (PI/180)*a;
				var y = asin(sin(lat1)*cos(d)+cos(lat1)*sin(d)*cos(tc));
				var dlng = atan2(sin(tc)*sin(d)*cos(lat1),cos(d)-sin(lat1)*sin(y));
				var x = ((lng1-dlng+PI) % (2*PI)) - PI ; // MOD function
				var point = new GLatLng(parseFloat(y*(180/PI)),parseFloat(x*(180/PI)));
				circle_points.push(point);
				bounds.extend(point);
			}
	
			if (d < 1.5678565720686044) 
			{
				var circle = new GPolygon(circle_points, '#000000', 2, 1, '#000000', 0.25);	
			}
			else 
			{
				var circle = new GPolygon(circle_points, '#000000', 2, 1);	
			}
			this.circle = circle;
			
			this.map.addOverlay(circle); 
			this.map.setZoom(this.map.getBoundsZoomLevel(bounds)-1);
			return this;
		}
	}
	
	
	/* 
	 * Nestrādā dēļ pieprasījuma gaidīšanas no servera, 
	 * bet JS iziet viss cauri un nesagaida.
	 */
	this.search_by_geocode = function(geocode_query, callback) {
		if (typeof(callback) != 'undefined') {
			return 'kkk';
		}
		else {
			//alert(callback);
			//this.geocode_query = geocode_query;
			//this.geocoder.getLocations(this.geocode_query, aaa);
			$.getJSON("geo.php", function(json){
			//this.a = json;
			//this.abc();
			
			});
			this.search_by_geocode(geocode_query, 'a');
		}
	}
	
	
	/*
	* Place marker where map is clicked. 
	* If second param is true then ONLY one marker will be on the map.
	* ATTENTION. Function is not finished (was custom modified).
	*/
	this.createClickMarker = function(onlyOne) {
		var map = this.map;
		
		GEvent.addListener(this.map, "click", function(overlay, latlng) {
			if(map.marker) {
				document.apartment_form.lat.value = '';
				document.apartment_form.lng.value = '';
				map.removeOverlay(map.marker);
			}
			var marker = new GMarker(latlng, {draggable:true});
		    map.addOverlay(marker);
		    
		    GEvent.addListener(marker, "dragend", function() {
	        	if(marker) {
	        		document.apartment_form.lat.value = marker.getLatLng().lat();
	        		document.apartment_form.lng.value = marker.getLatLng().lng();
		    	}
	    	});
		    
		    map.marker = marker; // so hat it can be accessed later.
		    document.apartment_form.lat.value = marker.getLatLng().lat();
	        document.apartment_form.lng.value = marker.getLatLng().lng();
		});
	}
	
}

