window.Popup = {

	window: function() { return Popup.$window ? Popup.$window : Popup.$window = $('#popup'); },
	overlay: function() { return Popup.$overlay ? Popup.$overlay : Popup.$overlay = $('#popup-overlay'); },

	options: null,

	show: function(options) {
		options.width = options.width || 350;

		Popup.overlay().show();
		Popup.resizeOverlay();

		if(!options.modal) {
			Popup.overlay().bind('click', Popup.close);
		} else {
			Popup.overlay().unbind('click', Popup.close);
		}

		Popup.window().html('');

		var loading = false;
		if(options.url) {
			loading = true;
			Popup.window().addClass('loading');
			Popup.window().load(options.url, options.data, function() { Popup.window().removeClass('loading'); });
		}
		else if(options.html) {
			if(options.html.jQuery)
				Popup.window().append(options.html)
			else
				Popup.window().html(options.html);
		}

		if(options.cssClass) {
			Popup.window().removeClass().addClass(loading ? 'loading' : '').addClass(options.cssClass+'');
		}

		Popup.window().show().css({ width: options.width+'px' });

		options.top = options.top ? options.top : 150;
		Popup.options = options;

		Popup.updateLayout();

		return false;
	},

	confirm: function(title, message, choices, options) {
		options = options || {};
		var buttons = '';
		for(var i in choices) {
			buttons += '<input type="button" class="button-'+(i == 'Cancel' ? 'gray' : 'pink')+'-sm" value="'+i+'" />';
		}
		Popup.show($.extend({
			html: '<div class="confirm">' +
					'<h2>'+title+'</h2>' +
					(options.p !== false ? '<p>' : '')+message+(options.p !== false ? '</p>' : '') +
					'<div class="confirm-buttons">'+buttons+'</div>' +
				  '</div>',
			width: 300
		}, options));
		$('#popup div.confirm-buttons input').each(function() {
			$(this).click(choices[this.value]);
		});
		return false;
	},

	positionPopup: function() {
		Popup.window().css({
			top: $(window).scrollTop() + (Popup.options.top ? Popup.options.top : 150),
			left: $(window).width() / 2 - Popup.window().width() / 2
		});
	},

	updateLayout: function() {
		if(Popup.overlay().css('display') != 'block') return;
		Popup.positionPopup();
		Popup.resizeOverlay();
	},

	resizeOverlay: function() {
		if(Popup.overlay().css('display') != 'block') return;
		Popup.overlay().hide().css({
			height: Math.max($(document).height(), $(window).height()),
			width: Math.min($(document).width(), $(window).width())
		}).show();
	},

	close: function() {
		$('select:not(#popup select)').css('visibility', 'visible');
		Popup.window().hide();
		Popup.overlay().hide();
		document.body.style.overflow = 'auto';
		Popup.options = null;
		return false;
	}

}

$(function() { $(window).resize(Popup.updateLayout); })
