/*

    To init just write:
    
    $(function(){

        $('.Tabs').myTabs();
        
    });

*/

jQuery.fn.myTabs = function(options){
    
    var defaults = {
        defaultTabs: [], // массив табов, которые активны по дефолту, например ['#tab1', '#r8']
        hash: false, // принимать ли параметр активной панели из урл ?
        arrNext: false,
        arrPrev: false,
        effect: false // эффект при переключении табов
    }

    var settings = $.extend({}, defaults, options);
    
    // запрещаем фэйд эффект для ИЕ
    if ($.browser.msie && settings.effect === 'fade') settings.effect = false;
    
    var activeState = 'ActiveState';
    var hiddenState = 'HiddenState';
    var disabledState = 'DisabledState';//TODO: Сделать disable состояние
    
    

    // on domready
    $(this).each(function(){
        
        var $this = $(this);
        var navElements = $this.find('ul:first li');
        var panels = $this.find('.Panel');
        
        $this.navElements = $this.find('ul:first li');
        $this.panels = $this.find('.Panel');
        $this.activeState = 'ActiveState';
        $this.hiddenState = 'HiddenState';
        $this.disabled = 'disabled';
        $this.settings = settings;

        $this.navElements.find('a').click(function(e){
            e.preventDefault();
            this.blur();
            var $a = $(this);
            var panelToActivate = $( $a.attr('href') );
            if(panelToActivate.length){// если существет такая панель
                
                $this.switchOnPanel(panels.filter('.'+activeState), panelToActivate, {effect: $this.settings.effect});
                
                // активируем элемент навигации(li)
                $this.navElements.filter('.'+$this.activeState).removeClass($this.activeState);
                $a.parents('li:first').addClass($this.activeState);

                /* управляем видимостью стрелочек */
                if (settings.arrNext) {
                        
                    var li = $a.parents('li:first');
                    if (li.is(':last-child')) {
                        settings.arrNext.addClass($this.disabled);
                    } else {
                        settings.arrNext.removeClass($this.disabled);
                    } 
                    
                    if (li.is(':first-child')) {
                        settings.arrPrev.addClass($this.disabled);
                    } else {
                        settings.arrPrev.removeClass($this.disabled);
                    } 
    
                }
                
                if ( settings.hash ) {
                    window.location.hash = $a.attr('href')+'!'; // также добавляем хак-символ '!'
                }
                
                
            }else{
                alert('Ошибка в myTabs:\n Элемент '+$a.attr('href')+' не существует')
            }
        });
        
        // кнопки prev/next
        settings.arrNext.click(function(){
            if (!$(this).hasClass($this.disabled)) {
                prevNext(navElements, 'next');
            }
        });
        settings.arrPrev.click(function(){
            if (!$(this).hasClass($this.disabled)) {
                prevNext(navElements, 'prev');
            }
        });


        // прячем все панели
        panels.addClass(hiddenState);
        var panel_activated = false; // ниодна панель не активирована

        // активируем панель, если ее передали по url (#a1!)
        if ( settings.hash ) {
            var hash = window.location.hash.replace('!', ''); // убираем хак-символ
            var target = navElements.find('a[href='+ hash +']');
            if (target.length) {
                target.click();
                panel_activated = true;
            }
        }
            
        if ( !panel_activated ) { // если нет панели по урл
            // активируем табы подефолту
            for (var i = 0; i < settings.defaultTabs.length; i++) {
                var default_target = navElements.find('a[href='+ settings.defaultTabs[i] +']');
                if (default_target.length > 0) { // если есть линк для активации деф. панели
                    default_target.click(); //активируем панель
                    panel_activated = true; // дефолтная панель активирована
                }
                
            }
        }
        
        if ( !panel_activated ){ // если нет панели ни по урл, ни по дефолту
            navElements.filter(':first').find('a').click(); // активируем первыую панель
        }
            
    });
    



    function prevNext(navElements, op) {
        var current = navElements.filter('.'+activeState);
        
        switch (op) {
            case 'next':
                            var next = current.next();
                            if (next.length) {
                                current.removeClass('.'+activeState);
                                next.find('a').click();
                            }
                break;
                
            case 'prev':
                            var prev = current.prev();
                            if (prev.length) {
                                current.removeClass('.'+activeState);
                                prev.find('a').click();
                            }
                break;
        }
    }    

}

$.fn.switchOnPanel = function(fromPanel, panelToSwitchOn, options){
    var $this = this;
    var defaults = {
        effect: false
    };
    var settings = $.extend({}, defaults, options);
    
    if (settings.effect === 'fade'){
        // деактивируем предыдущую панель
        fromPanel.hidePanel(settings.effect, this, function(){
            // активируем новую панель 
            panelToSwitchOn.showPanel(settings.effect, $this);
        });
    } else {
        // деактивируем предыдущую панель
        fromPanel.hidePanel(settings.effect, this);
        // активируем новую панель 
        panelToSwitchOn.showPanel(settings.effect, this);
    }
        
}

$.fn.showPanel = function(effect, globalObject, callback){
    callback = callback || new Function;
    if (this.length) {
        switch (effect) {
            case 'fade':    this.showPanel(false, globalObject);
                            this.animate({'opacity': '1'}, 500, callback);
                break;
                
            default:        this.removeClass(globalObject.hiddenState).addClass(globalObject.activeState);
                break;
        }
    } else {
        callback();
    }
    return this;
}
$.fn.hidePanel = function(effect, globalObject, callback){
    callback = callback || new Function;
    if (this.length) {
        switch (effect) {
            case 'fade':    this.animate({'opacity': '0'}, 500, function(){
                                 var $this = $(this);
                                 $this.hidePanel(false, globalObject);
                                 callback();
                            });
                break;
                
            default:        this.removeClass(globalObject.activeState).addClass(globalObject.hiddenState);
                break;
        }
    } else {
        callback();
    }
    return this;
}

