//__________________________________________________________________
function XVenue(EVDBServer,superAuthority,xEvent){
	
	var self				= this;
	var dataLoading_bool	= false;
	var unsavedChanges_bool	= false;
	var saving_bool			= false;
	var connected_bool		= false;
	var loaded_bool			= false;
	
	var broadcaster			= new Broadcaster(this);
	broadcaster.createEventType('define');
	broadcaster.createEventType('reset');
	broadcaster.createEventType('startDataLoad');
	broadcaster.createEventType('dataLoad');
	broadcaster.createEventType('beforeDataSave');
	broadcaster.createEventType('connect');
	broadcaster.createEventType('disconnect');
	broadcaster.createEventType('pollChange');
	broadcaster.createEventType('save');
	broadcaster.createEventType('startSave');
	broadcaster.createEventType('changesDelta');
	
	xEvent.addEventListener('pollChange',handlePollChange);
	xEvent.addEventListener('reset',function(){broadcaster.triggerEvent('reset')});
	this.addEventListener('define',function(){editAuth.reevaluate();});
	this.addEventListener('reset',function(){loaded_bool = false;editAuth.reevaluate();});
	this.addEventListener('connect',function(){handleConnectionStateChange(true);});
	this.addEventListener('disconnect',function(){handleConnectionStateChange(false);});
	
	var editAuth			= new Authorisation();
	editAuth.defineSuperAuthority(superAuthority);
	
	bindProperty('id','Location id');
	this.id.defineAsNodeAttribute();
	bindProperty('name','Location name');
	bindProperty('description','Description');
	bindProperty('address','Address');
	bindProperty('country','Country');
	bindProperty('url','Link');
	bindProperty('latitude','Latitude');
	bindProperty('longitude','Longitude');
	bindProperty('privacy','Privacy');

	this.latitude.setDefaultValue('-47.989921667414166');	
	this.longitude.setDefaultValue('-33.75');	
	this.privacy.setDefaultValue('3');

	this.__defineGetter__('unsavedChanges',function(){return unsavedChanges_bool;});
	this.__defineGetter__('saving',function(){return saving_bool;});
	this.__defineGetter__('loaded',function(){return loaded_bool;});
	
	//----------------------------------------------------------------
	function handlePollChange(changes_obj){
		
		if(self.unsavedChanges){
			changes_obj.changes	= true;
		}
	};
	//----------------------------------------------------------------
	function detectUnsavedChanges(){
	
		var originalState_bool 	= unsavedChanges_bool;
		var changeObj			= new Object;
		changeObj.changes		= false;
		broadcaster.triggerEvent('pollChange',changeObj);
		
		// update state and trigger any necessary update event
		unsavedChanges_bool		= changeObj.changes;
		if(unsavedChanges_bool != originalState_bool){
			broadcaster.triggerEvent('changesDelta');
		}
	};
	//----------------------------------------------------------------
	function handleConnectionStateChange(newState_bool){
		
		connected_bool		= newState_bool;
		connected_bool? editAuth.invalidate() : editAuth.validate();
	};
	//----------------------------------------------------------------
	function bindProperty(name_str,label_str){
		
		var property		= new Property(name_str,label_str,self,editAuth);
		self[name_str]		= property;
		property.addEventListener('valueChange',detectUnsavedChanges);
	};
	//---------------------------------------------------------------
	function handleDataLoad(data_xdoc){
		
		dataLoading_bool	= false;
		broadcaster.triggerEvent('dataLoad',data_xdoc);
		broadcaster.triggerEvent('disconnect');
		loaded_bool			= true;
	};
	//----------------------------------------------------------------
	function loadData(id_str){
		
		dataLoading_bool	= true;
		EVDBServer.venue.load(handleDataLoad,id_str);
		broadcaster.triggerEvent('startDataLoad');
		broadcaster.triggerEvent('connect');
	};
	//----------------------------------------------------------------
	function handleSaveLoad(data_xdoc){
		
		saving_bool			= false;
		
		// test for success
		var error_xml		= data_xdoc.firstChild.xPathQuery('//error','firstNode');
		if(error_xml){
			alert('Saving failed plese try again.\n\nError: '+error_xml.textContent);
		}
		
		broadcaster.triggerEvent('save');
		broadcaster.triggerEvent('disconnect');
		detectUnsavedChanges();	
	};
	//----------------------------------------------------------------
	function handleSaveNewVenueLoad(data_xdoc,callback_func){
		
		saving_bool			= false;
		loaded_bool			= true;
		
		// test for success
		var outcome_bool	= true;
		if(data_xdoc.firstChild && data_xdoc.firstChild.getAttribute('status')!='ok'){
			var error_str	= data_xdoc.firstChild? data_xdoc.firstChild.textContent : '';
			alert('Saving failed plese try again\n\nError: ' + error_str);
			outcome_bool	= false;
		}
		
		var venueId_str	= data_xdoc.firstChild.xPathQuery('id','string');
		self.id.defineValue(venueId_str);
		
		broadcaster.triggerEvent('save');
		broadcaster.triggerEvent('disconnect');
		detectUnsavedChanges();	
		xEvent.handleVenueCreation(self.id.value);
	};
	//_______________________________________________________________
	this.saveNewVenue = function(callback_func){
		
		broadcaster.triggerEvent('startSave');
		saving_bool					= true;
		this.country.value			= 'Pitcairn';
		
		// get event save parameters
		var eventSaveParams_obj		= new Object();
		broadcaster.triggerEvent('beforeDataSave',eventSaveParams_obj);
		
		// send parameters to server
		broadcaster.triggerEvent('connect');
		EVDBServer.venue.saveNewVenue(handleSaveNewVenueLoad,eventSaveParams_obj,callback_func);
	};
	//_______________________________________________________________
	this.saveChanges = function(){

		broadcaster.triggerEvent('startSave');
		saving_bool					= true;
		
		// get event save parameters
		var eventSaveParams_obj		= new Object();
		broadcaster.triggerEvent('beforeDataSave',eventSaveParams_obj);
		
		// send parameters to server
		broadcaster.triggerEvent('connect');
		EVDBServer.venue.saveChanges(handleSaveLoad,eventSaveParams_obj);
	};
	//_______________________________________________________________
	this.define = function(id_str){
		
		broadcaster.triggerEvent('reset');
		this.id.defineValue(id_str);
		broadcaster.triggerEvent('define');
		
		loadData(id_str);
	};
};	//_______________________________________________________________
//___________________________________________________________________