1/* 2 * FCKeditor - The text editor for Internet - http://www.fckeditor.net 3 * Copyright (C) 2003-2007 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 oEditor = window.parent.InnerDialogLoaded() ; 25var FCK = oEditor.FCK ; 26var FCKLang = oEditor.FCKLang ; 27var FCKConfig = oEditor.FCKConfig ; 28var FCKDebug = oEditor.FCKDebug ; 29 30var bImageButton = ( document.location.search.length > 0 && document.location.search.substr(1) == 'ImageButton' ) ; 31 32//#### Dialog Tabs 33 34// Set the dialog tabs. 35window.parent.AddTab( 'Info', FCKLang.DlgImgInfoTab ) ; 36 37if ( !bImageButton && !FCKConfig.ImageDlgHideLink ) 38 window.parent.AddTab( 'Link', FCKLang.DlgImgLinkTab ) ; 39 40if ( FCKConfig.ImageUpload ) 41 window.parent.AddTab( 'Upload', FCKLang.DlgLnkUpload ) ; 42 43if ( !FCKConfig.ImageDlgHideAdvanced ) 44 window.parent.AddTab( 'Advanced', FCKLang.DlgAdvancedTag ) ; 45 46// Function called when a dialog tag is selected. 47function OnDialogTabChange( tabCode ) 48{ 49 ShowE('divInfo' , ( tabCode == 'Info' ) ) ; 50 ShowE('divLink' , ( tabCode == 'Link' ) ) ; 51 ShowE('divUpload' , ( tabCode == 'Upload' ) ) ; 52 ShowE('divAdvanced' , ( tabCode == 'Advanced' ) ) ; 53} 54 55// Get the selected image (if available). 56var oImage = FCK.Selection.GetSelectedElement() ; 57 58if ( oImage && oImage.tagName != 'IMG' && !( oImage.tagName == 'INPUT' && oImage.type == 'image' ) ) 59 oImage = null ; 60 61// Get the active link. 62var oLink = FCK.Selection.MoveToAncestorNode( 'A' ) ; 63 64var oImageOriginal ; 65 66function UpdateOriginal( resetSize ) 67{ 68 if ( !eImgPreview ) 69 return ; 70 71 if ( GetE('txtUrl').value.length == 0 ) 72 { 73 oImageOriginal = null ; 74 return ; 75 } 76 77 oImageOriginal = document.createElement( 'IMG' ) ; // new Image() ; 78 79 if ( resetSize ) 80 { 81 oImageOriginal.onload = function() 82 { 83 this.onload = null ; 84 ResetSizes() ; 85 } 86 } 87 88 oImageOriginal.src = eImgPreview.src ; 89} 90 91var bPreviewInitialized ; 92 93window.onload = function() 94{ 95 // Translate the dialog box texts. 96 oEditor.FCKLanguageManager.TranslatePage(document) ; 97 98 GetE('btnLockSizes').title = FCKLang.DlgImgLockRatio ; 99 GetE('btnResetSize').title = FCKLang.DlgBtnResetSize ; 100 101 // Load the selected element information (if any). 102 LoadSelection() ; 103 104 // Show/Hide the "Browse Server" button. 105 GetE('tdBrowse').style.display = FCKConfig.ImageBrowser ? '' : 'none' ; 106 GetE('divLnkBrowseServer').style.display = FCKConfig.LinkBrowser ? '' : 'none' ; 107 108 UpdateOriginal() ; 109 110 // Set the actual uploader URL. 111 if ( FCKConfig.ImageUpload ) 112 GetE('frmUpload').action = FCKConfig.ImageUploadURL ; 113 114 window.parent.SetAutoSize( true ) ; 115 116 // Activate the "OK" button. 117 window.parent.SetOkButton( true ) ; 118} 119 120function LoadSelection() 121{ 122 if ( ! oImage ) return ; 123 124 var sUrl = oImage.getAttribute( '_fcksavedurl' ) ; 125 if ( sUrl == null ) 126 sUrl = GetAttribute( oImage, 'src', '' ) ; 127 128 GetE('txtUrl').value = sUrl ; 129 GetE('txtAlt').value = GetAttribute( oImage, 'alt', '' ) ; 130 GetE('txtVSpace').value = GetAttribute( oImage, 'vspace', '' ) ; 131 GetE('txtHSpace').value = GetAttribute( oImage, 'hspace', '' ) ; 132 GetE('txtBorder').value = GetAttribute( oImage, 'border', '' ) ; 133 GetE('cmbAlign').value = GetAttribute( oImage, 'align', '' ) ; 134 135 var iWidth, iHeight ; 136 137 var regexSize = /^\s*(\d+)px\s*$/i ; 138 139 if ( oImage.style.width ) 140 { 141 var aMatchW = oImage.style.width.match( regexSize ) ; 142 if ( aMatchW ) 143 { 144 iWidth = aMatchW[1] ; 145 oImage.style.width = '' ; 146 SetAttribute( oImage, 'width' , iWidth ) ; 147 } 148 } 149 150 if ( oImage.style.height ) 151 { 152 var aMatchH = oImage.style.height.match( regexSize ) ; 153 if ( aMatchH ) 154 { 155 iHeight = aMatchH[1] ; 156 oImage.style.height = '' ; 157 SetAttribute( oImage, 'height', iHeight ) ; 158 } 159 } 160 161 GetE('txtWidth').value = iWidth ? iWidth : GetAttribute( oImage, "width", '' ) ; 162 GetE('txtHeight').value = iHeight ? iHeight : GetAttribute( oImage, "height", '' ) ; 163 164 // Get Advances Attributes 165 GetE('txtAttId').value = oImage.id ; 166 GetE('cmbAttLangDir').value = oImage.dir ; 167 GetE('txtAttLangCode').value = oImage.lang ; 168 GetE('txtAttTitle').value = oImage.title ; 169 GetE('txtLongDesc').value = oImage.longDesc ; 170 171 if ( oEditor.FCKBrowserInfo.IsIE ) 172 { 173 GetE('txtAttClasses').value = oImage.className || '' ; 174 GetE('txtAttStyle').value = oImage.style.cssText ; 175 } 176 else 177 { 178 GetE('txtAttClasses').value = oImage.getAttribute('class',2) || '' ; 179 GetE('txtAttStyle').value = oImage.getAttribute('style',2) ; 180 } 181 182 if ( oLink ) 183 { 184 var sLinkUrl = oLink.getAttribute( '_fcksavedurl' ) ; 185 if ( sLinkUrl == null ) 186 sLinkUrl = oLink.getAttribute('href',2) ; 187 188 GetE('txtLnkUrl').value = sLinkUrl ; 189 GetE('cmbLnkTarget').value = oLink.target ; 190 } 191 192 UpdatePreview() ; 193} 194 195//#### The OK button was hit. 196function Ok() 197{ 198 if ( GetE('txtUrl').value.length == 0 ) 199 { 200 window.parent.SetSelectedTab( 'Info' ) ; 201 GetE('txtUrl').focus() ; 202 203 alert( FCKLang.DlgImgAlertUrl ) ; 204 205 return false ; 206 } 207 208 var bHasImage = ( oImage != null ) ; 209 210 if ( bHasImage && bImageButton && oImage.tagName == 'IMG' ) 211 { 212 if ( confirm( 'Do you want to transform the selected image on a image button?' ) ) 213 oImage = null ; 214 } 215 else if ( bHasImage && !bImageButton && oImage.tagName == 'INPUT' ) 216 { 217 if ( confirm( 'Do you want to transform the selected image button on a simple image?' ) ) 218 oImage = null ; 219 } 220 221 oEditor.FCKUndo.SaveUndoStep() ; 222 if ( !bHasImage ) 223 { 224 if ( bImageButton ) 225 { 226 oImage = FCK.EditorDocument.createElement( 'input' ) ; 227 oImage.type = 'image' ; 228 oImage = FCK.InsertElement( oImage ) ; 229 } 230 else 231 oImage = FCK.InsertElement( 'img' ) ; 232 } 233 234 UpdateImage( oImage ) ; 235 236 var sLnkUrl = GetE('txtLnkUrl').value.Trim() ; 237 238 if ( sLnkUrl.length == 0 ) 239 { 240 if ( oLink ) 241 FCK.ExecuteNamedCommand( 'Unlink' ) ; 242 } 243 else 244 { 245 if ( oLink ) // Modifying an existent link. 246 oLink.href = sLnkUrl ; 247 else // Creating a new link. 248 { 249 if ( !bHasImage ) 250 oEditor.FCKSelection.SelectNode( oImage ) ; 251 252 oLink = oEditor.FCK.CreateLink( sLnkUrl )[0] ; 253 254 if ( !bHasImage ) 255 { 256 oEditor.FCKSelection.SelectNode( oLink ) ; 257 oEditor.FCKSelection.Collapse( false ) ; 258 } 259 } 260 261 SetAttribute( oLink, '_fcksavedurl', sLnkUrl ) ; 262 SetAttribute( oLink, 'target', GetE('cmbLnkTarget').value ) ; 263 } 264 265 return true ; 266} 267 268function UpdateImage( e, skipId ) 269{ 270 e.src = GetE('txtUrl').value ; 271 SetAttribute( e, "_fcksavedurl", GetE('txtUrl').value ) ; 272 SetAttribute( e, "alt" , GetE('txtAlt').value ) ; 273 SetAttribute( e, "width" , GetE('txtWidth').value ) ; 274 SetAttribute( e, "height", GetE('txtHeight').value ) ; 275 SetAttribute( e, "vspace", GetE('txtVSpace').value ) ; 276 SetAttribute( e, "hspace", GetE('txtHSpace').value ) ; 277 SetAttribute( e, "border", GetE('txtBorder').value ) ; 278 SetAttribute( e, "align" , GetE('cmbAlign').value ) ; 279 280 // Advances Attributes 281 282 if ( ! skipId ) 283 SetAttribute( e, 'id', GetE('txtAttId').value ) ; 284 285 SetAttribute( e, 'dir' , GetE('cmbAttLangDir').value ) ; 286 SetAttribute( e, 'lang' , GetE('txtAttLangCode').value ) ; 287 SetAttribute( e, 'title' , GetE('txtAttTitle').value ) ; 288 SetAttribute( e, 'longDesc' , GetE('txtLongDesc').value ) ; 289 290 if ( oEditor.FCKBrowserInfo.IsIE ) 291 { 292 e.className = GetE('txtAttClasses').value ; 293 e.style.cssText = GetE('txtAttStyle').value ; 294 } 295 else 296 { 297 SetAttribute( e, 'class' , GetE('txtAttClasses').value ) ; 298 SetAttribute( e, 'style', GetE('txtAttStyle').value ) ; 299 } 300} 301 302var eImgPreview ; 303var eImgPreviewLink ; 304 305function SetPreviewElements( imageElement, linkElement ) 306{ 307 eImgPreview = imageElement ; 308 eImgPreviewLink = linkElement ; 309 310 UpdatePreview() ; 311 UpdateOriginal() ; 312 313 bPreviewInitialized = true ; 314} 315 316function UpdatePreview() 317{ 318 if ( !eImgPreview || !eImgPreviewLink ) 319 return ; 320 321 if ( GetE('txtUrl').value.length == 0 ) 322 eImgPreviewLink.style.display = 'none' ; 323 else 324 { 325 UpdateImage( eImgPreview, true ) ; 326 327 if ( GetE('txtLnkUrl').value.Trim().length > 0 ) 328 eImgPreviewLink.href = 'javascript:void(null);' ; 329 else 330 SetAttribute( eImgPreviewLink, 'href', '' ) ; 331 332 eImgPreviewLink.style.display = '' ; 333 } 334} 335 336var bLockRatio = true ; 337 338function SwitchLock( lockButton ) 339{ 340 bLockRatio = !bLockRatio ; 341 lockButton.className = bLockRatio ? 'BtnLocked' : 'BtnUnlocked' ; 342 lockButton.title = bLockRatio ? 'Lock sizes' : 'Unlock sizes' ; 343 344 if ( bLockRatio ) 345 { 346 if ( GetE('txtWidth').value.length > 0 ) 347 OnSizeChanged( 'Width', GetE('txtWidth').value ) ; 348 else 349 OnSizeChanged( 'Height', GetE('txtHeight').value ) ; 350 } 351} 352 353// Fired when the width or height input texts change 354function OnSizeChanged( dimension, value ) 355{ 356 // Verifies if the aspect ration has to be maintained 357 if ( oImageOriginal && bLockRatio ) 358 { 359 var e = dimension == 'Width' ? GetE('txtHeight') : GetE('txtWidth') ; 360 361 if ( value.length == 0 || isNaN( value ) ) 362 { 363 e.value = '' ; 364 return ; 365 } 366 367 if ( dimension == 'Width' ) 368 value = value == 0 ? 0 : Math.round( oImageOriginal.height * ( value / oImageOriginal.width ) ) ; 369 else 370 value = value == 0 ? 0 : Math.round( oImageOriginal.width * ( value / oImageOriginal.height ) ) ; 371 372 if ( !isNaN( value ) ) 373 e.value = value ; 374 } 375 376 UpdatePreview() ; 377} 378 379// Fired when the Reset Size button is clicked 380function ResetSizes() 381{ 382 if ( ! oImageOriginal ) return ; 383 384 GetE('txtWidth').value = oImageOriginal.width ; 385 GetE('txtHeight').value = oImageOriginal.height ; 386 387 UpdatePreview() ; 388} 389 390function BrowseServer() 391{ 392 OpenServerBrowser( 393 'Image', 394 FCKConfig.ImageBrowserURL, 395 FCKConfig.ImageBrowserWindowWidth, 396 FCKConfig.ImageBrowserWindowHeight ) ; 397} 398 399function LnkBrowseServer() 400{ 401 OpenServerBrowser( 402 'Link', 403 FCKConfig.LinkBrowserURL, 404 FCKConfig.LinkBrowserWindowWidth, 405 FCKConfig.LinkBrowserWindowHeight ) ; 406} 407 408function OpenServerBrowser( type, url, width, height ) 409{ 410 sActualBrowser = type ; 411 OpenFileBrowser( url, width, height ) ; 412} 413 414var sActualBrowser ; 415 416function SetUrl( url, width, height, alt ) 417{ 418 if ( sActualBrowser == 'Link' ) 419 { 420 GetE('txtLnkUrl').value = url ; 421 UpdatePreview() ; 422 } 423 else 424 { 425 GetE('txtUrl').value = url ; 426 GetE('txtWidth').value = width ? width : '' ; 427 GetE('txtHeight').value = height ? height : '' ; 428 429 if ( alt ) 430 GetE('txtAlt').value = alt; 431 432 UpdatePreview() ; 433 UpdateOriginal( true ) ; 434 } 435 436 window.parent.SetSelectedTab( 'Info' ) ; 437} 438 439function OnUploadCompleted( errorNumber, fileUrl, fileName, customMsg ) 440{ 441 switch ( errorNumber ) 442 { 443 case 0 : // No errors 444 alert( 'Your file has been successfully uploaded' ) ; 445 break ; 446 case 1 : // Custom error 447 alert( customMsg ) ; 448 return ; 449 case 101 : // Custom warning 450 alert( customMsg ) ; 451 break ; 452 case 201 : 453 alert( 'A file with the same name is already available. The uploaded file has been renamed to "' + fileName + '"' ) ; 454 break ; 455 case 202 : 456 alert( 'Invalid file type' ) ; 457 return ; 458 case 203 : 459 alert( "Security error. You probably don't have enough permissions to upload. Please check your server." ) ; 460 return ; 461 default : 462 alert( 'Error on file upload. Error number: ' + errorNumber ) ; 463 return ; 464 } 465 466 sActualBrowser = '' ; 467 SetUrl( fileUrl ) ; 468 GetE('frmUpload').reset() ; 469} 470 471var oUploadAllowedExtRegex = new RegExp( FCKConfig.ImageUploadAllowedExtensions, 'i' ) ; 472var oUploadDeniedExtRegex = new RegExp( FCKConfig.ImageUploadDeniedExtensions, 'i' ) ; 473 474function CheckUpload() 475{ 476 var sFile = GetE('txtUploadFile').value ; 477 478 if ( sFile.length == 0 ) 479 { 480 alert( 'Please select a file to upload' ) ; 481 return false ; 482 } 483 484 if ( ( FCKConfig.ImageUploadAllowedExtensions.length > 0 && !oUploadAllowedExtRegex.test( sFile ) ) || 485 ( FCKConfig.ImageUploadDeniedExtensions.length > 0 && oUploadDeniedExtRegex.test( sFile ) ) ) 486 { 487 OnUploadCompleted( 202 ) ; 488 return false ; 489 } 490 491 return true ; 492} 493