
//<script>

Lib.newInstance =
function /* newInstance */( c )
{
  var result;
  if ( typeof( c ) == 'function' )
  {
    if ( c.from )
      result = c.from();
    else
      result = new c();
  }
  return result;
}

Lib.clone =
function /* clone */( o, deep, func )
{
  var result;
  if ( !Util.isAny( o ) )
    return o;
	var c = Lib.constructorOf( o );
	if ( c == String )
		result = '' + o;
	else if ( c == Number )
		result = 0 + o;
	else if ( c == Boolean )
		result = o;
	else if ( c == Array )
	{
		result = Lib.isMulti( o ) ? Lib.M( [] ) : [];
		for ( var i = 0; i < o.length; i++ )
		{
			result[ i ] = deep ? Lib.clone( o[ i ], deep, func ) : o[ i ];
		}
	}
	else
	{
		result = Lib.newInstance( c );
		var props = Lib.getProperties( o, func );
		if ( props )
		{
			var pn, v;
			for ( i = 0; i < props.length; i++ )
			{
				pn = props[ i ];
				v = Lib.get( o, pn );
				Lib.set( result, pn, deep ? Lib.clone( v, deep, func ) : v );
			}
		}
	}
  return result;
}

