/**
 * @name    jquery.ligthBox
 * @desc    affichage d'un object au centre de la page sur fond opaque
 * @author  clement PEREZ
 * @version 1.0
 */
/**
 * @name    jquery.ligthBox
 * @desc    affichage d'un object au centre de la page sur fond opaque
 * @author  clement PEREZ
 * @version 1.0 - modifier : interdiction pour ie + mise a jour de l'ombre
 */

LB_TYPE_IMG    = 'lbImg';
LB_TYPE_IFRAME = 'lbIframe';
LB_TYPE_DIV    = 'lbDiv';
LB_TYPE_AJAX   = 'lbAjax';
LB_TYPE_CHARG  = 'lbCharg';
LB_TYPE_TMP    = 'lbTemp';

LB_FLAG_TR_IMG = '-LB-';
LB_MARGE_MIN   = 20;
LB_FIXE_MIN    = 40;
LB_CLASS_ALB   = 'lbAlb';
LB_EXT_IMG     = 'jpg|bmp|gif|png';
LB_langue      = {TXT_FERMER  : 'Fermer',
		          TXT_DIM_INIT: 'Re-dimentionner',
				  TXT_SUIV    : 'Suivant',
	         	  TXT_PREC    : 'Précédant',
		          TXT_TOF_IMG : 'image',
	         	  TXT_TOF_SUR : 'sur',
				  TXT_ERREUR  : 'Erreur Javascript'};

(function($){

	$.fn.lightBox = function(param) {
		return this.each(function() {
			new $.lightBox( $(this), param );   
		});
	};

	$.lightBox = function(jEl, param){
		var param = $.extend({
			type        : LB_TYPE_IMG,
			temp        : false,
			src         : null,
			jElRelativ  : null,
			hauteurFixe : LB_FIXE_MIN,
			titre       : null,
			iLargeur    : null,
			iHauteur    : null,
			divElmt     : null,
			fn_ajaxChg  : null
		}, param);
		
		if ( $.browser.msie || !verifParam() )
			return true;
		
		// actions spécifiques en fonctions du type de cadre
		switch ( param.type ){
			case LB_TYPE_IMG : 
				initCadreImage(); break;
			case LB_TYPE_IFRAME : 
				initCadreIFrame(); break;
			case LB_TYPE_DIV : 
				initCadreDiv(); break;
			case LB_TYPE_AJAX : 
				initCadreAjax(); break;
			default : 
				return false;
		}
		
		/*
		 * @name verifParam()
		 */
		function verifParam(){
			param.idCadre = 'cd_' + Math.round(Math.random() * 1000000);
			if ( param.jElRelativ != null && typeof( toto ) == 'string' )
				jElRelativ = $(jElRelativ);
			
			if ( param.type == LB_TYPE_IMG && !$.lightBox.verifUrlImg(param.src) ){
				if ( $.lightBox.verifUrlImg(jEl.attr('href')) ){
					param.src   = jEl.attr('href');
					var e = new RegExp(LB_FLAG_TR_IMG + '$');
					param.titre = e.test(jEl.attr('alt')) ? jEl.attr('alt').replace(LB_FLAG_TR_IMG, '') : '';
				}
				else
					return false;
			}
			else if ( param.type == LB_TYPE_IMG )
				param.temp = true;
			
			else if ( param.type == LB_TYPE_IFRAME && (param.src == null || param.iLargeur == null || param.iHauteur == null) )
				return false;
			
			else if ( param.type == LB_TYPE_DIV    && (param.divElmt == null || param.divElmt.length == 0) )
				return false;
			
			else if ( param.type == LB_TYPE_AJAX   && param.src == null )
				return false;
			
			return true;
		}		
		/*
	 	 * @name initCadreImage()
		 */
		function initCadreImage(){
			var params = param;
			jEl.click(function(){
				// lancement du gif d'attente
				$.lightBox.AfficherChargement();

				var cadre = $("#" + params.idCadre);
				if (cadre.length == 0) {
					var contenu = ['<img alt="'+ params.titre +'" /><p>'+ params.titre +'</p>'];
					if ( $(this).hasClass(LB_CLASS_ALB) ){
						var i  = $("."  + LB_CLASS_ALB).index(this);
						var nb = $("."  + LB_CLASS_ALB).length;
						
						contenu.push( '<div>' );
						if ( i != 0 )     contenu.push( '<span class="lightbox_prec" title="'+LB_langue.TXT_PREC+'">&nbsp;</span>' );
						contenu.push( LB_langue.TXT_TOF_IMG +' '+ (i+1) +' '+ LB_langue.TXT_TOF_SUR +' '+ nb );
						if ( i != nb-1 )  contenu.push( '<span class="lightbox_suiv" title="'+LB_langue.TXT_SUIV+'">&nbsp;</span>' );
						contenu.push( '</div>' );
					}
					contenu = $(contenu.join(''));
					$("span", contenu).click(function(){ 
						$("."  + LB_CLASS_ALB).eq( $(this).hasClass('lightbox_prec') ? i-1 : i+1 ).trigger('click');
					});
						
					cadre = $.lightBox.nouveauCadre(params.type, contenu, params.idCadre);
					var hCadreFixe = cadre.height();
					
					// chargement et affichage de l'image
					var img = new Image();
					img.onload = function() {
							$("img", cadre).attr('src', params.src);
							$.lightBox.changerCadre(cadre, $("img", cadre), hCadreFixe);
							img.onload=function(){};  // ie ?!X
					};
					img.src = params.src;
				}
				else
					$.lightBox.changerCadre(cadre, $("img", cadre));
				
				return false;
			});
		}
		/*
	 	 * @name initCadreIFrame()
		 */
		function initCadreIFrame(){
			var params = param;
			jEl.click(function(){
				// lancement du gif d'attente
				$.lightBox.AfficherChargement();
				
				var cadre = $("#" + params.idCadre);
				if ( cadre.length == 0 ){
					var iframe = $("<iframe></iframe>").attr({frameborder: 0, src: params.src, height: params.iHauteur, width: params.iLargeur});
					cadre = $.lightBox.nouveauCadre(params.type, iframe, params.idCadre);
					$("iframe", cadre).load(function(){
						$.lightBox.changerCadre(cadre, $("iframe", cadre), LB_FIXE_MIN);
					});
				}
				else
					$.lightBox.changerCadre(cadre, $("iframe", cadre), LB_FIXE_MIN);

				return false;
			});
		}
		/*
	 	 * @name initCadreDiv()
		 */
		function initCadreDiv(){
			var params = param;
			jEl.click(function(){
				// lancement du gif d'attente
				$.lightBox.AfficherChargement();
				
				var cadre = $("#" + params.idCadre);
				if ( cadre.length == 0 )
					cadre = $.lightBox.nouveauCadre(params.type, params.divElmt, params.idCadre);
				
				$.lightBox.changerCadre(cadre, params.jElRelativ, params.hauteurFixe);
				
				return false;
			});
		}
		/*
	 	 * @name initCadreAjax()
		 */
		function initCadreAjax(){
			var params = param;
			jEl.click(function(){
				// lancement du gif d'attente
				$.lightBox.AfficherChargement();
				
				var cadre = $("#" + params.idCadre);
				if (cadre.length == 0) {
					 $.ajax({ url    : params.src,
				          error  : function(){ $.lightBox.ecrireErreur(TXT_ERR_AJAX) },
						  success: function(data){ 
							  cadre = $.lightBox.nouveauCadre(params.type, data, params.idCadre);
							  if ( params.fn_ajaxChg )
								   params.fn_ajaxChg();
							  $.lightBox.changerCadre(cadre, params.jElRelativ, params.hauteurFixe);
						  }
					});
				}
				else
					$.lightBox.changerCadre(cadre, params.jElRelativ, params.hauteurFixe);
				
				return false;
			});
		}
	};
	/* ******************************************************************************************************** *\
	 *                                       -- actions sur le cadre --                                         *
	 * ******************************************************************************************************** */
	$.lightBox.init = function(){
		if ($("#lightbox").length == 0) {
			var cadreFen = $('<div id="lightbox"><div id="lightbox_ombre"><!-- --></div></div>');
			$("body").append(cadreFen);
			$("#lightbox_ombre").css('height', $("body").height()).click(function(){
				$.lightBox.cacherCadre();
			});
			$(document).keydown(function(e){
				if (e.keyCode == 27) 
					$.lightBox.cacherCadre();
			});
		}
	};
	$.lightBox.nouveauCadre = function(type, contenu, id){
		$.lightBox.init();
		var cadre = $('<div>').addClass('lightbox_cadre').addClass(type);
		if ( id ) cadre.attr('id', id);
		else      cadre.addClass(LB_TYPE_TMP);
		
		if ( type != LB_TYPE_CHARG ) cadre.append( $('<p class="lightbox_fermer"  title="'+ LB_langue.TXT_FERMER   +'"><!-- --></p>') )
		                                  .append( $('<p class="lightbox_dimInit" title="'+ LB_langue.TXT_DIM_INIT +'"><!-- --></p>') );
		
		cadre.append( $('<div>').addClass('lightbox_contenu') );
		if ( contenu ) $(".lightbox_contenu", cadre).append(contenu);
		
		$(".lightbox_fermer", cadre).click(function(){ $.lightBox.cacherCadre() });
		
		$("#lightbox").append(cadre);
		return cadre;
	};	

	$.lightBox.cacherCadre = function(){
		$("#lightbox").removeClass('on');
		$(".lightbox_cadre").each(function(){
			if ( $(this).hasClass(LB_TYPE_TMP) ) 
				$(this).remove();
			else
				$(this).hide().removeClass('on');
		});
	};

	$.lightBox.AfficherChargement = function(){
		$.lightBox.supprErreur();
		var ecranDim  = $.lightBox.getEcranDim();
		var cdCharg   = $.lightBox.nouveauCadre(LB_TYPE_CHARG, null);
		cdCharg.css({
			left: Math.round( ( ecranDim.largeur - cdCharg.width()  ) / 2 ), 
			top:  Math.round( ( ecranDim.hauteur - cdCharg.height() ) / 2 )
		});
		
		$("#lightbox").addClass('on');
		$.lightBox.changerCadre(cdCharg);
		$("." + LB_TYPE_TMP).each(function(){ if ( !$(this).hasClass('on') ) $(this).remove()});
	};

	$.lightBox.changerCadre = function(nvCadre, jElRelativ, hCadreFixe, fnRedim){
		$.lightBox.supprErreur();
		
		var exCadre = $(".lightbox_cadre.on");
		if (nvCadre.hasClass(LB_TYPE_CHARG)) {
			exCadre.remove();
			nvCadre.addClass('on').show();			
		}
		else {
			exCadre.removeClass('on').fadeOut(1500, function(){  if (exCadre.hasClass(LB_TYPE_TMP))  exCadre.remove(); });
			nvCadre.addClass('on').fadeIn(1000);
		}
		
		var fnClick = function() {
			$.lightBox.redimCadre(nvCadre, jElRelativ);
			if (fnRedim) fnRedim();
		};
		fnClick();
		$(".lightbox_dimInit", nvCadre).unbind('click', fnClick).click(fnClick);
		$("#lightbox_ombre").css('height', $("body").height());
	};

	$.lightBox.redimCadre = function(cadre, jElRelativ, hCadreFixe){
		if ( jElRelativ == null || jElRelativ.length == 0 )
			jElRelativ = $(".lightbox_contenu", cadre);

		if ( !hCadreFixe )
			hCadreFixe = cadre.height() - jElRelativ.height();
		jElRelativ.css({ height: '', width: '' });

		var hauteurCd  = cadre.height();
		var ecranDim   = $.lightBox.getEcranDim();
		if ( 2 * LB_MARGE_MIN + hauteurCd > ecranDim.hauteur ){
			var cadreTop = LB_MARGE_MIN;
			var h = ecranDim.hauteur - 2*LB_MARGE_MIN - hCadreFixe;
			$(jElRelativ).css({ height: h <= 0 ? LB_MARGE_MIN : h, 'overflow-y': 'auto' });
		}
		else
			var cadreTop = Math.round( ( ecranDim.hauteur - hauteurCd ) / 2 );

		cadre.css({top: cadreTop, left: Math.round( ( ecranDim.largeur - cadre.width() ) / 2)} );
	};
	/* ******************************************************************************************************** *\
	 *                                             -- Utils --                                                  *
	 * ******************************************************************************************************** */
	$.lightBox.msgPopup = function(message){
		var dimEcran = $.lightBox.getEcranDim;
		
		var msgPopup = $("<div id='lbMsgPopup'><div>" + message + "</div></div>").css({top:'-5000px', right:0, opacity:0.5, 'z-index':100});
		$("body").append(msgPopup);
		msgPopup.css({top: '-' + msgPopup.height() + 'px' }).animate({top:0}, 2000);
		setTimeout(function(){ msgPopup.fadeOut(500, function(){ msgPopup.remove(); })}, 5000);
	};
	$.lightBox.getCadre = function(jElNimp){
		return jElNimp.parents(".lightbox_cadre");
	};
	$.lightBox.ecrireErreur = function(erreur){
		$.lightBox.cacherCadre();
		msg = $("<p></p>").attr('id', 'lbErreur').append(TXT_ERREUR+" : "+ erreur);
		$("#cadreMessage").append(msg);
	};
	$.lightBox.supprErreur = function(erreur){
		$("#lbErreur").remove();
	};	
	$.lightBox.definirAlbum = function(jEl){
		jEl.addClass(LB_CLASS_ALB);
	};

	$.lightBox.verifUrlImg = function($url){
		var e = new RegExp('\.('+ LB_EXT_IMG +')$', 'i');
		return e.test($url);
	};

	$.lightBox.getEcranDim = function(){
		if (typeof(window.innerWidth) == 'number')
			var dim = {largeur: document.documentElement.clientWidth,
				       hauteur: window.innerHeight};
			
		else if (document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight))
			var dim = {largeur: document.documentElement.clientWidth,
				       hauteur: document.documentElement.clientHeight};

		else if (document.body && (document.body.clientWidth || document.body.clientHeight))
			var dim = {largeur: document.body.clientWidth,
				       hauteur: document.body.clientHeight};

		return dim;
	}
})(jQuery);