var map,gtlayer,gtoverlayer;
var glayerdata;
var mouseon = false;

function init(elDiv) {
	// should not happen
	if (!initMap(elDiv)) return;
	createLayer();
}

function initMap(elDiv) {
	if (!GBrowserIsCompatible()) return false;
	
	map = new GMap2(elDiv, {draggableCursor: 'default', draggingCursor: 'crosshair'});
	map.setCenter(new GLatLng(0, 0), 0);
	
	map.enableScrollWheelZoom();
	map.addControl(new GLargeMapControl());
	
	GEvent.addListener(map, "mousemove", function(latlng, overlay) {
		if (overlay) return;
		if (!latlng) return;
		if (!glayerdata) return;

		var zoom = map.getZoom();
		if (!glayerdata[zoom]) return;

		var zdata = glayerdata[zoom];
		var lat = latlng.lat();
		var lng = latlng.lng();
		var found = false;
		for (var i=0; i<zdata.length; ++i) {
			//GLog.write(zdata[i].bounds+" contain "+latlng);
			if (zdata[i].bounds.containsLatLng(latlng)) {
				found = true;
				if (!mouseon) {
					GLog.write(zdata[i].tooltip);
					mouseon = true;
					map.getDragObject().setDraggableCursor("pointer");
				}
				break;
			}
		}
		if (!found) {
			map.getDragObject().setDraggableCursor("default");
			mouseon = false;
		}
	});

	return true;
}

function createLayer() {
	gtlayer = new GTileLayer(new GCopyrightCollection("qfox.nl"),0,17);
	gtlayer.minResolution = function() { return 0; }
	gtlayer.maxResolution = function() { return 17; }
	gtlayer.getTileUrl = function(gpoint,zoom) {
		sendJSON("getjson.php?x="+gpoint.x+"&y="+gpoint.y+"&z="+zoom); // will execute dynamic script and load coordinate data into array
		var s = "gettile.php?x="+gpoint.x+"&y="+gpoint.y+"&z="+zoom;
		//GLog.write(s);
		return s;
	}
  gtlayer.isPng = function() { return true; }
	gtlayer.getOpacity = function() { return 1; }
	gtlayer.getCopyright = function(bounds,zoom) { return {prefix:"qfox.nl", copyrightTexts:["qfox.nl"]}; }

	gtoverlayer = new GTileLayerOverlay(gtlayer);
	map.addOverlay(gtoverlayer);
	gtoverlayer.show();
}

/**
 * data is an object literal:
 * { lat, lng, id, tooltip }
 */
function jsonCallback(zoom, x, y, data) {
	//GLog.write("callback for "+x+","+y+" @ "+zoom);
	if (!glayerdata) glayerdata = [];
	if (!glayerdata[zoom]) glayerdata[zoom] = [];
	var zdata = glayerdata[zoom];

	// we'll need this to compute latlang to pixels and back	
	var proj = map.getCurrentMapType().getProjection();

	for (var i=0; i<data.length; ++i) {
		if (data[i]) {
			var found = false;
			// search for the id
			// todo: change to binary search
			for (var j=0; j<zdata.length; ++j) {
				if (zdata[j].id == data[i].id) {
					found = true;
					break;
				}
			}
			if (!found) { // if found, we dont need to add this point again (unless in your application, the same point moves around... but then tiling is not a solution for you anyways)
				// now the bounds of this point are different from the latlng
				// they are, currently, 2px around the latlng. you can find
				// the specific bounds in the gettile.php in drawMarkers()
				var pnt = proj.fromLatLngToPixel(new GLatLng(data[i].lat, data[i].lng), zoom);
				data[i].bounds = 
					new GLatLngBounds(
						proj.fromPixelToLatLng(new GPoint(pnt.x-2, pnt.y+2), zoom), 
						proj.fromPixelToLatLng(new GPoint(pnt.x+2, pnt.y-2), zoom)
					);
				// now that we have the bounds, save it and move on :)
				zdata.push(data[i]);
			}
		}
	}
}