var NavigationMain = new function() {
    var me          = this;
    var locked      = false;
    var activeNode;
    var rootNode;
    var outerNode;
    var innerNode;
    var outerHeight;
    var speed;

    /*
     *                  INIT
     */
    me.init = function() {
        me.locked = true; // LOCK
        var selector    = '.main-navigation';
        me.outerNode    = $(selector);
        if(me.outerNode.length == 0) {
            return;
        }
        me.innerNode    = $(selector +' .inner');
        me.activeNode   = $(selector+' ul').first();
        me.rootNode     = me.activeNode;

        // Dont work on news teaser list
        if (me.activeNode.hasClass('news')) {
            return false;
        }

        // set callback for category-links
        $(selector+' li.category a').click( function(ev) { me.clickForward(ev, this ); } );

        // set callback for back-link
        $(selector+' a.arrow-left'   ).click( function(ev) { me.clickBackward(ev, this); } );

        $(selector+' a.arrow-left').addClass('inactive');

        $(selector+' a.arrow-up'   ).click( function(ev) { me.clickUpward(ev, this); } );
        $(selector+' a.arrow-down' ).click( function(ev) { me.clickDownward(ev, this); } );

        // hide all subtrees - dont do this before rescaling :-)
        $(selector+' ul ul').hide();

        // show active subtree
        $(selector+' ul a.active').each( function(el){
            me.forward(this,10);
        });

        // rescale navigation
        me.resize(selector);

        if( me.rootNode.find('li.current').length > 0 ){
            //console.log( "node-top: " + me.rootNode.find('li.current').position().top + " - inner: "+me.innerNode.innerHeight())
            if( me.rootNode.find('li.current').position().top >= me.innerNode.innerHeight() ) {
                for(i=1;i<(me.rootNode.find('li.current').position().top / me.innerNode.innerHeight());i++){
                    me.downward(this,10);
                }
            }
        } else {
            me.checkVScrollEnabled();
        }


        me.locked = false;
    }

    me.resize = function( selector ) {
        var max = 0;
        // try to find counter
        $('#productgroup-counter').each(
            function(el){
                max = 90 * parseInt( $(this).html());
            }
        );

        $(selector+' ul').each( function(el){
            max = Math.max($(this).innerHeight(), max);
        });
        //max = Math.min(max, $('div.main-navigation div.inner').innerHeight());

       // me.outerNode.innerHeight(max);

        me.outerHeight = me.innerNode.innerHeight();
    }


    me.checkVScrollEnabled = function() {
        if(me.upwardAllowed()){
            me.outerNode.children('a.arrow-up').removeClass('inactive');
        } else {
            me.outerNode.children('a.arrow-up').addClass('inactive');
        }

        if(me.downwardAllowed()){
            //console.log('down allowed');
            me.outerNode.children('a.arrow-down').removeClass('inactive');
        } else {
            //console.log('down NOT allowed');
            me.outerNode.children('a.arrow-down').addClass('inactive');
        }
    }





    /*
     *                  FORWARD
     */
    me.clickForward = function(ev, target) {
        if($(target).parent().hasClass("category")){
            ev.preventDefault();
            if(!me.locked){
                me.forward(target,700);
            }
        }
    }

    me.forward = function(target, speed){
        var sub = $(target).parent().children('ul');
        if (sub.size()>0) { // if there are sublevels
            me.locked = true;
            sub.show();
            me.activeNode = $(target).parent().children('ul').first();
            me.activeNode.parent().parent().animate(
                {left: '-=400'},
                speed,
                function() {
                    me.checkVScrollEnabled();
                    me.locked = false;
                }
            );
            me.outerNode.children('a.arrow-left').removeClass('inactive')
        }
    }





    /*
     *                  BACKWARD
     */
    me.clickBackward = function(ev, target) {
        ev.preventDefault();
        if(!me.locked){
            me.backward(target,700);
        }
    }

    me.backward = function(target, speed){
        if ( !(me.backwardAllowed())){
            me.locked = true;
            me.activeNode.parent().parent().animate(
                {left:'+=400'},
                speed,
                function(){
                    me.activeNode.parent().children('ul').hide();
                    me.activeNode = me.activeNode.parent().parent();
                    if( me.backwardAllowed() ){
                        me.outerNode.children('a.arrow-left').addClass('inactive')
                    }
                    me.checkVScrollEnabled();
                    me.locked = false;
                }
            );
        }
    }

    me.backwardAllowed = function(){
        return me.activeNode.parent().hasClass('inner');
    }





    /*
     *                  UPWARD
     */
    me.clickUpward = function(ev, target) {
        ev.preventDefault();
        if(!me.locked){
            me.upward(target,700);
        }
    }

    me.upward = function(target, speed) {
        var scroll = me.outerHeight;
        if( me.upwardAllowed() ){
            me.locked = true;
            me.activeNode.animate(
                {top:'+='+scroll},
                speed,
                function(){
                    me.activeNode.find('ul').each(function(){
                        $(this).css('top', parseInt($(this).css('top')) - me.outerHeight);
                    });
                    me.activeNode.find('ul ul').each(function(){
                        $(this).css('top', parseInt($(this).css('top')) + me.outerHeight);
                    });
                    me.checkVScrollEnabled();
                    me.locked = false;
                }
            );

        }
    }

    me.upwardAllowed = function(){
        return (parseInt(me.activeNode.css('top')) < 0 );
    }





    /*
     *                  DOWNWARD
     */
    me.clickDownward = function(ev, target) {
        ev.preventDefault();
        if (!me.locked) {
            me.downward(target,700);
        }
    }

    me.downward = function(target, speed) {
        if( me.downwardAllowed() ){
            me.locked = true;
            me.activeNode.animate(
                {top:'-='+me.outerHeight},
                speed,
                function(){
                    me.activeNode.find('ul').each(function(){
                        $(this).css('top',  parseInt($(this).css('top')) + me.outerHeight);
                    });
                    me.activeNode.find('ul ul').each(function(){
                        $(this).css('top',  parseInt($(this).css('top')) - me.outerHeight);
                    });
                    me.checkVScrollEnabled();
                    me.locked = false;
                }
            );
        }
    }

    me.downwardAllowed = function(){
        //console.log('innerH:'+me.activeNode.innerHeight() +'  Position:'+ me.activeNode.position().top +'  OouterH:'+ me.outerHeight);
        //console.log('H:'+me.activeNode.height() +'innerH:'+me.activeNode.innerHeight() +'outerH:'+me.activeNode.outerHeight());
        return (me.activeNode.innerHeight() + me.activeNode.position().top > me.outerHeight);
    }


}
