;(function($, window, document, undefined) {

	function open(url, params, $trigger) {
		if (!$.mask.isLoaded()) {
			$(document).mask({
				closeOnEsc: false,
				closeOnClick: false,
				color: options.maskColor,
				loadSpeed: 0,
				closeSpeed: 0,
				zIndex: options.zIndex - 1,
				opacity: options.maskOpacity
			});
		}

		var $overlay = null;

		if (params.self) {
			var $overlay = $trigger.closest(options.selector);
			if ($overlay.length) {
				resize($overlay, params.width, params.height, true);
				load($overlay, url);
				return $overlay;
			} else {
				$overlay = null;
			}
		}

		if (!$overlay) { 
			var $overlay = $(options.html).clone();
			$(document.body).append($overlay);
			
			resize($overlay, params.width || options.defaultWidth, params.height || options.defaultHeight);
		}

		style($overlay, params.style);

		return $overlay.overlay({
			oneInstance: false,
			load: true,
			close: ".overlay-close",
			left: options.left,
			top: options.top,
			fixed: false,
			speed: 0,
			zIndex: options.zIndex,
			closeOnEsc: true,
			onBeforeLoad: function() {
				var $overlays = $(document.body).children(options.selector).not($overlay);
				$overlays.css("z-index", options.zIndex - 2);
				$overlay.css("z-index", options.zIndex);

				load($overlay, url);
			},
			onBeforeClose: function() {
				$overlay.trigger("close.eOverlay");
			},
			onClose: function() {
				$overlay.removeData("overlay").remove();

				var $overlays = $(document.body).children(options.selector);
				if (!$overlays.length) {
					$.mask.close();
				} else {
					$overlays.last().css("z-index", options.zIndex);
				}
			}
		});
	}
	
	function load($overlay, url) {
		$overlay.trigger("load.eOverlay");

		$.get(url, function(html, textStatus, jqXHR) {
			$overlay.trigger("loaded.eOverlay");
			
			var $div = $overlay.children("div");
			if ($.fn.writeCapture) {
				$div.writeCapture().html(html);
			} else {
				$div.html(html);
			}
			if ($.fn.domReady) {
				$div.domReady();
			}

			$overlay.trigger("ready.eOverlay");
		}, "html");
	}
	
	function close($overlay) {
		var api = $overlay.data("overlay");
		if (api && api.isOpened()) {
			api.getConf().closeSpeed = 0;
			api.close();
		}
	}
	
	function resize($overlay, width, height, animate) {
		var css = {};

		if (width) {
			css.width = width;
		}
		if (height) {
			css.height = height;
		}

		if (css === {}) return;

		if (animate) {
			$overlay.animate(css, options.resizeDuration);
		} else {
			$overlay.css(css);
		}
	}
	
	function style($overlay, style) {
		if (!$.eOverlay.styles[style]) style = "default";

		var classes = $.map($.eOverlay.styles, function(func, name) {
			return name;
		});

		$overlay.removeClass(classes.join(" ")).addClass("overlay-style-" + style);

		$.eOverlay.styles[style].call($overlay);
	}

	$.eOverlay = function(setOptions) {
		$.extend($.eOverlay.options, setOptions);

		// Нажатие на ссылку
		$(document).on("click", "a[target^=overlay]", function(e) {
			if (e.isDefaultPrevented()) return;
			e.preventDefault();

			var href   = $(this).attr("href");
			var params = $(this).data();
			
			open(href, params, $(this));
		});

		// Отправка форм, которые находятся в окне
		$(document).on("submit", "form", function(e) {
			var $overlay = $(this).closest(options.selector);
			if (!$overlay.length) return;

			if (e.isDefaultPrevented()) return;
			e.preventDefault();

			$(this).ajaxSubmit({
				data: {
					"--ajax" : 1
				},
				success: function(html) {
					var $div = $overlay.children("div").html(html);
					if ($.fn.domReady) {
						$div.domReady();
					}
				}
			});
		});

		// Закрытие видимого окна по клику на маску
		if (options.closeOnClick) {
			$(document).on("click", "#exposeMask", function(e) {
				var $overlay = $(document).find(".overlay");
				if ($overlay.length) {
					close($overlay.last());
				}
			});
		}
	};

	$.eOverlay.options = {
		html: "<div class='overlay'><a class='overlay-close'></a><div class='overlay-wrap content'></div></div>",
		selector: ".overlay",
		zIndex: 9999,
		defaultWidth: "80%",
		defaultHeight: "auto",
		resizeDuration: 200,
		top: "10%",
		left: "center",
		maskOpacity: 0.5,
		maskColor: "#000",
		closeOnClick: true
	};
	var options = $.eOverlay.options;

	$.eOverlay.styles = {
		"default" : function($overlay) {}
	};

	$.eOverlay.open = function(url, params) {
		return open(url, params || {}, document.body);
	};

})(jQuery, window, document);

