﻿var Realm = new Class(
{
	initialize: function()
	{
		this.typeID = "realm";
		this.dataID = "realm_data";
		this.instances = [];

		ui.registerResizeHandler(this.resizeInstances);
		ui.registerCleanupHandler(this.removeInstances);
		ui.registerCommandHandler("addRealmElement", this.addRealmElement);

		uiDialog.registerInitHandler(this.typeID, this.init);
	},

	onMouseWheel: function(e)
	{
		//e = new Event(e);
		var data = this.retrieve(realm.dataID);

		if (e.wheel < 0)
		{
			realm.previous(data);
		}
		else
		{
			realm.next(data);
		}
	},

	init: function(control, clientData)
	{
		var data = {
			"instance": control,
			"elements": [],
			"position": 0,
			"effectX": new Fx.Morph(control,
			{
				"duration": 600,
				"link": "cancel",
				"transition": Fx.Transitions.Quart.easeOut
			})
		};

		$extend(data, clientData[realm.typeID]);

		realm.instances.push(data);
		control.store(realm.dataID, data);

		control.setStyle("position", "relative");
		control.setStyle("left", -data.spacingX);

		control.addEvent('mousewheel', realm.onMouseWheel);

		//control.setStyle("overflow", "hidden");
	},

	removeInstances: function(rootElement)
	{
		var filteredInstances = [];

		for (var i = 0; i < realm.instances.length; i++)
		{
			var instanceData = realm.instances[i];

			if (instanceData != null && !rootElement.hasChild(instanceData.instance))
			{
				filteredInstances.push(instanceData);
			}
		}

		realm.instances = filteredInstances;
	},

	addRealmElement: function(command)
	{
		var data = command.Data;
		var realmEl = $(data.realmID);

		if (realmEl == null)
		{
			return;
		}

		var realmData = realmEl.retrieve(realm.dataID);

		var elIndex = realmData.elements.length;

		var pnlEl = new Element("div", { "id": elIndex });
		realmData.elements.push(pnlEl);
		realmEl.adopt(pnlEl);

		pnlEl.setStyle("position", "relative");
		pnlEl.setStyle("float", "left");

		if (elIndex > -1)
		{
			pnlEl.setStyle("padding-left", realmData.spacingX);
		}

		pnlEl.set("html", data.elementHtml);

		var elDialog = pnlEl.getFirst();

		if (elDialog != null)
		{
			uiDialog.init(elDialog, data.clientData);
		}

		if (data.initCommands && data.initCommands.length > 0)
		{
			ui.processSubCommands(data.initCommands);
		}

		realm.resize(realmData);
		realm.slideTo(realmData, elIndex);
	},

	slideTo: function(realmData, position)
	{
		if (position < 0 || position >= realmData.elements.length)
		{
			return;
		}

		var elControl = realmData.elements[position];

		if (elControl == null)
		{
			return;
		}

		var realmParent = realmData.instance.getParent();

		var elSize = elControl.getSize();
		var parentSize = realmParent.getSize();
		var parentPos = realmParent.getPosition();

		var widthLeft = realm.getCombinedWidth(realmData, position);
		var spaceLeft = (parentSize.x - elSize.x);

		var currentLeft = realmData.instance.getStyle("left").toInt();

		if (parentSize.x == 0)
		{
			parentSize.x = 900;
		}

		//var newLeft = -1 * (widthLeft) + (parentSize.x - elSize.x + realmData.spacingX);
		var newLeft = -1 * (widthLeft);

		//		if (el > parentSize.x)
		//		{
		//			newLeft = -1 * (parentSize.x - widthLeft);
		//		}
		//		else
		//		{
		//			newLeft = -1 * (widthLeft);
		//		}

		//		if ((newLeft + realmData.spacingX) < 0)
		//		{
		//			newLeft = -1 * realmData.spacingX;
		//		}

		realmData.position = position;

		realmData.effectX.start({
			"left": [currentLeft, newLeft]
		});
	},

	previous: function(realmData)
	{
		realm.slideTo(realmData, realmData.position - 1);
	},

	next: function(realmData)
	{
		realm.slideTo(realmData, realmData.position + 1);
	},

	resizeInstances: function()
	{
		for (var i = 0; i < realm.instances; i++)
		{
			realm.resize(realm.instances[i]);
		}
	},

	getCombinedWidth: function(realmData, position)
	{
		var width = realmData.spacingX;

		for (var i = 0; i < position; i++)
		{
			var elWidth = realmData.elements[i].getSize().x;
			width += elWidth;
		}

		return width;
	},

	resize: function(realmData)
	{
		var width = realm.getCombinedWidth(realmData, realmData.elements.length);
		realmData.instance.setStyle("width", width);
	}
});

var realm = new Realm();
