//____________________________________________________________________
function VenueMap(xEvent,mapContainer_h){

	
	var self				= this;
	var xVenue				= xEvent.venue;
	var gMap;
	var gMarker;
	var infoWindow_h;
	var editable_bool		= false;
	var controlsVisible_bool= false;
	var zoomInitialised_bool= false;
	var active_bool			= true;
	var setStyleNextTime_bool = false;
	
	var mapTypeControl		= new GMapTypeControl();
	var mapPositionControl	= new GLargeMapControl();
	
	var infoWindow;
	xVenue.latitude.addEventListener('valueChange',setMapStyleAndCenter);
	xVenue.longitude.addEventListener('valueChange',setMapStyleAndCenter);
	
	//  
	//----------------------------------------------------------------
	function createInfoWindow(){
		
		if(editable_bool){
			infoWindow_h		= document.createHElement('div',null,'gMapInputs');
			new i_Input(infoWindow_h,xVenue.name,'Venue name');
			new i_Input(infoWindow_h,xVenue.url,'(website)');
			new i_Input(infoWindow_h,xVenue.address,null,true);	
			infoWindow_h.createChild('em',null,'clickToSetPrompt','click on map to set location');
			
			// add event handling
			GEvent.addListener(gMap.getInfoWindow(),'closeclick',function(){setInfoWinVisibility(false);});
			GEvent.addListener(gMap,'click',handleEditingClick);
			GEvent.addListener(gMap,'zoomend',handleEditingZoom);
			GEvent.addListener(gMap,'maptypechanged',handleMapTypeChange);
		}else{
			infoWindow_h		= document.createHElement('div','infoWindow');
			var title_h			= infoWindow_h.createChild('h3');
			var address_h		= infoWindow_h.createChild('p');
			xVenue.name.bindValueToInnerHTML(title_h);
			xVenue.address.bindValueToInnerHTML(address_h);
			GEvent.addListener(gMap,'click',handleNonEditingClick);
		}
	};  
	//----------------------------------------------------------------
	function getLat(){
		
		return xVenue.latitude.value;
	};
	//----------------------------------------------------------------
	function getLong(){
		
		return xVenue.longitude.value;
	};
	//----------------------------------------------------------------
	function getMapType(){
		
		var type_str	= xEvent.map_type.value;
		type_str		= type_str? type_str : 'Map';
		return type_str;
	};
	//----------------------------------------------------------------
	function getZoom(){
		
		var zoom_int	= xEvent.map_zoom.value;
		return parseInt(zoom_int,10);
	};
	//----------------------------------------------------------------
	function setMapStyleAndCenter(){
		
		// create marker and info window
		if(gMap && active_bool){
			setTypeAndZoom();
			var latLng			= new GLatLng(getLat(),getLong());
			gMarker? gMap.removeOverlay(gMarker) : null;
			gMarker				= new GMarker(latLng);
			gMap.addOverlay(gMarker);
		}
		if(!editable_bool && active_bool){
			centerMap();
		}
	};
	//----------------------------------------------------------------
	function setTypeAndZoom(){
		
		gMap.setZoom(getZoom());
		// set type not implemented
	};
	//----------------------------------------------------------------
	function centerMap(){
		
		if(gMap){
			// set map location
			var latLng			= new GLatLng(getLat(),getLong());
			gMap.setCenter(latLng,getZoom());
		}
	};
	//----------------------------------------------------------------
	function handleNonEditingClick(overlay,point){
		
		overlay? self.toggleInfoWindow() : null;
	};
	//----------------------------------------------------------------
	function handleMapTypeChange(){
		
		xEvent.map_type.value			= gMap.getCurrentMapType().getName();
	};
	//----------------------------------------------------------------
	function handleEditingZoom(oldLevel_int,newLevel_int){
		
		xEvent.map_zoom.value			= newLevel_int;
	};
	//----------------------------------------------------------------
	function handleEditingClick(overlay,point){
		
		// update map position
		var infoWindow				= gMap.getInfoWindow();
		if(!overlay){
			if(infoWindow.isHidden()){
				setInfoWinVisibility(false);
				xVenue.latitude.value	= point.y;
				xVenue.longitude.value	= point.x;
				
				// recentre after a brief delay
				window.setTimeout(function(){gMap.panTo(new GLatLng(getLat(),getLong()));},1000);
			}else{
				setInfoWinVisibility(false);
			}
		}
		
		// toggle visibility of infoWindow if click on on a marker
		if(overlay){
			self.toggleInfoWindow();
		}
	};
	//----------------------------------------------------------------
	function setInfoWinVisibility(display_bool){
		
		if(!editable_bool){
			if(gMarker){
				if(display_bool){
					gMarker.openInfoWindow(infoWindow_h);
					editable_bool? gMap.removeControl(mapTypeControl) : null;
				}else{
					gMap.getInfoWindow().hide();
					if(!editable_bool){
						gMap.addControl(mapTypeControl);
					}
				}
			}
		}
	};
	//_______________________________________________________________
	this.toggleInfoWindow = function(){
		
		if(gMap.getInfoWindow().isHidden()){ 
			setInfoWinVisibility(true);
		}else{
			setInfoWinVisibility(false);
		}
	};
	//________________________________________________________________
	this.deactivate = function(){
		
		active_bool				= false;
	};
	//________________________________________________________________
	this.initialise = function(editable_bool_arg){
	
		active_bool				= true;
		if(!gMap){
			var initialising_bool = true;
			editable_bool		= editable_bool_arg;
			
			// create and initialise map and info window
			gMap				= new GMap2(mapContainer_h);
	        gMap.addControl(mapPositionControl);
	        if(!editable_bool_arg){
				gMap.addControl(mapTypeControl);
	        }
	        centerMap();
			createInfoWindow();
		}
		gMap.checkResize();
		if(editable_bool_arg || initialising_bool){
			setInfoWinVisibility(false);
	        setMapStyleAndCenter();
	        centerMap();
			setInfoWinVisibility(true);
		}
	};
};	//________________________________________________________________
//____________________________________________________________________