(function($) {
	$.htmlbox = function(data, klass) {
		$.htmlbox.loading()

		if (data.ajax) fillhtmlboxFromAjax(data.ajax)
		else if (data.image) fillhtmlboxFromImage(data.image)
		else if (data.div) fillhtmlboxFromHref(data.div)
		else if ($.isFunction(data)) data.call($)
		else $.htmlbox.reveal(data, klass)
	}

	/*
* Public, $.htmlbox methods
*/

	$.extend($.htmlbox, {
settings: {
			opacity      : 0,
			overlay      : true,
			loadingImage : 'images/tmp/loading.gif',
			closeImage   : 'images/tmp/closelabel.gif',
			imageTypes   : [ 'png', 'jpg', 'jpeg', 'gif' ],
			htmlboxHtml  : '\
	<div id="htmlbox" style="display:none;"> \
	<div class="popup"> \
		<table> \
		<tbody> \
			<tr> \
			<td class="tl"/><td class="b"/><td class="tr"/> \
			</tr> \
			<tr> \
			<td class="b"/> \
			<td class="body"> \
				<div class="content"> \
				</div> \
				<div class="footer_htb"> \
				<a href="#" class="close"> \
					<img src="images/tmp/closelabel.gif" title="Zamknij" class="close_image" /> \
				</a> \
				</div> \
			</td> \
			<td class="b"/> \
			</tr> \
			<tr> \
			<td class="bl"/><td class="b"/><td class="br"/> \
			</tr> \
		</tbody> \
		</table> \
	</div> \
	</div>'
		},

loading: function() {
			init()
			if ($('#htmlbox .loading').length == 1) return true
			showOverlay()

			$('#htmlbox .content').empty()
			$('#htmlbox .body').children().hide().end().
			append('<div class="loading"><img src="'+$.htmlbox.settings.loadingImage+'"/></div>')
			$('#htmlbox').css({
top:	getPageScroll()[1] + (getPageHeight() / 10),
left:	385.5
			}).show()

			$(document).bind('keydown.htmlbox', function(e) {
				if (e.keyCode == 27) $.htmlbox.close()
				return true
			})
			$(document).trigger('loading.htmlbox')
		},

reveal: function(data, klass) {
			$(document).trigger('beforeReveal.htmlbox')
			if (klass) $('#htmlbox .content').addClass(klass)
			$('#htmlbox .content').append(data)
			$('#htmlbox .loading').remove()
			$('#htmlbox .body').children().fadeIn('normal')
			$('#htmlbox').css('left', $(window).width() / 2 - ($('#htmlbox table').width() / 2))
			$(document).trigger('reveal.htmlbox').trigger('afterReveal.htmlbox')
		},

close: function() {
			$(document).trigger('close.htmlbox')
			return false
		}
	})

	/*
* Public, $.fn methods
*/

	$.fn.htmlbox = function(settings) {
		init(settings)

		function clickHandler() {
			$.htmlbox.loading(true)

			var klass = this.rel.match(/htmlbox\[?\.(\w+)\]?/)
			if (klass) klass = klass[1]

			fillhtmlboxFromHref(this.href, klass)
			return false
		}

		return this.click(clickHandler)
	}
	function init(settings) {
		if ($.htmlbox.settings.inited) return true
		else $.htmlbox.settings.inited = true

		$(document).trigger('init.htmlbox')
		makeCompatible()

		var imageTypes = $.htmlbox.settings.imageTypes.join('|')
		$.htmlbox.settings.imageTypesRegexp = new RegExp('\.' + imageTypes + '$', 'i')

		if (settings) $.extend($.htmlbox.settings, settings)
		$('body').append($.htmlbox.settings.htmlboxHtml)

		var preload = [ new Image(), new Image() ]
		preload[0].src = $.htmlbox.settings.closeImage
		preload[1].src = $.htmlbox.settings.loadingImage

		$('#htmlbox').find('.b:first, .bl, .br, .tl, .tr').each(function() {
			preload.push(new Image())
			preload.slice(-1).src = $(this).css('background-image').replace(/url\((.+)\)/, '$1')
		})

		$('#htmlbox .close').click($.htmlbox.close)
		$('#htmlbox .close_image').attr('src', $.htmlbox.settings.closeImage)
	}

	function getPageScroll() {
		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) 
	}

	function getPageHeight() {
		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
	}

	function makeCompatible() {
		var $s = $.htmlbox.settings

		$s.loadingImage = $s.loading_image || $s.loadingImage
		$s.closeImage = $s.close_image || $s.closeImage
		$s.imageTypes = $s.image_types || $s.imageTypes
		$s.htmlboxHtml = $s.htmlbox_html || $s.htmlboxHtml
	}

	function fillhtmlboxFromHref(href, klass) {
		// div
		if (href.match(/#/)) {
			var url    = window.location.href.split('#')[0]
			var target = href.replace(url,'')
			$.htmlbox.reveal($(target).clone().show(), klass)

			// image
		} else if (href.match($.htmlbox.settings.imageTypesRegexp)) {
			fillhtmlboxFromImage(href, klass)
			// ajax
		} else {
			fillhtmlboxFromAjax(href, klass)
		}
	}

	function fillhtmlboxFromImage(href, klass) {
		var image = new Image()
		image.onload = function() {
			$.htmlbox.reveal('<div class="image"><img src="' + image.src + '" /></div>', klass)
		}
		image.src = href
	}

	function fillhtmlboxFromAjax(href, klass) {
		$.get(href, function(data) { $.htmlbox.reveal(data, klass) })
	}

	function skipOverlay() {
		return $.htmlbox.settings.overlay == false || $.htmlbox.settings.opacity === null 
	}

	function showOverlay() {
		if (skipOverlay()) return

		if ($('htmlbox_overlay').length == 0) 
		$("body").append('<div id="htmlbox_overlay" class="htmlbox_hide"></div>')

		$('#htmlbox_overlay').hide().addClass("htmlbox_overlayBG")
		.css('opacity', $.htmlbox.settings.opacity)
		.click(function() { $(document).trigger('close.htmlbox') })
		.fadeIn(200)
		return false
	}

	function hideOverlay() {
		if (skipOverlay()) return

		$('#htmlbox_overlay').fadeOut(200, function(){
			$("#htmlbox_overlay").removeClass("htmlbox_overlayBG")
			$("#htmlbox_overlay").addClass("htmlbox_hide") 
			$("#htmlbox_overlay").remove()
		})
		
		return false
	}

	$(document).bind('close.htmlbox', function() {
		$(document).unbind('keydown.htmlbox')
		$('#htmlbox').fadeOut(function() {
			$('#htmlbox .content').removeClass().addClass('content')
			hideOverlay()
			$('#htmlbox .loading').remove()
		})
	})

})(jQuery);

