(function($){
	$.lightbox = function (options) {
		var settings = {
			padding: 15,
			width: null,
			height: null,
			finalHeight: null,
			url: null,
			title: null,
			callback: null
		};
		$.extend(settings, options);
		
		var zIndex = 90;
		$('.jquery-lightbox').each(function () {
			var jlightbox = $(this);
			var tmp_zIndex = jlightbox.css('z-index');
			if (tmp_zIndex>=zIndex) zIndex = tmp_zIndex+1;
		});
		
		var joverlay = $('<div class="jquery-lightbox-overlay"></div>');
		joverlay.css({
			opacity: 0.5,
			'z-index': zIndex
		});
		var jlightbox = $('<div class="jquery-lightbox"></div>');
		jlightbox.css({
			'z-index': zIndex+1
		});
		$('body').append(joverlay, jlightbox);

		function close() {
			jlightbox.remove();
			joverlay.fadeOut(function(){
				joverlay.remove();
			});
		};
		joverlay.click(close);

		function getValue(values, referenceValue) {
			var value = null;
			for (var i in values) {
				value = values[i];
				if (typeof value=='string') {
					var intValue = parseInt(value,10);
					if (value.substr(value.length-1,value.length)=='%') value = Math.round(intValue*referenceValue/100);
					else value = intValue;
				}
				if (value) return value;
			}
			return 0;
		}

		function append(settings, width, height, jfullcontent) {
			var window_width = $(window).width();
			var window_height = $(window).height();
			var jcontent = jfullcontent.not('script');
			width = getValue([width, jcontent.css('width'), 800], window_width);
			height = getValue([height, jcontent.css('height'), 400], window_height);
			if ($.browser.msie && $.browser.version=='6.0') {
				joverlay.css('position','absolute').css('height',window_width);
				jlightbox.css('position','absolute');
			}
			var jclose = $('<div class="jquery-lightbox-close"></div>');
			jclose.click(close);
			jlightbox.animate({
					left: Math.round((window_width-width-2*settings.padding)/2),
					top: Math.round((window_height-height-2*settings.padding)/2),
					width: width,
					height: height,
					padding: settings.padding
				},
				null,
				function(){
					jlightbox.append(jclose, jfullcontent);
					if (settings.finalHeight) {
						jlightbox.css({height: settings.finalHeight});
					} else if (jcontent.size()==1 && jcontent.height()!=height) {
						jcontent.css({height: height});
					}
					if (settings.callback) {
						settings.callback();
					}
				}
			);
		}

		var url = settings.url;
		if (url.indexOf('?')!=-1) {
			url = url.substring(0,url.indexOf('?'));
		}
		var url_elements = url.split('.');
		var ext = url_elements[url_elements.length-1];
		if (ext=='png' || ext=='jpg' || ext=='gif' || ext=='jpeg') {
			var image = new Image();
			var jimage = $(image);
			jimage.load(function(){
				settings.finalHeight = 'auto';
				if (!settings.title) settings.title = jimage.attr('src');
				var jinfos = $('<div class="jquery-lightbox-infos">'+settings.title+'</div>');
				append(settings, image.width, image.height, jimage.add(jinfos));
			});
			jimage.attr('src', settings.url);
		} else {
			if (settings.url.substr(0,7)!='http://') settings.url = $('base').attr('href')+settings.url;
			$.ajax({
				url: settings.url,
				success: function(msg){
					append(settings, settings.width, settings.height, $(msg));
				}
			});
		}

	};
	$.fn.lightbox = function (options) {
		var settings = {
			url: null,
			title: null
		};
		$.extend(settings, options);

		var jelems = this.not('[lightbox]');
		jelems.attr('lightbox', true);

		jelems.click(function(event){
			var jelem = $(this);
			event.preventDefault();
			if (jelem.attr('running')) return;
			jelem.attr('running', true);
			settings.url = jelem.attr('href');
			settings.title = jelem.attr('title');
			settings.callback = function () {
				jelem.removeAttr('running');
			};
			$.lightbox(settings);
		});
	};
})(jQuery);

