Array.prototype.has = function( element )
{
	for ( var i = 0; i < this.length; i++ ) 
	{
		if ( this[i] === element ) 
		{
			return true;
		}
	}
	return false;
};
function NamedCollection()
{
	this.items = Array();
	this.itemsNames = Array();
}
NamedCollection.prototype.add = function( Item )
{
	if ( !this.has( Item.name ) )
	{
		this.items.push( Item );
		this.itemsNames.push( Item.name );
	}
}
NamedCollection.prototype.remove = function( name )
{

}
NamedCollection.prototype.get = function( name )
{
	for ( var i = 0; i < this.items.length; i++ )
	{
		if ( this.items[i].name == name )
		{
			return this.items[i];
		}
	}
	return false;
}
NamedCollection.prototype.has = function( name )
{
	return this.itemsNames.has( name );
}
NamedCollection.prototype.getNames = function()
{
	return this.itemsNames;
}


function MapCenter( lat, lon, zoom )
{
    this.latLng = new GLatLng( lat, lon );
    this.zoom = zoom;
}
function MapManager( mapId, MapCenter, MapOptions )
{
	this.Map = new google.maps.Map2( document.getElementById( mapId ), MapOptions );
    //this.Map.addMapType( createMKMap() );
    //this.Map.removeMapType( G_NORMAL_MAP );
    this.Map.removeMapType( G_SATELLITE_MAP );
    this.Map.removeMapType( G_HYBRID_MAP );
    this.Map.setCenter( MapCenter.latLng, MapCenter.zoom );

    this.controls = new NamedCollection();
    this.Markers = new NamedCollection();
    this.hiddenControlNames = new Array();
}

function ControlOnMap( name, Control, ControlPosition )
{
    this.name = name;
    this.Control = Control;
    this.Position = ControlPosition || '';
}
MapManager.prototype.addControl = function( name, Control, ControlPosition )
{
    this.Map.addControl( Control, ControlPosition );
    this.controls.add( new ControlOnMap( name, Control, ControlPosition ) );
}
MapManager.prototype.getControl = function( name )
{
    return this.controls.get( name ).Control;
}
MapManager.prototype.hideControls = function( controlNames )
{
	var controlsToHide = controlNames || this.controls.getNames();

	var controlName;
	var ControlOnMap;
    for( var i = 0; i < controlsToHide.length; i++ )
    {
		controlName = controlsToHide[i];
		ControlOnMap = this.controls.get( controlsToHide[i] );
        this.Map.removeControl( ControlOnMap.Control );
        
        this.hiddenControlNames.push( controlName );
    }
}
MapManager.prototype.showControls = function( controlNames )
{
    var controlsToShow = controlNames || this.hiddenControlNames;
	var ControlOnMap;
    for( var i = 0; i < controlsToShow.length; i++ )
    {
		ControlOnMap = this.controls.get( controlsToShow[i] );
        this.Map.addControl( ControlOnMap.Control, ControlOnMap.Position );
    }
}

function MarkerOnMap( name, Marker, infoHtml, options )
{
    this.name = name;
    this.Marker = Marker;
    this.infoHtml = infoHtml || '';
    this.options = options || '';
}
MapManager.prototype.addMarker = function( name, Marker, infoHtml, options )
{
    this.Map.addOverlay( Marker );
    this.Markers.add( new MarkerOnMap( name, Marker, infoHtml, options ) );
}
MapManager.prototype.clearMarkers = function()
{
    this.Map.clearOverlays();
    this.Markers.items = Array();
    this.Markers.itemsNames = Array();
}
MapManager.prototype.openMarker = function( name )
{
    var MarkerOnMap = this.Markers.get( name );
    if ( MarkerOnMap != false )
    {
        this.openInfoWindowHtmlFor( MarkerOnMap.Marker, MarkerOnMap.infoHtml, MarkerOnMap.options );
    }
    else
    {
        alert('dupa');
    }
}

MapManager.prototype.openInfoWindowHtmlFor = function( Marker, info, options )
{
    var MarkerXY = this.Map.fromLatLngToDivPixel( Marker.getLatLng() );
    this.Map.openInfoWindowHtml( this.Map.fromDivPixelToLatLng( new google.maps.Point( MarkerXY.x, MarkerXY.y - Marker.getIcon().iconSize.height ) ), info, options );
}

