function jquery_animate() {

    this.status = false;
    this.now = null;
    this.last = null;
    this.timer = null;
    this.cycle = [];
    this.items = [];
    this.interval = 1000;
    this.was_running  = false;

    this.push = function (item) {

        this.items.push(item);
    };

    this.setSequence = function (sequence) {
        this.sequence_callback = sequence;
    };

    this.getNext = function () {

        if (this.items.length == this.cycle.length) 
            this.cycle = [];

        this.now = this.items[this.cycle.length];
        this.last = this.now;
        this.cycle.push(this.now);
        return this.now;
    };

    this.sequence_callback = this.getNext;

    this.interrupt = function () {
        if (this.status == true) {
            this.stop();
            this.was_running = true;
        } 
        else
        {
            this.was_running = false;
            
        }
    };

    this.restart = function () {
        if (this.was_running == true) {
            if (this.change_direction && this.change_direction != 'next') {
                this.cycle.push(this.last);
            }
            this.change_direction = 'next';                 
            this.start();
        } 
    };
    
    this.stop = function () {
        this.status = false;
        window.clearInterval(this.timer);
    };

    this.start = function () {
        this.status = true;        
        var that = this;
        this.timer = window.setInterval(function () 
        {
            var anim = [ that.last ];
            anim.push(that.sequence_callback());
            that.animate_callback(anim);
        }, this.interval);
    };

    this.run = function (timeout, startwith, callback) {

        if (timeout) 
            this.interval = timeout;

        if (callback) 
            this.animate_callback = callback;

        if (startwith) {
            this.last = this.items[startwith];
            for (var i=0; i < startwith+1; i++)
                this.cycle.push(this.items[i]);
        } else 
            this.sequence_callback();

        this.animate_callback([this.last]);
        this.start();
    };

    this.animate = function (para) {

        if (para.length < 2) {
            para[0].show();
        } else {
            para[0].fadeOut(250);
            para[1].fadeIn(250);
        }
    }

    this.animate_callback = this.animate;

    this.terminal_callback = null;

    this.setTerminal = function (terminal) {

        this.terminal_callback = terminal;
    };

    this.toggle = function (scope) {

        if (this.status) 
            this.stop();
        else
            this.start();

        if (this.terminal_callback) 
            this.terminal_callback(scope);
    };
}