<?php
/**
 * Asis Simple Dump library
 *
 * Dumps/Displays the contents of a variable in a data list format.
 *
 * @version:    0.1.1b
 * @author:    Alex <qfox@ya.ru> Yaroshevich
 * @thanks:    Kwaku <ospinto@hotmail.com> Otchere for DBug class
 * @thanks:    Andrew <rudebwoy@hotmail.com> Hewitt for idea and suggestion to Kwaku Otchere
 * @thanks:    Alex <altsoph@?.msu.ru> Tikhonov for idea of `asd'
 * @dependence:    PHP4.2+
 * @link:    http://src.qfox.ru/
 * @date:    21 oct 2007
 *
 * @todo:    fix recursion bug { $a = array( ); $a[] = &$a; asd( $a ); } by marking items.
 * @todo:    add resource handlers, add output information for resources
 */




/**
 * Basic ;)
 *
 */
if( defined'ASD' ) ) return;
define'ASD''0.1.1b' );




/**
 * styles configuration
 *
 */ 
// default
define'ASD_DT',    'background-color:#fff; ' ); // table
define'ASD_DF',    'background-color:#fff; ' ); // field
define'ASD_DH',    'background-color:#fff; ' ); // field class=header
define'ASD_DC',    'background-color:#fff; ' ); // field class=class
define'ASD_DK',    'background-color:#fff; ' ); // field class=key

// scalar
define'ASD_ST',    'background-color:#fff; ' );
define'ASD_SF',    'background-color:#fff; ' );
define'ASD_SH',    'background-color:#fff; ' );
define'ASD_SC',    'background-color:#fff; ' );
define'ASD_SK',    'background-color:#fff; ' );

// array
define'ASD_AT',    'background-color:#060; ' );
define'ASD_AF',    'background-color:#fff; ' );
define'ASD_AH',    'background-color:#090; ' );
define'ASD_AC',    'background-color:#dfd; ' );
define'ASD_AK',    'background-color:#cfc; ' );

// object
define'ASD_OT',    'background-color:#00c; ' );
define'ASD_OF',    'background-color:#fff; ' );
define'ASD_OH',    'background-color:#44c; ' );
define'ASD_OC',    'background-color:#def; ' );
define'ASD_OK',    'background-color:#cdf; ' );

// resource
define'ASD_RT',    'background-color:#848; ' );
define'ASD_RF',    'background-color:#fff; ' );
define'ASD_RH',    'background-color:#a6a; ' );
define'ASD_RC',    'background-color:#fef; ' );
define'ASD_RK',    'background-color:#fdf; ' );

// xml
define'ASD_XT',    'background-color:#888; ' );
define'ASD_XF',    'background-color:#fff; ' );
define'ASD_XH',    'background-color:#aaa; ' );
define'ASD_XC',    'background-color:#eee; ' );
define'ASD_XK',    'background-color:#ddd; ' );

// fonts
define'ASD_FONTS',    'font-family:Verdana,Tahoma,serif;color:#000;font-size:12px;' );
define'ASD_HFONTS',    'font-weight:bold;color:#fff; ' );


/**
 * struct chars...
 *
 */
if( !defined'ASD_T_TYPENAME' ) )
    
define'ASD_T_TYPENAME''@' );
if( !
defined'ASD_T_TYPE' ) )
    
define'ASD_T_TYPE''&' );
if( !
defined'ASD_T_VALUE' ) )
    
define'ASD_T_VALUE''_' );
if( !
defined'ASD_T_NAME' ) )
    
define'ASD_T_NAME''#' );
if( !
defined'ASD_T_ADVANCED' ) )
    
define'ASD_T_ADVANCED''*' );


/**
 * bools
 *
 */
if( !defined'ASD_BOOL_TRUE' ) )
    
define'ASD_BOOL_TRUE''true,on,yes,checked' );
if( !
defined'ASD_BOOL_FALSE' ) )
    
define'ASD_BOOL_FALSE''false,off,no' );

/**
 * other...
 *
 */
if( !defined'ASD_SCALAR_PRIORITY' ) )
    
define'ASD_SCALAR_PRIORITY''float,numeric,bool,string' );

/**
 * some evaluates
 *
 */
$__asd_scalar_priority explode','ASD_SCALAR_PRIORITY );
$__asd_bool_true explode','ASD_BOOL_TRUE );
$__asd_bool_false explode','ASD_BOOL_FALSE );
$__asd_bool array_merge$__asd_bool_true$__asd_bool_false );

$__asd_asdout_depth 0;

$__asd_asdout_styles = array( );

if( !isset( 
$__asd_type2short ) ) {
    
$__asd_type2short = array( );
    
$__asd_type2short'scalar' ] = 'sc';
    
$__asd_type2short'array' ] = 'ar';
    
$__asd_type2short'object' ] = 'ob';
    
$__asd_type2short'method' ] = 'md';
    
$__asd_type2short'resource' ] = 'rs';
    
$__asd_type2short'bool' ] = 'bl';
    
$__asd_type2short'xml' ] = 'xm';
}

//$__asd_asdout_styles[ 'scalar' ][ 'header' ] =    ASD_SH.ASD_FONTS;
//$__asd_asdout_styles[ 'scalar' ][ 'table' ] =    ASD_ST.ASD_FONTS;
//$__asd_asdout_styles[ 'scalar' ][ 'field' ] =    ASD_SF;
//$__asd_asdout_styles[ 'scalar' ][ 'fkey' ] =    '';

$__asd_asdout_styles'array' ][ 'table' ] =    ASD_AT.ASD_FONTS;//.' border: 5px solid red;';
$__asd_asdout_styles'array' ][ 'header' ] =    ASD_AH.ASD_HFONTS;//.' border: 5px solid black;';
$__asd_asdout_styles'array' ][ 'fkey' ] =    ASD_AK;
$__asd_asdout_styles'array' ][ 'ftype' ] =    ASD_AC;
$__asd_asdout_styles'array' ][ 'field' ] =    ASD_AF;

$__asd_asdout_styles'object' ][ 'table' ] =    ASD_OT.ASD_FONTS;
$__asd_asdout_styles'object' ][ 'header' ] =    ASD_OH.ASD_HFONTS;
$__asd_asdout_styles'object' ][ 'fkey' ] =    ASD_OK;
$__asd_asdout_styles'object' ][ 'ftype' ] =    ASD_OC;
$__asd_asdout_styles'object' ][ 'field' ] =    ASD_OF;

$__asd_asdout_styles'resource' ][ 'table' ] =    ASD_RT.ASD_FONTS;
$__asd_asdout_styles'resource' ][ 'header' ]=ASD_RH.ASD_HFONTS;
$__asd_asdout_styles'resource' ][ 'fkey' ] =    ASD_RK;
$__asd_asdout_styles'resource' ][ 'ftype' ] =    ASD_RC;
$__asd_asdout_styles'resource' ][ 'field' ] =    ASD_RF;

$__asd_asdout_styles'xml' ][ 'table' ] =    ASD_XT.ASD_FONTS;
$__asd_asdout_styles'xml' ][ 'header' ] =    ASD_XH.ASD_HFONTS;
$__asd_asdout_styles'xml' ][ 'fkey' ] =    ASD_XK;
$__asd_asdout_styles'xml' ][ 'ftype' ] =    ASD_XC;
$__asd_asdout_styles'xml' ][ 'field' ] =    ASD_XF;





/**
 * main function
 *
 */
function asd$_v$return false )
{
    
$p asd_Parse$_v );
/*    echo "<pre>";
    var_dump( $p );
    echo "</pre>";/**/
    
    
$_r asd_out$p );
    
    if( 
$return )
        return 
$_r;
    
    echo 
$_r;
}


/**
 * out_r
 *
 */
function asd_out$parsed )
{
    global 
$__asd_asdout_depth;
    global 
$__asd_asdout_styles;
    global 
$__asd_type2short;
    
    
$_pre str_repeat"\t"$__asd_asdout_depth );
    
$__asd_asdout_depth ++;
    
    
$_r "";
    
    
$_vn = ( isset( $parsedASD_T_NAME ] ) && $parsedASD_T_NAME ] != '' ) ? $parsedASD_T_NAME ] : 'global';
    
$_vt = isset( $parsedASD_T_TYPENAME ] ) ? $parsedASD_T_TYPENAME ] : 'undefined';
    
$_vc =& $parsedASD_T_VALUE ];
    
$_va =& $parsedASD_T_ADVANCED ];
    
    if( !
is_array$_vc ) )
        
$_r .= $_vc;
    else {
        
$style =& $__asd_asdout_styles$parsedASD_T_TYPE ] ];
        
        
$_r .= "\n{$_pre}<table style='{$style['table']}'>\n";
        
        
$_r .= "{$_pre}<tr>\n";
        
$_r .= "{$_pre}\t<td style='{$style['header']}' colspan=2>$_vt</td>\n";
        
$_r .= "{$_pre}</tr>\n";
        
        foreach( 
$_vc as $_k => $_v ) {
            
//var_dump( $style );
            
$_r .= "{$_pre}<tr>\n";
            
$_r .= "{$_pre}\t<td valign=top style='{$style['fkey']}'>".$_vASD_T_NAME ]."</td>\n";
            
$_r .= "{$_pre}\t<td valign=top style='{$style['ftype']}'>".$__asd_type2short$_vASD_T_TYPE ] ]."</td>\n";
            
$_r .= "{$_pre}\t<td style='{$style['field']}'>".asd_out$_v )."</td>\n";
            
$_r .= "{$_pre}</tr>\n";
            }
        
        
$_r .= "{$_pre}</table>\n\t";
    }
    
    
$__asd_asdout_depth --;
    return 
$_r;
}


/**
 * Returns parsed variable
 *
 */
function asd_Parse( &$v$k null )
{
    if( 
is_null$v ) )
        return array( 
ASD_T_NAME => $kASD_T_VALUE => 'null'ASD_T_TYPENAME => '?'ASD_T_TYPE => 'scalar' );
    
    
$_r = array( );
    
$_rASD_T_TYPE ] = 'scalar';
    
$_rASD_T_TYPENAME ] = gettype$v );
    
$_rASD_T_NAME ] = (string)$k;
    
    if( 
is_scalar$v ) ) {
        list( 
$_rASD_T_TYPENAME ], $_rASD_T_VALUE ] )
            = 
asd_ParseScalar$v );
        }
    elseif( 
is_array$v ) ) {
        
$_rASD_T_TYPE ] = 'array';
        
$_rASD_T_VALUE ] = asd_ParseArray$v );
        }
    elseif( 
is_object$v ) ) {
        
$_rASD_T_TYPE ] = 'object';
        list( 
$_rASD_T_TYPENAME ], $_rASD_T_VALUE ], $_rASD_T_ADVANCED ] )
            = 
asd_ParseObject$v );
        }
    elseif( 
is_resource$v ) ) {
        
$_rASD_T_TYPE ] = 'resource';
        
$_rASD_T_TYPENAME ] = get_resource_type$v );
        list( 
$_rASD_T_VALUE ] ) = asd_ParseResource$v );
        }
    else {
        
ob_start( ); // fixme!..
        
var_export$v );
        
$_rASD_T_TYPE ] = 'scalar';
        
$_rASD_T_VALUE ] = highlight_string'<?php '.ob_get_contents( ).' ?>');
        
ob_end_clean( );
        }
    
    return 
$_r;
};


/**
 * Parse Object variable
 *
 */
function asd_ParseObject( &$_v )
{
    if( !
is_object$_v ) ) return;
    
    
$_r = array( );
    
    
$_type get_class$_v );
    
    
$_skeys get_class_vars$_type );    // static properties
    
$_dkeys get_object_vars$_v );    // dynamic properties
    
$_keys array_keys$_dkeys );
    
$_methods get_class_methods$_type );
    
    foreach( 
$_keys as $k ) {
        
$_p asd_Parse$_v ->$k$k );
        
        
$_pa array_key_exists$k$_skeys ) ? asd_Parse$_skeys$k ] ) : array( '_' => '?' );
        
$_pASD_T_NAME ] .= "["$_pa'_' ]."]"//( !is_null($_pa[0]) ? $_pa[1] : $_pa[1] ); //( isset($_pa[0]) ? "{$_pa[0]}: " : '' ) . "{$_pa[1]}";
        
        
$_r[] = $_p;
    }
    
    foreach( 
$_methods as $_f => $m ) {
        
$_f 'method';
        
$_p asd_Parse$_f );
        
$_pASD_T_NAME ] = $m;
    
//    $_p[ Asd ];
    
        
$_r[] = $_p;
    }
    
    return array( 
$_type$_rnull );
};

/**
 * Parse array variable
 *
 */
function asd_ParseArray( &$_v )
{
    if( !
is_array$_v ) ) return null;
    
$_r = array( );
    
    
$_keys array_keys$_v );
    foreach( 
$_keys as $k )
        
$_r[] = asd_Parse$_v$k ], $k );
    
    return 
$_r;
};


/**
 * Parse resource variable
 *
 */
function asd_ParseResource( &$_v )
{
    if( !
is_resource$_v ) ) return null;
    
    
$_r = array( );
    
$_type get_resource_type$_v );
    
    switch( 
$_type ) {
    case 
"fbsql result":
    case 
"mssql result":
    case 
"msql query":
    case 
"pgsql result":
    case 
"sybase-db result":
    case 
"sybase-ct result":
    case 
"mysql result":
        
$db currentexplode" "$_type ) );
        
/*$numrows = call_user_func( "{$db}_num_rows", $_v );
        $numfields = call_user_func( "{$db}_num_fields", $_v );
        for( $i = 0; $i < $numfields; $i ++ ) {
            $field[ $i ] = call_user_func( "{$db}_fetch_field", $_v, $i );
            $field[ $i ] ->name;
        }
        
        for( $i = 0; $i < $numrows; $i ++ ) {
            $row = call_user_func( "{$db}_fetch_array", $_v, constant(strtoupper($db)."_ASSOC") );
            
            for( $k = 0; $k < $numfields; $k ++ ) {
                $tempField = $field[ $k ] ->name;
                $fieldrow = $row[($field[ $k ]->name)];
                $fieldrow = ($fieldrow=="") ? ('['.gettype( $fieldrow ).']') : $fieldrow;
            }
            
        }
        
        if( $numrows > 0 )
            call_user_func( "{$db}_data_seek", $_v, 0 );
        */
        
$_r[] = "{$db} resultSet. need to write this block";
        break;
    
    case 
"gd":
        
/*imagesx( $v )
        imagesy( $v )
        imagecolorstotal( $v )*/
        
$_r[] = "GD resource. need to write this block";
        break;
    
    case 
"mysql link persistent":
        
$_r[] = "mysql plink";
        break;
/*    case "xml":
        $this ->varIsXmlResource($var);
        break;*/
    
    
default:
        
$_r[] = $_type;
        break;
    }
    
    
/*foreach( $_keys as $k )
        $_r[] = asd_Parse( $_v[ $k ] );*/
    
    
return $_r;
};


/**
 * Parse scalar variable
 *
 */
function asd_ParseScalar( &$_v )
{
    if( 
is_null$_v ) ) return array( '?''null' );
    if( 
is_bool$_v ) ) return array( 'bool'$_v 'true' 'false' );
    
    
// array of guesses ordered by priority
    
global $__asd_scalar_priority;
    
$_gs $__asd_scalar_priority;
    
    foreach( 
$_gs as $_g )
    if( 
asd_is$_v$_g ) )
        return array( 
$_g, (string)asd_fval$_v$_g ) );
    
    return array( 
$_g"ý\"".gettype$_v ).": ".addslashes$_v )."\"" );
};








/**
 * Some utilites
 *
 */
/** is _t type-name? */
function asd_isType$_t )
{
    if( !
is_string$_t ) ) return null;
    
//if( !type )
    
return true;
    return 
false;
}

/** is _v type of _t ? */
function asd_is$_v$_t 'numeric' )
{
    if( !
asd_isType$_t ) )
        return 
null// is it need?
    
    
$_f "asd_is{$_t}";
    if( 
is_callable$_f ) )
        return 
$_f$_v );
    
    
$_f "is_{$_t}";
    if( 
is_callable$_f ) )
        return 
$_f$_v );    
    
    return 
null;
}

/** get value of _v with type _t */
function asd_val$_v$_t 'int' )
{
    if( !
asd_isType$_t ) )
        return 
null;
    
    if( 
$_t == 'bool' )
    {
        if( !
asd_is$_v$_t ) ) return null;
        if( 
asd_is$_v'numeric' ) ) return $_v true false;
        
        global 
$__asd_bool_true;
        
$v str_replace$__asd_bool_true'1'trimstrtolower$_v ) ) );
        return 
$v === '1' true false;
    }
    
//    if( $_t == 'object' )
//        return dump( 'object' );
    
if( $_t == 'numeric' )
        
$_t is_float$_v ) ? 'float' 'int';
    
    return 
settype$_v$_t ) ? $_v null;
}

/** get formatted value of _v with type _t */
function asd_fval$_v$_t 'int' )
{
    if( !
asd_isType$_t ) )
        return 
null;
    
    
$_r asd_val$_v$_t );
    
    if( 
is_bool$_r ) )
        return 
$_r "true" "false";
    
    return
        ( 
$_t == 'string' )
        ? 
"\"" addslashes$_r ) . "\""
        
$_r;
}

function 
asd_isFloat$_v ) { if( !is_scalar$_v ) ) return false; return is_float$_v ); }
function 
asd_isInt$_v ) { if( !is_scalar$_v ) ) return false; return is_int$_v ); }
function 
asd_isBool$_v )
{
    if( !
is_scalar$_v ) ) return false;
    if( 
is_numeric$_v ) ) return true;
    
    global 
$__asd_bool;
    
$v str_replace$__asd_bool'1'trimstrtolower$_v ) ) );
    return 
$v === '1' true false;
}


?>