/**
 * Depends on jQuery, UtBase and UtMessager
 * 
 * @param params
 * @return
 */
function UtLogger(params) {
    params = this.init_params(params);
    
    this.container_id = params.container_id;
    
    var self = this;
    
    jQuery(document).ready(function(){
        self._initialize();
    });
}


UtLogger.prototype = new UtBase();


UtLogger.prototype.defaults = {};

UtLogger.prototype.container_id     = null;
UtLogger.prototype.container        = null;

UtLogger.prototype.buffer           = [];
UtLogger.prototype._initialized     = false;
UtLogger.prototype.auto_flush       = false;


UtLogger.prototype._initialize = function() {
    this._initialized = true;
    this.container = jQuery("#"+this.container_id);
    this.auto_flush = true;
    this.flush();
    
    this.debug("Javascript logger initialized");
};


UtLogger.prototype.trace = function(msg) {
    var strCaller   = "";
    var strStack    = "";
    
    var a_callee = arguments.callee;
    var a_caller = a_callee.caller;
    if (a_caller) {
        strCaller += " -- caller:"+a_caller.name+"()";
        
        try { throw Error(''); } catch(err) {
            var error = err;
            var full_stack = error.stack;
            if (full_stack) {
                strStack = " -- stacktrace:" + full_stack.substring(12);
            }
        }
    }
    
    var elNode = jQuery('<li></li>');
    
    var messager = new UtMessager({node: elNode});
    messager.setClass('logger-trace');
    messager.setMessage("TRACE " + msg + strCaller + strStack);
    
    this.buffer.push(messager);
    
    if (this.auto_flush) {
        this.flush();
    }
};



/**
 * TODO implement better object debugging by looping over properties
 * 
 * @param msg
 */
UtLogger.prototype.debug = function(msg) {
    var elNode = jQuery('<li></li>');
    
    var messager = new UtMessager({node: elNode});
    messager.setDebug("DEBUG " + msg);
    
    this.buffer.push(messager);
    
    if (this.auto_flush) {
        this.flush();
    }
};


UtLogger.prototype.flush = function() {
    var buffer = this.buffer;
    this.buffer = [];
    var container = this.container;
    
    if (!container.length) {
        return;
    }
    
    jQuery(buffer).each(function(index, messager) {
        container.append(messager.node);
    });
};


