(function($) {
	$(function() {

		/**
		* Delai en millisecondes avant de faire disparaître le message d'erreur.<br>
		* Fixé à 6 secondes.<br/>
		* Ce délai est utilisé si il n'y a pas de détails
		*/
		var DELAY_WITHOUT_DETAILS = 6000;
		/**
		* Delai en millisecondes avant de faire disparaître le message d'erreur.<br/>
		* Fixé à 10 secondes.<br/>
		* Ce délai est utilisé si il y a des détails
		*/
		var DELAY_WITH_DETAILS = 10000;

		var $globalError = null;
		var globalError_timeout = null;
		var dialogContent = null;
		var title = null;
		var details = [];

		/*
		* Initialisation qui va créer le conteneur caché des messages d'erreur.
		* Cette méthode est appelée automatiquement.
		*/
		function init() {
			$globalError = $("#global_error");
			if ($globalError.size()==0) {
				$globalError = new $("<span></span>");
				$globalError.attr('id','global_error');
				$globalError.append(new $("<a></a>").attr('href','#').attr('class','delete').html('&nbsp;').click(function() {
					hide();
					return false;
				}));
				$globalError.append(new $("<span></span>").attr('name','title'));
				$globalError.hide();
				$("body").append( $globalError );

				$("#global_error").mouseover(function() {
					if (globalError_timeout!=null) {
						window.clearTimeout(globalError_timeout);
						globalError_timeout=null;
					}
				});
				$("#global_error").mouseout(function() {
					if( details==null || details.length==0 ) globalError_timeout = window.setTimeout( hide, DELAY_WITHOUT_DETAILS );
					else globalError_timeout = window.setTimeout( hide, DELAY_WITH_DETAILS );
				});
			}
		}

		function clear() {
			init();
			title="";
			details = [];
			$globalError.find("li").remove();
		}

		function hide() {
			init();
			$globalError.hide();
			clear();
			if (globalError_timeout!=null) {
				window.clearTimeout(globalError_timeout);
				globalError_timeout=null;
			}
		}


		/**
		* Utilitaire pour afficher des messages d'erreur dans le backOffice.<br/>
		* Toutes les erreurs jQuery.ajax non gérées seront par défaut prises en compte par cette fonctionnalité et apparaîtront donc sur l'interface.<br/>
		* <b>Si le développeur a mis une fonction error() sur son appel ajax, alors nous n'intervenons pas.</b>
		* @class
		* @name boError
		* @static
		* @version 1.0
		*/
		"boError".namespace(/** @lends boError.prototype */ {

			/**
			* Méthode pour facilement gérer soit même une exception ajax.<br/>
			* A noter, que si la méthode error des appels ajax n'est pas implémentée, l'erreur est gérée par l'appel de cette méthode sans rien faire.<br/>
			* Si le contentType de la request est text/html alors le texte sera extrait de request.responseText sinon le text sera request.responseText
			*/
			ajaxError: function(request, textStatus, exception, url ) {
				this.setTitle( "Error requesting page " + (url || '') + ( textStatus || '' ) );
				this.addDetail("Exception " + exception );

				var text = "";
				if( "timeout" == textStatus ) {
					text = textStatus;
				} else {
					text = request.responseText;
					var contentType = request.getResponseHeader("content-type");
					if (contentType==null || contentType.startsWith("text/html")) text = $(text).text();
				}
				if( !text || text == '') text = "No message !";

				this.addDetail( text );
				this.show();
			},

			/**
			* Effacer les messages d'erreur présents.<br/>
			* La fenêtre n'est pas masquée, mais le contenu sera supprimé.
			*/
			clear: function() {
				clear();
				return this;
			},

			/**
			* Fixe le titre de l'erreur
			*/
			setTitle: function(new_title) {
				title = new_title;
				return this;
			},

			/**
			* Méthode pour ajouter du texte dans les messages d'erreur.<br/>
			* La fenêtre n'est pas affichée ou masquée, elle reste dans son état courant.
			*/
			addDetail: function(msg) {
				details.push( msg );
				return this;
			},

			/**
			* Méthode pour cacher les messages.<br/>
			* Cacher les messages va aussi supprimer le contenu.
			*/
			hide: function() {
				hide();
				return this;
			},

			/**
			* Méthode pour afficher les messages présents.
			* @param delay force un délai en millisecondes pour maintenir le message visible.<br/>
			* Si cela n'est pas renseigné alors on utilise les valeurs prévues suivant la présence ou non de détail.
			*/
			show: function(delay) {
				init();
				if (globalError_timeout!=null) {
					window.clearTimeout(globalError_timeout);
					globalError_timeout=null;
				}

				$globalError.find("> ul").remove();
				var ul = $("<ul></ul>").attr('name','details').hide();
				$globalError.append(ul);
				for(var i = 0; i < details.length; i++) {
					ul.append( $("<li></li>").html(details[i].replace(/\n/g, '<br>')) );
				}

				var str_title = ""+title;
				if (details==null || details.length==0) $globalError.find("[name='title']").html( str_title );
				else {
					dialogContent = $globalError.find("> ul[name='details']");
					dialogContent.dialog({
						autoOpen: false,
						closeOnEscape:true,
						width: $(window).width()-100,
						height: $(window).height()-100,
						maxHeight: $(window).height(),
						maxWidth: $(window).width(),
						modal: true,
						position: 'center',
						resizable: true,
						zIndex: 10000,
						title: str_title,
						open: function(event, ui) {
									$(this).css({'max-height': $(window).height()+'px', 'overflow-y': 'auto', 'max-width': $(window).width()+'px'});
									$(this).focus();
							}

					});

					$globalError.find("[name='title']").html( str_title + " ... ");
					$globalError.find("[name='title']").append(jQuery("<a></a>").attr('href','#').text("details").click(function() {
						dialogContent.dialog('open');
						return false;
					}) );
				}

				if (typeof(console)!='undefined') {
					// plus facile pour débogguer
					console.log("boError.show : title="+title+ " details="+$globalError.find("> ul[name='details']").text());
				}
				
				$globalError.show();
				var left = $(window).width()-$globalError.width();
				left = Math.ceil(left / 2);
				var props = {position:'fixed', left:left+'px', top:'0px'};
				$globalError.css( props );

				if (delay!=undefined) globalError_timeout = window.setTimeout( hide, delay );
				else if (details==null || details.length==0) globalError_timeout = window.setTimeout( hide, DELAY_WITHOUT_DETAILS );
				else globalError_timeout = window.setTimeout( hide, DELAY_WITH_DETAILS );
				return this;
			},

			showDialog: function( onClose ) {
				init();
				if( dialogContent == null || dialogContent.size()==0) {
					return;
				}
				dialogContent.bind( "dialogclose", onClose );
				dialogContent.dialog('open');

			}
		});

		$.ajaxSetup({
			global:true,
			cache:false,
			async:true,
			timeout:60000,
			error: function(request, textStatus, exception) {
				boError.ajaxError(request, textStatus, exception, this.url);
			}
		});
	});
})(jQuery);



