/**
 * JQUERY SHADOW PLUGIN v1.0 :
 * Plugin jQuery d'ajout d'ombre.
 * @author Alexandre GUEDO
 */
(function($) {
		
	/**
	 * Ajoute une ombre aux éléments sélectionnés.
	 * @param options	les options de l'utilsateur
	 */
	$.fn.shadow = function(userOptions) {
		// Paramètres par défaut
		var options = {
			offset:  3,		// Position de l'ombre par rapport à l'élément (en pixels)
			opacity: 0.4,	// Opacité de l'ombre
			color:   "#000"	// Couleur de l'ombre
		};
		// Merge des paramètres par défaut avec les paramètres utilisateurs
		jQuery.extend(options, userOptions);
		
		/**
		 * Chainage pour chaque élément sélectionné.
		 */
		return this.each(function() {
			
			// On supprime l'ombre éventuellement déja présente
			var $element = $(this).shadowDestroy();
			
			// On crée le div de l'ombre
			$shadow = $("<div class='izShadow' style='position: relative;'></div>");
			// Qui est aussitôt caché
			$shadow.hide();
			// Ajout de l'ombre après l'élément
			$shadow.insertAfter($element);
						
			// Taille de l'élément
			var elmWidth	= $element.outerWidth();
			var elmHeight	= $element.outerHeight();
			// Position sur la page
			var position	= $element.position();
			// Position verticale
			var zIndex		= parseInt($element.css("zIndex")) || 0;
			
			// L'élément est positionné verticalement une valeur au-dessus de sa position normale
			$element.css({ zIndex: zIndex + 1 });
			
			// On positionne l'ombre sous l'élément
			$shadow.css({
				position:     "absolute",
				zIndex:       zIndex,
				top:          position.top+"px",
				left:         position.left+"px",
				width:        elmWidth,
				height:       elmHeight,
				marginLeft:   $element.css("marginLeft"),
				marginRight:  $element.css("marginRight"),
				marginBottom: $element.css("marginBottom"),
				marginTop:    $element.css("marginTop")
			});
			
			// Ajout des coins plus ou moins arrondis
			$('<div class="izShadowColor"></div>').css({ 
				position: 'absolute', 
				opacity: options.opacity - 0.05,  
				left: options.offset,     
				top: options.offset,     
				width: elmWidth + 1, 
				height: elmHeight + 1 }).appendTo($shadow);
			$('<div class="izShadowColor"></div>').css({ 
				position: 'absolute',
				opacity: options.opacity - 0.10,  
				left: options.offset + 2, 
				top: options.offset + 2, 
				width: elmWidth,     
				height: elmHeight - 3 }).appendTo($shadow);
			$('<div class="izShadowColor"></div>').css({ 
				position: 'absolute', 
				opacity: options.opacity - 0.10,  
				left: options.offset + 2, 
				top: options.offset + 2, 
				width: elmWidth - 3, 
				height: elmHeight }).appendTo($shadow);
			$('<div class="izShadowColor"></div>').css({ 
				position: 'absolute', 
				opacity: options.opacity,         
				left: options.offset + 1, 
				top: options.offset + 1, 
				width: elmWidth - 1, 
				height: elmHeight - 1 }).appendTo($shadow);
			
			// Ajout de la couleur et de la position absolue
			$("div.izShadowColor").css("position", "absolute");
			$("div.izShadowColor").css("background-color", options.color);
			
			// Affichage de l'ombre
			$shadow.show();

		});
	};
	
	/**
	 * Fait apparaitre l'ombre attaché à l'élément s'il en posséde une.
	 */
	$.fn.shadowShow  = function() { 
		return $(this).find("+ .izShadow").show().end();   
	};

	/**
	 * Fait disparaitre l'ombre attaché à l'élément s'il en posséde une.
	 */
	$.fn.shadowHide = function() { 
		return $(this).find("+ .izShadow").hide().end();   
	};
	
	/**
	 * Supprime complétement l'ombre attaché à l'élément s'il en posséde une.
	 */
	$.fn.shadowDestroy = function() { 
		return $(this).find("+ .izShadow").remove().end();  
	};
	
})(jQuery);
