function perlDump(obj) {
  if( obj==null ) return 'undef';
  switch( typeof obj ) {
    case('string'):
      return "'"+ ((obj.indexOf("'")>=0) ? obj.replace(/'/g, "\\'") : obj) +"'";
    case('object'): 
//      if( !isNaN(obj.length) ) { // array ?
//      if( typeof(obj.length)=="number") { // array ?
      if( !isHash(obj) && obj.constructor == Array ) {
        var str='[';
        for( var i=0; i<obj.length; i++ ) {
          if( i!=0 ) str +=',';
          str += perlDump(obj[i]);
        }
        return str+']';
      } else {  // hash or object
        var str = '{';
        for( var key in obj ) {
          if( str!='{' ) str +=',';
          str += perlDump(key)+'=>'+perlDump(obj[key]);
        }
        return str+'}';
      }
    default: return obj;
  }
}

function dump(obj) {
 
  if( obj==null ) return 'null';
  switch( typeof obj ) {
    case('string'):
      return "'"+ ((obj.indexOf("'")>=0) ? obj.replace(/'/g, "\\'") : obj) +"'";
    case('object'): 
		   //   if( typeof(obj.length)=="number") { // array ?
	if( !isHash(obj) && obj.constructor == Array) {
        var str='[';
        for( var i=0; i<obj.length; i++ ) {
          if( i!=0 ) str +=',';
          str += dump(obj[i]);
        }
        return str+']';
      } else {  // hash or object
        var str = '{';
        for( var key in obj ) {
          if( str!='{' ) str +=',';
          str += dump(key)+':'+dump(obj[key]);
        }
        return str+'}';
      }
    default: return obj;
  }
}

function formattedDump(obj,level) {
 
  if( obj==null ) return 'null';
  if( level==null) level = 0;

  var spaces='';
  for(var i=0; i < level;i++) {
      spaces+='\t';
  }
  switch( typeof obj ) {
    case('string'):
      return "'"+ ((obj.indexOf("'")>=0) ? obj.replace(/'/g, "\\'") : obj) +"'";
    case('object'): 
		   //   if( typeof(obj.length)=="number") { // array ?
	if( !isHash(obj) && obj.constructor == Array) {
        var str='[\n';
        for( var i=0; i<obj.length; i++ ) {
          if( i!=0 ) str +=',\n';
          str += formattedDump(obj[i],level+1);
        }
        return str+'\n'+spaces+']';
      } else {  // hash or object
        var str = '{\n';
        for( var key in obj ) {
          if( str!='{\n' ) str +=',\n';
          str += spaces+formattedDump(key,level+1)+':'+formattedDump(obj[key],level+1);
        }
        return str+'\n'+spaces+'}';
      }
    default: return obj;
  }
}

function dumpXml(obj) {
  if( obj==null ) return '<null/>';
  switch( typeof obj ) {
    case('string'):
      return obj;
    case('object'): 
	//      if( typeof(obj.length)=="number" ) { // array ?
      if( !isHash(obj) && obj.constructor == Array ) {
        var str='<array>';
        for( var i=0; i<obj.length; i++ ) {
						str += '<item>'+dumpXml(obj[i])+'</item>';
        }
        return str+'</array>';
      } else {  // hash or object
        var str = '<hash>';
        for( var key in obj ) {
          str += '<item>'+key+'</item><item>'+dumpXml(obj[key])+'</item>';
        }
        return str+'</hash>';
      }
    default: return obj;
  }
}



function isHash(obj) {
    if(typeof obj == 'object' && obj.length==0) {
	try {        for( var key in obj ) {return true; } } catch(e) { return false; }
	return false;
    }
    return false;
}


function cloneObject(obj) {
    if(typeof(obj) != 'object') return obj;
    if(obj == null) return obj;
    var nObj = new Object();
    for(var i in obj) {  nObj[i] = cloneObject(obj[i]); }
    return nObj;
}
