/*globals define, window*/
define('ckeditor/plugins/eplink/plugin', [
'jquery',
'ckeditor/ckeditor'
/**
* CKEditor Plugin eplink
* @param {Function} $ jQuery
* @param {Function} CKEDITOR CKEditor
* @return {Function} CKEditor
*/
], function ($, CKEDITOR) {
'use strict';
var typeName = 'linkpicker',
linkpicker,
currentEditor;
CKEDITOR.plugins.add('eplink', {
init: function (editor) {
// if the context menu plugin is loaded, register the menu items
if (editor.addMenuItems) {
editor.addMenuItems({
eplink: {
label: editor.lang.link.menu,
command: 'eplink',
group: 'link',
order: 1
}
});
// remove not used link entries from context menue
editor.removeMenuItem('link');
}
// if the "contextmenu" plugin is loaded, register the listeners.
if (editor.contextMenu) {
editor.contextMenu.addListener(function (element, selection) {
var anchor = CKEDITOR.plugins.link.tryRestoreFakeAnchor(editor, element) || CKEDITOR.plugins.link.getSelectedLink(editor),
menu = {};
if (!element || element.isReadOnly()) {
return null;
}
if (!anchor) {
return null;
}
if (anchor.getAttribute('href') && anchor.getChildCount()) {
menu = {
eplink: CKEDITOR.TRISTATE_OFF
};
}
return menu;
});
}
editor.addCommand('eplink', {
exec: function (ExecEditor) {
currentEditor = ExecEditor;
var selection = ExecEditor.getSelection(),
selectedText = selection.getSelectedText(),
selectedLink = CKEDITOR.plugins.link.getSelectedLink(ExecEditor),
selectedElem = selection.getSelectedElement(),
anchorData,
ckInstanceKey,
anchorArray = [],
frame = window,
selectedUrl,
imageSelected,
hrefNode;
if (selectedLink) {
selectedLink = $(selectedLink.$);
selectedUrl = selectedLink.attr('href');
selectedText = selectedLink.text();
if (selectedElem && selectedLink.children('img').length === 1) {
imageSelected = true;
}
// select link element
ExecEditor.getSelection().selectElement(CKEDITOR.plugins.link.getSelectedLink(ExecEditor));
} else if (selectedElem && selectedElem.getName() === "img") {
imageSelected = true;
}
// select parent node if image is selected (we need the <a> not the <img>)
hrefNode = imageSelected ? $(editor.getSelection().getStartElement().$).parent() : $(editor.getSelection().getStartElement().$);
// 1. We wrap the element because jQuery dies when anchorData contains only text
anchorData = '<div>';
// 2. We iterate over CKEDITOR.instances because the editor content is splitted
// over different instances.
// If we have a language dependent editor, we only get it's instance's anchors
if (/Native$|Translation/.test(ExecEditor.name) || ExecEditor.originalName && /Native$|Translation/.test(ExecEditor.originalName)) {
anchorData += ExecEditor.getData();
} else {
// get anchors from all instances
for (ckInstanceKey in CKEDITOR.instances) {
if (CKEDITOR.instances.hasOwnProperty(ckInstanceKey)) {
anchorData += CKEDITOR.instances[ckInstanceKey].getData();
}
}
}
anchorData += '</div>';
$(anchorData).find('a[name]').each(function () {
anchorArray.push($(this).attr('name'));
});
// check in which context we're requiring the linkpicker (are we inside an iframe?)
if (window.top !== window.self) {
try {
frame = window.top;
} catch (error) {}
}
// require linkpicker within correct context
frame.require(['de_epages/shop/linkpicker'], function (linkpicker) {
// opening linkpicker and setting options
linkpicker.open({
use_absolute: currentEditor.config.useAbsolute ? true : false,
use_ssl: false,
anchors: $.unique(anchorArray),
linkText: imageSelected ? selectedElem.getAttribute('alt') : selectedText,
linkUrl: selectedUrl || '',
is_linkTargetBlank: hrefNode.attr('target') === '_blank' ? true : false,
linkType: hrefNode.data('linkType'),
callback: function (title, url, newFlag, linkType) {
if (imageSelected) {
$(selectedElem.$).attr({
alt: title,
title: title
});
}
if (title && url) {
var linkContent = '<a data-type="' + typeName + '" href="' + url + '"' + (newFlag ? ' target="_blank"' : '') + ' data-link-type="' + linkType + '">' + (imageSelected ? selectedElem.$.outerHTML : title) + '</a>';
currentEditor.insertHtml(linkContent);
}
}
});
});
}
});
editor.ui.addButton('eplink', {
label: editor.lang.link.toolbar,
command: 'eplink',
className: 'cke_button_link',
icon: this.path + 'images/link.png'
});
editor.on('doubleclick', function (evt) {
// if sender of double click event was a linkpicker link -> open necessary dialog
if ($(editor.getSelection().getStartElement().$).data('type') === typeName) {
editor.execCommand('eplink');
delete evt.data.dialog;
}
});
}
});
return CKEDITOR;
});