420 |
florian |
1 |
// Some global instances, this will be filled later
|
|
|
2 |
var tinyMCE = null, tinyMCELang = null;
|
|
|
3 |
|
|
|
4 |
function TinyMCE_Popup() {
|
|
|
5 |
};
|
|
|
6 |
|
|
|
7 |
TinyMCE_Popup.prototype = {
|
|
|
8 |
findWin : function(w) {
|
|
|
9 |
var c;
|
|
|
10 |
|
|
|
11 |
// Check parents
|
|
|
12 |
c = w;
|
|
|
13 |
while (c && (c = c.parent) != null) {
|
|
|
14 |
if (typeof(c.tinyMCE) != "undefined")
|
|
|
15 |
return c;
|
|
|
16 |
}
|
|
|
17 |
|
|
|
18 |
// Check openers
|
|
|
19 |
c = w;
|
|
|
20 |
while (c && (c = c.opener) != null) {
|
|
|
21 |
if (typeof(c.tinyMCE) != "undefined")
|
|
|
22 |
return c;
|
|
|
23 |
}
|
|
|
24 |
|
|
|
25 |
// Try top
|
|
|
26 |
if (typeof(top.tinyMCE) != "undefined")
|
|
|
27 |
return top;
|
|
|
28 |
|
|
|
29 |
return null;
|
|
|
30 |
},
|
|
|
31 |
|
|
|
32 |
init : function() {
|
|
|
33 |
var win = window.opener ? window.opener : window.dialogArguments, c;
|
|
|
34 |
var inst, re, title, divElm;
|
|
|
35 |
|
|
|
36 |
if (!win)
|
|
|
37 |
win = this.findWin(window);
|
|
|
38 |
|
|
|
39 |
if (!win) {
|
|
|
40 |
alert("tinyMCE object reference not found from popup.");
|
|
|
41 |
return;
|
|
|
42 |
}
|
|
|
43 |
|
|
|
44 |
window.opener = win;
|
|
|
45 |
this.windowOpener = win;
|
|
|
46 |
this.onLoadEval = "";
|
|
|
47 |
|
|
|
48 |
// Setup parent references
|
|
|
49 |
tinyMCE = win.tinyMCE;
|
|
|
50 |
tinyMCELang = win.tinyMCELang;
|
|
|
51 |
|
|
|
52 |
inst = tinyMCE.selectedInstance;
|
|
|
53 |
this.isWindow = tinyMCE.getWindowArg('mce_inside_iframe', false) == false;
|
|
|
54 |
this.storeSelection = (tinyMCE.isRealIE) && !this.isWindow && tinyMCE.getWindowArg('mce_store_selection', true);
|
|
|
55 |
|
|
|
56 |
if (this.isWindow)
|
|
|
57 |
window.focus();
|
|
|
58 |
|
|
|
59 |
// Store selection
|
|
|
60 |
if (this.storeSelection)
|
|
|
61 |
inst.selectionBookmark = inst.selection.getBookmark(true);
|
|
|
62 |
|
|
|
63 |
// Setup dir
|
|
|
64 |
if (tinyMCELang.lang_dir)
|
|
|
65 |
document.dir = tinyMCELang.lang_dir;
|
|
|
66 |
|
|
|
67 |
// Setup title
|
|
|
68 |
re = new RegExp('{|\\\$|}', 'g');
|
|
|
69 |
title = document.title.replace(re, "");
|
|
|
70 |
if (typeof(tinyMCELang[title]) != "undefined") {
|
|
|
71 |
divElm = document.createElement("div");
|
|
|
72 |
divElm.innerHTML = tinyMCELang[title];
|
|
|
73 |
document.title = divElm.innerHTML;
|
|
|
74 |
|
|
|
75 |
if (typeof(tinyMCE.setWindowTitle) != 'undefined')
|
|
|
76 |
tinyMCE.setWindowTitle(window, divElm.innerHTML);
|
|
|
77 |
}
|
|
|
78 |
|
|
|
79 |
// Output Popup CSS class
|
|
|
80 |
document.write('<link href="' + tinyMCE.getParam("popups_css") + '" rel="stylesheet" type="text/css">');
|
|
|
81 |
|
|
|
82 |
if (tinyMCE.getParam("popups_css_add")) {
|
|
|
83 |
c = tinyMCE.getParam("popups_css_add");
|
|
|
84 |
|
|
|
85 |
// Is relative
|
|
|
86 |
if (c.indexOf('://') == -1 && c.charAt(0) != '/')
|
|
|
87 |
c = tinyMCE.documentBasePath + "/" + c;
|
|
|
88 |
|
|
|
89 |
document.write('<link href="' + c + '" rel="stylesheet" type="text/css">');
|
|
|
90 |
}
|
|
|
91 |
|
|
|
92 |
tinyMCE.addEvent(window, "load", this.onLoad);
|
|
|
93 |
},
|
|
|
94 |
|
|
|
95 |
onLoad : function() {
|
|
|
96 |
var dir, i, elms, body = document.body;
|
|
|
97 |
|
|
|
98 |
if (tinyMCE.getWindowArg('mce_replacevariables', true))
|
|
|
99 |
body.innerHTML = tinyMCE.applyTemplate(body.innerHTML, tinyMCE.windowArgs);
|
|
|
100 |
|
|
|
101 |
dir = tinyMCE.selectedInstance.settings.directionality;
|
|
|
102 |
if (dir == "rtl" && document.forms && document.forms.length > 0) {
|
|
|
103 |
elms = document.forms[0].elements;
|
|
|
104 |
for (i=0; i<elms.length; i++) {
|
|
|
105 |
if ((elms[i].type == "text" || elms[i].type == "textarea") && elms[i].getAttribute("dir") != "ltr")
|
|
|
106 |
elms[i].dir = dir;
|
|
|
107 |
}
|
|
|
108 |
}
|
|
|
109 |
|
|
|
110 |
if (body.style.display == 'none')
|
|
|
111 |
body.style.display = 'block';
|
|
|
112 |
|
|
|
113 |
// Execute real onload (Opera fix)
|
|
|
114 |
if (tinyMCEPopup.onLoadEval !== '')
|
|
|
115 |
eval(tinyMCEPopup.onLoadEval);
|
|
|
116 |
},
|
|
|
117 |
|
|
|
118 |
executeOnLoad : function(str) {
|
|
|
119 |
if (tinyMCE.isOpera)
|
|
|
120 |
this.onLoadEval = str;
|
|
|
121 |
else
|
|
|
122 |
eval(str);
|
|
|
123 |
},
|
|
|
124 |
|
|
|
125 |
resizeToInnerSize : function() {
|
|
|
126 |
var i, doc, body, oldMargin, wrapper, iframe, nodes, dx, dy;
|
|
|
127 |
|
|
|
128 |
// Netscape 7.1 workaround
|
|
|
129 |
if (this.isWindow && tinyMCE.isNS71) {
|
|
|
130 |
window.resizeBy(0, 10);
|
|
|
131 |
return;
|
|
|
132 |
}
|
|
|
133 |
|
|
|
134 |
if (this.isWindow) {
|
|
|
135 |
doc = document;
|
|
|
136 |
body = doc.body;
|
|
|
137 |
|
|
|
138 |
if (body.style.display == 'none')
|
|
|
139 |
body.style.display = 'block';
|
|
|
140 |
|
|
|
141 |
// Remove margin
|
|
|
142 |
oldMargin = body.style.margin;
|
|
|
143 |
body.style.margin = '0';
|
|
|
144 |
|
|
|
145 |
// Create wrapper
|
|
|
146 |
wrapper = doc.createElement("div");
|
|
|
147 |
wrapper.id = 'mcBodyWrapper';
|
|
|
148 |
wrapper.style.display = 'none';
|
|
|
149 |
wrapper.style.margin = '0';
|
|
|
150 |
|
|
|
151 |
// Wrap body elements
|
|
|
152 |
nodes = doc.body.childNodes;
|
|
|
153 |
for (i=nodes.length-1; i>=0; i--) {
|
|
|
154 |
if (wrapper.hasChildNodes())
|
|
|
155 |
wrapper.insertBefore(nodes[i].cloneNode(true), wrapper.firstChild);
|
|
|
156 |
else
|
|
|
157 |
wrapper.appendChild(nodes[i].cloneNode(true));
|
|
|
158 |
|
|
|
159 |
nodes[i].parentNode.removeChild(nodes[i]);
|
|
|
160 |
}
|
|
|
161 |
|
|
|
162 |
// Add wrapper
|
|
|
163 |
doc.body.appendChild(wrapper);
|
|
|
164 |
|
|
|
165 |
// Create iframe
|
|
|
166 |
iframe = document.createElement("iframe");
|
|
|
167 |
iframe.id = "mcWinIframe";
|
|
|
168 |
iframe.src = document.location.href.toLowerCase().indexOf('https') == -1 ? "about:blank" : tinyMCE.settings.default_document;
|
|
|
169 |
iframe.width = "100%";
|
|
|
170 |
iframe.height = "100%";
|
|
|
171 |
iframe.style.margin = '0';
|
|
|
172 |
|
|
|
173 |
// Add iframe
|
|
|
174 |
doc.body.appendChild(iframe);
|
|
|
175 |
|
|
|
176 |
// Measure iframe
|
|
|
177 |
iframe = document.getElementById('mcWinIframe');
|
|
|
178 |
dx = tinyMCE.getWindowArg('mce_width') - iframe.clientWidth;
|
|
|
179 |
dy = tinyMCE.getWindowArg('mce_height') - iframe.clientHeight;
|
|
|
180 |
|
|
|
181 |
// Resize window
|
|
|
182 |
// tinyMCE.debug(tinyMCE.getWindowArg('mce_width') + "," + tinyMCE.getWindowArg('mce_height') + " - " + dx + "," + dy);
|
|
|
183 |
window.resizeBy(dx, dy);
|
|
|
184 |
|
|
|
185 |
// Hide iframe and show wrapper
|
|
|
186 |
body.style.margin = oldMargin;
|
|
|
187 |
iframe.style.display = 'none';
|
|
|
188 |
wrapper.style.display = 'block';
|
|
|
189 |
}
|
|
|
190 |
},
|
|
|
191 |
|
|
|
192 |
resizeToContent : function() {
|
|
|
193 |
var isMSIE = (navigator.appName == "Microsoft Internet Explorer");
|
|
|
194 |
var isOpera = (navigator.userAgent.indexOf("Opera") != -1);
|
|
|
195 |
var elm, width, height, x, y, dx, dy;
|
|
|
196 |
|
|
|
197 |
if (isOpera)
|
|
|
198 |
return;
|
|
|
199 |
|
|
|
200 |
if (isMSIE) {
|
|
|
201 |
try { window.resizeTo(10, 10); } catch (e) {}
|
|
|
202 |
|
|
|
203 |
elm = document.body;
|
|
|
204 |
width = elm.offsetWidth;
|
|
|
205 |
height = elm.offsetHeight;
|
|
|
206 |
dx = (elm.scrollWidth - width) + 4;
|
|
|
207 |
dy = elm.scrollHeight - height;
|
|
|
208 |
|
|
|
209 |
try { window.resizeBy(dx, dy); } catch (e) {}
|
|
|
210 |
} else {
|
|
|
211 |
window.scrollBy(1000, 1000);
|
|
|
212 |
if (window.scrollX > 0 || window.scrollY > 0) {
|
|
|
213 |
window.resizeBy(window.innerWidth * 2, window.innerHeight * 2);
|
|
|
214 |
window.sizeToContent();
|
|
|
215 |
window.scrollTo(0, 0);
|
|
|
216 |
x = parseInt(screen.width / 2.0) - (window.outerWidth / 2.0);
|
|
|
217 |
y = parseInt(screen.height / 2.0) - (window.outerHeight / 2.0);
|
|
|
218 |
window.moveTo(x, y);
|
|
|
219 |
}
|
|
|
220 |
}
|
|
|
221 |
},
|
|
|
222 |
|
|
|
223 |
getWindowArg : function(name, default_value) {
|
|
|
224 |
return tinyMCE.getWindowArg(name, default_value);
|
|
|
225 |
},
|
|
|
226 |
|
|
|
227 |
restoreSelection : function() {
|
|
|
228 |
var inst;
|
|
|
229 |
|
|
|
230 |
if (this.storeSelection) {
|
|
|
231 |
inst = tinyMCE.selectedInstance;
|
|
|
232 |
|
|
|
233 |
inst.getWin().focus();
|
|
|
234 |
|
|
|
235 |
if (inst.selectionBookmark)
|
|
|
236 |
inst.selection.moveToBookmark(inst.selectionBookmark);
|
|
|
237 |
}
|
|
|
238 |
},
|
|
|
239 |
|
|
|
240 |
execCommand : function(command, user_interface, value) {
|
|
|
241 |
var inst = tinyMCE.selectedInstance;
|
|
|
242 |
|
|
|
243 |
this.restoreSelection();
|
|
|
244 |
inst.execCommand(command, user_interface, value);
|
|
|
245 |
|
|
|
246 |
// Store selection
|
|
|
247 |
if (this.storeSelection)
|
|
|
248 |
inst.selectionBookmark = inst.selection.getBookmark(true);
|
|
|
249 |
},
|
|
|
250 |
|
|
|
251 |
close : function() {
|
|
|
252 |
tinyMCE.closeWindow(window);
|
|
|
253 |
},
|
|
|
254 |
|
|
|
255 |
pickColor : function(e, element_id) {
|
|
|
256 |
tinyMCE.selectedInstance.execCommand('mceColorPicker', true, {
|
|
|
257 |
element_id : element_id,
|
|
|
258 |
document : document,
|
|
|
259 |
window : window,
|
|
|
260 |
store_selection : false
|
|
|
261 |
});
|
|
|
262 |
},
|
|
|
263 |
|
|
|
264 |
openBrowser : function(element_id, type, option) {
|
|
|
265 |
var cb = tinyMCE.getParam(option, tinyMCE.getParam("file_browser_callback"));
|
|
|
266 |
var url = document.getElementById(element_id).value;
|
|
|
267 |
|
|
|
268 |
tinyMCE.setWindowArg("window", window);
|
|
|
269 |
tinyMCE.setWindowArg("document", document);
|
|
|
270 |
|
|
|
271 |
// Call to external callback
|
|
|
272 |
if (eval('typeof(tinyMCEPopup.windowOpener.' + cb + ')') == "undefined")
|
|
|
273 |
alert("Callback function: " + cb + " could not be found.");
|
|
|
274 |
else
|
|
|
275 |
eval("tinyMCEPopup.windowOpener." + cb + "(element_id, url, type, window);");
|
|
|
276 |
},
|
|
|
277 |
|
|
|
278 |
importClass : function(c) {
|
|
|
279 |
var n;
|
|
|
280 |
|
|
|
281 |
window[c] = function() {};
|
|
|
282 |
|
|
|
283 |
for (n in window.opener[c].prototype)
|
|
|
284 |
window[c].prototype[n] = window.opener[c].prototype[n];
|
|
|
285 |
|
|
|
286 |
window[c].constructor = window.opener[c].constructor;
|
|
|
287 |
}
|
|
|
288 |
|
|
|
289 |
};
|
|
|
290 |
|
|
|
291 |
// Setup global instance
|
|
|
292 |
var tinyMCEPopup = new TinyMCE_Popup();
|
|
|
293 |
|
|
|
294 |
tinyMCEPopup.init();
|