/**
* Ce fichier fait parti d'un package, toute modification doit entrainer la génération
* d'un nouveau package pour être pris en compte.
* voir l'objet ObjFichierPackage pour connaitre la marche à suivre pour regénérer un package
* @since 20/05/2009 Olivier REYT <reyt@benchmark.fr>
*/

/**
 * @package bibliotheque
 * @subpackage benchmark
 * @filesource
 */

/**
 * objet js permettant l'affichage à la manière de jquery.thickbox mais avec la possibilité d'ouvrir n'importe quel code html fournit en paramêtre
 *
 * exemple simple :
 * PHP:
 * $laPage->ajouteJavascript('/framework/lib/js/html_include/benchmark/framework/util/objet.js');
 * $laPage->ajouteJavascript('/framework/lib/js/html_include/benchmark/framework/ihm/objpopup.js');
 * $objPage->ajouteStyle('/framework/lib/js/html_include/benchmark/framework/ihm/objpopup.css');
 * ou
 * $objPage->ajouteStyle('application/lib/js/html_include/benchmark/framework/ihm/');
 * JS:
 * popup = new benchmark.framework.ihm.ObjPopup();
 * popup.ouvreHtml('<p>blabla</p>');
 *
 * popup = new benchmark.framework.ihm.ObjPopup();
 * popup.ouvreURL('http://www.google.com');
 *
 * ou bien pour une image :
 * popup = new benchmark.framework.ihm.ObjPopup();
 * popup.ouvreImage('http://un.site.com/image.jpg');
 *
 * ou bien pour du flash :
 * popup = new benchmark.framework.ihm.ObjPopup();
 * popup.ouvreFlash('http://un.site.com/flash.swf');
 *
 * avec des options :
 * popup = new benchmark.framework.ihm.ObjPopup( { vitesse : 100 });
 * popup.ouvreImage('<p>blabla</p>',{classe : 'autreclasse', id : 28 });
 *
 * pour fermer le popup manuellement :
 * popup.fermer();
 *
 * @author Damien BENOIT <benoit@benchmark.fr>
 * @package bibliotheque
 * @subpackage html_include
 * @version 1.00
 * @since 26/07/08 création du fichier
 * @since 14/10/08 Pierre Chabiland <chabiland@benchmark.fr> ajout d'une methode "modifie" + ajout d'un parametre de configuration à la methode ouvrir et ouvrirHtml
 * @since 16/10/08 Olivier REYT <reyt@benchmark.fr> ajout des methodes "ouvreIframe" et "ouvreURL"
 * @since 16/10/08 Damien BENOIT <benoit@benchmark.fr> changement dans les méthodes d'ouverture et fermeture pour pouvoir réinstancier l'objet plus rapidement et éviter le bug de délais d'une seconde
 * @since 16/12/2008 Thomas JOBERT <jobert@benchmark.fr> Diverses modifs : centrage, animation
 * @since 08/04/2009 Benoit LANDHAUSER <landhauser@benchmark.fr> ajout du parametre masquerFlash
 *			pour ne pas masquer automatiquement les flash à l'ouverture de la popup
 * 			ce paramètre est à trus par défaut (le flash sera masqué), pour les pubs flash notamment
 */

if(typeof benchmark == "undefined") { var benchmark = new Object(); }
if(typeof benchmark.framework == "undefined") { benchmark.framework = new Object(); }
if(typeof benchmark.framework.ihm == "undefined") { benchmark.framework.ihm = new Object(); }

/**
 * constructeur :
 * @param configuration objet de configuration (optionnel )
 * @return void
 */
benchmark.framework.ihm.ObjPopup = function(configuration)
{


	/**
	* @DEPRECATED parcqu'il bloque l'héritage, a un système d'instance buggué, une interface discutable, et qu'il ne colle pas au schéma standard
	* utilisé jusque là (par exemple dans tout ce qui est gestionnaire de fenêtre, MI ou MAA), l'usage de l'eventDispatcher
	* est ici déclaré deprecated, il n'est jusque là utilisé que pour la dépose de commentaire et devra en être converti et il faudra alors
	* supprimmer l'héritage eventDispatcher
	* Si vous souhaitez utiliser des fonctions evenementielles il vous suffit de redéfinir les fonctions evenement de l'objet
	* this.onLoad = function(){}; etc
	* @since 08/07/09 Damien BENOIT <benoit@benchmark.fr>
	*/

	/**
	* @since 22/05/09 Damien BENOIT <benoit@benchmark.fr>
	* redéclaré ici car cet objet hérite de l'eventDispatcher et sans celà la liste reste mutualisée entre les instances
	* cf eventDispatcher.js pour de plus amples explications
	*
	*/
	this._listeEvenenement = {};

	/*@DEPRECATED : */
	this.EVT_ONMOUSECLICKFERMER = 'EVT_ONMOUSECLICKFERMER' ;
	this.EVT_ONKEYDOWNFERMER 	= 'EVT_ONKEYDOWNFERMER' ;
	this.EVT_ONLOADFERMER 		= 'EVT_ONLOADFERMER';

	/**
	 * Fonctions evenementielles remplaçant l'usage de l'eventDispatcher à redéfinir au besoin :
	 *
	 * @note l'usage de delegate est ici évité afin de pouvoir l'utiliser avec un autre contexte que l'objPopup lui même dans les objets appelants.
	 * on passe donc this en argument à chaque evenement
	 * quand un objet d'evenement est disponible il est passé en second argument
	 *
	 * @todo gérer le onLoad d'ouverture d'iframe avec bind sur le load de celle-ci
	 * @since 08/07/09 Damien BENOIT <benoit@benchmark.fr>
	 */
	/* quand le chargement du popup est effectué (ou bien l'image qu'il contient chargé si mode image (@todo differencier ?): */
	this.onLoad = function(){};
	/* quand le popup est fermé */
	this.onUnload = function(){};
	/* quand le popup est déplacé */
	this.onDeplace = function(){};
	/* quand le popup est redimensionné */
	this.onRedimensionne = function(){};
	/* quand le popup est fermé par une touche */
	this.onKeyDownFermer = function(){};
	/* quand le popup est fermé par l'usage du lien fermer */
	this.onClickLienFermer = function(){};

	this.configurationDefaut =
		{
			largeur	: 500,
			hauteur	: 300,
			x		: 0,
			y		: 0,
			vitesse	: 200
		};

	/*
	 * Mode d'ouverture de la popup
	 */
	this.modeOuverture = null;

	this.MODE_IMAGE 	= 1;
	this.MODE_URL 		= 2;
	this.MODE_FLASH 	= 3;
	this.MODE_IFRAME 	= 4;

	/**
	 * fermeture du popup
	 */
	this.ferme = function()
	{
		var objPopupConteneur = $('#ObjPopupConteneur');
		var objPopupMasque = $('#ObjPopupMasque');

		objPopupMasque.unbind('click');
		objPopupMasque.hide();
		objPopupConteneur.slideUp('fast');

		if ($.browser.msie && $.browser.version == '6.0')
		{
			// hack IE permettant de bien supprimer une animation flash dans la page
			$('object', objPopupConteneur).remove();
			$('select.ObjPopUp_select').removeClass('ObjPopUp_select').show();
		}
		if (this.configuration.masquerFlash)
		{
			// On enleve la classe ObjPopUp_flash à tous les flashs et on les réaffiche
			$('.ObjPopUp_flash').removeClass('ObjPopUp_flash').css("visibility", "visible");
		}
		objPopupMasque.remove();
		objPopupConteneur.remove();

		// Fermeture terminée
		this.pDispatchEvent(this.EVT_ONLOADFERMER);
		this.onUnload(this);
	};

	/**
	 * pDispatchEvent ('p' comme surcharge de la fonction du prototype)
	 * @DEPRECATED
	 */
	this.pDispatchEvent = function( pEvent ){
		if(typeof(benchmark.framework.util.EventDispatcher) != "undefined"){
			this.dispatchEvent(new benchmark.framework.util.Event(pEvent));
		}
	}

	/*
	 * obtenir les coordonnées centrées
	* return array x et y positions centrées de l'objet
	* @since 17/11/2008 Thomas JOBERT <jobert@benchmark.fr>
	* Lorsque l'une des taille est supérieure à celle de la fenetre le centrage correspondant n'est pas effectué
	* @since 19/12/2008 Thomas JOBERT Modif gestion du centrage des popups ayant une taille supérieure à la fenêtre
	 *
	 */

	this.getCoordonneeCentre = function ()
	{

		var posX=0;
		var posY=0;

		// centrage vertical
		if ($('#ObjPopupConteneur').height() < $(window).height()) {
			posY = ( ( $(window).height() / 2 ) - ( $('#ObjPopupConteneur').height() / 2 ) );

			if( $.browser.msie && $.browser.version == '6.0' ){
				posY += (document.body.scrollTop || document.documentElement.scrollTop);
			}
		} else {
			// position absolue pour le scroll
			$('#ObjPopupConteneur').css('position','absolute');
			$('#ObjPopupMasque').css('height', $(window).height());
			$('#ObjPopupMasque').css('position','fixed');
		}

		// centrage horizontal
		if ($('#ObjPopupConteneur').width() < $(window).width()){
			posX = ( $(window).width()  / 2) - ($('#ObjPopupConteneur').width() / 2);
		} else {
			// position absolue pour le scroll
			$('#ObjPopupConteneur').css('position','absolute');
			$('#ObjPopupMasque').css('width', $(window).width());
			$('#ObjPopupMasque').css('position','fixed');
		}


		return  {
			x : posX,
			y : posY
		};

	};



	/**
	 * centrer le popup
	 * @return void
	 */
	this.centre = function()
	{
		// centrage :
		var centrer = this.getCoordonneeCentre();
		this.deplace(centrer.x, centrer.y);
	};

	/**
	 * redimensionner le popup
	 * @param x position x
	 * @param y position y
	 * @return void
	 */
	this.redimensionne = function(hauteur, largeur)
	{
		$("#ObjPopIframe").attr(
			{
				width	: largeur,
				height	: hauteur
			}
		);

		//if ($.browser.msie && $.browser.version == '6.0')
		if ($.browser.msie)
		{
			$('#ObjPopupConteneur #ObjPopupContenu').css(
				{
					width	: largeur + 'px',
					height	: hauteur + 'px'
				}
				);
		}
		else
		{
			$('#ObjPopupConteneur #ObjPopupContenu').animate(
				{
					width		: largeur + 'px',
					height		: hauteur + 'px'
				},
				this.configuration.vitesse
			);
		}
		this.onRedimensionne(this);
	};


	/**
	 * déplacer le popup aux coordonnées
	 * @param x position x
	 * @param y position y
	 * @return void
	 */
	this.deplace = function(x, y)
	{
		if (true)
		{
			$('#ObjPopupConteneur').css({
				top: y + 'px',
				left: x + 'px'
			});
		}
		else
		{
			$('#ObjPopupConteneur').animate(
				{
					top	: y + 'px',
					left	: x + 'px'
				},
				this.configuration.vitesse
			);
		}
		this.onDeplace(this);
	};

	/**
	* fonction privée centrale d'ouverture du popup acceptant n'importe quel contenu
	* @param contenu string html
	*/
	this.ouvre = function(contenu, configuration)
	{

		/* Configuration par défaut de la fonction */
		configuration = benchmark.framework.util.objet.fusion(
			configuration,
			{
				fermetureSurClic		: true,
				fermetureMasqueSurClic	: true,
				fermetureAfficheBouton	: true,
	            ouvertureAvecAnimation	: false,
	            masquerFlash			: true
            }
		);

		/* On complète la configuration de ObjPopup */
		this.configuration = benchmark.framework.util.objet.fusion(
			configuration,
			this.configuration
		);

		/* Si on souhaite masquer les flash (comportement par defaut) */
		if (this.configuration.masquerFlash)
		{
			if ($.browser.msie)
			{
				$('object:has(param[name!="wmode"])').addClass('ObjPopUp_flash').css("visibility", "hidden");
				$('object:has(param[name="wmode"][value="window"])').addClass('ObjPopUp_flash').css("visibility", "hidden");
			}
			else
			{
				$('object:has(param[name!="wmode"])').addClass('ObjPopUp_flash').css("visibility", "hidden");
				$('object:has(param[name="wmode"][value="window"])').addClass('ObjPopUp_flash').css("visibility", "hidden");
				$("[src$='swf'][wmode!='opaque'][wmode!='transparent']").addClass('ObjPopUp_flash').css("visibility", "hidden");
			}
		}

		if ($('#ObjPopupMasque').attr('id') != 'ObjPopupMasque')
		{
			$('body').append(
				'<div id="ObjPopupMasque"></div>'+
				'<div id="ObjPopupConteneur" style="top:'+this.configuration.y+'px;left:'+this.configuration.x+'px;'+
				( ($.browser.msie && $.browser.version == '6.0' ) ? 'width:'+this.configuration.largeur+'px;height:'+this.configuration.hauteur+'px;' : '' ) +
				'">'+
				( (configuration.fermetureAfficheBouton) ? '<a id="ObjPopupTitre" href="#">Fermer ou échap</a>' : '' ) +
				'<div id="ObjPopupContenu" >' + contenu + '</div>'+
			    '</div>'
			);

			$('#ObjPopupTitre')
				.bind(
						'click',
						{self:this},
						function(event)
						{
							if (typeof(event.data.self) != 'undefined')
							{
								event.data.self.pDispatchEvent(event.data.self.EVT_ONMOUSECLICKFERMER);
								event.data.self.onClickLienFermer(event.data.self,event);
								event.data.self.ferme();
								return false;
							}
						}
					);

			if ($.browser.msie && $.browser.version == '6.0')
				$('select').addClass('ObjPopUp_select').hide();
		}

		var objPopupConteneur = $('#ObjPopupConteneur');
		var objPopupContenu = $('#ObjPopupContenu');
		var objPopupMasque = $('#ObjPopupMasque');

		/* Si on ne souhaite pas l'animation d'ouverture alors on centre directement */

		if (!this.configuration.ouvertureAvecAnimation)
		{
	    	var centrer = this.getCoordonneeCentre();
			objPopupConteneur.css({
				top: centrer.y + 'px',
				left: centrer.x + 'px'
			});
		}


		objPopupMasque.css('opacity', '0.7');
		objPopupMasque.fadeIn('fast');
		// 25/02/2009 Adeline SAILLARD <saillard@benchmark.fr>
		// Cas très particulier (verrue) : si on est en mode iframe sur ie6, alors on ajoute un timeout pour corriger un bug de popup vide présent uniquement dans ce cas
		// TODO : à revoir
		if (this.modeOuverture == this.MODE_IFRAME && $.browser.msie) {
			setTimeout(function() {
				objPopupContenu.html(contenu);
			}, 100);
		} else {
			objPopupContenu.html(contenu);
		}
		objPopupConteneur.fadeIn('fast');
		objPopupContenu.fadeIn('fast');

		// si c'est une image on la retrouve et bind dessus :
		if(this.modeOuverture == this.MODE_IMAGE)
		{
			objPopupContenu.find('img')
				.bind(
					'load',
					{self:this},
					function(event)
					{
						$('#objPopupImageChargement').remove();
						$(this).fadeIn();
						// si l'image est trop grande on la redimensionne :
						/** @todo meilleur algo */
						/*
						var delta		= 40;
						var hauteur		= $(this).css('height') + delta;
						var largeur		= $(this).css('width') + delta;
						var tHauteur 	= $(window).height();
						var tLargeur 	= $(window).width();
						var redimHauteur= false;
						console.warn(hauteur,largeur,tHauteur,tLargeur);
						if (tHauteur < hauteur)
						{
							$(this).css('height',(tHauteur - delta)+'px');
							redimHauteur= true;
						}
						if (tLargeur < largeur)
						{
							if(redimHauteur) {$(this).css('height','');}
							$(this).css('width',(tLargeur - delta)+'px' );
						}
						*/
						// on recentre :
						event.data.self.centre();
						event.data.self.onLoad(event.data.self,event);
					}
					);
		}

		// si c'est un mode url il n'y a pas de dimension à deviner mais elles peuvent être stipulées, on les applique donc par defaut :
//		if(this.modeOuverture == this.MODE_URL )
//		{
//			this.redimensionne(this.configuration.hauteur,this.configuration.largeur);
//		}

		// on bind la suppression à la touche echap
		if(configuration.fermetureMasqueSurClic)
		{
			objPopupMasque
				.bind(
						'click',
						{self:this},
						function(event)
						{
							if (typeof(event.data.self) != 'undefined')
							{
								event.data.self.pDispatchEvent(event.data.self.EVT_ONMOUSECLICKFERMER);
								event.data.self.onClickLienFermer(event.data.self,event);
								event.data.self.ferme();
								return false;
							}
						}
					);
		}

		if(configuration.fermetureSurClic)
		{
			objPopupConteneur
				.bind(
						'click',
						{self:this},
						function(event)
						{
							if (typeof(event.data.self) != 'undefined')
							{
								event.data.self.pDispatchEvent(event.data.self.EVT_ONMOUSECLICKFERMER);
								event.data.self.onClickLienFermer(event.data.self,event);
								event.data.self.ferme();
								return false;
							}
						}
					);
		}

		if($.browser.msie)
		{
			$(document)
				.bind(
						'keydown',
						{self:this},
						function(event)
						{
							if (event.keyCode == 27)
							{
								event.data.self.pDispatchEvent(event.data.self.EVT_ONKEYDOWNFERMER);
								event.data.self.onKeyDownFermer(event.data.self,event);
								event.data.self.ferme();
								return false;
							}
						}
					);
			// bind pour le recentrage
			$(window)
				.bind(
					'resize',
					{self:this},
					function(event) {
						if (typeof(event.data.self) != 'undefined'/* && event.data.self.configuration.ouvertureAvecAnimation*/)
							event.data.self.centre();
					}
				);
		}
		else
		{
			$(window)
				.bind(
					'keydown',
					{self:this},
					function(event)
					{
						if (event.keyCode == 27 ) // on ne réagit que sur échap
						{
							if(typeof(event.data.self) != 'undefined' )
							{
								event.data.self.pDispatchEvent(event.data.self.EVT_ONKEYDOWNFERMER);
								event.data.self.onKeyDownFermer(event.data.self,event);
								event.data.self.ferme();
								return false;
							}
						}

					})
				.bind(
					'resize',
					{self:this},
					function(event)
					{
						// bind pour le recentrage
						if (typeof(event.data.self) != 'undefined' )
						{
							//if(event.data.self.configuration.ouvertureAvecAnimation)
								event.data.self.centre();
						}
					});
		}

		if (this.configuration.ouvertureAvecAnimation)
		{
			setTimeout(benchmark.framework.util.delegate(this,function() {this.centre();}), 100);
			// certains browsers ont du mal au premier jet on retente, tant pis pour l'effet rebond
			setTimeout(benchmark.framework.util.delegate(this,function() {this.centre();}), 500);
		} else {
			// Le recentrage est effectué recentrer les popups plus hautes que l'écran et les passer en fixe pour pouvoir scroller.
			if(this.modeOuverture != this.MODE_IMAGE)
				{
					//this.centre();
					setTimeout(benchmark.framework.util.delegate(this,function() {this.centre();}), 500);
				}
		}

		if(this.modeOuverture != this.MODE_IMAGE) {this.onLoad(this);}
	};

	/**
	 * fonction public permettant de modifier le contenu html de la popup tout en la laissant ouverte
	 * @param contenu html le contenu remplacant l'existant
	 * @param callBack function methode appelée quand le contnu html est disponible dans le dom
	 */
	this.modifie = function(contenu, callBack)
	{
		$('#ObjPopupContenu').fadeOut('fast', function(){
			var self = $(this);
			self.empty();
			self.html(contenu);
			if (callBack)
				callBack();
			self.fadeIn('fast');
		});
	};

	/**
	 * ouverture du popup en affichant du code html
	 * @todo Faire en sorte que la taille du popup s'adapte a la taille du contenu
	 * @param contenu html
	 */
	this.ouvreHtml = function(contenu, configuration)
	{
		this.modeOuverture = 'html';

		this.ouvre(contenu, configuration);
	};

	/**
	 * ouverture du popup en affichant du code html que l'on ira chercher dans une URL
	 *
	 * @param url url de la page à charger
	 * @param configuration Tableau contenant les différentes informations de configuration
	 * @return Void
	 * @author Olivier Reyt <reyt@benchmark.fr>
	 * @since 16/10/2008 Olivier Reyt <reyt@benchmark.fr>
	 */
	this.ouvreURL = function(url, configuration)
	{
		var contenu = $.ajax({url: url, async: false}).responseText;

		this.modeOuverture = this.MODE_URL;

		this.ouvre(contenu, configuration);
	};

	/**
	 * Ouverture du popup en affichant du code html que l'on ira chercher dans une URL
	 * Si on a l'élément DimensionAuto à TRUE dans la configuration, on chargera automatiquement la taille
	 * en fonction de la taille du body de l'iframe
	 *
	 * @param url url de la page à charger
	 * @param configuration Tableau contenant les différentes informations de configuration
	 * @return Void
	 * @author Olivier Reyt <reyt@benchmark.fr>
	 *	On charge le contenu de l'iframe dans la variable contenu
	 * @since 16/10/2008 Olivier Reyt <reyt@benchmark.fr>
	 */
	this.ouvreIframe = function(url, configuration)
	{

		// On fusionne les tableaus de configuration
		configuration = benchmark.framework.util.objet.fusion(
			configuration,
			this.configurationDefaut
		);

		this.modeOuverture = this.MODE_IFRAME;

		var contenu = '<iframe id="ObjPopIframe" src=' + url + ' width=' + configuration.largeur + ' height=' + configuration.hauteur + ' frameborder="0"></iframe>';

		// On ajoute un type à tous les FLASH et on les caches
		if ($.browser.msie)
		{
			$('object:has(param[name!="wmode"])').addClass('ObjPopUp_flash').css("visibility", "hidden");
			$('object:has(param[name="wmode"][value="window"])').addClass('ObjPopUp_flash').css("visibility", "hidden");
		}
		else
		{
			$('object:has(param[name!="wmode"])').addClass('ObjPopUp_flash').css("visibility", "hidden");
			$('object:has(param[name="wmode"][value="window"])').addClass('ObjPopUp_flash').css("visibility", "hidden");
			$("[src$='swf'][wmode!='opaque'][wmode!='transparent']").addClass('ObjPopUp_flash').css("visibility", "hidden");
		}

		// On ouvre l'iframe
		this.ouvre(contenu, configuration);

		// Si on calculer la taille automatiquement
		if (typeof(configuration.DimensionAuto) != "undefined" && configuration.DimensionAuto == true){
			// On place this dans le scope local pour y accéder dans la fonction TimeOut
			var self = this;

			// On attend 300 ms pour que l'iframe souvre en entier
			setTimeout(function() {
				// Au moment du load de l'élement ObjPopIframe, à savoir l'iframe
				$("#ObjPopIframe").bind("load", {self: self}, function(e) {
					// On prend la hauteur et la largeur du body de l'iframe, +20 pour etre large
					largeur = $('#ObjPopIframe')[0].contentWindow.$('body').width() + 20;
					hauteur = $('#ObjPopIframe')[0].contentWindow.$('body').height() + 20;

					// On redimensionne le popup avec ces valeurs
					e.data.self.redimensionne(hauteur, largeur);

					var selfCentre = e.data.self;

					// Au bout de 300 ms, on centre le popup, le temps qu'il s'affiche en entier
					setTimeout(function() {
						selfCentre.centre();
					}, 300);

					//if($.browser.msie){
					$('#ObjPopIframe')[0].contentWindow.$('body').bind('keydown', function(event) {
						if (event.keyCode == 27)
						{
							selfCentre.pDispatchEvent(selfCentre.EVT_ONKEYDOWNFERMER);
							selfCentre.onKeyDownFermer(selfCentre,event);
							selfCentre.ferme();
							return false;
						}
					});
				});
			}, 300);
		}
	};

	/**
	 * ouverture du popup en affichant un flash
	 * @param url string
	 */
	this.ouvreFlash = function(url, configuration)
	{
		configuration = benchmark.framework.util.objet.fusion(
			configuration,
			{
				titre			: 'image',
				nom			: 'image',
				hauteur		: 300,
				largeur		: 300,
				style			: '',
				options		: '',
				id			: 'popup',
				backgroundColor	: '#ffffff',
				classe		: 'image_popup'
			}
		);

		this.modeOuverture = this.MODE_FLASH;

		this.ouvre(
			'<div id="conteneur_' + configuration.id + '" class="' + configuration.classe+'">'
			+ '<embed id="' + configuration.id + '" height="' + configuration.hauteur + '" width="' + configuration.largeur + '" quality="high" bgcolor="' + configuration.backgroundColor + '" '
			+ ' name="' + configuration.nom + '" style="' + configuration.style + '" src="' + url + '" type="application/x-shockwave-flash"/>'
			+ '</div>'
		);
	};

	/**
	 * ouverture du popup en affichant une image
	 * @param url string
	 */
	this.ouvreImage = function(url, configuration)
	{
		configuration = benchmark.framework.util.objet.fusion(
			configuration,
			{
				titre	: 'image',
				hauteur	: null,
				largeur	: null,
				alt		: 'image',
				classe	: 'image_popup',
				style	: '',
				options	: '',
				id		: null
			}
		);

		this.modeOuverture = this.MODE_IMAGE;

		this.ouvre(
			'<img id="objPopupImageChargement" src="http://copainsdavant.linternaute.com/framework/lib/js/image/chargement.gif" title="merci de patienter">'+
			'<img id="' + configuration.id + '" src="' + url + '" title="' + configuration.titre + '" '
			+ ' alt="' + configuration.alt + '" class="' + configuration.classe + '"'
			+ ' style="display:none;width:' + configuration.largeur + 'px; height:' + configuration.hauteur + 'px; ' + configuration.style + '"'
			+ ' ' + configuration.options + '>'
		);
	};

 	/**
 	 * configure l'objet en réattribuant les valeurs par defaut négligées à l'objet de configuration :
 	 * @return void
 	 */
	this.configure = function()
	{
		this.configuration = benchmark.framework.util.objet.fusion(this.configuration, this.configurationDefaut);
	};



 	/**
 	* Ajoute du HTML au début ou à la fin du bloc contenu
 	* @return void
 	* @since 25/11/2008 Thomas JOBERT
 	*/
	this.ajouteHTML = function(message,position) {

			if (position == 'debut') {
				$('#ObjPopupContenu').prepend(message);
			} else if (position == 'fin') {
				$('#ObjPopupContenu').append(message);
			}
	};

	/**
	 * constructeur :
	 */
 	// on recupere les arguments :
	this.configuration = configuration || {};
	this.configure();
};

/**
* @DEPRECATED parcqu'il bloque l'héritage, a un système d'instance buggué, une interface discutable, et qu'il ne colle pas au schéma standard
* utilisé jusque là (par exemple dans tout ce qui est gestionnaire de fenêtre, MI ou MAA, l'usage de l'eventDispatcher
* est ici déclaré deprecated, il n'est jusque là utilisé que pour la dépose de commentaire et devra en être converti et il faudra alors
* supprimmer l'héritage eventDispatcher
* Si vous souhaitez utiliser des fonctions evenementielles il vous suffit de redéfinir les fonctions evenement de l'objet
* this.onLoad = function(){}; etc
* @since 08/07/09 Damien BENOIT <benoit@benchmark.fr>
*/

$(document).ready(
	function(){
		// On donne à ObjPopup le comportement d'un EventDispatcher
		// On protege du manque de la lib EventDispatcher
		if(typeof(benchmark.framework.util.EventDispatcher) != "undefined"){
			benchmark.framework.ihm.ObjPopup.prototype = new benchmark.framework.util.EventDispatcher;
		}
	}
);
