App.cls.User = function() {
	// private
	this.d, this.f;
	this.dCfg = { autoCreate: true, modal:true, syncHeightBeforeShow: true, width:360, height:170, resizable:false, collapsible: false, draggable:true, shadow:true };
	this.data = {};
	
	this.events = {
		'ready': true,
		'login': true,
		'logout': true
	};

	this._lookupAuth = function() {
		var lConn = new Ext.data.Connection();
		lConn.request({method: 'POST', url: 'shop.php', params: { realm: 'User', action: 'getIdentity' } });
		lConn.on('requestcomplete', function(sender, param) {
			var response = Ext.util.JSON.decode(param.responseText);
			if (response.success && response.isAuthenticated && response.data) {
				Ext.apply(this.data, response.data);
				Ext.get('auth-name').update(this.data.Login);
				this.fireEvent('login', this);
			} else {
				this.data = { Login: 'Gast', Id: 0 };
				Ext.get('auth-name').update('Gast');
				//this.fireEvent('logout', this);
			}
		}, this);
	};
    App.cls.User.superclass.constructor.call(this);
};    

Ext.extend(App.cls.User, Ext.util.Observable, {
	isReady: false,
	
	callback: null,
	
	scope: null,

	init: function() {
		// lookup if session user is authenticated
		this._lookupAuth();
		Ext.fly('auth-panel').on('click', this.showLoginDialog, this);
	},
	
	showLoginDialog: function(opts) {
		if (App.User.getIsAuthenticated()){
			if (opts && typeof opts.fn === 'function')
				return Ext.callback(opts.fn, opts.scope);
			return;
		}
		if (! this.d) {
			var login, pass;
			this.d = new Ext.BasicDialog(Ext.id(), this.dCfg);
			this.f = new Ext.form.Form({ labelWidth: 115, labelAlign: 'right', url: 'shop.php', method: 'post', baseParams: { realm: 'User', action: 'login' } });
			this.f.on('actioncomplete', this.login, this);
			// f.on('actionfailed', function(f, a) { App.info.err(a.response); });
			var l = new Ext.form.TextField({ fieldLabel: 'Login', name: 'Login', allowBlank: false });
			var p = new Ext.form.TextField({ id: 'Password', fieldLabel: 'Kennwort', name: 'Password', allowBlank: true, inputType: 'password' });
			this.f.add(l, p,
				new Ext.form.Layout({ hideLabels: true, id: 'login-text' })
			);
			this.d.addButton('Login', this.f.submit, this.f);
			this.f.render(this.d.body);
			Ext.get('login-text').update('<div class="x-form-item" style="text-align:center; cursor:pointer;">Noch nicht angemeldet? <span class="anchor" id="register">Klicken Sie hier zum Registrieren.</span></div><div class="x-form-item" style="text-align:center; cursor:pointer;">Kennwort vergessen? <span class="anchor" id="remember">Hier gehts zur Erinnerung.</span></div>');
			Ext.select('div#login-text span#register').on('click', this.register, this);
			Ext.select('div#login-text span#remember').on('click', this.remember, this);
			p.getEl().addKeyListener(Ext.EventObject.ENTER, this.f.submit, this.f);
			this.d.addKeyListener(27, this.d.hide, this.d);
			this.d.on('show', function() { this.focus(); }, l);
		}
		if (opts){
			this.callbackOpts = opts;
		}
		this.d.show();
	},
	
	register: function() {
		this.d.hide();
		App.Profile.register();	
	},
	
	remember: function() {
		this.d.hide();
		App.Profile.requestPassword();	
	},
	
	getIsAuthenticated: function() {
		return (this.data.Id && this.data.Id > 0) ? true : false;
	},

	login: function(form, action) {
		if (! action.response)
			return false;
		var r = Ext.util.JSON.decode(action.response.responseText);
		if (r.success && r.isAuthenticated) {
			Ext.apply(this.data, r.data);
			App.info.msg('Nachricht', this.data.Login + ' eingeloggt');
			Ext.get('auth-name').update(this.data.Login);
			if (this.d) this.d.hide();
			this.fireEvent('login', this);
			var o = this.callbackOpts
			if (o && typeof o.fn === 'function'){
				Ext.callback(o.fn, o.scope);
			}
			this.callbackOpts = null;
		}
		else{
			this.fireEvent('logout', this);
			App.info.msg('Warnung', r.errorMessage);
		}
	},

	logout: function() {
		var lConn = new Ext.data.Connection();
		lConn.request({method: 'POST', url: 'shop.php', params: { realm: 'User', action: 'logout' } });
		lConn.on('requestcomplete', function(sender, param) {
			var r = Ext.util.JSON.decode(param.responseText);
			if (r.success) {
				if (r.Log && r.Log.length)
					App.info.msg('Warnung', r.Log[0]);
				this.data = {};
				App.info.msg('Nachricht', 'Ausgeloggt');
				Ext.get('auth-name').update('Gast');
				App.Basket.init();
				this.fireEvent('logout', this);
				if (this.f) this.f.reset();
			}
		}, this);
	},

	getData: function() {
		return this.data;
	}
});

App.User = new App.cls.User();

Ext.onReady(App.User.init, App.User, true);

