﻿function fadeObject(id, c1, c2, s1, s2) {
    var self = this;
    this.id = id;
    this.elem = false;
    this.colour = {
        stt: [parseInt(c1.substr(0, 2), 16), parseInt(c1.substr(2, 2), 16), parseInt(c1.substr(4, 2), 16)],
        end: [parseInt(c2.substr(0, 2), 16), parseInt(c2.substr(2, 2), 16), parseInt(c2.substr(4, 2), 16)],
        now: [parseInt(c1.substr(0, 2), 16), parseInt(c1.substr(2, 2), 16), parseInt(c1.substr(4, 2), 16)]
    };
    this.steps = [s1, s2];
    this.dir = false;
    this.active = false;
    this.queue = [];
    this.msg = [];
    this.message = 0;
    function d2h(num) {
        num = Math.round(num);
        return ((num < 16) ? "0" : "") + num.toString(16);
    }
    this.fade = function(message, direction) {
        this.elem = this.elem || document.getElementById(this.id);
        this.queue.push([message, direction]);
        for (var x = 0; x < this.queue.length; x++) {
            for (var y = x + 1; y < this.queue.length; y++) {
                if (this.queue[x][0] == this.queue[y][0] && this.queue[x][1] != this.queue[y][1]) {
                    this.queue.splice(x, 1);
                    this.queue.splice(y - 1, 1);
                }
            }
        }
        if (!this.active) setTimeout(function() { self.fadeLoop(); }, 10);
    };
    this.fadeLoop = function() {
        if (!this.active && this.queue.length) {
            if (this.dir && this.message != this.queue[0][0]) this.queue.unshift([this.message, false]);
            var msg = this.queue.shift();
            if (this.msg[msg[0]]) {
                this.active = true;
                this.elem.innerHTML = this.msg[this.message = msg[0]];
                this.dir = msg[1];
            }
        }
        if (this.dir) {
            var c1 = this.colour.stt, c2 = this.colour.end, s = this.steps[0];
        } else var c1 = this.colour.end, c2 = this.colour.stt, s = this.steps[1];
        for (var x = 0, cnow = "", inc = 0; x < 3; x++) {
            this.colour.now[x] += inc = (c2[x] - c1[x]) / s;
            cnow += this.colour.now[x] = (inc < 0) ? Math.max(this.colour.now[x], c2[x]) : Math.min(this.colour.now[x], c2[x]);
        } this.elem.style.color = "#" + d2h(this.colour.now[0]) + d2h(this.colour.now[1]) + d2h(this.colour.now[2]);
        if (cnow == c2.join("")) {
            this.active = false;
            if (!this.queue.length) {
                if (!this.dir) {
                    if (this.msg[0]) {
                        this.queue.push([0, true]);
                        setTimeout(function() { self.fadeLoop(); }, 10);
                    } else this.elem.innerHTML = "&nbsp;";
                }
            } else setTimeout(function() { self.fadeLoop(); }, 10);
        } else setTimeout(function() { self.fadeLoop(); }, 10);
    };
    if (window.addEventListener) {
        window.addEventListener('load', function() { self.fade(0, true); }, false);
    } else if (window.attachEvent)
        window.attachEvent('onload', function() { self.fade(0, true); });
}