(function($) {
	$.pajax = function(data, klass) {
		$.pajax.loading()

		if (data.ajax) fillPajaxFromAjax(data.ajax)
		else if (data.image) fillPajaxFromImage(data.image)
		else if (data.div) fillPajaxFromHref(data.div)
		else if ($.isFunction(data)) data.call($)
		else $.pajax.reveal(data, klass)
	}

	$.extend($.pajax, {
		settings: {
			opacity: 0,
			overlay: true,
			loadingImage: '/repo/images/pajax/loading.gif',
			closeImage: '/repo/images/pajax/closelabel.gif',
			imageTypes: [ 'png', 'jpg', 'jpeg', 'gif' ],
			pajaxHtml: '\
				<div id="pajax" 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"> \
												<a href="#" class="close"> \
													<img src="/repo/images/f/closelabel.gif" title="close" 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 ($('#pajax .loading').length == 1) return true
			showOverlay()

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

			$('#pajax').css({
				top:	getPageScroll()[1] + (getPageHeight() / 10),
				left:	385.5
			}).show()

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

			$(document).trigger('loading.pajax')
		},

		reveal: function(data, klass) {
			$(document).trigger('beforeReveal.pajax')
			if (klass) $('#pajax .content').addClass(klass)
			$('#pajax .content').append(data)
			$('#pajax .loading').remove()
			$('#pajax .body').children().fadeIn('normal')
			$('#pajax').css('left', $(window).width() / 2 - ($('#pajax table').width() / 2))
			$(document).trigger('reveal.pajax').trigger('afterReveal.pajax')
		},

		close: function() {
			$(document).trigger('close.pajax')
			return false
		}
	})

	$.fn.pajax = function(settings) {
		init(settings)

		function clickHandler() {
			$.pajax.loading(true)
			var klass = this.rel.match(/pajax\[?\.(\w+)\]?/)
			if (klass) klass = klass[1]

			fillPajaxFromHref(this.href, klass)
			return false
		}

		return this.click(clickHandler)
	}

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

		$(document).trigger('init.pajax')
		makeCompatible()

		var imageTypes = $.pajax.settings.imageTypes.join('|')
		$.pajax.settings.imageTypesRegexp = new RegExp('\.' + imageTypes + '$', 'i')

		if (settings) $.extend($.pajax.settings, settings)
		$('body').append($.pajax.settings.pajaxHtml)

		var preload = [ new Image(), new Image() ]
		preload[0].src = $.pajax.settings.closeImage
		preload[1].src = $.pajax.settings.loadingImage

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

		$('#pajax .close').click($.pajax.close)
		$('#pajax .close_image').attr('src', $.pajax.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
	}

	// Backwards compatibility
	function makeCompatible() {
		var $s = $.pajax.settings

		$s.loadingImage = $s.loading_image || $s.loadingImage
		$s.closeImage = $s.close_image || $s.closeImage
		$s.imageTypes = $s.image_types || $s.imageTypes
		$s.pajaxHtml = $s.pajax_html || $s.pajaxHtml
	}

	function fillPajaxFromHref(href, klass) {
		// div
		if (href.match(/#/)) {
			var url    = window.location.href.split('#')[0]
			var target = href.replace(url,'')
			$.pajax.reveal($(target).clone().show(), klass)
		// image
		} else if (href.match($.pajax.settings.imageTypesRegexp)) {
			fillPajaxFromImage(href, klass)
		// ajax
		} else {
			fillPajaxFromAjax(href, klass)
		}
	}

	function fillPajaxFromImage(href, klass) {
		var image = new Image()
		image.onload = function() {
			$.pajax.reveal('<div class="image"><img src="' + image.src + '" /></div>', klass)
		}
		image.src = href
	}

	function fillPajaxFromAjax(href, klass) {
		$.get(href, function(data) { $.pajax.reveal(data, klass) })
	}

	function skipOverlay() {
		return $.pajax.settings.overlay == false || $.pajax.settings.opacity === null 
	}

	function showOverlay() {
		if (skipOverlay()) return

		if ($('pajax_overlay').length == 0)
			$("body").append('<div id="pajax_overlay" class="pajax_hide"></div>')

		$('#pajax_overlay').hide().addClass("pajax_overlayBG")
		.css('opacity', $.pajax.settings.opacity)
		.click(function() { $(document).trigger('close.pajax') })
		.fadeIn(200)
		return false
	}

	function hideOverlay() {
		if (skipOverlay()) return

		$('#pajax_overlay').fadeOut(200, function(){
			$("#pajax_overlay").removeClass("pajax_overlayBG")
			$("#pajax_overlay").addClass("pajax_hide") 
			$("#pajax_overlay").remove()
		})

		return false
	}

	$(document).bind('close.pajax', function() {
		$(document).unbind('keydown.pajax')
		$('#pajax').fadeOut(function() {
			$('#pajax .content').removeClass().addClass('content')
			hideOverlay()
			$('#pajax .loading').remove()
		})
	})

})(jQuery);

