fck_link.js
上传用户:wlfwy2004
上传日期:2016-12-12
资源大小:33978k
文件大小:16k
源码类别:

Jsp/Servlet

开发平台:

Java

  1. /*
  2.  * FCKeditor - The text editor for internet
  3.  * Copyright (C) 2003-2005 Frederico Caldeira Knabben
  4.  * 
  5.  * Licensed under the terms of the GNU Lesser General Public License:
  6.  *  http://www.opensource.org/licenses/lgpl-license.php
  7.  * 
  8.  * For further information visit:
  9.  *  http://www.fckeditor.net/
  10.  * 
  11.  * File Name: fck_link.js
  12.  *  Scripts related to the Link dialog window (see fck_link.html).
  13.  * 
  14.  * File Authors:
  15.  *  Frederico Caldeira Knabben (fredck@fckeditor.net)
  16.  */
  17. var oEditor = window.parent.InnerDialogLoaded() ;
  18. var FCK = oEditor.FCK ;
  19. var FCKLang = oEditor.FCKLang ;
  20. var FCKConfig = oEditor.FCKConfig ;
  21. //#### Dialog Tabs
  22. // Set the dialog tabs.
  23. window.parent.AddTab( 'Info', FCKLang.DlgLnkInfoTab ) ;
  24. if ( !FCKConfig.LinkDlgHideTarget )
  25. window.parent.AddTab( 'Target', FCKLang.DlgLnkTargetTab, true ) ;
  26. if ( FCKConfig.LinkUpload )
  27. window.parent.AddTab( 'Upload', FCKLang.DlgLnkUpload, true ) ;
  28. if ( !FCKConfig.LinkDlgHideAdvanced )
  29. window.parent.AddTab( 'Advanced', FCKLang.DlgAdvancedTag ) ;
  30. // Function called when a dialog tag is selected.
  31. function OnDialogTabChange( tabCode )
  32. {
  33. ShowE('divInfo' , ( tabCode == 'Info' ) ) ;
  34. ShowE('divTarget' , ( tabCode == 'Target' ) ) ;
  35. ShowE('divUpload' , ( tabCode == 'Upload' ) ) ;
  36. ShowE('divAttribs' , ( tabCode == 'Advanced' ) ) ;
  37. }
  38. //#### Regular Expressions library.
  39. var oRegex = new Object() ;
  40. oRegex.UriProtocol = new RegExp('') ;
  41. oRegex.UriProtocol.compile( '^(((http|https|ftp|news)://)|mailto:)', 'gi' ) ;
  42. oRegex.UrlOnChangeProtocol = new RegExp('') ;
  43. oRegex.UrlOnChangeProtocol.compile( '^(http|https|ftp|news)://(?=.)', 'gi' ) ;
  44. oRegex.UrlOnChangeTestOther = new RegExp('') ;
  45. oRegex.UrlOnChangeTestOther.compile( '^(javascript:|#|/)', 'gi' ) ;
  46. oRegex.ReserveTarget = new RegExp('') ;
  47. oRegex.ReserveTarget.compile( '^_(blank|self|top|parent)$', 'i' ) ;
  48. oRegex.PopupUri = new RegExp('') ;
  49. oRegex.PopupUri.compile( "^javascript:void\(\s*window.open\(\s*'([^']+)'\s*,\s*(?:'([^']*)'|null)\s*,\s*'([^']*)'\s*\)\s*\)\s*$" ) ;
  50. oRegex.PopupFeatures = new RegExp('') ;
  51. oRegex.PopupFeatures.compile( '(?:^|,)([^=]+)=(\d+|yes|no)', 'gi' ) ;
  52. //#### Parser Functions
  53. var oParser = new Object() ;
  54. oParser.ParseEMailUrl = function( emailUrl )
  55. {
  56. // Initializes the EMailInfo object.
  57. var oEMailInfo = new Object() ;
  58. oEMailInfo.Address = '' ;
  59. oEMailInfo.Subject = '' ;
  60. oEMailInfo.Body = '' ;
  61. var oParts = emailUrl.match( /^([^?]+)??(.+)?/ ) ;
  62. if ( oParts )
  63. {
  64. // Set the e-mail address.
  65. oEMailInfo.Address = oParts[1] ;
  66. // Look for the optional e-mail parameters.
  67. if ( oParts[2] )
  68. {
  69. var oMatch = oParts[2].match( /(^|&)subject=([^&]+)/i ) ;
  70. if ( oMatch ) oEMailInfo.Subject = unescape( oMatch[2] ) ;
  71. oMatch = oParts[2].match( /(^|&)body=([^&]+)/i ) ;
  72. if ( oMatch ) oEMailInfo.Body = unescape( oMatch[2] ) ;
  73. }
  74. }
  75. return oEMailInfo ;
  76. }
  77. oParser.CreateEMailUri = function( address, subject, body )
  78. {
  79. var sBaseUri = 'mailto:' + address ;
  80. var sParams = '' ;
  81. if ( subject.length > 0 )
  82. sParams = '?subject=' + escape( subject ) ;
  83. if ( body.length > 0 )
  84. {
  85. sParams += ( sParams.length == 0 ? '?' : '&' ) ;
  86. sParams += 'body=' + escape( body ) ;
  87. }
  88. return sBaseUri + sParams ;
  89. }
  90. //#### Initialization Code
  91. // oLink: The actual selected link in the editor.
  92. var oLink = FCK.Selection.MoveToAncestorNode( 'A' ) ;
  93. if ( oLink )
  94. FCK.Selection.SelectNode( oLink ) ;
  95. window.onload = function()
  96. {
  97. // Translate the dialog box texts.
  98. oEditor.FCKLanguageManager.TranslatePage(document) ;
  99. // Fill the Anchor Names and Ids combos.
  100. LoadAnchorNamesAndIds() ;
  101. // Load the selected link information (if any).
  102. LoadSelection() ;
  103. // Update the dialog box.
  104. SetLinkType( GetE('cmbLinkType').value ) ;
  105. // Show/Hide the "Browse Server" button.
  106. GetE('divBrowseServer').style.display = FCKConfig.LinkBrowser ? '' : 'none' ;
  107. // Show the initial dialog content.
  108. GetE('divInfo').style.display = '' ;
  109. // Set the actual uploader URL.
  110. if ( FCKConfig.LinkUpload )
  111. GetE('frmUpload').action = FCKConfig.LinkUploadURL ;
  112. // Activate the "OK" button.
  113. window.parent.SetOkButton( true ) ;
  114. }
  115. var bHasAnchors ;
  116. function LoadAnchorNamesAndIds()
  117. {
  118. var aAnchors = oEditor.FCK.EditorDocument.anchors ;
  119. var aIds = oEditor.FCKTools.GetAllChildrenIds( oEditor.FCK.EditorDocument.body ) ;
  120. bHasAnchors = ( aAnchors.length > 0 || aIds.length > 0 ) ;
  121. for ( var i = 0 ; i < aAnchors.length ; i++ )
  122. {
  123. var sName = aAnchors[i].name ;
  124. if ( sName && sName.length > 0 )
  125. oEditor.FCKTools.AddSelectOption( document, GetE('cmbAnchorName'), sName, sName ) ;
  126. }
  127. for ( var i = 0 ; i < aIds.length ; i++ )
  128. {
  129. oEditor.FCKTools.AddSelectOption( document, GetE('cmbAnchorId'), aIds[i], aIds[i] ) ;
  130. }
  131. ShowE( 'divSelAnchor' , bHasAnchors ) ;
  132. ShowE( 'divNoAnchor' , !bHasAnchors ) ;
  133. }
  134. function LoadSelection()
  135. {
  136. if ( !oLink ) return ;
  137. var sType = 'url' ;
  138. // Get the actual Link href.
  139. var sHRef = oLink.getAttribute('href',2) + '' ;
  140. // TODO: Wait stable version and remove the following commented lines.
  141. // if ( sHRef.startsWith( FCK.BaseUrl ) )
  142. // sHRef = sHRef.remove( 0, FCK.BaseUrl.length ) ;
  143. // Look for a popup javascript link.
  144. var oPopupMatch = oRegex.PopupUri.exec( sHRef ) ;
  145. if( oPopupMatch )
  146. {
  147. GetE('cmbTarget').value = 'popup' ;
  148. sHRef = oPopupMatch[1] ;
  149. FillPopupFields( oPopupMatch[2], oPopupMatch[3] ) ;
  150. SetTarget( 'popup' ) ;
  151. }
  152. // Search for the protocol.
  153. var sProtocol = oRegex.UriProtocol.exec( sHRef ) ;
  154. if ( sProtocol )
  155. {
  156. sProtocol = sProtocol[0].toLowerCase() ;
  157. GetE('cmbLinkProtocol').value = sProtocol ;
  158. // Remove the protocol and get the remainig URL.
  159. var sUrl = sHRef.replace( oRegex.UriProtocol, '' ) ;
  160. if ( sProtocol == 'mailto:' ) // It is an e-mail link.
  161. {
  162. sType = 'email' ;
  163. var oEMailInfo = oParser.ParseEMailUrl( sUrl ) ;
  164. GetE('txtEMailAddress').value = oEMailInfo.Address ;
  165. GetE('txtEMailSubject').value = oEMailInfo.Subject ;
  166. GetE('txtEMailBody').value = oEMailInfo.Body ;
  167. }
  168. else // It is a normal link.
  169. {
  170. sType = 'url' ;
  171. GetE('txtUrl').value = sUrl ;
  172. }
  173. }
  174. else if ( sHRef.substr(0,1) == '#' && sHRef.length > 2 ) // It is an anchor link.
  175. {
  176. sType = 'anchor' ;
  177. GetE('cmbAnchorName').value = GetE('cmbAnchorId').value = sHRef.substr(1) ;
  178. }
  179. else // It is another type of link.
  180. {
  181. sType = 'url' ;
  182. GetE('cmbLinkProtocol').value = '' ;
  183. GetE('txtUrl').value = sHRef ;
  184. }
  185. if ( !oPopupMatch )
  186. {
  187. // Get the target.
  188. var sTarget = oLink.target ;
  189. if ( sTarget && sTarget.length > 0 )
  190. {
  191. if ( oRegex.ReserveTarget.test( sTarget ) )
  192. {
  193. sTarget = sTarget.toLowerCase() ;
  194. GetE('cmbTarget').value = sTarget ;
  195. }
  196. else
  197. GetE('cmbTarget').value = 'frame' ;
  198. GetE('txtTargetFrame').value = sTarget ;
  199. }
  200. }
  201. // Get Advances Attributes
  202. GetE('txtAttId').value = oLink.id ;
  203. GetE('txtAttName').value = oLink.name ;
  204. GetE('cmbAttLangDir').value = oLink.dir ;
  205. GetE('txtAttLangCode').value = oLink.lang ;
  206. GetE('txtAttAccessKey').value = oLink.accessKey ;
  207. GetE('txtAttTabIndex').value = oLink.tabIndex <= 0 ? '' : oLink.tabIndex ;
  208. GetE('txtAttTitle').value = oLink.title ;
  209. GetE('txtAttContentType').value = oLink.type ;
  210. GetE('txtAttCharSet').value = oLink.charset ;
  211. if ( oEditor.FCKBrowserInfo.IsIE )
  212. {
  213. GetE('txtAttClasses').value = oLink.getAttribute('className',2) || '' ;
  214. GetE('txtAttStyle').value = oLink.style.cssText ;
  215. }
  216. else
  217. {
  218. GetE('txtAttClasses').value = oLink.getAttribute('class',2) || '' ;
  219. GetE('txtAttStyle').value = oLink.getAttribute('style',2) ;
  220. }
  221. // Update the Link type combo.
  222. GetE('cmbLinkType').value = sType ;
  223. }
  224. //#### Link type selection.
  225. function SetLinkType( linkType )
  226. {
  227. ShowE('divLinkTypeUrl' , (linkType == 'url') ) ;
  228. ShowE('divLinkTypeAnchor' , (linkType == 'anchor') ) ;
  229. ShowE('divLinkTypeEMail' , (linkType == 'email') ) ;
  230. if ( !FCKConfig.LinkDlgHideTarget )
  231. window.parent.SetTabVisibility( 'Target' , (linkType == 'url') ) ;
  232. if ( FCKConfig.LinkUpload )
  233. window.parent.SetTabVisibility( 'Upload' , (linkType == 'url') ) ;
  234. if ( !FCKConfig.LinkDlgHideAdvanced )
  235. window.parent.SetTabVisibility( 'Advanced' , (linkType != 'anchor' || bHasAnchors) ) ;
  236. if ( linkType == 'email' )
  237. window.parent.SetAutoSize( true ) ;
  238. }
  239. //#### Target type selection.
  240. function SetTarget( targetType )
  241. {
  242. GetE('tdTargetFrame').style.display = ( targetType == 'popup' ? 'none' : '' ) ;
  243. GetE('tdPopupName').style.display =
  244. GetE('tablePopupFeatures').style.display = ( targetType == 'popup' ? '' : 'none' ) ;
  245. switch ( targetType )
  246. {
  247. case "_blank" :
  248. case "_self" :
  249. case "_parent" :
  250. case "_top" :
  251. GetE('txtTargetFrame').value = targetType ;
  252. break ;
  253. case "" :
  254. GetE('txtTargetFrame').value = '' ;
  255. break ;
  256. }
  257. if ( targetType == 'popup' )
  258. window.parent.SetAutoSize( true ) ;
  259. }
  260. //#### Called while the user types the URL.
  261. function OnUrlChange()
  262. {
  263. var sUrl = GetE('txtUrl').value ;
  264. var sProtocol = oRegex.UrlOnChangeProtocol.exec( sUrl ) ;
  265. if ( sProtocol )
  266. {
  267. sUrl = sUrl.substr( sProtocol[0].length ) ;
  268. GetE('txtUrl').value = sUrl ;
  269. GetE('cmbLinkProtocol').value = sProtocol[0].toLowerCase() ;
  270. }
  271. else if ( oRegex.UrlOnChangeTestOther.test( sUrl ) )
  272. {
  273. GetE('cmbLinkProtocol').value = '' ;
  274. }
  275. }
  276. //#### Called while the user types the target name.
  277. function OnTargetNameChange()
  278. {
  279. var sFrame = GetE('txtTargetFrame').value ;
  280. if ( sFrame.length == 0 )
  281. GetE('cmbTarget').value = '' ;
  282. else if ( oRegex.ReserveTarget.test( sFrame ) )
  283. GetE('cmbTarget').value = sFrame.toLowerCase() ;
  284. else
  285. GetE('cmbTarget').value = 'frame' ;
  286. }
  287. //#### Builds the javascript URI to open a popup to the specified URI.
  288. function BuildPopupUri( uri )
  289. {
  290. var oReg = new RegExp( "'", "g" ) ;
  291. var sWindowName = "'" + GetE('txtPopupName').value.replace(oReg, "\'") + "'" ;
  292. var sFeatures = '' ;
  293. var aChkFeatures = document.getElementsByName('chkFeature') ;
  294. for ( var i = 0 ; i < aChkFeatures.length ; i++ )
  295. {
  296. if ( i > 0 ) sFeatures += ',' ;
  297. sFeatures += aChkFeatures[i].value + '=' + ( aChkFeatures[i].checked ? 'yes' : 'no' ) ;
  298. }
  299. if ( GetE('txtPopupWidth').value.length > 0 ) sFeatures += ',width=' + GetE('txtPopupWidth').value ;
  300. if ( GetE('txtPopupHeight').value.length > 0 ) sFeatures += ',height=' + GetE('txtPopupHeight').value ;
  301. if ( GetE('txtPopupLeft').value.length > 0 ) sFeatures += ',left=' + GetE('txtPopupLeft').value ;
  302. if ( GetE('txtPopupTop').value.length > 0 ) sFeatures += ',top=' + GetE('txtPopupTop').value ;
  303. return ( "javascript:void(window.open('" + uri + "'," + sWindowName + ",'" + sFeatures + "'))" ) ;
  304. }
  305. //#### Fills all Popup related fields.
  306. function FillPopupFields( windowName, features )
  307. {
  308. if ( windowName )
  309. GetE('txtPopupName').value = windowName ;
  310. var oFeatures = new Object() ;
  311. var oFeaturesMatch ;
  312. while( ( oFeaturesMatch = oRegex.PopupFeatures.exec( features ) ) != null )
  313. {
  314. var sValue = oFeaturesMatch[2] ;
  315. if ( sValue == ( 'yes' || '1' ) )
  316. oFeatures[ oFeaturesMatch[1] ] = true ;
  317. else if ( ! isNaN( sValue ) && sValue != 0 )
  318. oFeatures[ oFeaturesMatch[1] ] = sValue ;
  319. }
  320. // Update all features check boxes.
  321. var aChkFeatures = document.getElementsByName('chkFeature') ;
  322. for ( var i = 0 ; i < aChkFeatures.length ; i++ )
  323. {
  324. if ( oFeatures[ aChkFeatures[i].value ] )
  325. aChkFeatures[i].checked = true ;
  326. }
  327. // Update position and size text boxes.
  328. if ( oFeatures['width'] ) GetE('txtPopupWidth').value = oFeatures['width'] ;
  329. if ( oFeatures['height'] ) GetE('txtPopupHeight').value = oFeatures['height'] ;
  330. if ( oFeatures['left'] ) GetE('txtPopupLeft').value = oFeatures['left'] ;
  331. if ( oFeatures['top'] ) GetE('txtPopupTop').value = oFeatures['top'] ;
  332. }
  333. //#### The OK button was hit.
  334. function Ok()
  335. {
  336. var sUri ;
  337. switch ( GetE('cmbLinkType').value )
  338. {
  339. case 'url' :
  340. sUri = GetE('txtUrl').value ;
  341. if ( sUri.length == 0 )
  342. {
  343. alert( FCKLang.DlnLnkMsgNoUrl ) ;
  344. return false ;
  345. }
  346. sUri = GetE('cmbLinkProtocol').value + sUri ;
  347. if( GetE('cmbTarget').value == 'popup' )
  348. sUri = BuildPopupUri( sUri ) ;
  349. break ;
  350. case 'email' :
  351. sUri = GetE('txtEMailAddress').value ;
  352. if ( sUri.length == 0 )
  353. {
  354. alert( FCKLang.DlnLnkMsgNoEMail ) ;
  355. return false ;
  356. }
  357. sUri = oParser.CreateEMailUri(
  358. sUri,
  359. GetE('txtEMailSubject').value,
  360. GetE('txtEMailBody').value ) ;
  361. break ;
  362. case 'anchor' :
  363. var sAnchor = GetE('cmbAnchorName').value ;
  364. if ( sAnchor.length == 0 ) sAnchor = GetE('cmbAnchorId').value ;
  365. if ( sAnchor.length == 0 )
  366. {
  367. alert( FCKLang.DlnLnkMsgNoAnchor ) ;
  368. return false ;
  369. }
  370. sUri = '#' + sAnchor ;
  371. break ;
  372. }
  373. if ( oLink ) // Modifying an existent link.
  374. {
  375. oEditor.FCKUndo.SaveUndoStep() ;
  376. oLink.href = sUri ;
  377. }
  378. else // Creating a new link.
  379. {
  380. oLink = oEditor.FCK.CreateLink( sUri ) ;
  381. if ( ! oLink )
  382. return true ;
  383. }
  384. // Target
  385. if( GetE('cmbTarget').value != 'popup' )
  386. SetAttribute( oLink, 'target', GetE('txtTargetFrame').value ) ;
  387. else
  388. SetAttribute( oLink, 'target', null ) ;
  389. // Advances Attributes
  390. SetAttribute( oLink, 'id' , GetE('txtAttId').value ) ;
  391. SetAttribute( oLink, 'name' , GetE('txtAttName').value ) ; // No IE. Set but doesnt't update the outerHTML.
  392. SetAttribute( oLink, 'dir' , GetE('cmbAttLangDir').value ) ;
  393. SetAttribute( oLink, 'lang' , GetE('txtAttLangCode').value ) ;
  394. SetAttribute( oLink, 'accesskey', GetE('txtAttAccessKey').value ) ;
  395. SetAttribute( oLink, 'tabindex' , ( GetE('txtAttTabIndex').value > 0 ? GetE('txtAttTabIndex').value : null ) ) ;
  396. SetAttribute( oLink, 'title' , GetE('txtAttTitle').value ) ;
  397. SetAttribute( oLink, 'class' , GetE('txtAttClasses').value ) ;
  398. SetAttribute( oLink, 'type' , GetE('txtAttContentType').value ) ;
  399. SetAttribute( oLink, 'charset' , GetE('txtAttCharSet').value ) ;
  400. if ( oEditor.FCKBrowserInfo.IsIE )
  401. oLink.style.cssText = GetE('txtAttStyle').value ;
  402. else
  403. SetAttribute( oLink, 'style', GetE('txtAttStyle').value ) ;
  404. return true ;
  405. }
  406. function BrowseServer()
  407. {
  408. // Set the browser window feature.
  409. var iWidth = FCKConfig.LinkBrowserWindowWidth ;
  410. var iHeight = FCKConfig.LinkBrowserWindowHeight ;
  411. var iLeft = (screen.width  - iWidth) / 2 ;
  412. var iTop  = (screen.height - iHeight) / 2 ;
  413. var sOptions = "toolbar=no,status=no,resizable=yes,dependent=yes" ;
  414. sOptions += ",width=" + iWidth ;
  415. sOptions += ",height=" + iHeight ;
  416. sOptions += ",left=" + iLeft ;
  417. sOptions += ",top=" + iTop ;
  418. // Open the browser window.
  419. var oWindow = window.open( FCKConfig.LinkBrowserURL, "FCKBrowseWindow", sOptions ) ;
  420. }
  421. function SetUrl( url )
  422. {
  423. document.getElementById('txtUrl').value = url ;
  424. OnUrlChange() ;
  425. window.parent.SetSelectedTab( 'Info' ) ;
  426. }
  427. function OnUploadCompleted( errorNumber, fileUrl, fileName, customMsg )
  428. {
  429. switch ( errorNumber )
  430. {
  431. case 0 : // No errors
  432. alert( 'Your file has been successfully uploaded' ) ;
  433. break ;
  434. case 1 : // Custom error
  435. alert( customMsg ) ;
  436. return ;
  437. case 101 : // Custom warning
  438. alert( customMsg ) ;
  439. break ;
  440. case 201 :
  441. alert( 'A file with the same name is already available. The uploaded file has been renamed to "' + fileName + '"' ) ;
  442. break ;
  443. case 202 :
  444. alert( 'Invalid file type' ) ;
  445. return ;
  446. case 203 :
  447. alert( "Security error. You probably don't have enough permissions to upload. Please check your server." ) ;
  448. return ;
  449. default :
  450. alert( 'Error on file upload. Error number: ' + errorNumber ) ;
  451. return ;
  452. }
  453. SetUrl( fileUrl ) ;
  454. GetE('frmUpload').reset() ;
  455. }
  456. var oUploadAllowedExtRegex = new RegExp( FCKConfig.LinkUploadAllowedExtensions, 'i' ) ;
  457. var oUploadDeniedExtRegex = new RegExp( FCKConfig.LinkUploadDeniedExtensions, 'i' ) ;
  458. function CheckUpload()
  459. {
  460. var sFile = GetE('txtUploadFile').value ;
  461. if ( sFile.length == 0 )
  462. {
  463. alert( 'Please select a file to upload' ) ;
  464. return false ;
  465. }
  466. if ( ( FCKConfig.LinkUploadAllowedExtensions.length > 0 && !oUploadAllowedExtRegex.test( sFile ) ) ||
  467. ( FCKConfig.LinkUploadDeniedExtensions.length > 0 && oUploadDeniedExtRegex.test( sFile ) ) )
  468. {
  469. OnUploadCompleted( 202 ) ;
  470. return false ;
  471. }
  472. return true ;
  473. }