fckdialog.js
上传用户:dbstep
上传日期:2022-08-06
资源大小:2803k
文件大小:7k
源码类别:

WEB源码(ASP,PHP,...)

开发平台:

ASP/ASPX

  1. /*
  2.  * FCKeditor - The text editor for Internet - http://www.fckeditor.net
  3.  * Copyright (C) 2003-2009 Frederico Caldeira Knabben
  4.  *
  5.  * == BEGIN LICENSE ==
  6.  *
  7.  * Licensed under the terms of any of the following licenses at your
  8.  * choice:
  9.  *
  10.  *  - GNU General Public License Version 2 or later (the "GPL")
  11.  *    http://www.gnu.org/licenses/gpl.html
  12.  *
  13.  *  - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
  14.  *    http://www.gnu.org/licenses/lgpl.html
  15.  *
  16.  *  - Mozilla Public License Version 1.1 or later (the "MPL")
  17.  *    http://www.mozilla.org/MPL/MPL-1.1.html
  18.  *
  19.  * == END LICENSE ==
  20.  *
  21.  * Dialog windows operations.
  22.  */
  23. var FCKDialog = ( function()
  24. {
  25. var topDialog ;
  26. var baseZIndex ;
  27. var cover ;
  28. // The document that holds the dialog.
  29. var topWindow = window.parent ;
  30. while ( topWindow.parent && topWindow.parent != topWindow )
  31. {
  32. try
  33. {
  34. if ( topWindow.parent.document.domain != document.domain )
  35. break ;
  36. if ( topWindow.parent.document.getElementsByTagName( 'frameset' ).length > 0 )
  37. break ;
  38. }
  39. catch ( e )
  40. {
  41. break ;
  42. }
  43. topWindow = topWindow.parent ;
  44. }
  45. var topDocument = topWindow.document ;
  46. var getZIndex = function()
  47. {
  48. if ( !baseZIndex )
  49. baseZIndex = FCKConfig.FloatingPanelsZIndex + 999 ;
  50. return ++baseZIndex ;
  51. }
  52. // TODO : This logic is not actually working when reducing the window, only
  53. // when enlarging it.
  54. var resizeHandler = function()
  55. {
  56. if ( !cover )
  57. return ;
  58. var relElement = FCKTools.IsStrictMode( topDocument ) ? topDocument.documentElement : topDocument.body ;
  59. FCKDomTools.SetElementStyles( cover,
  60. {
  61. 'width' : Math.max( relElement.scrollWidth,
  62. relElement.clientWidth,
  63. topDocument.scrollWidth || 0 ) - 1 + 'px',
  64. 'height' : Math.max( relElement.scrollHeight,
  65. relElement.clientHeight,
  66. topDocument.scrollHeight || 0 ) - 1 + 'px'
  67. } ) ;
  68. }
  69. return {
  70. /**
  71.  * Opens a dialog window using the standard dialog template.
  72.  */
  73. OpenDialog : function( dialogName, dialogTitle, dialogPage, width, height, customValue, parentWindow, resizable )
  74. {
  75. if ( !topDialog )
  76. this.DisplayMainCover() ;
  77. // Setup the dialog info to be passed to the dialog.
  78. var dialogInfo =
  79. {
  80. Title : dialogTitle,
  81. Page : dialogPage,
  82. Editor : window,
  83. CustomValue : customValue, // Optional
  84. TopWindow : topWindow
  85. }
  86. FCK.ToolbarSet.CurrentInstance.Selection.Save( true ) ;
  87. // Calculate the dialog position, centering it on the screen.
  88. var viewSize = FCKTools.GetViewPaneSize( topWindow ) ;
  89. var scrollPosition = { 'X' : 0, 'Y' : 0 } ;
  90. var useAbsolutePosition = FCKBrowserInfo.IsIE && ( !FCKBrowserInfo.IsIE7 || !FCKTools.IsStrictMode( topWindow.document ) ) ;
  91. if ( useAbsolutePosition )
  92. scrollPosition = FCKTools.GetScrollPosition( topWindow ) ;
  93. var iTop  = Math.max( scrollPosition.Y + ( viewSize.Height - height - 20 ) / 2, 0 ) ;
  94. var iLeft = Math.max( scrollPosition.X + ( viewSize.Width - width - 20 )  / 2, 0 ) ;
  95. // Setup the IFRAME that will hold the dialog.
  96. var dialog = topDocument.createElement( 'iframe' ) ;
  97. FCKTools.ResetStyles( dialog ) ;
  98. dialog.src = FCKConfig.BasePath + 'fckdialog.html' ;
  99. // Dummy URL for testing whether the code in fckdialog.js alone leaks memory.
  100. // dialog.src = 'about:blank';
  101. dialog.frameBorder = 0 ;
  102. dialog.allowTransparency = true ;
  103. FCKDomTools.SetElementStyles( dialog,
  104. {
  105. 'position' : ( useAbsolutePosition ) ? 'absolute' : 'fixed',
  106. 'top' : iTop + 'px',
  107. 'left' : iLeft + 'px',
  108. 'width' : width + 'px',
  109. 'height' : height + 'px',
  110. 'zIndex' : getZIndex()
  111. } ) ;
  112. // Save the dialog info to be used by the dialog page once loaded.
  113. dialog._DialogArguments = dialogInfo ;
  114. // Append the IFRAME to the target document.
  115. topDocument.body.appendChild( dialog ) ;
  116. // Keep record of the dialog's parent/child relationships.
  117. dialog._ParentDialog = topDialog ;
  118. topDialog = dialog ;
  119. },
  120. /**
  121.  * (For internal use)
  122.  * Called when the top dialog is closed.
  123.  */
  124. OnDialogClose : function( dialogWindow )
  125. {
  126. var dialog = dialogWindow.frameElement ;
  127. FCKDomTools.RemoveNode( dialog ) ;
  128. if ( dialog._ParentDialog ) // Nested Dialog.
  129. {
  130. topDialog = dialog._ParentDialog ;
  131. dialog._ParentDialog.contentWindow.SetEnabled( true ) ;
  132. }
  133. else // First Dialog.
  134. {
  135. // Set the Focus in the browser, so the "OnBlur" event is not
  136. // fired. In IE, there is no need to do that because the dialog
  137. // already moved the selection to the editing area before
  138. // closing (EnsureSelection). Also, the Focus() call here
  139. // causes memory leak on IE7 (weird).
  140. if ( !FCKBrowserInfo.IsIE )
  141. FCK.Focus() ;
  142. this.HideMainCover() ;
  143. // Bug #1918: Assigning topDialog = null directly causes IE6 to crash.
  144. setTimeout( function(){ topDialog = null ; }, 0 ) ;
  145. // Release the previously saved selection.
  146. FCK.ToolbarSet.CurrentInstance.Selection.Release() ;
  147. }
  148. },
  149. DisplayMainCover : function()
  150. {
  151. // Setup the DIV that will be used to cover.
  152. cover = topDocument.createElement( 'div' ) ;
  153. FCKTools.ResetStyles( cover ) ;
  154. FCKDomTools.SetElementStyles( cover,
  155. {
  156. 'position' : 'absolute',
  157. 'zIndex' : getZIndex(),
  158. 'top' : '0px',
  159. 'left' : '0px',
  160. 'backgroundColor' : FCKConfig.BackgroundBlockerColor
  161. } ) ;
  162. FCKDomTools.SetOpacity( cover, FCKConfig.BackgroundBlockerOpacity ) ;
  163. // For IE6-, we need to fill the cover with a transparent IFRAME,
  164. // to properly block <select> fields.
  165. if ( FCKBrowserInfo.IsIE && !FCKBrowserInfo.IsIE7 )
  166. {
  167. var iframe = topDocument.createElement( 'iframe' ) ;
  168. FCKTools.ResetStyles( iframe ) ;
  169. iframe.hideFocus = true ;
  170. iframe.frameBorder = 0 ;
  171. iframe.src = FCKTools.GetVoidUrl() ;
  172. FCKDomTools.SetElementStyles( iframe,
  173. {
  174. 'width' : '100%',
  175. 'height' : '100%',
  176. 'position' : 'absolute',
  177. 'left' : '0px',
  178. 'top' : '0px',
  179. 'filter' : 'progid:DXImageTransform.Microsoft.Alpha(opacity=0)'
  180. } ) ;
  181. cover.appendChild( iframe ) ;
  182. }
  183. // We need to manually adjust the cover size on resize.
  184. FCKTools.AddEventListener( topWindow, 'resize', resizeHandler ) ;
  185. resizeHandler() ;
  186. topDocument.body.appendChild( cover ) ;
  187. FCKFocusManager.Lock() ;
  188. // Prevent the user from refocusing the disabled
  189. // editing window by pressing Tab. (Bug #2065)
  190. var el = FCK.ToolbarSet.CurrentInstance.GetInstanceObject( 'frameElement' ) ;
  191. el._fck_originalTabIndex = el.tabIndex ;
  192. el.tabIndex = -1 ;
  193. },
  194. HideMainCover : function()
  195. {
  196. FCKDomTools.RemoveNode( cover ) ;
  197. FCKFocusManager.Unlock() ;
  198. // Revert the tab index hack. (Bug #2065)
  199. var el = FCK.ToolbarSet.CurrentInstance.GetInstanceObject( 'frameElement' ) ;
  200. el.tabIndex = el._fck_originalTabIndex ;
  201. FCKDomTools.ClearElementJSProperty( el, '_fck_originalTabIndex' ) ;
  202. },
  203. GetCover : function()
  204. {
  205. return cover ;
  206. }
  207. } ;
  208. } )() ;