/*
 * t1navBar - jQuery menu widget
 *
 * requires jQuery JavaScript Library
 * http://jquery.com/
 *
 */
(function($){

    var menu, t1navBar = $.fn.t1navBar = function(op){

        t1navBar.cfg = $.extend(t1navBar.defaults, op);
        menu = $(this);

        var mOver = function () {
            var $this = $(this);
            clearTimeout(menu.timerOut);
            menu.timerOver = setTimeout(function(){
                $('li.'+t1navBar.global.bcClass, menu).not($('li', $this)).execConfig('removeClass', 'breadcrumbClass');
                $this.execConfig('addClass', 'hoverClass').find('>ul:hidden').showElement().find('>li').execConfig('removeClass', 'hoverClass');
                $this.siblings().execConfig('removeClass', 'hoverClass').find('ul').hideElement();
            }, t1navBar.getConfigValues($(this).parentsUntil(menu).filter('ul').length, 'delayOver'));
        };
        
        var mOut = function () {
            clearTimeout(menu.timerOut);
            clearTimeout(menu.timerOver);
            menu.timerOut = setTimeout(function(){
                $('li', menu).execConfig('not', ['.', 'doNotHideClass']).find('>ul').hideElement();
                $('li', menu).execConfig('filter', ['.', 'doNotHideClass']).find('>ul').showElement();
                $('li', menu).execConfig('removeClass', 'hoverClass').filter('.'+t1navBar.global.bcClass).execConfig('addClass', 'breadcrumbClass');
            }, t1navBar.getConfigValues($(this).parentsUntil(menu).filter('ul').length, 'delayOut'));
        };

        $('li', menu).hover(mOver, mOut);

        if (menu.css('hasLayout') !== "") {
            $('ul', menu).HasLayoutFix().execConfig('setOffset', 'direction');
        }else{
            $('ul', menu).execConfig('setOffset', 'direction');
        }
        $('li', menu).execConfig('filter', ['.', 'breadcrumbClass']).addClass(t1navBar.global.bcClass);
        $('li', menu).execConfig('not', ['.', 'doNotHideClass']).find('>ul').hideElement();

    };
    
    t1navBar.defaults = {
        direction       : 'down',
        animate         : {opacity:'show'},
        duration        : 'normal',
        delayOver       : 100,
        delayOut        : 500,
        doNotHideClass  : 'active',
        breadcrumbClass : 'current',
        hoverClass      : 'hover',
        children        : {direction: 'right'}
    };

    t1navBar.global = {
        bcClass : 't1navBarCurrent'
    };

    t1navBar.getConfigValues = function (depth, cfgValues) {
        var config = $.extend([], t1navBar.cfg), cfg;
        cfgValues = (typeof(cfgValues)=='string')?cfgValues.split(" "):cfgValues;
        for(var i=0; i < depth; i++) {
            config = $.extend(config, config.children);
        }
        for (i=0; i<cfgValues.length; i++){
            if (cfgValues[i] in config){
                if (i == 0) {
                    cfg = config[cfgValues[i]];
                } else {
                    cfg += config[cfgValues[i]];
                }
            }else{
                if (i == 0) {
                    cfg = cfgValues[i];
                } else {
                    cfg += cfgValues[i];
                }
            }
        }

        return cfg;
    }
    
    $.fn.extend({
        execConfig : function (fct, cfgValue) {
            var $this = $(), depth;
            this.each(function () {
                    depth = $(this).parentsUntil(menu).filter('ul').length;
                switch (fct) {
                    case 'animate':
                        $this = $this.add($(this)[fct](t1navBar.getConfigValues(depth, cfgValue[0]), t1navBar.getConfigValues(depth, cfgValue[1])));
                        break;
                    default:
                        $this = $this.add($(this)[fct](t1navBar.getConfigValues(depth, cfgValue)));
                        break;
                }
            });
            return $this;
        },
        HasLayoutFix : function () {
            this.each(function(){
                if(!$(this).children('li:first').css('hasLayout')){
                    var width = 0, border = 0;
                    $(this).children('li').each(function(){
                        if($(this).innerWidth()>width){
                            width = $(this).innerWidth();
                            border = $(this).outerWidth(true)-$(this).innerWidth();
                        }
                    }).css('float', 'left').width(width);
                    $(this).width(width+border);
                }
            });
            return this;
        },
        setOffset : function(direction) {
            var parentUL = this.parents('ul:first');
            switch (direction) {
                case 'up':
                    this.css('left', 0-(this.parent('li').outerWidth()-this.parent('li').innerWidth())/2)
                        .css('bottom', parentUL.outerHeight()-(this.parent('li').outerHeight()-this.parent('li').innerHeight())/2);
                    break;
                case 'left':
                    this.css('top', 0-(this.parent('li').outerHeight()-this.parent('li').innerHeight())/2)
                        .css('right', parentUL.outerWidth()-(this.parent('li').outerWidth()-this.parent('li').innerWidth()));
                    break;
                case 'right':
                    this.css('top', 0-(this.parent('li').outerHeight()-this.parent('li').innerHeight())/2)
                        .css('left', parentUL.outerWidth()-(this.parent('li').outerWidth()-this.parent('li').innerWidth())/2);
                    break;
                case 'down':
                default:
                    this.css('left', 0-(this.parent('li').outerWidth()-this.parent('li').innerWidth())/2)
                        .css('top', parentUL.outerHeight()-(this.parent('li').outerHeight()-this.parent('li').innerHeight())/2);
                    break;
            }

            return this;
        },
        hideElement : function () {
            this.hide().css('visibility','hidden');
            return this;
        },
        showElement : function () {
            this.css('visibility','visible').execConfig('animate', ['animate', 'duration']);
            return this;
        }
    });
})(jQuery);

