// -----------------------------------------------------------------------------------
//
//	Lightbox v2.03.3 - maj jeremy
//	by Lokesh Dhakar - http://www.huddletogether.com
//	5/21/06
//
// -----------------------------------------------------------------------------------
//
//	Configuration
//
var fileLoadingImage = "/include/js/lightbox/images/loading.gif";
var overlayOpacity = 0.8;	// controls transparency of shadow overlay
var animate = true;			// toggles resizing animations
var resizeSpeed = 8;		// controls the speed of the image resizing animations (1=slowest and 10=fastest)
var borderSize = 10;		// if you adjust the padding in the CSS, you will need to update this variable
var topPosition = 30;		// Distance entre lightbox et le haut de l'ecran
// -----------------------------------------------------------------------------------
//
//	Global Variables
//
var imageArray = new Array;
var activeImage;

if(animate == true) {
	overlayDuration = 0.2;	// shadow fade in/out duration
	if(resizeSpeed > 10){ resizeSpeed = 10;}
	if(resizeSpeed < 1){ resizeSpeed = 1;}
	resizeDuration = (11 - resizeSpeed) * 0.15;
} else {
	overlayDuration = 0;
	resizeDuration = 0;
}
// -----------------------------------------------------------------------------------
//
//	Additional methods for Element added by SU, Couloir
//	- further additions by Lokesh Dhakar (huddletogether.com)
//
Object.extend(Element, {
	getWidth: function(element) {
	   	element = $(element);
	   	return element.offsetWidth;
	},
	setWidth: function(element,w) {
	   	element = $(element);
    	element.style.width = w +"px";
	},
	setHeight: function(element,h) {
   		element = $(element);
    	element.style.height = h +"px";
	},
	setTop: function(element,t) {
	   	element = $(element);
    	element.style.top = t +"px";
	},
	setLeft: function(element,l) {
	   	element = $(element);
    	element.style.left = l +"px";
	},
	setSrc: function(element,src) {
    	element = $(element);
    	element.src = src;
	},
	setHref: function(element,href) {
    	element = $(element);
    	element.href = href;
	},
	setInnerHTML: function(element,content) {
		element = $(element);
		element.innerHTML = content;
	}
});
// -----------------------------------------------------------------------------------
//
//	Extending built-in Array object
//	- array.removeDuplicates()
//	- array.empty()
//
Array.prototype.removeDuplicates = function () {
    for(i = 0; i < this.length; i++){
        for(j = this.length-1; j>i; j--){
            if(this[i][0] == this[j][0]){
                this.splice(j,1);
            }
		}
	}
}
// -----------------------------------------------------------------------------------
Array.prototype.empty = function () {
	for(i = 0; i <= this.length; i++){
		this.shift();
	}
}
// -----------------------------------------------------------------------------------
//
//	Structuring of code inspired by Scott Upton (http://www.uptonic.com/)
//
var Lightbox = Class.create();

Lightbox.prototype = {

	// initialize()
	// Constructor runs on completion of the DOM loading. Calls updateImageList and then
	// the function inserts html at the bottom of the page which is used to display the shadow
	// overlay and the image container.
	//
	initialize: function() {

		this.updateImageList();

		// Code inserts html at the bottom of the page that looks similar to this:
		//
		//	<div id="overlay"></div>
		//	<div id="lightbox">
		//		<div id="outerImageContainer">
		//				<div id="bottomNav">
		//					<a href="#" id="bottomNavClose">
		//            <span>Fermer</span>
		//					</a>
		//			</div>
		//			<div id="imageContainer">
		//				<img id="lightboxImage">
		//				<div id="loading">
		//					<a href="#" id="loadingLink">
		//						<img src="images/loading.gif">
		//					</a>
		//				</div>
		//			</div>
		//		</div>
		//		<div id="imageDataContainer">
		//			<div id="imageData">
		//				<div id="imageDetails">
		//					<span id="caption"></span>
		//					<span id="numberDisplay"></span>
		//				</div>
		//			</div>
		//		</div>
		//				<div style="" id="hoverNav">
		//					<a href="#" id="prevLink"></a>
		//					<a href="#" id="nextLink"></a>
		//				</div>
		//	</div>


		var objBody = document.getElementsByTagName("body").item(0);

		var objOverlay = document.createElement("div");
		objOverlay.setAttribute('id','overlay');
		objOverlay.style.display = 'none';
		objOverlay.onclick = function() { myLightbox.end(); }
		objBody.appendChild(objOverlay);

		var objLightbox = document.createElement("div");
		objLightbox.setAttribute('id','lightbox');
		objLightbox.style.display = 'none';
		objLightbox.style.top = topPosition;
		objLightbox.onclick = function(e) {	// close Lightbox is user clicks shadow overlay
			if (!e) var e = window.event;
			var clickObj = Event.element(e).id;
			if ( clickObj == 'lightbox') {
				myLightbox.end();
			}
		};
		objBody.appendChild(objLightbox);

		var objBottomNav = document.createElement("div");
		objBottomNav.setAttribute('id','bottomNav');
		objLightbox.appendChild(objBottomNav);

		var objBottomNavCloseLink = document.createElement("a");
		objBottomNavCloseLink.setAttribute('id','bottomNavClose');
		objBottomNavCloseLink.setAttribute('href','#');
		objBottomNavCloseLink.innerHTML = '<span>Fermer</span>';
		objBottomNavCloseLink.onclick = function() { myLightbox.end(); return false; }
		objBottomNav.appendChild(objBottomNavCloseLink);

		var objOuterImageContainer = document.createElement("div");
		objOuterImageContainer.setAttribute('id','outerImageContainer');
		objLightbox.appendChild(objOuterImageContainer);

		// When Lightbox starts it will resize itself from 250 by 250 to the current image dimension.
		// If animations are turned off, it will be hidden as to prevent a flicker of a
		// white 250 by 250 box.
		if(animate){
			Element.setWidth('outerImageContainer', 250);
			Element.setHeight('outerImageContainer', 250);
			Element.setWidth('bottomNav', 250);
		} else {
			Element.setWidth('outerImageContainer', 1);
			Element.setHeight('outerImageContainer', 1);
			Element.setWidth('bottomNav', 1);
		}

		var objImageContainer = document.createElement("div");
		objImageContainer.setAttribute('id','imageContainer');
		objOuterImageContainer.appendChild(objImageContainer);

		var objLightboxImage = document.createElement("img");
		objLightboxImage.setAttribute('id','lightboxImage');
		objImageContainer.appendChild(objLightboxImage);

		var objLoading = document.createElement("div");
		objLoading.setAttribute('id','loading');
		objImageContainer.appendChild(objLoading);

		var objLoadingLink = document.createElement("a");
		objLoadingLink.setAttribute('id','loadingLink');
		objLoadingLink.setAttribute('href','#');
		objLoadingLink.onclick = function() { myLightbox.end(); return false; }
		objLoading.appendChild(objLoadingLink);

		var objLoadingImage = document.createElement("img");
		objLoadingImage.setAttribute('src', fileLoadingImage);
		objLoadingLink.appendChild(objLoadingImage);

		var objImageDataContainer = document.createElement("div");
		objImageDataContainer.setAttribute('id','imageDataContainer');
		objImageDataContainer.className = 'clearfix';
		objLightbox.appendChild(objImageDataContainer);

		var objImageData = document.createElement("div");
		objImageData.setAttribute('id','imageData');
		objImageDataContainer.appendChild(objImageData);

		var objImageDetails = document.createElement("div");
		objImageDetails.setAttribute('id','imageDetails');
		objImageData.appendChild(objImageDetails);

		var objCaption = document.createElement("span");
		objCaption.setAttribute('id','caption');
		objImageDetails.appendChild(objCaption);

		var objNumberDisplay = document.createElement("span");
		objNumberDisplay.setAttribute('id','numberDisplay');
		objImageDetails.appendChild(objNumberDisplay);

		var objHoverNav = document.createElement("div");
		objHoverNav.setAttribute('id','hoverNav');
		objLightbox.appendChild(objHoverNav);

		var objPrevLink = document.createElement("a");
		objPrevLink.setAttribute('id','prevLink');
		objPrevLink.setAttribute('href','#');
		objPrevLink.setAttribute('title', 'Image précédente');
		objHoverNav.appendChild(objPrevLink);

		var objNextLink = document.createElement("a");
		objNextLink.setAttribute('id','nextLink');
		objNextLink.setAttribute('href','#');
		objNextLink.setAttribute('title', 'Image suivante');
		objHoverNav.appendChild(objNextLink);


	},
	//
	// updateImageList()
	// Loops through anchor tags looking for 'lightbox' references and applies onclick
	// events to appropriate links. You can rerun after dynamically adding images w/ajax.
	//
	updateImageList: function() {
		if (!document.getElementsByTagName){ return; }
		var anchors = document.getElementsByTagName('a');
		var areas = document.getElementsByTagName('area');

		// loop through all anchor tags
		for (var i=0; i<anchors.length; i++){
			var anchor = anchors[i];

			var relAttribute = String(anchor.getAttribute('rel'));

			// use the string.match() method to catch 'lightbox' references in the rel attribute
			if (anchor.getAttribute('href') && (relAttribute.toLowerCase().match('lightbox'))){
				anchor.onclick = function () {myLightbox.start(this); return false;}
			}
		}

		// loop through all area tags
		// todo: combine anchor & area tag loops
		for (var i=0; i< areas.length; i++){
			var area = areas[i];

			var relAttribute = String(area.getAttribute('rel'));

			// use the string.match() method to catch 'lightbox' references in the rel attribute
			if (area.getAttribute('href') && (relAttribute.toLowerCase().match('lightbox'))){
				area.onclick = function () {myLightbox.start(this); return false;}
			}
		}
	},
	//
	//	start()
	//	Display overlay and lightbox. If image is part of a set, add siblings to imageArray.
	//
	start: function(imageLink) {

		hideSelectBoxes();
		hideFlash();

		// stretch overlay to fill page and fade in
		Element.setHeight('overlay', YAHOO.util.Dom.getDocumentHeight());
		Element.setWidth('overlay', YAHOO.util.Dom.getDocumentWidth());
		
		new Effect.Appear('overlay', { duration: overlayDuration, from: 0.0, to: overlayOpacity });
		imageArray = [];
		imageNum = 0;

		if (!document.getElementsByTagName){ return; }
		var anchors = document.getElementsByTagName( imageLink.tagName);

		// if image is NOT part of a set..
		if((imageLink.getAttribute('rel') == 'lightbox')){
			// add single image to imageArray
			imageArray.push(new Array(imageLink.getAttribute('href'), imageLink.getAttribute('title')));
		} else {
		// if image is part of a set..

			// loop through anchors, find other images in set, and add them to imageArray
			for (var i=0; i<anchors.length; i++){
				var anchor = anchors[i];
				if (anchor.getAttribute('href') && (anchor.getAttribute('rel') == imageLink.getAttribute('rel'))){
					imageArray.push(new Array(anchor.getAttribute('href'), anchor.getAttribute('title')));
				}
			}
			imageArray.removeDuplicates();
			while(imageArray[imageNum][0] != imageLink.getAttribute('href')) { imageNum++;}
		}

		if (imageArray.length > 1) {
			Element.show('hoverNav');
			Element.show('prevLink');
			Element.show('nextLink');
		} else {
			Element.hide('hoverNav');
			Element.hide('prevLink');
			Element.hide('nextLink');
		}

		// calculate top and left offset for the lightbox
		Element.setTop('lightbox', YAHOO.util.Dom.getDocumentScrollTop()  + topPosition);
		Element.setLeft('lightbox', YAHOO.util.Dom.getDocumentScrollLeft());
		Element.show('lightbox');

		this.changeImage(imageNum);
	},
	//
	//	changeImage()
	//	Hide most elements and preload image in preparation for resizing image container.
	//
	changeImage: function(imageNum) {

		activeImage = imageNum;	// update global var

		// hide elements during transition
		if(animate){ Element.show('loading');}
		Element.hide('lightboxImage');
		Element.hide('imageDataContainer');
		Element.hide('numberDisplay');

		imgPreloader = new Image();

		// once image is preloaded, resize image container
		imgPreloader.onload = function(){
			Element.setSrc('lightboxImage', imageArray[activeImage][0]);

			availableWidth = YAHOO.util.Dom.getViewportWidth() - 120 - (borderSize * 2);
			availableHeight = YAHOO.util.Dom.getViewportHeight() - topPosition - 100 - (borderSize * 2);
			coefHeight = (availableHeight >  imgPreloader.height ? 1 : Math.ceil(availableHeight / imgPreloader.height  * 100) / 100 );
			coefWidth = (availableWidth >  imgPreloader.width ? 1 : Math.ceil(availableWidth / imgPreloader.width * 100) / 100 );
			coefFinal = (coefHeight < coefWidth ? coefHeight : coefWidth);

			Element.setHeight('lightboxImage', imgPreloader.height  * coefFinal);
			Element.setWidth('lightboxImage', imgPreloader.width  * coefFinal);

			myLightbox.resizeImageContainer(imgPreloader.width  * coefFinal, imgPreloader.height  * coefFinal);
			imgPreloader.onload = function(){};	//	clear onLoad, IE behaves irratically with animated gifs otherwise

		}
		imgPreloader.src = imageArray[activeImage][0];
	},
	//
	//	resizeImageContainer()
	//
	resizeImageContainer: function(imgWidth, imgHeight) {

		// get current width and height
		this.widthCurrent = Element.getWidth('outerImageContainer');
		this.heightCurrent = Element.getHeight('outerImageContainer');

		// get new width and height
		var widthNew = (imgWidth  + (borderSize * 2));
		if (widthNew < 220) widthNew = 220;
		var heightNew = (imgHeight  + (borderSize * 2));

		// scalars based on change from old to new
		this.xScale = ( widthNew / this.widthCurrent) * 100;
		this.yScale = ( heightNew / this.heightCurrent) * 100;

		// calculate size difference between new and old image, and resize if necessary
		wDiff = this.widthCurrent - widthNew;
		hDiff = this.heightCurrent - heightNew;

		if(!( hDiff == 0)){ new Effect.Scale('outerImageContainer', this.yScale, {scaleX: false, duration: resizeDuration, queue: 'front'}); }
		if(!( wDiff == 0)){
			new Effect.Scale('outerImageContainer', this.xScale, {scaleY: false, delay: resizeDuration, duration: resizeDuration});
			new Effect.Scale('bottomNav', this.xScale, {scaleY: false, scaleContent:false, delay: resizeDuration, duration: resizeDuration});
		}

		// if new and old image are same size and no scaling transition is necessary,
		// do a quick pause to prevent image flicker.
		if((hDiff == 0) && (wDiff == 0)){
			if (navigator.appVersion.indexOf("MSIE")!=-1){ pause(250); } else { pause(100);}
		}

		Element.setWidth('imageDataContainer', widthNew);

		this.showImage();
	},
	//
	//	showImage()
	//	Display image and begin preloading neighbors.
	//
	showImage: function(){
		Element.hide('loading');
		new Effect.Appear('lightboxImage', { duration: resizeDuration, queue: 'end', afterFinish: function(){	myLightbox.updateDetails(); } });
		this.preloadNeighborImages();
	},
	//
	//	updateDetails()
	//	Display caption, image number, and bottom nav.
	//
	updateDetails: function() {

		// if caption is not null
		if(imageArray[activeImage][1]){
		Element.show('caption');
		Element.setInnerHTML( 'caption', imageArray[activeImage][1]);
		}

		// if image is part of set display 'Image x of x'
		if(imageArray.length > 1){
			Element.show('numberDisplay');
			Element.show('hoverNav');
			Element.setInnerHTML( 'numberDisplay', "Galerie : image " + eval(activeImage + 1) + " sur " + imageArray.length);
		}

		Element.show('bottomNav');

		new Effect.Parallel(
			[ new Effect.SlideDown( 'imageDataContainer', { sync: true, duration: resizeDuration, from: 0.0, to: 1.0 }),
			  new Effect.Appear('imageDataContainer', { sync: true, duration: resizeDuration }) ],
			{ duration: resizeDuration, afterFinish: function() {
				// update overlay size and update nav
				Element.setHeight('overlay', YAHOO.util.Dom.getDocumentHeight());
				Element.setWidth('overlay', YAHOO.util.Dom.getDocumentWidth());
				myLightbox.updateNav();
				}
			}
		);
	},
	//
	//	updateNav()
	//	Display appropriate previous and next hover navigation.
	//
	updateNav: function() {

		if (imageArray.length > 1) {
			// if its the first image in set, prev image button will display the last
			prevImage = activeImage != 0 ? (activeImage - 1) : (imageArray.length - 1);
			// Element.show('prevLink');
			document.getElementById('prevLink').onclick = function() {
					myLightbox.changeImage(prevImage);
					return false;
			}
			// if not last image in set, next image button will display the first
			nextImage = (activeImage != (imageArray.length - 1) ? (activeImage + 1) : 0);
			// Element.show('nextLink');
			document.getElementById('nextLink').onclick = function() {
					myLightbox.changeImage(nextImage);
					return false;
			}
		}
		this.enableKeyboardNav();
	},
	//
	//	enableKeyboardNav()
	//
	enableKeyboardNav: function() {
		document.onkeydown = this.keyboardAction;
	},
	//
	//	disableKeyboardNav()
	//
	disableKeyboardNav: function() {
		document.onkeydown = '';
	},
	//
	//	keyboardAction()
	//
	keyboardAction: function(e) {
		if (e == null) { // ie
			keycode = event.keyCode;
			escapeKey = 27;
		} else { // mozilla
			keycode = e.keyCode;
			escapeKey = e.DOM_VK_ESCAPE;
		}

		key = String.fromCharCode(keycode).toLowerCase();

		if((key == 'x') || (key == 'o') || (key == 'c') || (keycode == escapeKey)){	// close lightbox
			myLightbox.end();
		} else if((key == 'p') || (keycode == 37)){	// display previous image
			if (imageArray.length > 1) {
				// if its the first image in set, prev image button will display the last
				prevImage = activeImage != 0 ? (activeImage - 1) : (imageArray.length - 1);
				myLightbox.disableKeyboardNav();
				myLightbox.changeImage(prevImage);
			}
		} else if((key == 'n') || (key == 's') || (keycode == 39)){	// display next image
			if (imageArray.length > 1) {
				// if not last image in set, next image button will display the first
				nextImage = (activeImage != (imageArray.length - 1) ? (activeImage + 1) : 0);
				myLightbox.disableKeyboardNav();
				myLightbox.changeImage(nextImage);
			}
		}

	},
	//
	//	preloadNeighborImages()
	//	Preload previous and next images.
	//
	preloadNeighborImages: function(){
		if((imageArray.length - 1) > activeImage){
			preloadNextImage = new Image();
			preloadNextImage.src = imageArray[activeImage + 1][0];
		}
		if(activeImage > 0){
			preloadPrevImage = new Image();
			preloadPrevImage.src = imageArray[activeImage - 1][0];
		}
	},
	//
	//	end()
	//
	end: function() {
		this.disableKeyboardNav();
		Element.hide('lightbox');
		new Effect.Fade('overlay', { duration: overlayDuration});
		showSelectBoxes();
		showFlash();
	}
}
// ---------------------------------------------------
function showSelectBoxes(){
	var selects = document.getElementsByTagName("select");
	for (i = 0; i != selects.length; i++) {
		selects[i].style.visibility = "visible";
	}
	var o = document.getElementById('colonnePub');
	if (o) o.style.visibily = 'visible';
}
// ---------------------------------------------------
function hideSelectBoxes(){
	var selects = document.getElementsByTagName("select");
	for (i = 0; i != selects.length; i++) {
		selects[i].style.visibility = "hidden";
	}
	var o = document.getElementById('colonnePub');
	if (o) o.style.visibily = 'hidden';
}
// ---------------------------------------------------
function showFlash(){
	var flashObjects = document.getElementsByTagName("object");
	for (i = 0; i < flashObjects.length; i++) {
		flashObjects[i].style.visibility = "visible";
	}

	var flashEmbeds = document.getElementsByTagName("embed");
	for (i = 0; i < flashEmbeds.length; i++) {
		flashEmbeds[i].style.visibility = "visible";
	}
}
// ---------------------------------------------------
function hideFlash(){
	var flashObjects = document.getElementsByTagName("object");
	for (i = 0; i < flashObjects.length; i++) {
		flashObjects[i].style.visibility = "hidden";
	}

	var flashEmbeds = document.getElementsByTagName("embed");
	for (i = 0; i < flashEmbeds.length; i++) {
		flashEmbeds[i].style.visibility = "hidden";
	}
}
// ---------------------------------------------------
//
// pause(numberMillis)
// Pauses code execution for specified time. Uses busy code, not good.
// Help from Ran Bar-On [ran2103@gmail.com]
//
function pause(ms){
	var date = new Date();
	curDate = null;
	do{var curDate = new Date();}
	while( curDate - date < ms);
}
// ---------------------------------------------------
var myLightboxTimer = 0;
function initLightbox() { 
	myLightbox = new Lightbox(); 
}
function scrollLightbox() {
	resize_scrollLightbox(false);
}
function resizeLightbox() {
	resize_scrollLightbox(true);
}
function resize_scrollLightbox(isResize) {
	test = document.getElementById('overlay');
	
	if (test && test.style.display != 'none') {
		// stretch overlay to fill page and fade in
		Element.setHeight('overlay', YAHOO.util.Dom.getDocumentHeight());
		Element.setWidth('overlay', YAHOO.util.Dom.getDocumentWidth());
			
		// action only is 0.2 seconds of pause
		clearTimeout(myLightboxTimer);
		myLightboxTimer = setTimeout(function() { 
			try {
				// calculate top and left offset for the lightbox
				Element.setTop('lightbox', YAHOO.util.Dom.getDocumentScrollTop()  + topPosition);
				Element.setLeft('lightbox', YAHOO.util.Dom.getDocumentScrollLeft());
								
				// re-load (cached) image
				if (isResize) {
					myLightbox.changeImage(activeImage);
				}	
			} catch(ex) {
				//console.log(ex);				
			}
		}, 200);
	}			
}
Event.observe(window, 'load', initLightbox, false);
Event.observe(window, 'scroll', scrollLightbox, false);
Event.observe(window, 'resize', resizeLightbox, false);