
namespace ('Statelets');


//-------------------------------------------------/ Statelets.Base /-

Statelets.Base = function () {
};

Statelets.Base.prototype = {
	destroy: function () {	},
	getHTMLRoot: function () {	}
};


//---------------------------------------------/ Statelets.Throbber /-

Statelets.Throbber = function () {
	this.statelet = HTML.createDiv ('statelet-throbber');
	this.throbber = HTML.createDiv ('throbber');

	HTML.add (this.statelet, this.throbber);
	this.deactivate ();
};

Statelets.Throbber.prototype = new Statelets.Base ();

Statelets.Throbber.prototype.getHTMLRoot = function () {
	return this.statelet;
};

Statelets.Throbber.prototype.activate = function () {
	HTML.setClass (this.throbber, 'throbber active');
};

Statelets.Throbber.prototype.deactivate = function () {
	HTML.setClass (this.throbber, 'throbber inactive');
};

Statelets.Throbber.prototype.error = function () {
	HTML.setClass (this.throbber, 'throbber error');
};


//-------------------------------------------------/ Statelets.Help /-

Statelets.Help = function () {
	this.statelet = new Shards.IconTooltip ('statelet-help', '6EDB::801::6EDB::2785', '', '');
	this.statelet.setVisible (false);
};

Statelets.Help.prototype = new Statelets.Base ();

Statelets.Help.prototype.destroy = function () {
	this.statelet.destroy ();
};

Statelets.Help.prototype.setText = function (msg) {
	this.statelet.setText (msg);
	this.statelet.setVisible (!!msg);
};

Statelets.Help.prototype.getHTMLRoot = function () {
	return this.statelet.element;
};


//----------------------------------------------/ Statelets.Message /-

Statelets.Message = function () {
	this.statelet = HTML.createDiv ('statelet-message');
	this.message = HTML.createTextNode ('');

	HTML.add (this.statelet, this.message);
};

Statelets.Message.prototype = new Statelets.Base ();

Statelets.Message.prototype.getHTMLRoot = function () {
	return this.statelet;
};

Statelets.Message.prototype.setMessage = function (message) {
	HTML.setTextContent (this.message, message);
};


//---------------------------------------/ Statelets.Authentication /-

Statelets.Authentication = function (session) {
	this.session = session;
	this.authenticated = false;
	this.statelet = HTML.createDiv ('statelet-authentication');
	this.auth = HTML.createDiv ('');
	HTML.add (this.statelet, this.auth);
	this.popup = new Shards.Popup (this.statelet, Shards.Popup.Kinds.Click, Shards.Popup.Anchors.Center, Shards.Popup.Directions.Left + Shards.Popup.Directions.Down);
	this.popup.onOpening = callback (this, this.onPopupOpening);
	this.popup.onContent = callback (this, this.onPopupContent);
	this.popup.onClosed = callback (this, this.onPopupClosed);
};

Statelets.Authentication.prototype = new Statelets.Base ();

Statelets.Authentication.prototype.destroy = function ()  {
	this.popup.destroy ();
};

Statelets.Authentication.prototype.onPopupOpening = function () {
	if (!this.canimpersonate) {
		if (this.authenticated) {
			new Request.LogOff (this.session, true).send ();
		} else {
			new Request.Callback (this.session, callback (this, this.logon)).send ();
		}
		return false;
	}
	return true;
};

Statelets.Authentication.prototype.onPopupContent = function () {
	if (this.impersonatee) {
		this.menu = new Shards.Menu ()
			.addItem ('Log off ' + this.user, callback (this, this.onMenuLogOff))
			.addItem ('End impersonation (' + this.impersonatee + ')', callback (this, this.onMenuEndImpersonate));
	} else if (this.canimpersonate) {
		this.menu = new Shards.Menu ()
			.addItem ('Log off ' + this.user, callback (this, this.onMenuLogOff))
			.addItem ('Impersonate', callback (this, this.onMenuImpersonate));
	}
	return this.menu.element;
};

Statelets.Authentication.prototype.onPopupClosed = function () {
	this.menu.destroy ();
	this.menu = null;
};

Statelets.Authentication.prototype.onMenuLogOff = function () {
	this.popup.close ();
	new Request.LogOff (this.session, true).send ();
};

Statelets.Authentication.prototype.onMenuImpersonate = function () {
	this.popup.close ();
	new Request.Callback (this.session, callback (this, this.impersonate)).send ();
};

Statelets.Authentication.prototype.onMenuEndImpersonate = function () {
	this.popup.close ();
	new Request.LogOff (this.session, false).send ();
};

Statelets.Authentication.prototype.getHTMLRoot = function () {
	return this.statelet;
};

Statelets.Authentication.prototype.openFrame = function (name, registerinfo) {
	var session = this.session;
	session.queue.pause ();
	var onregister = function () {
		return registerinfo;
	};
	var oncomplete = function () {
		session.queue.clear ();
		session.queue.unpause ();
		new Request.Meta (session).send ();
	};
	var oncancel = function(){
		session.queue.unpause ();
	};
	Frames.open (session, name, onregister, oncomplete, oncancel);
};

Statelets.Authentication.prototype.logon = function () {
	if (!this.session.authenticated) {
		this.openFrame ('login', {'newaccount': !!this.newaccount, 'recoverpassword': !!this.recoverpassword });
	}
};

Statelets.Authentication.prototype.impersonate = function () {
	this.openFrame ('impersonate', {});
};

Statelets.Authentication.prototype.setAuthenticated = function (user, impersonatee, canimpersonate, newaccount, recoverpassword) {
	var authenticated = !!user;
	this.user = user;
	this.impersonatee = impersonatee;
	this.canimpersonate = canimpersonate;
	this.newaccount = newaccount;
	this.recoverpassword = recoverpassword;
	if (authenticated != this.authenticated) {
		this.authenticated = authenticated;
		HTML.setClass (this.auth, (authenticated ? 'authenticated' : ''));
	}
	HTML.setAttribute (this.statelet, 'title', (authenticated ? (this.canimpersonate ? '' : 'Log off ') + user + (this.impersonatee ? ' (' + this.impersonatee + ')' : ''): 'Log on'));
};



//---------------------------------------------/ Statelets.Settings /-

Statelets.Settings = function (session) {
	this.session = session;
	this.statelet = HTML.createIcon ('statelet-settings', Framework.imageUrl ('6EDB::801::6EDB::3894'));
	HTML.setAttribute (this.statelet, 'title', 'My settings');
	HTML.addOnClickHandler (this.statelet, this, 'onClick');
};

Statelets.Settings.prototype = new Statelets.Base ();

Statelets.Settings.prototype.destroy = function () {
	HTML.removeOnClickHandler (this.statelet);
};

Statelets.Settings.prototype.getHTMLRoot = function () {
	return this.statelet;
};

Statelets.Settings.prototype.onClick = function () {
	new Request.Settings (this.session).send ();
};
