|
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; |
|
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 var re = new RegExp('{|\\\$|}', 'g'); |
|
69 var title = document.title.replace(re, ""); |
|
70 if (typeof tinyMCELang[title] != "undefined") { |
|
71 var divElm = document.createElement("div"); |
|
72 divElm.innerHTML = tinyMCELang[title]; |
|
73 document.title = divElm.innerHTML; |
|
74 |
|
75 if (tinyMCE.setWindowTitle != null) |
|
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 // Netscape 7.1 workaround |
|
127 if (this.isWindow && tinyMCE.isNS71) { |
|
128 window.resizeBy(0, 10); |
|
129 return; |
|
130 } |
|
131 |
|
132 if (this.isWindow) { |
|
133 var doc = document; |
|
134 var body = doc.body; |
|
135 var oldMargin, wrapper, iframe, nodes, dx, dy; |
|
136 |
|
137 if (body.style.display == 'none') |
|
138 body.style.display = 'block'; |
|
139 |
|
140 // Remove margin |
|
141 oldMargin = body.style.margin; |
|
142 body.style.margin = '0'; |
|
143 |
|
144 // Create wrapper |
|
145 wrapper = doc.createElement("div"); |
|
146 wrapper.id = 'mcBodyWrapper'; |
|
147 wrapper.style.display = 'none'; |
|
148 wrapper.style.margin = '0'; |
|
149 |
|
150 // Wrap body elements |
|
151 nodes = doc.body.childNodes; |
|
152 for (var i=nodes.length-1; i>=0; i--) { |
|
153 if (wrapper.hasChildNodes()) |
|
154 wrapper.insertBefore(nodes[i].cloneNode(true), wrapper.firstChild); |
|
155 else |
|
156 wrapper.appendChild(nodes[i].cloneNode(true)); |
|
157 |
|
158 nodes[i].parentNode.removeChild(nodes[i]); |
|
159 } |
|
160 |
|
161 // Add wrapper |
|
162 doc.body.appendChild(wrapper); |
|
163 |
|
164 // Create iframe |
|
165 iframe = document.createElement("iframe"); |
|
166 iframe.id = "mcWinIframe"; |
|
167 iframe.src = document.location.href.toLowerCase().indexOf('https') == -1 ? "about:blank" : tinyMCE.settings['default_document']; |
|
168 iframe.width = "100%"; |
|
169 iframe.height = "100%"; |
|
170 iframe.style.margin = '0'; |
|
171 |
|
172 // Add iframe |
|
173 doc.body.appendChild(iframe); |
|
174 |
|
175 // Measure iframe |
|
176 iframe = document.getElementById('mcWinIframe'); |
|
177 dx = tinyMCE.getWindowArg('mce_width') - iframe.clientWidth; |
|
178 dy = tinyMCE.getWindowArg('mce_height') - iframe.clientHeight; |
|
179 |
|
180 // Resize window |
|
181 // tinyMCE.debug(tinyMCE.getWindowArg('mce_width') + "," + tinyMCE.getWindowArg('mce_height') + " - " + dx + "," + dy); |
|
182 window.resizeBy(dx, dy); |
|
183 |
|
184 // Hide iframe and show wrapper |
|
185 body.style.margin = oldMargin; |
|
186 iframe.style.display = 'none'; |
|
187 wrapper.style.display = 'block'; |
|
188 } |
|
189 }, |
|
190 |
|
191 resizeToContent : function() { |
|
192 var isMSIE = (navigator.appName == "Microsoft Internet Explorer"); |
|
193 var isOpera = (navigator.userAgent.indexOf("Opera") != -1); |
|
194 |
|
195 if (isOpera) |
|
196 return; |
|
197 |
|
198 if (isMSIE) { |
|
199 try { window.resizeTo(10, 10); } catch (e) {} |
|
200 |
|
201 var elm = document.body; |
|
202 var width = elm.offsetWidth; |
|
203 var height = elm.offsetHeight; |
|
204 var dx = (elm.scrollWidth - width) + 4; |
|
205 var dy = elm.scrollHeight - height; |
|
206 |
|
207 try { window.resizeBy(dx, dy); } catch (e) {} |
|
208 } else { |
|
209 window.scrollBy(1000, 1000); |
|
210 if (window.scrollX > 0 || window.scrollY > 0) { |
|
211 window.resizeBy(window.innerWidth * 2, window.innerHeight * 2); |
|
212 window.sizeToContent(); |
|
213 window.scrollTo(0, 0); |
|
214 var x = parseInt(screen.width / 2.0) - (window.outerWidth / 2.0); |
|
215 var y = parseInt(screen.height / 2.0) - (window.outerHeight / 2.0); |
|
216 window.moveTo(x, y); |
|
217 } |
|
218 } |
|
219 }, |
|
220 |
|
221 getWindowArg : function(name, default_value) { |
|
222 return tinyMCE.getWindowArg(name, default_value); |
|
223 }, |
|
224 |
|
225 restoreSelection : function() { |
|
226 if (this.storeSelection) { |
|
227 var inst = tinyMCE.selectedInstance; |
|
228 |
|
229 inst.getWin().focus(); |
|
230 |
|
231 if (inst.selectionBookmark) |
|
232 inst.selection.moveToBookmark(inst.selectionBookmark); |
|
233 } |
|
234 }, |
|
235 |
|
236 execCommand : function(command, user_interface, value) { |
|
237 var inst = tinyMCE.selectedInstance; |
|
238 |
|
239 this.restoreSelection(); |
|
240 inst.execCommand(command, user_interface, value); |
|
241 |
|
242 // Store selection |
|
243 if (this.storeSelection) |
|
244 inst.selectionBookmark = inst.selection.getBookmark(true); |
|
245 }, |
|
246 |
|
247 close : function() { |
|
248 tinyMCE.closeWindow(window); |
|
249 }, |
|
250 |
|
251 pickColor : function(e, element_id) { |
|
252 tinyMCE.selectedInstance.execCommand('mceColorPicker', true, { |
|
253 element_id : element_id, |
|
254 document : document, |
|
255 window : window, |
|
256 store_selection : false |
|
257 }); |
|
258 }, |
|
259 |
|
260 openBrowser : function(element_id, type, option) { |
|
261 var cb = tinyMCE.getParam(option, tinyMCE.getParam("file_browser_callback")); |
|
262 var url = document.getElementById(element_id).value; |
|
263 |
|
264 tinyMCE.setWindowArg("window", window); |
|
265 tinyMCE.setWindowArg("document", document); |
|
266 |
|
267 // Call to external callback |
|
268 if (eval('typeof(tinyMCEPopup.windowOpener.' + cb + ')') == "undefined") |
|
269 alert("Callback function: " + cb + " could not be found."); |
|
270 else |
|
271 eval("tinyMCEPopup.windowOpener." + cb + "(element_id, url, type, window);"); |
|
272 }, |
|
273 |
|
274 importClass : function(c) { |
|
275 window[c] = function() {}; |
|
276 |
|
277 for (var n in window.opener[c].prototype) |
|
278 window[c].prototype[n] = window.opener[c].prototype[n]; |
|
279 |
|
280 window[c].constructor = window.opener[c].constructor; |
|
281 } |
|
282 |
|
283 }; |
|
284 |
|
285 // Setup global instance |
|
286 var tinyMCEPopup = new TinyMCE_Popup(); |
|
287 |
|
288 tinyMCEPopup.init(); |