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

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.  * Defines the FCKToolbarSet object that is used to load and draw the
  22.  * toolbar.
  23.  */
  24. function FCKToolbarSet_Create( overhideLocation )
  25. {
  26. var oToolbarSet ;
  27. var sLocation = overhideLocation || FCKConfig.ToolbarLocation ;
  28. switch ( sLocation )
  29. {
  30. case 'In' :
  31. document.getElementById( 'xToolbarRow' ).style.display = '' ;
  32. oToolbarSet = new FCKToolbarSet( document ) ;
  33. break ;
  34. case 'None' :
  35. oToolbarSet = new FCKToolbarSet( document ) ;
  36. break ;
  37. // case 'OutTop' :
  38. // Not supported.
  39. default :
  40. FCK.Events.AttachEvent( 'OnBlur', FCK_OnBlur ) ;
  41. FCK.Events.AttachEvent( 'OnFocus', FCK_OnFocus ) ;
  42. var eToolbarTarget ;
  43. // Out:[TargetWindow]([TargetId])
  44. var oOutMatch = sLocation.match( /^Out:(.+)((w+))$/ ) ;
  45. if ( oOutMatch )
  46. {
  47. if ( FCKBrowserInfo.IsAIR )
  48. FCKAdobeAIR.ToolbarSet_GetOutElement( window, oOutMatch ) ;
  49. else
  50. eToolbarTarget = eval( 'parent.' + oOutMatch[1] ).document.getElementById( oOutMatch[2] ) ;
  51. }
  52. else
  53. {
  54. // Out:[TargetId]
  55. oOutMatch = sLocation.match( /^Out:(w+)$/ ) ;
  56. if ( oOutMatch )
  57. eToolbarTarget = parent.document.getElementById( oOutMatch[1] ) ;
  58. }
  59. if ( !eToolbarTarget )
  60. {
  61. alert( 'Invalid value for "ToolbarLocation"' ) ;
  62. return arguments.callee( 'In' );
  63. }
  64. // If it is a shared toolbar, it may be already available in the target element.
  65. oToolbarSet = eToolbarTarget.__FCKToolbarSet ;
  66. if ( oToolbarSet )
  67. break ;
  68. // Create the IFRAME that will hold the toolbar inside the target element.
  69. var eToolbarIFrame = FCKTools.GetElementDocument( eToolbarTarget ).createElement( 'iframe' ) ;
  70. eToolbarIFrame.src = 'javascript:void(0)' ;
  71. eToolbarIFrame.frameBorder = 0 ;
  72. eToolbarIFrame.width = '100%' ;
  73. eToolbarIFrame.height = '10' ;
  74. eToolbarTarget.appendChild( eToolbarIFrame ) ;
  75. eToolbarIFrame.unselectable = 'on' ;
  76. // Write the basic HTML for the toolbar (copy from the editor main page).
  77. var eTargetDocument = eToolbarIFrame.contentWindow.document ;
  78. // Workaround for Safari 12256. Ticket #63
  79. var sBase = '' ;
  80. if ( FCKBrowserInfo.IsSafari )
  81. sBase = '<base href="' + window.document.location + '">' ;
  82. // Initialize the IFRAME document body.
  83. eTargetDocument.open() ;
  84. eTargetDocument.write( '<html><head>' + sBase + '<script type="text/javascript"> var adjust = function() { window.frameElement.height = document.body.scrollHeight ; }; '
  85. + 'window.onresize = window.onload = '
  86. + 'function(){' // poll scrollHeight until it no longer changes for 1 sec.
  87. + 'var timer = null;'
  88. + 'var lastHeight = -1;'
  89. + 'var lastChange = 0;'
  90. + 'var poller = function(){'
  91. + 'var currentHeight = document.body.scrollHeight || 0;'
  92. + 'var currentTime = (new Date()).getTime();'
  93. + 'if (currentHeight != lastHeight){'
  94. + 'lastChange = currentTime;'
  95. + 'adjust();'
  96. + 'lastHeight = document.body.scrollHeight;'
  97. + '}'
  98. + 'if (lastChange < currentTime - 1000) clearInterval(timer);'
  99. + '};'
  100. + 'timer = setInterval(poller, 100);'
  101. + '}'
  102. + '</script></head><body style="overflow: hidden">' + document.getElementById( 'xToolbarSpace' ).innerHTML + '</body></html>' ) ;
  103. eTargetDocument.close() ;
  104. if( FCKBrowserInfo.IsAIR )
  105. FCKAdobeAIR.ToolbarSet_InitOutFrame( eTargetDocument ) ;
  106. FCKTools.AddEventListener( eTargetDocument, 'contextmenu', FCKTools.CancelEvent ) ;
  107. // Load external resources (must be done here, otherwise Firefox will not
  108. // have the document DOM ready to be used right away.
  109. FCKTools.AppendStyleSheet( eTargetDocument, FCKConfig.SkinEditorCSS ) ;
  110. oToolbarSet = eToolbarTarget.__FCKToolbarSet = new FCKToolbarSet( eTargetDocument ) ;
  111. oToolbarSet._IFrame = eToolbarIFrame ;
  112. if ( FCK.IECleanup )
  113. FCK.IECleanup.AddItem( eToolbarTarget, FCKToolbarSet_Target_Cleanup ) ;
  114. }
  115. oToolbarSet.CurrentInstance = FCK ;
  116. if ( !oToolbarSet.ToolbarItems )
  117. oToolbarSet.ToolbarItems = FCKToolbarItems ;
  118. FCK.AttachToOnSelectionChange( oToolbarSet.RefreshItemsState ) ;
  119. return oToolbarSet ;
  120. }
  121. function FCK_OnBlur( editorInstance )
  122. {
  123. var eToolbarSet = editorInstance.ToolbarSet ;
  124. if ( eToolbarSet.CurrentInstance == editorInstance )
  125. eToolbarSet.Disable() ;
  126. }
  127. function FCK_OnFocus( editorInstance )
  128. {
  129. var oToolbarset = editorInstance.ToolbarSet ;
  130. var oInstance = editorInstance || FCK ;
  131. // Unregister the toolbar window from the current instance.
  132. oToolbarset.CurrentInstance.FocusManager.RemoveWindow( oToolbarset._IFrame.contentWindow ) ;
  133. // Set the new current instance.
  134. oToolbarset.CurrentInstance = oInstance ;
  135. // Register the toolbar window in the current instance.
  136. oInstance.FocusManager.AddWindow( oToolbarset._IFrame.contentWindow, true ) ;
  137. oToolbarset.Enable() ;
  138. }
  139. function FCKToolbarSet_Cleanup()
  140. {
  141. this._TargetElement = null ;
  142. this._IFrame = null ;
  143. }
  144. function FCKToolbarSet_Target_Cleanup()
  145. {
  146. this.__FCKToolbarSet = null ;
  147. }
  148. var FCKToolbarSet = function( targetDocument )
  149. {
  150. this._Document = targetDocument ;
  151. // Get the element that will hold the elements structure.
  152. this._TargetElement = targetDocument.getElementById( 'xToolbar' ) ;
  153. // Setup the expand and collapse handlers.
  154. var eExpandHandle = targetDocument.getElementById( 'xExpandHandle' ) ;
  155. var eCollapseHandle = targetDocument.getElementById( 'xCollapseHandle' ) ;
  156. eExpandHandle.title = FCKLang.ToolbarExpand ;
  157. FCKTools.AddEventListener( eExpandHandle, 'click', FCKToolbarSet_Expand_OnClick ) ;
  158. eCollapseHandle.title = FCKLang.ToolbarCollapse ;
  159. FCKTools.AddEventListener( eCollapseHandle, 'click', FCKToolbarSet_Collapse_OnClick ) ;
  160. // Set the toolbar state at startup.
  161. if ( !FCKConfig.ToolbarCanCollapse || FCKConfig.ToolbarStartExpanded )
  162. this.Expand() ;
  163. else
  164. this.Collapse() ;
  165. // Enable/disable the collapse handler
  166. eCollapseHandle.style.display = FCKConfig.ToolbarCanCollapse ? '' : 'none' ;
  167. if ( FCKConfig.ToolbarCanCollapse )
  168. eCollapseHandle.style.display = '' ;
  169. else
  170. targetDocument.getElementById( 'xTBLeftBorder' ).style.display = '' ;
  171. // Set the default properties.
  172. this.Toolbars = new Array() ;
  173. this.IsLoaded = false ;
  174. if ( FCK.IECleanup )
  175. FCK.IECleanup.AddItem( this, FCKToolbarSet_Cleanup ) ;
  176. }
  177. function FCKToolbarSet_Expand_OnClick()
  178. {
  179. FCK.ToolbarSet.Expand() ;
  180. }
  181. function FCKToolbarSet_Collapse_OnClick()
  182. {
  183. FCK.ToolbarSet.Collapse() ;
  184. }
  185. FCKToolbarSet.prototype.Expand = function()
  186. {
  187. this._ChangeVisibility( false ) ;
  188. }
  189. FCKToolbarSet.prototype.Collapse = function()
  190. {
  191. this._ChangeVisibility( true ) ;
  192. }
  193. FCKToolbarSet.prototype._ChangeVisibility = function( collapse )
  194. {
  195. this._Document.getElementById( 'xCollapsed' ).style.display = collapse ? '' : 'none' ;
  196. this._Document.getElementById( 'xExpanded' ).style.display = collapse ? 'none' : '' ;
  197. if ( FCKBrowserInfo.IsGecko )
  198. {
  199. // I had to use "setTimeout" because Gecko was not responding in a right
  200. // way when calling window.onresize() directly.
  201. FCKTools.RunFunction( window.onresize ) ;
  202. }
  203. }
  204. FCKToolbarSet.prototype.Load = function( toolbarSetName )
  205. {
  206. this.Name = toolbarSetName ;
  207. this.Items = new Array() ;
  208. // Reset the array of toolbar items that are active only on WYSIWYG mode.
  209. this.ItemsWysiwygOnly = new Array() ;
  210. // Reset the array of toolbar items that are sensitive to the cursor position.
  211. this.ItemsContextSensitive = new Array() ;
  212. // Cleanup the target element.
  213. this._TargetElement.innerHTML = '' ;
  214. var ToolbarSet = FCKConfig.ToolbarSets[toolbarSetName] ;
  215. if ( !ToolbarSet )
  216. {
  217. alert( FCKLang.UnknownToolbarSet.replace( /%1/g, toolbarSetName ) ) ;
  218. return ;
  219. }
  220. this.Toolbars = new Array() ;
  221. for ( var x = 0 ; x < ToolbarSet.length ; x++ )
  222. {
  223. var oToolbarItems = ToolbarSet[x] ;
  224. // If the configuration for the toolbar is missing some element or has any extra comma
  225. // this item won't be valid, so skip it and keep on processing.
  226. if ( !oToolbarItems )
  227. continue ;
  228. var oToolbar ;
  229. if ( typeof( oToolbarItems ) == 'string' )
  230. {
  231. if ( oToolbarItems == '/' )
  232. oToolbar = new FCKToolbarBreak() ;
  233. }
  234. else
  235. {
  236. oToolbar = new FCKToolbar() ;
  237. for ( var j = 0 ; j < oToolbarItems.length ; j++ )
  238. {
  239. var sItem = oToolbarItems[j] ;
  240. if ( sItem == '-')
  241. oToolbar.AddSeparator() ;
  242. else
  243. {
  244. var oItem = FCKToolbarItems.GetItem( sItem ) ;
  245. if ( oItem )
  246. {
  247. oToolbar.AddItem( oItem ) ;
  248. this.Items.push( oItem ) ;
  249. if ( !oItem.SourceView )
  250. this.ItemsWysiwygOnly.push( oItem ) ;
  251. if ( oItem.ContextSensitive )
  252. this.ItemsContextSensitive.push( oItem ) ;
  253. }
  254. }
  255. }
  256. // oToolbar.AddTerminator() ;
  257. }
  258. oToolbar.Create( this._TargetElement ) ;
  259. this.Toolbars[ this.Toolbars.length ] = oToolbar ;
  260. }
  261. FCKTools.DisableSelection( this._Document.getElementById( 'xCollapseHandle' ).parentNode ) ;
  262. if ( FCK.Status != FCK_STATUS_COMPLETE )
  263. FCK.Events.AttachEvent( 'OnStatusChange', this.RefreshModeState ) ;
  264. else
  265. this.RefreshModeState() ;
  266. this.IsLoaded = true ;
  267. this.IsEnabled = true ;
  268. FCKTools.RunFunction( this.OnLoad ) ;
  269. }
  270. FCKToolbarSet.prototype.Enable = function()
  271. {
  272. if ( this.IsEnabled )
  273. return ;
  274. this.IsEnabled = true ;
  275. var aItems = this.Items ;
  276. for ( var i = 0 ; i < aItems.length ; i++ )
  277. aItems[i].RefreshState() ;
  278. }
  279. FCKToolbarSet.prototype.Disable = function()
  280. {
  281. if ( !this.IsEnabled )
  282. return ;
  283. this.IsEnabled = false ;
  284. var aItems = this.Items ;
  285. for ( var i = 0 ; i < aItems.length ; i++ )
  286. aItems[i].Disable() ;
  287. }
  288. FCKToolbarSet.prototype.RefreshModeState = function( editorInstance )
  289. {
  290. if ( FCK.Status != FCK_STATUS_COMPLETE )
  291. return ;
  292. var oToolbarSet = editorInstance ? editorInstance.ToolbarSet : this ;
  293. var aItems = oToolbarSet.ItemsWysiwygOnly ;
  294. if ( FCK.EditMode == FCK_EDITMODE_WYSIWYG )
  295. {
  296. // Enable all buttons that are available on WYSIWYG mode only.
  297. for ( var i = 0 ; i < aItems.length ; i++ )
  298. aItems[i].Enable() ;
  299. // Refresh the buttons state.
  300. oToolbarSet.RefreshItemsState( editorInstance ) ;
  301. }
  302. else
  303. {
  304. // Refresh the buttons state.
  305. oToolbarSet.RefreshItemsState( editorInstance ) ;
  306. // Disable all buttons that are available on WYSIWYG mode only.
  307. for ( var j = 0 ; j < aItems.length ; j++ )
  308. aItems[j].Disable() ;
  309. }
  310. }
  311. FCKToolbarSet.prototype.RefreshItemsState = function( editorInstance )
  312. {
  313. var aItems = ( editorInstance ? editorInstance.ToolbarSet : this ).ItemsContextSensitive ;
  314. for ( var i = 0 ; i < aItems.length ; i++ )
  315. aItems[i].RefreshState() ;
  316. }