function PSMarkers (map,loggedin)
{
	var psm = this;
	psm.map = map;
	map.psm = psm;
	if ( loggedin )
		psm.loggedin = true;
	else
		psm.loggedin = false;
	psm.mainMarker = null;
	psm.userHome = null;
	psm.onlyUserMarkers = false;
	psm.markersTypes = new PSMarkersTypes();
	psm.markers4Type = { 
		markers:MultiArray([psm.markersTypes.getCount(),18]), 
		n:MultiArray([psm.markersTypes.getCount(),18])
	}; // [markery każdego typu i etykiety liczbowe dla markerów każdego typu] dla każdego przybliżenia
	psm.userMarkers4Type = MultiArray( [psm.markersTypes.getCount()] );
	psm.userMarkers4TypeDownloaded = false;
	psm.activeMarkersTypes = jQuery.map( new Array(psm.markersTypes.getCount()), function () { return true; } );
	psm.infoWindow = new PSInfoWindow();
	psm.balloon = new PSBalloon(jQuery('#gmap'));
	psm.viewBounds = new Array(18); 
	psm.markerManager = psm.initializeMarkerManager_(map, {borderPadding:0});
	psm.initializeEvents_();
}

PSMarkers.prototype.restart = function ( )
{
	var psm = this;
	psm.markerManager.clearMarkers();
	psm.markers4Type = { 
		markers:MultiArray([psm.markersTypes.getCount(),18]), 
		n:MultiArray([psm.markersTypes.getCount(),18])
	}; // [markery każdego typu i etykiety liczbowe dla markerów każdego typu] dla każdego przybliżenia
	psm.userMarkers4Type = MultiArray( [psm.markersTypes.getCount()] );
	psm.userMarkers4TypeDownloaded = false;
	psm.viewBounds = new Array(18); 	
}

PSMarkers.prototype.initializeMarkerManager_ = function (map,opts)
{
	MarkerManager.MAX_VISIBLE_MARKERS = 500;
	MarkerManager.MAX_CACHED_MARKERS = 3000;
	var mm = new MarkerManager(map,opts);
	mm.addOverlay_ = function (marker) {
		if ( mm.shownMarkers_ < MarkerManager.MAX_VISIBLE_MARKERS )
		{
			mm.map_.addOverlay(marker);
			mm.shownMarkers_++;
		}	
	}
	mm.removeOverlay_ = function ( marker ) {
		mm.lastRemovedMarker = marker;
		mm.map_.removeOverlay(marker);
	}	
	mm.processAll_ = function(bounds,callback){
		var countMarkers = 0;
		var z = bounds.z;
		for(var x=bounds.minX;x<=bounds.maxX;x++)
			for(var y=bounds.minY;y<=bounds.maxY;y++)
			{
				var cell = mm.getGridCellNoCreate_(x,y,z);
				if ( cell )
					countMarkers += cell.length;
			} 
		if ( countMarkers > MarkerManager.MAX_VISIBLE_MARKERS && callback == mm.addOverlay_ )
			var part = MarkerManager.MAX_VISIBLE_MARKERS / countMarkers;
		else if ( callback == mm.removeOverlay_ )
			mm.map_.hideOverflow();
		for(var x=bounds.minX;x<=bounds.maxX;x++)
			for(var y=bounds.minY;y<=bounds.maxY;y++)
				mm.processCellMarkers_(x,y,bounds.z,callback,part);
	};
	mm.processCellMarkers_ = function(x,y,z,callback,part){
		var cell=mm.getGridCellNoCreate_(x,y,z);		
		if(cell){
			var start;			
			if ( typeof part == "number" )
				start = Math.ceil(part*cell.length)-1;
			else
				start = cell.length - 1;
			for(var i=start;i>=0;i--){
			   callback(cell[i])
		   }
		}
	};	
	mm.getAllMarkerCount = function () {
		var total=0;
		for(var z=mm.numMarkers_.length-1;z>=0;z--){
		   total+=mm.numMarkers_[z]}
		return total		
	};
	GEvent.bind(mm.map_,"removeoverlay",mm,function ( overlay ) {
		var mm = this;
		if ( overlay == mm.lastRemovedMarker )
			mm.shownMarkers_--;
	});	
	GEvent.bind(mm,"changed",mm,function ( shownBounds, shownMarkers )
	{
		var mm = this;
		if ( shownMarkers == MarkerManager.MAX_VISIBLE_MARKERS )
			mm.map_.showOverflow();
	});
	return mm;
}

PSMarkers.prototype.initializeEvents_ = function ()
{
	var psm = this;
	var map = psm.map;
	
	GEvent.bind(map,"moveend",psm,psm.updateView);
	GEvent.bind(map,"infowindowclose",psm,psm.updateView);
	
	var enlarge_map = jQuery('#enlarge_map');
	if ( enlarge_map.length != 0 )
	{
		enlarge_map.click( function () {
			var gmap_location = jQuery('#gmap_location');
			var search = jQuery.trim(gmap_location.val());
			if ( search == gmap_location.data('info') )
				search = '';
				
			if ( psm.isVisibleMainMarker() )
			{
				var href = enlarge_map.attr('href');
				enlarge_map.attr('href',href+(href.search('\\?')>-1?'&':'?')+'zoom='+map.getZoom()+'&lat='+map.getCenter().lat()+'&lng='+map.getCenter().lng()+'&search='+search);
			}
			else
				enlarge_map.attr('href',turl({a: 'page_h_googlemaps', zoom: map.getZoom(), lat: map.getCenter().lat(), lng: map.getCenter().lng(), search:search})); 
		});
	}
}

PSMarkers.prototype.getUserHome = function ( user )
{
	var psm = this;
	if ( psm.loggedin )
	{
		jQuery.ajax({
			async: false,
			url: URL_TO_AJAX,
			type: "POST",
			data: { m:'pc', a:'page_ajax_requests', action:'get', what:'userHome', user:user},
			dataType: "text",
			success: function (data) {
						var data = data.PSevalJSON();
						if ( data != false && data != null )
						{ 
							var type = psm.markersTypes.getBig(data.type);
							if ( !user ) // wywołanie bez parametru user oznacza 'moje miejsce zamieszkania'
							{
								type = clone(type);
								type.name = 'Moje '+type.name;
								type.icon.image = type.icon.image.replace('.png','_owner.png');
							} 
							var marker = new GMarker( new GLatLng(data.lat,data.lng), { icon:type.icon, title:type.name });
							GEvent.addListener( marker, "click", function ()
							{
								this.openInfoWindowHtml( psm.infoWindow.set(data,type.name) );
							});						
							psm.markerManager.addMarker(marker,10);
							psm.map.setCenter( marker.getLatLng(), parseInt(data.zoom) );
							if ( !user )
								psm.userHome = marker;
							else
								psm.mainMarker = marker;
						}
					 },
			error: function (request, status, error) {
						var err = status || error;
						psm.map.showFailure( err );
				   }
		});		
	}
}

PSMarkers.prototype.getComm = function ( comm )
{
	if ( comm > 0 )
	{
		var psm = this;
		var a = null;
		if ( psm.loggedin )
			a = 'page_ajax_requests';
		else
			a = 'page_ajax_requests_public';
		jQuery.ajax({
			async: false,
			url: URL_TO_AJAX,
			type: "POST",
			data: { m:'pc', a:a, action:'get', what:'comm', cid:comm},
			dataType: "text",
			success: function (data) {
						var data = data.PSevalJSON();
						if ( data != false && data != null )
						{ 
							var type = psm.markersTypes.getBig(data.type); 
							var marker = new GMarker( new GLatLng(data.lat,data.lng), { icon:type.icon, title:type.name });
							GEvent.addListener( marker, "click", function ()
							{
								this.openInfoWindowHtml( psm.infoWindow.set(data,type.name) );
							});						
							psm.markerManager.addMarker(marker,10);
							psm.map.setCenter( marker.getLatLng(), parseInt(data.zoom) );
							psm.mainMarker = marker;
						}
					 },
			error: function (request, status, error) {
						var err = status || error;
						psm.map.showFailure( err );
				   }
		});
	}
}

PSMarkers.prototype.getMarkersFromBounds_ = function ( bounds, zoom )
{
	var psm = this;
	jQuery.ajax({
		url: URL_TO_AJAX,
		type: "POST",
		data: { m:'pc', a:'page_ajax_requests_public', action:'get', what:'markersFromBounds', zoom:zoom, bounds: bounds.getSouthWest().lat() + ',' + bounds.getSouthWest().lng() + ',' + bounds.getNorthEast().lat() + ',' + bounds.getNorthEast().lng() },
		dataType: "text",
		beforeSend: function (request) {
			psm.map.showProcessing('pobieranie danych...');
		},
		success: function (data) {
					psm.map.showProcessing('wczytywanie danych...');
					var data = data.PSevalJSON();
					if ( data != false && data != null )
					{
						var i = data.length - 1;
						do
						{
							var marker = data[i];
							marker.sw_lat = parseFloat(marker.sw_lat);
							marker.sw_lng = parseFloat(marker.sw_lng);
							marker.ne_lat = parseFloat(marker.ne_lat);
							marker.ne_lng = parseFloat(marker.ne_lng);
							var type;
							if ( marker.n == 1 )
							{
								if ( psm.userHome )
								{
									var userHomeLatLng = psm.userHome.getLatLng();								
									if ( marker.lat == userHomeLatLng.lat() && marker.lng == userHomeLatLng.lng() )
										continue;
								}
								if ( psm.mainMarker )
								{
									var mainMarkerLatLng = psm.mainMarker.getLatLng();
									if ( marker.lat == mainMarkerLatLng.lat() && marker.lng == mainMarkerLatLng.lng() )
										continue;
								}
							}
							if ( marker.n < 100 )							
								type = psm.markersTypes.getSmall(marker.type);
							else if ( marker.n < 1000 )
								type = psm.markersTypes.getNormal(marker.type);
							else
								type = psm.markersTypes.getBig(marker.type);
							var gMarker = new GMarker( new GLatLng(marker.lat,marker.lng), {icon:type.icon, title:type.name});
							gMarker.n = marker.n;
							gMarker.type = marker.type;						
							gMarker.polygon = new GPolygon([new GLatLng(marker.sw_lat,marker.sw_lng),
															new GLatLng(marker.ne_lat,marker.sw_lng),
															new GLatLng(marker.ne_lat,marker.ne_lng),
															new GLatLng(marker.sw_lat,marker.ne_lng),
															new GLatLng(marker.sw_lat,marker.sw_lng)],
															'#8a0072',2,1,'#ff61fd',0.4);																																							
							gMarker.polygon.label = new PSMarkerLabel( gMarker.getLatLng(), marker.n, new GSize(type.icon.iconSize.width/2,-type.icon.iconSize.height) );															
				    		GEvent.addListener(gMarker,"mouseover",function () { 
				    			psm.showPolygonMarker_(this.polygon);
				    		});
							GEvent.addListener(gMarker,"mouseout",function () { 
								psm.hidePolygonMarker_();
							});															
							GEvent.addListener(gMarker,"click",function() { psm.showMarkerInfo_(this); } );														
							psm.markers4Type.markers[marker.type-1][zoom].push( gMarker ); 							
						} while ( --i >= 0 );
						psm.refreshMarkerManager_();
					}
				 },
		error: function (request, status, error) {
					var err = status || error;
					psm.map.showFailure( err );
			   },
		complete: function (request, status) {
			psm.map.hideProcessing();
		}
	});
}

PSMarkers.prototype.getUserMarkers_ = function ()
{
	var psm = this;
	if ( psm.loggedin )
	{
		jQuery.ajax({
			url: URL_TO_AJAX,
			type: "POST",
			data: { m:'pc', a:'page_ajax_requests', action:'get', what:'userMarkers'},
			dataType: "text",
			beforeSend: function (request) {
				psm.map.showProcessing('pobieranie danych...');
			},
			success: function (data) {
						psm.map.showProcessing('wczytywanie danych...');
						var data = data.PSevalJSON();
						if ( data != false && data != null )
						{
							var i = data.length - 1;
							var offset = 0.00005;
							do
							{
								var marker = data[i];
								marker.lat = parseFloat(marker.lat);
								marker.lng = parseFloat(marker.lng);
								var type = psm.markersTypes.getSmall(marker.type);
								var gMarker = new GMarker( new GLatLng(marker.lat,marker.lng), {icon:type.icon, title:type.name});
								gMarker.type = marker.type;																											
								gMarker.polygon = new GPolygon([new GLatLng(marker.lat-offset,marker.lng-offset),
																new GLatLng(marker.lat+offset,marker.lng-offset),
																new GLatLng(marker.lat+offset,marker.lng+offset),
																new GLatLng(marker.lat-offset,marker.lng+offset),
																new GLatLng(marker.lat-offset,marker.lng-offset)],
																'#8a0072',2,1,'#ff61fd',0.4);
								GEvent.addListener(gMarker,"click",function() { psm.showMarkerInfo_(this); } );														
								psm.userMarkers4Type[marker.type-1].push( gMarker ); 							
							} while ( --i >= 0 );
							psm.userMarkers4TypeDownloaded = true;
							psm.refreshMarkerManager_();
						}
					 },
			error: function (request, status, error) {
						var err = status || error;
						psm.map.showFailure( err );
				   },
			complete: function (request, status) {
				psm.map.hideProcessing();
			}
		});
	}
}

PSMarkers.prototype.refreshMarkerManager_ = function ()
{
	var psm = this;
	var mm = psm.markerManager;		
	mm.clearMarkers();	
	if ( !psm.onlyUserMarkers )
	{
		var markers = psm.markers4Type.markers;
		var nmarkers = psm.markers4Type.n;
		for ( var i = markers.length-1; i>=0; i-- )
		{
			if ( psm.activeMarkersTypes[i] )
			{
				for ( var j = markers[0].length-1; j>=0; j-- )
				{			
					if ( markers[i][j].length != 0 )
						mm.addMarkers( markers[i][j], j, j );
				}
			}
		}
	}
	else
	{
		if ( !psm.userMarkers4TypeDownloaded )
			psm.getUserMarkers_();
		else
		{
			var markers = psm.userMarkers4Type;
			for ( var i = markers.length-1; i>=0; i-- )
				if ( psm.activeMarkersTypes[i] )
					mm.addMarkers( markers[i], 0 );
		}
	}
	if ( psm.mainMarker )
		mm.addMarker(psm.mainMarker,10);
	if ( psm.userHome )
		mm.addMarker(psm.userHome,10);
	mm.refresh();
}

PSMarkers.prototype.getMapBoundsWithOffset_ = function ( zoom )
{
	var map = this.map;
	var bounds = map.getBounds();
	if ( !zoom )
		zoom = map.getZoom();
	var offset = { width:map.zoomsEpsilon[zoom], height:map.zoomsEpsilon[zoom] };
	bounds.extend( new GLatLng( map.floor_coordinate(bounds.getNorthEast().lat()+2*offset.height,zoom), map.floor_coordinate(bounds.getNorthEast().lng()+2*offset.width,zoom) ) );
	bounds.extend( new GLatLng( map.floor_coordinate(bounds.getSouthWest().lat()-2*offset.height,zoom), map.floor_coordinate(bounds.getSouthWest().lng()-2*offset.width,zoom) ) );
	return bounds;
}

PSMarkers.prototype.updateView = function ()
{
	var psm = this;
	if ( !psm.isUpdating && psm.map.getInfoWindow().isHidden() )
	{
		psm.isUpdating = true;
		if ( psm.markerManager.getAllMarkerCount() > MarkerManager.MAX_CACHED_MARKERS )
			psm.restart();
		if ( !psm.onlyUserMarkers )
		{
			psm.hidePolygonMarker_();
			var zoom = psm.map.getZoom();
			var viewBounds = psm.viewBounds[zoom];
			var mapBounds = psm.map.getBounds();
			if ( !viewBounds )
			{
				viewBounds = psm.getMapBoundsWithOffset_(zoom);
				psm.getMarkersFromBounds_( viewBounds, zoom );
				psm.viewBounds[zoom] = viewBounds;
			}
			else if( !viewBounds.containsBounds( mapBounds ) )
			{		
				var bounds = psm.getMapBoundsWithOffset_(zoom);
				var boundsSW = bounds.getSouthWest();
				var boundsNE = bounds.getNorthEast();
				var viewSW = viewBounds.getSouthWest();
				var viewNE = viewBounds.getNorthEast();
				var bounds = [];
				bounds.push(new GLatLngBounds(new GLatLng(viewSW.lat(),boundsSW.lng()),new GLatLng(Math.max(boundsNE.lat(),viewNE.lat()),viewSW.lng())));
				bounds.push(new GLatLngBounds(new GLatLng(viewNE.lat(),viewSW.lng()),new GLatLng(boundsNE.lat(),Math.max(boundsNE.lng(),viewNE.lng()))));
				bounds.push(new GLatLngBounds(new GLatLng(Math.min(viewSW.lat(),boundsSW.lat()),viewNE.lng()),new GLatLng(viewNE.lat(),boundsNE.lng())));
				bounds.push(new GLatLngBounds(new GLatLng(boundsSW.lat(),Math.min(viewSW.lng(),boundsSW.lng())),new GLatLng(viewSW.lat(),viewNE.lng())));
				for ( var i = bounds.length-1; i>=0; i-- )
				{
					var bound = bounds[i];
					var boundSW = bound.getSouthWest();
					var boundNE = bound.getNorthEast();
					if ( boundSW.lat() < boundNE.lat() && (boundSW.lng() < boundNE.lng() || (boundSW.lng()>0 && boundNE.lng()<0)) )
						psm.getMarkersFromBounds_( bound, zoom );
				}			
				viewBounds.extend( boundsSW );
				viewBounds.extend( boundsNE );
			}
		}
		else
		{
			if ( psm.markerManager.getAllMarkerCount() <= 1 )
				psm.getUserMarkers_();
		}
		psm.isUpdating = false;		
	}
}

PSMarkers.prototype.showPolygonMarker_ = function ( polygon )
{
	var psm = this;
	psm.hidePolygonMarker_();
	psm.polygonMarker = polygon;
	psm.map.addOverlay( psm.polygonMarker );
	psm.map.addOverlay( psm.polygonMarker.label );
}

PSMarkers.prototype.hidePolygonMarker_ = function ()
{
	var psm = this;
	if ( psm.polygonMarker )
	{
		psm.map.removeOverlay( psm.polygonMarker.label );
		psm.map.removeOverlay( psm.polygonMarker );
		psm.polygonMarker = null;
	}
}

PSMarkers.prototype.isVisibleMainMarker = function ()
{
	var psm = this;
	if ( psm.mainMarker )	
		return psm.map.getBounds().containsLatLng(psm.mainMarker.getLatLng());
	else if ( psm.userHome )
		return psm.map.getBounds().containsLatLng(psm.userHome.getLatLng());
	else
		return false;
}

PSMarkers.prototype.showMainMarkerInfo = function ()
{
	var psm = this;
	if ( psm.mainMarker )
		GEvent.trigger(psm.mainMarker,'click');
	else if ( psm.userHome )
		GEvent.trigger(psm.userHome,'click');
}

PSMarkers.prototype.showMarkerInfo_ = function( gMarker )
{
	var psm = this;
	var bounds = gMarker.polygon.getBounds();
	if ( !gMarker.data )
	{
		jQuery.ajax({
			url: URL_TO_AJAX,
			type: "POST",
			data: { m:'pc', a:'page_ajax_marker_info', zoom:psm.map.getZoom(), type:gMarker.type, userMarkers:(psm.onlyUserMarkers?1:0), n:gMarker.n, bounds: bounds.getSouthWest().lat() + ',' + bounds.getSouthWest().lng() + ',' + bounds.getNorthEast().lat() + ',' + bounds.getNorthEast().lng() },
			dataType: "html",
			beforeSend: function (request) {
							psm.map.showProcessing('pobieranie danych...');
						},
			success: function (data) {
						gMarker.data = data;
						showMarkerInfoData_(data);
					 },
			error: function (request, status, error) {		
						var err = status || error;
						gMarker.closeInfoWindow();
						psm.map.showFailure( err );
				   },
			complete: function (request, status) {
						psm.map.hideProcessing();
					  }
		});
	}
	else
		showMarkerInfoData_(gMarker.data);
	
	function showMarkerInfoData_(data)
	{
		gMarker.openInfoWindow(data);
		window.setTimeout(function(){
			initialize_ajax_form();
			jQuery('#knock').hover(
				function ( event ) {
					var balloonPOffset = psm.balloon.balloon.parent().offset();
					psm.balloon.showDown( {left:event.pageX-balloonPOffset.left-20, top:event.pageY-balloonPOffset.top+15}, (gMarker.type==5 || gMarker.type==6)?'Poznaj mieszkańców znajdujących się w&nbsp;ukrytych miejscach zamieszkania.':'Poznaj ukryte społeczności.');
				},
				function () {
					psm.balloon.hide();
				});
			jQuery('#knock_inactive').hover(
				function ( event ) {
					var balloonPOffset = psm.balloon.balloon.parent().offset();
					psm.balloon.showDown( {left:event.pageX-balloonPOffset.left-20, top:event.pageY-balloonPOffset.top+15}, (gMarker.type==5 || gMarker.type==6)?'Jeśli chcesz poznać mieszkańców ukrytych miejsc zamieszkania w tej okolicy, przybliż widok mapy.':'Jeśli chcesz poznać ukryte społeczności w tej okolicy przybliż widok mapy.');
				},
				function () {
					psm.balloon.hide();
				});
		},1000);	
	}
}

PSMarkers.prototype.initializeChoiceObjects = function (enable)
{
	var psm = this;
	var objects_type_list = jQuery('#objects_type_list');
	var show_objects = jQuery('#show_objects').hover( function () { psm.balloon.showUp({right:-230,bottom:-10},'Wybierz typy społeczności, które chcesz wyświetlać na mapce.'); }, function () { psm.balloon.hide(); } );
	var objects_type_list_select_all = jQuery('#objects_type_list_select_all');		 
	var objects_type_list_deselect_all = jQuery('#objects_type_list_deselect_all');
	var show_comms = jQuery('#show_comms');
	var show_users = jQuery('#show_users');
	var show = jQuery('#objects_type_list_select_all,#objects_type_list_deselect_all,#show_comms,#show_users');
	show_objects.toggle( function(){objects_type_list.show();}, function(){objects_type_list.hide();} );
	objects_type_list_select_all.click( function () {
		jQuery('#objects_type_list li').removeClass('inactive');
		show.removeClass('active');
		objects_type_list_select_all.addClass('active');		
		psm.activeMarkersTypes = jQuery.map( psm.activeMarkersTypes, function() { return true; } );
		psm.refreshMarkerManager_();
	});
	objects_type_list_deselect_all.click( function () {
		jQuery('#objects_type_list li').addClass('inactive');		
		show.removeClass('active');
		objects_type_list_deselect_all.addClass('active');
		psm.activeMarkersTypes = jQuery.map( psm.activeMarkersTypes, function() { return false; } );
		psm.refreshMarkerManager_();
	});
	show_comms.click( function () {
		jQuery('#objects_type_list li[id!=\'type_5\']').removeClass('inactive');
		jQuery('#objects_type_list li[id=\'type_5\']').addClass('inactive');
		show.removeClass('active');
		show_comms.addClass('active');
		psm.activeMarkersTypes = jQuery.map( psm.activeMarkersTypes, function(e,i) { return i!=4; } );
		psm.refreshMarkerManager_(); 
	});
	show_users.click( function () {
		jQuery('#objects_type_list li[id!=\'type_5\']').addClass('inactive');
		jQuery('#objects_type_list li[id=\'type_5\']').removeClass('inactive');
		show.removeClass('active');
		show_users.addClass('active');		
		psm.activeMarkersTypes = jQuery.map( psm.activeMarkersTypes, function(e,i) { return i==4; } );
		psm.refreshMarkerManager_(); 
	});	
	jQuery('#objects_type_list li').click( function () {	
		jQuery(show).removeClass('active');
		var obj = jQuery(this);
		obj.toggleClass('inactive');
		var type = obj.attr('id').split('_',2)[1];
		psm.activeMarkersTypes[type-1] = !psm.activeMarkersTypes[type-1];  
		psm.refreshMarkerManager_();
	});
	
	if ( enable )
	{
		if ( enable.show_objects )
			show_objects.click();
		if ( enable.deselect_all )
			objects_type_list_deselect_all.click();
	}
		
}

PSMarkers.prototype.initializeAllAndUserMarkersChoice = function ()
{
	var psm = this;
	var show_my_markers = jQuery('#show_my_markers').hover( function (e) { if (!jQuery(e.target).hasClass('active')) { psm.balloon.showUp({right:-180,bottom:-10},'Wyświetl tylko swoje społeczności.'); } }, function () { psm.balloon.hide(); } );
	var show_all_markers = jQuery('#show_all_markers').hover( function (e) { if (!jQuery(e.target).hasClass('active')) { psm.balloon.showUp({right:-125,bottom:-10},'Wyświetl wszystkie społeczności.'); } }, function () { psm.balloon.hide(); } );
	show_my_markers.click( function () {
		if ( !psm.onlyUserMarkers )
		{			
			show_my_markers.toggleClass('active');
			show_all_markers.toggleClass('active');
			psm.onlyUserMarkers = true;
			psm.refreshMarkerManager_();
		}
	});
	show_all_markers.click( function () {
		if ( psm.onlyUserMarkers )
		{
			show_my_markers.toggleClass('active');
			show_all_markers.toggleClass('active');
			psm.onlyUserMarkers = false;
			psm.updateView();
			psm.refreshMarkerManager_();			
		}
	});
}

//var controlPanel = null;
PSMarkers.prototype.addControlPanel = function ()
{	
	var psm = this;
	controlPanel = new PSPanelControl(psm.userHome);
	psm.map.addControl(controlPanel);	
	controlPanel.mapCenter.hover( function () { psm.balloon.showDown( {right:-30,top:29}, 'Wyśrodkuj mapę na swoim miejscu zamieszkania.' ); }, function () { psm.balloon.hide(); } );
	controlPanel.addComm.hover( function () { psm.balloon.showDown( {right:-60,top:29}, 'Przejdź w tryb dodawania nowej społeczności i&nbsp;wybierz punkt na mapie dla nowej społeczności.'); }, function () { psm.balloon.hide(); } );
}

PSMarkers.prototype.setAddCommMode = function(){
	controlPanel.addComm_(controlPanel);
}

function PSInfoWindow ()
{
	var me = this;
	me.infoWindow = jQuery('<div id="infoWindow"/>');
	me.infoWindowHead = jQuery('<div id="infoWindowHead"/>').appendTo(me.infoWindow);
	me.infoWindowContent = jQuery('<div id="infoWindowContent"/>').appendTo(me.infoWindow);
	me.infoWindowContentImageLink = jQuery('<a id="infoWindowContentImageLink"/>').appendTo(me.infoWindowContent);
	me.infoWindowContentImageSource = jQuery('<img id="infoWindowContentImageSource"/>').appendTo(me.infoWindowContentImageLink);
	me.infoWindowContentDescription = jQuery('<div id="infoWindowContentDescription"/>').appendTo(me.infoWindowContent);
	me.infoWindowContentDescriptionLink = jQuery('<a/>').appendTo(me.infoWindowContentDescription);
	me.infoWindowContentDescriptionAddress = jQuery('<div class="address"/>').appendTo(me.infoWindowContentDescription);
	me.infoWindowContentDescriptionInfo = jQuery('<div class="description"/>').appendTo(me.infoWindowContentDescription);
}

PSInfoWindow.prototype.get = function ()
{
	return this.infoWindow;
}

PSInfoWindow.prototype.set = function (data,type)
{
	var me = this;
	me.reset_();
	var link = '#';
	switch ( data.link )
	{
		case 'user': 
			link = turl({a:'page_f_home', target_c_member_id:data.id}); break;
		case 'comm': 
			link = turl({a:'page_c_home', target_c_commu_id:data.id}); break; 
	}
	me.infoWindowContentImageSource.attr('src',data.img);
	me.infoWindowContentImageLink.attr('href',link);
	me.infoWindowContentDescriptionLink.attr('href',link);
	me.infoWindowHead.html(type);
	me.infoWindowContentDescriptionLink.html(data.name);
	if ( data.address )
		me.infoWindowContentDescriptionAddress.show().html(data.address);
	else
		me.infoWindowContentDescriptionAddress.hide();
	me.infoWindowContentDescriptionInfo.html(data.info);
	return me.infoWindow.get(0);
}

PSInfoWindow.prototype.reset_ = function ()
{
	var me = this;
	me.infoWindowContentImageSource.removeAttr('src');
	jQuery( [me.infoWindowContentImageLink, me.infoWindowContentDescriptionLink] ).removeAttr('href');
	jQuery( [me.infoWindowHead, me.infoWindowContentDescriptionLink, me.infoWindowContentDescriptionAddress, me.infoWindowContentDescriptionInfo] ).empty();
}


function PSPanelControl ( home ) {
	this.home = home;
}
PSPanelControl.prototype = new GControl();
PSPanelControl.prototype.initialize = function( map ) {
	var pspc = this;
	pspc.map = map;
	pspc.pc = jQuery('<div id="panelControl"/>');
	pspc.mapCenter = jQuery('<div id="mapCenter"/>').bind('click',pspc,pspc.setCenter_);
	pspc.addComm = jQuery('<div id="addComm"/>').bind('click',pspc,pspc.addComm_); 
	jQuery([pspc.mapCenter,pspc.addComm]).appendTo(pspc.pc);
	map.getContainer().appendChild(pspc.pc.get(0));
	return pspc.pc.get(0);
}
PSPanelControl.prototype.getDefaultPosition = function () {
	return new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(200,7));
}
PSPanelControl.prototype.setUserHome = function ( home ) {
	this.home = home;
}
PSPanelControl.prototype.setCenter_ = function ( event ) {
	var pspc = event.data;
	var bounds = pspc.map.psm.getMapBoundsWithOffset_(); 
	if ( pspc.home )
	{
		if ( !(pspc.map.psm.getMapBoundsWithOffset_()).containsLatLng(pspc.home.getLatLng()) )
			pspc.map.psm.restart();			
		pspc.map.panTo( pspc.home.getLatLng() );
	}
	else
	{
		pspc.map.psm.restart();
		pspc.map.psm.getUserHome();
		window.setTimeout( function () {
			pspc.home = pspc.map.psm.userHome;
		},1000 );
	}
}
PSPanelControl.prototype.addComm_ = function ( event ) {
	var pspc = event.data||event;

	pspc.addComm.toggleClass('active');
	if ( !pspc.listener )
	{
		pspc.listener = GEvent.addListener( pspc.map, 'click', pspc.addCommClick_ );
	}
	else
	{
		GEvent.removeListener( pspc.listener );
		pspc.listener = false;
	}
}
PSPanelControl.prototype.addCommClick_ = function ( overlay, point ) {
	if ( !overlay )
	{
		var map = this;
		map.openInfoWindowHtml( point, jQuery('<div style="width:200px">Czy na pewno chcesz założyć w tym miejscu społeczność? <br/> <a href="' + turl({m:'pc',a:'page_h_com_add',lat:point.lat(),lng:point.lng()}) + '">Tak</a> </div>').append(jQuery(' <a href="#map">Nie</a>').click(function(){map.closeInfoWindow();})).get(0));
		map.panTo(point);
	}
}
