Ext.ux.LoginManager = Ext.extend(Ext.util.Observable, {
	constructor: function(config) {
		this.usernameField = config.usernameField;
		this.passwordField = config.passwordField;
		this.challengeUrl = config.challengeUrl;
		
		this.addEvents({
			"beforeChallenge" : true,
	        "challengeSuccess" : true,
	        "challengeFailed" : true,
	        "beforeLogin" : true,
	        "loginSuccess" : true,
	        "loginFailed" : true
	    });	    
	    this.listeners = config.listeners;
	    
	    Ext.ux.LoginManager.superclass.constructor.call(this, config);
	},

	login: function() {
		var validate = this.usernameField.isValid;
		var uvalid = validate ? this.usernameField.isValid() : null;
		var pvalid = validate ? this.passwordField.isValid() : null;

		if(validate && (!uvalid || !pvalid)) {
			this.fireEvent("loginFailed");
		} else {
			this.logout();
			this.fireEvent("beforeChallenge");
			Ext.Ajax.request({
				url: this.challengeUrl,
				method: 'GET',
				success: this.challengeSuccess,
				failure: this.challengeFailure,
				scope: this
			});
		}
	},

	challengeSuccess: function(response) {
		var res = eval('(' + response.responseText + ')');
		this.fireEvent("challengeSuccess");
		if(res.loggedIn) {
			// shouldn't happen, since we cleared the session cookie before
			this.fireEvent("loginFailed");
		} else {
			this.fireEvent("beforeLogin");
			var username = this.usernameField.getValue();
			var password = this.passwordField.getValue();
			Ext.Ajax.request({
				url: 'j_security_check',
				params: { 'j_username': username, 'j_password': password },
				method: 'POST',
				success: this.loginRequestSuccess,
				failure: this.loginRequestFailure,
				scope: this
			});
		}
	},

	challengeFailure: function(response) {
		this.fireEvent("challengeFailed");
		this.fireEvent("loginFailed");
	},

	loginRequestSuccess: function(response) {
		var res = eval('(' + response.responseText + ')');
		if(res.loggedIn) {
			this.fireEvent("loginSuccess");
		} else {
			this.fireEvent("loginFailed");
		}
	},

	loginRequestFailure: function(response) {
		this.fireEvent("loginFailed");
	},

	logout: function() {
		Ext.util.Cookies.set('JSESSIONID', null, new Date("January 1, 1970"));
		Ext.util.Cookies.clear('JSESSIONID');
	}
});
