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

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.  * Definition of other commands that are not available internaly in the
  22.  * browser (see FCKNamedCommand).
  23.  */
  24. // ### General Dialog Box Commands.
  25. var FCKDialogCommand = function( name, title, url, width, height, getStateFunction, getStateParam, customValue )
  26. {
  27. this.Name = name ;
  28. this.Title = title ;
  29. this.Url = url ;
  30. this.Width = width ;
  31. this.Height = height ;
  32. this.CustomValue = customValue ;
  33. this.GetStateFunction = getStateFunction ;
  34. this.GetStateParam = getStateParam ;
  35. this.Resizable = false ;
  36. }
  37. FCKDialogCommand.prototype.Execute = function()
  38. {
  39. FCKDialog.OpenDialog( 'FCKDialog_' + this.Name , this.Title, this.Url, this.Width, this.Height, this.CustomValue, null, this.Resizable ) ;
  40. }
  41. FCKDialogCommand.prototype.GetState = function()
  42. {
  43. if ( this.GetStateFunction )
  44. return this.GetStateFunction( this.GetStateParam ) ;
  45. else
  46. return FCK.EditMode == FCK_EDITMODE_WYSIWYG ? FCK_TRISTATE_OFF : FCK_TRISTATE_DISABLED ;
  47. }
  48. // Generic Undefined command (usually used when a command is under development).
  49. var FCKUndefinedCommand = function()
  50. {
  51. this.Name = 'Undefined' ;
  52. }
  53. FCKUndefinedCommand.prototype.Execute = function()
  54. {
  55. alert( FCKLang.NotImplemented ) ;
  56. }
  57. FCKUndefinedCommand.prototype.GetState = function()
  58. {
  59. return FCK_TRISTATE_OFF ;
  60. }
  61. // ### FormatBlock
  62. var FCKFormatBlockCommand = function()
  63. {}
  64. FCKFormatBlockCommand.prototype =
  65. {
  66. Name : 'FormatBlock',
  67. Execute : FCKStyleCommand.prototype.Execute,
  68. GetState : function()
  69. {
  70. return FCK.EditorDocument ? FCK_TRISTATE_OFF : FCK_TRISTATE_DISABLED ;
  71. }
  72. };
  73. // ### FontName
  74. var FCKFontNameCommand = function()
  75. {}
  76. FCKFontNameCommand.prototype =
  77. {
  78. Name : 'FontName',
  79. Execute : FCKStyleCommand.prototype.Execute,
  80. GetState : FCKFormatBlockCommand.prototype.GetState
  81. };
  82. // ### FontSize
  83. var FCKFontSizeCommand = function()
  84. {}
  85. FCKFontSizeCommand.prototype =
  86. {
  87. Name : 'FontSize',
  88. Execute : FCKStyleCommand.prototype.Execute,
  89. GetState : FCKFormatBlockCommand.prototype.GetState
  90. };
  91. // ### Preview
  92. var FCKPreviewCommand = function()
  93. {
  94. this.Name = 'Preview' ;
  95. }
  96. FCKPreviewCommand.prototype.Execute = function()
  97. {
  98.      FCK.Preview() ;
  99. }
  100. FCKPreviewCommand.prototype.GetState = function()
  101. {
  102. return FCK_TRISTATE_OFF ;
  103. }
  104. // ### Save
  105. var FCKSaveCommand = function()
  106. {
  107. this.Name = 'Save' ;
  108. }
  109. FCKSaveCommand.prototype.Execute = function()
  110. {
  111. // Get the linked field form.
  112. var oForm = FCK.GetParentForm() ;
  113. if ( typeof( oForm.onsubmit ) == 'function' )
  114. {
  115. var bRet = oForm.onsubmit() ;
  116. if ( bRet != null && bRet === false )
  117. return ;
  118. }
  119. // Submit the form.
  120. // If there's a button named "submit" then the form.submit() function is masked and
  121. // can't be called in Mozilla, so we call the click() method of that button.
  122. if ( typeof( oForm.submit ) == 'function' )
  123. oForm.submit() ;
  124. else
  125. oForm.submit.click() ;
  126. }
  127. FCKSaveCommand.prototype.GetState = function()
  128. {
  129. return FCK_TRISTATE_OFF ;
  130. }
  131. // ### NewPage
  132. var FCKNewPageCommand = function()
  133. {
  134. this.Name = 'NewPage' ;
  135. }
  136. FCKNewPageCommand.prototype.Execute = function()
  137. {
  138. FCKUndo.SaveUndoStep() ;
  139. FCK.SetData( '' ) ;
  140. FCKUndo.Typing = true ;
  141. FCK.Focus() ;
  142. }
  143. FCKNewPageCommand.prototype.GetState = function()
  144. {
  145. return FCK_TRISTATE_OFF ;
  146. }
  147. // ### Source button
  148. var FCKSourceCommand = function()
  149. {
  150. this.Name = 'Source' ;
  151. }
  152. FCKSourceCommand.prototype.Execute = function()
  153. {
  154. if ( FCKConfig.SourcePopup ) // Until v2.2, it was mandatory for FCKBrowserInfo.IsGecko.
  155. {
  156. var iWidth = FCKConfig.ScreenWidth * 0.65 ;
  157. var iHeight = FCKConfig.ScreenHeight * 0.65 ;
  158. FCKDialog.OpenDialog( 'FCKDialog_Source', FCKLang.Source, 'dialog/fck_source.html', iWidth, iHeight, null, null, true ) ;
  159. }
  160. else
  161.     FCK.SwitchEditMode() ;
  162. }
  163. FCKSourceCommand.prototype.GetState = function()
  164. {
  165. return ( FCK.EditMode == FCK_EDITMODE_WYSIWYG ? FCK_TRISTATE_OFF : FCK_TRISTATE_ON ) ;
  166. }
  167. // ### Undo
  168. var FCKUndoCommand = function()
  169. {
  170. this.Name = 'Undo' ;
  171. }
  172. FCKUndoCommand.prototype.Execute = function()
  173. {
  174. FCKUndo.Undo() ;
  175. }
  176. FCKUndoCommand.prototype.GetState = function()
  177. {
  178. if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG )
  179. return FCK_TRISTATE_DISABLED ;
  180. return ( FCKUndo.CheckUndoState() ? FCK_TRISTATE_OFF : FCK_TRISTATE_DISABLED ) ;
  181. }
  182. // ### Redo
  183. var FCKRedoCommand = function()
  184. {
  185. this.Name = 'Redo' ;
  186. }
  187. FCKRedoCommand.prototype.Execute = function()
  188. {
  189. FCKUndo.Redo() ;
  190. }
  191. FCKRedoCommand.prototype.GetState = function()
  192. {
  193. if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG )
  194. return FCK_TRISTATE_DISABLED ;
  195. return ( FCKUndo.CheckRedoState() ? FCK_TRISTATE_OFF : FCK_TRISTATE_DISABLED ) ;
  196. }
  197. // ### Page Break
  198. var FCKPageBreakCommand = function()
  199. {
  200. this.Name = 'PageBreak' ;
  201. }
  202. FCKPageBreakCommand.prototype.Execute = function()
  203. {
  204. // Take an undo snapshot before changing the document
  205. FCKUndo.SaveUndoStep() ;
  206. // var e = FCK.EditorDocument.createElement( 'CENTER' ) ;
  207. // e.style.pageBreakAfter = 'always' ;
  208. // Tidy was removing the empty CENTER tags, so the following solution has
  209. // been found. It also validates correctly as XHTML 1.0 Strict.
  210. var e = FCK.EditorDocument.createElement( 'DIV' ) ;
  211. e.style.pageBreakAfter = 'always' ;
  212. e.innerHTML = '<span style="DISPLAY:none">&nbsp;</span>' ;
  213. var oFakeImage = FCKDocumentProcessor_CreateFakeImage( 'FCK__PageBreak', e ) ;
  214. var oRange = new FCKDomRange( FCK.EditorWindow ) ;
  215. oRange.MoveToSelection() ;
  216. var oSplitInfo = oRange.SplitBlock() ;
  217. oRange.InsertNode( oFakeImage ) ;
  218. FCK.Events.FireEvent( 'OnSelectionChange' ) ;
  219. }
  220. FCKPageBreakCommand.prototype.GetState = function()
  221. {
  222. if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG )
  223. return FCK_TRISTATE_DISABLED ;
  224. return 0 ; // FCK_TRISTATE_OFF
  225. }
  226. // FCKUnlinkCommand - by Johnny Egeland (johnny@coretrek.com)
  227. var FCKUnlinkCommand = function()
  228. {
  229. this.Name = 'Unlink' ;
  230. }
  231. FCKUnlinkCommand.prototype.Execute = function()
  232. {
  233. // Take an undo snapshot before changing the document
  234. FCKUndo.SaveUndoStep() ;
  235. if ( FCKBrowserInfo.IsGeckoLike )
  236. {
  237. var oLink = FCK.Selection.MoveToAncestorNode( 'A' ) ;
  238. // The unlink command can generate a span in Firefox, so let's do it our way. See #430
  239. if ( oLink )
  240. FCKTools.RemoveOuterTags( oLink ) ;
  241. return ;
  242. }
  243. FCK.ExecuteNamedCommand( this.Name ) ;
  244. }
  245. FCKUnlinkCommand.prototype.GetState = function()
  246. {
  247. if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG )
  248. return FCK_TRISTATE_DISABLED ;
  249. var state = FCK.GetNamedCommandState( this.Name ) ;
  250. // Check that it isn't an anchor
  251. if ( state == FCK_TRISTATE_OFF && FCK.EditMode == FCK_EDITMODE_WYSIWYG )
  252. {
  253. var oLink = FCKSelection.MoveToAncestorNode( 'A' ) ;
  254. var bIsAnchor = ( oLink && oLink.name.length > 0 && oLink.href.length == 0 ) ;
  255. if ( bIsAnchor )
  256. state = FCK_TRISTATE_DISABLED ;
  257. }
  258. return state ;
  259. }
  260. var FCKVisitLinkCommand = function()
  261. {
  262. this.Name = 'VisitLink';
  263. }
  264. FCKVisitLinkCommand.prototype =
  265. {
  266. GetState : function()
  267. {
  268. if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG )
  269. return FCK_TRISTATE_DISABLED ;
  270. var state = FCK.GetNamedCommandState( 'Unlink' ) ;
  271. if ( state == FCK_TRISTATE_OFF )
  272. {
  273. var el = FCKSelection.MoveToAncestorNode( 'A' ) ;
  274. if ( !el.href )
  275. state = FCK_TRISTATE_DISABLED ;
  276. }
  277. return state ;
  278. },
  279. Execute : function()
  280. {
  281. var el = FCKSelection.MoveToAncestorNode( 'A' ) ;
  282. var url = el.getAttribute( '_fcksavedurl' ) || el.getAttribute( 'href', 2 ) ;
  283. // Check if it's a full URL.
  284. // If not full URL, we'll need to apply the BaseHref setting.
  285. if ( ! /:///.test( url ) )
  286. {
  287. var baseHref = FCKConfig.BaseHref ;
  288. var parentWindow = FCK.GetInstanceObject( 'parent' ) ;
  289. if ( !baseHref )
  290. {
  291. baseHref = parentWindow.document.location.href ;
  292. baseHref = baseHref.substring( 0, baseHref.lastIndexOf( '/' ) + 1 ) ;
  293. }
  294. if ( /^//.test( url ) )
  295. {
  296. try
  297. {
  298. baseHref = baseHref.match( /^.*://+[^/]+/ )[0] ;
  299. }
  300. catch ( e )
  301. {
  302. baseHref = parentWindow.document.location.protocol + '://' + parentWindow.parent.document.location.host ;
  303. }
  304. }
  305. url = baseHref + url ;
  306. }
  307. if ( !window.open( url, '_blank' ) )
  308. alert( FCKLang.VisitLinkBlocked ) ;
  309. }
  310. } ;
  311. // FCKSelectAllCommand
  312. var FCKSelectAllCommand = function()
  313. {
  314. this.Name = 'SelectAll' ;
  315. }
  316. FCKSelectAllCommand.prototype.Execute = function()
  317. {
  318. if ( FCK.EditMode == FCK_EDITMODE_WYSIWYG )
  319. {
  320. FCK.ExecuteNamedCommand( 'SelectAll' ) ;
  321. }
  322. else
  323. {
  324. // Select the contents of the textarea
  325. var textarea = FCK.EditingArea.Textarea ;
  326. if ( FCKBrowserInfo.IsIE )
  327. {
  328. textarea.createTextRange().execCommand( 'SelectAll' ) ;
  329. }
  330. else
  331. {
  332. textarea.selectionStart = 0 ;
  333. textarea.selectionEnd = textarea.value.length ;
  334. }
  335. textarea.focus() ;
  336. }
  337. }
  338. FCKSelectAllCommand.prototype.GetState = function()
  339. {
  340. if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG )
  341. return FCK_TRISTATE_DISABLED ;
  342. return FCK_TRISTATE_OFF ;
  343. }
  344. // FCKPasteCommand
  345. var FCKPasteCommand = function()
  346. {
  347. this.Name = 'Paste' ;
  348. }
  349. FCKPasteCommand.prototype =
  350. {
  351. Execute : function()
  352. {
  353. if ( FCKBrowserInfo.IsIE )
  354. FCK.Paste() ;
  355. else
  356. FCK.ExecuteNamedCommand( 'Paste' ) ;
  357. },
  358. GetState : function()
  359. {
  360. if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG )
  361. return FCK_TRISTATE_DISABLED ;
  362. return FCK.GetNamedCommandState( 'Paste' ) ;
  363. }
  364. } ;
  365. // FCKRuleCommand
  366. var FCKRuleCommand = function()
  367. {
  368. this.Name = 'Rule' ;
  369. }
  370. FCKRuleCommand.prototype =
  371. {
  372. Execute : function()
  373. {
  374. FCKUndo.SaveUndoStep() ;
  375. FCK.InsertElement( 'hr' ) ;
  376. },
  377. GetState : function()
  378. {
  379. if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG )
  380. return FCK_TRISTATE_DISABLED ;
  381. return FCK.GetNamedCommandState( 'InsertHorizontalRule' ) ;
  382. }
  383. } ;
  384. // FCKCutCopyCommand
  385. var FCKCutCopyCommand = function( isCut )
  386. {
  387. this.Name = isCut ? 'Cut' : 'Copy' ;
  388. }
  389. FCKCutCopyCommand.prototype =
  390. {
  391. Execute : function()
  392. {
  393. var enabled = false ;
  394. if ( FCKBrowserInfo.IsIE )
  395. {
  396. // The following seems to be the only reliable way to detect that
  397. // cut/copy is enabled in IE. It will fire the oncut/oncopy event
  398. // only if the security settings enabled the command to execute.
  399. var onEvent = function()
  400. {
  401. enabled = true ;
  402. } ;
  403. var eventName = 'on' + this.Name.toLowerCase() ;
  404. FCK.EditorDocument.body.attachEvent( eventName, onEvent ) ;
  405. FCK.ExecuteNamedCommand( this.Name ) ;
  406. FCK.EditorDocument.body.detachEvent( eventName, onEvent ) ;
  407. }
  408. else
  409. {
  410. try
  411. {
  412. // Other browsers throw an error if the command is disabled.
  413. FCK.ExecuteNamedCommand( this.Name ) ;
  414. enabled = true ;
  415. }
  416. catch(e){}
  417. }
  418. if ( !enabled )
  419. alert( FCKLang[ 'PasteError' + this.Name ] ) ;
  420. },
  421. GetState : function()
  422. {
  423. // Strangely, the Cut command happens to have the correct states for
  424. // both Copy and Cut in all browsers.
  425. return FCK.EditMode != FCK_EDITMODE_WYSIWYG ?
  426. FCK_TRISTATE_DISABLED :
  427. FCK.GetNamedCommandState( 'Cut' ) ;
  428. }
  429. };
  430. var FCKAnchorDeleteCommand = function()
  431. {
  432. this.Name = 'AnchorDelete' ;
  433. }
  434. FCKAnchorDeleteCommand.prototype =
  435. {
  436. Execute : function()
  437. {
  438. if (FCK.Selection.GetType() == 'Control')
  439. {
  440. FCK.Selection.Delete();
  441. }
  442. else
  443. {
  444. var oFakeImage = FCK.Selection.GetSelectedElement() ;
  445. if ( oFakeImage )
  446. {
  447. if ( oFakeImage.tagName == 'IMG' && oFakeImage.getAttribute('_fckanchor') )
  448. oAnchor = FCK.GetRealElement( oFakeImage ) ;
  449. else
  450. oFakeImage = null ;
  451. }
  452. //Search for a real anchor
  453. if ( !oFakeImage )
  454. {
  455. oAnchor = FCK.Selection.MoveToAncestorNode( 'A' ) ;
  456. if ( oAnchor )
  457. FCK.Selection.SelectNode( oAnchor ) ;
  458. }
  459. // If it's also a link, then just remove the name and exit
  460. if ( oAnchor.href.length != 0 )
  461. {
  462. oAnchor.removeAttribute( 'name' ) ;
  463. // Remove temporary class for IE
  464. if ( FCKBrowserInfo.IsIE )
  465. oAnchor.className = oAnchor.className.replace( FCKRegexLib.FCK_Class, '' ) ;
  466. return ;
  467. }
  468. // We need to remove the anchor
  469. // If we got a fake image, then just remove it and we're done
  470. if ( oFakeImage )
  471. {
  472. oFakeImage.parentNode.removeChild( oFakeImage ) ;
  473. return ;
  474. }
  475. // Empty anchor, so just remove it
  476. if ( oAnchor.innerHTML.length == 0 )
  477. {
  478. oAnchor.parentNode.removeChild( oAnchor ) ;
  479. return ;
  480. }
  481. // Anchor with content, leave the content
  482. FCKTools.RemoveOuterTags( oAnchor ) ;
  483. }
  484. if ( FCKBrowserInfo.IsGecko )
  485. FCK.Selection.Collapse( true ) ;
  486. },
  487. GetState : function()
  488. {
  489. if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG )
  490. return FCK_TRISTATE_DISABLED ;
  491. return FCK.GetNamedCommandState( 'Unlink') ;
  492. }
  493. };
  494. var FCKDeleteDivCommand = function()
  495. {
  496. }
  497. FCKDeleteDivCommand.prototype =
  498. {
  499. GetState : function()
  500. {
  501. if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG )
  502. return FCK_TRISTATE_DISABLED ;
  503. var node = FCKSelection.GetParentElement() ;
  504. var path = new FCKElementPath( node ) ;
  505. return path.BlockLimit && path.BlockLimit.nodeName.IEquals( 'div' ) ? FCK_TRISTATE_OFF : FCK_TRISTATE_DISABLED ;
  506. },
  507. Execute : function()
  508. {
  509. // Create an undo snapshot before doing anything.
  510. FCKUndo.SaveUndoStep() ;
  511. // Find out the nodes to delete.
  512. var nodes = FCKDomTools.GetSelectedDivContainers() ;
  513. // Remember the current selection position.
  514. var range = new FCKDomRange( FCK.EditorWindow ) ;
  515. range.MoveToSelection() ;
  516. var bookmark = range.CreateBookmark() ;
  517. // Delete the container DIV node.
  518. for ( var i = 0 ; i < nodes.length ; i++)
  519. FCKDomTools.RemoveNode( nodes[i], true ) ;
  520. // Restore selection.
  521. range.MoveToBookmark( bookmark ) ;
  522. range.Select() ;
  523. }
  524. } ;
  525. // FCKRuleCommand
  526. var FCKNbsp = function()
  527. {
  528. this.Name = 'Non Breaking Space' ;
  529. }
  530. FCKNbsp.prototype =
  531. {
  532. Execute : function()
  533. {
  534. FCK.InsertHtml( '&nbsp;' ) ;
  535. },
  536. GetState : function()
  537. {
  538. return ( FCK.EditMode != FCK_EDITMODE_WYSIWYG ? FCK_TRISTATE_DISABLED : FCK_TRISTATE_OFF ) ;
  539. }
  540. } ;