/**
 * Interface Elements for jQuery
 * ImageBox
 *
 * http://interface.eyecon.ro
 *
 * Copyright (c) 2006 Stefan Petre
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 */

var jQImageBox_imageEl=""; //rustine pour Safari

jqlib.ImageBox = {
	options : {
		border				: 10,
		loaderSRC			: '../ModuleResources/interface/loading.gif',
		closeHTML			: '<img src="../ModuleResources/interface/close.jpg" />',
		overlayOpacity		: 0.8,
		textImage			: 'Showing image',
		textImageFrom		: 'from',
		fadeDuration		: 400,
		showTextImage		: true
	},
	imageLoaded : false,
	firstResize : false,
	currentRel : null,
	animationInProgress : false,
	opened : false,
	minWidth : 0,
	heightClose : 0,

	keyPressed : function(event)
	{
		if(!jqlib.ImageBox.opened || jqlib.ImageBox.animationInProgress)
			return;
		var pressedKey = event.charCode || event.keyCode || -1;
		switch (pressedKey)
		{
			//end
			case 35:
				if (jqlib.ImageBox.currentRel)
					jqlib.ImageBox.start(null, jqlib('a[@rel=' + jqlib.ImageBox.currentRel+ ']:last').get(0));
			break;
			//home
			case 36:
				if (jqlib.ImageBox.currentRel)
					jqlib.ImageBox.start(null, jqlib('a[@rel=' + jqlib.ImageBox.currentRel+ ']:first').get(0));
			break;
			//left
			case 37:
			//backspace
			case 8:
			//page up
			case 33:
			//p
			case 80:
			case 112:
				var prevEl = jqlib('#ImageBoxPrevImage');
				if(prevEl.get(0).onclick != null) {
					prevEl.get(0).onclick.apply(prevEl.get(0));
				}
			break;
			//up
			case 38:
			break;
			//right
			case 39:
			//page down
			case 34:
			//space
			case 32:
			//n
			case 110:
			case 78:
				var nextEl = jqlib('#ImageBoxNextImage');
				if(nextEl.get(0).onclick != null) {
					nextEl.get(0).onclick.apply(nextEl.get(0));
				}
			break;
			//down;
			case 40:
			break;
			//escape
			case 27:
				jqlib.ImageBox.hideImage();
			break;
		}
	},

	init : function(options)
	{
		if (options)
			jqlib.extend(jqlib.ImageBox.options, options);
		if (window.event) {
			jqlib('body',document).bind('keyup', jqlib.ImageBox.keyPressed);
		} else {
			jqlib(document).bind('keyup', jqlib.ImageBox.keyPressed);
		}
		jqlib('a').each(
			function()
			{
				el 				= jqlib(this);
				relAttr 		= el.attr('rel')||'';
				hrefAttr 		= el.attr('href')||'';
				imageTypes 		= /\.jpg|\.jpeg|\.png|\.gif|\.bmp/g;
				if (hrefAttr.toLowerCase().match(imageTypes) != null && relAttr.toLowerCase().indexOf('imagebox') == 0) {
					el.bind('click', jqlib.ImageBox.start);
				}
			}
		);
		if (jqlib.browser.msie) {
			iframe = document.createElement('iframe');
			jqlib(iframe)
				.attr(
					{
						id			: 'ImageBoxIframe',
						src			: 'javascript:false;',
						frameborder	: 'no',
						scrolling	: 'no'
					}
				)
				.css (
					{
						display		: 'none',
						position	: 'absolute',
						top			: '0',
						left		: '0',
						filter		: 'progid:DXImageTransform.Microsoft.Alpha(opacity=0)'
					}
				);
			jqlib('body').append(iframe);
		}

		var overlay	= document.createElement('div');
		jqlib(overlay)
			.attr('id', 'ImageBoxOverlay')
			.css(
				{
					position	: 'absolute',
					display		: 'none',
					top			: '0',
					left		: '0',
					opacity		: 0
				}
			)
			.append(document.createTextNode(' '))
			.bind('click', jqlib.ImageBox.hideImage);

		captionText = document.createElement('div');
		jqlib(captionText)
			.attr('id', 'ImageBoxCaptionText')
			.css(
				{
					paddingLeft		: jqlib.ImageBox.options.border + 'px'
				}
			)
			.append(document.createTextNode(' '));

		captionImages = document.createElement('div');
		jqlib(captionImages)
			.attr('id', 'ImageBoxCaptionImages')
			.css(
				{
					paddingLeft		: jqlib.ImageBox.options.border + 'px',
					paddingBottom	: jqlib.ImageBox.options.border + 'px'
				}
			)
			.append(document.createTextNode(' '));

		closeEl = document.createElement('a');
		jqlib(closeEl)
			.attr(
				{
					id			: 'ImageBoxClose',
					href		: '#'
				}
			)
			.css(
				{
					position	: 'absolute',
					right		: jqlib.ImageBox.options.border + 'px',
					top			: '0'
				}
			)
			.append(jqlib.ImageBox.options.closeHTML)
			.bind('click', jqlib.ImageBox.hideImage);

		captionEl = document.createElement('div');
		jqlib(captionEl)
			.attr('id', 'ImageBoxCaption')
			.css(
				{
					position	: 'relative',
					textAlign	: 'left',
					margin		: '0 auto',
					zIndex		: 1
				}
			)
			.append(captionText)
			.append(captionImages)
			.append(closeEl);

		loader = document.createElement('img');
		loader.src = jqlib.ImageBox.options.loaderSRC;
		jqlib(loader)
			.attr('id', 'ImageBoxLoader')
			.css(
				{
					position	: 'absolute'
				}
			);

		prevImage = document.createElement('a');
		jqlib(prevImage)
			.attr(
				{
					id			: 'ImageBoxPrevImage',
					href		: '#'
				}
			)
			.css(
				{
					position		: 'absolute',
					display			: 'none',
					overflow		: 'hidden',
					textDecoration	: 'none'
				}
			)
			.append(document.createTextNode(' '));

		nextImage = document.createElement('a');
		jqlib(nextImage)
			.attr(
				{
					id			: 'ImageBoxNextImage',
					href		: '#'
				}
			)
			.css(
				{
					position		: 'absolute',
					overflow		: 'hidden',
					textDecoration	: 'none'
				}
			)
			.append(document.createTextNode(' '));

		container = document.createElement('div');
		jqlib(container)
			.attr('id', 'ImageBoxContainer')
			.css(
				{
					display		: 'none',
					position	: 'relative',
					overflow	: 'hidden',
					textAlign	: 'left',
					margin		: '0 auto',
					top			: '0',
					left		: '0',
					zIndex		: 2
				}
			)
			.append([loader, prevImage, nextImage]);

		outerContainer = document.createElement('div');
		jqlib(outerContainer)
			.attr('id', 'ImageBoxOuterContainer')
			.css(
				{
					display		: 'none',
					position	: 'absolute',
					overflow	: 'hidden',
					top			: '0',
					left		: '0',
					textAlign	: 'center',
					backgroundColor : 'transparent',
					lineHeigt	: '0'
				}
			)
			.append([container,captionEl]);

		jqlib('body')
			.append(overlay)
			.append(outerContainer);


		//minimum width :
		prevImageEl = jqlib('#ImageBoxPrevImage');
		prevWidth = prevImageEl.css("width");
		if (!prevWidth) {
			prevWidth='';
		}
		else{
			if(prevWidth!=''){
				prevWidth = prevWidth.replace(/px/g,''); //on eleve le texte 'px' pour pouvoir faire des calculs
			}
		}
		nextImageEl = jqlib('#ImageBoxNextImage');
		nextWidth = nextImageEl.css("width");
		if (!nextWidth) {
			nextWidth='';
		}
		else{
			if(nextWidth!=''){
				nextWidth = nextWidth.replace(/px/g,''); //on eleve le texte 'px' pour pouvoir faire des calculs
			}
		}

		jqlib.ImageBox.minWidth=-(-(jqlib.ImageBox.options.border * 2)-nextWidth-prevWidth); //2*border+nextWidth+prevWidth

	},

	start : function(e, elm)
	{
		el = elm ? jqlib(elm) : jqlib(this);
		linkRel =  el.attr('rel');
		var totalImages, iteration, prevImage, nextImage;
		if (linkRel != 'imagebox') {
			jqlib.ImageBox.currentRel = linkRel;
			var gallery = jqlib('a[rel=' + linkRel + ']');
			totalImages = gallery.size();
			iteration = gallery.index(elm ? elm : this);
			prevImage = gallery.get(iteration - 1);
			nextImage = gallery.get(iteration + 1);
		}
		imageSrc =  el.attr('href');
		captionText = el.attr('title');
		caption2 = el.attr('content') || "";
		if (caption2!="") {
			captionText+="<br>"+caption2;
		}
		pageSize = jqlib.iUtil.getScroll();
		overlay = jqlib('#ImageBoxOverlay');
		if (!jqlib.ImageBox.opened) {
			jqlib.ImageBox.opened = true;
			if (jqlib.browser.msie) {
				jqlib('#ImageBoxIframe')
					.css ('height', Math.max(pageSize.ih,pageSize.h) + 'px')
					.css ('width', Math.max(pageSize.iw,pageSize.w) + 'px')
					.show();
			}
			overlay
				.css ('height', Math.max(pageSize.ih,pageSize.h) + 'px')
				.css ('width', Math.max(pageSize.iw,pageSize.w) + 'px')
				.show()
				.fadeTo(
					300,
					jqlib.ImageBox.options.overlayOpacity,
					function()
					{
						jqlib.ImageBox.loadImage(
							imageSrc,
							captionText,
							pageSize,
							totalImages,
							iteration,
							prevImage,
							nextImage
						);
					}
				);
			jqlib('#ImageBoxOuterContainer').css ('width', Math.max(pageSize.iw,pageSize.w) + 'px');
		} else {
			jqlib('#ImageBoxPrevImage').get(0).onclick = null;
			jqlib('#ImageBoxNextImage').get(0).onclick = null;
			jqlib.ImageBox.loadImage(
				imageSrc,
				captionText,
				pageSize,
				totalImages,
				iteration,
				prevImage,
				nextImage
			);
		}
		return false;
	},

	loadImage : function(imageSrc, captiontext, pageSize, totalImages, iteration, prevImage, nextImage)
	{
		jqlib('#ImageBoxCurrentImage').remove();
		prevImageEl = jqlib('#ImageBoxPrevImage');
		prevImageEl.hide();
		nextImageEl = jqlib('#ImageBoxNextImage');
		nextImageEl.hide();
		loader = jqlib('#ImageBoxLoader');
		container = jqlib('#ImageBoxContainer');
		outerContainer = jqlib('#ImageBoxOuterContainer');
		captionEl = jqlib('#ImageBoxCaption').css('visibility', 'hidden');
		//Avoid safari Bug :
		//jqlib('#ImageBoxCaptionText').html(captionText);
		jqlib('#ImageBoxCaptionText').html("<div id='ImageBoxCaptextcontainer' style='padding-right:4px'>"+captionText+"</div>");
		jqlib.ImageBox.animationInProgress = true;
		if (totalImages && jqlib.ImageBox.options.showTextImage)
			jqlib('#ImageBoxCaptionImages').html(
				jqlib.ImageBox.options.textImage
				+ ' ' + (iteration + 1) + ' '
				+ jqlib.ImageBox.options.textImageFrom
				+ ' ' + totalImages
			);
		if (prevImage) {
			prevImageEl.get(0).onclick = function()
			{
				this.blur();
				jqlib.ImageBox.start(null, prevImage);
				return false;
			};
		}
		if (nextImage) {
			nextImageEl.get(0).onclick =function()
			{
				this.blur();
				jqlib.ImageBox.start(null, nextImage);
				return false;
			};
		}
		loader.show();
		containerSize = jqlib.iUtil.getSize(container.get(0));
		containerW = Math.max(containerSize.wb, loader.get(0).width + jqlib.ImageBox.options.border * 2);
		containerH = Math.max(containerSize.hb, loader.get(0).height + jqlib.ImageBox.options.border * 2);
		loader
			.css(
				{
					left	: (containerW - loader.get(0).width)/2 + 'px',
					top		: (containerH - loader.get(0).height)/2 + 'px'
				}
			);
		container
			.css(
				{
					width	: containerW + 'px',
					height	: containerH + 'px'
				}
			)
			.show();
		clientSize = jqlib.iUtil.getClient();
		var adminMargin = parseInt(jqlib('html').css('margin-top'));
		if(isNaN(adminMargin)) adminMargin = 0;
		outerContainer
			.css('top', pageSize.t + adminMargin +  (clientSize.h / 15) + 'px');
		if (outerContainer.css('display') == 'none') {
			outerContainer
				.show()
				.fadeIn(
					jqlib.ImageBox.options.fadeDuration
				);
		}
		imageEl = new Image;
		// avoid Safari bug :
		imageEl.id='ImageBoxCurrentImage';
		imageEl.onload = function(){

				if (jqlib.browser.safari) {
					containerW = jQImageBox_imageEl.width + jqlib.ImageBox.options.border * 2;
					containerH = jQImageBox_imageEl.height + jqlib.ImageBox.options.border * 2;
				}

				containerW = imageEl.width + jqlib.ImageBox.options.border * 2;
				containerH = imageEl.height + jqlib.ImageBox.options.border * 2;

				//min width :
				if (jqlib.ImageBox.minWidth > containerW ) {
					containerW = jqlib.ImageBox.minWidth + jqlib.ImageBox.options.border * 2;
				}

				loader.hide();
				container.animate(
					{
						height		: containerH
					},
					containerSize.hb != containerH ? jqlib.ImageBox.options.fadeDuration : 1,
					function()
					{
						container.animate(
							{
								width		: containerW
							},
							containerSize.wb != containerW ? jqlib.ImageBox.options.fadeDuration : 1,
							function()
							{


								if (jqlib.browser.safari) {
									var imgtoprepend="<img src='"+jQImageBox_imageEl.src+"' id='imgboxtmp' style='display:none' >";
									container.prepend(imgtoprepend);
									var jqi_width = jqlib('#imgboxtmp').width();
									while(jqi_width==0){
										jqi_width = jqlib('#imgboxtmp').width();
									}
									jqi_height = jqlib('#imgboxtmp').height();
									jqlib('#imgboxtmp').remove();

									jqi_width = jqi_width - 2* jqlib.ImageBox.options.border;

									var imgtoprepend="<img src='"+jQImageBox_imageEl.src+"' id='"+jQImageBox_imageEl.id+"' >";
									container.prepend(imgtoprepend); //pour safari...

								}
								else{
									container.prepend(imageEl);
								}


								jqlib('#ImageBoxCurrentImage')
									.css(
										{
											position	: 'absolute',
											left		: (containerW-jqlib('#ImageBoxCurrentImage').width())/2+'px', //jqlib.ImageBox.options.border + 'px',
											top			: jqlib.ImageBox.options.border + 'px'
										}
									)
									.fadeIn(
										jqlib.ImageBox.options.fadeDuration,
										function()
										{
											captionSize = jqlib.iUtil.getSize(captionEl.get(0));

											//min width :
											if (jqlib.ImageBox.minWidth > containerW ) {
												 containerW = jqlib.ImageBox.minWidth;
											}

											if (prevImage) {
												prevImageEl
													.css(
														{
															left	: jqlib.ImageBox.options.border + 'px',
															top		: jqlib.ImageBox.options.border + 'px',
															width	: containerW/2 ,//- jqlib.ImageBox.options.border * 3 + 'px',
															height	: containerH - jqlib.ImageBox.options.border * 2 + 'px'
														}
													)
													.show();
											}
											if (nextImage) {
												nextImageEl
													.css(
														{
															left	: containerW/2 + jqlib.ImageBox.options.border * 2 + 1 + 'px',
															top		: jqlib.ImageBox.options.border + 'px',
															width	: containerW/2 - jqlib.ImageBox.options.border * 3 + 'px',
															height	: containerH - jqlib.ImageBox.options.border * 2 + 'px'
														}
													)
													.show();
											}

											jqlib("#ImageBoxCaptextcontainer").css('padding-top',jqlib("#ImageBoxClose").height());

											captionEl
												.css(
													{
														width		: containerW + 'px',
														top			: - captionSize.hb + 'px',
														visibility	: 'visible'
													}
												)
												.animate(
													{
														top		: -1
													},
													jqlib.ImageBox.options.fadeDuration,
													function()
													{
														jqlib.ImageBox.animationInProgress = false;
													}
												);
										}
									);
							}
						);
					}
				);
			}
		imageEl.src = imageSrc;

		jQImageBox_imageEl = imageEl;
	},

	hideImage : function()
	{
		jqlib('#ImageBoxCurrentImage').remove();
		jqlib('#ImageBoxOuterContainer').hide();
		jqlib('#ImageBoxCaption').css('visibility', 'hidden');
		jqlib('#ImageBoxOverlay').fadeTo(
			300,
			0,
			function(){
				jqlib(this).hide();
				if (jqlib.browser.msie) {
					jqlib('#ImageBoxIframe').hide();
				}
			}
		);
		jqlib('#ImageBoxPrevImage').get(0).onclick = null;
		jqlib('#ImageBoxNextImage').get(0).onclick = null;
		jqlib.ImageBox.currentRel = null;
		jqlib.ImageBox.opened = false;
		jqlib.ImageBox.animationInProgress = false;
		return false;
	}
};
