
function isElementInViewport(el) {
    //special bonus for those using jQuery
    if (typeof jQuery === "function" && el instanceof jQuery) {
        el = el[0];
    }
    var rect = el.getBoundingClientRect();
    return (
        rect.top >= 0 &&
        rect.left >= 0 &&
        rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && /*or $(window).height() */
        rect.right <= (window.innerWidth || document.documentElement.clientWidth) /*or $(window).width() */
    );
}

function goToAnchorIfNotInViewport(anchor) {
    if (anchor.indexOf("#") < 0) {
        anchor = "#" + anchor;
    }
    if (!isElementInViewport($(anchor))) {
        window.location.href = anchor;
    }
}

$.fn.amphiListResultsPerPage = function () {

    /**
     * Änderung eine Ergebnisse je Seite Selects
     *
     */
    if ($(this).is('select')) {
        $(this).on('change', function (e) {
            var href = $(this).data('target');

            if (typeof href !== 'undefined' && href.length > 0) {
                var ajax = ($(this).data('ajax') === '1');

                var redirector = amphiRedirector(href);
                redirector.addGetParameter($(this).attr('name'), $(this).val());
                redirector.doRedirect(ajax);
            }
        });
    }
};

/**
 * Initialisiert die Paginator Aktionen
 *
 */
$.fn.amphiListPaginatorGotoElement = function () {

    /**
     * Ermittelt die Zielseite
     *
     * @param selectedValue
     * @param maxValue
     * @returns integer
     */
    var getTargetPage = function (selectedValue, maxValue) {
        var targetPage = parseInt(selectedValue);

        // hier dürfen targetPage und selectedValue nicht mit !== verglichen werden.
        // selectedPage kann ein string sein
        // targetPage ist in jedem Fall ein Integer.
        if (isNaN(targetPage) || targetPage != selectedValue || targetPage > maxValue) {
            //Bei invaliden Eingaben geht es auf die erste Seite
            targetPage = 1;
        }

        return targetPage;
    };

    /**
     * Enter-Klick in Paginator Textfeld
     */
    if ($(this).is('input')) {
        $(this).on('keypress', function (e) {
            if (e.keyCode === 13) { // ENTER
                e.preventDefault();

                var href = $(this).data('target');

                if (href.length > 0) {
                    var maxValue = parseInt($(this).data('max-value'));
                    var targetPage = getTargetPage($(this).val(), maxValue);
                    var ajax = ($(this).data('ajax') === '1');

                    var redirector = amphiRedirector(href);
                    redirector.addGetParameter($(this).attr('name'), targetPage);
                    redirector.doRedirect(ajax);

                    var anchorIndex = href.indexOf("#");
                    if (anchorIndex >= 0) {
                        goToAnchorIfNotInViewport(href.substring(anchorIndex));
                    }
                }
            }
        });
    }

    /**
     * Änderung eines Paginator Selects
     */
    if ($(this).is('select')) {
        $(this).on('change', function (e) {
            var href = $(this).data('target');

            if (typeof href !== 'undefined' && href.length > 0) {
                var maxValue = parseInt($(this).data('max-value'));
                var targetPage = getTargetPage($(this).val(), maxValue);
                var ajax = ($(this).data('ajax') === '1');

                var redirector = amphiRedirector(href);
                redirector.addGetParameter($(this).attr('name'), targetPage);
                redirector.doRedirect(ajax);
            }
        });
    }
};

$.fn.rowLink = function () {
    $(this).on("click", function (event) {
        var $target = $(event.target);
        if (!$target.is("input,a,label.checkbox-inline") && !$target.closest("input,a").length) {
            var href = $(this).data("href");
            var target = $(this).data("target");

            if (typeof target === 'undefined' || !target) {
                target = 'self';
            }

            var redirector = amphiRedirector(href, target);
            redirector.doRedirect(false);
        }
    });
};

$(function () {
    $('.list-results-per-page').amphiListResultsPerPage();
    $('.paginator-goto-page').amphiListPaginatorGotoElement();
    $("tr.row-link").rowLink();
});