jQuery(document).ready(function(){
    
    function jumpTop(){
        this.arguments.obj.animate({ marginTop: 0 }, 300, this.next );
    } 
    
    function jumpBottom(){
        this.arguments.obj.animate({ marginTop: 180 }, 300, this.next );
    }   
    
    function jumpLeft(){
        this.arguments.obj.animate({ marginLeft: '-=200' }, 300, this.next );
    }     
    
    function jumpRight(){
        this.arguments.obj.animate({ marginLeft: '+=200' }, 300, this.next );
    }   

    function getBigger(){
        this.arguments.obj.animate({ width: '+=50', height : '+=50' }, 300, this.next );
    }  
    
    function getSmaller(){
        this.arguments.obj.animate({ width: '-=50', height : '-=50' }, 300, this.next );
    }   
    
        
    var elem0   = jQuery('#elem0');
    var test0  = {};
    var chain0 = $$._arguments({ obj : elem0 })
        ._chain( jumpRight )
        ._chain( jumpTop )            
        ._chain( jumpRight )                       
        ._chain( jumpBottom )
        ._chain( jumpLeft )
        ._chain( jumpTop )
        ._chain( jumpLeft )
        ._chain( jumpBottom );
        
    jQuery('#test0_run').bind('click', function(){
        if (! test0.running ) test0 = chain0._run();
    }); 
    
    var elem1   = jQuery('#elem1_1');
    var test1_1  = {};
    var chain1_1 = $$._chain( jumpTop ) // Цепочка1
        ._chain( getBigger )            
        ._chain( jumpRight )
        ._chain( getSmaller )                            
        ._chain( jumpBottom )
        ._chain( jumpLeft );
        
    jQuery('#test1_1_run').bind('click', function(){
        if ( (! test1_1.running) && (! test1_3.running ) ) 
            test1_1 = $$._arguments({ obj : elem1 })._chain( chain1_1 )._run();
    }); 
    
    var chain1_2 = $$._chain( jumpRight ) // Цепочка2
        ._chain( jumpTop )   
        ._chain( getBigger )                              
        ._chain( jumpRight )  
        ._chain( getSmaller )                               
        ._chain( jumpBottom )
        ._chain( jumpLeft )                         
        ._chain( jumpLeft );  

    jQuery('#test1_2_run').bind('click', function(){
        if ( (! test1_1.running) && (! test1_3.running ) ) 
            test1_1 = $$._arguments({ obj : elem1 })._chain( chain1_2 )._run();
    });   
    
    var elem2  = jQuery('#elem1_2');        
    var test1_2  = {};    
    var chain1_3 = $$._arguments({ obj : elem2 }) // Цепочка3
        ._chain( chain1_1 )
        ._chain( chain1_2 );
        
    jQuery('#test1_3_run').bind('click', function(){
        if ( (! test1_2.running ) && (! test1_3.running ) ) 
            test1_2 = chain1_3._run();
    });
    
    var test1_3 = {};  
    var chain1_4 = $$._arguments({ obj : elem2 }) // Цепочка4
        ._chain( chain1_1 )
        ._arguments({ obj : elem1 })
        ._chain( chain1_2 );        
    
    jQuery('#test1_4_run').bind('click', function(){
        if ( (! test1_1.running ) && (! test1_2.running ) && (! test1_3.running ) ) 
            test1_3 = chain1_4._run();
    });    

    
    
    var elem2      = jQuery('#elem2');
    var test2      = {};
    var chain2     = $$._arguments({ obj : elem2 })._chain( jumpTop )._chain( jumpBottom );    
        
    jQuery('#test2_run').bind('click', function(){
        if (! test2.running){
            test2 = chain2._run();
        } else {
            test2._chain( jumpTop )._chain( jumpBottom );
        }
    });  
    
    
    var elem3  = jQuery('#elem3');
    var test3  = {};
    var chain3 = $$._arguments({ obj : elem3 })
        ._chain( jumpTop )
        ._chain( jumpRight )
        ._chain( function( className ){
            this.arguments.obj.addClass( className );
            this.next({ classToRemove : className });
        }, [ 'green_obj' ])
        ._chain( jumpBottom )
        ._chain( jumpLeft )
        ._chain( function(){
            this.arguments.obj.removeClass( this.arguments.classToRemove );  
            this.next();
        });    
        
    jQuery('#test3_run').bind('click', function(){
        if (! test3.running) test3 = chain3._run();
    });    
    
});
