var SlideShow = function (parameters) {
	var slsh = this;
	parameters.itemClassName = parameters.itemClassName ? parameters.itemClassName : 'slideme';
	parameters.itemIdPrefix = parameters.itemIdPrefix ? parameters.itemIdPrefix : '';
	parameters.timerBetweenSlide = parameters.timerBetweenSlide ? parameters.timerBetweenSlide : '5000';
	parameters.timerFadeTransition = parameters.timerFadeTransition ? parameters.timerFadeTransition : '800';
	if (parameters.imagesBaseDir && parameters.imagesBaseDir.substr(-1) != '/') {
		parameters.imagesBaseDir+='/';
	}
	
	var getItemName = function(itemId) {
		if(parameters.itemIdPrefix) {
			var itemName = itemId.replace(parameters.itemIdPrefix, '')+'.jpg';
		}
		else { var itemName = itemId+'.jpg'; }
		return(itemName);
	}
	
	var arr_item = new Array();
	var arr_url = new Array();
	$('#'+parameters.containerId+' .'+parameters.itemClassName).each(function(key, item){
		var itemName = getItemName(item.id);
		if (key == 0 && !parameters.imagesBaseDir) {
			var itemSrc = $(item).attr('src');
			parameters.imagesBaseDir = itemSrc.replace(itemName, '');
		}
		arr_item.push(item.id);
		arr_url.push(parameters.imagesBaseDir+itemName);
	});
	
	var slideshowPlaying = false;
	
	var cacheCounter = 0;
	var current = 1;
	var currentIndex = 1;
	var prev = 0;
	var prevIndex = 0;
	var remoteDisabled = false;
	
	var slide = function(currentId, prevId)
	{
		if (arr_item.length > 1) {
			if (parameters.onBeforeSlide) { parameters.onBeforeSlide(currentIndex+1); }
			$('#'+prevId).css('zIndex', '10');
			$('#'+currentId).css('zIndex', '9');
			$('#'+currentId).css('display', 'block');
			$('#'+prevId).fadeOut(parameters.timerFadeTransition, function() {
				remoteDisabled = false;
				if (parameters.onAfterSlide) { parameters.onAfterSlide(currentIndex+1); }
			});
		}
	}
	
	var play = function(callback)
	{
		//console.log('PLAY');
		$(document).everyTime(parameters.timerBetweenSlide, parameters.containerId+'_timerBetweenSlide', function(i) {
			gotoNext();
			//$('#slideshow-next-arrow').trigger('click');
		});
		slideshowPlaying = true;
		//console.log('slideshowPlaying : '+slideshowPlaying);
		if (callback) { callback(); }
	}
	var stop = function(callback)
	{
		//console.log('STOP');
		$(document).stopTime(parameters.containerId+'_timerBetweenSlide');
		slideshowPlaying = false;
		if (callback) { callback(); }
	}
	
	var next = function(callback) {
		//console.log('NEXT');
		if (!remoteDisabled) {
			remoteDisabled = true;
			if (slideshowPlaying) { stop(); }
			/*if (cacheCounter < 3) { cacheCounter++; }
			if (cacheCounter == 1) { cacheExec('gotoNext'); }*/
			gotoNext();
			if (callback) { callback(currentIndex+1); }
			if (!slideshowPlaying && parameters.playAuto) { play(); }
		}
	}
	
	var prev = function(callback) {
		//console.log('PREV');
		if (!remoteDisabled) {
			remoteDisabled = true;
			if (slideshowPlaying) { stop(); }
			/*if (cacheCounter < 3) { cacheCounter++; }
			if (cacheCounter == 1) { cacheExec('gotoPrev'); }*/
			gotoPrev();
			if (callback) { callback(currentIndex+1); }
			if (!slideshowPlaying && parameters.playAuto) { play(); }
		}
	}
	
	var gotoNext = function ()
	{
		current++;
		prev = (current - 1);
		if (current > arr_item.length) {
			current = 1;
		}
		prevIndex = (prev - 1);
		currentIndex = (current - 1);
		
		//console.log('goto next : '+prevIndex+'=>'+currentIndex);
		slide(arr_item[currentIndex], arr_item[prevIndex]);
	}
	
	function gotoPrev()
	{
	    current--;
		prev = (current + 1);
		if (current < 1) {
			current = arr_item.length;
		}
		prevIndex = (prev - 1);
		currentIndex = (current - 1);
		slide(arr_item[currentIndex], arr_item[prevIndex]);
	}
	
	var goto = function (curseur)
	{
		$.each(arr_item, function(key, id) {
			if (curseur == id) {
				curseur = key+1;
			}
		});
		//console.log(prev != (curseur-1));
		if (prev != (curseur-1)) {
			prev = current;
			current = curseur;
			if (current > arr_item.length) {
				current = 1;
			}
			prevIndex = (prev - 1);
			currentIndex = (current - 1);
			
			//console.log('goto next : '+prevIndex+'=>'+currentIndex);
			slide(arr_item[currentIndex], arr_item[prevIndex]);
		}
	}
	
	var cacheExec = function(goto)
	{
        eval(goto+'();');
        var cpt = 0;

        $(document).everyTime(1000, parameters.containerId+'_cacheTimer', function(i) {
            cpt++;
            if (cpt == 1) {
                cacheCounter--;
            }
            if(cacheCounter > 0) {
                eval(goto+'();');
                cacheCounter--;
            }
            else {
                $(document).stopTime(parameters.containerId+'_cacheTimer');
                //if (!slideshowPlaying) { play(); }
            }
		});
    }
	
	this.isPlaying = function() {
		return(slideshowPlaying);
	}
	
	if (!$.browser.msie || ($.browser.msie && $.browser.version.slice(0,1) > 8)) {
		var firstImage = $("<img />").attr("src", arr_url[0]);
		$(firstImage).load(function() {
			//console.log('first is loaded');
			if (parameters.onAfterFirstLoad) { parameters.onAfterFirstLoad(); }
			var cpt = 1;
			var total = arr_url.length;
			$.each(arr_url, function(key, src) {
				if (key != 0) {
					var arr_src = src.split('/');
					var basename = arr_src[arr_src.length - 1];
					var id = parameters.itemIdPrefix+basename.substring(0, (basename.length - 4));
					//console.log(id);	
					var image = $('#'+id).attr("src", src);
					$(image).load(function() {
						cpt++;
						//console.log(key+' : loaded ('+cpt+'/'+total+')');
						if (cpt == total) {
							//console.log('all are loaded');
							if (parameters.onAfterLoad) { parameters.onAfterLoad(total); }
							if (!slideshowPlaying && parameters.playAuto && total > 1) { play(); }
						}
					});
				}
			});
		});
	}
	else {
		$.each(arr_url, function(key, src) {
			if (key != 0) {
				var arr_src = src.split('/');
				var basename = arr_src[arr_src.length - 1];
				var id = parameters.itemIdPrefix+basename.substring(0, (basename.length - 4));
				//console.log(id);	
				$('#'+id).attr("src", src);
			}
		});
		if (parameters.onAfterFirstLoad) { parameters.onAfterFirstLoad(); }
		if (parameters.onAfterLoad) { parameters.onAfterLoad(arr_url.length); }
		if (!slideshowPlaying && parameters.playAuto && arr_url.lenght > 1) { play(); }
	}
	
	var resize = function(){
		var image_width = $('.'+parameters.itemClassName).width();  
		var image_height = $('.'+parameters.itemClassName).height();      
		
		var over = image_width / image_height;  
		var under = image_height / image_width;  
		
		var body_width = $('#'+parameters.containerId).width();  
		var body_height = $('#'+parameters.containerId).height();  
		
		if (body_width / body_height >= over) {  
			$('.'+parameters.itemClassName).css({  
				'width': body_width + 'px',  
				'height': Math.ceil(under * body_width) + 'px',  
				'left': '0px',  
				'top': Math.abs((under * body_width) - body_height) / -2 + 'px'  
			});  
		}
		else {  
			$('.'+parameters.itemClassName).css({
				'width': Math.ceil(over * body_height) + 'px',  
				'height': body_height + 'px',  
				'top': '0px',  
				'left': Math.abs((over * body_height) - body_width) / -2 + 'px'
			});
		}
	}  
	resize();

	this.itemNb = arr_item.length;
	this.play = play;
	this.stop = stop;
	this.prev = prev;
	this.next = next;
	this.goto = goto;
	this.resize = resize;
}
