/**
 * BrowseMap
 */
function BrowseMap(mapID)
{
	this.mapID = mapID;
}

BrowseMap.prototype.text_close     = "Close";

BrowseMap.prototype.map            = null;
BrowseMap.prototype.mapID          = null;
BrowseMap.prototype.mapControl     = null;
BrowseMap.prototype.mapTypeControl = null;
BrowseMap.prototype.mapType        = null;
BrowseMap.prototype.showScale      = true;
BrowseMap.prototype.showOverview   = true;
BrowseMap.prototype.center         = null;
BrowseMap.prototype.zoom           = 1;
BrowseMap.prototype.listTripsLess  = 10;
BrowseMap.prototype.parsedBounds   = null;

BrowseMap.prototype.mapRendered = false;
BrowseMap.prototype.renderMap = function()
{
	var Me = this;
	////console.log("BrowseMap.renderMap()");
	
	Me.map = new GMap2( $(Me.mapID), {mapTypes: [G_PHYSICAL_MAP,G_SATELLITE_MAP,G_HYBRID_MAP,G_NORMAL_MAP]});
	
	if( Me.center){ Me.map.setCenter ( new GLatLng(this.center.lat,this.center.lon), this.zoom); }
	
	if( !Me.mapControl     ){ Me.mapControl     = new GSmallMapControl(); }
	if( !Me.mapTypeControl ){ Me.mapTypeControl = new GMapTypeControl(); }
	if( !Me.mapType        ){ Me.mapType        = G_PHYSICAL_MAP; }
	
	Me.map.enableContinuousZoom();
	Me.map.addControl( Me.mapControl );
	Me.map.addControl( Me.mapTypeControl );
	Me.map.addControl( Me.mapControl );
	if( Me.showOverview ){ Me.map.addControl(new GOverviewMapControl(), new GControlPosition(G_ANCHOR_BOTTOM_RIGHT)); }
	if( Me.showScale    ){ Me.map.addControl(new GScaleControl()); } 
 	Me.map.setMapType( Me.mapType  ); 
	
	GEvent.addListener(Me.map, "moveend", function(){ Me.mapMoved(); } );
    GEvent.addListener(Me.map, "zoomend", function(){ Me.mapZoomChanged(); } );
	
	Me.mapRendered = true;

	Me.loadAreas();	
}

BrowseMap.prototype.mapMoved = function()
{
	var Me = this;
	
	if( Me.TripListOpened ){ return; }
	
	//check moved out from parsed area
	var viewInfo = Me.getMapViewInfo();
	
	var reload = ( viewInfo.lat_s < Me.parsedBounds.sw.lat 
					|| viewInfo.lat_n > Me.parsedBounds.ne.lat 
					|| viewInfo.lon_w < Me.parsedBounds.sw.lon 
					|| viewInfo.lon_e > Me.parsedBounds.ne.lon
				 );
	if( reload )
	{
		Me.loadAreas();
	}
	
}
BrowseMap.prototype.mapZoomChanged = function()
{
	var Me = this;
	var view = Me.getMapViewInfo();
	Me.loadAreas();
}

BrowseMap.prototype.loadAreasOnProgress = false;
BrowseMap.prototype.loadAreas = function()
{
	var Me = this;
	if( !Me.mapRendered ){ return; }
	if( Me.loadAreasOnProgress ){ return; }
	
	Me.map.clearOverlays();
	Me.loaderShow();
	
	var nfo = Me.getMapViewInfo();
	var url = "/trkbBrowseMapServices/LoadAreas";
	var pars  = "lat_s="+nfo.lat_s+"&lon_w="+nfo.lon_w+"&lat_n="+nfo.lat_n+"&lon_e="+nfo.lon_e+"&zoom="+nfo.zoom;
	var myAjax = new Ajax.Request( url, {   method: 'post', 
											parameters: pars, 
											onComplete: function(request){ Me.loadAreas_response(request); } });
	//console.log("BrowseMap.loadAreas()");
	//console.log("request: "+pars);
}

BrowseMap.prototype.loadAreas_response = function(request)
{
	var Me = this;
	
	//console.log("BrowseMap.loadAreas_response()");
	
	var data = request.responseText.evalJSON();
	
	Me.parsedBounds = data.viewBounds;
	//Me.showParsedArea();
	
	for( i=0; i<data.areas.length; i++ )
	{
		if( data.areas[i] )
		{
			Me.addAreaMarker(data.areas[i]);
		}
	}
	Me.loaderHide();
}

BrowseMap.prototype.addAreaMarker = function( _data )
{
	var Me = this;
	
	var marker = new GMarker(new GLatLng(_data.tripsCenter.lat,_data.tripsCenter.lon), {icon: Me.getAreaMarkerIcon(_data)} );
	marker.areaInfo = _data;
	
	if( _data.tripsCount > Me.listTripsLess )
	{
		GEvent.addListener(marker, "click", function() { Me.areaMarker_Click(marker); });
	}
	else
	{
		GEvent.addListener(marker, "click", function() { Me.TripListOpened = true; marker.openInfoWindow( Me.getTripListHtml(marker) ) });
		GEvent.addListener(marker, "infowindowopen", function(){ Me.TripListOnOpened(); } );
		GEvent.addListener(marker, "infowindowclose", function(){ Me.TripListOnClosed(); } );
	}
	if( _data.tripsCount > 1 )
	{
		GEvent.addListener(marker, "mouseover", function(){ Me.areaRectShow(marker); } );
		GEvent.addListener(marker, "mouseout", function(){ Me.areaRectHide(); } );
	}
	Me.map.addOverlay(marker);
}

BrowseMap.prototype.TripListOpened = false;
BrowseMap.prototype.TripListOnClosed = function()
{
	var Me = this;
	Me.TripListOpened = false;
}
BrowseMap.prototype.TripListOnOpened = function()
{
	var Me = this;
	GEvent.addDomListener( document.getElementById('BrowseMapInfoWinClose'), "click", function(){ Me.map.closeInfoWindow(); } );
	//console.log("TripListOpened");
}
BrowseMap.prototype.getTripListHtml = function(marker)
{
	var Me = this;
	var lat_s = marker.areaInfo.areaBounds.sw.lat;
	var lat_n = marker.areaInfo.areaBounds.ne.lat;
	var lon_w = marker.areaInfo.areaBounds.sw.lon;
	var lon_e = marker.areaInfo.areaBounds.ne.lon;
	var html = '<iframe border="0" src="/trkbBrowseMapServices/LoadTrips?lat_s='+lat_s+'&lon_w='+lon_w+'&lat_n='+lat_n+'&lon_e='+lon_e+'" style="width: 400px; height: 240px;border: 0px;"></iframe>';
	html += "<div align='center'><a href='javascript:void(0)' id='BrowseMapInfoWinClose'>"+Me.text_close+"</a></div>"
	return html;
}

BrowseMap.prototype.getMapViewInfo = function()
{
	var Me = this;
	var view = {}
	view.bounds = Me.map.getBounds();
	view.sw = view.bounds.getSouthWest();
	view.ne = view.bounds.getNorthEast();
	view.lat_s = view.sw.lat();
	view.lat_n = view.ne.lat();
	view.lon_e = view.ne.lng();
	view.lon_w = view.sw.lng();
	view.lat_diff = view.lat_n - view.lat_s;
	view.lon_diff = view.lon_e - view.lon_w;
	view.zoom = Me.map.getZoom();
	return view;
}

BrowseMap.prototype.areaMarkerRect = null;
BrowseMap.prototype.areaRectShow = function(marker)
{
	var Me = this;
	var rectBounds = {}
	rectBounds.a = new GLatLng( marker.areaInfo.tripsBounds.ne.lat, marker.areaInfo.tripsBounds.sw.lon );
	rectBounds.b = new GLatLng( marker.areaInfo.tripsBounds.ne.lat, marker.areaInfo.tripsBounds.ne.lon );
	rectBounds.c = new GLatLng( marker.areaInfo.tripsBounds.sw.lat, marker.areaInfo.tripsBounds.ne.lon );
	rectBounds.d = new GLatLng( marker.areaInfo.tripsBounds.sw.lat, marker.areaInfo.tripsBounds.sw.lon );
	Me.areaMarkerRect = new GPolygon( [ rectBounds.a,rectBounds.b,rectBounds.c,rectBounds.d,rectBounds.a ], "#FFD700", 1, 1, "#FFD700", 0.2 );
	Me.map.addOverlay(Me.areaMarkerRect);
}
BrowseMap.prototype.areaRectHide = function(lat,lon)
{
	var Me = this;
	if( Me.areaMarkerRect )
	{
		Me.map.removeOverlay(Me.areaMarkerRect);
	}
}

BrowseMap.prototype.areaMarker_Click = function(marker)
{
	var Me = this;
	
	var newBounds = new GLatLngBounds( 
										new GLatLng(marker.areaInfo.tripsBounds.sw.lat,marker.areaInfo.tripsBounds.sw.lon), 
										new GLatLng(marker.areaInfo.tripsBounds.ne.lat,marker.areaInfo.tripsBounds.ne.lon)
									 );
	var zoomCurr = Me.map.getZoom();
	var zoomTo = Me.map.getBoundsZoomLevel(newBounds);
	
	if( zoomTo == zoomCurr ){ zoomTo++; }
	
	if( zoomTo > 15 ){ return; }
	
	Me.map.setCenter( new GLatLng(marker.areaInfo.tripsCenter.lat,marker.areaInfo.tripsCenter.lon), zoomTo);
}


BrowseMap.prototype.getAreaMarkerIcon = function(areaInfo)
{
	var Me = this;
	var tripsCount = areaInfo.tripsCount;
	if( areaInfo.tripsCount > 50 )
	{
		return Me.BrowsMapMarkerIcon(tripsCount,4);
	}
	
	else if( areaInfo.tripsCount > 10  )
	{
		return Me.BrowsMapMarkerIcon(tripsCount,3);
	}
	else if( areaInfo.tripsCount > 5  )
	{
		return Me.BrowsMapMarkerIcon(tripsCount,2);
	}
	else
	{
		return Me.BrowsMapMarkerIcon(tripsCount,1);
	}
}
BrowseMap.prototype.BrowsMapMarkerIcon = function(tripsCount,size)
{
	var icon = new GIcon();
	icon.shadow = "";
	icon.image = "/trkbBrowseMapAreaMarker?count="+tripsCount+"&size="+size;
	
	//console.log(icon.image);
	
	switch( size )
	{
		case 4:
			icon.iconSize = new GSize(64, 64);
			icon.shadowSize = new GSize(64, 64);
			icon.iconAnchor = new GPoint(30, 30);
			icon.infoWindowAnchor = new GPoint(30, 30);
		break;
		case 3:
			icon.iconSize = new GSize(44, 44);
			icon.shadowSize = new GSize(44, 44);
			icon.iconAnchor = new GPoint(21, 21);
			icon.infoWindowAnchor = new GPoint(21, 21);
		break;
		case 2:
			icon.iconSize = new GSize(32, 32);
			icon.shadowSize = new GSize(32, 32);
			icon.iconAnchor = new GPoint(15, 15);
			icon.infoWindowAnchor = new GPoint(15, 15);
		break;
		case 1:
		default:
			icon.iconSize = new GSize(26, 26);
			icon.shadowSize = new GSize(26, 26);
			icon.iconAnchor = new GPoint(12, 12);
			icon.infoWindowAnchor = new GPoint(12, 12);
		break;
	}
	
	return icon;
}

BrowseMap.prototype.showParsedArea = function(bounds)
{
	var Me = this;
	//swne 
	var rectBounds = {}
	rectBounds.a = new GLatLng( Me.parsedBounds.ne.lat, Me.parsedBounds.sw.lon );
	rectBounds.b = new GLatLng( Me.parsedBounds.ne.lat, Me.parsedBounds.ne.lon );
	rectBounds.c = new GLatLng( Me.parsedBounds.sw.lat, Me.parsedBounds.ne.lon );
	rectBounds.d = new GLatLng( Me.parsedBounds.sw.lat, Me.parsedBounds.sw.lon );
	//swne
	Me.areaMarkerRect = new GPolygon( [ rectBounds.a,rectBounds.b,rectBounds.c,rectBounds.d,rectBounds.a ], "#33ccff", 1, 1, "#33ccff", 0.2 );
	Me.map.addOverlay(Me.areaMarkerRect);
}

BrowseMap.prototype.loaderShow = function(){ document.getElementById('browsemapLoading').style.display = "block"; }
BrowseMap.prototype.loaderHide = function(){ document.getElementById('browsemapLoading').style.display = "none";  }

