views:

77

answers:

0

I remove initialIndex:0, so http://dl.dropbox.com/u/6594481/tabs-2010/get-request1.html#two.html will get one ajax GET request in Firebug console. Unfortunately it stopped to get ajax request for http://dl.dropbox.com/u/6594481/tabs-2010/get-request1.html on IE7 and IE6, on other browsers it works fine. What is the issue for that?

check code in http://jsbin.com/ogilo/5/edit

<ul id="tabs">
    <li><a href="one.html">One</a></li>
    <li><a href="two.html">Two</a></li>
    <li><a href="three.html">Three</a></li>
</ul>
<div id="content"></div>

JavaScript:

//tab plugin http://flowplayer.org/tools/tabs/
(function($){  
    // static constructs
    $.tools = $.tools || {version: '1.2.5'};
    $.tools.tabs = {
        conf: {
            tabs: 'a',
            current: 'current',
            onBeforeClick: null,
            onClick: null, 
            effect: 'default',
   //initialIndex: 0, //it cases 2 ajax GET requests instead of 1 request 
            event: 'click',
            rotate: false,
            // 1.2
            history: false
        },
        addEffect: function(name, fn) {
            effects[name] = fn;
        }
    };
    var effects = {
        // simple "toggle" effect
        'default': function(i, done) { 
            this.getPanes().hide().eq(i).show();
            done.call();
        }, 
        /*
            configuration:
                - fadeOutSpeed (positive value does "crossfading")
                - fadeInSpeed
        */
        fade: function(i, done){        
            var conf = this.getConf(),            
                 speed = conf.fadeOutSpeed,
                 panes = this.getPanes();
            if(speed){
                panes.fadeOut(speed);    
            }else{
                panes.hide();    
            }
            panes.eq(i).fadeIn(conf.fadeInSpeed, done);    
        },
        // for basic accordions
        slide: function(i, done){
            this.getPanes().slideUp(200);
            this.getPanes().eq(i).slideDown(400, done);             
        }, 
        /**
         * AJAX effect
         */
        ajax: function(i, done){            
            this.getPanes().eq(0).load(this.getTabs().eq(i).attr("href"), done);    
        }        
    };       
    var w;
    /**
     * Horizontal accordion
     * 
     * @deprecated will be replaced with a more robust implementation
     */
    $.tools.tabs.addEffect("horizontal", function(i, done){
        // store original width of a pane into memory
        if(!w){ w = this.getPanes().eq(0).width(); }
        // set current pane's width to zero
        this.getCurrentPane().animate({width: 0}, function(){ $(this).hide(); });
        // grow opened pane to it's original width
        this.getPanes().eq(i).animate({width: w}, function(){ 
            $(this).show();
            done.call();
        });
    });    
    function Tabs(root, paneSelector, conf){
        var self = this, 
             trigger = root.add(this),
             tabs = root.find(conf.tabs),
             panes = paneSelector.jquery ? paneSelector : root.children(paneSelector),             
             current;
        // make sure tabs and panes are found
        if(!tabs.length){ tabs = root.children(); }
        if(!panes.length){ panes = root.parent().find(paneSelector); }
        if(!panes.length){ panes = $(paneSelector); }
        // public methods
        $.extend(this,{                
            click: function(i, e){
                var tab = tabs.eq(i);                                                 
                if(typeof i == 'string' && i.replace("#", "")){
                    tab = tabs.filter("[href*=" + i.replace("#", "") + "]");
                    i = Math.max(tabs.index(tab), 0);
                }        
                if(conf.rotate){
                    var last = tabs.length -1; 
                    if(i < 0){ return self.click(last, e); }
                    if(i > last){ return self.click(0, e); }                        
                }
                if(!tab.length){
                    if (current >= 0){ return self; }
                    i = conf.initialIndex;
                    tab = tabs.eq(i);
                }                
                // current tab is being clicked
                if(i === current){ return self; }
                // possibility to cancel click action                
                e = e || $.Event();
                e.type = "onBeforeClick";
                trigger.trigger(e, [i]);                
                if(e.isDefaultPrevented()){ return; }
                // call the effect
                effects[conf.effect].call(self, i, function(){
                    // onClick callback
                    e.type = "onClick";
                    trigger.trigger(e, [i]);                    
                });            
                // default behaviour
                current = i;
                tabs.removeClass(conf.current);    
                tab.addClass(conf.current);                
                return self;
            },
            getConf: function(){
                return conf;    
            },
            getTabs: function(){
                return tabs;    
            },
            getPanes: function(){
                return panes;    
            },
            getCurrentPane: function(){
                return panes.eq(current);    
            },
            getCurrentTab: function(){
                return tabs.eq(current);    
            },
            getIndex: function(){
                return current;    
            },
            next: function(){
                return self.click(current + 1);
            },
            prev: function(){
                return self.click(current - 1);    
            },
            destroy: function(){
                tabs.unbind(conf.event).removeClass(conf.current);
                panes.find("a[href^=#]").unbind("click.T"); 
                return self;
            }
        });
        // callbacks    
        $.each("onBeforeClick,onClick".split(","), function(i, name){
            // configuration
            if($.isFunction(conf[name])){
                $(self).bind(name, conf[name]); 
            }
            // API
            self[name] = function(fn){
                if(fn){ $(self).bind(name, fn); }
                return self;    
            };
        });
        if(conf.history && $.fn.history){
            $.tools.history.init(tabs);
            conf.event = 'history';
        }
        // setup click actions for each tab
        tabs.each(function(i){                 
            $(this).bind(conf.event, function(e){
                self.click(i, e);
                return e.preventDefault();
            });            
        });
        // cross tab anchor link
        panes.find("a[href^=#]").bind("click.T", function(e){
            self.click($(this).attr("href"), e);        
        });
        // open initial tab
        if(location.hash && conf.tabs == "a" && root.find("[href=" +location.hash+ "]").length){
            self.click(location.hash);
        }else{
            if(conf.initialIndex === 0 || conf.initialIndex > 0){
                self.click(conf.initialIndex);
            }
        }
    }
    // jQuery plugin implementation
    $.fn.tabs = function(paneSelector, conf){

        // return existing instance
        var el = this.data("tabs");
        if(el){ 
            el.destroy();    
            this.removeData("tabs");
        }
        if($.isFunction(conf)){
            conf = {onBeforeClick: conf};
        }
        // setup conf
        conf = $.extend({}, $.tools.tabs.conf, conf);        


        this.each(function(){                
            el = new Tabs($(this), paneSelector, conf);
            $(this).data("tabs", el); 
        });
        return conf.api ? el: this;        
    };
})(jQuery);
//history plugin http://flowplayer.org/tools/toolbox/history.html
(function($){
    var hash, iframe, links, inited;        
    $.tools = $.tools || {version: '1.2.5'};
    $.tools.history = {
        init: function(els){
            if(inited){ return; }
            // IE
            if($.browser.msie && $.browser.version < '8'){
                // create iframe that is constantly checked for hash changes
                if (!iframe) {
                    iframe = $("<iframe/>").attr("src", "javascript:false;").hide().get(0);
                    $("body").append(iframe);    
                    setInterval(function(){
                        var idoc = iframe.contentWindow.document, 
                             h = idoc.location.hash;
                        if(hash !== h){                        
                            $.event.trigger("hash", h);
                        }
                    },100);
                    setIframeLocation(location.hash || '#');
                }
            // other browsers scans for location.hash changes directly without iframe hack
            }else{ 
                setInterval(function() {
                    var h = location.hash;
                    if(h !== hash){
                        $.event.trigger("hash", h);
                    }                        
                }, 100);
            }
            links = !links ? els : links.add(els);
            els.click(function(e) {
                var href = $(this).attr("href");
                if(iframe){ setIframeLocation(href); }
                // handle non-anchor links
                if(href.slice(0, 1) != "#"){
                    location.href = "#" + href;
                    return e.preventDefault();        
                }
            }); 
            inited = true;
        }    
    };  
    function setIframeLocation(h){
        if(h){
            var doc = iframe.contentWindow.document;
            doc.open().close();    
            doc.location.hash = h;
        }
    } 
    // global histroy change listener
    $(window).bind("hash", function(e, h){ 
        if(h){
            links.filter(function(){
              var href = $(this).attr("href");
              return href == h || href == h.replace("#", ""); 
            }).trigger("history", [h]);    
        }else{
            links.eq(0).trigger("history", [h]);    
        }
        hash = h;
    });
    // jQuery plugin implementation
    $.fn.history = function(fn){
        $.tools.history.init(this);
        // return jQuery
        return this.bind("history", fn);        
    };       
})(jQuery);
$(function(){
    $("#tabs").tabs("#content", {effect: 'ajax', history: true});
});