var currentCluster;
var triggerClickCallback;

/**************************************************************************
New Class: SpideredStrategy
 ***************************************************************************/
function SpideredStrategy() {
	this.spiderMarker = new SpiderMarker();
}

SpideredStrategy.prototype.addRoute = function addRoute(marker) {
	var newSpiderMarker = this.spiderMarker.newSpideredMarker(marker);
	map.addOverlay(newSpiderMarker);
	this.spiderMarker.addSpiderMarker(newSpiderMarker);
	return newSpiderMarker;
};

SpideredStrategy.prototype.addPOI = function addPOI(marker) {
	return this.addRoute(marker);
};

SpideredStrategy.prototype.reset = function reset(marker) {
	//do noting
};

SpideredStrategy.prototype.show = function show() {
	//do nothing
};

SpideredStrategy.prototype.refresh = function refresh(force) {
	//do nothing
};

SpideredStrategy.prototype.clear = function refresh(force) {
	this.spiderMarker.removeMarkers();
};

/**************************************************************************
 New Class: ClusteredStrategy
 ***************************************************************************/
function ClusteredStrategy() {
	this.routeClusterMarkers = [];
//	this.poiClusterMarkers = [];
	this.routeCluster = new ClusterMarker(map, { clusterMarkerIcon:createClusterIcon(), clusterMarkerTitle: i8nMessages[CLUSTER_ICON_TITLE], clusterMarkerClick:this.myClusterClick }); 
//	this.poiCluster = new ClusterMarker(map, { clusterMarkerTitle:'Klicken Sie um mehr Information zu erhalten', clusterMarkerClick:this.myClusterClick });
}

ClusteredStrategy.prototype.addRoute = function addRoute(marker) {
	this.routeClusterMarkers.push(marker);
	return marker;
};

ClusteredStrategy.prototype.addPOI = function addPOI(marker) {
	//POI's are not clustered
	map.addOverlay(marker);
	return marker;
//	return this.addRoute(marker);
//	this.poiClusterMarkers.push(marker);
//	return marker;
};

ClusteredStrategy.prototype.reset = function reset(marker) {
	this.routeClusterMarkers = new Array();
//	this.poiClusterMarkers = new Array();
};

ClusteredStrategy.prototype.show = function show() {
	if (this.routeClusterMarkers.length > 0) {
		this.routeCluster.addMarkers(this.routeClusterMarkers);
	}
//	if (this.poiClusterMarkers.length > 0) {
//		this.poiCluster.addMarkers(this.poiClusterMarkers);
//	}
};

ClusteredStrategy.prototype.refresh = function refresh(force) {
	this.routeCluster.refresh(force);
//	this.poiCluster.refresh(force);
};

ClusteredStrategy.prototype.clear = function refresh(force) {
	this.reset();
	this.routeCluster.removeMarkers();
//	this.poiCluster.removeMarkers();
};

ClusteredStrategy.prototype.myClusterClick = function myClusterClick(args) {
	triggerClickCallback = GEvent.callback(this, ClusterMarker.prototype.triggerClick);
	currentCluster = args.clusterMarker;
	args.clusterMarker.defaultClickAction=function(){
		var oldZoom = map.getZoom();
		map.setCenter(args.clusterMarker.getLatLng(), map.getBoundsZoomLevel(args.clusterMarker.clusterGroupBounds))
		zoomEndEnabled = true;
		GEvent.trigger(map, "zoomend", oldZoom, map.getZoom());
		zoomEndEnabled = false;
		map.clearOverlays();
		overlappingMarkerStrategy.clear();
		//repaint clustered markers with current strategy
		for (i=0; i<args.clusteredMarkers.length; i++) {
			overlappingMarkerStrategy.addRoute(args.clusteredMarkers[i]);
		}
		overlappingMarkerStrategy.show();
		delete args.clusterMarker.defaultClickAction;
	}
	var html='<div style="height:120px; overflow:auto; width:260px; margin-bottom: 5px;">';
	html += '<table>';
	for (i=0; i<args.clusteredMarkers.length; i++) {
		html += '<tr>';
		html += '<td><img src="' + args.clusteredMarkers[i].iconLink + '" /></td>';
		html += '<td><a href="javascript:void(0)" onclick="triggerClickCallback('+args.clusteredMarkers[i].index+')">'+args.clusteredMarkers[i].getTitle()+'</a></td>';
		html += '</tr>';
	}
	html += '</table>';
	html+='</div><a href="javascript:void(0)" onclick="currentCluster.defaultClickAction()">Zoom</a>';
	map.openInfoWindowHtml(args.clusterMarker.getLatLng(), html);
};


function createClusterIcon() {
	var iconFlags = new GIcon(G_DEFAULT_ICON, '../../img/flags_blue.png');
	iconFlags.shadow = '../../img/flags_shadow.png';
	return iconFlags;
}

ClusterMarker.prototype.triggerClick = function ($index) {
	var $marker=this._mapMarkers[$index];
	if($marker._isVisible){
		//	$marker is visible
		GEvent.trigger($marker, 'mouseover');
		GEvent.trigger($marker, 'click');
		this.refresh(true);
	}
	else if($marker._isActive){
		//	$marker is clustered
		var $clusteredMarkersIndexes=$marker._parentCluster._childIndexes, $intersectDetected=true, $uncachedIconBoundsIndexes, i, $mapZoomLevel=this._map.getZoom(), $clusteredMarkerIndex, $iconBounds=this._iconBounds, $mapMaxZoomLevel=this._map.getCurrentMapType().getMaximumResolution();
		while($intersectDetected && $mapZoomLevel<$mapMaxZoomLevel){
			$intersectDetected=false;
			$mapZoomLevel++;
			if(typeof($iconBounds[$mapZoomLevel])==='undefined'){
				//	no iconBounds cached for this zoom level
				//	no need to check for existence of individual iconBounds elements
				$iconBounds[$mapZoomLevel]=[];
				// need to create cache for all clustered markers at $mapZoomLevel
				this._preCacheIconBounds($clusteredMarkersIndexes, $mapZoomLevel);
			}else{
				//	iconBounds array exists for this zoom level
				//	check for existence of individual iconBounds elements
				$uncachedIconBoundsIndexes=[];
				for(i=$clusteredMarkersIndexes.length-1; i>=0; i--){
					if(typeof($iconBounds[$mapZoomLevel][$clusteredMarkersIndexes[i]])==='undefined'){
						$uncachedIconBoundsIndexes.push($clusteredMarkersIndexes[i]);
					}
				}
				if($uncachedIconBoundsIndexes.length>=1){
					this._preCacheIconBounds($uncachedIconBoundsIndexes, $mapZoomLevel);
				}
			}
			for(i=$clusteredMarkersIndexes.length-1; i>=0; i--){
				$clusteredMarkerIndex=$clusteredMarkersIndexes[i];
				if($clusteredMarkerIndex!==$index && $iconBounds[$mapZoomLevel][$clusteredMarkerIndex].intersects($iconBounds[$mapZoomLevel][$index])){	
					$intersectDetected=true;
					break;
				}
			}
			
		};
		//this._map.setCenter($marker.getLatLng(), $mapZoomLevel);
		$marker._isVisible=true;
		this._map.addOverlay($marker);
		this.triggerClick($index);
	}else{
		// $marker is not within active area (map bounds + border padding)
		//this._map.setCenter($marker.getLatLng());
		$marker._isVisible=true;
		//this.refresh(true);
		this._map.addOverlay($marker);
		this.triggerClick($index);
	}
};

