var tooltip;
var markers = [];
var layerset = [];
var routes = [];


function CreateCluster() {
	clusterer = new Clusterer(map);		
	// set the clusterer parameters if you dont like the defaults
	clusterer.icon = clusterIcon;      
	clusterer.maxVisibleMarkers = 8;
	clusterer.gridSize = .5;
	clusterer.minMarkersPerClusterer = 2;
	clusterer.maxLinesPerInfoBox = 10;
}


///// Create Marker
function CreateMarker(id, point, myzoom, type, name, iconname, content) {
	var marker = new GMarker(point,{icon:allicons[iconname]});
	marker.title = name;
	marker.type=type;
	var myurl='view.php?action=point&id='+id;
    GEvent.addListener(marker, "click", function() {
		map.setZoom(parseFloat(myzoom));
		map.panTo(point);
		tooltip.innerHTML = '';
		tooltip.style.className = 'hide';
		
		showPoint(id);
		var maxContentDiv = document.createElement('div');
        maxContentDiv.innerHTML = 'Loading Content, Please Wait...';
		marker.openInfoWindowHtml(content, {maxContent: maxContentDiv});	
		
        var iw = map.getInfoWindow();
        GEvent.addListener(iw, "maximizeclick", function() {
            GDownloadUrl(myurl, function(data) {
            	maxContentDiv.innerHTML = data;
            	}); 
		});
		GEvent.addListener(iw, "closeclick", function() {
    		map.panTo(point);		  
    	});
		
    });
	GEvent.addListener(marker, "mouseover", function() {
    	Label(marker);		  
    });
	GEvent.addListener(marker, "mouseout", function() {
		tooltip.innerHTML = '';
		tooltip.style.className = 'hide';
	});

	markers[id] = marker;
	map.addOverlay(marker);
	// create clusterer object
   // clusterer.AddMarker(marker,title);
}

///// Create Route Marker
function CreateRouteMarker(id, point, myzoom, name, iconname, content) {
	var marker = new GMarker(point,{icon:allicons[iconname]});
	marker.title = name;
	marker.id = 'r'+id;
	
    GEvent.addListener(marker, "click", function() {
		map.setZoom(parseFloat(myzoom));
		map.panTo(point);
		tooltip.innerHTML = '';
		tooltip.style.className = 'hide';
		HideAllMenus();
		showRoute(id);
		marker.openInfoWindowHtml(content);	
		
        var iw = map.getInfoWindow();
        GEvent.addListener(iw, "closeclick", function() {
    		map.panTo(point);		  
    	});
		///show/hide routes
		
    });
	GEvent.addListener(marker, "mouseover", function() {
    	Label(marker);		  
    });
	GEvent.addListener(marker, "mouseout", function() {
		tooltip.innerHTML = '';
		tooltip.style.className = 'hide';
	});

	markers[marker.id] = marker;
	map.addOverlay(marker);
}


//// Label Marker
function Label(marker) {
	var point=map.getCurrentMapType().getProjection().fromLatLngToPixel(map.getBounds().getSouthWest(),map.getZoom());
	var offset=map.getCurrentMapType().getProjection().fromLatLngToPixel(marker.getPoint(),map.getZoom());
	var anchor=marker.getIcon().iconAnchor;
	var h=marker.getIcon().iconSize.height;
	
	tooltip.innerHTML = '<div class="LabelTitle">'+marker.title+'</div>';
	var height=tooltip.clientHeight;
	var w=tooltip.clientWidth;
	var pos = new GControlPosition(G_ANCHOR_BOTTOM_LEFT, new GSize(offset.x - point.x - (w/2),- offset.y + point.y + anchor.y + (height/2))); 
	pos.apply(tooltip);	
}

/// Trigger a point click
function PointClick(id) {
	GEvent.trigger(markers[id], "click");
	HideAllMenus();
}

 // Maximize
function ReadMore() {
	map.getInfoWindow().maximize();
}

//// Show Subpoints
function showPoint(type) {
	for (var id in markers) {
	  if (markers[id].type == type) {
	    markers[id].show();
	  	}
	}
}

//// Hide Subpoints
function hidePoint(type) {
	for (var id in markers) {
	  if (markers[id].type == type) {
	    markers[id].hide();
	  	}
	}
	map.closeInfoWindow();
}

//// Show Routes
function showRoute(myid) {
	for (var id in routes) {
	  if (routes[myid].id == myid) {
	   routes[myid].show();
	  	}
	}
}

//// Hide Routes
function hideRoute(myid) {
	for (var id in markers) {
	  if (routes[myid].id == myid) {
	    routes[myid].hide();
	  	}
	}
	map.closeInfoWindow();
}

function WMS(myid, layers, styles, format, url) {
	HideAllMenus();
	var tile= new GTileLayer(new GCopyrightCollection(""),1,17);
        tile.myLayers=layers;
		tile.myStyles=styles;
		tile.myFormat=format;
        tile.myBaseURL=url;
        tile.getTileUrl=CustomGetTileUrl;
	var wms=new GTileLayerOverlay(tile);
		wms.id=myid;
	layerset[myid] = wms;
	map.addOverlay(wms);
}

//// Overlay Custom Map	
function IMAGE(myid, format, url) {
	HideAllMenus();
	var tile= new GTileLayer(new GCopyrightCollection(""),1,16);
       	tile.isPng = function() {return true;};
        tile.getTileUrl=getTileUrl = function (a,b) { 
			return  url + TileToQuadKey(a.x,a.y,b) + format; 
			};
	var imagelayer=new GTileLayerOverlay(tile);
		imagelayer.id=myid;
	layerset[myid] = imagelayer;
	map.addOverlay(imagelayer);
}

/// Create a GeoRSS  
function GeoRSS(myid, url) {
	HideAllMenus();
	var gx = new GGeoXml(url);
		gx.id=myid;
	layerset[myid] = gx;
	map.addOverlay(gx);	
} 


 // zoom mit scrollrad
function setScrollZoom(delta) {
	if(delta<0){ map.zoomIn(); }
   	else { map.zoomOut(); }
}


//// Display Link
function LinkMe(linktype, linkid) {
	HideAllMenus();
	var mapwidth=parseInt(document.getElementById("map").style.width);
	var mapminus = (mapwidth-450);
	var x= (mapminus/2);
	var pos = new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(x,20));
    pos.apply(document.getElementById('Linker'));
    map.getContainer().appendChild(document.getElementById('Linker'));
	if (linktype != 'map') {
		document.getElementById('linkerurl').value=document.getElementById('linkerbaseurl').value+'&linktype='+linktype+'&linkid='+linkid;
		}
	CSS('Linker', 'Linker');	
} 

function TileToQuadKey ( x, y, zoom){
    var quad = "";
    for (var i = zoom; i > 0; i--){
        var mask = 1 << (i - 1);
        var cell = 0;
        if ((x & mask) != 0)
            cell++;
        if ((y & mask) != 0)
            cell += 2;
        quad += cell;
    }
    return quad;
}
