if(typeof jQuery != undefined){
	$.fn.premium = function(options){
		var options = $.extend({
			'opacity' : 0.5,					// opacité des boutons inactif
			'duration' : 'fast',				// Durée de la transition
			'delay' : 5,						// Durée d'attente entre deux élèments. 0 pour aucun changement automatique
			'itemsSelector' : '.items .item',	// Sélecteur de la liste de boutons
			'viewsSelector' : '.views .view',	// Sélecteur de la liste des contenus
			'prevSelector' : false,				// Sélecteur du bouton pour passer au précédent
			'nextSelector' : false,				// Selecteur du bouton pour passer au suivant
			'selectedClass' : 'active',			// La classe lorsque l'élèment est actif
			'firstIndex' : 0,					// L'index de départ
			'maxLoop' : 0, 						// Le nombre de tours automatique. 0 pour infini
			'reloadContent' : true,				// Recharge le contenu après un deuxième passage
			'loadFirstContent' : true,			// Charge le contenu du premier élèment affiché
			'getContent' : function(){			// Fonction permettant de récupérer le contenu
				return false;
			},
			'onChange' : function(){			// Fonction appelé après changement de contenu
				return false;
			}
		}, options);
		var currentIndex = -1;
		var timer = null;
		var $items = this.find(options.itemsSelector);
		var $views = this.find(options.viewsSelector);
		var currentLoop = -1;
		// Gestion des erreurs
		// -----------------------------------------------------------
		if(!$items.length){
			throw '$.fn.premium : Le sélecteur "'+this.selector+' '+options.itemsSelector+'" ne retourne aucun résultat';
		}
		if(!$views.length){
			throw '$.fn.premium : Le sélecteur "'+this.selector+' '+options.viewsSelector+'" ne retourne aucun résultat';
		}
		if($views.length != $items.length){
			throw '$.fn.premium : Le sélecteur "'+this.selector+' '+options.itemsSelector+'" et le selecteur "'+this.selector+' '+options.viewsSelector+'" ne retournent pas le même nombre de résultat';
		}
		/**
		 * Sélectionne l'élement
		 * @param int index Element à sélectionner
		 */
		var select = function(index, loadContent, animate){
			if(typeof loadContent == 'undefined'){
				loadContent = true;
			}
			if(typeof animate == 'undefined'){
				animate = true;
			}
			var duration = (animate ? options.duration : 0);
			var previousIndex = currentIndex;
			// Contrôle des dépassements
			index = (index < 0 ? $views.length-1 : index);
			index = (index >= $views.length ? 0 : index);
			if(index == options.firstIndex){
				currentLoop++;
			}
			var $item = $items.eq(index);
			var $view = $views.eq(index);
			// On passe au suivant si le bouton n'est pas visible
			if(!$item.filter(':visible').length){
				select(index+1);
				return;
			}
			// Chargement du contenu si pas déjà chargé et si getcontent défini
			if(loadContent){
				if(!$items[index].alsoLoaded || options.reloadContent){
					var content = options.getContent.call(this, $item);
					if(content){
						$view.html(content);
					}
				}
			}
			$items[index].alsoLoaded = true;
			currentIndex = index;
			// SI PRÉCÉDENT
			if(previousIndex >= 0){
				var $previousItem = $items.eq(previousIndex);
				var $previousView = $views.eq(previousIndex);
				turnOffItem(previousIndex, animate);
				$previousItem.removeClass(options.selectedClass);
				if(duration){
					$previousView.stop().fadeTo(duration, 0, function(){
						$previousView.hide();
					});
				}else{
					$previousView.hide();
				}
			}
			// AFFICHAGE DU SUIVANT
			turnOnItem(index, animate);
			$item.addClass(options.selectedClass);
			if(duration){
				$view.stop().fadeTo(duration, 1, function(){
					options.onChange.call(this);
				}).show();
			} else {
				$view.show();
				options.onChange.call(this);
			}
			// SI DELAY, ACTIVATION DU TIMER
			if(options.delay > 0 && (!options.maxLoop || currentLoop < options.maxLoop)){
				clearTimeout(timer);
				timer = setTimeout(function(){
					select(index+1);
				}, options.delay*1000);
			}
		};
		/**
		 * Allume l'élément de la liste
		 * @param int index
		 */
		var turnOnItem = function(index, animate){
			if(typeof animate == 'undefined'){
				animate = true;
			}
			var duration = (animate ? options.duration : 0);
			if(options.opacity > 0 || options.opacity >= 1){
				$items.eq(index).stop().fadeTo(duration, 1);
			}
		};
		/**
		 * Eteint l'élément de la liste
		 * @param int index
		 */
		var turnOffItem = function(index, animate){
			if(!options.opacity || options.opacity >= 1 || index == currentIndex){
				return;
			}
			if(typeof animate == 'undefined'){
				animate = true;
			}
			var duration = (animate ? options.duration : 0);
			$items.eq(index).stop().fadeTo(duration, options.opacity);
		};
		// Si items, ajout d'évènement de click et initialisation
		$items.each(function(i){
			$(this).click(function(){
				select(i);
				return false;
			}).hover(
				function(){
					turnOnItem(i);
				}, function(){
					turnOffItem(i);
				}
			);
		});
		// Evenement sur le bouton précédent
		if(options.prevSelector){
			$(options.prevSelector).click(function(){
				select(currentIndex-1);
				return false;
			});
		}
		// Evenement sur le bouton suivant
		if(options.nextSelector){
			$(options.nextSelector).click(function(){
				select(currentIndex+1);
				return false;
			});
		}
		if(options.opacity > 0){
			$items.fadeTo(0, options.opacity);
		}
		$views.hide();
		select(options.firstIndex, options.loadFirstContent, false);
	};
}
