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 | }; |
---|