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