
Lib.display = {};

Lib.display.asString =
function /* asString */( o, func, indent )
{
	var result;
	if ( !indent ) indent = '';
	var type = typeof( o );
	var c = Lib.constructorOf( o );
	if ( type == 'undefined' )
		result = 'undefined';
	else if ( o == null )
		result = 'null';
	else if ( type == 'string' )
		result = '"' + o + '"';
	else if ( type == 'function' )
		result = '' + o;
	else if ( c == Number )
		result = '' + o;
	else if ( c == Date )
		result = '' + o;
	else if ( c == Array )
	{
		result = '[';
		result += this.__asStringA( o, func, indent );
		result += ']';
		if ( Lib.isMulti( o ) )
		  result = 'Lib.M( ' + result + ' )';
	}
	else
	{
	  var n = Lib.constructorNameOf( o );
	  if ( n )
	  {
		  result = '{ /*' + n + '*/\n';
		  result += this.__asStringO( o, func, indent );
		  result += indent + '}';
		}
		else
		  result = 'undefined /*no constructor*/';
	}
	return result;
}

Lib.display.__asStringO =
function /* __asString */( o, func, indent )
{
	var v, pn, result = '';
	var type;
	var first = true;
	var props = Lib.getProperties( o );
	if ( !props )
	  return result;
	for ( var i = 0; i < props.length; i++ )
	{
	  pn = props[ i ];
	  v = Lib.get( o, pn );
		type = typeof( v );
		if ( !func && type == 'function' )
			continue;
		//if ( pn.indexOf( '_$_' ) == 0 )
		//  continue;
		result += indent;
		if ( first )
		{
			result += ' ';
			first = false;
		}
		else
			result += ',';
		result += pn;
		result += ': ';
		result += this.asString( v, func, indent + '  ' );
		result += '\n';
	}

	return result;
}

Lib.display.__asStringA =
function /* __asStringA */( o, func, indent )
{
	var result = '';
	for ( var i = 0; i < o.length; i++ )
	{
		if ( i > 0 )
			result += ', ';
		result += this.asString( o[ i ], func, indent );
	}
	return result;
}

Lib.display.asLib =
function /* asLib */( o, func, indent, base, suffix )
{
	var result = {result:'',simple:true}, tmp, tmpA;
	if ( !indent ) indent = '';
	if ( !base ) base = '';
	if ( !suffix ) suffix = '';
	var type = typeof( o );
	var c = Lib.constructorOf( o );
	if ( type == 'undefined' )
		result.result = 'null';
	else if ( o == null )
		result.result = 'null';
	else if ( type == 'string' )
		result.result = '"' + o + '"';
	else if ( type == 'function' )
	{
		result.result = '' + o;
  }
	else if ( c == Number )
		result.result = '' + o;
	else if ( c == Date )
		result.result = 'new Date("' + o + '")';
	else if ( c == Array )
	{
	  tmpA = this.__asLibA( o, func, indent, base );
	  if ( !tmpA.simple )
	  {
		  if ( Lib.isMulti( o ) )
		    tmp = 'Lib.M( [] )' + suffix;
		  else
		    tmp = '[]' + suffix;
		  if ( !base )
	      result.result = indent + 'l.s( _r, "' + base + '", ' + tmp;
	    else
	      result.result = tmp;
		  result.result += tmpA.result;
		  result.simple = false;
		}
		else
		{
		  if ( Lib.isMulti( o ) )
		    tmp = 'Lib.M( [' + tmpA.result + '] )';
		  else
		    tmp = '[' + tmpA.result + ']';
		  if ( !base )
	      result.result = indent + 'l.s( _r, "' + base + '", ' + tmp + suffix;
	    else
	    {
	      if ( tmpA.simple )
	      {
	        result.result = tmp;
	      }
	      else
	      {
	        result.result = tmp + suffix;
	        result.simple = false;
	      }
	    }
		}
	}
	else
	{
	  var n = Lib.constructorNameOf( o );
	  if ( n )
	  {
	    result.simple = false;
	    if ( base )
	    {
	      result.result = 'Lib.newInstance(' + n + ')' + suffix;
	      result.result += this.__asLibO( o, func, indent + '  ', base );
	    }
	    else
	    {
	      result.result = 'var l = Lib; l.s = l.set;\nvar _r = Lib.newInstance(' + n + ');\n';
	      result.result += this.__asLibO( o, func, indent, base );
	    }
		    
		}
		else
		  result.result = 'null';
	}
	if ( base )
	  return result;
	else
	  return result.result;
}

Lib.display.__asLibO =
function /* __asLibO */( o, func, indent, base )
{
	var v, pn, result = '', tmp;
	var type;
	var first = true;
	var props = Lib.getProperties( o );
	if ( !props )
	  return result;
	base = base ? base + '.' : '';
	for ( var i = 0; i < props.length; i++ )
	{
	  pn = props[ i ];
	  v = Lib.get( o, pn );
		type = typeof( v );
		if ( !func && type == 'function' )
			continue;
		//if ( pn.indexOf( '_$_' ) == 0 )
		//  continue;
		result += indent;
		tmp = this.asLib( v, func, indent + '  ', ( base + pn ), ' );\n' );
		if ( tmp.result != 'null' )
		{
		  if ( tmp.simple )
		    result += 'l.s( _r, "' + ( base + pn ) + '", ' + tmp.result + ' );\n';
		  else
		    result += 'l.s( _r, "' + ( base + pn ) + '", ' + tmp.result;
		}
	}

	return result;
}

Lib.display.__asLibA =
function /* __asLibA */( o, func, indent, base )
{
	var tmp = [], result = '';
	base = base + '.';
	for ( var i = 0; i < o.length; i++ )
	{
	  tmp[ i ] = this.asLib( o[ i ], func, indent, ( base + i ), ' );\n' );
	}
	var simple = true;
	for ( var i = 0; i < o.length; i++ )
	{
		if ( !tmp[ i ].simple )
		{
		  simple = false;
		  break;
		}
	}
	if ( !simple )
	{
	  for ( var i = 0; i < o.length; i++ )
	  {
	    if ( tmp[ i ].simple )
	  	  result += indent + 'l.s( _r, "' + ( base + i ) + '", ' + tmp[ i ].result + ' );\n';
	    else
	  	  result += indent + 'l.s( _r, "' + ( base + i ) + '", ' + tmp[ i ].result;
	  }
	}
	else
	{
	  for ( var i = 0; i < o.length; i++ )
	  {
	    if ( i > 0 )
	      result += ' ,';
	  	result += tmp[ i ].result;
	  }
	}
	return { result: result, simple: simple };
}

