function UtLogger(params) {
    var self = this;
    
    self.container_id   = null;
    self.container      = null;
    
    self.buffer         = new Array();
    self._initialized   = false;
    self.auto_flush     = false;
    
    
    self.ctor = function(params) {
        self.container_id = params.container_id;
        
        // Do the initialization on document ready
        jQuery(document).ready(function(){
            self._initialize();
        });
    };
    
    
    self._initialize = function() {
        self._initialized = true;
        self.container = jQuery("#"+self.container_id);
        self.auto_flush = true;
        self.flush();
        
        self.debug("Javascript logger initialized");
    };
    
    
    self.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);
        
        self.buffer.push(messager);
        
        if (self.auto_flush) {
            self.flush();
        }
    };
    
    
    self.debug = function(msg) {
        var elNode = jQuery('<li></li>');
        
        var messager = new UtMessager({node: elNode});
        messager.setDebug("DEBUG " + msg);
        
        self.buffer.push(messager);
        
        if (self.auto_flush) {
            self.flush();
        }
    };
    
    
    
    self.flush = function() {
        jQuery(self.buffer).each(function(index, messager) {
            self.container.append(messager.node);
        });
        
        self.buffer = new Array();
    };
    
    
    self.ctor(params);
}
