
// Definition de la classe 'SideTabs'
// NB: L'ordre des methodes est important
function SideTabs(id)
{
	// Proprietes publiques
	this.Id = id;
	this.HtmlObject = $("#" + id);

	// Evenements publics
	this.SelectionChanged = new Array();	// Arguments: string ItemId

	// Champs et methodes privees
	var _this = this;
	var _history = new Object();
	var _ie = ($(document.body).attr("class") == "IE6" || $(document.body).attr("class") == "IE7" || $(document.body).attr("class") == "IE8");
	var _metadatas = eval(id + "_datas");
	
	this.GetMetadatas = function(itemId)
	{
		if (_metadatas && itemId)
			for (var i = 0; i < _metadatas.length; i++)
			{
				var metas = _metadatas[i];
				if (metas.Id == itemId)
					return metas;
			}
		return null;
	}
	
	var GetImageSource = function(item, img)
	{
		var source = img.attr("src");
		
		if ($(document.body).attr("class") == "IE6")
		{
			var toFind = "AlphaImageLoader(src='";
			var html = item.html();
			var start = html.lastIndexOf(toFind);
			if (start >= 0)
			{
				start += toFind.length;
				var end = html.substring(start).indexOf("'");
				source = html.substring(start, start + end);
			}
		}
		
		return source;
	}
		
	var GetImageDatas = function(item)
	{
		var img = item.find(".TextImage:first");
		var source = GetImageSource(item, img);
		return { Image: img.get(0), Source: source, Alt: img.attr("alt"), Params: Tools_GetQueryParams(source, $(document.body).attr("class") != "IE6") };
	}

	var UpdateImage = function(item, datas, urlRoot)
	{
		var currentImage = item.find(".TextImage");
		var ie6 = ($(document.body).attr("class") == "IE6");
		var filterableImage = ie6 && currentImage.attr("class").indexOf("NoFilter") < 0;
				
		var url = Tools_GetUrl(urlRoot, datas.Params);
		var s = '<img class="' + currentImage.attr("class") + '" alt="' + datas.Alt + '" '
					+ 'width="' + currentImage.width() + 'px" '
					+ 'height="' + currentImage.height() + 'px" '
					+ (filterableImage ? 'style="visibility:hidden"' : 'src="' + url + '"')
					+ ' />';

		var parent = currentImage.parent();
		currentImage.remove();
		parent.html(s);

		if (filterableImage)
		{
			var image = item.find(".TextImage:last");
			image.load(function()
			{
				doFix(image.get(0), true);
				image.css("visibility", "visible");
			});
			image.attr("src", url);
		}
	}

	var ItemClick = function(item)
	{
		if (item.attr("class").indexOf("Deselected") < 0)
			return ;
				
		// Change les classes
		var current = _this.HtmlObject.find(".SideTabSelected");
		current.attr("class", current.attr("class").replace("Selected", "Deselected"));
		item.attr("class", item.attr("class").replace("Deselected", "Selected"));
		
		// Switch les parametres de l'image...
		var currentDatas = GetImageDatas(current);
		var thisDatas = GetImageDatas(item);
		var thisShadow = thisDatas.Params.Shadow;
		thisDatas.Params.Shadow = currentDatas.Params.Shadow;
		currentDatas.Params.Shadow = thisShadow;
		var thisColor = thisDatas.Params.Color;
		thisDatas.Params.Color = currentDatas.Params.Color;
		currentDatas.Params.Color = thisColor;
		
		// Recree l'ancienne image et la nouvelle		
		var urlRoot = currentDatas.Source.substring(0, currentDatas.Source.indexOf("?"));
		UpdateImage(current, currentDatas, urlRoot);
		UpdateImage(item, thisDatas, urlRoot);
		
		var categoryId = current.attr("id").split("_")[0];
		_history[categoryId] = current.attr("id");
		
		Tools_DispatchEvent(_this.SelectionChanged, _this, { ItemId : item.attr("id") });
	}
	
	var SetItemsEvents = function()
	{
		_this.HtmlObject.find(".SideTabItem").click(function(event)
		{
			if ($(this).attr("class").indexOf("OverBudget") < 0)
				ItemClick($(this));
		});
	}
	
	var CloseCategory = function(category)
	{
		category.attr("class", category.attr("class").replace("Less", "More"));
		var itemsRow = _this.HtmlObject.find("#items_" + category.attr("id"));
		var categoryItems = itemsRow.find(".SideTabCategoryItems");
		categoryItems.slideUp("normal", function() { itemsRow.hide() });
	}
	
	var OpenCategory = function(category)
	{
		category.attr("class", category.attr("class").replace("More", "Less"));
		var itemsRow = _this.HtmlObject.find("#items_" + category.attr("id"));
		var categoryItems = itemsRow.find(".SideTabCategoryItems");
		itemsRow.css("display", _ie ? "block" : "table-row");
		categoryItems.slideDown("normal");
	}

	var SetCategoriesEvents = function()
	{
		_this.HtmlObject.find(".SideTabCategory").click(function()
		{
			if ($(this).attr("class").indexOf("OverBudget") != -1)
				return ;
		
			// Si la catégorie est déjà ouverte on s'en va
			if ($(this).attr("class").indexOf("More") < 0)
				return ;
			
			var categoryId = $(this).attr("id");
				
			// On ferme celle qui était ouverte
			var closeCategory = _this.HtmlObject.find(".SideTabCategory.Less");
			CloseCategory(closeCategory);
			
			// On ouvre la catégorie et on sélectionne l'élément le plus
			// récemment sélectionné dans cette catégorie, ou le 1er par défaut
			var openCategory = $(this);
			OpenCategory(openCategory);
						
			// Switch les parametres de l'image...
			var currentDatas = GetImageDatas(closeCategory);
			var thisDatas = GetImageDatas(openCategory);
			var thisColor = thisDatas.Params.Color;
			thisDatas.Params.Color = currentDatas.Params.Color;
			currentDatas.Params.Color = thisColor;
			
			// Recree l'ancienne image et la nouvelle		
			var urlRoot = currentDatas.Source.substring(0, currentDatas.Source.indexOf("?"));
			UpdateImage(closeCategory, currentDatas, urlRoot);
			UpdateImage(openCategory, thisDatas, urlRoot);

			var id = _history[categoryId];
			var first = ".SideTabItem[id^='" + categoryId +  "_']:first";
			var previous = ".SideTabItem[id='" + id +  "']";
			ItemClick(_this.HtmlObject.find(id ? previous : first));
		});
	}

	this.OnLoad = function()
	{
		SetCategoriesEvents();
		SetItemsEvents();
		
		// Fixe la largeur du controle pour ne pas que
		// sa largeur change quand on change de catégorie
		_this.HtmlObject.css("width", _this.HtmlObject.width() + "px");
		
		// Masque toutes les catégories fermées
		setTimeout(function()
		{
			_this.HtmlObject.find(".SideTabCategory.More")
				.each(function() { CloseCategory($(this)) });
		}, 0);
	}
}

