var Event = YAHOO.util.Event;
var CustomEvent = YAHOO.util.CustomEvent;
var Dom = YAHOO.util.Dom;

/* Global Window Events */
var WindowScrollEvent = new CustomEvent("windowScroll");
var WindowResizeEvent = new CustomEvent("windowResize");

var WindowScrollHandler = function () {

    if (YAHOO.env.ua.ie) {

        if (! window.scrollEnd) {
            window.scrollEnd = -1;
        }

        clearTimeout(window.scrollEnd);

        window.scrollEnd = setTimeout(function () {
            WindowScrollEvent.fire();
        }, 1);

    } else {
        WindowScrollEvent.fire();
    }
};

var WindowResizeHandler = function () {

    if (YAHOO.env.ua.ie) {
        if (! window.resizeEnd) {
            window.resizeEnd = -1;
        }

        clearTimeout(window.resizeEnd);

        window.resizeEnd = setTimeout(function () {
            WindowResizeEvent.fire();
        }, 100);
    } else {
        WindowResizeEvent.fire();
    }
};

Event.on(window, "scroll", WindowScrollHandler);
Event.on(window, "resize", WindowResizeHandler);



var MiniContainer = function(elementId, options) {

    /* Element managed in this container */
    this.element = document.getElementById(elementId);

    this.modal = options.modal ? options.modal : false;
    this.modalDiv = null;

    this.zindex = options.zindex ? options.zindex : 100;
    Dom.setStyle(this.element, "z-index", this.zindex);
    
    this.fixedcenter = options.fixedcenter ? options.fixedcenter : false;

    this.isVisible = (Dom.getStyle(this.element, "display") != "none") && (Dom.getStyle(this.element, "visibility") != "hidden");

    /* Offset to the boundries */
    this.VIEWPORT_OFFSET = 10;


    MiniContainer.prototype.center = function () {

        var elementWidth = this.element.offsetWidth,
                elementHeight = this.element.offsetHeight,
                viewPortWidth = Dom.getViewportWidth(),
                viewPortHeight = Dom.getViewportHeight(),
                x,
                y;

        if(this.fixedcenter) {
            if (elementWidth < viewPortWidth) {
                x = (viewPortWidth / 2) - (elementWidth / 2) + Dom.getDocumentScrollLeft();
            } else {
                x = this.VIEWPORT_OFFSET + Dom.getDocumentScrollLeft();
            }

            if (elementHeight < viewPortHeight) {
                y = (viewPortHeight / 2) - (elementHeight / 2) + Dom.getDocumentScrollTop();
            } else {
                y = this.VIEWPORT_OFFSET + Dom.getDocumentScrollTop();
            }

            Dom.setXY(this.element, [parseInt(x, 10), parseInt(y, 10)]);
        }

        if(this.modalDiv != null) {
            Dom.setStyle(this.modalDiv, "width", viewPortWidth + "px");
            Dom.setStyle(this.modalDiv, "height", viewPortHeight + "px");
        }
    }

    MiniContainer.prototype.render = function () {
        if(this.fixedcenter || this.modal) {
            WindowScrollEvent.subscribe(this.centerEvent, this, true);
            WindowResizeEvent.subscribe(this.centerEvent, this, true);
        }
    }

    MiniContainer.prototype.show = function () {

        if(this.modal) {
            if(this.modalDiv == null) {
                this.modalDiv = document.createElement("div");
				this.modalDiv.id = this.element.id + "_mask";
                Dom.setStyle(this.modalDiv, "position", "absolute");
                Dom.setStyle(this.modalDiv, "top", "0");
                Dom.setStyle(this.modalDiv, "right", "0");
                Dom.setStyle(this.modalDiv, "background-color", "#000000");
                Dom.setStyle(this.modalDiv, "opacity", "0");
                Dom.setStyle(this.modalDiv, "display", "block");
                Dom.setStyle(this.modalDiv, "z-index", this.zindex - 1);
                this.element.parentNode.appendChild(this.modalDiv);
            }
            else {
                Dom.setStyle(this.modalDiv, "display", "block");
            }
        }

        if(this.fixedcenter || this.modal)
            this.center();
        this.isVisible = true;
        Dom.setStyle(this.element, "display", "block");
        Dom.setStyle(this.element, "visibility", "visible");

        /* Duplicated but needed when the scrollbar is down */
        if(this.fixedcenter || this.modal)
            this.center();
    }

    MiniContainer.prototype.hide = function () {
        Dom.setStyle(this.element, "visibility", "hidden");
        Dom.setStyle(this.element, "display", "none");

        if(this.modalDiv != null)
            Dom.setStyle(this.modalDiv, "display", "none");

        this.isVisible = false;
    }

    MiniContainer.prototype.centerEvent = function () {
        if(this.isVisible) {
            this.center();
        }
    }
}
