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

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.
  22.  */
  23. var FCKTools = new Object() ;
  24. FCKTools.CreateBogusBR = function( targetDocument )
  25. {
  26. var eBR = targetDocument.createElement( 'br' ) ;
  27. // eBR.setAttribute( '_moz_editor_bogus_node', 'TRUE' ) ;
  28. eBR.setAttribute( 'type', '_moz' ) ;
  29. return eBR ;
  30. }
  31. /**
  32.  * Fixes relative URL entries defined inside CSS styles by appending a prefix
  33.  * to them.
  34.  * @param (String) cssStyles The CSS styles definition possibly containing url()
  35.  * paths.
  36.  * @param (String) urlFixPrefix The prefix to append to relative URLs.
  37.  */
  38. FCKTools.FixCssUrls = function( urlFixPrefix, cssStyles )
  39. {
  40. if ( !urlFixPrefix || urlFixPrefix.length == 0 )
  41. return cssStyles ;
  42. return cssStyles.replace( /urls*(([s'"]*)(.*?)([s"']*))/g, function( match, opener, path, closer )
  43. {
  44. if ( /^/|^w?:/.test( path ) )
  45. return match ;
  46. else
  47. return 'url(' + opener + urlFixPrefix + path + closer + ')' ;
  48. } ) ;
  49. }
  50. FCKTools._GetUrlFixedCss = function( cssStyles, urlFixPrefix )
  51. {
  52. var match = cssStyles.match( /^([^|]+)|([sS]*)/ ) ;
  53. if ( match )
  54. return FCKTools.FixCssUrls( match[1], match[2] ) ;
  55. else
  56. return cssStyles ;
  57. }
  58. /**
  59.  * Appends a <link css> or <style> element to the document.
  60.  * @param (Object) documentElement The DOM document object to which append the
  61.  * stylesheet.
  62.  * @param (Variant) cssFileOrDef A String pointing to the CSS file URL or an
  63.  * Array with many CSS file URLs or the CSS definitions for the <style>
  64.  * element.
  65.  * @return {Array} An array containing all elements created in the target
  66.  * document. It may include <link> or <style> elements, depending on the
  67.  * value passed with cssFileOrDef.
  68.  */
  69. FCKTools.AppendStyleSheet = function( domDocument, cssFileOrArrayOrDef )
  70. {
  71. if ( !cssFileOrArrayOrDef )
  72. return [] ;
  73. if ( typeof( cssFileOrArrayOrDef ) == 'string' )
  74. {
  75. // Test if the passed argument is an URL.
  76. if ( /[\/.][^{}]*$/.test( cssFileOrArrayOrDef ) )
  77. {
  78. // The string may have several URLs separated by comma.
  79. return this.AppendStyleSheet( domDocument, cssFileOrArrayOrDef.split(',') ) ;
  80. }
  81. else
  82. return [ this.AppendStyleString( domDocument, FCKTools._GetUrlFixedCss( cssFileOrArrayOrDef ) ) ] ;
  83. }
  84. else
  85. {
  86. var styles = [] ;
  87. for ( var i = 0 ; i < cssFileOrArrayOrDef.length ; i++ )
  88. styles.push( this._AppendStyleSheet( domDocument, cssFileOrArrayOrDef[i] ) ) ;
  89. return styles ;
  90. }
  91. }
  92. FCKTools.GetStyleHtml = (function()
  93. {
  94. var getStyle = function( styleDef, markTemp )
  95. {
  96. if ( styleDef.length == 0 )
  97. return '' ;
  98. var temp = markTemp ? ' _fcktemp="true"' : '' ;
  99. return '<' + 'style type="text/css"' + temp + '>' + styleDef + '<' + '/style>' ;
  100. }
  101. var getLink = function( cssFileUrl, markTemp )
  102. {
  103. if ( cssFileUrl.length == 0 )
  104. return '' ;
  105. var temp = markTemp ? ' _fcktemp="true"' : '' ;
  106. return '<' + 'link href="' + cssFileUrl + '" type="text/css" rel="stylesheet" ' + temp + '/>' ;
  107. }
  108. return function( cssFileOrArrayOrDef, markTemp )
  109. {
  110. if ( !cssFileOrArrayOrDef )
  111. return '' ;
  112. if ( typeof( cssFileOrArrayOrDef ) == 'string' )
  113. {
  114. // Test if the passed argument is an URL.
  115. if ( /[\/.][^{}]*$/.test( cssFileOrArrayOrDef ) )
  116. {
  117. // The string may have several URLs separated by comma.
  118. return this.GetStyleHtml( cssFileOrArrayOrDef.split(','), markTemp ) ;
  119. }
  120. else
  121. return getStyle( this._GetUrlFixedCss( cssFileOrArrayOrDef ), markTemp ) ;
  122. }
  123. else
  124. {
  125. var html = '' ;
  126. for ( var i = 0 ; i < cssFileOrArrayOrDef.length ; i++ )
  127. html += getLink( cssFileOrArrayOrDef[i], markTemp ) ;
  128. return html ;
  129. }
  130. }
  131. })() ;
  132. FCKTools.GetElementDocument = function ( element )
  133. {
  134. return element.ownerDocument || element.document ;
  135. }
  136. // Get the window object where the element is placed in.
  137. FCKTools.GetElementWindow = function( element )
  138. {
  139. return this.GetDocumentWindow( this.GetElementDocument( element ) ) ;
  140. }
  141. FCKTools.GetDocumentWindow = function( document )
  142. {
  143. // With Safari, there is not way to retrieve the window from the document, so we must fix it.
  144. if ( FCKBrowserInfo.IsSafari && !document.parentWindow )
  145. this.FixDocumentParentWindow( window.top ) ;
  146. return document.parentWindow || document.defaultView ;
  147. }
  148. /*
  149. This is a Safari specific function that fix the reference to the parent
  150. window from the document object.
  151. */
  152. FCKTools.FixDocumentParentWindow = function( targetWindow )
  153. {
  154. if ( targetWindow.document )
  155. targetWindow.document.parentWindow = targetWindow ;
  156. for ( var i = 0 ; i < targetWindow.frames.length ; i++ )
  157. FCKTools.FixDocumentParentWindow( targetWindow.frames[i] ) ;
  158. }
  159. FCKTools.HTMLEncode = function( text )
  160. {
  161. if ( !text )
  162. return '' ;
  163. text = text.replace( /&/g, '&amp;' ) ;
  164. text = text.replace( /</g, '&lt;' ) ;
  165. text = text.replace( />/g, '&gt;' ) ;
  166. return text ;
  167. }
  168. FCKTools.HTMLDecode = function( text )
  169. {
  170. if ( !text )
  171. return '' ;
  172. text = text.replace( /&gt;/g, '>' ) ;
  173. text = text.replace( /&lt;/g, '<' ) ;
  174. text = text.replace( /&amp;/g, '&' ) ;
  175. return text ;
  176. }
  177. FCKTools._ProcessLineBreaksForPMode = function( oEditor, text, liState, node, strArray )
  178. {
  179. var closeState = 0 ;
  180. var blockStartTag = "<p>" ;
  181. var blockEndTag = "</p>" ;
  182. var lineBreakTag = "<br />" ;
  183. if ( liState )
  184. {
  185. blockStartTag = "<li>" ;
  186. blockEndTag = "</li>" ;
  187. closeState = 1 ;
  188. }
  189. // Are we currently inside a <p> tag now?
  190. // If yes, close it at the next double line break.
  191. while ( node && node != oEditor.FCK.EditorDocument.body )
  192. {
  193. if ( node.tagName.toLowerCase() == 'p' )
  194. {
  195. closeState = 1 ;
  196. break;
  197. }
  198. node = node.parentNode ;
  199. }
  200. for ( var i = 0 ; i < text.length ; i++ )
  201. {
  202. var c = text.charAt( i ) ;
  203. if ( c == 'r' )
  204. continue ;
  205. if ( c != 'n' )
  206. {
  207. strArray.push( c ) ;
  208. continue ;
  209. }
  210. // Now we have encountered a line break.
  211. // Check if the next character is also a line break.
  212. var n = text.charAt( i + 1 ) ;
  213. if ( n == 'r' )
  214. {
  215. i++ ;
  216. n = text.charAt( i + 1 ) ;
  217. }
  218. if ( n == 'n' )
  219. {
  220. i++ ; // ignore next character - we have already processed it.
  221. if ( closeState )
  222. strArray.push( blockEndTag ) ;
  223. strArray.push( blockStartTag ) ;
  224. closeState = 1 ;
  225. }
  226. else
  227. strArray.push( lineBreakTag ) ;
  228. }
  229. }
  230. FCKTools._ProcessLineBreaksForDivMode = function( oEditor, text, liState, node, strArray )
  231. {
  232. var closeState = 0 ;
  233. var blockStartTag = "<div>" ;
  234. var blockEndTag = "</div>" ;
  235. if ( liState )
  236. {
  237. blockStartTag = "<li>" ;
  238. blockEndTag = "</li>" ;
  239. closeState = 1 ;
  240. }
  241. // Are we currently inside a <div> tag now?
  242. // If yes, close it at the next double line break.
  243. while ( node && node != oEditor.FCK.EditorDocument.body )
  244. {
  245. if ( node.tagName.toLowerCase() == 'div' )
  246. {
  247. closeState = 1 ;
  248. break ;
  249. }
  250. node = node.parentNode ;
  251. }
  252. for ( var i = 0 ; i < text.length ; i++ )
  253. {
  254. var c = text.charAt( i ) ;
  255. if ( c == 'r' )
  256. continue ;
  257. if ( c != 'n' )
  258. {
  259. strArray.push( c ) ;
  260. continue ;
  261. }
  262. if ( closeState )
  263. {
  264. if ( strArray[ strArray.length - 1 ] == blockStartTag )
  265. {
  266. // A div tag must have some contents inside for it to be visible.
  267. strArray.push( "&nbsp;" ) ;
  268. }
  269. strArray.push( blockEndTag ) ;
  270. }
  271. strArray.push( blockStartTag ) ;
  272. closeState = 1 ;
  273. }
  274. if ( closeState )
  275. strArray.push( blockEndTag ) ;
  276. }
  277. FCKTools._ProcessLineBreaksForBrMode = function( oEditor, text, liState, node, strArray )
  278. {
  279. var closeState = 0 ;
  280. var blockStartTag = "<br />" ;
  281. var blockEndTag = "" ;
  282. if ( liState )
  283. {
  284. blockStartTag = "<li>" ;
  285. blockEndTag = "</li>" ;
  286. closeState = 1 ;
  287. }
  288. for ( var i = 0 ; i < text.length ; i++ )
  289. {
  290. var c = text.charAt( i ) ;
  291. if ( c == 'r' )
  292. continue ;
  293. if ( c != 'n' )
  294. {
  295. strArray.push( c ) ;
  296. continue ;
  297. }
  298. if ( closeState && blockEndTag.length )
  299. strArray.push ( blockEndTag ) ;
  300. strArray.push( blockStartTag ) ;
  301. closeState = 1 ;
  302. }
  303. }
  304. FCKTools.ProcessLineBreaks = function( oEditor, oConfig, text )
  305. {
  306. var enterMode = oConfig.EnterMode.toLowerCase() ;
  307. var strArray = [] ;
  308. // Is the caret or selection inside an <li> tag now?
  309. var liState = 0 ;
  310. var range = new oEditor.FCKDomRange( oEditor.FCK.EditorWindow ) ;
  311. range.MoveToSelection() ;
  312. var node = range._Range.startContainer ;
  313. while ( node && node.nodeType != 1 )
  314. node = node.parentNode ;
  315. if ( node && node.tagName.toLowerCase() == 'li' )
  316. liState = 1 ;
  317. if ( enterMode == 'p' )
  318. this._ProcessLineBreaksForPMode( oEditor, text, liState, node, strArray ) ;
  319. else if ( enterMode == 'div' )
  320. this._ProcessLineBreaksForDivMode( oEditor, text, liState, node, strArray ) ;
  321. else if ( enterMode == 'br' )
  322. this._ProcessLineBreaksForBrMode( oEditor, text, liState, node, strArray ) ;
  323. return strArray.join( "" ) ;
  324. }
  325. /**
  326.  * Adds an option to a SELECT element.
  327.  */
  328. FCKTools.AddSelectOption = function( selectElement, optionText, optionValue )
  329. {
  330. var oOption = FCKTools.GetElementDocument( selectElement ).createElement( "OPTION" ) ;
  331. oOption.text = optionText ;
  332. oOption.value = optionValue ;
  333. selectElement.options.add(oOption) ;
  334. return oOption ;
  335. }
  336. FCKTools.RunFunction = function( func, thisObject, paramsArray, timerWindow )
  337. {
  338. if ( func )
  339. this.SetTimeout( func, 0, thisObject, paramsArray, timerWindow ) ;
  340. }
  341. FCKTools.SetTimeout = function( func, milliseconds, thisObject, paramsArray, timerWindow )
  342. {
  343. return ( timerWindow || window ).setTimeout(
  344. function()
  345. {
  346. if ( paramsArray )
  347. func.apply( thisObject, [].concat( paramsArray ) ) ;
  348. else
  349. func.apply( thisObject ) ;
  350. },
  351. milliseconds ) ;
  352. }
  353. FCKTools.SetInterval = function( func, milliseconds, thisObject, paramsArray, timerWindow )
  354. {
  355. return ( timerWindow || window ).setInterval(
  356. function()
  357. {
  358. func.apply( thisObject, paramsArray || [] ) ;
  359. },
  360. milliseconds ) ;
  361. }
  362. FCKTools.ConvertStyleSizeToHtml = function( size )
  363. {
  364. return size.EndsWith( '%' ) ? size : parseInt( size, 10 ) ;
  365. }
  366. FCKTools.ConvertHtmlSizeToStyle = function( size )
  367. {
  368. return size.EndsWith( '%' ) ? size : ( size + 'px' ) ;
  369. }
  370. // START iCM MODIFICATIONS
  371. // Amended to accept a list of one or more ascensor tag names
  372. // Amended to check the element itself before working back up through the parent hierarchy
  373. FCKTools.GetElementAscensor = function( element, ascensorTagNames )
  374. {
  375. // var e = element.parentNode ;
  376. var e = element ;
  377. var lstTags = "," + ascensorTagNames.toUpperCase() + "," ;
  378. while ( e )
  379. {
  380. if ( lstTags.indexOf( "," + e.nodeName.toUpperCase() + "," ) != -1 )
  381. return e ;
  382. e = e.parentNode ;
  383. }
  384. return null ;
  385. }
  386. // END iCM MODIFICATIONS
  387. FCKTools.CreateEventListener = function( func, params )
  388. {
  389. var f = function()
  390. {
  391. var aAllParams = [] ;
  392. for ( var i = 0 ; i < arguments.length ; i++ )
  393. aAllParams.push( arguments[i] ) ;
  394. func.apply( this, aAllParams.concat( params ) ) ;
  395. }
  396. return f ;
  397. }
  398. FCKTools.IsStrictMode = function( document )
  399. {
  400. // There is no compatMode in Safari, but it seams that it always behave as
  401. // CSS1Compat, so let's assume it as the default for that browser.
  402. return ( 'CSS1Compat' == ( document.compatMode || ( FCKBrowserInfo.IsSafari ? 'CSS1Compat' : null ) ) ) ;
  403. }
  404. // Transforms a "arguments" object to an array.
  405. FCKTools.ArgumentsToArray = function( args, startIndex, maxLength )
  406. {
  407. startIndex = startIndex || 0 ;
  408. maxLength = maxLength || args.length ;
  409. var argsArray = new Array() ;
  410. for ( var i = startIndex ; i < startIndex + maxLength && i < args.length ; i++ )
  411. argsArray.push( args[i] ) ;
  412. return argsArray ;
  413. }
  414. FCKTools.CloneObject = function( sourceObject )
  415. {
  416. var fCloneCreator = function() {} ;
  417. fCloneCreator.prototype = sourceObject ;
  418. return new fCloneCreator ;
  419. }
  420. // Appends a bogus <br> at the end of the element, if not yet available.
  421. FCKTools.AppendBogusBr = function( element )
  422. {
  423. if ( !element )
  424. return ;
  425. var eLastChild = this.GetLastItem( element.getElementsByTagName('br') ) ;
  426. if ( !eLastChild || ( eLastChild.getAttribute( 'type', 2 ) != '_moz' && eLastChild.getAttribute( '_moz_dirty' ) == null ) )
  427. {
  428. var doc = this.GetElementDocument( element ) ;
  429. if ( FCKBrowserInfo.IsOpera )
  430. element.appendChild( doc.createTextNode('') ) ;
  431. else
  432. element.appendChild( this.CreateBogusBR( doc ) ) ;
  433. }
  434. }
  435. FCKTools.GetLastItem = function( list )
  436. {
  437. if ( list.length > 0 )
  438. return list[ list.length - 1 ] ;
  439. return null ;
  440. }
  441. FCKTools.GetDocumentPosition = function( w, node )
  442. {
  443. var x = 0 ;
  444. var y = 0 ;
  445. var curNode = node ;
  446. var prevNode = null ;
  447. var curWindow = FCKTools.GetElementWindow( curNode ) ;
  448. while ( curNode && !( curWindow == w && ( curNode == w.document.body || curNode == w.document.documentElement ) ) )
  449. {
  450. x += curNode.offsetLeft - curNode.scrollLeft ;
  451. y += curNode.offsetTop - curNode.scrollTop ;
  452. if ( ! FCKBrowserInfo.IsOpera )
  453. {
  454. var scrollNode = prevNode ;
  455. while ( scrollNode && scrollNode != curNode )
  456. {
  457. x -= scrollNode.scrollLeft ;
  458. y -= scrollNode.scrollTop ;
  459. scrollNode = scrollNode.parentNode ;
  460. }
  461. }
  462. prevNode = curNode ;
  463. if ( curNode.offsetParent )
  464. curNode = curNode.offsetParent ;
  465. else
  466. {
  467. if ( curWindow != w )
  468. {
  469. curNode = curWindow.frameElement ;
  470. prevNode = null ;
  471. if ( curNode )
  472. curWindow = curNode.contentWindow.parent ;
  473. }
  474. else
  475. curNode = null ;
  476. }
  477. }
  478. // document.body is a special case when it comes to offsetTop and offsetLeft values.
  479. // 1. It matters if document.body itself is a positioned element;
  480. // 2. It matters is when we're in IE and the element has no positioned ancestor.
  481. // Otherwise the values should be ignored.
  482. if ( FCKDomTools.GetCurrentElementStyle( w.document.body, 'position') != 'static'
  483. || ( FCKBrowserInfo.IsIE && FCKDomTools.GetPositionedAncestor( node ) == null ) )
  484. {
  485. x += w.document.body.offsetLeft ;
  486. y += w.document.body.offsetTop ;
  487. }
  488. return { "x" : x, "y" : y } ;
  489. }
  490. FCKTools.GetWindowPosition = function( w, node )
  491. {
  492. var pos = this.GetDocumentPosition( w, node ) ;
  493. var scroll = FCKTools.GetScrollPosition( w ) ;
  494. pos.x -= scroll.X ;
  495. pos.y -= scroll.Y ;
  496. return pos ;
  497. }
  498. FCKTools.ProtectFormStyles = function( formNode )
  499. {
  500. if ( !formNode || formNode.nodeType != 1 || formNode.tagName.toLowerCase() != 'form' )
  501. return [] ;
  502. var hijackRecord = [] ;
  503. var hijackNames = [ 'style', 'className' ] ;
  504. for ( var i = 0 ; i < hijackNames.length ; i++ )
  505. {
  506. var name = hijackNames[i] ;
  507. if ( formNode.elements.namedItem( name ) )
  508. {
  509. var hijackNode = formNode.elements.namedItem( name ) ;
  510. hijackRecord.push( [ hijackNode, hijackNode.nextSibling ] ) ;
  511. formNode.removeChild( hijackNode ) ;
  512. }
  513. }
  514. return hijackRecord ;
  515. }
  516. FCKTools.RestoreFormStyles = function( formNode, hijackRecord )
  517. {
  518. if ( !formNode || formNode.nodeType != 1 || formNode.tagName.toLowerCase() != 'form' )
  519. return ;
  520. if ( hijackRecord.length > 0 )
  521. {
  522. for ( var i = hijackRecord.length - 1 ; i >= 0 ; i-- )
  523. {
  524. var node = hijackRecord[i][0] ;
  525. var sibling = hijackRecord[i][1] ;
  526. if ( sibling )
  527. formNode.insertBefore( node, sibling ) ;
  528. else
  529. formNode.appendChild( node ) ;
  530. }
  531. }
  532. }
  533. // Perform a one-step DFS walk.
  534. FCKTools.GetNextNode = function( node, limitNode )
  535. {
  536. if ( node.firstChild )
  537. return node.firstChild ;
  538. else if ( node.nextSibling )
  539. return node.nextSibling ;
  540. else
  541. {
  542. var ancestor = node.parentNode ;
  543. while ( ancestor )
  544. {
  545. if ( ancestor == limitNode )
  546. return null ;
  547. if ( ancestor.nextSibling )
  548. return ancestor.nextSibling ;
  549. else
  550. ancestor = ancestor.parentNode ;
  551. }
  552. }
  553. return null ;
  554. }
  555. FCKTools.GetNextTextNode = function( textnode, limitNode, checkStop )
  556. {
  557. node = this.GetNextNode( textnode, limitNode ) ;
  558. if ( checkStop && node && checkStop( node ) )
  559. return null ;
  560. while ( node && node.nodeType != 3 )
  561. {
  562. node = this.GetNextNode( node, limitNode ) ;
  563. if ( checkStop && node && checkStop( node ) )
  564. return null ;
  565. }
  566. return node ;
  567. }
  568. /**
  569.  * Merge all objects passed by argument into a single object.
  570.  */
  571. FCKTools.Merge = function()
  572. {
  573. var args = arguments ;
  574. var o = args[0] ;
  575. for ( var i = 1 ; i < args.length ; i++ )
  576. {
  577. var arg = args[i] ;
  578. for ( var p in arg )
  579. o[p] = arg[p] ;
  580. }
  581. return o ;
  582. }
  583. /**
  584.  * Check if the passed argument is a real Array. It may not working when
  585.  * calling it cross windows.
  586.  */
  587. FCKTools.IsArray = function( it )
  588. {
  589. return ( it instanceof Array ) ;
  590. }
  591. /**
  592.  * Appends a "length" property to an object, containing the number of
  593.  * properties available on it, excluded the append property itself.
  594.  */
  595. FCKTools.AppendLengthProperty = function( targetObject, propertyName )
  596. {
  597. var counter = 0 ;
  598. for ( var n in targetObject )
  599. counter++ ;
  600. return targetObject[ propertyName || 'length' ] = counter ;
  601. }
  602. /**
  603.  * Gets the browser parsed version of a css text (style attribute value). On
  604.  * some cases, the browser makes changes to the css text, returning a different
  605.  * value. For example, hexadecimal colors get transformed to rgb().
  606.  */
  607. FCKTools.NormalizeCssText = function( unparsedCssText )
  608. {
  609. // Injects the style in a temporary span object, so the browser parses it,
  610. // retrieving its final format.
  611. var tempSpan = document.createElement( 'span' ) ;
  612. tempSpan.style.cssText = unparsedCssText ;
  613. return tempSpan.style.cssText ;
  614. }
  615. /**
  616.  * Binding the "this" reference to an object for a function.
  617.  */
  618. FCKTools.Bind = function( subject, func )
  619. {
  620.   return function(){ return func.apply( subject, arguments ) ; } ;
  621. }
  622. /**
  623.  * Retrieve the correct "empty iframe" URL for the current browser, which
  624.  * causes the minimum fuzz (e.g. security warnings in HTTPS, DNS error in
  625.  * IE5.5, etc.) for that browser, making the iframe ready to DOM use whithout
  626.  * having to loading an external file.
  627.  */
  628. FCKTools.GetVoidUrl = function()
  629. {
  630. if ( FCK_IS_CUSTOM_DOMAIN )
  631. return "javascript: void( function(){" +
  632. "document.open();" +
  633. "document.write('<html><head><title></title></head><body></body></html>');" +
  634. "document.domain = '" + FCK_RUNTIME_DOMAIN + "';" +
  635. "document.close();" +
  636. "}() ) ;";
  637. if ( FCKBrowserInfo.IsIE )
  638. {
  639. if ( FCKBrowserInfo.IsIE7 || !FCKBrowserInfo.IsIE6 )
  640. return "" ; // IE7+ / IE5.5
  641. else
  642. return "javascript: '';" ; // IE6+
  643. }
  644. return "javascript: void(0);" ; // All other browsers.
  645. }
  646. FCKTools.ResetStyles = function( element )
  647. {
  648. element.style.cssText = 'margin:0;' +
  649. 'padding:0;' +
  650. 'border:0;' +
  651. 'background-color:transparent;' +
  652. 'background-image:none;' ;
  653. }