/* Minification failed. Returning unminified contents.
(5,39-46): run-time error JS1306: Invalid numeric literal: 600_000
 */
const favorites = {
    settings: {
        favoritesCookieName: "TaggedJobsNew",
        favoritesPopupCookieName: "DisableSaveJobsPopup",
        cookieExpirationMilliSeconds: 600_000//10*60*1000 = 10 min //31 * 24 * 60 * 60 * 1000
    },
    events: {
        load: {
            loading: "favoritesLoading",
            loaded: "favoritesLoaded",
            loadFailed: "favoritesLoadFailed",
            loadFinished: "favoritesLoadFinished"
        },
        add: {
            adding: "favoritesAdding",
            added: "favoritesAdded",
            addFailed: "favoritesAddFailed",
            addFinished: "favoritesAddFinished"
        },
        remove: {
            removing: "favoritesRemoving",
            removed: "favoritesRemoved",
            removeFailed: "favoritesRemoveFailed",
            removeFinished: "favoritesRemoveFinished"
        }
    }
}

// ========== General ==========
function getFavoriteJobIds(){
    var cookievalue = readCookie(favorites.settings.favoritesCookieName) || "";
    return cookievalue.split('@').filter(element => element);
}

function isFavoriteJob(jobId){
    var jobs = getFavoriteJobIds();
    var index = jobs.indexOf("" + jobId);
    return index !== -1;
}

function reloadFavorites() {
    try {
        var isAllowed = document.dispatchEvent(new CustomEvent(favorites.events.load.loading, {
            bubbles: true,
            cancelable: true
        }));
        if (!isAllowed) {
            return;
        }
        var cookievalue = readCookie(favorites.settings.favoritesCookieName);
        if (!cookievalue) {
            return;
        }

        var jobs = cookievalue.split('@').filter(element => element);
        if (jobs.length <= 0) {
            return;
        }

        document.dispatchEvent(new CustomEvent(favorites.events.load.loaded, {
            detail: {
                jobIds: jobs,
                total: jobs.length
            }, bubbles: true, cancelable: false
        }));
    } catch (e) {
        appInsights.trackException('An error occurred while reloading the favorites: ' + e);
        document.dispatchEvent(new CustomEvent(favorites.events.load.loadFailed, {bubbles: true, cancelable: false}));
    } finally {
        document.dispatchEvent(new CustomEvent(favorites.events.load.loadFinished, {bubbles: true, cancelable: false}));
    }
}

function addFavorite(jobId, element) {
    try {
        var isAllowed = document.dispatchEvent(new CustomEvent(favorites.events.add.adding, {
            detail: {jobId: jobId, element: element},
            bubbles: true,
            cancelable: true
        }));
        if (!isAllowed) {
            return;
        }

        var cookievalue = readCookie(favorites.settings.favoritesCookieName) || "";
        var jobs = cookievalue.split('@').filter(element => element);
        var index = jobs.indexOf("" + jobId);
        if (index === -1) {
            jobs.push(jobId);
        }

        saveCookie(favorites.settings.favoritesCookieName, jobs.join('@'), favorites.settings.cookieExpirationMilliSeconds);
        document.dispatchEvent(new CustomEvent(favorites.events.add.added, {
            detail: {
                jobId: jobId,
                total: jobs.length,
                element: element
            }, bubbles: true, cancelable: true
        }));
    } catch (e) {
        appInsights.trackException('An error occurred while adding the favorite: ' + e);
        document.dispatchEvent(new CustomEvent(favorites.events.add.addFailed, {
            detail: {jobId: jobId, element: element},
            bubbles: true,
            cancelable: true
        }));
    } finally {
        document.dispatchEvent(new CustomEvent(favorites.events.add.addFinished, {
            detail: {jobId: jobId, element: element},
            bubbles: true,
            cancelable: true
        }));
    }
}

function removeFavorite(jobId, element) {
    try {
        var isAllowed = document.dispatchEvent(new CustomEvent(favorites.events.remove.removing, {
            detail: {jobId: jobId, element: element},
            bubbles: true,
            cancelable: true
        }));
        if (!isAllowed) {
            return;
        }

        var cookievalue = readCookie(favorites.settings.favoritesCookieName);
        if (!cookievalue) {
            return;
        }

        var jobs = cookievalue.split('@').filter(element => element);
        if (jobs.length <= 0) {
            return;
        }

        var index = jobs.indexOf("" + jobId);
        if (index === -1) {
            return;
        }
        jobs.splice(index, 1);

        saveCookie(favorites.settings.favoritesCookieName, jobs.join('@'), favorites.settings.cookieExpirationMilliSeconds);
        document.dispatchEvent(new CustomEvent(favorites.events.remove.removed, {
            detail: {
                jobId: jobId,
                total: jobs.length,
                element: element
            }, bubbles: true, cancelable: true
        }));
    } catch (e) {
        appInsights.trackException('An error occurred while removing the favorite: ' + e);
        document.dispatchEvent(new CustomEvent(favorites.events.remove.removeFailed, {
            detail: {jobId: jobId, element: element},
            bubbles: true,
            cancelable: true
        }));
    } finally {
        document.dispatchEvent(new CustomEvent(favorites.events.remove.removeFinished, {
            detail: {jobId: jobId, element: element},
            bubbles: true,
            cancelable: true
        }));
    }
}

// ========== UI ==========

function updateFavoriteUI(evt, isFavorite) {
    let jobId = evt.detail.jobId;
    showHideFavoriteStar(jobId, isFavorite);
    changeTotals(evt.detail.total);
    ShowSavedJobsPopup(evt.detail.element);
}

function showFavoriteStars(jobIds) {
    for (let index = 0; index < jobIds.length; index++) {
        showHideFavoriteStar(jobIds[index], true);
    }
}

function showHideFavoriteStar(jobId, isFavorite) {
    $(`[data-favorite-jobid='${jobId}'][data-favorite-command='add']`).toggle(!isFavorite);
    $(`[data-favorite-jobid='${jobId}'][data-favorite-command='remove']`).toggle(isFavorite);
}

function hideAllFavoriteStars() {
    $(`[data-favorite-jobid][data-favorite-command='add']`).hide();
    $(`[data-favorite-jobid][data-favorite-command='remove']`).show();
}

function changeTotals(total) {
    $("[data-favorites-total]").html(total);
    $("[data-favorites-badge]").toggle(total > 0);
    $("[data-favorite-suffix]").toggle(total === 1);
    $("[data-favorites-suffix]").toggle(total !== 1);
    $("[data-favorites-none]").toggle(total <= 0);
}

// ========== Events ==========

document.addEventListener(favorites.events.load.loaded, function (evt) {
    hideAllFavoriteStars();
    showFavoriteStars(evt.jobIds);
    changeTotals(evt.detail.total);
});

document.addEventListener(favorites.events.add.added, function (evt) {
    updateFavoriteUI(evt, true);
});

document.addEventListener(favorites.events.remove.removed, function (evt) {
    updateFavoriteUI(evt, false);
});

function ShowSavedJobsPopup(appendDiv) {
    $(".saved-jobs-popup").hide();
    if (!readCookie(favorites.settings.favoritesPopupCookieName) && $(appendDiv).data('favorite-command') ==="add") {
        $(appendDiv).after($(".saved-jobs-popup"));
        $(".saved-jobs-popup").show();
    }
}

$(function () {
    $("body").on("click", "[data-favorite-command='add']", function (event) {
        let jobId = $(this).data("favorite-jobid");
        addFavorite(jobId, event.currentTarget);
    });
    
    $("body").on("click", "[data-favorite-command='remove']", function (event) {
        let jobId = $(this).data("favorite-jobid");
        removeFavorite(jobId, event.currentTarget);
    });

    $("body").on("click", "#btnHideSavedJobsPopup", function () {
        $(".saved-jobs-popup").hide();
        if ($("#cbHideSavedJobsPopup").is(":checked")) {
            saveCookie(favorites.settings.favoritesPopupCookieName, "true", 365 * 24 * 60 * 60 * 1000);
        }
        else {
            deleteCookie(favorites.settings.favoritesPopupCookieName);
        }
        return false;
    });
});

;
