//--- PLACE

(function($) { $.fn.place = function () {
	var elt = $(this);
	// marginRight explicit case of Webkit CSS rendering
	var eltMarginRight = 0;
	if ($.browser.webkit && elt.css('display') == 'block' && elt.css('float') == 'none' && elt.css('position') == 'static'){
		elt.css('display', 'inline-block');
		eltMarginRight = getNumber(elt.css('marginRight'));
	// note : if was FF 3 then
	//	elt.css('display', 'block');
	}
	// marginRight in all cases (and browsers)
	else { eltMarginRight = getNumber(elt.css('marginRight')); }
	// width + paddings + margins
	var eltWidth = getNumber(elt.outerWidth()) + getNumber(elt.css('marginLeft')) + eltMarginRight;
	// height + paddings + margins
	var eltHeight = getNumber(elt.outerHeight()) + getNumber(elt.css('marginTop')) + getNumber(elt.css('marginBottom'));
	// return both
	return { width: eltWidth, height: eltHeight };
}; })(jQuery);

function getNumber(nb) {
	nb = parseInt(nb);
	if (!isNaN(parseFloat(nb)) && isFinite(nb)){ return nb; }
	else { return 0; }
}


//--- SCROLLER

// needs place()

(function($) { 
	$.fn.scroller = function (o)
	{

		// parametrage
		o = $.extend({
			direction: 'vertical', // vertical ou horizontal
			decal: 1, // px de défilement
			decalHover: 1, // px de défilement au survol des boutons
			slow: 30, // interval
			auto: true
		}, o);
		// optz : passage en var des params pour eviter le parcours de tableau
		var direction = o.direction;
		var decal = o.decal;
		var decalNormal = o.decal;
		var decalHover = o.decalHover;
		var slow = o.slow; if (slow < 0){ slow = 30; }
		var auto = o.auto;

		// fonction de calcul de taille reelle d'un elt
		var eltSizeReturn = function(elt){
			var eltSize = null;
			if (direction == 'vertical'){ eltSize = elt.place().height; }
			else { eltSize = elt.place().width; }
			return eltSize;
		};

		// pour chaque container
		$(this).each(function(){
			var container = $(this);
			$('div.scroller', container).each(function(){
				var scroller = $(this);

				// taille du mask
				var mask = $('div.mask', scroller).eq(0);
				var maskSize = null;
				if (direction == 'vertical'){ maskSize = mask.height(); }
				else { maskSize = mask.width(); }

				// taille de la liste
				var list = $('div.list', mask).eq(0);
				var cases = $('div.case', list);
				var listSize = null;
				if (direction == 'vertical'){ listSize = list.height(); } // pas de calcul en fct des elts : un overflow hidden sur la liste suffit
				else {
					// si horizontal, alignement des cases et élargissement de la liste
					listSize = 0;
					cases.css('float', 'left').each(function(){ listSize += eltSizeReturn($(this)); });
					list.width(listSize);
				}

				// si la liste ne doit pas defiler, masque des boutons
				if (listSize < maskSize) { $('.btn', container).css('display','none'); }

				// si la liste doit defiler
				else{
					// affichage des btns
					$('.btn', container).css('display','block');

					// var de position css
					var listOffset = '';
					if (direction == 'vertical'){ listOffset = 'marginTop'; }
					else { listOffset = 'marginLeft'; }

					// taille du premier elt (definie une fois avant pour eviter de devoir boucler dessus systematiquement apres pour la connaitre)
					var caseFirstSize = eltSizeReturn(cases.eq(0));

					// fonction de deplacement
					var scrollerDecal = function(){

						// deplacement de la liste
						var listOffsetVal = parseInt(list.css(listOffset)) - decal;
						list.css(listOffset, listOffsetVal);

						// var du premier elt (sert dans les deux conditions suivantes)
						var cases = $('div.case', list);
						var caseFirst = cases.eq(0);

						// si le premier elt doit etre mis en bout de chaine
						if ((decal >= 0)){
							if (listOffsetVal <= (0-caseFirstSize)){
								// replacement de la list et mise en bout de chaine de l'elt
								list.css(listOffset, 0).append(caseFirst);
								// maj taille du premier elt
								caseFirstSize = eltSizeReturn($('div.case', list).eq(0));
							}
						}

						// si le dernier elt doit etre mis en debut chaine
						else {
							if (listOffsetVal >= -10){
								var caseLast = cases.eq(cases.length -1);
								// replacement de la liste en fonction de la taille de l'elt
								list.css(listOffset, parseInt(list.css(listOffset)) - eltSizeReturn(caseLast));
								// et mise en début de chaine de l'elt
								caseFirst.before(caseLast);
							}
						}

					};

					// gestion du decalage au survol des boutons
					$('.next', container).hover(function(){ decal = decalHover; }, function(){ decal = decalNormal; });
					$('.prev', container).hover(function(){ decal = decalHover * (-1); }, function(){ decal = decalNormal; });

					// lanceuse du defilement
					var autoInterval = null;
					var autoFunc = function(){ autoInterval = setInterval(scrollerDecal, slow); };

					// si mode auto, lancement
					if (auto == true){ autoFunc(); }

					// sinon au survol des boutons
					else { $('.btn', container).hover(function(){ autoFunc(); }, function(){ clearInterval(autoInterval); }); }

					// gestion du stop au survol de la liste
					if (auto == true){
						list.mouseenter(function(){ clearInterval(autoInterval); });
						list.mouseleave(function(){ autoFunc(); });
					}
				}
			});
		});

	};
})(jQuery);
