function Counter(digits_number, container_id) 
{
    this.unique_id = 'id_' + Math.random().toString().replace('.', '_');
    this.digits = new Array(digits_number);
    this.update_digits = new Array(digits_number);
    this.update_sub_digits = new Array(digits_number);
    this.container_id = container_id;
    
    for (var i = 0; i < digits_number; i ++)
    {
        this.digits[i] = 0;
    } // for
    
    this.Init = function(value, index)
    {
        var int_value = parseInt(value);
        
        if (this.digits.length < value.toString().length)
        {
            this.digits = new Array(value.toString().length);
        } // if
        for (var i = 0; i < this.digits.length; i ++)
        {
            this.digits[i] = Math.floor(int_value % 10);
            int_value = Math.floor(int_value / 10);
        } // for
        
        this.Draw(index);
    };
    
    this.Draw = function(index)
    {
        if (typeof(document.getElementById(this.container_id)) != 'undefined')
        {
            var container = document.getElementById(this.container_id);
            if (isNaN(index))
            {
                for (i = this.digits.length - 1; i >= 0; i --)
                {
                    var element = document.createElement('span');
                    element.setAttribute('id', this.unique_id + '_' + i);
                    element.setAttribute('class', 'counter_d counter_d_' + this.digits[i]);
                    element.setAttribute('className', 'counter_d counter_d_' + this.digits[i]);
                    container.appendChild(element);
                    
                    var node = document.createTextNode('\u00a0');
                    container.appendChild(node);
                    
                    if ((i % 3) == 0 && (i != 0))
                    {
                        var element = document.createElement('span');
                        element.setAttribute('class', 'counter_d counter_comma');
                        element.setAttribute('className', 'counter_d counter_comma');
                        container.appendChild(element);
                        
                        var node = document.createTextNode('\u00a0');
                        container.appendChild(node);
                    } // if
                } // for
            } // if
            else
            {
                var i = index;
                var element = document.createElement('span');
                element.setAttribute('id', this.unique_id + '_' + i);
                element.setAttribute('class', 'counter_d counter_d_' + this.digits[i]);
                element.setAttribute('className', 'counter_d counter_d_' + this.digits[i]);
                
                var innerHtml = container.innerHTML;
                container.innerHTML = '';
                    
                container.appendChild(element);
                
                var node = document.createTextNode('\u00a0');
                container.appendChild(node);
                
                if ((i % 3) == 0 && (i != 0))
                {
                    var element = document.createElement('span');
                    element.setAttribute('class', 'counter_d counter_comma');
                    element.setAttribute('className', 'counter_d counter_comma');
                    container.appendChild(element);
                    
                    var node = document.createTextNode('\u00a0');
                    container.appendChild(node);
                } // if
                
                container.innerHTML += innerHtml;
                
                for (i = this.digits.length - 2; i >= 0; i --)
                {
                    this.UpdateDigit(i, this.digits[i]);
                } // for
            } // else
        } // if
    };
    
    this.IncrementDigit = function(digit_index, new_value)
    {
        if (this.update_digits[digit_index] >= 9)
        {
            this.update_digits[digit_index] = 0;
        } // if
        else
        {
            this.update_digits[digit_index] ++;
        } // else
        
        
        var css_class = 'counter_d_' + this.update_digits[digit_index];
        if (this.update_sub_digits[digit_index] != 0)
        {
            css_class += '_' + this.update_sub_digits[digit_index];
        } // if
        document.getElementById(this.unique_id + '_' + digit_index).setAttribute('class', 'counter_d ' + css_class);
        document.getElementById(this.unique_id + '_' + digit_index).setAttribute('className', 'counter_d ' + css_class);

        
        if (this.update_digits[digit_index] != new_value)
        {
            var obj = this;
            setTimeout(function() { obj.IncrementSubDigit(digit_index, new_value); }, 50);
        } // if
        else
        {
            this.digits[digit_index] = new_value;
        } // else
    };
    
    this.IncrementSubDigit = function(digit_index, new_value)
    {
        if (this.update_sub_digits[digit_index] >= 2)
        {
            this.update_sub_digits[digit_index] = 0;
            this.IncrementDigit(digit_index, new_value);
            return true;
        } // if
        else
        {
            this.update_sub_digits[digit_index] ++;
        } // else
        
        var css_class = 'counter_d_' + this.update_digits[digit_index];
        if (this.update_sub_digits[digit_index] != 0)
        {
            css_class += '_' + this.update_sub_digits[digit_index];
        } // if
        
        document.getElementById(this.unique_id + '_' + digit_index).setAttribute('class', 'counter_d ' + css_class);
        document.getElementById(this.unique_id + '_' + digit_index).setAttribute('className', 'counter_d ' + css_class);
        
        var obj = this;
        setTimeout(function() { obj.IncrementSubDigit(digit_index, new_value); }, 50);
    };
    
    this.UpdateDigit = function(digit_index, new_value)
    {
        this.update_digits[digit_index] = this.digits[digit_index];
        this.update_sub_digits[digit_index] = 0;
        
        var obj = this;
        setTimeout(function() { obj.IncrementSubDigit(digit_index, new_value); }, 50);
    };
    
    this.Update = function(new_value)
    {
        var int_new_value = parseInt(new_value);
        digits_number = new_value.toString().length;
        if (digits_number > this.digits.length)
        {
            this.digits = new Array(digits_number);
            this.update_digits = new Array(digits_number);
            this.update_sub_digits = new Array(digits_number);
            this.Init(new_value, digits_number - 1);
        }
        
        for (var i = 0; i < this.digits.length; i ++)
        {
            if (this.digits[i] != Math.floor(int_new_value % 10))
            {
                this.UpdateDigit(i, Math.floor(int_new_value % 10));
            } // if
            int_new_value = Math.floor(int_new_value / 10);
        } // for
    }
}

