﻿//- WindowFactory -//
//debugger;
Control.Window.WindowFactory = Class.create({
    initialize: function(itemId, options) {
        this.itemId = itemId
        this._id;
        this.options;
        this.indicatorContainer;
        this.headerContainer;
        this.titleContainer;
        this.closeContainer;
        this.contentContainer;
        this.window;
        this._frameDocument = '';
        this._modalContent = '';
        this._paddingHeight = 44;
        this._paddingWidth = 24;
        this._isCentered = false;
        this.createWindow = this.createWindow.bindAsEventListener(this);
        Event.observe($(this.itemId), 'click', this.createWindow);
        var href = $(this.itemId).readAttribute('href');
        var prefix = href.indexOf('?') >= 0 ? '&' : '?';
        href = href + prefix + 'windowId=' + this.itemId;
        $(this.itemId).writeAttribute('href', href);
    },
    createWindow: function(evt) {
        this._createIndicator();
        this._createHeader();
        this._createTitle();
        this._createClose();
        this._createContent();
        Event.stop(evt);
        this.window = new Control.Window($(this.itemId), Object.extend({
            width: 100,
            fade: false,
            iframe: true,
            iframeshim: true,
            className: 'window',
            closeOnClick: this.closeContainer,
            insertRemoteContentAt: this.contentContainer,
            draggable: this.headerContainer,
            beforeOpen: this.onBeforeOpen.bind(this),
            afterOpen: this.onAfterOpen.bind(this),
            afterClose: this.onAfterClose.bind(this),
            afterDestroy: this.onAfterDestroy.bind(this)
        }, this.options || {}));
        this.id = this.itemId;
        this._frameDocument = null;
        this._isCentered = false;
        this.window.container.insert(this.headerContainer);
        this.headerContainer.insert(this.titleContainer);
        this.headerContainer.insert(this.closeContainer);
        this.window.container.insert(this.contentContainer);
        this.contentContainer.hide();
        this.window.open();
        this.window.bringToFront();
        this.onExecuteMethod = this.onExecuteMethod.bindAsEventListener(this);
        Event.stopObserving($(this.itemId), 'click', this.createWindow);
        Event.observe(document, 'windowState:ExecuteMethod', this.onExecuteMethod);
    },
    onExecuteMethod: function(evt) {
        var id = evt.memo.id;
        var method = evt.memo.method;
        if (id == "undefined") {
            return;
        }
        if (id == this.itemId) {
            switch (method) {
                case 'reload':
                    this.contentContainer.show();
                    this.onIFrameLoad(evt);
                    break;
                case 'close':
                    this.window.close();
                    break;
                case 'center':
                    this._centerModalToViewport();
                    break;
                case 'setTitle':
                    this.setTitle(evt);
                    break;
            }

        }
    },
    onAfterClose: function(evt) {
        Event.stopObserving(document, 'windowState:ExecuteMethod', this.onExecuteMethod);
        this.window.destroy();
    },
    onAfterDestroy: function(evt) {
        Event.observe($(this.itemId), 'click', this.createWindow);
    },
    onBeforeOpen: function(evt) {
        this.titleContainer.update('Loading...');
        $(this.itemId).enabled = false;
        return;
    },
    onAfterOpen: function(evt) {
        this._getFrameDocument();
        scrollTo(0, 0);
        return;
    },
    _getFrameDocument: function() {
        var frameDocument = $(this.contentContainer).down('iframe');
        this._frameDocument = this._getFrameElement(frameDocument);
        return this._frameDocument;
    },
    onIFrameLoad: function(evt) {
        var title;
        this._frameDocument = this._getFrameDocument();
        if (Prototype.Browser.IE) {
            this._modalContent = this._frameDocument.getElementById('windowContent');
        } else {
            this._modalContent = this.contentContainer.down(0).contentDocument.getElementById('windowContent');
        }
        this.contentContainer.firstDescendant().writeAttribute('scrolling', 'no');
        this.titleContainer.update($(this.itemId).readAttribute('title'));
        this._correctModalSize(evt);
        if (this._isCentered == false) {
            this._centerModalToViewport();
        }
        this._checkBounds(evt);
        this._isCentered = true;
        return;
    },
    setTitle: function(evt) {
        this.titleContainer.update(evt.memo.paramOne);
    },
    _correctModalSize: function(evt) {
        var dimensions = $(this._modalContent).getDimensions()
        var parentWindow = this.window.container;
        var contentWindow = this.contentContainer;
        parentWindow.setStyle({ height: (dimensions.height + this._paddingHeight) + 'px' });
        contentWindow.setStyle({ height: (dimensions.height) + 'px' });
        parentWindow.setStyle({ width: (dimensions.width + this._paddingWidth) + 'px' });
        contentWindow.setStyle({ width: (dimensions.width) + 'px' });
        return;
    },
    _checkBounds: function(evt) {
        var offset = this.window.container.viewportOffset();
        var dimensions = this.window.container.getDimensions();
        var parentDimensions = document.viewport.getDimensions();
        var bottom = offset.top + dimensions.height;
        var parentWindow = this.window.container;
        if (bottom > parentDimensions.height) {
            var topPx = parentDimensions.height - dimensions.height;
            parentWindow.setStyle({ top: topPx + 'px' });
        }
        offset = this.window.container.viewportOffset();
        if (offset.top < 0) {
            parentWindow.setStyle({ top: 20 + 'px' });
        }
        return;
    },
    _centerModalToViewport: function() {
        var parentWindow = this.window.container;
        var dimensions = this._modalContent.getDimensions();
        var parentDimensions = document.viewport.getDimensions();
        var leftPx = (parentDimensions.width / 2) - (dimensions.width / 2);
        var topPx = ((parentDimensions.height / 2) - (dimensions.height / 2)) + 40;
        if (topPx <= 0) {
            topPx = 40;
        }
        parentWindow.setStyle({ left: leftPx + 'px',
            top: topPx + 'px'
        });
        scrollTo(leftPx, topPx);
        return;
    },
    _getFrameElement: function(frame) {
        if (Prototype.Browser.IE)
            return frame.contentWindow.document;
        return frame.contentDocument.defaultView;
    },
    _createIndicator: function() {
        this.indicatorContainer = new Element('div', {
            styleDisplay: 'none'
        }).addClassName('windowIndicator');
        
    },
    _createHeader: function() {
        this.headerContainer = new Element('div', { }).addClassName('windowHeader');
    },
    _createTitle: function() {
        this.titleContainer = new Element('div', { }).addClassName('windowTitle');
    },
    _createClose: function() {
        this.closeContainer = new Element('div', { }).addClassName('windowClose');
    },
    _createContent: function() {
        this.contentContainer = new Element('div', { id: 'windowContent' }).addClassName('windowContents');
    }
});
if(typeof(Sys)!=='undefined')Sys.Application.notifyScriptLoaded();