function llx3_Animator() {
    var This = this;
    var Steps = new Array();
    var Counters = new Array();

    this.interval = 1;


    this.set = function (element, handler, parameter) {
        var as = new AnimationStep();
        as.animator = This;
        as.element = element;
        as.handler = handler;
        as.parameter = parameter;
        for (var i = 0; i < Steps.length; i++) { if (Steps[i].element == element) { Steps[i] = as; return; } }
        Steps.push(as);
    }

    

    this.start = function () { setInterval(exec, This.interval); }

    function exec() {
        for (var i = 0; i < Steps.length; i++) {
            if (Steps[i].removing) {
                Steps.splice(i, 1);return;
            } else {
                 Steps[i].invoke();
            }
         }
    }

//    this.remove = function (element, handler) {
//        for (var i = 0; i < Steps.length; i++) {
//            if ((Steps[i].element == element) && (Steps[i].handler == handler)) { Steps.splice(i, 1); return; }
//        }
//    }

    this.getCounter = function (element, name) {
        for (var i = 0; i < Counters.length; i++) { if ((Counters[i].element == element) && (Counters[i].name == name)) return Counters[i]; }
        var counter = new Counter();
        counter.element = element;
        counter.name = name;
        Counters.push(counter);
        return counter;
    }


    function AnimationStep() {
        var This = this;
        var animator = null;
        this.element = null;
        this.handler = function () { };
        this.enabled = true;
        this.parameter = null;
        this.removing = false;
        var startTime = new Date();

        this.remove = function () {
            This.removing = true;
        }
        this.invoke = function () { This.handler(This); }
        this.getElapsedTime = function () { return (new Date().getTime() - startTime.getTime()); }
        this.getPerc = function (duration) { var perc = Math.round((100 * This.getElapsedTime() / duration)); if (perc > 100) perc = 100; return perc; }
        this.reset = function () { startTime = new Date() }
    }

    function Counter() {
        this.value = 0;
        this.element = null;
        this.name = "";
    }

 }
