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