<?

    ##########################################
    #
    #    Virtualize Framework.
    #
    #    02/10/2007
    #    Arivan S. Bastos
    #
    #
    #    Funções auxiliares do Framework Virtualize.
    #
    ##########################################

if ( !defined("VIRTUALIZE_UTIL_PHP") )
{
    define("VIRTUALIZE_UTIL_PHP", 1);

    /** 
    * Retorna o parametro de sistema correspondente.
    * @param    String  - Nome do parametro.
    * @returns  String | Int | Array  - Valor do parametro.
    */  
    function GetSystemParameter( $parameter )
    {
        global $connection;

        $PARAMETERS_TABLE = "vfw_parameters";
        $PARAM_TYPE_INT     = 0;
        $PARAM_TYPE_FLOAT = 1;
        $PARAM_TYPE_STR = 2;
        $PARAM_TYPE_ARRAY = 3;

        $SQL = "SELECT parameter_value, parameter_type FROM " .     $PARAMETERS_TABLE . " WHERE parameter_name = \"" . $parameter . "\"";            
        $result = $connection->MakeQuery($SQL);

        if ($row = NextRecord($result)) 
        {

            if ($row["parameter_type"] == $PARAM_TYPE_INT)            return (int)$row["parameter_value"] ;
            else if ($row["parameter_type"] == $PARAM_TYPE_STR)        return (string)$row["parameter_value"] ;
            else if ($row["parameter_type"] == $PARAM_TYPE_FLOAT)     return (float)$row["parameter_value"] ;
            else if ( $row["parameter_type"] == $PARAM_TYPE_ARRAY)  return explode("," , $row["parameter_value"]);
        }
        return NULL;
    }
    
    function GetCurrentPage()
    {
        return substr($_SERVER["REQUEST_URI"], strrpos($_SERVER["REQUEST_URI"], "/")+1);
        
    }

    //========================================================
    //
    //    GERAÇÃO DE COMPONENTES HTML.
    //
    //========================================================

    
    /** 
    * Gera um componente HTML SELECT. 
    * @param    String  - Nome do componente.
    * @param    Array   - Valores que o componente deve apresentar (cada elemento desse array
    * deve ser um Array, onde o indice 0 é a chave e o índice 1 é o valor). 
    * @param    Int | String - Chave do elemento selecionado.
    * @param    [String] - Estilo do componente.
    * @returns  void
    */      
    function MakeSelect( $nome, $valores, $selecionado, $estilo = "" ) 
    {
        echo "<select name=\"".$nome."\" ".($estilo!=""?"class='$estilo'":"").">";
        while ( $linha = each($valores) ) 
        {
            echo "<option value=".$linha[0]." ".($linha[0]==$selecionado?"selected":"").">".$linha[1]."</option>";
        }
        echo "</select>";
    }

    /** 
    * Gera um vetor para utilização como 2º parametro na função MakeSelect, a partir
    * de uma consulta SQL. A consulta deve selecionar dois campos da tabela (nessa ordem):
    * o campo identificador e o campo que será apresentado no componente Select.
    * @param    String  - Consulta SQL fonte.
    * @param    Boolean - Especifique true, caso deseje que o primeiro item do select seja vazio. 
    * @returns  Array   - Dados para utilização na geração do componente Select.
    */      
    function MakeSelectArrayFromQuery($SQL, $emptyElement = false)
    {
        global $connection;
        $result = $connection->MakeQuery($SQL);

        $a    = Array();
        if ($emptyElement) $a[0] = "";
        while ($row = NextRecord($result))
        {
            $a[$row[0]] = $row[1];
        }
        return $a;
    }

    /** 
    * Gera um vetor com a primeira coluna das linhas resultantes de uma consulta.
    * @param    String  - Consulta SQL fonte.
    * @returns  Array   - Array com o resultado.
    */      
    function MakeArrayFromQuery($SQL)
    {
        global $connection;        
        $result = $connection->MakeQuery($SQL);
        
        $a = Array();
        while ($row = NextRecord($result))
        {          
            array_push($a, $row[0]);
        }
        return $a;
    }
    
    
    /** 
    * Gera um vetor para utilização como 2º parametro na função MakeSelect, a partir
    * do nome da tabela, campo identificador e campo de valor.
    * @param    String  - Tabela que contem os dados o componente Select.
    * @param    String  - Campo a ser utilizado como identificador no componente Select.
    * @param    String  - Campo que será apresentado no componente Select.
    * @param    Boolean - Especifique true, caso deseje que o primeiro item do select seja vazio.  
    * @returns  Array   - Dados para utilização na geração do componente Select.
    */        
    function MakeSelectArray($table, $idField, $valueField, $emptyElement = false)
    {
        $SQL = "SELECT $idField, $valueField FROM $table ORDER BY $valueField ";
        return MakeSelectArrayFromQuery($SQL, $emptyElement);
    }

    function MakeJavaScriptArray($array)
    {
        $jsArrayString = "";
        for ($i = 0; $i < count($array); $i++)
        {   
            if ($i == 0) $jsArrayString .= "\""     .$array[$i] . "\"";
            else         $jsArrayString .= ", \""   .$array[$i] . "\"";
            
        }
        $jsArrayString .= "";
        return $jsArrayString;
    }
    
    //========================================================
    //
    //    STRINGS E ARRAYS.
    //
    //========================================================

    /** 
    * Retorna a última ocorrência de uma String em outra.
    * @param    String  - String onde deseja-se fazer a busca.
    * @param    String  - String que deseja-se buscar.
    * @returns  int     - Índice da ocorrência de $item em $string.
    */        
    function LastIndexOf($string,$item)
    {
        $index = strpos(strrev($string),strrev($item));
        if ($index)
        {
            $index=strlen($string)-strlen($item)-$index;
            return $index;
        }
        else return -1;
    }
      
    /** 
    * Verifica se um Array contem um dado valor.
    * @param    Array  - Array onde deseja-se buscar.
    * @param    String | int - Valor que deseja-se buscar.
    * @returns  boolean - true caso o Array $a contenha o valor $v, false caso contrário.
    */ 
    function ArrayContains( $a, $v ) 
    {
        foreach ( $a as $value ) 
            if ( $v == $value ) return true;

        return false;
    }

    //========================================================
    //
    //    CONTENT SESSION.
    //
    //========================================================

    //--------------------------------------------------------
    //    Converte caracteres HTML para seus equivalentes em ASCII.
    //--------------------------------------------------------
    function HtmlSpecialCharsDecode ($str) 
    {
        /*$version_exploded = explode(".",PHP_VERSION);
        $major_version = $version_exploded[0] + 0;
        if ($major_version == 4)
        {
            return strtr($str, array_flip(get_html_translation_table(HTML_SPECIALCHARS)));
        }
        else
        {
            return htmlspecialchars_decode($str);
        }*/
         if(function_exists("htmlspecialchars_decode"))
        {
            return htmlspecialchars_decode($str);
        } else {
            return strtr($str, array_flip(get_html_translation_table(HTML_SPECIALCHARS)));
        }
    }

    //-------------------------------------------------
    //    Versão portavel para PHP4/PHP5 de stripos().
    //-----------------------------------------------------
    function StrIPos_ ($haystack, $needle) 
    {
        return strpos($haystack, stristr( $haystack, $needle ));
    }

    //--------------------------------------------------------
    //    Imprime o conteudo da sessão por $content.
    //--------------------------------------------------------
    function PrintSessionContent($content)
    {
        echo GetSessionContent($content);
    }

    //--------------------------------------------------------
    //    Retorna o conteúdo da sessão $content.
    //--------------------------------------------------------
    function GetSessionContent($sessionName)
    {
        global $connection;

        $SQL    = " SELECT content FROM vfw_session WHERE name = \"" .  $sessionName . "\" ";
        $result = $connection->MakeQuery($SQL);
        if ($row = NextRecord($result))
        {
            return HtmlSpecialCharsDecode($row["content"]);
        }
        return "";
    }

    //========================================================
    //
    //    ACESSO A DADOS.
    //
    //========================================================

    //--------------------------------------------------------
    //    Retorna o conteúdo da variavel $name,
    //    evitando SQL injection.
    //--------------------------------------------------------
    function GetVar($name)
    {
        $value = "";

        global $HTTP_POST_VARS;
        global $HTTP_GET_VARS;

        if (isset($HTTP_POST_VARS[$name])) $value = $HTTP_POST_VARS[$name];
        if (isset($HTTP_GET_VARS[$name])) $value = $HTTP_GET_VARS[$name];

        if (is_array($value))  return $value;

        if (get_magic_quotes_gpc()) $value = htmlspecialchars( stripslashes($value) ) ;
        else $value = htmlspecialchars($value) ;

        if (isset($_FILES[$name])) $value = $_FILES[$name];

        return $value;
    }
    
    //---------------------------------------
    //
    // Acesso a sessoes.
    //
    //------------------------------------------

    function session_secure()
    {
        
        // wrapped for the php entry....
        $alph =array('A','a','B','b','C','c','D','d','E',
        'e','F','f','G','g','H','h','I','i','J','K','k',
        'L','l','M','m','N','n','O','o','P','p','Q','q',
        'R','r','S','s','T','t','U','u','V','v','W','w',
        'X','x','Y','y','Z','z');
        for($i=0;$i<rand(10,20);$i++){
            $tmp[] =$alph[rand(0,count($alph))];
            $tmp[] =rand(0,9);
        }
        return implode("",shuffle($tmp)); 
        //return "";
    }
    
    function StartSession()
    {
        global $_SESSION;
        if(!isset($_SESSION)) 
        {
            session_start();
            session_secure();
        }
    }
    
    function GetSessionVar($name)
    {
        global $_SESSION;
        StartSession();
        
        if (isset($_SESSION[$name]))
        {
            return $_SESSION[$name];
        }
        return "";        
    }
    
    function SetSessionVar($name, $value)
    {
        global $_SESSION;
        StartSession();
        
        $_SESSION[$name] =  $value;
    }
    
    function ValidatePageAccess($pageName)
    {
        $pageName = explode("?", $pageName);
        $pageName = $pageName[0];
        
        //echo("ValidatePageAccess '" . GetSessionVar("vfw_adm_accessible_pages") . "'<br>");        
        if ($pageName == "fail.php") return true;
        else if (GetSessionVar("vfw_adm_accessible_pages") == null) return false;
        else if (GetSessionVar("vfw_adm_accessible_pages") == "*") return true;
        
        $pages = explode(",", GetSessionVar("vfw_adm_accessible_pages")); 
        for ($i = 0; $i < count($pages); $i++)
        {
            //echo ("Comparando " . $pages[$i] . " com " . $pageName);
            if ($pages[$i] == $pageName)
            {
                return true;
            }
        }
        return false;
    }
    
    //====================================================
    //
    //    MISCELANEA.
    //
    //====================================================
    function GenerateRandomMD5Word($length)
    {
        $str = md5(GenerateRandomWord(10));
        if (strlen($str) > $length) return substr($str, 0, $length);

        return $str;
    }

    function GenerateRandomWord($length)
    {
        $pattern = "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
        $key  = $pattern{rand(0,61)};
        for($i=1;$i<$length;$i++)
        {
            $key .= $pattern{rand(0,61)};
        }
        return $key;
    }

    //========================================================
    //
    //    Funções de alerta, erros e DEBUG.
    //
    //========================================================

    //--------------------------------------------------------
    //    Retorna o conteúdo da variaveo $msg,
    //    na forma de alert em Java Script
    //--------------------------------------------------------
    function Alert($msg){
        echo ("<script>alert ('".$msg."')</script>");
    }

    function VFWError($msg)
    {
        header("location: fail.php?error=" . urlencode($msg));
        die("");
    }
    
    /**
    * @desc Codifica uma URL para passagem GET.
    * @param String - URL no formato, url?parametro1=valor1&parametro2=valor2...
    */
    function VFW_URLEncode($url)
    {
        //echo("Chamou ". $url . "<br>");
        $result = "";
        $parameters = explode("&", $url);
        for ( $i = 0; $i < count($parameters); $i++)
        {
            $parameter =  $parameters[$i];
            if ($i == 0)
            {
                $part = explode("?", $parameter);
                $result = $part[0];
                $result.=  "?" . VFW_ParameterEncode($part[1]);
            }
            else
            {
               $result.=  "&" . VFW_ParameterEncode($parameter);    
            }
        }
        //echo ("Resultado: " . $result . "<br>");        
        return $result;
    }
    
    /**
    * @desc Codifica um parametro para passagem GET.
     @param String - Parametro no formato parametro=valor
    */    
    function VFW_ParameterEncode($parameterEqualValueStr)
    {
        // Verifica se existe o caracter +.
        // Caso exista considera que o parametro está em formato string Java Script,
        // não realizando o urlencode.
        if (strrpos($parameterEqualValueStr, "+") === false)
        {
            $parameterValue = explode("=", $parameterEqualValueStr);
            return $parameterValue[0] . "=" . urlencode($parameterValue[1]);
        }
        return $parameterEqualValueStr;
    }
    
    function RemoveGetParameter($url, $parameter)
    {      
        $parametersStart = strpos($url, "?");
        if ($parametersStart === false) return $url;
        
        $uri               = substr($url, 0, $parametersStart); 
        $parametersStr     = substr($url, $parametersStart+1);
        $parameters        = explode("&", $parametersStr);
        
        $result = "";
        for ( $i = 0; $i < count($parameters); $i++)
        {
            list($name, $value) = split("=", $parameters[$i]);
            if ($name != $parameter)
            {
                if ($result == "") $result  = $name . "=" . $value;
                else               $result .= "&" . $name . "=" . $value;
            }
        }
        return $uri . "?" . $result;
    }
}

?>