source: branches/2.2/phpgwapi/inc/class.common.inc.php @ 5111

Revision 5111, 60.8 KB checked in by diogenesduarte, 13 years ago (diff)

Ticket #2291 - Caso não encontre o usuário, indica que o usuário foi removido

  • Property svn:eol-style set to native
  • Property svn:executable set to *
Line 
1<?php
2  /**************************************************************************\
3  * eGroupWare API - Commononly used functions                               *
4  * This file written by Dan Kuykendall <seek3r@phpgroupware.org>            *
5  * and Joseph Engo <jengo@phpgroupware.org>                                 *
6  * and Mark Peters <skeeter@phpgroupware.org>                               *
7  * and Lars Kneschke <lkneschke@linux-at-work.de>                           *
8  * Functions commonly used by eGroupWare developers                         *
9  * Copyright (C) 2000, 2001 Dan Kuykendall                                  *
10  * Copyright (C) 2003 Lars Kneschke                                         *
11  * -------------------------------------------------------------------------*
12  * This library is part of the eGroupWare API                               *
13  * http://www.egroupware.org                                                *
14  * ------------------------------------------------------------------------ *
15  * This library is free software; you can redistribute it and/or modify it  *
16  * under the terms of the GNU Lesser General Public License as published by *
17  * the Free Software Foundation; either version 2.1 of the License,         *
18  * or any later version.                                                    *
19  * This library is distributed in the hope that it will be useful, but      *
20  * WITHOUT ANY WARRANTY; without even the implied warranty of               *
21  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.                     *
22  * See the GNU Lesser General Public License for more details.              *
23  * You should have received a copy of the GNU Lesser General Public License *
24  * along with this library; if not, write to the Free Software Foundation,  *
25  * Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA            *
26  \**************************************************************************/
27
28        function ldap_rebind($ldap_connection, $ldap_url)
29        {
30                @ldap_bind($ldap_connection, $GLOBALS['phpgw_info']['server']['user_ldap_referral'], $GLOBALS['phpgw_info']['server']['password_ldap_referral']);
31        }
32        $d1 = strtolower(@substr(PHPGW_API_INC,0,3));
33        $d2 = strtolower(@substr(PHPGW_SERVER_ROOT,0,3));
34        $d3 = strtolower(@substr(PHPGW_APP_INC,0,3));
35        if($d1 == 'htt' || $d1 == 'ftp' || $d2 == 'htt' || $d2 == 'ftp' || $d3 == 'htt' || $d3 == 'ftp')
36        {
37                echo 'Failed attempt to break in via an old Security Hole!<br>'."\n";
38                exit;
39        }
40        unset($d1);unset($d2);unset($d3);
41
42        /*!
43        @class common
44        @abstract common class that contains commonly used functions
45        */
46        class common
47        {
48                var $debug_info; // An array with debugging info from the API
49                var $found_files;
50
51                /*!
52                @function cmp_version
53                @abstract Compares two Version strings and return 1 if str2 is newest (bigger version number) than str1
54                @discussion This function checks for major version only.
55                @param $str1
56                @param $str2
57                */
58                function cmp_version($str1,$str2,$debug=False)
59                {
60                        ereg("([0-9]+)\.([0-9]+)\.([0-9]+)[a-zA-Z]*([0-9]*)",$str1,$regs);
61                        ereg("([0-9]+)\.([0-9]+)\.([0-9]+)[a-zA-Z]*([0-9]*)",$str2,$regs2);
62                        if($debug) { echo "<br>$regs[0] - $regs2[0]"; }
63
64                        for($i=1;$i<5;$i++)
65                        {
66                                if($debug) { echo "<br>$i: $regs[$i] - $regs2[$i]"; }
67                                if($regs2[$i] == $regs[$i])
68                                {
69                                        continue;
70                                }
71                                if($regs2[$i] > $regs[$i])
72                                {
73                                        return 1;
74                                }
75                                elseif($regs2[$i] < $regs[$i])
76                                {
77                                        return 0;
78                                }
79                        }
80                }
81
82                /*!
83                @function cmp_version_long
84                @abstract Compares two Version strings and return 1 if str2 is newest (bigger version number) than str1
85                @discussion This function checks all fields. cmp_version() checks release version only.
86                @param $str1
87                @param $str2
88                */
89                function cmp_version_long($str1,$str2,$debug=False)
90                {
91                        ereg("([0-9]+)\.([0-9]+)\.([0-9]+)[a-zA-Z]*([0-9]*)\.([0-9]*)",$str1,$regs);
92                        ereg("([0-9]+)\.([0-9]+)\.([0-9]+)[a-zA-Z]*([0-9]*)\.([0-9]*)",$str2,$regs2);
93                        if($debug) { echo "<br>$regs[0] - $regs2[0]"; }
94
95                        for($i=1;$i<6;$i++)
96                        {
97                                if($debug) { echo "<br>$i: $regs[$i] - $regs2[$i]"; }
98
99                                if($regs2[$i] == $regs[$i])
100                                {
101                                        if($debug) { echo ' are equal...'; }
102                                        continue;
103                                }
104                                if($regs2[$i] > $regs[$i])
105                                {
106                                        if($debug) { echo ', and a > b'; }
107                                        return 1;
108                                }
109                                elseif($regs2[$i] < $regs[$i])
110                                {
111                                        if($debug) { echo ', and a < b'; }
112                                        return 0;
113                                }
114                        }
115                        if($debug) { echo ' - all equal.'; }
116                }
117
118                // Convert an array into the format needed for the access column.
119                /*!
120                @function array_to_string
121                @abstract Convert an array into the format needed for the access column
122                @param $access
123                @param $array
124                */
125                function array_to_string($access,$array)
126                {
127                        $this->debug_info[] = 'array_to_string() is a depreciated function - use ACL instead';
128                        $s = '';
129                        if ($access == 'group' || $access == 'public' || $access == 'none')
130                        {
131                                if (count($array))
132                                {
133                                        while ($t = each($array))
134                                        {
135                                                $s .= ',' . $t[1];
136                                        }
137                                        $s .= ',';
138                                }
139                                if (! count($array) && $access == 'none')
140                                {
141                                        $s = '';
142                                }
143                        }
144                        return $s;
145                }
146
147                // This is used for searching the access fields
148                /*!
149                @function sql_search
150                @abstract this function is used for searching the access fields
151                @param $table
152                @param $owner
153                */
154                function sql_search($table,$owner=0)
155                {
156                        $this->debug_info[] = 'sql_search() is a deprecated function - use ACL instead';
157                        $s = '';
158                        if (!$owner)
159                        {
160                                $owner = $GLOBALS['phpgw_info']['user']['account_id'];
161                        }
162                        $groups = $GLOBALS['phpgw']->accounts->membership((int)$owner);
163                        if(@is_array($groups))
164                        {
165                                while ($group = each($groups))
166                                {
167                                        $s .= " OR $table LIKE '%," . $group[2] . ",%'";
168                                }
169                        }
170                        return $s;
171                }
172
173                // return a array of installed languages
174                /*!
175                @function getInstalledLanguages
176                @abstract return an array of installed languages
177                @result $installedLanguages; an array containing the installed languages
178                */
179                function getInstalledLanguages()
180                {
181                        $GLOBALS['phpgw']->db->query('SELECT DISTINCT lang FROM phpgw_lang');
182                        while (@$GLOBALS['phpgw']->db->next_record())
183                        {
184                                $installedLanguages[$GLOBALS['phpgw']->db->f('lang')] = $GLOBALS['phpgw']->db->f('lang');
185                        }
186
187                        return $installedLanguages;
188                }
189
190                // return the preferred language of the users
191                // it's using HTTP_ACCEPT_LANGUAGE (send from the users browser)
192                // and ...(to find out which languages are installed)
193                /*!
194                @function getPreferredLanguage
195                @abstract return the preferred langugae of the users
196                @discussion it uses HTTP_ACCEPT_LANGUAGE (from the users browser) <br>
197                and .... to find out which languages are installed
198                */
199                function getPreferredLanguage()
200                {
201                        // create a array of languages the user is accepting
202                        $userLanguages = explode(',',$_SERVER['HTTP_ACCEPT_LANGUAGE']);
203                        $supportedLanguages = $this->getInstalledLanguages();
204
205                        // find usersupported language
206//                      while (list($key,$value) = each($userLanguages))
207                        foreach($userLanguages as $key => $value)
208                        {
209                                // remove everything behind '-' example: de-de
210                                $value = trim($value);
211                                $pieces = explode('-', $value);
212                                $value = $pieces[0];
213                                # print 'current lang $value<br>';
214                                if ($supportedLanguages[$value])
215                                {
216                                        $retValue=$value;
217                                        break;
218                                }
219                        }
220
221                        // no usersupported language found -> return english
222                        if (empty($retValue))
223                        {
224                                $retValue='en';
225                        }
226
227                        return $retValue;
228                }
229
230                /*!
231                @function ldap_addslashes
232                @abstract escapes a string for use in searchfilters meant for ldap_search.
233                Escaped Characters are: '*', '(', ')', ' ', '\', NUL
234                It's actually a PHP-Bug, that we have to escape space.
235                For all other Characters, refer to RFC2254.
236                @param $string string to be escaped
237                */
238                function ldap_addslashes($string='')
239                {
240                        return str_replace(array('\\','*','(',')','\0',' '),array('\\\\','\*','\(','\)','\\0','\20'),$string);
241                }
242
243                // connect to the ldap server and return a handle
244                /*!
245                @function ldapConnect
246                @abstract connect to the ldap server and return a handle
247                @param $host ldap host
248                @param $dn ldap_root_dn
249                @param $passwd ldap_root_pw
250                */
251                function ldapConnect($host='', $dn='', $passwd='', $ldapreferral=false) #default: dont follow the referral
252                {
253                       
254                        if(!$host || $host == $GLOBALS['phpgw_info']['server']['ldap_host']) {                       
255                                $dn     = $dn ? $dn : $GLOBALS['phpgw_info']['server']['ldap_root_dn'];
256                                $passwd = $passwd ? $passwd : $GLOBALS['phpgw_info']['server']['ldap_root_pw'];
257                                $host   = $host ? $host : $GLOBALS['phpgw_info']['server']['ldap_host'];
258                        }
259
260                        /*else if(strstr($host, "ldap://")){
261                                $dn = '';
262                                $passwd = '';
263                        }*/
264
265                        if(!function_exists('ldap_connect'))
266                        {
267                                /* log does not exist in setup(, yet) */
268                                if(is_object($GLOBALS['phpgw']->log))
269                                {
270                                        $GLOBALS['phpgw']->log->message('F-Abort, LDAP support unavailable');
271                                        $GLOBALS['phpgw']->log->commit();
272                                }
273
274                                printf('<b>Error: LDAP support unavailable</b><br>',$host);
275                                return False;
276                        }
277
278                        // connect to ldap server
279                        if(!$ds = ldap_connect($host))
280                        {
281                                /* log does not exist in setup(, yet) */
282                                if(is_object($GLOBALS['phpgw']->log))
283                                {
284                                        $GLOBALS['phpgw']->log->message('F-Abort, Failed connecting to LDAP server');
285                                        $GLOBALS['phpgw']->log->commit();
286                                }
287
288                                printf("<b>Error: Can't connect to LDAP server %s!</b><br>",$host);
289                                return False;
290                        }
291
292                        if($GLOBALS['phpgw_info']['server']['ldap_version3'])
293                        {
294                                if(!ldap_set_option($ds,LDAP_OPT_PROTOCOL_VERSION,3))
295                                {
296                                        $GLOBALS['phpgw_info']['server']['ldap_version3'] = False;
297                                }
298                        }
299                       
300                        ldap_set_option($ds, LDAP_OPT_REFERRALS, $ldapreferral);
301                        if($ldapreferral){
302                                $GLOBALS['phpgw_info']['server']['user_ldap_referral'] = $dn;
303                                $GLOBALS['phpgw_info']['server']['password_ldap_referral'] = $passwd;
304                                ldap_set_rebind_proc($ds, ldap_rebind);
305                        }
306                        // bind as admin
307                        if($dn && $passwd && !@ldap_bind($ds,$dn,$passwd))
308                        {                               
309                                // Try rebind for connection problem
310                                if(!@ldap_bind($ds,$dn,$passwd)) {
311                                        if(is_object($GLOBALS['phpgw']->log))
312                                        {
313                                                $GLOBALS['phpgw']->log->message('F-Abort, Failed binding to LDAP server');
314                                                $GLOBALS['phpgw']->log->commit();
315                                        }
316
317                                        if(function_exists("lang"))
318                                                echo '<div style="border: 2px dashed red; top: 0px; left: 0px; position: absolute; background-color: #EEE; width: 260px;">'.
319                                                        '<center><img src="../admin/templates/default/images/navbar.png"><br>'.
320                                                        lang("Catalog is out of service, you will not able to do some operations").'</center></div>';
321                                        else
322                                                printf("Error: Can't bind to LDAP server (invalid credentials): %s",$dn);
323                                        return False;
324                                }
325                        }
326                        // bind as anonymous
327                        if(!$dn && !$passwd && !@ldap_bind($ds))
328                        {
329                                if(is_object($GLOBALS['phpgw']->log))
330                                {
331                                        $GLOBALS['phpgw']->log->message('F-Abort, Failed  (anonymous bind) to LDAP server');
332                                        $GLOBALS['phpgw']->log->commit();
333                                }
334                                if(function_exists("lang"))
335                                                echo '<div style="border: 2px dashed red; top: 0px; left: 0px; position: absolute; background-color: #EEE; width: 260px;">'.
336                                                        '<center><img src="../admin/templates/default/images/navbar.png"><br>'.
337                                                        lang("Catalog is out of service, you will not able to do some operations").'</center></div>';
338                                else
339                                        printf("Error: Can't bind to LDAP server (anonymous bind): %s",$dn);
340                                return False;
341                        }                                               
342                        return $ds;
343                }
344
345                // This function is used if the developer wants to stop a running app in the middle of execution
346                // We may need to do some clean up before hand
347                /*!
348                @function phpgw_exit
349                @abstract function to stop running an app
350                @discussion used to stop running an app in the middle of execution <br>
351                There may need to be some cleanup before hand
352                @param $call_footer boolean value to if true then call footer else exit
353                */
354                function phpgw_exit($call_footer = False)
355                {
356                        if (!defined('PHPGW_EXIT'))
357                        {
358                                define('PHPGW_EXIT',True);
359
360                                if ($call_footer)
361                                {
362                                        $this->phpgw_footer();
363                                }
364                        }
365                        exit;
366                }
367
368                function phpgw_final()
369                {
370                        if (!defined('PHPGW_FINAL'))
371                        {
372                                define('PHPGW_FINAL',True);
373
374                                /*if (is_object($GLOBALS['phpgw']->accounts))
375                                {
376                                        $GLOBALS['phpgw']->accounts->save_session_cache();
377                                }*/
378                                // call the asyncservice check_run function if it is not explicitly set to cron-only
379                                //
380                                if (!$GLOBALS['phpgw_info']['server']['asyncservice'])  // is default
381                                {
382                                        ExecMethod('phpgwapi.asyncservice.check_run','fallback');
383                                }
384                                /* Clean up mcrypt */
385                                if (@is_object($GLOBALS['phpgw']->crypto))
386                                {
387                                        $GLOBALS['phpgw']->crypto->cleanup();
388                                        unset($GLOBALS['phpgw']->crypto);
389                                }
390                                $GLOBALS['phpgw']->db->disconnect();
391                        }
392                }
393
394                /*!
395                @function randomstring
396                @abstract return a random string of size $size
397                @param $size int-size of random string to return
398                */
399                function randomstring($size)
400                {
401                        $s = '';
402                        srand((double)microtime()*1000000);
403                        $random_char = array(
404                                '0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f',
405                                'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v',
406                                'w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L',
407                                'M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'
408                        );
409
410                        for ($i=0; $i<$size; $i++)
411                        {
412                                $s .= $random_char[rand(1,61)];
413                        }
414                        return $s;
415                }
416
417                // Look at the note towards the top of this file (jengo)
418                function filesystem_separator()
419                {
420                        return filesystem_separator();
421                }
422
423                /*!
424                @function error_list
425                @abstract This is used for reporting errors in a nice format.
426                @param $error - array of errors
427                */
428                function error_list($errors,$text='Error')
429                {
430                        if (! is_array($errors))
431                        {
432                                return False;
433                        }
434
435                        $html_error = '<table border="0" width="100%"><tr><td align="right"><b>' . lang($text)
436                                . '</b>: </td><td align="left">' . $errors[0] . '</td></tr>';
437                        for ($i=1; $i<count($errors); $i++)
438                        {
439                                $html_error .= '<tr><td>&nbsp;</td><td align="left">' . $errors[$i] . '</td></tr>';
440                        }
441                        return $html_error . '</table>';
442                }
443
444                /*!
445                @function check_owner
446                @abstract none yet
447                @param $record ?
448                @param $link ?
449                @param $label ?
450                @param $extravars
451                */
452                // This is a depreciated function - use ACL instead (jengo)
453                function check_owner($record,$link,$label,$extravars = '')
454                {
455                        $this->debug_info[] = 'check_owner() is a depreciated function - use ACL instead';
456                        /*
457                        $s = '<a href="' . $GLOBALS['phpgw']->link($link,$extravars) . '"> ' . lang($label) . ' </a>';
458                        if (ereg('^[0-9]+$',$record))
459                        {
460                                if ($record != $GLOBALS['phpgw_info']['user']['account_id'])
461                                {
462                                        $s = '&nbsp;';
463                                }
464                        }
465                        else
466                        {
467                                if ($record != $GLOBALS['phpgw_info']['user']['userid'])
468                                {
469                                        $s = '&nbsp';
470                                }
471                        }
472
473                        return $s;
474                        */
475                }
476
477                /*!
478                @function display_fullname
479                @abstract return the fullname of a user
480                @param $lid account loginid
481                @param $firstname firstname
482                @param $lastname lastname
483                */
484                function display_fullname($lid = '', $firstname = '', $lastname = '')
485                {
486                        if (! $lid && ! $firstname && ! $lastname)
487                        {
488                                $lid       = $GLOBALS['phpgw_info']['user']['account_lid'];
489                                $firstname = $GLOBALS['phpgw_info']['user']['firstname'];
490                                $lastname  = $GLOBALS['phpgw_info']['user']['lastname'];
491                        }
492
493                        $display = $GLOBALS['phpgw_info']['user']['preferences']['common']['account_display'];
494
495                        if ($firstname && $lastname)
496                        {
497                                $delimiter = ', ';
498                        }
499                        else
500                        {
501                                $delimiter = '';
502                        }
503                       
504                        $name = '';
505                        switch($display)
506                        {
507                                case 'firstname':
508                                        $name = $firstname . ' ' . $lastname;
509                                        break;
510                                case 'lastname':
511                                        $name = $lastname . $delimiter . $firstname;
512                                        break;
513                                case 'username':
514                                        $name = $lid;
515                                        break;
516                                case 'firstall':
517                                        $name = $firstname . ' ' . $lastname . ' ['.$lid.']';
518                                        break;
519                                case 'lastall':
520                                        $name = $lastname . $delimiter . $firstname . ' ['.$lid.']';
521                                        break;
522                                case 'all':
523                                        /* fall through */
524                                default:
525                                        $name = '['.$lid.'] ' . $firstname . ' ' . $lastname;
526                        }
527                        return $name;
528                }
529
530                /*!
531                @function grab_owner_name
532                @abstract grab the owner name
533                @param $id account id
534                */
535                function grab_owner_name($accountid = '')
536                {
537                        $GLOBALS['phpgw']->accounts->get_account_name($accountid,$lid,$fname,$lname);
538                        if (! $lid && ! $firstname && ! $lastname) {
539                                return "( " . lang("removed user") . " )";     
540                        }
541                        return $this->display_fullname($lid,$fname,$lname);
542                }
543
544                /*!
545                @function create_tabs
546                @abstract create tabs
547                @param $tabs ?
548                @param $selected ?
549                @param $fontsize optional
550                */
551                function create_tabs($tabs, $selected, $fontsize = '')
552                {
553                        $output_text = '<table border="0" cellspacing="0" cellpadding="0"><tr>';
554
555                        /* This is a php3 workaround */
556                        if(PHPGW_IMAGES_DIR == 'PHPGW_IMAGES_DIR')
557                        {
558                                $ir = ExecMethod('phpgwapi.phpgw.common.get_image_path', 'phpgwapi');
559                        }
560                        else
561                        {
562                                $ir = PHPGW_IMAGES_DIR;
563                        }
564
565                        if ($fontsize)
566                        {
567                                $fs  = '<font size="' . $fontsize . '">';
568                                $fse = '</font>';
569                        }
570
571                        $i = 1;
572                        while ($tab = each($tabs))
573                        {
574                                if ($tab[0] == $selected)
575                                {
576                                        if ($i == 1)
577                                        {
578                                                $output_text .= '<td align="right"><img src="' . $ir . '/tabs-start1.gif"></td>';
579                                        }
580
581                                        $output_text .= '<td align="left" background="' . $ir . '/tabs-bg1.gif">&nbsp;<b><a href="'
582                                                . $tab[1]['link'] . '" class="tablink" '.$tab[1]['target'].'>' . $fs . $tab[1]['label']
583                                                . $fse . '</a></b>&nbsp;</td>';
584                                        if ($i == count($tabs))
585                                        {
586                                                $output_text .= '<td align="left"><img src="' . $ir . '/tabs-end1.gif"></td>';
587                                        }
588                                        else
589                                        {
590                                                $output_text .= '<td align="left"><img src="' . $ir . '/tabs-sepr.gif"></td>';
591                                        }
592                                }
593                                else
594                                {
595                                        if ($i == 1)
596                                        {
597                                                $output_text .= '<td align="right"><img src="' . $ir . '/tabs-start0.gif"></td>';
598                                        }
599                                        $output_text .= '<td align="left" background="' . $ir . '/tabs-bg0.gif">&nbsp;<b><a href="'
600                                                . $tab[1]['link'] . '" class="tablink" '.$tab[1]['target'].'>' . $fs . $tab[1]['label'] . $fse
601                                                . '</a></b>&nbsp;</td>';
602                                        if (($i + 1) == $selected)
603                                        {
604                                                $output_text .= '<td align="left"><img src="' . $ir . '/tabs-sepl.gif"></td>';
605                                        }
606                                        elseif ($i == $selected || $i != count($tabs))
607                                        {
608                                                $output_text .= '<td align="left"><img src="' . $ir . '/tabs-sepm.gif"></td>';
609                                        }
610                                        elseif ($i == count($tabs))
611                                        {
612                                                if ($i == $selected)
613                                                {
614                                                        $output_text .= '<td align="left"><img src="' . $ir . '/tabs-end1.gif"></td>';
615                                                }
616                                                else
617                                                {
618                                                        $output_text .= '<td align="left"><img src="' . $ir . '/tabs-end0.gif"></td>';
619                                                }
620                                        }
621                                        else
622                                        {
623                                                if ($i != count($tabs))
624                                                {
625                                                        $output_text .= '<td align="left"><img src="' . $ir . '/tabs-sepr.gif"></td>';
626                                                }
627                                        }
628                                }
629                                $i++;
630                                $output_text .= "\n";
631                        }
632                        $output_text .= "</table>\n";
633                        return $output_text;
634                }
635
636                /*!
637                @function get_app_dir
638                @abstract get directory of application
639                @discussion $appname can either be passed or derived from $phpgw_info['flags']['currentapp'];
640                @param $appname name of application
641                */
642                function get_app_dir($appname = '')
643                {
644                        if ($appname == '')
645                        {
646                                $appname = $GLOBALS['phpgw_info']['flags']['currentapp'];
647                        }
648                        if ($appname == 'home' || $appname == 'logout' || $appname == 'login')
649                        {
650                                $appname = 'phpgwapi';
651                        }
652
653                        $appdir         = PHPGW_INCLUDE_ROOT . '/'.$appname;
654                        $appdir_default = PHPGW_SERVER_ROOT . '/'.$appname;
655
656                        if (@is_dir ($appdir))
657                        {
658                                return $appdir;
659                        }
660                        elseif (@is_dir ($appdir_default))
661                        {
662                                return $appdir_default;
663                        }
664                        else
665                        {
666                                return False;
667                        }
668                }
669
670                /*!
671                @function get_inc_dir
672                @abstract get inc (include dir) of application
673                @discussion $appname can either be passed or derived from $phpgw_info['flags']['currentapp'];
674                @param $appname name of application
675                */
676                function get_inc_dir($appname = '')
677                {
678                        if (! $appname)
679                        {
680                                $appname = $GLOBALS['phpgw_info']['flags']['currentapp'];
681                        }
682                        if ($appname == 'home' || $appname == 'logout' || $appname == 'login' || $appname == 'about')
683                        {
684                                $appname = 'phpgwapi';
685                        }
686
687                        $incdir         = PHPGW_INCLUDE_ROOT . '/' . $appname . '/inc';
688                        $incdir_default = PHPGW_SERVER_ROOT . '/' . $appname . '/inc';
689
690                        if (@is_dir ($incdir))
691                        {
692                                return $incdir;
693                        }
694                        elseif (@is_dir ($incdir_default))
695                        {
696                                return $incdir_default;
697                        }
698                        else
699                        {
700                                return False;
701                        }
702                }
703
704                /*!
705                @function list_themes
706                @abstract list themes available
707                @note themes can either be css file like in HEAD (if the template has a css-dir and has css-files in is) \
708                        or ordinary .14 themes-files
709                */
710                function list_themes()
711                {
712                        $tpl_dir = $this->get_tpl_dir('phpgwapi');
713
714                        if ($dh = @opendir($tpl_dir . SEP . 'css'))
715                        {
716                                while ($file = readdir($dh))
717                                {
718                                        if (eregi("\.css$", $file) && $file != 'phpgw.css')
719                                        {
720                                                $list[] = substr($file,0,strpos($file,'.'));
721                                        }
722                                }
723                        }
724                        if(!is_array($list))
725                        {
726                                $dh = opendir(PHPGW_SERVER_ROOT . '/phpgwapi/themes');
727                                while ($file = readdir($dh))
728                                {
729                                        if (eregi("\.theme$", $file))
730                                        {
731                                                $list[] = substr($file,0,strpos($file,'.'));
732                                        }
733                                }
734                        }
735                        closedir($dh);
736                        reset ($list);
737                        sort  ($list);
738                        return $list;
739                }
740
741                /**
742                * List available templates
743                *
744                * @returns array alphabetically sorted list of templates
745                */
746                function list_templates()
747                {
748                        $d = dir(PHPGW_SERVER_ROOT . '/phpgwapi/templates');
749                        while ($entry=$d->read())
750                        {
751                                if ($entry != '.' && $entry != '..' && is_dir(PHPGW_SERVER_ROOT . '/phpgwapi/templates/' . $entry) && !is_link(PHPGW_SERVER_ROOT . '/phpgwapi/templates/' . $entry) && file_exists(PHPGW_SERVER_ROOT . '/phpgwapi/templates/' . $entry . '/head.inc.php'))
752                                {
753                                        $list[$entry]['title'] = $entry;
754                                        $list[$entry]['name'] = $entry;
755
756                                        $f = PHPGW_SERVER_ROOT . '/phpgwapi/templates/' . $entry . '/details.inc.php';
757                                        if (file_exists ($f))
758                                        {
759                                                include($f);
760                                                if ( defined( $entry.'_TEMPLATE_TITLE' ) )
761                                                        $list[$entry]['title'] = utf8_decode( constant($entry.'_TEMPLATE_TITLE') );
762                                        }
763                                }
764                        }
765                        $d->close();
766                        ksort($list);
767                        return $list;
768                }
769
770                /*!
771                @function get_tpl_dir
772                @abstract get template dir of an application
773                @param $appname appication name optional can be derived from $phpgw_info['flags']['currentapp'];
774                */
775                function get_tpl_dir($appname = '')
776                {
777                        if (! $appname)
778                        {
779                                $appname = $GLOBALS['phpgw_info']['flags']['currentapp'];
780                        }
781                        if ($appname == 'home' || $appname == 'logout' || $appname == 'login')
782                        {
783                                $appname = 'phpgwapi';
784                        }
785
786                        if (!isset($GLOBALS['phpgw_info']['server']['template_set']) && isset($GLOBALS['phpgw_info']['user']['preferences']['common']['template_set']))
787                        {
788                                $GLOBALS['phpgw_info']['server']['template_set'] = $GLOBALS['phpgw_info']['user']['preferences']['common']['template_set'];
789                        }
790
791                        // Setting this for display of template choices in user preferences
792                        if ($GLOBALS['phpgw_info']['server']['template_set'] == 'user_choice')
793                        {
794                                $GLOBALS['phpgw_info']['server']['usrtplchoice'] = 'user_choice';
795                        }
796
797                        if (($GLOBALS['phpgw_info']['server']['template_set'] == 'user_choice' ||
798                                !isset($GLOBALS['phpgw_info']['server']['template_set'])) &&
799                                isset($GLOBALS['phpgw_info']['user']['preferences']['common']['template_set']))
800                        {
801                                $GLOBALS['phpgw_info']['server']['template_set'] = $GLOBALS['phpgw_info']['user']['preferences']['common']['template_set'];
802                        }
803                        elseif ($GLOBALS['phpgw_info']['server']['template_set'] == 'user_choice' ||
804                                !isset($GLOBALS['phpgw_info']['server']['template_set']))
805                        {
806                                $GLOBALS['phpgw_info']['server']['template_set'] = 'default';
807                        }
808
809                        $tpldir         = PHPGW_SERVER_ROOT . '/' . $appname . '/templates/' . $GLOBALS['phpgw_info']['server']['template_set'];
810                        $tpldir_default = PHPGW_SERVER_ROOT . '/' . $appname . '/templates/default';
811
812                        if (@is_dir($tpldir))
813                        {
814                                return $tpldir;
815                        }
816                        elseif (@is_dir($tpldir_default))
817                        {
818                                return $tpldir_default;
819                        }
820                        else
821                        {
822                                return False;
823                        }
824                }
825
826                /*!
827                @function is_image_dir
828                @abstract checks if image_dir exists and has more than just a navbar-icon
829                @note this is just a workaround for idots, better to use find_image, which has a fallback \
830                        on a per image basis to the default dir
831                */
832                function is_image_dir($dir)
833                {
834                        if (!@is_dir($dir))
835                        {
836                                return False;
837                        }
838                        if ($d = opendir($dir))
839                        {
840                                while ($f = readdir($d))
841                                {
842                                        $ext = strtolower(strrchr($f,'.'));
843                                        if (($ext == '.gif' || $ext == '.png') && strstr($f,'navbar') === False)
844                                        {
845                                                return True;
846                                        }
847                                }
848                        }
849                        return False;
850                }
851
852                /*!
853                @function get_image_dir
854                @abstract get image dir of an application
855                @param $appname application name optional can be derived from $phpgw_info['flags']['currentapp'];
856                */
857                function get_image_dir($appname = '')
858                {
859                        if ($appname == '')
860                        {
861                                $appname = $GLOBALS['phpgw_info']['flags']['currentapp'];
862                        }
863                        if (empty($GLOBALS['phpgw_info']['server']['template_set']))
864                        {
865                                $GLOBALS['phpgw_info']['server']['template_set'] = 'default';
866                        }
867
868                        $imagedir            = PHPGW_SERVER_ROOT . '/' . $appname . '/templates/'
869                                . $GLOBALS['phpgw_info']['server']['template_set'] . '/images';
870                        $imagedir_default    = PHPGW_SERVER_ROOT . '/' . $appname . '/templates/default/images';
871                        $imagedir_olddefault = PHPGW_SERVER_ROOT . '/' . $appname . '/images';
872
873                        if ($this->is_image_dir ($imagedir))
874                        {
875                                return $imagedir;
876                        }
877                        elseif ($this->is_image_dir ($imagedir_default))
878                        {
879                                return $imagedir_default;
880                        }
881                        elseif ($this->is_image_dir ($imagedir_olddefault))
882                        {
883                                return $imagedir_olddefault;
884                        }
885                        else
886                        {
887                                return False;
888                        }
889                }
890
891                /*!
892                @function get_image_path
893                @abstract get image path of an application
894                @param $appname appication name optional can be derived from $phpgw_info['flags']['currentapp'];
895                */
896                function get_image_path($appname = '')
897                {
898                        if ($appname == '')
899                        {
900                                $appname = $GLOBALS['phpgw_info']['flags']['currentapp'];
901                        }
902
903                        if (empty($GLOBALS['phpgw_info']['server']['template_set']))
904                        {
905                                $GLOBALS['phpgw_info']['server']['template_set'] = 'default';
906                        }
907
908                        $imagedir            = PHPGW_SERVER_ROOT . '/'.$appname.'/templates/'.$GLOBALS['phpgw_info']['server']['template_set'].'/images';
909                        $imagedir_default    = PHPGW_SERVER_ROOT . '/'.$appname.'/templates/default/images';
910                        $imagedir_olddefault = PHPGW_SERVER_ROOT . '/'.$appname.'/images';
911
912                        if ($this->is_image_dir ($imagedir))
913                        {
914                                return $GLOBALS['phpgw_info']['server']['webserver_url'].'/'.$appname.'/templates/'.$GLOBALS['phpgw_info']['server']['template_set'].'/images';
915                        }
916                        elseif ($this->is_image_dir ($imagedir_default))
917                        {
918                                return $GLOBALS['phpgw_info']['server']['webserver_url'].'/'.$appname.'/templates/default/images';
919                        }
920                        elseif ($this->is_image_dir ($imagedir_olddefault))
921                        {
922                                return $GLOBALS['phpgw_info']['server']['webserver_url'].'/'.$appname.'/images';
923                        }
924                        else
925                        {
926                                return False;
927                        }
928                }
929
930                function find_image($appname,$image)
931                {
932                        $imagedir = '/'.$appname.'/templates/'.$GLOBALS['phpgw_info']['user']['preferences']['common']['template_set'].'/images';
933                       
934                        if (!@is_array($this->found_files[$appname]))
935                        {
936                                $imagedir_olddefault = '/'.$appname.'/images';
937                                $imagedir_default    = '/'.$appname.'/templates/default/images';
938                               
939                                if (@is_dir(PHPGW_INCLUDE_ROOT.$imagedir_olddefault))
940                                {
941                                        $d = dir(PHPGW_INCLUDE_ROOT.$imagedir_olddefault);
942                                        while (false != ($entry = $d->read()))
943                                        {
944                                                if ($entry != '.' && $entry != '..')
945                                                {
946                                                        $this->found_files[$appname][$entry] = $imagedir_olddefault;
947                                                }
948                                        }
949                                        $d->close();
950                                }
951
952                                if (@is_dir(PHPGW_INCLUDE_ROOT.$imagedir_default))
953                                {
954                                        $d = dir(PHPGW_INCLUDE_ROOT.$imagedir_default);
955                                        while (false != ($entry = $d->read()))
956                                        {
957                                                if ($entry != '.' && $entry != '..')
958                                                {
959                                                        $this->found_files[$appname][$entry] = $imagedir_default;
960                                                }
961                                        }
962                                        $d->close();
963                                }
964
965                                if (@is_dir(PHPGW_INCLUDE_ROOT.$imagedir))
966                                {
967                                        $d = dir(PHPGW_INCLUDE_ROOT.$imagedir);
968                                        while (false != ($entry = $d->read()))
969                                        {
970                                                if ($entry != '.' && $entry != '..')
971                                                {
972                                                        $this->found_files[$appname][$entry] = $imagedir;
973                                                }
974                                        }
975                                        $d->close();
976                                }
977                        }
978                       
979                        if (!$GLOBALS['phpgw_info']['server']['image_type'])
980                        {
981                                // priority: GIF->JPG->PNG
982                                $img_type=array('.gif','.jpg','.png');
983                        }
984                        else
985                        {
986                                // priority: : PNG->JPG->GIF
987                                $img_type=array('.png','.jpg','.gif');
988                        }
989
990                        // first look in the selected template dir
991                        if(@$this->found_files[$appname][$image.$img_type[0]]==$imagedir)
992                        {
993                                $imgfile = $GLOBALS['phpgw_info']['server']['webserver_url'].$this->found_files[$appname][$image.$img_type[0]].'/'.$image.$img_type[0];
994                        }
995                        elseif(@$this->found_files[$appname][$image.$img_type[1]]==$imagedir)
996                        {
997                                $imgfile = $GLOBALS['phpgw_info']['server']['webserver_url'].$this->found_files[$appname][$image.$img_type[1]].'/'.$image.$img_type[1];
998                        }
999                        elseif(@$this->found_files[$appname][$image.$img_type[2]]==$imagedir)
1000                        {
1001                                $imgfile = $GLOBALS['phpgw_info']['server']['webserver_url'].$this->found_files[$appname][$image.$img_type[2]].'/'.$image.$img_type[2];
1002                        }
1003                        // then look everywhere else
1004                        elseif(isset($this->found_files[$appname][$image.$img_type[0]]))
1005                        {
1006                                $imgfile = $GLOBALS['phpgw_info']['server']['webserver_url'].$this->found_files[$appname][$image.$img_type[0]].'/'.$image.$img_type[0];
1007                        }
1008                        elseif(isset($this->found_files[$appname][$image.$img_type[1]]))
1009                        {
1010                                $imgfile = $GLOBALS['phpgw_info']['server']['webserver_url'].$this->found_files[$appname][$image.$img_type[1]].'/'.$image.$img_type[1];
1011                        }
1012                        elseif(isset($this->found_files[$appname][$image.$img_type[2]]))
1013                        {
1014                                $imgfile = $GLOBALS['phpgw_info']['server']['webserver_url'].$this->found_files[$appname][$image.$img_type[2]].'/'.$image.$img_type[2];
1015                        }
1016                        elseif(isset($this->found_files[$appname][$image]))
1017                        {
1018                                $imgfile = $GLOBALS['phpgw_info']['server']['webserver_url'].$this->found_files[$appname][$image].'/'.$image;
1019                        }
1020                        else
1021                        {
1022                                // searching the image in the api-dirs
1023                                if (!isset($this->found_files['phpgwapi']))
1024                                {
1025                                        $this->find_image('phpgwapi','');
1026                                }
1027
1028                                if(isset($this->found_files['phpgwapi'][$image.$img_type[0]]))
1029                                {
1030                                        $imgfile = $GLOBALS['phpgw_info']['server']['webserver_url'].$this->found_files['phpgwapi'][$image.$img_type[0]].'/'.$image.$img_type[0];
1031                                }
1032                                elseif(isset($this->found_files['phpgwapi'][$image.$img_type[1]]))
1033                                {
1034                                        $imgfile = $GLOBALS['phpgw_info']['server']['webserver_url'].$this->found_files['phpgwapi'][$image.$img_type[1]].'/'.$image.$img_type[1];
1035                                }
1036                                elseif(isset($this->found_files['phpgwapi'][$image.$img_type[2]]))
1037                                {
1038                                        $imgfile = $GLOBALS['phpgw_info']['server']['webserver_url'].$this->found_files['phpgwapi'][$image.$img_type[2]].'/'.$image.$img_type[2];
1039                                }
1040                                elseif(isset($this->found_files['phpgwapi'][$image]))
1041                                {
1042                                        $imgfile = $GLOBALS['phpgw_info']['server']['webserver_url'].$this->found_files['phpgwapi'][$image].'/'.$image;
1043                                }
1044                                else
1045                                {
1046                                        $imgfile = '';
1047                                }
1048                        }
1049                        return $imgfile;
1050                }
1051
1052                function image($appname,$image='',$ext='',$use_lang=True)
1053                {
1054                        if (!is_array($image))
1055                        {
1056                                if (empty($image))
1057                                {
1058                                        return '';
1059                                }
1060                                $image = array($image);
1061                        }
1062                        if ($use_lang)
1063                        {
1064                                while (list(,$img) = each($image))
1065                                {
1066                                        $lang_images[] = $img . '_' . $GLOBALS['phpgw_info']['user']['preferences']['common']['lang'];
1067                                        $lang_images[] = $img;
1068                                }
1069                                $image = $lang_images;
1070                        }
1071                        while (empty($image_found) && list(,$img) = each($image))
1072                        {
1073                                if(isset($this->found_files[$appname][$img.$ext]))
1074                                {
1075                                        $image_found = $GLOBALS['phpgw_info']['server']['webserver_url'].$this->found_files[$appname][$img.$ext].'/'.$img.$ext;
1076                                }
1077                                else
1078                                {
1079                                        $image_found = $this->find_image($appname,$img.$ext);
1080                                }
1081                        }
1082                        return $image_found;
1083                }
1084
1085                function image_on($appname,$image,$extension='_on')
1086                {
1087                        $with_extension = $this->image($appname,$image,$extension);
1088                        $without_extension = $this->image($appname,$image);
1089                        if($with_extension != '')
1090                        {
1091                                return $with_extension;
1092                        }
1093                        elseif($without_extension != '')
1094                        {
1095                                return $without_extension;
1096                        }
1097                        else
1098                        {
1099                                return '';
1100                        }
1101                }
1102
1103                /*!
1104                @function navbar
1105                @abstract none yet
1106                @discussion *someone wanna add some detail here*
1107                */
1108                function navbar()
1109                {
1110                        $GLOBALS['phpgw_info']['navbar']['home']['title'] = 'Home';
1111                        $GLOBALS['phpgw_info']['navbar']['home']['url']   = $GLOBALS['phpgw']->link('/home.php');
1112                        $GLOBALS['phpgw_info']['navbar']['home']['icon']  = $this->image('phpgwapi',Array('home','nonav'));
1113                        $GLOBALS['phpgw_info']['navbar']['home']['icon_hover']  = $this->image_on('phpgwapi',Array('home','nonav'),'-over');
1114
1115                        list($first) = each($GLOBALS['phpgw_info']['user']['apps']);
1116                        if(is_array($GLOBALS['phpgw_info']['user']['apps']['admin']) && $first != 'admin')
1117                        {
1118                                $newarray['admin'] = $GLOBALS['phpgw_info']['user']['apps']['admin'];
1119                                foreach($GLOBALS['phpgw_info']['user']['apps'] as $index => $value)
1120                                {
1121                                        if($index != 'admin')
1122                                        {
1123                                                $newarray[$index] = $value;
1124                                        }
1125                                }
1126                                $GLOBALS['phpgw_info']['user']['apps'] = $newarray;
1127                                reset($GLOBALS['phpgw_info']['user']['apps']);
1128                        }
1129                        unset($index);
1130                        unset($value);
1131                        unset($newarray);
1132
1133                        foreach($GLOBALS['phpgw_info']['user']['apps'] as $app => $data)
1134                        {
1135                                if (is_long($app))
1136                                {
1137                                        continue;
1138                                }
1139
1140                                if ($app == 'preferences' || $GLOBALS['phpgw_info']['apps'][$app]['status'] != 2 && $GLOBALS['phpgw_info']['apps'][$app]['status'] != 3)
1141                                {
1142                                        $GLOBALS['phpgw_info']['navbar'][$app]['title'] = $GLOBALS['phpgw_info']['apps'][$app]['title'];
1143                                        $GLOBALS['phpgw_info']['navbar'][$app]['url']   = $GLOBALS['phpgw']->link('/' . $app . '/index.php',$GLOBALS['phpgw_info']['flags']['params'][$app]);
1144                                        $GLOBALS['phpgw_info']['navbar'][$app]['name']  = $app;
1145
1146                                        // create popup target
1147                                        if ($data['status'] == 4)
1148                                        {
1149                                                $GLOBALS['phpgw_info']['navbar'][$app]['target'] = ' target="'.$app.'" onClick="'."if (this != '') { window.open(this+'".
1150                                                        (strstr($GLOBALS['phpgw_info']['navbar'][$app]['url'],'?') ||
1151                                                        ini_get('session.use_trans_sid') && $GLOBALS['phpgw_info']['server']['sessions_type'] == 'php4' ?'&':'?').
1152                                                        "referer='+encodeURI(location),this.target,'width=800,height=600,scrollbars=yes,resizable=yes'); return false; } else { return true; }".'"';
1153                                        }
1154
1155                                        if ($app != $GLOBALS['phpgw_info']['flags']['currentapp'])
1156                                        {
1157                                                $GLOBALS['phpgw_info']['navbar'][$app]['icon']  = $this->image($app,Array('navbar','nonav'));
1158                                                $GLOBALS['phpgw_info']['navbar'][$app]['icon_hover']  = $this->image_on($app,Array('navbar','nonav'),'-over');
1159                                        }
1160                                        else
1161                                        {
1162                                                $GLOBALS['phpgw_info']['navbar'][$app]['icon']  = $this->image_on($app,Array('navbar','nonav'),'-over');
1163                                                $GLOBALS['phpgw_info']['navbar'][$app]['icon_hover']  = $this->image($app,Array('navbar','nonav'));
1164                                        }
1165
1166//                                      if($GLOBALS['phpgw_info']['navbar'][$app]['icon'] == '')
1167//                                      {
1168//                                              $GLOBALS['phpgw_info']['navbar'][$app]['icon']  = $this->image('phpgwapi','nonav');
1169//                                      }
1170                                }
1171                        }
1172                        if ($GLOBALS['phpgw_info']['flags']['currentapp'] == 'home' || $GLOBALS['phpgw_info']['flags']['currentapp'] == 'preferences' || $GLOBALS['phpgw_info']['flags']['currentapp'] == 'about')
1173                        {
1174                                $app = $app_title = 'eGroupWare';
1175                        }
1176                        else
1177                        {
1178                                $app = $GLOBALS['phpgw_info']['flags']['currentapp'];
1179                                $app_title = $GLOBALS['phpgw_info']['apps'][$app]['title'];
1180                        }
1181
1182                        if ($GLOBALS['phpgw_info']['user']['apps']['preferences'])      // preferences last
1183                        {
1184                                $prefs = $GLOBALS['phpgw_info']['navbar']['preferences'];
1185                                unset($GLOBALS['phpgw_info']['navbar']['preferences']);
1186                                $GLOBALS['phpgw_info']['navbar']['preferences'] = $prefs;
1187                        }
1188
1189                        // We handle this here becuase its special
1190                        $GLOBALS['phpgw_info']['navbar']['about']['title'] = lang('About %1',$app_title);
1191
1192                        $GLOBALS['phpgw_info']['navbar']['about']['url']   = $GLOBALS['phpgw']->link('/about.php','app='.$app);
1193                        $GLOBALS['phpgw_info']['navbar']['about']['icon']  = $this->image('phpgwapi',Array('about','nonav'));
1194                        $GLOBALS['phpgw_info']['navbar']['about']['icon_hover']  = $this->image_on('phpgwapi',Array('about','nonav'),'-over');
1195
1196                        $GLOBALS['phpgw_info']['navbar']['logout']['title'] = lang('Logout');
1197                        $GLOBALS['phpgw_info']['navbar']['logout']['url']   = $GLOBALS['phpgw']->link('/logout.php');
1198                        $GLOBALS['phpgw_info']['navbar']['logout']['icon']  = $this->image('phpgwapi',Array('logout','nonav'));
1199                        $GLOBALS['phpgw_info']['navbar']['logout']['icon_hover']  = $this->image_on('phpgwapi',Array('logout','nonav'),'-over');
1200                }
1201
1202                /*!
1203                @function app_header
1204                @abstract load header.inc.php for an application
1205                */
1206                function app_header()
1207                {
1208                        if (file_exists(PHPGW_APP_INC . '/header.inc.php'))
1209                        {
1210                                include(PHPGW_APP_INC . '/header.inc.php');
1211                        }
1212                }
1213                /*!
1214                @function phpgw_header
1215                @abstract load the phpgw header
1216                */
1217                function phpgw_header()
1218                {
1219                        // add a content-type header to overwrite an existing default charset in apache (AddDefaultCharset directiv)
1220                        header('Content-type: text/html; charset='.$GLOBALS['phpgw']->translation->charset());
1221                        include(PHPGW_INCLUDE_ROOT . '/phpgwapi/templates/' . $GLOBALS['phpgw_info']['server']['template_set']
1222                                . '/head.inc.php');
1223                        $this->navbar(False);
1224                        include(PHPGW_INCLUDE_ROOT . '/phpgwapi/templates/' . $GLOBALS['phpgw_info']['server']['template_set']
1225                                . '/navbar.inc.php');
1226                        if (!@$GLOBALS['phpgw_info']['flags']['nonavbar'] && !@$GLOBALS['phpgw_info']['flags']['navbar_target'])
1227                        {
1228                                echo parse_navbar();
1229                        }
1230                }
1231
1232                function phpgw_footer()
1233                {
1234                        if (!defined('PHPGW_FOOTER'))
1235                        {
1236                                define('PHPGW_FOOTER',True);
1237                                if (!isset($GLOBALS['phpgw_info']['flags']['nofooter']) || !$GLOBALS['phpgw_info']['flags']['nofooter'])
1238                                {
1239                                        include(PHPGW_API_INC . '/footer.inc.php');
1240                                }
1241                        }
1242                }
1243
1244                /**
1245                * Used by template headers for including CSS in the header
1246                *
1247                * This first loads up the basic global CSS definitions, which support
1248                * the selected user theme colors.  Next we load up the app CSS.  This is
1249                * all merged into the selected theme's css.tpl file.
1250                *
1251                * @author Dave Hall (*based* on verdilak? css inclusion code)
1252                */
1253function get_css( )
1254                {
1255                        $tpl = createObject('phpgwapi.Template', $this->get_tpl_dir('phpgwapi'));
1256                        $tpl->set_file('css', 'css.tpl');
1257                        $tpl->set_var($GLOBALS['phpgw_info']['theme']);
1258                        $app_css = '';
1259                        if(@isset($_GET['menuaction']))
1260                        {
1261                                list($app,$class,$method) = explode('.',$_GET['menuaction']);
1262                                if(is_array($GLOBALS[$class]->public_functions) &&
1263                                        $GLOBALS[$class]->public_functions['css'])
1264                                {
1265                                        $app_css .= $GLOBALS[$class]->css();
1266                                }
1267                        }
1268                        if (isset($GLOBALS['phpgw_info']['flags']['css']))
1269                        {
1270                                $app_css .= $GLOBALS['phpgw_info']['flags']['css'];
1271                        }
1272                        $tpl->set_var('app_css', $app_css);
1273
1274                        // search for app specific css file
1275                        if ( @ isset( $GLOBALS[ 'phpgw_info' ][ 'flags' ][ 'currentapp' ] ) )
1276                        {
1277                                $css = "/%s/templates/%s/%s.css";
1278
1279                                global $path, $link, $template;
1280
1281                                $path = PHPGW_SERVER_ROOT . str_replace( '/', SEP, $css );
1282
1283                                $link = '<LINK href="%s" type="text/css" rel="StyleSheet">';
1284                                $link = sprintf( $link,
1285                                        "{$GLOBALS[ 'phpgw_info' ][ 'server' ][ 'webserver_url' ]}{$css}"
1286                                );
1287
1288                                $template = $GLOBALS[ 'phpgw_info' ][ 'server' ][ 'template_set' ];
1289
1290                                function _css( $module, $css )
1291                                {
1292                                        global $link, $path, $template;
1293
1294                                        if ( file_exists( sprintf( $path, $module, $template, str_replace( '/', SEP, $css ) ) ) )
1295                                                return sprintf( $link, $module, $template, $css );
1296
1297                                        if ( file_exists( sprintf( $path, $module, 'default', str_replace( '/', SEP, $css ) ) ) )
1298                                                return sprintf( $link, $module, 'default', $css );
1299
1300                                        return '';
1301                                }
1302
1303                                $css = _css( 'phpgwapi', 'css/base' );
1304                                $css .= _css( 'phpgwapi', "css/".get_theme());
1305                                $css .= _css( $GLOBALS[ 'phpgw_info' ][ 'flags' ][ 'currentapp' ], "css/".get_theme());
1306                                $css .= _css( $GLOBALS[ 'phpgw_info' ][ 'flags' ][ 'currentapp' ], 'app' );
1307
1308                                if ( $css )
1309                                        $tpl -> set_var( 'css_file', $css );
1310                        }
1311
1312                        return $tpl -> subst('css');
1313                }
1314
1315
1316                /**
1317                * Used by the template headers for including javascript in the header
1318                *
1319                * The method is included here to make it easier to change the js support
1320                * in phpgw.  One change then all templates will support it (as long as they
1321                * include a call to this method).
1322                *
1323                * @author Dave Hall (*vaguely based* on verdilak? css inclusion code)
1324                * @return string the javascript to be included
1325                */
1326                function get_java_script()
1327                {
1328                        $java_script = '';
1329
1330                        /* this flag is for all javascript code that has to be put before other jscode.
1331                        Think of conf vars etc...  (pim@lingewoud.nl) */
1332                        if (isset($GLOBALS['phpgw_info']['flags']['java_script_thirst']))
1333                        {
1334                                $java_script .= $GLOBALS['phpgw_info']['flags']['java_script_thirst'] . "\n";
1335                        }
1336                       
1337                        if(@is_object($GLOBALS['phpgw']->js))
1338                        {
1339                                $java_script .= $GLOBALS['phpgw']->js->get_script_links();
1340                        }
1341
1342                        if(@isset($_GET['menuaction']))
1343                        {
1344                                list($app,$class,$method) = explode('.',$_GET['menuaction']);
1345                                if(is_array($GLOBALS[$class]->public_functions) &&
1346                                        $GLOBALS[$class]->public_functions['java_script'])
1347                                {
1348                                        $java_script .= $GLOBALS[$class]->java_script();
1349                                }
1350                        }
1351                        if (isset($GLOBALS['phpgw_info']['flags']['java_script']))
1352                        {
1353                                $java_script .= $GLOBALS['phpgw_info']['flags']['java_script'] . "\n";
1354                        }
1355                        return $java_script;
1356                }
1357
1358                /**
1359                * Returns on(Un)Load attributes from js class
1360                *
1361                *@author Dave Hall - skwashd at phpgroupware.org
1362                *@returns string body attributes
1363                */
1364                function get_body_attribs()
1365                {
1366                        if(@is_object($GLOBALS['phpgw']->js))
1367                        {
1368                                return $GLOBALS['phpgw']->js->get_body_attribs();
1369                        }
1370                        else
1371                        {
1372                                return '';
1373                        }
1374                }
1375
1376                function hex2bin($data)
1377                {
1378                        $len = strlen($data);
1379                        return @pack('H' . $len, $data);
1380                }
1381
1382                /*!
1383                @function encrypt
1384                @abstract encrypt data passed to the function
1385                @param $data data (string?) to be encrypted
1386                */
1387                function encrypt($data)
1388                {
1389                        return $GLOBALS['phpgw']->crypto->encrypt($data);
1390                }
1391
1392                /*!
1393                @function decrypt
1394                @abstract decrypt $data
1395                @param $data data to be decrypted
1396                */
1397                function decrypt($data)
1398                {
1399                        return $GLOBALS['phpgw']->crypto->decrypt($data);
1400                }
1401
1402                /*!
1403                @function encrypt_password
1404                @abstract legacy wrapper for newer auth class function, encrypt_password
1405                @abstract uses the encryption type set in setup and calls the appropriate encryption functions
1406                @param $password password to encrypt
1407                */
1408                function encrypt_password($password,$sql=False)
1409                {
1410                        if(!@is_object($GLOBALS['phpgw']->auth))
1411                        {
1412                                $GLOBALS['phpgw']->auth = CreateObject('phpgwapi.auth');
1413                        }
1414                        return $GLOBALS['phpgw']->auth->encrypt_password($password,$sql);
1415                }
1416
1417                /*!
1418                @function find_portal_order
1419                @abstract find the current position of the app is the users portal_order preference
1420                @param $app application id to find current position - required
1421                @discussion No discussion
1422                */
1423                function find_portal_order($app)
1424                {
1425                        if(!is_array($GLOBALS['phpgw_info']['user']['preferences']['portal_order']))
1426                        {
1427                                return -1;
1428                        }
1429                        @reset($GLOBALS['phpgw_info']['user']['preferences']['portal_order']);
1430                        while(list($seq,$appid) = each($GLOBALS['phpgw_info']['user']['preferences']['portal_order']))
1431                        {
1432                                if($appid == $app)
1433                                {
1434                                        @reset($GLOBALS['phpgw_info']['user']['preferences']['portal_order']);
1435                                        return $seq;
1436                                }
1437                        }
1438                        @reset($GLOBALS['phpgw_info']['user']['preferences']['portal_order']);
1439                        return -1;
1440                }
1441
1442                /*!
1443                @function hook
1444                @abstract temp wrapper to new hooks class
1445                */
1446                function hook($location, $appname = '', $no_permission_check = False)
1447                {
1448                        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<br>';
1449                        return $GLOBALS['phpgw']->hooks->process($location, $order, $no_permission_check);
1450                }
1451
1452                /*!
1453                @function hook_single
1454                @abstract temp wrapper to new hooks class
1455                */
1456                // Note: $no_permission_check should *ONLY* be used when it *HAS* to be. (jengo)
1457                function hook_single($location, $appname = '', $no_permission_check = False)
1458                {
1459                        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<br>';
1460                        return $GLOBALS['phpgw']->hooks->single($location, $order, $no_permission_check);
1461                }
1462
1463                /*!
1464                @function hook_count
1465                @abstract temp wrapper to new hooks class
1466                */
1467                function hook_count($location)
1468                {
1469                        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<br>';
1470                        return $GLOBALS['phpgw']->hooks->count($location);
1471                }
1472
1473                /* Wrapper to the session->appsession() */
1474                function appsession($data = '##NOTHING##')
1475                {
1476                        $this->debug_info[] = '$phpgw->common->appsession() is a depreciated function'
1477                                . ' - use $phpgw->session->appsession() instead';
1478
1479                        return $GLOBALS['phpgw']->session->appsession('default','',$data);
1480                }
1481
1482                /*!
1483                @function show_date
1484                @abstract show current date
1485                @param $t time - optional can be pulled from user preferences
1486                @param $format - optional can be pulled from user prefernces
1487                */
1488                function show_date($t = '', $format = '')
1489                {
1490                        if(!is_object($GLOBALS['phpgw']->datetime))
1491                        {
1492                                $GLOBALS['phpgw']->datetime = createobject('phpgwapi.date_time');
1493                        }
1494
1495                        if (!$t || (int)$t <= 0)
1496                        {
1497                                $t = $GLOBALS['phpgw']->datetime->gmtnow;
1498                        }
1499                        //  + (date('I') == 1?3600:0)
1500                        $t += $GLOBALS['phpgw']->datetime->tz_offset;
1501                       
1502                        if (! $format)
1503                        {
1504                                $format = $GLOBALS['phpgw_info']['user']['preferences']['common']['dateformat'] . ' - ';
1505                                if ($GLOBALS['phpgw_info']['user']['preferences']['common']['timeformat'] == '12')
1506                                {
1507                                        $format .= 'h:i a';
1508                                }
1509                                else
1510                                {
1511                                        $format .= 'H:i';
1512                                }
1513                        }
1514                       
1515                        if((PHP_OS == 'Windows' || PHP_OS == 'WINNT') && (int)$t < 21600)
1516                        /*if(PHP_OS == 'Windows' && (int)$t < 21600)*/
1517                        {
1518                                $t = 21600;
1519                        }
1520                        return date($format,$t);
1521                }
1522
1523                /*!
1524                @function dateformatorder
1525                @abstract
1526                @param $yearstr year - string
1527                @param $monthstr month - string
1528                @param $day day - string
1529                @param $add_seperator boolean defaults to false
1530                */
1531                function dateformatorder($yearstr,$monthstr,$daystr,$add_seperator = False)
1532                {
1533                        $dateformat = strtolower($GLOBALS['phpgw_info']['user']['preferences']['common']['dateformat']);
1534                        $sep = substr($GLOBALS['phpgw_info']['user']['preferences']['common']['dateformat'],1,1);
1535
1536                        $dlarr[strpos($dateformat,'y')] = $yearstr;
1537                        $dlarr[strpos($dateformat,'m')] = $monthstr;
1538                        $dlarr[strpos($dateformat,'d')] = $daystr;
1539                        ksort($dlarr);
1540
1541                        if ($add_seperator)
1542                        {
1543                                return (implode($sep,$dlarr));
1544                        }
1545                        else
1546                        {
1547                                return (implode(' ',$dlarr));
1548                        }
1549                }
1550
1551                /*!
1552                @function formattime
1553                @abstract format the time takes settings from user preferences
1554                @param $hour hour
1555                @param $min minutes
1556                @param $sec defaults to ''
1557                */
1558                function formattime($hour,$min,$sec='')
1559                {
1560                        $h12 = $hour;
1561                        if ($GLOBALS['phpgw_info']['user']['preferences']['common']['timeformat'] == '12')
1562                        {
1563                                if ($hour >= 12)
1564                                {
1565                                        $ampm = ' pm';
1566                                }
1567                                else
1568                                {
1569                                        $ampm = ' am';
1570                                }
1571
1572                                $h12 %= 12;
1573
1574                                if ($h12 == 0 && $hour)
1575                                {
1576                                        $h12 = 12;
1577                                }
1578                                if ($h12 == 0 && !$hour)
1579                                {
1580                                        $h12 = 0;
1581                                }
1582                        }
1583                        else
1584                        {
1585                                $h12 = $hour;
1586                        }
1587
1588                        if ($sec !== '')
1589                        {
1590                                $sec = ":$sec";
1591                        }
1592
1593                        return "$h12:$min$sec$ampm";
1594                }
1595
1596                // This is not the best place for it, but it needs to be shared bewteen Aeromail and SM
1597                /*!
1598                @function get_email_passwd_ex
1599                @abstract uses code in /email class msg to obtain the appropriate password for email
1600                @param  (none - it will abtain the info it needs on its own)
1601                */
1602                /*
1603                function get_email_passwd_ex()
1604                {
1605                        // ----  Create the email Message Class  if needed  -----
1606                        if (is_object($GLOBALS['phpgw']->msg))
1607                        {
1608                                $do_free_me = False;
1609                        }
1610                        else
1611                        {
1612                                $GLOBALS['phpgw']->msg = CreateObject('email.mail_msg');
1613                                $do_free_me = True;
1614                        }
1615                        // use the Msg class to obtain the appropriate password
1616                        $tmp_prefs = $GLOBALS['phpgw']->preferences->read();
1617                        if (!isset($tmp_prefs['email']['passwd']))
1618                        {
1619                                $email_passwd = $GLOBALS['phpgw_info']['user']['passwd'];
1620                        }
1621                        else
1622                        {
1623                                $email_passwd = $GLOBALS['phpgw']->msg->decrypt_email_passwd($tmp_prefs['email']['passwd']);
1624                        }
1625                        // cleanup and return
1626                        if ($do_free_me)
1627                        {
1628                                unset ($GLOBALS['phpgw']->msg);
1629                        }
1630                        return $email_passwd;
1631                }
1632                */
1633
1634                // This is not the best place for it, but it needs to be shared bewteen Aeromail and SM
1635                /*!
1636                @function create_emailpreferences
1637                @abstract create email preferences
1638                @discussion This is not the best place for it, but it needs to be shared between Aeromail and SM
1639                @param $prefs
1640                @param $account_id -optional defaults to : phpgw_info['user']['account_id']
1641                */
1642                function create_emailpreferences($prefs='',$accountid='')
1643                {
1644                        return $GLOBALS['phpgw']->preferences->create_email_preferences($accountid);
1645                        // ----  Create the email Message Class  if needed  -----
1646                        if (is_object($GLOBALS['phpgw']->msg))
1647                        {
1648                                $do_free_me = False;
1649                        }
1650                        else
1651                        {
1652                                $GLOBALS['phpgw']->msg = CreateObject('email.mail_msg');
1653                                $do_free_me = True;
1654                        }
1655
1656                        // this sets the preferences into the phpgw_info structure
1657                        $GLOBALS['phpgw']->msg->create_email_preferences();
1658
1659                        // cleanup and return
1660                        if ($do_free_me)
1661                        {
1662                                unset ($GLOBALS['phpgw']->msg);
1663                        }
1664                }
1665
1666                /*
1667                function create_emailpreferences($prefs,$accountid='')
1668                {
1669                        $account_id = get_account_id($accountid);
1670
1671                        // NEW EMAIL PASSWD METHOD (shared between SM and aeromail)
1672                        $prefs['email']['passwd'] = $this->get_email_passwd_ex();
1673
1674                        // Add default preferences info
1675                        if (!isset($prefs['email']['userid']))
1676                        {
1677                                if ($GLOBALS['phpgw_info']['server']['mail_login_type'] == 'vmailmgr')
1678                                {
1679                                        $prefs['email']['userid'] = $GLOBALS['phpgw']->accounts->id2name($account_id)
1680                                                . '@' . $GLOBALS['phpgw_info']['server']['mail_suffix'];
1681                                }
1682                                else
1683                                {
1684                                        $prefs['email']['userid'] = $GLOBALS['phpgw']->accounts->id2name($account_id);
1685                                }
1686                        }
1687                        // Set Server Mail Type if not defined
1688                        if (empty($GLOBALS['phpgw_info']['server']['mail_server_type']))
1689                        {
1690                                $GLOBALS['phpgw_info']['server']['mail_server_type'] = 'imap';
1691                        }
1692
1693                        // OLD EMAIL PASSWD METHOD
1694                        if (!isset($prefs['email']['passwd']))
1695                        {
1696                                $prefs['email']['passwd'] = $GLOBALS['phpgw_info']['user']['passwd'];
1697                        }
1698                        else
1699                        {
1700                                $prefs['email']['passwd'] = $this->decrypt($prefs['email']['passwd']);
1701                        }
1702                        // NEW EMAIL PASSWD METHOD Located at the begining of this function
1703
1704                        if (!isset($prefs['email']['address']))
1705                        {
1706                                $prefs['email']['address'] = $GLOBALS['phpgw']->accounts->id2name($account_id)
1707                                        . '@' . $GLOBALS['phpgw_info']['server']['mail_suffix'];
1708                        }
1709                        if (!isset($prefs['email']['mail_server']))
1710                        {
1711                                $prefs['email']['mail_server'] = $GLOBALS['phpgw_info']['server']['mail_server'];
1712                        }
1713                        if (!isset($prefs['email']['mail_server_type']))
1714                        {
1715                                $prefs['email']['mail_server_type'] = $GLOBALS['phpgw_info']['server']['mail_server_type'];
1716                        }
1717                        if (!isset($prefs['email']['imap_server_type']))
1718                        {
1719                                $prefs['email']['imap_server_type'] = $GLOBALS['phpgw_info']['server']['imap_server_type'];
1720                        }
1721                        // These sets the mail_port server variable
1722                        if ($prefs['email']['mail_server_type']=='imap')
1723                        {
1724                                $prefs['email']['mail_port'] = '143';
1725                        }
1726                        elseif ($prefs['email']['mail_server_type']=='pop3')
1727                        {
1728                                $prefs['email']['mail_port'] = '110';
1729                        }
1730                        elseif ($prefs['email']['mail_server_type']=='imaps')
1731                        {
1732                                $prefs['email']['mail_port'] = '993';
1733                        }
1734                        elseif ($prefs['email']['mail_server_type']=='pop3s')
1735                        {
1736                                $prefs['email']['mail_port'] = '995';
1737                        }
1738                        // This is going to be used to switch to the nntp class
1739                        if (isset($phpgw_info['flags']['newsmode']) &&
1740                                $GLOBALS['phpgw_info']['flags']['newsmode'])
1741                        {
1742                                $prefs['email']['mail_server_type'] = 'nntp';
1743                        }
1744                        // DEBUG
1745                        //echo "<br>prefs['email']['passwd']: " .$prefs['email']['passwd'] .'<br>';
1746                        return $prefs;
1747                }
1748                */
1749
1750                // This will be moved into the applications area.
1751                /*!
1752                @function check_code
1753                @abstract ?
1754                @discussion This will be moved into the applications area
1755                */
1756                function check_code($code)
1757                {
1758                        $s = '<br>';
1759                        switch ($code)
1760                        {
1761                                case 13:        $s .= lang('Your message has been sent');break;
1762                                case 14:        $s .= lang('New entry added sucessfully');break;
1763                                case 15:        $s .= lang('Entry updated sucessfully');        break;
1764                                case 16:        $s .= lang('Entry has been deleted sucessfully'); break;
1765                                case 18:        $s .= lang('Password has been updated');        break;
1766                                case 38:        $s .= lang('Password could not be changed');    break;
1767                                case 19:        $s .= lang('Session has been killed');  break;
1768                                case 27:        $s .= lang('Account has been updated'); break;
1769                                case 28:        $s .= lang('Account has been created'); break;
1770                                case 29:        $s .= lang('Account has been deleted'); break;
1771                                case 30:        $s .= lang('Your settings have been updated'); break;
1772                                case 31:        $s .= lang('Group has been added');     break;
1773                                case 32:        $s .= lang('Group has been deleted');   break;
1774                                case 33:        $s .= lang('Group has been updated');   break;
1775                                case 34:        $s .= lang('Account has been deleted') . '<p>'
1776                                                . lang('Error deleting %1 %2 directory',lang('users'),' '.lang('private').' ')
1777                                                . ',<br>' . lang('Please %1 by hand',lang('delete')) . '<br><br>'
1778                                                . lang('To correct this error for the future you will need to properly set the')
1779                                                . '<br>' . lang('permissions to the files/users directory')
1780                                                . '<br>' . lang('On *nix systems please type: %1','chmod 770 '
1781                                                . $GLOBALS['phpgw_info']['server']['files_dir'] . '/users/');
1782                                        break;
1783                                case 35:        $s .= lang('Account has been updated') . '<p>'
1784                                                . lang('Error renaming %1 %2 directory',lang('users'),
1785                                                ' '.lang('private').' ')
1786                                                . ',<br>' . lang('Please %1 by hand',
1787                                                lang('rename')) . '<br><br>'
1788                                                . lang('To correct this error for the future you will need to properly set the')
1789                                                . '<br>' . lang('permissions to the files/users directory')
1790                                                . '<br>' . lang('On *nix systems please type: %1','chmod 770 '
1791                                                . $GLOBALS['phpgw_info']['server']['files_dir'] . '/users/');
1792                                        break;
1793                                case 36:        $s .= lang('Account has been created') . '<p>'
1794                                                . lang('Error creating %1 %2 directory',lang('users'),
1795                                                ' '.lang('private').' ')
1796                                                . ',<br>' . lang('Please %1 by hand',
1797                                                lang('create')) . '<br><br>'
1798                                                . lang('To correct this error for the future you will need to properly set the')
1799                                                . '<br>' . lang('permissions to the files/users directory')
1800                                                . '<br>' . lang('On *nix systems please type: %1','chmod 770 '
1801                                                . $GLOBALS['phpgw_info']['server']['files_dir'] . '/users/');
1802                                        break;
1803                                case 37:        $s .= lang('Group has been added') . '<p>'
1804                                                . lang('Error creating %1 %2 directory',lang('groups'),' ')
1805                                                . ',<br>' . lang('Please %1 by hand',
1806                                                lang('create')) . '<br><br>'
1807                                                . lang('To correct this error for the future you will need to properly set the')
1808                                                . '<br>' . lang('permissions to the files/users directory')
1809                                                . '<br>' . lang('On *nix systems please type: %1','chmod 770 '
1810                                                . $GLOBALS['phpgw_info']['server']['files_dir'] . '/groups/');
1811                                        break;
1812                                case 38:        $s .= lang('Group has been deleted') . '<p>'
1813                                                . lang('Error deleting %1 %2 directory',lang('groups'),' ')
1814                                                . ',<br>' . lang('Please %1 by hand',
1815                                                lang('delete')) . '<br><br>'
1816                                                . lang('To correct this error for the future you will need to properly set the')
1817                                                . '<br>' . lang('permissions to the files/users directory')
1818                                                . '<br>' . lang('On *nix systems please type: %1','chmod 770 '
1819                                                . $GLOBALS['phpgw_info']['server']['files_dir'] . '/groups/');
1820                                        break;
1821                                case 39:        $s .= lang('Group has been updated') . '<p>'
1822                                                . lang('Error renaming %1 %2 directory',lang('groups'),' ')
1823                                                . ',<br>' . lang('Please %1 by hand',
1824                                                lang('rename')) . '<br><br>'
1825                                                . lang('To correct this error for the future you will need to properly set the')
1826                                                . '<br>' . lang('permissions to the files/users directory')
1827                                                . '<br>' . lang('On *nix systems please type: %1','chmod 770 '
1828                                                . $GLOBALS['phpgw_info']['server']['files_dir'] . '/groups/');
1829                                        break;
1830                                case 40: $s .= lang('You have not entered a title').'.';
1831                                        break;
1832                                case 41: $s .= lang('You have not entered a valid time of day').'.';
1833                                        break;
1834                                case 42: $s .= lang('You have not entered a valid date').'.';
1835                                        break;
1836                                case 43: $s .= lang('You have not entered participants').'.';
1837                                        break;
1838                                case 44: $s .= lang('You must choose the days of the week for the appointment to repeat').'.';
1839                                        break;
1840                                case 45: $s .= lang('Recurrent appointments with alarms must have a final date').'.';
1841                                        break;
1842                                case 46: $s .= lang('Recurrent appointments must have a final date').'.';
1843                                        break;
1844                                case 47: $s .= lang('The starting time can not be greater than end time').'.';
1845                                        break;
1846                                default:        return '';
1847                        }
1848                        return $s;
1849                }
1850                /*!
1851                @function phpgw_error
1852                @abstract process error message
1853                @param $error error
1854                @param $line line
1855                @param $file file
1856                */
1857                function phpgw_error($error,$line = '', $file = '')
1858                {
1859                        echo '<p><b>phpGroupWare internal error:</b><p>'.$error;
1860                        if ($line)
1861                        {
1862                                echo 'Line: '.$line;
1863                        }
1864                        if ($file)
1865                        {
1866                                echo 'File: '.$file;
1867                        }
1868                        echo '<p>Your session has been halted.';
1869                        exit;
1870                }
1871
1872                /*!
1873                @function create_phpcode_from_array
1874                @abstract create phpcode from array
1875                @param $array - array
1876                */
1877                function create_phpcode_from_array($array)
1878                {
1879                        while (list($key, $val) = each($array))
1880                        {
1881                                if (is_array($val))
1882                                {
1883                                        while (list($key2, $val2) = each($val))
1884                                        {
1885                                                if (is_array($val2))
1886                                                {
1887                                                        while (list($key3, $val3) = each ($val2))
1888                                                        {
1889                                                                if (is_array($val3))
1890                                                                {
1891                                                                        while (list($key4, $val4) = each ($val3))
1892                                                                        {
1893                                                                                $s .= '$phpgw_info["' . $key . '"]["' . $key2 . '"]["' . $key3 . '"]["' .$key4 . '"]="' . $val4 . '";';
1894                                                                                $s .= "\n";
1895                                                                        }
1896                                                                }
1897                                                                else
1898                                                                {
1899                                                                        $s .= '$phpgw_info["' . $key . '"]["' . $key2 . '"]["' . $key3 . '"]="' . $val3 . '";';
1900                                                                        $s .= "\n";
1901                                                                }
1902                                                        }
1903                                                }
1904                                                else
1905                                                {
1906                                                        $s .= '$phpgw_info["' . $key .'"]["' . $key2 . '"]="' . $val2 . '";';
1907                                                        $s .= "\n";
1908                                                }
1909                                        }
1910                                }
1911                                else
1912                                {
1913                                        $s .= '$phpgw_info["' . $key . '"]="' . $val . '";';
1914                                        $s .= "\n";
1915                                }
1916                        }
1917                        return $s;
1918                }
1919
1920                // This will return the full phpgw_info array, used for debugging
1921                /*!
1922                @function debug_list_array_contents
1923                @abstract return the full phpgw_info array for debugging
1924                @param array - array
1925                */
1926                function debug_list_array_contents($array)
1927                {
1928                        while (list($key, $val) = each($array))
1929                        {
1930                                if (is_array($val))
1931                                {
1932                                        while (list($key2, $val2) = each($val))
1933                                        {
1934                                                if (is_array($val2))
1935                                                {
1936                                                        while (list($key3, $val3) = each ($val2))
1937                                                        {
1938                                                                if (is_array($val3))
1939                                                                {
1940                                                                        while (list($key4, $val4) = each ($val3))
1941                                                                        {
1942                                                                                echo $$array . "[$key][$key2][$key3][$key4]=$val4<br>";
1943                                                                        }
1944                                                                }
1945                                                                else
1946                                                                {
1947                                                                        echo $$array . "[$key][$key2][$key3]=$val3<br>";
1948                                                                }
1949                                                        }
1950                                                }
1951                                                else
1952                                                {
1953                                                        echo $$array . "[$key][$key2]=$val2<br>";
1954                                                }
1955                                        }
1956                                }
1957                                else
1958                                {
1959                                        echo $$array . "[$key]=$val<br>";
1960                                }
1961                        }
1962                }
1963
1964                // This will return a list of functions in the API
1965                /*!
1966                @function debug_list_core_functions
1967                @abstract return a list of functionsin the API
1968                */
1969                function debug_list_core_functions()
1970                {
1971                        echo '<br><b>core functions</b><br>';
1972                        echo '<pre>';
1973                        chdir(PHPGW_INCLUDE_ROOT . '/phpgwapi');
1974                        system("grep -r '^[ \t]*function' *");
1975                        echo '</pre>';
1976                }
1977
1978                // This will return a value for the next id an app/class may need to insert values into ldap.
1979                /*!
1980                @function next_id
1981                @abstract return the next higher value for an integer, and increment it in the db.
1982                */
1983                function next_id($appname,$min=0,$max=0)
1984                {
1985                        if (!$appname)
1986                        {
1987                                return -1;
1988                        }
1989
1990                        $GLOBALS['phpgw']->db->query("SELECT id FROM phpgw_nextid WHERE appname='".$appname."'",__LINE__,__FILE__);
1991                        while( $GLOBALS['phpgw']->db->next_record() )
1992                        {
1993                                $id = $GLOBALS['phpgw']->db->f('id');
1994                        }
1995
1996                        if (empty($id) || !$id)
1997                        {
1998                                $id = 1;
1999                                $GLOBALS['phpgw']->db->query("INSERT INTO phpgw_nextid (appname,id) VALUES ('".$appname."',".$id.")",__LINE__,__FILE__);
2000                        }
2001                        elseif($id<$min)
2002                        {
2003                                $id = $min;
2004                                $GLOBALS['phpgw']->db->query("UPDATE phpgw_nextid SET id=".$id." WHERE appname='".$appname."'",__LINE__,__FILE__);
2005                        }
2006                        elseif ($max && ($id > $max))
2007                        {
2008                                return False;
2009                        }
2010                        else
2011                        {
2012                                $id = $id + 1;
2013                                $GLOBALS['phpgw']->db->query("UPDATE phpgw_nextid SET id=".$id." WHERE appname='".$appname."'",__LINE__,__FILE__);
2014                        }
2015
2016                        return (int)$id;
2017                }
2018
2019                // This will return a value for the last id entered, which an app may need to check
2020                // values for ldap.
2021                /*!
2022                @function last_id
2023                @abstract return the current id in the next_id table for a particular app/class.
2024                */
2025                function last_id($appname,$min=0,$max=0)
2026                {
2027                        if (!$appname)
2028                        {
2029                                return -1;
2030                        }
2031
2032                        $GLOBALS['phpgw']->db->query("SELECT id FROM phpgw_nextid WHERE appname='".$appname."'",__LINE__,__FILE__);
2033                        while( $GLOBALS['phpgw']->db->next_record() )
2034                        {
2035                                $id = $GLOBALS['phpgw']->db->f('id');
2036                        }
2037
2038                        if (empty($id) || !$id)
2039                        {
2040                                if($min)
2041                                {
2042                                        $id = $min;
2043                                }
2044                                else
2045                                {
2046                                        $id = 1;
2047                                }
2048                                $GLOBALS['phpgw']->db->query("INSERT INTO phpgw_nextid (appname,id) VALUES ('".$appname."',".$id.")",__LINE__,__FILE__);
2049                        }
2050                        elseif($id<$min)
2051                        {
2052                                $id = $min;
2053                                $GLOBALS['phpgw']->db->query("UPDATE phpgw_nextid SET id=".$id." WHERE appname='".$appname."'",__LINE__,__FILE__);
2054                        }
2055                        elseif ($max && ($id > $max))
2056                        {
2057                                return False;
2058                        }
2059                        return (int)$id;
2060                }
2061        }//end common class
Note: See TracBrowser for help on using the repository browser.