/**
 * Controls the activeuser
 */
var ActiveUser = function(){
	var _baseElm;
	var _settings = {};
	var _openid;
	var _login;

	var self = {
		/**
		 * Setup the activeuser
		 * @param {DOMelement} baseElm
		 */
		setup: function(baseElm, settings) {
			_baseElm = jQuery(baseElm);
			_settings = {
				logout_url: settings.logout_url || '/?message=logged_out'
			};

			// catch logout clicks
			jQuery('.logout').click(self.handleLogoutClick);

			// catch login submits
			_baseElm.find('form.login').bind('submit', self.handleLoginSubmit);


			_login = _baseElm.find('form.login');
			_login.find('.toggle').click(self.showOpenID);
			_openid = _baseElm.find('form.openid');
			_openid.find('.toggle').click(self.showLogin);
		},

		showOpenID: function(e) {
			e.preventDefault();
			_login.hide();
			_openid.show();
		},

		showLogin: function(e) {
			e.preventDefault();
			_login.show();
			_openid.hide();
		},

		/**
		 * Handle a login submit event
		 * @param {DOMevent} event
		 */
		handleLoginSubmit: function(event) {
			event.preventDefault();

			// enter 'submitting' state
			self.exitShowResultState();
			self.enterSubmittingState();

			var credentials = {
				username: _baseElm.find('input[name=username]').val(),
				password: _baseElm.find('input[name=password]').val(),
				staylogged: _baseElm.find('input[name=staylogged]').attr('checked')
			};

			jQuery.ajax({
					url: '/app/activeuser/session/',
					type: 'POST',
					dataType : 'json',
					data: credentials,
					success : function(response, textStatus){
						var message;
						switch(response.result) {
						case 'success':
							location.replace(location.href);
							break;

						case 'invalid_credentials':
							self.setResultMessage('Your username or password were incorrect. Please try again.', 'error');
							self.enterShowResultState();
							break;

						default:
							self.setResultMessage('An error occurred and we couldn\'t log you in :(', 'error');
							self.enterShowResultState();
							break;
						}
					},
					error : function(x, txt, e){
						console.error(x, txt, e);
					},
					complete : function() {
						// exit 'submitting' state
						self.exitSubmittingState();
					}
					});
			return false;
		},

		/**
		 * Handle a click on the logout button
		 * @param {DOMevent} event
		 */
		handleLogoutClick: function(event) {
			event.preventDefault();

			jQuery.ajax({
					url: '/app/activeuser/logout/',
					type: 'POST',
					dataType : 'json',
					success : function(response, textStatus){

						var message;
						switch(response.result) {
						case 'success':
							location.replace(_settings.logout_url);
							break;

						default:
							// enter 'showresult' state
							self.setResultMessage('An error occurred and we couldn\'t log you out :(');
							self.enterShowResultState();
							break;
						}
					},
					error : function(x, txt, e){
						console.error(x, txt, e);
					},
					complete : function() {

					}
				});

			return false;
		},

		/**
		 * Show that the form is being submitted
		 */
		enterSubmittingState: function() {
			_baseElm.find('.feedback').text('Loggin In...');
			_baseElm.addClass('submitting');
		},

		/**
		 * Show that the form is no longer being submitted
		 */
		exitSubmittingState: function() {
			_baseElm.removeClass('submitting');
		},

		/**
		 * Show the result of a form submission
		 */
		enterShowResultState: function() {
			_baseElm.addClass('showresult');
		},

		/**
		 * Hide the result of a form submission
		 */
		exitShowResultState: function() {
			_baseElm.removeClass('showresult');
		},

		/**
		 * Set the result message
		 * @param {string} message
		 */
		setResultMessage: function(message, type) {
			_baseElm.find('.result')
				.text(message)
				.attr('class', 'result '+(type || ''));
		}
	};

	return self;
}();
