﻿var AjaxCssButton = new Class(
{
	initialize: function()
	{
		this.typeID = "cssBtn";
		this.activeItems = {};
		this.groups = {};
		this.groupNames = [];

		ui.registerCleanupHandler(this.filterGroups);
		uiDialog.registerPreInitHandler(this.typeID, this.preInit);
		uiDialog.registerInitHandler(this.typeID, this.init);
	},

	preInit: function(control, clientData)
	{
		var data =
		{
			"mouseOver": false,
			"activated": false
		};

		$extend(data, clientData["cssBtn"]);

		control.store("cssBtn_data", data);

		if (data.group != '')
		{
			if (ajaxCssButton.groups[data.group] == null)
			{
				ajaxCssButton.groups[data.group] = [];
				ajaxCssButton.groupNames.push(data.group);
			}

			ajaxCssButton.groups[data.group].push(control);
		}

		control.addEvent('mouseenter', ajaxCssButton.onMouseEnter);
		control.addEvent('mouseleave', ajaxCssButton.onMouseLeave);
		control.addEvent('activate', ajaxCssButton.activate);
		control.addEvent('deactivate', ajaxCssButton.deactivate);
		control.addEvent('click', ajaxCssButton.onClick);
	},

	init: function(control, clientData)
	{
		var data = control.retrieve("cssBtn_data");

		if (data == null)
		{
			return;
		}

		if (data.selected)
		{
			control.fireEvent("activate", [control, true]);
		}
	},

	filterGroups: function(rootElement)
	{
		var filteredGroups = {};
		var filteredGroupNames = [];

		for (var i = 0; i < ajaxCssButton.groupNames.length; i++)
		{
			var groupName = ajaxCssButton.groupNames[i];
			var group = ajaxCssButton.groups[groupName];
			var filteredGroup = [];

			for (var c = 0; c < group.length; c++)
			{
				var groupEl = group[c];
				if (!rootElement.hasChild(groupEl))
				{
					filteredGroup.push(groupEl);
				}
			}

			if (filteredGroup.length > 0)
			{
				filteredGroups[groupName] = filteredGroup;
				filteredGroupNames.push(groupName);
			}
		}

		ajaxCssButton.groups = filteredGroups;
		ajaxCssButton.groupNames = filteredGroupNames;
	},

	onMouseEnter: function(isFollowUp)
	{
		var data = this.retrieve("cssBtn_data");

		if (data == null || data.mouseOver || data.activated)
		{
			return;
		}

		data.mouseOver = true;

		this.set("class", data.cssH);

		var group = ajaxCssButton.groups[data.group];

		if (group != null && data.triggerEnter)
		{
			for (var i = 0; i < group.length; i++)
			{
				group[i].fireEvent("mouseenter");
			}
		}
	},

	onMouseLeave: function()
	{
		var data = this.retrieve("cssBtn_data");

		if (data == null || !data.mouseOver || data.activated)
		{
			return;
		}

		data.mouseOver = false;

		this.set("class", data.css);

		var group = ajaxCssButton.groups[data.group];

		if (group != null && data.triggerLeave)
		{
			for (var i = 0; i < group.length; i++)
			{
				group[i].fireEvent("mouseleave");
			}
		}
	},

	deactivate: function(cssButton, updateGroup)
	{
		var data = cssButton.retrieve("cssBtn_data");

		if (data == null || !data.activated)
		{
			return;
		}

		data.activated = false;

		cssButton.set("class", data.css);

		if (updateGroup && data.group != "")
		{
			var group = ajaxCssButton.groups[data.group];

			for (var i = 0; i < group.length; i++)
			{
				group[i].fireEvent("deactivate", [group[i], false]);
			}
		}
	},

	activate: function(cssButton, updateGroup)
	{
		var data = cssButton.retrieve("cssBtn_data");

		if (data == null || data.activated)
		{
			return;
		}

		if (updateGroup)
		{
			var lastActiveItem = ajaxCssButton.activeItems[data.section];

			if (lastActiveItem != null)
			{
				lastActiveItem.fireEvent("deactivate", [lastActiveItem, true]);
			}
		}

		data.activated = true;

		cssButton.set("class", data.cssA);

		if (updateGroup)
		{
			ajaxCssButton.activeItems[data.section] = cssButton;

			if (data.group)
			{
				var group = ajaxCssButton.groups[data.group];

				for (var i = 0; i < group.length; i++)
				{
					group[i].fireEvent("activate", [group[i], false]);
				}
			}
		}
	},

	onClick: function()
	{
		var data = this.retrieve("cssBtn_data");

		if (data == null || data.section == "")
		{
			return;
		}

		ajaxCssButton.activate(this, true);
	}
});

var ajaxCssButton = new AjaxCssButton();
