Subversion-Projekte lars-tiefland.content-management

Revision

Blame | Letzte Änderung | Log anzeigen | RSS feed

// (c) dynarch.com 2003-2004
// Distributed under the same terms as HTMLArea itself.

function PopupWin(editor, title, handler, initFunction) {
        this.editor = editor;
        this.handler = handler;
        var dlg = window.open("", "__ha_dialog",
                              "toolbar=no,menubar=no,personalbar=no,width=600,height=600,left=20,top=40" +
                              "scrollbars=no,resizable=no");
        this.window = dlg;
        var doc = dlg.document;
        this.doc = doc;
        var self = this;

        var base = document.baseURI || document.URL;
        if (base && base.match(/(.*)\/([^\/]+)/)) {
                base = RegExp.$1 + "/";
        }
        if (typeof _editor_url != "undefined" && !/^\//.test(_editor_url)) {
                // _editor_url doesn't start with '/' which means it's relative
                // FIXME: there's a problem here, it could be http:// which
                // doesn't start with slash but it's not relative either.
                base += _editor_url;
        } else
                base = _editor_url;
        if (!/\/$/.test(base)) {
                // base does not end in slash, add it now
                base += '/';
        }
        this.baseURL = base;

        doc.open();
        var html = "<html><head><title>" + title + "</title>\n";
        // html += "<base href='" + base + "htmlarea.js' />\n";
        html += "<style type='text/css'>@import url(" + base + "htmlarea.css);</style></head>\n";
        html += "<body class='dialog popupwin' id='--HA-body'></body></html>";
        doc.write(html);
        doc.close();

        // sometimes I Hate Mozilla... ;-(
        function init2() {
                var body = doc.body;
                if (!body) {
                        setTimeout(init2, 25);
                        return false;
                }
                dlg.title = title;
                doc.documentElement.style.padding = "0px";
                doc.documentElement.style.margin = "0px";
                var content = doc.createElement("div");
                content.className = "content";
                self.content = content;
                body.appendChild(content);
                self.element = body;
                initFunction(self);
                dlg.focus();
        };
        init2();
};

PopupWin.prototype.callHandler = function() {
        var tags = ["input", "textarea", "select"];
        var params = new Object();
        for (var ti in tags) {
                var tag = tags[ti];
                var els = this.content.getElementsByTagName(tag);
                for (var j = 0; j < els.length; ++j) {
                        var el = els[j];
                        var val = el.value;
                        if (el.tagName.toLowerCase() == "input") {
                                if (el.type == "checkbox") {
                                        val = el.checked;
                                }
                        }
                        params[el.name] = val;
                }
        }
        this.handler(this, params);
        return false;
};

PopupWin.prototype.close = function() {
        this.window.close();
};

PopupWin.prototype.addButtons = function() {
        var self = this;
        var div = this.doc.createElement("div");
        this.content.appendChild(div);
        div.className = "buttons";
        for (var i = 0; i < arguments.length; ++i) {
                var btn = arguments[i];
                var button = this.doc.createElement("button");
                div.appendChild(button);
                button.innerHTML = HTMLArea.I18N.buttons[btn];
                switch (btn) {
                    case "ok":
                        button.onclick = function() {
                                self.callHandler();
                                self.close();
                                return false;
                        };
                        break;
                    case "cancel":
                        button.onclick = function() {
                                self.close();
                                return false;
                        };
                        break;
                }
        }
};

PopupWin.prototype.showAtElement = function() {
        var self = this;
        // Mozilla needs some time to realize what's goin' on..
        setTimeout(function() {
                var w = self.content.offsetWidth + 4;
                var h = self.content.offsetHeight + 4;
                // size to content -- that's fuckin' buggy in all fuckin' browsers!!!
                // so that we set a larger size for the dialog window and then center
                // the element inside... phuck!

                // center...
                var el = self.content;
                var s = el.style;
                // s.width = el.offsetWidth + "px";
                // s.height = el.offsetHeight + "px";
                s.position = "absolute";
                s.left = (w - el.offsetWidth) / 2 + "px";
                s.top = (h - el.offsetHeight) / 2 + "px";
                if (HTMLArea.is_gecko) {
                        self.window.innerWidth = w;
                        self.window.innerHeight = h;
                } else {
                        self.window.resizeTo(w + 8, h + 35);
                }
        }, 25);
};