// Error handing / logging for JavaScript

// if(typeof Prototype == 'undefined')
//     throw("error.js requires Prototype to be installed");


//JSLoad('/s/vendor/ext/adapter/ext/ext-base.js');

//setTimeout('var Ext = top.Ext; alert(top.Ext); alert(Ext);', 200);

// create the HelloWorld application (single instance)
var HelloWorld = function(){
    // everything in this space is private and only accessible in the HelloWorld block
    
    // define some private variables
    var dialog, showBtn;
    
    // return a public interface
    return {
        init : function(){
             //showBtn = Ext.get('show-dialog-btn');
             // attach to click event
             //showBtn.on('click', this.showDialog, this);
this.showDialog();
alert('done?');
        },
       
        showDialog : function(){
            if(!dialog){ // lazy initialize the dialog and only create it once
                dialog = new Ext.BasicDialog("hello-dlg", { 
                        autoTabs:true,
                        width:500,
                        height:300,
                        shadow:true,
                        minWidth:300,
                        minHeight:250,
                        proxyDrag: true
                });
                dialog.addKeyListener(27, dialog.hide, dialog);
                dialog.addButton('Submit', dialog.hide, dialog).disable();
                dialog.addButton('Close', dialog.hide, dialog);
            }
            dialog.show();
			log('<b>Showing debug panel</b>');
        }
    };
};



	
/*
Includes:
    logging panel
    ajax logging
    object debugging
        
*/
var dbgPanel = null;

var logger = {
	DETAIL 	  : 100, 
    DEBUG     : 10,
    ERROR     : 7,
    WARNING   : 5,
    FATAL     : 3,
    NONE      : 0,
    
    DEFAULT   : 10,

	hidden	  : false,

    logLevel : 10,
    logQueue : new Array(),
    logCount : 0,
    
    remoteLogMode : 'file',
    
    debugPanel : null, // The floatting debug panel
    
    debugPanel_id : 'debugLogPanel',
    
    initDone : false,
    panelDisplayed	: false,

    init : function() {
        if(!logger.initDone) logger.initPanel();
    },
    
    initPanel : function() {
		return false; // **************** I HAVE DISABLED THE PANEL - IT WAS BREAKING EVERYTHING ********
		
        if(logger.initDone) { return true; }
		if(!document.body) { return false; }
		
		// Initialize the link
		// TODO: Should provide alternative if ExtJS isn't installed
		
		if(!logger.hidden) {
			setTimeout('logger.launchDebugPanel();', 300);
		}
		
		logger.initDone	= true;
		
		var debugDiv = document.createElement('div');
		
		document.body.insertBefore(debugDiv, document.body.firstChild);

		debugDiv.setStyle({
			position : 'absolute',
			width : '50px',
			height : '20px',
			backgroundColor : 'red',
			color : 'white',
			float : 'right',
			marginLeft : '200px'
		});
		debugDiv.innerHTML = '&nbsp;<b><a href="#" onClick="logger.launchDebugPanel(); return false;" style="color : white;">DBG</a></b>&nbsp;';
		return false;


		if(!logger.initDone) {
    		if(document.body) {
				/// create lite-weight div
				logger.initDone = true;
				
				// Should move this to somewhere else *** 
				var debugDiv = document.createElement('div');
				
				document.body.insertBefore(debugDiv, document.body.firstChild);
				
				debugDiv.setStyle({
					position : 'absolute',
					width : '50px',
					height : '20px',
					backgroundColor : 'red',
					color : 'white',
					float : 'right',
					marginLeft : '200px'
				});
				debugDiv.setOpacity(.7);
				
				debugDiv.innerHTML = '&nbsp;<b><a href="#" onClick="logger.launchDebugPanel(); return false;" style="color : white;">DBG</a></b>&nbsp;';
				
				return false;
				
        		var debugDiv = document.createElement('div');
                debugDiv.setAttribute('id', logger.debugPanel_id);
                // We should replace this with a nice method - like .setStyle()
				debugDiv.style.fontSize = '8pt';
				debugDiv.style.fontFamily = 'verdana';
				debugDiv.style.width = '400px';
				debugDiv.style.position = 'absolute';
				debugDiv.style.backgroundColor = '#d0d0d0';
				debugDiv.style.padding = '5px';
				debugDiv.style.border = 'thin solid red';
				debugDiv.style.zIndex = '10';
				debugDiv.style.height = '100px';
				
                // testing
				if(logger.hidden && 0 ) {
					debugDiv.style.display = 'none';
                }

                document.body.appendChild(debugDiv);
                
                debugDiv.innerHTML = '<div><strong style="padding : 0px; margin: 0px;">Debug</strong>' + 
                	'<div style="float : right; display : inline;">' + 
                	'<span style="float : right; background-color : blue; color : white;" id="debug_lock" href="#" onClick="lockDebugPanel()">lock</span>' + 
                	'<span style="float : right; display : none; background-color : blue; color : white;" id="debug_unlock" href="#" onClick="unlockDebugPanel()">unlock</span>' + 
                	'<span style="float : right;" href="#"><a href="#" onClick="setLogLevel(1); return false;">1</a>|<a href="#" onClick="setLogLevel(2); return false;">2</a>|<a href="#" onClick="setLogLevel(3); return false;">3</a></span>' + 
                	'</div></div>';
                
                // Set position
                new Effect.Move($(logger.debugPanel_id), {
                    x: getCookie('makeDebugPanel_left'),
                    y: getCookie('makeDebugPanel_top'),
                    mode: 'absolute',
                    duration : 0.0
                });
    
                dbgPanel = new Draggable(debugDiv);
                
                try {
                    // listener
                    var MyStartEndObserver = Class.create();
                    MyStartEndObserver.prototype = {
                      initialize: function(element) {
                        logger.element   = $(element);
                      },
            
                      onStart: function() { },
            
                      onEnd: function() {
					 	var el = $(logger.debugPanel_id);
                        log('Remeber panel position: ' + el.offsetTop + '/' + el.offsetLeft, logger.DETAIL);
						try {
							if(el.offsetTop>0) {
							setCookie('makeDebugPanel_top', el.offsetTop);}
							if(el.offsetLeft) {
                        	setCookie('makeDebugPanel_left', el.offsetLeft); }
						} catch(e) {
							logError(e, 'Failed to remember position of debug panel');
						}
                      }
                    }
                
                    Draggables.addObserver(new MyStartEndObserver($(logger.debugPanel_id)));
                } catch(e) {
                    logError(e, 'Failed to create debug panel');
                }
                
                return true;
            } else {
                return false;
            }
      	} else {
            return true;
      	}
    },
    
    
    log : function(msg, level) {
        if(!level) { level = logger.DEFAULT; }

        logger.initPanel();

    	if(level<=logger.logLevel) {
            if(!logger.panelDisplayed) {
        		logger.logQueue[logger.logQueue.length] = '['+level+']' + msg;
          	} else {
              	if(logger.logQueue.length>0) {
                    // Flush the queue
                    var i;
                    for(i=0;i<logger.logQueue.length;i++) {
                        document.getElementById(logger.debugPanel_id).innerHTML += (logger.logQueue[i] + '<br />');
                    }
                    logger.logQueue = new Array();
                }
        		
          		if(document.getElementById(logger.debugPanel_id)) {
              		document.getElementById(logger.debugPanel_id).innerHTML += ('<span id="debugItem-'+logger.logCount+'">['+level+']'  + msg + '</span><br />');
              		new Effect.Highlight('debugItem-'+logger.logCount, {endcolor : "#d0d0d0"});
              		logger.logCount++;
              	} else {
//        			alert(msg);
        		}
            }
      	}
    },
    
    lock : function() {
        $('debug_lock').toggle();
        $('debug_unlock').toggle();
            
        dbgPanel.destroy();
        $(logger.debugPanel_id).style.border = 'thin solid black';
        new Effect.Highlight($(logger.debugPanel_id));
        log('Locking debug panel');
    },
    
    unlock : function() {
        $('debug_lock').toggle();
        $('debug_unlock').toggle();
        
        $(logger.debugPanel_id).style.border = 'thin solid red';
        new Effect.Highlight($(logger.debugPanel_id));
        dbgPanel = new Draggable($(logger.debugPanel_id));
        log('Unlocking debug panel');
    },
    
    setLogLevel  : function(level) {
        log('Setting log level to ' + level + ' from ' + logger.logLevel);
        logger.logLevel = level;
    },
    
    
    logRemote : function(msg, level) {
        if(!level) { level = logger.DEFAULT; }
        log('Running logRemote...');
		
		// Check that __BASEURL__ is set 
		if(typeof __BASEURL__ == 'undefined')
			throw("__BASEURL__ must be set to use AJAX logging")

    	if(level<=logger.logLevel) {
    	    var url = __BASEURL__ + 's/logger/log.php?msg=' + encodeURIComponent(msg) + '&mode=' + logger.remoteLogMode;
            new Ajax.Request( url, {method: 'get'});
    	}
    },
    
    logRemote_mode : function(mode) {
        if(mode=='db' || mode=='file') {
            logger.remoteLogMode = mode;
        } else {
            throw "logRemote_mode called with unknown log method. Must be either 'db' or 'file' ";
        }
    },
    
    
    logError : function(e, msg, level) {
		if(!level) level = logger.ERROR;
        if((typeof msg)=='undefined') msg = 'None given';
        log('<span style="font-weight : bold; color : red;">App Msg: ' + msg + '</span><br />&nbsp;Exception type = '+e.type+' ; message = '+e.message+'; number = ' + e.number, level);
        if((typeof logger.exceptionHandler)=='function') {
            logger.exceptionHandler(e, msg, level);
        }
    },
    
    // function(e, msg) { }
    exceptionHandler : null
    
}




// general simple exception
function evException(message, errorNumber) {
	this.name = 'evException';
	this.message = message;
	this.type = 'evException';
	this.number = '1111';
}










/** The main API - call this in your code **/


/** 
 * Simple logging
 */
function log(msg, level) {
	try {
		/*this.FATAL		= logger.FATAL;
		this.WARNING	= logger.WARNING;
		this.CONFIG		= logger.CONFIG;
		this.INFO		= logger.INFO;
		this.DEBUG		= logger.DEBUG;*/
		//if(!level) level = logger.DEBUG;
	jslog.info(msg);
	return;
	    //logger.init();
	    logger.log(msg, level);
	} catch(e) {
		//alert('ERROR trying to send log: ' + e.message);
	}
}


function logDebug(object, label) {
	log('Object debug: ' + label + 'type = "' + typeof(object) + '"');
  	for(property in object) {
  	    log('Property: <b>' + property + '</b> = ' + object.$property);
	}
}


/**
 * Send msg to remote lg
 */
function logRemote(msg, level) {
    logger.init();
    logger.logRemote(msg, level);
}

/**
 * Log exceptions.
 * 	logError( ExceptionObject, Human readable message, Log level );
 */
function logError(e, msg, level) {
//    logger.init();
 //   logger.logError(e, msg, level);
	try {
		jslog.error(msg);
	} catch(err) {
//		alert(e.message + ': ' + msg);
	}
	return;
}



logger.createPanel = function () {return false;
	try {
		dialog = new Ext.Window({ 
				//hello-dlg
				closable:true,
	            autoTabs:true,
	            width:500,
	            height:300,
	            shadow:true,
	            minWidth:300,
	            minHeight:250,
	            proxyDrag: true
	    });
	  //  dialog.addKeyListener(27, dialog.hide, dialog);
	  //  dialog.addButton('Submit', dialog.hide, dialog).disable();
	    dialog.addButton('Close', dialog.hide, dialog);
		dialog.show(this);
		logger.panelDisplayed = true;
	} catch(e) {
		alert('Error creating debug panel: ' + e.message);
	}
}
//depend(logger, 'createPanel', 'extjs');


logger.launchDebugPanel = function() {
	// Create on page
		new Ajax.Request(
			'/s/logger/DebugPanel.html',
			{
				onComplete : function(r) {
					document.body.innerHTML += r.responseText;
					setTimeout("logger.createPanel(); log('<b>Showing debug panel</b>');", 300);
				}
			}
			);
}
