/*
    Log: A simple logging class in JS
    <l.m.orchard@pobox.com> http://www.decafbad.com
*/

function Log(ele) { this.init(ele); }

Log.prototype = {
    
    levels: {
        FATAL:   10,
        ERROR:   20,
        WARN:    30,
        INFO:    40,
        DEBUG:   50,
        DEBUG2:  60,
        DEBUG3:  70,
        ALL:    999
    },
    
    init: function(ele_or_id) {
        this.inv_levels = {};
        for (var k in this.levels) 
            this.inv_levels[this.levels[k]] = k;
        this.setOutput(ele_or_id);
        this.setLevel(this.levels.ERROR);
    },

    setOutput: function(ele_or_id) {
        this.ele = document.getElementById(ele_or_id);
        if (!this.ele) this.ele = ele_or_id;

    },
    
    setLevel: function(level) {
        this.level = level;
    },

    fatal:  function(msg) { this.log(this.levels.FATAL,  msg); },
    error:  function(msg) { this.log(this.levels.ERROR,  msg); },
    warn:   function(msg) { this.log(this.levels.WARN,   msg); },
    info:   function(msg) { this.log(this.levels.INFO,   msg); },
    debug:  function(msg) { this.log(this.levels.DEBUG,  msg); },
    debug2: function(msg) { this.log(this.levels.DEBUG2, msg); },
    debug3: function(msg) { this.log(this.levels.DEBUG3, msg); },

    log: function(level, msg) {
        if ( (this.ele) && (level <= this.level) ) {
            var txt = this.formatMessage(level, msg);
            this._appendLine(txt);
        }
    },
 
    _pad00: function(i) { return (i < 10) ? '0'+i : i; },
    
    formatMessage: function(level, msg) {
        var txt_level = this.inv_levels[level] || level;
        txt_level = ("["+txt_level+"]          ").substring(0,9);
        var now = new Date();
        var now_txt = this._pad00(now.getHours())+":"+
                      this._pad00(now.getMinutes())+":"+
                      this._pad00(now.getSeconds());
        return now_txt+' '+txt_level+' '+msg;
    },

    _appendLine: function(txt) {
        if (this.ele.type == "textarea") {
            var old_val = this.ele.value;
            old_val += txt + "\n";
            this.ele.value = old_val;
            this.ele.scrollTop = this.ele.scrollHeight;
        } else if (this.ele.innerHTML) {
            var old_val = this.ele.innerHTML;
            old_val += txt + "<br />\n";
            this.ele.innerHTML = txt;
        } else {
            this.ele += txt + "\n";
        };
    }
};

