// <script>
			var galeriePadding = 0;
			var galerieLabelHeight = 0;
			var maxHeight;
			var galeriesTmpScroll = {};
			var galeriesCurrent = 'main';
			var galerieTpl = {
				// show the galeries selector
				showMain: function(element) {
					$(element).parents('.galeries-container').find('.galerie').fadedSlideUp(400);
					$(element).parents('.galeries-container').find('.galeries').fadedSlideDown(400);
					$(element).parents('.galeries-container').find('.galeries-show').fadedSlideUp(400);
					//$('body').scrollTo(galeriesTmpScroll, 500);
					//galeriesCurrent = 'main';
					galerieTpl.storeScroll('main');
				},

				// show the galeries selector
				showGalerie: function(element, id) {
					$(element).parents('.galeries-container').find('.galeries').fadedSlideUp(400);
					$(element).parents('.galeries-container').find('.galeries-show').fadedSlideDown(400);


					$(element).parents('.galeries-container').find('.galerie').not('#galerie_'+id).fadedSlideUp(400);
					$(element).parents('.galeries-container').find('#galerie_'+id).fadedSlideDown(400, function() {galerieTpl.storeScroll(id);});
				},

				storeScroll: function(target) {
					galeriesTmpScroll[galeriesCurrent] = $( 'body' ).scrollTop();
					//console.log('store '+galeriesCurrent);
					if (typeof galeriesTmpScroll[target] === "undefined" || true) {
						$('body').scrollTo($('#galerie_'+target), 500);
						//console.log('load '+'#galerie_'+target);
					}
					else	{
						$('body').scrollTo(galeriesTmpScroll[target], 500);
						//console.log('load '+target);
					}
					galeriesCurrent = target;
				},

				updateHeight: function() {
					$('.galeries, .galerie-group').each(function () {
						if ($(this).data('tile-width')) {
							var galeriesWidth = $(this).width();
							if (!galeriesWidth) {
								galeriesWidth = $(this).parents('.galeries-container').width();
							}
							if (galeriesWidth > 100) {
								var numberCol = Math.ceil(galeriesWidth / $(this).data('tile-width'));
								maxHeight = (galeriesWidth / numberCol) / $(this).data('tile-width') * $(this).data('tile-height');

								$(this).find('.galeries-block').css('width', (100 / numberCol) + '%').css('padding', galeriePadding + 'px');
								$(this).data('col', numberCol);
							}
						}
					});

					$('.galerie-group:visible').css('width', 'calc(100% + '+(galeriePadding*2)+'px)').css('marginLeft', '-'+galeriePadding+'px');

					$('.galeries-img').height(parseInt(maxHeight));

					$('.galerie-group').each(function () {
						if ($(this).data('presentation')) {
							$(this).find('.galeries-legend').css('overflow', 'hidden').css('white-space', 'nowrap').css('text-overflow', 'ellipsis');

							if ($(this).data('col') > 4 ) {
								$(this).height(parseInt(maxHeight+galerieLabelHeight+(galeriePadding*2))).css('overflow', 'hidden');
							}
							else if ($(this).data('col') == 4 || $(this).data('col') == 3 ) {
								$(this).height(parseInt((maxHeight+galerieLabelHeight+(galeriePadding*2))*2)).css('overflow', 'hidden');
							}
							else {
								$(this).height('auto');
							}
						}
					});

				},

				updateVisible: function(galerie) {
					if (!galerie) galerie = $('.galeries-container');
					else galerie = $(galerie);

					galerie.find('.galeries-img:visible').each(function () {
						if ($(this).data('src')) {
							$(this).addClass('transparent');
							$(this).attr('src', $(this).data('src'));
							//$(this).css('backgroundImage', 'url('+$(this).data('src')+')');
							var currentImg = $(this)
							$('<img/>').attr('src', $(this).data('src')).on('load', function() {
								$(this).remove(); // prevent memory leaks as @benweet suggested
								currentImg.css('backgroundImage', 'url('+$(this).attr('src')+')');
								currentImg.removeClass('transparent');
							});
							$(this).data('src', null);
						}
					});
				},

				dataRequest: function() {
					$('.galeries[data-external]').each(function() {
						var currentGalerie = this;
						var request = $.ajax({
							url: $(this).data('external'),
							type: "GET",
							dataType: "json",
							success: function(data) {
								galerieTpl.dataImport(currentGalerie, data.data, true);
							}
						});
					});
				},

				dataImport: function(galerie, data, refresh) {
					var defaultWidth = $(galerie).find('.galerie-group').data('tile-width')
					var defaultHeight = $(galerie).find('.galerie-group').data('tile-height')
					var galid = $(galerie).data('id');
					var html = '';

					// change image cover
					if (data.url_th) {
						var galLink = $('.galeries-link[data-id=' + galid + ']');
						galLink.find('.galeries-img').attr('data-src', data.url_th).attr('src', data.url_th).data('src', data.url_th);
						galerieTpl.updateVisible(galLink);
					}

					// add galeries
					if (data.childs) {
						for (var i = 0, len = data.childs.length; i < len; i++) {
							item = data.childs[i];
							if (item.actif && !item.password_code) {
								var label = item.name;
								var thumb = item.url_th;
								var img = item.url;
								var id = $(galerie).data('id') + '_' + item.id;

								// create galerie
								var gal = $('<div class="galeries" id="galerie_' + id + '" data-id="' + id + '" style="display:none;"><div class="galerie-header"><h2>' + label + '</h2></div><div class="galerie-group" align="left" class="galerie-group" data-tile-width="' + defaultWidth + '" data-tile-height="' + defaultHeight + '" data-presentation=""></div></div>');
								$('.galeries-container').append(gal);

								// go back btn
								var back = '<a data-id="' + galid + '" caption="Retour" data-caption="Retour" class="galeries-link parent" data-id="' + galid + '" ><div style=" display:inline-block; zoom:1; vertical-align:top; text-align:center; width:' + defaultWidth + 'px; overflow:hidden; " class="galeries-block" class="imgdiv" > <div class="galeries-block-inside"> <span border="0" data-src="themes/ophb/img/parent.png" alt="Retour" class="galeries-img img_th" style="width:' + defaultWidth + 'px; height:' + defaultHeight + 'px; "> </span> <div class="galeries-legend legende" style="min-height:25px; text-align:center;"><span> Retour </span></div></div></div></a>';
								gal.find('.galerie-group').append(back);

								// go to galerie btn
								html += '<a data-id="' + id + '" caption="' + label + '" data-caption="' + label + '" class="galeries-link GalerieAlbum" data-id="' + id + '" ><div style=" display:inline-block; zoom:1; vertical-align:top; text-align:center; width:' + defaultWidth + 'px; overflow:hidden; " class="galeries-block" class="imgdiv" > <div class="galeries-block-inside"> <span border="0" data-src="' + thumb + '" alt="' + label + '" class="galeries-img img_th" style="width:' + defaultWidth + 'px; height:' + defaultHeight + 'px; "> </span> <div class="galeries-legend legende" style="min-height:25px; text-align:center;"><span>' + label + '</span></div></div></div></a>';

								galerieTpl.dataImport(gal, item);
							}
						}
					}

					// add images
					if (data.images) {
						for (var i = 0, len = data.images.length; i < len; i++) {
							item = data.images[i];
							if (item.actif && !item.password_code) {
								var label = item.name;
								var thumb = item.url_th;
								var img = item.url;
								var id = $(galerie).data('id') + '_' + item.id;
								html += '<a href="' + img + '" class="imgbox" rel="gallery_' + galid + '" data-fancybox="gallery_' + galid + '" caption="' + label + '" data-caption="' + label + '" class="galeries-link GalerieImage" data-id="' + id + '"><div style="display:inline-block;zoom:1;vertical-align:top;text-align:center; width:' + defaultWidth + 'px; overflow:hidden; "class="galeries-block"class="imgdiv"><div class="galeries-block-inside"><span border="0" data-src="' + thumb + '" alt="' + label + '" class="galeries-img img_th" style="width:' + defaultWidth + 'px; height:' + defaultHeight + 'px; "></span><div class="galeries-legend legende" style="min-height:25px; text-align:center;"><span>' + label + '</span></div></div></div></a>';
							}
						}
					}

					$(galerie).find('.galerie-group').append(html);

					galerieTpl.bind($(galerie));

					if (refresh) {
						galerieTpl.updateVisible();
						galerieTpl.updateHeight();
					}
				},

				bind: function(galerie) {
					if (!galerie) galerie = $('.galeries-container');
					else galerie = $(galerie);


					galerie.find('.galeries-img').addClass('transparent');

					galerie.find('.galeries-img').not(":visible").each(function () {
						if (!$(this).data("src")) {
							$(this).data("src", this.src);
							this.src = "js/blank.gif";
						}
					});

					var galeriesLink = galerie.find('.galeries-link:not(.binded)');
					galeriesLink.addClass('binded');
					galeriesLink.click(function() {
						setTimeout(function(){ galerieTpl.updateVisible(); }, 100);
					});


					// Contenu de galerie
					galeriesLink.filter(':not(.secure)').click(function() {
						galerieTpl.showGalerie(this, $(this).data('id'));
						return false;
					});

					// Acc�s secure
					galeriesLink.filter('.secure').click(function() {
						window.secureAccessItem($(this).data('id'));
						return false;
					});
				}

			};

			window.galerieTpl = galerieTpl;

			window.reportItem = function(id) {
                if (!isNumeric(id)) {
                    id = id.data('id');
                }

				$.window({
					id: 'reportItem'+id,
					title: 'Reporter un probleme avec une image',
					url: 'admin/galeries/image/report/'+id+'?output=text',
					icon: 'status-warning',
					method: 'ajax',
					maxWidth: -1,		 // the minimum width, if -1 means no checking
					maxHeight: -1,		 // the minimum height, if -1 means no checking
					showFooter: false,
					maximizable: false,
					closable: true,
					minimizable: false,
					showModal: true,
					width: 900,
					height: 575,
					checkBoundary: true,
					withinBrowserWindow: false,
					onIframeEnd: function() {},
					onClose: function() {
						browserActionRun('refresh');
					}
				});
			};
            window.secureAccessItem = function(id) {
                $.window({
                    id: 'secureAccessItem'+id,
                    title: 'Acc&egrave;s s&eacute;curis&eacute;',
                    url: 'admin/galeries/image/unlock/'+id,
                    icon: 'img-skin/sets/messenger/medium/secure-key.png',
                    method: 'ajax',
                    maxWidth: -1,		 // the minimum width, if -1 means no checking
                    maxHeight: -1,		 // the minimum height, if -1 means no checking
                    showFooter: false,
                    maximizable: false,
                    closable: true,
					minimizable: false,
                    showModal: true,
                    width: 560,
                    height: 550,
                    checkBoundary: true,
                    withinBrowserWindow: false,
                    onIframeEnd: function() {},
                    onClose: function() {
                        browserActionRun('refresh');
                    }
                });
            };

			$( window ).resize(function() {
				galerieTpl.updateHeight();
			});

			$(function () {
				galerieTpl.bind();
				galerieTpl.updateVisible();
				galerieTpl.updateHeight();
			});

			$(window).load(function() {
				galerieTpl.updateHeight();
				setTimeout(function(){ galerieTpl.updateHeight(); }, 500);
				setTimeout(function(){ galerieTpl.updateHeight(); }, 1000);

				galerieTpl.dataRequest();
			});


			//</script>
// <script>
			var documentPadding = 20;
			var documentLabelHeight = 0;
			var maxHeight;
			var documentsTmpScroll = {};
			var documentsCurrent = 'main';
			var documentTpl = {
				// show the documents selector
				showMain: function(element) {
					$(element).parents('.documents-container').find('.document').fadedSlideUp(400);
					$(element).parents('.documents-container').find('.documents').fadedSlideDown(400);
					$(element).parents('.documents-container').find('.documents-show').fadedSlideUp(400);
					//$('body').scrollTo(documentsTmpScroll, 500);
					//documentsCurrent = 'main';
					documentTpl.storeScroll('main');
				},

				// show the documents selector
				showDocument: function(element, id) {
					$(element).parents('.documents-container').find('.documents').fadedSlideUp(400);
					$(element).parents('.documents-container').find('.documents-show').fadedSlideDown(400);


					$(element).parents('.documents-container').find('.document').not('#document_'+id).fadedSlideUp(400);
					$(element).parents('.documents-container').find('#document_'+id).fadedSlideDown(400, function() {documentTpl.storeScroll(id);});
				},

				storeScroll: function(target) {
					documentsTmpScroll[documentsCurrent] = $( 'body' ).scrollTop();
					//console.log('store '+documentsCurrent);
					if (typeof documentsTmpScroll[target] === "undefined" || true) {
						$('body').scrollTo($('#document_'+target), 500);
						//console.log('load '+'#document_'+target);
					}
					else	{
						$('body').scrollTo(documentsTmpScroll[target], 500);
						//console.log('load '+target);
					}
					documentsCurrent = target;
				},

				updateHeight: function() {
					$('.documents, .documents__group').each(function () {
						if ($(this).data('tile-width')) {
							var documentsWidth = $(this).width();
							if (!documentsWidth) {
								documentsWidth = $(this).parents('.documents-container').width();
							}
							if (documentsWidth > 100) {
								var numberCol = Math.ceil(documentsWidth / $(this).data('tile-width'));
								maxHeight = (documentsWidth / numberCol) / $(this).data('tile-width') * $(this).data('tile-height') - (documentPadding * 2);

								$(this).data('col', numberCol);
							}
						}
					});

					$('.documents__group').each(function () {
						if ($(this).data('presentation')) {
							$(this).find('.documents-legend').css('overflow', 'hidden').css('white-space', 'nowrap').css('text-overflow', 'ellipsis');

							if ($(this).data('col') > 4 ) {
								$(this).height(parseInt(maxHeight+documentLabelHeight+(documentPadding*2))).css('overflow', 'hidden');
							}
							else if ($(this).data('col') == 4 || $(this).data('col') == 3 ) {
								$(this).height(parseInt((maxHeight+documentLabelHeight+(documentPadding*2))*2)).css('overflow', 'hidden');
							}
							else {
								$(this).height('auto');
							}
						}
					});

				},

				updateVisible: function(document) {
					if (!document) document = $('.documents-container');
					else document = $(document);

					document.find('.documents-img:visible').each(function () {
						if ($(this).data('src')) {
							$(this).addClass('transparent');
							$(this).attr('src', $(this).data('src'));
							//$(this).css('backgroundFichier', 'url('+$(this).data('src')+')');
							var currentImg = $(this)
							$('<img/>').attr('src', $(this).data('src')).on('load', function() {
								$(this).remove(); // prevent memory leaks as @benweet suggested
								currentImg.css('backgroundFichier', 'url('+$(this).attr('src')+')');
								currentImg.removeClass('transparent');
							});
							$(this).data('src', null);
						}
					});
				},

				dataRequest: function() {
					$('.documents[data-external]').each(function() {
						var currentDocument = this;
						var request = $.ajax({
							url: $(this).data('external'),
							type: "GET",
							dataType: "json",
							success: function(data) {
								documentTpl.dataImport(currentDocument, data.data, true);
							}
						});
					});
				},

				dataImport: function(document, data, refresh) {
					var defaultWidth = $(document).find('.documents__group').data('tile-width')
					var defaultHeight = $(document).find('.documents__group').data('tile-height')
					var galid = $(document).data('id');
					var html = '';

					// change fichier cover
					if (data.url_th) {
						var galLink = $('.documents-link[data-id=' + galid + ']');
						galLink.find('.documents-img').attr('data-src', data.url_th).attr('src', data.url_th).data('src', data.url_th);
						documentTpl.updateVisible(galLink);
					}

					// add documents
					if (data.childs) {
						for (var i = 0, len = data.childs.length; i < len; i++) {
							item = data.childs[i];
							if (item.actif && !item.password_code) {
								var label = item.name;
								var thumb = item.url_th;
								var img = item.url;
								var id = $(document).data('id') + '_' + item.id;

								// create document
								var gal = $('<div class="documents" id="document_' + id + '" data-id="' + id + '" style="display:none;"><div class="documents__header"><h2>' + label + '</h2></div><div class="documents__group" data-tile-width="' + defaultWidth + '" data-tile-height="' + defaultHeight + '" data-presentation=""></div></div>');
								$('.documents-container').append(gal);

								// go back btn
								var back = '<a data-id="' + galid + '" caption="Retour" data-caption="Retour" class="documents-link parent" data-id="' + galid + '" ><div style=" display:inline-block; zoom:1; vertical-align:top; text-align:center; width:' + defaultWidth + 'px; overflow:hidden; " class="documents__block" class="imgdiv" > <div class="documents__inside"> <span border="0" data-src="js/blank.gif" alt="Retour" class="documents-img img_th" style="width:' + defaultWidth + 'px; height:' + defaultHeight + 'px; "> </span> <div class="documents-legend legende" style="min-height:25px; text-align:center;"><span> Retour </span></div></div></div></a>';
								gal.find('.documents__group').append(back);

								// go to document btn
								html += '<a data-id="' + id + '" caption="' + label + '" data-caption="' + label + '" class="documents-link DocumentDossier" data-id="' + id + '" ><div style=" display:inline-block; zoom:1; vertical-align:top; text-align:center; width:' + defaultWidth + 'px; overflow:hidden; " class="documents__block" class="imgdiv" > <div class="documents__inside"> <span border="0" data-src="' + thumb + '" alt="' + label + '" class="documents-img img_th" style="width:' + defaultWidth + 'px; height:' + defaultHeight + 'px; "> </span> <div class="documents-legend legende" style="min-height:25px; text-align:center;"><span>' + label + '</span></div></div></div></a>';

								documentTpl.dataImport(gal, item);
							}
						}
					}

					// add fichiers
					if (data.fichiers) {
						for (var i = 0, len = data.fichiers.length; i < len; i++) {
							item = data.fichiers[i];
							if (item.actif && !item.password_code) {
								var label = item.name;
								var thumb = item.url_th;
								var img = item.url;
								var id = $(document).data('id') + '_' + item.id;
								html += '<a href="' + img + '" class="imgbox" rel="gallery_' + galid + '" data-fancybox="gallery_' + galid + '" caption="' + label + '" data-caption="' + label + '" class="documents-link DocumentFichier" data-id="' + id + '"><div style="display:inline-block;zoom:1;vertical-align:top;text-align:center; width:' + defaultWidth + 'px; overflow:hidden; "class="documents__block"class="imgdiv"><div class="documents__inside"><span border="0" data-src="' + thumb + '" alt="' + label + '" class="documents-img img_th" style="width:' + defaultWidth + 'px; height:' + defaultHeight + 'px; "></span><div class="documents-legend legende" style="min-height:25px; text-align:center;"><span>' + label + '</span></div></div></div></a>';
							}
						}
					}

					$(document).find('.documents__group').append(html);

					documentTpl.bind($(document));

					if (refresh) {
						documentTpl.updateVisible();
						documentTpl.updateHeight();
					}
				},

				bind: function(document) {
					if (!document) document = $('.documents-container');
					else document = $(document);


					document.find('.documents-img').addClass('transparent');

					document.find('.documents-img').not(":visible").each(function () {
						if (!$(this).data("src")) {
							$(this).data("src", this.src);
							this.src = "js/blank.gif";
						}
					});

					var documentsLink = document.find('.documents-link:not(.binded)');
					documentsLink.addClass('binded');
					documentsLink.click(function() {
						setTimeout(function(){ documentTpl.updateVisible(); }, 100);
					});


					// Contenu de document
					documentsLink.filter(':not(.secure)').click(function() {
						documentTpl.showDocument(this, $(this).data('id'));
						return false;
					});

					// Acc�s secure
					documentsLink.filter('.secure').click(function() {
						window.secureAccessItem($(this).data('id'));
						return false;
					});
				}

			};

			window.documentTpl = documentTpl;

			window.reportItem = function(id) {
                if (!isNumeric(id)) {
                    id = id.data('id');
                }

				$.window({
					id: 'reportItem'+id,
					title: 'Reporter un probleme avec une fichier',
					url: 'admin/documents/fichier/report/'+id+'?output=text',
					icon: 'status-warning',
					method: 'ajax',
					maxWidth: -1,		 // the minimum width, if -1 means no checking
					maxHeight: -1,		 // the minimum height, if -1 means no checking
					showFooter: false,
					maximizable: false,
					closable: true,
					minimizable: false,
					showModal: true,
					width: 900,
					height: 575,
					checkBoundary: true,
					withinBrowserWindow: false,
					onIframeEnd: function() {},
					onClose: function() {
						browserActionRun('refresh');
					}
				});
			};
            window.secureAccessItem = function(id) {
                $.window({
                    id: 'secureAccessItem'+id,
                    title: 'Acc&egrave;s s&eacute;curis&eacute;',
                    url: 'admin/documents/fichier/unlock/'+id,
                    icon: 'img-skin/sets/messenger/medium/secure-key.png',
                    method: 'ajax',
                    maxWidth: -1,		 // the minimum width, if -1 means no checking
                    maxHeight: -1,		 // the minimum height, if -1 means no checking
                    showFooter: false,
                    maximizable: false,
                    closable: true,
					minimizable: false,
                    showModal: true,
                    width: 560,
                    height: 550,
                    checkBoundary: true,
                    withinBrowserWindow: false,
                    onIframeEnd: function() {},
                    onClose: function() {
                        browserActionRun('refresh');
                    }
                });
            };

			$( window ).resize(function() {
				documentTpl.updateHeight();
			});

			$(function () {
				documentTpl.bind();
				documentTpl.updateVisible();
				documentTpl.updateHeight();
			});

			$(window).load(function() {
				documentTpl.updateHeight();
				setTimeout(function(){ documentTpl.updateHeight(); }, 500);
				setTimeout(function(){ documentTpl.updateHeight(); }, 1000);

				documentTpl.dataRequest();
			});


			//</script>