/*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;
});