[795] | 1 | // (c) dynarch.com 2003-2004 |
---|
| 2 | // Distributed under the same terms as HTMLArea itself. |
---|
| 3 | |
---|
| 4 | function PopupWin(editor, title, handler, initFunction) { |
---|
| 5 | this.editor = editor; |
---|
| 6 | this.handler = handler; |
---|
| 7 | var dlg = window.open("", "__ha_dialog", |
---|
| 8 | "toolbar=no,menubar=no,personalbar=no,width=600,height=600,left=20,top=40" + |
---|
| 9 | "scrollbars=no,resizable=no"); |
---|
| 10 | this.window = dlg; |
---|
| 11 | var doc = dlg.document; |
---|
| 12 | this.doc = doc; |
---|
| 13 | var self = this; |
---|
| 14 | |
---|
| 15 | var base = document.baseURI || document.URL; |
---|
| 16 | if (base && base.match(/(.*)\/([^\/]+)/)) { |
---|
| 17 | base = RegExp.$1 + "/"; |
---|
| 18 | } |
---|
| 19 | if (typeof _editor_url != "undefined" && !/^\//.test(_editor_url)) { |
---|
| 20 | // _editor_url doesn't start with '/' which means it's relative |
---|
| 21 | // FIXME: there's a problem here, it could be http:// which |
---|
| 22 | // doesn't start with slash but it's not relative either. |
---|
| 23 | base += _editor_url; |
---|
| 24 | } else |
---|
| 25 | base = _editor_url; |
---|
| 26 | if (!/\/$/.test(base)) { |
---|
| 27 | // base does not end in slash, add it now |
---|
| 28 | base += '/'; |
---|
| 29 | } |
---|
| 30 | this.baseURL = base; |
---|
| 31 | |
---|
| 32 | doc.open(); |
---|
| 33 | var html = "<html><head><title>" + title + "</title>\n"; |
---|
| 34 | // html += "<base href='" + base + "htmlarea.js' />\n"; |
---|
| 35 | html += "<style type='text/css'>@import url(" + base + "htmlarea.css);</style></head>\n"; |
---|
| 36 | html += "<body class='dialog popupwin' id='--HA-body'></body></html>"; |
---|
| 37 | doc.write(html); |
---|
| 38 | doc.close(); |
---|
| 39 | |
---|
| 40 | // sometimes I Hate Mozilla... ;-( |
---|
| 41 | function init2() { |
---|
| 42 | var body = doc.body; |
---|
| 43 | if (!body) { |
---|
| 44 | setTimeout(init2, 25); |
---|
| 45 | return false; |
---|
| 46 | } |
---|
| 47 | dlg.title = title; |
---|
| 48 | doc.documentElement.style.padding = "0px"; |
---|
| 49 | doc.documentElement.style.margin = "0px"; |
---|
| 50 | var content = doc.createElement("div"); |
---|
| 51 | content.className = "content"; |
---|
| 52 | self.content = content; |
---|
| 53 | body.appendChild(content); |
---|
| 54 | self.element = body; |
---|
| 55 | initFunction(self); |
---|
| 56 | dlg.focus(); |
---|
| 57 | }; |
---|
| 58 | init2(); |
---|
| 59 | }; |
---|
| 60 | |
---|
| 61 | PopupWin.prototype.callHandler = function() { |
---|
| 62 | var tags = ["input", "textarea", "select"]; |
---|
| 63 | var params = new Object(); |
---|
| 64 | for (var ti in tags) { |
---|
| 65 | var tag = tags[ti]; |
---|
| 66 | var els = this.content.getElementsByTagName(tag); |
---|
| 67 | for (var j = 0; j < els.length; ++j) { |
---|
| 68 | var el = els[j]; |
---|
| 69 | var val = el.value; |
---|
| 70 | if (el.tagName.toLowerCase() == "input") { |
---|
| 71 | if (el.type == "checkbox") { |
---|
| 72 | val = el.checked; |
---|
| 73 | } |
---|
| 74 | } |
---|
| 75 | params[el.name] = val; |
---|
| 76 | } |
---|
| 77 | } |
---|
| 78 | this.handler(this, params); |
---|
| 79 | return false; |
---|
| 80 | }; |
---|
| 81 | |
---|
| 82 | PopupWin.prototype.close = function() { |
---|
| 83 | this.window.close(); |
---|
| 84 | }; |
---|
| 85 | |
---|
| 86 | PopupWin.prototype.addButtons = function() { |
---|
| 87 | var self = this; |
---|
| 88 | var div = this.doc.createElement("div"); |
---|
| 89 | this.content.appendChild(div); |
---|
| 90 | div.className = "buttons"; |
---|
| 91 | for (var i = 0; i < arguments.length; ++i) { |
---|
| 92 | var btn = arguments[i]; |
---|
| 93 | var button = this.doc.createElement("button"); |
---|
| 94 | div.appendChild(button); |
---|
| 95 | button.innerHTML = HTMLArea.I18N.buttons[btn]; |
---|
| 96 | switch (btn) { |
---|
| 97 | case "ok": |
---|
| 98 | button.onclick = function() { |
---|
| 99 | self.callHandler(); |
---|
| 100 | self.close(); |
---|
| 101 | return false; |
---|
| 102 | }; |
---|
| 103 | break; |
---|
| 104 | case "cancel": |
---|
| 105 | button.onclick = function() { |
---|
| 106 | self.close(); |
---|
| 107 | return false; |
---|
| 108 | }; |
---|
| 109 | break; |
---|
| 110 | } |
---|
| 111 | } |
---|
| 112 | }; |
---|
| 113 | |
---|
| 114 | PopupWin.prototype.showAtElement = function() { |
---|
| 115 | var self = this; |
---|
| 116 | // Mozilla needs some time to realize what's goin' on.. |
---|
| 117 | setTimeout(function() { |
---|
| 118 | var w = self.content.offsetWidth + 4; |
---|
| 119 | var h = self.content.offsetHeight + 4; |
---|
| 120 | // size to content -- that's fuckin' buggy in all fuckin' browsers!!! |
---|
| 121 | // so that we set a larger size for the dialog window and then center |
---|
| 122 | // the element inside... phuck! |
---|
| 123 | |
---|
| 124 | // center... |
---|
| 125 | var el = self.content; |
---|
| 126 | var s = el.style; |
---|
| 127 | // s.width = el.offsetWidth + "px"; |
---|
| 128 | // s.height = el.offsetHeight + "px"; |
---|
| 129 | s.position = "absolute"; |
---|
| 130 | s.left = (w - el.offsetWidth) / 2 + "px"; |
---|
| 131 | s.top = (h - el.offsetHeight) / 2 + "px"; |
---|
| 132 | if (HTMLArea.is_gecko) { |
---|
| 133 | self.window.innerWidth = w; |
---|
| 134 | self.window.innerHeight = h; |
---|
| 135 | } else { |
---|
| 136 | self.window.resizeTo(w + 8, h + 35); |
---|
| 137 | } |
---|
| 138 | }, 25); |
---|
| 139 | }; |
---|