<?php
/**
 * universal functions
 *
 * - preserve notices for post/get data when usign _g, _p, ..., __g, __p, ... functions
 * - array_flat, object_flat functions for simplify arrays and objects to k=>v form
 * - coalesce, ___ functions for fetch first not null argument. usefull for configurations, 4ex
 * - latinate, transliteration functions for rus2lat unified trasformation
 * and ltl bit other.
 *
 * @version:    0.1
 * @author:    alex 'alex_ez' yaroshevich <qfox@ya.ru>
 * @link:    http://src.qfox.ru/
 * @date:    06 jun 2007
 *
 */

function getTick( )

    list( 
$usec$sec ) = explode" "microtime( ) );
    return ( (float)
$usec + (float)$sec );
}

// some useable functions for safe work with get/post/cookie params on _any_ configured php
// and shortcut for isset( a ) ? a : b.
// todo: below functions must be encapsulated to static class!
function _z( &$p1$p2 null ) { if( is_string$p2 ) && is_array$p1 ) ) return array_key_exists$p2$p1 ); return isset( $p1 ); }
function 
_g$_n ) { return array_key_exists$_n$_GET ); }
function 
_p$_n ) { return array_key_exists$_n$_POST ); }
function 
_c$_n ) { return array_key_exists$_n$_COOKIE ); }
function 
_s$_n ) { return array_key_exists$_n$_SESSION ); }
function 
_r$_n ) { return array_key_exists$_n$_REQUEST ); }

function 
__esc$_v )
{
    if( !
get_magic_quotes_gpc( ) ) return $_v;
    if( !
is_array$_v ) ) return stripslashes$_v );
    
$_r = array( ); foreach( $_v as $__k => $__v $_r$__k ] = __esc$__v ); return $_r;
}
function 
__g$_n$_d null ) { return _g$_n ) ? __esc$_GET$_n ] ) : $_d; }
function 
__p$_n$_d null ) { return _p$_n ) ? __esc$_POST$_n ] ) : $_d; }
function 
__c$_n$_d null ) { return _c$_n ) ? __esc$_COOKIE$_n ] ) : $_d; }
function 
__s$_n$_d null ) { return _s$_n ) ? $_SESSION$_n ] : $_d; } // ??? add __esc? or not? i think no.
function __r$_n$_d null ) { return _r$_n ) ? __esc$_REQUEST$_n ] ) : $_d; }

function 
__a$_n$_d null ) { global $core; return __$core ->getAttributeValue$_n ), $_d ); }
function 
__( &$var$_d null ) { return isset( $var ) ? $var $_d; }

/**
 * ___ | coalesce
 * 
 * returns first exists (not null) argument. mysql coalesce function analog for php
 *
 * @alias: ___
 */
function ___( )
{
    
$_args func_get_args( );
    if( 
count$_args ) == ) return null;
    
    if( 
count$_args ) == && is_array$_args[0] ) ) $_args $_args[0];
    if( !
is_array$_args ) ) return null;
    
    foreach( 
$_args as $_arg )
        if( isset( 
$_arg ) && !is_null$_arg ) ) return $_arg;
    return 
null;
}
function 
coalesce( ) { return ___func_get_args( ) ); }

// end of encapsulation




/**
 * Simplifing object to map (assoc-array) function
 *
 * Creates simple map (assoc-array) (scalar key=>value [can be non-scalar!]) from object properties.
 * Can reindex array if executes w/out last ($ param
 *
 * Note: can be slow while operating with big objects (it can be? ;)
 * 
 * @param:    array    $array    input array
 * @param:    scalar    $key    key field,    祩 室 ᨢ, $ - 祭 
 * @param:    scalar    $value    value field,    祭, ᫨  㪠 -   祭, ᫨ $ - 祭 
 *
 * @examples:
$a = array( array('id'=>1,'value'=>'one', ...), array('id'=>2,'value'=>'two', ...), array('id'=>3,'value'=>'three', ...), ... )

// now, we can rebuild array what we need. it`s simple!

// get _id_ to array-key assoc-array
array_flat( $a, 'id', '$' ) ->
    array( 1 => 0, 2 => 1, 3 => 2, ... );

// get _id_ to _value_ assoc-array, if we don`t need other fields
array_flat( $a, 'id', 'value' ) ->
    array( 1 => 'one', 2 => 'two', 3 => 'three', ... );

// or just change a key to _id_
array_flat( $a, 'id' ) ->
    array(
        1 => array('id'=>1,'value'=>'one', ...),
        2 => array('id'=>2,'value'=>'two', ...),
        3 => array('id'=>3,'value'=>'three', ...),
        ...
        )

 * @todo:    probably verification for fields existing must be there ==> speed low?!
 */
function array_flat$array$tickerKey$tickerValue null )
{
    if( !
is_array$array ) ) return null;
    
    
$_r = array( );
    
    foreach( 
$array as $key => $value )
    {
        
//$_r[ $value[ $tickerKey ] ] = is_null( $tickerValue ) ? $value : $value[ $tickerValue ];
        
$__nk = ($tickerKey == '$') ? $key $value$tickerKey ];
        
$__nv is_null$tickerValue ) ? $value : ( ($tickerValue == '$') ? $key $value$tickerValue ] );
        
$_r$__nk ] = $__nv;
    }
    
    return 
$_r;
}

/**
 * Simplifing object to map (assoc-array) function
 *
 * Creates simple map (assoc-array) (scalar key=>value [can be non-scalar!]) from object properties.
 * Note: can be slow while operating with big objects (it can be? ;)
 *
 * @see: array_flat function
 *
 */
function object_flat$objectsArray$tickerKey$tickerValue null )
{
    if( !
is_array$objectsArray ) ) return null;
    
    
$_r = array( );
    
    
//$array = get_object_vars( $object );
    
foreach( $objectsArray as $key => $object )
    {
        
$value get_object_vars$object );
        
$__nk = ($tickerKey == '$') ? $key $value$tickerKey ];
        
$__nv is_null$tickerValue ) ? $value : ( ($tickerValue == '$') ? $key $value$tickerValue ] );
        
$_r$__nk ] = $__nv;
    }
    
    return 
$_r;
}


/**
 * Latinator
 *
 * Transliteration russian letters utf8->latin1 and eraze non-alphanumeric latin chars
 * In my humble oppinion ideal function for tag creating and url/mailbox names
 * Note: For url you must 3r4z3 (#_.) chars, for mailbox - # char.
 *
 * @param:    string    $str    input string for transliteration
 * @result:    string        transliterated string
 */
function latinate$str )
{
    
//todo: добавить проверку на кодировку. в данный момент с натягом происходит utf8->latin1
    
    
$search0 = array(  'й''ц''у''к''е''н''г''ш',  'щ',   'з''х''ъ''ф''ы''в''а''п''р''о''л''д''ж''э''я',  'ч',  'с''м''и''т''ь''б''ю'  );
    
$replace0 = array( 'j''c''u''k''e''n''g''sh''sch''z''h''',  'f''y''v''a''p''r''o''l''d''j''e''ya''ch''s''m''i''t''',  'b''yu' );
    
$search1 = array(  'Й''Ц''У''К''Е''Н''Г''Ш',  'Щ',   'З''Х''Ъ''Ф''Ы''В''А''П''Р''О''Л''Д''Ж''Э''Я',  'Ч',  'С''М''И''Т''Ь''Б''Ю'  );
    
$replace1 = array( 'j''c''u''k''e''n''g''sh''sch''z''h''',  'f''y''v''a''p''r''o''l''d''j''e''ya''ch''s''m''i''t''',  'b''yu' );
    
$search2 = array(  ' ''№' );
    
$replace2 = array( '_''#' );
    
    
$search array_merge$search0$search1$search2 );
    
$replace array_merge$replace0$replace1$replace2 );
    
    
$str str_replace$search$replace$str );
    
    return 
preg_replace'@[^0-9a-zA-Z#\_\-\.]+@'''$str );
}



/**
 * decore
 *
 */
function setErrorLevel$_lvl )
{
    
ini_set'error_reporting'$_lvl );
    
error_reporting$_lvl );
    
ini_set'display_errors', !!$_lvl );
}


// deprecated
class Utils {

    static function 
getEscaped$string ) {
        return 
mysql_real_escape_string$stringDB );
    }
    
    static function 
fetchArrayFromSQL$query$isPair false ) {
        
$resultSet mysql_query$queryDB );
        if( @
mysql_errorDB ) ) return mysql_errorDB );
        
        
$data = array( );
        while( 
$row = @mysql_fetch_assoc$resultSet ) )
        if( 
$isPair && isset( $row['id'] ) && isset( $row['value'] ) ) {
            
$data[$row['id']] = $row['value'];
        } elseif( isset( 
$row['id'] ) ) {
            
$data[$row['id']] = $row;
        } else {
            
$data[] = $row;
        };
        
        
mysql_free_result$resultSet );
        
        return 
$data;
    }
    
    static function 
fetchValueFromSQL$query ) {
        list(
$value) = array_valuesUtils::fetchRowFromSQL$query ) );
        return 
$value;
    }
    
    static function 
fetchRowFromSQL$query ) {
        
$resultSet mysql_query$queryDB );
        if( @
mysql_errorDB ) ) return mysql_errorDB );
        
        
$row = @mysql_fetch_assoc$resultSet );
        
mysql_free_result$resultSet );
        
        return 
$row;
    }
    
    static function 
drawSQLTable$query ) {
        
$resultSet mysql_query$queryDB );
        if( @
mysql_errorDB ) ) return mysql_errorDB );
        
        
$data = array( );
        while( 
$row = @mysql_fetch_assoc$resultSet ) ) $data[] = $row;
//        $data = Utils::fetchArrayFromSQL( $query );
        
        
$fieldsNumber = @mysql_num_fields$resultSet );
        
$header = array( );
        for( 
$i 0$i $fieldsNumber$i ++ ) {
            
$field = @mysql_fetch_field$resultSet$i );
            
$header$i ] = "{$field->type}({$field->max_length}{$field->table}.{$field->name}";
            if( 
$field ->primary_key $field ->unique_key $header$i ] = "<b>".$header$i ]."</b>";
            if( 
$field ->multiple_key $header$i ] = "<i>".$header$i ]."</i>";
        };
        
mysql_free_result$resultSet );
        
        return 
Utils::drawTable$header$data );
    }
    
    static function 
drawTable$header$data ) {
        
$_table "<table cellspacing='0' cellpadding='2' border='1'>\n";
        
        
$_table .= "  <tr>\n";
        foreach( 
$header as $th )
            
$_table .= "    <th>$th</td>";
        
$_table .= "  </tr>\n";
        
        foreach( 
$data as $tr ) {
            
$_table .= "  <tr>\n";
            foreach( 
$tr as $td ) {
                
$_table .= "    <td>$td</td>\n";
            }
            
$_table .= "  </tr>\n";
        }
        
        
$_table .= "</table>\n";
        
        return 
$_table;
    }
    
    static function 
drawList$caption$content ) {
        
$_list "<ul>\n";
        
$_list .= $caption;
        foreach( 
$content as $name => $item ) {
            if( 
is_array$item ) ) $_list .= Utils::drawList$name."&nbsp;"$item );
            else 
$_list .= "  <li>".$item."</li>\n";
        };
        
$_list .= "</ul>\n";
        
        return 
$_list;
    }
}


/**
 * showTpl
 * 
 * shortcut for showing template.
 * deprecated bqz very dirty and slow
 *
 * @param:    string    $template    template file for view
 * @param:    map    $data        assoc array with params, if need
 * @see:    ./view.class.php
 */
function showTpl$template$data null )
{
    global 
$__template;
    
    if( !
is_object$__template ) )
        
$__template = new fbTemplate( );
    
    
$__template ->clear_all_assign( );
    if( 
is_array$data ) )
        
$__template ->assign$data );
    
    
$__template ->load$template );
    return 
$__template ->render( );
}


/**
 * l (label)
 *
 * shortcut for labeling in multilanguage projects
 * deprecated bqz speed low.
 *
 * @see:    gettext library
 *
 */
function l$label$pattern null )
{
    if( 
is_null$pattern ) || $pattern == '' $pattern '$';
    if( 
strpos$pattern'$' ) === false $pattern .= '$';
    
$pattern strtoupperstr_replace'$'$label$pattern ) );
    
    global 
$Labels;
    if( 
is_object$Labels ) ) return $Labels ->getLabel$pattern );
    return 
"L\{{$pattern}\}";
}

?>