fckpanel_gecko.js
上传用户:wlfwy2004
上传日期:2016-12-12
资源大小:33978k
文件大小:6k
源码类别:

Jsp/Servlet

开发平台:

Java

  1. /*
  2.  * FCKeditor - The text editor for internet
  3.  * Copyright (C) 2003-2005 Frederico Caldeira Knabben
  4.  * 
  5.  * Licensed under the terms of the GNU Lesser General Public License:
  6.  *  http://www.opensource.org/licenses/lgpl-license.php
  7.  * 
  8.  * For further information visit:
  9.  *  http://www.fckeditor.net/
  10.  * 
  11.  * File Name: fckpanel_gecko.js
  12.  *  FCKPanel Class: Creates and manages floating panels in Gecko Browsers.
  13.  * 
  14.  * File Authors:
  15.  *  Frederico Caldeira Knabben (fredck@fckeditor.net)
  16.  */
  17. var FCKPanel = function( parentWindow )
  18. {
  19. if ( parentWindow )
  20. this.Window = parentWindow ;
  21. else
  22. {
  23. this.Window = window ;
  24. while ( this.Window != window.top )
  25. {
  26. // Try/Catch must be used to avoit an error when using a frameset
  27. // on a different domain:
  28. // "Permission denied to get property HTMLDocument.Body".
  29. try
  30. {
  31. if ( this.Window.parent.document.body.tagName == 'FRAMESET' )
  32. break ;
  33. }
  34. catch (e)
  35. {
  36. break ;
  37. }
  38. this.Window = this.Window.parent ;
  39. }
  40. }
  41. }
  42. FCKPanel.prototype.Create = function()
  43. {
  44. this._IFrame = this.Window.document.body.appendChild( this.Window.document.createElement('iframe') ) ;
  45. this._IFrame.src = 'about:blank' ;
  46.     this._IFrame.frameBorder = '0';
  47.     this._IFrame.scrolling = 'no' ;
  48.     this._IFrame.style.left = '0px' ;
  49. this._IFrame.style.top = '0px' ;
  50.     this._IFrame.width = 10 ;
  51. this._IFrame.height = 10 ;
  52.     this._IFrame.style.position = 'absolute';
  53. this._IFrame.style.visibility = 'hidden' ;
  54. this._IFrame.IsFCKPanel = true ;
  55. this._IFrame.Panel = this ;
  56. this.Document = this._IFrame.contentWindow.document ;
  57. // Initialize the IFRAME document body.
  58. this.Document.open() ;
  59. this.Document.write( '<html><head></head><body></body></html>' ) ;
  60. this.Document.close() ;
  61. // Remove the default margins.
  62. this.Document.body.style.margin = this.Document.body.style.padding = '0px' ;
  63. // Add the defined Style Sheet to the document.
  64. if ( this.StyleSheet )
  65. FCKTools.AppendStyleSheet( this.Document, this.StyleSheet ) ;
  66. this.OuterDiv = this.Document.body.appendChild( this.Document.createElement('DIV') ) ;
  67. this.OuterDiv.style.cssFloat = 'left' ;
  68. this.PanelDiv = this.OuterDiv.appendChild( this.Document.createElement('DIV') ) ;
  69. this.PanelDiv.className = 'FCK_Panel' ;
  70. this.Created = true ;
  71. }
  72. FCKPanel.prototype.Show = function( panelX, panelY, relElement, width, height, autoSize  )
  73. {
  74. if ( ! this.Created )
  75. this.Create() ;
  76. if ( width != null && autoSize && width < this.OuterDiv.offsetWidth )
  77. this.PanelDiv.style.width = width ;
  78. if ( height != null && autoSize && height < this.PanelDiv.offsetHeight )
  79. this.PanelDiv.style.height = height + 'px' ;
  80. var oPos = this.GetElementPosition( relElement ) ;
  81. panelX += oPos.X ;
  82. panelY += oPos.Y ;
  83. if ( panelX + this.OuterDiv.offsetWidth > this.Window.innerWidth )
  84. {
  85. // The following line aligns the panel to the other side of the refElement.
  86. // panelX = oPos.X - ( this.PanelDiv.offsetWidth - relElement.offsetWidth ) ;
  87. panelX -= panelX + this.OuterDiv.offsetWidth - this.Window.innerWidth ;
  88. }
  89. // Set the context menu DIV in the specified location.
  90. this._IFrame.style.left = panelX + 'px' ;
  91. this._IFrame.style.top = panelY + 'px' ;
  92. // Watch the "OnClick" event for all windows to close the Context Menu.
  93. function SetOnClickListener( targetWindow, targetFunction )
  94. {
  95. // Try/Catch must be used to avoit an error when using a frameset
  96. // on a different domain:
  97. // "Permission denied to get property Window.frameElement".
  98. try
  99. {
  100. if ( targetWindow == null || ( targetWindow.frameElement && targetWindow.frameElement.IsFCKPanel ) )
  101. return ;
  102. targetWindow.document.addEventListener( 'click', targetFunction, false ) ;
  103. }
  104. catch (e) {}
  105. for ( var i = 0 ; i < targetWindow.frames.length ; i++ )
  106. SetOnClickListener( targetWindow.frames[i], targetFunction ) ;
  107. }
  108. SetOnClickListener( window.top, FCKPanelEventHandlers.OnDocumentClick ) ;
  109. this._IFrame.width = this.OuterDiv.offsetWidth ;
  110. this._IFrame.height = this.OuterDiv.offsetHeight ;
  111. // Show it.
  112. this._IFrame.style.visibility = '' ;
  113. }
  114. FCKPanel.prototype.GetElementPosition = function( el )
  115. {
  116. // Initializes the Coordinates object that will be returned by the function.
  117. var c = { X:0, Y:0 } ;
  118. // Loop throw the offset chain.
  119. while ( el )
  120. {
  121. c.X += el.offsetLeft ;
  122. c.Y += el.offsetTop ;
  123. if ( el.offsetParent == null && el.ownerDocument.defaultView != this.Window )
  124. el = el.ownerDocument.defaultView.frameElement ;
  125. else
  126. el = el.offsetParent ;
  127. }
  128. // Return the Coordinates object
  129. return c ;
  130. }
  131. FCKPanel.prototype.Hide = function()
  132. {
  133. // There is a bug on Firefox over Mac. It doesn't hide the Panel
  134. // scrollbars, so we must force it.
  135. this.PanelDiv.style.overflow = 'visible' ;
  136. this._IFrame.style.visibility = 'hidden' ;
  137. // this._IFrame.style.left = this._IFrame.style.top = '0px' ;
  138. }
  139. var FCKPanelEventHandlers = new Object() ;
  140. FCKPanelEventHandlers.OnDocumentClick = function( e )
  141. {
  142. var oWindow = e.target.ownerDocument.defaultView ;
  143. if ( ! oWindow.IsFCKPanel )
  144. {
  145. function RemoveOnClickListener( targetWindow )
  146. {
  147. if ( targetWindow == null )
  148. return ;
  149. // Try/Catch must be used to avoit an error when using a frameset
  150. // on a different domain:
  151. // "Permission denied to get property Window.frameElement".
  152. try
  153. {
  154. if ( targetWindow.frameElement && targetWindow.frameElement.IsFCKPanel )
  155. targetWindow.frameElement.Panel.Hide() ;
  156. else
  157. targetWindow.document.removeEventListener( 'click', FCKPanelEventHandlers.OnDocumentClick, false ) ;
  158. }
  159. catch (e) {}
  160. for ( var i = 0 ; i < targetWindow.frames.length ; i++ )
  161. RemoveOnClickListener( targetWindow.frames[i] ) ;
  162. }
  163. RemoveOnClickListener( window.top ) ;
  164. }
  165. }