var Popup = {
	
	popups: [],
	
	currentPopup: null,
	

	add: function(ID, selector, manager){
		this.popups[ID] = {
			'selector': selector,
			'manager': manager
		}
	},
	
	reposition: function(popupID){
		var popup = this.popups[popupID];

		var screenWidth = $(window).width()
		var screenHeight = $(window).height()
		var contentElement = $('.content', popup.selector).get();
		
		popup.manager.reposition(screenWidth - 40, screenHeight - 40, contentElement);
		
		var popupWidth = $(popup.selector).width();
		var popupHeight = $(popup.selector).height();
		
		var popupLeft = Math.floor((screenWidth - popupWidth) / 2) - 4;
		var popupTop = Math.floor((screenHeight - popupHeight) / 2) - 4;

		if (popupTop < 20) popupTop = 20;

		$(popup.selector).css({
			"top": popupTop,
			"left": popupLeft
 		});

		$("html").css({
			"min-height": popupHeight + 40
		});

		if(screenHeight < (popupHeight + 40)){
			$(popup.selector).css({
				"position": "absolute"
			});
		}
	},

	show: function(popupID){
		if(this.currentPopup !== null){
			this.hide(this.currentPopup);
		}

		this.currentPopup = popupID;
	
		var popup = this.popups[popupID];
		
		var $shader = $('<div id="shader"></div>');
		$("body").append($shader);
		
		if($.browser.webkit){
			//css animation
			$(popup.selector).addClass("visiblePopup startPopup");
			this.reposition(popupID);
			
			$(popup.selector).bind("webkitTransitionEnd", {selector: popup.selector, manager: popup.manager}, function(e){
				if(e.data.manager.onShow){
					e.data.manager.onShow();
				}
				$(e.data.selector).unbind("webkitTransitionEnd");
			});
			
			$(popup.selector).removeClass("startPopup");
			$shader.addClass("visible");
		} else {
			//js animation
			this.reposition(popupID);
			var $popup = $(popup.selector);
			$popup
				.css({
					"opacity": 0
				})
				.addClass("visiblePopup")
				.animate({
					"opacity": 1
				}, 200, function(){
					if(popup.manager.onShow){
						popup.manager.onShow();
					}
				});

			this.reposition(popupID);
			$shader.animate({
				"opacity": "0.7"
			}, 200);
		}
		
		$(window).bind("resize", function(){
			Popup.reposition(popupID);
		});
	},
	
	hide: function(popupID){
		this.currentPopup = null;
		
		var popup = this.popups[popupID];

		var $shader = $("#shader");
		
		if($.browser.webkit){
			//css animation
			$shader.bind("webkitTransitionEnd", function(){
				$("#shader").remove();
			});
			
			$(popup.selector).bind("webkitTransitionEnd", {selector: popup.selector, manager: popup.manager}, function(e){
				if(e.data.manager.onHide){
					e.data.manager.onHide();
				}
				$(e.data.selector).removeClass("visiblePopup endPopup").unbind("webkitTransitionEnd");
				$("html").css({
					"min-height": 0
				});
			});

			$shader.removeClass("visible");
			$(popup.selector).addClass("endPopup");
		} else {
			//js animation
			$shader.animate({
				"opacity": "0"
			}, 200, function(){
				$shader.remove();
			});
			
			var $popup = $(popup.selector);
			$popup
				.animate({
					"opacity": 0
				}, 200, function(){
					if(popup.manager.onHide){
						popup.manager.onHide();
					}
					$popup.removeClass("visiblePopup");
					$("html").css({
						"min-height": 0
					});
				});
			
		
		}
	}
}
