/*!
 * jquery.overlay 1.0.1. Overlay HTML with eyecandy.
 * 
 * Copyright (c) 2009 Tero Piirainen
 * http://flowplayer.org/tools/overlay.html
 *
 * Dual licensed under MIT and GPL 2+ licenses
 * http://www.opensource.org/licenses
 *
 * Launch  : March 2008
 * Version : 1.0.1 - Wed Feb 18 2009 05:18:24 GMT-0000 (GMT+00:00)
 */
(function($) {
	var instances = [];
	function fireEvent(opts, name, self, arg) {
		var fn = opts[name];
		if ($.isFunction(fn)) {
			try {
				return fn.call(self, arg);
			} catch(error) {
				if (opts.alert) {
					alert("Error calling overlay." + name + ": " + error);
				} else {
					throw error;
				}
				return false;
			}
		}
		return true;
	}
	function Overlay(el, opts) {
		var self = this;
		var trigger = null;
		var w = $(window);
		var jq = opts.target || el.attr("rel");
		var o = jq ? $(jq) : null;
		if (!o) {
			o = el;
		} else {
			trigger = el;
		}
		var bg = o.attr("overlay");
		if (!bg) {
			bg = o.css("backgroundImage");
			bg = bg.substring(bg.indexOf("(") + 1, bg.indexOf(")"));
			o.css("backgroundImage", "none");
			o.attr("overlay", bg);
		}
		if (!bg) {
			throw "background-image CSS property not set for overlay element: " + jq;
		}
		bg = bg.replace(/\"/g, "");
		if (opts.preload) {
			$(window).load(function() {
				setTimeout(function() {
					var img = new Image();
					img.src = bg;
				},
				2000);
			});
		}
		var oWidth = o.outerWidth({
			margin: true
		});
		var oHeight = o.outerHeight({
			margin: true
		});
		var img = $('<img src="' + bg + '"/>');
		img.css({
			border: 0,
			position: 'absolute'
		}).width(oWidth).hide();
		$('body').append(img);
		if (trigger) {
			trigger.bind("click.overlay", function(e) {
				self.load(e.pageY - w.scrollTop(), e.pageX - w.scrollLeft());
				return e.preventDefault();
			});
		}
		if (!opts.close || !o.find(opts.close).length) {
			o.prepend('<div class="close" onclick="this.nextSibling.innerHTML=\'\';"></div>');
			opts.close = "div.close";
		}
		var closeButton = o.find(opts.close);
		$.extend(self, {
			load: function(top, left) {
				if (self.isOpened()) {
					return self;
				}
				if (opts.oneInstance) {
					$.each(instances, function() {
						this.close();
					});
				}
				if (fireEvent(opts, "onBeforeLoad", self) === false) {
					return self;
				}
				top = top || opts.start.top;
				left = left || opts.start.left;
				var toTop = opts.finish.top;
				var toLeft = opts.finish.left;
				if (toTop == 'center') {
					toTop = Math.max((w.height() - oHeight) / 2 - 30, 0);
				}
				if (toLeft == 'left') {
					toLeft = Math.max((w.width() - oWidth) / 2, 0);
				}
				if (!opts.start.absolute) {
					top += w.scrollTop();
					left += w.scrollLeft();
				}
				if (!opts.finish.absolute) {
					toTop += w.scrollTop();
					toLeft += w.scrollLeft();
				}
				img.css({
					top: top,
					left: left,
					width: opts.start.width,
					zIndex: opts.zIndex
				}).show();
				img.animate({
					top: toTop,
					left: toLeft,
					width: oWidth
				},
				opts.speed, function() {
					o.css({
						position: 'absolute',
						top: toTop,
						left: toLeft
					});
					var z = img.css("zIndex");
					closeButton.add(o).css("zIndex", ++z);
					o.fadeIn(opts.fadeInSpeed, function() {
						fireEvent(opts, "onLoad", self);
					});
				});
				return self;
			},
			getBackgroundImage: function() {
				return img;
			},
			getContent: function() {
				return o;
			},
			getTrigger: function() {
				return trigger;
			},
			isOpened: function() {
				return o.is(":visible");
			},
			getConf: function() {
				return opts;
			},
			close: function() {
				if (!self.isOpened()) {
					return self;
				}
				if (fireEvent(opts, "onClose", self) === false) {
					return self;
				}
				if (img.is(":visible")) {
					img.hide();
					o.hide();
				}
				return self;
			},
			getVersion: function() {
				return [1, 0, 0];
			},
			expose: function() {
				img.expose();
			}
		});
		closeButton.bind("click.overlay", function() {
			self.close();
		});
		w.bind("keypress.overlay", function(evt) {
			if (evt.keyCode == 27) {
				self.close();
			}
		});
		if (opts.closeOnClick) {
			w.bind("click.overlay", function(evt) {
				if (!o.is(":visible, :animated")) {
					return;
				}
				var target = $(evt.target);
				if (target.attr("overlay")) {
					return;
				}
				if (target.parents("[overlay]").length) {
					return;
				}
				self.close();
			});
		}
	}
	jQuery.prototype.overlay = function(conf) {
		var api = this.eq(typeof conf == 'number' ? conf: 0).data("overlay");
		if (api) {
			return api;
		}
		var w = $(window);
		var opts = {
			start: {
				top: Math.round(w.height() / 2),
				left: Math.round(w.width() / 2),
				width: 0,
				absolute: false
			},
			finish: {
				top: 'center',
				left: 'left',
				absolute: false
			},
			speed: 'normal',
			fadeInSpeed: 'fast',
			close: null,
			oneInstance: true,
			closeOnClick: false,
			preload: true,
			zIndex: 9999,
			target: null,
			alert: true
		};
		if ($.isFunction(conf)) {
			conf = {
				onBeforeLoad: conf
			};
		}
		$.extend(true, opts, conf);
		this.each(function() {
			var instance = new Overlay($(this), opts);
			instances.push(instance);
			$(this).data("overlay", instance);
		});
		return this;
	};
})(jQuery);

