[ Index ]

PHP Cross Reference of osCMax 2.0.4

title

Body

[close]

/FCKeditor/editor/dialog/fck_link/ -> fck_link.js (source)

   1  /*

   2   * FCKeditor - The text editor for Internet - http://www.fckeditor.net

   3   * Copyright (C) 2003-2008 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   * Scripts related to the Link dialog window (see fck_link.html).

  22   */
  23  
  24  var dialog    = window.parent ;
  25  var oEditor = dialog.InnerDialogLoaded() ;
  26  
  27  var FCK            = oEditor.FCK ;
  28  var FCKLang        = oEditor.FCKLang ;
  29  var FCKConfig    = oEditor.FCKConfig ;
  30  var FCKRegexLib    = oEditor.FCKRegexLib ;
  31  var FCKTools    = oEditor.FCKTools ;
  32  
  33  //#### Dialog Tabs

  34  
  35  // Set the dialog tabs.

  36  dialog.AddTab( 'Info', FCKLang.DlgLnkInfoTab ) ;
  37  
  38  if ( !FCKConfig.LinkDlgHideTarget )
  39      dialog.AddTab( 'Target', FCKLang.DlgLnkTargetTab, true ) ;
  40  
  41  if ( FCKConfig.LinkUpload )
  42      dialog.AddTab( 'Upload', FCKLang.DlgLnkUpload, true ) ;
  43  
  44  if ( !FCKConfig.LinkDlgHideAdvanced )
  45      dialog.AddTab( 'Advanced', FCKLang.DlgAdvancedTag ) ;
  46  
  47  // Function called when a dialog tag is selected.

  48  function OnDialogTabChange( tabCode )
  49  {
  50      ShowE('divInfo'        , ( tabCode == 'Info' ) ) ;
  51      ShowE('divTarget'    , ( tabCode == 'Target' ) ) ;
  52      ShowE('divUpload'    , ( tabCode == 'Upload' ) ) ;
  53      ShowE('divAttribs'    , ( tabCode == 'Advanced' ) ) ;
  54  
  55      dialog.SetAutoSize( true ) ;
  56  }
  57  
  58  //#### Regular Expressions library.

  59  var oRegex = new Object() ;
  60  
  61  oRegex.UriProtocol = /^(((http|https|ftp|news):\/\/)|mailto:)/gi ;
  62  
  63  oRegex.UrlOnChangeProtocol = /^(http|https|ftp|news):\/\/(?=.)/gi ;
  64  
  65  oRegex.UrlOnChangeTestOther = /^((javascript:)|[#\/\.])/gi ;
  66  
  67  oRegex.ReserveTarget = /^_(blank|self|top|parent)$/i ;
  68  
  69  oRegex.PopupUri = /^javascript:void\(\s*window.open\(\s*'([^']+)'\s*,\s*(?:'([^']*)'|null)\s*,\s*'([^']*)'\s*\)\s*\)\s*$/ ;
  70  
  71  // Accessible popups

  72  oRegex.OnClickPopup = /^\s*on[cC]lick="\s*window.open\(\s*this\.href\s*,\s*(?:'([^']*)'|null)\s*,\s*'([^']*)'\s*\)\s*;\s*return\s*false;*\s*"$/ ;
  73  
  74  oRegex.PopupFeatures = /(?:^|,)([^=]+)=(\d+|yes|no)/gi ;
  75  
  76  //#### Parser Functions

  77  
  78  var oParser = new Object() ;
  79  
  80  // This method simply returns the two inputs in numerical order. You can even

  81  // provide strings, as the method would parseInt() the values.

  82  oParser.SortNumerical = function(a, b)
  83  {
  84      return parseInt( a, 10 ) - parseInt( b, 10 ) ;
  85  }
  86  
  87  oParser.ParseEMailParams = function(sParams)
  88  {
  89      // Initialize the oEMailParams object.

  90      var oEMailParams = new Object() ;
  91      oEMailParams.Subject = '' ;
  92      oEMailParams.Body = '' ;
  93  
  94      var aMatch = sParams.match( /(^|^\?|&)subject=([^&]+)/i ) ;
  95      if ( aMatch ) oEMailParams.Subject = decodeURIComponent( aMatch[2] ) ;
  96  
  97      aMatch = sParams.match( /(^|^\?|&)body=([^&]+)/i ) ;
  98      if ( aMatch ) oEMailParams.Body = decodeURIComponent( aMatch[2] ) ;
  99  
 100      return oEMailParams ;
 101  }
 102  
 103  // This method returns either an object containing the email info, or FALSE

 104  // if the parameter is not an email link.

 105  oParser.ParseEMailUri = function( sUrl )
 106  {
 107      // Initializes the EMailInfo object.

 108      var oEMailInfo = new Object() ;
 109      oEMailInfo.Address = '' ;
 110      oEMailInfo.Subject = '' ;
 111      oEMailInfo.Body = '' ;
 112  
 113      var aLinkInfo = sUrl.match( /^(\w+):(.*)$/ ) ;
 114      if ( aLinkInfo && aLinkInfo[1] == 'mailto' )
 115      {
 116          // This seems to be an unprotected email link.

 117          var aParts = aLinkInfo[2].match( /^([^\?]+)\??(.+)?/ ) ;
 118          if ( aParts )
 119          {
 120              // Set the e-mail address.

 121              oEMailInfo.Address = aParts[1] ;
 122  
 123              // Look for the optional e-mail parameters.

 124              if ( aParts[2] )
 125              {
 126                  var oEMailParams = oParser.ParseEMailParams( aParts[2] ) ;
 127                  oEMailInfo.Subject = oEMailParams.Subject ;
 128                  oEMailInfo.Body = oEMailParams.Body ;
 129              }
 130          }
 131          return oEMailInfo ;
 132      }
 133      else if ( aLinkInfo && aLinkInfo[1] == 'javascript' )
 134      {
 135          // This may be a protected email.

 136  
 137          // Try to match the url against the EMailProtectionFunction.

 138          var func = FCKConfig.EMailProtectionFunction ;
 139          if ( func != null )
 140          {
 141              try
 142              {
 143                  // Escape special chars.

 144                  func = func.replace( /([\/^$*+.?()\[\]])/g, '\\$1' ) ;
 145  
 146                  // Define the possible keys.

 147                  var keys = new Array('NAME', 'DOMAIN', 'SUBJECT', 'BODY') ;
 148  
 149                  // Get the order of the keys (hold them in the array <pos>) and

 150                  // the function replaced by regular expression patterns.

 151                  var sFunc = func ;
 152                  var pos = new Array() ;
 153                  for ( var i = 0 ; i < keys.length ; i ++ )
 154                  {
 155                      var rexp = new RegExp( keys[i] ) ;
 156                      var p = func.search( rexp ) ;
 157                      if ( p >= 0 )
 158                      {
 159                          sFunc = sFunc.replace( rexp, '\'([^\']*)\'' ) ;
 160                          pos[pos.length] = p + ':' + keys[i] ;
 161                      }
 162                  }
 163  
 164                  // Sort the available keys.

 165                  pos.sort( oParser.SortNumerical ) ;
 166  
 167                  // Replace the excaped single quotes in the url, such they do

 168                  // not affect the regexp afterwards.

 169                  aLinkInfo[2] = aLinkInfo[2].replace( /\\'/g, '###SINGLE_QUOTE###' ) ;
 170  
 171                  // Create the regexp and execute it.

 172                  var rFunc = new RegExp( '^' + sFunc + '$' ) ;
 173                  var aMatch = rFunc.exec( aLinkInfo[2] ) ;
 174                  if ( aMatch )
 175                  {
 176                      var aInfo = new Array();
 177                      for ( var i = 1 ; i < aMatch.length ; i ++ )
 178                      {
 179                          var k = pos[i-1].match(/^\d+:(.+)$/) ;
 180                          aInfo[k[1]] = aMatch[i].replace(/###SINGLE_QUOTE###/g, '\'') ;
 181                      }
 182  
 183                      // Fill the EMailInfo object that will be returned

 184                      oEMailInfo.Address = aInfo['NAME'] + '@' + aInfo['DOMAIN'] ;
 185                      oEMailInfo.Subject = decodeURIComponent( aInfo['SUBJECT'] ) ;
 186                      oEMailInfo.Body = decodeURIComponent( aInfo['BODY'] ) ;
 187  
 188                      return oEMailInfo ;
 189                  }
 190              }
 191              catch (e)
 192              {
 193              }
 194          }
 195  
 196          // Try to match the email against the encode protection.

 197          var aMatch = aLinkInfo[2].match( /^location\.href='mailto:'\+(String\.fromCharCode\([\d,]+\))\+'(.*)'$/ ) ;
 198          if ( aMatch )
 199          {
 200              // The link is encoded

 201              oEMailInfo.Address = eval( aMatch[1] ) ;
 202              if ( aMatch[2] )
 203              {
 204                  var oEMailParams = oParser.ParseEMailParams( aMatch[2] ) ;
 205                  oEMailInfo.Subject = oEMailParams.Subject ;
 206                  oEMailInfo.Body = oEMailParams.Body ;
 207              }
 208              return oEMailInfo ;
 209          }
 210      }
 211      return false;
 212  }
 213  
 214  oParser.CreateEMailUri = function( address, subject, body )
 215  {
 216      // Switch for the EMailProtection setting.

 217      switch ( FCKConfig.EMailProtection )
 218      {
 219          case 'function' :
 220              var func = FCKConfig.EMailProtectionFunction ;
 221              if ( func == null )
 222              {
 223                  if ( FCKConfig.Debug )
 224                  {
 225                      alert('EMailProtection alert!\nNo function defined. Please set "FCKConfig.EMailProtectionFunction"') ;
 226                  }
 227                  return '';
 228              }
 229  
 230              // Split the email address into name and domain parts.

 231              var aAddressParts = address.split( '@', 2 ) ;
 232              if ( aAddressParts[1] == undefined )
 233              {
 234                  aAddressParts[1] = '' ;
 235              }
 236  
 237              // Replace the keys by their values (embedded in single quotes).

 238              func = func.replace(/NAME/g, "'" + aAddressParts[0].replace(/'/g, '\\\'') + "'") ;
 239              func = func.replace(/DOMAIN/g, "'" + aAddressParts[1].replace(/'/g, '\\\'') + "'") ;
 240              func = func.replace(/SUBJECT/g, "'" + encodeURIComponent( subject ).replace(/'/g, '\\\'') + "'") ;
 241              func = func.replace(/BODY/g, "'" + encodeURIComponent( body ).replace(/'/g, '\\\'') + "'") ;
 242  
 243              return 'javascript:' + func ;
 244  
 245          case 'encode' :
 246              var aParams = [] ;
 247              var aAddressCode = [] ;
 248  
 249              if ( subject.length > 0 )
 250                  aParams.push( 'subject='+ encodeURIComponent( subject ) ) ;
 251              if ( body.length > 0 )
 252                  aParams.push( 'body=' + encodeURIComponent( body ) ) ;
 253              for ( var i = 0 ; i < address.length ; i++ )
 254                  aAddressCode.push( address.charCodeAt( i ) ) ;
 255  
 256              return 'javascript:location.href=\'mailto:\'+String.fromCharCode(' + aAddressCode.join( ',' ) + ')+\'?' + aParams.join( '&' ) + '\'' ;
 257      }
 258  
 259      // EMailProtection 'none'

 260  
 261      var sBaseUri = 'mailto:' + address ;
 262  
 263      var sParams = '' ;
 264  
 265      if ( subject.length > 0 )
 266          sParams = '?subject=' + encodeURIComponent( subject ) ;
 267  
 268      if ( body.length > 0 )
 269      {
 270          sParams += ( sParams.length == 0 ? '?' : '&' ) ;
 271          sParams += 'body=' + encodeURIComponent( body ) ;
 272      }
 273  
 274      return sBaseUri + sParams ;
 275  }
 276  
 277  //#### Initialization Code

 278  
 279  // oLink: The actual selected link in the editor.

 280  var oLink = dialog.Selection.GetSelection().MoveToAncestorNode( 'A' ) ;
 281  if ( oLink )
 282      FCK.Selection.SelectNode( oLink ) ;
 283  
 284  window.onload = function()
 285  {
 286      // Translate the dialog box texts.

 287      oEditor.FCKLanguageManager.TranslatePage(document) ;
 288  
 289      // Fill the Anchor Names and Ids combos.

 290      LoadAnchorNamesAndIds() ;
 291  
 292      // Load the selected link information (if any).

 293      LoadSelection() ;
 294  
 295      // Update the dialog box.

 296      SetLinkType( GetE('cmbLinkType').value ) ;
 297  
 298      // Show/Hide the "Browse Server" button.

 299      GetE('divBrowseServer').style.display = FCKConfig.LinkBrowser ? '' : 'none' ;
 300  
 301      // Show the initial dialog content.

 302      GetE('divInfo').style.display = '' ;
 303  
 304      // Set the actual uploader URL.

 305      if ( FCKConfig.LinkUpload )
 306          GetE('frmUpload').action = FCKConfig.LinkUploadURL ;
 307  
 308      // Set the default target (from configuration).

 309      SetDefaultTarget() ;
 310  
 311      // Activate the "OK" button.

 312      dialog.SetOkButton( true ) ;
 313  
 314      // Select the first field.

 315      switch( GetE('cmbLinkType').value )
 316      {
 317          case 'url' :
 318              SelectField( 'txtUrl' ) ;
 319              break ;
 320          case 'email' :
 321              SelectField( 'txtEMailAddress' ) ;
 322              break ;
 323          case 'anchor' :
 324              if ( GetE('divSelAnchor').style.display != 'none' )
 325                  SelectField( 'cmbAnchorName' ) ;
 326              else
 327                  SelectField( 'cmbLinkType' ) ;
 328      }
 329  }
 330  
 331  var bHasAnchors ;
 332  
 333  function LoadAnchorNamesAndIds()
 334  {
 335      // Since version 2.0, the anchors are replaced in the DOM by IMGs so the user see the icon

 336      // to edit them. So, we must look for that images now.

 337      var aAnchors = new Array() ;
 338      var i ;
 339      var oImages = oEditor.FCK.EditorDocument.getElementsByTagName( 'IMG' ) ;
 340      for( i = 0 ; i < oImages.length ; i++ )
 341      {
 342          if ( oImages[i].getAttribute('_fckanchor') )
 343              aAnchors[ aAnchors.length ] = oEditor.FCK.GetRealElement( oImages[i] ) ;
 344      }
 345  
 346      // Add also real anchors

 347      var oLinks = oEditor.FCK.EditorDocument.getElementsByTagName( 'A' ) ;
 348      for( i = 0 ; i < oLinks.length ; i++ )
 349      {
 350          if ( oLinks[i].name && ( oLinks[i].name.length > 0 ) )
 351              aAnchors[ aAnchors.length ] = oLinks[i] ;
 352      }
 353  
 354      var aIds = FCKTools.GetAllChildrenIds( oEditor.FCK.EditorDocument.body ) ;
 355  
 356      bHasAnchors = ( aAnchors.length > 0 || aIds.length > 0 ) ;
 357  
 358      for ( i = 0 ; i < aAnchors.length ; i++ )
 359      {
 360          var sName = aAnchors[i].name ;
 361          if ( sName && sName.length > 0 )
 362              FCKTools.AddSelectOption( GetE('cmbAnchorName'), sName, sName ) ;
 363      }
 364  
 365      for ( i = 0 ; i < aIds.length ; i++ )
 366      {
 367          FCKTools.AddSelectOption( GetE('cmbAnchorId'), aIds[i], aIds[i] ) ;
 368      }
 369  
 370      ShowE( 'divSelAnchor'    , bHasAnchors ) ;
 371      ShowE( 'divNoAnchor'    , !bHasAnchors ) ;
 372  }
 373  
 374  function LoadSelection()
 375  {
 376      if ( !oLink ) return ;
 377  
 378      var sType = 'url' ;
 379  
 380      // Get the actual Link href.

 381      var sHRef = oLink.getAttribute( '_fcksavedurl' ) ;
 382      if ( sHRef == null )
 383          sHRef = oLink.getAttribute( 'href' , 2 ) || '' ;
 384  
 385      // Look for a popup javascript link.

 386      var oPopupMatch = oRegex.PopupUri.exec( sHRef ) ;
 387      if( oPopupMatch )
 388      {
 389          GetE('cmbTarget').value = 'popup' ;
 390          sHRef = oPopupMatch[1] ;
 391          FillPopupFields( oPopupMatch[2], oPopupMatch[3] ) ;
 392          SetTarget( 'popup' ) ;
 393      }
 394  
 395      // Accessible popups, the popup data is in the onclick attribute

 396      if ( !oPopupMatch )
 397      {
 398          var onclick = oLink.getAttribute( 'onclick_fckprotectedatt' ) ;
 399          if ( onclick )
 400          {
 401              // Decode the protected string

 402              onclick = decodeURIComponent( onclick ) ;
 403  
 404              oPopupMatch = oRegex.OnClickPopup.exec( onclick ) ;
 405              if( oPopupMatch )
 406              {
 407                  GetE( 'cmbTarget' ).value = 'popup' ;
 408                  FillPopupFields( oPopupMatch[1], oPopupMatch[2] ) ;
 409                  SetTarget( 'popup' ) ;
 410              }
 411          }
 412      }
 413  
 414      // Search for the protocol.

 415      var sProtocol = oRegex.UriProtocol.exec( sHRef ) ;
 416  
 417      // Search for a protected email link.

 418      var oEMailInfo = oParser.ParseEMailUri( sHRef );
 419  
 420      if ( oEMailInfo )
 421      {
 422          sType = 'email' ;
 423  
 424          GetE('txtEMailAddress').value = oEMailInfo.Address ;
 425          GetE('txtEMailSubject').value = oEMailInfo.Subject ;
 426          GetE('txtEMailBody').value    = oEMailInfo.Body ;
 427      }
 428      else if ( sProtocol )
 429      {
 430          sProtocol = sProtocol[0].toLowerCase() ;
 431          GetE('cmbLinkProtocol').value = sProtocol ;
 432  
 433          // Remove the protocol and get the remaining URL.

 434          var sUrl = sHRef.replace( oRegex.UriProtocol, '' ) ;
 435          sType = 'url' ;
 436          GetE('txtUrl').value = sUrl ;
 437      }
 438      else if ( sHRef.substr(0,1) == '#' && sHRef.length > 1 )    // It is an anchor link.
 439      {
 440          sType = 'anchor' ;
 441          GetE('cmbAnchorName').value = GetE('cmbAnchorId').value = sHRef.substr(1) ;
 442      }
 443      else                    // It is another type of link.
 444      {
 445          sType = 'url' ;
 446  
 447          GetE('cmbLinkProtocol').value = '' ;
 448          GetE('txtUrl').value = sHRef ;
 449      }
 450  
 451      if ( !oPopupMatch )
 452      {
 453          // Get the target.

 454          var sTarget = oLink.target ;
 455  
 456          if ( sTarget && sTarget.length > 0 )
 457          {
 458              if ( oRegex.ReserveTarget.test( sTarget ) )
 459              {
 460                  sTarget = sTarget.toLowerCase() ;
 461                  GetE('cmbTarget').value = sTarget ;
 462              }
 463              else
 464                  GetE('cmbTarget').value = 'frame' ;
 465              GetE('txtTargetFrame').value = sTarget ;
 466          }
 467      }
 468  
 469      // Get Advances Attributes

 470      GetE('txtAttId').value            = oLink.id ;
 471      GetE('txtAttName').value        = oLink.name ;
 472      GetE('cmbAttLangDir').value        = oLink.dir ;
 473      GetE('txtAttLangCode').value    = oLink.lang ;
 474      GetE('txtAttAccessKey').value    = oLink.accessKey ;
 475      GetE('txtAttTabIndex').value    = oLink.tabIndex <= 0 ? '' : oLink.tabIndex ;
 476      GetE('txtAttTitle').value        = oLink.title ;
 477      GetE('txtAttContentType').value    = oLink.type ;
 478      GetE('txtAttCharSet').value        = oLink.charset ;
 479  
 480      var sClass ;
 481      if ( oEditor.FCKBrowserInfo.IsIE )
 482      {
 483          sClass    = oLink.getAttribute('className',2) || '' ;
 484          // Clean up temporary classes for internal use:

 485          sClass = sClass.replace( FCKRegexLib.FCK_Class, '' ) ;
 486  
 487          GetE('txtAttStyle').value    = oLink.style.cssText ;
 488      }
 489      else
 490      {
 491          sClass    = oLink.getAttribute('class',2) || '' ;
 492          GetE('txtAttStyle').value    = oLink.getAttribute('style',2) || '' ;
 493      }
 494      GetE('txtAttClasses').value    = sClass ;
 495  
 496      // Update the Link type combo.

 497      GetE('cmbLinkType').value = sType ;
 498  }
 499  
 500  //#### Link type selection.

 501  function SetLinkType( linkType )
 502  {
 503      ShowE('divLinkTypeUrl'        , (linkType == 'url') ) ;
 504      ShowE('divLinkTypeAnchor'    , (linkType == 'anchor') ) ;
 505      ShowE('divLinkTypeEMail'    , (linkType == 'email') ) ;
 506  
 507      if ( !FCKConfig.LinkDlgHideTarget )
 508          dialog.SetTabVisibility( 'Target'    , (linkType == 'url') ) ;
 509  
 510      if ( FCKConfig.LinkUpload )
 511          dialog.SetTabVisibility( 'Upload'    , (linkType == 'url') ) ;
 512  
 513      if ( !FCKConfig.LinkDlgHideAdvanced )
 514          dialog.SetTabVisibility( 'Advanced'    , (linkType != 'anchor' || bHasAnchors) ) ;
 515  
 516      if ( linkType == 'email' )
 517          dialog.SetAutoSize( true ) ;
 518  }
 519  
 520  //#### Target type selection.

 521  function SetTarget( targetType )
 522  {
 523      GetE('tdTargetFrame').style.display    = ( targetType == 'popup' ? 'none' : '' ) ;
 524      GetE('tdPopupName').style.display    =
 525      GetE('tablePopupFeatures').style.display = ( targetType == 'popup' ? '' : 'none' ) ;
 526  
 527      switch ( targetType )
 528      {
 529          case "_blank" :
 530          case "_self" :
 531          case "_parent" :
 532          case "_top" :
 533              GetE('txtTargetFrame').value = targetType ;
 534              break ;
 535          case "" :
 536              GetE('txtTargetFrame').value = '' ;
 537              break ;
 538      }
 539  
 540      if ( targetType == 'popup' )
 541          dialog.SetAutoSize( true ) ;
 542  }
 543  
 544  //#### Called while the user types the URL.

 545  function OnUrlChange()
 546  {
 547      var sUrl = GetE('txtUrl').value ;
 548      var sProtocol = oRegex.UrlOnChangeProtocol.exec( sUrl ) ;
 549  
 550      if ( sProtocol )
 551      {
 552          sUrl = sUrl.substr( sProtocol[0].length ) ;
 553          GetE('txtUrl').value = sUrl ;
 554          GetE('cmbLinkProtocol').value = sProtocol[0].toLowerCase() ;
 555      }
 556      else if ( oRegex.UrlOnChangeTestOther.test( sUrl ) )
 557      {
 558          GetE('cmbLinkProtocol').value = '' ;
 559      }
 560  }
 561  
 562  //#### Called while the user types the target name.

 563  function OnTargetNameChange()
 564  {
 565      var sFrame = GetE('txtTargetFrame').value ;
 566  
 567      if ( sFrame.length == 0 )
 568          GetE('cmbTarget').value = '' ;
 569      else if ( oRegex.ReserveTarget.test( sFrame ) )
 570          GetE('cmbTarget').value = sFrame.toLowerCase() ;
 571      else
 572          GetE('cmbTarget').value = 'frame' ;
 573  }
 574  
 575  // Accessible popups

 576  function BuildOnClickPopup()
 577  {
 578      var sWindowName = "'" + GetE('txtPopupName').value.replace(/\W/gi, "") + "'" ;
 579  
 580      var sFeatures = '' ;
 581      var aChkFeatures = document.getElementsByName( 'chkFeature' ) ;
 582      for ( var i = 0 ; i < aChkFeatures.length ; i++ )
 583      {
 584          if ( i > 0 ) sFeatures += ',' ;
 585          sFeatures += aChkFeatures[i].value + '=' + ( aChkFeatures[i].checked ? 'yes' : 'no' ) ;
 586      }
 587  
 588      if ( GetE('txtPopupWidth').value.length > 0 )    sFeatures += ',width=' + GetE('txtPopupWidth').value ;
 589      if ( GetE('txtPopupHeight').value.length > 0 )    sFeatures += ',height=' + GetE('txtPopupHeight').value ;
 590      if ( GetE('txtPopupLeft').value.length > 0 )    sFeatures += ',left=' + GetE('txtPopupLeft').value ;
 591      if ( GetE('txtPopupTop').value.length > 0 )        sFeatures += ',top=' + GetE('txtPopupTop').value ;
 592  
 593      if ( sFeatures != '' )
 594          sFeatures = sFeatures + ",status" ;
 595  
 596      return ( "window.open(this.href," + sWindowName + ",'" + sFeatures + "'); return false" ) ;
 597  }
 598  
 599  //#### Fills all Popup related fields.

 600  function FillPopupFields( windowName, features )
 601  {
 602      if ( windowName )
 603          GetE('txtPopupName').value = windowName ;
 604  
 605      var oFeatures = new Object() ;
 606      var oFeaturesMatch ;
 607      while( ( oFeaturesMatch = oRegex.PopupFeatures.exec( features ) ) != null )
 608      {
 609          var sValue = oFeaturesMatch[2] ;
 610          if ( sValue == ( 'yes' || '1' ) )
 611              oFeatures[ oFeaturesMatch[1] ] = true ;
 612          else if ( ! isNaN( sValue ) && sValue != 0 )
 613              oFeatures[ oFeaturesMatch[1] ] = sValue ;
 614      }
 615  
 616      // Update all features check boxes.

 617      var aChkFeatures = document.getElementsByName('chkFeature') ;
 618      for ( var i = 0 ; i < aChkFeatures.length ; i++ )
 619      {
 620          if ( oFeatures[ aChkFeatures[i].value ] )
 621              aChkFeatures[i].checked = true ;
 622      }
 623  
 624      // Update position and size text boxes.

 625      if ( oFeatures['width'] )    GetE('txtPopupWidth').value        = oFeatures['width'] ;
 626      if ( oFeatures['height'] )    GetE('txtPopupHeight').value    = oFeatures['height'] ;
 627      if ( oFeatures['left'] )    GetE('txtPopupLeft').value        = oFeatures['left'] ;
 628      if ( oFeatures['top'] )        GetE('txtPopupTop').value        = oFeatures['top'] ;
 629  }
 630  
 631  //#### The OK button was hit.

 632  function Ok()
 633  {
 634      var sUri, sInnerHtml ;
 635      oEditor.FCKUndo.SaveUndoStep() ;
 636  
 637      switch ( GetE('cmbLinkType').value )
 638      {
 639          case 'url' :
 640              sUri = GetE('txtUrl').value ;
 641  
 642              if ( sUri.length == 0 )
 643              {
 644                  alert( FCKLang.DlnLnkMsgNoUrl ) ;
 645                  return false ;
 646              }
 647  
 648              sUri = GetE('cmbLinkProtocol').value + sUri ;
 649  
 650              break ;
 651  
 652          case 'email' :
 653              sUri = GetE('txtEMailAddress').value ;
 654  
 655              if ( sUri.length == 0 )
 656              {
 657                  alert( FCKLang.DlnLnkMsgNoEMail ) ;
 658                  return false ;
 659              }
 660  
 661              sUri = oParser.CreateEMailUri(
 662                  sUri,
 663                  GetE('txtEMailSubject').value,
 664                  GetE('txtEMailBody').value ) ;
 665              break ;
 666  
 667          case 'anchor' :
 668              var sAnchor = GetE('cmbAnchorName').value ;
 669              if ( sAnchor.length == 0 ) sAnchor = GetE('cmbAnchorId').value ;
 670  
 671              if ( sAnchor.length == 0 )
 672              {
 673                  alert( FCKLang.DlnLnkMsgNoAnchor ) ;
 674                  return false ;
 675              }
 676  
 677              sUri = '#' + sAnchor ;
 678              break ;
 679      }
 680  
 681      // If no link is selected, create a new one (it may result in more than one link creation - #220).

 682      var aLinks = oLink ? [ oLink ] : oEditor.FCK.CreateLink( sUri, true ) ;
 683  
 684      // If no selection, no links are created, so use the uri as the link text (by dom, 2006-05-26)

 685      var aHasSelection = ( aLinks.length > 0 ) ;
 686      if ( !aHasSelection )
 687      {
 688          sInnerHtml = sUri;
 689  
 690          // Built a better text for empty links.

 691          switch ( GetE('cmbLinkType').value )
 692          {
 693              // anchor: use old behavior --> return true

 694              case 'anchor':
 695                  sInnerHtml = sInnerHtml.replace( /^#/, '' ) ;
 696                  break ;
 697  
 698              // url: try to get path

 699              case 'url':
 700                  var oLinkPathRegEx = new RegExp("//?([^?\"']+)([?].*)?$") ;
 701                  var asLinkPath = oLinkPathRegEx.exec( sUri ) ;
 702                  if (asLinkPath != null)
 703                      sInnerHtml = asLinkPath[1];  // use matched path

 704                  break ;
 705  
 706              // mailto: try to get email address

 707              case 'email':
 708                  sInnerHtml = GetE('txtEMailAddress').value ;
 709                  break ;
 710          }
 711  
 712          // Create a new (empty) anchor.

 713          aLinks = [ oEditor.FCK.InsertElement( 'a' ) ] ;
 714      }
 715  
 716      for ( var i = 0 ; i < aLinks.length ; i++ )
 717      {
 718          oLink = aLinks[i] ;
 719  
 720          if ( aHasSelection )
 721              sInnerHtml = oLink.innerHTML ;        // Save the innerHTML (IE changes it if it is like an URL).

 722  
 723          oLink.href = sUri ;
 724          SetAttribute( oLink, '_fcksavedurl', sUri ) ;
 725  
 726          var onclick;
 727          // Accessible popups

 728          if( GetE('cmbTarget').value == 'popup' )
 729          {
 730              onclick = BuildOnClickPopup() ;
 731              // Encode the attribute

 732              onclick = encodeURIComponent( " onclick=\"" + onclick + "\"" )  ;
 733              SetAttribute( oLink, 'onclick_fckprotectedatt', onclick ) ;
 734          }
 735          else
 736          {
 737              // Check if the previous onclick was for a popup:

 738              // In that case remove the onclick handler.

 739              onclick = oLink.getAttribute( 'onclick_fckprotectedatt' ) ;
 740              if ( onclick )
 741              {
 742                  // Decode the protected string

 743                  onclick = decodeURIComponent( onclick ) ;
 744  
 745                  if( oRegex.OnClickPopup.test( onclick ) )
 746                      SetAttribute( oLink, 'onclick_fckprotectedatt', '' ) ;
 747              }
 748          }
 749  
 750          oLink.innerHTML = sInnerHtml ;        // Set (or restore) the innerHTML

 751  
 752          // Target

 753          if( GetE('cmbTarget').value != 'popup' )
 754              SetAttribute( oLink, 'target', GetE('txtTargetFrame').value ) ;
 755          else
 756              SetAttribute( oLink, 'target', null ) ;
 757  
 758          // Let's set the "id" only for the first link to avoid duplication.

 759          if ( i == 0 )
 760              SetAttribute( oLink, 'id', GetE('txtAttId').value ) ;
 761  
 762          // Advances Attributes

 763          SetAttribute( oLink, 'name'        , GetE('txtAttName').value ) ;
 764          SetAttribute( oLink, 'dir'        , GetE('cmbAttLangDir').value ) ;
 765          SetAttribute( oLink, 'lang'        , GetE('txtAttLangCode').value ) ;
 766          SetAttribute( oLink, 'accesskey', GetE('txtAttAccessKey').value ) ;
 767          SetAttribute( oLink, 'tabindex'    , ( GetE('txtAttTabIndex').value > 0 ? GetE('txtAttTabIndex').value : null ) ) ;
 768          SetAttribute( oLink, 'title'    , GetE('txtAttTitle').value ) ;
 769          SetAttribute( oLink, 'type'        , GetE('txtAttContentType').value ) ;
 770          SetAttribute( oLink, 'charset'    , GetE('txtAttCharSet').value ) ;
 771  
 772          if ( oEditor.FCKBrowserInfo.IsIE )
 773          {
 774              var sClass = GetE('txtAttClasses').value ;
 775              // If it's also an anchor add an internal class

 776              if ( GetE('txtAttName').value.length != 0 )
 777                  sClass += ' FCK__AnchorC' ;
 778              SetAttribute( oLink, 'className', sClass ) ;
 779  
 780              oLink.style.cssText = GetE('txtAttStyle').value ;
 781          }
 782          else
 783          {
 784              SetAttribute( oLink, 'class', GetE('txtAttClasses').value ) ;
 785              SetAttribute( oLink, 'style', GetE('txtAttStyle').value ) ;
 786          }
 787      }
 788  
 789      // Select the (first) link.

 790      oEditor.FCKSelection.SelectNode( aLinks[0] );
 791  
 792      return true ;
 793  }
 794  
 795  function BrowseServer()
 796  {
 797      OpenFileBrowser( FCKConfig.LinkBrowserURL, FCKConfig.LinkBrowserWindowWidth, FCKConfig.LinkBrowserWindowHeight ) ;
 798  }
 799  
 800  function SetUrl( url )
 801  {
 802      GetE('txtUrl').value = url ;
 803      OnUrlChange() ;
 804      dialog.SetSelectedTab( 'Info' ) ;
 805  }
 806  
 807  function OnUploadCompleted( errorNumber, fileUrl, fileName, customMsg )
 808  {
 809      // Remove animation

 810      window.parent.Throbber.Hide() ;
 811      GetE( 'divUpload' ).style.display  = '' ;
 812  
 813      switch ( errorNumber )
 814      {
 815          case 0 :    // No errors
 816              alert( 'Your file has been successfully uploaded' ) ;
 817              break ;
 818          case 1 :    // Custom error
 819              alert( customMsg ) ;
 820              return ;
 821          case 101 :    // Custom warning
 822              alert( customMsg ) ;
 823              break ;
 824          case 201 :
 825              alert( 'A file with the same name is already available. The uploaded file has been renamed to "' + fileName + '"' ) ;
 826              break ;
 827          case 202 :
 828              alert( 'Invalid file type' ) ;
 829              return ;
 830          case 203 :
 831              alert( "Security error. You probably don't have enough permissions to upload. Please check your server." ) ;
 832              return ;
 833          case 500 :
 834              alert( 'The connector is disabled' ) ;
 835              break ;
 836          default :
 837              alert( 'Error on file upload. Error number: ' + errorNumber ) ;
 838              return ;
 839      }
 840  
 841      SetUrl( fileUrl ) ;
 842      GetE('frmUpload').reset() ;
 843  }
 844  
 845  var oUploadAllowedExtRegex    = new RegExp( FCKConfig.LinkUploadAllowedExtensions, 'i' ) ;
 846  var oUploadDeniedExtRegex    = new RegExp( FCKConfig.LinkUploadDeniedExtensions, 'i' ) ;
 847  
 848  function CheckUpload()
 849  {
 850      var sFile = GetE('txtUploadFile').value ;
 851  
 852      if ( sFile.length == 0 )
 853      {
 854          alert( 'Please select a file to upload' ) ;
 855          return false ;
 856      }
 857  
 858      if ( ( FCKConfig.LinkUploadAllowedExtensions.length > 0 && !oUploadAllowedExtRegex.test( sFile ) ) ||
 859          ( FCKConfig.LinkUploadDeniedExtensions.length > 0 && oUploadDeniedExtRegex.test( sFile ) ) )
 860      {
 861          OnUploadCompleted( 202 ) ;
 862          return false ;
 863      }
 864  
 865      // Show animation

 866      window.parent.Throbber.Show( 100 ) ;
 867      GetE( 'divUpload' ).style.display  = 'none' ;
 868  
 869      return true ;
 870  }
 871  
 872  function SetDefaultTarget()
 873  {
 874      var target = FCKConfig.DefaultLinkTarget || '' ;
 875  
 876      if ( oLink || target.length == 0 )
 877          return ;
 878  
 879      switch ( target )
 880      {
 881          case '_blank' :
 882          case '_self' :
 883          case '_parent' :
 884          case '_top' :
 885              GetE('cmbTarget').value = target ;
 886              break ;
 887          default :
 888              GetE('cmbTarget').value = 'frame' ;
 889              break ;
 890      }
 891  
 892      GetE('txtTargetFrame').value = target ;
 893  }


Generated: Fri Jan 1 13:43:16 2010 Cross-referenced by PHPXref 0.7