/**
 * Objet Image
 * Permet de gérer une image
 * @author bbroussolle
 * @since 2009-10-22
 * @requires jquery
 * @copyrights SQLI 2009
 */
(function($) {

	$.fn.image = function(params){
		var master_object = $(this);
		
		var obj = {
			/**
			 * constructeur
			 * @contructor
			 * @param {json} param ensemble des parametres passes par l'utilisateur
			 */
			constructor 	: function(param){
				this.saveParams(this.defaults);
				this.saveParams(param);
				this.params.scale.changeReelScale(this.params.h, this.params.w);
				this.params.scale.changeRatio(this.params.r);
				this.params.position.change(this.params.x-(this.params.scale.getNewCenter().cW), this.params.y-(this.params.scale.getNewCenter().cH), this.params.z);
				this.params.opacity.change(this.params.o);
				this.params.position.apply();
				this.params.scale.apply();
				this.params.opacity.apply();
				master_object.css('position', 'absolute');
				return obj;
			},
			/**
			 * Defaults
			 * @type json
			 * @param {int}		x	position par rapport au côté gauche de l'élément maitre
			 * @param {int}		Y	position par rapport au haut de l'élément maitre
			 * @param {int}		z	profondeur de l'image
			 * @param {int}		h	hauteur de l'image
			 * @param {int}		w	largeur de l'image
			 * @param {float}	o	opacité de l'image
			 * @param {float}	r	ratio de l'image en hauteur et largeur
			 * @param {int}		s	rapidité de l'animation
			 */
			defaults	: {x:0,y:0,z:0,h:0,w:0,o:1,r:1,s:1500},
			params		: {
				position	: {
					X:0, Y:0, Z:0,
					change	: function(x,y,z){this.X=x;this.Y=y;this.Z=z},
					apply	: function(){master_object.css('z-index', this.Z);master_object.css({left:this.X,top:this.Y});}
				},
				scale		: {
					H:0, rH:0, W:0,	rW:0, R:1,
					changeReelScale	: function(h,w){this.rW=w;this.rH=h;},
					change			: function(){this.H = Math.round(this.rH*this.R);this.W = Math.round(this.rW*this.R);},
					changeRatio		: function(newRatio){this.R = newRatio; this.change();},
					getReelCenter	: function(){var cH=this.rH/2, cW=this.rW/2;return {cH:cH,cW:cW};},
					getNewCenter	: function(){var cH=this.H/2, cW=this.W/2;return {cH:cH,cW:cW};},
					getPaddings		: function(){var def = this.getReelCenter(), current = this.getNewCenter();return {top:def.cH-current.cH, left:def.cW-current.cW};},
					apply			: function(){master_object.css({height:this.H, width:this.W});}
				},
				opacity		: {
					O:1,
					change			: function(o){this.O = o},
					apply			: function(){master_object.css({opacity:this.O})}
				}
			},
			saveParams	: function(newParams){this.params = $.extend(this.params, newParams);},
			animateByCenter : function(callback){
//				console.log(callback);
				master_object.animate({top:this.params.position.Y-this.params.scale.getNewCenter().cH, left:this.params.position.X-this.params.scale.getNewCenter().cW, height:this.params.scale.H, width:this.params.scale.W, opacity:this.params.opacity.O}, this.params.s , 'swing', 
				function(){
//					if (window.console)console.log(arrowClick);
//					else alert(arrowClick);
					if($(this).css('left')=='200px' && arrowClick){$(this).click();arrowClick = false;}
					});
				master_object.css('z-index', this.params.position.Z);
			},
			animate			: function(){
				master_object.animate({top:this.params.position.Y, left:this.params.position.X,height:this.params.scale.H, width:this.params.scale.W, opacity:this.params.opacity.O}, this.params.s);
				master_object.css('z-index', this.params.position.Z);
			}
		}
		obj.constructor(params);
		return $.extend($(this),obj);
	};
})(jQuery);
