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 * Scripts related to the Image dialog window (see fck_image.html). 22 */ 23 24var dialog = window.parent ; 25var oEditor = dialog.InnerDialogLoaded() ; 26var FCK = oEditor.FCK ; 27var FCKLang = oEditor.FCKLang ; 28var FCKConfig = oEditor.FCKConfig ; 29var FCKDebug = oEditor.FCKDebug ; 30var FCKTools = oEditor.FCKTools ; 31 32FCK.dwiki_browser = 'img'; 33FCK.islocal_dwikibrowser = false; 34var DWIKI_Client = FCK.dwiki_client; 35var DWIKI_fnencode = FCK.dwiki_fnencode; 36var bImageButton = ( document.location.search.length > 0 && document.location.search.substr(1) == 'ImageButton' ) ; 37var ua_temp = navigator.userAgent.toLowerCase(); 38var ChromeBrowser = ua_temp.indexOf('chrome') > -1; 39 40//#### Dialog Tabs 41 42// Set the dialog tabs. 43dialog.AddTab( 'Info', FCKLang.DlgImgInfoTab ) ; 44/* 45if ( !bImageButton && !FCKConfig.ImageDlgHideLink ) 46 dialog.AddTab( 'Link', FCKLang.DlgImgLinkTab ) ; 47*/ 48FCKConfig.ImageUpload = false; 49if ( FCKConfig.ImageUpload ) 50 dialog.AddTab( 'Upload', FCKLang.DlgLnkUpload ) ; 51 52if ( !FCKConfig.ImageDlgHideAdvanced ) 53 dialog.AddTab( 'Advanced', 'Help') ; 54 55// Function called when a dialog tag is selected. 56function OnDialogTabChange( tabCode ) 57{ 58 var user; 59 if(FCK.dwiki_user == 'user') { 60 61 user = true; 62 } 63 else { 64 65 user = false; 66 } 67 ShowE('divInfo' , ( tabCode == 'Info' ) ) ; 68// ShowE('divLink' , ( tabCode == 'Link' ) ) ; 69 if(user) { 70 //ShowE('divUpload' , ( tabCode == 'Upload' ) ) ; 71 } 72 ShowE('divAdvanced' , ( tabCode == 'Advanced' ) ) ; 73} 74 75// Get the selected image (if available). 76var oImage = dialog.Selection.GetSelectedElement() ; 77 78if ( oImage && oImage.tagName != 'IMG' && !( oImage.tagName == 'INPUT' && oImage.type == 'image' ) ) 79 oImage = null ; 80 81// Get the active link. 82var oLink = dialog.Selection.GetSelection().MoveToAncestorNode( 'A' ) ; 83 84var oImageOriginal ; 85 86function UpdateOriginal( resetSize ) 87{ 88 if ( !eImgPreview ) 89 return ; 90 91 if ( GetE('txtUrl').value.length == 0 ) 92 { 93 oImageOriginal = null ; 94 return ; 95 } 96 97 oImageOriginal = document.createElement( 'IMG' ) ; // new Image() ; 98 99 if ( resetSize ) 100 { 101 oImageOriginal.onload = function() 102 { 103 this.onload = null ; 104 ResetSizes() ; 105 } 106 } 107 108 oImageOriginal.src = eImgPreview.src ; 109} 110 111var bPreviewInitialized ; 112 113window.onload = function() 114{ 115 if(ChromeBrowser) return; 116 // Translate the dialog box texts. 117 oEditor.FCKLanguageManager.TranslatePage(document) ; 118 119 GetE('btnLockSizes').title = FCKLang.DlgImgLockRatio ; 120 GetE('btnResetSize').title = FCKLang.DlgBtnResetSize ; 121 122 // Load the selected element information (if any). 123 LoadSelection() ; 124 125 // Show/Hide the "Browse Server" button. 126 GetE('tdBrowse').style.display = FCKConfig.ImageBrowser ? '' : 'none' ; 127 GetE('divLnkBrowseServer').style.display = FCKConfig.LinkBrowser ? '' : 'none' ; 128 129 UpdateOriginal() ; 130 131 // Set the actual uploader URL. 132 if ( FCKConfig.ImageUpload ) 133 GetE('frmUpload').action = FCKConfig.ImageUploadURL ; 134 135 dialog.SetAutoSize( true ) ; 136 137 // Activate the "OK" button. 138 dialog.SetOkButton( true ) ; 139 140 SelectField( 'txtUrl' ) ; 141} 142 143function ChromeKludge() 144{ 145 // Translate the dialog box texts. 146 oEditor.FCKLanguageManager.TranslatePage(document) ; 147 148 GetE('btnLockSizes').title = FCKLang.DlgImgLockRatio ; 149 GetE('btnResetSize').title = FCKLang.DlgBtnResetSize ; 150 151 // Load the selected element information (if any). 152 LoadSelection() ; 153 154 // Show/Hide the "Browse Server" button. 155 GetE('tdBrowse').style.display = FCKConfig.ImageBrowser ? '' : 'none' ; 156 GetE('divLnkBrowseServer').style.display = FCKConfig.LinkBrowser ? '' : 'none' ; 157 158 UpdateOriginal() ; 159 160 // Set the actual uploader URL. 161 if ( FCKConfig.ImageUpload ) 162 GetE('frmUpload').action = FCKConfig.ImageUploadURL ; 163 164 dialog.SetAutoSize( true ) ; 165 166 // Activate the "OK" button. 167 dialog.SetOkButton( true ) ; 168 169 SelectField( 'txtUrl' ) ; 170} 171 172function LoadSelection() 173{ 174 if ( ! oImage ) return ; 175 176 var sUrl = oImage.getAttribute( '_fcksavedurl' ) ; 177 if ( sUrl == null ) 178 sUrl = GetAttribute( oImage, 'src', '' ) ; 179 180 GetE('txtUrl').value = sUrl ; 181 GetE('txtAlt').value = GetAttribute( oImage, 'alt', '' ) ; 182 GetE('txtVSpace').value = GetAttribute( oImage, 'vspace', '' ) ; 183 GetE('txtHSpace').value = GetAttribute( oImage, 'hspace', '' ) ; 184 GetE('txtBorder').value = GetAttribute( oImage, 'border', '' ) ; 185 GetE('cmbAlign').value = GetAttribute( oImage, 'align', '' ) ; 186 187 var iWidth, iHeight ; 188 189 var regexSize = /^\s*(\d+)px\s*$/i ; 190 191 if ( oImage.style.width ) 192 { 193 var aMatchW = oImage.style.width.match( regexSize ) ; 194 if ( aMatchW ) 195 { 196 iWidth = aMatchW[1] ; 197 oImage.style.width = '' ; 198 SetAttribute( oImage, 'width' , iWidth ) ; 199 } 200 } 201 202 if ( oImage.style.height ) 203 { 204 var aMatchH = oImage.style.height.match( regexSize ) ; 205 if ( aMatchH ) 206 { 207 iHeight = aMatchH[1] ; 208 oImage.style.height = '' ; 209 SetAttribute( oImage, 'height', iHeight ) ; 210 } 211 } 212 213 GetE('txtWidth').value = iWidth ? iWidth : GetAttribute( oImage, "width", '' ) ; 214 GetE('txtHeight').value = iHeight ? iHeight : GetAttribute( oImage, "height", '' ) ; 215 216 // Get Advances Attributes 217 GetE('txtAttId').value = oImage.id ; 218 GetE('cmbAttLangDir').value = oImage.dir ; 219 GetE('txtAttLangCode').value = oImage.lang ; 220 GetE('txtAttTitle').value = oImage.title ; 221 GetE('txtLongDesc').value = oImage.longDesc ; 222 223 if ( oEditor.FCKBrowserInfo.IsIE ) 224 { 225 GetE('txtAttClasses').value = oImage.className || '' ; 226 GetE('txtAttStyle').value = oImage.style.cssText ; 227 } 228 else 229 { 230 GetE('txtAttClasses').value = oImage.getAttribute('class',2) || '' ; 231 GetE('txtAttStyle').value = oImage.getAttribute('style',2) ; 232 } 233 234 if ( oLink ) 235 { 236 var sLinkUrl = oLink.getAttribute( '_fcksavedurl' ) ; 237 if ( sLinkUrl == null ) 238 sLinkUrl = oLink.getAttribute('href',2) ; 239 240 GetE('txtLnkUrl').value = sLinkUrl ; 241 GetE('cmbLnkTarget').value = oLink.target ; 242 } 243 244 UpdatePreview() ; 245} 246 247//#### The OK button was hit. 248function Ok() 249{ 250 if ( GetE('txtUrl').value.length == 0 ) 251 { 252 dialog.SetSelectedTab( 'Info' ) ; 253 GetE('txtUrl').focus() ; 254 255 alert( FCKLang.DlgImgAlertUrl ) ; 256 257 return false ; 258 } 259 260 var bHasImage = ( oImage != null ) ; 261 262 if ( bHasImage && bImageButton && oImage.tagName == 'IMG' ) 263 { 264 if ( confirm( 'Do you want to transform the selected image on a image button?' ) ) 265 oImage = null ; 266 } 267 else if ( bHasImage && !bImageButton && oImage.tagName == 'INPUT' ) 268 { 269 if ( confirm( 'Do you want to transform the selected image button on a simple image?' ) ) 270 oImage = null ; 271 } 272 273 oEditor.FCKUndo.SaveUndoStep() ; 274 if ( !bHasImage ) 275 { 276 if ( bImageButton ) 277 { 278 oImage = FCK.EditorDocument.createElement( 'input' ) ; 279 oImage.type = 'image' ; 280 oImage = FCK.InsertElement( oImage ) ; 281 } 282 else 283 oImage = FCK.InsertElement( 'img' ) ; 284 } 285 286 UpdateImage( oImage ) ; 287 if(window.document.documentMode && window.document.documentMode == 9) { 288 FCK.target.appendChild(oImage); 289 } 290 var sLnkUrl = GetE('txtLnkUrl').value.Trim() ; 291 292 if ( sLnkUrl.length == 0 ) 293 { 294 if ( oLink ) 295 FCK.ExecuteNamedCommand( 'Unlink' ) ; 296 } 297 else 298 { 299 if ( oLink ) // Modifying an existent link. 300 oLink.href = sLnkUrl ; 301 else // Creating a new link. 302 { 303 if ( !bHasImage ) 304 oEditor.FCKSelection.SelectNode( oImage ) ; 305 306 oLink = oEditor.FCK.CreateLink( sLnkUrl )[0] ; 307 308 if ( !bHasImage ) 309 { 310 oEditor.FCKSelection.SelectNode( oLink ) ; 311 oEditor.FCKSelection.Collapse( false ) ; 312 } 313 } 314 315 SetAttribute( oLink, '_fcksavedurl', sLnkUrl ) ; 316 SetAttribute( oLink, 'target', GetE('cmbLnkTarget').value ) ; 317 318 } 319 320 return true ; 321} 322 323function UpdateImage( e, skipId) 324{ 325 e.src = GetE('txtUrl').value ; 326 327 SetAttribute( e, "_fcksavedurl", GetE('txtUrl').value ) ; 328 SetAttribute( e, "alt" , GetE('txtAlt').value ) ; 329 SetAttribute( e, "width" , GetE('txtWidth').value ) ; 330 SetAttribute( e, "height", GetE('txtHeight').value ) ; 331 SetAttribute( e, "vspace", GetE('txtVSpace').value ) ; 332 SetAttribute( e, "hspace", GetE('txtHSpace').value ) ; 333 SetAttribute( e, "border", GetE('txtBorder').value ) ; 334 SetAttribute( e, "align" , GetE('cmbAlign').value ) ; 335 336 337 338 // Advances Attributes 339 340 if ( ! skipId ) 341 SetAttribute( e, 'id', GetE('txtAttId').value ) ; 342 343 var dwlinkType = ""; 344 var dom = GetE('getLinkType'); 345 var rbuttons = dom['link_type']; 346 for(var i=0; i< rbuttons.length; i++) { 347 if(rbuttons[i].checked) { 348 dwlinkType = rbuttons[i].value; 349 } 350 } 351 352 SetAttribute( e, 'dir' , GetE('cmbAttLangDir').value ) ; 353 SetAttribute( e, 'lang' , GetE('txtAttLangCode').value ) ; 354 SetAttribute( e, 'title' , GetE('txtAttTitle').value ) ; 355 SetAttribute( e, 'longDesc' , GetE('txtLongDesc').value ) ; 356 SetAttribute( e, 'type' , dwlinkType) ; 357 358 if ( oEditor.FCKBrowserInfo.IsIE ) 359 { 360 361 if(e.align == 'middle') { 362 e.className = 'mediacenter'; 363 } 364 else if(e.align == 'right') { 365 e.className = 'mediaright'; 366 } 367 else if(e.align == 'left') { 368 e.className = 'medialeft'; 369 370 } 371 else if(e.align == 'baseline') { 372 e.className = 'baseline'; 373 374 } 375 else if(e.align == 'none') { 376 e.className = 'media'; 377 SetAttribute( e, 'align' , '' ) ; 378 } 379 else { 380 e.className = GetE('txtAttClasses').value ; 381 } 382 383 e.style.cssText = GetE('txtAttStyle').value ; 384 385 } 386 else 387 { 388 389 if(e.align == 'middle') { 390 SetAttribute( e, 'class' , 'mediacenter' ) ; 391 } 392 else if(e.align == 'right') { 393 SetAttribute( e, 'class' , 'mediaright' ) ; 394 } 395 else if(e.align == 'left') { 396 SetAttribute( e, 'class' , 'medialeft' ) ; 397 398 } 399 else if(e.align == 'baseline') { 400 SetAttribute( e, 'class' , 'baseline' ) ; 401 402 } 403 else if(e.align == 'none') { 404 SetAttribute( e, 'class' , 'media' ) ; 405 SetAttribute( e, 'align' , '' ) ; 406 } 407 else { 408 SetAttribute( e, 'class' , GetE('txtAttClasses').value ) ; 409 } 410 411 SetAttribute( e, 'style', GetE('txtAttStyle').value ) ; 412 } 413 414} 415 416var eImgPreview ; 417var eImgPreviewLink ; 418 419function SetPreviewElements( imageElement, linkElement ) 420{ 421 eImgPreview = imageElement ; 422 eImgPreviewLink = linkElement ; 423 424 UpdatePreview() ; 425 UpdateOriginal() ; 426 427 bPreviewInitialized = true ; 428} 429 430function UpdatePreview() 431{ 432 if ( !eImgPreview || !eImgPreviewLink ) 433 return ; 434 435 if ( GetE('txtUrl').value.length == 0 ) 436 eImgPreviewLink.style.display = 'none' ; 437 else 438 { 439 440 UpdateImage( eImgPreview, true) ; 441 442 if ( GetE('txtLnkUrl').value.Trim().length > 0 ) 443 eImgPreviewLink.href = 'javascript:void(null);' ; 444 else 445 SetAttribute( eImgPreviewLink, 'href', '' ) ; 446 447 eImgPreviewLink.style.display = '' ; 448 } 449} 450 451var bLockRatio = true ; 452 453function SwitchLock( lockButton ) 454{ 455 bLockRatio = !bLockRatio ; 456 lockButton.className = bLockRatio ? 'BtnLocked' : 'BtnUnlocked' ; 457 lockButton.title = bLockRatio ? 'Lock sizes' : 'Unlock sizes' ; 458 459 if ( bLockRatio ) 460 { 461 if ( GetE('txtWidth').value.length > 0 ) 462 OnSizeChanged( 'Width', GetE('txtWidth').value ) ; 463 else 464 OnSizeChanged( 'Height', GetE('txtHeight').value ) ; 465 } 466} 467 468// Fired when the width or height input texts change 469function OnSizeChanged( dimension, value ) 470{ 471 // Verifies if the aspect ration has to be maintained 472 if ( oImageOriginal && bLockRatio ) 473 { 474 var e = dimension == 'Width' ? GetE('txtHeight') : GetE('txtWidth') ; 475 476 if ( value.length == 0 || isNaN( value ) ) 477 { 478 e.value = '' ; 479 return ; 480 } 481 482 if ( dimension == 'Width' ) 483 value = value == 0 ? 0 : Math.round( oImageOriginal.height * ( value / oImageOriginal.width ) ) ; 484 else 485 value = value == 0 ? 0 : Math.round( oImageOriginal.width * ( value / oImageOriginal.height ) ) ; 486 487 if ( !isNaN( value ) ) 488 e.value = value ; 489 } 490 491 UpdatePreview() ; 492} 493 494// Fired when the Reset Size button is clicked 495function ResetSizes() 496{ 497 if ( ! oImageOriginal ) return ; 498 if ( oEditor.FCKBrowserInfo.IsGecko && !oImageOriginal.complete ) 499 { 500 setTimeout( ResetSizes, 50 ) ; 501 return ; 502 } 503 504 GetE('txtWidth').value = oImageOriginal.width ; 505 GetE('txtHeight').value = oImageOriginal.height ; 506 507 UpdatePreview() ; 508} 509 510function BrowseServer() 511{ 512 OpenServerBrowser( 513 'Image', 514 FCKConfig.ImageBrowserURL, 515 FCKConfig.ImageBrowserWindowWidth, 516 FCKConfig.ImageBrowserWindowHeight ) ; 517} 518 519function LnkBrowseServer() 520{ 521 OpenServerBrowser( 522 'Link', 523 FCKConfig.LinkBrowserURL, 524 FCKConfig.LinkBrowserWindowWidth, 525 FCKConfig.LinkBrowserWindowHeight ) ; 526} 527 528function OpenServerBrowser( type, url, width, height ) 529{ 530 531 sActualBrowser = type ; 532 OpenFileBrowser( url, width, height ) ; 533} 534 535var sActualBrowser ; 536 537function SetUrl( url, width, height, alt ) 538{ 539 540 if ( sActualBrowser == 'Link' ) 541 { 542 GetE('txtLnkUrl').value = url ; 543 UpdatePreview() ; 544 } 545 else 546 { 547 548 GetE('txtUrl').value = dwikiUTF8_encodeFN(url,DWIKI_fnencode); 549 GetE('txtUrlDisp').value = url; 550 GetE('txtUrl').value = encodeURI(GetE('txtUrl').value); 551 GetE('txtWidth').value = width ? width : '' ; 552 GetE('txtHeight').value = height ? height : '' ; 553 554 if ( alt ) 555 GetE('txtAlt').value = alt; 556 557 UpdatePreview() ; 558 UpdateOriginal( true ) ; 559 } 560 561 dialog.SetSelectedTab( 'Info' ) ; 562} 563 564function OnUploadCompleted( errorNumber, fileUrl, fileName, customMsg ) 565{ 566 // Remove animation 567 window.parent.Throbber.Hide() ; 568 GetE( 'divUpload' ).style.display = '' ; 569 570 switch ( errorNumber ) 571 { 572 case 0 : // No errors 573 alert( FCKLang.DlgImgAlertSucess ) ; 574 break ; 575 case 1 : // Custom error 576 alert( customMsg ) ; 577 return ; 578 case 101 : // Custom warning 579 alert( customMsg ) ; 580 break ; 581 case 201 : 582 alert( DlgImgAlertName + '"' + fileName + '"' ) ; 583 break ; 584 case 202 : 585 alert( FCKLang.DlgImgAlertInvalid ) ; 586 return ; 587 case 203 : 588 alert( FCKLang.DlgImgAlertSecurity ) ; 589 return ; 590 case 500 : 591 alert( FCKLang.FileBrowserError_Connector ) ; 592 break ; 593 default : 594 alert( FCKLang.FileBrowserError_Upload + errorNumber ) ; 595 return ; 596 } 597 598 sActualBrowser = '' ; 599 SetUrl( fileUrl ) ; 600 GetE('frmUpload').reset() ; 601} 602 603var oUploadAllowedExtRegex = new RegExp( FCKConfig.ImageUploadAllowedExtensions, 'i' ) ; 604var oUploadDeniedExtRegex = new RegExp( FCKConfig.ImageUploadDeniedExtensions, 'i' ) ; 605 606function CheckUpload() 607{ 608 var sFile = GetE('txtUploadFile').value ; 609 610 if ( sFile.length == 0 ) 611 { 612 alert(FCKLang.FileBrowserError_File_Submit) ; 613 return false ; 614 } 615 616 if ( ( FCKConfig.ImageUploadAllowedExtensions.length > 0 && !oUploadAllowedExtRegex.test( sFile ) ) || 617 ( FCKConfig.ImageUploadDeniedExtensions.length > 0 && oUploadDeniedExtRegex.test( sFile ) ) ) 618 { 619 OnUploadCompleted( 202 ) ; 620 return false ; 621 } 622 623 var fname = sFile; 624 var result = sFile.match(/([\/\\])/); 625 if(result) { 626 var tmp = fname.split(result[1]); 627 fname = tmp.pop(); 628 } 629 630/* 631 var pos = fname.search(/[A-Z\s]/); 632 633 if(pos != -1) { 634 var customMsg = "DokuWiki does not recognize image names with spaces\nor capital letters:\n" 635 + " " + sFile 636 + "\nUpload using the DokuWiki mediamanager to convert file\nname to the correct form"; 637 OnUploadCompleted( 1, "", fname, customMsg ); 638 return false ; 639 } 640 */ 641 // Show animation 642 window.parent.Throbber.Show( 100 ) ; 643 GetE( 'divUpload' ).style.display = 'none' ; 644 645 return true ; 646} 647 648 649 650