home *** CD-ROM | disk | FTP | other *** search
/ Chip 2004 April / CMCD0404.ISO / Software / Freeware / Programare / dotproject / includes / main_functions.php < prev    next >
PHP Script  |  2004-01-22  |  12KB  |  429 lines

  1. <?php /* INCLUDES $Id: main_functions.php,v 1.57 2004/01/21 23:18:15 ajdonnison Exp $ */
  2. ##
  3. ## Global General Purpose Functions
  4. ##
  5.  
  6. $CR = "\n";
  7. define('SECONDS_PER_DAY', 60 * 60 * 24);
  8.  
  9. ##
  10. ## Returns the best color based on a background color (x is cross-over)
  11. ##
  12. function bestColor( $bg, $lt='#ffffff', $dk='#000000' ) {
  13. // cross-over color = x
  14.     $x = 128;
  15.     $r = hexdec( substr( $bg, 0, 2 ) );
  16.     $g = hexdec( substr( $bg, 2, 2 ) );
  17.     $b = hexdec( substr( $bg, 4, 2 ) );
  18.  
  19.     if ($r < $x && $g < $x || $r < $x && $b < $x || $b < $x && $g < $x) {
  20.         return $lt;
  21.     } else {
  22.         return $dk;
  23.     }
  24. }
  25.  
  26. ##
  27. ## returns a select box based on an key,value array where selected is based on key
  28. ##
  29. function arraySelect( &$arr, $select_name, $select_attribs, $selected, $translate=false ) {
  30.     GLOBAL $AppUI;
  31.     reset( $arr );
  32.     $s = "\n<select name=\"$select_name\" $select_attribs>";
  33.     foreach ($arr as $k => $v ) {
  34.         if ($translate) {
  35.             $v = @$AppUI->_( $v );
  36.             // This is supplied to allow some Hungarian characters to
  37.             // be translated correctly. There are probably others.
  38.             // As such a more general approach probably based upon an
  39.             // array lookup for replacements would be a better approach. AJD.
  40.             $v=str_replace('ű','√',$v);
  41.             $v=str_replace('ő','⌡',$v);
  42.         }
  43.         $s .= "\n\t<option value=\"".$k."\"".($k == $selected ? " selected=\"selected\"" : '').">" . dPformSafe( $v ) . "</option>";
  44.     }
  45.     $s .= "\n</select>\n";
  46.     return $s;
  47. }
  48.  
  49. ##
  50. ## returns a select box based on an key,value array where selected is based on key
  51. ##
  52. function arraySelectTree( &$arr, $select_name, $select_attribs, $selected, $translate=false ) {
  53.     GLOBAL $AppUI;
  54.     reset( $arr );
  55.  
  56.     $children = array();
  57.     // first pass - collect children
  58.     foreach ($arr as $k => $v ) {
  59.         $id = $v[0];
  60.         $pt = $v[2];
  61.         $list = @$children[$pt] ? $children[$pt] : array();
  62.         array_push($list, $v);
  63.         $children[$pt] = $list;
  64.     }
  65.     $list = tree_recurse($arr[0][2], '', array(), $children);
  66.     return arraySelect( $list, $select_name, $select_attribs, $selected, $translate );
  67. }
  68.  
  69. function tree_recurse($id, $indent, $list, $children) {
  70.     if (@$children[$id]) {
  71.         foreach ($children[$id] as $v) {
  72.             $id = $v[0];
  73.             $txt = $v[1];
  74.             $pt = $v[2];
  75.             $list[$id] = "$indent $txt";
  76.             $list = tree_recurse($id, "$indent--", $list, $children);
  77.         }
  78.     }
  79.     return $list;
  80. }
  81.  
  82. ##
  83. ## Merges arrays maintaining/overwriting shared numeric indicees
  84. ##
  85. function arrayMerge( $a1, $a2 ) {
  86.     foreach ($a2 as $k => $v) {
  87.         $a1[$k] = $v;
  88.     }
  89.     return $a1;
  90. }
  91.  
  92. ##
  93. ## breadCrumbs - show a colon separated list of bread crumbs
  94. ## array is in the form url => title
  95. ##
  96. function breadCrumbs( &$arr ) {
  97.     GLOBAL $AppUI;
  98.     $crumbs = array();
  99.     foreach ($arr as $k => $v) {
  100.         $crumbs[] = "<a href=\"$k\">".$AppUI->_( $v )."</a>";
  101.     }
  102.     return implode( ' <strong>:</strong> ', $crumbs );
  103. }
  104. ##
  105. ## generate link for context help -- old version
  106. ##
  107. function contextHelp( $title, $link='' ) {
  108.     return dPcontextHelp( $title, $link );
  109. }
  110.  
  111. function dPcontextHelp( $title, $link='' ) {
  112.     global $AppUI;
  113.     return "<a href=\"#$link\" onClick=\"javascript:window.open('?m=help&dialog=1&hid=$link', 'contexthelp', 'width=400, height=400, left=50, top=50, scrollbars=yes, resizable=yes')\">".$AppUI->_($title)."</a>";
  114. }
  115.  
  116. ##
  117. ## displays the configuration array of a module for informational purposes
  118. ##
  119. function dPshowModuleConfig( $config ) {
  120.     GLOBAL $AppUI;
  121.     $s = '<table cellspacing="2" cellpadding="2" border="0" class="std" width="50%">';
  122.     $s .= '<tr><th colspan="2">'.$AppUI->_( 'Module Configuration' ).'</th></tr>';
  123.     foreach ($config as $k => $v) {
  124.         $s .= '<tr><td width="50%">'.$AppUI->_( $k ).'</td><td width="50%" class="hilite">'.$AppUI->_( $v ).'</td></tr>';
  125.     }
  126.     $s .= '</table>';
  127.     return ($s);
  128. }
  129.  
  130. /**
  131.  *    Function to recussively find an image in a number of places
  132.  *    @param string The name of the image
  133.  *    @param string Optional name of the current module
  134.  */
  135. function dPfindImage( $name, $module=null ) {
  136. // uistyle must be declared globally
  137.     global $AppUI, $uistyle;
  138.  
  139.     if (file_exists( "{$AppUI->cfg['root_dir']}/style/$uistyle/images/$name" )) {
  140.         return "./style/$uistyle/images/$name";
  141.     } else if ($module && file_exists( "{$AppUI->cfg['root_dir']}/modules/$module/images/$name" )) {
  142.         return "./modules/$module/images/$name";
  143.     } else if (file_exists( "{$AppUI->cfg['root_dir']}/images/icons/$name" )) {
  144.         return "./images/icons/$name";
  145.     } else if (file_exists( "{$AppUI->cfg['root_dir']}/images/obj/$name" )) {
  146.         return "./images/obj/$name";
  147.     } else {
  148.         return "./images/$name";
  149.     }
  150. }
  151.  
  152. /**
  153.  *    Workaround removed due to problems in Opera and other issues
  154.  *    with IE6.
  155.  *    Workaround to display png images with alpha-transparency in IE6.0
  156.  *    @param string The name of the image
  157.  *    @param string The image width
  158.  *    @param string The image height
  159.  *    @param string The alt text for the image
  160.  */
  161. function dPshowImage( $src, $wid='', $hgt='', $alt='' ) {
  162.     /*
  163.     if (strpos( $src, '.png' ) > 0 && strpos( $_SERVER['HTTP_USER_AGENT'], 'MSIE 6.0' ) !== false) {
  164.         return "<div style=\"height:{$hgt}px; width:{$wid}px; filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='$src', sizingMethod='scale');\" ></div>";
  165.     } else {
  166.     */
  167.         return "<img src=\"$src\" width=\"$wid\" height=\"$hgt\" alt=\"$alt\" border=\"0\" />";
  168.     // }
  169. }
  170.  
  171. #
  172. # function to return a default value if a variable is not set
  173. #
  174.  
  175. function defVal($var, $def) {
  176.     return isset($var) ? $var : $def;
  177. }
  178.  
  179. /**
  180. * Utility function to return a value from a named array or a specified default
  181. */
  182. function dPgetParam( &$arr, $name, $def=null ) {
  183.     return isset( $arr[$name] ) ? $arr[$name] : $def;
  184. }
  185.  
  186. #
  187. # add history entries for tracking changes
  188. #
  189.  
  190. function addHistory( $description, $project_id = 0, $module_id = 0) {
  191.     global $AppUI;
  192.     /*
  193.      * TODO:
  194.      * 1) description should be something like:
  195.      *         command(arg1, arg2...)
  196.      *  for example:
  197.      *         new_forum('Forum Name', 'URL')
  198.      *
  199.      * This way, the history module will be able to display descriptions
  200.      * using locale definitions:
  201.      *         "new_forum" -> "New forum '%s' was created" -> "Se ha creado un nuevo foro llamado '%s'"
  202.      *
  203.      * 2) project_id and module_id should be provided in order to filter history entries
  204.      *
  205.      */
  206.     if(!$AppUI->cfg['log_changes']) return;
  207.     $description = str_replace("'", "\'", $description);
  208.     $hsql = "select * from modules where mod_name = 'History' and mod_active = 1";
  209.     $qid = db_exec($hsql);
  210.  
  211.     if (! $qid || db_num_rows($qid) == 0) {
  212.       $AppUI->setMsg("History module is not loaded, but your config file has requested that changes be logged.  You must either change the config file or install and activate the history module to log changes.", UI_MSG_ALERT);
  213.       return;
  214.     }
  215.  
  216.     $psql =    "INSERT INTO history " .
  217.             "( history_description, history_user, history_date ) " .
  218.               " VALUES ( '$description', " . $AppUI->user_id . ", now() )";
  219.     db_exec($psql);
  220.     echo db_error();
  221. }
  222.  
  223. ##
  224. ## Looks up a value from the SYSVALS table
  225. ##
  226. function dPgetSysVal( $title ) {
  227.     $sql = "
  228.     SELECT syskey_type, syskey_sep1, syskey_sep2, sysval_value
  229.     FROM sysvals,syskeys
  230.     WHERE sysval_title = '$title'
  231.         AND syskey_id = sysval_key_id
  232.     ";
  233.     db_loadHash( $sql, $row );
  234. // type 0 = list
  235.     $sep1 = $row['syskey_sep1'];    // item separator
  236.     $sep2 = $row['syskey_sep2'];    // alias separator
  237.  
  238.     // A bit of magic to handle newlines and returns as separators
  239.     // Missing sep1 is treated as a newline.
  240.     if (!isset($sep1))
  241.       $sep1 = "\n";
  242.     if ($sep1 == "\\n")
  243.       $sep1 = "\n";
  244.     if ($sep1 == "\\r")
  245.       $sep1 = "\r";
  246.  
  247.     $temp = explode( $sep1, $row['sysval_value'] );
  248.     $arr = array();
  249.     // We use trim() to make sure a numeric that has spaces
  250.     // is properly treated as a numeric
  251.     foreach ($temp as $item) {
  252.         if($item) {
  253.             $temp2 = explode( $sep2, $item );
  254.             if (isset( $temp2[1] )) {
  255.                 $arr[trim($temp2[0])] = $temp2[1];
  256.             } else {
  257.                 $arr[trim($temp2[0])] = $temp2[0];
  258.             }
  259.         }
  260.     }
  261.     return $arr;
  262. }
  263.  
  264. function dPuserHasRole( $name ) {
  265.     global $AppUI;
  266.     $uid = $AppUI->user_id;
  267.     $sql = "SELECT r.role_id FROM roles AS r,user_roles AS ur WHERE ur.user_id=$uid AND ur.role_id=r.role_id AND r.role_name='$name'";
  268.     return db_loadResult( $sql );
  269. }
  270.  
  271. function dPformatDuration($x) {
  272.     global $dPconfig;
  273.     global $AppUI;
  274.     $dur_day = floor($x / $dPconfig['daily_working_hours']);
  275.     //$dur_hour = fmod($x, $dPconfig['daily_working_hours']);
  276.     $dur_hour = $x - $dur_day*$dPconfig['daily_working_hours'];
  277.     $str = '';
  278.     if ($dur_day > 1) {
  279.         $str .= $dur_day .' '. $AppUI->_('days'). ' ';
  280.     } elseif ($dur_day == 1) {
  281.         $str .= $dur_day .' '. $AppUI->_('day'). ' ';
  282.     }
  283.  
  284.     if ($dur_hour > 1 ) {
  285.         $str .= $dur_hour .' '. $AppUI->_('hours');
  286.     } elseif ($dur_hour > 0 and $dur_hour <= 1) {
  287.         $str .= $dur_hour .' '. $AppUI->_('hour');
  288.     }
  289.  
  290.     if ($str == '') {
  291.         $str = $AppUI->_("n/a");
  292.     }
  293.  
  294.     return $str;
  295.  
  296. }
  297.  
  298. /**
  299. */
  300. function dPsetMicroTime() {
  301.     global $microTimeSet;
  302.     list($usec, $sec) = explode(" ",microtime());
  303.     $microTimeSet = (float)$usec + (float)$sec;
  304. }
  305.  
  306. /**
  307. */
  308. function dPgetMicroDiff() {
  309.     global $microTimeSet;
  310.     $mt = $microTimeSet;
  311.     dPsetMicroTime();
  312.     return sprintf( "%.3f", $microTimeSet - $mt );
  313. }
  314.  
  315. /**
  316. * Make text safe to output into double-quote enclosed attirbutes of an HTML tag
  317. */
  318. function dPformSafe( $txt, $deslash=false ) {
  319.     if (is_object( $txt )) {
  320.         foreach (get_object_vars($txt) as $k => $v) {
  321.             if ($deslash) {
  322.                 $obj->$k = htmlspecialchars( stripslashes( $v ) );
  323.             } else {
  324.                 $obj->$k = htmlspecialchars( $v );
  325.             }
  326.         }
  327.     } else if (is_array( $txt )) {
  328.         foreach ($txt as $k=>$v) {
  329.             if ($deslash) {
  330.                 $txt[$k] = htmlspecialchars( stripslashes( $v ) );
  331.             } else {
  332.                 $txt[$k] = htmlspecialchars( $v );
  333.             }
  334.         }
  335.     } else {
  336.         if ($deslash) {
  337.             $txt = htmlspecialchars( stripslashes( $txt ) );
  338.         } else {
  339.             $txt = htmlspecialchars( $txt );
  340.         }
  341.     }
  342.     return $txt;
  343. }
  344.  
  345. function convert2days( $durn, $units ) {
  346.     global $AppUI;
  347.     switch ($units) {
  348.     case 0:
  349.         return $durn / $AppUI->cfg['daily_working_hours'];
  350.         break;
  351.     case 24:
  352.         return $durn;
  353.     }
  354. }
  355.  
  356. function formatTime( $uts ) {
  357.     global $AppUI;
  358.     $date = new CDate();
  359.     $date->setDate($uts, DATE_FORMAT_UNIXTIME);    
  360.     return $date->format( $AppUI->getPref('SHDATEFORMAT') );
  361. }
  362.  
  363. function formatCurrency( $number, $format ) {
  364.     if (!$format) {
  365.         $format = $AppUI->getPref('SHCURRFORMAT');
  366.     }
  367.     setlocale(LC_MONETARY, $format);
  368.     if (function_exists('money_format'))
  369.         return money_format('%i', $number);
  370.  
  371.     // NOTE: This is called if money format doesn't exist.
  372.     // Money_format only exists on non-windows 4.3.x sites.
  373.     // This uses localeconv to get the information required
  374.     // to format the money.  It tries to set reasonable defaults.
  375.     $mondat = localeconv();
  376.     if (! isset($mondat['int_frac_digits']))
  377.         $mondat['int_frac_digits'] = 2;
  378.     if (! isset($mondat['int_curr_symbol']))
  379.         $mondat['int_curr_symbol'] = '';
  380.     if (! isset($mondat['mon_decimal_point']))
  381.         $mondat['mon_decimal_point'] = '.';
  382.     if (! isset($mondat['mon_thousands_sep']))
  383.         $mondat['mon_thousands_sep'] = ',';
  384.     $numeric_portion = number_format(abs($number),
  385.         $mondat['int_frac_digits'],
  386.         $mondat['mon_decimal_point'],
  387.         $mondat['mon_thousands_sep']);
  388.     // Not sure, but most countries don't put the sign in if it is positive.
  389.     $letter='p';
  390.     $currency_prefix="";
  391.     $currency_suffix="";
  392.     $prefix="";
  393.     $suffix="";
  394.     if ($number < 0) {
  395.         $sign = $mondat['negative_sign'];
  396.         $letter = 'n';
  397.         switch ($mondat['n_sign_posn']) {
  398.             case 0:
  399.                 $prefix="(";
  400.                 $suffix=")";
  401.                 break;
  402.             case 1:
  403.                 $prefix = $sign;
  404.                 break;
  405.             case 2:
  406.                 $suffix = $sign;
  407.                 break;
  408.             case 3:
  409.                 $currency_prefix = $sign;
  410.                 break;
  411.             case 4:
  412.                 $currency_suffix = $sign;
  413.                 break;
  414.         }
  415.     }
  416.     $currency .= $currency_prefix . $mondat['int_curr_symbol'] . $currency_suffix;
  417.     $space = "";
  418.     if ($mondat[$letter . "_sep_by_space"])
  419.         $space = " ";
  420.     if ($mondat[$letter . "_cs_precedes"]) {
  421.         $result = "$currency$space$numeric_portion";
  422.     } else {
  423.         $result = "$numeric_portion$space$currency";
  424.     }
  425.     return $result;
  426. }
  427.  
  428. ?>
  429.