﻿

// http://googlegeodevelopers.blogspot.com/2008/06/panoramio-api-markermanager-instant.html
// http://gmaps-samples.googlecode.com/svn/trunk/panoramio/pano_layer_enabled.html

// API Reference: http://code.google.com/apis/maps/documentation/reference.html#GMarker
// marker manager: http://gmaps-utility-library.googlecode.com/svn/trunk/markermanager/release/docs/reference.html

// custom icons for markers: http://groups.google.com/group/Google-Maps-API/web/examples-tutorials-custom-icons-for-markers

// example: http://gmaps-utility-library.googlecode.com/svn/trunk/markermanager/release/examples/google_northamerica_offices.html


function MapManager(map, opt_opts, markerClickFunction) {
	var me = this;
	me.map = map;
	me.ids = {};
	me.mgr = new MarkerManager(map, { maxZoom: 19 });

	var icon = new GIcon(G_DEFAULT_ICON);
	me.markerIcon = icon;
	me.enabled = false;
	me.serviceUrl = '';

	GEvent.addListener(map, "moveend", function() {
		if (me.enabled) {
			var bounds = map.getBounds();
			var southWest = bounds.getSouthWest();
			var northEast = bounds.getNorthEast();
			me.load(me, { maxy: northEast.lat(), miny: southWest.lat(), maxx: northEast.lng(), minx: southWest.lng() }, markerClickFunction);
			// me.load({ maxy: northEast.lat(), miny: southWest.lat(), maxx: northEast.lng(), minx: southWest.lng() });
		}
	});

/*
	GEvent.addListener(map, "click", markerClickFunction);
*/

}

MapManager.prototype.enable = function() {
	this.enabled = true;
	GEvent.trigger(this.map, "moveend");
}

MapManager.prototype.disable = function() {
	this.enabled = false;
	this.mgr.clearMarkers();
	this.ids = {};
}

MapManager.prototype.getEnabled = function() {
	return this.enabled;
}

MapManager.prototype.load = function(MapManager, userOptions) {
	var options = {
		minx: "-180",
		maxx: "180",
		miny: "-90",
		maxy: "90"
	};

	for (optionName in userOptions) {
		if (userOptions.hasOwnProperty(optionName)) {
			options[optionName] = userOptions[optionName];
		}
	}

	var url = MapManager.serviceUrl
	if (url.indexOf('?') < 0) {
		url += '?';
	}
	else {
		url += '&';
	}

	for (optionName in options) {
		if (options.hasOwnProperty(optionName)) {
			var optionVal = "" + options[optionName] + "";
			url += optionName + "=" + optionVal + "&";
		}
	}

	// get the JSON
	$.getJSON(url, { rnd: Math.random }, function(data) {
		MapManagerCallback(data, MapManager);
	});

}

function MapManagerCallback(json, MapManager) {
	for (var i = 0; i < json.markers.length; i++) {
		var m = json.markers[i];
		if (!MapManager.ids[m.addressId]) {
			var markerIcon = new GIcon(MapManager.markerIcon);
			var marker = new GMarker(new GLatLng(m.latitude, m.longitude), { icon: markerIcon }); // , title: m.addressId // if you need the m.addressId - the only thing we can put it in seems to be the title.
			
			var html = m.title + '<br />';
			html += (m.address1 == '') ? '' : m.address1 + '<br />';
			html += (m.address2 == '') ? '' : m.address2 + '<br />';
			html += (m.address3 == '') ? '' : m.address3 + '<br />';
			html += (m.addressCity == '') ? '' : m.addressCity + '<br />';
			
			marker.bindInfoWindowHtml(html);
			
			// marker click event is taken care of at a map level (where it passes the marker to the click function)
			MapManager.mgr.addMarker(marker, 0); // second param is min zoom level
			MapManager.ids[m.addressId] = "exists";
		}
	}
}
