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