/* ########## scrollToElem (copyright e2see.de) ##########
<script>
$(document).ready(function(){
    $('div').scrollToElem({
                duration   :200,
                topOffset  :20,
                afterScroll: function(){ alert('scrolled'); },
                });
});
</script>
*/

$.fn.scrollToElem = function(options) {
    /*
    $('div').scrollToElem({
                contextSelector :'#sidebar',
                duration   :200,
                topOffset  :70,
                afterScroll: function(){ myname() },
                });
                */

    elem = this;

    var settings = $.extend({
                        contextSelector :'html, body',
                        delay       :0,
                        duration    :400,
                        topOffset   :68,
                        ifNeeded    :false,
                        afterScroll :function(){}
                        }, options);


    settings.topOffset = parseInt(settings.topOffset);
    settings.duration  = parseInt(settings.duration);

    if (isNaN(settings.duration) || settings.duration < 0 || settings.duration > 999999){
        settings.duration = 400;
    }
    if (isNaN(settings.topOffset) || settings.topOffset < 0 || settings.topOffset > 999999){
        settings.topOffset = 68;
    }

    //zielpixel höher anvisieren;
    setTimeout(function(){


        if(settings.contextSelector !== 'html, body'){
            var container = $(settings.contextSelector);
            var elemPos   = elem[0].offsetTop;
        } else {
            var container = $(window);
            var elemPos   = elem.offset().top;
        }

        var needed    = true;
        var scrollPos = container.scrollTop();
        var targetPos = elemPos - settings.topOffset;


        // aber nicht höher als 0 ;)
        if (targetPos < 0){
            targetPos = 0;
        }

        if (settings.ifNeeded){
            var elemHeight      = elem.outerHeight();
            var containerHeight = container.height();

            if (
                (elemHeight + elemPos) > (scrollPos + containerHeight - 20)
                ||
                ((scrollPos + settings.topOffset) > targetPos)
            ){
                needed = true;
            } else {
                needed = false;
            }

        }


       // console.log('elemPos: '+ elemPos +' scrollPos '+ scrollPos +' targetPos: '+ targetPos);

        if (needed){

            if (targetPos == scrollPos){
                // wenn nix zum scrollen
                settings.duration = 0;

            } else if (
                (targetPos >= scrollPos && targetPos <= (scrollPos + 10))
                ||
                (targetPos <= scrollPos && targetPos >= (scrollPos - 10))
                && settings.duration > 50
            ){
                // wenn zu wenig zum scrollen
                settings.duration = 50
            }



                container.trigger('scrollToElem.beforeScroll', {
                                                                pos:     targetPos
                                                                });
                $(settings.contextSelector).animate({
                                    scrollTop:  targetPos,
                                },
                                parseInt(settings.duration)
                                ).promise().then(function(){

                                    container.trigger('scrollToElem.afterScroll', {
                                                                pos:     targetPos
                                                                });

                                    settings.afterScroll.call();
                                });

        }

    }, settings.delay);

    return this;
}





/* cdn 16ms */