﻿(function ($) {

	$.overlay = function (size) {

		var Overlay,
			$overlay = $('<div/>').addClass($.overlay.options.className).addClass($.overlay.options.sizes[size]),
			$mask = $('<div/>').addClass($.overlay.options.mask),
			$iframe = $('<iframe/>').addClass($.overlay.options.mask).css('opacity', 0),
			$bottom = $('<div/>').addClass($.overlay.options.bottom).appendTo($overlay),
			$content = $('<div/>').addClass($.overlay.options.content).appendTo($bottom),
			$close = $('<a/>', { href: '#', text: 'close' }).addClass($.overlay.options.close).appendTo($overlay);

		$(document.body).append($iframe).append($mask).append($overlay);
		if ($.overlay.options.center) {
			$overlay.css('left', ($(window).width() - $overlay.outerWidth()) / 2);
		}
		$overlay.css('marginTop', $(window).scrollTop())
			.bind('close', function (e, data) {
				if (!data || !data.internal) {
					Overlay.close();
				}
			});
		$mask.css({
			width: $(document.body).width(),
			height: Math.max($(document.body).height(), $(window).height()),
			opacity: $.overlay.options.maskAlpha
		});
		$iframe.css({
			width: $(document.body).width(),
			height: $(document.body).height()
		});

		$close.click(function (e) {
			e.preventDefault();
			Overlay.close();
		});
		$content.delegate('.modalClose', 'click', function (e) { e.preventDefault(); Overlay.close(); });

		Overlay = {

			close: function () {
				var self = this;
				$overlay.trigger('close', { internal: true });
				$mask.remove();
				$iframe.remove();
				$overlay.remove();
				return this;
			},
			load: function (url, data, fn) {
				var self = this;
				if ($.isFunction(data) && fn == undefined) {
					fn = data;
					data = null;
				}
				data = data || null;
				fn = $.isFunction(fn) ? fn : $.noop;
				$overlay.addClass($.overlay.options.loading);
				$content.load(url, data, function () {
					try {
						fn.apply();
					} catch (e) { }
					setTimeout(function () {
						$overlay.trigger('update', self);
						$overlay.removeClass($.overlay.options.loading);
					}, 500);
				});
				return this;
			},
			setContent: function ($c) {
				var self = this;
				$content.empty().append($c);
				$overlay.trigger('update', self);
				return this;
			},
			bind: function () {
				$overlay.bind.apply($overlay, arguments);
				return this;
			},
			content: function () {
				return $content;
			},
			get: function () {
				return $overlay;
			}

		}

		return Overlay;

	}

	$.overlay.options = {
		className: 'modalWindow',
		bottom: 'modalWindowBottom',
		content: 'modalWindowContent',
		loading: 'loading',
		mask: 'modalMask',
		close: 'close',
		sizes: {
			small: 'modalWindowSmall'
		},
		maskAlpha: 0.6,
		center: false
	}

	$.overlay.setOptions = function (opt, val) {

		if ($.isPlainObject(opt)) {
			$.extend($.overlay.options, opt);
		}
		else {
			$.overlay.options[opt] = val;
		}

	}

})(jQuery);

