// Determination de la nouvelle photo
//*****************************************************//*****************************************************
function choose_next_photo (settings, save_last, current){
	var nouveau=0;
	
	// Pour le typoe RANDOM
	if ( settings.type == 'random' )	{
		do{
			nouveau = Math.floor ( Math.random ( ) * ( settings.nb_slides ) );
		}while (current == nouveau || nouveau == save_last)
		current=nouveau;
	}
	
	// Pour le type SEQUENCE mais aussi type par défaut
	else current = (current + 1)%settings.nb_slides;	// % => modulo : Quand on a atteint la dernière image on repart de 0
	
	// On retourne la nouvelle valeur
	return current;
}
//*****************************************************//*****************************************************


//									INITIALISATION
//*****************************************************//*****************************************************
$.fn.slideshow = function(options) {
	var settings = {	// Régalge par défaut
		timeout: 2000,
		type: 'sequence',
		transition: 'apparition',
		vitesse: 2000,
		vitesse_defilement: 20,
		distance_entre_image: 0,
		largeur: 100,
		pas: 8,
		placement: 'colonne'
	}
	
	hover=false;
	
	if(options)
		$.extend(settings, options);
	
	var slides = this.find('div.photo').get();
	
	if(slides.length <=1)
		return;
		
	// Dimensionnement et mise en page de l'aplication, réglage des paramèrtes
	if(settings.placement=='colonne'){
		var largeur=100;
		var hauteur=130;
						
		// On met à jour les variables
		settings.largeur=largeur+settings.distance_entre_image;
		settings.vitesse_defilement=20;	// Transition assez lente car l'image est assez peite
		
	}
	else{
		var largeur=550;
		var hauteur=520;
			
		// On met à jour les variables
		settings.largeur=largeur+1+settings.distance_entre_image;
		settings.vitesse_defilement=1;	// Transition rapide car l'image est grande
		settings.pas=20;				// Transition rapide car l'image est grande
		
	}
	
	// On redimensionne l'application selon son placement
	$("#cadre_diapo").css('height', hauteur);	
	$("#cadre_diapo").css('width', largeur+1+settings.distance_entre_image);	
	$("#cadre_diapo div").css('height', hauteur);	
	$("#cadre_diapo div").css('width', largeur+1+settings.distance_entre_image);
	

	// On place la deuxième image qui est sous la première au même niveau que la première, à sa droite
	$(slides[1]).css('position', 'relative').css('top', -hauteur);
	$(slides[1]).css('position', 'relative').css('left', settings.largeur+2);
			
	this.css('position', 'relative');
		
	// Pour la première image que l'on affiche
	$(slides[1]).find('img').attr('src', settings.chemin[0]);
	
	// On centre l'image qui va apparaitre verticalement et horizontalement
	$(slides[0]).find('img').css('position', 'relative').css('left', Math.floor(($(slides[0]).width()-$(slides[0]).find('img').width())/2));
	$(slides[0]).find('img').css('position', 'relative').css('top', Math.floor(($(slides[0]).height()-$(slides[0]).find('img').height())/2));
	
	// On cache les images le temps de les placer, centrer
	$("#cadre_diapo div img").css('visibility', 'visible');	
	
	// Pour arreter le diapo lorque la souris passe dessus
	$("#cadre_diapo").mouseout(function(){hover=false;$("#cadre_diapo").css('width', settings.largeur);}).mouseover(function(){hover=true;});
	
	// TimeOut pour pouvoir faire défiler les images
	rappel=setTimeout(function(){$.slideshow.next(slides, settings, 0, 1, 1);}, settings.timeout);
	
};
//*****************************************************//*****************************************************


$.slideshow = function() {}


//*****************************************************//*****************************************************
// 									NEXT
//*****************************************************//*****************************************************
$.slideshow.next = function (slides, settings, current, last, actu) {
	if(hover==false){// Si la souris est sur l'image, on ne change pas d'image
		// Quelle image était montrée, lauqele était cachée ?
		var slide_a_afficher=actu;
		var slide_a_cacher=1-actu;
			
		// On place la div pour qu'elle soit à droite de l'image actuellement affichée
		if(slides.length <=1)
			return;
		$(slides[slide_a_afficher]).css('position', 'relative').css('left', settings.largeur+2);
		$(slides[slide_a_cacher]).css('position', 'relative').css('left', 0);
		
		$(slides[slide_a_afficher]).find('img').css('display', 'block');	// Pour que l'image soit visible quand elle apparait
				
		// On centre l'image qui va apparaitre verticalement et horizontalement
		$(slides[slide_a_afficher]).find('img').css('position', 'relative').css('left', Math.floor(($(slides[slide_a_afficher]).width()-$(slides[slide_a_afficher]).find('img').width())/2));
		$(slides[slide_a_afficher]).find('img').css('position', 'relative').css('top', Math.floor(($(slides[slide_a_afficher]).height()-$(slides[slide_a_afficher]).find('img').height())/2));
				
		// Transition entre les 2 images
		$.slideshow.transition(settings, slides, last, current, slide_a_cacher, slide_a_afficher, settings.vitesse_defilement, 0);
	}
	else{
		setTimeout((function(){$.slideshow.next(slides, settings, current, last, actu);}), settings.timeout);
	}
}
//*****************************************************//*****************************************************



// Effets de transition
//*****************************************************//*****************************************************
$.slideshow.transition = function (settings, slides, last, current,  a_cacher, a_montrer, vitesse_rappel, decalage){
	var done=false;	// Par défaut on considère que l'effet de transition n'est pas fini
	
	var largeur=settings.largeur;	// Pour que ce soit plus pratique
	var pas=settings.pas;			// Pour que ce soit plus pratique
	
	//*****************************************************
		// Type : DEFILEMENT => la nouvelle image remplace l'autre progessivement en glissant horizontalement
		if(settings.transition=='defilement'){
			
			// Variable d'ajustement
			ajust_variable=largeur;
			
			// Décalage des images
			if( decalage <= (-pas)*(Math.floor(largeur/pas) ) )decalage=-largeur-settings.distance_entre_image; // Pour être sur que l'image se décale jusqu'au bout (pas de pixel de décalage)
			$(slides[a_cacher]).css('left', decalage);
			$(slides[a_montrer]).css('left', decalage+ajust_variable+settings.distance_entre_image+2);
		
			decalage-=pas;
				// Si le décalage n'est pas fini ...
				if(decalage>-largeur){
					//on réappelle l'effet de transition
					setTimeout((function(){$.slideshow.transition(settings, slides, last, current, a_cacher, a_montrer, vitesse_rappel, decalage);}), vitesse_rappel);
				}
				// Sinon ...
				else{
					$(slides[a_cacher]).find('img').css('display', 'none');	// on cache l'image qui était affichée
					done=true;	// l'effet de transition est fini
				}
		}
		
		// Type : APPARITION => la nouvelle image arrive du centre de la diapo en s'agrandissant progessivement (FadeIn() et fadeOut() )
		else if(settings.transition=='apparition'){
			
			$(slides[a_montrer]).css('left', '0');	// Par défaut les deux images sont cote à cote, on les superpose pour cet effet.
			
			// On cache les deux images
			$(slides[a_cacher]).find('img').css('display', 'none');
			$(slides[a_montrer]).find('img').css('display', 'none');
			
			// On fait apparaitre la nouvelle
			$(slides[a_montrer]).find('img').fadeIn(400);
			
			// L'effet est fini
			done=true;
		}
		
		// Sinon il n'y a pas d'effet de transition (jamais utilisé en théorie)
		else{
			done=true;
		}
	//*****************************************************
	
	// Si l'effet de transition est fini ...
	//*****************************************************
	if(done==true){
		// Détermination de la prochaine image à afficher
		var save_last=last;
		last=current;
		current=choose_next_photo(settings, save_last, current);
			
		// Affichage de la nouvelle image (cachée pour l'instant)
		$(slides[a_cacher]).find('img').attr('src', settings.chemin[current]);
		
		// On remet le TimeOut pour que les images changent régulièrement
		rappel=setTimeout((function(){$.slideshow.next(slides, settings, current, last, a_cacher);}), settings.timeout);
	}
	//*****************************************************
}
//*****************************************************//*****************************************************


