/*********************************************
*
*	mapsGrid Class v1
*	created: 25/07/2008
*	modified: 22/10/2008
*
*********************************************/

/*
* GLOBALS
*/

var g_GMapObj 	= false;
var g_GMapDiv 	= false;
var g_Obj 	= false;

var g_hdlZS 	= false;
var g_hdlMS 	= false;
var g_hdlME 	= false;
var g_hdlDMS	= false;


var GCB_POINTCLICK 		= 0xFF01;
var GCB_POINTMOUSEOVER 		= 0xFF02;
var GCB_POINTMOUSEOUT		= 0xFF03;
var GCB_CLUSTERCLICK 		= 0xFF04;
var GCB_CLUSTERMOUSEOVER 	= 0xFF05;
var GCB_CLUSTERMOUSEOUT		= 0xFF06;

var GIC_POINT 			= 0xFE01;
var GIC_POINTMOUSEOVER 		= 0xFE02;
var GIC_CLUSTER 		= 0xFE03;
var GIC_CLUSTERMOUSEOVER	= 0xFE04;


/*
* FUNCTIONS
*/

function mapsGrid (GMapObj, gridKey) {

	g_Obj			= this;
	g_GMapObj		= GMapObj;
	g_GMapDiv		= GMapObj.getContainer();

	this.smap_url		= '/bin/smap';
	this.err_code		= 0;
	this.err_msg		= "";
	this.mapsPoints 	= new Array();
	this.a_gridCallbacks	= new Array();
	this.a_gridIcons	= new Array();

	this.gfe = function (event) {

		if (event.stopPropagation)
			event.stopPropagation();
		else if (window.event) {

			event = window.event;
			event.cancelBubble = true;

		}

		return false;

	};

	this.E_DEBUG		= false;
	this.E_SDC		= false;

}


mapsGrid.prototype.setIcon = function (type, icon) {

	if (type == GIC_POINT
	    || type == GIC_CLUSTER
	    || type == GIC_POINTMOUSEOVER
	    || type == GIC_CLUSTERMOUSEOVER)
		this.a_gridIcons[type] = icon;
	else
		this.a_gridIcons[type] = NULL;

}


mapsGrid.prototype.setCallback = function (type, cb_func) {

	if (type == GCB_POINTCLICK
	    || type == GCB_POINTMOUSEOVER
	    || type == GCB_POINTMOUSEOUT
	    || type == GCB_CLUSTERCLICK
	    || type == GCB_CLUSTERMOUSEOVER
	    || type == GCB_CLUSTERMOUSEOUT)
		this.a_gridCallbacks[type] = cb_func;
	else
		this.a_gridCallbacks[type] = NULL;

}


mapsGrid.prototype.mapsErr = function (err_code) {
	
	this.err_code = err_code;

	if (err_code == 1000)
		this.err_msg = "GMap Object could not be found!";
	else if (err_code == 1001)
		this.err_msg = "Can't load Container!";

	return -1;

}


mapsGrid.prototype.mapsLoadUrl = function (url, pfunc) {

	var mapsScript		= document.createElement('script');

	mapsScript.type		= 'text/javascript';
	mapsScript.onload	= pfunc;
	mapsScript.src		= url;

	mapsScript.setAttribute('id', 'miScript');

	document.getElementsByTagName('head')[0].appendChild(mapsScript);

}


mapsGrid.prototype.renderGrid = function (gridpoints) {

	g_GMapObj.clearOverlays();

	this.mapsPoints 	= gridpoints;

	var bounds 		= g_GMapObj.getBounds();
	var offset 		= (90.0 / Math.pow(2.0, g_GMapObj.getZoom()))/2;
	
	var bSWlat 		= bounds.getSouthWest().lat()-offset;
	var bNElat 		= bounds.getNorthEast().lat()+offset;
	var bSWlng 		= bounds.getSouthWest().lng()-offset;
	var bNElng 		= bounds.getNorthEast().lng()+(2*offset);

	for (k in this.mapsPoints) {

		if (this.mapsPoints[k].lt && ((this.mapsPoints[k].lt > bSWlat && this.mapsPoints[k].lt < bNElat) && (this.mapsPoints[k].lg > bSWlng && this.mapsPoints[k].lg < bNElng))) {

			var marker;
			var latlng = new GLatLng(this.mapsPoints[k].lt, this.mapsPoints[k].lg);

			if(this.mapsPoints[k].t == 1)
				marker = this.addGridOverlay(latlng, 1, k);
			else if(this.mapsPoints[k].t == 2)
				marker = this.addGridOverlay(latlng, 2, k);

			g_GMapObj.addOverlay(marker);

		}

	}

	if (this.E_DEBUG)
		document.getElementById('spruntime').innerHTML = '<center><b>Exec: ' + this.mapsPoints[this.mapsPoints.length-2].xx + '</b></center>';

	document.getElementsByTagName('head')[0].removeChild(document.getElementById('miScript'));

	if(g_GMapDiv.addEventListener)
		g_GMapDiv.removeEventListener('mouseover', this.gfe, true);
	else
		g_GMapDiv.detachEvent('onmouseover', this.gfe);

}


mapsGrid.prototype.gridEventMove = function () {

	var bounds 	= g_GMapObj.getBounds();
	var proj 	= g_GMapObj.getCurrentMapType().getProjection();
	var zoom 	= g_GMapObj.getZoom();
	
	var pt 		= proj.fromLatLngToPixel(new GLatLng(bounds.getNorthEast().lat(), bounds.getNorthEast().lng()), zoom);
	var pt2 	= proj.fromLatLngToPixel(new GLatLng(bounds.getSouthWest().lat(), bounds.getSouthWest().lng()), zoom);
	var pt4 	= proj.fromPixelToLatLng(new GPoint(Math.floor(pt2.x/256)*256, Math.floor(pt2.y/256)*256), zoom);

	var url		= this.smap_url + '?slg=' + pt4.lng() + '&z=' + zoom + '&pty=' + (Math.floor(pt.y/256)*256) + '&h=' + g_GMapObj.getSize().height + '&w=' + g_GMapObj.getSize().width + '&os=' + Math.random()*100000000;
//	alert(url);

	this.mapsLoadUrl(url, function () {});

}


mapsGrid.prototype.enableDebug = function () {

	this.E_DEBUG 		= true;

	var s			= document.createElement('span');
	s.setAttribute('id', 'spruntime');
	s.innerHTML 		= "<center><b>Exec: 0</b></center>";
	s.style.display 	= "block";
	s.style.padding		= "3px 3px";
	s.style.position 	= "absolute";
	s.style.fontSize	= "10px";
	s.style.fontFamily	= "Verdana";
	s.style.top  		= "30px";
	s.style.right 		= "7px";
	s.style.lineHeight	= "7px";
	s.style.width 		= "150px";
	s.style.backgroundColor = "#FFFFFF";
	s.style.height 		= "10px";
	s.style.border 		= '1px #000000 solid';
	s.style.opacity 	= 0.80;
	s.style.filter		= 'alpha(opacity = 80)'; // IE

	g_GMapDiv.appendChild(s);

}


mapsGrid.prototype.disableDebug = function () {

	this.E_DEBUG = false;
	g_GMapDiv.removeChild(document.getElementById('spruntime'));

}


mapsGrid.prototype.enableSpansDataCount = function () {

	this.E_SDC = true;

}


mapsGrid.prototype.disableSpansDataCount = function () {

	this.E_SDC = false;

}


mapsGrid.prototype.enableGridRendering = function () {

	if(!g_GMapObj.isLoaded())
		return this.mapsErr(1000);

	if(!g_GMapDiv)
		return this.mapsErr(1001);

	g_hdlDMS = GEvent.addDomListener(g_GMapDiv, "DOMMouseScroll", function(m) {

		if (!m)
			m = window.event;

		if (m.preventDefault)
			m.preventDefault()

		m.returnValue = false;

	});

	g_hdlZS = GEvent.addListener(g_GMapObj, "zoomstart", function () {

		if(g_GMapDiv.addEventListener)
			g_GMapDiv.addEventListener('mouseover', g_Obj.gfe, true);
		else
			g_GMapDiv.attachEvent('onmouseover', g_Obj.gfe);

		if (g_Obj.E_SDC)
			g_Obj.releaseSpansDataCount();

	});

	g_hdlMS = GEvent.addListener(g_GMapObj, "movestart", function () {

		if(g_GMapDiv.addEventListener)
			g_GMapDiv.addEventListener('mouseover', g_Obj.gfe, true);
		else
			g_GMapDiv.attachEvent('onmouseover', g_Obj.gfe);

		if (g_Obj.E_SDC)
			g_Obj.releaseSpansDataCount();

	});

	g_hdlME = GEvent.addListener(g_GMapObj, "moveend", function () {

		if (g_Obj.E_SDC)
			g_Obj.releaseSpansDataCount();

		g_Obj.gridEventMove();

	});


	this.gridEventMove();

}


mapsGrid.prototype.disableGridRendering = function () {

	GEvent.removeListener(g_hdlZS);
	GEvent.removeListener(g_hdlMS);
	GEvent.removeListener(g_hdlME);
	GEvent.removeListener(g_hdlDMS);

	g_GMapObj.clearOverlays();

}


mapsGrid.prototype.addSpanDataCount = function (point, k) {

	var bounds 	= g_GMapObj.getBounds();
	var z		= g_GMapObj.getZoom();

	if((this.mapsPoints[k].lt > bounds.getSouthWest().lat() && this.mapsPoints[k].lt < bounds.getNorthEast().lat()) && (this.mapsPoints[k].lg > bounds.getSouthWest().lng() && this.mapsPoints[k].lg < bounds.getNorthEast().lng())) {

		var proj		= map.getCurrentMapType().getProjection();
		var ttPos 		= g_GMapObj.fromLatLngToContainerPixel(new GLatLng(this.mapsPoints[k].lt, this.mapsPoints[k].lg), map.getZoom());

		if ((ttPos.x >= 25 && ttPos.x <= (g_GMapObj.getSize().width-25)) && (ttPos.y <= g_GMapObj.getSize().height-30)) {

			var s			= document.createElement('span');
			s.setAttribute('id', 'gym_sdc' + k);

			s.innerHTML 		= this.mapsPoints[k].i + " Routen";
			s.style.display 	= "block";
			s.style.position 	= "absolute";
			s.style.textAlign	= "center";
			s.style.margin		= "0px 0px 0px 0px";
			s.style.color		= "black";
			s.style.fontFamily	= "Arial";
			s.style.fontSize	= "9px";
			s.style.top  		= ((ttPos.y) +18) + "px";
			s.style.left 		= ((ttPos.x) -32) + "px";
			s.style.width		= "64px";
			s.style.height		= "12px";

			g_GMapDiv.appendChild(s);

		}

	}

}


mapsGrid.prototype.removeSpanDataCount = function (x) {

	var gym_sdc = document.getElementById('gym_sdc' + x);

	if (gym_sdc)
		g_GMapDiv.removeChild(gym_sdc);

}


mapsGrid.prototype.addGridOverlay = function (point, type, k) {

	var marker;

	if(type == 1) {

		marker = new GMarker(point, this.a_gridIcons[GIC_CLUSTER]);

		if (this.E_SDC)
			this.addSpanDataCount(point, k);

		GEvent.addListener(marker, "mouseover", function() {

			if (g_Obj.a_gridIcons[GIC_CLUSTERMOUSEOVER])
				marker.setImage(g_Obj.a_gridIcons[GIC_CLUSTERMOUSEOVER].image);

			if (g_Obj.a_gridCallbacks[GCB_CLUSTERMOUSEOVER])
				g_Obj.a_gridCallbacks[GCB_CLUSTERMOUSEOVER](g_Obj.mapsPoints[k].lt, g_Obj.mapsPoints[k].lg, marker);

		});

		GEvent.addListener(marker, "mouseout", function() {

			marker.setImage(g_Obj.a_gridIcons[GIC_CLUSTER].image);

			if (g_Obj.a_gridCallbacks[GCB_CLUSTERMOUSEOUT])
				g_Obj.a_gridCallbacks[GCB_CLUSTERMOUSEOUT](g_Obj.mapsPoints[k].lt, g_Obj.mapsPoints[k].lg, marker);

		});

		GEvent.addListener(marker, "click", function() {

			g_GMapObj.setCenter(new GLatLng(point.lat(), point.lng()), g_GMapObj.getZoom()+3); 

			if (g_Obj.a_gridCallbacks[GCB_CLUSTERCLICK])
				g_Obj.a_gridCallbacks[GCB_CLUSTERCLICK](g_Obj.mapsPoints[k].lt, g_Obj.mapsPoints[k].lg, marker);

		});

	} else if (type == 2) {

		marker = new GMarker(point, this.a_gridIcons[GIC_POINT]);

		GEvent.addListener(marker, "mouseover", function() {

			if (g_Obj.a_gridIcons[GIC_POINTMOUSEOVER])
				marker.setImage(g_Obj.a_gridIcons[GIC_POINTMOUSEOVER].image);

			if (g_Obj.a_gridCallbacks[GCB_POINTMOUSEOVER])
				g_Obj.a_gridCallbacks[GCB_POINTMOUSEOVER](g_Obj.mapsPoints[k].ti, marker);

		});

		GEvent.addListener(marker, "mouseout", function() {

			marker.setImage(g_Obj.a_gridIcons[GIC_POINT].image);

			if (g_Obj.a_gridCallbacks[GCB_POINTMOUSEOUT])
				g_Obj.a_gridCallbacks[GCB_POINTMOUSEOUT](g_Obj.mapsPoints[k].ti, marker);

		});

		GEvent.addListener(marker, "click", function() {

			if (g_Obj.a_gridCallbacks[GCB_POINTCLICK])
				g_Obj.a_gridCallbacks[GCB_POINTCLICK](g_Obj.mapsPoints[k].ti, marker);

		});

	}

	return marker;

}


mapsGrid.prototype.releaseSpansDataCount = function (point, type, k) {

	if (this.E_SDC) {

		for(k in this.mapsPoints) {

			if (this.mapsPoints[k].t == 1)
				this.removeSpanDataCount(k);

		}

	}

}



