(function() {
	var DEV = false && typeof console != 'undefined';
	
	var Dom = YAHOO.util.Dom,
		JSON = YAHOO.lang.JSON,
		Cookie = YAHOO.util.Cookie,
		Connect = YAHOO.util.Connect;
		
	var connectionSwfPath = '/typo3conf/ext/hi_feuser_lb/res/connection.swf';
		
	hilb = {
		onSubmit:function() {
			var name = this._getFormVal('user');
			var pass = this._getFormVal('pass');
			if (!name || !pass) {
				this.showError(hilbLL.errorEnterLoginPassword);
				setTimeout('hilb.showDefault()', 1000);
				return false;
			}
			
			Dom.get('lb-login-btn').disabled = 'disabled'; // prevent duplicate sending...
			this.showLoading();
			
			this.makeRequest('login');
			return false;
		},
		
		onLogoffSubmit:function() {
			Dom.get('lb-loff-btn').disabled = 'disabled'; // disable logoff button
			
			this.makeRequest('logout');
			return false;
		},
		
		showDefault:function() {
			if (Dom.get('lb-login-btn').disabled) {
				Dom.get('lb-login-btn').disabled = null;
				try { Dom.get('lb-user').focus() } catch(e){}
			}
			Dom.removeClass( Dom.get('lb-form'), 'sending');
			Dom.removeClass( Dom.get('lb-logic-loading'), 'loading');
			Dom.removeClass( Dom.get('lb-logic-error'), 'error');
		},
		showLoading:function() {
			Dom.get('lb-user').blur();
			Dom.addClass( Dom.get('lb-form'), 'sending');
			Dom.addClass( Dom.get('lb-logic-loading'), 'loading');
		},
		showError:function(msg) {
			Dom.removeClass( Dom.get('lb-logic-loading'), 'loading');
			Dom.addClass( Dom.get('lb-form'), 'sending');
			Dom.addClass( Dom.get('lb-logic-error'), 'error');
			Dom.getElementsByClassName('error-message', undefined, this.containerEl)[0].innerHTML = msg;
			try {
				Dom.get('lb-logic-error').focus();
				Dom.get('lb-logic-error-btn').focus();
			} catch(e) {}
		},
		showSuccess:function() {
			if (DEV) console.log(fec.getUserData(), 'hilb::showSuccess(): user data');
			
			Dom.get('lb-loff-btn').disabled = null; // enable logoff button (it may be previously disabled)
			
			var userData = fec.getUserData();
			Dom.get('lb-lin-username').innerHTML = userData.username;
		},
		
		makeRequest:function(type) {
			type = type=='logout' ? 'logout' : 'login';
			
			var action = function(){ Connect.asyncRequest('POST', hilb._getAjaxURL(), hilb._getCallback(type)) };
			
			Connect.setForm(Dom.get( type=='login'?'lb-form':'lb-loff-form' ));
			if (this._useXDR()) {
				Connect.xdrReadyEvent.unsubscribeAll();
				Connect.transport(connectionSwfPath);
				Connect.xdrReadyEvent.subscribe(action)
			} else {
				action();
			}
		},
		
		/**
		 * Returns YUI Connect callback for login and logout action 
		 * @param String type: login or logout
		 */
		_getCallback:function(type) {
			type = type=='logout' ? 'logout' : 'login';
			
			return {
				success: function(o) {
					if (DEV) console.log(o, type+'Callback success');
					try {
							var response = JSON.parse(o.responseText);
							
							// if (DEV) console.log(Cookie.get(FEC_DATA.cookieNameMem, {raw:true}), 'fe_memc_user cookie after '+type);
							
							// delete cookie in browser (just for sure - there are some issues with IE)
							if (type == 'logout' && response.result) {
								Cookie.remove(response.cookieOptions.name, response.cookieOptions);
							}
							
							if (response.reload)
								window.location.replace(window.location.href);
							else {
								if (response.result) {
									fec.invalidate();
								} else {
									hilb.showError(type == 'login' ? hilbLL.errorInvalidPassword : 'Logout: unrecognized error');
								}
							}
					} catch(e) {
						if (DEV) console.log(type+' exception '+e.name+': '+e.message);
						//hilb.showError(type+' exception '+e.name+': '+e.message);
						hilb.showError(type+' ERROR: '+e.name+' '+e.message+(DEV?'<br /><pre>'+o.responseText+'</pre>':''));
					}
				},
				failure: function(o) {
					if (DEV) console.log(o, type+'Callback failure');
					hilb.showError(o.statusText);
				},
				xdr: this._useXDR(),
				timeout: 5000,
				cache: false
			}
		},
		_getFormVal:function(name) {
			var el = document.getElementById('lb-'+name);
			if (!el) return '';
			return el.value;
		},
		_useXDR:function() {
			return hilbUseXDR;
		},
		_getAjaxURL:function() {
			return hilbRequestURL+'?eID=hiFeuserLb';
		}
	}
})();