* * and Joseph Engo * * and Mark Peters * * and Bettina Gille [ceb@phpgroupware.org] * * Commononly used functions by phpGroupWare developers * * Copyright (C) 2000, 2001 Dan Kuykendall * * Copyright (C) 2002, 2003 Dan Kuykendall, Bettina Gille * * ------------------------------------------------------------------------ * * This library is part of the phpGroupWare API * * http://www.phpgroupware.org * * ------------------------------------------------------------------------ * * This library is free software; you can redistribute it and/or modify it * * under the terms of the GNU Lesser General Public License as published by * * the Free Software Foundation; either version 2.1 of the License, * * or any later version. * * This library 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * * along with this library; if not, write to the Free Software Foundation, * * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \**************************************************************************/ /* $Id$ */ $d1 = strtolower(@substr(PHPGW_API_INC,0,3)); $d2 = strtolower(@substr(PHPGW_SERVER_ROOT,0,3)); $d3 = strtolower(@substr(PHPGW_APP_INC,0,3)); if($d1 == 'htt' || $d1 == 'ftp' || $d2 == 'htt' || $d2 == 'ftp' || $d3 == 'htt' || $d3 == 'ftp') { echo 'Failed attempt to break in via an old Security Hole!
'."\n"; exit; } unset($d1);unset($d2);unset($d3); /*! @class common @abstract common class that contains commonly used functions */ class common { var $debug_info; // An array with debugging info from the API var $found_files; var $output; function common() { $this->output = array(); } /*! @function cmp_version @abstract Compares two Version strings and return 1 if str2 is newest (bigger version number) than str1 @discussion This function checks for major version only. @param $str1 @param $str2 */ function cmp_version($str1,$str2,$debug=False) { ereg("([0-9]+)\.([0-9]+)\.([0-9]+)[a-zA-Z]*([0-9]*)",$str1,$regs); ereg("([0-9]+)\.([0-9]+)\.([0-9]+)[a-zA-Z]*([0-9]*)",$str2,$regs2); if($debug) { echo '
cmp_version(' . $str1 . ',' . $str2 . ')'; echo "
$regs[0] - $regs2[0]"; } for($i=1;$i<5;$i++) { if($debug) { echo "
$i: $regs[$i] - $regs2[$i]"; } if($regs2[$i] == $regs[$i]) { if($debug) { echo ' are equal...'; } continue; } if($regs2[$i] > $regs[$i]) { if($debug) { echo ', and a < b. Returning 1.'; } return 1; } elseif($regs2[$i] < $regs[$i]) { if($debug) { echo ', and a > b. Returning 0.'; } return 0; } } if($debug) { echo ' - all equal. Returning NULL.'; return ''; } } /*! @function cmp_version_long @abstract Compares two Version strings and return 1 if str2 is newest (bigger version number) than str1 @discussion This function checks all fields. cmp_version() checks release version only. @param $str1 @param $str2 */ function cmp_version_long($str1,$str2,$debug=False) { ereg("([0-9]+)\.([0-9]+)\.([0-9]+)[a-zA-Z]*([0-9]*)\.([0-9]*)",$str1,$regs); ereg("([0-9]+)\.([0-9]+)\.([0-9]+)[a-zA-Z]*([0-9]*)\.([0-9]*)",$str2,$regs2); if($debug) { echo '
cmp_version_long(' . $str1 . ',' . $str2 . ')'; echo "
$regs[0] - $regs2[0]"; } if(!$regs[0]) { if($debug) { echo '
calling cmp_version(' . $str1 . ',' . $str2 . ')'; } return $this->cmp_version($str1,$str2,$debug); } for($i=1;$i<6;$i++) { if($debug) { echo "
$i: $regs[$i] - $regs2[$i]"; } if($regs2[$i] == $regs[$i]) { if($debug) { echo ' are equal...'; } continue; } if($regs2[$i] > $regs[$i]) { if($debug) { echo ', and a < b. Returning 1.'; } return 1; } elseif($regs2[$i] < $regs[$i]) { if($debug) { echo ', and a > b. Returning 0.'; } return 0; } } if($debug) { echo ' - all equal. Returning NULL.'; return ''; } } // Convert an array into the format needed for the access column. /*! @function array_to_string @abstract Convert an array into the format needed for the access column @param $access @param $array */ function array_to_string($access,$array) { $this->debug_info[] = 'array_to_string() is a depreciated function - use ACL instead'; $s = ''; if ($access == 'group' || $access == 'public' || $access == 'none') { if (count($array)) { while ($t = each($array)) { $s .= ',' . $t[1]; } $s .= ','; } if (! count($array) && $access == 'none') { $s = ''; } } return $s; } // This is used for searching the access fields /*! @function sql_search @abstract this function is used for searching the access fields @param $table @param $owner */ function sql_search($table,$owner=0) { $this->debug_info[] = 'sql_search() is a deprecated function - use ACL instead'; $s = ''; if (!$owner) { $owner = $GLOBALS['phpgw_info']['user']['account_id']; } $groups = $GLOBALS['phpgw']->accounts->membership(intval($owner)); if (gettype($groups) == 'array') { while ($group = each($groups)) { $s .= " or $table like '%," . $group[2] . ",%'"; } } return $s; } // return a array of installed languages /*! @function getInstalledLanguages @abstract return an array of installed languages @result $installedLanguages; an array containing the installed languages */ function getInstalledLanguages() { $GLOBALS['phpgw']->db->query('select distinct lang from phpgw_lang'); while (@$GLOBALS['phpgw']->db->next_record()) { $installedLanguages[$GLOBALS['phpgw']->db->f('lang')] = $GLOBALS['phpgw']->db->f('lang'); } return $installedLanguages; } // return the preferred language of the users // it's using HTTP_ACCEPT_LANGUAGE (send from the users browser) // and ...(to find out which languages are installed) /*! @function getPreferredLanguage @abstract return the preferred langugae of the users @discussion it uses HTTP_ACCEPT_LANGUAGE (from the users browser)
and .... to find out which languages are installed */ function getPreferredLanguage() { // create a array of languages the user is accepting $userLanguages = explode(',',$GLOBALS['HTTP_ACCEPT_LANGUAGE']); $supportedLanguages = $this->getInstalledLanguages(); // find usersupported language while (list($key,$value) = each($userLanguages)) { // remove everything behind '-' example: de-de $value = trim($value); $pieces = explode('-', $value); $value = $pieces[0]; # print 'current lang $value
'; if ($supportedLanguages[$value]) { $retValue=$value; break; } } // no usersupported language found -> return english if (empty($retValue)) { $retValue='en'; } return $retValue; } // connect to the ldap server and return a handle /*! @function ldapConnect @abstract connect to the ldap server and return a handle @param $host ldap host @param $dn ldap_root_dn @param $passwd ldap_root_pw */ function ldapConnect($host = '', $dn = '', $passwd = '') { if (! $host) { $host = $GLOBALS['phpgw_info']['server']['ldap_host']; } if (! $dn) { $dn = $GLOBALS['phpgw_info']['server']['ldap_root_dn']; } if (! $passwd) { $passwd = $GLOBALS['phpgw_info']['server']['ldap_root_pw']; } // connect to ldap server if (! $ds = ldap_connect($host)) { /* log does not exist in setup(, yet) */ if(is_object($GLOBALS['phpgw']->log)) { $GLOBALS['phpgw']->log->message('F-Abort, Failed connecting to LDAP server'); $GLOBALS['phpgw']->log->commit(); } printf("Error: Can't connect to LDAP server %s!
",$host); return False; } // bind as admin, we not to able to do everything if (! ldap_bind($ds,$dn,$passwd)) { if(is_object($GLOBALS['phpgw']->log)) { $GLOBALS['phpgw']->log->message('F-Abort, Failed binding to LDAP server'); $GLOBALS['phpgw']->log->commit(); } printf("Error: Can't bind to LDAP server: %s!
",$dn); return False; } return $ds; } /*! @function randomstring @abstract return a random string of size $size @param $size int-size of random string to return */ function randomstring($size) { $s = ''; srand((double)microtime()*1000000); $random_char = 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','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'); for ($i=0; $i<$size; $i++) { $s .= $random_char[rand(1,61)]; } return $s; } // Look at the note towards the top of this file (jengo) function filesystem_separator() { return filesystem_separator(); } /*! @function error_list @abstract This is used for reporting errors in a nice format. @param $error - array of errors */ function error_list($errors,$text='Error') { if (! is_array($errors)) { return False; } if ($text == 'Error') { $text = ''; } else { $text .= ': '; } reset($errors); while(list(,$value) = each($errors)) { $msgbox_input[$text.$value] = False; } return $this->msgbox($msgbox_input); } /*! @function check_owner @abstract none yet @param $record ? @param $link ? @param $label ? @param $extravars */ // This is a depreciated function - use ACL instead (jengo) function check_owner($record,$link,$label,$extravars = '') { $this->debug_info[] = 'check_owner() is a depreciated function - use ACL instead'; $s = ' ' . lang($label) . ' '; if (ereg('^[0-9]+$',$record)) { if ($record != $GLOBALS['phpgw_info']['user']['account_id']) { $s = ' '; } } else { if ($record != $GLOBALS['phpgw_info']['user']['userid']) { $s = ' '; } } return $s; } /*! @function display_fullname @abstract return the fullname of a user @param $lid account loginid @param $firstname firstname @param $lastname lastname */ function display_fullname($lid = '', $firstname = '', $lastname = '') { if (! $lid && ! $firstname && ! $lastname) { $lid = $GLOBALS['phpgw_info']['user']['account_lid']; $firstname = $GLOBALS['phpgw_info']['user']['firstname']; $lastname = $GLOBALS['phpgw_info']['user']['lastname']; } $display = $GLOBALS['phpgw_info']['user']['preferences']['common']['account_display']; if (!$firstname && !$lastname || $display == 'username') { return $lid; } if ($lastname) { $a[] = $lastname; } if ($firstname) { $a[] = $firstname; } $name = ''; switch($display) { case 'all': if ($lid) { $name = '['.$lid.'] '; } // fall-through case 'lastname': $name .= implode(', ',$a); break; case 'firstall': if ($lid) { $name = ' ['.$lid.']'; } // fall-through case 'firstname': default: $name = $firstname . ' ' . $lastname . $name; break; } return $name; } /*! @function grab_owner_name @abstract grab the owner name @param $id account id */ function grab_owner_name($accountid = '') { $GLOBALS['phpgw']->accounts->get_account_name($accountid,$lid,$fname,$lname); return $this->display_fullname($lid,$fname,$lname); } /*! @function create_tabs @abstract create tabs @param $tabs ? @param $selected ? @param $fontsize optional */ function create_tabs($tabs, $selected) { $output_text = ''; /* This is a php3 workaround if(PHPGW_IMAGES_DIR == 'PHPGW_IMAGES_DIR') { $ir = ExecMethod('phpgwapi.phpgw.common.get_image_path', 'phpgwapi'); } else { $ir = PHPGW_IMAGES_DIR; } */ $i = 1; while ($tab = each($tabs)) { if ($tab[0] == $selected) { if ($i == 1) { $output_text .= ''; } $output_text .= ''; if ($i == count($tabs)) { $output_text .= ''; } else { $output_text .= ''; } } else { if ($i == 1) { $output_text .= ''; } $output_text .= ''; if (($i + 1) == $selected) { $output_text .= ''; } elseif ($i == $selected || $i != count($tabs)) { $output_text .= ''; } elseif ($i == count($tabs)) { if ($i == $selected) { $output_text .= ''; } else { $output_text .= ''; } } else { if ($i != count($tabs)) { $output_text .= ''; } } } $i++; $output_text .= "\n"; } $output_text .= "
 ' . $fs . $tab[1]['label'] . $fse . '  ' . $fs . $tab[1]['label'] . $fse . ' 
\n"; return $output_text; } /*! @function get_app_dir @abstract get directory of application @discussion $appname can either be passed or derived from $phpgw_info['flags']['currentapp']; @param $appname name of application */ function get_app_dir($appname = '') { if ($appname == '') { $appname = $GLOBALS['phpgw_info']['flags']['currentapp']; } if ($appname == 'home' || $appname == 'logout' || $appname == 'login') { $appname = 'phpgwapi'; } $appdir = PHPGW_INCLUDE_ROOT . '/'.$appname; $appdir_default = PHPGW_SERVER_ROOT . '/'.$appname; if (@is_dir ($appdir)) { return $appdir; } elseif (@is_dir ($appdir_default)) { return $appdir_default; } else { return False; } } /*! @function get_inc_dir @abstract get inc (include dir) of application @discussion $appname can either be passed or derived from $phpgw_info['flags']['currentapp']; @param $appname name of application */ function get_inc_dir($appname = '') { if (! $appname) { $appname = $GLOBALS['phpgw_info']['flags']['currentapp']; } if ($appname == 'home' || $appname == 'logout' || $appname == 'login') { $appname = 'phpgwapi'; } $incdir = PHPGW_INCLUDE_ROOT . '/' . $appname . '/inc'; $incdir_default = PHPGW_SERVER_ROOT . '/' . $appname . '/inc'; if (@is_dir ($incdir)) { return $incdir; } elseif (@is_dir ($incdir_default)) { return $incdir_default; } else { return False; } } /*! @function list_themes @abstract list themes available */ function list_themes() { $tpl_dir = $this->get_tpl_dir('phpgwapi'); $dh = opendir($tpl_dir . SEP . 'css'); while ($file = readdir($dh)) { if (eregi("\.css$", $file) && $file != 'phpgw.css') { $list[] = substr($file,0,strpos($file,'.')); } } closedir($dh); reset ($list); return $list; } /*! @function list_templates @abstract list available templates */ function list_templates() { $d = dir(PHPGW_SERVER_ROOT . '/phpgwapi/templates'); while ($entry=$d->read()) { if ($entry != 'CVS' && $entry != '.' && $entry != '..' && is_dir(PHPGW_SERVER_ROOT . '/phpgwapi/templates/' . $entry)) { $list[$entry]['name'] = $entry; $f = PHPGW_SERVER_ROOT . '/phpgwapi/templates/' . $entry . '/details.inc.php'; if (file_exists ($f)) { include($f); $list[$entry]['title'] = 'Use '.$GLOBALS['phpgw_info']['template'][$entry]['title'].'interface'; } else { $list[$entry]['title'] = $entry; } } } $d->close(); reset ($list); return $list; } /*! @function get_tpl_dir @abstract get template dir of an application @param $appname appication name optional can be derived from $phpgw_info['flags']['currentapp']; */ function get_tpl_dir($appname = '',$layout = '') { if (! $appname) { $appname = $GLOBALS['phpgw_info']['flags']['currentapp']; } if ($appname == 'home' || $appname == 'logout' || $appname == 'login' || $appname == 'about' || $appname == 'help') { $appname = 'phpgwapi'; } if (!isset($GLOBALS['phpgw_info']['server']['template_set']) && isset($GLOBALS['phpgw_info']['user']['preferences']['common']['template_set'])) { $GLOBALS['phpgw_info']['server']['template_set'] = $GLOBALS['phpgw_info']['user']['preferences']['common']['template_set']; } // Setting this for display of template choices in user preferences if (@$GLOBALS['phpgw_info']['server']['template_set'] == 'user_choice') { $GLOBALS['phpgw_info']['server']['usrtplchoice'] = 'user_choice'; } if ((@$GLOBALS['phpgw_info']['server']['template_set'] == 'user_choice' || !isset($GLOBALS['phpgw_info']['server']['template_set'])) && isset($GLOBALS['phpgw_info']['user']['preferences']['common']['template_set'])) { $GLOBALS['phpgw_info']['server']['template_set'] = $GLOBALS['phpgw_info']['user']['preferences']['common']['template_set']; } elseif (@$GLOBALS['phpgw_info']['server']['template_set'] == 'user_choice' || !isset($GLOBALS['phpgw_info']['server']['template_set'])) { $GLOBALS['phpgw_info']['server']['template_set'] = 'default'; } /******** start temporarily code **************************************/ /* this just makes sure the template set is updated to the new format */ if (!@is_file(PHPGW_SERVER_ROOT . '/phpgwapi/templates/' . $GLOBALS['phpgw_info']['server']['template_set'].'/phpgw.xsl')) { $GLOBALS['phpgw_info']['server']['template_set'] = 'idsociety'; } /******** end temporarily code **************************************/ $tpldir = PHPGW_SERVER_ROOT . '/' . $appname . '/templates/' . $GLOBALS['phpgw_info']['server']['template_set']; $tpldir_default = PHPGW_SERVER_ROOT . '/' . $appname . '/templates/default'; if ($layout == 'default') { $tpldir = $tpldir_default; } if (@is_dir($tpldir)) { return $tpldir; } elseif (@is_dir($tpldir_default)) { return $tpldir_default; } else { return False; } } /*! @function is_image_dir @abstract checks if image_dir exists and has more than just a navbar-icon @note this is just a workaround for idots, better to use find_image, which has a fallback \ on a per image basis to the default dir */ function is_image_dir($dir) { if (!@is_dir($dir)) { return False; } if ($d = opendir($dir)) { while ($f = readdir($d)) { $ext = strtolower(strrchr($f,'.')); if (($ext == '.gif' || $ext == '.png') && strstr($f,'navbar') === False) { return True; } } } return False; } /*! @function get_image_dir @abstract get image dir of an application @param $appname application name optional can be derived from $phpgw_info['flags']['currentapp']; */ function get_image_dir($appname = '',$layout = '') { if ($appname == '') { $appname = $GLOBALS['phpgw_info']['flags']['currentapp']; } if (empty($GLOBALS['phpgw_info']['server']['template_set'])) { $GLOBALS['phpgw_info']['server']['template_set'] = 'default'; } if ($layout) { $imagedir_layout = PHPGW_SERVER_ROOT . SEP . $appname . SEP . 'templates' . SEP . $layout . SEP . 'images'; if (@is_dir ($imagedir_layout)) { return $imagedir_layout; } } $imagedir = PHPGW_SERVER_ROOT . '/' . $appname . '/templates/' . $GLOBALS['phpgw_info']['server']['template_set'] . '/images'; $imagedir_default = PHPGW_SERVER_ROOT . '/' . $appname . '/templates/default/images'; $imagedir_olddefault = PHPGW_SERVER_ROOT . '/' . $appname . '/images'; if ($this->is_image_dir ($imagedir)) { return $imagedir; } elseif ($this->is_image_dir ($imagedir_default)) { return $imagedir_default; } elseif ($this->is_image_dir ($imagedir_olddefault)) { return $imagedir_olddefault; } else { return False; } } /*! @function get_image_path @abstract get image path of an application @param $appname appication name optional can be derived from $phpgw_info['flags']['currentapp']; */ function get_image_path($appname = '',$layout = '') { if ($appname == '') { $appname = $GLOBALS['phpgw_info']['flags']['currentapp']; } if (empty($GLOBALS['phpgw_info']['server']['template_set'])) { $GLOBALS['phpgw_info']['server']['template_set'] = 'default'; } if ($layout) { $imagedir_layout = PHPGW_SERVER_ROOT . SEP . $appname . SEP . 'templates' . SEP . $layout . SEP . 'images'; if (@is_dir ($imagedir_layout)) { return $GLOBALS['phpgw_info']['server']['webserver_url'] . SEP . $appname . SEP . 'templates' . SEP . $layout . SEP . 'images'; } } $imagedir = PHPGW_SERVER_ROOT . '/'.$appname.'/templates/'.$GLOBALS['phpgw_info']['server']['template_set'].'/images'; $imagedir_default = PHPGW_SERVER_ROOT . '/'.$appname.'/templates/default/images'; $imagedir_olddefault = PHPGW_SERVER_ROOT . '/'.$appname.'/images'; if ($this->is_image_dir ($imagedir)) { return $GLOBALS['phpgw_info']['server']['webserver_url'].'/'.$appname.'/templates/'.$GLOBALS['phpgw_info']['server']['template_set'].'/images'; } elseif ($this->is_image_dir ($imagedir_default)) { return $GLOBALS['phpgw_info']['server']['webserver_url'].'/'.$appname.'/templates/default/images'; } elseif ($this->is_image_dir ($imagedir_olddefault)) { return $GLOBALS['phpgw_info']['server']['webserver_url'].'/'.$appname.'/images'; } else { return False; } } function find_image($appname,$image,$force_layout=False) { static $imgpref; if($GLOBALS['phpgw_info']['server']['template_set'] == 'funkwerk') { $force_layout = True; } if(! @$imgpref) { switch(@$GLOBALS['phpgw_info']['server']['image_type']) { case 1: $imgpref = Array('png','jpg','gif'); break; case 2: $imgpref = Array('png','jpg','nogifs'); break; default: $imgpref = Array('gif','jpg','png'); break; } } if (!@is_array($this->found_files[$appname])) { $imagedir = '/'.$appname.'/templates/'.$GLOBALS['phpgw_info']['server']['template_set'].'/images'; if (!$force_layout) { //$imagedir_olddefault = '/'.$appname.'/images'; $imagedir_default = '/'.$appname.'/templates/default/images'; /* apps should be updated now to use the tpl img_dirs if (@is_dir(PHPGW_INCLUDE_ROOT.$imagedir_olddefault)) { $d = dir(PHPGW_INCLUDE_ROOT.$imagedir_olddefault); while (false != ($entry = $d->read())) { if ($entry != '.' && $entry != '..') { $this->found_files[$appname][$entry] = $imagedir_olddefault; } } $d->close(); } */ if (@is_dir(PHPGW_INCLUDE_ROOT.$imagedir_default)) { $d = dir(PHPGW_INCLUDE_ROOT.$imagedir_default); while (false != ($entry = $d->read())) { if ($entry != '.' && $entry != '..') { $this->found_files[$appname][$entry] = $imagedir_default; } } $d->close(); } } if (@is_dir(PHPGW_INCLUDE_ROOT.$imagedir)) { $d = dir(PHPGW_INCLUDE_ROOT.$imagedir); while (false != ($entry = $d->read())) { if ($entry != '.' && $entry != '..') { $this->found_files[$appname][$entry] = $imagedir; } } $d->close(); } } if(isset($this->found_files[$appname][$image.'.'.$imgpref[0]])) { $imgfile = $GLOBALS['phpgw_info']['server']['webserver_url'].$this->found_files[$appname][$image.'.'.$imgpref[0]].'/'.$image.'.'.$imgpref[0]; } elseif(isset($this->found_files[$appname][$image.'.'.$imgpref[1]])) { $imgfile = $GLOBALS['phpgw_info']['server']['webserver_url'].$this->found_files[$appname][$image.'.'.$imgpref[1]].'/'.$image.'.'.$imgpref[1]; } elseif(isset($this->found_files[$appname][$image.'.'.$imgpref[2]])) { $imgfile = $GLOBALS['phpgw_info']['server']['webserver_url'].$this->found_files[$appname][$image.'.'.$imgpref[2]].'/'.$image.'.'.$imgpref[2]; } elseif(isset($this->found_files[$appname][$image])) { $imgfile = $GLOBALS['phpgw_info']['server']['webserver_url'].$this->found_files[$appname][$image].'/'.$image; } elseif(isset($this->found_files['phpgwapi'][$image.'.'.$imgpref[0]])) { $imgfile = $GLOBALS['phpgw_info']['server']['webserver_url'].$this->found_files['phpgwapi'][$image.'.'.$imgpref[0]].'/'.$image.'.'.$imgpref[0]; } elseif(isset($this->found_files['phpgwapi'][$image.'.'.$imgpref[1]])) { $imgfile = $GLOBALS['phpgw_info']['server']['webserver_url'].$this->found_files['phpgwapi'][$image.'.'.$imgpref[1]].'/'.$image.'.'.$imgpref[1]; } elseif(isset($this->found_files['phpgwapi'][$image.'.'.$imgpref[2]])) { $imgfile = $GLOBALS['phpgw_info']['server']['webserver_url'].$this->found_files['phpgwapi'][$image.'.'.$imgpref[2]].'/'.$image.'.'.$imgpref[2]; } elseif(isset($this->found_files['phpgwapi'][$image])) { $imgfile = $GLOBALS['phpgw_info']['server']['webserver_url'].$this->found_files['phpgwapi'][$image].'/'.$image; } else { $imgfile = ''; } return $imgfile; } function image($appname,$image='',$ext='',$force_layout=False,$use_lang=True) { if (!is_array($image)) { if (empty($image)) { return ''; } $image = array($image); } if ($use_lang) { while (list(,$img) = each($image)) { $lang_images[] = $img . '_' . $GLOBALS['phpgw_info']['user']['preferences']['common']['lang']; $lang_images[] = $img; } $image = $lang_images; } while (!$image_found && list(,$img) = each($image)) { if(isset($this->found_files[$appname][$img.$ext])) { $image_found = $GLOBALS['phpgw_info']['server']['webserver_url'].$this->found_files[$appname][$img.$ext].'/'.$img.$ext; } else { $image_found = $this->find_image($appname,$img.$ext,$force_layout); } } return $image_found; } function image_on($appname,$image,$extension='_on',$force_layout=False) { $with_extension = $this->image($appname,$image,$extension,$navbar); $without_extension = $this->image($appname,$image,'',$navbar); if($with_extension != '') { return $with_extension; } elseif($without_extension != '') { return $without_extension; } else { return ''; } } /*! @function msgbox @abstract Generate a consistant msgbox for app apps to use @discussion makes it easier and more consistant to generate message boxes */ function msgbox($text = '', $type = True, $base = '') { if ($text=='' && @isset($GLOBALS['phpgw_info']['flags']['msgbox_data'])) { $text = $GLOBALS['phpgw_info']['flags']['msgbox_data']; unset($GLOBALS['phpgw_info']['flags']['msgbox_data']); } elseif($text=='') { return; } $GLOBALS['phpgw']->xslttpl->add_file($this->get_tpl_dir('phpgwapi','default') . SEP . 'msgbox'); $prev_helper = $GLOBALS['phpgw']->translation->translator_helper; $GLOBALS['phpgw']->translation->translator_helper = ''; if (is_array($text)) { reset($text); while (list($key,$value) = each($text)) { if ($value == True) { $img = $this->image('phpgwapi','msgbox_good'); $alt = lang('OK'); } else { $img = $this->image('phpgwapi','msgbox_bad'); $alt = lang('ERROR'); } $data[] = array ( 'msgbox_text' => lang($key), 'msgbox_img' => $img, 'msgbox_img_alt' => $alt, 'lang_msgbox_statustext' => $alt ); } } else { if ($type == True) { $img = $this->image('phpgwapi','msgbox_good'); $alt = lang('OK'); } else { $img = $this->image('phpgwapi','msgbox_bad'); $alt = lang('ERROR'); } $data = array ( 'msgbox_text' => lang($text), 'msgbox_img' => $img, 'msgbox_img_alt' => $alt, 'lang_msgbox_statustext' => $alt ); } $GLOBALS['phpgw']->translation->translator_helper = $prev_helper; if ($base) { $GLOBALS['phpgw']->xslttpl->set_var($base,array('msgbox_data' => $data),True); } else { return $data; } } function framework() { $this->navbar(); $cur_app = $GLOBALS['phpgw_info']['flags']['currentapp']; $app_title = empty($cur_app) ? '' : ' ['. (isset($GLOBALS['phpgw_info']['apps'][$cur_app]) ? $GLOBALS['phpgw_info']['apps'][$cur_app]['title'] : (isset($GLOBALS['phpgw_info']['navbar'][$cur_app]) ? $GLOBALS['phpgw_info']['navbar'][$cur_app]['title'] : lang($cur_app))).']'; $css = $this->get_css_url(); $var = array ( 'website_title' => $GLOBALS['phpgw_info']['server']['site_title'] . $app_title, 'webserver_url' => $GLOBALS['phpgw_info']['server']['webserver_url'], 'phpgw_css_file' => $css[0], 'theme_css_file' => $css[1], 'current_app' => $cur_app ); if ($GLOBALS['phpgw_info']['flags']['headonly'] == True) { $GLOBALS['phpgw']->xslttpl->add_file($this->get_tpl_dir('phpgwapi','default') . SEP . 'phpgw_header'); } else { $GLOBALS['phpgw']->xslttpl->add_file($this->get_tpl_dir('phpgwapi') . SEP . 'phpgw'); } switch ($GLOBALS['phpgw_info']['user']['preferences']['common']['template_set']) { case 'idsociety': $find_single = strrpos($GLOBALS['phpgw_info']['server']['webserver_url'],'/'); $find_double = strpos(strrev($GLOBALS['phpgw_info']['server']['webserver_url'].' '),'//'); if($find_double) { $find_double = strlen($GLOBALS['phpgw_info']['server']['webserver_url']) - $find_double - 1; } if($find_double) { if($find_single == $find_double + 1) { $GLOBALS['strip_portion'] = $GLOBALS['phpgw_info']['server']['webserver_url']; } else { $GLOBALS['strip_portion'] = substr($GLOBALS['phpgw_info']['server']['webserver_url'],0,$find_double + 1); } } else { $GLOBALS['strip_portion'] = $GLOBALS['phpgw_info']['server']['webserver_url'].'/'; } if ($GLOBALS['phpgw_info']['flags']['currentapp'] != 'home') { $var['home_img'] = $this->image('phpgwapi','welcome2'); $GLOBALS['phpgw_info']['flags']['preload_images'][] = $this->image_on('phpgwapi','welcome2','_over'); } else { $var['home_img'] = $this->image_on('phpgwapi','welcome2','_over'); $GLOBALS['phpgw_info']['flags']['preload_images'][] = $this->image('phpgwapi','welcome2'); } $var['home_img_hover'] = $this->image_on('phpgwapi','welcome2','_over'); if ($GLOBALS['phpgw_info']['flags']['currentapp'] != 'preferences') { $var['prefs_img'] = $this->image('preferences','preferences2'); $GLOBALS['phpgw_info']['flags']['preload_images'][] = $this->image_on('preferences','preferences2','_over'); } else { $var['prefs_img'] = $this->image_on('preferences','preferences2','_over'); $GLOBALS['phpgw_info']['flags']['preload_images'][] = $this->image('preferences','preferences2'); } $var['prefs_img_hover'] = $this->image_on('preferences','preferences2','_over'); $var['logout_img'] = $this->image('phpgwapi','log_out2'); $GLOBALS['phpgw_info']['flags']['preload_images'][] = $this->image_on('phpgwapi','log_out2','_over'); $var['logout_img_hover'] = $this->image_on('phpgwapi','log_out2','_over'); if ($GLOBALS['phpgw_info']['flags']['currentapp'] != 'about') { $var['about_img'] = $this->image('phpgwapi','question_mark2'); $var['about_img_hover'] = $this->image_on('phpgwapi','question_mark2','_over'); } else { $var['about_img'] = $this->image_on('phpgwapi','question_mark2','_over'); $var['about_img_hover'] = $this->image('phpgwapi','question_mark2'); } if ($GLOBALS['phpgw_info']['flags']['currentapp'] != 'help') { $var['help_img'] = $this->image('phpgwapi','help'); $var['help_img_hover'] = $this->image_on('phpgwapi','help','_over'); } else { $var['help_img'] = $this->image_on('phpgwapi','help','_over'); $var['help_img_hover'] = $this->image('phpgwapi','help'); } $var['logo_img'] = $this->image('phpgwapi','logo2'); $var['nav_bar_left_top_bg_img'] = $this->image('phpgwapi','nav_bar_left_top_bg'); break; case 'verdilak': $var['logo_img'] = $this->image('phpgwapi','logo'); $var['home_img'] = $this->image('phpgwapi','welcome-'.($cur_app=='home' ? 'red' : 'grey')); $var['prefs_img'] = $this->image('preferences','preferences-'.($cur_app=='preferences' ? 'red' : 'grey')); $var['logout_img'] = $this->image('phpgwapi','logout'); $var['about_img'] = $this->image('phpgwapi','about-'.($cur_app=='about' ? 'red' : 'grey')); $var['help_img'] = $this->image('phpgwapi','help'); $var['greybar'] = $this->image('phpgwapi','greybar'); break; case 'justweb': $var['logo_img'] = $this->image('phpgwapi','logo'); $var['home_img'] = $this->image('phpgwapi','tab_home'); $var['prefs_img'] = $this->image('preferences','tab_prefs'); $var['logout_img'] = $this->image('phpgwapi','tab_logout'); $var['about_img'] = $this->image('phpgwapi','tab_help'); $var['help_img'] = $this->image('phpgwapi','tab_help'); break; case 'funkwerk': $var['about_img'] = '!'; $var['help_img'] = '?'; switch ($cur_app) { case 'home': $var['top_css_home'] = 'top_menu_selected'; $var['top_css'] = $var['top_css_prefs'] = $var['top_css_about'] = $var['top_css_help'] = 'top_menu'; break; case 'preferences': $var['top_css_prefs'] = 'top_menu_selected'; $var['top_css'] = $var['top_css_home'] = $var['top_css_about'] = $var['top_css_help'] = 'top_menu'; break; case 'about': $var['top_css_about'] = 'top_menu_selected'; $var['top_css'] = $var['top_css_home'] = $var['top_css_prefs'] = $var['top_css_help'] = 'top_menu'; break; case 'help': $var['top_css_help'] = 'top_menu_selected'; $var['top_css'] = $var['top_css_home'] = $var['top_css_prefs'] = $var['top_css_about'] = 'top_menu'; break; default: $var['top_css'] = $var['top_css_home'] = $var['top_css_prefs'] = $var['top_css_about'] = $var['top_css_help'] = 'top_menu'; break; } break; default: $var['home_img'] = $GLOBALS['phpgw_info']['navbar']['home']['icon']; $var['prefs_img'] = $GLOBALS['phpgw_info']['navbar']['preferences']['icon']; $var['logout_img'] = $GLOBALS['phpgw_info']['navbar']['logout']['icon']; $var['about_img'] = $GLOBALS['phpgw_info']['navbar']['about']['icon']; $var['help_img'] = $GLOBALS['phpgw_info']['navbar']['help']['icon']; break; } $var['home_link'] = $GLOBALS['phpgw_info']['navbar']['home']['url']; $var['prefs_link'] = $GLOBALS['phpgw_info']['navbar']['preferences']['url']; $var['logout_link'] = $GLOBALS['phpgw_info']['navbar']['logout']['url']; $var['about_link'] = $GLOBALS['phpgw_info']['navbar']['about']['url']; $var['help_link'] = $GLOBALS['phpgw_info']['navbar']['help']['url']; $var['home_title'] = $GLOBALS['phpgw_info']['navbar']['home']['title']; $var['prefs_title'] = $GLOBALS['phpgw_info']['navbar']['preferences']['title']; $var['logout_title'] = $GLOBALS['phpgw_info']['navbar']['logout']['title']; $var['about_title'] = $GLOBALS['phpgw_info']['navbar']['about']['title']; $var['help_title'] = $GLOBALS['phpgw_info']['navbar']['help']['title']; $var['home_statustext'] = $GLOBALS['phpgw_info']['navbar']['home']['title']; $var['prefs_statustext'] = $GLOBALS['phpgw_info']['navbar']['preferences']['title']; $var['logout_statustext'] = $GLOBALS['phpgw_info']['navbar']['logout']['title']; $var['about_statustext'] = $GLOBALS['phpgw_info']['navbar']['about']['title']; $var['help_statustext'] = $GLOBALS['phpgw_info']['navbar']['help']['title']; if (isset($GLOBALS['phpgw_info']['navbar']['admin']) && $GLOBALS['phpgw_info']['user']['preferences']['common']['show_currentusers']) { $var['current_users'] = lang('Current users') . ': ' . $GLOBALS['phpgw']->session->total(); $var['url_current_users'] = $GLOBALS['phpgw']->link('/index.php','menuaction=admin.uicurrentsessions.list_sessions'); } $var['user_info_name'] = $this->display_fullname(); $now = time(); $var['user_info_date'] = lang($this->show_date($now,'l')) . ' ' . $this->show_date($now,$GLOBALS['phpgw_info']['user']['preferences']['common']['dateformat']); $var['user_info'] = $var['user_info_name'] .' - ' .$var['user_info_date']; foreach($GLOBALS['phpgw_info']['navbar'] as $app => $data) { if ($app == $cur_app) { $app_css = 'left_selected'; } else { $app_css = 'left'; } if ($app != 'home' && $app != 'preferences' && $app != 'about' && $app != 'logout' && $app != 'help' && $app != 'manual') { $var['applications'][] = array ( 'icon' => $data['icon'], 'title' => $data['title'], 'img_src_over' => $data['icon_hover'], 'url' => $data['url'], 'name' => $data['title'], 'statustext' => $data['title'], 'css' => $app_css ); if($data['icon_hover'] != '') { $GLOBALS['phpgw_info']['flags']['preload_images'][] = $data['icon_hover']; } if ($GLOBALS['phpgw_info']['user']['preferences']['common']['navbar_format'] == 'text' && $GLOBALS['phpgw_info']['user']['preferences']['common']['template_set'] == 'default') { $tabs[$app] = array ( 'label' => $data['title'], 'link' => $data['url'] ); } } if ($GLOBALS['phpgw_info']['user']['preferences']['common']['navbar_format'] == 'text' && $GLOBALS['phpgw_info']['user']['preferences']['common']['template_set'] == 'default') { if ($app == 'home' || $app == 'preferences' || $app == 'about' || $app == 'logout' || $app == 'manual') { $base_tabs[$app] = array ( 'label' => $data['title'], 'link' => $data['url'] ); } } } if ($GLOBALS['phpgw_info']['user']['preferences']['common']['navbar_format'] == 'text' && $GLOBALS['phpgw_info']['user']['preferences']['common']['template_set'] == 'default') { $var['app_tabs'] = $this->create_tabs($tabs,$GLOBALS['phpgw_info']['flags']['currentapp'],-1); $var['base_tabs'] = $this->create_tabs($base_tabs,$GLOBALS['phpgw_info']['flags']['currentapp'],-1); } $var['onload'] = $this->load_preload_images_data(); if($GLOBALS['phpgw_info']['flags']['msgbox_data']) { $this->msgbox('',False,'phpgw'); } $var['app_tpl'] = ''; $menuaction = get_var('menuaction',Array('GET')); if ($menuaction && isset($GLOBALS['phpgw_info']['flags']['xslt_app'])) { list($app,$class,$method) = explode('.',$menuaction); $var['app_tpl'] = $method; } $var['lang_powered_by'] = lang('powered by'); $var['lang_version'] = lang('version'); $var['phpgw_version'] = $GLOBALS['phpgw_info']['server']['versions']['phpgwapi']; $var['lang_phpgw_statustext'] = lang('phpGroupWare --> homepage'); $var['top_spacer_middle_img'] = $GLOBALS['phpgw']->common->image('phpgwapi','top_spacer_middle'); $var['navbar_format'] = $GLOBALS['phpgw_info']['user']['preferences']['common']['navbar_format']; if (isset($GLOBALS['phpgw_info']['flags']['app_header'])) { $var['app_header'] = $GLOBALS['phpgw_info']['flags']['app_header']; } $var['app_java_script'] = $var['app_css'] = $var['app_java_script_url'] = $var['app_css_url'] = ''; if (isset($_GET['menuaction'])) { list($app,$class,$method) = explode('.',$_GET['menuaction']); if (is_array($GLOBALS[$class]->public_functions) && $GLOBALS[$class]->public_functions['css']) { $var['app_css'] = $GLOBALS[$class]->css(); } /*$class = CreateObject("$app.$class"); if (isset($class->public_functions['css'])) { $var['app_css'] = $class->css(); }*/ if (isset($class->public_functions['java_script'])) { $var['app_java_script'] = $class->java_script(); } unset($class); } if (isset($GLOBALS['phpgw_info']['flags']['css'])) { $var['app_css'] .= $GLOBALS['phpgw_info']['flags']['css']; } if (isset($GLOBALS['phpgw_info']['flags']['java_script'])) { $var['app_java_script'] .= $GLOBALS['phpgw_info']['flags']['java_script']; } if (isset($GLOBALS['phpgw_info']['flags']['css_url'])) { $var['app_css_url'] = $GLOBALS['phpgw_info']['flags']['css_url']; } if (isset($GLOBALS['phpgw_info']['flags']['java_script_url'])) { $var['app_java_script_url'] = $GLOBALS['phpgw_info']['flags']['java_script_url']; } $GLOBALS['phpgw']->xslttpl->set_var('phpgw',$var); } /*! @function navbar @abstract Build the application navigation bar based on user's accessible applications @discussion *someone wanna add some detail here* */ function navbar() { $GLOBALS['phpgw_info']['navbar']['home']['title'] = lang('home'); $GLOBALS['phpgw_info']['navbar']['home']['url'] = $GLOBALS['phpgw']->link('/home.php'); $GLOBALS['phpgw_info']['navbar']['home']['icon'] = $this->image('phpgwapi',Array('home','nonav')); $GLOBALS['phpgw_info']['navbar']['home']['icon_hover'] = $this->image_on('phpgwapi',Array('home','nonav'),'-over'); list($first) = each($GLOBALS['phpgw_info']['user']['apps']); if(is_array($GLOBALS['phpgw_info']['user']['apps']['admin']) && $first != 'admin') { $newarray['admin'] = $GLOBALS['phpgw_info']['user']['apps']['admin']; foreach($GLOBALS['phpgw_info']['user']['apps'] as $index => $value) { if($index != 'admin') { $newarray[$index] = $value; } } $GLOBALS['phpgw_info']['user']['apps'] = $newarray; reset($GLOBALS['phpgw_info']['user']['apps']); } unset($index); unset($value); unset($newarray); $force_layout = False; if ($GLOBALS['phpgw_info']['server']['template_set'] == 'idsociety') { $force_layout = True; } foreach($GLOBALS['phpgw_info']['user']['apps'] as $app => $data) { if (is_long($app)) { continue; } if ($app == 'preferences' || $GLOBALS['phpgw_info']['apps'][$app]['status'] != 2 && $GLOBALS['phpgw_info']['apps'][$app]['status'] != 3) { $GLOBALS['phpgw_info']['navbar'][$app]['title'] = $GLOBALS['phpgw_info']['apps'][$app]['title']; $GLOBALS['phpgw_info']['navbar'][$app]['url'] = $GLOBALS['phpgw']->link('/' . $app . '/index.php'); $GLOBALS['phpgw_info']['navbar'][$app]['name'] = $app; if ($app != $GLOBALS['phpgw_info']['flags']['currentapp']) { $GLOBALS['phpgw_info']['navbar'][$app]['icon'] = $this->image($app,Array('navbar','nonav','',$force_layout)); $GLOBALS['phpgw_info']['navbar'][$app]['icon_hover'] = $this->image_on($app,Array('navbar','nonav'),'-over',$force_layout); } else { $GLOBALS['phpgw_info']['navbar'][$app]['icon'] = $this->image_on($app,Array('navbar','nonav'),'-over',$force_layout); $GLOBALS['phpgw_info']['navbar'][$app]['icon_hover'] = $this->image($app,Array('navbar','nonav','',$force_layout)); } } } /* apps for the top menu */ $GLOBALS['phpgw_info']['navbar']['help']['title'] = lang('manual'); $GLOBALS['phpgw_info']['navbar']['help']['url'] = $GLOBALS['phpgw']->link('/help.php'); $GLOBALS['phpgw_info']['navbar']['help']['icon'] = $this->image('phpgwapi',Array('help','nonav')); $GLOBALS['phpgw_info']['navbar']['help']['icon_hover'] = $this->image_on('phpgwapi',Array('help','nonav'),'-over'); if ($GLOBALS['phpgw_info']['flags']['currentapp'] == 'home') { $app = $app_title = 'phpGroupWare'; } else { $app = $GLOBALS['phpgw_info']['flags']['currentapp']; $app_title = $GLOBALS['phpgw_info']['apps'][$app]['title']; } if ($GLOBALS['phpgw_info']['user']['apps']['preferences']) // preferences last { $prefs = $GLOBALS['phpgw_info']['navbar']['preferences']; unset($GLOBALS['phpgw_info']['navbar']['preferences']); $GLOBALS['phpgw_info']['navbar']['preferences'] = $prefs; } /* We handle this here becuase its special */ $app_title = isset($GLOBALS['phpgw_info']['apps'][$app]) ? $GLOBALS['phpgw_info']['apps'][$app]['title'] : 'phpGroupWare'; $GLOBALS['phpgw_info']['navbar']['about']['title'] = lang('about %1',$app_title); $GLOBALS['phpgw_info']['navbar']['about']['url'] = $GLOBALS['phpgw']->link('/about.php','app='.$app); $GLOBALS['phpgw_info']['navbar']['about']['icon'] = $this->image('phpgwapi',Array('about','nonav')); $GLOBALS['phpgw_info']['navbar']['about']['icon_hover'] = $this->image_on('phpgwapi',Array('about','nonav'),'-over'); $GLOBALS['phpgw_info']['navbar']['logout']['title'] = lang('logout'); $GLOBALS['phpgw_info']['navbar']['logout']['url'] = $GLOBALS['phpgw']->link('/logout.php'); $GLOBALS['phpgw_info']['navbar']['logout']['icon'] = $this->image('phpgwapi',Array('logout','nonav')); $GLOBALS['phpgw_info']['navbar']['logout']['icon_hover'] = $this->image_on('phpgwapi',Array('logout','nonav'),'-over'); } /*! @function get_css_url @abstract returns the path of the css file for the choosen layout/theme @discussion *someone wanna add some detail here* */ function get_css_url() { if (! $GLOBALS['phpgw_info']['user']['preferences']['common']['theme']) { if ($GLOBALS['phpgw_info']['server']['template_set'] == 'user_choice') { $GLOBALS['phpgw_info']['user']['preferences']['common']['theme'] = 'default'; } else { $GLOBALS['phpgw_info']['user']['preferences']['common']['theme'] = $GLOBALS['phpgw_info']['server']['template_set']; } } if ($GLOBALS['phpgw_info']['server']['force_theme'] == 'user_choice') { if (!isset($GLOBALS['phpgw_info']['user']['preferences']['common']['theme'])) { $GLOBALS['phpgw_info']['user']['preferences']['common']['theme'] = 'default'; } } else { if (isset($GLOBALS['phpgw_info']['server']['force_theme'])) { $GLOBALS['phpgw_info']['user']['preferences']['common']['theme'] = $GLOBALS['phpgw_info']['server']['force_theme']; } } if(@file_exists(PHPGW_SERVER_ROOT . SEP . 'phpgwapi' . SEP . 'templates' . SEP . $GLOBALS['phpgw_info']['user']['preferences']['common']['template_set'] . SEP . 'css' . SEP . $GLOBALS['phpgw_info']['user']['preferences']['common']['theme'] . '.css')) { $css_file = $GLOBALS['phpgw_info']['server']['webserver_url'] . SEP . 'phpgwapi' . SEP . 'templates' . SEP . $GLOBALS['phpgw_info']['user']['preferences']['common']['template_set'] . SEP . 'css' . SEP . $GLOBALS['phpgw_info']['user']['preferences']['common']['theme'] . '.css'; } elseif(@file_exists(PHPGW_SERVER_ROOT . SEP . 'phpgwapi' . SEP . 'templates' . SEP . $GLOBALS['phpgw_info']['user']['preferences']['common']['template_set'] . SEP . 'css' . SEP . $GLOBALS['phpgw_info']['user']['preferences']['common']['template_set'] . '.css')) { $css_file = $GLOBALS['phpgw_info']['server']['webserver_url'] . SEP . 'phpgwapi' . SEP . 'templates' . SEP . $GLOBALS['phpgw_info']['user']['preferences']['common']['template_set'] . SEP . 'css' . SEP . $GLOBALS['phpgw_info']['user']['preferences']['common']['template_set'] . '.css'; } else { /* Hope we don't get to this point. Better then the user seeing a */ /* complety back screen and not know whats going on */ $GLOBALS['phpgw']->log->write(array('text'=>'F-Abort, No themes found')); } $phpgw_css_file = $GLOBALS['phpgw_info']['server']['webserver_url'] . SEP . 'phpgwapi' . SEP . 'templates' . SEP . $GLOBALS['phpgw_info']['user']['preferences']['common']['template_set'] . SEP . 'css' . SEP . 'phpgw.css'; return array($phpgw_css_file,$css_file); } function load_preload_images_data() { if(@is_array($GLOBALS['phpgw_info']['flags']['preload_images'])) { $preload_image_string = ''; reset($GLOBALS['phpgw_info']['flags']['preload_images']); while(list($key,$value) = each($GLOBALS['phpgw_info']['flags']['preload_images'])) { if($preload_image_string != '') { $preload_image_string .= ",'$value'"; } else { $preload_image_string .= "'$value'"; } } return " MM_preloadImages($preload_image_string);"; } return ''; } function start_xslt_capture() { if (!isset($GLOBALS['phpgw_info']['xslt_capture'])) { $GLOBALS['phpgw_info']['xslt_capture'] = True; ob_start(); // capture the output } } /* Note: need to be run BEFORE exit is called, as buffers get flushed automatically before * any registered shutdown-functions (eg. phpgw_footer) gets called */ function stop_xslt_capture() { if (isset($GLOBALS['phpgw_info']['xslt_capture'])) { unset($GLOBALS['phpgw_info']['xslt_capture']); $output = ob_get_contents(); // get captured output ob_end_clean(); // stop capture and clean output-buffer if (!empty($output)) { $GLOBALS['phpgw']->xslttpl->set_var('phpgw',array('body_data' => $output)); } } } function phpgw_final() { if(!defined('PHPGW_FINAL')) { define('PHPGW_FINAL',True); if (!$GLOBALS['phpgw_info']['flags']['noframework']) { $cur_app = $GLOBALS['phpgw_info']['flags']['currentapp']; if($cur_app != 'home' && $cur_app != 'login' && $cur_app != 'logout') { if($GLOBALS['phpgw_info']['server']['support_old_style_apps']) { $this->start_xslt_capture(); // if index already turned it off } } if ($GLOBALS['phpgw_info']['server']['support_old_style_apps']) { $this->stop_xslt_capture(); } if ($cur_app != 'login'&& $cur_app != 'logout') { $this->framework(); } $GLOBALS['phpgw']->xslttpl->pp(); } // call the asyncservice check_run function if it is not explicitly set to cron-only // if (!$GLOBALS['phpgw_info']['server']['asyncservice']) // is default { ExecMethod('phpgwapi.asyncservice.check_run','fallback'); } $GLOBALS['phpgw']->db->disconnect(); /* Clean up mcrypt */ if (@is_object($GLOBALS['phpgw']->crypto)) { $GLOBALS['phpgw']->crypto->cleanup(); unset($GLOBALS['phpgw']->crypto); } if (DEBUG_TIMER) { $GLOBALS['debug_timer_stop'] = perfgetmicrotime(); echo 'Page loaded in ' . ($GLOBALS['debug_timer_stop'] - $GLOBALS['debug_timer_start']) . ' seconds.'; } } } /*! @function display_mainscreen @abstract shows the applications preferences and admin links */ function display_mainscreen($appname,$file) { if(is_array($file)) { $icon = $this->image($appname,'navbar'); while(is_array($file) && list($text,$url) = each($file)) { $link_data[] = array ( 'pref_link' => $url, 'pref_text' => lang($text) ); } if ($icon) { $pref = 'app_row_icon'; } else { $pref = 'app_row_noicon'; } $this->output[$pref][] = array ( 'app_title' => $GLOBALS['phpgw_info']['apps'][$appname]['title'], 'app_name' => $appname, 'app_icon' => $icon, 'link_row' => $link_data ); } } function hex2bin($data) { $len = strlen($data); return pack('H' . $len, $data); } /*! @function encrypt @abstract encrypt data passed to the function @param $data data (string?) to be encrypted */ function encrypt($data) { return $GLOBALS['phpgw']->crypto->encrypt($data); } /*! @function decrypt @abstract decrypt $data @param $data data to be decrypted */ function decrypt($data) { return $GLOBALS['phpgw']->crypto->decrypt($data); } /*! @function des_cryptpasswd @abstract des encrypt a password @param $userpass userpassword @param $random random seed */ function des_cryptpasswd($userpass, $random) { $lcrypt = '{crypt}'; $password = crypt($userpass, $random); $ldappassword = sprintf('%s%s', $lcrypt, $password); return $ldappassword; } /*! @function md5_cryptpasswd @abstract md5 encrypt password @param $userpass user password @param $random random seed */ function md5_cryptpasswd($userpass, $random) { $bsalt = '$1$'; $esalt = '$'; $lcrypt = '{crypt}'; $modsalt = sprintf('%s%s%s', $bsalt, $random, $esalt); $password = crypt($userpass, $modsalt); $ldappassword = sprintf('%s%s', $lcrypt, $password); return $ldappassword; } /*! @function sha_cryptpasswd @abstract sha encrypt password @param $userpass user password */ function sha_cryptpasswd($userpass) { $hash = base64_encode(mhash(MHASH_SHA1, $userpass)); $ldappassword = sprintf('%s%s', '{SHA}', $hash); return $ldappassword; } /*! @function encrypt_password @abstract encrypt password @abstract uses the encryption type set in setup and calls the appropriate encryption functions @param $password password to encrypt */ function encrypt_password($password) { if (strtolower($GLOBALS['phpgw_info']['server']['ldap_encryption_type']) == 'des') { $salt = $this->randomstring(2); $e_password = $this->des_cryptpasswd($password, $salt); } elseif (strtolower($GLOBALS['phpgw_info']['server']['ldap_encryption_type']) == 'md5') { $salt = $this->randomstring(8); $e_password = $this->md5_cryptpasswd($password, $salt); } elseif(strtolower($GLOBALS['phpgw_info']['server']['ldap_encryption_type']) == 'sha') { if(@function_exists('mhash')) { $e_password = $this->sha_cryptpasswd($password); } else { /* this should error instead... */ $salt = $this->randomstring(8); $e_password = $this->md5_cryptpasswd($password, $salt); } } return $e_password; } /*! @function find_portal_order @abstract find the current position of the app is the users portal_order preference @param $app application id to find current position - required @discussion No discussion */ function find_portal_order($app) { if(!is_array($GLOBALS['phpgw_info']['user']['preferences']['portal_order'])) { return -1; } @reset($GLOBALS['phpgw_info']['user']['preferences']['portal_order']); while(list($seq,$appid) = each($GLOBALS['phpgw_info']['user']['preferences']['portal_order'])) { if($appid == $app) { @reset($GLOBALS['phpgw_info']['user']['preferences']['portal_order']); return $seq; } } @reset($GLOBALS['phpgw_info']['user']['preferences']['portal_order']); return -1; } /*! @function hook @abstract temp wrapper to new hooks class */ function hook($location, $appname = '', $no_permission_check = False) { echo '$'."GLOBALS['phpgw']common->hook()".' has been replaced. Please change to the new $'."GLOBALS['phpgw']hooks->process()".'. For now this will act as a wrapper
'; return $GLOBALS['phpgw']->hooks->process($location, $order, $no_permission_check); } /*! @function hook_single @abstract temp wrapper to new hooks class */ // Note: $no_permission_check should *ONLY* be used when it *HAS* to be. (jengo) function hook_single($location, $appname = '', $no_permission_check = False) { echo '$'."GLOBALS['phpgw']common->hook_single()".' has been replaced. Please change to the new $'."GLOBALS['phpgw']hooks->single()".'. For now this will act as a wrapper
'; return $GLOBALS['phpgw']->hooks->single($location, $order, $no_permission_check); } /*! @function hook_count @abstract temp wrapper to new hooks class */ function hook_count($location) { echo '$'."GLOBALS['phpgw']common->hook_count()".' has been replaced. Please change to the new $'."GLOBALS['phpgw']hooks->count()".'. For now this will act as a wrapper
'; return $GLOBALS['phpgw']->hooks->count($location); } /* Wrapper to the session->appsession() */ function appsession($data = '##NOTHING##') { $this->debug_info[] = '$phpgw->common->appsession() is a depreciated function' . ' - use $phpgw->session->appsession() instead'; return $GLOBALS['phpgw']->session->appsession('default','',$data); } /*! @function show_date @abstract show current date @param $t time - optional can be pulled from user preferences @param $format - optional can be pulled from user prefernces */ function show_date($t = '', $format = '') { if(!is_object($GLOBALS['phpgw']->datetime)) { $GLOBALS['phpgw']->datetime = createobject('phpgwapi.datetime'); } if (!$t || intval($t) <= 0) { $t = $GLOBALS['phpgw']->datetime->gmtnow; } // + (date('I') == 1?3600:0) $t += $GLOBALS['phpgw']->datetime->tz_offset; if (! $format) { $format = $GLOBALS['phpgw_info']['user']['preferences']['common']['dateformat'] . ' - '; if ($GLOBALS['phpgw_info']['user']['preferences']['common']['timeformat'] == '12') { $format .= 'h:i:s a'; } else { $format .= 'H:i:s'; } } return date($format,$t); } /*! @function dateformatorder @abstract @param $yearstr year - string @param $monthstr month - string @param $day day - string @param $add_seperator boolean defaults to false */ function dateformatorder($yearstr,$monthstr,$daystr,$add_seperator = False) { $dateformat = strtolower($GLOBALS['phpgw_info']['user']['preferences']['common']['dateformat']); $sep = substr($GLOBALS['phpgw_info']['user']['preferences']['common']['dateformat'],1,1); $dlarr[strpos($dateformat,'y')] = $yearstr; $dlarr[strpos($dateformat,'m')] = $monthstr; $dlarr[strpos($dateformat,'d')] = $daystr; ksort($dlarr); if ($add_seperator) { return (implode($sep,$dlarr)); } else { return (implode(' ',$dlarr)); } } /*! @function formattime @abstract format the time takes settings from user preferences @param $hour hour @param $min minutes @param $sec defaults to '' */ function formattime($hour,$min,$sec='') { $h12 = $hour; if ($GLOBALS['phpgw_info']['user']['preferences']['common']['timeformat'] == '12') { if ($hour >= 12) { $ampm = ' pm'; } else { $ampm = ' am'; } $h12 %= 12; if ($h12 == 0 && $hour) { $h12 = 12; } if ($h12 == 0 && !$hour) { $h12 = 0; } } else { $h12 = $hour; } if ($sec) { $sec = ":$sec"; } return "$h12:$min$sec$ampm"; } // This is not the best place for it, but it needs to be shared bewteen Aeromail and SM /*! @function get_email_passwd_ex @abstract uses code in /email class msg to obtain the appropriate password for email @param (none - it will abtain the info it needs on its own) */ /* function get_email_passwd_ex() { // ---- Create the email Message Class if needed ----- if (is_object($GLOBALS['phpgw']->msg)) { $do_free_me = False; } else { $GLOBALS['phpgw']->msg = CreateObject('email.mail_msg'); $do_free_me = True; } // use the Msg class to obtain the appropriate password $tmp_prefs = $GLOBALS['phpgw']->preferences->read(); if (!isset($tmp_prefs['email']['passwd'])) { $email_passwd = $GLOBALS['phpgw_info']['user']['passwd']; } else { $email_passwd = $GLOBALS['phpgw']->msg->decrypt_email_passwd($tmp_prefs['email']['passwd']); } // cleanup and return if ($do_free_me) { unset ($GLOBALS['phpgw']->msg); } return $email_passwd; } */ // This is not the best place for it, but it needs to be shared bewteen Aeromail and SM /*! @function create_emailpreferences @abstract create email preferences @discussion This is not the best place for it, but it needs to be shared between Aeromail and SM @param $prefs @param $account_id -optional defaults to : phpgw_info['user']['account_id'] */ function create_emailpreferences($prefs='',$accountid='') { return $GLOBALS['phpgw']->preferences->create_email_preferences($accountid); // ---- Create the email Message Class if needed ----- if (is_object($GLOBALS['phpgw']->msg)) { $do_free_me = False; } else { $GLOBALS['phpgw']->msg = CreateObject('email.mail_msg'); $do_free_me = True; } // this sets the preferences into the phpgw_info structure $GLOBALS['phpgw']->msg->create_email_preferences(); // cleanup and return if ($do_free_me) { unset ($GLOBALS['phpgw']->msg); } } /* function create_emailpreferences($prefs,$accountid='') { $account_id = get_account_id($accountid); // NEW EMAIL PASSWD METHOD (shared between SM and aeromail) $prefs['email']['passwd'] = $this->get_email_passwd_ex(); // Add default preferences info if (!isset($prefs['email']['userid'])) { if ($GLOBALS['phpgw_info']['server']['mail_login_type'] == 'vmailmgr') { $prefs['email']['userid'] = $GLOBALS['phpgw']->accounts->id2name($account_id) . '@' . $GLOBALS['phpgw_info']['server']['mail_suffix']; } else { $prefs['email']['userid'] = $GLOBALS['phpgw']->accounts->id2name($account_id); } } // Set Server Mail Type if not defined if (empty($GLOBALS['phpgw_info']['server']['mail_server_type'])) { $GLOBALS['phpgw_info']['server']['mail_server_type'] = 'imap'; } // OLD EMAIL PASSWD METHOD if (!isset($prefs['email']['passwd'])) { $prefs['email']['passwd'] = $GLOBALS['phpgw_info']['user']['passwd']; } else { $prefs['email']['passwd'] = $this->decrypt($prefs['email']['passwd']); } // NEW EMAIL PASSWD METHOD Located at the begining of this function if (!isset($prefs['email']['address'])) { $prefs['email']['address'] = $GLOBALS['phpgw']->accounts->id2name($account_id) . '@' . $GLOBALS['phpgw_info']['server']['mail_suffix']; } if (!isset($prefs['email']['mail_server'])) { $prefs['email']['mail_server'] = $GLOBALS['phpgw_info']['server']['mail_server']; } if (!isset($prefs['email']['mail_server_type'])) { $prefs['email']['mail_server_type'] = $GLOBALS['phpgw_info']['server']['mail_server_type']; } if (!isset($prefs['email']['imap_server_type'])) { $prefs['email']['imap_server_type'] = $GLOBALS['phpgw_info']['server']['imap_server_type']; } // These sets the mail_port server variable if ($prefs['email']['mail_server_type']=='imap') { $prefs['email']['mail_port'] = '143'; } elseif ($prefs['email']['mail_server_type']=='pop3') { $prefs['email']['mail_port'] = '110'; } elseif ($prefs['email']['mail_server_type']=='imaps') { $prefs['email']['mail_port'] = '993'; } elseif ($prefs['email']['mail_server_type']=='pop3s') { $prefs['email']['mail_port'] = '995'; } // This is going to be used to switch to the nntp class if (isset($GLOBALS['phpgw_info']['flags']['newsmode']) && $GLOBALS['phpgw_info']['flags']['newsmode']) { $prefs['email']['mail_server_type'] = 'nntp'; } // DEBUG //echo "
prefs['email']['passwd']: " .$prefs['email']['passwd'] .'
'; return $prefs; } */ // This will be moved into the applications area. /*! @function check_code @abstract ? @discussion This will be moved into the applications area */ function check_code($code) { $s = '
'; switch ($code) { case 13: $s .= lang('Your message has been sent');break; case 14: $s .= lang('New entry added sucessfully');break; case 15: $s .= lang('Entry updated sucessfully'); break; case 16: $s .= lang('Entry has been deleted sucessfully'); break; case 18: $s .= lang('Password has been updated'); break; case 38: $s .= lang('Password could not be changed'); break; case 19: $s .= lang('Session has been killed'); break; case 27: $s .= lang('Account has been updated'); break; case 28: $s .= lang('Account has been created'); break; case 29: $s .= lang('Account has been deleted'); break; case 30: $s .= lang('Your settings have been updated'); break; case 31: $s .= lang('Group has been added'); break; case 32: $s .= lang('Group has been deleted'); break; case 33: $s .= lang('Group has been updated'); break; case 34: $s .= lang('Account has been deleted') . '

' . lang('Error deleting %1 %2 directory',lang('users'),' '.lang('private').' ') . ',
' . lang('Please %1 by hand',lang('delete')) . '

' . lang('To correct this error for the future you will need to properly set the') . '
' . lang('permissions to the files/users directory') . '
' . lang('On *nix systems please type: x','chmod 770 ' . $GLOBALS['phpgw_info']['server']['files_dir'] . '/users/'); break; case 35: $s .= lang('Account has been updated') . '

' . lang('Error renaming %1 %2 directory',lang('users'), ' '.lang('private').' ') . ',
' . lang('Please %1 by hand', lang('rename')) . '

' . lang('To correct this error for the future you will need to properly set the') . '
' . lang('permissions to the files/users directory') . '
' . lang('On *nix systems please type: x','chmod 770 ' . $GLOBALS['phpgw_info']['server']['files_dir'] . '/users/'); break; case 36: $s .= lang('Account has been created') . '

' . lang('Error creating %1 %2 directory',lang('users'), ' '.lang('private').' ') . ',
' . lang('Please %1 by hand', lang('create')) . '

' . lang('To correct this error for the future you will need to properly set the') . '
' . lang('permissions to the files/users directory') . '
' . lang('On *nix systems please type: x','chmod 770 ' . $GLOBALS['phpgw_info']['server']['files_dir'] . '/users/'); break; case 37: $s .= lang('Group has been added') . '

' . lang('Error creating %1 %2 directory',lang('groups'),' ') . ',
' . lang('Please %1 by hand', lang('create')) . '

' . lang('To correct this error for the future you will need to properly set the') . '
' . lang('permissions to the files/users directory') . '
' . lang('On *nix systems please type: x','chmod 770 ' . $GLOBALS['phpgw_info']['server']['files_dir'] . '/groups/'); break; case 38: $s .= lang('Group has been deleted') . '

' . lang('Error deleting %1 %2 directory',lang('groups'),' ') . ',
' . lang('Please %1 by hand', lang('delete')) . '

' . lang('To correct this error for the future you will need to properly set the') . '
' . lang('permissions to the files/users directory') . '
' . lang('On *nix systems please type: x','chmod 770 ' . $GLOBALS['phpgw_info']['server']['files_dir'] . '/groups/'); break; case 39: $s .= lang('Group has been updated') . '

' . lang('Error renaming %1 %2 directory',lang('groups'),' ') . ',
' . lang('Please %1 by hand', lang('rename')) . '

' . lang('To correct this error for the future you will need to properly set the') . '
' . lang('permissions to the files/users directory') . '
' . lang('On *nix systems please type: x','chmod 770 ' . $GLOBALS['phpgw_info']['server']['files_dir'] . '/groups/'); break; case 40: $s .= lang('You have not entered a title').'.'; break; case 41: $s .= lang('You have not entered a valid time of day').'.'; break; case 42: $s .= lang('You have not entered a valid date').'.'; break; case 43: $s .= lang('You have not entered participants').'.'; break; default: return ''; } return $s; } /*! @function phpgw_error @abstract process error message @param $error error @param $line line @param $file file */ function phpgw_error($error,$line = '', $file = '') { echo '

phpGroupWare internal error:

'.$error; if ($line) { echo 'Line: '.$line; } if ($file) { echo 'File: '.$file; } echo '

Your session has been halted.'; exit; } /*! @function create_phpcode_from_array @abstract create phpcode from array @param $array - array */ function create_phpcode_from_array($array) { while (list($key, $val) = each($array)) { if (is_array($val)) { while (list($key2, $val2) = each($val)) { if (is_array($val2)) { while (list($key3, $val3) = each ($val2)) { if (is_array($val3)) { while (list($key4, $val4) = each ($val3)) { $s .= '$phpgw_info["' . $key . '"]["' . $key2 . '"]["' . $key3 . '"]["' .$key4 . '"]="' . $val4 . '";'; $s .= "\n"; } } else { $s .= '$phpgw_info["' . $key . '"]["' . $key2 . '"]["' . $key3 . '"]="' . $val3 . '";'; $s .= "\n"; } } } else { $s .= '$phpgw_info["' . $key .'"]["' . $key2 . '"]="' . $val2 . '";'; $s .= "\n"; } } } else { $s .= '$phpgw_info["' . $key . '"]="' . $val . '";'; $s .= "\n"; } } return $s; } // This will return the full phpgw_info array, used for debugging /*! @function debug_list_array_contents @abstract return the full phpgw_info array for debugging @param array - array */ function debug_list_array_contents($array) { while (list($key, $val) = each($array)) { if (is_array($val)) { while (list($key2, $val2) = each($val)) { if (is_array($val2)) { while (list($key3, $val3) = each ($val2)) { if (is_array($val3)) { while (list($key4, $val4) = each ($val3)) { echo $$array . "[$key][$key2][$key3][$key4]=$val4
"; } } else { echo $$array . "[$key][$key2][$key3]=$val3
"; } } } else { echo $$array . "[$key][$key2]=$val2
"; } } } else { echo $$array . "[$key]=$val
"; } } } // This will return a list of functions in the API /*! @function debug_list_core_functions @abstract return a list of functionsin the API */ function debug_list_core_functions() { echo '
core functions
'; echo '

';
			chdir(PHPGW_INCLUDE_ROOT . '/phpgwapi');
			system("grep -r '^[ \t]*function' *");
			echo '
'; } // This will return a value for the next id an app/class may need to insert values into ldap. /*! @function next_id @abstract return the next higher value for an integer, and increment it in the db. */ function next_id($appname,$min=0,$max=0) { if (!$appname) { return -1; } $GLOBALS['phpgw']->db->query("SELECT id FROM phpgw_nextid WHERE appname='".$appname."'",__LINE__,__FILE__); while( $GLOBALS['phpgw']->db->next_record() ) { $id = $GLOBALS['phpgw']->db->f('id'); } if (empty($id) || !$id) { $id = 1; $GLOBALS['phpgw']->db->query("INSERT INTO phpgw_nextid (appname,id) VALUES ('".$appname."',".$id.")",__LINE__,__FILE__); } elseif($id<$min) { $id = $min; $GLOBALS['phpgw']->db->query("UPDATE phpgw_nextid SET id=".$id." WHERE appname='".$appname."'",__LINE__,__FILE__); } elseif ($max && ($id > $max)) { return False; } else { $id = $id + 1; $GLOBALS['phpgw']->db->query("UPDATE phpgw_nextid SET id=".$id." WHERE appname='".$appname."'",__LINE__,__FILE__); } return intval($id); } // This will return a value for the last id entered, which an app may need to check // values for ldap. /*! @function last_id @abstract return the current id in the next_id table for a particular app/class. */ function last_id($appname,$min=0,$max=0) { if (!$appname) { return -1; } $GLOBALS['phpgw']->db->query("SELECT id FROM phpgw_nextid WHERE appname='".$appname."'",__LINE__,__FILE__); while( $GLOBALS['phpgw']->db->next_record() ) { $id = $GLOBALS['phpgw']->db->f('id'); } if (empty($id) || !$id) { if($min) { $id = $min; } else { $id = 1; } $GLOBALS['phpgw']->db->query("INSERT INTO phpgw_nextid (appname,id) VALUES ('".$appname."',".$id.")",__LINE__,__FILE__); } elseif($id<$min) { $id = $min; $GLOBALS['phpgw']->db->query("UPDATE phpgw_nextid SET id=".$id." WHERE appname='".$appname."'",__LINE__,__FILE__); } elseif ($max && ($id > $max)) { return False; } else { return intval($id); } } /* THIS FUNCTION IS NOT LONGER USED! */ function phpgw_header($forceheader = True, $forcenavbar = True) { /* not longer needed für xslttpl and would require to load the phpgw template */ } /* THIS FUNCTION IS NOT LONGER USED! */ function phpgw_appheader() { /*if (!is_array(MENUACTION)) { list($app,$class,$method) = explode('.',MENUACTION); if (is_array($GLOBALS[$class]->public_functions) && $GLOBALS[$class]->public_functions['header']) { $GLOBALS[$class]->header(); } } elseif (file_exists(PHPGW_APP_INC . '/header.inc.php')) { include(PHPGW_APP_INC . '/header.inc.php'); }*/ } /* THIS FUNCTION IS NOT LONGER USED! */ function phpgw_appfooter() { /*if (!is_array(MENUACTION)) { list($app,$class,$method) = explode('.',MENUACTION); if (is_array($GLOBALS[$class]->public_functions) && $GLOBALS[$class]->public_functions['footer']) { $GLOBALS[$class]->footer(); } } elseif (file_exists(PHPGW_APP_INC . '/footer.inc.php')) { include(PHPGW_APP_INC . '/footer.inc.php'); }*/ } /* Note: does nothing any more under XSLT */ function phpgw_footer() { } }//end common class