function magicNav( $container, configuration ) {
    var initing = true;
    var numberPages = 0;
    var currentPage = 1;
    
    var autoRotateHandle = null;
    var autoRotateStartHandle = null;
    
    var enumAction = { 'appear':0, 'disappear':1 };
    
    var config = {
        hideNav: true,
        circular: false,
        navmode: 'points', /*points, thumbs*/
        animateLinks: true,
        transition: {
            style: 'switch', /*switch, fade, slide*/
            transitionTime: 300,
            transitionOffset: 5
        },
        autorotate: {
            active: false,
            startTime: 5000,
            intervalTime: 2000
        }
    };

    var $left = $('.mnav-left', $container );
    var $right = $('.mnav-right', $container );
    var $content = $('.mnav-content', $container ).children( 'ul' );
    var $pages = $content.children( 'li' );
    var $points = $('.mnav-points', $container );
    
    function init() {
        $pages.hide();
        numberPages = $pages.length;
        pageAction( currentPage, enumAction.appear );
        
        parsePoints();
        events();
        showPoints();
        showNav();
        autoRotateStart();
        
        initing = false;
    }
    
    /* keeps config of transsition if not set, everthing else will be overwritten */
    function readConfig( defaultC, newC ) {
        $.each( newC, function( k, v ) {
            if ( typeof v == 'object' ) {
                if( typeof( defaultC[ k ] ) != 'undefined') {
                    readConfig( defaultC[ k ], v );
                } else {
                    defaultC[ k ] = newC[ k ];
                }
            } else {
                defaultC[ k ] = newC[ k ];
            }
        } );
        
        //backwards compatability
        if ( typeof config.transition.fadeTime !== 'undefined' ) {
            config.transition.transitionTime = config.transition.fadeTime;
        }
    }
    
    function jumpPage( index ) {
        if ( index == currentPage ) return;
        
        var ret = true;
        ret = pageAction( currentPage, enumAction.disappear );
        if ( ret ) {
            ret = pageAction( index, enumAction.appear );
        }
        if ( ret ) {
            currentPage = index;
            showPoints();
            showNav();
        }
    }
     
    function nextPage() {
        if ( currentPage + 1 <= numberPages ) {
            jumpPage( currentPage + 1 );
        } else if ( currentPage + 1 > numberPages && config.circular ) {
            jumpPage( 1 );
        }
    }
    
    function prevPage() {
        if ( currentPage - 1 >= 1 ) { //indexed starting with 1!
            jumpPage( currentPage - 1 );
        } else if ( currentPage - 1 < 1 && config.circular ) {
            jumpPage( numberPages );
        }
    }
    
    function pageAction( index, action ) {
        var $elem = $content.children( 'li:nth-child(' + index + ')' );
        
        if ( $elem.is(':animated') ) {
            return false;
        }
        
        if ( action == enumAction.appear ) {
            if ( config.transition.style == 'switch' ) {
                $elem.show();
            } else if ( config.transition.style == 'fade' ) {
                $elem.fadeIn( config.transition.transitionTime );
            } else if ( config.transition.style == 'slide' ) {
                $elem.css( 'left', ( $content.width() + config.transition.transitionOffset ) + 'px' );
                $elem.show();
                $elem.animate( { left:'0px' }, config.transition.transitionTime );
            }
        } else if ( action == enumAction.disappear ) {
            if ( config.transition.style == 'switch' ) {
                $elem.hide();
            } else if ( config.transition.style == 'fade' ) {
                $elem.fadeOut( config.transition.transitionTime );
            } else if ( config.transition.style == 'slide' ) {
                $elem.animate( { left: '-' + ( $elem.width() + config.transition.transitionOffset ) + 'px' }, config.transition.transitionTime );
            }
        }
        
        return true;
    }
    
    function showNav() {
        if ( !config.hideNav ) {
            $left.show();
            $right.show();
            return;
        }
        
        if ( currentPage <= 1 ) {
            $left.hide();
        } else {
            $left.show();
        }
        if ( currentPage == numberPages ) {
            $right.hide();
        } else {
            $right.show();
        }
    }
    
    function parsePoints() {
        if ( config.navmode == 'points' ) {
            var $activePoint = $('.mnav-active', $points );
            var $inactivePoint = $('.mnav-inactive', $points );
            $activePoint = $( $activePoint[0] );
            $inactivePoint = $( $inactivePoint[0] );
        
            $activePoint.detach();
            $inactivePoint.detach();
            for ( var i = 0; i < numberPages; i++ ) {
                $activePoint.clone().appendTo( $points );
                $inactivePoint.clone().appendTo( $points );
            }
        } else if ( config.navmode == 'thumbs' ) {
            numberPages = $( '.mnav-active', $points ).length;
        }
        
        for( var i = 1; i <= numberPages; i++ ) {
            var nr1 = i * 2;
            var nr2 = nr1 - 1;
            $('.mnav-active:nth-child(' + nr2 + '), .mnav-inactive:nth-child(' + nr1 + ')', $points).click( 
                ( function(b) {
                    var f = function() {
                        jumpPage( b );
                    };
                    return function() {
                        manualHandler( f );
                    };
                } )(i)
            );
        }
    }
    
    function showPoints() {
        if ( numberPages == 1 ) {
            $points.children().hide();
            return;
        }
    
        $( '.mnav-active', $points ).hide();
        $( '.mnav-inactive', $points ).hide();
        
        var nr1 = currentPage * 2;
        var nr2 = nr1 - 1;
        
        var $showActive = $( '.mnav-active:nth-child(' + nr2 + ')', $points );
        var $showInactive = $( '.mnav-inactive', $points ).not(':nth-child(' + nr1 + ')' );
        
        if ( false && initing ) { //on first call fade in softly
            $showActive.fadeIn();
            $showInactive.fadeIn();
        } else {
            $showActive.show();
            $showInactive.show();
        }
    }
    
    function manualHandler( f ) {
        if ( config.autorotate.active ) {
            window.clearInterval( autoRotateHandle );
            window.clearTimeout( autoRotateStartHandle );
        }
        f();
        if ( config.autorotate.active ) {
            autoRotateStart()
        }
        return false;
    }
    
    function events() {
        $left.click( function() { return manualHandler( prevPage ); } );
        $right.click( function() { return manualHandler( nextPage ); } );
        
        if ( config.animateLinks ) {
            $left.add( $right )
                .mousedown( function() {
                    var $this = $(this);
                    $this.css( { 'top': ( parseInt( $this.css('top') ) +1 ) + 'px', 'left':( parseInt( $this.css('left') ) +1 ) + 'px' } );
                } )
                .mouseup( function() {
                    var $this = $(this);
                    $this.css( { 'top': ( parseInt( $this.css('top') ) -1 ) + 'px', 'left':( parseInt( $this.css('left') ) -1 ) + 'px' } );
                } );
        }
    }
    
    function autoRotateStart() {
        if ( config.autorotate.active ) {
            autoRotateStartHandle = window.setTimeout( function() {
                var intervalTime = config.autorotate.intervalTime
                if ( $.inArray( config.transition.style, ['fade','slide'] ) ) {
                    intervalTime += config.transition.transitionTime;
                }
                autoRotateHandle = window.setInterval( function() {
                    nextPage();
                } , intervalTime );
            }, config.autorotate.startTime );
        }
    }
    
        
    readConfig( config, configuration || {} );
    init();
    
    return function( direction ) {
        var f = null;
        if ( direction == 'l' ) {
            f = prevPage;
        } else if ( direction == 'r' ) {
            f = nextPage;
        }
        
        if ( f ) manualHandler( f );
    }
}


function magicNewsOverlay( $elem, jsonData, offsetTop ) {
    var $newsOv = $('#adv-news-overlay');

    $elem.click( function() {
        openNewsOverlay( $(this), jsonData, offsetTop );
        return false;
    });
    
    function openNewsOverlay($newsEntry, textData, OvOffsetTop) {
        var newsTitle = "";

        var nws_key = $newsEntry.attr('rel');

        if( typeof textData[ nws_key ] == 'undefined' ) {
            return;
        }

        var newsPos = $newsEntry.position();
        var newsPosTop = newsPos.top;
        var newsPosLeft = newsPos.left;
        var newsWidth = $newsEntry.outerWidth(true);
  
        var ovTop = Math.round(newsPosTop + OvOffsetTop);
        var arrowPosLeft = Math.round(newsPosLeft + newsWidth/2 - 46 - 162); // -arrow.width -overlay.left
        
        $('.arrow', $newsOv).css({'left' : arrowPosLeft+'px' });
        if ( textData[nws_key]['title'] != "") {
            newsTitle = '<h3>'+textData[nws_key]['title']+'</h3>';
        }
        $('.content', $newsOv).html(newsTitle + textData[nws_key]['ltext']);
        
        $newsOv.css({'top' : ovTop+'px' }).bgiframe().fadeIn(300);
    }
    
    $newsOv.bind('clickoutside', function() {
        if ($newsOv.is(':visible')) {
            hideNewsOverlay();
        }
    });

    $('#closebutton', $newsOv).click( function() {
        hideNewsOverlay();
    });

    $(document).keydown(function(event) {
        if (event.keyCode == 27) {
            hideNewsOverlay();
        }
    });
   
    function hideNewsOverlay() {
        $newsOv.fadeOut( 300 );
    }
}


function adjustTextBoxHeight() {
    var sumHeight = 0;
    var sumEntries = 0;
    var textEndOffset = 50;
    var textMaxHeight = 168;

    $('li .newstext').each( function(i) {
        sumHeight += $(this).height();
        sumEntries++;
    });

    var avgHeight = Math.round(sumHeight/sumEntries) + textEndOffset;
    if (avgHeight > textMaxHeight) avgHeight = textMaxHeight;

    $('li .newstext').css({'height' : avgHeight+'px'})
}

