'use strict';

var LinkHighlightEditor = function(options, ui, messages, services, vendor, styles_map, AUI, documentLibrarySelectorOptions) {

    var defaultOptions = {};
    var defaultUI = {};
    var defaultMessages = {};
    var defaultServices = {};

    var $ = false;
    var Liferay = false;
    var document = false;

    if(typeof vendor === 'object') {
        $ = vendor.jQuery;
        Liferay = vendor.Liferay;
        document = vendor.document;
    }

    if (typeof options === 'object') {
        options = $.extend(defaultOptions, options);
    } else {
        options = defaultOptions;
    }

    if (typeof ui === 'object') {
        ui = $.extend(defaultUI, ui);
    } else {
        ui = defaultUI;
    }

    if (typeof messages === 'object') {
        messages = $.extend(defaultMessages, messages);
    } else {
        messages = defaultMessages;
    }

    if (typeof services === 'object') {
        services = $.extend(defaultServices, services);
    } else {
        services = defaultServices;
    }

    var initFormValidation = function() {
        $(ui.elements.form_linkHighlight).validate(options.form_validator);
    };

    var reInit = function() {
        initFormValidation();
    };

    var isFormValid = function(formId) {
        return $(formId).valid();
    };

    var isNull = function(value) {
        return typeof value === "undefined" || value === "";
    };

    var scrollTop = function() {
        $(ui.elements.linkHighlightEditorBody).animate({
            scrollTop: $(ui.elements.btnViewAddNewLinkForm).offset().top - $(ui.elements.linkHighlightEditorBody).offset().top + $(ui.elements.linkHighlightEditorBody).scrollTop()
        }, 'slow');
    };

    var hideNoStyleSelectedMessage = function() {
        if ($(ui.elements.noStyleSelectedMessage).length > 0) {
            $(ui.elements.noStyleSelectedMessage).hide();
        }
    };

    var showTitleMessage = function(message) {
        $(ui.elements.titleMessageContainer).empty().html(message).show(function() {
            setTimeout(function() {
                $(ui.elements.titleMessageContainer).fadeOut('slow');
            }, 5000);
        });
    };

    var showErrorTitleMessage = function(message) {
        $(ui.elements.titleMessageContainerError).empty().html(message).show(function() {
            setTimeout(function() {
                $(ui.elements.titleMessageContainerError).fadeOut('slow');
            }, 5000);
        });
    };

    var hidePreviewImage = function() {
        $(ui.elements.previewImage).attr('src','');
        $(ui.elements.previewImage).hide();
    };

    var showPreviewImage = function (imageUrl) {

        if (!isNull(imageUrl)) {
            $(ui.elements.previewImage).attr('src', imageUrl);
            $(ui.elements.previewImage).show();
            $(ui.elements.input_imageUrl).val(imageUrl);
        } else {
            $(ui.elements.previewImage).attr('src', '');
            $(ui.elements.previewImage).hide();
            $(ui.elements.input_imageUrl).val("");
        }
    };

    var updateDetailsView = function(displayStyle) {

        var styleData = styles_map[displayStyle];

        $(ui.elements.detailsLinkStyleTitle).text(styleData.title);
        $(ui.elements.detailsLinkStyleDescription).text(styleData.detailed_description);
        $(ui.elements.detailsLinkStyleSize).text(styleData.preferred_size);
        $(ui.elements.detailsLinkStyleImage).attr('src', styleData.preview_image_filename);
        /** $(ui.elements.detailsLinkStyleLocation).text(styleData.preferred_location); **/
    };

    var handleLinkStylePreferencesToggle = function(displayStyle) {

        var style = styles_map[displayStyle];

        if(style.title_required === "true") {
            $(ui.elements.input_title_container).show();
            $(ui.elements.input_title).prop("required", true);
        } else {
            $(ui.elements.input_title_container).hide();
            $(ui.elements.input_title).prop("required", false);
        }

        if(style.link_required === "true") {
            $(ui.elements.input_href_container).show();
            $(ui.elements.input_href).prop("required", true);
        } else {
            $(ui.elements.input_href_container).hide();
            $(ui.elements.input_href).prop("required", false);
        }

        if(style.linkText_required === "true") {
            $(ui.elements.input_linkText_container).show();
            $(ui.elements.input_linkText).prop("required", true);
        } else {
            $(ui.elements.input_linkText_container).hide();
            $(ui.elements.input_linkText).prop("required", false);
        }

        if(style.text === "true") {
            $(ui.elements.input_textContent_container).show();

            if(style.text_not_required === "false") {
                var text = $(ui.elements.input_textContent_label).attr('data-text') + " *";
                $(ui.elements.input_textContent_label).text(text);
                $(ui.elements.input_textContent).prop("required", true);
            }
        } else {
            $(ui.elements.input_textContent_container).hide();
            $(ui.elements.input_textContent).prop("required", false);
        }

        if(style.picture_required === "true") {
            $(ui.elements.input_imageUrl_container).show();
            $(ui.elements.input_imageUrl).prop("required", true);
            $(ui.elements.input_altText_container).show();
            $(ui.elements.input_altText).prop("required", true);
        } else {
            $(ui.elements.input_imageUrl_container).hide();
            $(ui.elements.input_imageUrl).prop("required", false);
            $(ui.elements.input_altText_container).hide();
            $(ui.elements.input_altText).prop("required", false);
        }
        $(ui.elements.timing).show();
    };

    var showMessage = function( message ) {
        $(ui.elements.messageContainer).empty().html(message).show(function(){
            setTimeout(function() {
                $(ui.elements.messageContainer).fadeOut('slow');
            }, 5000);
        });
    };
    

    var htmlDecode = function(value) {
        if (value) {
            return $('<div />').html(value).text();
        }
        else {
            return '';
        }
    };

    var confirmDelete = function() {
        return confirm(htmlDecode(messages.confirm_delete_highlight));
    };

    var clear = {
        inputs: function() {
            $(ui.elements.input_highlightId).val("");
            $(ui.elements.input_href).val("https://");
            $(ui.elements.input_name).val("");
            $(ui.elements.input_title).val("");
            $(ui.elements.input_textContent).val("");
            $(ui.elements.input_targetBlank).val("false");
            $(ui.elements.input_imageUrl).val("");
            $(ui.elements.input_altText).val("");
            $(ui.elements.input_linkText).val("");
            $(ui.elements.input_startDate).val("");
            $(ui.elements.input_endDate).val("");

            $(ui.elements.input_name).prop('disabled', false);
            $(ui.elements.input_title).prop('disabled', false);
            $(ui.elements.input_href).prop('disabled', false);
            $(ui.elements.input_textContent).prop('disabled', false);
            $(ui.elements.input_targetBlank).prop('disabled', false);
            $(ui.elements.input_imageUrl).prop('disabled', false);
            $(ui.elements.input_altText).prop('disabled', false);
            $(ui.elements.input_startDate).prop('disabled', false);
            $(ui.elements.input_endDate).prop('disabled', false);
            $(ui.elements.input_linkText).prop('disabled', false);
            $(ui.elements.btnSelectImage).prop('disabled', false);

            $(ui.elements.linkEditorOptions).show();

            $(ui.elements.input_common).prop('checked', false);
            $(ui.elements.input_localCopy).closest('label').hide();

            hidePreviewImage();
        }
    };
    
    var permissions = {
    		addNew: function() {
    			if (options.hasRightsToCommon === "false") {
    				$(ui.elements.input_common).prop('disabled', true);
            }
            else {
            		$(ui.elements.input_common).prop('disabled', false);
            }
    		},
    		selectCommon: function() {
        		$(ui.elements.input_common).prop('disabled', false);
    		}
    }

    var collect = {
        data: {
            linkHighlight: {
                add: function (isCommon, startDate, endDate) {
                    return {
                        groupId: options.groupId,
                        portletInstanceId: options.portletInstanceId,
                        locale: options.languageId,
                        common: isCommon,
                        href: $(ui.elements.input_href).val(),
                        name: $(ui.elements.input_name).val(),
                        title: $(ui.elements.input_title).val(),
                        textContent: $(ui.elements.input_textContent).val(),
                        imageUrl: $(ui.elements.input_imageUrl).val(),
                        altText: $(ui.elements.input_altText).val(),
                        linkText: $(ui.elements.input_linkText).val(),
                        targetBlank: $(ui.elements.input_targetBlank).val()
                    };
                },
                update: function (highlightId, isCommon, startDate, endDate) {
                    return {
                        companyId: options.companyId,
                        groupId: options.groupId,
                        portletInstanceId: options.portletInstanceId,
                        highLightId: highlightId,
                        common: isCommon,
                        locale: options.languageId,
                        href: $(ui.elements.input_href).val(),
                        name: $(ui.elements.input_name).val(),
                        title: $(ui.elements.input_title).val(),
                        textContent: $(ui.elements.input_textContent).val(),
                        imageUrl: $(ui.elements.input_imageUrl).val(),
                        altText: $(ui.elements.input_altText).val(),
                        linkText: $(ui.elements.input_linkText).val(),
                        targetBlank: $(ui.elements.input_targetBlank).val(),
                    };
                },
                find_by_common_and_locale: function (min, max) {
                    return {
                        common: true,
                        locale: options.languageId,
                        min: min,
                        max: max
                    };
                }
            },
            linkHighlightRelationalField: {
                add: function (highlightId, startDate, endDate) {
                    return {
                        portletInstanceId: options.portletInstanceId,
                        groupId: options.groupId,
                        companyId: options.companyId,
                        highlightId: highlightId,
                        plid: options.plid,
                        locale: options.languageId,
                        startDate: startDate,
                        endDate: endDate
                    };
                },
                update: function (relationalFieldId, highlightId, startDate, endDate) {
                    return {
                        portletInstanceId: options.portletInstanceId,
                        highlightId: highlightId,
                        relationalFieldId: relationalFieldId,
                        startDate: startDate,
                        endDate: endDate
                    };
                },
                find: function(highlightId) {
                    return {
                        highlightId: highlightId
                    }
                }
            },
            linkHighlightPreferences: {
                update: function (displayStyle, title) {
                    return {
                        plid: options.plid,
                        locale: options.languageId,
                        groupId: options.groupId,
                        portletInstanceId: options.portletInstanceId,
                        displayStyle: displayStyle,
                        title: title
                    };
                }
            }
        }
    };

    var actions = {
        linkHighlight: {
            get: function(min, max, callback) {

                Liferay.Service(
                    services.linkHighlight.FIND_BY_COMMON_AND_LOCALE,
                    collect.data.linkHighlight.find_by_common_and_locale(min, max),
                    function(data){
                        $(ui.elements.commonLinkHighlightWrapper).empty();

                        $(data).each(function(index, value) {
                            var commonLink = value;
                            var template = ui.templates.common_link_highlight(commonLink);
                            $(ui.elements.commonLinkHighlightWrapper).append(template);
                        });
                        reInit();
                        /*
                        var nextMax = max+(max-min);
                        var nextMin = max;
                        var prevMax = min;
                        var prevMin = min-(max-min);

                        var pagingElements = "";

                        pagingElements += min > 1 ? ui.templates.paging_prev_page : "";
                        pagingElements += max < options.totalHighLights ? ui.templates.paging_next_page : "";

                        $(ui.elements.commonLinkHighlightWrapper).append("<li class='link-highlight__pagination'>"+pagingElements+"</li>");

                        $(document).on('click', ui.elements.pageNext, function() {
                            actions.linkHighlight.get(nextMin, nextMax);
                        });

                        $(document).on('click', ui.elements.pagePrev, function() {
                            actions.linkHighlight.get(prevMin, prevMax);
                        });
                        */
                        if(!isNull(callback)) {
                            callback();
                        }
                    }
                );
            },
            add: function (isCommon, startDate, endDate) {

                Liferay.Service(
                    services.linkHighlight.ADD_NEW,
                    collect.data.linkHighlight.add(isCommon),
                    function (data) {

                        var highLightLink = data;
                        if(!startDate)
                        {
                            startDate = moment().format('DD.MM.YYYY');
                        }
                        Liferay.Service(
                            services.linkHighlightRelationalField.ADD_NEW,
                            collect.data.linkHighlightRelationalField.add(highLightLink.highlightId, startDate, endDate),
                            function (data) {
                                showMessage(messages.saved_link_highlight);
                                var template = ui.templates.add_link_highlight(highLightLink, data);
                                $(ui.elements.linkHighlightEntryWrapper).append(template);

                                if (isCommon) {
                                    actions.linkHighlight.get(-1, -1);
                                    //actions.linkHighlight.get(0, options.totalHighLights + 1);
                                }

                                reInit();
                                scrollTop();
                            });
                    });
                clear.inputs();
                $(ui.elements.linkHighlightFormWrapper).hide();
                $(ui.elements.linkHighlightEntryContainer).show();
            },
            update: function (highlightId, isCommon, startDate, endDate) {

                var template;
                var relationalField;
                var relationalFieldId = $(ui.elements.input_relationalFieldId).val();
                Liferay.Service(
                    services.linkHighlight.UPDATE,
                    collect.data.linkHighlight.update(highlightId, isCommon),
                    function (data) {
                        var highLightData = data;

                        if(!startDate)
                        {
                            startDate = moment().format('DD.MM.YYYY');
                        }

                        if (isNull(relationalFieldId)) {

                            Liferay.Service(
                                services.linkHighlightRelationalField.ADD_NEW,
                                collect.data.linkHighlightRelationalField.add(highlightId, startDate, endDate),
                                function (data) {
                                    template = ui.templates.add_link_highlight(highLightData, data);
                                    $(ui.elements.linkHighlightEntryWrapper).append(template);
                                    reInit();
                                }
                            );
                        } else {
                            Liferay.Service(
                                services.linkHighlightRelationalField.UPDATE,
                                collect.data.linkHighlightRelationalField.update(relationalFieldId, highlightId, startDate, endDate),
                                function(data){

                                    relationalField = data;

                                    template = ui.templates.update_link_highlight(highLightData, relationalField);

                                    showMessage(messages.saved_link_highlight);
                                    $(ui.elements.highlightLinkIdPrefix + highLightData.highlightId).empty();
                                    $(ui.elements.highlightLinkIdPrefix + highLightData.highlightId).html(template);
                                    reInit();
                                    scrollTop();
                                }
                            );
                        }
                        if ($(ui.elements.input_original_isCommon) === 'false') {
                            if (isCommon) {
                                actions.linkHighlight.get(0, options.totalHighLights + 1, function () {
                                    reInit();
                                });
                            }
                        }


                    }
                );
                clear.inputs();
                $(ui.elements.linkHighlightFormWrapper).hide();
                $(ui.elements.linkHighlightEntryContainer).show();
            },
            delete: function(element) {
                if (confirmDelete()) {

                    Liferay.Service(
                        services.linkHighlight.DELETE,
                        { highLightId: $(element).parent().parent().attr('highlightId') },
                        function () {

                            Liferay.Service(
                                services.linkHighlightRelationalField.DELETE,
                                {relationalFieldId: $(element).parent().parent().attr('relationalFieldId')}
                            );

                            showMessage(messages.text_link_highlight_deleted);
                            $(element).parent().parent().remove();
                        }
                    );
                }
            }
        },
        linkHighlightRelationalField: {
            add: function() {

            },
            update: function() {

            },
            delete: function() {

            }
        },
        linkHighlightPreferences: {
            update: function(element, displayStyle, highlightTitle, updatedTitle) {

                if (isNull(highlightTitle)){highlightTitle = ''; }

                if(highlightTitle.length > 75) {
                    return false;
                }

                Liferay.Service(
                    services.linkHighlightPreferences.UPDATE,
                    collect.data.linkHighlightPreferences.update(displayStyle, highlightTitle),
                    function(){
                        hideNoStyleSelectedMessage();
                        if (updatedTitle === false) {
                            $(ui.elements.selectedDisplayStyleSelector).removeClass('selected');
                            element.addClass('selected');
                            updateDetailsView(displayStyle);
                            handleLinkStylePreferencesToggle(displayStyle);
                        }
                    }
                );
                return true;
            }
        }
    };

    var edit = function(elementId) {
        var name = $(elementId).closest('div').children(ui.elements.input_original_name).val();
        var title = $(elementId).closest('div').children(ui.elements.input_original_title).val();
        var hrefVal = $(elementId).closest('div').children(ui.elements.input_original_href).val();
        var textContent = $(elementId).closest('div').children(ui.elements.input_original_textContent).val();
        var linkText = $(elementId).closest('div').children(ui.elements.input_original_linkText).val();
        var targetBlank = $(elementId).closest('div').children(ui.elements.input_original_targetBlank).val();
        var imageUrl = $(elementId).closest('div').children(ui.elements.input_original_imageUrl).val();
        var altText = $(elementId).closest('div').children(ui.elements.input_original_altText).val();
        var isCommon = $(elementId).closest('div').children(ui.elements.input_original_common).val();
        var startDate = $(elementId).closest('div').children(ui.elements.input_original_startDate).val();
        var endDate = $(elementId).closest('div').children(ui.elements.input_original_endDate).val();

        $(ui.elements.input_highlightId).val($(elementId).parent().parent().attr('highlightId'));
        $(ui.elements.input_relationalFieldId).val($(elementId).parent().parent().attr('relationalFieldId'));
        $(ui.elements.input_name).val(name);
        $(ui.elements.input_title).val(title);
        $(ui.elements.input_href).val(hrefVal);
        $(ui.elements.input_textContent).val(textContent);
        $(ui.elements.input_targetBlank).val(targetBlank);
        $(ui.elements.input_imageUrl).val(imageUrl);
        $(ui.elements.input_altText).val(altText);
        $(ui.elements.input_linkText).val(linkText);
        $(ui.elements.input_common).val(isCommon);
        $(ui.elements.input_startDate).val(startDate);
        $(ui.elements.input_endDate).val(endDate);


        if (options.hasRightsToCommon === "false" && isCommon === 'true') {
            $(ui.elements.input_name).prop('disabled', true);
            $(ui.elements.input_title).prop('disabled', true);
            $(ui.elements.input_href).prop('disabled', true);
            $(ui.elements.input_textContent).prop('disabled', true);
            $(ui.elements.input_targetBlank).prop('disabled', true);
            $(ui.elements.input_imageUrl).prop('disabled', true);
            $(ui.elements.input_altText).prop('disabled', true);
            $(ui.elements.input_linkText).prop('disabled', true);
            $(ui.elements.btnSelectImage).prop('disabled', true);
            $(ui.elements.input_startDate).prop('disabled', true);
            $(ui.elements.input_endDate).prop('disabled', true);
        }


        if(isCommon === 'true') {
            $(ui.elements.input_localCopy).prop('checked', false);
            $(ui.elements.input_common).prop('checked', true);
            $(ui.elements.input_localCopy).closest('label').show();
        } else {
            //$(ui.elements.input_common).prop('checked', true);
            $(ui.elements.input_localCopy).prop('checked', false);
            $(ui.elements.input_localCopy).closest('label').hide();
        }

        if (options.hasRightsToCommon === "false") {
            $(ui.elements.input_common).prop('disabled', true);
        } else {
            $(ui.elements.input_common).prop('disabled', false);
        }

        if (!isNull($(ui.elements.previewImage))) {
            showPreviewImage($(ui.elements.input_imageUrl).val(), $(ui.elements.previewImage));
        }

        $(ui.elements.linkEditorOptions).hide();
    };

    var selectCommon = function (elementId) {

        $(ui.elements.commonLinkHighlightFormWrapper).hide();
        $(ui.elements.linkHighlightFormAddNew).show();
        permissions.selectCommon();

        var name = $(elementId).closest('div').children(ui.elements.input_common_name).val();
        var title = $(elementId).closest('div').children(ui.elements.input_common_title).val();
        var hrefVal = $(elementId).closest('div').children(ui.elements.input_common_href).val();
        var textContent = $(elementId).closest('div').children(ui.elements.input_common_textContent).val();
        var linkText = $(elementId).closest('div').children(ui.elements.input_common_linkText).val();
        var targetBlank = $(elementId).closest('div').children(ui.elements.input_common_targetBlank).val();
        var imageUrl = $(elementId).closest('div').children(ui.elements.input_common_imageUrl).val();
        var altText = $(elementId).closest('div').children(ui.elements.input_common_altText).val();
        var startDate = $(elementId).closest('div').children(ui.elements.input_common_startDate).val();
        var endDate = $(elementId).closest('div').children(ui.elements.input_common_endDate).val();

        $(ui.elements.input_highlightId).val($(elementId).parent().parent().attr('highlightId'));
        $(ui.elements.input_relationalFieldId).val($(elementId).parent().parent().attr('relationalFieldId'));
        $(ui.elements.input_name).val(name);
        $(ui.elements.input_title).val(title);
        $(ui.elements.input_href).val(hrefVal);
        $(ui.elements.input_textContent).val(textContent);
        $(ui.elements.input_targetBlank).val(targetBlank);
        $(ui.elements.input_imageUrl).val(imageUrl);
        $(ui.elements.input_altText).val(altText);
        $(ui.elements.input_linkText).val(linkText);
        $(ui.elements.input_startDate).val(startDate);
        $(ui.elements.input_endDate).val(endDate);

        if (options.hasRightsToCommon === "false") {
            $(ui.elements.input_name).prop('disabled', true);
            $(ui.elements.input_title).prop('disabled', true);
            $(ui.elements.input_href).prop('disabled', true);
            $(ui.elements.input_textContent).prop('disabled', true);
            $(ui.elements.input_targetBlank).prop('disabled', true);
            $(ui.elements.input_imageUrl).prop('disabled', true);
            $(ui.elements.input_altText).prop('disabled', true);
            $(ui.elements.input_linkText).prop('disabled', true);
            $(ui.elements.btnSelectImage).prop('disabled', true);
            $(ui.elements.input_startDate).prop('disabled', true);
            $(ui.elements.input_endDate).prop('disabled', true);
            $(ui.elements.input_common).prop('disabled', true);
        } else {
            $(ui.elements.input_common).prop('disabled', false);
        }

        $(ui.elements.input_common).prop('checked', true);
        $(ui.elements.input_localCopy).closest('label').show();
        $(ui.elements.input_localCopy).prop('checked', false);


        if (!isNull($(ui.elements.previewImage))) {
            showPreviewImage($(ui.elements.input_imageUrl).val(), $(ui.elements.previewImage));
        }
    };

    var deleteCommon = function(element) {
        if(confirmDelete())
        {
            Liferay.Service(
                services.linkHighlightRelationalField.DELETE,
                { relationalFieldId: $(element).parent().parent().attr('relationalFieldId') }
            );
            showMessage(messages.text_link_highlight_deleted);
            $(element).parent().parent().remove();
        }
    };

    var deleteAllCommon = function(element) {
        if (confirmDelete()) {

            Liferay.Service(
                services.linkHighlight.DELETE,
                { highLightId: $(element).parent().parent().attr('highlightId') },
                function() {
                    Liferay.Service(
                        services.linkHighlightRelationalField.DELETE_ALL_BY_LINK_HIGHLIGHT_ID,
                        { highLightId: $(element).parent().parent().attr('highlightId') }
                    );
                    showMessage(messages.text_link_highlight_deleted);
                    $(element).parent().parent().remove();
                }
            );
        }
    };

    var openFileBrowser = function() {

        Liferay.Util.openSelectionModal({
            onSelect: function (selectedItem) {
                const value = JSON.parse(selectedItem.value);

                if (value) {
                    const itemSrc = value.url;

                    //var imageUrlElement = document.getElementById("<portlet:namespace/>imageUrl");
                    //imageUrlElement.value = itemSrc;

                    showPreviewImage(itemSrc);
                }
            },
            selectEventName: options.portletNamespace + 'EditorselectItem',
            title: documentLibrarySelectorOptions.title,
            url: options.urls.fileSelectorURL
        });

        /*
    	AUI().use("liferay-item-selector-dialog",
            function(A){
    	    var itemSelectorDialog = new A.LiferayItemSelectorDialog({
    			eventName: options.portletNamespace + 'EditorselectItem',
                on: {
    				selectedItemChange: function(event) {
    					var selectedItem = event.newVal;

    					if (selectedItem) {
    						var itemValue = JSON.parse(
    							selectedItem.value
    						);
    						showPreviewImage(itemValue.url);
    					}
    				}
    			},
                title: documentLibrarySelectorOptions.title,
    			url: options.urls.fileSelectorURL

    		});
            itemSelectorDialog.open();
        });
         */
    };

    /** ================================ INIT ================================ **/

    var initDOMElements = function( ){

        // Add new linkhighlight button
        $(document).on('click', ui.elements.btnViewAddNewLinkForm, function() {
            clear.inputs();
            permissions.addNew();
            $(ui.elements.btnShowAddNewLinksForm).prop("checked", true);
            $(ui.elements.btnSave).empty().html(messages.btn_text_save);
            $(ui.elements.linkFormTitle).empty();
            $(ui.elements.linkFormTitle).append(messages.text_link_highlight_add);
            $(ui.elements.commonLinkHighlightFormWrapper).hide();
            $(ui.elements.linkHighlightFormWrapper).show();
            $(ui.elements.linkHighlightEntryContainer).hide();

            scrollTop();
        });

        // Go back from add new link
        $(document).on('click', ui.elements.btnBack, function() {
            clear.inputs();
            $(ui.elements.linkHighlightFormWrapper).hide();
            $(ui.elements.linkHighlightEntryContainer).show();
        });

        // Add new common linkhighlight
        $(ui.elements.btnShowAddNewLinksForm).change(function() {
            if ($(ui.elements.btnShowAddNewLinksForm).prop("checked", true)) {
                $(ui.elements.commonLinkHighlightFormWrapper).hide();
                clear.inputs();
                $(ui.elements.linkHighlightFormAddNew).show();
                scrollTop();
            }
        });
        $(ui.elements.btnShowCommonLinksForm).change(function() {
            if ($(ui.elements.btnShowCommonLinksForm).prop("checked", true)) {
                $(ui.elements.linkHighlightFormAddNew).hide();
                $(ui.elements.commonLinkHighlightFormWrapper).show();
                // Set 10 items to show
                $(ui.elements.btnSingleSelector).removeClass('active');
                $(ui.elements.btnShowTen).addClass('active');
                actions.linkHighlight.get(-1, -1);
                scrollTop();
            }
        });
        $(ui.elements.btnShowDefaultLinksForm).change(function() {
            if ($(ui.elements.btnShowDefaultLinksForm).prop("checked", true)) {
                $(ui.elements.commonLinkHighlightFormWrapper).hide();
                $(ui.elements.linkHighlightFormAddNew).hide();
                scrollTop();
            }
        });

        // Delete button
        $(document).on('click', ui.elements.btnDelete, function() {
            var element = $(this);
            actions.linkHighlight.delete(element);
        });

        // Select common button
        $(document).on('click', ui.elements.btnChooseCommon, function() {
            var element = $(this);
            selectCommon(element);
        });

        // Delete common button
        $(document).on('click', ui.elements.btnDeleteCommon, function() {
            var element = $(this);
            deleteCommon(element);
        });

        // Delete all common button
        $(document).on('click', ui.elements.btnDeleteAllCommon, function() {
            var element = $(this);
            deleteAllCommon(element);
        });

        // Show 10 button
        $(document).on('click', ui.elements.btnShowTen, function() {
            $(ui.elements.btnSingleSelector).removeClass('active');
            $(this).addClass('active');
            actions.linkHighlight.get(0, 10);
        });

        // Show 50 button
        $(document).on('click', ui.elements.btnShowFifty, function() {
            $(ui.elements.btnSingleSelector).removeClass('active');
            $(this).addClass('active');
            actions.linkHighlight.get(0, 50);
        });

        // Show 100 button
        $(document).on('click', ui.elements.btnShowHundred, function() {
            $(ui.elements.btnSingleSelector).removeClass('active');
            $(this).addClass('active');
            actions.linkHighlight.get(0, 100);
        });

        // Filter shown items
        $(document).on('focus', ui.elements.input_name, function() {
            var value = $(this).val().toLowerCase();
            if (value !== '') {
                actions.linkHighlight.get(0, options.totalHighLights + 1);
            };
        });
        $(document).on('keyup', ui.elements.input_name, function() {
            var value = $(this).val().toLowerCase();
            $(ui.elements.commonLinkHighlightWrapper + ' li').filter(function() {
                $(this).toggle($(this).text().toLowerCase().indexOf(value) > -1)
            });
            if (value === '') {
                actions.linkHighlight.get(-1, -1);
            };
        });

        // Save button
        $(document).on('click', ui.elements.btnSave, function() {
             if(isFormValid(ui.elements.form_linkHighlight)) {

                 var highlightId = $(ui.elements.input_highlightId).val();
                 var isCommon = $(ui.elements.input_common).prop('checked') ? true : false;
                 var isLocalCopy = $(ui.elements.input_localCopy).prop('checked') ? true : false;


                 var startDate = $(ui.elements.input_startDate).val();
                 var endDate = $(ui.elements.input_endDate).val();
                 if (isNull(highlightId)) {
                     actions.linkHighlight.add(isCommon, startDate, endDate);
                 } else if (isLocalCopy && !isCommon) {
                     actions.linkHighlight.add(false, startDate, endDate);
                 }
                 else {
                     actions.linkHighlight.update(highlightId, isCommon, startDate, endDate);
                 }

                 $(ui.elements.activeStyle).removeClass(ui.classes.activeStyle);
                 $(ui.elements.linkHighlightHelp).remove();
                 $(ui.elements.infoScreen).remove();
                 $(ui.elements.linkHighlightHeader).empty().html(messages.link_highlight_links);

                 if ($(ui.elements.btnViewAddNewLinkForm).is(':hidden')) {
                     $(ui.elements.btnViewAddNewLinkForm).show();
                 }
                }

        });

        // Edit button
        $(document).on('click', ui.elements.btnEdit, function() {
            var element = $(this);

            clear.inputs();
            $(ui.elements.highlightEntry).removeClass(ui.classes.activeStyle);
            element.parent().parent().addClass(ui.classes.activeStyle);
            edit(element);

            $(ui.elements.linkFormTitle).empty();
            $(ui.elements.linkFormTitle).append(messages.text_link_highlight_edit);

            $(ui.elements.btnSave).empty().html(messages.text_link_highlight_save);
            $(ui.elements.linkHighlightFormWrapper).show();
            $(ui.elements.commonLinkHighlightFormWrapper).hide();
            $(ui.elements.linkHighlightEntryContainer).hide();

            initFormValidation();

            scrollTop();
        });

        // Save title button
        $(document).on('click', ui.elements.btnSaveTitle, function() {
            var element = $('.active_style');
            var highlightTitle = $(ui.elements.input_highlightTitle).val();
            var updatedTitle = true;
            var displayStyle = element.attr('displayStyle');

            if(actions.linkHighlightPreferences.update(element, displayStyle, highlightTitle, updatedTitle)){
                showTitleMessage(messages.text_link_highlight_title_saved);
            }
            else{
                showErrorTitleMessage(messages.text_link_highlight_title_long);
            }
        });

        // Save title on unfocus
        $(document).on('focusout', ui.elements.input_highlightTitle, function() {
            var element = $('.active_style');
            var highlightTitle = $(ui.elements.input_highlightTitle).val();
            var updatedTitle = true;
            var displayStyle = element.attr('displayStyle');

            if(actions.linkHighlightPreferences.update(element, displayStyle, highlightTitle, updatedTitle)){
                showTitleMessage(messages.text_link_highlight_title_saved);
            }
            else{
                showErrorTitleMessage(messages.text_link_highlight_title_long);
            }
        });

        // Display styles selector
        $(document).on('click', ui.elements.displayStylesSelector, function() {
            var element = $(this);
            var highlightTitle = $(ui.elements.input_highlightTitle).val();
            var updatedTitle = false;
            var displayStyle = element.attr('displayStyle');
            var infoScreen = $(ui.elements.infoScreen);
            if(infoScreen.length) {
                $(ui.elements.btnQuickLinkAddNew).show();
                $(ui.elements.btnQuickLinkToSettingsTab).hide();
            }

            actions.linkHighlightPreferences.update(element, displayStyle, highlightTitle, updatedTitle);
        });

        $(document).on('click', ui.elements.btnQuickLinkToSettingsTab, function() {
            $('#nav-one-tab').tab('show');
        });

        $(document).on('click', ui.elements.btnClear, function() {
            clear.inputs();
        });

        // Change style button
        $(document).on('click', ui.elements.btnChangeChosenStyle, function() {
            $(ui.elements.linkHighlightStyleWrapper).toggle();
            $(".selected-link-highlight").toggleClass("minimized");
            $(this).find('span').toggleClass('glyphicon-plus');
            $(this).find('span').toggleClass('glyphicon-minus');
        });
        
        // Toggle checkboxes
        $(document).on('click', ui.elements.input_common, function() {
            if (this.checked) {
                $(ui.elements.input_localCopy).prop('checked', false);
            } else {
                	$(ui.elements.input_localCopy).prop('checked', true);
            }
          });

        $(document).on('click', ui.elements.input_localCopy, function() {
            if (this.checked) {
                $(ui.elements.input_common).prop('checked', false);
            } else {
                $(ui.elements.input_common).prop('checked', true);
            }
        });

        $(document).on('click', ui.elements.btnSelectImage, openFileBrowser);
    };


    var initSortableElement = function() {

        $(ui.classes.sortable).sortable({
            update: function( event, ui ) {
                Liferay.Service(services.linkHighlightRelationalField.UPDATE_ORDINAL,
                    {
                        relationalFieldId: ui.item.attr('relationalFieldId'),
                        newOrdinal: ui.item.index(),
                        locale: options.languageId
                    }
                );
            }
        });

        $(ui.classes.sortable).disableSelection();
    };

    var initialize = function() {
        initDOMElements();
        initFormValidation();
        initSortableElement();
        reInit();


        $(ui.elements.linkHighLightEditorContainer).appendTo('body');

        $(ui.elements.linkHighLightEditorContainer).modal('show');
        $(ui.elements.linkHighLightEditorContainer).on('hidden.bs.modal', function () {
            location.reload();
        });
    };

    return {
        initialize: initialize,
        selectDocumentLibraryCallback: showPreviewImage
    };
};
