// <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/cd4/img/back.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/imagical-pro/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>