2014-04-11 20:19:54 +00:00
|
|
|
|
/**
|
2018-06-17 16:07:19 +00:00
|
|
|
|
* @license Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
|
|
|
|
|
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
|
2014-04-11 20:19:54 +00:00
|
|
|
|
*/
|
|
|
|
|
|
2018-06-17 16:07:19 +00:00
|
|
|
|
'use strict';
|
2014-04-11 20:19:54 +00:00
|
|
|
|
|
2018-06-17 16:07:19 +00:00
|
|
|
|
( function() {
|
|
|
|
|
CKEDITOR.dialog.add( 'link', function( editor ) {
|
|
|
|
|
var plugin = CKEDITOR.plugins.link,
|
|
|
|
|
initialLinkText;
|
2014-04-11 20:19:54 +00:00
|
|
|
|
|
2018-06-17 16:07:19 +00:00
|
|
|
|
function createRangeForLink( editor, link ) {
|
|
|
|
|
var range = editor.createRange();
|
2014-04-11 20:19:54 +00:00
|
|
|
|
|
2018-06-17 16:07:19 +00:00
|
|
|
|
range.setStartBefore( link );
|
|
|
|
|
range.setEndAfter( link );
|
2014-04-11 20:19:54 +00:00
|
|
|
|
|
2018-06-17 16:07:19 +00:00
|
|
|
|
return range;
|
|
|
|
|
}
|
2014-04-11 20:19:54 +00:00
|
|
|
|
|
2018-06-17 16:07:19 +00:00
|
|
|
|
function insertLinksIntoSelection( editor, data ) {
|
|
|
|
|
var attributes = plugin.getLinkAttributes( editor, data ),
|
|
|
|
|
ranges = editor.getSelection().getRanges(),
|
|
|
|
|
style = new CKEDITOR.style( {
|
|
|
|
|
element: 'a',
|
|
|
|
|
attributes: attributes.set
|
|
|
|
|
} ),
|
|
|
|
|
rangesToSelect = [],
|
|
|
|
|
range,
|
|
|
|
|
text,
|
|
|
|
|
nestedLinks,
|
|
|
|
|
i,
|
|
|
|
|
j;
|
|
|
|
|
|
|
|
|
|
style.type = CKEDITOR.STYLE_INLINE; // need to override... dunno why.
|
|
|
|
|
|
|
|
|
|
for ( i = 0; i < ranges.length; i++ ) {
|
|
|
|
|
range = ranges[ i ];
|
2014-04-11 20:19:54 +00:00
|
|
|
|
|
2018-06-17 16:07:19 +00:00
|
|
|
|
// Use link URL as text with a collapsed cursor.
|
|
|
|
|
if ( range.collapsed ) {
|
|
|
|
|
// Short mailto link text view (https://dev.ckeditor.com/ticket/5736).
|
|
|
|
|
text = new CKEDITOR.dom.text( data.linkText || ( data.type == 'email' ?
|
|
|
|
|
data.email.address : attributes.set[ 'data-cke-saved-href' ] ), editor.document );
|
|
|
|
|
range.insertNode( text );
|
|
|
|
|
range.selectNodeContents( text );
|
|
|
|
|
} else if ( initialLinkText !== data.linkText ) {
|
|
|
|
|
text = new CKEDITOR.dom.text( data.linkText, editor.document );
|
2014-04-11 20:19:54 +00:00
|
|
|
|
|
2018-06-17 16:07:19 +00:00
|
|
|
|
// Shrink range to preserve block element.
|
|
|
|
|
range.shrink( CKEDITOR.SHRINK_TEXT );
|
2014-04-11 20:19:54 +00:00
|
|
|
|
|
2018-06-17 16:07:19 +00:00
|
|
|
|
// Use extractHtmlFromRange to remove markup within the selection. Also this method is a little
|
|
|
|
|
// smarter than range#deleteContents as it plays better e.g. with table cells.
|
|
|
|
|
editor.editable().extractHtmlFromRange( range );
|
|
|
|
|
|
|
|
|
|
range.insertNode( text );
|
2014-04-11 20:19:54 +00:00
|
|
|
|
}
|
|
|
|
|
|
2018-06-17 16:07:19 +00:00
|
|
|
|
// Editable links nested within current range should be removed, so that the link is applied to whole selection.
|
|
|
|
|
nestedLinks = range._find( 'a' );
|
2014-04-11 20:19:54 +00:00
|
|
|
|
|
2018-06-17 16:07:19 +00:00
|
|
|
|
for ( j = 0; j < nestedLinks.length; j++ ) {
|
|
|
|
|
nestedLinks[ j ].remove( true );
|
|
|
|
|
}
|
2014-04-11 20:19:54 +00:00
|
|
|
|
|
|
|
|
|
|
2018-06-17 16:07:19 +00:00
|
|
|
|
// Apply style.
|
|
|
|
|
style.applyToRange( range, editor );
|
2014-04-11 20:19:54 +00:00
|
|
|
|
|
2018-06-17 16:07:19 +00:00
|
|
|
|
rangesToSelect.push( range );
|
|
|
|
|
}
|
2014-04-11 20:19:54 +00:00
|
|
|
|
|
2018-06-17 16:07:19 +00:00
|
|
|
|
editor.getSelection().selectRanges( rangesToSelect );
|
|
|
|
|
}
|
2014-04-11 20:19:54 +00:00
|
|
|
|
|
2018-06-17 16:07:19 +00:00
|
|
|
|
function editLinksInSelection( editor, selectedElements, data ) {
|
|
|
|
|
var attributes = plugin.getLinkAttributes( editor, data ),
|
|
|
|
|
ranges = [],
|
|
|
|
|
element,
|
|
|
|
|
href,
|
|
|
|
|
textView,
|
|
|
|
|
newText,
|
|
|
|
|
i;
|
2014-04-11 20:19:54 +00:00
|
|
|
|
|
2018-06-17 16:07:19 +00:00
|
|
|
|
for ( i = 0; i < selectedElements.length; i++ ) {
|
|
|
|
|
// We're only editing an existing link, so just overwrite the attributes.
|
|
|
|
|
element = selectedElements[ i ];
|
|
|
|
|
href = element.data( 'cke-saved-href' );
|
|
|
|
|
textView = element.getHtml();
|
2014-04-11 20:19:54 +00:00
|
|
|
|
|
2018-06-17 16:07:19 +00:00
|
|
|
|
element.setAttributes( attributes.set );
|
|
|
|
|
element.removeAttributes( attributes.removed );
|
2014-04-11 20:19:54 +00:00
|
|
|
|
|
|
|
|
|
|
2018-06-17 16:07:19 +00:00
|
|
|
|
if ( data.linkText && initialLinkText != data.linkText ) {
|
|
|
|
|
// Display text has been changed.
|
|
|
|
|
newText = data.linkText;
|
|
|
|
|
} else if ( href == textView || data.type == 'email' && textView.indexOf( '@' ) != -1 ) {
|
|
|
|
|
// Update text view when user changes protocol (https://dev.ckeditor.com/ticket/4612).
|
|
|
|
|
// Short mailto link text view (https://dev.ckeditor.com/ticket/5736).
|
|
|
|
|
newText = data.type == 'email' ? data.email.address : attributes.set[ 'data-cke-saved-href' ];
|
2014-04-11 20:19:54 +00:00
|
|
|
|
}
|
|
|
|
|
|
2018-06-17 16:07:19 +00:00
|
|
|
|
if ( newText ) {
|
|
|
|
|
element.setText( newText );
|
|
|
|
|
}
|
2014-04-11 20:19:54 +00:00
|
|
|
|
|
2018-06-17 16:07:19 +00:00
|
|
|
|
ranges.push( createRangeForLink( editor, element ) );
|
|
|
|
|
}
|
2014-04-11 20:19:54 +00:00
|
|
|
|
|
2018-06-17 16:07:19 +00:00
|
|
|
|
// We changed the content, so need to select it again.
|
|
|
|
|
editor.getSelection().selectRanges( ranges );
|
|
|
|
|
}
|
2014-04-11 20:19:54 +00:00
|
|
|
|
|
2018-06-17 16:07:19 +00:00
|
|
|
|
// Handles the event when the "Target" selection box is changed.
|
|
|
|
|
var targetChanged = function() {
|
|
|
|
|
var dialog = this.getDialog(),
|
|
|
|
|
popupFeatures = dialog.getContentElement( 'target', 'popupFeatures' ),
|
|
|
|
|
targetName = dialog.getContentElement( 'target', 'linkTargetName' ),
|
|
|
|
|
value = this.getValue();
|
|
|
|
|
|
|
|
|
|
if ( !popupFeatures || !targetName )
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
popupFeatures = popupFeatures.getElement();
|
|
|
|
|
popupFeatures.hide();
|
|
|
|
|
targetName.setValue( '' );
|
|
|
|
|
|
|
|
|
|
switch ( value ) {
|
|
|
|
|
case 'frame':
|
|
|
|
|
targetName.setLabel( editor.lang.link.targetFrameName );
|
|
|
|
|
targetName.getElement().show();
|
|
|
|
|
break;
|
|
|
|
|
case 'popup':
|
|
|
|
|
popupFeatures.show();
|
|
|
|
|
targetName.setLabel( editor.lang.link.targetPopupName );
|
|
|
|
|
targetName.getElement().show();
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
targetName.setValue( value );
|
|
|
|
|
targetName.getElement().hide();
|
|
|
|
|
break;
|
|
|
|
|
}
|
2014-04-11 20:19:54 +00:00
|
|
|
|
|
2018-06-17 16:07:19 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// Handles the event when the "Type" selection box is changed.
|
|
|
|
|
var linkTypeChanged = function() {
|
|
|
|
|
var dialog = this.getDialog(),
|
|
|
|
|
partIds = [ 'urlOptions', 'anchorOptions', 'emailOptions' ],
|
|
|
|
|
typeValue = this.getValue(),
|
|
|
|
|
uploadTab = dialog.definition.getContents( 'upload' ),
|
|
|
|
|
uploadInitiallyHidden = uploadTab && uploadTab.hidden;
|
|
|
|
|
|
|
|
|
|
if ( typeValue == 'url' ) {
|
|
|
|
|
if ( editor.config.linkShowTargetTab )
|
|
|
|
|
dialog.showPage( 'target' );
|
|
|
|
|
if ( !uploadInitiallyHidden )
|
|
|
|
|
dialog.showPage( 'upload' );
|
|
|
|
|
} else {
|
|
|
|
|
dialog.hidePage( 'target' );
|
|
|
|
|
if ( !uploadInitiallyHidden )
|
|
|
|
|
dialog.hidePage( 'upload' );
|
|
|
|
|
}
|
2014-04-11 20:19:54 +00:00
|
|
|
|
|
2018-06-17 16:07:19 +00:00
|
|
|
|
for ( var i = 0; i < partIds.length; i++ ) {
|
|
|
|
|
var element = dialog.getContentElement( 'info', partIds[ i ] );
|
|
|
|
|
if ( !element )
|
|
|
|
|
continue;
|
2014-04-11 20:19:54 +00:00
|
|
|
|
|
2018-06-17 16:07:19 +00:00
|
|
|
|
element = element.getElement().getParent().getParent();
|
|
|
|
|
if ( partIds[ i ] == typeValue + 'Options' )
|
|
|
|
|
element.show();
|
|
|
|
|
else
|
|
|
|
|
element.hide();
|
|
|
|
|
}
|
2014-04-11 20:19:54 +00:00
|
|
|
|
|
2018-06-17 16:07:19 +00:00
|
|
|
|
dialog.layout();
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var setupParams = function( page, data ) {
|
|
|
|
|
if ( data[ page ] )
|
|
|
|
|
this.setValue( data[ page ][ this.id ] || '' );
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var setupPopupParams = function( data ) {
|
|
|
|
|
return setupParams.call( this, 'target', data );
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var setupAdvParams = function( data ) {
|
|
|
|
|
return setupParams.call( this, 'advanced', data );
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var commitParams = function( page, data ) {
|
|
|
|
|
if ( !data[ page ] )
|
|
|
|
|
data[ page ] = {};
|
|
|
|
|
|
|
|
|
|
data[ page ][ this.id ] = this.getValue() || '';
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var commitPopupParams = function( data ) {
|
|
|
|
|
return commitParams.call( this, 'target', data );
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var commitAdvParams = function( data ) {
|
|
|
|
|
return commitParams.call( this, 'advanced', data );
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var commonLang = editor.lang.common,
|
|
|
|
|
linkLang = editor.lang.link,
|
|
|
|
|
anchors;
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
title: linkLang.title,
|
|
|
|
|
minWidth: ( CKEDITOR.skinName || editor.config.skin ) == 'moono-lisa' ? 450 : 350,
|
|
|
|
|
minHeight: 240,
|
|
|
|
|
contents: [ {
|
|
|
|
|
id: 'info',
|
|
|
|
|
label: linkLang.info,
|
|
|
|
|
title: linkLang.info,
|
|
|
|
|
elements: [ {
|
|
|
|
|
type: 'text',
|
|
|
|
|
id: 'linkDisplayText',
|
|
|
|
|
label: linkLang.displayText,
|
|
|
|
|
setup: function() {
|
|
|
|
|
this.enable();
|
|
|
|
|
|
|
|
|
|
this.setValue( editor.getSelection().getSelectedText() );
|
|
|
|
|
|
|
|
|
|
// Keep inner text so that it can be compared in commit function. By obtaining value from getData()
|
|
|
|
|
// we get value stripped from new line chars which is important when comparing the value later on.
|
|
|
|
|
initialLinkText = this.getValue();
|
|
|
|
|
},
|
|
|
|
|
commit: function( data ) {
|
|
|
|
|
data.linkText = this.isEnabled() ? this.getValue() : '';
|
2014-04-11 20:19:54 +00:00
|
|
|
|
}
|
2018-06-17 16:07:19 +00:00
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
id: 'linkType',
|
|
|
|
|
type: 'select',
|
|
|
|
|
label: linkLang.type,
|
|
|
|
|
'default': 'url',
|
|
|
|
|
items: [
|
|
|
|
|
[ linkLang.toUrl, 'url' ],
|
|
|
|
|
[ linkLang.toAnchor, 'anchor' ],
|
|
|
|
|
[ linkLang.toEmail, 'email' ]
|
2014-04-11 20:19:54 +00:00
|
|
|
|
],
|
2018-06-17 16:07:19 +00:00
|
|
|
|
onChange: linkTypeChanged,
|
2014-04-11 20:19:54 +00:00
|
|
|
|
setup: function( data ) {
|
2018-06-17 16:07:19 +00:00
|
|
|
|
this.setValue( data.type || 'url' );
|
|
|
|
|
},
|
|
|
|
|
commit: function( data ) {
|
|
|
|
|
data.type = this.getValue();
|
2014-04-11 20:19:54 +00:00
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
{
|
2018-06-17 16:07:19 +00:00
|
|
|
|
type: 'vbox',
|
|
|
|
|
id: 'urlOptions',
|
|
|
|
|
children: [ {
|
2014-04-11 20:19:54 +00:00
|
|
|
|
type: 'hbox',
|
2018-06-17 16:07:19 +00:00
|
|
|
|
widths: [ '25%', '75%' ],
|
|
|
|
|
children: [ {
|
|
|
|
|
id: 'protocol',
|
2014-04-11 20:19:54 +00:00
|
|
|
|
type: 'select',
|
2018-06-17 16:07:19 +00:00
|
|
|
|
label: commonLang.protocol,
|
|
|
|
|
'default': 'http://',
|
2014-04-11 20:19:54 +00:00
|
|
|
|
items: [
|
2018-06-17 16:07:19 +00:00
|
|
|
|
// Force 'ltr' for protocol names in BIDI. (https://dev.ckeditor.com/ticket/5433)
|
|
|
|
|
[ 'http://\u200E', 'http://' ],
|
|
|
|
|
[ 'https://\u200E', 'https://' ],
|
|
|
|
|
[ 'ftp://\u200E', 'ftp://' ],
|
|
|
|
|
[ 'news://\u200E', 'news://' ],
|
|
|
|
|
[ linkLang.other, '' ]
|
|
|
|
|
],
|
2014-04-11 20:19:54 +00:00
|
|
|
|
setup: function( data ) {
|
2018-06-17 16:07:19 +00:00
|
|
|
|
if ( data.url )
|
|
|
|
|
this.setValue( data.url.protocol || '' );
|
2014-04-11 20:19:54 +00:00
|
|
|
|
},
|
|
|
|
|
commit: function( data ) {
|
2018-06-17 16:07:19 +00:00
|
|
|
|
if ( !data.url )
|
|
|
|
|
data.url = {};
|
2014-04-11 20:19:54 +00:00
|
|
|
|
|
2018-06-17 16:07:19 +00:00
|
|
|
|
data.url.protocol = this.getValue();
|
2014-04-11 20:19:54 +00:00
|
|
|
|
}
|
|
|
|
|
},
|
2018-06-17 16:07:19 +00:00
|
|
|
|
{
|
|
|
|
|
type: 'text',
|
|
|
|
|
id: 'url',
|
|
|
|
|
label: commonLang.url,
|
|
|
|
|
required: true,
|
|
|
|
|
onLoad: function() {
|
|
|
|
|
this.allowOnChange = true;
|
|
|
|
|
},
|
|
|
|
|
onKeyUp: function() {
|
|
|
|
|
this.allowOnChange = false;
|
|
|
|
|
var protocolCmb = this.getDialog().getContentElement( 'info', 'protocol' ),
|
|
|
|
|
url = this.getValue(),
|
|
|
|
|
urlOnChangeProtocol = /^(http|https|ftp|news):\/\/(?=.)/i,
|
|
|
|
|
urlOnChangeTestOther = /^((javascript:)|[#\/\.\?])/i;
|
|
|
|
|
|
|
|
|
|
var protocol = urlOnChangeProtocol.exec( url );
|
|
|
|
|
if ( protocol ) {
|
|
|
|
|
this.setValue( url.substr( protocol[ 0 ].length ) );
|
|
|
|
|
protocolCmb.setValue( protocol[ 0 ].toLowerCase() );
|
|
|
|
|
} else if ( urlOnChangeTestOther.test( url ) ) {
|
|
|
|
|
protocolCmb.setValue( '' );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this.allowOnChange = true;
|
|
|
|
|
},
|
|
|
|
|
onChange: function() {
|
|
|
|
|
if ( this.allowOnChange ) // Dont't call on dialog load.
|
|
|
|
|
this.onKeyUp();
|
|
|
|
|
},
|
|
|
|
|
validate: function() {
|
|
|
|
|
var dialog = this.getDialog();
|
|
|
|
|
|
|
|
|
|
if ( dialog.getContentElement( 'info', 'linkType' ) && dialog.getValueOf( 'info', 'linkType' ) != 'url' )
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
if ( !editor.config.linkJavaScriptLinksAllowed && ( /javascript\:/ ).test( this.getValue() ) ) {
|
|
|
|
|
alert( commonLang.invalidValue ); // jshint ignore:line
|
|
|
|
|
return false;
|
2014-04-11 20:19:54 +00:00
|
|
|
|
}
|
|
|
|
|
|
2018-06-17 16:07:19 +00:00
|
|
|
|
if ( this.getDialog().fakeObj ) // Edit Anchor.
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
var func = CKEDITOR.dialog.validate.notEmpty( linkLang.noUrl );
|
|
|
|
|
return func.apply( this );
|
|
|
|
|
},
|
|
|
|
|
setup: function( data ) {
|
|
|
|
|
this.allowOnChange = false;
|
|
|
|
|
if ( data.url )
|
|
|
|
|
this.setValue( data.url.url );
|
|
|
|
|
this.allowOnChange = true;
|
|
|
|
|
|
2014-04-11 20:19:54 +00:00
|
|
|
|
},
|
|
|
|
|
commit: function( data ) {
|
2018-06-17 16:07:19 +00:00
|
|
|
|
// IE will not trigger the onChange event if the mouse has been used
|
|
|
|
|
// to carry all the operations https://dev.ckeditor.com/ticket/4724
|
|
|
|
|
this.onChange();
|
|
|
|
|
|
|
|
|
|
if ( !data.url )
|
|
|
|
|
data.url = {};
|
2014-04-11 20:19:54 +00:00
|
|
|
|
|
2018-06-17 16:07:19 +00:00
|
|
|
|
data.url.url = this.getValue();
|
|
|
|
|
this.allowOnChange = false;
|
2014-04-11 20:19:54 +00:00
|
|
|
|
}
|
2018-06-17 16:07:19 +00:00
|
|
|
|
} ],
|
|
|
|
|
setup: function() {
|
|
|
|
|
if ( !this.getDialog().getContentElement( 'info', 'linkType' ) )
|
2014-04-11 20:19:54 +00:00
|
|
|
|
this.getElement().show();
|
|
|
|
|
}
|
2018-06-17 16:07:19 +00:00
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
type: 'button',
|
|
|
|
|
id: 'browse',
|
|
|
|
|
hidden: 'true',
|
|
|
|
|
filebrowser: 'info:url',
|
|
|
|
|
label: commonLang.browseServer
|
|
|
|
|
} ]
|
2014-04-11 20:19:54 +00:00
|
|
|
|
},
|
2018-06-17 16:07:19 +00:00
|
|
|
|
{
|
|
|
|
|
type: 'vbox',
|
|
|
|
|
id: 'anchorOptions',
|
|
|
|
|
width: 260,
|
|
|
|
|
align: 'center',
|
|
|
|
|
padding: 0,
|
|
|
|
|
children: [ {
|
|
|
|
|
type: 'fieldset',
|
|
|
|
|
id: 'selectAnchorText',
|
|
|
|
|
label: linkLang.selectAnchor,
|
|
|
|
|
setup: function() {
|
|
|
|
|
anchors = plugin.getEditorAnchors( editor );
|
|
|
|
|
|
|
|
|
|
this.getElement()[ anchors && anchors.length ? 'show' : 'hide' ]();
|
|
|
|
|
},
|
|
|
|
|
children: [ {
|
|
|
|
|
type: 'hbox',
|
|
|
|
|
id: 'selectAnchor',
|
|
|
|
|
children: [ {
|
|
|
|
|
type: 'select',
|
|
|
|
|
id: 'anchorName',
|
|
|
|
|
'default': '',
|
|
|
|
|
label: linkLang.anchorName,
|
|
|
|
|
style: 'width: 100%;',
|
|
|
|
|
items: [
|
|
|
|
|
[ '' ]
|
|
|
|
|
],
|
|
|
|
|
setup: function( data ) {
|
|
|
|
|
this.clear();
|
|
|
|
|
this.add( '' );
|
|
|
|
|
|
|
|
|
|
if ( anchors ) {
|
|
|
|
|
for ( var i = 0; i < anchors.length; i++ ) {
|
|
|
|
|
if ( anchors[ i ].name )
|
|
|
|
|
this.add( anchors[ i ].name );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ( data.anchor )
|
|
|
|
|
this.setValue( data.anchor.name );
|
|
|
|
|
|
|
|
|
|
var linkType = this.getDialog().getContentElement( 'info', 'linkType' );
|
|
|
|
|
if ( linkType && linkType.getValue() == 'email' )
|
|
|
|
|
this.focus();
|
|
|
|
|
},
|
|
|
|
|
commit: function( data ) {
|
|
|
|
|
if ( !data.anchor )
|
|
|
|
|
data.anchor = {};
|
|
|
|
|
|
|
|
|
|
data.anchor.name = this.getValue();
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
type: 'select',
|
|
|
|
|
id: 'anchorId',
|
|
|
|
|
'default': '',
|
|
|
|
|
label: linkLang.anchorId,
|
|
|
|
|
style: 'width: 100%;',
|
|
|
|
|
items: [
|
|
|
|
|
[ '' ]
|
|
|
|
|
],
|
|
|
|
|
setup: function( data ) {
|
|
|
|
|
this.clear();
|
|
|
|
|
this.add( '' );
|
|
|
|
|
|
|
|
|
|
if ( anchors ) {
|
|
|
|
|
for ( var i = 0; i < anchors.length; i++ ) {
|
|
|
|
|
if ( anchors[ i ].id )
|
|
|
|
|
this.add( anchors[ i ].id );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ( data.anchor )
|
|
|
|
|
this.setValue( data.anchor.id );
|
|
|
|
|
},
|
|
|
|
|
commit: function( data ) {
|
|
|
|
|
if ( !data.anchor )
|
|
|
|
|
data.anchor = {};
|
|
|
|
|
|
|
|
|
|
data.anchor.id = this.getValue();
|
|
|
|
|
}
|
|
|
|
|
} ],
|
|
|
|
|
setup: function() {
|
|
|
|
|
this.getElement()[ anchors && anchors.length ? 'show' : 'hide' ]();
|
|
|
|
|
}
|
|
|
|
|
} ]
|
|
|
|
|
},
|
2014-04-11 20:19:54 +00:00
|
|
|
|
{
|
2018-06-17 16:07:19 +00:00
|
|
|
|
type: 'html',
|
|
|
|
|
id: 'noAnchors',
|
|
|
|
|
style: 'text-align: center;',
|
|
|
|
|
html: '<div role="note" tabIndex="-1">' + CKEDITOR.tools.htmlEncode( linkLang.noAnchors ) + '</div>',
|
|
|
|
|
// Focus the first element defined in above html.
|
|
|
|
|
focus: true,
|
|
|
|
|
setup: function() {
|
|
|
|
|
this.getElement()[ anchors && anchors.length ? 'hide' : 'show' ]();
|
|
|
|
|
}
|
|
|
|
|
} ],
|
|
|
|
|
setup: function() {
|
|
|
|
|
if ( !this.getDialog().getContentElement( 'info', 'linkType' ) )
|
2014-04-11 20:19:54 +00:00
|
|
|
|
this.getElement().hide();
|
|
|
|
|
}
|
2018-06-17 16:07:19 +00:00
|
|
|
|
},
|
2014-04-11 20:19:54 +00:00
|
|
|
|
{
|
2018-06-17 16:07:19 +00:00
|
|
|
|
type: 'vbox',
|
|
|
|
|
id: 'emailOptions',
|
|
|
|
|
padding: 1,
|
|
|
|
|
children: [ {
|
|
|
|
|
type: 'text',
|
|
|
|
|
id: 'emailAddress',
|
|
|
|
|
label: linkLang.emailAddress,
|
|
|
|
|
required: true,
|
|
|
|
|
validate: function() {
|
|
|
|
|
var dialog = this.getDialog();
|
2014-04-11 20:19:54 +00:00
|
|
|
|
|
2018-06-17 16:07:19 +00:00
|
|
|
|
if ( !dialog.getContentElement( 'info', 'linkType' ) || dialog.getValueOf( 'info', 'linkType' ) != 'email' )
|
|
|
|
|
return true;
|
2014-04-11 20:19:54 +00:00
|
|
|
|
|
2018-06-17 16:07:19 +00:00
|
|
|
|
var func = CKEDITOR.dialog.validate.notEmpty( linkLang.noEmail );
|
|
|
|
|
return func.apply( this );
|
|
|
|
|
},
|
|
|
|
|
setup: function( data ) {
|
|
|
|
|
if ( data.email )
|
|
|
|
|
this.setValue( data.email.address );
|
2014-04-11 20:19:54 +00:00
|
|
|
|
|
2018-06-17 16:07:19 +00:00
|
|
|
|
var linkType = this.getDialog().getContentElement( 'info', 'linkType' );
|
|
|
|
|
if ( linkType && linkType.getValue() == 'email' )
|
|
|
|
|
this.select();
|
|
|
|
|
},
|
|
|
|
|
commit: function( data ) {
|
|
|
|
|
if ( !data.email )
|
|
|
|
|
data.email = {};
|
2014-04-11 20:19:54 +00:00
|
|
|
|
|
2018-06-17 16:07:19 +00:00
|
|
|
|
data.email.address = this.getValue();
|
|
|
|
|
}
|
2014-04-11 20:19:54 +00:00
|
|
|
|
},
|
|
|
|
|
{
|
2018-06-17 16:07:19 +00:00
|
|
|
|
type: 'text',
|
|
|
|
|
id: 'emailSubject',
|
|
|
|
|
label: linkLang.emailSubject,
|
|
|
|
|
setup: function( data ) {
|
|
|
|
|
if ( data.email )
|
|
|
|
|
this.setValue( data.email.subject );
|
|
|
|
|
},
|
|
|
|
|
commit: function( data ) {
|
|
|
|
|
if ( !data.email )
|
|
|
|
|
data.email = {};
|
2014-04-11 20:19:54 +00:00
|
|
|
|
|
2018-06-17 16:07:19 +00:00
|
|
|
|
data.email.subject = this.getValue();
|
|
|
|
|
}
|
2014-04-11 20:19:54 +00:00
|
|
|
|
},
|
|
|
|
|
{
|
2018-06-17 16:07:19 +00:00
|
|
|
|
type: 'textarea',
|
|
|
|
|
id: 'emailBody',
|
|
|
|
|
label: linkLang.emailBody,
|
|
|
|
|
rows: 3,
|
|
|
|
|
'default': '',
|
|
|
|
|
setup: function( data ) {
|
|
|
|
|
if ( data.email )
|
|
|
|
|
this.setValue( data.email.body );
|
|
|
|
|
},
|
|
|
|
|
commit: function( data ) {
|
|
|
|
|
if ( !data.email )
|
|
|
|
|
data.email = {};
|
2014-04-11 20:19:54 +00:00
|
|
|
|
|
2018-06-17 16:07:19 +00:00
|
|
|
|
data.email.body = this.getValue();
|
|
|
|
|
}
|
|
|
|
|
} ],
|
|
|
|
|
setup: function() {
|
|
|
|
|
if ( !this.getDialog().getContentElement( 'info', 'linkType' ) )
|
|
|
|
|
this.getElement().hide();
|
2014-04-11 20:19:54 +00:00
|
|
|
|
}
|
2018-06-17 16:07:19 +00:00
|
|
|
|
} ]
|
2014-04-11 20:19:54 +00:00
|
|
|
|
},
|
2018-06-17 16:07:19 +00:00
|
|
|
|
{
|
|
|
|
|
id: 'target',
|
|
|
|
|
requiredContent: 'a[target]', // This is not fully correct, because some target option requires JS.
|
|
|
|
|
label: linkLang.target,
|
|
|
|
|
title: linkLang.target,
|
|
|
|
|
elements: [ {
|
|
|
|
|
type: 'hbox',
|
|
|
|
|
widths: [ '50%', '50%' ],
|
|
|
|
|
children: [ {
|
|
|
|
|
type: 'select',
|
|
|
|
|
id: 'linkTargetType',
|
|
|
|
|
label: commonLang.target,
|
|
|
|
|
'default': 'notSet',
|
|
|
|
|
style: 'width : 100%;',
|
|
|
|
|
'items': [
|
|
|
|
|
[ commonLang.notSet, 'notSet' ],
|
|
|
|
|
[ linkLang.targetFrame, 'frame' ],
|
|
|
|
|
[ linkLang.targetPopup, 'popup' ],
|
|
|
|
|
[ commonLang.targetNew, '_blank' ],
|
|
|
|
|
[ commonLang.targetTop, '_top' ],
|
|
|
|
|
[ commonLang.targetSelf, '_self' ],
|
|
|
|
|
[ commonLang.targetParent, '_parent' ]
|
|
|
|
|
],
|
|
|
|
|
onChange: targetChanged,
|
|
|
|
|
setup: function( data ) {
|
|
|
|
|
if ( data.target )
|
|
|
|
|
this.setValue( data.target.type || 'notSet' );
|
|
|
|
|
targetChanged.call( this );
|
2014-04-11 20:19:54 +00:00
|
|
|
|
},
|
2018-06-17 16:07:19 +00:00
|
|
|
|
commit: function( data ) {
|
|
|
|
|
if ( !data.target )
|
|
|
|
|
data.target = {};
|
2014-04-11 20:19:54 +00:00
|
|
|
|
|
2018-06-17 16:07:19 +00:00
|
|
|
|
data.target.type = this.getValue();
|
2014-04-11 20:19:54 +00:00
|
|
|
|
}
|
|
|
|
|
},
|
2018-06-17 16:07:19 +00:00
|
|
|
|
{
|
|
|
|
|
type: 'text',
|
|
|
|
|
id: 'linkTargetName',
|
|
|
|
|
label: linkLang.targetFrameName,
|
|
|
|
|
'default': '',
|
|
|
|
|
setup: function( data ) {
|
|
|
|
|
if ( data.target )
|
|
|
|
|
this.setValue( data.target.name );
|
2014-04-11 20:19:54 +00:00
|
|
|
|
},
|
2018-06-17 16:07:19 +00:00
|
|
|
|
commit: function( data ) {
|
|
|
|
|
if ( !data.target )
|
|
|
|
|
data.target = {};
|
2014-04-11 20:19:54 +00:00
|
|
|
|
|
2018-06-17 16:07:19 +00:00
|
|
|
|
data.target.name = this.getValue().replace( /([^\x00-\x7F]|\s)/gi, '' );
|
2014-04-11 20:19:54 +00:00
|
|
|
|
}
|
2018-06-17 16:07:19 +00:00
|
|
|
|
} ]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
type: 'vbox',
|
|
|
|
|
width: '100%',
|
|
|
|
|
align: 'center',
|
|
|
|
|
padding: 2,
|
|
|
|
|
id: 'popupFeatures',
|
|
|
|
|
children: [ {
|
|
|
|
|
type: 'fieldset',
|
|
|
|
|
label: linkLang.popupFeatures,
|
|
|
|
|
children: [ {
|
|
|
|
|
type: 'hbox',
|
|
|
|
|
children: [ {
|
|
|
|
|
type: 'checkbox',
|
|
|
|
|
id: 'resizable',
|
|
|
|
|
label: linkLang.popupResizable,
|
|
|
|
|
setup: setupPopupParams,
|
|
|
|
|
commit: commitPopupParams
|
|
|
|
|
},
|
2014-04-11 20:19:54 +00:00
|
|
|
|
{
|
2018-06-17 16:07:19 +00:00
|
|
|
|
type: 'checkbox',
|
|
|
|
|
id: 'status',
|
|
|
|
|
label: linkLang.popupStatusBar,
|
|
|
|
|
setup: setupPopupParams,
|
|
|
|
|
commit: commitPopupParams
|
2014-04-11 20:19:54 +00:00
|
|
|
|
|
2018-06-17 16:07:19 +00:00
|
|
|
|
} ]
|
2014-04-11 20:19:54 +00:00
|
|
|
|
},
|
|
|
|
|
{
|
2018-06-17 16:07:19 +00:00
|
|
|
|
type: 'hbox',
|
|
|
|
|
children: [ {
|
|
|
|
|
type: 'checkbox',
|
|
|
|
|
id: 'location',
|
|
|
|
|
label: linkLang.popupLocationBar,
|
|
|
|
|
setup: setupPopupParams,
|
|
|
|
|
commit: commitPopupParams
|
2014-04-11 20:19:54 +00:00
|
|
|
|
|
2018-06-17 16:07:19 +00:00
|
|
|
|
},
|
2014-04-11 20:19:54 +00:00
|
|
|
|
{
|
2018-06-17 16:07:19 +00:00
|
|
|
|
type: 'checkbox',
|
|
|
|
|
id: 'toolbar',
|
|
|
|
|
label: linkLang.popupToolbar,
|
|
|
|
|
setup: setupPopupParams,
|
|
|
|
|
commit: commitPopupParams
|
2014-04-11 20:19:54 +00:00
|
|
|
|
|
2018-06-17 16:07:19 +00:00
|
|
|
|
} ]
|
|
|
|
|
},
|
2014-04-11 20:19:54 +00:00
|
|
|
|
{
|
2018-06-17 16:07:19 +00:00
|
|
|
|
type: 'hbox',
|
|
|
|
|
children: [ {
|
|
|
|
|
type: 'checkbox',
|
|
|
|
|
id: 'menubar',
|
|
|
|
|
label: linkLang.popupMenuBar,
|
|
|
|
|
setup: setupPopupParams,
|
|
|
|
|
commit: commitPopupParams
|
2014-04-11 20:19:54 +00:00
|
|
|
|
|
2018-06-17 16:07:19 +00:00
|
|
|
|
},
|
2014-04-11 20:19:54 +00:00
|
|
|
|
{
|
2018-06-17 16:07:19 +00:00
|
|
|
|
type: 'checkbox',
|
|
|
|
|
id: 'fullscreen',
|
|
|
|
|
label: linkLang.popupFullScreen,
|
|
|
|
|
setup: setupPopupParams,
|
|
|
|
|
commit: commitPopupParams
|
2014-04-11 20:19:54 +00:00
|
|
|
|
|
2018-06-17 16:07:19 +00:00
|
|
|
|
} ]
|
|
|
|
|
},
|
2014-04-11 20:19:54 +00:00
|
|
|
|
{
|
2018-06-17 16:07:19 +00:00
|
|
|
|
type: 'hbox',
|
|
|
|
|
children: [ {
|
|
|
|
|
type: 'checkbox',
|
|
|
|
|
id: 'scrollbars',
|
|
|
|
|
label: linkLang.popupScrollBars,
|
|
|
|
|
setup: setupPopupParams,
|
|
|
|
|
commit: commitPopupParams
|
|
|
|
|
|
|
|
|
|
},
|
2014-04-11 20:19:54 +00:00
|
|
|
|
{
|
2018-06-17 16:07:19 +00:00
|
|
|
|
type: 'checkbox',
|
|
|
|
|
id: 'dependent',
|
|
|
|
|
label: linkLang.popupDependent,
|
|
|
|
|
setup: setupPopupParams,
|
|
|
|
|
commit: commitPopupParams
|
2014-04-11 20:19:54 +00:00
|
|
|
|
|
2018-06-17 16:07:19 +00:00
|
|
|
|
} ]
|
2014-04-11 20:19:54 +00:00
|
|
|
|
},
|
2018-06-17 16:07:19 +00:00
|
|
|
|
{
|
|
|
|
|
type: 'hbox',
|
|
|
|
|
children: [ {
|
|
|
|
|
type: 'text',
|
|
|
|
|
widths: [ '50%', '50%' ],
|
|
|
|
|
labelLayout: 'horizontal',
|
|
|
|
|
label: commonLang.width,
|
|
|
|
|
id: 'width',
|
|
|
|
|
setup: setupPopupParams,
|
|
|
|
|
commit: commitPopupParams
|
|
|
|
|
|
|
|
|
|
},
|
2014-04-11 20:19:54 +00:00
|
|
|
|
{
|
2018-06-17 16:07:19 +00:00
|
|
|
|
type: 'text',
|
|
|
|
|
labelLayout: 'horizontal',
|
|
|
|
|
widths: [ '50%', '50%' ],
|
|
|
|
|
label: linkLang.popupLeft,
|
|
|
|
|
id: 'left',
|
|
|
|
|
setup: setupPopupParams,
|
|
|
|
|
commit: commitPopupParams
|
|
|
|
|
|
|
|
|
|
} ]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
type: 'hbox',
|
|
|
|
|
children: [ {
|
|
|
|
|
type: 'text',
|
|
|
|
|
labelLayout: 'horizontal',
|
|
|
|
|
widths: [ '50%', '50%' ],
|
|
|
|
|
label: commonLang.height,
|
|
|
|
|
id: 'height',
|
|
|
|
|
setup: setupPopupParams,
|
|
|
|
|
commit: commitPopupParams
|
2014-04-11 20:19:54 +00:00
|
|
|
|
|
2018-06-17 16:07:19 +00:00
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
type: 'text',
|
|
|
|
|
labelLayout: 'horizontal',
|
|
|
|
|
label: linkLang.popupTop,
|
|
|
|
|
widths: [ '50%', '50%' ],
|
|
|
|
|
id: 'top',
|
|
|
|
|
setup: setupPopupParams,
|
|
|
|
|
commit: commitPopupParams
|
|
|
|
|
|
|
|
|
|
} ]
|
|
|
|
|
} ]
|
|
|
|
|
} ]
|
|
|
|
|
} ]
|
|
|
|
|
},
|
2014-04-11 20:19:54 +00:00
|
|
|
|
{
|
|
|
|
|
id: 'upload',
|
2018-06-17 16:07:19 +00:00
|
|
|
|
label: linkLang.upload,
|
|
|
|
|
title: linkLang.upload,
|
|
|
|
|
hidden: true,
|
|
|
|
|
filebrowser: 'uploadButton',
|
|
|
|
|
elements: [ {
|
|
|
|
|
type: 'file',
|
|
|
|
|
id: 'upload',
|
|
|
|
|
label: commonLang.upload,
|
|
|
|
|
style: 'height:40px',
|
|
|
|
|
size: 29
|
|
|
|
|
},
|
2014-04-11 20:19:54 +00:00
|
|
|
|
{
|
2018-06-17 16:07:19 +00:00
|
|
|
|
type: 'fileButton',
|
|
|
|
|
id: 'uploadButton',
|
|
|
|
|
label: commonLang.uploadSubmit,
|
|
|
|
|
filebrowser: 'info:url',
|
|
|
|
|
'for': [ 'upload', 'upload' ]
|
|
|
|
|
} ]
|
|
|
|
|
},
|
2014-04-11 20:19:54 +00:00
|
|
|
|
{
|
2018-06-17 16:07:19 +00:00
|
|
|
|
id: 'advanced',
|
|
|
|
|
label: linkLang.advanced,
|
|
|
|
|
title: linkLang.advanced,
|
|
|
|
|
elements: [ {
|
|
|
|
|
type: 'vbox',
|
|
|
|
|
padding: 1,
|
|
|
|
|
children: [ {
|
|
|
|
|
type: 'hbox',
|
|
|
|
|
widths: [ '45%', '35%', '20%' ],
|
|
|
|
|
children: [ {
|
|
|
|
|
type: 'text',
|
|
|
|
|
id: 'advId',
|
|
|
|
|
requiredContent: 'a[id]',
|
|
|
|
|
label: linkLang.id,
|
|
|
|
|
setup: setupAdvParams,
|
|
|
|
|
commit: commitAdvParams
|
|
|
|
|
},
|
2014-04-11 20:19:54 +00:00
|
|
|
|
{
|
2018-06-17 16:07:19 +00:00
|
|
|
|
type: 'select',
|
|
|
|
|
id: 'advLangDir',
|
|
|
|
|
requiredContent: 'a[dir]',
|
|
|
|
|
label: linkLang.langDir,
|
|
|
|
|
'default': '',
|
|
|
|
|
style: 'width:110px',
|
|
|
|
|
items: [
|
|
|
|
|
[ commonLang.notSet, '' ],
|
|
|
|
|
[ linkLang.langDirLTR, 'ltr' ],
|
|
|
|
|
[ linkLang.langDirRTL, 'rtl' ]
|
2014-04-11 20:19:54 +00:00
|
|
|
|
],
|
2018-06-17 16:07:19 +00:00
|
|
|
|
setup: setupAdvParams,
|
|
|
|
|
commit: commitAdvParams
|
|
|
|
|
},
|
2014-04-11 20:19:54 +00:00
|
|
|
|
{
|
2018-06-17 16:07:19 +00:00
|
|
|
|
type: 'text',
|
|
|
|
|
id: 'advAccessKey',
|
|
|
|
|
requiredContent: 'a[accesskey]',
|
|
|
|
|
width: '80px',
|
|
|
|
|
label: linkLang.acccessKey,
|
|
|
|
|
maxLength: 1,
|
|
|
|
|
setup: setupAdvParams,
|
|
|
|
|
commit: commitAdvParams
|
|
|
|
|
|
|
|
|
|
} ]
|
|
|
|
|
},
|
2014-04-11 20:19:54 +00:00
|
|
|
|
{
|
2018-06-17 16:07:19 +00:00
|
|
|
|
type: 'hbox',
|
|
|
|
|
widths: [ '45%', '35%', '20%' ],
|
|
|
|
|
children: [ {
|
|
|
|
|
type: 'text',
|
|
|
|
|
label: linkLang.name,
|
|
|
|
|
id: 'advName',
|
|
|
|
|
requiredContent: 'a[name]',
|
|
|
|
|
setup: setupAdvParams,
|
|
|
|
|
commit: commitAdvParams
|
2014-04-11 20:19:54 +00:00
|
|
|
|
|
2018-06-17 16:07:19 +00:00
|
|
|
|
},
|
2014-04-11 20:19:54 +00:00
|
|
|
|
{
|
2018-06-17 16:07:19 +00:00
|
|
|
|
type: 'text',
|
|
|
|
|
label: linkLang.langCode,
|
|
|
|
|
id: 'advLangCode',
|
|
|
|
|
requiredContent: 'a[lang]',
|
|
|
|
|
width: '110px',
|
|
|
|
|
'default': '',
|
|
|
|
|
setup: setupAdvParams,
|
|
|
|
|
commit: commitAdvParams
|
2014-04-11 20:19:54 +00:00
|
|
|
|
|
2018-06-17 16:07:19 +00:00
|
|
|
|
},
|
2014-04-11 20:19:54 +00:00
|
|
|
|
{
|
2018-06-17 16:07:19 +00:00
|
|
|
|
type: 'text',
|
|
|
|
|
label: linkLang.tabIndex,
|
|
|
|
|
id: 'advTabIndex',
|
|
|
|
|
requiredContent: 'a[tabindex]',
|
|
|
|
|
width: '80px',
|
|
|
|
|
maxLength: 5,
|
|
|
|
|
setup: setupAdvParams,
|
|
|
|
|
commit: commitAdvParams
|
|
|
|
|
|
|
|
|
|
} ]
|
|
|
|
|
} ]
|
|
|
|
|
},
|
2014-04-11 20:19:54 +00:00
|
|
|
|
{
|
2018-06-17 16:07:19 +00:00
|
|
|
|
type: 'vbox',
|
|
|
|
|
padding: 1,
|
|
|
|
|
children: [ {
|
|
|
|
|
type: 'hbox',
|
|
|
|
|
widths: [ '45%', '55%' ],
|
|
|
|
|
children: [ {
|
|
|
|
|
type: 'text',
|
|
|
|
|
label: linkLang.advisoryTitle,
|
|
|
|
|
requiredContent: 'a[title]',
|
|
|
|
|
'default': '',
|
|
|
|
|
id: 'advTitle',
|
|
|
|
|
setup: setupAdvParams,
|
|
|
|
|
commit: commitAdvParams
|
2014-04-11 20:19:54 +00:00
|
|
|
|
|
2018-06-17 16:07:19 +00:00
|
|
|
|
},
|
2014-04-11 20:19:54 +00:00
|
|
|
|
{
|
2018-06-17 16:07:19 +00:00
|
|
|
|
type: 'text',
|
|
|
|
|
label: linkLang.advisoryContentType,
|
|
|
|
|
requiredContent: 'a[type]',
|
|
|
|
|
'default': '',
|
|
|
|
|
id: 'advContentType',
|
|
|
|
|
setup: setupAdvParams,
|
|
|
|
|
commit: commitAdvParams
|
2014-04-11 20:19:54 +00:00
|
|
|
|
|
2018-06-17 16:07:19 +00:00
|
|
|
|
} ]
|
|
|
|
|
},
|
2014-04-11 20:19:54 +00:00
|
|
|
|
{
|
2018-06-17 16:07:19 +00:00
|
|
|
|
type: 'hbox',
|
|
|
|
|
widths: [ '45%', '55%' ],
|
|
|
|
|
children: [ {
|
|
|
|
|
type: 'text',
|
|
|
|
|
label: linkLang.cssClasses,
|
|
|
|
|
requiredContent: 'a(cke-xyz)', // Random text like 'xyz' will check if all are allowed.
|
|
|
|
|
'default': '',
|
|
|
|
|
id: 'advCSSClasses',
|
|
|
|
|
setup: setupAdvParams,
|
|
|
|
|
commit: commitAdvParams
|
2014-04-11 20:19:54 +00:00
|
|
|
|
|
2018-06-17 16:07:19 +00:00
|
|
|
|
},
|
2014-04-11 20:19:54 +00:00
|
|
|
|
{
|
2018-06-17 16:07:19 +00:00
|
|
|
|
type: 'text',
|
|
|
|
|
label: linkLang.charset,
|
|
|
|
|
requiredContent: 'a[charset]',
|
|
|
|
|
'default': '',
|
|
|
|
|
id: 'advCharset',
|
|
|
|
|
setup: setupAdvParams,
|
|
|
|
|
commit: commitAdvParams
|
2014-04-11 20:19:54 +00:00
|
|
|
|
|
2018-06-17 16:07:19 +00:00
|
|
|
|
} ]
|
|
|
|
|
},
|
2014-04-11 20:19:54 +00:00
|
|
|
|
{
|
2018-06-17 16:07:19 +00:00
|
|
|
|
type: 'hbox',
|
|
|
|
|
widths: [ '45%', '55%' ],
|
|
|
|
|
children: [ {
|
|
|
|
|
type: 'text',
|
|
|
|
|
label: linkLang.rel,
|
|
|
|
|
requiredContent: 'a[rel]',
|
|
|
|
|
'default': '',
|
|
|
|
|
id: 'advRel',
|
|
|
|
|
setup: setupAdvParams,
|
|
|
|
|
commit: commitAdvParams
|
|
|
|
|
},
|
2014-04-11 20:19:54 +00:00
|
|
|
|
{
|
2018-06-17 16:07:19 +00:00
|
|
|
|
type: 'text',
|
|
|
|
|
label: linkLang.styles,
|
|
|
|
|
requiredContent: 'a{cke-xyz}', // Random text like 'xyz' will check if all are allowed.
|
|
|
|
|
'default': '',
|
|
|
|
|
id: 'advStyles',
|
|
|
|
|
validate: CKEDITOR.dialog.validate.inlineStyle( editor.lang.common.invalidInlineStyle ),
|
|
|
|
|
setup: setupAdvParams,
|
|
|
|
|
commit: commitAdvParams
|
|
|
|
|
} ]
|
2014-04-11 20:19:54 +00:00
|
|
|
|
},
|
2018-06-17 16:07:19 +00:00
|
|
|
|
{
|
|
|
|
|
type: 'hbox',
|
|
|
|
|
widths: [ '45%', '55%' ],
|
|
|
|
|
children: [ {
|
|
|
|
|
type: 'checkbox',
|
|
|
|
|
id: 'download',
|
|
|
|
|
requiredContent: 'a[download]',
|
|
|
|
|
label: linkLang.download,
|
|
|
|
|
setup: function( data ) {
|
|
|
|
|
if ( data.download !== undefined )
|
|
|
|
|
this.setValue( 'checked', 'checked' );
|
|
|
|
|
},
|
|
|
|
|
commit: function( data ) {
|
|
|
|
|
if ( this.getValue() ) {
|
|
|
|
|
data.download = this.getValue();
|
|
|
|
|
}
|
2014-04-11 20:19:54 +00:00
|
|
|
|
}
|
2018-06-17 16:07:19 +00:00
|
|
|
|
} ]
|
|
|
|
|
} ]
|
|
|
|
|
} ]
|
|
|
|
|
} ],
|
|
|
|
|
onShow: function() {
|
|
|
|
|
var editor = this.getParentEditor(),
|
|
|
|
|
selection = editor.getSelection(),
|
|
|
|
|
displayTextField = this.getContentElement( 'info', 'linkDisplayText' ).getElement().getParent().getParent(),
|
|
|
|
|
elements = plugin.getSelectedLink( editor, true ),
|
|
|
|
|
firstLink = elements[ 0 ] || null;
|
|
|
|
|
|
|
|
|
|
// Fill in all the relevant fields if there's already one link selected.
|
|
|
|
|
if ( firstLink && firstLink.hasAttribute( 'href' ) ) {
|
|
|
|
|
// Don't change selection if some element is already selected.
|
|
|
|
|
// For example - don't destroy fake selection.
|
|
|
|
|
if ( !selection.getSelectedElement() && !selection.isInTable() ) {
|
|
|
|
|
selection.selectElement( firstLink );
|
2014-04-11 20:19:54 +00:00
|
|
|
|
}
|
2018-06-17 16:07:19 +00:00
|
|
|
|
}
|
2014-04-11 20:19:54 +00:00
|
|
|
|
|
2018-06-17 16:07:19 +00:00
|
|
|
|
var data = plugin.parseLinkAttributes( editor, firstLink );
|
2014-04-11 20:19:54 +00:00
|
|
|
|
|
2018-06-17 16:07:19 +00:00
|
|
|
|
// Here we'll decide whether or not we want to show Display Text field.
|
|
|
|
|
if ( elements.length <= 1 && plugin.showDisplayTextForElement( firstLink, editor ) ) {
|
|
|
|
|
displayTextField.show();
|
2014-04-11 20:19:54 +00:00
|
|
|
|
} else {
|
2018-06-17 16:07:19 +00:00
|
|
|
|
displayTextField.hide();
|
2014-04-11 20:19:54 +00:00
|
|
|
|
}
|
|
|
|
|
|
2018-06-17 16:07:19 +00:00
|
|
|
|
// Record down the selected element in the dialog.
|
|
|
|
|
this._.selectedElements = elements;
|
2014-04-11 20:19:54 +00:00
|
|
|
|
|
2018-06-17 16:07:19 +00:00
|
|
|
|
this.setupContent( data );
|
|
|
|
|
},
|
|
|
|
|
onOk: function() {
|
|
|
|
|
var data = {};
|
2014-04-11 20:19:54 +00:00
|
|
|
|
|
2018-06-17 16:07:19 +00:00
|
|
|
|
// Collect data from fields.
|
|
|
|
|
this.commitContent( data );
|
2014-04-11 20:19:54 +00:00
|
|
|
|
|
2018-06-17 16:07:19 +00:00
|
|
|
|
if ( !this._.selectedElements.length ) {
|
|
|
|
|
insertLinksIntoSelection( editor, data );
|
|
|
|
|
} else {
|
|
|
|
|
editLinksInSelection( editor, this._.selectedElements, data );
|
2014-04-11 20:19:54 +00:00
|
|
|
|
|
2018-06-17 16:07:19 +00:00
|
|
|
|
delete this._.selectedElements;
|
2014-04-11 20:19:54 +00:00
|
|
|
|
}
|
2018-06-17 16:07:19 +00:00
|
|
|
|
},
|
|
|
|
|
onLoad: function() {
|
|
|
|
|
if ( !editor.config.linkShowAdvancedTab )
|
|
|
|
|
this.hidePage( 'advanced' ); //Hide Advanded tab.
|
2014-04-11 20:19:54 +00:00
|
|
|
|
|
2018-06-17 16:07:19 +00:00
|
|
|
|
if ( !editor.config.linkShowTargetTab )
|
|
|
|
|
this.hidePage( 'target' ); //Hide Target tab.
|
|
|
|
|
},
|
|
|
|
|
// Inital focus on 'url' field if link is of type URL.
|
|
|
|
|
onFocus: function() {
|
|
|
|
|
var linkType = this.getContentElement( 'info', 'linkType' ),
|
|
|
|
|
urlField;
|
|
|
|
|
|
|
|
|
|
if ( linkType && linkType.getValue() == 'url' ) {
|
|
|
|
|
urlField = this.getContentElement( 'info', 'url' );
|
|
|
|
|
urlField.select();
|
2014-04-11 20:19:54 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
2018-06-17 16:07:19 +00:00
|
|
|
|
};
|
|
|
|
|
} );
|
|
|
|
|
} )();
|
|
|
|
|
// jscs:disable maximumLineLength
|
2014-04-11 20:19:54 +00:00
|
|
|
|
/**
|
|
|
|
|
* The e-mail address anti-spam protection option. The protection will be
|
|
|
|
|
* applied when creating or modifying e-mail links through the editor interface.
|
|
|
|
|
*
|
|
|
|
|
* Two methods of protection can be chosen:
|
|
|
|
|
*
|
|
|
|
|
* 1. The e-mail parts (name, domain, and any other query string) are
|
|
|
|
|
* assembled into a function call pattern. Such function must be
|
|
|
|
|
* provided by the developer in the pages that will use the contents.
|
|
|
|
|
* 2. Only the e-mail address is obfuscated into a special string that
|
|
|
|
|
* has no meaning for humans or spam bots, but which is properly
|
|
|
|
|
* rendered and accepted by the browser.
|
|
|
|
|
*
|
|
|
|
|
* Both approaches require JavaScript to be enabled.
|
|
|
|
|
*
|
|
|
|
|
* // href="mailto:tester@ckeditor.com?subject=subject&body=body"
|
|
|
|
|
* config.emailProtection = '';
|
|
|
|
|
*
|
|
|
|
|
* // href="<a href=\"javascript:void(location.href=\'mailto:\'+String.fromCharCode(116,101,115,116,101,114,64,99,107,101,100,105,116,111,114,46,99,111,109)+\'?subject=subject&body=body\')\">e-mail</a>"
|
|
|
|
|
* config.emailProtection = 'encode';
|
|
|
|
|
*
|
|
|
|
|
* // href="javascript:mt('tester','ckeditor.com','subject','body')"
|
|
|
|
|
* config.emailProtection = 'mt(NAME,DOMAIN,SUBJECT,BODY)';
|
|
|
|
|
*
|
|
|
|
|
* @since 3.1
|
|
|
|
|
* @cfg {String} [emailProtection='' (empty string = disabled)]
|
|
|
|
|
* @member CKEDITOR.config
|
|
|
|
|
*/
|