re-added binary
[citadel.git] / webcit / tiny_mce / tiny_mce_popup.js
1 /**\r
2  * $RCSfile: tiny_mce_popup.js,v $\r
3  * $Revision: 1.2 $\r
4  * $Date: 2005/09/26 18:00:52 $\r
5  *\r
6  * @author Moxiecode\r
7  * @copyright Copyright © 2004, Moxiecode Systems AB, All rights reserved.\r
8  */\r
9 \r
10 var tinyMCE = null, tinyMCELang = null;\r
11 \r
12 function TinyMCEPopup() {\r
13 };\r
14 \r
15 TinyMCEPopup.prototype.init = function() {\r
16         var win = window.opener ? window.opener : window.dialogArguments;\r
17 \r
18         if (!win)\r
19                 win = top;\r
20 \r
21         window.opener = win;\r
22         this.windowOpener = win;\r
23 \r
24         // Setup parent references\r
25         tinyMCE = win.tinyMCE;\r
26         tinyMCELang = win.tinyMCELang;\r
27 \r
28         if (!tinyMCE) {\r
29                 alert("tinyMCE object reference not found from popup.");\r
30                 return;\r
31         }\r
32 \r
33         this.isWindow = tinyMCE.getWindowArg('mce_inside_iframe', false) == false;\r
34         this.storeSelection = tinyMCE.isMSIE && !this.isWindow && tinyMCE.getWindowArg('mce_store_selection', true);\r
35 \r
36         // Store selection\r
37         if (this.storeSelection)\r
38                 tinyMCE.selectedInstance.execCommand('mceStoreSelection');\r
39 \r
40         // Setup dir\r
41         if (tinyMCELang['lang_dir'])\r
42                 document.dir = tinyMCELang['lang_dir'];\r
43 \r
44         // Setup title\r
45         var re = new RegExp('{|\\\$|}', 'g');\r
46         var title = document.title.replace(re, "");\r
47         if (typeof tinyMCELang[title] != "undefined") {\r
48                 var divElm = document.createElement("div");\r
49                 divElm.innerHTML = tinyMCELang[title];\r
50                 document.title = divElm.innerHTML;\r
51 \r
52                 if (tinyMCE.setWindowTitle != null)\r
53                         tinyMCE.setWindowTitle(window, divElm.innerHTML);\r
54         }\r
55 \r
56         // Output Popup CSS class\r
57         document.write('<link href="' + tinyMCE.getParam("popups_css") + '" rel="stylesheet" type="text/css">');\r
58 \r
59         tinyMCE.addEvent(window, "load", this.onLoad);\r
60 };\r
61 \r
62 TinyMCEPopup.prototype.onLoad = function() {\r
63         var body = document.body;\r
64 \r
65         if (tinyMCE.getWindowArg('mce_replacevariables', true))\r
66                 body.innerHTML = tinyMCE.applyTemplate(body.innerHTML, tinyMCE.windowArgs);\r
67 \r
68         var dir = tinyMCE.selectedInstance.settings['directionality'];\r
69         if (dir == "rtl") {\r
70                 var elms = document.forms[0].elements;\r
71                 for (var i=0; i<elms.length; i++) {\r
72                         if ((elms[i].type == "text" || elms[i].type == "textarea") && elms[i].getAttribute("dir") != "ltr")\r
73                                 elms[i].dir = dir;\r
74                 }\r
75         }\r
76 \r
77         if (body.style.display == 'none')\r
78                 body.style.display = 'block';\r
79 };\r
80 \r
81 TinyMCEPopup.prototype.resizeToInnerSize = function() {\r
82         if (this.isWindow) {\r
83                 var doc = document;\r
84                 var body = doc.body;\r
85                 var oldMargin, wrapper, iframe, nodes, dx, dy;\r
86 \r
87                 if (body.style.display == 'none')\r
88                         body.style.display = 'block';\r
89 \r
90                 // Remove margin\r
91                 oldMargin = body.style.margin;\r
92                 body.style.margin = '0px';\r
93 \r
94                 // Create wrapper\r
95                 wrapper = doc.createElement("div");\r
96                 wrapper.id = 'mcBodyWrapper';\r
97                 wrapper.style.display = 'none';\r
98                 wrapper.style.margin = '0px';\r
99 \r
100                 // Wrap body elements\r
101                 nodes = doc.body.childNodes;\r
102                 for (var i=nodes.length-1; i>=0; i--) {\r
103                         if (wrapper.hasChildNodes())\r
104                                 wrapper.insertBefore(nodes[i].cloneNode(true), wrapper.firstChild);\r
105                         else\r
106                                 wrapper.appendChild(nodes[i].cloneNode(true));\r
107 \r
108                         nodes[i].parentNode.removeChild(nodes[i]);\r
109                 }\r
110 \r
111                 // Add wrapper\r
112                 doc.body.appendChild(wrapper);\r
113 \r
114                 // Create iframe\r
115                 iframe = document.createElement("iframe");\r
116                 iframe.id = "mcWinIframe";\r
117                 iframe.src = "about:blank";\r
118                 iframe.width = "100%";\r
119                 iframe.height = "100%";\r
120                 iframe.style.margin = '0px';\r
121 \r
122                 // Add iframe\r
123                 doc.body.appendChild(iframe);\r
124 \r
125                 // Measure iframe\r
126                 iframe = document.getElementById('mcWinIframe');\r
127                 dx = tinyMCE.getWindowArg('mce_width') - iframe.clientWidth;\r
128                 dy = tinyMCE.getWindowArg('mce_height') - iframe.clientHeight;\r
129 \r
130                 // Resize window\r
131                 // tinyMCE.debug(tinyMCE.getWindowArg('mce_width') + "," + tinyMCE.getWindowArg('mce_height') + " - " + dx + "," + dy);\r
132                 window.resizeBy(dx, dy);\r
133 \r
134                 // Hide iframe and show wrapper\r
135                 body.style.margin = oldMargin;\r
136                 iframe.style.display = 'none';\r
137                 wrapper.style.display = 'block';\r
138         }\r
139 };\r
140 \r
141 TinyMCEPopup.prototype.resizeToContent = function() {\r
142         var isMSIE = (navigator.appName == "Microsoft Internet Explorer");\r
143         var isOpera = (navigator.userAgent.indexOf("Opera") != -1);\r
144 \r
145         if (isOpera)\r
146                 return;\r
147 \r
148         if (isMSIE) {\r
149                 try { window.resizeTo(10, 10); } catch (e) {}\r
150 \r
151                 var elm = document.body;\r
152                 var width = elm.offsetWidth;\r
153                 var height = elm.offsetHeight;\r
154                 var dx = (elm.scrollWidth - width) + 4;\r
155                 var dy = elm.scrollHeight - height;\r
156 \r
157                 try { window.resizeBy(dx, dy); } catch (e) {}\r
158         } else {\r
159                 window.scrollBy(1000, 1000);\r
160                 if (window.scrollX > 0 || window.scrollY > 0) {\r
161                         window.resizeBy(window.innerWidth * 2, window.innerHeight * 2);\r
162                         window.sizeToContent();\r
163                         window.scrollTo(0, 0);\r
164                         var x = parseInt(screen.width / 2.0) - (window.outerWidth / 2.0);\r
165                         var y = parseInt(screen.height / 2.0) - (window.outerHeight / 2.0);\r
166                         window.moveTo(x, y);\r
167                 }\r
168         }\r
169 };\r
170 \r
171 TinyMCEPopup.prototype.getWindowArg = function(name, default_value) {\r
172         return tinyMCE.getWindowArg(name, default_value);\r
173 };\r
174 \r
175 TinyMCEPopup.prototype.execCommand = function(command, user_interface, value) {\r
176         var inst = tinyMCE.selectedInstance;\r
177 \r
178         // Restore selection\r
179         if (this.storeSelection) {\r
180                 inst.getWin().focus();\r
181                 inst.execCommand('mceRestoreSelection');\r
182         }\r
183 \r
184         inst.execCommand(command, user_interface, value);\r
185 \r
186         // Store selection\r
187         if (this.storeSelection)\r
188                 inst.execCommand('mceStoreSelection');\r
189 };\r
190 \r
191 TinyMCEPopup.prototype.close = function() {\r
192         tinyMCE.closeWindow(window);\r
193 };\r
194 \r
195 TinyMCEPopup.prototype.pickColor = function(e, element_id) {\r
196         tinyMCE.selectedInstance.execCommand('mceColorPicker', true, {\r
197                 element_id : element_id,\r
198                 document : document,\r
199                 window : window,\r
200                 store_selection : false\r
201         });\r
202 };\r
203 \r
204 TinyMCEPopup.prototype.openBrowser = function(element_id, type, option) {\r
205         var cb = tinyMCE.getParam(option, tinyMCE.getParam("file_browser_callback"));\r
206         var url = document.getElementById(element_id).value;\r
207 \r
208         tinyMCE.setWindowArg("window", window);\r
209         tinyMCE.setWindowArg("document", document);\r
210 \r
211         // Call to external callback\r
212         if (eval('typeof(tinyMCEPopup.windowOpener.' + cb + ')') == "undefined")\r
213                 alert("Callback function: " + cb + " could not be found.");\r
214         else\r
215                 eval("tinyMCEPopup.windowOpener." + cb + "(element_id, url, type, window);");\r
216 };\r
217 \r
218 // Setup global instance\r
219 var tinyMCEPopup = new TinyMCEPopup();\r
220 \r
221 tinyMCEPopup.init();\r