Mercurial > hg > AnnotationManager
comparison WebContent/jscripts/tiny_mce/plugins/inlinepopups/editor_plugin_src.js @ 5:0be9d53a6967
editor for annotations
| author | dwinter |
|---|---|
| date | Tue, 13 Dec 2011 17:43:46 +0100 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 4:c32080f364c6 | 5:0be9d53a6967 |
|---|---|
| 1 /** | |
| 2 * editor_plugin_src.js | |
| 3 * | |
| 4 * Copyright 2009, Moxiecode Systems AB | |
| 5 * Released under LGPL License. | |
| 6 * | |
| 7 * License: http://tinymce.moxiecode.com/license | |
| 8 * Contributing: http://tinymce.moxiecode.com/contributing | |
| 9 */ | |
| 10 | |
| 11 (function() { | |
| 12 var DOM = tinymce.DOM, Element = tinymce.dom.Element, Event = tinymce.dom.Event, each = tinymce.each, is = tinymce.is; | |
| 13 | |
| 14 tinymce.create('tinymce.plugins.InlinePopups', { | |
| 15 init : function(ed, url) { | |
| 16 // Replace window manager | |
| 17 ed.onBeforeRenderUI.add(function() { | |
| 18 ed.windowManager = new tinymce.InlineWindowManager(ed); | |
| 19 DOM.loadCSS(url + '/skins/' + (ed.settings.inlinepopups_skin || 'clearlooks2') + "/window.css"); | |
| 20 }); | |
| 21 }, | |
| 22 | |
| 23 getInfo : function() { | |
| 24 return { | |
| 25 longname : 'InlinePopups', | |
| 26 author : 'Moxiecode Systems AB', | |
| 27 authorurl : 'http://tinymce.moxiecode.com', | |
| 28 infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/inlinepopups', | |
| 29 version : tinymce.majorVersion + "." + tinymce.minorVersion | |
| 30 }; | |
| 31 } | |
| 32 }); | |
| 33 | |
| 34 tinymce.create('tinymce.InlineWindowManager:tinymce.WindowManager', { | |
| 35 InlineWindowManager : function(ed) { | |
| 36 var t = this; | |
| 37 | |
| 38 t.parent(ed); | |
| 39 t.zIndex = 300000; | |
| 40 t.count = 0; | |
| 41 t.windows = {}; | |
| 42 }, | |
| 43 | |
| 44 open : function(f, p) { | |
| 45 var t = this, id, opt = '', ed = t.editor, dw = 0, dh = 0, vp, po, mdf, clf, we, w, u, parentWindow; | |
| 46 | |
| 47 f = f || {}; | |
| 48 p = p || {}; | |
| 49 | |
| 50 // Run native windows | |
| 51 if (!f.inline) | |
| 52 return t.parent(f, p); | |
| 53 | |
| 54 parentWindow = t._frontWindow(); | |
| 55 if (parentWindow && DOM.get(parentWindow.id + '_ifr')) { | |
| 56 parentWindow.focussedElement = DOM.get(parentWindow.id + '_ifr').contentWindow.document.activeElement; | |
| 57 } | |
| 58 | |
| 59 // Only store selection if the type is a normal window | |
| 60 if (!f.type) | |
| 61 t.bookmark = ed.selection.getBookmark(1); | |
| 62 | |
| 63 id = DOM.uniqueId(); | |
| 64 vp = DOM.getViewPort(); | |
| 65 f.width = parseInt(f.width || 320); | |
| 66 f.height = parseInt(f.height || 240) + (tinymce.isIE ? 8 : 0); | |
| 67 f.min_width = parseInt(f.min_width || 150); | |
| 68 f.min_height = parseInt(f.min_height || 100); | |
| 69 f.max_width = parseInt(f.max_width || 2000); | |
| 70 f.max_height = parseInt(f.max_height || 2000); | |
| 71 f.left = f.left || Math.round(Math.max(vp.x, vp.x + (vp.w / 2.0) - (f.width / 2.0))); | |
| 72 f.top = f.top || Math.round(Math.max(vp.y, vp.y + (vp.h / 2.0) - (f.height / 2.0))); | |
| 73 f.movable = f.resizable = true; | |
| 74 p.mce_width = f.width; | |
| 75 p.mce_height = f.height; | |
| 76 p.mce_inline = true; | |
| 77 p.mce_window_id = id; | |
| 78 p.mce_auto_focus = f.auto_focus; | |
| 79 | |
| 80 // Transpose | |
| 81 // po = DOM.getPos(ed.getContainer()); | |
| 82 // f.left -= po.x; | |
| 83 // f.top -= po.y; | |
| 84 | |
| 85 t.features = f; | |
| 86 t.params = p; | |
| 87 t.onOpen.dispatch(t, f, p); | |
| 88 | |
| 89 if (f.type) { | |
| 90 opt += ' mceModal'; | |
| 91 | |
| 92 if (f.type) | |
| 93 opt += ' mce' + f.type.substring(0, 1).toUpperCase() + f.type.substring(1); | |
| 94 | |
| 95 f.resizable = false; | |
| 96 } | |
| 97 | |
| 98 if (f.statusbar) | |
| 99 opt += ' mceStatusbar'; | |
| 100 | |
| 101 if (f.resizable) | |
| 102 opt += ' mceResizable'; | |
| 103 | |
| 104 if (f.minimizable) | |
| 105 opt += ' mceMinimizable'; | |
| 106 | |
| 107 if (f.maximizable) | |
| 108 opt += ' mceMaximizable'; | |
| 109 | |
| 110 if (f.movable) | |
| 111 opt += ' mceMovable'; | |
| 112 | |
| 113 // Create DOM objects | |
| 114 t._addAll(DOM.doc.body, | |
| 115 ['div', {id : id, role : 'dialog', 'aria-labelledby': f.type ? id + '_content' : id + '_title', 'class' : (ed.settings.inlinepopups_skin || 'clearlooks2') + (tinymce.isIE && window.getSelection ? ' ie9' : ''), style : 'width:100px;height:100px'}, | |
| 116 ['div', {id : id + '_wrapper', 'class' : 'mceWrapper' + opt}, | |
| 117 ['div', {id : id + '_top', 'class' : 'mceTop'}, | |
| 118 ['div', {'class' : 'mceLeft'}], | |
| 119 ['div', {'class' : 'mceCenter'}], | |
| 120 ['div', {'class' : 'mceRight'}], | |
| 121 ['span', {id : id + '_title'}, f.title || ''] | |
| 122 ], | |
| 123 | |
| 124 ['div', {id : id + '_middle', 'class' : 'mceMiddle'}, | |
| 125 ['div', {id : id + '_left', 'class' : 'mceLeft', tabindex : '0'}], | |
| 126 ['span', {id : id + '_content'}], | |
| 127 ['div', {id : id + '_right', 'class' : 'mceRight', tabindex : '0'}] | |
| 128 ], | |
| 129 | |
| 130 ['div', {id : id + '_bottom', 'class' : 'mceBottom'}, | |
| 131 ['div', {'class' : 'mceLeft'}], | |
| 132 ['div', {'class' : 'mceCenter'}], | |
| 133 ['div', {'class' : 'mceRight'}], | |
| 134 ['span', {id : id + '_status'}, 'Content'] | |
| 135 ], | |
| 136 | |
| 137 ['a', {'class' : 'mceMove', tabindex : '-1', href : 'javascript:;'}], | |
| 138 ['a', {'class' : 'mceMin', tabindex : '-1', href : 'javascript:;', onmousedown : 'return false;'}], | |
| 139 ['a', {'class' : 'mceMax', tabindex : '-1', href : 'javascript:;', onmousedown : 'return false;'}], | |
| 140 ['a', {'class' : 'mceMed', tabindex : '-1', href : 'javascript:;', onmousedown : 'return false;'}], | |
| 141 ['a', {'class' : 'mceClose', tabindex : '-1', href : 'javascript:;', onmousedown : 'return false;'}], | |
| 142 ['a', {id : id + '_resize_n', 'class' : 'mceResize mceResizeN', tabindex : '-1', href : 'javascript:;'}], | |
| 143 ['a', {id : id + '_resize_s', 'class' : 'mceResize mceResizeS', tabindex : '-1', href : 'javascript:;'}], | |
| 144 ['a', {id : id + '_resize_w', 'class' : 'mceResize mceResizeW', tabindex : '-1', href : 'javascript:;'}], | |
| 145 ['a', {id : id + '_resize_e', 'class' : 'mceResize mceResizeE', tabindex : '-1', href : 'javascript:;'}], | |
| 146 ['a', {id : id + '_resize_nw', 'class' : 'mceResize mceResizeNW', tabindex : '-1', href : 'javascript:;'}], | |
| 147 ['a', {id : id + '_resize_ne', 'class' : 'mceResize mceResizeNE', tabindex : '-1', href : 'javascript:;'}], | |
| 148 ['a', {id : id + '_resize_sw', 'class' : 'mceResize mceResizeSW', tabindex : '-1', href : 'javascript:;'}], | |
| 149 ['a', {id : id + '_resize_se', 'class' : 'mceResize mceResizeSE', tabindex : '-1', href : 'javascript:;'}] | |
| 150 ] | |
| 151 ] | |
| 152 ); | |
| 153 | |
| 154 DOM.setStyles(id, {top : -10000, left : -10000}); | |
| 155 | |
| 156 // Fix gecko rendering bug, where the editors iframe messed with window contents | |
| 157 if (tinymce.isGecko) | |
| 158 DOM.setStyle(id, 'overflow', 'auto'); | |
| 159 | |
| 160 // Measure borders | |
| 161 if (!f.type) { | |
| 162 dw += DOM.get(id + '_left').clientWidth; | |
| 163 dw += DOM.get(id + '_right').clientWidth; | |
| 164 dh += DOM.get(id + '_top').clientHeight; | |
| 165 dh += DOM.get(id + '_bottom').clientHeight; | |
| 166 } | |
| 167 | |
| 168 // Resize window | |
| 169 DOM.setStyles(id, {top : f.top, left : f.left, width : f.width + dw, height : f.height + dh}); | |
| 170 | |
| 171 u = f.url || f.file; | |
| 172 if (u) { | |
| 173 if (tinymce.relaxedDomain) | |
| 174 u += (u.indexOf('?') == -1 ? '?' : '&') + 'mce_rdomain=' + tinymce.relaxedDomain; | |
| 175 | |
| 176 u = tinymce._addVer(u); | |
| 177 } | |
| 178 | |
| 179 if (!f.type) { | |
| 180 DOM.add(id + '_content', 'iframe', {id : id + '_ifr', src : 'javascript:""', frameBorder : 0, style : 'border:0;width:10px;height:10px'}); | |
| 181 DOM.setStyles(id + '_ifr', {width : f.width, height : f.height}); | |
| 182 DOM.setAttrib(id + '_ifr', 'src', u); | |
| 183 } else { | |
| 184 DOM.add(id + '_wrapper', 'a', {id : id + '_ok', 'class' : 'mceButton mceOk', href : 'javascript:;', onmousedown : 'return false;'}, 'Ok'); | |
| 185 | |
| 186 if (f.type == 'confirm') | |
| 187 DOM.add(id + '_wrapper', 'a', {'class' : 'mceButton mceCancel', href : 'javascript:;', onmousedown : 'return false;'}, 'Cancel'); | |
| 188 | |
| 189 DOM.add(id + '_middle', 'div', {'class' : 'mceIcon'}); | |
| 190 DOM.setHTML(id + '_content', f.content.replace('\n', '<br />')); | |
| 191 | |
| 192 Event.add(id, 'keyup', function(evt) { | |
| 193 var VK_ESCAPE = 27; | |
| 194 if (evt.keyCode === VK_ESCAPE) { | |
| 195 f.button_func(false); | |
| 196 return Event.cancel(evt); | |
| 197 } | |
| 198 }); | |
| 199 | |
| 200 Event.add(id, 'keydown', function(evt) { | |
| 201 var cancelButton, VK_TAB = 9; | |
| 202 if (evt.keyCode === VK_TAB) { | |
| 203 cancelButton = DOM.select('a.mceCancel', id + '_wrapper')[0]; | |
| 204 if (cancelButton && cancelButton !== evt.target) { | |
| 205 cancelButton.focus(); | |
| 206 } else { | |
| 207 DOM.get(id + '_ok').focus(); | |
| 208 } | |
| 209 return Event.cancel(evt); | |
| 210 } | |
| 211 }); | |
| 212 } | |
| 213 | |
| 214 // Register events | |
| 215 mdf = Event.add(id, 'mousedown', function(e) { | |
| 216 var n = e.target, w, vp; | |
| 217 | |
| 218 w = t.windows[id]; | |
| 219 t.focus(id); | |
| 220 | |
| 221 if (n.nodeName == 'A' || n.nodeName == 'a') { | |
| 222 if (n.className == 'mceClose') { | |
| 223 t.close(null, id); | |
| 224 return Event.cancel(e); | |
| 225 } else if (n.className == 'mceMax') { | |
| 226 w.oldPos = w.element.getXY(); | |
| 227 w.oldSize = w.element.getSize(); | |
| 228 | |
| 229 vp = DOM.getViewPort(); | |
| 230 | |
| 231 // Reduce viewport size to avoid scrollbars | |
| 232 vp.w -= 2; | |
| 233 vp.h -= 2; | |
| 234 | |
| 235 w.element.moveTo(vp.x, vp.y); | |
| 236 w.element.resizeTo(vp.w, vp.h); | |
| 237 DOM.setStyles(id + '_ifr', {width : vp.w - w.deltaWidth, height : vp.h - w.deltaHeight}); | |
| 238 DOM.addClass(id + '_wrapper', 'mceMaximized'); | |
| 239 } else if (n.className == 'mceMed') { | |
| 240 // Reset to old size | |
| 241 w.element.moveTo(w.oldPos.x, w.oldPos.y); | |
| 242 w.element.resizeTo(w.oldSize.w, w.oldSize.h); | |
| 243 w.iframeElement.resizeTo(w.oldSize.w - w.deltaWidth, w.oldSize.h - w.deltaHeight); | |
| 244 | |
| 245 DOM.removeClass(id + '_wrapper', 'mceMaximized'); | |
| 246 } else if (n.className == 'mceMove') | |
| 247 return t._startDrag(id, e, n.className); | |
| 248 else if (DOM.hasClass(n, 'mceResize')) | |
| 249 return t._startDrag(id, e, n.className.substring(13)); | |
| 250 } | |
| 251 }); | |
| 252 | |
| 253 clf = Event.add(id, 'click', function(e) { | |
| 254 var n = e.target; | |
| 255 | |
| 256 t.focus(id); | |
| 257 | |
| 258 if (n.nodeName == 'A' || n.nodeName == 'a') { | |
| 259 switch (n.className) { | |
| 260 case 'mceClose': | |
| 261 t.close(null, id); | |
| 262 return Event.cancel(e); | |
| 263 | |
| 264 case 'mceButton mceOk': | |
| 265 case 'mceButton mceCancel': | |
| 266 f.button_func(n.className == 'mceButton mceOk'); | |
| 267 return Event.cancel(e); | |
| 268 } | |
| 269 } | |
| 270 }); | |
| 271 | |
| 272 // Make sure the tab order loops within the dialog. | |
| 273 Event.add([id + '_left', id + '_right'], 'focus', function(evt) { | |
| 274 var iframe = DOM.get(id + '_ifr'); | |
| 275 if (iframe) { | |
| 276 var body = iframe.contentWindow.document.body; | |
| 277 var focusable = DOM.select(':input:enabled,*[tabindex=0]', body); | |
| 278 if (evt.target.id === (id + '_left')) { | |
| 279 focusable[focusable.length - 1].focus(); | |
| 280 } else { | |
| 281 focusable[0].focus(); | |
| 282 } | |
| 283 } else { | |
| 284 DOM.get(id + '_ok').focus(); | |
| 285 } | |
| 286 }); | |
| 287 | |
| 288 // Add window | |
| 289 w = t.windows[id] = { | |
| 290 id : id, | |
| 291 mousedown_func : mdf, | |
| 292 click_func : clf, | |
| 293 element : new Element(id, {blocker : 1, container : ed.getContainer()}), | |
| 294 iframeElement : new Element(id + '_ifr'), | |
| 295 features : f, | |
| 296 deltaWidth : dw, | |
| 297 deltaHeight : dh | |
| 298 }; | |
| 299 | |
| 300 w.iframeElement.on('focus', function() { | |
| 301 t.focus(id); | |
| 302 }); | |
| 303 | |
| 304 // Setup blocker | |
| 305 if (t.count == 0 && t.editor.getParam('dialog_type', 'modal') == 'modal') { | |
| 306 DOM.add(DOM.doc.body, 'div', { | |
| 307 id : 'mceModalBlocker', | |
| 308 'class' : (t.editor.settings.inlinepopups_skin || 'clearlooks2') + '_modalBlocker', | |
| 309 style : {zIndex : t.zIndex - 1} | |
| 310 }); | |
| 311 | |
| 312 DOM.show('mceModalBlocker'); // Reduces flicker in IE | |
| 313 DOM.setAttrib(DOM.doc.body, 'aria-hidden', 'true'); | |
| 314 } else | |
| 315 DOM.setStyle('mceModalBlocker', 'z-index', t.zIndex - 1); | |
| 316 | |
| 317 if (tinymce.isIE6 || /Firefox\/2\./.test(navigator.userAgent) || (tinymce.isIE && !DOM.boxModel)) | |
| 318 DOM.setStyles('mceModalBlocker', {position : 'absolute', left : vp.x, top : vp.y, width : vp.w - 2, height : vp.h - 2}); | |
| 319 | |
| 320 DOM.setAttrib(id, 'aria-hidden', 'false'); | |
| 321 t.focus(id); | |
| 322 t._fixIELayout(id, 1); | |
| 323 | |
| 324 // Focus ok button | |
| 325 if (DOM.get(id + '_ok')) | |
| 326 DOM.get(id + '_ok').focus(); | |
| 327 t.count++; | |
| 328 | |
| 329 return w; | |
| 330 }, | |
| 331 | |
| 332 focus : function(id) { | |
| 333 var t = this, w; | |
| 334 | |
| 335 if (w = t.windows[id]) { | |
| 336 w.zIndex = this.zIndex++; | |
| 337 w.element.setStyle('zIndex', w.zIndex); | |
| 338 w.element.update(); | |
| 339 | |
| 340 id = id + '_wrapper'; | |
| 341 DOM.removeClass(t.lastId, 'mceFocus'); | |
| 342 DOM.addClass(id, 'mceFocus'); | |
| 343 t.lastId = id; | |
| 344 | |
| 345 if (w.focussedElement) { | |
| 346 w.focussedElement.focus(); | |
| 347 } else if (DOM.get(id + '_ok')) { | |
| 348 DOM.get(w.id + '_ok').focus(); | |
| 349 } else if (DOM.get(w.id + '_ifr')) { | |
| 350 DOM.get(w.id + '_ifr').focus(); | |
| 351 } | |
| 352 } | |
| 353 }, | |
| 354 | |
| 355 _addAll : function(te, ne) { | |
| 356 var i, n, t = this, dom = tinymce.DOM; | |
| 357 | |
| 358 if (is(ne, 'string')) | |
| 359 te.appendChild(dom.doc.createTextNode(ne)); | |
| 360 else if (ne.length) { | |
| 361 te = te.appendChild(dom.create(ne[0], ne[1])); | |
| 362 | |
| 363 for (i=2; i<ne.length; i++) | |
| 364 t._addAll(te, ne[i]); | |
| 365 } | |
| 366 }, | |
| 367 | |
| 368 _startDrag : function(id, se, ac) { | |
| 369 var t = this, mu, mm, d = DOM.doc, eb, w = t.windows[id], we = w.element, sp = we.getXY(), p, sz, ph, cp, vp, sx, sy, sex, sey, dx, dy, dw, dh; | |
| 370 | |
| 371 // Get positons and sizes | |
| 372 // cp = DOM.getPos(t.editor.getContainer()); | |
| 373 cp = {x : 0, y : 0}; | |
| 374 vp = DOM.getViewPort(); | |
| 375 | |
| 376 // Reduce viewport size to avoid scrollbars while dragging | |
| 377 vp.w -= 2; | |
| 378 vp.h -= 2; | |
| 379 | |
| 380 sex = se.screenX; | |
| 381 sey = se.screenY; | |
| 382 dx = dy = dw = dh = 0; | |
| 383 | |
| 384 // Handle mouse up | |
| 385 mu = Event.add(d, 'mouseup', function(e) { | |
| 386 Event.remove(d, 'mouseup', mu); | |
| 387 Event.remove(d, 'mousemove', mm); | |
| 388 | |
| 389 if (eb) | |
| 390 eb.remove(); | |
| 391 | |
| 392 we.moveBy(dx, dy); | |
| 393 we.resizeBy(dw, dh); | |
| 394 sz = we.getSize(); | |
| 395 DOM.setStyles(id + '_ifr', {width : sz.w - w.deltaWidth, height : sz.h - w.deltaHeight}); | |
| 396 t._fixIELayout(id, 1); | |
| 397 | |
| 398 return Event.cancel(e); | |
| 399 }); | |
| 400 | |
| 401 if (ac != 'Move') | |
| 402 startMove(); | |
| 403 | |
| 404 function startMove() { | |
| 405 if (eb) | |
| 406 return; | |
| 407 | |
| 408 t._fixIELayout(id, 0); | |
| 409 | |
| 410 // Setup event blocker | |
| 411 DOM.add(d.body, 'div', { | |
| 412 id : 'mceEventBlocker', | |
| 413 'class' : 'mceEventBlocker ' + (t.editor.settings.inlinepopups_skin || 'clearlooks2'), | |
| 414 style : {zIndex : t.zIndex + 1} | |
| 415 }); | |
| 416 | |
| 417 if (tinymce.isIE6 || (tinymce.isIE && !DOM.boxModel)) | |
| 418 DOM.setStyles('mceEventBlocker', {position : 'absolute', left : vp.x, top : vp.y, width : vp.w - 2, height : vp.h - 2}); | |
| 419 | |
| 420 eb = new Element('mceEventBlocker'); | |
| 421 eb.update(); | |
| 422 | |
| 423 // Setup placeholder | |
| 424 p = we.getXY(); | |
| 425 sz = we.getSize(); | |
| 426 sx = cp.x + p.x - vp.x; | |
| 427 sy = cp.y + p.y - vp.y; | |
| 428 DOM.add(eb.get(), 'div', {id : 'mcePlaceHolder', 'class' : 'mcePlaceHolder', style : {left : sx, top : sy, width : sz.w, height : sz.h}}); | |
| 429 ph = new Element('mcePlaceHolder'); | |
| 430 }; | |
| 431 | |
| 432 // Handle mouse move/drag | |
| 433 mm = Event.add(d, 'mousemove', function(e) { | |
| 434 var x, y, v; | |
| 435 | |
| 436 startMove(); | |
| 437 | |
| 438 x = e.screenX - sex; | |
| 439 y = e.screenY - sey; | |
| 440 | |
| 441 switch (ac) { | |
| 442 case 'ResizeW': | |
| 443 dx = x; | |
| 444 dw = 0 - x; | |
| 445 break; | |
| 446 | |
| 447 case 'ResizeE': | |
| 448 dw = x; | |
| 449 break; | |
| 450 | |
| 451 case 'ResizeN': | |
| 452 case 'ResizeNW': | |
| 453 case 'ResizeNE': | |
| 454 if (ac == "ResizeNW") { | |
| 455 dx = x; | |
| 456 dw = 0 - x; | |
| 457 } else if (ac == "ResizeNE") | |
| 458 dw = x; | |
| 459 | |
| 460 dy = y; | |
| 461 dh = 0 - y; | |
| 462 break; | |
| 463 | |
| 464 case 'ResizeS': | |
| 465 case 'ResizeSW': | |
| 466 case 'ResizeSE': | |
| 467 if (ac == "ResizeSW") { | |
| 468 dx = x; | |
| 469 dw = 0 - x; | |
| 470 } else if (ac == "ResizeSE") | |
| 471 dw = x; | |
| 472 | |
| 473 dh = y; | |
| 474 break; | |
| 475 | |
| 476 case 'mceMove': | |
| 477 dx = x; | |
| 478 dy = y; | |
| 479 break; | |
| 480 } | |
| 481 | |
| 482 // Boundary check | |
| 483 if (dw < (v = w.features.min_width - sz.w)) { | |
| 484 if (dx !== 0) | |
| 485 dx += dw - v; | |
| 486 | |
| 487 dw = v; | |
| 488 } | |
| 489 | |
| 490 if (dh < (v = w.features.min_height - sz.h)) { | |
| 491 if (dy !== 0) | |
| 492 dy += dh - v; | |
| 493 | |
| 494 dh = v; | |
| 495 } | |
| 496 | |
| 497 dw = Math.min(dw, w.features.max_width - sz.w); | |
| 498 dh = Math.min(dh, w.features.max_height - sz.h); | |
| 499 dx = Math.max(dx, vp.x - (sx + vp.x)); | |
| 500 dy = Math.max(dy, vp.y - (sy + vp.y)); | |
| 501 dx = Math.min(dx, (vp.w + vp.x) - (sx + sz.w + vp.x)); | |
| 502 dy = Math.min(dy, (vp.h + vp.y) - (sy + sz.h + vp.y)); | |
| 503 | |
| 504 // Move if needed | |
| 505 if (dx + dy !== 0) { | |
| 506 if (sx + dx < 0) | |
| 507 dx = 0; | |
| 508 | |
| 509 if (sy + dy < 0) | |
| 510 dy = 0; | |
| 511 | |
| 512 ph.moveTo(sx + dx, sy + dy); | |
| 513 } | |
| 514 | |
| 515 // Resize if needed | |
| 516 if (dw + dh !== 0) | |
| 517 ph.resizeTo(sz.w + dw, sz.h + dh); | |
| 518 | |
| 519 return Event.cancel(e); | |
| 520 }); | |
| 521 | |
| 522 return Event.cancel(se); | |
| 523 }, | |
| 524 | |
| 525 resizeBy : function(dw, dh, id) { | |
| 526 var w = this.windows[id]; | |
| 527 | |
| 528 if (w) { | |
| 529 w.element.resizeBy(dw, dh); | |
| 530 w.iframeElement.resizeBy(dw, dh); | |
| 531 } | |
| 532 }, | |
| 533 | |
| 534 close : function(win, id) { | |
| 535 var t = this, w, d = DOM.doc, fw, id; | |
| 536 | |
| 537 id = t._findId(id || win); | |
| 538 | |
| 539 // Probably not inline | |
| 540 if (!t.windows[id]) { | |
| 541 t.parent(win); | |
| 542 return; | |
| 543 } | |
| 544 | |
| 545 t.count--; | |
| 546 | |
| 547 if (t.count == 0) { | |
| 548 DOM.remove('mceModalBlocker'); | |
| 549 DOM.setAttrib(DOM.doc.body, 'aria-hidden', 'false'); | |
| 550 t.editor.focus(); | |
| 551 } | |
| 552 | |
| 553 if (w = t.windows[id]) { | |
| 554 t.onClose.dispatch(t); | |
| 555 Event.remove(d, 'mousedown', w.mousedownFunc); | |
| 556 Event.remove(d, 'click', w.clickFunc); | |
| 557 Event.clear(id); | |
| 558 Event.clear(id + '_ifr'); | |
| 559 | |
| 560 DOM.setAttrib(id + '_ifr', 'src', 'javascript:""'); // Prevent leak | |
| 561 w.element.remove(); | |
| 562 delete t.windows[id]; | |
| 563 | |
| 564 fw = t._frontWindow(); | |
| 565 | |
| 566 if (fw) | |
| 567 t.focus(fw.id); | |
| 568 } | |
| 569 }, | |
| 570 | |
| 571 // Find front most window | |
| 572 _frontWindow : function() { | |
| 573 var fw, ix = 0; | |
| 574 // Find front most window and focus that | |
| 575 each (this.windows, function(w) { | |
| 576 if (w.zIndex > ix) { | |
| 577 fw = w; | |
| 578 ix = w.zIndex; | |
| 579 } | |
| 580 }); | |
| 581 return fw; | |
| 582 }, | |
| 583 | |
| 584 setTitle : function(w, ti) { | |
| 585 var e; | |
| 586 | |
| 587 w = this._findId(w); | |
| 588 | |
| 589 if (e = DOM.get(w + '_title')) | |
| 590 e.innerHTML = DOM.encode(ti); | |
| 591 }, | |
| 592 | |
| 593 alert : function(txt, cb, s) { | |
| 594 var t = this, w; | |
| 595 | |
| 596 w = t.open({ | |
| 597 title : t, | |
| 598 type : 'alert', | |
| 599 button_func : function(s) { | |
| 600 if (cb) | |
| 601 cb.call(s || t, s); | |
| 602 | |
| 603 t.close(null, w.id); | |
| 604 }, | |
| 605 content : DOM.encode(t.editor.getLang(txt, txt)), | |
| 606 inline : 1, | |
| 607 width : 400, | |
| 608 height : 130 | |
| 609 }); | |
| 610 }, | |
| 611 | |
| 612 confirm : function(txt, cb, s) { | |
| 613 var t = this, w; | |
| 614 | |
| 615 w = t.open({ | |
| 616 title : t, | |
| 617 type : 'confirm', | |
| 618 button_func : function(s) { | |
| 619 if (cb) | |
| 620 cb.call(s || t, s); | |
| 621 | |
| 622 t.close(null, w.id); | |
| 623 }, | |
| 624 content : DOM.encode(t.editor.getLang(txt, txt)), | |
| 625 inline : 1, | |
| 626 width : 400, | |
| 627 height : 130 | |
| 628 }); | |
| 629 }, | |
| 630 | |
| 631 // Internal functions | |
| 632 | |
| 633 _findId : function(w) { | |
| 634 var t = this; | |
| 635 | |
| 636 if (typeof(w) == 'string') | |
| 637 return w; | |
| 638 | |
| 639 each(t.windows, function(wo) { | |
| 640 var ifr = DOM.get(wo.id + '_ifr'); | |
| 641 | |
| 642 if (ifr && w == ifr.contentWindow) { | |
| 643 w = wo.id; | |
| 644 return false; | |
| 645 } | |
| 646 }); | |
| 647 | |
| 648 return w; | |
| 649 }, | |
| 650 | |
| 651 _fixIELayout : function(id, s) { | |
| 652 var w, img; | |
| 653 | |
| 654 if (!tinymce.isIE6) | |
| 655 return; | |
| 656 | |
| 657 // Fixes the bug where hover flickers and does odd things in IE6 | |
| 658 each(['n','s','w','e','nw','ne','sw','se'], function(v) { | |
| 659 var e = DOM.get(id + '_resize_' + v); | |
| 660 | |
| 661 DOM.setStyles(e, { | |
| 662 width : s ? e.clientWidth : '', | |
| 663 height : s ? e.clientHeight : '', | |
| 664 cursor : DOM.getStyle(e, 'cursor', 1) | |
| 665 }); | |
| 666 | |
| 667 DOM.setStyle(id + "_bottom", 'bottom', '-1px'); | |
| 668 | |
| 669 e = 0; | |
| 670 }); | |
| 671 | |
| 672 // Fixes graphics glitch | |
| 673 if (w = this.windows[id]) { | |
| 674 // Fixes rendering bug after resize | |
| 675 w.element.hide(); | |
| 676 w.element.show(); | |
| 677 | |
| 678 // Forced a repaint of the window | |
| 679 //DOM.get(id).style.filter = ''; | |
| 680 | |
| 681 // IE has a bug where images used in CSS won't get loaded | |
| 682 // sometimes when the cache in the browser is disabled | |
| 683 // This fix tries to solve it by loading the images using the image object | |
| 684 each(DOM.select('div,a', id), function(e, i) { | |
| 685 if (e.currentStyle.backgroundImage != 'none') { | |
| 686 img = new Image(); | |
| 687 img.src = e.currentStyle.backgroundImage.replace(/url\(\"(.+)\"\)/, '$1'); | |
| 688 } | |
| 689 }); | |
| 690 | |
| 691 DOM.get(id).style.filter = ''; | |
| 692 } | |
| 693 } | |
| 694 }); | |
| 695 | |
| 696 // Register plugin | |
| 697 tinymce.PluginManager.add('inlinepopups', tinymce.plugins.InlinePopups); | |
| 698 })(); | |
| 699 |
