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