function ShopNavigation(baseUrl, resourceUrl, noneSelectedText) {
    this.baseUrl = baseUrl;
    this.resourceUrl = resourceUrl;
    this.noneSelectedText = noneSelectedText;
}

ShopNavigation.prototype.baseUrl = '';
ShopNavigation.prototype.resourceUrl = '';
ShopNavigation.prototype.noneSelectedText = '';

ShopNavigation.prototype.loadCategories = function(obj, id, level) {
    /* no more than 6 category levels in the database */
    /* detect levels under the clicked level and set them to remove */
    for (var i = level+1; i < 6; i++) {
        if ($('div#navi-categories div.result.level' + i)) {
            $(".level"+i+" .navi-triangle").unbind('click');
            $('div#navi-categories div.result.level' + i).addClass("remove");
            $('div#navi-categories div.result.level' + i).removeClass("level"+i);
        }
    }
    /* now remove them */
    $.each($('div.remove'), function () {
        $(this).remove();
    });

    this.appendLoader(obj);
    if (obj != undefined && level != undefined) {
        this.setActiveLink(level, obj);
    }
    var sUrl = this.baseUrl + "ajax.php?cl=mfajax&fnc=getCategories";
    if (id) {
        sUrl += "&catid=" + id + "&catlevel=" + level;
    }

    $.ajax({
       cache: true,
       url: sUrl,
       dataType: "html",
       context: document.body,
       success: function(data){
           $('#catAjaxLoader').remove();
           $('#navi-categories-content').append(data);
           level++;
           $("#navi-categories-content div.level"+level).slideDown(500);
           $(".level"+level+" .navi-triangle").unbind('click');
           $(".level"+level+" .navi-triangle").click(function() {shopNavi.toggleLevel(level)});

           shopNavi.adaptPlaceholder();
           shopNavi.setContentOpacity();
       }
   });
    this.setContentOpacity();
}

ShopNavigation.prototype.adaptPlaceholder = function() {
    var height = $('#navi-placeholder').height();
    var newheight = $('#navi-categories .result').length * ($('#navi-categories .result.level0 .categorylist li.aktiv').height() + 2);
    $('#navi-placeholder').height((height > newheight) ? height : newheight);
}

ShopNavigation.prototype.setActiveLink = function (level, obj) {
    if ((typeof level == 'undefined') || !obj) {
        return;
    }
    $('.result.level'+level+' li.aktiv').removeClass('aktiv');
    $(obj).parent().addClass('aktiv');
}


ShopNavigation.prototype.toggleLevel = function(level){
    if (!$('.level'+level+' .navi-triangle').hasClass('collapsed')) {
        this.collapseLevel(level, this.getActiveCategorytext(level));
    } else {
        // Cat level is collapsed
        this.expandLevel(level);
    }
    $('.level'+level+' .navi-triangle').toggleClass('collapsed');
    this.setContentOpacity();
}

ShopNavigation.prototype.collapseLevel = function(level, catText, speed) {
    if ($('.result.level'+level+' .navi-triangle').hasClass('collapsed')) {
        // level is already collapsed, nothing to do
        return;
    }
    var noneSelected = this.noneSelectedText;
    speed = speed || 250;
    var buttonClass = this.setButtonClass;
    $('.result.level'+level+' .categorylist').slideUp(speed, function() {
        var html = '<ul id="catSelected' + level + '" class="categorylist">';
        html += '<li';
        if (catText != noneSelected) {
            html += ' class="aktiv"';
        }
        html += '>';
        html += '<a href="#" onclick="shopNavi.expandLevel('+level+');" class="level'+level+'">' + catText + '</a>';
        html += '</li></ul>';
        $('.result.level'+level).append(html);
        $('.result.level'+level+' .navi-triangle').addClass('collapsed');
        buttonClass();
        $('#catSelected' + level).fadeIn(speed);
        $('.navi-clearing-'+level).hide();
    });
}

ShopNavigation.prototype.expandLevel = function(level){
    if (!$('.result.level'+level+' .navi-triangle').hasClass('collapsed')) {
        // level is already expanded, nothing to do
        return;
    }
    var buttonClass = this.setButtonClass;
    $('#catSelected' + level + ' li').fadeOut(250, function() {
        $('#catSelected' + level).remove();
        $('.result.level'+level+' .categorylist').slideDown(250);
        $('.result.level'+level+' .navi-triangle').removeClass('collapsed');
        setContentInactive(true);
        buttonClass();
        $('.navi-clearing-'+level).show();
    });
}

// set the product button's class according to state of category levels
ShopNavigation.prototype.setButtonClass = function () {
    if ($('.navi-triangle').not('.collapsed').size() > 0) {
        if(!$('#button-products').hasClass('open')) {
            $('#button-products').addClass('open');
        }
        shopNavi.unregisterDocumentClickEvent();
        shopNavi.registerDocumentClickEvent();
    } else {
        if($('#button-products').hasClass('open')) {
            $('#button-products').removeClass('open');
        }
        shopNavi.unregisterDocumentClickEvent();
	}
}

ShopNavigation.prototype.getActiveCategorytext = function(level) {
    var catText = this.noneSelectedText;
    if ($('.result.level'+level+' .categorylist').has('li.aktiv').size() == 1) {
        var catText = $('.result.level'+level+' .categorylist li.aktiv a').html();
    }
    return catText;
}
ShopNavigation.prototype.showNavi = function() {
    $('#navi-categories').show();
    this.setContentOpacity();
}
ShopNavigation.prototype.toggleNavi = function() {
    $('#navi-loader').hide();
    $('#navi-categories').show();
    // if one cat is opened we collapse all otherwise we expand all
    var levels = $('.categorylist').size();
    if ($('.navi-triangle').not('.collapsed').size() == 0) {
        for (level = 0; level < levels; level++) {
            this.expandLevel(level);
        }
    } else {
           for (level = 0; level < levels; level++) {
                   this.collapseLevel(level, this.getActiveCategorytext(level), 250);
           }
    }
    this.setButtonClass();
    this.setContentOpacity(true);
}

ShopNavigation.prototype.collapseNavi = function(collapseFast) {
    this.showNavi();
    $('.result.invisible').removeClass('invisible');
    var speed = 0;
    if (collapseFast == true) {
        speed = 500;
    }
    var levels = $('.categorylist').size();
    for (level = 0; level < levels; level++) {
        this.collapseLevel(level, this.getActiveCategorytext(level), speed);
    }
    this.setButtonClass();
    this.setContentOpacity(true);
}

ShopNavigation.prototype.appendLoader = function(obj) {
    obj.append(function(){
        var loaderHtml = '<div id="catAjaxLoader" style="width:16px;height: 16px; float: right;margin-top:-18px;"><img src="' + shopNavi.resourceUrl + 'bg/ajax-loader-notifier.gif" alt=""></div>';
        return loaderHtml;
    });
}
ShopNavigation.prototype.initLocationChange = function(obj) {
    setContentInactive(true);
    obj.parent().addClass('aktiv');
}

ShopNavigation.prototype.setContentOpacity = function(revert) {
    revert = revert || false;
    //detect if we have to fade the content div
    if ($('.navi-triangle').not('.collapsed').size()>0) {
        if (revert == true) {
            setContentActive();
        } else {
            setContentInactive(true);
        }
    } else {
        if (revert == true) {
            setContentInactive(true);
        } else {
            setContentActive();
        }
    }
}

ShopNavigation.prototype.toggleContentOpacity = function(targetOpacity) {
    $('#content').fadeTo(250, targetOpacity);
}

ShopNavigation.prototype.defaultShow = function() {
    $(this).addClass('open');
    setContentInactive(true);
    $('#navi-categories').slideDown(300);
    shopNavi.registerDocumentClickEvent();
}

ShopNavigation.prototype.defaultHide = function() {
    $(this).removeClass('open');
    $('#navi-categories').slideUp(300, function() {
        setContentActive();
    });
    shopNavi.unregisterDocumentClickEvent();
}

ShopNavigation.prototype.preselectedShow = function() {
    shopNavi.toggleNavi();
    shopNavi.registerDocumentClickEvent();
}

ShopNavigation.prototype.preselectedHide = function() {
    shopNavi.toggleNavi();
    shopNavi.unregisterDocumentClickEvent();
}

ShopNavigation.prototype.registerDocumentClickEvent = function() {
    $(document).bind('click', function(event) {
        var clickInsideNavi = ($(event.target).parents('#navi-categories').size() > 0);
        if (!clickInsideNavi) {
            $('#button-products').click();
        }
        return true;
    });
}

ShopNavigation.prototype.unregisterDocumentClickEvent = function() {
    $(document).unbind('click');
}

/* Blend effect for content when leaving site */
$(window).bind('beforeunload', function() {
    if (!$('#content').hasClass('dontBlend')) {
        $('#loading-overlay').css({ 'z-index':1001 }).show();
        setContentInactive();
    }
});

function disableBlending() {
    if (!$('#content').hasClass('dontBlend')) {
        $('#content').addClass('dontBlend');
    }
}

function enableBlending() {
    if ($('#content').hasClass('dontBlend')) {
        $('#content').removeClass('dontBlend');
    }
}

function setContentInactive(hideLoadingText) {
    // $('#content').fadeTo(100, 0.25);
    if (hideLoadingText) {
        $('#loading-overlay').children().hide();
    } else {
        $('#loading-overlay').children().show();
    }
    var overlay = $('#loading-overlay');
    var topPadding = $('#content').height() / 2 - 10;
    overlay.css({
        'padding-top':(topPadding) + 'px',
        'height':($('#content').height() - topPadding) + 'px'
    });
    $('#loading-overlay').fadeIn(250);
}

function setContentActive() {
    // $('#content').fadeTo(100, 1);
    $('#loading-overlay').fadeOut(250);
}

