
// Definition de la classe 'ActionBar'
// NB: L'ordre des methodes est important
function ActionBar(id)
{
	// Proprietes publiques
	this.Id = id;
	this.HtmlObject = $("#" + id);
	this.Details = $("#" + id + "Details");

	// Evenements publics
	this.MouseEnter = new Array();
	this.MouseOut = new Array();
	this.ItemMouseEnter = new Array();

	// Champs et methodes privees
	var _this = this;
	var _datas = eval("actionBar_" + id + "_datas");
	var _title = $("#" + id + "Title");
	var _desc = $("#" + id + "Description");
	var _hasFocus = false;
	var _maxDetailsLeft = 0;
	var _toReplace = new Array();
	var _applicationPath = eval("applicationPath");
	
	// Valeurs pour le clignotement des actions
	var _blinkCount = 5, _blinkSpeed = 200;
	
	var GetItemDatas = function(itemId)
	{
		for (var i = 0; i < _datas.length; i++)
			if (_datas[i].Id == itemId)
				return _datas[i];
		return null;
	}
	
	var OnMouseOut = function()
	{
		_this.HtmlObject.css("z-index", "0");
		
		if (_hasFocus == false)
			return ;
		_hasFocus = false;
		
		_this.Details.css("visibility", "hidden");
		_this.HtmlObject.find("td").stop().fadeTo(500, 1.0);

		Tools_DispatchEvent(_this.MouseOut, _this, null);
	}
	
	var OnItemClick = function(itemId)
	{
		var datas = GetItemDatas(itemId);
		if (datas == null)
			return ;

		// ARA: Paie ta bidouille !
		// Met à jour l'URL présent dans le script avant son exécution
		var script = datas.OnClick;
		if (_toReplace.length > 0)
		{
			var urlStart = script.indexOf("'" + _applicationPath);
			if (urlStart != -1)
			{
				var urlEnd = script.indexOf("'", urlStart + 1);
				if (urlEnd != -1)
				{
					var url = script.substring(urlStart, urlEnd);
					var parsedUrl = Tools_ParseUrl(url);
					for (var i = 0; i < _toReplace.length; i++)
					{
						var item = _toReplace[i];
						parsedUrl.Params[item.Name] = item.Value;
					}
					var newUrl = Tools_GetUrl(parsedUrl.Root, parsedUrl.Params);
					script = script.replace(url, newUrl);
				}
			}
		}

		eval(script);
	}

	var OnItemMouseEnter = function(itemId)
	{
		Tools_DispatchEvent(_this.MouseEnter, _this, null);
	
		_this.HtmlObject.css("z-index", "999");
	
		var datas = GetItemDatas(itemId);
		if (datas != null)
		{
			_title.html(datas.Title);
			_desc.html(datas.Description);
			
			var left = $("#" + itemId).position().left;
			
			// On calcule l'abscisse maximale de la description
			// pour qu'elle se cogne au bord droit de la fenêtre
			var maxLeft = Infinity;
			var last = _this.HtmlObject.find(".ActionBarItem:last");
			if (last.length > 0)
				 maxLeft = last.position().left + last.width() - _this.Details.width() - 1;

			_this.Details.css("left", Math.min(left, maxLeft));
			
			_this.Details.css("visibility", "visible");
			_this.HtmlObject.find("#" + itemId).stop().css("opacity", 1.0);
			_this.HtmlObject.find("td:not(#" + itemId + ")").stop().fadeTo(500, 0.5);
		}
		
		Tools_DispatchEvent(_this.ItemMouseEnter, _this, { ItemId : itemId });
				
		if (_hasFocus)
			return ;
		_hasFocus = true;

		
	}
	
	var IndexOf = function(name)
	{
		for (var i = 0; i < _toReplace.length; i++)
			if (_toReplace[i].Name == name)
				return i;
		return -1;
	}
	
	this.SetParameter = function(name, value)
	{
		var index = IndexOf(name);
		if (index < 0)
			_toReplace.push({ Name: name, Value: value });
		else
			_toReplace[index].Value = value;
	}
	
	// Supprime toutes les actions sauf celles dont
	// l'id apparait dans la liste passée en paramètre
	this.RemoveAllActions = function(except)
	{
		_this.HtmlObject.find(".ActionBarItem").each(function()
		{
			if (Tools_Contains(except, $(this).attr("id")))
				return ;
			
			// Regarde s'il ya un séparateur associé à enlever
			var next = $(this).next();
			if (next.length > 0 && next.attr("class") == "ActionBarSeparator")
				next.fadeOut("slow", function() { $(this).remove() });
			$(this).fadeOut("slow", function() { $(this).remove() });
		});
	}
	
	// Wow ! Je devrai déposer un brevet ;-)
	var Blink = function(item, max, count)
	{
		var c = count ? count : 0;
		if (c < max)
			item.fadeOut(_blinkSpeed, function()
			{
				item.fadeIn(_blinkSpeed, function()
				{
					Blink(item, max, c + 1)
				})
			});
	}

	this.OnLoad = function()
	{
		_this.HtmlObject.find(".ActionBarItems").hover(null, OnMouseOut);
		_this.HtmlObject.find(".ActionBarItem").each(function()
		{
			var item = $(this);
			var itemId = this.id;
			
			item.hover(function() { OnItemMouseEnter(itemId) });
			item.click(function() { OnItemClick(itemId) });

			// Fait clignoter l'action si la barre le demande
			// NB: Cette fonctionnalité est désactivée sur IE8 puisqu'il ne supporte
			// pas les fondus sur les éléments avec un "position: relative"...
			if (document.body.className.indexOf("IE8") < 0)
			{
				var datas = GetItemDatas(itemId);
				if (datas != null && datas.Blink)
					Blink(item, _blinkCount);
			}
		});
	}
}

