/** @author laurent@publika.fr **/

/** Objet funnySlider
*Permet de créer plusieurs slide sur une page
	*@param div string ID de la DIV contenant l'ensemble des elements du slide
	*@param options json Parametres
	*/
function funnySlider(div,options){
	if ( !$("#"+div).size() ){
		alert('Pas de div '+div);
		return;
	}
	var maxCount = null;
	var currentIndex = null;
	var texte = null;
	var sliderDiv = null;
	var divChiffre = null;
	var boutonsChiffre = null;
	var inside = null;
	var boutonPrec = null;
	var boutonSuiv = null;
	var horizontale = null;
	var doFade = false;
	var timer = null;
	var first = null;
	var _isInit = null;
	var _hasCompteur = null;
	
	
	var classePrefixe = null;
	
	this.classePrefixe= 'llg-';
	this.defaut = {
		infini: false,
		idZone: null,
		labelPrec: '',
		labelSuiv:'',
		vitesseSlide: 500,
		dureeFade: 1000,
		timerDelai: 3000,
		classeChiffre: this.classePrefixe+'chiffres',
		classeNav: this.classePrefixe+'nav',
		classePrec: this.classePrefixe+'prec',
		classeSuiv: this.classePrefixe+'suiv',
		classeContainer: this.classePrefixe+'container',
		classeSliders: this.classePrefixe+'slider-elt',
		classeSlider: this.classePrefixe+'slider',
		classeCompteur: this.classePrefixe+"compteur"
	};

	this.options = ( options )?$.extend(this.defaut, options):this.defaut;

	this.root = $("#"+div);


	this.init();
}
/** Affiche des liens numeriques cliquable
	*/
funnySlider.prototype.chiffres = function(){
	if ( this.divChiffre )
		return this;
	//	this.init();
	var ini = this;
	this.img.after('<ul class="'+this.options.classeChiffre+'"></ul>');
	this.divChiffre = this.img.next();//('.'+this.options.classeChiffre);

	for ( var i =0;i < this.sliderElt.length; i++)
		this.divChiffre.append('<li><span>'+parseInt(i+1)+'</span></li>');

	this.boutonsChiffre = this.divChiffre.find('li');
	this.boutonsChiffre.click(function(){
		ini.montre(ini.divChiffre.children().index(this));
	});

	this.boutonsChiffre.mouseover(function(){
		$(this).css('cursor','pointer');
		ini.boutonsChiffre.removeClass('selected');
		$(this).addClass('selected');
	});
	if ( this.boutonsChiffre )
		this.boutonsChiffre.first().addClass('selected');
	return this;
};
/** Affiche les boutons prec et suiv
	*@param labelPrec Texte du champ "precedent"
	*@param labelSuiv Texte du champ "suivant"
	*/
funnySlider.prototype.boutons = function(labelPrec,labelSuiv){
	this.init();
	this.prec(labelPrec);
	this.suiv(labelSuiv);
	return this;
};
/** Affiche les boutonsprec et suiv a l'interieur des images
	*@param labelPrec Texte du champ "precedent"
	*@param labelSuiv Texte du champ "suivant"
	*/
funnySlider.prototype.boutonsInside = function(labelPrec,labelSuiv){
	this.init();
	this.prec(labelPrec,true);
	this.suiv(labelSuiv,true);
	return this;
};
/** Permet le defilement horizontal des images*/
funnySlider.prototype.horizontal = function(){
	this.horizontale = true;
	this.init();
	return this;
};
/** Permet l'affichage d'un menu
	*@param id string ID de la div contenant le menu
	*/
funnySlider.prototype.avecMenu = function(id){
	this.texte = $("#"+id);
	var ini = this;
	this.texte.children().each(function(){
		$(this).removeClass(ini.options.classeSliders);
	});

	this.texte.children().mouseover(function(){
		ini.montre(ini.texte.children().index(this));
	});
	this.init();
	return this;
};
/** Anime un menu
	*@param id string ID de la div du menu
	*@param nombre int Nombre de div a afficher dans le menu
	*/
funnySlider.prototype.slideMenu = function(id,nombre){
	var ini = this;
	this.texte = $("#"+id);
	this.texte.css('overflow','hidden');
	this.texte.removeClass(this.options.classeContainer);

	this.affiche = ( nombre ) ?nombre:2;
	this.texte.children().wrapAll('<div class="'+this.classePrefixe+'menuslide"></div>');
	this.menuSlide = this.texte.children('.'+this.classePrefixe+'menuslide');

	this.menuSlide.css('clear','both');
	this.texte.prepend(this.menuSlide);

	//Bouton Prec
	this.texte.prepend('<div class="'+this.options.classePrec+'">'+this.options.labelPrec+'</div>');
	this.boutonMenuPrec = this.texte.children("."+this.options.classePrec);
	this.setMenuBoutonsStyle(this.boutonMenuPrec);

	this.boutonMenuPrec.click(function(){
		var max = ( parseInt(ini.getBoutonsIndex('prec') - ini.affiche) > 0 )?parseInt(ini.getBoutonsIndex('prec') - ini.affiche):0;
		ini.currentIndex = max;
		ini.montre(ini.currentIndex);
	});
 
	//Bouton Suiv
	this.boutonMenuPrec.after('<div class="'+this.options.classeSuiv+'">'+this.options.labelSuiv+'</div>');
	this.boutonMenuSuiv = this.texte.find("."+this.options.classeSuiv);

	this.boutonMenuSuiv.click(function(){
		var max = ( parseInt(ini.getBoutonsIndex('suiv') + ini.affiche) < ini.getMax() )?parseInt(ini.getBoutonsIndex('suiv') + ini.affiche):parseInt(ini.getMax()-ini.affiche);
		ini.currentIndex = ini.getBoutonsIndex('suiv') + max;
		ini.montre(ini.currentIndex);
	});
	/** re-initialisation **/
	this._isInit = false;
	this.init();
	this.setMenuBoutonsStyle(this.boutonMenuSuiv);
	/** menuSlide **/
	this.menuSlide.css('width',this.root.innerWidth(true));
	this.menuSlide.children().css('float','left');
	this.menuSlideWidth =( this.menuSlide.children().first().outerWidth(true));
	this.texte.css('width',this.menuSlideWidth*this.affiche);
};
/** Fait un fondu entre les images
 * @param duree int Duree du fondu en millisecondes ( defaut: 1000 )
 */
funnySlider.prototype.fondu = function(duree){
	this.init();
	this.doFade = true;
	this.options.dureeFade = ( duree )?duree:this.options.dureeFade;
	return this;
};
/** Lance l'autoplay */
funnySlider.prototype.autoPlay = function(delai){
	if ( delai )
		this.options.timerDelai = delai;
	this.startPlay();
	return this;
};
/** Arrete l'autoplay */
funnySlider.prototype.stopPlay = function(){
	clearInterval(this.timer);
};

/** SI TU SAIS PAS NE PAS EDITER SOUS CETTE LIGNE *******/
/**methode montre
	*@param index int Index de l'image a montrer
	*/
funnySlider.prototype.montre = function (index){
	this.currentIndex = index;

	if ( this.currentIndex < 0 )
		return;

	if ( this.texte && !this.menuSlide )
		this.setTexteChildren();

	if ( this.doFade )
		this.fade();
	else
		this.anime();

	this.setBoutons();

	if ( this.menuSlide )
		this.setMenuBoutons();

	if ( this.boutonsChiffre ){
		this.boutonsChiffre.removeClass('selected');
		$(this.boutonsChiffre.get(this.currentIndex)).addClass('selected');
	}

	if ( this._hasCompteur )
		this.affCompteur();
};

/** Gestion de l'afficage des boutons perc et suiv */
funnySlider.prototype.setBoutons = function(){
	if ( !this.boutonPrec && !this.boutonSuiv )
		return;

	if ( this.options.infini || (!this.options.infini && this.currentIndex != 0) )
		this.boutonPrec.show();
	else
		this.boutonPrec.hide();

	if ( this.options.infini || (!this.options.inifi && this.currentIndex != this.getMax()-1) )
		this.boutonSuiv.show();
	else
		this.boutonSuiv.hide();
};
/** Affiche un champ pour la navigation vers l'avant
	*@param label string this.texte du champ ( defaut: Prèc )
	*@param dansImage bool Place le bouton sur les images
	*/
funnySlider.prototype.prec = function(label,dansImage){
	var ini = this;
	var text = ( label ) ? label : '';
	var temp = ( dansImage )?this.img:this.root;

	if ( dansImage ){
		temp.prepend('<div class="'+this.options.classeNav+'"></div>');
	}
	else
		this.img.after('<div class="'+this.options.classeNav+'"></div>');

	this.inside = temp.children('.'+this.options.classeNav).first();
	this.inside.append('<div class="'+this.options.classePrec+'"><span>'+text+'</span></div>');
	this.inside.css('z-index','1');
	this.inside.css('position','absolute');
	//this.inside.css('width',this.largeurSlide);
	this.boutonPrec = this.inside.find("."+this.options.classePrec);
//	this.boutonPrec.css('width',Math.round(this.img.innerWidth(true)/2));
	this.setBoutonsStyle(this.boutonPrec);
	this.boutonPrec.css('display','none');
	/* if ( !this.options.infini || this.currentIndex == 0 ){
/* this.boutonPrec.hide();
 *}*/
	this.boutonPrec.mouseover(function(){
		$(this).css('cursor','pointer');
	});
	this.boutonPrec.click(function(){
		ini.montre(ini.getBoutonsIndex('prec')-1);
	});
};
/** Affiche un champ pour la navigation vers l'arriere
	*@param label string this.texte du champ ( defaut: Suiv )
	*@param dansImage bool Place le bouton sur les images
	*/
funnySlider.prototype.suiv = function(label,dansImage){
	var ini = this;
	var text = ( label ) ? label : '';
	this.boutonPrec.after('<div class="'+this.options.classeSuiv+'"><span>'+text+'</span></div>');
	this.boutonSuiv = this.inside.children("."+this.options.classeSuiv);
	//this.boutonSuiv.css('width',Math.round(this.img.innerWidth(true)/2));
	this.setBoutonsStyle(this.boutonSuiv);
	this.boutonSuiv.mouseover(function(){
		$(this).css('cursor','pointer');
	});
	this.boutonSuiv.click(function(){
		ini.montre(ini.getBoutonsIndex('suiv')+1);
	});
};
/** Retourne l'index suivant pour le slide continu
	*@param sens string Sens de defilement
	*/
funnySlider.prototype.getBoutonsIndex = function(sens){
	if ( !this.options.infini )
		return this.currentIndex;
	if ( sens == 'prec')
		return ( this.currentIndex == 0 )?this.getMax():this.currentIndex;
	else
		return ( this.currentIndex == this.getMax()-1)?-1:this.currentIndex;
};

/** Lance l'affichage */
funnySlider.prototype.init = function(){
	if (!this._isInit){
		if ( !this.img ){
			this.img = ( this.options.idZone )?$("#"+this.options.idZone):this.root.children().first();
			if ( !this.img.children().size() )
				this.img = this.root;
			this.img.addClass(this.options.classeContainer);
		}
		this.img.css('overflow','hidden');
		//hauteur de la div a afficher
		this.largeurSlide = this.img.innerWidth(true);
		if ( this.largeurSlide > this.root.innerWidth(true) )//webkit
			this.largeurSlide = this.root.outerWidth(true);
		//hauteur de la div a afficher
		this.hauteurSlide = this.img.innerHeight(true);
		if ( this.hauteurSlide > this.root.innerHeight(true) )//webkit
			this.hauteurSlide = this.root.innerHeight(true);
		this.img.css('height',this.hauteurSlide);
		this.img.css('width',this.largeurSlide);
		//construction de la div virtuelle
		this.img.children().wrapAll('<div class="'+this.options.classeSlider+'"></div>');
		this.sliderDiv = this.img.find('.'+this.options.classeSlider).first();
		this.sliderElt = this.sliderDiv.children();
		this.first = this.sliderElt.first();
	
	}//first init
//
	//application des tailles
	if ( this.horizontale ){
		this.sliderDiv.css('width',(this.largeurSlide*this.getMax()));
		this.sliderDiv.css('height',this.hauteurSlide);
	}
	else{
		this.sliderDiv.css('height',(this.hauteurSlide*this.getMax()));
		this.sliderDiv.css('width',this.largeurSlide);
	}
	var ini = this;
	this.sliderDiv.children().each(function(){
		$(this).addClass(ini.options.classeSliders);
		$(this).css('width',ini.largeurSlide).css('height',ini.hauteurSlide);
		if ( ini.horizontale )
			$(this).css('float','left');
		else
			$(this).css('position','relative');
	});

	this.montre(0);
 
	this._isInit = true;
};
/** Gestion de l'animation */
funnySlider.prototype.anime = function(){
	//var ini = this;

	if ( !this.horizontale){
		this.sliderElt.animate({
			bottom: this.hauteurSlide*this.currentIndex
		}
		,{
			duration: this.options.vitesseSlide,
			queue:false
		});
	}
	else{
		this.sliderDiv.animate({
			'marginLeft':-(this.largeurSlide*this.currentIndex)
		}
		,{
			duration: this.options.vitesseSlide,
			queue:false
		});
	}
};
/** Gestion du fade **/
funnySlider.prototype.fade = function(){
	var ini = this;
	var i = -1;
	var currentImg = $(this.sliderElt.get(this.currentIndex));
	currentImg.css('bottom', parseInt(ini.hauteurSlide*this.currentIndex));
	currentImg.css('opacity','0');
	this.sliderElt.animate({
		opacity: 0
	}, {
		queue:false,
		duration:ini.options.dureeFade
	});
	currentImg.animate({
		opacity: 1
	}, {
		queue:true,
		duration:ini.options.dureeFade
	},function(){
		$(this).css("z-index", i);
	});
};
/** Retourn le nombre total d'images */
funnySlider.prototype.getMax = function(){
	if( this.maxCount )
		return this.maxCount;
	this.maxCount = parseInt(this.sliderElt.size());
	return this.maxCount;
};
/** Gestion de l'affichage des enfants dans un bloc texte */
funnySlider.prototype.setTexteChildren = function(){
	var ini = this;
	this.texte.children().each(function(index){
		var cible = $(this).children().first();
		if ( index == ini.currentIndex ){
			cible.addClass('selected');
			cible.next().show();
		}
		else{
			cible.removeClass('selected');
			cible.next().hide();
		}
	});
};
/**Animation du menu */
funnySlider.prototype.animeMenu = function(){
	this.menuSlide.animate({
		'marginLeft':-this.menuSlideWidth*this.getBoutonsIndex()
	}
	,{
		queue:false
	});
};
/** Gestion de l'affichage des bouton prec et suiv du menu */
funnySlider.prototype.setMenuBoutons = function(){
	if ( this.options.infini || (!this.options.infini && parseInt(this.currentIndex) > 0) )
		this.boutonMenuPrec.show();
	else
		this.boutonMenuPrec.hide();
	if ( this.options.infini || (!this.inifi && (this.currentIndex) <= parseInt(this.getMax()-this.affiche) ) )
		this.boutonMenuSuiv.show();
	else
		this.boutonMenuSuiv.hide();

	this.animeMenu();

};
/** Gestion du style des boutons prec et suiv des images*/
funnySlider.prototype.setBoutonsStyle = function(bouton){
	bouton.css('z-index','100');
	bouton.css('display','block');
};
/** Gestion de l'affichage des bouton prec et suiv du menu */
funnySlider.prototype.setMenuBoutonsStyle = function(bouton){
	bouton.css('z-index','100');
 
};
/** debutde l'autoplay*/
funnySlider.prototype.startPlay = function(){
	var ini = this;
	this.timer = setTimeout(function(){
		ini.increase();
	},ini.options.timerDelai);
};
/** Deroulement de l'autoplay*/
funnySlider.prototype.increase = function(){
	if ( this.currentIndex < (this.sliderElt.length-1))
		this.currentIndex = parseInt(this.currentIndex+1);
	else
		this.currentIndex = 0;
	this.montre(this.currentIndex);
	this.startPlay();
};
/** Genere le bloc pour le compteur*/
funnySlider.prototype.compteur = function(){
	if ( !this.root.find("."+this.options.classeCompteur).size() )
		this.root.append('<div class="'+this.options.classeCompteur+'"></div>');
	this._hasCompteur = true;
	this.affCompteur();
};
/** Affiche de l'image courante / le nombre d'images total*/
funnySlider.prototype.affCompteur = function(){
	if ( !this._hasCompteur )
		return;
	this.root.find("."+this.options.classeCompteur).html('<span class="'+this.classePrefixe+'c1">'+parseInt(this.currentIndex+1)+'</span>/'+'<span class="'+this.classePrefixe+'c2">'+this.sliderElt.length+'</span>');
};

