function GMapWidgetClass ( aGMapPackage, aElementPackage, aDisplayer )
{
	/**
	 * private properties
	 */
	var self = this;
	
	var displayer = aDisplayer;
	
	var gMapPackage = aGMapPackage;
	
	var mapContainer = null;
	var mapCanvas = null;
	
	var mapButton = null;
	var mapCloseButton = null;
	
	
	/**
	 * private functions
	 */
	function getGMap ()
	{
		if ( self.gMap == null )
		{
			
			self.gMap = new GMapClass ( aGMapPackage, mapCanvas );
		}
	}
	
	
	function enableMapButtons ()
	{
		var agent1 = function ()
		{
			self.show ();
		}
		
		var agent2 = function ()
		{
			self.hide ();
		}
		
		dojoWrapper.setStyle ( mapButton, "cursor", "pointer");
		dojoWrapper.setStyle ( mapCloseButton, "cursor", "pointer");
		
		dojoWrapper.connect ( mapButton, "onclick", agent1);
		dojoWrapper.connect ( mapCloseButton, "onclick", agent2);
	}
	
	function initialize ()
	{
		mapContainer = dojoWrapper.getById ( aElementPackage.gmap_container );
		mapCanvas = dojoWrapper.getById ( aElementPackage.gmap_canvas );
		
		
		mapButton = dojoWrapper.getById ( aElementPackage.gmap_button );
		mapCloseButton = dojoWrapper.getById ( aElementPackage.gmap_close_button );										
		
		// Define agents
		var enableMapButtonsAgent = function ()
		{
			enableMapButtons ();
		}
		
		
		// Add agents
		dojoWrapper.addOnLoad(enableMapButtonsAgent);
		
	}	
	
	
	/**
	 * public properties
	 */
	this.gMap = null;
	
	/**
	 * public functions
	 */
	this.show = function ()
	{
		try
		{
			var agent = function ()
			{
				self.gMap = new GMapClass ( gMapPackage, mapCanvas );
			}
			
			displayer.show ( mapContainer, agent );

			
		}
		catch ( err )
		{
			console.error ( "GMapWidgetClass: Displayer could not be accessed. Showing of gMap failed. " + err );
		}
	}
	
	this.hide = function ()
	{
		try
		{
			displayer.hide ( mapContainer );
		}
		catch ( err )
		{
			console.error ( "GMapWidgetClass: Displayer could not be accessed. Hiding of gMap failed." + err );
		}
	}
	
	this.update = function ( aGMapPackage )
	{
		gMapPackage = aGMapPackage;
	}
	
	// Initialize the class
	initialize();

	this.initialize = function ()
	{
	initialize();
	}
}
