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 (previousIndex != -1 && (previousIndex < index)){
				plus = (index - previousIndex) * 84;
				$('#slide').animate({top: '+=' + plus}, 500);
			} else if (previousIndex != -1 && (previousIndex > index)) {
				moins = (previousIndex - index) * 84;
				$('#slide').animate({top: '-=' + moins}, 500);
			}
			
			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);
	};
}

