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

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.  * Utility functions. (Gecko version).
  22.  */
  23. FCKTools.CancelEvent = function( e )
  24. {
  25. if ( e )
  26. e.preventDefault() ;
  27. }
  28. FCKTools.DisableSelection = function( element )
  29. {
  30. if ( FCKBrowserInfo.IsGecko )
  31. element.style.MozUserSelect = 'none' ; // Gecko only.
  32. else if ( FCKBrowserInfo.IsSafari )
  33. element.style.KhtmlUserSelect = 'none' ; // WebKit only.
  34. else
  35. element.style.userSelect = 'none' ; // CSS3 (not supported yet).
  36. }
  37. // Appends a CSS file to a document.
  38. FCKTools._AppendStyleSheet = function( documentElement, cssFileUrl )
  39. {
  40. var e = documentElement.createElement( 'LINK' ) ;
  41. e.rel = 'stylesheet' ;
  42. e.type = 'text/css' ;
  43. e.href = cssFileUrl ;
  44. documentElement.getElementsByTagName("HEAD")[0].appendChild( e ) ;
  45. return e ;
  46. }
  47. // Appends a CSS style string to a document.
  48. FCKTools.AppendStyleString = function( documentElement, cssStyles )
  49. {
  50. if ( !cssStyles )
  51. return null ;
  52. var e = documentElement.createElement( "STYLE" ) ;
  53. e.appendChild( documentElement.createTextNode( cssStyles ) ) ;
  54. documentElement.getElementsByTagName( "HEAD" )[0].appendChild( e ) ;
  55. return e ;
  56. }
  57. // Removes all attributes and values from the element.
  58. FCKTools.ClearElementAttributes = function( element )
  59. {
  60. // Loop throw all attributes in the element
  61. for ( var i = 0 ; i < element.attributes.length ; i++ )
  62. {
  63. // Remove the element by name.
  64. element.removeAttribute( element.attributes[i].name, 0 ) ; // 0 : Case Insensitive
  65. }
  66. }
  67. // Returns an Array of strings with all defined in the elements inside another element.
  68. FCKTools.GetAllChildrenIds = function( parentElement )
  69. {
  70. // Create the array that will hold all Ids.
  71. var aIds = new Array() ;
  72. // Define a recursive function that search for the Ids.
  73. var fGetIds = function( parent )
  74. {
  75. for ( var i = 0 ; i < parent.childNodes.length ; i++ )
  76. {
  77. var sId = parent.childNodes[i].id ;
  78. // Check if the Id is defined for the element.
  79. if ( sId && sId.length > 0 ) aIds[ aIds.length ] = sId ;
  80. // Recursive call.
  81. fGetIds( parent.childNodes[i] ) ;
  82. }
  83. }
  84. // Start the recursive calls.
  85. fGetIds( parentElement ) ;
  86. return aIds ;
  87. }
  88. // Replaces a tag with its contents. For example "<span>My <b>tag</b></span>"
  89. // will be replaced with "My <b>tag</b>".
  90. FCKTools.RemoveOuterTags = function( e )
  91. {
  92. var oFragment = e.ownerDocument.createDocumentFragment() ;
  93. for ( var i = 0 ; i < e.childNodes.length ; i++ )
  94. oFragment.appendChild( e.childNodes[i].cloneNode(true) ) ;
  95. e.parentNode.replaceChild( oFragment, e ) ;
  96. }
  97. FCKTools.CreateXmlObject = function( object )
  98. {
  99. switch ( object )
  100. {
  101. case 'XmlHttp' :
  102. return new XMLHttpRequest() ;
  103. case 'DOMDocument' :
  104. // Originaly, we were had the following here:
  105. // return document.implementation.createDocument( '', '', null ) ;
  106. // But that doesn't work if we're running under domain relaxation mode, so we need a workaround.
  107. // See http://ajaxian.com/archives/xml-messages-with-cross-domain-json about the trick we're using.
  108. var doc = ( new DOMParser() ).parseFromString( '<tmp></tmp>', 'text/xml' ) ;
  109. FCKDomTools.RemoveNode( doc.firstChild ) ;
  110. return doc ;
  111. }
  112. return null ;
  113. }
  114. FCKTools.GetScrollPosition = function( relativeWindow )
  115. {
  116. return { X : relativeWindow.pageXOffset, Y : relativeWindow.pageYOffset } ;
  117. }
  118. FCKTools.AddEventListener = function( sourceObject, eventName, listener )
  119. {
  120. sourceObject.addEventListener( eventName, listener, false ) ;
  121. }
  122. FCKTools.RemoveEventListener = function( sourceObject, eventName, listener )
  123. {
  124. sourceObject.removeEventListener( eventName, listener, false ) ;
  125. }
  126. // Listeners attached with this function cannot be detached.
  127. FCKTools.AddEventListenerEx = function( sourceObject, eventName, listener, paramsArray )
  128. {
  129. sourceObject.addEventListener(
  130. eventName,
  131. function( e )
  132. {
  133. listener.apply( sourceObject, [ e ].concat( paramsArray || [] ) ) ;
  134. },
  135. false
  136. ) ;
  137. }
  138. // Returns and object with the "Width" and "Height" properties.
  139. FCKTools.GetViewPaneSize = function( win )
  140. {
  141. return { Width : win.innerWidth, Height : win.innerHeight } ;
  142. }
  143. FCKTools.SaveStyles = function( element )
  144. {
  145. var data = FCKTools.ProtectFormStyles( element ) ;
  146. var oSavedStyles = new Object() ;
  147. if ( element.className.length > 0 )
  148. {
  149. oSavedStyles.Class = element.className ;
  150. element.className = '' ;
  151. }
  152. var sInlineStyle = element.getAttribute( 'style' ) ;
  153. if ( sInlineStyle && sInlineStyle.length > 0 )
  154. {
  155. oSavedStyles.Inline = sInlineStyle ;
  156. element.setAttribute( 'style', '', 0 ) ; // 0 : Case Insensitive
  157. }
  158. FCKTools.RestoreFormStyles( element, data ) ;
  159. return oSavedStyles ;
  160. }
  161. FCKTools.RestoreStyles = function( element, savedStyles )
  162. {
  163. var data = FCKTools.ProtectFormStyles( element ) ;
  164. element.className = savedStyles.Class || '' ;
  165. if ( savedStyles.Inline )
  166. element.setAttribute( 'style', savedStyles.Inline, 0 ) ; // 0 : Case Insensitive
  167. else
  168. element.removeAttribute( 'style', 0 ) ;
  169. FCKTools.RestoreFormStyles( element, data ) ;
  170. }
  171. FCKTools.RegisterDollarFunction = function( targetWindow )
  172. {
  173. targetWindow.$ = function( id )
  174. {
  175. return targetWindow.document.getElementById( id ) ;
  176. } ;
  177. }
  178. FCKTools.AppendElement = function( target, elementName )
  179. {
  180. return target.appendChild( target.ownerDocument.createElement( elementName ) ) ;
  181. }
  182. // Get the coordinates of an element.
  183. // @el : The element to get the position.
  184. // @relativeWindow: The window to which we want the coordinates relative to.
  185. FCKTools.GetElementPosition = function( el, relativeWindow )
  186. {
  187. // Initializes the Coordinates object that will be returned by the function.
  188. var c = { X:0, Y:0 } ;
  189. var oWindow = relativeWindow || window ;
  190. var oOwnerWindow = FCKTools.GetElementWindow( el ) ;
  191. var previousElement = null ;
  192. // Loop throw the offset chain.
  193. while ( el )
  194. {
  195. var sPosition = oOwnerWindow.getComputedStyle(el, '').position ;
  196. // Check for non "static" elements.
  197. // 'FCKConfig.FloatingPanelsZIndex' -- Submenus are under a positioned IFRAME.
  198. if ( sPosition && sPosition != 'static' && el.style.zIndex != FCKConfig.FloatingPanelsZIndex )
  199. break ;
  200. /*
  201. FCKDebug.Output( el.tagName + ":" + "offset=" + el.offsetLeft + "," + el.offsetTop + "  "
  202. + "scroll=" + el.scrollLeft + "," + el.scrollTop ) ;
  203. */
  204. c.X += el.offsetLeft - el.scrollLeft ;
  205. c.Y += el.offsetTop - el.scrollTop  ;
  206. // Backtrack due to offsetParent's calculation by the browser ignores scrollLeft and scrollTop.
  207. // Backtracking is not needed for Opera
  208. if ( ! FCKBrowserInfo.IsOpera )
  209. {
  210. var scrollElement = previousElement ;
  211. while ( scrollElement && scrollElement != el )
  212. {
  213. c.X -= scrollElement.scrollLeft ;
  214. c.Y -= scrollElement.scrollTop ;
  215. scrollElement = scrollElement.parentNode ;
  216. }
  217. }
  218. previousElement = el ;
  219. if ( el.offsetParent )
  220. el = el.offsetParent ;
  221. else
  222. {
  223. if ( oOwnerWindow != oWindow )
  224. {
  225. el = oOwnerWindow.frameElement ;
  226. previousElement = null ;
  227. if ( el )
  228. oOwnerWindow = FCKTools.GetElementWindow( el ) ;
  229. }
  230. else
  231. {
  232. c.X += el.scrollLeft ;
  233. c.Y += el.scrollTop  ;
  234. break ;
  235. }
  236. }
  237. }
  238. // Return the Coordinates object
  239. return c ;
  240. }