/**
 * responsible for handling popup overlays for photo, video, etc.
 * @param {Cobalt.Core.Sandbox} sandbox
 */
Cobalt.Website.Common.PopupModule = function(sandbox)
{
    var popupElement;
    var popupBackgroundElement;
    var oThis = null;

    function constructPopupElementInPage()  //general
    {
        if (sandbox.dom("#popup").length() > 0) {return;}
        popupElement = sandbox.dom("<div id='popup' class='popup'></div>").getDomElements();
        popupBackgroundElement = sandbox.dom("<div id='popup_background' class='popup_background'></div>").getDomElements()
        sandbox.dom("body").append(popupElement);
		sandbox.dom("body").append(popupBackgroundElement);
		sandbox.dom(popupBackgroundElement).addStyle({opacity:0.5});
        setupCloseButtonEvent();
    };

    function setupCloseButtonEvent()    //general
    {
        sandbox.dom("div.media_popup_close").listenLive("click", closeHandler);
        sandbox.dom("#popup .close").listenLive("click", closeHandler); //TODO: encapsulate
    };

    function closeHandler() //general
    {
		sandbox.raise(null, Cobalt.Website.Common.Events.DestroyPopup, null);
        sandbox.dom(popupElement).empty();
        sandbox.dom(popupBackgroundElement).hide();
    };

    return {
        init:function()
        {
            oThis = this;   // need to preserve the "self" reference for use in eventHandlers which will be context less
            sandbox.listen(null, Cobalt.Website.Common.Events.RenderingCompleted, this.onRenderingCompletedHandler);
            sandbox.listen(null, Cobalt.Website.Common.Events.RequestCompleted, this.handleCompletedRequest);
            constructPopupElementInPage();  //todo take this out to another module
        },
        destroy:function()
        {
             //TODO: handle destroy
        },
        onRenderingCompletedHandler: function(e)
        {
            //don't need to perform popup calculation if the rendering update wasn't triggered by me
            if (!oThis.isRenderingTriggeredByPopupElement(e)){ return; }
            oThis.showPopupBackground();
            var position = oThis.calculatePopupPosition(e);
            oThis.setPopupPosition(position.top, position.left);
            oThis.afterOnPopupRenderingCompleted(e);
        },
        isRenderingTriggeredByPopupElement:function(e)
        {
            return e.customData && e.customData.sourceModule && e.customData.sourceModule === this.getPopupType();
        },
        getPopupType:function()
        {
            throw new Error("this method must be overriden");
        },
        afterOnPopupRenderingCompleted:function(e)
        {
            //maybe overridden to perform specific sub-class popup logic after common afterRendering logic
        },
        showPopupBackground:function()
        {
			var screenHeight = sandbox.dom(document).height();
			var selector = "#popup_background";
            sandbox.dom(selector).addStyle({height: screenHeight});
			sandbox.dom(selector).show();
        },
        setPopupPosition:function(top, left)
        {
			var selector = "#popup";
            sandbox.dom(selector).addStyle({top: top, left: left});
			sandbox.dom(selector).show();
        },
        calculatePopupPosition:function()
        {
            var top = sandbox.dom(document).scrollTop() + 80;
            var left = sandbox.dom(document).scrollLeft() +  sandbox.dom(window).width() / 2;
            return {
				left:left, 
				top:top
			};
        },
        handleCompletedRequest: function(e) {
        	//In order to implement the expected logic in the sub classes (i.e. AAQ, GAQ etc)
        }
    };
};


