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

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.  * Useful functions used by almost all dialog window pages.
  22.  * Dialogs should link to this file as the very first script on the page.
  23.  */
  24. // Automatically detect the correct document.domain (#123).
  25. (function()
  26. {
  27. var d = document.domain ;
  28. while ( true )
  29. {
  30. // Test if we can access a parent property.
  31. try
  32. {
  33. var test = window.parent.document.domain ;
  34. break ;
  35. }
  36. catch( e ) {}
  37. // Remove a domain part: www.mytest.example.com => mytest.example.com => example.com ...
  38. d = d.replace( /.*?(?:.|$)/, '' ) ;
  39. if ( d.length == 0 )
  40. break ; // It was not able to detect the domain.
  41. try
  42. {
  43. document.domain = d ;
  44. }
  45. catch (e)
  46. {
  47. break ;
  48. }
  49. }
  50. })() ;
  51. // Attention: FCKConfig must be available in the page.
  52. function GetCommonDialogCss( prefix )
  53. {
  54. // CSS minified by http://iceyboard.no-ip.org/projects/css_compressor (see _dev/css_compression.txt).
  55. return FCKConfig.BasePath + 'dialog/common/' + '|.ImagePreviewArea{border:#000 1px solid;overflow:auto;width:100%;height:170px;background-color:#fff}.FlashPreviewArea{border:#000 1px solid;padding:5px;overflow:auto;width:100%;height:170px;background-color:#fff}.BtnReset{float:left;background-position:center center;background-image:url(images/reset.gif);width:16px;height:16px;background-repeat:no-repeat;border:1px none;font-size:1px}.BtnLocked,.BtnUnlocked{float:left;background-position:center center;background-image:url(images/locked.gif);width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.BtnUnlocked{background-image:url(images/unlocked.gif)}.BtnOver{border:outset 1px;cursor:pointer;cursor:hand}' ;
  56. }
  57. // Gets a element by its Id. Used for shorter coding.
  58. function GetE( elementId )
  59. {
  60. return document.getElementById( elementId )  ;
  61. }
  62. function ShowE( element, isVisible )
  63. {
  64. if ( typeof( element ) == 'string' )
  65. element = GetE( element ) ;
  66. element.style.display = isVisible ? '' : 'none' ;
  67. }
  68. function SetAttribute( element, attName, attValue )
  69. {
  70. if ( attValue == null || attValue.length == 0 )
  71. element.removeAttribute( attName, 0 ) ; // 0 : Case Insensitive
  72. else
  73. element.setAttribute( attName, attValue, 0 ) ; // 0 : Case Insensitive
  74. }
  75. function GetAttribute( element, attName, valueIfNull )
  76. {
  77. var oAtt = element.attributes[attName] ;
  78. if ( oAtt == null || !oAtt.specified )
  79. return valueIfNull ? valueIfNull : '' ;
  80. var oValue = element.getAttribute( attName, 2 ) ;
  81. if ( oValue == null )
  82. oValue = oAtt.nodeValue ;
  83. return ( oValue == null ? valueIfNull : oValue ) ;
  84. }
  85. function SelectField( elementId )
  86. {
  87. var element = GetE( elementId ) ;
  88. element.focus() ;
  89. // element.select may not be available for some fields (like <select>).
  90. if ( element.select )
  91. element.select() ;
  92. }
  93. // Functions used by text fields to accept numbers only.
  94. var IsDigit = ( function()
  95. {
  96. var KeyIdentifierMap =
  97. {
  98. End : 35,
  99. Home : 36,
  100. Left : 37,
  101. Right : 39,
  102. 'U+00007F' : 46 // Delete
  103. } ;
  104. return function ( e )
  105. {
  106. if ( !e )
  107. e = event ;
  108. var iCode = ( e.keyCode || e.charCode ) ;
  109. if ( !iCode && e.keyIdentifier && ( e.keyIdentifier in KeyIdentifierMap ) )
  110. iCode = KeyIdentifierMap[ e.keyIdentifier ] ;
  111. return (
  112. ( iCode >= 48 && iCode <= 57 ) // Numbers
  113. || (iCode >= 35 && iCode <= 40) // Arrows, Home, End
  114. || iCode == 8 // Backspace
  115. || iCode == 46 // Delete
  116. || iCode == 9 // Tab
  117. ) ;
  118. }
  119. } )() ;
  120. String.prototype.Trim = function()
  121. {
  122. return this.replace( /(^s*)|(s*$)/g, '' ) ;
  123. }
  124. String.prototype.StartsWith = function( value )
  125. {
  126. return ( this.substr( 0, value.length ) == value ) ;
  127. }
  128. String.prototype.Remove = function( start, length )
  129. {
  130. var s = '' ;
  131. if ( start > 0 )
  132. s = this.substring( 0, start ) ;
  133. if ( start + length < this.length )
  134. s += this.substring( start + length , this.length ) ;
  135. return s ;
  136. }
  137. String.prototype.ReplaceAll = function( searchArray, replaceArray )
  138. {
  139. var replaced = this ;
  140. for ( var i = 0 ; i < searchArray.length ; i++ )
  141. {
  142. replaced = replaced.replace( searchArray[i], replaceArray[i] ) ;
  143. }
  144. return replaced ;
  145. }
  146. function OpenFileBrowser( url, width, height )
  147. {
  148. // oEditor must be defined.
  149. var iLeft = ( oEditor.FCKConfig.ScreenWidth  - width ) / 2 ;
  150. var iTop  = ( oEditor.FCKConfig.ScreenHeight - height ) / 2 ;
  151. var sOptions = "toolbar=no,status=no,resizable=yes,dependent=yes,scrollbars=yes" ;
  152. sOptions += ",width=" + width ;
  153. sOptions += ",height=" + height ;
  154. sOptions += ",left=" + iLeft ;
  155. sOptions += ",top=" + iTop ;
  156. window.open( url, 'FCKBrowseWindow', sOptions ) ;
  157. }
  158. /**
  159.  Utility function to create/update an element with a name attribute in IE, so it behaves properly when moved around
  160.  It also allows to change the name or other special attributes in an existing node
  161. oEditor : instance of FCKeditor where the element will be created
  162. oOriginal : current element being edited or null if it has to be created
  163. nodeName : string with the name of the element to create
  164. oAttributes : Hash object with the attributes that must be set at creation time in IE
  165. Those attributes will be set also after the element has been
  166. created for any other browser to avoid redudant code
  167. */
  168. function CreateNamedElement( oEditor, oOriginal, nodeName, oAttributes )
  169. {
  170. var oNewNode ;
  171. // IE doesn't allow easily to change properties of an existing object,
  172. // so remove the old and force the creation of a new one.
  173. var oldNode = null ;
  174. if ( oOriginal && oEditor.FCKBrowserInfo.IsIE )
  175. {
  176. // Force the creation only if some of the special attributes have changed:
  177. var bChanged = false;
  178. for( var attName in oAttributes )
  179. bChanged |= ( oOriginal.getAttribute( attName, 2) != oAttributes[attName] ) ;
  180. if ( bChanged )
  181. {
  182. oldNode = oOriginal ;
  183. oOriginal = null ;
  184. }
  185. }
  186. // If the node existed (and it's not IE), then we just have to update its attributes
  187. if ( oOriginal )
  188. {
  189. oNewNode = oOriginal ;
  190. }
  191. else
  192. {
  193. // #676, IE doesn't play nice with the name or type attribute
  194. if ( oEditor.FCKBrowserInfo.IsIE )
  195. {
  196. var sbHTML = [] ;
  197. sbHTML.push( '<' + nodeName ) ;
  198. for( var prop in oAttributes )
  199. {
  200. sbHTML.push( ' ' + prop + '="' + oAttributes[prop] + '"' ) ;
  201. }
  202. sbHTML.push( '>' ) ;
  203. if ( !oEditor.FCKListsLib.EmptyElements[nodeName.toLowerCase()] )
  204. sbHTML.push( '</' + nodeName + '>' ) ;
  205. oNewNode = oEditor.FCK.EditorDocument.createElement( sbHTML.join('') ) ;
  206. // Check if we are just changing the properties of an existing node: copy its properties
  207. if ( oldNode )
  208. {
  209. CopyAttributes( oldNode, oNewNode, oAttributes ) ;
  210. oEditor.FCKDomTools.MoveChildren( oldNode, oNewNode ) ;
  211. oldNode.parentNode.removeChild( oldNode ) ;
  212. oldNode = null ;
  213. if ( oEditor.FCK.Selection.SelectionData )
  214. {
  215. // Trick to refresh the selection object and avoid error in
  216. // fckdialog.html Selection.EnsureSelection
  217. var oSel = oEditor.FCK.EditorDocument.selection ;
  218. oEditor.FCK.Selection.SelectionData = oSel.createRange() ; // Now oSel.type will be 'None' reflecting the real situation
  219. }
  220. }
  221. oNewNode = oEditor.FCK.InsertElement( oNewNode ) ;
  222. // FCK.Selection.SelectionData is broken by now since we've
  223. // deleted the previously selected element. So we need to reassign it.
  224. if ( oEditor.FCK.Selection.SelectionData )
  225. {
  226. var range = oEditor.FCK.EditorDocument.body.createControlRange() ;
  227. range.add( oNewNode ) ;
  228. oEditor.FCK.Selection.SelectionData = range ;
  229. }
  230. }
  231. else
  232. {
  233. oNewNode = oEditor.FCK.InsertElement( nodeName ) ;
  234. }
  235. }
  236. // Set the basic attributes
  237. for( var attName in oAttributes )
  238. oNewNode.setAttribute( attName, oAttributes[attName], 0 ) ; // 0 : Case Insensitive
  239. return oNewNode ;
  240. }
  241. // Copy all the attributes from one node to the other, kinda like a clone
  242. // But oSkipAttributes is an object with the attributes that must NOT be copied
  243. function CopyAttributes( oSource, oDest, oSkipAttributes )
  244. {
  245. var aAttributes = oSource.attributes ;
  246. for ( var n = 0 ; n < aAttributes.length ; n++ )
  247. {
  248. var oAttribute = aAttributes[n] ;
  249. if ( oAttribute.specified )
  250. {
  251. var sAttName = oAttribute.nodeName ;
  252. // We can set the type only once, so do it with the proper value, not copying it.
  253. if ( sAttName in oSkipAttributes )
  254. continue ;
  255. var sAttValue = oSource.getAttribute( sAttName, 2 ) ;
  256. if ( sAttValue == null )
  257. sAttValue = oAttribute.nodeValue ;
  258. oDest.setAttribute( sAttName, sAttValue, 0 ) ; // 0 : Case Insensitive
  259. }
  260. }
  261. // The style:
  262. if ( oSource.style.cssText !== '' )
  263. oDest.style.cssText = oSource.style.cssText ;
  264. }
  265. /**
  266. * Replaces a tag with another one, keeping its contents:
  267. * for example TD --> TH, and TH --> TD.
  268. * input: the original node, and the new tag name
  269. * http://www.w3.org/TR/DOM-Level-3-Core/core.html#Document3-renameNode
  270. */
  271. function RenameNode( oNode , newTag )
  272. {
  273. // TODO: if the browser natively supports document.renameNode call it.
  274. // does any browser currently support it in order to test?
  275. // Only rename element nodes.
  276. if ( oNode.nodeType != 1 )
  277. return null ;
  278. // If it's already correct exit here.
  279. if ( oNode.nodeName == newTag )
  280. return oNode ;
  281. var oDoc = oNode.ownerDocument ;
  282. // Create the new node
  283. var newNode = oDoc.createElement( newTag ) ;
  284. // Copy all attributes
  285. CopyAttributes( oNode, newNode, {} ) ;
  286. // Move children to the new node
  287. FCKDomTools.MoveChildren( oNode, newNode ) ;
  288. // Finally replace the node and return the new one
  289. oNode.parentNode.replaceChild( newNode, oNode ) ;
  290. return newNode ;
  291. }