/**
	@ver 1.0
	@author coco 
*/

var Error=(function(){
	function constructor()
	{

	}
	
	function _strDup(ch,no)
	{
        var outString=" ";
        for(var i=0;i<no;i++){
            outString+=ch;
        }
        return outString;
    }
	function _dumpObject(o,out,level,levelMax)
	{
        if (levelMax) 
            if (level==levelMax) return;
		for(var index in o){
			var s=o[index];
            if ((Type.isObject(s))||(Type.isArray(s))){
					out[out.length]=_strDup(" ",level*2)+index+"="+Type.getType(s);
					_dumpObject(s,out,level+1,levelMax);
			}
			else{
					out[out.length]=_strDup(" ",level*2)+index+"="+s;
			}
		}
	}

    
	function _dumpArray(o,out,level)
	{
		for(var index in o)
		{
			var s=o[index];
            if (Type.isArray(s)){
					out[out.length]=_strDup(" ",level*2)+index+"="+Type.getType(s);
					_dumpArray(s,out,level+1)
			}
			else{
					out[out.length]=_strDup("#",level*2)+index+"="+s;
			}
		}
	}
	
	constructor.varDump=function(o, levelMax){
		var out=new Array();
		var outString="";
		_dumpObject(o,out,0,levelMax);
		for (var index in out){
            outString+=out[index]+"\n";
            //alert("!"+out[index]+"|");
        }
		alert(outString);
    }

	constructor.alertHTML=function(outString,id){
        document.getElementById(id).innerHTML+="<br>"+outString;
    }

	constructor.noteHTML=function(outString,id){
        var foo = new Date; // Generic JS date object
        var unixtime_ms = foo.getTime(); // Returns milliseconds since the epoch
        var unixtime = parseInt(unixtime_ms / 1000);       
        document.getElementById(id).innerHTML+="<br>"+unixtime+":"+outString;
    }

    constructor.varDumpHTML=function(id,o, levelMax){
		var out=new Array();
		var outString="";
		_dumpObject(o,out,0,levelMax);
		for (var index in out){
            outString+=out[index]+"\n";
            //alert("!"+out[index]+"|");
        }
        document.getElementById(id).innerHTML="<"+"pre"+">"+outString+"<"+"/"+"pre>";
    }    

    constructor.dumpObject=function(o,levelMax,isStringOutput){
		var out=new Array();
		var outString=""
		_dumpObject(o,out,0,levelMax);
		for (var index in out){
            outString+=out[index]+"\n ";
        }
        if (isStringOutput) return outString;
		alert(outString);
	}
	
	constructor.dumpArray=function(o,isStringOutput){
		var out=new Array();
		var outString=""
		_dumpArray(o,out,0);
		for (var index in out){
            outString+=out[index]+"\n ";
        }
        if (isStringOutput) return outString;
		alert(outString);
	}

    function _stackTraceGetSignature(theFunction) { 
        var signature = getFunctionName(theFunction); 
        signature += "("; 
        for(var x=0; x<theFunction.arguments.length; x++) { 
            // trim long arguments 
            var nextArgument = theFunction.arguments[x]; 
            if(nextArgument.length > 30) 
                nextArgument = nextArgument.substring(0, 30) + "..."; 
            // apend the next argument to the signature 
            signature += "'" + nextArgument + "'"; 
            // comma separator 
            if(x < theFunction.arguments.length - 1) 
                signature += ", "; 
        } 
        signature += ")"; 
        return signature; 
    } 
    
    constructor.stackTrace=function(startingPoint,exception){
        var stackTraceMessage = this.dumpArray(exception,true);
        stackTraceMessage += "\nStack trace: \n"; 
        var nextCaller = startingPoint; 
        while(nextCaller) { 
            stackTraceMessage += _stackTraceGetSignature(nextCaller) + "\n"; 
            nextCaller = nextCaller.caller; 
        } 
        stackTraceMessage += "\n\n"; 
        // display message 
        alert(stackTraceMessage);
    }
	return constructor;
})();