// (C)opyright N-Gine Innovation 2008 - Tous droits réservés
// http://www.ngine-innovation.com
// créé le 15/09/2008 par m.c.



// ************************************************************************************************
// ************************************************************************************************
// **     Variables globales
// ************************************************************************************************
// ************************************************************************************************

// tous les slideshows sont sauvés dans une liste globale
var slideShows = new Array();

// ************************************************************************************************
// ************************************************************************************************
// **     Classe SlideShow
// ************************************************************************************************
// ************************************************************************************************

// ------------------------------------------------------------------------------------------------
// Constucteur
// param container : l'élément dans lequel créer le slideshow
//       baseID : le nom de base des éléments à faire tourner. ATTENTION : il ne doit y avoir plusieurs slideshows avec le même baseID
//       interval : l'interval en ms entre 2 changements d'éléments
function SlideShow(baseID, interval)
{
	this.baseID = baseID;
	this.interval = interval;
	this.elements = new Array(); // les élements du slideshow (aucun pour l'instant)
	this.activeElement = 0; // le premier élément du slidewhow est visible
	this.sliding = false; // le slideshow n'est pas en marche
	this.playPauseImg = null; // id de l'image (élément dom) servant à faire play pause
	this.mouseOver = false; // pour savoir si un élément est survolé par la souris
	
	//sauve le slideShow dans une variable globale
	slideShows[baseID] = this;
}

// ------------------------------------------------------------------------------------------------
// Ajoute un élément au slideshow
// param id : id de l'élément tel qu'il est déclaré dans le code HTML
SlideShow.prototype.addElement = function(id)
{
	var frameNumber = this.elements.length;
	var element = document.getElementById(id);
	// seul le premier élément est visible lors de sa création
	if (frameNumber > 0)
		element.style.display = "none";
	else
		element.style.display = "block";
	this.elements[frameNumber] = element;
};

// ------------------------------------------------------------------------------------------------
// Ajoute une liste d'éléments au slideshow
// param ids : un tableau des ids des éléments tels qu'ils sont déclarés dans le code HTML
SlideShow.prototype.addElements = function(ids)
{
	for (var i = 0; i < ids.length; i++)
		this.addElement(ids[i]);
};

// ------------------------------------------------------------------------------------------------
// Supprime un élément du slideshow d'après son rang
// param index : la position de l'élément à supprimer
SlideShow.prototype.removeElement = function(index)
{
	// TODO
};


// ------------------------------------------------------------------------------------------------
// Spécifie l'image playpause afin de changer l'icone entre play et pause suivant que l'animation tourne ou non
// param imgID : id de l'image (élément DOM) qui fait play/pause
//       playPath : chemin de l'image play
//       pausePath : chemin de l'image pause
//       playMsg : title de l'image play
//       pauseMsg : title de l'image pause
SlideShow.prototype.setPlayPauseImg = function(imgId, playPath, pausePath, playMsg, pauseMsg)
{
	this.playPauseImg = document.getElementById(imgId);
	this.playPath = playPath;
	this.pausePath = pausePath;
	this.playMsg = playMsg;
	this.pauseMsg = pauseMsg;
};

// ------------------------------------------------------------------------------------------------
// Met à jour l'image play/pause en fonction de l'état du slideshow
SlideShow.prototype.updatePlayPauseImg = function()
{
	if (this.playPauseImg)
		if (this.sliding)
		{
			this.playPauseImg.src = this.pausePath;
			this.playPauseImg.title = this.pauseMsg;
		} else {
			this.playPauseImg.src = this.playPath;
			this.playPauseImg.title = this.playMsg;
		}
};

// ------------------------------------------------------------------------------------------------
// Renvoie le nombre d'éléments du slideshow
SlideShow.prototype.getElementCount = function()
{
	return this.elements.length;
};

/// ------------------------------------------------------------------------------------------------
// Renvoie un élément du slideshow d'après son rang
// param index : la position de l'élément à renvoyer
SlideShow.prototype.getElement = function(index)
{
	if ((index > -1) && (index < this.elements.length))
	{
		return this.elements[index];
	}
	return null;
};

// ------------------------------------------------------------------------------------------------
// Supprime tous les élément du slideshow
SlideShow.prototype.clear = function()
{
	for (var i = 0; i < this.elements.length; i++)
		removeDOMHierarchy(elements[i]);
	this.elements = new Array();
};

// ------------------------------------------------------------------------------------------------
// Lance l'animation du slideshow
SlideShow.prototype.start = function()
{
	this.activeElement = 0;
	this.sliding = true;
	this.updatePlayPauseImg();
	setTimeout("timerSwitchSlide('" + this.baseID + "');", this.interval);
};

// ------------------------------------------------------------------------------------------------
// Arrête ou reprend l'animation du slideshow
SlideShow.prototype.pause = function()
{
	this.sliding = !this.sliding;
	this.updatePlayPauseImg();
	if (this.sliding)
		setTimeout("timerSwitchSlide('" + this.baseID + "');", this.interval);
};

// ------------------------------------------------------------------------------------------------
// Passe à un autre élément du slideshow
//  param delta : le nombre de slides à sauter (ex : +1 slide suivant, -1 slide précédent, +2, etc.)
SlideShow.prototype.changeSlide = function(delta)
{
	if ((this.elements.length > 0) && !this.mouseOver) 
	{
		this.elements[this.activeElement].style.display = "none"; // cache le slide courant
		this.activeElement = (this.activeElement + delta) % this.elements.length; // passe au slide suivant ou précédent (boucle)
		if (this.activeElement < 0) this.activeElement += this.elements.length;
		this.elements[this.activeElement].style.display = "block"; // affiche le nouveau slide courant
	}
};

// ------------------------------------------------------------------------------------------------
// Passe à l'élément suivant dans le slideshow 
SlideShow.prototype.nextSlide = function()
{
	this.changeSlide(1);
};

// ------------------------------------------------------------------------------------------------
// Passe à l'élément précédent dans le slideshow 
SlideShow.prototype.prevSlide = function()
{
	this.changeSlide(-1);
};

// ************************************************************************************************
// ************************************************************************************************
// **     Fonctions globales
// ************************************************************************************************
// ************************************************************************************************

// ------------------------------------------------------------------------------------------------
// Supprimer un élément de la hiérarchie DOM et libère la mémoire
// param element : l'élément DOM à supprimer
function removeDOMHierarchy(element) {
	if (element)
		while (element.firstChild)
			element.removeChild(element.firstChild);
}

// ------------------------------------------------------------------------------------------------
// Evenement d'entrée de la souris sur un élément d'un slideshow
// param baseID : id du slideshow concerné
// REMARQUE : cette fonction n'est pas affectée automatiquement aux evts mouseOver des éléments du slideshow
//            car je n'ai pas réussi à différencier les évènements correspondant aux différents baseID
function mouseOverSlide(baseID)
{
	var slideShow = slideShows[baseID];
	if (slideShow)
		slideShow.mouseOver = true;	
}

// ------------------------------------------------------------------------------------------------
// Evenement de sortie de la souris sur un élément d'un slideshow
// param baseID : id du slideshow concerné
// REMARQUE : cette fonction n'est pas affectée automatiquement aux evts mouseOver des éléments du slideshow
//            car je n'ai pas réussi à différencier les évènements correspondant aux différents baseID
function mouseOutSlide(baseID)
{
	var slideShow = slideShows[baseID];
	if (slideShow)
		slideShow.mouseOver = false;	
}

// ------------------------------------------------------------------------------------------------
// Passe à l'élément suivant d'un slideshow et met le timer pour le changement suivant
// param baseID : id du slideshow à traiter
function timerSwitchSlide(baseID)
{
	var slideShow = slideShows[baseID];
	if (slideShow)
	{
		if (slideShow.sliding)
		{
			slideShow.nextSlide();
			setTimeout("timerSwitchSlide('" + baseID + "');", slideShow.interval);
		}
	}
}

// ------------------------------------------------------------------------------------------------
// Passage manuel à l'élément suivant d'un slideshow
// param baseID : id du slideshow à traiter
function nextSlide(baseID)
{
	var slideShow = slideShows[baseID];
	if (slideShow)
	{
		slideShow.nextSlide();
		if (slideShow.sliding)
			slideShow.pause();
	}
}

// ------------------------------------------------------------------------------------------------
// Passage manuel à l'élément précédent d'un slideshow
// param baseID : id du slideshow à traiter
function prevSlide(baseID)
{
	var slideShow = slideShows[baseID];
	{
		slideShow.prevSlide();
		if (slideShow.sliding)
			slideShow.pause();
	}
}

// ------------------------------------------------------------------------------------------------
// Commence un slideshow
// param baseID : id du slideshow à traiter
function startSlideShow(baseID)
{
	var slideShow = slideShows[baseID];
	if (slideShow)
		slideShow.start();
}

// ------------------------------------------------------------------------------------------------
// Arrête ou reprend un slideshow
// param baseID : id du slideshow à traiter
function pauseSlideShow(baseID)
{
	var slideShow = slideShows[baseID];
	if (slideShow)
		slideShow.pause();
}
