(function($){
	// namespace
	$.fn.charge_image = function(uo){
		// ******************* options **********************
		$.fn.charge_image.defaults={
			maxWidth: 200,
			maxHeight: 200,
			background_color: 'inherit',
			resize: true,
			masquer:false,
			oncomplete:null,
			complete_delay:1000
		};
		
		
		// ******************* methode public *****************
		this.change_lien = function(lien,callback){
			if($(this).length>1)
			{
				$(this).each(function(){
					charge($(this),lien,callback);
				});
				return this;
			}
			else
			{
				charge($(this),lien,callback);
						
				return this;
			}
		};
		
		this.modif = function(param,value){
			var tab;
			
			if(typeof(param)=="object")
				tab=param;
			else
			{
				tab=new Object();
				eval("tab."+param+"=value")
			}
			
			if(tab!=null  && $(this).data('charge_image_opt'))
			{
				var o = $.extend(true,{},$(this).data('charge_image_opt'),tab);
				$(this).data('charge_image_opt', o);
				
				return this;
			}
		};
		
		
		// ********************* methode privée ********************
		function charge(img,lien,callback)
		{
			var image = new Image();
			if (img.data('charge_image_opt'))
			{
				var o = img.data('charge_image_opt');
				
				image.onerror = function()
				{
				  //alert("Erreur lors du chargement de l'image :\n" + src);
				  /*image.alt ="Erreur image";
				  image.title ="Erreur image";
				  image.src = "images/pas_photo.jpg"*/
				}
				
				// une fois l'image chargée :
				image.onload = function()
				{
					 image.title ="abir image";
					
				  // si l'image doit etre redimensionnée
				  var reduction = 1;
				  if(o.maxWidth && o.maxHeight)
					 if(image.width > o.maxWidth || image.height > o.maxHeight)
						reduction = Math.max(image.width/o.maxWidth, image.height/o.maxHeight);
				
				  var largeur = Math.round(image.width / reduction);
				  var hauteur = Math.round(image.height / reduction);
				  // on affiche l'image
				  img.css("padding-top","");
				  img.css("padding-bottom","");
				  img.css("padding-left","");
				  img.css("padding-right","");
				  img.src = image.src;
				  img.attr("src",image.src);
				  img.attr("width",largeur);
				  img.attr("height",hauteur);
				  img.css("width",largeur + "px");
				  img.css("height",hauteur + "px");
				  
				  if(o.resize)
				  {
					  // on ajuste le padding bottom et top
					  if(hauteur<o.maxHeight)
					  {
						var marge_haut = Math.round((o.maxHeight-hauteur)/2);
						var marge_bas = o.maxHeight-(hauteur+marge_haut);
						img.css("padding-top",marge_haut+"px");
						img.css("padding-bottom",marge_bas+"px");
					  }
					  
					  // on ajuste le padding left et right
					  if(largeur<o.maxWidth)
					  {
						var marge_gauche = Math.round((o.maxWidth-largeur)/2);
						var marge_droite = o.maxWidth-(largeur+marge_gauche);
						img.css("padding-left",marge_gauche+"px");
						img.css("padding-right",marge_droite+"px");
					  }
					  
					  img.css("background-color",o.background_color);
				  }
				  
				  if(!o.masquer)
					img.css("display","");
				  
				  
				  
				  if($.isFunction(callback))
						callback();
				}
				
				if(lien!=null && lien !="")
					image.src = lien;//+"?"+new Date().getTime();
				else if(img.attr("src")!=null)
					image.src = img.attr("src");
			}
			
			return img;
		}
		
		
		//**************** methode principale ****************
		var o = $.extend(true,{},$.fn.charge_image.defaults,uo);
		
		$(this).each(function() {
			if (!$(this).data('charge_image_opt'))
			{
				$(this).data('charge_image_opt', o);
			}
			
			charge($(this));
		});
		
		
		if ($.isFunction(o.oncomplete)) {
			setTimeout(o.oncomplete,o.complete_delay);
		}
		
		return this;
	};
	
	
	//*****************************************************************************************************************
	
	$.fn.charge_slideshow = function(uo){
		$.fn.charge_slideshow.defaults = {
			firstelem: 0,
			delay: 1000,
			liste:[],
			extra:[],
			
			usechargeimage:false,
			inverse_sens:false,
			effet:false,
			delay_in:"slow",
			delay_out:"slow",
			onchange:null,
			onbeforechange:null
			
		};
		
		this.modif = function(param,value){
			var tab;
			
			if(typeof(param)=="object")
				tab=param;
			else
			{
				tab=new Object();
				eval("tab."+param+"=value")
			}
			
			if(tab!=null  && $(this).data('charge_slideshow_opt'))
			{
				var o = $.extend(true,{},$(this).data('charge_slideshow_opt'),tab);
				$(this).data('charge_slideshow_opt', o);
				
				return this;
			}
		};
		
		this.reset = function(){
			$(this).charge_slideshow().stop();
			charge($(this),"F");
			
			return this;
		};
		
		
		this.stop = function(){
			var img=$(this);
			var o = img.data('charge_slideshow_opt');
			clearTimeout(o.timer);
			
			return this;
		};
		
		this.start = function(){
			var img=$(this);
			var o = img.data('charge_slideshow_opt');
			
			if(!o.inverse_sens)
				o.timer = setTimeout(function(){charge(img,1)},o.delay);
			else
				o.timer = setTimeout(function(){charge(img,-1)},o.delay);
			
			return this;
		};
		
		this.force = function(elem){
			var img=$(this);
			var o = img.data('charge_slideshow_opt');
			
			img.charge_slideshow().stop();
			charge(img,"X"+String(elem));
			
			return this;
		};
		
		this.suivant = function(step){
			var img=$(this);
			var o = img.data('charge_slideshow_opt');
			
			step = step!=null ? step : 1;
			
			img.charge_slideshow().stop();
			
			if(!o.inverse_sens)
				charge(img,Math.abs(step),true);
			else
				charge(img,parseInt(eval("-"+Math.abs(step))),true);
			
			return this;
		};
		
		this.precedent = function(step){
			var img=$(this);
			var o = img.data('charge_slideshow_opt');
			
			step = step!=null ? step : 1;
			
			img.charge_slideshow().stop();
			
			if(!o.inverse_sens)
				charge(img,parseInt(eval("-"+Math.abs(step))),true);
			else
				charge(img,Math.abs(step),true);
			
			return this;
		};
		
		
		function charge(img,value,bloque_next){
			if(bloque_next==null)
				bloque_next=false;
				
			var o = img.data('charge_slideshow_opt');
			
			var actuel = parseInt(indexof(o.liste,img.attr("src")));
			
			var suivant;
			
			if(String(value)=="F")
				suivant = parseInt(o.firstelem);
			else if(String(value).substring(0,1)=="X")
				suivant = parseInt(String(value).substring(1));
			else
			{
				suivant = actuel+parseInt(value);
				if(parseInt(suivant)>(o.liste.length-1))
					suivant=0;
					
				if(parseInt(suivant)<0)
					suivant=(o.liste.length-1);
			}
			
			if(o.usechargeimage)
			{
				if(o.effet)
				{
					if ($.isFunction(o.onbeforechange))
					{
						o.onbeforechange();
					}	
					img.fadeOut(o.delay_out,function(){
						img.charge_image().modif("masquer",true);
						img.charge_image().change_lien(o.liste[suivant],function(){
							img.fadeIn(o.delay_in,function(){
								if($.isFunction(o.onchange))
									o.onchange(o.extra[suivant]);
							});
						});
					});
				}
				else
				{
					img.charge_image().change_lien(o.liste[suivant],function(){
						if($.isFunction(o.onchange))
							o.onchange(o.extra[suivant]);
					});
				}
			}
			else
			{
				img.attr("src",o.liste[suivant]);
						
				if($.isFunction(o.onchange))
					o.onchange(o.extra[suivant]);
			}
				
			if(!bloque_next)
			{
				var delay = (o.effet && String(parseInt(o.delay_in))!="NaN") ? parseInt(o.delay_in)+parseInt(o.delay) : o.delay;
				
				if(!o.inverse_sens)
					o.timer = setTimeout(function(){charge(img,1)},delay);
				else
					o.timer = setTimeout(function(){charge(img,-1)},delay);
				img.data('charge_slideshow_opt', o);
			}
			
			return img;
		};
		
		function indexof(tab, val)
		{
			var result=-1;
			for(i in tab)
			{
				if(tab[i]==val)
					result=i;
			}
			return result;
		}
		
		
		var o = $.extend(true,{},$.fn.charge_slideshow.defaults,uo);
		
		if(uo!=null || (uo==null && !$(this).data('charge_slideshow_opt')))
		{
			$(this).each(function() {
				if (!$(this).data('charge_slideshow_opt'))
				{
					$(this).data('charge_slideshow_opt', o);
				}
				
				charge($(this),"F");
			});
		}
		
		return this;
	};
	
	
})(jQuery)
