String.prototype.repeat = function(n) { var s = "", t = this.toString(); while(--n >= 0){s += t;} return s; }; He.ToString = function(a) { var s = ''; if(arguments.length < 1) { return new String(''); } if(arguments.length > 1) { var n = arguments.length; for(var i = 0; i < n; ++i) { s += He.ToString(arguments[i]); } } else { if(a === null) { a = 'null'; } if(He.IsArray(a)) { s += "(array)\n" + He.ToString.t + "[\n"; He.ToString.push(); for(var n = 0; n < a.length; ++n) { s += He.ToString.ObjArr(n,a[n]); } He.ToString.pop(); s += He.ToString.t + "]\n"; } else if(He.IsObject(a)) { s += "(object)\n" + He.ToString.t + "{\n"; He.ToString.push(); for(var n in a) { s += He.ToString.ObjArr(n,a[n]); } He.ToString.pop(); s += He.ToString.t + "}\n"; } else { s += new String(a);//.toString(); } } return s; }; //-- He.ToString sub infos and routines -------------------------------- He.ToString.inc = 0; He.ToString.t = ''; He.ToString.push = function() { ++He.ToString.inc; He.ToString.t = ". ".repeat(He.ToString.inc); }; He.ToString.pop = function() { He.ToString.inc = Math.max(0,He.ToString.inc - 1); He.ToString.t = ". ".repeat(He.ToString.inc); }; He.ToString.ObjArr = function(n,v) { var s = ''; if(v === null) { v = 'null'; } // ... recurse only when we can avoid loops if( (He.IsObject(v) && He.IsUndefined(v.childNodes)/* do not recurse DOM */) || He.IsArray(v)) { s += He.ToString.t + '[' + n + '] : ' + He.ToString(v); } else { s += He.ToString.t + '[' + n + '] : ' + new String(v) + "\n"; } return s; };