/**
 * Animation des portlet "diaporama".
 * 
 * @require	jQuery
 * @require PAGE.media
 */
(function($){

	/**
	 * Création ou récupération d'espaces de noms spécifiques.
	 */
	
	var P = window.PAGE || (window.PAGE = {});	
	var $portlets = P.portlets || (P.portlets = {});
	var $diaporama = $portlets.diaporama || ($portlets.diaporama = {});
	var $media = P.media || (P.media = {});
	var $flash = $media.flash || ($media.flash = {});
	
	// Blocage de ce script au-delà de la première inclusion.
	
	if (!!$diaporama.loaded) {
		return;
	}
	
	$diaporama.loaded = true;
	
	/**
	 * Id d'éléments de la page et classes qu'ils peuvent porter.
	 */
	
	var sPortletClass = "portlet-diapo-diaporama";
	var sPortletNumIdPrefix = sPortletClass + "-"; // portlet-diapo-diaporama-
	 
	var sDiapoPrefix = "diaporama";
	var sDiapoClass = sDiapoPrefix; // diaporama
	
	var sItemPrefix = sDiapoPrefix + "Item"; // diaporamaItem
	var sItemClass = sItemPrefix; // diaporamaItem
	var sItemNumClassPrefix = sItemPrefix + "-"; // diaporamaItem-
	var sItemMultiClass = sItemPrefix + "-multi"; // diaporamaItem-multi 
	var sItemContLinkClass = sItemPrefix + "ContLink"; // diaporamaItemContLink
	
	var sNavPrefix = sDiapoPrefix + "Nav"; // diaporamaNav
	var sNavClass = sNavPrefix; // diaporamaNav
	var sNavPrevClass = sNavPrefix + "Prev"; // diaporamaNavPrev
	var sNavNextClass = sNavPrefix + "Next"; // diaporamaNavNext
	 
	var sImageContClass = "image-cont";
	var sActiveClass = "active";
	
	var iAutoScrollTimeoutDuration = 7000; // ms
	
	/**
	 * Autres variables.
	 */
	
	var _hNbItems = {}, _hCurItemNum = {};
	var _hAutoScrollIntervals = {};
	
	function activate(jItem){
		jItem.addClass(sActiveClass);
	}
	
	function deactivate(jItem){
		jItem.removeClass(sActiveClass);
	}
	
	function getItem(jPortlet, iItemNum){
		return jPortlet.find("." + sItemNumClassPrefix + iItemNum);
	}
	
	function getPortlet(j){
		return j.closest("." + sPortletClass);
	}
	
	function getNbPortletItems(jPortlet){
		return _hNbItems[jPortlet.attr("id")];
	}
	
	function getCurPortletItemNum(jPortlet){
		return _hCurItemNum[jPortlet.attr("id")];
	}
	
	function setCurPortletItemNum(jPortlet, iItemNum){
		_hCurItemNum[jPortlet.attr("id")] = iItemNum;
	}
	
	function mod(x, y) {
		return x >= 0 ? x % y : y - ((-x) % y);
	}
	
	function go(jPortlet, iOffset){
	
		var iNbItems = getNbPortletItems(jPortlet);
		var iCurItemNum = getCurPortletItemNum(jPortlet);
		
		if (iNbItems > 0 && iCurItemNum > -1) {
		
			deactivate(getItem(jPortlet, iCurItemNum));
			iCurItemNum = mod((iCurItemNum - 1 + iOffset), iNbItems) + 1;
			activate(getItem(jPortlet, iCurItemNum));
			setCurPortletItemNum(jPortlet, iCurItemNum);
		}
	}
	
	function goPrev(jPortlet){
		go(jPortlet, -1);
	}
	
	function goNext(jPortlet){
		go(jPortlet, 1);
	}
	
	function startAutoscroll(jPortlet) {
		
		var sId = jPortlet.attr("id");
		
		_hAutoScrollIntervals[sId] = setInterval(function(){
			goNext(jPortlet);
		}, iAutoScrollTimeoutDuration);
	}
	
	function stopAutoscroll(jPortlet) {
		
		var sId = jPortlet.attr("id");
		
		if (!!_hAutoScrollIntervals[sId]) {
			clearInterval(_hAutoScrollIntervals[sId]);
		}
	}
	
	function initPortletItemLinks(jPortlet){
	
		jPortlet.find("." + sItemClass).each(function(){
		
			var jItem = $(this);
			
			// Ceci ne s'applique pas aux contenus multimédia, pour lesquels
			// le lien s'affiche différemment.
			
			if (!jItem.hasClass(sItemMultiClass)) {
			
				var jImage = jItem.find("." + sImageContClass + " img");
				var jLinkAnchor = jItem.find("." + sItemContLinkClass + " a");
				
				if (jImage.length > 0 && jLinkAnchor.length > 0) {
					jLinkAnchor.empty();
					jImage.wrap(jLinkAnchor[0]);
				}
			}
		});
	}
	
	function initPortletNav(jPortlet){
	
		jPortlet.find("." + sNavPrevClass).click(function(){
			goPrev(jPortlet);
		});
		
		jPortlet.find("." + sNavNextClass).click(function(){
			goNext(jPortlet);
		});
	}
	
	function initPortlets(){
	
		var iPortletNum = 1;
		
		$("." + sPortletClass).each(function(){
		
			var jPortlet = $(this);
			var sId = jPortlet.attr("id");
			
			// On garantit un identifiant à cette portlet.
			
			if (!sId) {
				sId = sPortletNumIdPrefix + iPortletNum;
				jPortlet.attr("id", sId);
			}
			
			iPortletNum++;
			
			// Récupération d'informations de base.
			
			var iNbItems = jPortlet.find("." + sItemClass).length;
			
			_hNbItems[sId] = iNbItems;
			_hCurItemNum[sId] = iNbItems < 1 ? -1 : 1;
			
			// Autres initialisations.
			
			initPortletItemLinks(jPortlet);
			initPortletNav(jPortlet);
			$flash.realizeAllChildren(jPortlet);
						
			startAutoscroll(jPortlet);
			
			jPortlet.hover(function() {
				stopAutoscroll(jPortlet);
			}, function() {
				startAutoscroll(jPortlet);
			});
		});
	}
	
	$(document).ready(function(){		
		initPortlets();
	});
})
(jQuery);