1 | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
---|
2 | <!--
|
---|
3 | * FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
---|
4 | * Copyright (C) 2003-2009 Frederico Caldeira Knabben
|
---|
5 | *
|
---|
6 | * == BEGIN LICENSE ==
|
---|
7 | *
|
---|
8 | * Licensed under the terms of any of the following licenses at your
|
---|
9 | * choice:
|
---|
10 | *
|
---|
11 | * - GNU General Public License Version 2 or later (the "GPL")
|
---|
12 | * http://www.gnu.org/licenses/gpl.html
|
---|
13 | *
|
---|
14 | * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
---|
15 | * http://www.gnu.org/licenses/lgpl.html
|
---|
16 | *
|
---|
17 | * - Mozilla Public License Version 1.1 or later (the "MPL")
|
---|
18 | * http://www.mozilla.org/MPL/MPL-1.1.html
|
---|
19 | *
|
---|
20 | * == END LICENSE ==
|
---|
21 | *
|
---|
22 | * This page is used by all dialog box as the container.
|
---|
23 | -->
|
---|
24 | <html xmlns="http://www.w3.org/1999/xhtml">
|
---|
25 | <head>
|
---|
26 | <title></title>
|
---|
27 | <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
---|
28 | <meta name="robots" content="noindex, nofollow" />
|
---|
29 | <script type="text/javascript">
|
---|
30 | // <![CDATA[
|
---|
31 |
|
---|
32 | // Domain relaxation logic.
|
---|
33 | (function()
|
---|
34 | {
|
---|
35 | var d = document.domain ;
|
---|
36 |
|
---|
37 | while ( true )
|
---|
38 | {
|
---|
39 | // Test if we can access a parent property.
|
---|
40 | try
|
---|
41 | {
|
---|
42 | var parentDomain = ( Args().TopWindow || E ).document.domain ;
|
---|
43 |
|
---|
44 | if ( document.domain != parentDomain )
|
---|
45 | document.domain = parentDomain ;
|
---|
46 |
|
---|
47 | break ;
|
---|
48 | }
|
---|
49 | catch( e ) {}
|
---|
50 |
|
---|
51 | // Remove a domain part: www.mytest.example.com => mytest.example.com => example.com ...
|
---|
52 | d = d.replace( /.*?(?:\.|$)/, '' ) ;
|
---|
53 |
|
---|
54 | if ( d.length == 0 )
|
---|
55 | break ; // It was not able to detect the domain.
|
---|
56 |
|
---|
57 | document.domain = d ;
|
---|
58 | }
|
---|
59 | })() ;
|
---|
60 |
|
---|
61 | var E = frameElement._DialogArguments.Editor ;
|
---|
62 |
|
---|
63 | // It seems referencing to frameElement._DialogArguments directly would lead to memory leaks in IE.
|
---|
64 | // So let's use functions to access its members instead.
|
---|
65 | function Args()
|
---|
66 | {
|
---|
67 | return frameElement._DialogArguments ;
|
---|
68 | }
|
---|
69 |
|
---|
70 | function ParentDialog( dialog )
|
---|
71 | {
|
---|
72 | return dialog ? dialog._ParentDialog : frameElement._ParentDialog ;
|
---|
73 | }
|
---|
74 |
|
---|
75 | var FCK = E.FCK ;
|
---|
76 | var FCKTools = E.FCKTools ;
|
---|
77 | var FCKDomTools = E.FCKDomTools ;
|
---|
78 | var FCKDialog = E.FCKDialog ;
|
---|
79 | var FCKBrowserInfo = E.FCKBrowserInfo ;
|
---|
80 | var FCKConfig = E.FCKConfig ;
|
---|
81 |
|
---|
82 | // Steal the focus so that the caret would no longer stay in the editor iframe.
|
---|
83 | window.focus() ;
|
---|
84 |
|
---|
85 | // Sets the Skin CSS
|
---|
86 | document.write( FCKTools.GetStyleHtml( FCKConfig.SkinDialogCSS ) ) ;
|
---|
87 |
|
---|
88 | // Sets the language direction.
|
---|
89 | var langDir = E.FCKLang.Dir ;
|
---|
90 |
|
---|
91 | // For IE6-, the fck_dialog_ie6.js is loaded, used to fix limitations in the browser.
|
---|
92 | if ( FCKBrowserInfo.IsIE && !FCKBrowserInfo.IsIE7 )
|
---|
93 | document.write( '<' + 'script type="text/javascript" src="' + FCKConfig.SkinPath + 'fck_dialog_ie6.js"><' + '\/script>' ) ;
|
---|
94 |
|
---|
95 | FCKTools.RegisterDollarFunction( window ) ;
|
---|
96 |
|
---|
97 | // Resize related functions.
|
---|
98 | var Sizer = function()
|
---|
99 | {
|
---|
100 | var bAutoSize = false ;
|
---|
101 |
|
---|
102 | var retval = {
|
---|
103 | // Sets whether the dialog should auto-resize according to its content's height.
|
---|
104 | SetAutoSize : function( autoSize )
|
---|
105 | {
|
---|
106 | bAutoSize = autoSize ;
|
---|
107 | this.RefreshSize() ;
|
---|
108 | },
|
---|
109 |
|
---|
110 | // Fit the dialog container's layout to the inner iframe's external size.
|
---|
111 | RefreshContainerSize : function()
|
---|
112 | {
|
---|
113 | var frmMain = $( 'frmMain' ) ;
|
---|
114 |
|
---|
115 | if ( frmMain )
|
---|
116 | {
|
---|
117 | // Get the container size.
|
---|
118 | var height = $( 'contents' ).offsetHeight ;
|
---|
119 |
|
---|
120 | // Subtract the size of other elements.
|
---|
121 | height -= $( 'TitleArea' ).offsetHeight ;
|
---|
122 | height -= $( 'TabsRow' ).offsetHeight ;
|
---|
123 | height -= $( 'PopupButtons' ).offsetHeight ;
|
---|
124 |
|
---|
125 | frmMain.style.height = Math.max( height, 0 ) + 'px' ;
|
---|
126 | }
|
---|
127 | },
|
---|
128 |
|
---|
129 | // Resize and re-layout the dialog.
|
---|
130 | // Triggers the onresize event for the layout logic.
|
---|
131 | ResizeDialog : function( width, height )
|
---|
132 | {
|
---|
133 | FCKDomTools.SetElementStyles( window.frameElement,
|
---|
134 | {
|
---|
135 | 'width' : width + 'px',
|
---|
136 | 'height' : height + 'px'
|
---|
137 | } ) ;
|
---|
138 |
|
---|
139 | // If the skin have defined a function for resize fixes, call it now.
|
---|
140 | if ( typeof window.DoResizeFixes == 'function' )
|
---|
141 | window.DoResizeFixes() ;
|
---|
142 | },
|
---|
143 |
|
---|
144 | // if bAutoSize is true, automatically fit the dialog size and layout to
|
---|
145 | // accomodate the inner iframe's internal height.
|
---|
146 | // if bAutoSize is false, then only the layout logic for the dialog decorations
|
---|
147 | // is run to accomodate the inner iframe's external height.
|
---|
148 | RefreshSize : function()
|
---|
149 | {
|
---|
150 | if ( bAutoSize )
|
---|
151 | {
|
---|
152 | var frmMain = $( 'frmMain' ) ;
|
---|
153 | var innerDoc = frmMain.contentWindow.document ;
|
---|
154 | var isStrict = FCKTools.IsStrictMode( innerDoc ) ;
|
---|
155 |
|
---|
156 | // Get the size of the frame contents.
|
---|
157 | var innerWidth = isStrict ? innerDoc.documentElement.scrollWidth : innerDoc.body.scrollWidth ;
|
---|
158 | var innerHeight = isStrict ? innerDoc.documentElement.scrollHeight : innerDoc.body.scrollHeight ;
|
---|
159 |
|
---|
160 | // Get the current frame size.
|
---|
161 | var frameSize = FCKTools.GetViewPaneSize( frmMain.contentWindow ) ;
|
---|
162 |
|
---|
163 | var deltaWidth = innerWidth - frameSize.Width ;
|
---|
164 | var deltaHeight = innerHeight - frameSize.Height ;
|
---|
165 |
|
---|
166 | // If the contents fits the current size.
|
---|
167 | if ( deltaWidth <= 0 && deltaHeight <= 0 )
|
---|
168 | return ;
|
---|
169 |
|
---|
170 | var dialogWidth = frameElement.offsetWidth + Math.max( deltaWidth, 0 ) ;
|
---|
171 | var dialogHeight = frameElement.offsetHeight + Math.max( deltaHeight, 0 ) ;
|
---|
172 |
|
---|
173 | this.ResizeDialog( dialogWidth, dialogHeight ) ;
|
---|
174 | }
|
---|
175 | this.RefreshContainerSize() ;
|
---|
176 | }
|
---|
177 | }
|
---|
178 |
|
---|
179 | /**
|
---|
180 | * Safari seems to have a bug with the time when RefreshSize() is executed - it
|
---|
181 | * thinks frmMain's innerHeight is 0 if we query the value too soon after the
|
---|
182 | * page is loaded in some circumstances. (#1316)
|
---|
183 | * TODO : Maybe this is not needed anymore after #35.
|
---|
184 | */
|
---|
185 | if ( FCKBrowserInfo.IsSafari )
|
---|
186 | {
|
---|
187 | var originalRefreshSize = retval.RefreshSize ;
|
---|
188 |
|
---|
189 | retval.RefreshSize = function()
|
---|
190 | {
|
---|
191 | FCKTools.SetTimeout( originalRefreshSize, 1, retval ) ;
|
---|
192 | }
|
---|
193 | }
|
---|
194 |
|
---|
195 | /**
|
---|
196 | * IE6 has a similar bug where it sometimes thinks $('contents') has an
|
---|
197 | * offsetHeight of 0 (#2114).
|
---|
198 | */
|
---|
199 | if ( FCKBrowserInfo.IsIE && !FCKBrowserInfo.IsIE7 )
|
---|
200 | {
|
---|
201 | var originalRefreshContainerSize = retval.RefreshContainerSize ;
|
---|
202 | retval.RefreshContainerSize = function()
|
---|
203 | {
|
---|
204 | FCKTools.SetTimeout( originalRefreshContainerSize, 1, retval ) ;
|
---|
205 | }
|
---|
206 | }
|
---|
207 |
|
---|
208 | window.onresize = function()
|
---|
209 | {
|
---|
210 | retval.RefreshContainerSize() ;
|
---|
211 | }
|
---|
212 |
|
---|
213 | window.SetAutoSize = FCKTools.Bind( retval, retval.SetAutoSize ) ;
|
---|
214 |
|
---|
215 | return retval ;
|
---|
216 | }() ;
|
---|
217 |
|
---|
218 | // Manages the throbber image that appears if the inner part of dialog is taking too long to load.
|
---|
219 | var Throbber = function()
|
---|
220 | {
|
---|
221 | var timer ;
|
---|
222 |
|
---|
223 | var updateThrobber = function()
|
---|
224 | {
|
---|
225 | var throbberParent = $( 'throbberBlock' ) ;
|
---|
226 | var throbberBlocks = throbberParent.childNodes ;
|
---|
227 | var lastClass = throbberParent.lastChild.className ;
|
---|
228 |
|
---|
229 | // From the last to the second one, copy the class from the previous one.
|
---|
230 | for ( var i = throbberBlocks.length - 1 ; i > 0 ; i-- )
|
---|
231 | throbberBlocks[i].className = throbberBlocks[i-1].className ;
|
---|
232 |
|
---|
233 | // For the first one, copy the last class (rotation).
|
---|
234 | throbberBlocks[0].className = lastClass ;
|
---|
235 | }
|
---|
236 |
|
---|
237 | return {
|
---|
238 | Show : function( waitMilliseconds )
|
---|
239 | {
|
---|
240 | // Auto-setup the Show function to be called again after the
|
---|
241 | // requested amount of time.
|
---|
242 | if ( waitMilliseconds && waitMilliseconds > 0 )
|
---|
243 | {
|
---|
244 | timer = FCKTools.SetTimeout( this.Show, waitMilliseconds, this, null, window ) ;
|
---|
245 | return ;
|
---|
246 | }
|
---|
247 |
|
---|
248 | var throbberParent = $( 'throbberBlock' ) ;
|
---|
249 |
|
---|
250 | if (throbberParent.childNodes.length == 0)
|
---|
251 | {
|
---|
252 | // Create the throbber blocks.
|
---|
253 | var classIds = [ 1,2,3,4,5,4,3,2 ] ;
|
---|
254 | while ( classIds.length > 0 )
|
---|
255 | throbberParent.appendChild( document.createElement( 'div' ) ).className = ' throbber_' + classIds.shift() ;
|
---|
256 | }
|
---|
257 |
|
---|
258 | // Center the throbber.
|
---|
259 | var frm = $( 'contents' ) ;
|
---|
260 | var frmCoords = FCKTools.GetDocumentPosition( window, frm ) ;
|
---|
261 | var x = frmCoords.x + ( frm.offsetWidth - throbberParent.offsetWidth ) / 2 ;
|
---|
262 | var y = frmCoords.y + ( frm.offsetHeight - throbberParent.offsetHeight ) / 2 ;
|
---|
263 | throbberParent.style.left = parseInt( x, 10 ) + 'px' ;
|
---|
264 | throbberParent.style.top = parseInt( y, 10 ) + 'px' ;
|
---|
265 |
|
---|
266 | // Show it.
|
---|
267 | throbberParent.style.visibility = '' ;
|
---|
268 |
|
---|
269 | // Hide tabs and buttons:
|
---|
270 | $( 'Tabs' ).style.visibility = 'hidden' ;
|
---|
271 | $( 'PopupButtons' ).style.visibility = 'hidden' ;
|
---|
272 |
|
---|
273 | // Setup the animation interval.
|
---|
274 | timer = setInterval( updateThrobber, 100 ) ;
|
---|
275 | },
|
---|
276 |
|
---|
277 | Hide : function()
|
---|
278 | {
|
---|
279 | if ( timer )
|
---|
280 | {
|
---|
281 | clearInterval( timer ) ;
|
---|
282 | timer = null ;
|
---|
283 | }
|
---|
284 |
|
---|
285 | $( 'throbberBlock' ).style.visibility = 'hidden' ;
|
---|
286 |
|
---|
287 | // Show tabs and buttons:
|
---|
288 | $( 'Tabs' ).style.visibility = '' ;
|
---|
289 | $( 'PopupButtons' ).style.visibility = '' ;
|
---|
290 | }
|
---|
291 | } ;
|
---|
292 | }() ;
|
---|
293 |
|
---|
294 | // Drag and drop handlers.
|
---|
295 | var DragAndDrop = function()
|
---|
296 | {
|
---|
297 | var registeredWindows = [] ;
|
---|
298 | var lastCoords ;
|
---|
299 | var currentPos ;
|
---|
300 |
|
---|
301 | var cleanUpHandlers = function()
|
---|
302 | {
|
---|
303 | for ( var i = 0 ; i < registeredWindows.length ; i++ )
|
---|
304 | {
|
---|
305 | FCKTools.RemoveEventListener( registeredWindows[i].document, 'mousemove', dragMouseMoveHandler ) ;
|
---|
306 | FCKTools.RemoveEventListener( registeredWindows[i].document, 'mouseup', dragMouseUpHandler ) ;
|
---|
307 | }
|
---|
308 | }
|
---|
309 |
|
---|
310 | var dragMouseMoveHandler = function( evt )
|
---|
311 | {
|
---|
312 | if ( !lastCoords )
|
---|
313 | return ;
|
---|
314 |
|
---|
315 | if ( !evt )
|
---|
316 | evt = FCKTools.GetElementDocument( this ).parentWindow.event ;
|
---|
317 |
|
---|
318 | // Updated the last coordinates.
|
---|
319 | var currentCoords =
|
---|
320 | {
|
---|
321 | x : evt.screenX,
|
---|
322 | y : evt.screenY
|
---|
323 | } ;
|
---|
324 |
|
---|
325 | currentPos =
|
---|
326 | {
|
---|
327 | x : currentPos.x + ( currentCoords.x - lastCoords.x ),
|
---|
328 | y : currentPos.y + ( currentCoords.y - lastCoords.y )
|
---|
329 | } ;
|
---|
330 |
|
---|
331 | lastCoords = currentCoords ;
|
---|
332 |
|
---|
333 | frameElement.style.left = currentPos.x + 'px' ;
|
---|
334 | frameElement.style.top = currentPos.y + 'px' ;
|
---|
335 |
|
---|
336 | if ( evt.preventDefault )
|
---|
337 | evt.preventDefault() ;
|
---|
338 | else
|
---|
339 | evt.returnValue = false ;
|
---|
340 | }
|
---|
341 |
|
---|
342 | var dragMouseUpHandler = function( evt )
|
---|
343 | {
|
---|
344 | if ( !lastCoords )
|
---|
345 | return ;
|
---|
346 | if ( !evt )
|
---|
347 | evt = FCKTools.GetElementDocument( this ).parentWindow.event ;
|
---|
348 | cleanUpHandlers() ;
|
---|
349 | lastCoords = null ;
|
---|
350 | }
|
---|
351 |
|
---|
352 | return {
|
---|
353 |
|
---|
354 | MouseDownHandler : function( evt )
|
---|
355 | {
|
---|
356 | var view = null ;
|
---|
357 | if ( !evt )
|
---|
358 | {
|
---|
359 | view = FCKTools.GetElementDocument( this ).parentWindow ;
|
---|
360 | evt = view.event ;
|
---|
361 | }
|
---|
362 | else
|
---|
363 | view = evt.view ;
|
---|
364 |
|
---|
365 | var target = evt.srcElement || evt.target ;
|
---|
366 | if ( target.id == 'closeButton' || target.className == 'PopupTab' || target.className == 'PopupTabSelected' )
|
---|
367 | return ;
|
---|
368 |
|
---|
369 | lastCoords =
|
---|
370 | {
|
---|
371 | x : evt.screenX,
|
---|
372 | y : evt.screenY
|
---|
373 | } ;
|
---|
374 |
|
---|
375 | // Save the current IFRAME position.
|
---|
376 | currentPos =
|
---|
377 | {
|
---|
378 | x : parseInt( FCKDomTools.GetCurrentElementStyle( frameElement, 'left' ), 10 ),
|
---|
379 | y : parseInt( FCKDomTools.GetCurrentElementStyle( frameElement, 'top' ), 10 )
|
---|
380 | } ;
|
---|
381 |
|
---|
382 | for ( var i = 0 ; i < registeredWindows.length ; i++ )
|
---|
383 | {
|
---|
384 | FCKTools.AddEventListener( registeredWindows[i].document, 'mousemove', dragMouseMoveHandler ) ;
|
---|
385 | FCKTools.AddEventListener( registeredWindows[i].document, 'mouseup', dragMouseUpHandler ) ;
|
---|
386 | }
|
---|
387 |
|
---|
388 | if ( evt.preventDefault )
|
---|
389 | evt.preventDefault() ;
|
---|
390 | else
|
---|
391 | evt.returnValue = false ;
|
---|
392 | },
|
---|
393 |
|
---|
394 | RegisterHandlers : function( w )
|
---|
395 | {
|
---|
396 | registeredWindows.push( w ) ;
|
---|
397 | }
|
---|
398 | }
|
---|
399 | }() ;
|
---|
400 |
|
---|
401 | // Selection related functions.
|
---|
402 | //(Became simple shortcuts after the fix for #1990)
|
---|
403 | var Selection =
|
---|
404 | {
|
---|
405 | /**
|
---|
406 | * Ensures that the editing area contains an active selection. This is a
|
---|
407 | * requirement for IE, as it looses the selection when the focus moves to other
|
---|
408 | * frames.
|
---|
409 | */
|
---|
410 | EnsureSelection : function()
|
---|
411 | {
|
---|
412 | // Move the focus to the Cancel button so even if the dialog contains a
|
---|
413 | // contentEditable element the selection is properly restored in the editor #2496
|
---|
414 | window.focus() ;
|
---|
415 | $( 'btnCancel' ).focus() ;
|
---|
416 |
|
---|
417 | FCK.Selection.Restore() ;
|
---|
418 | },
|
---|
419 |
|
---|
420 | /**
|
---|
421 | * Get the FCKSelection object for the editor instance.
|
---|
422 | */
|
---|
423 | GetSelection : function()
|
---|
424 | {
|
---|
425 | return FCK.Selection ;
|
---|
426 | },
|
---|
427 |
|
---|
428 | /**
|
---|
429 | * Get the selected element in the editing area (for object selections).
|
---|
430 | */
|
---|
431 | GetSelectedElement : function()
|
---|
432 | {
|
---|
433 | return FCK.Selection.GetSelectedElement() ;
|
---|
434 | }
|
---|
435 | }
|
---|
436 |
|
---|
437 | // Tab related functions.
|
---|
438 | var Tabs = function()
|
---|
439 | {
|
---|
440 | // Only element ids should be stored here instead of element references since setSelectedTab and TabDiv_OnClick
|
---|
441 | // would build circular references with the element references inside and cause memory leaks in IE6.
|
---|
442 | var oTabs = new Object() ;
|
---|
443 |
|
---|
444 | var setSelectedTab = function( tabCode )
|
---|
445 | {
|
---|
446 | for ( var sCode in oTabs )
|
---|
447 | {
|
---|
448 | if ( sCode == tabCode )
|
---|
449 | $( oTabs[sCode] ).className = 'PopupTabSelected' ;
|
---|
450 | else
|
---|
451 | $( oTabs[sCode] ).className = 'PopupTab' ;
|
---|
452 | }
|
---|
453 |
|
---|
454 | if ( typeof( window.frames["frmMain"].OnDialogTabChange ) == 'function' )
|
---|
455 | window.frames["frmMain"].OnDialogTabChange( tabCode ) ;
|
---|
456 | }
|
---|
457 |
|
---|
458 | function TabDiv_OnClick()
|
---|
459 | {
|
---|
460 | setSelectedTab( this.TabCode ) ;
|
---|
461 | }
|
---|
462 |
|
---|
463 | window.AddTab = function( tabCode, tabText, startHidden )
|
---|
464 | {
|
---|
465 | if ( typeof( oTabs[ tabCode ] ) != 'undefined' )
|
---|
466 | return ;
|
---|
467 |
|
---|
468 | var eTabsRow = $( 'Tabs' ) ;
|
---|
469 |
|
---|
470 | var oCell = eTabsRow.insertCell( eTabsRow.cells.length - 1 ) ;
|
---|
471 | oCell.noWrap = true ;
|
---|
472 |
|
---|
473 | var oDiv = document.createElement( 'DIV' ) ;
|
---|
474 | oDiv.className = 'PopupTab' ;
|
---|
475 | oDiv.innerHTML = tabText ;
|
---|
476 | oDiv.TabCode = tabCode ;
|
---|
477 | oDiv.onclick = TabDiv_OnClick ;
|
---|
478 | oDiv.id = Math.random() ;
|
---|
479 |
|
---|
480 | if ( startHidden )
|
---|
481 | oDiv.style.display = 'none' ;
|
---|
482 |
|
---|
483 | eTabsRow = $( 'TabsRow' ) ;
|
---|
484 |
|
---|
485 | oCell.appendChild( oDiv ) ;
|
---|
486 |
|
---|
487 | if ( eTabsRow.style.display == 'none' )
|
---|
488 | {
|
---|
489 | var eTitleArea = $( 'TitleArea' ) ;
|
---|
490 | eTitleArea.className = 'PopupTitle' ;
|
---|
491 |
|
---|
492 | oDiv.className = 'PopupTabSelected' ;
|
---|
493 | eTabsRow.style.display = '' ;
|
---|
494 |
|
---|
495 | if ( window.onresize )
|
---|
496 | window.onresize() ;
|
---|
497 | }
|
---|
498 |
|
---|
499 | oTabs[ tabCode ] = oDiv.id ;
|
---|
500 |
|
---|
501 | FCKTools.DisableSelection( oDiv ) ;
|
---|
502 | } ;
|
---|
503 |
|
---|
504 | window.SetSelectedTab = setSelectedTab ;
|
---|
505 |
|
---|
506 | window.SetTabVisibility = function( tabCode, isVisible )
|
---|
507 | {
|
---|
508 | var oTab = $( oTabs[ tabCode ] ) ;
|
---|
509 | oTab.style.display = isVisible ? '' : 'none' ;
|
---|
510 |
|
---|
511 | if ( ! isVisible && oTab.className == 'PopupTabSelected' )
|
---|
512 | {
|
---|
513 | for ( var sCode in oTabs )
|
---|
514 | {
|
---|
515 | if ( $( oTabs[sCode] ).style.display != 'none' )
|
---|
516 | {
|
---|
517 | setSelectedTab( sCode ) ;
|
---|
518 | break ;
|
---|
519 | }
|
---|
520 | }
|
---|
521 | }
|
---|
522 | } ;
|
---|
523 | }() ;
|
---|
524 |
|
---|
525 | // readystatechange handler for registering drag and drop handlers in cover
|
---|
526 | // iframes, defined out here to avoid memory leak.
|
---|
527 | // Do NOT put this function as a private function as it will induce memory leak
|
---|
528 | // in IE and it's not detectable with Drip or sIEve and undetectable leaks are
|
---|
529 | // really nasty (sigh).
|
---|
530 | var onReadyRegister = function()
|
---|
531 | {
|
---|
532 | if ( this.readyState != 'complete' )
|
---|
533 | return ;
|
---|
534 | DragAndDrop.RegisterHandlers( this.contentWindow ) ;
|
---|
535 | } ;
|
---|
536 |
|
---|
537 | // The business logic of the dialog, dealing with operational things like
|
---|
538 | // dialog open/dialog close/enable/disable/etc.
|
---|
539 | (function()
|
---|
540 | {
|
---|
541 | var setOnKeyDown = function( targetDocument )
|
---|
542 | {
|
---|
543 | targetDocument.onkeydown = function ( e )
|
---|
544 | {
|
---|
545 | e = e || event || this.parentWindow.event ;
|
---|
546 | switch ( e.keyCode )
|
---|
547 | {
|
---|
548 | case 13 : // ENTER
|
---|
549 | var oTarget = e.srcElement || e.target ;
|
---|
550 | if ( oTarget.tagName == 'TEXTAREA' )
|
---|
551 | return true ;
|
---|
552 | Ok() ;
|
---|
553 | return false ;
|
---|
554 |
|
---|
555 | case 27 : // ESC
|
---|
556 | Cancel() ;
|
---|
557 | return false ;
|
---|
558 | }
|
---|
559 | return true ;
|
---|
560 | }
|
---|
561 | } ;
|
---|
562 |
|
---|
563 | var contextMenuBlocker = function( e )
|
---|
564 | {
|
---|
565 | var sTagName = e.target.tagName ;
|
---|
566 | if ( ! ( ( sTagName == "INPUT" && e.target.type == "text" ) || sTagName == "TEXTAREA" ) )
|
---|
567 | e.preventDefault() ;
|
---|
568 | } ;
|
---|
569 |
|
---|
570 | var disableContextMenu = function( targetDocument )
|
---|
571 | {
|
---|
572 | if ( FCKBrowserInfo.IsIE )
|
---|
573 | return ;
|
---|
574 |
|
---|
575 | targetDocument.addEventListener( 'contextmenu', contextMenuBlocker, true ) ;
|
---|
576 | } ;
|
---|
577 |
|
---|
578 | // Program entry point.
|
---|
579 | window.Init = function()
|
---|
580 | {
|
---|
581 | $( 'contents' ).dir = langDir;
|
---|
582 |
|
---|
583 | // Start the throbber timer.
|
---|
584 | Throbber.Show( 1000 ) ;
|
---|
585 |
|
---|
586 | Sizer.RefreshContainerSize() ;
|
---|
587 | LoadInnerDialog() ;
|
---|
588 |
|
---|
589 | FCKTools.DisableSelection( document.body ) ;
|
---|
590 |
|
---|
591 | // Make the title area draggable.
|
---|
592 | var titleElement = $( 'header' ) ;
|
---|
593 | titleElement.onmousedown = DragAndDrop.MouseDownHandler ;
|
---|
594 |
|
---|
595 | // Connect mousemove and mouseup events from dialog frame and outer window to dialog dragging logic.
|
---|
596 | DragAndDrop.RegisterHandlers( window ) ;
|
---|
597 | DragAndDrop.RegisterHandlers( Args().TopWindow ) ;
|
---|
598 |
|
---|
599 | // Disable the previous dialog if it exists.
|
---|
600 | if ( ParentDialog() )
|
---|
601 | {
|
---|
602 | ParentDialog().contentWindow.SetEnabled( false ) ;
|
---|
603 | if ( FCKBrowserInfo.IsIE && !FCKBrowserInfo.IsIE7 )
|
---|
604 | {
|
---|
605 | var currentParent = ParentDialog() ;
|
---|
606 | while ( currentParent )
|
---|
607 | {
|
---|
608 | var blockerFrame = currentParent.contentWindow.$( 'blocker' ) ;
|
---|
609 | if ( blockerFrame.readyState == 'complete' )
|
---|
610 | DragAndDrop.RegisterHandlers( blockerFrame.contentWindow ) ;
|
---|
611 | else
|
---|
612 | blockerFrame.onreadystatechange = onReadyRegister ;
|
---|
613 | currentParent = ParentDialog( currentParent ) ;
|
---|
614 | }
|
---|
615 | }
|
---|
616 | else
|
---|
617 | {
|
---|
618 | var currentParent = ParentDialog() ;
|
---|
619 | while ( currentParent )
|
---|
620 | {
|
---|
621 | DragAndDrop.RegisterHandlers( currentParent.contentWindow ) ;
|
---|
622 | currentParent = ParentDialog( currentParent ) ;
|
---|
623 | }
|
---|
624 | }
|
---|
625 | }
|
---|
626 |
|
---|
627 | // If this is the only dialog on screen, enable the background cover.
|
---|
628 | if ( FCKBrowserInfo.IsIE && !FCKBrowserInfo.IsIE7 )
|
---|
629 | {
|
---|
630 | var blockerFrame = FCKDialog.GetCover().firstChild ;
|
---|
631 | if ( blockerFrame.readyState == 'complete' )
|
---|
632 | DragAndDrop.RegisterHandlers( blockerFrame.contentWindow ) ;
|
---|
633 | else
|
---|
634 | blockerFrame.onreadystatechange = onReadyRegister;
|
---|
635 | }
|
---|
636 |
|
---|
637 | // Add Enter/Esc hotkeys and disable context menu for the dialog.
|
---|
638 | setOnKeyDown( document ) ;
|
---|
639 | disableContextMenu( document ) ;
|
---|
640 | } ;
|
---|
641 |
|
---|
642 | window.LoadInnerDialog = function()
|
---|
643 | {
|
---|
644 | if ( window.onresize )
|
---|
645 | window.onresize() ;
|
---|
646 |
|
---|
647 | // First of all, translate the dialog box contents.
|
---|
648 | E.FCKLanguageManager.TranslatePage( document ) ;
|
---|
649 |
|
---|
650 | // Create the IFRAME that holds the dialog contents.
|
---|
651 | $( 'innerContents' ).innerHTML = '<iframe id="frmMain" src="' + Args().Page + '" name="frmMain" frameborder="0" width="100%" height="100%" scrolling="auto" style="visibility: hidden;" allowtransparency="true"><\/iframe>' ;
|
---|
652 | } ;
|
---|
653 |
|
---|
654 | window.InnerDialogLoaded = function()
|
---|
655 | {
|
---|
656 | // If the dialog has been closed before the iframe is loaded, do nothing.
|
---|
657 | if ( !frameElement.parentNode )
|
---|
658 | return null ;
|
---|
659 |
|
---|
660 | Throbber.Hide() ;
|
---|
661 |
|
---|
662 | var frmMain = $('frmMain') ;
|
---|
663 | var innerWindow = frmMain.contentWindow ;
|
---|
664 | var innerDoc = innerWindow.document ;
|
---|
665 |
|
---|
666 | // Show the loaded iframe.
|
---|
667 | frmMain.style.visibility = '' ;
|
---|
668 |
|
---|
669 | // Set the language direction.
|
---|
670 | innerDoc.documentElement.dir = langDir ;
|
---|
671 |
|
---|
672 | // Sets the Skin CSS.
|
---|
673 | innerDoc.write( FCKTools.GetStyleHtml( FCKConfig.SkinDialogCSS ) ) ;
|
---|
674 |
|
---|
675 | setOnKeyDown( innerDoc ) ;
|
---|
676 | disableContextMenu( innerDoc ) ;
|
---|
677 |
|
---|
678 | Sizer.RefreshContainerSize();
|
---|
679 |
|
---|
680 | DragAndDrop.RegisterHandlers( innerWindow ) ;
|
---|
681 |
|
---|
682 | innerWindow.focus() ;
|
---|
683 |
|
---|
684 | return E ;
|
---|
685 | } ;
|
---|
686 |
|
---|
687 | window.SetOkButton = function( showIt )
|
---|
688 | {
|
---|
689 | $('btnOk').style.visibility = ( showIt ? '' : 'hidden' ) ;
|
---|
690 | } ;
|
---|
691 |
|
---|
692 | window.Ok = function()
|
---|
693 | {
|
---|
694 | Selection.EnsureSelection() ;
|
---|
695 |
|
---|
696 | var frmMain = window.frames["frmMain"] ;
|
---|
697 |
|
---|
698 | if ( frmMain.Ok && frmMain.Ok() )
|
---|
699 | CloseDialog() ;
|
---|
700 | else
|
---|
701 | frmMain.focus() ;
|
---|
702 | } ;
|
---|
703 |
|
---|
704 | window.Cancel = function( dontFireChange )
|
---|
705 | {
|
---|
706 | Selection.EnsureSelection() ;
|
---|
707 | return CloseDialog( dontFireChange ) ;
|
---|
708 | } ;
|
---|
709 |
|
---|
710 | window.CloseDialog = function( dontFireChange )
|
---|
711 | {
|
---|
712 | Throbber.Hide() ;
|
---|
713 |
|
---|
714 | // Points the src to a non-existent location to avoid loading errors later, in case the dialog
|
---|
715 | // haven't been completed loaded at this point.
|
---|
716 | if ( $( 'frmMain' ) )
|
---|
717 | $( 'frmMain' ).src = FCKTools.GetVoidUrl() ;
|
---|
718 |
|
---|
719 | if ( !dontFireChange && !FCK.EditMode )
|
---|
720 | {
|
---|
721 | // All dialog windows, by default, will fire the "OnSelectionChange"
|
---|
722 | // event, no matter the Ok or Cancel button has been pressed.
|
---|
723 | // It seems that OnSelectionChange may enter on a concurrency state
|
---|
724 | // on some situations (#1965), so we should put the event firing in
|
---|
725 | // the execution queue instead of executing it immediately.
|
---|
726 | setTimeout( function()
|
---|
727 | {
|
---|
728 | FCK.Events.FireEvent( 'OnSelectionChange' ) ;
|
---|
729 | }, 0 ) ;
|
---|
730 | }
|
---|
731 |
|
---|
732 | FCKDialog.OnDialogClose( window ) ;
|
---|
733 | } ;
|
---|
734 |
|
---|
735 | window.SetEnabled = function( isEnabled )
|
---|
736 | {
|
---|
737 | var cover = $( 'cover' ) ;
|
---|
738 | cover.style.display = isEnabled ? 'none' : '' ;
|
---|
739 |
|
---|
740 | if ( FCKBrowserInfo.IsIE && !FCKBrowserInfo.IsIE7 )
|
---|
741 | {
|
---|
742 | if ( !isEnabled )
|
---|
743 | {
|
---|
744 | // Inser the blocker IFRAME before the cover.
|
---|
745 | var blocker = document.createElement( 'iframe' ) ;
|
---|
746 | blocker.src = FCKTools.GetVoidUrl() ;
|
---|
747 | blocker.hideFocus = true ;
|
---|
748 | blocker.frameBorder = 0 ;
|
---|
749 | blocker.id = blocker.className = 'blocker' ;
|
---|
750 | cover.appendChild( blocker ) ;
|
---|
751 | }
|
---|
752 | else
|
---|
753 | {
|
---|
754 | var blocker = $( 'blocker' ) ;
|
---|
755 | if ( blocker && blocker.parentNode )
|
---|
756 | blocker.parentNode.removeChild( blocker ) ;
|
---|
757 | }
|
---|
758 | }
|
---|
759 | } ;
|
---|
760 | })() ;
|
---|
761 | // ]]>
|
---|
762 | </script>
|
---|
763 | </head>
|
---|
764 | <body onload="Init();" class="PopupBody">
|
---|
765 | <div class="contents" id="contents">
|
---|
766 | <div id="header">
|
---|
767 | <div id="TitleArea" class="PopupTitle PopupTitleBorder">
|
---|
768 | <script type="text/javascript">
|
---|
769 | // <![CDATA[
|
---|
770 | document.write( Args().Title ) ;
|
---|
771 | // ]]>
|
---|
772 | </script>
|
---|
773 | <div id="closeButton" onclick="Cancel();"></div>
|
---|
774 | </div>
|
---|
775 | <div id="TabsRow" class="PopupTabArea" style="display: none">
|
---|
776 | <table border="0" cellpadding="0" cellspacing="0" width="100%">
|
---|
777 | <tr id="Tabs">
|
---|
778 | <td class="PopupTabEmptyArea"> </td>
|
---|
779 | <td class="PopupTabEmptyArea" width="100%"> </td>
|
---|
780 | </tr>
|
---|
781 | </table>
|
---|
782 | </div>
|
---|
783 | </div>
|
---|
784 | <div id="innerContents"></div>
|
---|
785 | <div id="PopupButtons" class="PopupButtons">
|
---|
786 | <table border="0" cellpadding="0" cellspacing="0">
|
---|
787 | <tr>
|
---|
788 | <td width="100%"> </td>
|
---|
789 | <td nowrap="nowrap">
|
---|
790 | <input id="btnOk" style="visibility: hidden;" type="button" value="Ok" class="Button" onclick="Ok();" fckLang="DlgBtnOK" />
|
---|
791 |
|
---|
792 | <input id="btnCancel" type="button" value="Cancel" class="Button" onclick="Cancel();" fckLang="DlgBtnCancel" />
|
---|
793 | </td>
|
---|
794 | </tr>
|
---|
795 | </table>
|
---|
796 | </div>
|
---|
797 | </div>
|
---|
798 | <div class="tl"></div>
|
---|
799 | <div class="tc"></div>
|
---|
800 | <div class="tr"></div>
|
---|
801 | <div class="ml"></div>
|
---|
802 | <div class="mr"></div>
|
---|
803 | <div class="bl"></div>
|
---|
804 | <div class="bc"></div>
|
---|
805 | <div class="br"></div>
|
---|
806 | <div class="cover" id="cover" style="display:none"></div>
|
---|
807 | <div id="throbberBlock" style="position: absolute; visibility: hidden"></div>
|
---|
808 | <script type="text/javascript">
|
---|
809 | // <![CDATA[
|
---|
810 | // Set the class name for language direction.
|
---|
811 | document.body.className += ' ' + langDir ;
|
---|
812 |
|
---|
813 | var cover = $( 'cover' ) ;
|
---|
814 | cover.style.backgroundColor = FCKConfig.BackgroundBlockerColor ;
|
---|
815 | FCKDomTools.SetOpacity( cover, FCKConfig.BackgroundBlockerOpacity ) ;
|
---|
816 | // ]]>
|
---|
817 | </script>
|
---|
818 | </body>
|
---|
819 | </html>
|
---|