// *** USAGE *** //

window.addEvent('domready',function(){

    myStorehouse = new Storehouse();
        
    $('store_red').addEvent('click',function(){
        if(!myStorehouse.red){ // not stored
            this.set('text','inject red');
            
            // store it
            myStorehouse.store('red', 'div.red'); 
            
            // or use `myStorehouse.dispose('red', 'div.red')`
            // `store` and `dispose` are interchangable
            // elements now accessible by `myStorehouse.red`

        } else {
            this.set('text','dispose red');        
            
            myStorehouse.inject('red');
            // injects elements back where they belong
            
        }
    });
    
    // StoreHouse supports as many collections of elements as you want
    $('store_green').addEvent('click',function(){
        if(!myStorehouse.green){
            this.set('text','inject green');
            
            myStorehouse.dispose('green','div.green');
            // elements stored in myStorehouse.green
            
        } else {
            this.set('text','dispose green');
            myStorehouse.inject('green');
        }
        
    });
    
});

// *** THE CLASS *** //

var Storehouse = new Class({
    
    dispose: function(shelf, elements){
        this[shelf] = [];
        $$(elements).each(function(element){
            if(element.getPrevious()){
                element.store('previous',element.getPrevious());
            } else if(element.getNext()) {
                element.store('next',element.getNext());
            } else {
                element.store('parent',element.getParent());
            };
            this[shelf].include(element.dispose());
        }.bind(this));
        return this;
    },
    
    inject: function(shelf){
        this[shelf].reverse().each(function(element){
            var previous = element.retrieve('previous');
            var next = element.retrieve('next');
            var parent = element.retrieve('parent');
            if(previous){
                element.inject(previous,'after');
            } else if(next) {
                element.inject(next,'before');
            } else {
                element.inject(parent);
            }
        });
        delete this[shelf];
        return this;
    },
    
    store: function(shelf, elements){
        return this.dispose(shelf, elements);
    }

});

<h3>Should dispose the elements and inject them back into the DOM to their original positions</h3>

<p>
    <button id="store_red">dispose red</button>
</p>

<div class="container">
    <div class="red">1</div>
    <div class="red">2</div>
    <div>3</div>
    <div class="red">4</div>
    <div class="red">5</div>
    <div>6</div>    
</div>

<p style="clear:both; padding-top: 20px">
    <button id="store_green">dispose green</button>
</p>
<div class="container">
    <div>1</div>
    <div class="green">2</div>
    <div>3</div>
    <div class="green">4</div>
    <div>5</div>
    <div class="green">6</div>
</div>