]> git.donarmstrong.com Git - roundcube.git/blob - program/js/tiny_mce/tiny_mce_popup.js
Imported Upstream version 0.2~stable
[roundcube.git] / program / js / tiny_mce / tiny_mce_popup.js
1 // Some global instances\r
2 var tinymce = null, tinyMCEPopup, tinyMCE;\r
3 \r
4 tinyMCEPopup = {\r
5         init : function() {\r
6                 var t = this, w, ti, li, q, i, it;\r
7 \r
8                 li = ('' + document.location.search).replace(/^\?/, '').split('&');\r
9                 q = {};\r
10                 for (i=0; i<li.length; i++) {\r
11                         it = li[i].split('=');\r
12                         q[unescape(it[0])] = unescape(it[1]);\r
13                 }\r
14 \r
15                 if (q.mce_rdomain)\r
16                         document.domain = q.mce_rdomain;\r
17 \r
18                 // Find window & API\r
19                 w = t.getWin();\r
20                 tinymce = w.tinymce;\r
21                 tinyMCE = w.tinyMCE;\r
22                 t.editor = tinymce.EditorManager.activeEditor;\r
23                 t.params = t.editor.windowManager.params;\r
24 \r
25                 // Setup local DOM\r
26                 t.dom = t.editor.windowManager.createInstance('tinymce.dom.DOMUtils', document);\r
27                 t.dom.loadCSS(t.editor.settings.popup_css);\r
28 \r
29                 // Setup on init listeners\r
30                 t.listeners = [];\r
31                 t.onInit = {\r
32                         add : function(f, s) {\r
33                                 t.listeners.push({func : f, scope : s});\r
34                         }\r
35                 };\r
36 \r
37                 t.isWindow = !t.getWindowArg('mce_inline');\r
38                 t.id = t.getWindowArg('mce_window_id');\r
39                 t.editor.windowManager.onOpen.dispatch(t.editor.windowManager, window);\r
40         },\r
41 \r
42         getWin : function() {\r
43                 return window.dialogArguments || opener || parent || top;\r
44         },\r
45 \r
46         getWindowArg : function(n, dv) {\r
47                 var v = this.params[n];\r
48 \r
49                 return tinymce.is(v) ? v : dv;\r
50         },\r
51 \r
52         getParam : function(n, dv) {\r
53                 return this.editor.getParam(n, dv);\r
54         },\r
55 \r
56         getLang : function(n, dv) {\r
57                 return this.editor.getLang(n, dv);\r
58         },\r
59 \r
60         execCommand : function(cmd, ui, val, a) {\r
61                 a = a || {};\r
62                 a.skip_focus = 1;\r
63 \r
64                 this.restoreSelection();\r
65                 return this.editor.execCommand(cmd, ui, val, a);\r
66         },\r
67 \r
68         resizeToInnerSize : function() {\r
69                 var t = this, n, b = document.body, vp = t.dom.getViewPort(window), dw, dh;\r
70 \r
71                 dw = t.getWindowArg('mce_width') - vp.w;\r
72                 dh = t.getWindowArg('mce_height') - vp.h;\r
73 \r
74                 if (t.isWindow)\r
75                         window.resizeBy(dw, dh);\r
76                 else\r
77                         t.editor.windowManager.resizeBy(dw, dh, t.id);\r
78         },\r
79 \r
80         executeOnLoad : function(s) {\r
81                 this.onInit.add(function() {\r
82                         eval(s);\r
83                 });\r
84         },\r
85 \r
86         storeSelection : function() {\r
87                 this.editor.windowManager.bookmark = tinyMCEPopup.editor.selection.getBookmark('simple');\r
88         },\r
89 \r
90         restoreSelection : function() {\r
91                 var t = tinyMCEPopup;\r
92 \r
93                 if (!t.isWindow && tinymce.isIE)\r
94                         t.editor.selection.moveToBookmark(t.editor.windowManager.bookmark);\r
95         },\r
96 \r
97         requireLangPack : function() {\r
98                 var u = this.getWindowArg('plugin_url') || this.getWindowArg('theme_url');\r
99 \r
100                 if (u && this.editor.settings.language) {\r
101                         u += '/langs/' + this.editor.settings.language + '_dlg.js';\r
102 \r
103                         if (!tinymce.ScriptLoader.isDone(u)) {\r
104                                 document.write('<script type="text/javascript" src="' + tinymce._addVer(u) + '"></script>');\r
105                                 tinymce.ScriptLoader.markDone(u);\r
106                         }\r
107                 }\r
108         },\r
109 \r
110         pickColor : function(e, element_id) {\r
111                 this.execCommand('mceColorPicker', true, {\r
112                         color : document.getElementById(element_id).value,\r
113                         func : function(c) {\r
114                                 document.getElementById(element_id).value = c;\r
115 \r
116                                 try {\r
117                                         document.getElementById(element_id).onchange();\r
118                                 } catch (ex) {\r
119                                         // Try fire event, ignore errors\r
120                                 }\r
121                         }\r
122                 });\r
123         },\r
124 \r
125         openBrowser : function(element_id, type, option) {\r
126                 tinyMCEPopup.restoreSelection();\r
127                 this.editor.execCallback('file_browser_callback', element_id, document.getElementById(element_id).value, type, window);\r
128         },\r
129 \r
130         close : function() {\r
131                 var t = this;\r
132 \r
133                 // To avoid domain relaxing issue in Opera\r
134                 function close() {\r
135                         t.editor.windowManager.close(window);\r
136                         tinymce = tinyMCE = t.editor = t.params = t.dom = t.dom.doc = null; // Cleanup\r
137                 };\r
138 \r
139                 if (tinymce.isOpera)\r
140                         t.getWin().setTimeout(close, 0);\r
141                 else\r
142                         close();\r
143         },\r
144 \r
145         // Internal functions   \r
146 \r
147         _restoreSelection : function() {\r
148                 var e = window.event.srcElement;\r
149 \r
150                 if (e.nodeName == 'INPUT' && (e.type == 'submit' || e.type == 'button'))\r
151                         tinyMCEPopup.restoreSelection();\r
152         },\r
153 \r
154 /*      _restoreSelection : function() {\r
155                 var e = window.event.srcElement;\r
156 \r
157                 // If user focus a non text input or textarea\r
158                 if ((e.nodeName != 'INPUT' && e.nodeName != 'TEXTAREA') || e.type != 'text')\r
159                         tinyMCEPopup.restoreSelection();\r
160         },*/\r
161 \r
162         _onDOMLoaded : function() {\r
163                 var t = this, ti = document.title, bm, h;\r
164 \r
165                 // Translate page\r
166                 h = document.body.innerHTML;\r
167 \r
168                 // Replace a=x with a="x" in IE\r
169                 if (tinymce.isIE)\r
170                         h = h.replace(/ (value|title|alt)=([^"][^\s>]+)/gi, ' $1="$2"')\r
171 \r
172                 document.dir = t.editor.getParam('directionality','');\r
173                 document.body.innerHTML = t.editor.translate(h);\r
174                 document.title = ti = t.editor.translate(ti);\r
175                 document.body.style.display = '';\r
176 \r
177                 // Restore selection in IE when focus is placed on a non textarea or input element of the type text\r
178                 if (tinymce.isIE)\r
179                         document.attachEvent('onmouseup', tinyMCEPopup._restoreSelection);\r
180 \r
181                 t.restoreSelection();\r
182                 t.resizeToInnerSize();\r
183 \r
184                 // Set inline title\r
185                 if (!t.isWindow)\r
186                         t.editor.windowManager.setTitle(window, ti);\r
187                 else\r
188                         window.focus();\r
189 \r
190                 if (!tinymce.isIE && !t.isWindow) {\r
191                         tinymce.dom.Event._add(document, 'focus', function() {\r
192                                 t.editor.windowManager.focus(t.id)\r
193                         });\r
194                 }\r
195 \r
196                 // Patch for accessibility\r
197                 tinymce.each(t.dom.select('select'), function(e) {\r
198                         e.onkeydown = tinyMCEPopup._accessHandler;\r
199                 });\r
200 \r
201                 // Call onInit\r
202                 // Init must be called before focus so the selection won't get lost by the focus call\r
203                 tinymce.each(t.listeners, function(o) {\r
204                         o.func.call(o.scope, t.editor);\r
205                 });\r
206 \r
207                 // Move focus to window\r
208                 if (t.getWindowArg('mce_auto_focus', true)) {\r
209                         window.focus();\r
210 \r
211                         // Focus element with mceFocus class\r
212                         tinymce.each(document.forms, function(f) {\r
213                                 tinymce.each(f.elements, function(e) {\r
214                                         if (t.dom.hasClass(e, 'mceFocus') && !e.disabled) {\r
215                                                 e.focus();\r
216                                                 return false; // Break loop\r
217                                         }\r
218                                 });\r
219                         });\r
220                 }\r
221 \r
222                 document.onkeyup = tinyMCEPopup._closeWinKeyHandler;\r
223         },\r
224 \r
225         _accessHandler : function(e) {\r
226                 e = e || window.event;\r
227 \r
228                 if (e.keyCode == 13 || e.keyCode == 32) {\r
229                         e = e.target || e.srcElement;\r
230 \r
231                         if (e.onchange)\r
232                                 e.onchange();\r
233 \r
234                         return tinymce.dom.Event.cancel(e);\r
235                 }\r
236         },\r
237 \r
238         _closeWinKeyHandler : function(e) {\r
239                 e = e || window.event;\r
240 \r
241                 if (e.keyCode == 27)\r
242                         tinyMCEPopup.close();\r
243         },\r
244 \r
245         _wait : function() {\r
246                 var t = this, ti;\r
247 \r
248                 if (tinymce.isIE && document.location.protocol != 'https:') {\r
249                         // Fake DOMContentLoaded on IE\r
250                         document.write('<script id=__ie_onload defer src=\'javascript:""\';><\/script>');\r
251                         document.getElementById("__ie_onload").onreadystatechange = function() {\r
252                                 if (this.readyState == "complete") {\r
253                                         t._onDOMLoaded();\r
254                                         document.getElementById("__ie_onload").onreadystatechange = null; // Prevent leak\r
255                                 }\r
256                         };\r
257                 } else {\r
258                         if (tinymce.isIE || tinymce.isWebKit) {\r
259                                 ti = setInterval(function() {\r
260                                         if (/loaded|complete/.test(document.readyState)) {\r
261                                                 clearInterval(ti);\r
262                                                 t._onDOMLoaded();\r
263                                         }\r
264                                 }, 10);\r
265                         } else {\r
266                                 window.addEventListener('DOMContentLoaded', function() {\r
267                                         t._onDOMLoaded();\r
268                                 }, false);\r
269                         }\r
270                 }\r
271         }\r
272 };\r
273 \r
274 tinyMCEPopup.init();\r
275 tinyMCEPopup._wait(); // Wait for DOM Content Loaded\r