diva.popover =
{
	/**
	 * The overlay.
	 */
	overlay: null,
	
	/**
	 * The container for the popover content.
	 */
	contentContainer: null,
	
	/**
	 * The content of the popover.
	 */
	content: null,
	
	/**
	 * Event handler triggered on close.
	 */
	onClose: null,
	hasClosed: null,
	
	
	/**
	 * Add the overlay node for obscuring the screen.
	 */
	init: function ()
	{
		var body = document.getElementsByTagName('body')[0];
		var opacity = 0.80;
		
		diva.popover.overlay = Builder.node('div',
			{
				id: 'overlay',
				style: 'background: #000; position: absolute; z-index: 100; left: 0px; top: 0px; width:100%; height:100%; display:none;'
			}
		);
		
		if (diva.isIE)
		{
			diva.popover.overlay.style.filter = 'alpha(opacity=' + (opacity * 100) + ')';
		}
		else
		{
			diva.popover.overlay.style.opacity = opacity;
			diva.popover.overlay.style.MozOpacity = opacity;
		}
		
		body.insertBefore(diva.popover.overlay, body.firstChild);
		Event.observe(diva.popover.overlay, 'click', diva.popover.close);
	},
	
	/**
	 * Open a pop-over with the specified content.
	 * 
	 * @param Node content
	 */
	open: function (content, hideOverlay)
	{
		if (diva.popover.contentContainer)
			diva.popover.close();
		
		var dims = diva.getPageSize();
		
		diva.popover.overlay.style.width = dims.width + 'px';
		diva.popover.overlay.style.height = dims.height + 'px';
		
		diva.popover.content = $(content);
		Element.show(content);
		
		diva.popover.contentContainer = Builder.node('div', { id: 'popover_box', style: 'display:none;' });
		diva.popover.contentContainer.appendChild(diva.popover.content);
		diva.popover.overlay.parentNode.appendChild(diva.popover.contentContainer);
		diva.centerElement(diva.popover.contentContainer);
        
        var effects = new Array();
        
        if (!hideOverlay)
        {
            effects.push(new Effect.Appear(diva.popover.overlay, { to: 0.8, sync: true }));
        }
        
        effects.push(new Effect.Appear(diva.popover.contentContainer, { sync: true }));
		
		new Effect.Parallel(effects, { duration: 1.0 });
		
		var dragOptions = { ghosting: false, revert: false, starteffect: null, endeffect: null };
		var handleList = document.getElementsByClassName('drag-handle', content);
		
		if (handleList.length > 0)
			dragOptions.handle = handleList[0];
		
		// dragOptions.handle = 'drag-handle';
		
		new Draggable(diva.popover.contentContainer, dragOptions);
	},
	
	
	isClosing: false,
	
	/**
	 * Close the pop-over.
	 */
	close: function ()
	{
		if (!diva.popover.isClosing && diva.popover.contentContainer)
		{
			diva.popover.isClosing = true;
			
            var effects = new Array();
        
            if (Element.visible(diva.popover.overlay))
            {
                effects.push(new Effect.Fade(diva.popover.overlay, { sync: true }));
            }
            
            effects.push(new Effect.Fade(diva.popover.contentContainer, { sync: true }));
            
			new Effect.Parallel(
                effects,
				{
					duration: 1.0,
					afterFinish: function ()
					{
						if (typeof(diva.popover.onClose) == 'function')
							diva.popover.onClose(diva.popover.content);
						
						diva.popover.content.hide();
						diva.popover.contentContainer.removeChild(diva.popover.content);
						diva.popover.contentContainer.parentNode.appendChild(diva.popover.content);
						diva.popover.contentContainer.parentNode.removeChild(diva.popover.contentContainer);
						delete(diva.popover.contentContainer);
						diva.popover.contentContainer = null;
						diva.popover.isClosing = false;
						
						if (typeof(diva.popover.hasClosed) == 'function')
							diva.popover.hasClosed(diva.popover.content);
					}
				}
			);
		}
	},
	
	confirm: function (title, description, onOk, onCancel)
	{
	    var ok = Builder.node( 'span', { 'class': 'confirm-ok-link' }, 'ok' );
	    Event.observe(ok, 'click', function ()
	    {
	        diva.popover.close();
	        return onOk();
	    });
	    
	    var cancel = Builder.node( 'span', { 'class': 'confirm-cancel-link'}, 'cancel' );
	    Event.observe(cancel, 'click', function ()
	    {
	        diva.popover.close();
	        return onCancel();
	    });
	    
	    var dialogContainer = Builder.node('div',
	        {
	            'class':  'dialog-container',
	            'style': 'display:none;'
	        }
	    );
	    
	    var informationBox = Builder.node('div', {'class': 'dialog-info'});
	    var title = Builder.node('h4', {}, (title ? title : 'Confirm'));
        
	    informationBox.appendChild(title);
        
        if (description)
        {
            var descriptionBox = Builder.node('div', { 'class': 'dialog-description' });
            descriptionBox.innerHTML = description;
            informationBox.appendChild(descriptionBox);
        }
		
		var commandBox = Builder.node('div', {'class': 'dialog-commands'});
	    
	    dialogContainer.appendChild(informationBox);
	    commandBox.appendChild(ok);
	    commandBox.appendChild(cancel);
		dialogContainer.appendChild(commandBox);
	    
	    document.getElementsByTagName('body')[0].appendChild(dialogContainer);
	    
	    diva.popover.open(dialogContainer, true);
	}
};
