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.IsObject(v.attributes)/* 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;
};

