function TourLiveAtData(_id, _properties) {
	if (!(this instanceof TourLiveAtData)) { return new TourLiveAtData(); }
	
	var id;
	var dataUrl;
	var data;
	var dataId;
	var cObservers;
	var dataPopulated;
	var DATA_ID_ATTRIBUTE_NAME = "dataRefId";
	var runAutoPopulateMode;
	var initialDataLoadComplete;
	var errorCode;
	var errorMsg;
	var fl_useDefaultPollPeriod;
	var defaultPollPeriod;
	var nextPollTime;
	
	init();
	
	function init() {
		// INITIALIZE VARIABLES FROM PROPERTIES FILE
		setDataUrl(_properties.datasrc);
		setDefaultPollPeriod(_properties.defaultPollPeriod);
		setUseDefaultPollPeriod(_properties.useDefaultPollPeriod);

		// INITIALIZE LOCAL VARIABLES
		cObservers = new Array();
		runAutoPopulateMode = true;
		initialDataLoadComplete = false;
		setId(_id);
		errorCode = 0; //neutral
		errorMsg = ""; //no message;
		nextPollTime = 0;
	} 
	
	function setId(_id) {
		id = _id;
	}
	
	function setDataUrl(_dataUrl) {
		dataUrl = _dataUrl;
	}
	
	function setDataId(_dataId) {
		dataId = _dataId.documentElement.getAttribute(DATA_ID_ATTRIBUTE_NAME);
	}
	
	function getDataId() {
		return dataId;
	}
	
	function setData(_data) {
		if (data == null) { initialDataLoadComplete = true; }
		data = _data; // expects XML Data Only.
		setDataId(data);
	}
	
	function notifyObservers(_code) {
		var code_;
		var data_;
		
		code_ = (_code)? _code : 0;
		data_ = (code_ == -1)? errorMsg : data;
		
		for (var i = 0; i < cObservers.length; i++) {
			cObservers[i].notify(getDataId(), id, data_, code_);
		}
	}
	
	function clearError() {
		errorCode = 0;
		errorMsg = "";
	}
	
	function setError(_msg) {
		errorCode = -1;
		errorMsg = _msg;
	}
	
	function setDefaultPollPeriod(_defaultPollPeriod) {
		defaultPollPeriod = (_defaultPollPeriod)? _defaultPollPeriod : 0;
	}
	
	function setUseDefaultPollPeriod(_useDefaultPollPeriod) {
		fl_useDefaultPollPeriod = (_useDefaultPollPeriod == 0)? false : true;
	}
	
	function isUsingDefaultPollPeriod() {
		return fl_useDefaultPollPeriod;
	}
	
	function canRetrieveData() {
		var currTime = new Date().getTime();
		var fl_canRetrieveData_ = false;

		if (nextPollTime == 0 || (nextPollTime - currTime) <= 0) {
			fl_canRetrieveData_ = true;
			nextPollTime = currTime + getDefaultPollPeriod();
		}
		return fl_canRetrieveData_;
	}
	
	function getDefaultPollPeriod() {
		return defaultPollPeriod;
	}
	
	this.setRunAutoPopulateMode = function(_boolean) {
		runAutoPopulateMode = _boolean;
	}
	
	this.isInitialDataLoadComplete = function() {
		return initialDataLoadComplete;
	}
	
	this.isRunningAutoPopulateMode = function() {
		return runAutoPopulateMode;
	}
	
	this.retrieveData = function() {
		var params = "datarefid=" + getDataId();
		if (isUsingDefaultPollPeriod() && !canRetrieveData()) {
			notifyObservers(); // do not rretrieve data.
			return;
		}
		
		new Ajax.Request(this.getDataUrl(), {
			onSuccess : function(_response) {
				setData(_response.responseXML);
				clearError();
				notifyObservers();
			},
			onFailure : function(_response) {
				setError(_response.responseText);
				notifyObservers(-1);
			},
			parameters : params
		});
	}
	
	this.getId = function() {
		return id;
	}
	
	this.addObserver = function(_observerRef) {
		cObservers[cObservers.length] = _observerRef;
	}
	
	this.getDataUrl = function() {
		return dataUrl;
	}
	
	this.getData = function() {
		return data;
	}
	
	this.setDataUrlFromExtSrc = function(_dataUrl) {
		setDataUrl(_dataUrl);
	}
}