Q:

Cycle array of functions with TimerEvent AS3

i'm working on a movieclip that features a small array of functions  that i'd like to execute at certain intervals.
Here is the code:
var Tmr:Timer = new Timer(1000, 3); 
var funcArray:Array = [move1, move2, move3];
var i:Number = 0;
funcArray[i]();

function kick(){
 if (i < 2) {i++; funcArray[i](); trace("GO NEXT");}
 else {i = 0; funcArray[i](); trace("FROM-START");}
 }

function timerX():void{ 
 Tmr.start();
 Tmr.addEventListener(TimerEvent.TIMER_COMPLETE, outro); 
 trace("TIMERSTART");
 }

function outro(e:TimerEvent):void{  
 e.currentTarget.removeEventListener(TimerEvent.TIMER_COMPLETE, outro);
 trace("TIMEREND");
 kick();
 }

function move1(){
 item1.x = 100;
 item1.y = 100;
 trace("MOVE1");
 timerX()
 }

function move2(){
 item1.x = 300;
 item1.y = 400
 trace("MOVE2");
 timerX();
 }

function move3(){
 item1.x = 800;
 item1.y = 600
 trace("MOVE3");
 timerX();
 }

As you see i've filled it with trace commands because... The dark magic happens after move1() has been played: apparently it starts looping the functions EVERY SECOND instead of 5, like it is depending on an Enter_Frame event.
The trace sequence in output is: MOVE1, TIMERSTART, TIMEREND, MOVE2, TIMERSTART, GO NEXT, TIMEREND, MOVE3, TIMERSTART, GO NEXT, TIMEREND, MOVE1, TIMERSTART, FROM-START...
instead of: MOVE1, TIMERSTART, TIMEREND, GO NEXT, MOVE2, TIMERSTART, TIMEREND, GO NEXT etc.
I also tried to move the kick() function up in the outro one
function outro(e:TimerEvent):void{  
 kick();
 e.currentTarget.removeEventListener(TimerEvent.TIMER_COMPLETE, outro);
 trace("TIMEREND");
 }

And the effect is that it doesn't go past move2().
Where do you think is the error? What was wrong in the logic i used to write down this?
Thanks for your kind help! 

A:

Per the timer firing every second, you've defined the Timer to dispatch timer events every 1-second; although, repeating 3 times before firing TIMER_COMPLETE. 
var Tmr:Timer = new Timer(1000, 3);

If you want the timer to fire every 5-seconds, you could just:
var Tmr:Timer = new Timer(5000);

Next up, you never stop or reset the timer.  You can stop() and start() the timer; or, if you're depending on a specific number of times for the timer to repeat, then reset() the timer.
Since it seems like you simply want an event to fire every 5-seconds infinitely, there's really no need to start / stop / reset / add new listeners  - just start the timer and listen for timer events:
var timer:Timer = new Timer(5000);
timer.addEventListener(TimerEvent.TIMER, timerHandler);
timer.start();

function timerHandler(event:TimerEvent):void {
    // timer fired
}

Putting this all together, if you just want to go from: move1, move2, move3 infinitely repeating:
import flash.utils.Timer;
import flash.events.TimerEvent;

var timer:Timer = new Timer(5000);
timer.addEventListener(TimerEvent.TIMER, timerHandler);
timer.start();

var actions:Array = [move1, move2, move3];
var i:uint = 0;

function timerHandler(event:TimerEvent):void {
    actions[i]();

    if(++i >= actions.length)
        i = 0;  
}

function move1():void {
    trace("move1");
}

function move2():void {
    trace("move2");
}

function move3():void {
    trace("move3");
}

function exit():void {
    timer.reset();
    timer.removeEventListener(TimerEvent.TIMER, timerHandler);
    timer = null;
}

