jquery accordion with columns collapse

jquery accordion with columns collapse

I put together two jquery technics:
- Masonry salvattore.js to put my boxes with content in the right order in 3 columns (working fine)
- Accordion js to expand my hidden text (problem!)

This is my working jsfiddle for that.

But my problem is: When I toggle one box in first column after that in second column and after that in third column some Title box Autollapse function and toggle function gonna crazy. In one column working fine, but how to repair that functionality in 3 columns.
I guess the problem is in '.acco' class which is the parent of my items.
Please help me with that. I would like open only one box at the time and other autocollapse.

What should I change in js script?
Please, any clue or ideas?

  1.    
        (function( window, $, undefined ) {
       
        /*
        * smartresize: debounced resize event for jQuery
        *
        * latest version and complete README available on Github:
        * https://github.com/louisremi/jquery.smartresize.js
        *
        * Copyright 2011 @louis_remi
        * Licensed under the MIT license.
        */

        var $event = $.event, resizeTimeout;

        $event.special.smartresize     = {
            setup: function() {
                $(this).bind( "resize", $event.special.smartresize.handler );
            },
            teardown: function() {
                $(this).unbind( "resize", $event.special.smartresize.handler );
            },
            handler: function( event, execAsap ) {
                // Save the context
                var context = this,
                    args     = arguments;

                // set correct event type
                event.type = "smartresize";

                if ( resizeTimeout ) { clearTimeout( resizeTimeout ); }
                resizeTimeout = setTimeout(function() {
                    jQuery.event.handle.apply( context, args );
                }, execAsap === "execAsap"? 0 : 100 );
            }
        };

        $.fn.smartresize             = function( fn ) {
            return fn ? this.bind( "smartresize", fn ) : this.trigger( "smartresize", ["execAsap"] );
        };
       
        $.Accordion                 = function( options, element ) {
       
            this.$el            = $( element );
            // list items
            this.$items            = this.$el.children('div.acco').children('div.acco-item');
            // total number of items
            this.itemsCount        = this.$items.length;
           
            // initialize accordion
            this._init( options );
           
        };
       
        $.Accordion.defaults         = {
            // index of opened item. -1 means all are closed by default.
            open            : -1,
            // if set to true, only one item can be opened. Once one item is opened, any other that is opened will be closed first
            oneOpenedItem    : false,
            // speed of the open / close item animation
            speed            : 600,
            // easing of the open / close item animation
            easing            : 'easeInOutExpo',
            // speed of the scroll to action animation
            scrollSpeed        : 900,
            // easing of the scroll to action animation
            scrollEasing    : 'easeInOutExpo'
        };
       
        $.Accordion.prototype         = {
            _init                 : function( options ) {
               
                this.options         = $.extend( true, {}, $.Accordion.defaults, options );
               
                // validate options
                this._validate();
               
                // current is the index of the opened item
                this.current        = this.options.open;
               
                // hide the contents so we can fade it in afterwards
                this.$items.find('div.st-content').hide();
               
                // save original height and top of each item   
                this._saveDimValues();
               
                // if we want a default opened item...
                if( this.current != -1 )
                    this._toggleItem( this.$items.eq( this.current ) );
               
                // initialize the events
                this._initEvents();
               
            },
            _saveDimValues        : function() {
           
                this.$items.each( function() {
                   
                    var $item        = $(this);
                   
                    $item.data({
                        originalHeight     : $item.find('a:first').height(),
                        offsetTop        : $item.offset().top
                    });
                   
                });
               
            },
            // validate options
            _validate            : function() {
           
                // open must be between -1 and total number of items, otherwise we set it to -1
                if( this.options.open < -1 || this.options.open > this.itemsCount - 1 )
                    this.options.open = -1;
            
            },
            _initEvents            : function() {
               
                var instance    = this;
               
                // open / close item
                this.$items.find('a:first').bind('click.accordion', function( event ) {
                   
                    var $item            = $(this).parent();
                   
                    // close any opened item if oneOpenedItem is true
                    if( instance.options.oneOpenedItem && instance._isOpened() && instance.current!== $item.index() ) {
                       
                        instance._toggleItem( instance.$items.eq( instance.current ) );
                   
                    }
                   
                    // this.current.removeClass("st-open");
                   
                   
                    // open / close item
                    instance._toggleItem( $item );
                   
                    return false;
               
                });
               
                $(window).bind('smartresize.accordion', function( event ) {
                   
                    // reset orinal item values
                    instance._saveDimValues();
               
                    // reset the content's height of any item that is currently opened
                    instance.$el.find('div.acco-item.st-open').each( function() {
                       
                        var $this    = $(this);
                        $this.css( 'height', $this.data( 'originalHeight' ) + $this.find('div.st-content').outerHeight( true ) );
                   
                    });
                   
                    // scroll to current
                    if( instance._isOpened() )
                    instance._scroll();
                   
                });
               
            },
            // checks if there is any opened item
            _isOpened            : function() {
           
                return ( this.$el.find('.acco-item.st-open').length > 0 );
           
            },
            // open / close item
            _toggleItem            : function( $item ) {
               
                var $content = $item.find('div.st-content');
               
                ( $item.hasClass( 'st-open' ) )
                       
                    ? ( this.current = -1, $content.stop(true, true).fadeOut( this.options.speed ), $item.removeClass( 'st-open' ).stop().animate({
                        height    : $item.data( 'originalHeight' )
                    }, this.options.speed, this.options.easing ) )
                   
                    : ( this.current = $item.index(), $content.stop(true, true).fadeIn( this.options.speed ), $item.addClass( 'st-open' ).stop().animate({
                        height    : $item.data( 'originalHeight' ) + $content.outerHeight( true )
                    }, this.options.speed, this.options.easing ), this._scroll( this ) )
           
            },
            // scrolls to current item or last opened item if current is -1
            _scroll                : function( instance ) {
               
                var instance    = instance || this, current;
               
                ( instance.current !== -1 ) ? current = instance.current : current = instance.$el.find('div.acco-item.st-open:last').index();
               
                $('html, body').stop().animate({
                    scrollTop    : ( instance.options.oneOpenedItem ) ? instance.$items.eq( current ).data( '0' ) : instance.$items.eq( current ).offset().top
                }, instance.options.scrollSpeed, instance.options.scrollEasing );
           
            }
        };
       
        var logError                 = function( message ) {
           
            if ( this.console ) {
               
                console.error( message );
               
            }
           
        };
       
        $.fn.accordion                 = function( options ) {
       
            if ( typeof options === 'string' ) {
           
                var args = Array.prototype.slice.call( arguments, 1 );

                this.each(function() {
               
                    var instance = $.data( this, 'accordion' );
                   
                    if ( !instance ) {
                        logError( "cannot call methods on accordion prior to initialization; " +
                        "attempted to call method '" + options + "'" );
                        return;
                    }
                   
                    if ( !$.isFunction( instance[options] ) || options.charAt(0) === "_" ) {
                        logError( "no such method '" + options + "' for accordion instance" );
                        return;
                    }
                   
                    instance[ options ].apply( instance, args );
               
                });
           
            }
            else {
           
                this.each(function() {
                    var instance = $.data( this, 'accordion' );
                    if ( !instance ) {
                        $.data( this, 'accordion', new $.Accordion( options, this ) );
                    }
                });
           
            }
           
            return this;
           
        };
       
        })( window, jQuery );

        $(function() {
               
                    $('#timeline').accordion({
                        oneOpenedItem    : true
                    });
                   
                });


Thanks in advance,
jan