//__________________________________________________________________
EVDB.User = function (){
	
	var self					= this;
	var evdbAppKey_str			= 'mCzrkKSxK43TMhtN';
	var evdbURL_str				= 'http://api.evdb.com';
	var evdbProxyURL_str		= '/remote_proxy.php';
	var nonce_str;
	var user_str;
	var userKey_str;
	
	// setup event broadcaster
	var broadcaster				= new Broadcaster(this);
	broadcaster.createEventType('nonceLoad');
	broadcaster.createEventType('login');
	broadcaster.createEventType('logout');
	broadcaster.createEventType('connect');
	broadcaster.createEventType('disconnect');
	
	this.__defineGetter__('loggedIn',function(){return userKey_str? true : false;});
	this.__defineGetter__('username',function(){return user_str;});
	
	//---------------------------------------------------------------
	function createXRequest(loadHandler_func,params_rst){
		
		// add application key to parameters
		if(!params_rst){
			params_rst			= new REST();
		};
		params_rst.p.app_key	= evdbAppKey_str;
		
		// build both the proxy URL and the ultimate EVDB URL
		var path_str			= params_rst.pathString;
		var targetURL_str		= evdbURL_str+path_str+'?'+params_rst.queryString;
		var proxyURL_str		= evdbProxyURL_str+'?url='+encodeURIComponent(targetURL_str);
		
		// package and despatch request
		var request				= new XRequest(proxyURL_str,params_rst.XMLString);
		request.externalLoadHandler	= loadHandler_func;
		request.addEventListener('load',handleRequestLoad);
		request.despatch();
	};
	//---------------------------------------------------------------
	function handleRequestLoad(xRequest){
		
		xRequest.externalLoadHandler(xRequest.data_xdoc);
	};
	//---------------------------------------------------------------
	function handleNonceRequest(data_xdoc){
		
		nonce_str				= data_xdoc.firstChild.xPathQuery('nonce','string');
		if(nonce_str){
			broadcaster.triggerEvent('nonceLoad');
		}else{
			throw new Error('Nonce failed to load');
		}
	};
	//---------------------------------------------------------------
	function handleLoginLoad(data_xdoc){
		
		broadcaster.triggerEvent('disconnect');
		userKey_str				= data_xdoc.firstChild.xPathQuery('user_key','string');
		if(userKey_str){
			broadcaster.triggerEvent('login');
		}else{
			alert('Login failed. Please try again');
		}
	};	
	//________________________________________________________________
	this.bindConnectionStateToAttribute = function(element_h,attribute_str){
		
		self.addEventListener('connect',function(){element_h.setAttribute(attribute_str,true);});
		self.addEventListener('disconnect',function(){element_h.setAttribute(attribute_str,false);})
	};
	//_______________________________________________________________
	this.loadNonce = function(){
	
		var params_rst			= new REST('/rest/users/login');
		var nonceRequest		= createXRequest(handleNonceRequest,params_rst);
	};
	//_______________________________________________________________
	this.logout = function(){
		
		userKey_str				= null;
		user_str				= null;
		broadcaster.triggerEvent('logout');
	};
	//_______________________________________________________________
	this.login = function(user_str_arg,password_str){
		
		if(nonce_str){
			// store username and encrypt password request
			user_str			= user_str_arg;
			var response_str	= MD5.hex(nonce_str+':'+MD5.hex(password_str.toLowerCase())).toLowerCase();
			
			var params_rst		= new REST('/rest/users/login');
			params_rst.p.user	= user_str;
			params_rst.p.nonce	= nonce_str;
			params_rst.p.response	= response_str;
			broadcaster.triggerEvent('connect');
			createXRequest(handleLoginLoad,params_rst);
		}else{
			throw new Error('Login failed. Nonce not yet loaded');
		}
	};
	//_______________________________________________________________
	this._call = createXRequest;
	//_______________________________________________________________
	this._authCall = function(loadHandler_func,params_rst){
		
		var privateParams_rst			= params_rst;
		privateParams_rst.p.user		= user_str;
		privateParams_rst.p.user_key 	= userKey_str;
		createXRequest(loadHandler_func,params_rst);
	};
};	//_______________________________________________________________
//___________________________________________________________________