﻿/*-------------------------------------------------------
	@description: jQuery-Plugin für Favoriten
---------------------------------------------------------*/

(function ($) {

    var opaccFavoritePlugin = function (options, selector) {
        this.init({
            favoriteEmptyShowSelector: '.favorite-empty-show',
            favoriteEmptyHideSelector: '.favorite-empty-hide',
            favoriteListSelector: '.favoriteList',
            newListNameSelector: '.f-favorite-multi-newlist input',
            quantityInfoSelectorSingle: '[data-asyncfavorite="saldocitemquantity"]',
            quantityInfoSelectorMulti: '[data-asyncfavorite="saldocquantity"]',
            quantityZeroSubstituteValue: '',
            artNoAttributeSelector: 'data-artno',
            artBoIdAttributeSelector: 'data-artboid',
            actionAttributeSelector: 'data-multifavoritesaction',
            salDocBoIdTargetAttributeSelector: 'data-saldocboidtarget',
            salDocBoIdSourceAttributeSelector: 'data-saldocboidsource',
            onListAttributeSelector: 'data-onlist',
            quantityPosSelectorMulti: ' > .quantity'
        }, options);
        var settings = this.options;
        var thisPlugin = this;

        var constType = 'favorite';
        var constClassFavoriteActive = 'active';
        var constClassFavoritePassive = 'passive';
        
        // Löscht den deaktivierten Favoriten-Eintrag aus Favoriten-Liste
        var deleteItemPosFromFavoritList = function (artBoId) {
            $(settings.favoriteListSelector).find('.row.item[data-artboid=' + artBoId + ']').addClass("j-hide").fadeOut('slow', function () { $(settings.favoriteListSelector).find('.row.item[data-artboid=' + artBoId + ']').parent().remove() });
            // Falls die Favoriten-Liste leer ist, diese ausblenden und Meldung anzeigen
            if ($(settings.favoriteListSelector).find('> .row.item').not('.j-hide').length === 0) {
                $(settings.updateContainerSelector).find(settings.favoriteEmptyHideSelector).addClass('j-hide').fadeOut();
                $(settings.updateContainerSelector).find(settings.favoriteEmptyShowSelector).addClass('j-show').delay('600').fadeIn();
            }
        };

        // Event-Binding
        $(settings.eventBindingSelector)
            .off('.opaccFavoriteButton')
            // Asynchroner Request für Favorite-Button
            .on('click.opaccFavoriteButton', selector, function (event) {
                event.preventDefault(); // Falls Button vom Typ "submit" ist, wird die Formularübermittlung verhindert!
                event.stopPropagation();
                
                var artNo = $(this).attr(settings.artNoAttributeSelector);
                var artBoId = $(this).attr(settings.artBoIdAttributeSelector);
                var selectedIdenticalArticles = $('[' + settings.artBoIdAttributeSelector + '="' + artBoId + '"]');
                var multiFavoritesAction = $(this).attr(settings.actionAttributeSelector);
                var quantityInfoSelector = multiFavoritesAction ? settings.quantityInfoSelectorMulti : settings.quantityInfoSelectorSingle;
                var $favoriteCountObj = $('#' + $(this).attr('data-asynccountid') + ', ' + quantityInfoSelector);
                var listName = $(settings.newListNameSelector).val();
                var salDocBoIdTarget = $(this).attr(settings.salDocBoIdTargetAttributeSelector);
                var data = {
                    Type: constType,
                    ArtFavorite_ArtNo: artNo,
                    ArtFavorite_ArtBoId: artBoId,
                    maxPositions: $(this).data("maxposition"),
                    // Multi-Favorites
                    maxLists: $(this).data("maxlist"),
                    ArtFavorite_MultiAction: multiFavoritesAction,
                    ArtFavorite_ListName: listName,
                    ArtFavorite_SalDocBoIdTarget: salDocBoIdTarget,
                    ArtFavorite_SalDocBoIdSource: $(this).attr(settings.salDocBoIdSourceAttributeSelector),
                    ArtFavorite_OnList: $(this).attr(settings.onListAttributeSelector)
                };
                // ReSharper disable once MissingHasOwnPropertyInForeach
                for (var property in $(this).data()) {
                    if (property.indexOf("saldocitem.") === 0) {
                        data[property] = $(this).data(property);
                    }
                }
                var success = function(respData) {
                    // Response-ContentType ist application/json
                    var parsedJson = respData;
                    if (parsedJson != null && typeof parsedJson === "object") {
                        if (parsedJson.success) {
                            selectedIdenticalArticles.removeClass(constClassFavoriteActive);
                            selectedIdenticalArticles.removeClass(constClassFavoritePassive);
                            var eventParameter = { action: parsedJson.action, artNo: artNo, artBoId: artBoId };
                            if (parsedJson.additionalAttributes) {
                                var attributes = thisPlugin.parseJson(parsedJson.additionalAttributes);
                                $.extend(eventParameter, attributes);
                            }
                            if (parsedJson.isMulti) {
                                $.extend(eventParameter, {
                                    isMulti: true,
                                    salDocBoIdTarget: parsedJson.salDocBoIdTarget,
                                    salDocBoIdSource: parsedJson.salDocBoIdSource,
                                    salDocName: parsedJson.salDocName,
                                    onList: parsedJson.onList,
                                    listCount: parsedJson.favoriteCount,
                                    message: parsedJson.message
                                });
                                if (parsedJson.onList) {
                                    selectedIdenticalArticles.addClass(constClassFavoriteActive);
                                } else {
                                    selectedIdenticalArticles.addClass(constClassFavoritePassive);
                                }
                                if (parsedJson.message) {
                                    $.opacc.logManager.logInfo(parsedJson.message, { logToScreen: true, overlay: true });
                                }
                                if (parsedJson.action === "added" || parsedJson.action === "deleted" || parsedJson.action === "moved") {
                                    selectedIdenticalArticles.attr("data-onlist", parsedJson.onList);
                                    $('#f-logmanager-overlay-modal').modal("hide");
                                }
                                $.opacc.eventManager.trigger('opaccFavoriteEvent', eventParameter);
                            } else {
                                if (parsedJson.favoritestatus === 'active') {
                                    selectedIdenticalArticles.addClass(constClassFavoriteActive);
                                    eventParameter.action = "added";
                                    $.opacc.eventManager.trigger('opaccFavoriteEvent', eventParameter);
                                } else {
                                    selectedIdenticalArticles.addClass(constClassFavoritePassive);
                                    eventParameter.action = "deleted";
                                    $.opacc.eventManager.trigger('opaccFavoriteEvent', eventParameter);
                                }
                            }
                            $favoriteCountObj.text(parsedJson.favoriteCount === 0
                                ? settings.quantityZeroSubstituteValue
                                : parsedJson.favoriteCount);
                        } else {
                            if (parsedJson.tooHigh) {
                                $.opacc.eventManager.trigger('opaccFavoriteEvent', { action: 'tooHigh', maxType: parsedJson.maxType });
                            }
                            else if (parsedJson.isMulti) {
                                $.opacc.eventManager.trigger('opaccFavoriteEvent', { action: "failed", message: parsedJson.message });
                            } else {
                                $.opacc.logManager.logInfo(parsedJson.message, { logToScreen: true, overlay: true });
                            }
                        }
                    }
                };
                var beforeSend = function (xhr, ajaxSettings) {

                    var tooHigh = false;
                    var maxType = '';
                    var quantity = Number($favoriteCountObj.first().text());
                    var quantityMultiPos = Number($('[' + settings.salDocBoIdTargetAttributeSelector + '="' + salDocBoIdTarget + '"]'
                        + settings.quantityPosSelectorMulti).first().text());
                    var json = thisPlugin.getJsonObjectFromUrlParamString(ajaxSettings.data);
                    var maxLists = Number(json.maxLists);
                    var maxPositions = Number(json.maxPositions);

                    // Single-Favorite-List Maximum-Positions
                    if ($(!multiFavoritesAction && 'button.artFavoriteBtn[data-artboid=' + artBoId + ']').hasClass('passive')
                        && maxPositions > 0 && quantity >= maxPositions)
                    {
                        tooHigh = true;
                        maxType = 'Position';
                    }
                    // Multi-Favorite-Lists
                    else if (multiFavoritesAction === 'added' || multiFavoritesAction === 'moved')
                    {
                        // Maximum-Positions
                        if (salDocBoIdTarget && maxPositions > 0 && quantityMultiPos >= maxPositions) {
                            tooHigh = true;
                            maxType = 'Position';
                        }
                        // Maximum-Lists
                        else if (!salDocBoIdTarget && listName && maxLists > 0 && quantity >= maxLists) {
                            tooHigh = true;
                            maxType = 'List';
                        }
                    }
                    // Maximum erreicht
                    if (tooHigh)
                    {
                        $.opacc.eventManager.trigger('opaccFavoriteEvent', { action: 'tooHigh', maxType: maxType, artBoId: artBoId, artNo: artNo });
                        return false;
                    }
                    return true;
                };
                if (settings.customFunctionSuccess) {
                    success = settings.customFunctionSuccess;
                }
                if (settings.customFunctionBeforeSend) {
                    beforeSend = settings.customFunctionBeforeSend;
                }

                $.opacc.ajaxManager.ajax({
                    data: data,
                    beforeSend: beforeSend,
                    complete: settings.customFunctionComplete,
                    success: success,
                    error: settings.customFunctionError
                });
            })
            .on('opaccFavoriteEvent.opaccfavorite', function (event) {
                if (event.action === "deleted") {
                    deleteItemPosFromFavoritList(event.attr.artBoId);
                }
            });
    };
    opaccFavoritePlugin.prototype = new OpaccBasicPlugin;
    opaccFavoritePlugin.prototype.constructor = opaccFavoritePlugin;

    // Chainable jQuery-Plugins
    $.fn.opaccFavoriteButton = function (options, selector) {
        // ReSharper disable once InconsistentNaming
        var instance = new opaccFavoritePlugin(options, selector);
        if (instance.options.debugMode) {
            $.opacc.logManager.logDebug("New opaccFavoritePlugin " + instance.pluginId + " instantiated!");
        }
        return this;
    };

})(jQuery);
