(function ($) {
	$.fn.modalBox = function (options) {
		return this.each(function () {
			new $.modalBox(options ? options : {}, this);
		});
	};

	$.modalBox = function (options, el) {
		var defaults = {
			backdrop_id:          "modalBackdrop",
			backdrop_classes:     "",
			backdrop_clickToHide: false,
			
			content_id:           "modalContent",
			content_classes:      "",
			content_alwaysCenter: true,
			
			iframe_id:            "modalIframe",
			iframe_classes:       "",
			iframe_src:           "",
			iframe_scrolling:     "auto",
			
			inline:               "",
			
			ajax:                 "",
			ajaxLoading:          "<img src='/img/ajax-loader.gif' width='32' height='32' alt='Loading...' id='modalLoading' />",
			
			closeButton:          ".closeModal",
			addClose:             false,
			
			onShow:               function() {},
			onHide:               function() {},
			
			hide:                 false
		};
	
		var settings = $.extend(defaults, options);

		var backdrop = $("#" + settings.backdrop_id);
		var content = $("#" + settings.content_id);

		if (settings.hide) {
			hide();
			return false;
		}

		show();
		
		
		function hide() {
			content.hide();
			backdrop.hide();
			content.remove();	
			backdrop.remove();
			
			settings.onHide();
		}
		
		
		function show() {	
			if (!$("#" + settings.backdrop_id).length) {
				backdrop = 
					$("<div/>")
					.attr("id", settings.backdrop_id)
					.addClass(settings.backdrop_classes);
				
				if (settings.backdrop_clickToHide) backdrop.click(function(){
					hide();
				});
				
				content = 
					$("<div/>")
					.attr("id", settings.content_id)
					.addClass(settings.content_classes);

				if (typeof(el) != "undefined") {
					content.append($(el).children().clone(true));
				} else if (settings.inline != "") {
					content.append($(settings.inline).html());
				} else if (settings.ajax != "") {
					content.html(settings.ajaxLoading).load(settings.ajax, function(){
						showContent();
					});
				} else if (settings.iframe_src != "") {
					content.append(
						$("<iframe/>")
						.attr("id", settings.iframe_id)
						.addClass(settings.iframe_classes)
						.attr("src", settings.iframe_src)
						.attr("frameborder", 0)
						.attr("scrolling", settings.iframe_scrolling)
					);
				}
				
				if (settings.addClose) {
					content.append(
						$("<div/>")
						.attr("id", "modalControls")
						.append("<a class='button closeModal' href='#'><em>Close</em></a>")
					);
				}
				
				backdrop.hide();
				content.hide();

				$("body").append(backdrop);
				$("body").append(content);
				
				showContent();
			}			
		}
		
		function showContent() {		
			if (settings.content_alwaysCenter) $(window).resize(centerContent);

			backdrop.show();
			content.show();			

			$(settings.closeButton).click(function(){
				hide();
				return false;
			});			
			
			settings.onShow();
			
			if (settings.content_alwaysCenter) centerContent();
		}
		
		function centerContent() {
			var newTop = ($(window).height() - content.outerHeight()) / 2;
			var newLeft = ($(window).width() - content.outerWidth()) / 2;
			
			content.css({
				"top": newTop + "px",
				"left": newLeft + "px"
			});
		}
	};
})(jQuery);
