(function($) {
	$.facebox = function(data) {
		$.facebox.init()
		$.facebox.loading()
		$.isFunction(data) ? data.call() : $.facebox.reveal(data)
	}

	$.facebox.settings = {
			loading_image : '/css/i/facebox/loading.gif',
			close_image   : '/css/i/facebox/closelabel.gif ',
			image_types   : [ 'png', 'jpg', 'jpeg', 'gif' ],
			facebox_html  : '\
				<div id="back" style="width:100%;height:100%;background:#000000;opacity:0.8;filter:alpha(opacity=80);position:absolute;top:0;left:0;display:none;" /> \
				<div class="popup" style="z-index:9999;"> \
				<div id="facebox" style="display:none;"> \
				<table> \
				<tbody> \
				<tr> \
				<td class="body"> \
				<div class="content"> \
				</div> \
				</td> \
				</tr> \
				</tbody> \
				</table> \
				</div> \
				</div>'
	}

	$.facebox.loading = function() {
		//if ($('#facebox .loading').length == 1) return true

		$('#facebox .content').empty()
		$('#facebox .body').children().hide().end().
		append('<div class="loading"><img src="'+$.facebox.settings.loading_image+'"/></div>')

		var pageScroll = $.facebox.getPageScroll()
		$('#facebox').css({
			top:	pageScroll[1] + ($.facebox.getPageHeight() / 10),
			left:	pageScroll[0]
		}).show()

		$(document).bind('keydown.facebox', function(e) {
			if (e.keyCode == 27) $.facebox.close(true)
		})
	}

	$.facebox.reveal = function(data, klass) {
		if (klass) $('#facebox .content').addClass(klass);
		$('#facebox .content').append(data);
		$('#facebox .loading').remove();
		$('#facebox .body').children().fadeIn('normal');

		if (window.innerHeight && window.scrollMaxY) {// Firefox
			yWithScroll = window.innerHeight + window.scrollMaxY;
		} else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
			yWithScroll = document.body.scrollHeight;
		} else { // works in Explorer 6 Strict, Mozilla (not FF) and Safari
			yWithScroll = document.body.offsetHeight;
		}
		$('#back').css("height",yWithScroll);
		$('#back').show();
	}

	function stop(swf) { 
		thisMovie(swf).setStop(); 
	};

	function getUpdate(typ,pr1,pr2,swf) {};

	function thisMovie(swf) {
		if(navigator.appName.indexOf("Microsoft") != -1) {
			return window[swf];
		} else {
			return document[swf];
		}
	};

	$.facebox.close = function(isPlayer) {

		if (isPlayer) {
			stop('flashplayer');
		}

		$(document).unbind('keydown.facebox');
		$('#facebox').fadeOut(function() {
			$('#facebox .content').removeClass().addClass('content');
			$('#facebox .content').html('');
			$('#back').hide();
		})

		return false
	}

	$.fn.facebox = function() {
		$.facebox.init()

		var image_types = $.facebox.settings.image_types.join('|')
		image_types = new RegExp('\.' + image_types + '$', 'i')

		function click_handler() {
			if ($('#facebox .loading').length == 1) {return false;}
			else $.facebox.loading(true);

			// support for rel="facebox[.inline_popup]" syntax, to add a class
			var klass = this.rel.match(/facebox\[\.(\w+)\]/)
			if (klass) klass = klass[1]

	         // div
	         if (this.href.match(/#/)) {
	        	 var url    = window.location.href.split('#')[0]
	        	                                              var target = this.href.replace(url,'')
	        	                                              $.facebox.reveal($(target).clone().show(), klass)
	
	        	                                              // image
	         } else if (this.href.match(image_types)) {
	        	 var image = new Image()
	        	 image.onload = function() {
	        		 $.facebox.reveal('<div class="image"><img src="' + image.src + '" /></div>', klass)
	        	 }
	        	 image.src = this.href
	
	        	 // ajax
	         } else {
	        	 $.get(this.href, function(data) { $.facebox.reveal(data, klass) })
	         }

			return false
		}

		this.click(click_handler)
		return this
	}

	$.facebox.init = function() {
		if ($.facebox.settings.inited) {
			return true
		} else {
			$.facebox.settings.inited = true
		}

		$('body').append($.facebox.settings.facebox_html)

		var preload = [ new Image(), new Image() ]
		                preload[0].src = $.facebox.settings.close_image
		                preload[1].src = $.facebox.settings.loading_image

		                $('#facebox').find('.b:first, .bl, .br, .tl, .tr').each(function() {
		                	preload.push(new Image())
		                	preload.slice(-1).src = $(this).css('background-image').replace(/url\((.+)\)/, '$1')
		                })

		                $('#facebox .close').click($.facebox.close)
		                $('#facebox .close_image').attr('src', $.facebox.settings.close_image)
	}

	// getPageScroll() by quirksmode.com
	$.facebox.getPageScroll = function() {
		var xScroll, yScroll;
		if (self.pageYOffset) {
			yScroll = self.pageYOffset;
			xScroll = self.pageXOffset;
		} else if (document.documentElement && document.documentElement.scrollTop) {	 // Explorer 6 Strict
			yScroll = document.documentElement.scrollTop;
			xScroll = document.documentElement.scrollLeft;
		} else if (document.body) {// all other Explorers
			yScroll = document.body.scrollTop;
			xScroll = document.body.scrollLeft;	
		}
		return new Array(xScroll,yScroll) 
	}

	// adapter from getPageSize() by quirksmode.com
	$.facebox.getPageHeight = function() {
		var windowHeight
		if (self.innerHeight) {	// all except Explorer
			windowHeight = self.innerHeight;
		} else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
			windowHeight = document.documentElement.clientHeight;
		} else if (document.body) { // other Explorers
			windowHeight = document.body.clientHeight;
		}	
		return windowHeight
	}
})(jQuery);
