(function($) {
	/* Initialisation du document */
	$(function() {
		var $dp = $("div.process");
		$dp
			.css({'position': 'fixed', 'right':'-14px'})
			.mouseenter(function() {
				if (!$(this).children("ul").hasClass("isOpened"))
					$(this).css('right', '0px');
			})
			.mouseleave(function(){
				if (!$(this).children("ul").hasClass("isOpened"))
					$(this).css('right', '-14px');
			});

		var tabs = {};

		function close_all() {
			$dp.find("div.processLayer").hide();
			$dp.find("a.processOpened").removeClass("processOpened");
		}

		function create_tab($container) {
			var $button = $container.find("a.btProcess:first");
			var $layer = $container.find("div.processLayer:first");
			
			var tabrightid = $button.attr("data-bov3-tabrightid");
			// juste pour compatibilité ascendante, avant l'identifiant était dans le title !!!
			if (tabrightid==null || tabrightid=='') tabrightid = $button.attr("title");
			var tab = {
				/**
				 * Affiche cet onglet. Ne pas confondre cette action avec open qui ouvre cet onglet
				 */
				show: function() {
					if( !$container.is(":visible")) {
						$container.show();
					}
				},
				/**
				 * Cache cet onglet. Ne pas confondre cette action avec close qui ferme cet onglet
				 */
				hide: function() {
					if( $container.is(":visible")) {
						$container.hide();
					}
				},
				/**
				 * Raffraichit cet onglet. Appelle l'évenement trigger sur l'onglet spécifié
				 */
				refresh: function() {
					$container.trigger('refresh');
				},
				/**
				 * Ouvre cet onglet. Il devient l'onglet actif'
				 */
				open: function() {
					this.show();
					if( !$layer.is(":visible")) {
						close_all();
						/* On ouvre l'onglet */
						$layer.show();
						$button.addClass("processOpened");
						/* On ajoute les classes */
						$dp.children("ul").addClass("isOpened");
						/* On affiche les onglets dans la page pour pouvoir scroller */
						$dp.css('position', 'absolute');
						$dp.focus();
						
						window.scrollTo(0,0);
						
					}
				},
				/**
				 * Ferme cet onglet.
				 */
				close: function() {
					this.show();
					if ($layer.is(":visible")) {
						close_all();
						/* On supprime les classes */
						$dp.children("ul").removeClass("isOpened");
						/* On ré-attache à la fenêtre */
						$dp.css('position', 'fixed');
					}
				},
				/**
				 * Bascule l'état ouvert / fermé de cet onglet
				 */
				toggle: function() {
					if ($layer.is(":visible")) this.close();
					else this.open();
				},
				/**
				 * Supprime définitivement cet onglet du dom
				 */
				destroy: function() {
					$container.remove();
				}
			};
			tabs[tabrightid] = tab;
			return tab;
		}
		$dp.find("li.processContainer").each(function() {
			create_tab($(this));
		});

		$dp.delegate(".processContainer a.btProcess", "click", function() {
			var tabrightid = $(this).attr("data-bov3-tabrightid");
			// juste pour compatibilité ascendante, avant l'identifiant était dans le title !!!
			if (tabrightid==null || tabrightid=='') tabrightid = $(this).attr("title");
			tabs[tabrightid].toggle();
			return false;
		});

		/**
		* @class
		* @static
		* @name Process
		* @version 1.0
		*/
		"Process".namespace(/** @lends Process.prototype	*/ {
			/**
			 * Retourne un tableau contenant le nom de chaque onglet.
			 */
			names: function() {
				var names = [];
				for( var name in tabs ) names.push(name);
				return names;
			},
			/**
			 * Ouvre un onglet. Les autres onglets seront fermés.
			 * @param tabname Nom de l'onglet à ouvrir
			 */
			open: function(tabname) {
				var tab = tabs[tabname];
				if( tab ) tab.open();
			},
			/**
			 * Ferme un onglet.
			 * @param tabname Nom de l'onglet à fermer
			 */
			close: function(tabname) {
				var tab = tabs[tabname];
				if( tab ) tab.close();
			},
			/**
			 * Cache un onglet. Il n'est plus possible d'interagir avec à l'aide de la souris.
			 * @param tabname Nom de l'onglet à ouvrir
			 */
			hide: function(tabname) {
				var tab = tabs[tabname];
				if( tab ) tab.hide();
			},
			/**
			 * Affiche un onglet. Celui ci ne sera toutefois pas ouvert. La méthode open permet d'afficher et d'ouvrir cet onglet en une seule opération.
			 * @param tabname Nom de l'onglet à ouvrir
			 * @see Process#open
			 */
			show: function(tabname) {
				var tab = tabs[tabname];
				if( tab ) tab.show();
			},
			/**
			 * Raffraichit un onglet. Cela ne fonctionne que si cet onglet a un évenement "refresh" enregistré
			 * @param tabname Nom de l'onglet à raffraichir
			 */
			refresh: function(tabname) {
				var tab = tabs[tabname];
				if( tab ) tab.refresh();
			},
			/**
			 * Ajoute un onglet.
			 * @param tabname Nom de l'onglet à créer
			 * @param params Configuration de ce nouvel onglet
			 * @example
			 * Process.add("exemple", {
			 * 	image : boState.getContextPath() + "/__san/bov3/img/t-process.png",
			 *	url: boState.getContextPath() + "/bov3/onglet.jspz"
			 * })
			 */
			add: function(tabname, params) {
				for( var tab in tabs ) {
					if( tab == tabname ) {
						throw "Cet onglet existe déjà";
					}
				}
				var params_def = {
					image : boState.getContextPath() + "/__san/bov3/img/t-process.png",
					url: boState.getContextPath() + "/__san/bov3/js/wedia.bov3.js"
				};
				var options = params = $.extend(params_def, params);
				$.ajax( options.url, {
					success: function(content) {
						var $container = $('<li class="processContainer"><a class="btProcess" data-bov3-tabrightid="' + tabname + '" href="#"><img src="' + options.image + '" width="10" height="59" alt=""></a><div class="processLayer" style="display: none">' + content + '</div></li>');
						$dp.children('ul').append($container);
						create_tab($container).show();
						if( options.refresh ) $container.bind('refresh', refresh);
					}
				});
			},
			/**
			 * Supprime un onglet.
			 * @param tabname Nom de l'onglet à supprimer
			 */
			remove: function(tabname) {
				var tab = tabs[tabname];
				if( tab ) {
					tab.destroy();
					delete tabs[tabname];
				}
			}
		});
	});
})(jQuery);

