/**
 * Gestion d'un groupe d'image avec JQuery
 *
 * Permet de gérer un groupe d'images
 *
 * @author bbroussolle
 * @since 2009-10-22
 * @requires jquery
 * @copyrights SQLI 2009
 */
(function($) {
	$.fn.blockImage = function(params){

		var elements=$(this);

		var obj = {
			constructor	: function(param){
				this.saveParams(this.defaults);
				this.saveParams(param);
				var elem = this.params.arrElements;
				elements.children().each(function(){
					elem.push($(this));
				});
				this.saveParams({osTo:this.params.osT*2,osLo:this.params.osL*2,osT:this.params.osT-this.params.iH/2,osL:this.params.osL-this.params.iW/2});
				this.carouselInit();
				elements.css({width:this.params.W*2+this.params.iW-this.params.osLo, height:this.params.H*2+this.params.iH-this.params.osTo, position:'relative', overflow:'hidden'});
				return obj;
			},
			defaults	: {osT:0, osL:0, W:200,	H: 100, iH:110, iW:110, cp:300,	p:2, s:1500	},
			params		: {
				arrElements	: {
					tableau	: new Array(),
					push	: function(elem){this.tableau.push(elem);},
					each	: function(callback){
						for(i=0;i<this.length();i++){
							this.tableau[i] = callback({element:this.tableau[i],params:obj});
						}
					},
					length : function(){return this.tableau.length;}
				}
			},
			saveParams	: function(newParams){this.params = $.extend(this.params, newParams);},
			
			carouselInit	: function(){
				var angle =  (Math.PI * 2)/this.params.arrElements.length();
				this.saveParams({angle:angle});
				var offsetPosition = 1*Math.PI/2;
				var count = 0
				this.params.arrElements.each(function(elemAndParam){
					var imageAngle 	= (angle*count)+offsetPosition;
					var positionLeft= elemAndParam.params.carouselPosLeft(imageAngle);
					var positionTop = elemAndParam.params.carouselPosTop(imageAngle);
					var ratio = ((positionTop+elemAndParam.params.params.osT)-((2*elemAndParam.params.params.H)-elemAndParam.params.params.p))/elemAndParam.params.params.p;
					ratio = (ratio>=0)?ratio:0;
					var zindex = Math.round(ratio*100);
					var opacity = ((positionTop-elemAndParam.params.params.osT)-((2*elemAndParam.params.params.H)-elemAndParam.params.params.cp))/elemAndParam.params.params.cp;
					opacity = (opacity>0)?opacity:0;
					count=count+1;
					return elemAndParam.element.image({imageAngle:imageAngle,x:positionLeft,y:positionTop,z:zindex,o:opacity,h:elemAndParam.params.params.iH,w:elemAndParam.params.params.iW,r:ratio,s:elemAndParam.params.params.s})
				});
				
			},
			carouselPosLeft	: function(angle){
				return (this.params.W+(Math.cos(angle)*this.params.W))-this.params.osL;
			},
			carouselPosTop	: function(angle){
				return (this.params.H+(Math.sin(angle)*this.params.H))-this.params.osT;
			},
			carouselMove	: function(sens, callback){
				if (arguments[2] != null)var pos = arguments[2]; else var pos = 0;
				var multiple = 0*pos;
				switch(sens){
					case 'gauche' : multiple = 1*((pos!=0)?pos:1);break;
					case 'droite' : multiple = -1*((pos!=0)?pos:1);break;
				}
				
				this.params.arrElements.each(function(elemAndParam){
					var imageAngle = (elemAndParam.element.params.imageAngle)+(multiple*elemAndParam.params.params.angle);
					elemAndParam.element.saveParams({imageAngle:imageAngle});
					var positionLeft= elemAndParam.params.carouselPosLeft(imageAngle);
					var positionTop = elemAndParam.params.carouselPosTop(imageAngle);
					var ratio = ((positionTop+elemAndParam.params.params.osT)-((2*elemAndParam.params.params.H)-elemAndParam.params.params.p))/elemAndParam.params.params.p;
					ratio = (ratio>=0)?ratio:0;
					var zindex = Math.round(ratio*100);
					var opacity = ((positionTop-elemAndParam.params.params.osT)-((2*elemAndParam.params.params.H)-elemAndParam.params.params.cp))/elemAndParam.params.params.cp;
					opacity = (opacity>0)?opacity:0;
					elemAndParam.element.params.position.change(positionLeft,positionTop,zindex);
					elemAndParam.element.params.scale.changeRatio(ratio);
					elemAndParam.element.params.opacity.change(opacity);
					elemAndParam.element.animateByCenter(callback);
					
					return  elemAndParam.element;
				});
			}
		};
		
		$(this).data('blockImage',obj.constructor(params));
		return $.extend($(this),obj) ;
	};
})(jQuery);
