Files
luos/gulliver/system/class.g.php

4497 lines
141 KiB
PHP
Raw Normal View History

2010-12-02 23:34:41 +00:00
<?php
/**
* class.g.php
* @package gulliver.system
2010-12-02 23:34:41 +00:00
*
* ProcessMaker Open Source Edition
2011-01-24 20:47:37 +00:00
* Copyright (C) 2004 - 2011 Colosa Inc.
2010-12-02 23:34:41 +00:00
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* For more information, contact Colosa Inc, 2566 Le Jeune Rd.,
* Coral Gables, FL, 33134, USA, or email info@colosa.com.
*
*/
/**
2011-01-14 11:51:34 +00:00
* @package gulliver.system
2010-12-02 23:34:41 +00:00
*/
class G
{
/**
* is_https
* @return void
*/
2010-12-02 23:34:41 +00:00
function is_https()
{
if(isset($_SERVER['HTTPS']))
{
2010-12-02 23:34:41 +00:00
if($_SERVER['HTTPS']=='on')
return true;
else
return false;
}
else
return false;
}
/**
* Fill array values (recursive)
* @author maborak <maborak@maborak.com>
* @access public
* @param Array $arr
* @param Void $value
* @param Boolean $recursive
* @return Array
*/
function array_fill_value($arr = Array(),$value = '',$recursive = false)
{
if(is_array($arr)) {
foreach($arr as $key=>$val) {
if(is_array($arr[$key])) {
$arr[$key] = ($recursive===true)?G::array_fill_value($arr[$key],$value,true):$val;
}
else {
$arr[$key] = $value;
}
}
}
else {
$arr = Array();
}
return $arr;
}
/**
* Generate Password Random
* @author maborak <maborak@maborak.com>
* @access public
* @param Int
* @return String
*/
function generate_password($length = 8)
{
$password = "";
$possible = "0123456789bcdfghjkmnpqrstvwxyz";
$i = 0;
while($i<$length) {
$char = substr($possible, mt_rand(0, strlen($possible)-1), 1);
if(!strstr($password, $char)) {
$password .= $char;
$i++;
}
}
return $password;
}
/**
* Array concat
* array_concat(ArrayToConcat,ArrayOriginal);
* @author maborak <maborak@maborak.com>
* @access public
* @param Array
* @return Array
*/
function array_concat()
{
$nums = func_num_args();
$vars = func_get_args();
$ret = Array();
for($i = 0;$i < $nums; $i++)
{
if(is_array($vars[$i])) {
foreach($vars[$i] as $key=>$value) {
$ret[$key] = $value;
}
}
}
return $ret;
}
/**
* Compare Variables
* var_compare(value,[var1,var2,varN]);
* @author maborak <maborak@maborak.com>
* @access public
* @param void $value
* @param void $var1-N
* @return Boolean
*/
function var_compare($value=true,$varN)
{
$nums = func_num_args();
if($nums<2){return true;}
$vars = func_get_args();
$ret = Array();
for($i=1;$i<$nums;$i++) {
if($vars[$i]!==$value) {
return false;
}
}
return true;
}
/**
* Emulate variable selector
* @author maborak <maborak@maborak.com>
* @access public
* @param void
* @return void
*/
function var_probe()
{
//return (!$variable)?
$nums = func_num_args();
$vars = func_get_args();
for($i=0;$i<$nums;$i++) {
if($vars[$i]) {
return $vars[$i];
}
}
return 1;
}
/**
* Get the current version of gulliver classes
* @author Fernando Ontiveros Lira <fernando@colosa.com>
* @access public
* @return string
*/
/*public static*/ function &getVersion( )
{
//majorVersion.minorVersion-SvnRevision
return '3.0-1';
}
/**
* getIpAddress
* @return string $ip
*/
/*public static*/ function getIpAddress ()
2010-12-02 23:34:41 +00:00
{
if (getenv('HTTP_CLIENT_IP')) {
$ip = getenv('HTTP_CLIENT_IP');
}
elseif(getenv('HTTP_X_FORWARDED_FOR')) {
$ip = getenv('HTTP_X_FORWARDED_FOR');
}
else {
$ip = getenv('REMOTE_ADDR');
}
return $ip;
}
/**
* getMacAddress
* @return string $mac
*/
function getMacAddress()
2010-12-02 23:34:41 +00:00
{
if ( strstr ( getenv ( 'OS' ), 'Windows' ) ) {
$ipconfig = `ipconfig /all`;
preg_match('/[\dA-Z]{2,2}[\:-][\dA-Z]{2,2}[\:-][\dA-Z]{2,2}[\:-][\dA-Z]{2,2}[\:-][\dA-Z]{2,2}[\:-][\dA-Z]{2,2}/i',$ipconfig,$mac);
} else {
$ifconfig = `/sbin/ifconfig`;
preg_match('/[\dA-Z]{2,2}[\:-][\dA-Z]{2,2}[\:-][\dA-Z]{2,2}[\:-][\dA-Z]{2,2}[\:-][\dA-Z]{2,2}[\:-][\dA-Z]{2,2}/i',$ifconfig,$mac);
}
return isset($mac[0])? $mac[0]:'00:00:00:00:00:00';
}
/**
* microtime_float
* @return array_sum(explode(' ',microtime()))
*/
2010-12-02 23:34:41 +00:00
/*public static*/ function microtime_float() {
return array_sum(explode(' ',microtime()));
}
/* custom error functions */
/**
* &setFatalErrorHandler
*
* @param string $newFatalErrorHandler default value null
*
* @return boolean true
*/
2010-12-22 14:21:52 +00:00
/*public static*/
function &setFatalErrorHandler( $newFatalErrorHandler = null )
{
if ( isset ( $newFatalErrorHandler ) ) {
set_error_handler( $newFatalErrorHandler );
}
else {
ob_start( array ( 'G', 'fatalErrorHandler' ) );
}
return true;
}
2010-12-02 23:34:41 +00:00
/**
* setErrorHandler
* @param string setErrorHandler
* @param object $newCustomErrorHandler
2010-12-02 23:34:41 +00:00
*
* @return boolean true
*/
2010-12-22 14:21:52 +00:00
/*public static*/
function setErrorHandler( $newCustomErrorHandler = null )
{
2010-12-02 23:34:41 +00:00
if ( isset ( $newCustomErrorHandler ) ) {
set_error_handler( $newCustomErrorHandler );
}
else {
set_error_handler( array("G", "customErrorHandler"));
}
return true;
2010-12-22 14:21:52 +00:00
}
2010-12-02 23:34:41 +00:00
/**
* fatalErrorHandler
*
* @param string $buffer
*
* @return string $errorBox or $buffer
*/
2010-12-02 23:34:41 +00:00
/*public static*/ function fatalErrorHandler($buffer) {
if (ereg("(error</b>:)(.+)(<br)", $buffer, $regs) ) {
$err = preg_replace("/<.*?>/","",$regs[2]);
G::customErrorLog('FATAL', $err, '', 0, '');
$ip_addr = G::getIpAddress();
$errorBox = "<table cellpadding=1 cellspacing=0 border=0 bgcolor=#808080 width=250><tr><td >" .
"<table cellpadding=2 cellspacing=0 border=0 bgcolor=white width=100%>" .
"<tr bgcolor=#d04040><td colspan=2 nowrap><font color=#ffffaa><code> ERROR CAUGHT check log file</code></font></td></tr>" .
"<tr ><td colspan=2 nowrap><font color=black><code>IP address: $ip_addr</code></font></td></tr> " .
"</table></td></tr></table>";
return $errorBox;
}
return $buffer;
}
/**
2010-12-22 14:21:52 +00:00
* customErrorHandler
2010-12-02 23:34:41 +00:00
*
* @param string $errno
* @param string $msg
* @param string $file
* @param string $line
* @param string $context
*
* @return void
*/
2010-12-22 14:21:52 +00:00
/*public static*/
function customErrorHandler ( $errno, $msg, $file, $line, $context) {
2010-12-02 23:34:41 +00:00
switch ($errno) {
case E_ERROR:
case E_USER_ERROR:
$type = "FATAL";
G::customErrorLog ($type, $msg, $file, $line);
G::verboseError ($type, $errno, $msg, $file, $line, $context);
if (defined ("ERROR_SHOW_SOURCE_CODE") && ERROR_SHOW_SOURCE_CODE)
G::showErrorSource ($type, $msg, $file, $line, "#c00000");
die ();
break;
case E_WARNING:
case E_USER_WARNING:
$type = "WARNING";
G::customErrorLog ($type, $msg, $file, $line);
break;
case E_NOTICE:
case E_USER_NOTICE:
$type = "NOTICE";
if (defined ("ERROR_LOG_NOTICE_ERROR") && ERROR_LOG_NOTICE_ERROR)
G::customErrorLog ($type, $msg, $file, $line);
break;
case E_STRICT:
$type = "STRICT"; //dont show STRICT Errors
//if (defined ("ERROR_LOG_NOTICE_ERROR") && ERROR_LOG_NOTICE_ERROR)
// G::customErrorLog ($type, $msg, $file, $line);
break;
default:
$type = "ERROR ($errno)";
G::customErrorLog ($type, $msg, $file, $line);
break;
}
if (defined ("ERROR_SHOW_SOURCE_CODE") && ERROR_SHOW_SOURCE_CODE && $errno <> E_STRICT )
G::showErrorSource ($type, $msg, $file, $line);
}
/**
* Function showErrorSource
* @author David S. Callizaya S. <davidsantos@colosa.com>
* @access public
* @parameter string type
* @parameter string msg
* @parameter string file
* @parameter string line
* @return string
*/
function showErrorSource($type, $msg, $file, $line)
{
global $__src_array;
$line_offset = 3;
if (! isset ($__src_array[$file]))
$__src_array[$file] = @file ($file);
if (!$__src_array[$file])
return;
if ($line - $line_offset < 1)
$start = 1;
else
$start = $line - $line_offset;
if ($line + $line_offset > count ($__src_array[$file]))
$end = count ($__src_array[$file]);
else
$end = $line + $line_offset;
print "<table cellpadding=1 cellspacing=0 border=0 bgcolor=#808080 width=80%><tr><td >";
print "<table cellpadding=2 cellspacing=0 border=0 bgcolor=white width=100%>";
print "<tr bgcolor=#d04040>
<td colspan=2 nowrap><font color=#ffffaa><code> $type: $msg</code></font></td></tr>
<tr >
<td colspan=2 nowrap><font color=gray>File: $file</font></td></tr>
";
for ($i = $start; $i <= $end; $i++) {
2011-01-06 11:11:53 +00:00
$str = @highlight_string ("<?php" . $__src_array[$file][$i-1] . "?>", TRUE);
2010-12-02 23:34:41 +00:00
$pos1 = strpos ($str,"&lt;?");
$pos2 = strrpos ($str,"?&gt;");
$str = substr ($str, 0, $pos1) .
substr ($str, $pos1+5, $pos2-($pos1+5)) .
substr ($str, $pos2+5);
($i == $line) ? $bgcolor = "bgcolor=#ffccaa" : $bgcolor = "bgcolor=#ffffff";
print "<tr><td bgcolor=#d0d0d0 width=15 align=right><code>$i</code></td>
<td $bgcolor>$str</td></tr>";
}
print "</table></td></tr></table><p>";
}
/**
2010-12-22 14:21:52 +00:00
* customErrorLog
2010-12-02 23:34:41 +00:00
*
* @param string $type
* @param string $msg
* @param string $file
2010-12-02 23:34:41 +00:00
* @param string $line
*
* @return void
*/
2010-12-22 14:21:52 +00:00
/*public static*/
function customErrorLog ($type, $msg, $file, $line)
{
2010-12-02 23:34:41 +00:00
global $HTTP_X_FORWARDED_FOR, $REMOTE_ADDR, $HTTP_USER_AGENT, $REQUEST_URI;
$ip_addr = G::getIpAddress();
if (defined ('APPLICATION_CODE'))
$name = APPLICATION_CODE;
else
$name = "php";
if ( $file != '')
2010-12-02 23:34:41 +00:00
$msg .= " in $file:$line ";
$date = date ( 'Y-m-d H:i:s');
$REQUEST_URI = getenv ( 'REQUEST_URI' );
$HTTP_USER_AGENT = getenv ( 'HTTP_USER_AGENT' );
error_log ("[$date] [$ip_addr] [$name] $type: $msg [$HTTP_USER_AGENT] URI: $REQUEST_URI", 0);
2010-12-22 14:21:52 +00:00
}
2010-12-02 23:34:41 +00:00
/**
2010-12-22 14:21:52 +00:00
* verboseError
2010-12-02 23:34:41 +00:00
*
* @param string $type
* @param string $errno
* @param string $msg
* @param string $file
* @param string $line
2010-12-02 23:34:41 +00:00
* @param string $context
*
* @return void
*/
2010-12-02 23:34:41 +00:00
/*public static*/ function verboseError ($type, $errno, $msg, $file, $line, $context) {
global $SERVER_ADMIN;
print "<h1>Error!</h1>";
print "An error occurred while executing this script. Please
contact the <a href=mailto:$SERVER_ADMIN>$SERVER_ADMIN</a> to
report this error.";
print "<p>";
print "Here is the information provided by the script:";
print "<hr><pre>";
print "Error type: $type (code: $errno)<br>";
print "Error message: $msg<br>";
print "Script name and line number of error: $file:$line<br>";
print "Variable context when error occurred: <br>";
print_r ($context);
print "</pre><hr>";
}
/*** Encrypt and decrypt functions ****/
/**
* Encrypt string
*
* @author Fernando Ontiveros Lira <fernando@colosa.com>
* @access public
* @param string $string
* @param string $key
* @return string
*/
function encrypt($string, $key)
2010-12-22 14:21:52 +00:00
{
2010-12-02 23:34:41 +00:00
//print $string;
// if ( defined ( 'ENABLE_ENCRYPT' ) && ENABLE_ENCRYPT == 'yes' ) {
if (strpos($string, '|', 0) !== false) return $string;
$result = '';
for($i = 0; $i<strlen($string); $i++) {
$char = substr($string, $i, 1);
$keychar = substr($key, ($i % strlen($key))-1, 1);
$char = chr(ord($char)+ord($keychar));
$result .= $char;
2010-12-22 14:21:52 +00:00
}
2010-12-02 23:34:41 +00:00
//echo $result . '<br>';
$result = base64_encode($result);
$result = str_replace ( '/' , '°' , $result);
$result = str_replace ( '=' , '' , $result);
// }
// else
// $result = $string;
return $result;
2010-12-22 14:21:52 +00:00
}
2010-12-02 23:34:41 +00:00
/**
* Decrypt string
*
* @author Fernando Ontiveros Lira <fernando@colosa.com>
* @access public
* @param string $string
* @param string $key
* @return string
*/
/*public static*/ function decrypt($string, $key) {
// if ( defined ( 'ENABLE_ENCRYPT' ) && ENABLE_ENCRYPT == 'yes' ) {
//if (strpos($string, '|', 0) !== false) return $string;
$result = '';
$string = str_replace ( '°', '/' , $string);
$string_jhl = explode("?",$string);
$string = base64_decode($string);
$string = base64_decode($string_jhl[0]);
for($i=0; $i<strlen($string); $i++) {
$char = substr($string, $i, 1);
$keychar = substr($key, ($i % strlen($key))-1, 1);
$char = chr(ord($char)-ord($keychar));
$result .= $char;
}
if (!empty($string_jhl[1]))
2010-12-02 23:34:41 +00:00
$result .= '?' . $string_jhl[1];
// }
// else
// $result = $string;
return $result;
}
/**
* Look up an IP address direction
* @author Fernando Ontiveros Lira <fernando@colosa.com>
* @access public
* @param string $target
* @return void
*/
function lookup($target)
{
//if( eregi("[a-zA-Z]", $target) )
if( preg_match("[a-zA-Z]", $target) )//Made compatible to PHP 5.3
2010-12-02 23:34:41 +00:00
$ntarget = gethostbyname($target);
else
$ntarget = gethostbyaddr($target);
return($ntarget);
}
/*************** path functions *****************/
2010-12-22 14:21:52 +00:00
2010-12-02 23:34:41 +00:00
/*public static*/ function mk_dir( $strPath, $rights = 0777)
{
$folder_path = array($strPath);
$oldumask = umask(0);
while(!@is_dir(dirname(end($folder_path)))
&& dirname(end($folder_path)) != '/'
&& dirname(end($folder_path)) != '.'
&& dirname(end($folder_path)) != '')
array_push($folder_path, dirname(end($folder_path))); //var_dump($folder_path); die;
while($parent_folder_path = array_pop($folder_path))
if(!@is_dir($parent_folder_path))
if(!@mkdir($parent_folder_path, $rights))
//trigger_error ("Can't create folder \"$parent_folder_path\".", E_USER_WARNING);
umask($oldumask);
}
/**
* rm_dir
*
* @param string $dirName
*
* @return void
*/
2010-12-02 23:34:41 +00:00
function rm_dir($dirName) {
if(empty($dirName)) {
return;
}
if(file_exists($dirName)) {
$dir = dir($dirName);
while($file = $dir->read()) {
if($file != '.' && $file != '..') {
if(is_dir($dirName.'/'.$file)) {
G::rm_dir($dirName.'/'.$file);
} else {
@unlink($dirName.'/'.$file) or die('File '.$dirName.'/'.$file.' couldn\'t be deleted!');
}
}
}
$folder = opendir($dirName. PATH_SEP .$file);
closedir($folder);
@rmdir($dirName.'/'.$file) or die('Folder '.$dirName.'/'.$file.' couldn\'t be deleted!');
} else {
echo 'Folder "<b>'.$dirName.'</b>" doesn\'t exist.';
}
}
/**
* verify path
*
* @author Fernando Ontiveros Lira <fernando@colosa.com>
* @access public
* @param string $strPath path
* @param boolean $createPath if true this function will create the path
* @return boolean
*/
/*public static*/ function verifyPath( $strPath , $createPath = false )
{
$folder_path = strstr($strPath, '.') ? dirname($strPath) : $strPath;
if ( file_exists($strPath ) || @is_dir( $strPath )) {
return true;
}
else {
if ( $createPath ) {
//TODO:: Define Environment constants: Devel (0777), Production (0770), ...
G::mk_dir ( $strPath , 0777 );
}
else
return false;
}
return false;
}
/**
* Expand the path using the path constants
*
* @author Fernando Ontiveros Lira <fernando@colosa.com>
* @access public
* @param string $strPath
* @return string
*/
function expandPath( $strPath = '' )
{
$res = "";
$res = PATH_CORE;
if( $strPath != "" )
{
$res .= $strPath . "/";
}
return $res;
}
/**
* Load Gulliver Classes
*
* @author Fernando Ontiveros Lira <fernando@colosa.com>
* @access public
* @param string $strClass
* @return void
*/
function LoadSystem( $strClass )
{
require_once( PATH_GULLIVER . 'class.' . $strClass . '.php' );
}
function LoadSystemExist($strClass)
{
if (file_exists (PATH_GULLIVER . 'class.' . $strClass . '.php') )
2010-12-02 23:34:41 +00:00
return true;
else
2010-12-02 23:34:41 +00:00
return false;
}
/**
* Render Page
*
* @author Fernando Ontiveros Lira <fernando@colosa.com>
* @access public
* @param object $objContent
* @param string $strTemplate
* @param string $strSkin
* @return void
*/
function RenderPage( $strTemplate = "default", $strSkin = SYS_SKIN , $objContent = NULL )
{
global $G_CONTENT;
global $G_TEMPLATE;
global $G_SKIN;
2010-12-02 23:34:41 +00:00
$G_CONTENT = $objContent;
$G_TEMPLATE = $strTemplate;
$G_SKIN = $strSkin;
2010-12-02 23:34:41 +00:00
try {
//G::LoadSkin( $strSkin );
G::skinEngine($strSkin);
2010-12-02 23:34:41 +00:00
}
catch ( Exception $e ) {
$aMessage['MESSAGE'] = $e->getMessage();
global $G_PUBLISH;
global $G_MAIN_MENU;
global $G_SUB_MENU;
$G_MAIN_MENU = '';
$G_SUB_MENU = '';
//$G_PUBLISH = new Publisher;
//remove the login.js script
global $oHeadPublisher;
if ( count ( $G_PUBLISH->Parts ) == 1 )
array_shift ( $G_PUBLISH->Parts );
$leimnudInitString = $oHeadPublisher->leimnudInitString;
//restart the oHeadPublisher
$oHeadPublisher->clearScripts();
//add the missing components, and go on.
$oHeadPublisher->leimnudInitString = $leimnudInitString;
$oHeadPublisher->addScriptFile("/js/maborak/core/maborak.js");
$G_PUBLISH->AddContent('xmlform', 'xmlform', 'login/showMessage', null, $aMessage );
G::LoadSkin( 'green' );
die;
}
}
function skinEngine($strSkin){
$file = G::ExpandPath( "skinEngine" ) . "skinEngine.php";
require_once( $file );
}
2010-12-02 23:34:41 +00:00
/**
* Load a skin
*
* @author Fernando Ontiveros Lira <fernando@colosa.com>
* @access public
* @param string $strSkinName
* @return void
*/
function LoadSkin( $strSkinName )
{
//print $strSkinName;
//now, we are using the skin, a skin is a file in engine/skin directory
$file = G::ExpandPath( "skins" ) . $strSkinName. ".php";
//G::pr($file);
2010-12-02 23:34:41 +00:00
if (file_exists ($file) ) {
require_once( $file );
return;
}
else {
if (file_exists ( PATH_HTML . 'errors/error703.php') ) {
header ( 'location: /errors/error703.php' );
die;
}
else {
$text = "The Skin $file does not exist, please review the Skin Definition";
2010-12-02 23:34:41 +00:00
throw ( new Exception ( $text) );
}
}
}
/**
* Include javascript files
*
* @author Fernando Ontiveros Lira <fernando@colosa.com>
* @access public
* @param string $strInclude
* @return void
*/
function LoadInclude( $strInclude )
{
$incfile = G::ExpandPath( "includes" ) . 'inc.' . $strInclude . '.php';
if ( !file_exists( $incfile )) {
$incfile = PATH_GULLIVER_HOME . 'includes' . PATH_SEP . 'inc.' . $strInclude . '.php';
}
if ( file_exists( $incfile )) {
require_once( $incfile );
return true;
}
else {
return false;
}
}
/**
* Include all model files
*
* @author Fernando Ontiveros Lira <fernando@colosa.com>
* @access public
* @param string $strInclude
* @return void
*/
function LoadAllModelClasses( )
{
$baseDir = PATH_CORE . 'classes' . PATH_SEP . 'model';
if ($handle = opendir( $baseDir )) {
while ( false !== ($file = readdir($handle))) {
if ( strpos($file, '.php',1) && !strpos($file, 'Peer.php',1) ) {
require_once ( $baseDir . PATH_SEP . $file );
}
}
}
}
/**
* Include all model plugin files
*
2010-12-22 14:21:52 +00:00
* LoadAllPluginModelClasses
2010-12-02 23:34:41 +00:00
* @author Hugo Loza <hugo@colosa.com>
* @access public
* @return void
*/
function LoadAllPluginModelClasses(){
//Get the current Include path, where the plugins directories should be
if ( !defined('PATH_SEPARATOR') ) {
define('PATH_SEPARATOR', ( substr(PHP_OS, 0, 3) == 'WIN' ) ? ';' : ':');
}
$path=explode(PATH_SEPARATOR,get_include_path());
foreach($path as $possiblePath){
if(strstr($possiblePath,"plugins")){
$baseDir = $possiblePath . 'classes' . PATH_SEP . 'model';
if(file_exists($baseDir)){
if ($handle = opendir( $baseDir )) {
while ( false !== ($file = readdir($handle))) {
if ( strpos($file, '.php',1) && !strpos($file, 'Peer.php',1) ) {
require_once ( $baseDir . PATH_SEP . $file );
}
}
}
//Include also the extendGulliverClass that could have some new definitions for fields
if(file_exists($possiblePath . 'classes' . PATH_SEP.'class.extendGulliver.php')){
include_once $possiblePath . 'classes' . PATH_SEP.'class.extendGulliver.php';
}
}
}
}
}
/**
* Load a template
*
* @author Fernando Ontiveros Lira <fernando@colosa.com>
* @access public
* @param string $strTemplateName
* @return void
*/
function LoadTemplate( $strTemplateName )
{
if ( $strTemplateName == '' ) return;
$temp = $strTemplateName . ".php";
$file = G::ExpandPath( 'templates' ) . $temp;
// Check if its a user template
if ( file_exists($file) ) {
//require_once( $file );
include( $file );
} else {
// Try to get the global system template
$file = PATH_TEMPLATE . PATH_SEP . $temp;
//require_once( $file );
if ( file_exists($file) )
include( $file );
}
}
/**
* Function LoadClassRBAC
* @author David S. Callizaya S. <davidsantos@colosa.com>
* @access public
* @parameter string strClass
* @return string
*/
function LoadClassRBAC( $strClass )
{
$classfile = PATH_RBAC . "class.$strClass" . '.php';
require_once( $classfile );
}
/**
2010-12-22 14:21:52 +00:00
* If the class is not defined by the aplication, it
2010-12-02 23:34:41 +00:00
* attempt to load the class from gulliver.system
*
* @author Fernando Ontiveros Lira <fernando@colosa.com>, David S. Callizaya
* @access public
* @param string $strClass
* @return void
*/
function LoadClass( $strClass )
{
$classfile = G::ExpandPath( "classes" ) . 'class.' . $strClass . '.php';
if (!file_exists( $classfile )) {
if (file_exists( PATH_GULLIVER . 'class.' . $strClass . '.php' ))
return require_once( PATH_GULLIVER . 'class.' . $strClass . '.php' );
else
return false;
} else {
return require_once( $classfile );
}
}
/**
* Loads a Class. If the class is not defined by the aplication, it
* attempt to load the class from gulliver.system
*
* @author Fernando Ontiveros Lira <fernando@colosa.com>, David S. Callizaya
* @access public
* @param string $strClass
* @return void
*/
function LoadThirdParty( $sPath , $sFile )
{
$classfile = PATH_THIRDPARTY . $sPath .'/'. $sFile .
( (substr($sFile,0,-4)!=='.php')? '.php': '' );
return require_once( $classfile );
}
/**
* Encrypt URL
*
* @author Fernando Ontiveros Lira <fernando@colosa.com>
* @access public
* @param string $urlLink
* @return string
*/
function encryptlink($url)
{
if ( defined ( 'ENABLE_ENCRYPT' ) && ENABLE_ENCRYPT == 'yes' )
return urlencode( G::encrypt( $url ,URL_KEY ) );
else
return $url;
}
/**
* Parsing the URI
*
* @author Fernando Ontiveros Lira <fernando@colosa.com>
* @access public
* @param string $urlLink
* @return string
*/
function parseURI( $uri )
{
$aRequestUri = explode('/', $uri );
if ( substr ( $aRequestUri[1], 0, 3 ) == 'sys' ) {
define( 'SYS_TEMP', substr ( $aRequestUri[1], 3 ) );
}
else {
define("ENABLE_ENCRYPT", 'yes' );
define( 'SYS_TEMP', $aRequestUri[1] );
$plain = '/sys' . SYS_TEMP;
for ($i = 2 ; $i < count($aRequestUri); $i++ ) {
$decoded = G::decrypt ( urldecode($aRequestUri[$i]) , URL_KEY );
if ( $decoded == 'sWì' ) $decoded = $VARS[$i]; //this is for the string "../"
$plain .= '/' . $decoded;
}
$_SERVER["REQUEST_URI"] = $plain;
}
$CURRENT_PAGE = $_SERVER["REQUEST_URI"];
$work = explode('?', $CURRENT_PAGE);
if ( count($work) > 1 )
define( 'SYS_CURRENT_PARMS', $work[1]);
else
define( 'SYS_CURRENT_PARMS', '');
define( 'SYS_CURRENT_URI' , $work[0]);
if (!defined('SYS_CURRENT_PARMS'))
define('SYS_CURRENT_PARMS', $work[1]);
$preArray = explode('&', SYS_CURRENT_PARMS);
$buffer = explode( '.', $work[0] );
if ( count($buffer) == 1 ) $buffer[1]='';
//request type
define('REQUEST_TYPE', ($buffer[1] != "" ?$buffer[1] : 'html'));
$toparse = substr($buffer[0], 1, strlen($buffer[0]) - 1);
$URL = "";
$URI_VARS = explode('/', $toparse);
for ( $i=3; $i < count( $URI_VARS) ; $i++)
$URL .= $URI_VARS[$i].'/';
$URI_VARS = explode('/', $toparse);
unset($work);
unset($buffer);
unset($toparse);
array_shift($URI_VARS);
define("SYS_LANG", array_shift($URI_VARS));
define("SYS_SKIN", array_shift($URI_VARS));
$SYS_COLLECTION = array_shift($URI_VARS);
$SYS_TARGET = array_shift($URI_VARS);
//to enable more than 2 directories...in the methods structure
$exit = 0;
while ( count ( $URI_VARS ) > 0 && $exit == 0) {
$SYS_TARGET .= '/' . array_shift($URI_VARS);
}
define('SYS_COLLECTION', $SYS_COLLECTION );
define('SYS_TARGET', $SYS_TARGET );
if ( $SYS_COLLECTION == 'js2' ) {
print "ERROR"; die;
}
}
/**
* streaming a big JS file with small js files
*
* @author Fernando Ontiveros Lira <fernando@colosa.com>
* @access public
* @param string $file
* @return string
*/
function streamCSSBigFile( $filename )
{
header('Content-Type: text/css');
//First get Skin info
$filenameParts=explode("-",$filename);
$skinName=$filenameParts[0];
$skinVariant="skin";
if(isset($filenameParts[1])){
$skinVariant=strtolower($filenameParts[1]);
}
if($skinName == "jscolors") $skinName = "classic";
if($skinName == "xmlcolors") $skinName = "classic";
if($skinName=="classic"){
$configurationFile = G::ExpandPath( "skinEngine" ).'base'.PATH_SEP.'config.xml';
}else{
$configurationFile=PATH_CUSTOM_SKINS.$skinName.PATH_SEP.'config.xml';
}
//Read Configuration File
$xmlConfiguration = file_get_contents ( $configurationFile );
$xmlConfigurationObj=G::xmlParser($xmlConfiguration);
$baseSkinDirectory=dirname($configurationFile);
$directorySize=G::getDirectorySize($baseSkinDirectory);
$mtime=$directorySize['maxmtime'];
//if userAgent (BROWSER) is MSIE we need special headers to avoid MSIE behaivor.
//$userAgent = strtolower($_SERVER['HTTP_USER_AGENT']);
$gmt_mtime = gmdate("D, d M Y H:i:s", $mtime ) . " GMT";
header('Pragma: cache');
header('ETag: "' . md5 ($mtime . $filename ) . '"' );
header("Last-Modified: " . $gmt_mtime );
header('Cache-Control: public');
header("Expires: " . gmdate("D, d M Y H:i:s", time () + 30*60*60*24 ) . " GMT"); //1 month
//header("Expires: " . gmdate("D, d M Y H:i:s", time () + 60*60*24 ) . " GMT"); //1 day - tempor
if( isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ) {
if ($_SERVER['HTTP_IF_MODIFIED_SINCE'] == $gmt_mtime) {
header('HTTP/1.1 304 Not Modified');
exit();
}
}
if ( isset($_SERVER['HTTP_IF_NONE_MATCH'])) {
if ( str_replace('"', '', stripslashes($_SERVER['HTTP_IF_NONE_MATCH'])) == md5( $mtime . $filename)) {
header("HTTP/1.1 304 Not Modified");
exit();
}
}
$outputHeader = "/* Autogenerated CSS file by gulliver framework \n";
$outputHeader .=" Skin: $filename\n";
$outputHeader .=" Configuration: $configurationFile\n";
$mtimeNow = date('U');
$gmt_mtimeNow = gmdate("D, d M Y H:i:s", $mtimeNow ) . " GMT";
$outputHeader .=" Date: $gmt_mtimeNow*/\n";
$output ="";
//Base files
switch(strtolower($skinVariant)){
case "extjs":
//Base
$baseCSSPath=PATH_SKIN_ENGINE."base". PATH_SEP."baseCss". PATH_SEP;
$output .= file_get_contents ( $baseCSSPath . 'ext-all-notheme.css' );
//$output .= file_get_contents ( $publicExtPath . 'ext-all.css' );
//Classic Skin
$extJsSkin = 'xtheme-gray';
/*$publicExtPath = PATH_SKIN_ENGINE."base". PATH_SEP."css". PATH_SEP;
$output .= file_get_contents ( $publicExtPath . $extJsSkin . '.css' );
$output .= file_get_contents ( $publicExtPath . 'pmos-' . $extJsSkin . '.css' );
*/
//adding the extend css for extjs-pmos
//TODO: move this files to pmos-xthem..
//$cssThemeExtensions = glob(PATH_TPL . "*/css/extjs-extend/{$extJsSkin}.css");
//foreach($cssThemeExtensions as $cssThemeExtensionFile)
//$helper->addFile($cssThemeExtensionFile);
//$output .= file_get_contents ( $cssThemeExtensionFile );
// $classicCSSPath=PATH_SKIN_ENGINE."base". PATH_SEP."css". PATH_SEP;
// $output .= file_get_contents ( $classicCSSPath . 'sprite.css' );
//$output .= file_get_contents ( $classicCSSPath . 'sprite_ie.css' );
break;
default:
break;
}
//Get Browser Info
$infoBrowser=G::browser_detection( 'full_assoc');
$browserName=$infoBrowser['browser_working'];
if(isset($infoBrowser[$browserName.'_data'])){
if($infoBrowser[$browserName.'_data'][0]!=""){
$browserName=$infoBrowser[$browserName.'_data'][0];
}
}
//print "<h1>$browserName</h1>";
//G::pr($infoBrowser);
//Read Configuration File
$xmlConfiguration = file_get_contents ( $configurationFile );
$xmlConfigurationObj=G::xmlParser($xmlConfiguration);
//G::pr($xmlConfigurationObj->result['skinConfiguration']['__CONTENT__']['cssFiles']['__CONTENT__'][$tempSkin]['__CONTENT__'] );
$skinFilesArray=$xmlConfigurationObj->result['skinConfiguration']['__CONTENT__']['cssFiles']['__CONTENT__'][$skinVariant]['__CONTENT__']['cssFile'] ;
//G::pr($skinFilesArray);
foreach($skinFilesArray as $keyFile => $cssFileInfo){
//G::pr($cssFileInfo);
//TODO: Also review browser versions for restrictions
$enabledBrowsers=explode(",",$cssFileInfo['__ATTRIBUTES__']['enabledBrowsers']);
$disabledBrowsers=explode(",",$cssFileInfo['__ATTRIBUTES__']['disabledBrowsers']);
if(((in_array($browserName, $enabledBrowsers))||(in_array('ALL', $enabledBrowsers)))&&(!(in_array($browserName, $disabledBrowsers)))){
//G::pr($cssFileInfo['__ATTRIBUTES__']['file']);
$output .= file_get_contents ( $baseSkinDirectory . PATH_SEP.'css'.PATH_SEP.$cssFileInfo['__ATTRIBUTES__']['file'] );
}
}
//Remove comments..
$regex = array(
"`^([\t\s]+)`ism"=>'',
"`^\/\*(.+?)\*\/`ism"=>"",
"`([\n\A;]+)\/\*(.+?)\*\/`ism"=>"$1",
"`([\n\A;\s]+)//(.+?)[\n\r]`ism"=>"$1\n",
"`(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+`ism"=>"\n"
);
$output = preg_replace(array_keys($regex),$regex,$output);
$output = $outputHeader.$output;
return $output;
}
/**
* streaming a big JS file with small js files
*
* @author Fernando Ontiveros Lira <fernando@colosa.com>
* @access public
* @param string $file
* @param boolean $download
* @param string $downloadFileName
* @return string
*/
function streamJSTranslationFile( $filename, $locale = 'en' )
{
header('Content-Type: text/javascript');
//if userAgent (BROWSER) is MSIE we need special headers to avoid MSIE behaivor.
$userAgent = strtolower($_SERVER['HTTP_USER_AGENT']);
if ( file_exists($filename) )
$mtime = filemtime($filename);
else
$mtime = date('U');
$gmt_mtime = gmdate("D, d M Y H:i:s", $mtime ) . " GMT";
header('Pragma: cache');
header('ETag: "' . md5 ($mtime . $filename ) . '"' );
header("Last-Modified: " . $gmt_mtime );
header('Cache-Control: public');
header("Expires: " . gmdate("D, d M Y H:i:s", time () + 30*60*60*24 ) . " GMT"); //1 month
if( isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ) {
if ($_SERVER['HTTP_IF_MODIFIED_SINCE'] == $gmt_mtime) {
header('HTTP/1.1 304 Not Modified');
exit();
}
}
if ( isset($_SERVER['HTTP_IF_NONE_MATCH'])) {
if ( str_replace('"', '', stripslashes($_SERVER['HTTP_IF_NONE_MATCH'])) == md5( $mtime . $filename)) {
header("HTTP/1.1 304 Not Modified");
exit();
}
}
$output = '';
G::LoadTranslationObject($locale);
global $translation;
$output .= JSMin::minify ( 'var TRANSLATIONS = ' . G::json_encode($translation) . ';' );
return $output;
}
2010-12-02 23:34:41 +00:00
/**
* streaming a file
*
* @author Fernando Ontiveros Lira <fernando@colosa.com>
* @access public
* @param string $file
* @param boolean $download
* @param string $downloadFileName
* @return string
*/
function streamFile( $file, $download = false, $downloadFileName = '' )
{
2011-02-22 16:41:39 +00:00
require_once (PATH_THIRDPARTY . 'jsmin/jsmin.php');
$folderarray = explode ( '/', $file );
2011-02-25 14:42:31 +00:00
$typearray = explode ( '.', basename( $file) );
2010-12-02 23:34:41 +00:00
$typefile = $typearray[ count($typearray) -1 ];
$filename = $file;
2011-02-23 00:09:55 +00:00
//trick to generate the translation.language.js file , merging two files and then minified the content.
2011-02-25 14:42:31 +00:00
if ( strtolower ($typefile ) == 'js' && $typearray[0] == 'translation' ) {
$output = G::streamJSTranslationFile ($filename, $typearray[1]);
print $output;
return;
}
2011-02-23 15:02:57 +00:00
//trick to generate the big css file for ext style .
if ( strtolower ($typefile ) == 'css' && $folderarray[count($folderarray)-2] == 'css' ) {
$output = G::streamCSSBigFile( $typearray[0] );
2011-02-23 00:09:55 +00:00
print $output;
return;
}
2010-12-02 23:34:41 +00:00
if ( file_exists ( $filename ) ) {
switch ( strtolower ($typefile ) ) {
case 'swf' :
G::sendHeaders ( $filename , 'application/x-shockwave-flash', $download, $downloadFileName ); break;
case 'js' :
G::sendHeaders ( $filename , 'text/javascript', $download, $downloadFileName ); break;
case 'htm' :
case 'html' :
G::sendHeaders ( $filename , 'text/html', $download, $downloadFileName ); break;
case 'htc' :
G::sendHeaders ( $filename , 'text/plain', $download, $downloadFileName ); break;
case 'json' :
G::sendHeaders ( $filename , 'text/plain', $download, $downloadFileName ); break;
case 'gif' :
G::sendHeaders ( $filename , 'image/gif', $download, $downloadFileName ); break;
case 'png' :
G::sendHeaders ( $filename , 'image/png', $download, $downloadFileName ); break;
case 'jpg' :
G::sendHeaders ( $filename , 'image/jpg', $download, $downloadFileName ); break;
case 'css' :
G::sendHeaders ( $filename , 'text/css', $download, $downloadFileName ); break;
case 'css' :
G::sendHeaders ( $filename , 'text/css', $download, $downloadFileName ); break;
case 'xml' :
G::sendHeaders ( $filename , 'text/xml', $download, $downloadFileName ); break;
case 'txt' :
G::sendHeaders ( $filename , 'text/html', $download, $downloadFileName ); break;
case 'doc' :
case 'pdf' :
case 'pm' :
case 'po' :
G::sendHeaders ( $filename , 'application/octet-stream', $download, $downloadFileName ); break;
case 'php' :
if ($download) {
G::sendHeaders ( $filename , 'text/plain', $download, $downloadFileName );
}
else {
require_once( $filename );
return;
}
break;
default :
//throw new Exception ( "Unknown type of file '$file'. " );
G::sendHeaders ( $filename , 'application/octet-stream', $download, $downloadFileName ); break;
break;
}
}
else {
if( strpos($file, 'gulliver') !== false ){
list($path, $filename) = explode('gulliver', $file);
}
$_SESSION['phpFileNotFound'] = $file;
G::header("location: /errors/error404.php?l=".$_SERVER['REQUEST_URI']);
2010-12-02 23:34:41 +00:00
}
switch ( strtolower($typefile ) ) {
case "js" :
$paths = explode ( '/', $filename);
$jsName = $paths[ count ($paths) -1 ];
$output = '';
switch ( $jsName ) {
2011-02-22 16:41:39 +00:00
case 'draw2d.js' :
$pathJs = PATH_GULLIVER_HOME . PATH_SEP . 'js' . PATH_SEP;
$output .= JSMin::minify ( file_get_contents ( $pathJs . 'ext/wz_jsgraphics.js' ) );
$output .= JSMin::minify ( file_get_contents ( $pathJs . 'ext/mootools.js' ) );
$output .= JSMin::minify ( file_get_contents ( $pathJs . 'ext/moocanvas.js' ) );
$output .= JSMin::minify ( file_get_contents ( $pathJs . 'ext/draw2d.js' ) );
$output .= JSMin::minify ( file_get_contents ( $pathJs . 'ext/pmos-common.js' ) );
2011-02-22 16:41:39 +00:00
break;
case 'ext-all.js' :
$pathJs = PATH_GULLIVER_HOME . PATH_SEP . 'js' . PATH_SEP;
$output .= JSMin::minify ( file_get_contents ( $pathJs . 'ext/ext-all.js' ) );
$output .= JSMin::minify ( file_get_contents ( $pathJs . 'ext/ux/ux-all.js' ) );
2011-02-23 00:09:55 +00:00
$output .= JSMin::minify ( file_get_contents ( $pathJs . 'ext/ux/miframe.js' ) );
$output .= JSMin::minify ( file_get_contents ( $pathJs . 'ext/ux.locationbar/Ext.ux.LocationBar.js' ) );
$output .= JSMin::minify ( file_get_contents ( $pathJs . 'ext/ux.statusbar/ext-statusbar.js' ) );
$output .= JSMin::minify ( file_get_contents ( $pathJs . 'ext/ux.treefilterx/Ext.ux.tree.TreeFilterX.js' ) );
2011-02-23 00:09:55 +00:00
$output .= JSMin::minify ( file_get_contents ( $pathJs . 'ext/ux.treefilterx/Ext.ux.tree.TreeFilterX.js' ) );
break;
2010-12-02 23:34:41 +00:00
case 'maborak.js' :
$oHeadPublisher =& headPublisher::getSingleton();
foreach ( $oHeadPublisher->maborakFiles as $fileJS ) {
2011-02-22 16:41:39 +00:00
//$output .= JSMin::minify ( file_get_contents ( $fileJS ) );
2010-12-02 23:34:41 +00:00
$output .= G::trimSourceCodeFile ($fileJS );
}
break;
case 'maborak.loader.js':
$oHeadPublisher =& headPublisher::getSingleton();
foreach ( $oHeadPublisher->maborakLoaderFiles as $fileJS ) {
2011-02-22 16:41:39 +00:00
$output .= JSMin::minify ( file_get_contents ( $fileJS ) );
//$output .= G::trimSourceCodeFile ($fileJS );
2010-12-02 23:34:41 +00:00
}
break;
default :
$output = file_get_contents ( $filename ) ;
//$output = JSMin::minify ( file_get_contents ( $filename ) );
2011-02-22 16:41:39 +00:00
//$output = G::trimSourceCodeFile ($filename );
2010-12-02 23:34:41 +00:00
}
print $output;
break;
case 'css' :
2011-02-22 16:41:39 +00:00
//$output = JSMin::minify ( file_get_contents ( $filename) );
2010-12-02 23:34:41 +00:00
print G::trimSourceCodeFile ($filename );
break;
default :
@readfile($filename);
2010-12-02 23:34:41 +00:00
}
}
/**
* trimSourceCodeFile
*
* @param string $filename
2010-12-02 23:34:41 +00:00
*
* @return string $output
*/
2010-12-02 23:34:41 +00:00
function trimSourceCodeFile ( $filename ) {
$handle = fopen ($filename, "r");
$lastChar = '';
$firstChar = '';
$content = '';
$line = '';
//no optimizing code
if ($handle) {
while (!feof($handle)) {
//$line = trim( fgets($handle, 16096) ) . "\n" ;
$line = fgets($handle, 16096);
$content .= $line;
}
fclose($handle);
}
return $content;
//end NO optimizing code
//begin optimizing code
/*
if ($handle) {
while (!feof($handle)) {
$lastChar = ( strlen ( $line ) > 5 ) ? $line[strlen($line)-1] : '';
$line = trim( fgets($handle, 16096) ) ;
if ( substr ($line,0,2 ) == '//' ) $line = '';
$firstChar = ( strlen ( $line ) > 6 ) ? strtolower($line[0]) : '';
if ( ord( $firstChar ) > 96 && ord($firstChar) < 122 && $lastChar == ';')
$content .= '';
else
$content .= "\n";
// $content .= '('.$firstChar . $lastChar . ord( $firstChar ).'-'. ord( $lastChar ) . ")\n";
$content .= $line;
}
fclose($handle);
}
*/
//end optimizing code
$index = 0;
$output = '';
while ( $index < strlen ($content) ) {
$car = $content[$index];
$index++;
if ( $car == '/' && isset($content[$index]) && $content[$index] == '*' ) {
$endComment = false;
$index ++;
while ( $endComment == false && $index < strlen ($content) ) {
if ($content[$index] == '*' && isset($content[$index+1]) && $content[$index+1] == '/' ) {
$endComment = true; $index ++;
}
$index ++;
}
$car = '';
}
$output .= $car;
}
return $output;
}
/**
2010-12-22 14:21:52 +00:00
* sendHeaders
2010-12-02 23:34:41 +00:00
*
* @param string $filename
2010-12-02 23:34:41 +00:00
* @param string $contentType default value ''
* @param boolean $download default value false
* @param string $downloadFileName default value ''
2010-12-02 23:34:41 +00:00
*
* @return void
*/
2010-12-02 23:34:41 +00:00
function sendHeaders ( $filename , $contentType = '', $download = false, $downloadFileName = '' )
{
if ($download) {
if ($downloadFileName == '') {
$aAux = explode('/', $filename);
$downloadFileName = $aAux[count($aAux) - 1];
}
header('Content-Disposition: attachment; filename="' . $downloadFileName . '"');
}
header('Content-Type: ' . $contentType);
//if userAgent (BROWSER) is MSIE we need special headers to avoid MSIE behaivor.
$userAgent = strtolower($_SERVER['HTTP_USER_AGENT']);
if ( preg_match("/msie/i", $userAgent)) {
//if ( ereg("msie", $userAgent)) {
header('Pragma: cache');
$mtime = filemtime($filename);
$gmt_mtime = gmdate("D, d M Y H:i:s", $mtime ) . " GMT";
header('ETag: "' . md5 ($mtime . $filename ) . '"' );
header("Last-Modified: " . $gmt_mtime );
header('Cache-Control: public');
header("Expires: " . gmdate("D, d M Y H:i:s", time () + 60*10 ) . " GMT"); //ten minutes
return;
}
if (!$download) {
header('Pragma: cache');
2011-02-23 00:09:55 +00:00
if ( file_exists($filename) )
$mtime = filemtime($filename);
else
$mtime = date('U');
2010-12-02 23:34:41 +00:00
$gmt_mtime = gmdate("D, d M Y H:i:s", $mtime ) . " GMT";
header('ETag: "' . md5 ($mtime . $filename ) . '"' );
header("Last-Modified: " . $gmt_mtime );
header('Cache-Control: public');
header("Expires: " . gmdate("D, d M Y H:i:s", time () + 90*60*60*24 ) . " GMT");
if( isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ) {
if ($_SERVER['HTTP_IF_MODIFIED_SINCE'] == $gmt_mtime) {
header('HTTP/1.1 304 Not Modified');
exit();
}
}
if (isset($_SERVER['HTTP_IF_NONE_MATCH'])) {
if ( str_replace('"', '', stripslashes($_SERVER['HTTP_IF_NONE_MATCH'])) == md5( $mtime . $filename)) {
header("HTTP/1.1 304 Not Modified");
exit();
}
}
}
}
/**
* Transform a public URL into a local path.
*
* @author David S. Callizaya S. <davidsantos@colosa.com>
* @access public
* @param string $url
* @param string $corvertionTable
* @param string $realPath = local path
* @return boolean
*/
function virtualURI( $url , $convertionTable , &$realPath )
{
foreach($convertionTable as $urlPattern => $localPath ) {
// $urlPattern = addcslashes( $urlPattern , '/');
$urlPattern = addcslashes( $urlPattern , './');
$urlPattern = '/^' . str_replace(
array('*','?'),
array('.*','.?'),
$urlPattern) . '$/';
if (preg_match($urlPattern , $url, $match)) {
if ($localPath === FALSE) {
$realPath = $url;
return false;
}
if ( $localPath != 'jsMethod' )
$realPath = $localPath . $match[1];
else
$realPath = $localPath;
return true;
}
}
$realPath = $url;
return false;
}
/**
* Create an encrypted unique identifier based on $id and the selected scope id.
*
* @author David S. Callizaya S. <davidsantos@colosa.com>
* @access public
* @param string $scope
* @param string $id
* @return string
*/
function createUID( $scope, $id )
{
$e = $scope . $id;
$e=G::encrypt( $e , URL_KEY );
$e=str_replace(array('+','/','='),array('__','_','___'),base64_encode($e));
return $e;
}
/**
* (Create an encrypted unique identificator based on $id and the selected scope id.) ^-1
2010-12-22 14:21:52 +00:00
* getUIDName
*
2010-12-02 23:34:41 +00:00
* @author David S. Callizaya S. <davidsantos@colosa.com>
* @access public
* @param string $id
* @param string $scope
* @return string
*/
function getUIDName( $uid , $scope = '' )
{
$e=str_replace(array('=','+','/'),array('___','__','_'),$uid);
$e=base64_decode($e);
$e=G::decrypt( $e , URL_KEY );
$e=substr( $e , strlen($scope) );
return $e;
}
/* formatNumber
*
* @author David Callizaya <calidavidx21@yahoo.com.ar>
* @param int/string $num
* @return string number
*/
function formatNumber($num, $language='latin')
{
switch($language)
{
default:
$snum=$num;
}
return $snum;
}
/* Returns a date formatted according to the given format string
* @author David Callizaya <calidavidx21@hotmail.com>
* @param string $format The format of the outputted date string
* @param string $datetime Date in the format YYYY-MM-DD HH:MM:SS
*/
function formatDate($datetime, $format='Y-m-d', $lang='')
{
if ($lang==='') $lang=defined(SYS_LANG)?SYS_LANG:'en';
$aux = explode (' ', $datetime); //para dividir la fecha del dia
$date = explode ('-', isset ( $aux[0] ) ? $aux[0] : '00-00-00' ); //para obtener los dias, el mes, y el año.
$time = explode (':', isset ( $aux[1] ) ? $aux[1] : '00:00:00' ); //para obtener las horas, minutos, segundos.
$date[0] = (int)((isset($date[0]))?$date[0]:'0');
$date[1] = (int)((isset($date[1]))?$date[1]:'0');
$date[2] = (int)((isset($date[2]))?$date[2]:'0');
$time[0] = (int)((isset($time[0]))?$time[0]:'0');
$time[1] = (int)((isset($time[1]))?$time[1]:'0');
$time[2] = (int)((isset($time[2]))?$time[2]:'0');
// Spanish months
$ARR_MONTHS['es'] = array ("Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre");
// English months
$ARR_MONTHS['en'] = array("January", "February", "March", "April", "May", "June","July", "August", "September", "October", "November", "December");
// Spanish days
$ARR_WEEKDAYS['es'] = array("Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado");
// English days
$ARR_WEEKDAYS['en'] = array("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday");
if ($lang=='fa')
$number='persian';
else
2010-12-02 23:34:41 +00:00
$number='latin';
$d = '0'.$date[2];$d=G::formatNumber(substr($d,strlen($d)-2,2),$number);
$j = G::formatNumber($date[2],$number);
$F = isset ( $ARR_MONTHS[$lang][$date[1]-1] ) ? $ARR_MONTHS[$lang][$date[1]-1] : '';
$m = '0'.$date[1];$m=G::formatNumber(substr($m,strlen($m)-2,2),$number);
$n = G::formatNumber($date[1],$number);
$y = G::formatNumber(substr($date[0],strlen($date[0])-2,2),$number);
$Y = '0000'.$date[0];$Y=G::formatNumber(substr($Y,strlen($Y)-4,4),$number);
$g = ($time[0] % 12);if ($g===0)$g=12;
$G = $time[0];
$h = '0'.$g;$h=G::formatNumber(substr($h,strlen($h)-2,2),$number);
$H = '0'.$G;$H=G::formatNumber(substr($H,strlen($H)-2,2),$number);
$i = '0'.$time[1];$i=G::formatNumber(substr($i,strlen($i)-2,2),$number);
$s = '0'.$time[2];$s=G::formatNumber(substr($s,strlen($s)-2,2),$number);
$names=array('d','j','F','m','n','y','Y','g','G','h','H','i','s');
$values=array($d, $j, $F, $m, $n, $y, $Y, $g, $G, $h, $H, $i, $s);
$_formatedDate = str_replace( $names, $values, $format );
return $_formatedDate;
}
/**
* getformatedDate
*
* @param date $date
* @param string $format default value 'yyyy-mm-dd',
2010-12-02 23:34:41 +00:00
* @param string $lang default value ''
*
* @return string $ret
*/
2010-12-02 23:34:41 +00:00
function getformatedDate($date, $format = 'yyyy-mm-dd', $lang = '')
{
/********************************************************************************************************
* if the year is 2008 and the format is yy then -> 08
* if the year is 2008 and the format is yyyy then -> 2008
*
* if the month is 05 and the format is mm then -> 05
* if the month is 05 and the format is m and the month is less than 10 then -> 5 else digit normal
* if the month is 05 and the format is MM or M then -> May
*
* if the day is 5 and the format is dd then -> 05
* if the day is 5 and the format is d and the day is less than 10 then -> 5 else digit normal
* if the day is 5 and the format is DD or D then -> five
*********************************************************************************************************/
//scape the literal
switch($lang) {
case 'es':
$format = str_replace(' de ', '[of]', $format);
break;
}
//first we must formatted the string
$format = str_replace('yyyy', '{YEAR}', $format);
$format = str_replace('yy', '{year}', $format);
$format = str_replace('mm', '{YONTH}', $format);
$format = str_replace('m', '{month}', $format);
$format = str_replace('M', '{XONTH}', $format);
$format = str_replace('dd', '{DAY}', $format);
$format = str_replace('d', '{day}', $format);
if ($lang==='') $lang=defined(SYS_LANG)?SYS_LANG:'en';
$aux = explode (' ', $date); //para dividir la fecha del dia
$date = explode ('-', isset ( $aux[0] ) ? $aux[0] : '00-00-00' ); //para obtener los dias, el mes, y el año.
$time = explode (':', isset ( $aux[1] ) ? $aux[1] : '00:00:00' ); //para obtener las horas, minutos, segundos.
$year = (int)((isset($date[0]))?$date[0]:'0'); //year
$month = (int)((isset($date[1]))?$date[1]:'0'); //month
$day = (int)((isset($date[2]))?$date[2]:'0'); //day
$time[0] = (int)((isset($time[0]))?$time[0]:'0'); //hour
$time[1] = (int)((isset($time[1]))?$time[1]:'0'); //minute
$time[2] = (int)((isset($time[2]))?$time[2]:'0'); //second
$MONTHS = Array();
for($i=1; $i<=12; $i++){
$MONTHS[$i] = G::LoadTranslation("ID_MONTH_$i", $lang);
}
$d = (int)$day;
$dd = G::complete_field($day, 2, 1);
//missing D
$M = $MONTHS[$month];
$m = (int)$month;
$mm = G::complete_field($month, 2, 1);
$yy = substr($year,strlen($year)-2,2);
$yyyy = $year;
$names = array('{day}', '{DAY}', '{month}', '{YONTH}', '{XONTH}', '{year}', '{YEAR}');
$values = array($d, $dd, $m, $mm, $M, $yy, $yyyy);
$ret = str_replace( $names, $values, $format );
//recovering the original literal
switch($lang){
case 'es':
$ret = str_replace('[of]', ' de ', $ret);
break;
}
return $ret;
}
/**
* By <erik@colosa.com>
* Here's a little wrapper for array_diff - I found myself needing
* to iterate through the edited array, and I didn't need to original keys for anything.
*/
function arrayDiff($array1, $array2) {
// This wrapper for array_diff rekeys the array returned
$valid_array = array_diff($array1,$array2);
// reinstantiate $array1 variable
$array1 = array();
// loop through the validated array and move elements to $array1
// this is necessary because the array_diff function returns arrays that retain their original keys
foreach ($valid_array as $valid){
$array1[] = $valid;
}
return $array1;
}
/**
* @author Erik Amaru Ortiz <erik@colosa.com>
* @name complete_field($string, $lenght, $type={1:number/2:string/3:float})
*/
function complete_field($campo, $long, $tipo)
{
$campo = trim($campo);
switch($tipo)
{
case 1: //number
$long = $long-strlen($campo);
for($i=1; $i<=$long; $i++) {
$campo = "0".$campo;
}
break;
case 2: //string
$long = $long-strlen($campo);
for($i=1; $i<=$long; $i++) {
$campo = " ".$campo;
}
break;
case 3: //float
if($campo!="0") {
$vals = explode(".",$long);
$ints = $vals[0];
$decs = $vals[1];
$valscampo = explode(".",$campo);
$intscampo = $valscampo[0];
$decscampo = $valscampo[1];
$ints = $ints - strlen($intscampo);
for($i=1; $i<=$ints; $i++) {
$intscampo = "0".$intscampo;
}
//los decimales pueden ser 0 uno o dos
$decs = $decs - strlen($decscampo);
for($i=1; $i<=$decs; $i++) {
$decscampo = $decscampo."0";
}
$campo = $intscampo.".".$decscampo;
} else {
$vals = explode(".",$long);
$ints = $vals[0];
$decs = $vals[1];
$campo = "";
for($i=1; $i<=$ints; $i++) {
$campo = "0".$campo;
}
$campod = "";
for($i=1; $i<=$decs; $i++) {
$campod = "0".$campod;
}
$campo = $campo.".".$campod;
}
break;
}
return $campo;
}
/* Escapes special characters in a string for use in a SQL statement
* @author David Callizaya <calidavidx21@hotmail.com>
* @param string $sqlString The string to be escaped
* @param string $DBEngine Target DBMS
*/
function sqlEscape( $sqlString, $DBEngine = DB_ADAPTER )
2010-12-02 23:34:41 +00:00
{
$DBEngine = DB_ADAPTER;
2010-12-02 23:34:41 +00:00
switch($DBEngine){
case 'mysql':
$con = Propel::getConnection('workflow') ;
return mysql_real_escape_string(stripslashes($sqlString), $con->getResource() );
case 'myxml':
$sqlString = str_replace('"', '""', $sqlString);
return str_replace("'", "''", $sqlString);
//return str_replace(array('"',"'"),array('""',"''"),stripslashes($sqlString));
default:
return addslashes(stripslashes($sqlString));
}
}
/**
* Function MySQLSintaxis
* @access public
* @return Boolean
**/
function MySQLSintaxis()
{
$DBEngine = DB_ADAPTER;
switch($DBEngine){
case 'mysql' :
return TRUE;
break;
case 'mssql' :
default:
return FALSE;
break;
}
}
2010-12-02 23:34:41 +00:00
/* Returns a sql string with @@parameters replaced with its values defined
* in array $result using the next notation:
* NOTATION:
* @@ Quoted parameter acording to the SYSTEM's Database
* @Q Double quoted parameter \\ \"
* @q Single quoted parameter \\ \'
* @% URL string
* @# Non-quoted parameter
* @! Evaluate string : Replace the parameters in value and then in the sql string
* @fn() Evaluate string with the function "fn"
* @author David Callizaya <calidavidx21@hotmail.com>
*/
function replaceDataField( $sqlString, $result, $DBEngine = 'mysql' )
{
if (!is_array($result)) {
$result = array();
}
$result = $result + G::getSystemConstants();
$__textoEval = "";
$u = 0;
//$count=preg_match_all('/\@(?:([\@\%\#\!Qq])([a-zA-Z\_]\w*)|([a-zA-Z\_][\w\-\>\:]*)\(((?:[^\\\\\)]*(?:[\\\\][\w\W])?)*)\))/',$sqlString,$match,PREG_PATTERN_ORDER | PREG_OFFSET_CAPTURE);
$count = preg_match_all('/\@(?:([\@\%\#\!Qq])([a-zA-Z\_]\w*)|([a-zA-Z\_][\w\-\>\:]*)\(((?:[^\\\\\)]*?)*)\))/',$sqlString,$match,PREG_PATTERN_ORDER | PREG_OFFSET_CAPTURE);
if ($count) {
for($r=0;$r<$count;$r++) {
if (!isset($result[$match[2][$r][0]]))
2010-12-02 23:34:41 +00:00
$result[$match[2][$r][0]] = '';
if (!is_array($result[$match[2][$r][0]])) {
$__textoEval.=substr($sqlString,$u,$match[0][$r][1]-$u);
$u = $match[0][$r][1]+strlen($match[0][$r][0]);
//Mysql quotes scape
if (($match[1][$r][0]=='@')&&(isset($result[$match[2][$r][0]]))) {
$__textoEval.="\"". G::sqlEscape($result[$match[2][$r][0]],$DBEngine) ."\"";continue;
}
//URL encode
if (($match[1][$r][0]=='%')&&(isset($result[$match[2][$r][0]]))) {
$__textoEval.=urlencode($result[$match[2][$r][0]]);continue;
}
//Double quoted parameter
if (($match[1][$r][0]=='Q')&&(isset($result[$match[2][$r][0]]))) {
$__textoEval.='"'.addcslashes($result[$match[2][$r][0]],'\\"').'"';continue;
}
//Single quoted parameter
if (($match[1][$r][0]=='q')&&(isset($result[$match[2][$r][0]]))) {
$__textoEval.="'".addcslashes($result[$match[2][$r][0]],'\\\'')."'";continue;
}
//Substring (Sub replaceDataField)
if (($match[1][$r][0]=='!')&&(isset($result[$match[2][$r][0]]))) {
$__textoEval.=G::replaceDataField($result[$match[2][$r][0]],$result);continue;
}
//Call function
if (($match[1][$r][0]==='')&&($match[2][$r][0]==='')&&($match[3][$r][0]!=='')) {
eval('$__textoEval.='.$match[3][$r][0].'(\''.addcslashes(G::replaceDataField(stripslashes($match[4][$r][0]),$result),'\\\'').'\');');continue;
}
//Non-quoted
if (($match[1][$r][0]=='#')&&(isset($result[$match[2][$r][0]]))) {
$__textoEval.=G::replaceDataField($result[$match[2][$r][0]],$result);continue;
}
}
}
}
$__textoEval.=substr($sqlString,$u);
return $__textoEval;
}
/* Load strings from a XMLFile.
* @author David Callizaya <davidsantos@colosa.com>
* @parameter $languageFile An xml language file.
* @parameter $languageId (es|en|...).
* @parameter $forceParse Force to read and parse the xml file.
*/
function loadLanguageFile ( $filename , $languageId = '', $forceParse = false )
{
global $arrayXmlMessages;
if ($languageId==='') $languageId = defined('SYS_LANG') ? SYS_LANG : 'en';
$languageFile = basename( $filename , '.xml' );
$cacheFile = substr( $filename , 0 ,-3 ) . $languageId;
if (($forceParse) || (!file_exists($cacheFile)) ||
( filemtime($filename) > filemtime($cacheFile))
//|| ( filemtime(__FILE__) > filemtime($cacheFile))
) {
$languageDocument = new Xml_document();
$languageDocument->parseXmlFile( $filename );
if (!is_array($arrayXmlMessages)) $arrayXmlMessages = array();
$arrayXmlMessages[ $languageFile ] = array();
for($r=0 ; $r < sizeof($languageDocument->children[0]->children) ; $r++ ) {
$n = $languageDocument->children[0]->children[$r]->findNode($languageId);
if ($n) {
$k = $languageDocument->children[0]->children[$r]->name;
$arrayXmlMessages[ $languageFile ][ $k ] = $n->value;
}
}
$f = fopen( $cacheFile , 'w');
2011-01-06 11:11:53 +00:00
fwrite( $f , "<?php\n" );
2010-12-02 23:34:41 +00:00
fwrite( $f , '$arrayXmlMessages[\'' . $languageFile . '\']=' . 'unserialize(\'' .
addcslashes( serialize ( $arrayXmlMessages[ $languageFile ] ), '\\\'' ) .
"');\n");
fwrite( $f , "?>" );
fclose( $f );
} else {
require( $cacheFile );
}
}
/* Funcion auxiliar Temporal:
* Registra en la base de datos los labels xml usados en el sistema
* @author David Callizaya <calidavidx21@hotmail.com>
*/
function registerLabel( $id , $label )
{
return 1;
$dbc = new DBConnection();
$ses = new DBSession($dbc);
$ses->Execute(G::replaceDataField(
'REPLACE INTO `TRANSLATION` (`TRN_CATEGORY`, `TRN_ID`, `TRN_LANG`, `TRN_VALUE`) VALUES
("LABEL", @@ID, "'.SYS_LANG.'", @@LABEL);',array('ID'=>$id,'LABEL'=>($label !== null ? $label : ''))));
}
/**
* Function LoadMenuXml
* @author David S. Callizaya S. <davidsantos@colosa.com>
* @access public
* @parameter string msgID
* @return string
*/
function LoadMenuXml( $msgID )
{
global $arrayXmlMessages;
if (!isset($arrayXmlMessages['menus']))
G::loadLanguageFile( G::ExpandPath('content') . 'languages/menus.xml' );
G::registerLabel($msgID,$arrayXmlMessages['menus'][$msgID]);
return $arrayXmlMessages['menus'][$msgID];
}
/**
* Function SendMessageXml
* @author David S. Callizaya S. <davidsantos@colosa.com>
* @access public
* @parameter string msgID
* @parameter string strType
* @parameter string file
* @return string
*/
function SendMessageXml( $msgID, $strType , $file="labels")
{
global $arrayXmlMessages;
if (!isset($arrayXmlMessages[$file]))
G::loadLanguageFile( G::ExpandPath('content') . 'languages/' . $file . '.xml' );
$_SESSION['G_MESSAGE_TYPE'] = $strType;
G::registerLabel($msgID,$arrayXmlMessages[$file][$msgID]);
$_SESSION['G_MESSAGE'] = nl2br ($arrayXmlMessages[$file][$msgID]);
}
/**
* SendTemporalMessage
*
* @param string $msgID
2010-12-02 23:34:41 +00:00
* @param string $strType
* @param string $sType default value 'LABEL'
* @param date $time default value null
* @param integer $width default value null
* @param string $customLabels default value null
*
* @return void
*/
2010-12-02 23:34:41 +00:00
function SendTemporalMessage($msgID, $strType, $sType='LABEL', $time=null, $width=null, $customLabels= null)
{
if( isset($width) ){
$_SESSION['G_MESSAGE_WIDTH'] = $width;
}
if( isset($time) ){
$_SESSION['G_MESSAGE_TIME'] = $time;
}
switch(strtolower($sType)){
case 'label':
case 'labels':
$_SESSION['G_MESSAGE_TYPE'] = $strType;
$_SESSION['G_MESSAGE'] = nl2br(G::LoadTranslation($msgID));
break;
case 'string':
$_SESSION['G_MESSAGE_TYPE'] = $strType;
$_SESSION['G_MESSAGE'] = nl2br($msgID);
break;
}
if ( $customLabels != null ) {
$message = $_SESSION['G_MESSAGE'];
foreach ( $customLabels as $key=>$val ) {
$message = str_replace ( '{' . nl2br($key) . '}' , nl2br($val), $message );
}
$_SESSION['G_MESSAGE'] = $message;
}
}
/**
* SendMessage
*
* @param string $msgID
* @param string $strType
2010-12-02 23:34:41 +00:00
* @param string $file default value "labels"
*
* @return void
*/
2010-12-02 23:34:41 +00:00
function SendMessage( $msgID, $strType , $file="labels")
{
global $arrayXmlMessages;
$_SESSION['G_MESSAGE_TYPE'] = $strType;
$_SESSION['G_MESSAGE'] = nl2br (G::LoadTranslation($msgID));
}
/**
* SendMessageText
* Just put the $text in the message text
2010-12-02 23:34:41 +00:00
*
* @param string $text
* @param string $strType
*
* @return void
*/
2010-12-02 23:34:41 +00:00
function SendMessageText( $text, $strType)
{
global $arrayXmlMessages;
$_SESSION['G_MESSAGE_TYPE'] = $strType;
$_SESSION['G_MESSAGE'] = nl2br ( $text );
}
/**
* Render message from XML file
*
2010-12-02 23:34:41 +00:00
* @author Fernando Ontiveros Lira <fernando@colosa.com>
* @access public
* @param string $msgID
* @return void
*/
function LoadMessage( $msgID, $file = "messages" )
2010-12-02 23:34:41 +00:00
{
global $_SESSION;
global $arrayXmlMessages;
if ( !is_array ($arrayXmlMessages) )
$arrayXmlMessages = G::LoadArrayFile( G::ExpandPath( 'content' ) . $file . "." . SYS_LANG );
$aux = $arrayXmlMessages[$msgID];
$msg = "";
for ($i = 0; $i < strlen($aux); $i++) {
if ( $aux[$i] == "$") {
$token = ""; $i++;
while ($i < strlen ($aux) && $aux[$i]!=" " && $aux[$i]!="." && $aux[$i]!="'" && $aux[$i]!='"')
$token.= $aux[$i++];
eval ( "\$msg.= \$_SESSION['".$token."'] ; ");
$msg .= $aux[$i];
}
else
$msg = $msg . $aux[$i];
}
return $msg;
}
/**
* Function LoadXmlLabel
* @author David S. Callizaya S. <davidsantos@colosa.com>
* @access public
* @parameter string file
* @parameter string msgID
* @return string
*/
function LoadXmlLabel( $msgID , $file = 'labels' )
{
return 'xxxxxx';
global $arrayXmlMessages;
if (!isset($arrayXmlMessages[$file]))
G::loadLanguageFile( G::ExpandPath('content') . 'languages/' . $file . '.xml' );
G::registerLabel($msgID,$arrayXmlMessages[$file][$msgID]);
return $arrayXmlMessages[$file][$msgID];
}
/**
* Function LoadMessageXml
* @author David S. Callizaya S. <davidsantos@colosa.com>
* @access public
* @parameter string msgID
* @parameter string file
* @return string
*/
function LoadMessageXml( $msgID , $file ='labels' )
{
global $arrayXmlMessages;
if ( !isset($arrayXmlMessages[$file]) )
G::loadLanguageFile( G::ExpandPath('content') . 'languages/' . $file . '.xml' );
if ( isset($arrayXmlMessages[$file][$msgID]) ) {
G::registerLabel( $msgID, $arrayXmlMessages[$file][$msgID] );
return $arrayXmlMessages[$file][$msgID];
}
else {
G::registerLabel($msgID,'');
return NULL;
}
}
/**
* Function LoadTranslationObject
2011-01-24 20:47:37 +00:00
* It generates a global Translation variable that will be used in all the system. Per script
2010-12-02 23:34:41 +00:00
* @author Hugo Loza. <hugo@colosa.com>
* @access public
* @parameter string lang
2010-12-02 23:34:41 +00:00
* @return void
*/
function LoadTranslationObject($lang = SYS_LANG){
$defaultTranslations = Array();
$foreignTranslations = Array();
//if the default translations table doesn't exist we can't proceed
if( ! is_file(PATH_LANGUAGECONT . 'translation.en') )
return NULL;
//load the translations table
require_once ( PATH_LANGUAGECONT . 'translation.en' );
$defaultTranslations = $translation;
//if some foreign language was requested and its translation file exists
if( $lang != 'en' && file_exists(PATH_LANGUAGECONT . 'translation.' . $lang) ){
require_once ( PATH_LANGUAGECONT . 'translation.' . $lang ); //load the foreign translations table
$foreignTranslations = $translation;
}
global $translation;
if( defined("SHOW_UNTRANSLATED_AS_TAG") && SHOW_UNTRANSLATED_AS_TAG != 0 )
2010-12-02 23:34:41 +00:00
$translation = $foreignTranslations;
else
$translation = array_merge($defaultTranslations, $foreignTranslations);
}
/**
* Function LoadTranslation
* @author Aldo Mauricio Veliz Valenzuela. <mauricio@colosa.com>
* @access public
* @parameter string msgID
* @parameter string file
2011-02-04 15:00:20 +00:00
* @parameter array data // erik: associative array within data input to replace for formatted string i.e "any messsage {replaced_label} that contains a replace label"
2010-12-02 23:34:41 +00:00
* @return string
*/
2011-02-04 15:00:20 +00:00
function LoadTranslation( $msgID , $lang = SYS_LANG, $data = null)
2010-12-02 23:34:41 +00:00
{
global $translation;
2011-02-04 15:00:20 +00:00
2010-12-02 23:34:41 +00:00
if ( isset ( $translation[$msgID] ) ){
2011-02-04 15:00:20 +00:00
$translationString = preg_replace("[\n|\r|\n\r]", ' ', $translation[$msgID]);
if( isset($data) && is_array($data) ) {
foreach($data as $label=>$value) {
$translationString = str_replace('{'.$label.'}', $value, $translationString);
}
}
return $translationString;
} else {
if( defined("UNTRANSLATED_MARK") ) {
2010-12-02 23:34:41 +00:00
$untranslatedMark = strip_tags(UNTRANSLATED_MARK);
2011-02-04 15:00:20 +00:00
} else {
2010-12-02 23:34:41 +00:00
$untranslatedMark = "**";
}
return $untranslatedMark . $msgID . $untranslatedMark;
}
}
/**
* Function getTranslations
* @author Erik Amaru O. <erik@colosa.com>
* @access public
* @parameter array msgIDs
* @parameter string file
* @return string
*/
function getTranslations($msgIDs , $lang = SYS_LANG)
{
if ( ! is_array($msgIDs) ) return null;
$translations = Array();
foreach( $msgIDs as $mID ) {
$translations[$mID] = self::LoadTranslation($mID , $lang);
}
return $translations;
}
/**
* Load an array File Content
*
* @author Fernando Ontiveros Lira <fernando@colosa.com>
* @access public
* @param string $strFile
* @return void
*/
function LoadArrayFile( $strFile = '' )
{
$res = NULL;
if ( $strFile != '' )
{
$src = file( $strFile );
if( is_array( $src ) )
{
foreach( $src as $key => $val )
{
$res[$key] = trim( $val );
}
}
}
unset( $src );
return $res;
}
/**
* Expand an uri based in the current URI
*
* @author Fernando Ontiveros Lira <fernando@colosa.com>
* @access public
* @param string $methodPage the method directory and the page
* @return the expanded uri, later, will encryt the uri...
*/
function expandUri ( $methodPage ) {
$uri = explode ( '/', getenv ( 'REQUEST_URI' ) );
$sw = 0;
$newUri = '';
if ( !defined ( 'SYS_SKIN' ) ) {
for ( $i = 0; $i < count( $uri) ; $i++ ) {
if ( $sw == 0 ) $newUri .= $uri[ $i ] . PATH_SEP ;
if ( $uri[ $i ] == SYS_SKIN ) $sw = 1;
}
}
else {
for ( $i =0; $i < 4 ; $i++ ) {
if ( $sw == 0 ) $newUri .= $uri[ $i ] . PATH_SEP ;
if ( $uri[ $i ] == SYS_SKIN ) $sw = 1;
}
}
$newUri .= $methodPage;
return $newUri;
}
/**
* Forces login for generic applications
*
* @author Fernando Ontiveros Lira <fernando@colosa.com>
* @access public
* @param string $userid
* @param string $permission
* @param string $urlNoAccess
* @return void
*/
function genericForceLogin( $permission , $urlNoAccess, $urlLogin = 'login/login' ) {
global $RBAC;
//the session is expired, go to login page,
//the login page is login/login.html
if ( ! isset ( $_SESSION ) ) {
header ( 'location: ' . G::expandUri ( $urlLogin ) );
die ();
}
//$permission is an array, we'll verify all permission to allow access.
if ( is_array($permission) )
$aux = $permission;
else
$aux[0] = $permission;
$sw = 0;
for ($i = 0; $i < count ($aux); $i++ ) {
$res = $RBAC->userCanAccess($aux[$i]);
if ($res == 1) $sw = 1;
}
//you don't have access to this page
if ($sw == 0) {
header ( 'location: ' . G::expandUri ( $urlNoAccess ) );
die;
}
}
/**
* capitalize
*
* @param string $string
*
* @return string $string
*/
2010-12-02 23:34:41 +00:00
function capitalize($string)
{
$capitalized = '';
$singleWords = preg_split( "/\W+/m" , $string );
for($r=0; $r < sizeof($singleWords) ; $r++ ) {
2011-01-25 22:18:48 +00:00
@$string = substr($string , 0 , $singleWords[$r][1]) .
2010-12-02 23:34:41 +00:00
strtoupper( substr($singleWords[$r][0], 0,1) ) .
strtolower( substr($singleWords[$r][0], 1) ) .
substr( $string , $singleWords[$r][1] + strlen($singleWords[$r][0]) );
}
return $string;
}
/**
* toUpper
*
* @param string $sText
*
* @return string strtoupper($sText)
*/
2010-12-02 23:34:41 +00:00
function toUpper($sText)
{
return strtoupper($sText);
}
/**
* toLower
*
* @param string $sText
* @return string strtolower($sText)
*/
2010-12-02 23:34:41 +00:00
function toLower($sText)
{
return strtolower($sText);
}
/**
* http_build_query
*
* @param string $formdata,
* @param string $numeric_prefix default value null,
2010-12-02 23:34:41 +00:00
* @param string $key default value null
*
* @return array $res
*/
2010-12-02 23:34:41 +00:00
function http_build_query( $formdata, $numeric_prefix = null, $key = null )
{
$res = array();
foreach ((array)$formdata as $k=>$v) {
$tmp_key = rawurlencode(is_int($k) ? $numeric_prefix.$k : $k);
if ($key) $tmp_key = $key.'['.$tmp_key.']';
if ( is_array($v) || is_object($v) ) {
$res[] = G::http_build_query($v, null /* or $numeric_prefix if you want to add numeric_prefix to all indexes in array*/, $tmp_key);
} else {
$res[] = $tmp_key."=".rawurlencode($v);
}
/*
If you want, you can write this as one string:
$res[] = ( ( is_array($v) || is_object($v) ) ? G::http_build_query($v, null, $tmp_key) : $tmp_key."=".urlencode($v) );
*/
}
$separator = ini_get('arg_separator.output');
return implode($separator, $res);
}
/**
* Redirect URL
*
* @author Fernando Ontiveros Lira <fernando@colosa.com>
* @access public
* @param string $parameter
* @return string
*/
function header( $parameter ) {
if ( defined ('ENABLE_ENCRYPT' ) && (ENABLE_ENCRYPT == 'yes') && (substr ( $parameter, 0, 9) == 'location:')) {
$url = G::encryptUrl ( substr( $parameter, 10) , URL_KEY );
header ( 'location:' . $url );
}
else
header ( $parameter );
return ;
}
/**
*
* @author Fernando Ontiveros Lira <fernando@colosa.com>
* @access public
* @param string $permission
* @param string $urlNoAccess
* @return void
*/
function forceLogin( $permission = "", $urlNoAccess = "" ) {
global $RBAC;
if ( isset( $_SESSION['USER_LOGGED'] ) && $_SESSION['USER_LOGGED'] == '' ) {
$sys = (ENABLE_ENCRYPT=='yes'?SYS_SYS :"sys".SYS_SYS);
$lang = (ENABLE_ENCRYPT=='yes'?G::encrypt ( urldecode(SYS_LANG) , URL_KEY ):SYS_LANG);
$skin = (ENABLE_ENCRYPT=='yes'?G::encrypt ( urldecode(SYS_SKIN) , URL_KEY ):SYS_SKIN);
$login = (ENABLE_ENCRYPT=='yes'?G::encrypt ( urldecode('login') , URL_KEY ):'login');
$loginhtml = (ENABLE_ENCRYPT=='yes'?G::encrypt ( urldecode('login.html') , URL_KEY ):'login.html');
$direction = "/$sys/$lang/$skin/$login/$loginhtml";
die;
header ("location: $direction");
die;
return;
}
$Connection = new DBConnection;
$ses = new DBSession($Connection);
$stQry = "SELECT LOG_STATUS FROM LOGIN WHERE LOG_SID = '" . session_id() . "'";
$dset = $ses->Execute ( $stQry );
$row = $dset->read();
$sessionPc = defined ( 'SESSION_PC' ) ? SESSION_PC : '' ;
$sessionBrowser = defined ( 'SESSION_BROWSER' ) ? SESSION_BROWSER : '' ;
if (($sessionPc == "1" ) or ( $sessionBrowser == "1"))
if($row['LOG_STATUS'] == 'X'){
$sys = (ENABLE_ENCRYPT=='yes'?SYS_SYS :"sys".SYS_SYS);
$lang = (ENABLE_ENCRYPT=='yes'?G::encrypt ( urldecode(SYS_LANG) , URL_KEY ):SYS_LANG);
$skin = (ENABLE_ENCRYPT=='yes'?G::encrypt ( urldecode(SYS_SKIN) , URL_KEY ):SYS_SKIN);
$login = (ENABLE_ENCRYPT=='yes'?G::encrypt ( urldecode('login') , URL_KEY ):'login');
$loginhtml = (ENABLE_ENCRYPT=='yes'?G::encrypt ( urldecode('login.html') , URL_KEY ):'login.html');
$direction = "/$sys/$lang/$skin/$login/$loginhtml";
G::SendMessageXml ('ID_CLOSE_SESSION', "warning");
header ("location: $direction");
die;
return;
}
if ( defined( 'SIN_COMPATIBILIDAD_RBAC') and SIN_COMPATIBILIDAD_RBAC == 1 )
return;
if ( $permission == "" ) {
return;
}
if ( is_array($permission) )
$aux = $permission;
else
$aux[0] = $permission;
$sw = 0;
for ($i = 0; $i < count ($aux); $i++ ) {
$res = $RBAC->userCanAccess($aux[$i]);
if ($res == 1) $sw = 1;
//print " $aux[$i] $res $sw <br>";
}
if ($sw == 0 && $urlNoAccess != "") {
$aux = explode ( '/', $urlNoAccess );
$sys = (ENABLE_ENCRYPT=='yes'?SYS_SYS :"/sys".SYS_LANG);
$lang = (ENABLE_ENCRYPT=='yes'?G::encrypt ( urldecode(SYS_LANG) , URL_KEY ):SYS_LANG);
$skin = (ENABLE_ENCRYPT=='yes'?G::encrypt ( urldecode(SYS_SKIN) , URL_KEY ):SYS_SKIN);
$login = (ENABLE_ENCRYPT=='yes'?G::encrypt ( urldecode($aux[0]) , URL_KEY ):$aux[0]);
$loginhtml = (ENABLE_ENCRYPT=='yes'?G::encrypt ( urldecode($aux[1]) , URL_KEY ):$aux[1]);
//header ("location: /$sys/$lang/$skin/$login/$loginhtml");
header ("location: /fluid/mNE/o9A/mNGm1aLiop3V4qU/dtij4J°gmaLPwKDU3qNn2qXanw");
die;
}
if ($sw == 0) {
header ("location: /fluid/mNE/o9A/mNGm1aLiop3V4qU/dtij4J°gmaLPwKDU3qNn2qXanw");
//header ( "location: /sys/" . SYS_LANG . "/" . SYS_SKIN . "/login/noViewPage.html" );
die;
}
}
/**
* Add slashes to a string
*
* @author Fernando Ontiveros Lira <fernando@colosa.com>
* @access public
* @param string $val_old
* @return string
*/
function add_slashes($val_old) {
if (!is_string ($val_old)) $val_old ="$val_old";
$tamano_cadena = strlen ($val_old);
$contador_cadena = 0;
$new_val = "";
for ($contador_cadena=0; $contador_cadena< $tamano_cadena; $contador_cadena ++)
{
$car = $val_old[$contador_cadena];
if ( $car != chr(34) && $car != chr(39) && $car != chr(92))
{
$new_val .= $car;
}
else
{
if ($car2 != chr (92) )
{
//print " xmlvar: $new_val -- $car -- $car2 <br>";
$new_val .= chr(92) . $car;
}
else
$new_val .= $car;
}
}
return $new_val;
}
/**
* Upload a file and then copy to path+ nameToSave
*
* @author Mauricio Veliz <mauricio@colosa.com>
* @access public
* @param string $file
* @param string $path
* @param string $nameToSave
* @param integer $permission
* @return void
*/
function uploadFile($file, $path ,$nameToSave, $permission = 0666)
2010-12-02 23:34:41 +00:00
{
try {
if ($file == '') {
throw new Exception('The filename is empty!');
}
if (filesize($file) > ((((ini_get('upload_max_filesize') + 0)) * 1024) * 1024)) {
throw new Exception('The size of upload file exceeds the allowed by the server!');
}
$oldumask = umask(0);
if (!is_dir($path)) {
G::verifyPath($path, true);
}
move_uploaded_file($file , $path . "/" . $nameToSave);
chmod($path . "/" . $nameToSave , $permission);
umask($oldumask);
}
catch (Exception $oException) {
throw $oException;
}
}
/**
* resizeImage
*
* @param string $path,
* @param string $resWidth
* @param string $resHeight
2010-12-02 23:34:41 +00:00
* @param string $saveTo default value null
*
* @return void
*/
function resizeImage($path, $resWidth, $resHeight, $saveTo=null)
2010-12-02 23:34:41 +00:00
{
$imageInfo = @getimagesize($path);
if (!$imageInfo)
throw new Exception("Could not get image information");
list($width, $height) = $imageInfo;
$percentHeight = $resHeight / $height;
$percentWidth = $resWidth / $width;
$percent = ($percentWidth < $percentHeight) ? $percentWidth : $percentHeight;
$resWidth = $width * $percent;
$resHeight = $height * $percent;
// Resample
$image_p = imagecreatetruecolor($resWidth, $resHeight);
imagealphablending($image_p, false);
imagesavealpha($image_p, true);
$background = imagecolorallocate($image_p, 0, 0, 0);
ImageColorTransparent($image_p, $background); // make the new temp image all transparent
//Assume 3 channels if we can't find that information
if (!array_key_exists("channels", $imageInfo))
$imageInfo["channels"] = 3;
$memoryNeeded = Round( ($imageInfo[0] * $imageInfo[1] * $imageInfo['bits'] * $imageInfo['channels'] + Pow(2, 16)) * 1.95) / (1024*1024);
if ( $memoryNeeded < 80 ) $memoryNeeded = 80;
ini_set('memory_limit', intval($memoryNeeded) . 'M');
$functions = array(
IMAGETYPE_GIF => array('imagecreatefromgif', 'imagegif'),
IMAGETYPE_JPEG => array('imagecreatefromjpeg', 'imagejpeg'),
IMAGETYPE_PNG => array('imagecreatefrompng', 'imagepng'),
);
if (!array_key_exists($imageInfo[2], $functions))
throw new Exception("Image format not supported");
list($inputFn, $outputFn) = $functions[$imageInfo[2]];
$image = $inputFn($path);
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $resWidth, $resHeight, $width, $height);
$outputFn($image_p, $saveTo);
chmod($saveTo, 0666);
2010-12-02 23:34:41 +00:00
}
/**
* Merge 2 arrays
*
* @author Fernando Ontiveros Lira <fernando@colosa.com>
* @access public
* @return array
*/
function array_merges() {
$array = array();
$arrays =& func_get_args();
foreach ($arrays as $array_i) {
if (is_array($array_i)) {
G::array_merge_2($array, $array_i);
}
}
return $array;
}
/**
* Merge 2 arrays
*
* @author Fernando Ontiveros Lira <fernando@colosa.com>
* @access public
* @param string $array
* @param string $array_i
* @return array
*/
function array_merge_2(&$array, &$array_i) {
foreach ($array_i as $k => $v) {
if (is_array($v)) {
if (!isset($array[$k])) {
$array[$k] = array();
}
G::array_merge_2($array[$k], $v);
} else {
if (isset($array[$k]) && is_array($array[$k])) {
$array[$k][0] = $v;
} else {
if (isset($array) && !is_array($array)) {
$temp = $array;
$array = array();
$array[0] = $temp;
}
$array[$k] = $v;
}
}
}
}
/**
* Generate random number
*
* @author Fernando Ontiveros Lira <fernando@colosa.com>
* @access public
* @return int
*/
function generateUniqueID() {
do {
$sUID = str_replace('.', '0', uniqid(rand(0, 999999999), true));
} while (strlen($sUID) != 32);
return $sUID;
//return strtoupper(substr(uniqid(rand(0, 9), false),0,14));
}
/**
* Generate a numeric or alphanumeric code
*
* @author Julio Cesar Laura Avenda𭞼juliocesar@colosa.com>
* @access public
* @return string
*/
function generateCode($iDigits = 4, $sType = 'NUMERIC') {
if (($iDigits < 4) || ($iDigits > 50)) {
$iDigits = 4;
}
if (($sType != 'NUMERIC') && ($sType != 'ALPHA') && ($sType != 'ALPHANUMERIC')) {
$sType = 'NUMERIC';
}
$aValidCharacters = array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
'U', 'V', 'W', 'X', 'Y', 'Z');
switch ($sType) {
case 'NUMERIC':
$iMin = 0;
$iMax = 9;
break;
case 'ALPHA':
$iMin = 10;
$iMax = 35;
break;
case 'ALPHANUMERIC':
$iMin = 0;
$iMax = 35;
break;
}
$sCode = '';
for ($i = 0; $i < $iDigits; $i++) {
$sCode .= $aValidCharacters[rand($iMin, $iMax)];
}
return $sCode;
}
/**
* Verify if the input string is a valid UID
*
* @author David Callizaya <davidsantos@colosa.com>
* @access public
* @return int
*/
function verifyUniqueID( $uid ) {
return (bool) preg_match('/^[0-9A-Za-z]{14,}/',$uid);
}
/**
* is_utf8
*
* @param string $string
*
* @return string utf8_encode()
*/
2010-12-02 23:34:41 +00:00
function is_utf8($string)
{
if (is_array($string))
{
$enc = implode('', $string);
return @!((ord($enc[0]) != 239) && (ord($enc[1]) != 187) && (ord($enc[2]) != 191));
}
else
{
return (utf8_encode(utf8_decode($string)) == $string);
}
}
/**
* Return date in Y-m-d format
*
* @author Fernando Ontiveros Lira <fernando@colosa.com>
* @access public
* @return void
*/
function CurDate($sFormat = '')
{
$sFormat = ( $sFormat != '' )? $sFormat: 'Y-m-d H:i:s';
return date($sFormat);
}
/*
* Return the System defined constants and Application variables
* Constants: SYS_*
* Sessions : USER_* , URS_*
*/
function getSystemConstants($params=NULL)
{
$t1 = G::microtime_float();
$sysCon = array();
if ( defined('SYS_LANG' )) $sysCon['SYS_LANG'] = SYS_LANG;
if ( defined('SYS_SKIN' )) $sysCon['SYS_SKIN'] = SYS_SKIN;
if ( defined('SYS_SYS' ) ) $sysCon['SYS_SYS'] = SYS_SYS;
if (isset($_SESSION['APPLICATION']) ) $sysCon['APPLICATION'] = $_SESSION['APPLICATION'];
if (isset($_SESSION['PROCESS']) ) $sysCon['PROCESS'] = $_SESSION['PROCESS'];
if (isset($_SESSION['TASK']) ) $sysCon['TASK'] = $_SESSION['TASK'];
if (isset($_SESSION['INDEX']) ) $sysCon['INDEX'] = $_SESSION['INDEX'];
if (isset($_SESSION['USER_LOGGED']) ) $sysCon['USER_LOGGED'] = $_SESSION['USER_LOGGED'];
if (isset($_SESSION['USR_USERNAME'])) $sysCon['USR_USERNAME']= $_SESSION['USR_USERNAME'];
################################################################################################
# Added for compatibility betweek aplication called from web Entry that uses just WS functions
################################################################################################
if( $params != NULL ){
switch($params->option){
case 'STORED SESSION':
if( isset($params->SID) ){
G::LoadClass('sessions');
$oSessions = new Sessions($params->SID);
$sysCon = array_merge($sysCon, $oSessions->getGlobals());
}
2010-12-02 23:34:41 +00:00
break;
}
}
return $sysCon;
}
/*
* Return the Friendly Title for a string, capitalize every word and remove spaces
* param : text string
*/
function capitalizeWords( $text )
{
/*$result = '';
$space = true;
for ( $i = 0; $i < strlen ( $text); $i++ ) {
$car = strtolower ( $text[$i] );
if ( strpos( "abcdefghijklmnopqrstuvwxyz1234567890", $car ) !== false ) {
if ($space ) $car = strtoupper ( $car );
$result .= $car;
$space = false;
}
else
$space = true;
}
return $result;*/
if (function_exists('mb_detect_encoding')) {
if (strtoupper(mb_detect_encoding($text)) == 'UTF-8') {
$text = utf8_encode($text);
}
}
if(function_exists('mb_ucwords')) {
return mb_ucwords($text);
}
else {
return mb_convert_case($text, MB_CASE_TITLE, "UTF-8");
}
}
/**
* unhtmlentities
*
* @param string $string
*
* @return string substring
*/
2010-12-02 23:34:41 +00:00
function unhtmlentities ($string)
{
$trans_tbl = get_html_translation_table (HTML_ENTITIES);
foreach($trans_tbl as $k => $v)
{
$ttr[$v] = utf8_encode($k);
}
return strtr ($string, $ttr);
}
/*************************************** init **********************************************
* Xml parse collection functions
* Returns a associative array within the xml structure and data
*
2011-01-24 20:47:37 +00:00
* @author Erik Amaru Ortiz <erik@colosa.com>
2010-12-02 23:34:41 +00:00
*/
function xmlParser(&$string) {
$parser = xml_parser_create();
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
xml_parse_into_struct($parser, $string, $vals, $index);
$mnary = array();
$ary =&$mnary;
foreach ($vals as $r) {
$t=$r['tag'];
if ($r['type']=='open') {
if (isset($ary[$t])) {
if (isset($ary[$t][0]))
2010-12-02 23:34:41 +00:00
$ary[$t][]=array();
else
2010-12-02 23:34:41 +00:00
$ary[$t]=array($ary[$t], array());
$cv=&$ary[$t][count($ary[$t])-1];
} else $cv=&$ary[$t];
if (isset($r['attributes'])) {
foreach ($r['attributes'] as $k=>$v) $cv['__ATTRIBUTES__'][$k]=$v;
}
// note by gustavo cruz gustavo[at]colosa[dot]com
// minor adjustments to validate if an open node have a value attribute.
// for example a dropdown has many childs, but also can have a value attribute.
if (isset($r['value']) && trim($r['value'])!=''){
$cv['__VALUE__'] = $r['value'];
}
// end added code
$cv['__CONTENT__'] = array();
$cv['__CONTENT__']['_p'] =&$ary;
$ary =&$cv['__CONTENT__'];
} elseif ($r['type']=='complete') {
if (isset($ary[$t])) { // same as open
if (isset($ary[$t][0])) $ary[$t][]=array();
else $ary[$t]=array($ary[$t], array());
$cv=&$ary[$t][count($ary[$t])-1];
} else $cv=&$ary[$t];
if (isset($r['attributes'])) {
foreach ($r['attributes'] as $k=>$v) $cv['__ATTRIBUTES__'][$k]=$v;
}
$cv['__VALUE__']=(isset($r['value']) ? $r['value'] : '');
} elseif ($r['type']=='close') {
$ary=&$ary['_p'];
}
}
self::_del_p($mnary);
$obj_resp->code = xml_get_error_code($parser);
$obj_resp->message = xml_error_string($obj_resp->code);
$obj_resp->result = $mnary;
xml_parser_free($parser);
return $obj_resp;
}
/**
* _del_p
*
* @param string &$ary
*
* @return void
*/
2010-12-02 23:34:41 +00:00
// _Internal: Remove recursion in result array
function _del_p(&$ary) {
foreach ($ary as $k=>$v) {
if ($k==='_p') unset($ary[$k]);
elseif (is_array($ary[$k])) self::_del_p($ary[$k]);
}
}
/**
* ary2xml
*
* Array to XML
*
* @param string $cary
* @param string $d=0
2010-12-02 23:34:41 +00:00
* @param string $forcetag default value ''
*
* @return void
*/
2010-12-02 23:34:41 +00:00
// Array to XML
function ary2xml($cary, $d=0, $forcetag='') {
$res = array();
foreach ($cary as $tag=>$r) {
if (isset($r[0])) {
$res[]=self::ary2xml($r, $d, $tag);
} else {
if ($forcetag) $tag=$forcetag;
$sp = str_repeat("\t", $d);
$res[] = "$sp<$tag";
if (isset($r['_a'])) {foreach ($r['_a'] as $at=>$av) $res[]=" $at=\"$av\"";}
$res[] = ">".((isset($r['_c'])) ? "\n" : '');
if (isset($r['_c'])) $res[]=ary2xml($r['_c'], $d+1);
elseif (isset($r['_v'])) $res[]=$r['_v'];
$res[] = (isset($r['_c']) ? $sp : '')."</$tag>\n";
}
}
return implode('', $res);
}
/**
* ins2ary
*
* Insert element into array
*
* @param string &$ary
* @param string $element
* @param string $pos
*
* @return void
*/
2010-12-02 23:34:41 +00:00
// Insert element into array
function ins2ary(&$ary, $element, $pos)
2010-12-02 23:34:41 +00:00
{
$ar1=array_slice($ary, 0, $pos); $ar1[]=$element;
$ary=array_merge($ar1, array_slice($ary, $pos));
}
/*
* Xml parse collection functions
*************************************** end **********************************************/
/**
* evalJScript
*
* @param string $c
*
* @return void
*/
2010-12-02 23:34:41 +00:00
function evalJScript($c){
print("<script language=\"javascript\">{$c}</script>");
}
/**
* Inflects a string with accented characters and other characteres not suitable for file names, by defaul replace with undescore
*
2011-01-24 20:47:37 +00:00
* @author Erik Amaru Ortiz <erik@colosa.com, aortiz.erik@gamil.com>
* @param (string) string to convert
* @param (string) character for replace
* @param (array) additional characteres map
2010-12-02 23:34:41 +00:00
*
*/
function inflect($string, $replacement = '_', $map = array()) {
if (is_array($replacement)) {
$map = $replacement;
$replacement = '_';
}
$quotedReplacement = preg_quote($replacement, '/');
$default = array(
'/à|á|å|â/' => 'a',
'/è|é|ê|ẽ|ë/' => 'e',
'/ì|í|î/' => 'i',
'/ò|ó|ô|ø/' => 'o',
'/ù|ú|ů|û/' => 'u',
'/ç/' => 'c',
'/ñ/' => 'n',
'/ä|æ/' => 'ae',
'/ö/' => 'oe',
'/ü/' => 'ue',
'/Ä/' => 'Ae',
'/Ü/' => 'Ue',
'/Ö/' => 'Oe',
'/ß/' => 'ss',
'/\.|\,|\:|\-|\\|\//' => " ",
'/\\s+/' => $replacement
);
$map = array_merge($default, $map);
return preg_replace(array_keys($map), array_values($map), $string);
}
/**
* pr
*
* @param string $var
*
* @return void
*/
2010-12-02 23:34:41 +00:00
function pr($var)
{
print("<pre>");
print_r($var);
print("</pre>");
}
/**
* dump
*
* @param string $var
*
* @return void
*/
2010-12-02 23:34:41 +00:00
function dump($var){
print("<pre>");
var_dump($var);
print("</pre>");
}
/**
* stripCDATA
*
* @param string $string
*
* @return string str_replace
*/
2010-12-02 23:34:41 +00:00
function stripCDATA($string){
preg_match_all('/<!\[cdata\[(.*?)\]\]>/is', $string, $matches);
return str_replace($matches[0], $matches[1], $string);
}
/**
* Get the temporal directory path on differents O.S. i.e. /temp -> linux, C:/Temp -> win
* @author <erik@colosa.com>
2010-12-02 23:34:41 +00:00
*/
function getSysTemDir() {
if ( !function_exists('sys_get_temp_dir') ){
// Based on http://www.phpit.net/
// article/creating-zip-tar-archives-dynamically-php/2/
// Try to get from environment variable
if ( !empty($_ENV['TMP']) ){
return realpath( $_ENV['TMP'] );
} else if ( !empty($_ENV['TMPDIR']) ){
return realpath( $_ENV['TMPDIR'] );
} else if ( !empty($_ENV['TEMP']) ){
return realpath( $_ENV['TEMP'] );
} else {// Detect by creating a temporary file
// Try to use system's temporary directory
// as random name shouldn't exist
$temp_file = tempnam( md5(uniqid(rand(), TRUE)), '' );
if ( $temp_file ){
$temp_dir = realpath( dirname($temp_file) );
unlink( $temp_file );
return $temp_dir;
} else {
return FALSE;
}
}
} else {
return sys_get_temp_dir();
}
}
/**
* Get the content of a compose pmos web service response
* Returns an array when has a valid reponse, if the response is invalid returns an object containing a status_code and message properties.
*
* @author <erik@colosa.com>
2010-12-02 23:34:41 +00:00
*/
function PMWSCompositeResponse($oResp, $prop) {
$Resp = new stdClass();
if( is_object($oResp) && isset($oResp->{$prop}) ){
$list = $oResp->{$prop};
if( is_object($list) ){
$aList[0] = $list;
2010-12-02 23:34:41 +00:00
} else {
$aList = $list;
}
$result = true;
if( is_array($aList) ){
foreach($aList as $item){
if( !isset($item->guid) ){
$result = false;
break;
}
}
} else {
$Resp->status_code = -1;
$Resp->message = "Bad respose type for ({$prop})";
}
if( $result ){
//verifing if the response has a composite response into a guid value of the first row.
$tmp = explode(' ', trim($aList[0]->guid));
if( sizeof($tmp) >= 2 ){ //the guid can't has a space, so this should be a ws response
$Resp->status_code = $tmp[0];
$Resp->message = substr($aList[0]->guid, strpos($aList[0]->guid, ' ') + 1);
} else {
return $aList;
}
} else {
$Resp->status_code = -2;
$Resp->message = "Bad respose, the response has not a uniform struct.";
}
} else if( is_object($oResp) ){
return Array();
} else {
$Resp->status_code = -1;
$Resp->message = "1 Bad respose type for ({$prop})";
}
return $Resp;
}
/**
* Validate and emai address in complete forms,
*
2010-12-02 23:34:41 +00:00
* @author Erik A.O. <erik@gmail.com, aortiz.erik@gmail.com>
* i.e. if the param. is 'erik a.o. <erik@colosa.com>'
* -> returns a object within $o->email => erik@colosa.com and $o->name => erik A.O. in other case returns false
*
2010-12-02 23:34:41 +00:00
*/
function emailAddress($sEmail){
$o = new stdClass();
if( strpos($sEmail, '<') !== false ) {
preg_match('/([\"\w@\.-_\s]*\s*)?(<(\w+[\.-]?\w+]*@\w+([\.-]?\w+)*\.\w{2,3})+>)/', $sEmail, $matches);
g::pr($matches);
if( isset($matches[1]) && $matches[3]){
$o->email = $matches[3];
$o->name = $matches[1];
return $o;
2010-12-02 23:34:41 +00:00
}
return false;
} else {
preg_match('/\w+[\.-]?\w+]*@\w+([\.-]?\w+)*\.\w{2,3}+/', $sEmail, $matches);
if( isset($matches[0]) ){
$o->email = $matches[0];
$o->name = '';
return $o;
2010-12-02 23:34:41 +00:00
}
return false;
2010-12-02 23:34:41 +00:00
}
}
/**
* JSON encode
*
2010-12-02 23:34:41 +00:00
* @author Erik A.O. <erik@gmail.com, aortiz.erik@gmail.com>
*/
function json_encode($Json){
if( function_exists('json_encode') ){
return json_encode($Json);
} else {
G::LoadThirdParty('pear/json', 'class.json');
$oJSON = new Services_JSON();
return $oJSON->encode($Json);
}
}
/**
* JSON decode
*
2010-12-02 23:34:41 +00:00
* @author Erik A.O. <erik@gmail.com, aortiz.erik@gmail.com>
*/
function json_decode($Json){
if( function_exists('json_decode') ){
return json_decode($Json);
} else {
G::LoadThirdParty('pear/json', 'class.json');
$oJSON = new Services_JSON();
return $oJSON->decode($Json);
}
}
2010-12-02 23:34:41 +00:00
/**
* isHttpRequest
*
* @return boolean true or false
*/
function isHttpRequest(){
if( isset($_SERVER['SERVER_SOFTWARE']) && strpos(strtolower($_SERVER['SERVER_SOFTWARE']), 'apache') !== false ){
return true;
}
return false;
}
2010-12-02 23:34:41 +00:00
/**
* Get the type of a variable
* Returns the type of the PHP variable var.
2010-12-02 23:34:41 +00:00
*
* @author Erik A. Ortiz. <erik@colosa.com>
* @return (string) type of variable
*/
2010-12-02 23:34:41 +00:00
public function gettype($var) {
switch ($var) {
case is_null($var):
$type='NULL';
break;
case is_bool($var):
$type='boolean';
break;
case is_float($var):
$type='double';
break;
case is_int($var):
$type='integer';
break;
case is_string($var):
$type='string';
break;
case is_array($var):
$type='array';
break;
case is_object($var):
$type='object';
break;
case is_resource($var):
$type='resource';
break;
default:
$type='unknown type';
break;
}
return $type;
}
function removeComments($buffer)
{
/* remove comments */
$buffer = preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $buffer);
/* remove tabs, spaces, newlines, etc. */
$buffer = str_replace(array("\r\n", "\r", "\n", "\t", ' ', ' ', ' '), '', $buffer);
return $buffer;
}
function getMemoryUsage(){
$size = memory_get_usage(true);
$unit=array('B','Kb','Mb','Gb','Tb','Pb');
return @round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i];
}
function getFormatUserList($format, $aUserInfo){
switch($format){
case '@firstName @lastName':
2010-12-06 15:12:37 +00:00
$infoUser = str_replace('@firstName', $aUserInfo['USR_FIRSTNAME'], $format);
$infoUser = str_replace('@lastName', $aUserInfo['USR_LASTNAME'], $infoUser);
2010-12-02 23:34:41 +00:00
break;
case '@firstName @lastName (@userName)':
2010-12-06 15:12:37 +00:00
$infoUser = str_replace('@firstName', $aUserInfo['USR_FIRSTNAME'], $format);
$infoUser = str_replace('@lastName', $aUserInfo['USR_LASTNAME'], $infoUser);
$infoUser = str_replace('@userName', $aUserInfo['USR_USERNAME'], $infoUser);
2010-12-02 23:34:41 +00:00
break;
case '@userName':
2010-12-06 15:12:37 +00:00
$infoUser = str_replace('@userName', $aUserInfo['USR_USERNAME'], $format);
2010-12-02 23:34:41 +00:00
break;
case '@userName (@firstName @lastName)':
2010-12-06 15:12:37 +00:00
$infoUser = str_replace('@userName', $aUserInfo['USR_USERNAME'], $format);
$infoUser = str_replace('@firstName', $aUserInfo['USR_FIRSTNAME'], $infoUser);
$infoUser = str_replace('@lastName', $aUserInfo['USR_LASTNAME'], $infoUser);
2010-12-02 23:34:41 +00:00
break;
case '@lastName @firstName':
2010-12-06 15:12:37 +00:00
$infoUser = str_replace('@lastName', $aUserInfo['USR_LASTNAME'], $format);
$infoUser = str_replace('@firstName', $aUserInfo['USR_FIRSTNAME'], $infoUser);
2010-12-02 23:34:41 +00:00
break;
case '@lastName, @firstName':
2010-12-06 15:12:37 +00:00
$infoUser = str_replace('@lastName', $aUserInfo['USR_LASTNAME'], $format);
$infoUser = str_replace('@firstName', $aUserInfo['USR_FIRSTNAME'], $infoUser);
2010-12-02 23:34:41 +00:00
break;
case '@lastName, @firstName (@userName)':
2010-12-06 15:12:37 +00:00
$infoUser = str_replace('@lastName', $aUserInfo['USR_LASTNAME'], $format);
$infoUser = str_replace('@firstName', $aUserInfo['USR_FIRSTNAME'], $infoUser);
$infoUser = str_replace('@userName', $aUserInfo['USR_USERNAME'], $infoUser);
2010-12-02 23:34:41 +00:00
break;
default :
2010-12-06 15:12:37 +00:00
$infoUser = str_replace('@userName', $aUserInfo['USR_USERNAME'], '@userName');
2010-12-02 23:34:41 +00:00
break;
}
return $infoUser;
}
function getModel($model){
require_once "classes/model/$model.php";
return new $model();
}
/**
* Recursive Is writeable function
*
* @author Erik Amaru Ortiz <erik@colosa.com>
*
* @param $path path to scan recursively the write permission
* @param $pattern pattern to filter some especified files
* @return <boolean> if the $path, assuming that is a directory -> all files in it are writeables or not
*/
function is_rwritable($path, $pattern='*')
{
$files = G::rglob($pattern, 0, $path);
foreach ($files as $file) {
if( ! is_writable($file) )
return false;
}
return true;
}
/**
* Recursive version of glob php standard function
*
* @author Erik Amaru Ortiz <erik@colosa.com>
*
* @param $path path to scan recursively the write permission
* @param $flags to notive glob function
* @param $pattern pattern to filter some especified files
* @return <array> array containing the recursive glob results
*/
function rglob($pattern='*', $flags = 0, $path='')
{
$paths = glob($path.'*', GLOB_MARK|GLOB_ONLYDIR|GLOB_NOSORT);
$files = glob($path.$pattern, $flags);
foreach ($paths as $path) {
$files = array_merge($files, G::rglob($pattern, $flags, $path));
}
return $files;
}
function browser_detection( $which_test, $test_excludes='', $external_ua_string='' )
{
/*
uncomment the global variable declaration if you want the variables to be available on
a global level throughout your php page, make sure that php is configured to support
the use of globals first!
Use of globals should be avoided however, and they are not necessary with this script
/*
/*
global $a_full_assoc_data, $a_mobile_data, $a_moz_data, $a_webkit_data, $b_dom_browser, $b_repeat, $b_safe_browser, $browser_name, $browser_number, $browser_math_number, $browser_user_agent, $browser_working, $ie_version, $mobile_test, $moz_number, $moz_rv, $moz_rv_full, $moz_release_date, $moz_type, $os_number, $os_type, $true_ie_number, $ua_type, $webkit_type, $webkit_type_number;
*/
G::script_time(); // set script timer to start timing
static $a_full_assoc_data, $a_mobile_data, $a_moz_data, $a_webkit_data, $b_dom_browser, $b_repeat, $b_safe_browser, $browser_name, $browser_number, $browser_math_number, $browser_user_agent, $browser_working, $ie_version, $mobile_test, $moz_number, $moz_rv, $moz_rv_full, $moz_release_date, $moz_type, $os_number, $os_type, $true_ie_number, $ua_type, $webkit_type, $webkit_type_number;
// switch off the optimization for external ua string testing.
if ( $external_ua_string )
{
$b_repeat = false;
}
/*
this makes the test only run once no matter how many times you call it since
all the variables are filled on the first run through, it's only a matter of
returning the the right ones
*/
if ( !$b_repeat )
{
//initialize all variables with default values to prevent error
$a_browser_math_number = '';
$a_full_assoc_data = '';
$a_full_data = '';
$a_mobile_data = '';
$a_moz_data = '';
$a_os_data = '';
$a_unhandled_browser = '';
$a_webkit_data = '';
$b_dom_browser = false;
$b_os_test = true;
$b_mobile_test = true;
$b_safe_browser = false;
$b_success = false;// boolean for if browser found in main test
$browser_math_number = '';
$browser_temp = '';
$browser_working = '';
$browser_number = '';
$ie_version = '';
$mobile_test = '';
$moz_release_date = '';
$moz_rv = '';
$moz_rv_full = '';
$moz_type = '';
$moz_number = '';
$os_number = '';
$os_type = '';
$run_time = '';
$true_ie_number = '';
$ua_type = 'bot';// default to bot since you never know with bots
$webkit_type = '';
$webkit_type_number = '';
// set the excludes if required
if ( $test_excludes )
{
switch ( $test_excludes )
{
case '1':
$b_os_test = false;
break;
case '2':
$b_mobile_test = false;
break;
case '3':
$b_os_test = false;
$b_mobile_test = false;
break;
default:
die( 'Error: bad $test_excludes parameter 2 used: ' . $test_excludes );
break;
}
}
/*
make navigator user agent string lower case to make sure all versions get caught
isset protects against blank user agent failure. tolower also lets the script use
strstr instead of stristr, which drops overhead slightly.
*/
if ( $external_ua_string )
{
$browser_user_agent = strtolower( $external_ua_string );
}
elseif ( isset( $_SERVER['HTTP_USER_AGENT'] ) )
{
$browser_user_agent = strtolower( $_SERVER['HTTP_USER_AGENT'] );
}
else
{
$browser_user_agent = '';
}
/*
pack the browser type array, in this order
the order is important, because opera must be tested first, then omniweb [which has safari
data in string], same for konqueror, then safari, then gecko, since safari navigator user
agent id's with 'gecko' in string.
Note that $b_dom_browser is set for all modern dom browsers, this gives you a default to use.
array[0] = id string for useragent, array[1] is if dom capable, array[2] is working name
for browser, array[3] identifies navigator useragent type
Note: all browser strings are in lower case to match the strtolower output, this avoids
possible detection errors
Note: These are the navigator user agent types:
bro - modern, css supporting browser.
bbro - basic browser, text only, table only, defective css implementation
bot - search type spider
dow - known download agent
lib - standard http libraries
mobile - handheld or mobile browser, set using $mobile_test
*/
// known browsers, list will be updated routinely, check back now and then
$a_browser_types = array(
array( 'opera', true, 'op', 'bro' ),
array( 'msie', true, 'ie', 'bro' ),
// webkit before gecko because some webkit ua strings say: like gecko
array( 'webkit', true, 'webkit', 'bro' ),
// konq will be using webkit soon
array( 'konqueror', true, 'konq', 'bro' ),
// covers Netscape 6-7, K-Meleon, Most linux versions, uses moz array below
array( 'gecko', true, 'moz', 'bro' ),
array( 'netpositive', false, 'netp', 'bbro' ),// beos browser
array( 'lynx', false, 'lynx', 'bbro' ), // command line browser
array( 'elinks ', false, 'elinks', 'bbro' ), // new version of links
array( 'elinks', false, 'elinks', 'bbro' ), // alternate id for it
array( 'links2', false, 'links2', 'bbro' ), // alternate links version
array( 'links ', false, 'links', 'bbro' ), // old name for links
array( 'links', false, 'links', 'bbro' ), // alternate id for it
array( 'w3m', false, 'w3m', 'bbro' ), // open source browser, more features than lynx/links
array( 'webtv', false, 'webtv', 'bbro' ),// junk ms webtv
array( 'amaya', false, 'amaya', 'bbro' ),// w3c browser
array( 'dillo', false, 'dillo', 'bbro' ),// linux browser, basic table support
array( 'ibrowse', false, 'ibrowse', 'bbro' ),// amiga browser
array( 'icab', false, 'icab', 'bro' ),// mac browser
array( 'crazy browser', true, 'ie', 'bro' ),// uses ie rendering engine
// search engine spider bots:
array( 'bingbot', false, 'bing', 'bot' ),// bing
array( 'exabot', false, 'exabot', 'bot' ),// exabot
array( 'googlebot', false, 'google', 'bot' ),// google
array( 'google web preview', false, 'googlewp', 'bot' ),// google preview
array( 'mediapartners-google', false, 'adsense', 'bot' ),// google adsense
array( 'yahoo-verticalcrawler', false, 'yahoo', 'bot' ),// old yahoo bot
array( 'yahoo! slurp', false, 'yahoo', 'bot' ), // new yahoo bot
array( 'yahoo-mm', false, 'yahoomm', 'bot' ), // gets Yahoo-MMCrawler and Yahoo-MMAudVid bots
array( 'inktomi', false, 'inktomi', 'bot' ), // inktomi bot
array( 'slurp', false, 'inktomi', 'bot' ), // inktomi bot
array( 'fast-webcrawler', false, 'fast', 'bot' ),// Fast AllTheWeb
array( 'msnbot', false, 'msn', 'bot' ),// msn search
array( 'ask jeeves', false, 'ask', 'bot' ), //jeeves/teoma
array( 'teoma', false, 'ask', 'bot' ),//jeeves teoma
array( 'scooter', false, 'scooter', 'bot' ),// altavista
array( 'openbot', false, 'openbot', 'bot' ),// openbot, from taiwan
array( 'ia_archiver', false, 'ia_archiver', 'bot' ),// ia archiver
array( 'zyborg', false, 'looksmart', 'bot' ),// looksmart
array( 'almaden', false, 'ibm', 'bot' ),// ibm almaden web crawler
array( 'baiduspider', false, 'baidu', 'bot' ),// Baiduspider asian search spider
array( 'psbot', false, 'psbot', 'bot' ),// psbot image crawler
array( 'gigabot', false, 'gigabot', 'bot' ),// gigabot crawler
array( 'naverbot', false, 'naverbot', 'bot' ),// naverbot crawler, bad bot, block
array( 'surveybot', false, 'surveybot', 'bot' ),//
array( 'boitho.com-dc', false, 'boitho', 'bot' ),//norwegian search engine
array( 'objectssearch', false, 'objectsearch', 'bot' ),// open source search engine
array( 'answerbus', false, 'answerbus', 'bot' ),// http://www.answerbus.com/, web questions
array( 'sohu-search', false, 'sohu', 'bot' ),// chinese media company, search component
array( 'iltrovatore-setaccio', false, 'il-set', 'bot' ),
// various http utility libaries
array( 'w3c_validator', false, 'w3c', 'lib' ), // uses libperl, make first
array( 'wdg_validator', false, 'wdg', 'lib' ), //
array( 'libwww-perl', false, 'libwww-perl', 'lib' ),
array( 'jakarta commons-httpclient', false, 'jakarta', 'lib' ),
array( 'python-urllib', false, 'python-urllib', 'lib' ),
// download apps
array( 'getright', false, 'getright', 'dow' ),
array( 'wget', false, 'wget', 'dow' ),// open source downloader, obeys robots.txt
// netscape 4 and earlier tests, put last so spiders don't get caught
array( 'mozilla/4.', false, 'ns', 'bbro' ),
array( 'mozilla/3.', false, 'ns', 'bbro' ),
array( 'mozilla/2.', false, 'ns', 'bbro' )
);
//array( '', false ); // browser array template
/*
moz types array
note the order, netscape6 must come before netscape, which is how netscape 7 id's itself.
rv comes last in case it is plain old mozilla. firefox/netscape/seamonkey need to be later
Thanks to: http://www.zytrax.com/tech/web/firefox-history.html
*/
$a_moz_types = array( 'bonecho', 'camino', 'epiphany', 'firebird', 'flock', 'galeon', 'iceape', 'icecat', 'k-meleon', 'minimo', 'multizilla', 'phoenix', 'songbird', 'swiftfox', 'seamonkey', 'shiretoko', 'iceweasel', 'firefox', 'minefield', 'netscape6', 'netscape', 'rv' );
/*
webkit types, this is going to expand over time as webkit browsers spread
konqueror is probably going to move to webkit, so this is preparing for that
It will now default to khtml. gtklauncher is the temp id for epiphany, might
change. Defaults to applewebkit, and will all show the webkit number.
*/
$a_webkit_types = array( 'arora', 'chrome', 'epiphany', 'gtklauncher', 'konqueror', 'midori', 'omniweb', 'safari', 'uzbl', 'applewebkit', 'webkit' );
/*
run through the browser_types array, break if you hit a match, if no match, assume old browser
or non dom browser, assigns false value to $b_success.
*/
$i_count = count( $a_browser_types );
for ( $i = 0; $i < $i_count; $i++ )
{
//unpacks browser array, assigns to variables, need to not assign til found in string
$browser_temp = $a_browser_types[$i][0];// text string to id browser from array
if ( strstr( $browser_user_agent, $browser_temp ) )
{
/*
it defaults to true, will become false below if needed
this keeps it easier to keep track of what is safe, only
explicit false assignment will make it false.
*/
$b_safe_browser = true;
$browser_name = $browser_temp;// text string to id browser from array
// assign values based on match of user agent string
$b_dom_browser = $a_browser_types[$i][1];// hardcoded dom support from array
$browser_working = $a_browser_types[$i][2];// working name for browser
$ua_type = $a_browser_types[$i][3];// sets whether bot or browser
switch ( $browser_working )
{
// this is modified quite a bit, now will return proper netscape version number
// check your implementation to make sure it works
case 'ns':
$b_safe_browser = false;
$browser_number = G::get_item_version( $browser_user_agent, 'mozilla' );
break;
case 'moz':
/*
note: The 'rv' test is not absolute since the rv number is very different on
different versions, for example Galean doesn't use the same rv version as Mozilla,
neither do later Netscapes, like 7.x. For more on this, read the full mozilla
numbering conventions here: http://www.mozilla.org/releases/cvstags.html
*/
// this will return alpha and beta version numbers, if present
$moz_rv_full = G::get_item_version( $browser_user_agent, 'rv' );
// this slices them back off for math comparisons
$moz_rv = substr( $moz_rv_full, 0, 3 );
// this is to pull out specific mozilla versions, firebird, netscape etc..
$j_count = count( $a_moz_types );
for ( $j = 0; $j < $j_count; $j++ )
{
if ( strstr( $browser_user_agent, $a_moz_types[$j] ) )
{
$moz_type = $a_moz_types[$j];
$moz_number = G::get_item_version( $browser_user_agent, $moz_type );
break;
}
}
/*
this is necesary to protect against false id'ed moz'es and new moz'es.
this corrects for galeon, or any other moz browser without an rv number
*/
if ( !$moz_rv )
{
// you can use this if you are running php >= 4.2
if ( function_exists( 'floatval' ) )
{
$moz_rv = floatval( $moz_number );
}
else
{
$moz_rv = substr( $moz_number, 0, 3 );
}
$moz_rv_full = $moz_number;
}
// this corrects the version name in case it went to the default 'rv' for the test
if ( $moz_type == 'rv' )
{
$moz_type = 'mozilla';
}
//the moz version will be taken from the rv number, see notes above for rv problems
$browser_number = $moz_rv;
// gets the actual release date, necessary if you need to do functionality tests
G::get_set_count( 'set', 0 );
$moz_release_date = G::get_item_version( $browser_user_agent, 'gecko/' );
/*
Test for mozilla 0.9.x / netscape 6.x
test your javascript/CSS to see if it works in these mozilla releases, if it
does, just default it to: $b_safe_browser = true;
*/
if ( ( $moz_release_date < 20020400 ) || ( $moz_rv < 1 ) )
{
$b_safe_browser = false;
}
break;
case 'ie':
/*
note we're adding in the trident/ search to return only first instance in case
of msie 8, and we're triggering the break last condition in the test, as well
as the test for a second search string, trident/
*/
$browser_number = G::get_item_version( $browser_user_agent, $browser_name, true, 'trident/' );
// construct the proper real number if it's in compat mode and msie 8.0/9.0
if ( strstr( $browser_number, '7.' ) && strstr( $browser_user_agent, 'trident/5' ) )
{
// note that 7.0 becomes 9 when adding 1, but if it's 7.1 it will be 9.1
$true_ie_number = $browser_number + 2;
}
elseif ( strstr( $browser_number, '7.' ) && strstr( $browser_user_agent, 'trident/4' ) )
{
// note that 7.0 becomes 8 when adding 1, but if it's 7.1 it will be 8.1
$true_ie_number = $browser_number + 1;
}
// the 9 series is finally standards compatible, html 5 etc, so worth a new id
if ( $browser_number >= 9 )
{
$ie_version = 'ie9x';
}
// 7/8 were not yet quite to standards levels but getting there
elseif ( $browser_number >= 7 )
{
$ie_version = 'ie7x';
}
// then test for IE 5x mac, that's the most problematic IE out there
elseif ( strstr( $browser_user_agent, 'mac') )
{
$ie_version = 'ieMac';
}
// ie 5/6 are both very weak in standards compliance
elseif ( $browser_number >= 5 )
{
$ie_version = 'ie5x';
}
elseif ( ( $browser_number > 3 ) && ( $browser_number < 5 ) )
{
$b_dom_browser = false;
$ie_version = 'ie4';
// this depends on what you're using the script for, make sure this fits your needs
$b_safe_browser = true;
}
else
{
$ie_version = 'old';
$b_dom_browser = false;
$b_safe_browser = false;
}
break;
case 'op':
$browser_number = G::get_item_version( $browser_user_agent, $browser_name );
// opera is leaving version at 9.80 (or xx) for 10.x - see this for explanation
// http://dev.opera.com/articles/view/opera-ua-string-changes/
if ( strstr( $browser_number, '9.' ) && strstr( $browser_user_agent, 'version/' ) )
{
G::get_set_count( 'set', 0 );
$browser_number = G::get_item_version( $browser_user_agent, 'version/' );
}
if ( $browser_number < 5 )// opera 4 wasn't very useable.
{
$b_safe_browser = false;
}
break;
/*
note: webkit returns always the webkit version number, not the specific user
agent version, ie, webkit 583, not chrome 0.3
*/
case 'webkit':
// note that this is the Webkit version number
$browser_number = G::get_item_version( $browser_user_agent, $browser_name );
// this is to pull out specific webkit versions, safari, google-chrome etc..
$j_count = count( $a_webkit_types );
for ( $j = 0; $j < $j_count; $j++ )
{
if ( strstr( $browser_user_agent, $a_webkit_types[$j] ) )
{
$webkit_type = $a_webkit_types[$j];
/*
and this is the webkit type version number, like: chrome 1.2
if omni web, we want the count 2, not default 1
*/
if ( $webkit_type == 'omniweb' )
{
G::get_set_count( 'set', 2 );
}
$webkit_type_number = G::get_item_version( $browser_user_agent, $webkit_type );
// epiphany hack
if ( $a_webkit_types[$j] == 'gtklauncher' )
{
$browser_name = 'epiphany';
}
else
{
$browser_name = $a_webkit_types[$j];
}
break;
}
}
break;
default:
$browser_number = G::get_item_version( $browser_user_agent, $browser_name );
break;
}
// the browser was id'ed
$b_success = true;
break;
}
}
//assigns defaults if the browser was not found in the loop test
if ( !$b_success )
{
/*
this will return the first part of the browser string if the above id's failed
usually the first part of the browser string has the navigator useragent name/version in it.
This will usually correctly id the browser and the browser number if it didn't get
caught by the above routine.
If you want a '' to do a if browser == '' type test, just comment out all lines below
except for the last line, and uncomment the last line. If you want undefined values,
the browser_name is '', you can always test for that
*/
// delete this part if you want an unknown browser returned
$browser_name = substr( $browser_user_agent, 0, strcspn( $browser_user_agent , '();') );
// this extracts just the browser name from the string, if something usable was found
if ( $browser_name && preg_match( '/[^0-9][a-z]*-*\ *[a-z]*\ *[a-z]*/', $browser_name, $a_unhandled_browser ) )
{
$browser_name = $a_unhandled_browser[0];
if ( $browser_name == 'blackberry' )
{
G::get_set_count( 'set', 0 );
}
$browser_number = G::get_item_version( $browser_user_agent, $browser_name );
}
else
{
$browser_name = 'NA';
$browser_number = 'NA';
}
// then uncomment this part
//$browser_name = '';//deletes the last array item in case the browser was not a match
}
// get os data, mac os x test requires browser/version information, this is a change from older scripts
if ( $b_os_test )
{
$a_os_data = G::get_os_data( $browser_user_agent, $browser_working, $browser_number );
$os_type = $a_os_data[0];// os name, abbreviated
$os_number = $a_os_data[1];// os number or version if available
}
/*
this ends the run through once if clause, set the boolean
to true so the function won't retest everything
*/
$b_repeat = true;
/*
pulls out primary version number from more complex string, like 7.5a,
use this for numeric version comparison
*/
if ( $browser_number && preg_match( '/[0-9]*\.*[0-9]*/', $browser_number, $a_browser_math_number ) )
{
$browser_math_number = $a_browser_math_number[0];
//print_r($a_browser_math_number);
}
if ( $b_mobile_test )
{
$mobile_test = G::check_is_mobile( $browser_user_agent );
if ( $mobile_test )
{
$a_mobile_data = G::get_mobile_data( $browser_user_agent );
$ua_type = 'mobile';
}
}
}
//$browser_number = $_SERVER["REMOTE_ADDR"];
/*
This is where you return values based on what parameter you used to call the function
$which_test is the passed parameter in the initial browser_detection('os') for example returns
the os version only.
Update deprecated parameter names to new names
*/
switch ( $which_test )
{
case 'math_number':
$which_test = 'browser_math_number';
break;
case 'number':
$which_test = 'browser_number';
break;
case 'browser':
$which_test = 'browser_working';
break;
case 'moz_version':
$which_test = 'moz_data';
break;
case 'true_msie_version':
$which_test = 'true_ie_number';
break;
case 'type':
$which_test = 'ua_type';
break;
case 'webkit_version':
$which_test = 'webkit_data';
break;
}
/*
assemble these first so they can be included in full return data, using static variables
Note that there's no need to keep repacking these every time the script is called
*/
if ( !$a_moz_data )
{
$a_moz_data = array( $moz_type, $moz_number, $moz_rv, $moz_rv_full, $moz_release_date );
}
if ( !$a_webkit_data )
{
$a_webkit_data = array( $webkit_type, $webkit_type_number, $browser_number );
}
$run_time = G::script_time();
// then pack the primary data array
if ( !$a_full_assoc_data )
{
$a_full_assoc_data = array(
'browser_working' => $browser_working,
'browser_number' => $browser_number,
'ie_version' => $ie_version,
'dom' => $b_dom_browser,
'safe' => $b_safe_browser,
'os' => $os_type,
'os_number' => $os_number,
'browser_name' => $browser_name,
'ua_type' => $ua_type,
'browser_math_number' => $browser_math_number,
'moz_data' => $a_moz_data,
'webkit_data' => $a_webkit_data,
'mobile_test' => $mobile_test,
'mobile_data' => $a_mobile_data,
'true_ie_number' => $true_ie_number,
'run_time' => $run_time
);
}
// return parameters, either full data arrays, or by associative array index key
switch ( $which_test )
{
// returns all relevant browser information in an array with standard numberic indexes
case 'full':
$a_full_data = array(
$browser_working,
$browser_number,
$ie_version,
$b_dom_browser,
$b_safe_browser,
$os_type,
$os_number,
$browser_name,
$ua_type,
$browser_math_number,
$a_moz_data,
$a_webkit_data,
$mobile_test,
$a_mobile_data,
$true_ie_number,
$run_time
);
// print_r( $a_full_data );
return $a_full_data;
break;
// returns all relevant browser information in an associative array
case 'full_assoc':
return $a_full_assoc_data;
break;
default:
# check to see if the data is available, otherwise it's user typo of unsupported option
if ( isset( $a_full_assoc_data[$which_test] ) )
{
return $a_full_assoc_data[$which_test];
}
else
{
die( "You passed the browser detector an unsupported option for parameter 1: " . $which_test );
}
break;
}
}
// gets which os from the browser string
function get_os_data ( $pv_browser_string, $pv_browser_name, $pv_version_number )
{
// initialize variables
$os_working_type = '';
$os_working_number = '';
/*
packs the os array. Use this order since some navigator user agents will put 'macintosh'
in the navigator user agent string which would make the nt test register true
*/
$a_mac = array( 'intel mac', 'ppc mac', 'mac68k' );// this is not used currently
// same logic, check in order to catch the os's in order, last is always default item
$a_unix_types = array( 'dragonfly', 'freebsd', 'openbsd', 'netbsd', 'bsd', 'unixware', 'solaris', 'sunos', 'sun4', 'sun5', 'suni86', 'sun', 'irix5', 'irix6', 'irix', 'hpux9', 'hpux10', 'hpux11', 'hpux', 'hp-ux', 'aix1', 'aix2', 'aix3', 'aix4', 'aix5', 'aix', 'sco', 'unixware', 'mpras', 'reliant', 'dec', 'sinix', 'unix' );
// only sometimes will you get a linux distro to id itself...
$a_linux_distros = array( 'ubuntu', 'kubuntu', 'xubuntu', 'mepis', 'xandros', 'linspire', 'winspire', 'jolicloud', 'sidux', 'kanotix', 'debian', 'opensuse', 'suse', 'fedora', 'redhat', 'slackware', 'slax', 'mandrake', 'mandriva', 'gentoo', 'sabayon', 'linux' );
$a_linux_process = array ( 'i386', 'i586', 'i686' );// not use currently
// note, order of os very important in os array, you will get failed ids if changed
$a_os_types = array( 'android', 'blackberry', 'iphone', 'palmos', 'palmsource', 'symbian', 'beos', 'os2', 'amiga', 'webtv', 'mac', 'nt', 'win', $a_unix_types, $a_linux_distros );
//os tester
$i_count = count( $a_os_types );
for ( $i = 0; $i < $i_count; $i++ )
{
// unpacks os array, assigns to variable $a_os_working
$os_working_data = $a_os_types[$i];
/*
assign os to global os variable, os flag true on success
!strstr($pv_browser_string, "linux" ) corrects a linux detection bug
*/
if ( !is_array( $os_working_data ) && strstr( $pv_browser_string, $os_working_data ) && !strstr( $pv_browser_string, "linux" ) )
{
$os_working_type = $os_working_data;
switch ( $os_working_type )
{
// most windows now uses: NT X.Y syntax
case 'nt':
if ( strstr( $pv_browser_string, 'nt 6.1' ) )// windows 7
{
$os_working_number = 6.1;
}
elseif ( strstr( $pv_browser_string, 'nt 6.0' ) )// windows vista/server 2008
{
$os_working_number = 6.0;
}
elseif ( strstr( $pv_browser_string, 'nt 5.2' ) )// windows server 2003
{
$os_working_number = 5.2;
}
elseif ( strstr( $pv_browser_string, 'nt 5.1' ) || strstr( $pv_browser_string, 'xp' ) )// windows xp
{
$os_working_number = 5.1;//
}
elseif ( strstr( $pv_browser_string, 'nt 5' ) || strstr( $pv_browser_string, '2000' ) )// windows 2000
{
$os_working_number = 5.0;
}
elseif ( strstr( $pv_browser_string, 'nt 4' ) )// nt 4
{
$os_working_number = 4;
}
elseif ( strstr( $pv_browser_string, 'nt 3' ) )// nt 4
{
$os_working_number = 3;
}
break;
case 'win':
if ( strstr( $pv_browser_string, 'vista' ) )// windows vista, for opera ID
{
$os_working_number = 6.0;
$os_working_type = 'nt';
}
elseif ( strstr( $pv_browser_string, 'xp' ) )// windows xp, for opera ID
{
$os_working_number = 5.1;
$os_working_type = 'nt';
}
elseif ( strstr( $pv_browser_string, '2003' ) )// windows server 2003, for opera ID
{
$os_working_number = 5.2;
$os_working_type = 'nt';
}
elseif ( strstr( $pv_browser_string, 'windows ce' ) )// windows CE
{
$os_working_number = 'ce';
$os_working_type = 'nt';
}
elseif ( strstr( $pv_browser_string, '95' ) )
{
$os_working_number = '95';
}
elseif ( ( strstr( $pv_browser_string, '9x 4.9' ) ) || ( strstr( $pv_browser_string, ' me' ) ) )
{
$os_working_number = 'me';
}
elseif ( strstr( $pv_browser_string, '98' ) )
{
$os_working_number = '98';
}
elseif ( strstr( $pv_browser_string, '2000' ) )// windows 2000, for opera ID
{
$os_working_number = 5.0;
$os_working_type = 'nt';
}
break;
case 'mac':
if ( strstr( $pv_browser_string, 'os x' ) )
{
// if it doesn't have a version number, it is os x;
if ( strstr( $pv_browser_string, 'os x ' ) )
{
// numbers are like: 10_2.4, others 10.2.4
$os_working_number = str_replace( '_', '.', G::get_item_version( $pv_browser_string, 'os x' ) );
}
else
{
$os_working_number = 10;
}
}
/*
this is a crude test for os x, since safari, camino, ie 5.2, & moz >= rv 1.3
are only made for os x
*/
elseif ( ( $pv_browser_name == 'saf' ) || ( $pv_browser_name == 'cam' ) ||
( ( $pv_browser_name == 'moz' ) && ( $pv_version_number >= 1.3 ) ) ||
( ( $pv_browser_name == 'ie' ) && ( $pv_version_number >= 5.2 ) ) )
{
$os_working_number = 10;
}
break;
case 'iphone':
$os_working_number = 10;
break;
default:
break;
}
break;
}
/*
check that it's an array, check it's the second to last item
in the main os array, the unix one that is
*/
elseif ( is_array( $os_working_data ) && ( $i == ( $i_count - 2 ) ) )
{
$j_count = count($os_working_data);
for ($j = 0; $j < $j_count; $j++)
{
if ( strstr( $pv_browser_string, $os_working_data[$j] ) )
{
$os_working_type = 'unix'; //if the os is in the unix array, it's unix, obviously...
$os_working_number = ( $os_working_data[$j] != 'unix' ) ? $os_working_data[$j] : '';// assign sub unix version from the unix array
break;
}
}
}
/*
check that it's an array, check it's the last item
in the main os array, the linux one that is
*/
elseif ( is_array( $os_working_data ) && ( $i == ( $i_count - 1 ) ) )
{
$j_count = count($os_working_data);
for ($j = 0; $j < $j_count; $j++)
{
if ( strstr( $pv_browser_string, $os_working_data[$j] ) )
{
$os_working_type = 'lin';
// assign linux distro from the linux array, there's a default
//search for 'lin', if it's that, set version to ''
$os_working_number = ( $os_working_data[$j] != 'linux' ) ? $os_working_data[$j] : '';
break;
}
}
}
}
// pack the os data array for return to main function
$a_os_data = array( $os_working_type, $os_working_number );
return $a_os_data;
}
/*
Function Info:
function returns browser number, gecko rv number, or gecko release date
function get_item_version( $browser_user_agent, $search_string, $substring_length )
$pv_extra_search='' allows us to set an additional search/exit loop parameter, but we
only want this running when needed
*/
function get_item_version( $pv_browser_user_agent, $pv_search_string, $pv_b_break_last='', $pv_extra_search='' )
{
// 12 is the longest that will be required, handles release dates: 20020323; 0.8.0+
$substring_length = 15;
$start_pos = 0; // set $start_pos to 0 for first iteration
//initialize browser number, will return '' if not found
$string_working_number = '';
/*
use the passed parameter for $pv_search_string
start the substring slice right after these moz search strings
there are some cases of double msie id's, first in string and then with then number
$start_pos = 0;
this test covers you for multiple occurrences of string, only with ie though
with for example google bot you want the first occurance returned, since that's where the
numbering happens
*/
for ( $i = 0; $i < 4; $i++ )
{
//start the search after the first string occurrence
if ( strpos( $pv_browser_user_agent, $pv_search_string, $start_pos ) !== false )
{
// update start position if position found
$start_pos = strpos( $pv_browser_user_agent, $pv_search_string, $start_pos ) + strlen( $pv_search_string );
/*
msie (and maybe other userAgents requires special handling because some apps inject
a second msie, usually at the beginning, custom modes allow breaking at first instance
if $pv_b_break_last $pv_extra_search conditions exist. Since we only want this test
to run if and only if we need it, it's triggered by caller passing these values.
*/
if ( !$pv_b_break_last || ( $pv_extra_search && strstr( $pv_browser_user_agent, $pv_extra_search ) ) )
{
break;
}
}
else
{
break;
}
}
/*
Handles things like extra omniweb/v456, gecko/, blackberry9700
also corrects for the omniweb 'v'
*/
$start_pos += G::get_set_count( 'get' );
$string_working_number = substr( $pv_browser_user_agent, $start_pos, $substring_length );
// Find the space, ;, or parentheses that ends the number
$string_working_number = substr( $string_working_number, 0, strcspn($string_working_number, ' );/') );
//make sure the returned value is actually the id number and not a string
// otherwise return ''
// strcspn( $string_working_number, '0123456789.') == strlen( $string_working_number)
// if ( preg_match("/\\d/", $string_working_number) == 0 )
if ( !is_numeric( substr( $string_working_number, 0, 1 ) ) )
{
$string_working_number = '';
}
//$string_working_number = strrpos( $pv_browser_user_agent, $pv_search_string );
return $string_working_number;
}
function get_set_count( $pv_type, $pv_value='' )
{
static $slice_increment;
$return_value = '';
switch ( $pv_type )
{
case 'get':
// set if unset, ie, first use. note that empty and isset are not good tests here
if ( is_null( $slice_increment ) )
{
$slice_increment = 1;
}
$return_value = $slice_increment;
$slice_increment = 1; // reset to default
return $return_value;
break;
case 'set':
$slice_increment = $pv_value;
break;
}
}
/*
Special ID notes:
Novarra-Vision is a Content Transformation Server (CTS)
*/
function check_is_mobile( $pv_browser_user_agent )
{
$mobile_working_test = '';
/*
these will search for basic mobile hints, this should catch most of them, first check
known hand held device os, then check device names, then mobile browser names
This list is almost the same but not exactly as the 4 arrays in function below
*/
$a_mobile_search = array(
/*
Make sure to use only data here that always will be a mobile, so this list is not
identical to the list of get_mobile_data
*/
// os
'android', 'epoc', 'linux armv', 'palmos', 'palmsource', 'windows ce', 'windows phone os', 'symbianos', 'symbian os', 'symbian', 'webos',
// devices - ipod before iphone or fails
'benq', 'blackberry', 'danger hiptop', 'ddipocket', ' droid', 'ipad', 'ipod', 'iphone', 'kindle', 'lge-cx', 'lge-lx', 'lge-mx', 'lge vx', 'lge ', 'lge-', 'lg;lx', 'nintendo wii', 'nokia', 'palm', 'pdxgw', 'playstation', 'sagem', 'samsung', 'sec-sgh', 'sharp', 'sonyericsson', 'sprint', 'zune', 'j-phone', 'n410', 'mot 24', 'mot-', 'htc-', 'htc_', 'htc ', 'sec-', 'sie-m', 'sie-s', 'spv ', 'vodaphone', 'smartphone', 'armv', 'midp', 'mobilephone',
// browsers
'avantgo', 'blazer', 'elaine', 'eudoraweb', 'iemobile', 'minimo', 'mobile safari', 'mobileexplorer', 'opera mobi', 'opera mini', 'netfront', 'opwv', 'polaris', 'semc-browser', 'up.browser', 'webpro', 'wms pie', 'xiino',
// services - astel out of business
'astel', 'docomo', 'novarra-vision', 'portalmmm', 'reqwirelessweb', 'vodafone'
);
// then do basic mobile type search, this uses data from: get_mobile_data()
$j_count = count( $a_mobile_search );
for ($j = 0; $j < $j_count; $j++)
{
if ( strstr( $pv_browser_user_agent, $a_mobile_search[$j] ) )
{
$mobile_working_test = $a_mobile_search[$j];
break;
}
}
return $mobile_working_test;
}
/*
thanks to this page: http://www.zytrax.com/tech/web/mobile_ids.html
for data used here
*/
function get_mobile_data( $pv_browser_user_agent )
{
$mobile_browser = '';
$mobile_browser_number = '';
$mobile_device = '';
$mobile_device_number = '';
$mobile_os = ''; // will usually be null, sorry
$mobile_os_number = '';
$mobile_server = '';
$mobile_server_number = '';
// browsers, show it as a handheld, but is not the os
$a_mobile_browser = array( 'avantgo', 'blazer', 'elaine', 'eudoraweb', 'iemobile', 'minimo', 'mobile safari', 'mobileexplorer', 'opera mobi', 'opera mini', 'netfront', 'opwv', 'polaris', 'semc-browser', 'up.browser', 'webpro', 'wms pie', 'xiino' );
/*
This goes from easiest to detect to hardest, so don't use this for output unless you
clean it up more is my advice.
Special Notes: do not include milestone in general mobile type test above, it's too generic
*/
$a_mobile_device = array( 'benq', 'blackberry', 'danger hiptop', 'ddipocket', ' droid', 'htc_dream', 'htc espresso', 'htc hero', 'htc halo', 'htc huangshan', 'htc legend', 'htc liberty', 'htc paradise', 'htc supersonic', 'htc tattoo', 'ipad', 'ipod', 'iphone', 'kindle', 'lge-cx', 'lge-lx', 'lge-mx', 'lge vx', 'lg;lx', 'nintendo wii', 'nokia', 'palm', 'pdxgw', 'playstation', 'sagem', 'samsung', 'sec-sgh', 'sharp', 'sonyericsson', 'sprint', 'zunehd', 'zune', 'j-phone', 'milestone', 'n410', 'mot 24', 'mot-', 'htc-', 'htc_', 'htc ', 'lge ', 'lge-', 'sec-', 'sie-m', 'sie-s', 'spv ', 'smartphone', 'armv', 'midp', 'mobilephone' );
/*
note: linux alone can't be searched for, and almost all linux devices are armv types
ipad 'cpu os' is how the real os number is handled
*/
$a_mobile_os = array( 'android', 'epoc', 'cpu os', 'iphone os', 'palmos', 'palmsource', 'windows phone os', 'windows ce', 'symbianos', 'symbian os', 'symbian', 'webos', 'linux armv' );
// sometimes there is just no other id for the unit that the CTS type service/server
$a_mobile_server = array( 'astel', 'docomo', 'novarra-vision', 'portalmmm', 'reqwirelessweb', 'vodafone' );
$k_count = count( $a_mobile_browser );
for ( $k = 0; $k < $k_count; $k++ )
{
if ( strstr( $pv_browser_user_agent, $a_mobile_browser[$k] ) )
{
$mobile_browser = $a_mobile_browser[$k];
// this may or may not work, highly unreliable because mobile ua strings are random
$mobile_browser_number = G::get_item_version( $pv_browser_user_agent, $mobile_browser );
break;
}
}
$k_count = count( $a_mobile_device );
for ( $k = 0; $k < $k_count; $k++ )
{
if ( strstr( $pv_browser_user_agent, $a_mobile_device[$k] ) )
{
$mobile_device = trim ( $a_mobile_device[$k], '-_' ); // but not space trims yet
if ( $mobile_device == 'blackberry' )
{
G::get_set_count( 'set', 0 );
}
$mobile_device_number = G::get_item_version( $pv_browser_user_agent, $mobile_device );
$mobile_device = trim( $mobile_device ); // some of the id search strings have white space
break;
}
}
$k_count = count( $a_mobile_os );
for ( $k = 0; $k < $k_count; $k++ )
{
if ( strstr( $pv_browser_user_agent, $a_mobile_os[$k] ) )
{
$mobile_os = $a_mobile_os[$k];
// this may or may not work, highly unreliable
$mobile_os_number = str_replace( '_', '.', G::get_item_version( $pv_browser_user_agent, $mobile_os ) );
break;
}
}
$k_count = count( $a_mobile_server );
for ( $k = 0; $k < $k_count; $k++ )
{
if ( strstr( $pv_browser_user_agent, $a_mobile_server[$k] ) )
{
$mobile_server = $a_mobile_server[$k];
// this may or may not work, highly unreliable
$mobile_server_number = G::get_item_version( $pv_browser_user_agent, $mobile_server );
break;
}
}
// just for cases where we know it's a mobile device already
if ( !$mobile_os && ( $mobile_browser || $mobile_device || $mobile_server ) && strstr( $pv_browser_user_agent, 'linux' ) )
{
$mobile_os = 'linux';
$mobile_os_number = G::get_item_version( $pv_browser_user_agent, 'linux' );
}
$a_mobile_data = array( $mobile_device, $mobile_browser, $mobile_browser_number, $mobile_os, $mobile_os_number, $mobile_server, $mobile_server_number, $mobile_device_number );
return $a_mobile_data;
}
// track total script execution time
function script_time()
{
static $script_time;
$elapsed_time = '';
/*
note that microtime(true) requires php 5 or greater for microtime(true)
*/
if ( sprintf("%01.1f", phpversion() ) >= 5 ) {
if ( is_null( $script_time) ) {
$script_time = microtime(true);
}
else {
// note: (string)$var is same as strval($var)
// $elapsed_time = (string)( microtime(true) - $script_time );
$elapsed_time = ( microtime(true) - $script_time );
$elapsed_time = sprintf("%01.8f", $elapsed_time );
$script_time = NULL; // can't unset a static variable
return $elapsed_time;
}
}
}
function getDirectorySize($path,$maxmtime=0)
{
$totalsize = 0;
$totalcount = 0;
$dircount = 0;
if ($handle = opendir ($path))
{
while (false !== ($file = readdir($handle)))
{
$nextpath = $path . '/' . $file;
if ($file != '.' && $file != '..' && !is_link ($nextpath) && $file != '.svn')
{
if (is_dir ($nextpath))
{
$dircount++;
$result = G::getDirectorySize($nextpath,$maxmtime);
$totalsize += $result['size'];
$totalcount += $result['count'];
$dircount += $result['dircount'];
$maxmtime=$result['maxmtime']>$maxmtime?$result['maxmtime']:$maxmtime;
}
elseif (is_file ($nextpath))
{
$totalsize += filesize ($nextpath);
$totalcount++;
$mtime = filemtime($nextpath);
if($mtime>$maxmtime) $maxmtime=$mtime;
}
}
}
}
closedir ($handle);
$total['size'] = $totalsize;
$total['count'] = $totalcount;
$total['dircount'] = $dircount;
$total['maxmtime'] = $maxmtime;
return $total;
}
2010-12-02 23:34:41 +00:00
};
/**
* eprint
*
* @param string $s default value ''
* @param string $c default value null
*
* @return void
*/
2010-12-02 23:34:41 +00:00
function eprint($s = "", $c = null){
if( G::isHttpRequest() ){
if(isset($c)){
echo "<pre style='color:$c'>$s</pre>";
} else
2010-12-02 23:34:41 +00:00
echo "<pre>$s</pre>";
} else {
if(isset($c)){
switch($c){
case 'green':
printf("\033[0;35;32m$s\033[0m");
return;
case 'red':
printf("\033[0;35;31m$s\033[0m");
return;
case 'blue':
printf("\033[0;35;34m$s\033[0m");
return;
default: print "$s";
}
} else
2010-12-02 23:34:41 +00:00
print "$s";
}
}
/**
* println
*
* @param string $s
*
* @return eprintln($s)
*/
2010-12-02 23:34:41 +00:00
function println($s){
return eprintln($s);
}
/**
* eprintln
*
* @param string $s
* @param string $c
*
* @return void
*/
2010-12-02 23:34:41 +00:00
function eprintln($s="", $c=null){
if( G::isHttpRequest() ){
if(isset($c)){
echo "<pre style='color:$c'>$s</pre>";
} else
2010-12-02 23:34:41 +00:00
echo "<pre>$s</pre>";
} else {
if(isset($c) && (PHP_OS != 'WINNT')){
2010-12-02 23:34:41 +00:00
switch($c){
case 'green':
printf("\033[0;35;32m$s\033[0m\n");
return;
case 'red':
printf("\033[0;35;31m$s\033[0m\n");
return;
case 'blue':
printf("\033[0;35;34m$s\033[0m\n");
return;
}
}
print "$s\n";
}
2010-12-02 23:34:41 +00:00
}
function __($msgID , $lang = SYS_LANG, $data = null)
{
return G::LoadTranslation($msgID, $lang, $data);
}