/*
 *
 *	@titre: carousel moniteur.
 *	@description: javascript carousel moniteur.
 *	@auteur: neov - http://www.neov.net.
 *	@creation: 20090423.
 *	@modification: 20090429.
 *
*/

(function($)
{
	// fonction animating.
	$.fn.animating = function ( prop, speed, easing, callback )
	{
		var optall = $.speed(speed, easing, callback);

		return this[ optall.queue === false ? "each" : "queue" ](function(){
			if ( this.nodeType != 1)
				return false;

			var opt = $.extend({}, optall), p,
				hidden = $(this).is(":hidden"), self = this;

			for ( p in prop ) {
				if ( prop[p] == "hide" && hidden || prop[p] == "show" && !hidden )
					return opt.complete.call(this);

				if ( p == "height" || p == "width" ) {
					opt.display = $.css(this, "display");

					opt.overflow = this.style.overflow;
				}
			}

			if ( opt.overflow != null )
				this.style.overflow = "hidden";

			opt.curAnim = $.extend({}, prop);

			$.each( prop, function(name, val){
				var e = new $.fx( self, opt, name );

				if ( /toggle|show|hide/.test(val) )
					e[ val == "toggle" ? hidden ? "show" : "hide" : val ]( prop );
				else {
					var parts = val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),
						start = e.cur(true) || 0;

					if ( parts ) {
						var end = parseFloat(parts[2]),
							unit = parts[3] || "px";
						if ( unit != "px" ) {
							self.style[ name ] = (end || 1) + unit;
							start = ((end || 1) / e.cur(true)) * start;
							self.style[ name ] = start + unit;
						}
						
						if ( parts[1] )
							end = ((parts[1] == "-=" ? -1 : 1) * end) + start;

						e.custom( start, end, unit );
					} else
						e.custom( start, val, "" );
				}
			});
			
			return true;
		});
	}

	$.fn.carousel = function(o)
	{
		// options.
		o = $.extend ({
			btnPrec: 		null,		// bouton précedent.
			btnSuiv:		null,		// bouton suivant.
			vitesse:		200,		// vitesse animation.
			easing:			null,		// easing.
			debut:			1,			// image afficher en premier.
			beforeStart:	null,		
			afterEnd:		null,
			marg:			3			// marge entre les images.
		}, o || {});

		return this.each(
			function()
			{
				// variables.
				var enable = true;
				var div = $(this), divSize = div.width(), ul = $('ul', div), li = $('li', ul), nbrItem = li.length, running = false;
				var ulSize = 0, pos = 0, to = 0, backTo = 0, curr = o.debut - 1;
				var posTable = new Array;
				var cnt = 0;
				posTable[0] = 0;

				// redefinition des styles.
				li.css({overflow: 'hidden', float: 'left'});
				ul.css({margin: 0, padding: 0, position: 'relative', 'list-style-type': 'none', 'z-index': 1});
				div.css({overflow: 'hidden', position: 'relative', 'z-index': 2, left: 0});

				// preloader.
				li.find('img').each(
					function()
					{
						var imagePreloader = new Image();
	
						imagePreloader.onload = function () {
							imagePreloader.onload = null;
							cnt++;							
							// action a la fin du preload.
							if(cnt == nbrItem)	loaded();
							
						};							
						imagePreloader.src = $(this).attr('src');
					}
				);
				
				function loaded() {
					// calcul la taille de ul.
					for (i=0; i<nbrItem; i++) {
						ulSize += (li.eq(i).innerWidth());
						posTable[i+1] = ulSize;
					};
	
					// active ou desactive le carousel.
					if (ulSize < divSize)
						enable = false;
					// calcul de la position.
					pos = posTable[o.debut-1];				
					pos = (ulSize - pos) < divSize ?  ulSize - divSize - 2 : pos ;
					
					// attribution de la taille et de la position de ul.
					ul.css({width: ulSize});
	
					if (enable){
						move(-pos);
	
						// prochaine position.				
						getNextPos();
						// attribution des actions sur le bouton precedent.
						if(o.btnPrec)
							$(o.btnPrec).click(
								function()
								{
									return moveLeft();
								}
							);
		
						// attribution des actions sur le bouton suivant.
						if(o.btnSuiv)
							$(o.btnSuiv).click(
								function()
								{	
									return moveRight();
								}
							);
					}
				}
				
				// fonction getNextPos
				function getNextPos()
				{
					for (t=0; t<posTable.length; t++) {
						if (posTable[t] > (divSize + pos)) {
							to = t - 1;
							break;
						}
					}
				}

				// fonction move.
				function move(pos) {
					ul.animating(
						{left: pos},
						o.vitesse,
						o.easing,
						function()
						{
							if(o.afterEnd)
								o.afterEnd.call(this);
							running = false;
						}
					);
					
				}

				// fonction moveLeft.
				function moveLeft()
				{					
					if (!running) {						
						
						// before start.
						if(o.beforeStart)
							o.beforeStart.call(this);
						
						running = true;

						// positionnement de ul.
						if ((ulSize - posTable[to])< divSize) {
							posTable[to] = ulSize - divSize - 2;
						}

						pos = (ulSize - posTable[to])< divSize ? ulSize - divSize - 2 : posTable[to];

						// deplacement
						move(-pos);

						// prochaine position.
						getNextPos();

					}

					return false;
				};

				// fonction moveRight.
				function moveRight()
				{
					if (!running) {
						
						// before start.
						if(o.beforeStart)
							o.beforeStart.call(this);

						running = true;

						// positionnement de ul.
						if (pos < divSize)
						{
							pos = 0;
						} else {
							pos = pos - divSize;

							for (p=0; p < posTable.length; p++)
							{
								if (pos < posTable[p])
								{
									pos = posTable[p];
									break;
								}
							}

						}

						// deplacement
						move(-pos);

						// prochaine position.
						getNextPos();

					}

					return false;
				};

			}
		);
	};

})(jQuery);

// debut carousel.
$(function()
{
	// carousel portfolio.
	$('.carousel-content').carousel(
		{
			btnPrec: '.suiv',
			btnSuiv: '.prec',
			debut: debut
		}
	);

});
