////////////////////////////////////////////////////////////////////////////////
// Constants
////////////////////////////////////////////////////////////////////////////////

var __CFDIALOG_ERROR_BOX_ID = "invalid CFDialogBox id";
var __CFDIALOG_ERROR_BOX_SHOW = "another dialog box is already visible";

var __CFDIALOG_WARNING_BOX_VISIBLE = "this dialog box is already visible";

////////////////////////////////////////////////////////////////////////////////
// Static Variables
////////////////////////////////////////////////////////////////////////////////

var __cfDialogBoxDisplayedBox = undefined;
var __cfDialogBoxMap = {};

////////////////////////////////////////////////////////////////////////////////
// Classes
////////////////////////////////////////////////////////////////////////////////

function CFDialogBox(id, titleBoxId, contentPaneId, closeButtonId)
{
    CFWindow.call(this, id, titleBoxId, contentPaneId, closeButtonId);
    this.__result = undefined;
    __cfDialogBoxMap[id] = this;
    var f = cfEventHandlerCreate(this.__updatePosition.bind(this));
    cfViewportAddOnResizeCallback(f);
    cfViewportAddOnScrollCallback(f);
}

CFDialogBox.extendClasses(CFWindow);

CFDialogBox.prototype.__setResult = function(result)
{
    this.__result = result;
}

CFDialogBox.prototype.__show = function()
{
    CFWindow.prototype.__show.call(this);
    this.__updatePosition();
}

CFDialogBox.prototype.__updatePosition = function()
{
    if (this.isVisible()) {
        var elementDimensions = this.getDimensions();
        var scrollOffsets = cfViewportGetScrollOffsets();
        var viewportDimensions = cfViewportGetDimensions();
        var viewportOffsetX = Math.round((viewportDimensions.width -
                                          elementDimensions.width) / 2.0);
        var viewportOffsetY = Math.round((viewportDimensions.height - 
                                          elementDimensions.height) / 2.0);
        this.setTopLeftPosition(scrollOffsets.y + viewportOffsetY,
                                scrollOffsets.x + viewportOffsetX);
        return true;
    }
}

CFDialogBox.prototype.getResult = function()
{
    return this.__result;
}

CFDialogBox.prototype.hide = function()
{
    CFWindow.prototype.hide.call(this);
    __cfDialogBoxDisplayedBox = undefined;
}

CFDialogBox.prototype.show = function()
{
    if (this.isVisible()) {
        return cfWarningTrigger("CFDialogBox::show: " +
                                __CFDIALOG_WARNING_BOX_VISIBLE);
    }
    if (__cfDialogBoxDisplayedBox) {
        return cfErrorTrigger("CFDialogBox::show: " +
                              __CFDIALOG_ERROR_BOX_SHOW);
    }
    this.__setResult(undefined);
    CFWindow.prototype.show.call(this);
    __cfDialogBoxDisplayedBox = this;
}

////////////////////////////////////////////////////////////////////////////////
// Public API
////////////////////////////////////////////////////////////////////////////////

function cfDialogBoxGet(id)
{
    var box = __cfDialogBoxMap[id];
    if (! box) {
        return cfErrorTrigger("cfDialogBoxGet: '" + id + "': " +
                              __CFDIALOG_ERROR_BOX_ID);
    }
    return box;
}
