//$Id: DataDump.js,v 1.4 2007/02/06 18:29:33 x0024286 Exp x0024286 $

//
// Peter Duh 7/6/2006 11:16AM
//
// Dumper(obj[,n]) Dump obj, n=[1|2|3]
// n = 1 Dump obj into a popup window with errorlog (DEFAULT)
// n = 2 Dump obj into a popup window without errorlog
// n = 3 Dump obj into an alert dialog box
// execode(obj) run the javascript code in obj.value
//

var max = 1000;
//window.onerror = alert(10);

var xdata    = new Object;
xdata.list   = new Array;
xdata.names  = new Object;
xdata.error  = new Object;
var xtest    = new Object;
xtest.names  = new Array;
xtest.vals   = new Object;
var ua = 'MSIE';
if(navigator.appName.search(/netscape/i) >=0) ua = 'Netscape';
var dErrorLog = '';

function dErrorTrap(sMsg,sUrl,sLine)
{
   dErrorLog += "<b>An error was thrown and caught.</b><p>";
   dErrorLog += "Error: " + sMsg + "<br>";
   dErrorLog += "Line: " + sLine + "<br>";
   dErrorLog += "URL: " + sUrl + "<br>";
   return false;
}

function pop_xdata(obj)
{
   var r = Math.random();
   var n = r.toString().replace(/0\./, '');
   var win_id = 'xdata' + n;
   xdata_win = open('', win_id, 'menubar=1,toolbar=1,location=1,status=1,dependent=0,resizable=1,scrollbars=1,width=800,height=600');
   xdata_win.document.writeln('<title>pop_xdata:'+obj.name+'</title>');
   xdata_win.document.writeln('<pre>');
   if(xdata.list.length > 0)
   {
      for(var i in xdata.list)
      {
         xdata_win.document.writeln(i+' -> '+xdata.list[i]);
      }
      xdata_win.document.writeln('------------------------------------------------------------');
   }

   objname = new Array();
   for(var e in xdata.names)
   {
      objname.push(e);
   }
   objname = objname.sort();

   for(var i=0; i < objname.length; i++)
   {
      var e = objname[i];
      xdata_win.document.writeln(i+': '+e+' -> '+xdata.names[e]);
   }

   xdata_win.document.writeln('</pre>');
   xdata_win.document.write(dErrorLog);
   xdata_win.document.close();
}

function list_xdata(obj)
{
   var x = '';
   if(xdata.list.length > 0)
   {
      for(var i in xdata.list)
      {
         x += i;
         x += ' -> ';
         x += xdata.list[i];
         x += "\n";
      }
      x += "----------\n";
   }
   objname = new Array();
   for(var e in xdata.names)
   {
      objname.push(e);
   }
   objname = objname.sort();

   for(var i=0; i < objname.length; i++)
   {
      var e = objname[i];
//   for(var i in xdata.names)
//   {
      x += i +': ' + e +' -> '+xdata.names[e] + '\n';
   }
   return x;
}

function Dumper(obj,display_mode)
{
   if(! obj)
   {
      return;
   }
   xdata.names = [];
   xdata.list.length = 0;

   var level = 0;
   var me = '';

   dump_obj(obj, level, me, 0);

   switch(display_mode)
   {
      case 1 :
         pop_xdata(obj);
         break;
      case 2 :
         pop_html(list_xdata(obj));
         break;
      case 3 :
         alert(list_xdata(obj));
         break;
      default :
         pop_xdata(obj);
   }
}

function dump_obj(obj, level, upline, rec)
{
   var inc = '   ';
   var ind = '';
   for(var i = 0; i < level; i++)
   {
      ind += inc;
   }

   level++;
   if(typeof(obj) == 'string')
   {
      xdata.list[0] = obj;
      return;
   }
   if(obj.length)
   {
      for(var e = 0; e < obj.length; e++)
      {
         var me = e;
         var val = get_value(obj[e]);
         xdata.list[e] = val;
         if(rec)
         {
            dump_obj(obj[e], level, me, 0);
         }
      }
   }

//   var re = /selectionStart|selectionEnd|domConfig|loadingState|lastMouseDown/i;
//   if(ua == 'MSIE')
//   {
//      re = /file(Updated|Created|Modified)Date|fileSize/i;
//   }

   objname = new Array();

   for(var e in obj)
   {
      objname.push(e);
   }
   objname = objname.sort();
   for(var i=0; i < objname.length; i++)
   {
      var e = objname[i];
      var me = e;
      if(e == 'length') {me = '_' + e;}
      //xdata.names[me] = i+'---: '+ind + e + ' -> ';
      xdata.names[me] = '';
      if(i > max) break;
      var trace = 0;
      if(i+2 >= max && trace)
      {
         alert(i + ':'+e);
      }

      try // Cause an error.
      {
         x = obj[e]
      }
      catch(er) // Create local variable e.
      {
         var code = er.number & 0xFFFF;
         xdata.names[me] += er + ' (' + code + ') '+ er.description;
         continue;
      }

//      if(e.search(re) >= 0)
//      {
//         xdata.names[me] += "SKIP\n";
//         continue;
//      }
      //alert(e);
      var val = get_value(obj[e]);
      xdata.names[me] += val + '';
      //xdata.names[me] += "\n";
      if(rec)
      {
         xdata.names[me] += dump_obj(obj[e], level, rec);
         xdata.names[me] += "\n";
      }
   }
}

function get_value(obj)
{
   if(obj == undefined)
   {
      return undefined;
   }

   var type = typeof(obj);
   var value = '';
   switch(type)
   {
      case "number" :
         value = obj;
         break;
      case "string" :
         value = obj;
         break;
      case "object" :
         value = obj;
         break;
      case "boolean" :
         value = obj + '(' + type + ')';
         break;
      case "function" :
         value = type ;
         break;
      default :
         value = obj + '(' + type + ': Not cased)';
   }

//   alert('value = '+value);
   return value;
}

function pop_msg(msg)
{
   pop_win = open('', 'win', 'scrollbars,dependent,resizable,width=600,height=400');
   pop_win.document.writeln('<title>pop_msg</title>');
   pop_win.document.write(msg);
   pop_win.document.close();
}

function pop_html(msg)
{
   pop_msg('<pre>' + msg +'</pre>');
}

function execode(obj)
{
   var code = obj.value
   eval(code);
}


