/*!
 * Plug-in de création de slide d'informations
 * Version 1.5 (09/05/2011)
 * Requiert jQuery 1.4 au minimum
 * Auteur: Eloi THIEBAUT
 */

/**
 * slide() prend un nom de méthode et un tableau de réglages facultatifs en argument: $('#myDiv').slide(method, options)
 * 
 * method: 								nom de méthode ('init', 'update', 'show', 'reposition', 'hide', 'destroy')
 * options: 								tableau de réglages { delay: value, border_color: value, img_button_close: value, img_button_close_hover: value, img_cross_close: value, img_loader: value, skip_loader: value }
 * 
 * delay:									durée de l'effet Fade (défaut: 500)
 * border_color:						code couleur (hexa) de la bordure du slide (défaut: '#666666')
 * img_button_close:				chemin vers l'image du bouton de fermeture central (défaut: 'images/slide_button_close.png', chaîne vide si on ne veut pas l'afficher)
 * img_button_close_hover:	chemin vers l'image du bouton de fermeture central quand la souris est dessus (défaut: 'images/slide_button_close_hover.png')
 * img_cross_close:				chemin vers l'image du bouton de fermeture haut-droite (défaut: 'images/slide_cross_close.png', chaîne vide si on ne veut pas l'afficher)
 * img_loader:							chemin vers l'image du loader (défaut: 'images/slide_loader.gif')
 * skip_loader:							booléen indiquant si on évite le loader (défaut: false)
 */
;(function($) {
	
	// Méthodes
	var methods = {
		// Initialiser
		init: function(options) {
			return this.each(function() {
				// Initialisation des réglages et du DOM si besoin dans le namespace 'slide'
				if (!$(window).data('slide')) {
					// Réglages par défaut
					var settings = {
						delay: 500,
						border_color: '#666666',
						img_button_close: 'images/slide_button_close.png',
						img_button_close_hover: 'images/slide_button_close_hover.png',
						img_cross_close: 'images/slide_cross_close.png',
						img_loader: 'images/slide_loader.gif',
						skip_loader: false
					};
					
					// Ecrasement des réglages si besoin
					if (options) {
						$.extend(settings, options);
					}
					
					// Variables DOM
					// Masque
					if ($('body').outerWidth(true) > $(window).width()) var width = $('body').outerWidth(true);
					else var width = $(window).width();
					if ($('body').outerHeight(true) > $(window).height()) var height = $('body').outerHeight(true);
					else var height = $(window).height();
					var masque = $('<div>', {
						title: 'Fermer',
						css: {
							'position': 'absolute',
							'z-index': '999',
							'top': '0',
							'left': '0',
							'width': width+'px',
							'height': height+'px',
							'background-color': 'gray',
							'opacity': '0.5',
							'cursor': 'pointer',
							'display': 'none'
						}
					});
					// Slide
					var div_slide = $('<div>', {
						html: $('<div>', {
							html: $(this).detach(),
							css: { 'padding': '10px' }
						}),
						css: {
							'position': 'absolute',
							'z-index': '1000',
							'top': '-9999em',
							'left': '-9999em',
							'padding': '10px',
							'background-color': '#FFFFFF',
							'text-align': 'center',
							'font-weight': 'bold',
							'display': 'none',
							'border': '2px solid '+settings.border_color,
							'-moz-border-radius': '10px',
							'-webkit-border-radius': '10px',
							'-khtml-border-radius': '10px',
							'border-radius': '10px'
						}
					});
					// Bouton de fermeture central
					if (settings.img_button_close != '') {
						var button_close = $('<a>', {
								href: 'javascript:void(0);'
							}
						).append(
							$('<img>', {
								'class': 'png_bg',
								src: settings.img_button_close,
								alt: 'Fermer',
								title: 'Fermer',
								css: {
									'cursor': 'pointer',
									'border': 'none'
								}
							})
						);
					} else {
						var button_close = null;
					}
					// Bouton de fermeture haut-droite
					if (settings.img_cross_close != '') {
						var cross_close = $('<a>', {
								href: 'javascript:void(0);',
								css: {
									'position': 'absolute'
								}
							}
						).append(
							$('<img>', {
								'class': 'png_bg',
								src: settings.img_cross_close,
								alt: 'Fermer',
								title: 'Fermer',
								css: {
									'cursor': 'pointer',
									'border': 'none'
								}
							})
						);
					} else {
						var cross_close = null;
					}
					// Loader
					if (settings.skip_loader == false && $('div img', div_slide).size() > 0) {
						var loader = $('<div>', {
							html: '<img src="'+settings.img_loader+'" alt="Chargement" />&nbsp;Chargement...',
							css: {
								'position': 'absolute',
								'z-index': '1000',
								'padding': '10px',
								'width': '200px',
								'height': '50px',
								'line-height': '50px',
								'left': ($(window).width() - 200) / 2 + $(window).scrollLeft()+'px',
								'top': ($(window).height() - 50) / 2 + $(window).scrollTop()+'px',
								'background-color': '#FFFFFF',
								'text-align': 'center',
								'font-weight': 'bold',
								'display': 'none',
								'border': '2px solid '+settings.border_color,
								'-moz-border-radius': '10px',
								'-webkit-border-radius': '10px',
								'-khtml-border-radius': '10px',
								'border-radius': '10px'
							}
						});
					} else {
						var loader = null;
					}
					
					// Enregistrement des données dans le namespace 'slide'
					$(window).data('slide', {
						'settings': settings,
						'masque': masque,
						'div_slide': div_slide,
						'button_close': button_close,
						'cross_close': cross_close,
						'loader': loader
					});
					
					// Construction DOM
					$('body').append($(window).data('slide').masque);
					$('body').append($(window).data('slide').loader);
					$(window).data('slide').div_slide.append($(window).data('slide').button_close);
					$(window).data('slide').div_slide.append($(window).data('slide').cross_close);
					$('body').append($(window).data('slide').div_slide);
					
					// Enregistrement des événements dans le namespace 'slide'
					var $this = $(this);
					$(window).data('slide').masque.bind('click.slide', function() { $this.slide('hide'); });
					if ($(window).data('slide').button_close != null) {
						$(window).data('slide').button_close.bind('click.slide', function() { $this.slide('hide'); });
						$(window).data('slide').button_close.bind('mouseover.slide', function() { $(this).attr('src', $(window).data('slide').settings.img_button_close_hover); });
						$(window).data('slide').button_close.bind('mouseout.slide', function() { $(this).attr('src', $(window).data('slide').settings.img_button_close); });
					}
					if ($(window).data('slide').cross_close != null) {
						$(window).data('slide').cross_close.bind('click.slide', function() { $this.slide('hide'); });
					}
					$(window).bind('resize.slide', function() { $this.slide('reposition'); });
					$(document).bind('keyup.slide', function(e) { if (e.keyCode == 27) $this.slide('hide'); });
					
					// Affichage
					$(this).slide('show');
				} else {
					// Remplacement du contenu du slide
					$(this).slide('update');
				}
			});
		},
		// Mise à jour
		update: function() {
			return this.each(function() {
				if ($(window).data('slide')) {
					$(window).data('slide').div_slide.children('div').html($(this).detach());
					$(this).slide('show');
				}
			});
		},
		// Afficher
		show: function() {
			return this.each(function() {
				if ($(window).data('slide')) {
					$(window).data('slide').masque.fadeIn($(window).data('slide').settings.delay);
					var $this = $(this);
					if ($(window).data('slide').loader != null) {
						// On affiche le loader si le slide contient des images (le temps que ces dernières chargent)
						$(window).data('slide').loader.fadeIn($(window).data('slide').settings.delay, function() {
							$this.slide('reposition');
							$('div img', $(window).data('slide').div_slide).one('load', function() {
								$(window).data('slide').loader.hide();
								$(window).data('slide').div_slide.slideDown(function() {
									$this.slide('reposition');
									// Repositionnement du bouton de fermeture haut-droite
									if ($(window).data('slide').cross_close != null) {
										$(window).data('slide').cross_close.css({
											'right': '-'+$(window).data('slide').cross_close.width() / 2+'px',
											'top': '-'+$(window).data('slide').cross_close.height() / 2+'px'
										});
									}
								});
							}).each(function() {
								// Contournement bug IE6
								if (this.complete || ($.browser.msie && parseInt($.browser.version, 10) == 6)) $(this).trigger('load');
							});
						});
					} else {
						$(window).data('slide').div_slide.fadeIn($(window).data('slide').settings.delay, function() {
							$this.slide('reposition');
							// Repositionnement du bouton de fermeture haut-droite
							if ($(window).data('slide').cross_close != null) {
								$(window).data('slide').cross_close.css({
									'right': '-'+$(window).data('slide').cross_close.width() / 2+'px',
									'top': '-'+$(window).data('slide').cross_close.height() / 2+'px'
								});
							}
						});
					}
				}
			});
		},
		// Repositionnement
		reposition: function() {
			return this.each(function() {
				if ($(window).data('slide')) {
					// Repositionnement du masque
					if ($('body').outerWidth(true) > $(window).width()) var width = $('body').outerWidth(true);
					else var width = $(window).width();
					if ($('body').outerHeight(true) > $(window).height()) var height = $('body').outerHeight(true);
					else var height = $(window).height();
					$(window).data('slide').masque.css({
						'width': width+'px',
						'height': height+'px'
					});
					// Repositionnement du loader
					if ($(window).data('slide').loader != null) {
						$(window).data('slide').loader.css({
							'left': ($(window).width() - 200) / 2 + $(window).scrollLeft()+'px',
							'top': ($(window).height() - 50) / 2 + $(window).scrollTop()+'px'
						});
					}
					// Repositionnement du slide
					$(window).data('slide').div_slide.css({
						'left': ($(window).width() - $(window).data('slide').div_slide.width()) / 2 + $(window).scrollLeft()+'px',
						'top': ($(window).height() - $(window).data('slide').div_slide.height()) / 2 + $(window).scrollTop()+'px'
					});
				}
			});
		},
		// Cacher
		hide: function() {
			return this.each(function() {
				if ($(window).data('slide')) {
					$(window).data('slide').masque.fadeOut($(window).data('slide').settings.delay);
					var $this = $(this);
					$(window).data('slide').div_slide.fadeOut($(window).data('slide').settings.delay, function() { $this.slide('destroy'); });
				}
			});
		},
		// Destruction
		destroy: function() {
			return this.each(function() {
				if ($(window).data('slide')) {
					// Destruction des événements
					$(window).data('slide').masque.unbind('.slide');
					if ($(window).data('slide').button_close != null) $(window).data('slide').button_close.unbind('.slide');
					if ($(window).data('slide').cross_close != null) $(window).data('slide').cross_close.unbind('.slide');
					$(window).unbind('.slide');
					$(document).unbind('.slide');
					
					// Destruction du DOM
					$(window).data('slide').masque.remove();
					if ($(window).data('slide').loader != null) $(window).data('slide').loader.remove();
					$(window).data('slide').div_slide.remove();
					
					// Destruction des données
					$(window).removeData('slide');
				}
			});
		}
	};
	
	// Appel des méthodes
	$.fn.slide = function(method) {
		if (methods[method]) {
			return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
		} else if (typeof method === 'object' || !method) {
			return methods.init.apply(this, arguments);
		} else {
			$.error('Method '+method+' does not exist on jQuery.slide');
		}
	};
	
})(jQuery);

