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