docs: function(opt) {
       var viz = this.viz,
           graph  = viz.graph,
           animation = this.nodeFxAnimation,
           options = $.merge(this.viz.config, {
             'elements': {
               'id': false,
               'properties': {}
             },
             'reposition': false
           });
       opt = $.merge(options, opt || {}, {
         onBeforeCompute: $.empty,
         onAfterCompute: $.empty
       });
       //check if an animation is running
       animation.stopTimer();
       var props = opt.elements.properties;
       //set end values for nodes
       if(!opt.elements.id) {
         graph.eachNode(function(n) {
           for(var prop in props) {
             n.setData(prop, props[prop], 'end');
           }
         });
       } else {
         var ids = $.splat(opt.elements.id);
         $.each(ids, function(id) {
           var n = graph.getNode(id);
           if(n) {
             for(var prop in props) {
               n.setData(prop, props[prop], 'end');
             }
           }
         });
       }
       //get keys
       var propnames = [];
       for(var prop in props) propnames.push(prop);
       //add node properties modes
       var modes = ['node-property:' + propnames.join(':')];
       //set new node positions
       if(opt.reposition) {
         modes.push('linear');
         viz.compute('end');
       }
       //animate
       this.animate($.merge(opt, {
         modes: modes,
         type: 'nodefx'
       }));
     }