|
1 /** |
|
2 * $Id: editor_plugin_src.js 201 2007-02-12 15:56:56Z spocke $ |
|
3 * |
|
4 * Moxiecode DHTML Windows script. |
|
5 * |
|
6 * @author Moxiecode |
|
7 * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved. |
|
8 */ |
|
9 |
|
10 // Patch openWindow, closeWindow TinyMCE functions |
|
11 |
|
12 var TinyMCE_InlinePopupsPlugin = { |
|
13 getInfo : function() { |
|
14 return { |
|
15 longname : 'Inline Popups', |
|
16 author : 'Moxiecode Systems AB', |
|
17 authorurl : 'http://tinymce.moxiecode.com', |
|
18 infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/inlinepopups', |
|
19 version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion |
|
20 }; |
|
21 } |
|
22 }; |
|
23 |
|
24 tinyMCE.addPlugin("inlinepopups", TinyMCE_InlinePopupsPlugin); |
|
25 |
|
26 // Patch openWindow, closeWindow TinyMCE functions |
|
27 |
|
28 TinyMCE_Engine.prototype.orgOpenWindow = TinyMCE_Engine.prototype.openWindow; |
|
29 TinyMCE_Engine.prototype.orgCloseWindow = TinyMCE_Engine.prototype.closeWindow; |
|
30 |
|
31 TinyMCE_Engine.prototype.openWindow = function(template, args) { |
|
32 // Does the caller support inline |
|
33 if (args['inline'] != "yes" || tinyMCE.isOpera || tinyMCE.getParam("plugins").indexOf('inlinepopups') == -1) { |
|
34 mcWindows.selectedWindow = null; |
|
35 args['mce_inside_iframe'] = false; |
|
36 this.orgOpenWindow(template, args); |
|
37 return; |
|
38 } |
|
39 |
|
40 var url, resizable, scrollbars; |
|
41 |
|
42 args['mce_inside_iframe'] = true; |
|
43 tinyMCE.windowArgs = args; |
|
44 |
|
45 if (template['file'].charAt(0) != '/' && template['file'].indexOf('://') == -1) |
|
46 url = tinyMCE.baseURL + "/themes/" + tinyMCE.getParam("theme") + "/" + template['file']; |
|
47 else |
|
48 url = template['file']; |
|
49 |
|
50 if (!(width = parseInt(template['width']))) |
|
51 width = 320; |
|
52 |
|
53 if (!(height = parseInt(template['height']))) |
|
54 height = 200; |
|
55 |
|
56 if (!(minWidth = parseInt(template['minWidth']))) |
|
57 minWidth = 100; |
|
58 |
|
59 if (!(minHeight = parseInt(template['minHeight']))) |
|
60 minHeight = 100; |
|
61 |
|
62 resizable = (args && args['resizable']) ? args['resizable'] : "no"; |
|
63 scrollbars = (args && args['scrollbars']) ? args['scrollbars'] : "no"; |
|
64 |
|
65 height += 18; |
|
66 |
|
67 // Replace all args as variables in URL |
|
68 for (var name in args) { |
|
69 if (typeof(args[name]) == 'function') |
|
70 continue; |
|
71 |
|
72 url = tinyMCE.replaceVar(url, name, escape(args[name])); |
|
73 } |
|
74 |
|
75 var elm = document.getElementById(this.selectedInstance.editorId + '_parent'); |
|
76 |
|
77 if (tinyMCE.hasPlugin('fullscreen') && this.selectedInstance.getData('fullscreen').enabled) |
|
78 pos = { absLeft: 0, absTop: 0 }; |
|
79 else |
|
80 pos = tinyMCE.getAbsPosition(elm); |
|
81 |
|
82 // Center div in editor area |
|
83 pos.absLeft += Math.round((elm.firstChild.clientWidth / 2) - (width / 2)); |
|
84 pos.absTop += Math.round((elm.firstChild.clientHeight / 2) - (height / 2)); |
|
85 |
|
86 mcWindows.open(url, mcWindows.idCounter++, "modal=yes,width=" + width+ ",height=" + height + ",resizable=" + resizable + ",scrollbars=" + scrollbars + ",statusbar=" + resizable + ",left=" + pos.absLeft + ",top=" + pos.absTop + ",minWidth=" + minWidth + ",minHeight=" + minHeight ); |
|
87 }; |
|
88 |
|
89 TinyMCE_Engine.prototype.closeWindow = function(win) { |
|
90 var gotit = false, n, w; |
|
91 for (n in mcWindows.windows) { |
|
92 w = mcWindows.windows[n]; |
|
93 if (typeof(w) == 'function') continue; |
|
94 if (win.name == w.id + '_iframe') { |
|
95 w.close(); |
|
96 gotit = true; |
|
97 } |
|
98 } |
|
99 if (!gotit) |
|
100 this.orgCloseWindow(win); |
|
101 |
|
102 tinyMCE.selectedInstance.getWin().focus(); |
|
103 }; |
|
104 |
|
105 TinyMCE_Engine.prototype.setWindowTitle = function(win_ref, title) { |
|
106 for (var n in mcWindows.windows) { |
|
107 var win = mcWindows.windows[n]; |
|
108 if (typeof(win) == 'function') |
|
109 continue; |
|
110 |
|
111 if (win_ref.name == win.id + "_iframe") |
|
112 window.frames[win.id + "_iframe"].document.getElementById(win.id + '_title').innerHTML = title; |
|
113 } |
|
114 }; |
|
115 |
|
116 // * * * * * TinyMCE_Windows classes below |
|
117 |
|
118 // Windows handler |
|
119 function TinyMCE_Windows() { |
|
120 this.settings = new Array(); |
|
121 this.windows = new Array(); |
|
122 this.isMSIE = (navigator.appName == "Microsoft Internet Explorer"); |
|
123 this.isGecko = navigator.userAgent.indexOf('Gecko') != -1; |
|
124 this.isSafari = navigator.userAgent.indexOf('Safari') != -1; |
|
125 this.isMac = navigator.userAgent.indexOf('Mac') != -1; |
|
126 this.isMSIE5_0 = this.isMSIE && (navigator.userAgent.indexOf('MSIE 5.0') != -1); |
|
127 this.action = "none"; |
|
128 this.selectedWindow = null; |
|
129 this.lastSelectedWindow = null; |
|
130 this.zindex = 1001; |
|
131 this.mouseDownScreenX = 0; |
|
132 this.mouseDownScreenY = 0; |
|
133 this.mouseDownLayerX = 0; |
|
134 this.mouseDownLayerY = 0; |
|
135 this.mouseDownWidth = 0; |
|
136 this.mouseDownHeight = 0; |
|
137 this.idCounter = 0; |
|
138 }; |
|
139 |
|
140 TinyMCE_Windows.prototype.init = function(settings) { |
|
141 this.settings = settings; |
|
142 |
|
143 if (this.isMSIE) |
|
144 this.addEvent(document, "mousemove", mcWindows.eventDispatcher); |
|
145 else |
|
146 this.addEvent(window, "mousemove", mcWindows.eventDispatcher); |
|
147 |
|
148 this.addEvent(document, "mouseup", mcWindows.eventDispatcher); |
|
149 |
|
150 this.addEvent(window, "resize", mcWindows.eventDispatcher); |
|
151 this.addEvent(document, "scroll", mcWindows.eventDispatcher); |
|
152 |
|
153 this.doc = document; |
|
154 }; |
|
155 |
|
156 TinyMCE_Windows.prototype.getBounds = function() { |
|
157 if (!this.bounds) { |
|
158 var vp = tinyMCE.getViewPort(window); |
|
159 var top, left, bottom, right, docEl = this.doc.documentElement; |
|
160 |
|
161 top = vp.top; |
|
162 left = vp.left; |
|
163 bottom = vp.height + top - 2; |
|
164 right = vp.width + left - 22; // TODO this number is platform dependant |
|
165 // x1, y1, x2, y2 |
|
166 this.bounds = [left, top, right, bottom]; |
|
167 } |
|
168 return this.bounds; |
|
169 }; |
|
170 |
|
171 TinyMCE_Windows.prototype.clampBoxPosition = function(x, y, w, h, minW, minH) { |
|
172 var bounds = this.getBounds(); |
|
173 |
|
174 x = Math.max(bounds[0], Math.min(bounds[2], x + w) - w); |
|
175 y = Math.max(bounds[1], Math.min(bounds[3], y + h) - h); |
|
176 |
|
177 return this.clampBoxSize(x, y, w, h, minW, minH); |
|
178 }; |
|
179 |
|
180 TinyMCE_Windows.prototype.clampBoxSize = function(x, y, w, h, minW, minH) { |
|
181 var bounds = this.getBounds(); |
|
182 |
|
183 return [ |
|
184 x, y, |
|
185 Math.max(minW, Math.min(bounds[2], x + w) - x), |
|
186 Math.max(minH, Math.min(bounds[3], y + h) - y) |
|
187 ]; |
|
188 }; |
|
189 |
|
190 TinyMCE_Windows.prototype.getParam = function(name, default_value) { |
|
191 var value = null; |
|
192 |
|
193 value = (typeof(this.settings[name]) == "undefined") ? default_value : this.settings[name]; |
|
194 |
|
195 // Fix bool values |
|
196 if (value == "true" || value == "false") |
|
197 return (value == "true"); |
|
198 |
|
199 return value; |
|
200 }; |
|
201 |
|
202 TinyMCE_Windows.prototype.eventDispatcher = function(e) { |
|
203 e = typeof(e) == "undefined" ? window.event : e; |
|
204 |
|
205 if (mcWindows.selectedWindow == null) |
|
206 return; |
|
207 |
|
208 // Switch focus |
|
209 if (mcWindows.isGecko && e.type == "mousedown") { |
|
210 var elm = e.currentTarget; |
|
211 |
|
212 for (var n in mcWindows.windows) { |
|
213 var win = mcWindows.windows[n]; |
|
214 |
|
215 if (win.headElement == elm || win.resizeElement == elm) { |
|
216 win.focus(); |
|
217 break; |
|
218 } |
|
219 } |
|
220 } |
|
221 |
|
222 switch (e.type) { |
|
223 case "mousemove": |
|
224 mcWindows.selectedWindow.onMouseMove(e); |
|
225 break; |
|
226 |
|
227 case "mouseup": |
|
228 mcWindows.selectedWindow.onMouseUp(e); |
|
229 break; |
|
230 |
|
231 case "mousedown": |
|
232 mcWindows.selectedWindow.onMouseDown(e); |
|
233 break; |
|
234 |
|
235 case "focus": |
|
236 mcWindows.selectedWindow.onFocus(e); |
|
237 break; |
|
238 case "scroll": |
|
239 case "resize": |
|
240 if (mcWindows.clampUpdateTimeout) |
|
241 clearTimeout(mcWindows.clampUpdateTimeout); |
|
242 mcWindows.clampEventType = e.type; |
|
243 mcWindows.clampUpdateTimeout = |
|
244 setTimeout(function () {mcWindows.updateClamping()}, 100); |
|
245 break; |
|
246 } |
|
247 }; |
|
248 |
|
249 TinyMCE_Windows.prototype.updateClamping = function () { |
|
250 var clamp, oversize, etype = mcWindows.clampEventType; |
|
251 |
|
252 this.bounds = null; // Recalc window bounds on resize/scroll |
|
253 this.clampUpdateTimeout = null; |
|
254 |
|
255 for (var n in this.windows) { |
|
256 win = this.windows[n]; |
|
257 if (typeof(win) == 'function' || ! win.winElement) continue; |
|
258 |
|
259 clamp = mcWindows.clampBoxPosition( |
|
260 win.left, win.top, |
|
261 win.winElement.scrollWidth, |
|
262 win.winElement.scrollHeight, |
|
263 win.features.minWidth, |
|
264 win.features.minHeight |
|
265 ); |
|
266 oversize = ( |
|
267 clamp[2] != win.winElement.scrollWidth || |
|
268 clamp[3] != win.winElement.scrollHeight |
|
269 ) ? true : false; |
|
270 |
|
271 if (!oversize || win.features.resizable == "yes" || etype != "scroll") |
|
272 win.moveTo(clamp[0], clamp[1]); |
|
273 if (oversize && win.features.resizable == "yes") |
|
274 win.resizeTo(clamp[2], clamp[3]); |
|
275 } |
|
276 }; |
|
277 |
|
278 TinyMCE_Windows.prototype.addEvent = function(obj, name, handler) { |
|
279 if (this.isMSIE) |
|
280 obj.attachEvent("on" + name, handler); |
|
281 else |
|
282 obj.addEventListener(name, handler, false); |
|
283 }; |
|
284 |
|
285 TinyMCE_Windows.prototype.cancelEvent = function(e) { |
|
286 if (this.isMSIE) { |
|
287 e.returnValue = false; |
|
288 e.cancelBubble = true; |
|
289 } else |
|
290 e.preventDefault(); |
|
291 }; |
|
292 |
|
293 TinyMCE_Windows.prototype.parseFeatures = function(opts) { |
|
294 // Cleanup the options |
|
295 opts = opts.toLowerCase(); |
|
296 opts = opts.replace(/;/g, ","); |
|
297 opts = opts.replace(/[^0-9a-z=,]/g, ""); |
|
298 |
|
299 var optionChunks = opts.split(','); |
|
300 var options = new Array(); |
|
301 |
|
302 options['left'] = "10"; |
|
303 options['top'] = "10"; |
|
304 options['width'] = "300"; |
|
305 options['height'] = "300"; |
|
306 options['minwidth'] = "100"; |
|
307 options['minheight'] = "100"; |
|
308 options['resizable'] = "yes"; |
|
309 options['minimizable'] = "yes"; |
|
310 options['maximizable'] = "yes"; |
|
311 options['close'] = "yes"; |
|
312 options['movable'] = "yes"; |
|
313 options['statusbar'] = "yes"; |
|
314 options['scrollbars'] = "auto"; |
|
315 options['modal'] = "no"; |
|
316 |
|
317 if (opts == "") |
|
318 return options; |
|
319 |
|
320 for (var i=0; i<optionChunks.length; i++) { |
|
321 var parts = optionChunks[i].split('='); |
|
322 |
|
323 if (parts.length == 2) |
|
324 options[parts[0]] = parts[1]; |
|
325 } |
|
326 |
|
327 options['left'] = parseInt(options['left']); |
|
328 options['top'] = parseInt(options['top']); |
|
329 options['width'] = parseInt(options['width']); |
|
330 options['height'] = parseInt(options['height']); |
|
331 options['minWidth'] = parseInt(options['minwidth']); |
|
332 options['minHeight'] = parseInt(options['minheight']); |
|
333 |
|
334 return options; |
|
335 }; |
|
336 |
|
337 TinyMCE_Windows.prototype.open = function(url, name, features) { |
|
338 this.lastSelectedWindow = this.selectedWindow; |
|
339 |
|
340 var win = new TinyMCE_Window(); |
|
341 var winDiv, html = "", id; |
|
342 var imgPath = this.getParam("images_path"); |
|
343 |
|
344 features = this.parseFeatures(features); |
|
345 |
|
346 // Clamp specified dimensions |
|
347 var clamp = mcWindows.clampBoxPosition( |
|
348 features['left'], features['top'], |
|
349 features['width'], features['height'], |
|
350 features['minWidth'], features['minHeight'] |
|
351 ); |
|
352 |
|
353 features['left'] = clamp[0]; |
|
354 features['top'] = clamp[1]; |
|
355 |
|
356 if (features['resizable'] == "yes") { |
|
357 features['width'] = clamp[2]; |
|
358 features['height'] = clamp[3]; |
|
359 } |
|
360 |
|
361 // Create div |
|
362 id = "mcWindow_" + name; |
|
363 win.deltaHeight = 18; |
|
364 |
|
365 if (features['statusbar'] == "yes") { |
|
366 win.deltaHeight += 13; |
|
367 |
|
368 if (this.isMSIE) |
|
369 win.deltaHeight += 1; |
|
370 } |
|
371 |
|
372 width = parseInt(features['width']); |
|
373 height = parseInt(features['height'])-win.deltaHeight; |
|
374 |
|
375 if (this.isMSIE) |
|
376 width -= 2; |
|
377 |
|
378 // Setup first part of window |
|
379 win.id = id; |
|
380 win.url = url; |
|
381 win.name = name; |
|
382 win.features = features; |
|
383 this.windows[name] = win; |
|
384 |
|
385 iframeWidth = width; |
|
386 iframeHeight = height; |
|
387 |
|
388 // Create inner content |
|
389 html += '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">'; |
|
390 html += '<html>'; |
|
391 html += '<head>'; |
|
392 html += '<title>Wrapper iframe</title>'; |
|
393 html += '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">'; |
|
394 html += '<link href="' + this.getParam("css_file") + '" rel="stylesheet" type="text/css" />'; |
|
395 html += '</head>'; |
|
396 html += '<body onload="parent.mcWindows.onLoad(\'' + name + '\');">'; |
|
397 |
|
398 html += '<div id="' + id + '_container" class="mceWindow">'; |
|
399 html += '<div id="' + id + '_head" class="mceWindowHead" onmousedown="parent.mcWindows.windows[\'' + name + '\'].focus();">'; |
|
400 html += ' <div id="' + id + '_title" class="mceWindowTitle"'; |
|
401 html += ' onselectstart="return false;" unselectable="on" style="-moz-user-select: none !important;"></div>'; |
|
402 html += ' <div class="mceWindowHeadTools">'; |
|
403 html += ' <a href="javascript:parent.mcWindows.windows[\'' + name + '\'].close();" target="_self" onmousedown="return false;" class="mceWindowClose"><img border="0" src="' + imgPath + '/window_close.gif" /></a>'; |
|
404 if (features['resizable'] == "yes" && features['maximizable'] == "yes") |
|
405 html += ' <a href="javascript:parent.mcWindows.windows[\'' + name + '\'].maximize();" target="_self" onmousedown="return false;" class="mceWindowMaximize"><img border="0" src="' + imgPath + '/window_maximize.gif" /></a>'; |
|
406 // html += ' <a href="javascript:mcWindows.windows[\'' + name + '\'].minimize();" target="_self" onmousedown="return false;" class="mceWindowMinimize"></a>'; |
|
407 html += ' </div>'; |
|
408 html += '</div><div id="' + id + '_body" class="mceWindowBody" style="width: ' + width + 'px; height: ' + height + 'px;">'; |
|
409 html += '<iframe id="' + id + '_iframe" name="' + id + '_iframe" frameborder="0" width="' + iframeWidth + '" height="' + iframeHeight + '" src="' + url + '" class="mceWindowBodyIframe" scrolling="' + features['scrollbars'] + '"></iframe></div>'; |
|
410 |
|
411 if (features['statusbar'] == "yes") { |
|
412 html += '<div id="' + id + '_statusbar" class="mceWindowStatusbar" onmousedown="parent.mcWindows.windows[\'' + name + '\'].focus();">'; |
|
413 |
|
414 if (features['resizable'] == "yes") { |
|
415 if (this.isGecko) |
|
416 html += '<div id="' + id + '_resize" class="mceWindowResize"><div style="background-image: url(\'' + imgPath + '/window_resize.gif\'); width: 12px; height: 12px;"></div></div>'; |
|
417 else |
|
418 html += '<div id="' + id + '_resize" class="mceWindowResize"><img onmousedown="parent.mcWindows.windows[\'' + name + '\'].focus();" border="0" src="' + imgPath + '/window_resize.gif" /></div>'; |
|
419 } |
|
420 |
|
421 html += '</div>'; |
|
422 } |
|
423 |
|
424 html += '</div>'; |
|
425 |
|
426 html += '</body>'; |
|
427 html += '</html>'; |
|
428 |
|
429 // Create iframe |
|
430 this.createFloatingIFrame(id, features['left'], features['top'], features['width'], features['height'], html); |
|
431 }; |
|
432 |
|
433 // Blocks the document events by placing a image over the whole document |
|
434 TinyMCE_Windows.prototype.setDocumentLock = function(state) { |
|
435 var elm = document.getElementById('mcWindowEventBlocker'); |
|
436 |
|
437 if (state) { |
|
438 if (elm == null) { |
|
439 elm = document.createElement("div"); |
|
440 |
|
441 elm.id = "mcWindowEventBlocker"; |
|
442 elm.style.position = "absolute"; |
|
443 elm.style.left = "0"; |
|
444 elm.style.top = "0"; |
|
445 |
|
446 document.body.appendChild(elm); |
|
447 } |
|
448 |
|
449 elm.style.display = "none"; |
|
450 |
|
451 var imgPath = this.getParam("images_path"); |
|
452 var width = document.body.clientWidth; |
|
453 var height = document.body.clientHeight; |
|
454 |
|
455 elm.style.width = width; |
|
456 elm.style.height = height; |
|
457 elm.innerHTML = '<img src="' + imgPath + '/spacer.gif" width="' + width + '" height="' + height + '" />'; |
|
458 |
|
459 elm.style.zIndex = mcWindows.zindex-1; |
|
460 elm.style.display = "block"; |
|
461 } else if (elm != null) { |
|
462 if (mcWindows.windows.length == 0) |
|
463 elm.parentNode.removeChild(elm); |
|
464 else |
|
465 elm.style.zIndex = mcWindows.zindex-1; |
|
466 } |
|
467 }; |
|
468 |
|
469 // Gets called when wrapper iframe is initialized |
|
470 TinyMCE_Windows.prototype.onLoad = function(name) { |
|
471 var win = mcWindows.windows[name]; |
|
472 var id = "mcWindow_" + name; |
|
473 var wrapperIframe = window.frames[id + "_iframe"].frames[0]; |
|
474 var wrapperDoc = window.frames[id + "_iframe"].document; |
|
475 var doc = window.frames[id + "_iframe"].document; |
|
476 var winDiv = document.getElementById("mcWindow_" + name + "_div"); |
|
477 var realIframe = window.frames[id + "_iframe"].frames[0]; |
|
478 |
|
479 // Set window data |
|
480 win.id = "mcWindow_" + name; |
|
481 win.winElement = winDiv; |
|
482 win.bodyElement = doc.getElementById(id + '_body'); |
|
483 win.iframeElement = doc.getElementById(id + '_iframe'); |
|
484 win.headElement = doc.getElementById(id + '_head'); |
|
485 win.titleElement = doc.getElementById(id + '_title'); |
|
486 win.resizeElement = doc.getElementById(id + '_resize'); |
|
487 win.containerElement = doc.getElementById(id + '_container'); |
|
488 win.left = win.features['left']; |
|
489 win.top = win.features['top']; |
|
490 win.frame = window.frames[id + '_iframe'].frames[0]; |
|
491 win.wrapperFrame = window.frames[id + '_iframe']; |
|
492 win.wrapperIFrameElement = document.getElementById(id + "_iframe"); |
|
493 |
|
494 // Add event handlers |
|
495 mcWindows.addEvent(win.headElement, "mousedown", mcWindows.eventDispatcher); |
|
496 |
|
497 if (win.resizeElement != null) |
|
498 mcWindows.addEvent(win.resizeElement, "mousedown", mcWindows.eventDispatcher); |
|
499 |
|
500 if (mcWindows.isMSIE) { |
|
501 mcWindows.addEvent(realIframe.document, "mousemove", mcWindows.eventDispatcher); |
|
502 mcWindows.addEvent(realIframe.document, "mouseup", mcWindows.eventDispatcher); |
|
503 } else { |
|
504 mcWindows.addEvent(realIframe, "mousemove", mcWindows.eventDispatcher); |
|
505 mcWindows.addEvent(realIframe, "mouseup", mcWindows.eventDispatcher); |
|
506 mcWindows.addEvent(realIframe, "focus", mcWindows.eventDispatcher); |
|
507 } |
|
508 |
|
509 for (var i=0; i<window.frames.length; i++) { |
|
510 if (!window.frames[i]._hasMouseHandlers) { |
|
511 if (mcWindows.isMSIE) { |
|
512 mcWindows.addEvent(window.frames[i].document, "mousemove", mcWindows.eventDispatcher); |
|
513 mcWindows.addEvent(window.frames[i].document, "mouseup", mcWindows.eventDispatcher); |
|
514 } else { |
|
515 mcWindows.addEvent(window.frames[i], "mousemove", mcWindows.eventDispatcher); |
|
516 mcWindows.addEvent(window.frames[i], "mouseup", mcWindows.eventDispatcher); |
|
517 } |
|
518 |
|
519 window.frames[i]._hasMouseHandlers = true; |
|
520 } |
|
521 } |
|
522 |
|
523 if (mcWindows.isMSIE) { |
|
524 mcWindows.addEvent(win.frame.document, "mousemove", mcWindows.eventDispatcher); |
|
525 mcWindows.addEvent(win.frame.document, "mouseup", mcWindows.eventDispatcher); |
|
526 } else { |
|
527 mcWindows.addEvent(win.frame, "mousemove", mcWindows.eventDispatcher); |
|
528 mcWindows.addEvent(win.frame, "mouseup", mcWindows.eventDispatcher); |
|
529 mcWindows.addEvent(win.frame, "focus", mcWindows.eventDispatcher); |
|
530 } |
|
531 |
|
532 // Dispatch open window event |
|
533 var func = this.getParam("on_open_window", ""); |
|
534 if (func != "") |
|
535 eval(func + "(win);"); |
|
536 |
|
537 win.focus(); |
|
538 |
|
539 if (win.features['modal'] == "yes") |
|
540 mcWindows.setDocumentLock(true); |
|
541 }; |
|
542 |
|
543 TinyMCE_Windows.prototype.createFloatingIFrame = function(id_prefix, left, top, width, height, html) { |
|
544 var iframe = document.createElement("iframe"); |
|
545 var div = document.createElement("div"), doc; |
|
546 |
|
547 width = parseInt(width); |
|
548 height = parseInt(height)+1; |
|
549 |
|
550 // Create wrapper div |
|
551 div.setAttribute("id", id_prefix + "_div"); |
|
552 div.setAttribute("width", width); |
|
553 div.setAttribute("height", (height)); |
|
554 div.style.position = "absolute"; |
|
555 |
|
556 div.style.left = left + "px"; |
|
557 div.style.top = top + "px"; |
|
558 div.style.width = width + "px"; |
|
559 div.style.height = (height) + "px"; |
|
560 div.style.backgroundColor = "white"; |
|
561 div.style.display = "none"; |
|
562 |
|
563 if (this.isGecko) { |
|
564 iframeWidth = width + 2; |
|
565 iframeHeight = height + 2; |
|
566 } else { |
|
567 iframeWidth = width; |
|
568 iframeHeight = height + 1; |
|
569 } |
|
570 |
|
571 // Create iframe |
|
572 iframe.setAttribute("id", id_prefix + "_iframe"); |
|
573 iframe.setAttribute("name", id_prefix + "_iframe"); |
|
574 iframe.setAttribute("border", "0"); |
|
575 iframe.setAttribute("frameBorder", "0"); |
|
576 iframe.setAttribute("marginWidth", "0"); |
|
577 iframe.setAttribute("marginHeight", "0"); |
|
578 iframe.setAttribute("leftMargin", "0"); |
|
579 iframe.setAttribute("topMargin", "0"); |
|
580 iframe.setAttribute("width", iframeWidth); |
|
581 iframe.setAttribute("height", iframeHeight); |
|
582 // iframe.setAttribute("src", "../jscripts/tiny_mce/blank.htm"); |
|
583 // iframe.setAttribute("allowtransparency", "false"); |
|
584 iframe.setAttribute("scrolling", "no"); |
|
585 iframe.style.width = iframeWidth + "px"; |
|
586 iframe.style.height = iframeHeight + "px"; |
|
587 iframe.style.backgroundColor = "white"; |
|
588 div.appendChild(iframe); |
|
589 |
|
590 document.body.appendChild(div); |
|
591 |
|
592 // Fixed MSIE 5.0 issue |
|
593 div.innerHTML = div.innerHTML; |
|
594 |
|
595 if (this.isSafari) { |
|
596 // Give Safari some time to setup |
|
597 window.setTimeout(function() { |
|
598 var doc = window.frames[id_prefix + '_iframe'].document; |
|
599 doc.open(); |
|
600 doc.write(html); |
|
601 doc.close(); |
|
602 }, 10); |
|
603 } else { |
|
604 doc = window.frames[id_prefix + '_iframe'].window.document; |
|
605 doc.open(); |
|
606 doc.write(html); |
|
607 doc.close(); |
|
608 } |
|
609 |
|
610 div.style.display = "block"; |
|
611 |
|
612 return div; |
|
613 }; |
|
614 |
|
615 // Window instance |
|
616 function TinyMCE_Window() { |
|
617 }; |
|
618 |
|
619 TinyMCE_Window.prototype.focus = function() { |
|
620 if (this != mcWindows.selectedWindow) { |
|
621 this.winElement.style.zIndex = ++mcWindows.zindex; |
|
622 mcWindows.lastSelectedWindow = mcWindows.selectedWindow; |
|
623 mcWindows.selectedWindow = this; |
|
624 } |
|
625 }; |
|
626 |
|
627 TinyMCE_Window.prototype.minimize = function() { |
|
628 }; |
|
629 |
|
630 TinyMCE_Window.prototype.maximize = function() { |
|
631 if (this.restoreSize) { |
|
632 this.moveTo(this.restoreSize[0], this.restoreSize[1]); |
|
633 this.resizeTo(this.restoreSize[2], this.restoreSize[3]); |
|
634 this.updateClamping(); |
|
635 this.restoreSize = null; |
|
636 } else { |
|
637 var bounds = mcWindows.getBounds(); |
|
638 this.restoreSize = [ |
|
639 this.left, this.top, |
|
640 this.winElement.scrollWidth, |
|
641 this.winElement.scrollHeight |
|
642 ]; |
|
643 this.moveTo(bounds[0], bounds[1]); |
|
644 this.resizeTo( |
|
645 bounds[2] - bounds[0], |
|
646 bounds[3] - bounds[1] |
|
647 ); |
|
648 } |
|
649 }; |
|
650 |
|
651 TinyMCE_Window.prototype.startResize = function() { |
|
652 mcWindows.action = "resize"; |
|
653 }; |
|
654 |
|
655 TinyMCE_Window.prototype.startMove = function(e) { |
|
656 mcWindows.action = "move"; |
|
657 }; |
|
658 |
|
659 TinyMCE_Window.prototype.close = function() { |
|
660 if (this.frame && this.frame['tinyMCEPopup']) |
|
661 this.frame['tinyMCEPopup'].restoreSelection(); |
|
662 |
|
663 if (mcWindows.lastSelectedWindow != null) |
|
664 mcWindows.lastSelectedWindow.focus(); |
|
665 |
|
666 var mcWindowsNew = new Array(); |
|
667 for (var n in mcWindows.windows) { |
|
668 var win = mcWindows.windows[n]; |
|
669 if (typeof(win) == 'function') |
|
670 continue; |
|
671 |
|
672 if (win.name != this.name) |
|
673 mcWindowsNew[n] = win; |
|
674 } |
|
675 |
|
676 mcWindows.windows = mcWindowsNew; |
|
677 |
|
678 // alert(mcWindows.doc.getElementById(this.id + "_iframe")); |
|
679 |
|
680 var e = mcWindows.doc.getElementById(this.id + "_iframe"); |
|
681 e.parentNode.removeChild(e); |
|
682 |
|
683 var e = mcWindows.doc.getElementById(this.id + "_div"); |
|
684 e.parentNode.removeChild(e); |
|
685 |
|
686 mcWindows.setDocumentLock(false); |
|
687 }; |
|
688 |
|
689 TinyMCE_Window.prototype.onMouseMove = function(e) { |
|
690 var clamp; |
|
691 // Calculate real X, Y |
|
692 var dx = e.screenX - mcWindows.mouseDownScreenX; |
|
693 var dy = e.screenY - mcWindows.mouseDownScreenY; |
|
694 |
|
695 switch (mcWindows.action) { |
|
696 case "resize": |
|
697 clamp = mcWindows.clampBoxSize( |
|
698 this.left, this.top, |
|
699 mcWindows.mouseDownWidth + (e.screenX - mcWindows.mouseDownScreenX), |
|
700 mcWindows.mouseDownHeight + (e.screenY - mcWindows.mouseDownScreenY), |
|
701 this.features.minWidth, this.features.minHeight |
|
702 ); |
|
703 |
|
704 this.resizeTo(clamp[2], clamp[3]); |
|
705 |
|
706 mcWindows.cancelEvent(e); |
|
707 break; |
|
708 |
|
709 case "move": |
|
710 this.left = mcWindows.mouseDownLayerX + (e.screenX - mcWindows.mouseDownScreenX); |
|
711 this.top = mcWindows.mouseDownLayerY + (e.screenY - mcWindows.mouseDownScreenY); |
|
712 this.updateClamping(); |
|
713 |
|
714 mcWindows.cancelEvent(e); |
|
715 break; |
|
716 } |
|
717 }; |
|
718 |
|
719 TinyMCE_Window.prototype.moveTo = function (x, y) { |
|
720 this.left = x; |
|
721 this.top = y; |
|
722 |
|
723 this.winElement.style.left = this.left + "px"; |
|
724 this.winElement.style.top = this.top + "px"; |
|
725 }; |
|
726 |
|
727 TinyMCE_Window.prototype.resizeTo = function (width, height) { |
|
728 this.wrapperIFrameElement.style.width = (width+2) + 'px'; |
|
729 this.wrapperIFrameElement.style.height = (height+2) + 'px'; |
|
730 this.wrapperIFrameElement.width = width+2; |
|
731 this.wrapperIFrameElement.height = height+2; |
|
732 this.winElement.style.width = width + 'px'; |
|
733 this.winElement.style.height = height + 'px'; |
|
734 |
|
735 height = height - this.deltaHeight; |
|
736 |
|
737 this.containerElement.style.width = width + 'px'; |
|
738 this.iframeElement.style.width = width + 'px'; |
|
739 this.iframeElement.style.height = height + 'px'; |
|
740 this.bodyElement.style.width = width + 'px'; |
|
741 this.bodyElement.style.height = height + 'px'; |
|
742 this.headElement.style.width = width + 'px'; |
|
743 //this.statusElement.style.width = width + 'px'; |
|
744 }; |
|
745 |
|
746 TinyMCE_Window.prototype.updateClamping = function () { |
|
747 var clamp, oversize; |
|
748 |
|
749 clamp = mcWindows.clampBoxPosition( |
|
750 this.left, this.top, |
|
751 this.winElement.scrollWidth, |
|
752 this.winElement.scrollHeight, |
|
753 this.features.minWidth, this.features.minHeight |
|
754 ); |
|
755 oversize = ( |
|
756 clamp[2] != this.winElement.scrollWidth || |
|
757 clamp[3] != this.winElement.scrollHeight |
|
758 ) ? true : false; |
|
759 |
|
760 this.moveTo(clamp[0], clamp[1]); |
|
761 if (this.features.resizable == "yes" && oversize) |
|
762 this.resizeTo(clamp[2], clamp[3]); |
|
763 }; |
|
764 |
|
765 function debug(msg) { |
|
766 document.getElementById('debug').value += msg + "\n"; |
|
767 } |
|
768 |
|
769 TinyMCE_Window.prototype.onMouseUp = function(e) { |
|
770 mcWindows.action = "none"; |
|
771 }; |
|
772 |
|
773 TinyMCE_Window.prototype.onFocus = function(e) { |
|
774 // Gecko only handler |
|
775 var winRef = e.currentTarget; |
|
776 |
|
777 for (var n in mcWindows.windows) { |
|
778 var win = mcWindows.windows[n]; |
|
779 if (typeof(win) == 'function') |
|
780 continue; |
|
781 |
|
782 if (winRef.name == win.id + "_iframe") { |
|
783 win.focus(); |
|
784 return; |
|
785 } |
|
786 } |
|
787 }; |
|
788 |
|
789 TinyMCE_Window.prototype.onMouseDown = function(e) { |
|
790 var elm = mcWindows.isMSIE ? this.wrapperFrame.event.srcElement : e.target; |
|
791 |
|
792 mcWindows.mouseDownScreenX = e.screenX; |
|
793 mcWindows.mouseDownScreenY = e.screenY; |
|
794 mcWindows.mouseDownLayerX = this.left; |
|
795 mcWindows.mouseDownLayerY = this.top; |
|
796 mcWindows.mouseDownWidth = parseInt(this.winElement.style.width); |
|
797 mcWindows.mouseDownHeight = parseInt(this.winElement.style.height); |
|
798 |
|
799 if (this.resizeElement != null && elm == this.resizeElement.firstChild) |
|
800 this.startResize(e); |
|
801 else |
|
802 this.startMove(e); |
|
803 |
|
804 mcWindows.cancelEvent(e); |
|
805 }; |
|
806 |
|
807 // Global instance |
|
808 var mcWindows = new TinyMCE_Windows(); |
|
809 |
|
810 // Initialize windows |
|
811 mcWindows.init({ |
|
812 images_path : tinyMCE.baseURL + "/plugins/inlinepopups/images", |
|
813 css_file : tinyMCE.baseURL + "/plugins/inlinepopups/css/inlinepopup.css" |
|
814 }); |