alecpl
2008-04-10 cb6b51ee7647924403a81cf5b9443936f7c5a901
commit | author | age
4315b0 1 // Some global instances, this will be filled later
S 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 && parseFloat(opera.version()) < 9.5)
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();