2 * FCKeditor - The text editor for Internet - http://www.fckeditor.net
\r
3 * Copyright (C) 2003-2010 Frederico Caldeira Knabben
\r
5 * == BEGIN LICENSE ==
\r
7 * Licensed under the terms of any of the following licenses at your
\r
10 * - GNU General Public License Version 2 or later (the "GPL")
\r
11 * http://www.gnu.org/licenses/gpl.html
\r
13 * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
\r
14 * http://www.gnu.org/licenses/lgpl.html
\r
16 * - Mozilla Public License Version 1.1 or later (the "MPL")
\r
17 * http://www.mozilla.org/MPL/MPL-1.1.html
\r
21 * Scripts related to the Image dialog window (see fck_image.html).
\r
24 var dialog = window.parent ;
\r
25 var oEditor = dialog.InnerDialogLoaded() ;
\r
26 var FCK = oEditor.FCK ;
\r
27 var FCKLang = oEditor.FCKLang ;
\r
28 var FCKConfig = oEditor.FCKConfig ;
\r
29 var FCKDebug = oEditor.FCKDebug ;
\r
30 var FCKTools = oEditor.FCKTools ;
\r
32 var bImageButton = ( document.location.search.length > 0 && document.location.search.substr(1) == 'ImageButton' ) ;
\r
36 // Set the dialog tabs.
\r
37 dialog.AddTab( 'Info', FCKLang.DlgImgInfoTab ) ;
\r
39 if ( !bImageButton && !FCKConfig.ImageDlgHideLink )
\r
40 dialog.AddTab( 'Link', FCKLang.DlgImgLinkTab ) ;
\r
42 if ( FCKConfig.ImageUpload )
\r
43 dialog.AddTab( 'Upload', FCKLang.DlgLnkUpload ) ;
\r
45 if ( !FCKConfig.ImageDlgHideAdvanced )
\r
46 dialog.AddTab( 'Advanced', FCKLang.DlgAdvancedTag ) ;
\r
48 // Function called when a dialog tag is selected.
\r
49 function OnDialogTabChange( tabCode )
\r
51 ShowE('divInfo' , ( tabCode == 'Info' ) ) ;
\r
52 ShowE('divLink' , ( tabCode == 'Link' ) ) ;
\r
53 ShowE('divUpload' , ( tabCode == 'Upload' ) ) ;
\r
54 ShowE('divAdvanced' , ( tabCode == 'Advanced' ) ) ;
\r
57 // Get the selected image (if available).
\r
58 var oImage = dialog.Selection.GetSelectedElement() ;
\r
60 if ( oImage && oImage.tagName != 'IMG' && !( oImage.tagName == 'INPUT' && oImage.type == 'image' ) )
\r
63 // Get the active link.
\r
64 var oLink = dialog.Selection.GetSelection().MoveToAncestorNode( 'A' ) ;
\r
66 var oImageOriginal ;
\r
68 function UpdateOriginal( resetSize )
\r
73 if ( GetE('txtUrl').value.length == 0 )
\r
75 oImageOriginal = null ;
\r
79 oImageOriginal = document.createElement( 'IMG' ) ; // new Image() ;
\r
83 oImageOriginal.onload = function()
\r
85 this.onload = null ;
\r
90 oImageOriginal.src = eImgPreview.src ;
\r
93 var bPreviewInitialized ;
\r
95 window.onload = function()
\r
97 // Translate the dialog box texts.
\r
98 oEditor.FCKLanguageManager.TranslatePage(document) ;
\r
100 GetE('btnLockSizes').title = FCKLang.DlgImgLockRatio ;
\r
101 GetE('btnResetSize').title = FCKLang.DlgBtnResetSize ;
\r
103 // Load the selected element information (if any).
\r
106 // Show/Hide the "Browse Server" button.
\r
107 GetE('tdBrowse').style.display = FCKConfig.ImageBrowser ? '' : 'none' ;
\r
108 GetE('divLnkBrowseServer').style.display = FCKConfig.LinkBrowser ? '' : 'none' ;
\r
112 // Set the actual uploader URL.
\r
113 if ( FCKConfig.ImageUpload )
\r
114 GetE('frmUpload').action = FCKConfig.ImageUploadURL ;
\r
116 dialog.SetAutoSize( true ) ;
\r
118 // Activate the "OK" button.
\r
119 dialog.SetOkButton( true ) ;
\r
121 SelectField( 'txtUrl' ) ;
\r
124 function LoadSelection()
\r
126 if ( ! oImage ) return ;
\r
128 var sUrl = oImage.getAttribute( '_fcksavedurl' ) ;
\r
129 if ( sUrl == null )
\r
130 sUrl = GetAttribute( oImage, 'src', '' ) ;
\r
132 GetE('txtUrl').value = sUrl ;
\r
133 GetE('txtAlt').value = GetAttribute( oImage, 'alt', '' ) ;
\r
134 GetE('txtVSpace').value = GetAttribute( oImage, 'vspace', '' ) ;
\r
135 GetE('txtHSpace').value = GetAttribute( oImage, 'hspace', '' ) ;
\r
136 GetE('txtBorder').value = GetAttribute( oImage, 'border', '' ) ;
\r
137 GetE('cmbAlign').value = GetAttribute( oImage, 'align', '' ) ;
\r
139 var iWidth, iHeight ;
\r
141 var regexSize = /^\s*(\d+)px\s*$/i ;
\r
143 if ( oImage.style.width )
\r
145 var aMatchW = oImage.style.width.match( regexSize ) ;
\r
148 iWidth = aMatchW[1] ;
\r
149 oImage.style.width = '' ;
\r
150 SetAttribute( oImage, 'width' , iWidth ) ;
\r
154 if ( oImage.style.height )
\r
156 var aMatchH = oImage.style.height.match( regexSize ) ;
\r
159 iHeight = aMatchH[1] ;
\r
160 oImage.style.height = '' ;
\r
161 SetAttribute( oImage, 'height', iHeight ) ;
\r
165 GetE('txtWidth').value = iWidth ? iWidth : GetAttribute( oImage, "width", '' ) ;
\r
166 GetE('txtHeight').value = iHeight ? iHeight : GetAttribute( oImage, "height", '' ) ;
\r
168 // Get Advances Attributes
\r
169 GetE('txtAttId').value = oImage.id ;
\r
170 GetE('cmbAttLangDir').value = oImage.dir ;
\r
171 GetE('txtAttLangCode').value = oImage.lang ;
\r
172 GetE('txtAttTitle').value = oImage.title ;
\r
173 GetE('txtLongDesc').value = oImage.longDesc ;
\r
175 if ( oEditor.FCKBrowserInfo.IsIE )
\r
177 GetE('txtAttClasses').value = oImage.className || '' ;
\r
178 GetE('txtAttStyle').value = oImage.style.cssText ;
\r
182 GetE('txtAttClasses').value = oImage.getAttribute('class',2) || '' ;
\r
183 GetE('txtAttStyle').value = oImage.getAttribute('style',2) ;
\r
188 var sLinkUrl = oLink.getAttribute( '_fcksavedurl' ) ;
\r
189 if ( sLinkUrl == null )
\r
190 sLinkUrl = oLink.getAttribute('href',2) ;
\r
192 GetE('txtLnkUrl').value = sLinkUrl ;
\r
193 GetE('cmbLnkTarget').value = oLink.target ;
\r
199 //#### The OK button was hit.
\r
202 if ( GetE('txtUrl').value.length == 0 )
\r
204 dialog.SetSelectedTab( 'Info' ) ;
\r
205 GetE('txtUrl').focus() ;
\r
207 alert( FCKLang.DlgImgAlertUrl ) ;
\r
212 var bHasImage = ( oImage != null ) ;
\r
214 if ( bHasImage && bImageButton && oImage.tagName == 'IMG' )
\r
216 if ( confirm( 'Do you want to transform the selected image on a image button?' ) )
\r
219 else if ( bHasImage && !bImageButton && oImage.tagName == 'INPUT' )
\r
221 if ( confirm( 'Do you want to transform the selected image button on a simple image?' ) )
\r
225 oEditor.FCKUndo.SaveUndoStep() ;
\r
228 if ( bImageButton )
\r
230 oImage = FCK.EditorDocument.createElement( 'input' ) ;
\r
231 oImage.type = 'image' ;
\r
232 oImage = FCK.InsertElement( oImage ) ;
\r
235 oImage = FCK.InsertElement( 'img' ) ;
\r
238 UpdateImage( oImage ) ;
\r
240 var sLnkUrl = GetE('txtLnkUrl').value.Trim() ;
\r
242 if ( sLnkUrl.length == 0 )
\r
245 FCK.ExecuteNamedCommand( 'Unlink' ) ;
\r
249 if ( oLink ) // Modifying an existent link.
\r
250 oLink.href = sLnkUrl ;
\r
251 else // Creating a new link.
\r
254 oEditor.FCKSelection.SelectNode( oImage ) ;
\r
256 oLink = oEditor.FCK.CreateLink( sLnkUrl )[0] ;
\r
260 oEditor.FCKSelection.SelectNode( oLink ) ;
\r
261 oEditor.FCKSelection.Collapse( false ) ;
\r
265 SetAttribute( oLink, '_fcksavedurl', sLnkUrl ) ;
\r
266 SetAttribute( oLink, 'target', GetE('cmbLnkTarget').value ) ;
\r
272 function UpdateImage( e, skipId )
\r
274 e.src = GetE('txtUrl').value ;
\r
275 SetAttribute( e, "_fcksavedurl", GetE('txtUrl').value ) ;
\r
276 SetAttribute( e, "alt" , GetE('txtAlt').value ) ;
\r
277 SetAttribute( e, "width" , GetE('txtWidth').value ) ;
\r
278 SetAttribute( e, "height", GetE('txtHeight').value ) ;
\r
279 SetAttribute( e, "vspace", GetE('txtVSpace').value ) ;
\r
280 SetAttribute( e, "hspace", GetE('txtHSpace').value ) ;
\r
281 SetAttribute( e, "border", GetE('txtBorder').value ) ;
\r
282 SetAttribute( e, "align" , GetE('cmbAlign').value ) ;
\r
284 // Advances Attributes
\r
287 SetAttribute( e, 'id', GetE('txtAttId').value ) ;
\r
289 SetAttribute( e, 'dir' , GetE('cmbAttLangDir').value ) ;
\r
290 SetAttribute( e, 'lang' , GetE('txtAttLangCode').value ) ;
\r
291 SetAttribute( e, 'title' , GetE('txtAttTitle').value ) ;
\r
292 SetAttribute( e, 'longDesc' , GetE('txtLongDesc').value ) ;
\r
294 if ( oEditor.FCKBrowserInfo.IsIE )
\r
296 e.className = GetE('txtAttClasses').value ;
\r
297 e.style.cssText = GetE('txtAttStyle').value ;
\r
301 SetAttribute( e, 'class' , GetE('txtAttClasses').value ) ;
\r
302 SetAttribute( e, 'style', GetE('txtAttStyle').value ) ;
\r
307 var eImgPreviewLink ;
\r
309 function SetPreviewElements( imageElement, linkElement )
\r
311 eImgPreview = imageElement ;
\r
312 eImgPreviewLink = linkElement ;
\r
317 bPreviewInitialized = true ;
\r
320 function UpdatePreview()
\r
322 if ( !eImgPreview || !eImgPreviewLink )
\r
325 if ( GetE('txtUrl').value.length == 0 )
\r
326 eImgPreviewLink.style.display = 'none' ;
\r
329 UpdateImage( eImgPreview, true ) ;
\r
331 if ( GetE('txtLnkUrl').value.Trim().length > 0 )
\r
332 eImgPreviewLink.href = 'javascript:void(null);' ;
\r
334 SetAttribute( eImgPreviewLink, 'href', '' ) ;
\r
336 eImgPreviewLink.style.display = '' ;
\r
340 var bLockRatio = true ;
\r
342 function SwitchLock( lockButton )
\r
344 bLockRatio = !bLockRatio ;
\r
345 lockButton.className = bLockRatio ? 'BtnLocked' : 'BtnUnlocked' ;
\r
346 lockButton.title = bLockRatio ? 'Lock sizes' : 'Unlock sizes' ;
\r
350 if ( GetE('txtWidth').value.length > 0 )
\r
351 OnSizeChanged( 'Width', GetE('txtWidth').value ) ;
\r
353 OnSizeChanged( 'Height', GetE('txtHeight').value ) ;
\r
357 // Fired when the width or height input texts change
\r
358 function OnSizeChanged( dimension, value )
\r
360 // Verifies if the aspect ration has to be maintained
\r
361 if ( oImageOriginal && bLockRatio )
\r
363 var e = dimension == 'Width' ? GetE('txtHeight') : GetE('txtWidth') ;
\r
365 if ( value.length == 0 || isNaN( value ) )
\r
371 if ( dimension == 'Width' )
\r
372 value = value == 0 ? 0 : Math.round( oImageOriginal.height * ( value / oImageOriginal.width ) ) ;
\r
374 value = value == 0 ? 0 : Math.round( oImageOriginal.width * ( value / oImageOriginal.height ) ) ;
\r
376 if ( !isNaN( value ) )
\r
383 // Fired when the Reset Size button is clicked
\r
384 function ResetSizes()
\r
386 if ( ! oImageOriginal ) return ;
\r
387 if ( oEditor.FCKBrowserInfo.IsGecko && !oImageOriginal.complete )
\r
389 setTimeout( ResetSizes, 50 ) ;
\r
393 GetE('txtWidth').value = oImageOriginal.width ;
\r
394 GetE('txtHeight').value = oImageOriginal.height ;
\r
399 function BrowseServer()
\r
403 FCKConfig.ImageBrowserURL,
\r
404 FCKConfig.ImageBrowserWindowWidth,
\r
405 FCKConfig.ImageBrowserWindowHeight ) ;
\r
408 function LnkBrowseServer()
\r
412 FCKConfig.LinkBrowserURL,
\r
413 FCKConfig.LinkBrowserWindowWidth,
\r
414 FCKConfig.LinkBrowserWindowHeight ) ;
\r
417 function OpenServerBrowser( type, url, width, height )
\r
419 sActualBrowser = type ;
\r
420 OpenFileBrowser( url, width, height ) ;
\r
423 var sActualBrowser ;
\r
425 function SetUrl( url, width, height, alt )
\r
427 if ( sActualBrowser == 'Link' )
\r
429 GetE('txtLnkUrl').value = url ;
\r
434 GetE('txtUrl').value = url ;
\r
435 GetE('txtWidth').value = width ? width : '' ;
\r
436 GetE('txtHeight').value = height ? height : '' ;
\r
439 GetE('txtAlt').value = alt;
\r
442 UpdateOriginal( true ) ;
\r
445 dialog.SetSelectedTab( 'Info' ) ;
\r
448 function OnUploadCompleted( errorNumber, fileUrl, fileName, customMsg )
\r
450 // Remove animation
\r
451 window.parent.Throbber.Hide() ;
\r
452 GetE( 'divUpload' ).style.display = '' ;
\r
454 switch ( errorNumber )
\r
456 case 0 : // No errors
\r
457 alert( 'Your file has been successfully uploaded' ) ;
\r
459 case 1 : // Custom error
\r
460 alert( customMsg ) ;
\r
462 case 101 : // Custom warning
\r
463 alert( customMsg ) ;
\r
466 alert( 'A file with the same name is already available. The uploaded file has been renamed to "' + fileName + '"' ) ;
\r
469 alert( 'Invalid file type' ) ;
\r
472 alert( "Security error. You probably don't have enough permissions to upload. Please check your server." ) ;
\r
475 alert( 'The connector is disabled' ) ;
\r
478 alert( 'Error on file upload. Error number: ' + errorNumber ) ;
\r
482 sActualBrowser = '' ;
\r
483 SetUrl( fileUrl ) ;
\r
484 GetE('frmUpload').reset() ;
\r
487 var oUploadAllowedExtRegex = new RegExp( FCKConfig.ImageUploadAllowedExtensions, 'i' ) ;
\r
488 var oUploadDeniedExtRegex = new RegExp( FCKConfig.ImageUploadDeniedExtensions, 'i' ) ;
\r
490 function CheckUpload()
\r
492 var sFile = GetE('txtUploadFile').value ;
\r
494 if ( sFile.length == 0 )
\r
496 alert( 'Please select a file to upload' ) ;
\r
500 if ( ( FCKConfig.ImageUploadAllowedExtensions.length > 0 && !oUploadAllowedExtRegex.test( sFile ) ) ||
\r
501 ( FCKConfig.ImageUploadDeniedExtensions.length > 0 && oUploadDeniedExtRegex.test( sFile ) ) )
\r
503 OnUploadCompleted( 202 ) ;
\r
508 window.parent.Throbber.Show( 100 ) ;
\r
509 GetE( 'divUpload' ).style.display = 'none' ;
\r