event refactor, landing on HEAD!
[freeside.git] / httemplate / elements / fckeditor / editor / dialog / fck_link / fck_link.js
1 /*\r
2  * FCKeditor - The text editor for Internet - http://www.fckeditor.net\r
3  * Copyright (C) 2003-2007 Frederico Caldeira Knabben\r
4  *\r
5  * == BEGIN LICENSE ==\r
6  *\r
7  * Licensed under the terms of any of the following licenses at your\r
8  * choice:\r
9  *\r
10  *  - GNU General Public License Version 2 or later (the "GPL")\r
11  *    http://www.gnu.org/licenses/gpl.html\r
12  *\r
13  *  - GNU Lesser General Public License Version 2.1 or later (the "LGPL")\r
14  *    http://www.gnu.org/licenses/lgpl.html\r
15  *\r
16  *  - Mozilla Public License Version 1.1 or later (the "MPL")\r
17  *    http://www.mozilla.org/MPL/MPL-1.1.html\r
18  *\r
19  * == END LICENSE ==\r
20  *\r
21  * Scripts related to the Link dialog window (see fck_link.html).\r
22  */\r
23 \r
24 var oEditor             = window.parent.InnerDialogLoaded() ;\r
25 var FCK                 = oEditor.FCK ;\r
26 var FCKLang             = oEditor.FCKLang ;\r
27 var FCKConfig   = oEditor.FCKConfig ;\r
28 var FCKRegexLib = oEditor.FCKRegexLib ;\r
29 \r
30 //#### Dialog Tabs\r
31 \r
32 // Set the dialog tabs.\r
33 window.parent.AddTab( 'Info', FCKLang.DlgLnkInfoTab ) ;\r
34 \r
35 if ( !FCKConfig.LinkDlgHideTarget )\r
36         window.parent.AddTab( 'Target', FCKLang.DlgLnkTargetTab, true ) ;\r
37 \r
38 if ( FCKConfig.LinkUpload )\r
39         window.parent.AddTab( 'Upload', FCKLang.DlgLnkUpload, true ) ;\r
40 \r
41 if ( !FCKConfig.LinkDlgHideAdvanced )\r
42         window.parent.AddTab( 'Advanced', FCKLang.DlgAdvancedTag ) ;\r
43 \r
44 // Function called when a dialog tag is selected.\r
45 function OnDialogTabChange( tabCode )\r
46 {\r
47         ShowE('divInfo'         , ( tabCode == 'Info' ) ) ;\r
48         ShowE('divTarget'       , ( tabCode == 'Target' ) ) ;\r
49         ShowE('divUpload'       , ( tabCode == 'Upload' ) ) ;\r
50         ShowE('divAttribs'      , ( tabCode == 'Advanced' ) ) ;\r
51 \r
52         window.parent.SetAutoSize( true ) ;\r
53 }\r
54 \r
55 //#### Regular Expressions library.\r
56 var oRegex = new Object() ;\r
57 \r
58 oRegex.UriProtocol = /^(((http|https|ftp|news):\/\/)|mailto:)/gi ;\r
59 \r
60 oRegex.UrlOnChangeProtocol = /^(http|https|ftp|news):\/\/(?=.)/gi ;\r
61 \r
62 oRegex.UrlOnChangeTestOther = /^((javascript:)|[#\/\.])/gi ;\r
63 \r
64 oRegex.ReserveTarget = /^_(blank|self|top|parent)$/i ;\r
65 \r
66 oRegex.PopupUri = /^javascript:void\(\s*window.open\(\s*'([^']+)'\s*,\s*(?:'([^']*)'|null)\s*,\s*'([^']*)'\s*\)\s*\)\s*$/ ;\r
67 \r
68 // Accessible popups\r
69 oRegex.OnClickPopup = /^\s*on[cC]lick="\s*window.open\(\s*this\.href\s*,\s*(?:'([^']*)'|null)\s*,\s*'([^']*)'\s*\)\s*;\s*return\s*false;*\s*"$/ ;\r
70 \r
71 oRegex.PopupFeatures = /(?:^|,)([^=]+)=(\d+|yes|no)/gi ;\r
72 \r
73 //#### Parser Functions\r
74 \r
75 var oParser = new Object() ;\r
76 \r
77 oParser.ParseEMailUrl = function( emailUrl )\r
78 {\r
79         // Initializes the EMailInfo object.\r
80         var oEMailInfo = new Object() ;\r
81         oEMailInfo.Address      = '' ;\r
82         oEMailInfo.Subject      = '' ;\r
83         oEMailInfo.Body         = '' ;\r
84 \r
85         var oParts = emailUrl.match( /^([^\?]+)\??(.+)?/ ) ;\r
86         if ( oParts )\r
87         {\r
88                 // Set the e-mail address.\r
89                 oEMailInfo.Address = oParts[1] ;\r
90 \r
91                 // Look for the optional e-mail parameters.\r
92                 if ( oParts[2] )\r
93                 {\r
94                         var oMatch = oParts[2].match( /(^|&)subject=([^&]+)/i ) ;\r
95                         if ( oMatch ) oEMailInfo.Subject = decodeURIComponent( oMatch[2] ) ;\r
96 \r
97                         oMatch = oParts[2].match( /(^|&)body=([^&]+)/i ) ;\r
98                         if ( oMatch ) oEMailInfo.Body = decodeURIComponent( oMatch[2] ) ;\r
99                 }\r
100         }\r
101 \r
102         return oEMailInfo ;\r
103 }\r
104 \r
105 oParser.CreateEMailUri = function( address, subject, body )\r
106 {\r
107         var sBaseUri = 'mailto:' + address ;\r
108 \r
109         var sParams = '' ;\r
110 \r
111         if ( subject.length > 0 )\r
112                 sParams = '?subject=' + encodeURIComponent( subject ) ;\r
113 \r
114         if ( body.length > 0 )\r
115         {\r
116                 sParams += ( sParams.length == 0 ? '?' : '&' ) ;\r
117                 sParams += 'body=' + encodeURIComponent( body ) ;\r
118         }\r
119 \r
120         return sBaseUri + sParams ;\r
121 }\r
122 \r
123 //#### Initialization Code\r
124 \r
125 // oLink: The actual selected link in the editor.\r
126 var oLink = FCK.Selection.MoveToAncestorNode( 'A' ) ;\r
127 if ( oLink )\r
128         FCK.Selection.SelectNode( oLink ) ;\r
129 \r
130 window.onload = function()\r
131 {\r
132         // Translate the dialog box texts.\r
133         oEditor.FCKLanguageManager.TranslatePage(document) ;\r
134 \r
135         // Fill the Anchor Names and Ids combos.\r
136         LoadAnchorNamesAndIds() ;\r
137 \r
138         // Load the selected link information (if any).\r
139         LoadSelection() ;\r
140 \r
141         // Update the dialog box.\r
142         SetLinkType( GetE('cmbLinkType').value ) ;\r
143 \r
144         // Show/Hide the "Browse Server" button.\r
145         GetE('divBrowseServer').style.display = FCKConfig.LinkBrowser ? '' : 'none' ;\r
146 \r
147         // Show the initial dialog content.\r
148         GetE('divInfo').style.display = '' ;\r
149 \r
150         // Set the actual uploader URL.\r
151         if ( FCKConfig.LinkUpload )\r
152                 GetE('frmUpload').action = FCKConfig.LinkUploadURL ;\r
153 \r
154         // Set the default target (from configuration).\r
155         SetDefaultTarget() ;\r
156 \r
157         // Activate the "OK" button.\r
158         window.parent.SetOkButton( true ) ;\r
159 }\r
160 \r
161 var bHasAnchors ;\r
162 \r
163 function LoadAnchorNamesAndIds()\r
164 {\r
165         // Since version 2.0, the anchors are replaced in the DOM by IMGs so the user see the icon\r
166         // to edit them. So, we must look for that images now.\r
167         var aAnchors = new Array() ;\r
168         var i ;\r
169         var oImages = oEditor.FCK.EditorDocument.getElementsByTagName( 'IMG' ) ;\r
170         for( i = 0 ; i < oImages.length ; i++ )\r
171         {\r
172                 if ( oImages[i].getAttribute('_fckanchor') )\r
173                         aAnchors[ aAnchors.length ] = oEditor.FCK.GetRealElement( oImages[i] ) ;\r
174         }\r
175 \r
176         // Add also real anchors\r
177         var oLinks = oEditor.FCK.EditorDocument.getElementsByTagName( 'A' ) ;\r
178         for( i = 0 ; i < oLinks.length ; i++ )\r
179         {\r
180                 if ( oLinks[i].name && ( oLinks[i].name.length > 0 ) )\r
181                         aAnchors[ aAnchors.length ] = oLinks[i] ;\r
182         }\r
183 \r
184         var aIds = oEditor.FCKTools.GetAllChildrenIds( oEditor.FCK.EditorDocument.body ) ;\r
185 \r
186         bHasAnchors = ( aAnchors.length > 0 || aIds.length > 0 ) ;\r
187 \r
188         for ( i = 0 ; i < aAnchors.length ; i++ )\r
189         {\r
190                 var sName = aAnchors[i].name ;\r
191                 if ( sName && sName.length > 0 )\r
192                         oEditor.FCKTools.AddSelectOption( GetE('cmbAnchorName'), sName, sName ) ;\r
193         }\r
194 \r
195         for ( i = 0 ; i < aIds.length ; i++ )\r
196         {\r
197                 oEditor.FCKTools.AddSelectOption( GetE('cmbAnchorId'), aIds[i], aIds[i] ) ;\r
198         }\r
199 \r
200         ShowE( 'divSelAnchor'   , bHasAnchors ) ;\r
201         ShowE( 'divNoAnchor'    , !bHasAnchors ) ;\r
202 }\r
203 \r
204 function LoadSelection()\r
205 {\r
206         if ( !oLink ) return ;\r
207 \r
208         var sType = 'url' ;\r
209 \r
210         // Get the actual Link href.\r
211         var sHRef = oLink.getAttribute( '_fcksavedurl' ) ;\r
212         if ( sHRef == null )\r
213                 sHRef = oLink.getAttribute( 'href' , 2 ) || '' ;\r
214 \r
215         // Look for a popup javascript link.\r
216         var oPopupMatch = oRegex.PopupUri.exec( sHRef ) ;\r
217         if( oPopupMatch )\r
218         {\r
219                 GetE('cmbTarget').value = 'popup' ;\r
220                 sHRef = oPopupMatch[1] ;\r
221                 FillPopupFields( oPopupMatch[2], oPopupMatch[3] ) ;\r
222                 SetTarget( 'popup' ) ;\r
223         }\r
224 \r
225         // Accesible popups, the popup data is in the onclick attribute\r
226         if ( !oPopupMatch ) {\r
227                 var onclick = oLink.getAttribute( 'onclick_fckprotectedatt' ) ;\r
228                 oPopupMatch = oRegex.OnClickPopup.exec( onclick ) ;\r
229                 if( oPopupMatch )\r
230                 {\r
231                         GetE( 'cmbTarget' ).value = 'popup' ;\r
232                         FillPopupFields( oPopupMatch[1], oPopupMatch[2] ) ;\r
233                         SetTarget( 'popup' ) ;\r
234                 }\r
235         }\r
236 \r
237         // Search for the protocol.\r
238         var sProtocol = oRegex.UriProtocol.exec( sHRef ) ;\r
239 \r
240         if ( sProtocol )\r
241         {\r
242                 sProtocol = sProtocol[0].toLowerCase() ;\r
243                 GetE('cmbLinkProtocol').value = sProtocol ;\r
244 \r
245                 // Remove the protocol and get the remainig URL.\r
246                 var sUrl = sHRef.replace( oRegex.UriProtocol, '' ) ;\r
247 \r
248                 if ( sProtocol == 'mailto:' )   // It is an e-mail link.\r
249                 {\r
250                         sType = 'email' ;\r
251 \r
252                         var oEMailInfo = oParser.ParseEMailUrl( sUrl ) ;\r
253                         GetE('txtEMailAddress').value   = oEMailInfo.Address ;\r
254                         GetE('txtEMailSubject').value   = oEMailInfo.Subject ;\r
255                         GetE('txtEMailBody').value              = oEMailInfo.Body ;\r
256                 }\r
257                 else                            // It is a normal link.\r
258                 {\r
259                         sType = 'url' ;\r
260                         GetE('txtUrl').value = sUrl ;\r
261                 }\r
262         }\r
263         else if ( sHRef.substr(0,1) == '#' && sHRef.length > 1 )        // It is an anchor link.\r
264         {\r
265                 sType = 'anchor' ;\r
266                 GetE('cmbAnchorName').value = GetE('cmbAnchorId').value = sHRef.substr(1) ;\r
267         }\r
268         else                                    // It is another type of link.\r
269         {\r
270                 sType = 'url' ;\r
271 \r
272                 GetE('cmbLinkProtocol').value = '' ;\r
273                 GetE('txtUrl').value = sHRef ;\r
274         }\r
275 \r
276         if ( !oPopupMatch )\r
277         {\r
278                 // Get the target.\r
279                 var sTarget = oLink.target ;\r
280 \r
281                 if ( sTarget && sTarget.length > 0 )\r
282                 {\r
283                         if ( oRegex.ReserveTarget.test( sTarget ) )\r
284                         {\r
285                                 sTarget = sTarget.toLowerCase() ;\r
286                                 GetE('cmbTarget').value = sTarget ;\r
287                         }\r
288                         else\r
289                                 GetE('cmbTarget').value = 'frame' ;\r
290                         GetE('txtTargetFrame').value = sTarget ;\r
291                 }\r
292         }\r
293 \r
294         // Get Advances Attributes\r
295         GetE('txtAttId').value                  = oLink.id ;\r
296         GetE('txtAttName').value                = oLink.name ;\r
297         GetE('cmbAttLangDir').value             = oLink.dir ;\r
298         GetE('txtAttLangCode').value    = oLink.lang ;\r
299         GetE('txtAttAccessKey').value   = oLink.accessKey ;\r
300         GetE('txtAttTabIndex').value    = oLink.tabIndex <= 0 ? '' : oLink.tabIndex ;\r
301         GetE('txtAttTitle').value               = oLink.title ;\r
302         GetE('txtAttContentType').value = oLink.type ;\r
303         GetE('txtAttCharSet').value             = oLink.charset ;\r
304 \r
305         var sClass ;\r
306         if ( oEditor.FCKBrowserInfo.IsIE )\r
307         {\r
308                 sClass  = oLink.getAttribute('className',2) || '' ;\r
309                 // Clean up temporary classes for internal use:\r
310                 sClass = sClass.replace( FCKRegexLib.FCK_Class, '' ) ;\r
311 \r
312                 GetE('txtAttStyle').value       = oLink.style.cssText ;\r
313         }\r
314         else\r
315         {\r
316                 sClass  = oLink.getAttribute('class',2) || '' ;\r
317                 GetE('txtAttStyle').value       = oLink.getAttribute('style',2) || '' ;\r
318         }\r
319         GetE('txtAttClasses').value     = sClass ;\r
320 \r
321         // Update the Link type combo.\r
322         GetE('cmbLinkType').value = sType ;\r
323 }\r
324 \r
325 //#### Link type selection.\r
326 function SetLinkType( linkType )\r
327 {\r
328         ShowE('divLinkTypeUrl'          , (linkType == 'url') ) ;\r
329         ShowE('divLinkTypeAnchor'       , (linkType == 'anchor') ) ;\r
330         ShowE('divLinkTypeEMail'        , (linkType == 'email') ) ;\r
331 \r
332         if ( !FCKConfig.LinkDlgHideTarget )\r
333                 window.parent.SetTabVisibility( 'Target'        , (linkType == 'url') ) ;\r
334 \r
335         if ( FCKConfig.LinkUpload )\r
336                 window.parent.SetTabVisibility( 'Upload'        , (linkType == 'url') ) ;\r
337 \r
338         if ( !FCKConfig.LinkDlgHideAdvanced )\r
339                 window.parent.SetTabVisibility( 'Advanced'      , (linkType != 'anchor' || bHasAnchors) ) ;\r
340 \r
341         if ( linkType == 'email' )\r
342                 window.parent.SetAutoSize( true ) ;\r
343 }\r
344 \r
345 //#### Target type selection.\r
346 function SetTarget( targetType )\r
347 {\r
348         GetE('tdTargetFrame').style.display     = ( targetType == 'popup' ? 'none' : '' ) ;\r
349         GetE('tdPopupName').style.display       =\r
350                 GetE('tablePopupFeatures').style.display = ( targetType == 'popup' ? '' : 'none' ) ;\r
351 \r
352         switch ( targetType )\r
353         {\r
354                 case "_blank" :\r
355                 case "_self" :\r
356                 case "_parent" :\r
357                 case "_top" :\r
358                         GetE('txtTargetFrame').value = targetType ;\r
359                         break ;\r
360                 case "" :\r
361                         GetE('txtTargetFrame').value = '' ;\r
362                         break ;\r
363         }\r
364 \r
365         if ( targetType == 'popup' )\r
366                 window.parent.SetAutoSize( true ) ;\r
367 }\r
368 \r
369 //#### Called while the user types the URL.\r
370 function OnUrlChange()\r
371 {\r
372         var sUrl = GetE('txtUrl').value ;\r
373         var sProtocol = oRegex.UrlOnChangeProtocol.exec( sUrl ) ;\r
374 \r
375         if ( sProtocol )\r
376         {\r
377                 sUrl = sUrl.substr( sProtocol[0].length ) ;\r
378                 GetE('txtUrl').value = sUrl ;\r
379                 GetE('cmbLinkProtocol').value = sProtocol[0].toLowerCase() ;\r
380         }\r
381         else if ( oRegex.UrlOnChangeTestOther.test( sUrl ) )\r
382         {\r
383                 GetE('cmbLinkProtocol').value = '' ;\r
384         }\r
385 }\r
386 \r
387 //#### Called while the user types the target name.\r
388 function OnTargetNameChange()\r
389 {\r
390         var sFrame = GetE('txtTargetFrame').value ;\r
391 \r
392         if ( sFrame.length == 0 )\r
393                 GetE('cmbTarget').value = '' ;\r
394         else if ( oRegex.ReserveTarget.test( sFrame ) )\r
395                 GetE('cmbTarget').value = sFrame.toLowerCase() ;\r
396         else\r
397                 GetE('cmbTarget').value = 'frame' ;\r
398 }\r
399 \r
400 // Accesible popups\r
401 function BuildOnClickPopup()\r
402 {\r
403         var sWindowName = "'" + GetE('txtPopupName').value.replace(/\W/gi, "") + "'" ;\r
404 \r
405         var sFeatures = '' ;\r
406         var aChkFeatures = document.getElementsByName( 'chkFeature' ) ;\r
407         for ( var i = 0 ; i < aChkFeatures.length ; i++ )\r
408         {\r
409                 if ( i > 0 ) sFeatures += ',' ;\r
410                 sFeatures += aChkFeatures[i].value + '=' + ( aChkFeatures[i].checked ? 'yes' : 'no' ) ;\r
411         }\r
412 \r
413         if ( GetE('txtPopupWidth').value.length > 0 )   sFeatures += ',width=' + GetE('txtPopupWidth').value ;\r
414         if ( GetE('txtPopupHeight').value.length > 0 )  sFeatures += ',height=' + GetE('txtPopupHeight').value ;\r
415         if ( GetE('txtPopupLeft').value.length > 0 )    sFeatures += ',left=' + GetE('txtPopupLeft').value ;\r
416         if ( GetE('txtPopupTop').value.length > 0 )             sFeatures += ',top=' + GetE('txtPopupTop').value ;\r
417 \r
418         if ( sFeatures != '' )\r
419                 sFeatures = sFeatures + ",status" ;\r
420 \r
421         return ( "window.open(this.href," + sWindowName + ",'" + sFeatures + "'); return false" ) ;\r
422 }\r
423 \r
424 //#### Fills all Popup related fields.\r
425 function FillPopupFields( windowName, features )\r
426 {\r
427         if ( windowName )\r
428                 GetE('txtPopupName').value = windowName ;\r
429 \r
430         var oFeatures = new Object() ;\r
431         var oFeaturesMatch ;\r
432         while( ( oFeaturesMatch = oRegex.PopupFeatures.exec( features ) ) != null )\r
433         {\r
434                 var sValue = oFeaturesMatch[2] ;\r
435                 if ( sValue == ( 'yes' || '1' ) )\r
436                         oFeatures[ oFeaturesMatch[1] ] = true ;\r
437                 else if ( ! isNaN( sValue ) && sValue != 0 )\r
438                         oFeatures[ oFeaturesMatch[1] ] = sValue ;\r
439         }\r
440 \r
441         // Update all features check boxes.\r
442         var aChkFeatures = document.getElementsByName('chkFeature') ;\r
443         for ( var i = 0 ; i < aChkFeatures.length ; i++ )\r
444         {\r
445                 if ( oFeatures[ aChkFeatures[i].value ] )\r
446                         aChkFeatures[i].checked = true ;\r
447         }\r
448 \r
449         // Update position and size text boxes.\r
450         if ( oFeatures['width'] )       GetE('txtPopupWidth').value             = oFeatures['width'] ;\r
451         if ( oFeatures['height'] )      GetE('txtPopupHeight').value    = oFeatures['height'] ;\r
452         if ( oFeatures['left'] )        GetE('txtPopupLeft').value              = oFeatures['left'] ;\r
453         if ( oFeatures['top'] )         GetE('txtPopupTop').value               = oFeatures['top'] ;\r
454 }\r
455 \r
456 //#### The OK button was hit.\r
457 function Ok()\r
458 {\r
459         var sUri, sInnerHtml ;\r
460 \r
461         switch ( GetE('cmbLinkType').value )\r
462         {\r
463                 case 'url' :\r
464                         sUri = GetE('txtUrl').value ;\r
465 \r
466                         if ( sUri.length == 0 )\r
467                         {\r
468                                 alert( FCKLang.DlnLnkMsgNoUrl ) ;\r
469                                 return false ;\r
470                         }\r
471 \r
472                         sUri = GetE('cmbLinkProtocol').value + sUri ;\r
473 \r
474                         break ;\r
475 \r
476                 case 'email' :\r
477                         sUri = GetE('txtEMailAddress').value ;\r
478 \r
479                         if ( sUri.length == 0 )\r
480                         {\r
481                                 alert( FCKLang.DlnLnkMsgNoEMail ) ;\r
482                                 return false ;\r
483                         }\r
484 \r
485                         sUri = oParser.CreateEMailUri(\r
486                                 sUri,\r
487                                 GetE('txtEMailSubject').value,\r
488                                 GetE('txtEMailBody').value ) ;\r
489                         break ;\r
490 \r
491                 case 'anchor' :\r
492                         var sAnchor = GetE('cmbAnchorName').value ;\r
493                         if ( sAnchor.length == 0 ) sAnchor = GetE('cmbAnchorId').value ;\r
494 \r
495                         if ( sAnchor.length == 0 )\r
496                         {\r
497                                 alert( FCKLang.DlnLnkMsgNoAnchor ) ;\r
498                                 return false ;\r
499                         }\r
500 \r
501                         sUri = '#' + sAnchor ;\r
502                         break ;\r
503         }\r
504 \r
505         // If no link is selected, create a new one (it may result in more than one link creation - #220).\r
506         var aLinks = oLink ? [ oLink ] : oEditor.FCK.CreateLink( sUri ) ;\r
507 \r
508         // If no selection, no links are created, so use the uri as the link text (by dom, 2006-05-26)\r
509         var aHasSelection = ( aLinks.length > 0 ) ;\r
510         if ( !aHasSelection )\r
511         {\r
512                 sInnerHtml = sUri;\r
513 \r
514                 // Built a better text for empty links.\r
515                 switch ( GetE('cmbLinkType').value )\r
516                 {\r
517                         // anchor: use old behavior --> return true\r
518                         case 'anchor':\r
519                                 sInnerHtml = sInnerHtml.replace( /^#/, '' ) ;\r
520                                 break ;\r
521 \r
522                         // url: try to get path\r
523                         case 'url':\r
524                                 var oLinkPathRegEx = new RegExp("//?([^?\"']+)([?].*)?$") ;\r
525                                 var asLinkPath = oLinkPathRegEx.exec( sUri ) ;\r
526                                 if (asLinkPath != null)\r
527                                         sInnerHtml = asLinkPath[1];  // use matched path\r
528                                 break ;\r
529 \r
530                         // mailto: try to get email address\r
531                         case 'email':\r
532                                 sInnerHtml = GetE('txtEMailAddress').value ;\r
533                                 break ;\r
534                 }\r
535 \r
536                 // Create a new (empty) anchor.\r
537                 aLinks = [ oEditor.FCK.CreateElement( 'a' ) ] ;\r
538         }\r
539 \r
540         oEditor.FCKUndo.SaveUndoStep() ;\r
541 \r
542         for ( var i = 0 ; i < aLinks.length ; i++ )\r
543         {\r
544                 oLink = aLinks[i] ;\r
545 \r
546                 if ( aHasSelection )\r
547                         sInnerHtml = oLink.innerHTML ;          // Save the innerHTML (IE changes it if it is like an URL).\r
548 \r
549                 oLink.href = sUri ;\r
550                 SetAttribute( oLink, '_fcksavedurl', sUri ) ;\r
551 \r
552                 // Accesible popups\r
553                 if( GetE('cmbTarget').value == 'popup' )\r
554                 {\r
555                         SetAttribute( oLink, 'onclick_fckprotectedatt', " onclick=\"" + BuildOnClickPopup() + "\"") ;\r
556                 }\r
557                 else\r
558                 {\r
559                         // Check if the previous onclick was for a popup:\r
560                         // In that case remove the onclick handler.\r
561                         var onclick = oLink.getAttribute( 'onclick_fckprotectedatt' ) ;\r
562                         if( oRegex.OnClickPopup.test( onclick ) )\r
563                                 SetAttribute( oLink, 'onclick_fckprotectedatt', '' ) ;\r
564                 }\r
565 \r
566                 oLink.innerHTML = sInnerHtml ;          // Set (or restore) the innerHTML\r
567 \r
568                 // Target\r
569                 if( GetE('cmbTarget').value != 'popup' )\r
570                         SetAttribute( oLink, 'target', GetE('txtTargetFrame').value ) ;\r
571                 else\r
572                         SetAttribute( oLink, 'target', null ) ;\r
573 \r
574                 // Let's set the "id" only for the first link to avoid duplication.\r
575                 if ( i == 0 )\r
576                         SetAttribute( oLink, 'id', GetE('txtAttId').value ) ;\r
577 \r
578                 // Advances Attributes\r
579                 SetAttribute( oLink, 'name'             , GetE('txtAttName').value ) ;\r
580                 SetAttribute( oLink, 'dir'              , GetE('cmbAttLangDir').value ) ;\r
581                 SetAttribute( oLink, 'lang'             , GetE('txtAttLangCode').value ) ;\r
582                 SetAttribute( oLink, 'accesskey', GetE('txtAttAccessKey').value ) ;\r
583                 SetAttribute( oLink, 'tabindex' , ( GetE('txtAttTabIndex').value > 0 ? GetE('txtAttTabIndex').value : null ) ) ;\r
584                 SetAttribute( oLink, 'title'    , GetE('txtAttTitle').value ) ;\r
585                 SetAttribute( oLink, 'type'             , GetE('txtAttContentType').value ) ;\r
586                 SetAttribute( oLink, 'charset'  , GetE('txtAttCharSet').value ) ;\r
587 \r
588                 if ( oEditor.FCKBrowserInfo.IsIE )\r
589                 {\r
590                         var sClass = GetE('txtAttClasses').value ;\r
591                         // If it's also an anchor add an internal class\r
592                         if ( GetE('txtAttName').value.length != 0 )\r
593                                 sClass += ' FCK__AnchorC' ;\r
594                         SetAttribute( oLink, 'className', sClass ) ;\r
595 \r
596                         oLink.style.cssText = GetE('txtAttStyle').value ;\r
597                 }\r
598                 else\r
599                 {\r
600                         SetAttribute( oLink, 'class', GetE('txtAttClasses').value ) ;\r
601                         SetAttribute( oLink, 'style', GetE('txtAttStyle').value ) ;\r
602                 }\r
603         }\r
604 \r
605         // Select the (first) link.\r
606         oEditor.FCKSelection.SelectNode( aLinks[0] );\r
607 \r
608         return true ;\r
609 }\r
610 \r
611 function BrowseServer()\r
612 {\r
613         OpenFileBrowser( FCKConfig.LinkBrowserURL, FCKConfig.LinkBrowserWindowWidth, FCKConfig.LinkBrowserWindowHeight ) ;\r
614 }\r
615 \r
616 function SetUrl( url )\r
617 {\r
618         document.getElementById('txtUrl').value = url ;\r
619         OnUrlChange() ;\r
620         window.parent.SetSelectedTab( 'Info' ) ;\r
621 }\r
622 \r
623 function OnUploadCompleted( errorNumber, fileUrl, fileName, customMsg )\r
624 {\r
625         switch ( errorNumber )\r
626         {\r
627                 case 0 :        // No errors\r
628                         alert( 'Your file has been successfully uploaded' ) ;\r
629                         break ;\r
630                 case 1 :        // Custom error\r
631                         alert( customMsg ) ;\r
632                         return ;\r
633                 case 101 :      // Custom warning\r
634                         alert( customMsg ) ;\r
635                         break ;\r
636                 case 201 :\r
637                         alert( 'A file with the same name is already available. The uploaded file has been renamed to "' + fileName + '"' ) ;\r
638                         break ;\r
639                 case 202 :\r
640                         alert( 'Invalid file type' ) ;\r
641                         return ;\r
642                 case 203 :\r
643                         alert( "Security error. You probably don't have enough permissions to upload. Please check your server." ) ;\r
644                         return ;\r
645                 default :\r
646                         alert( 'Error on file upload. Error number: ' + errorNumber ) ;\r
647                         return ;\r
648         }\r
649 \r
650         SetUrl( fileUrl ) ;\r
651         GetE('frmUpload').reset() ;\r
652 }\r
653 \r
654 var oUploadAllowedExtRegex      = new RegExp( FCKConfig.LinkUploadAllowedExtensions, 'i' ) ;\r
655 var oUploadDeniedExtRegex       = new RegExp( FCKConfig.LinkUploadDeniedExtensions, 'i' ) ;\r
656 \r
657 function CheckUpload()\r
658 {\r
659         var sFile = GetE('txtUploadFile').value ;\r
660 \r
661         if ( sFile.length == 0 )\r
662         {\r
663                 alert( 'Please select a file to upload' ) ;\r
664                 return false ;\r
665         }\r
666 \r
667         if ( ( FCKConfig.LinkUploadAllowedExtensions.length > 0 && !oUploadAllowedExtRegex.test( sFile ) ) ||\r
668                 ( FCKConfig.LinkUploadDeniedExtensions.length > 0 && oUploadDeniedExtRegex.test( sFile ) ) )\r
669         {\r
670                 OnUploadCompleted( 202 ) ;\r
671                 return false ;\r
672         }\r
673 \r
674         return true ;\r
675 }\r
676 \r
677 function SetDefaultTarget()\r
678 {\r
679         var target = FCKConfig.DefaultLinkTarget + '' ;\r
680         \r
681         if ( oLink || target.length == 0 )\r
682                 return ;\r
683 \r
684         switch ( target )\r
685         {\r
686                 case '_blank' :\r
687                 case '_self' :\r
688                 case '_parent' :\r
689                 case '_top' :\r
690                         GetE('cmbTarget').value = target ;\r
691                         break ;\r
692                 default :\r
693                         GetE('cmbTarget').value = 'frame' ;\r
694                         break ;\r
695         }\r
696         \r
697         GetE('txtTargetFrame').value = target ;\r
698 }\r