2006-12-11 00:44:18 +01:00
< ? php
/**
* eGW API - framework
2008-07-21 16:40:54 +02:00
*
2006-12-11 00:44:18 +01:00
* @ link http :// www . egroupware . org
* @ author Ralf Becker < RalfBecker - AT - outdoor - training . de > rewrite in 12 / 2006
* @ author Pim Snel < pim @ lingewoud . nl > author of the idots template set
* @ license http :// opensource . org / licenses / gpl - license . php GPL - GNU General Public License
* @ package api
* @ subpackage framework
* @ access public
* @ version $Id $
*/
/**
* eGW API - framework : virtual base class for all template sets
2008-07-21 16:40:54 +02:00
*
2006-12-11 00:44:18 +01:00
* This class creates / renders the eGW framework :
* a ) html header
* b ) navbar
* c ) sidebox menu
* d ) main application area
* e ) footer
* It replaces several methods in the common class and the diverse templates .
2008-07-21 16:40:54 +02:00
*
2009-10-12 11:41:46 +02:00
* Existing apps either set $GLOBALS [ 'egw_info' ][ 'flags' ][ 'noheader' ] and call common :: egw_header () and
2006-12-11 00:44:18 +01:00
* ( if $GLOBALS [ 'egw_info' ][ 'flags' ][ 'nonavbar' ] is true ) parse_navbar () or it ' s done by the header . inc . php include .
* The app ' s hook_sidebox then calls the public function display_sidebox () .
2009-10-12 11:41:46 +02:00
* And the app calls common :: egw_footer () .
2008-07-21 16:40:54 +02:00
*
2006-12-11 00:44:18 +01:00
* This are the authors ( and their copyrights ) of the original egw_header , egw_footer methods of the common class :
* This file written by Dan Kuykendall < seek3r @ phpgroupware . org >
* and Joseph Engo < jengo @ phpgroupware . org >
* and Mark Peters < skeeter @ phpgroupware . org >
* and Lars Kneschke < lkneschke @ linux - at - work . de >
* Copyright ( C ) 2000 , 2001 Dan Kuykendall
* Copyright ( C ) 2003 Lars Kneschke
*/
2008-08-18 11:00:19 +02:00
abstract class egw_framework
2006-12-11 00:44:18 +01:00
{
/**
* Name of the template set , eg . 'idots'
*
* @ var string
*/
var $template ;
2010-06-02 11:20:55 +02:00
/**
* Path relative to EGW_SERVER_ROOT for the template directory
*
* @ var string
*/
var $template_dir ;
2010-01-17 04:20:45 +01:00
/**
* true if $this -> header () was called
*
* @ var boolean
*/
static $header_done = false ;
/**
* true if $this -> navbar () was called
*
* @ var boolean
*/
static $navbar_done = false ;
2006-12-11 00:44:18 +01:00
/**
* Constructor
2008-07-21 16:40:54 +02:00
*
2006-12-11 00:44:18 +01:00
* The constructor instanciates the class in $GLOBALS [ 'egw' ] -> framework , from where it should be used
*
* @ return egw_framework
*/
2010-06-01 23:38:00 +02:00
function __construct ( $template )
2006-12-11 00:44:18 +01:00
{
$this -> template = $template ;
2010-01-17 04:20:45 +01:00
if ( ! isset ( $GLOBALS [ 'egw' ] -> framework ))
2006-12-11 00:44:18 +01:00
{
2008-03-21 21:11:59 +01:00
$GLOBALS [ 'egw' ] -> framework = $this ;
2006-12-11 00:44:18 +01:00
}
2010-06-02 11:20:55 +02:00
$this -> template_dir = '/phpgwapi/templates/' . $template ;
2006-12-11 00:44:18 +01:00
}
2008-07-21 16:40:54 +02:00
2010-06-01 23:38:00 +02:00
/**
* PHP4 - Constructor
*
* The constructor instanciates the class in $GLOBALS [ 'egw' ] -> framework , from where it should be used
*
* @ deprecated use __construct ()
*/
function egw_framework ( $template )
{
self :: __construct ( $template );
}
/**
* Link url generator
*
* @ param string $string The url the link is for
* @ param string / array $extravars Extra params to be passed to the url
* @ return string The full url after processing
*/
static function link ( $url = '' , $extravars = '' )
{
return $GLOBALS [ 'egw' ] -> session -> link ( $url , $extravars );
}
/**
* Redirects direct to a generated link
*
* @ param string $string The url the link is for
* @ param string / array $extravars Extra params to be passed to the url
* @ return string The full url after processing
*/
static function redirect_link ( $url = '' , $extravars = '' )
{
egw :: redirect ( self :: link ( $url , $extravars ));
}
2006-12-11 00:44:18 +01:00
/**
* Renders an applicaton page with the complete eGW framework ( header , navigation and menu )
2008-07-21 16:40:54 +02:00
*
2006-12-11 00:44:18 +01:00
* This is the ( new ) prefered way to render a page in eGW !
*
* @ param string $content html of the main application area
* @ param string $app_header = null application header , default what 's set in $GLOBALS[' egw_info '][' flags '][' app_header ' ]
* @ param string $navbar = null show the navigation , default ! $GLOBALS [ 'egw_info' ][ 'flags' ][ 'nonavbar' ], false gives a typical popu
2008-07-21 16:40:54 +02:00
*
2006-12-11 00:44:18 +01:00
*/
function render ( $content , $app_header = null , $navbar = null )
{
if ( ! is_null ( $app_header )) $GLOBALS [ 'egw_info' ][ 'flags' ][ 'app_header' ] = $app_header ;
if ( ! is_null ( $navbar )) $GLOBALS [ 'egw_info' ][ 'flags' ][ 'nonavbar' ] = ! $navbar ;
2008-07-21 16:40:54 +02:00
2006-12-11 00:44:18 +01:00
echo $this -> header ();
2008-07-21 16:40:54 +02:00
2006-12-11 00:44:18 +01:00
if ( ! isset ( $GLOBALS [ 'egw_info' ][ 'flags' ][ 'nonavbar' ]) || ! $GLOBALS [ 'egw_info' ][ 'flags' ][ 'nonavbar' ])
{
2007-01-05 15:06:34 +01:00
echo $this -> navbar ();
2006-12-11 00:44:18 +01:00
}
echo $content ;
2007-01-05 15:06:34 +01:00
2006-12-11 00:44:18 +01:00
echo $this -> footer ();
2007-01-05 15:06:34 +01:00
}
2006-12-11 00:44:18 +01:00
/**
* Returns the html - header incl . the opening body tag
*
* @ return string with html
*/
2008-08-18 11:00:19 +02:00
abstract function header ();
2006-12-11 00:44:18 +01:00
/**
* Returns the html from the body - tag til the main application area ( incl . opening div tag )
*
* @ return string with html
*/
2008-08-18 11:00:19 +02:00
abstract function navbar ();
2008-07-21 16:40:54 +02:00
2006-12-11 00:44:18 +01:00
/**
* Returns the content of one sidebox
*
* @ param string $appname
* @ param string $menu_title
* @ param array $file
*/
2008-08-18 11:00:19 +02:00
abstract function sidebox ( $appname , $menu_title , $file );
2008-07-21 16:40:54 +02:00
2006-12-11 00:44:18 +01:00
/**
* Returns the html from the closing div of the main application area to the closing html - tag
*
* @ return string
*/
2008-08-18 11:00:19 +02:00
abstract function footer ();
2008-07-21 16:40:54 +02:00
2006-12-25 12:05:44 +01:00
/**
* displays a login screen
*
* @ string $extra_vars for login url
* @ return string
*/
2008-08-18 11:00:19 +02:00
abstract function login_screen ( $extra_vars );
2008-07-21 16:40:54 +02:00
2006-12-25 12:05:44 +01:00
/**
* displays a login denied message
*
* @ return string
*/
2008-08-18 11:00:19 +02:00
abstract function denylogin_screen ();
2008-07-21 16:40:54 +02:00
2006-12-11 00:44:18 +01:00
/**
* Get footer as array to eg . set as vars for a template ( from idots ' head . inc . php )
*
* @ return array
*/
2008-08-18 11:00:19 +02:00
protected function _get_footer ()
2006-12-11 00:44:18 +01:00
{
$var = Array (
2010-06-03 00:43:41 +02:00
'img_root' => $GLOBALS [ 'egw_info' ][ 'server' ][ 'webserver_url' ] . $this -> template_dir . '/images' ,
2006-12-11 00:44:18 +01:00
'version' => $GLOBALS [ 'egw_info' ][ 'server' ][ 'versions' ][ 'phpgwapi' ]
);
if ( $GLOBALS [ 'egw_info' ][ 'user' ][ 'preferences' ][ 'common' ][ 'show_generation_time' ])
{
2008-07-21 16:40:54 +02:00
$totaltime = sprintf ( '%4.2lf' , microtime ( true ) - $GLOBALS [ 'egw_info' ][ 'flags' ][ 'page_start_time' ]);
2006-12-11 00:44:18 +01:00
2008-03-22 17:22:11 +01:00
$var [ 'page_generation_time' ] = '<div id="divGenTime"><br/><span>' . lang ( 'Page was generated in %1 seconds' , $totaltime );
if ( $GLOBALS [ 'egw_info' ][ 'flags' ][ 'session_restore_time' ])
{
$var [ 'page_generation_time' ] .= ' ' . lang ( '(session restored in %1 seconds)' ,
sprintf ( '%4.2lf' , $GLOBALS [ 'egw_info' ][ 'flags' ][ 'session_restore_time' ]));
}
$var [ 'page_generation_time' ] .= '</span></div>' ;
2006-12-11 00:44:18 +01:00
}
2010-06-03 00:43:41 +02:00
$var [ 'powered_by' ] = lang ( 'Powered by' ) . ' <a href="' . egw :: link ( '/about.php' , '' , 'about' ) . '">EGroupware</a> ' . lang ( 'version' ) . ' ' . $GLOBALS [ 'egw_info' ][ 'server' ][ 'versions' ][ 'phpgwapi' ];
2008-07-21 16:40:54 +02:00
2006-12-11 00:44:18 +01:00
return $var ;
}
/**
* Get the ( depricated ) application footer
*
* @ return string html
*/
2008-08-18 11:00:19 +02:00
protected static function _get_app_footer ()
2006-12-11 00:44:18 +01:00
{
ob_start ();
// Include the apps footer files if it exists
2008-07-21 16:40:54 +02:00
if ( EGW_APP_INC != EGW_API_INC && // this prevents an endless inclusion on the homepage
2006-12-11 00:44:18 +01:00
// (some apps set currentapp in hook_home => it's not releyable)
( file_exists ( EGW_APP_INC . '/footer.inc.php' ) || isset ( $_GET [ 'menuaction' ])) &&
$GLOBALS [ 'egw_info' ][ 'flags' ][ 'currentapp' ] != 'home' &&
$GLOBALS [ 'egw_info' ][ 'flags' ][ 'currentapp' ] != 'login' &&
$GLOBALS [ 'egw_info' ][ 'flags' ][ 'currentapp' ] != 'logout' &&
!@ $GLOBALS [ 'egw_info' ][ 'flags' ][ 'noappfooter' ])
{
list ( $app , $class , $method ) = explode ( '.' ,( string ) $_GET [ 'menuaction' ]);
2008-07-21 16:40:54 +02:00
if ( $class && is_object ( $GLOBALS [ $class ]) && is_array ( $GLOBALS [ $class ] -> public_functions ) &&
2006-12-11 00:44:18 +01:00
isset ( $GLOBALS [ $class ] -> public_functions [ 'footer' ]))
{
$GLOBALS [ $class ] -> footer ();
}
elseif ( file_exists ( EGW_APP_INC . '/footer.inc.php' ))
{
include ( EGW_APP_INC . '/footer.inc.php' );
}
}
$content = ob_get_contents ();
ob_end_clean ();
2008-07-21 16:40:54 +02:00
return $content ;
2006-12-11 00:44:18 +01:00
}
/**
* Get header as array to eg . set as vars for a template ( from idots ' head . inc . php )
*
* @ return array
*/
2008-08-18 11:00:19 +02:00
protected function _get_header ()
2006-12-11 00:44:18 +01:00
{
2010-02-13 03:57:22 +01:00
// get used language code (with a little xss check, if someone tries to sneak something in)
if ( preg_match ( '/^[a-z]{2}(-[a-z]{2})?$/' , $GLOBALS [ 'egw_info' ][ 'user' ][ 'preferences' ][ 'common' ][ 'lang' ]))
{
$lang_code = $GLOBALS [ 'egw_info' ][ 'user' ][ 'preferences' ][ 'common' ][ 'lang' ];
}
2006-12-11 00:44:18 +01:00
//pngfix defaults to yes
if ( ! $GLOBALS [ 'egw_info' ][ 'user' ][ 'preferences' ][ 'common' ][ 'disable_pngfix' ])
{
$pngfix_src = $GLOBALS [ 'egw_info' ][ 'server' ][ 'webserver_url' ] . '/phpgwapi/templates/idots/js/pngfix.js' ;
2008-07-21 16:40:54 +02:00
$pngfix = ' <!-- This solves the Internet Explorer PNG - transparency bug , but only for IE 5.5 - 6.0 and higher -->
<!-- [ if lt IE 7.0 ] >
2006-12-11 00:44:18 +01:00
< script src = " '. $pngfix_src .' " type = " text/javascript " >
</ script >
<! [ endif ] --> ' ;
}
2008-07-21 16:40:54 +02:00
2006-12-11 00:44:18 +01:00
if ( ! $GLOBALS [ 'egw_info' ][ 'user' ][ 'preferences' ][ 'common' ][ 'disable_slider_effects' ])
{
$slider_effects_src = $GLOBALS [ 'egw_info' ][ 'server' ][ 'webserver_url' ] . '/phpgwapi/templates/idots/js/slidereffects.js' ;
$slider_effects = '<script src="' . $slider_effects_src . ' " type= " text / javascript " >
</ script > ' ;
}
else
{
$simple_show_hide_src = $GLOBALS [ 'egw_info' ][ 'server' ][ 'webserver_url' ] . '/phpgwapi/templates/idots/js/simple_show_hide.js' ;
$simple_show_hide = '<script src="' . $simple_show_hide_src . ' " type= " text / javascript " >
</ script > ' ;
}
2008-07-21 16:40:54 +02:00
2006-12-11 00:44:18 +01:00
if ( $GLOBALS [ 'egw_info' ][ 'flags' ][ 'app_header' ])
{
$app = $GLOBALS [ 'egw_info' ][ 'flags' ][ 'app_header' ];
}
else
{
$app = $GLOBALS [ 'egw_info' ][ 'flags' ][ 'currentapp' ];
$app = isset ( $GLOBALS [ 'egw_info' ][ 'apps' ][ $app ]) ? $GLOBALS [ 'egw_info' ][ 'apps' ][ $app ][ 'title' ] : lang ( $app );
}
2008-07-21 16:40:54 +02:00
2006-12-11 00:44:18 +01:00
if ( $app != 'wiki' ) $robots = '<meta name="robots" content="none" />' ;
2009-05-13 16:33:36 +02:00
if ( substr ( $GLOBALS [ 'egw_info' ][ 'server' ][ 'favicon_file' ], 0 , 4 ) == 'http' )
{
$var [ 'favicon_file' ] = $GLOBALS [ 'egw_info' ][ 'server' ][ 'favicon_file' ];
}
else
{
2009-10-12 11:41:46 +02:00
$var [ 'favicon_file' ] = common :: image ( 'phpgwapi' , $GLOBALS [ 'egw_info' ][ 'server' ][ 'favicon_file' ] ? $GLOBALS [ 'egw_info' ][ 'server' ][ 'favicon_file' ] : 'favicon.ico' );
2009-05-13 16:33:36 +02:00
}
2008-07-21 16:40:54 +02:00
2010-01-17 04:20:45 +01:00
$wz_tooltip = '/phpgwapi/js/wz_tooltip/wz_tooltip.js' ;
if ( file_exists ( EGW_SERVER_ROOT . $wz_tooltip ))
{
$include_wz_tooltip = '<script src="' . $GLOBALS [ 'egw_info' ][ 'server' ][ 'webserver_url' ] .
$wz_tooltip . '?' . filemtime ( EGW_SERVER_ROOT . $wz_tooltip ) . '" type="text/javascript"></script>' ;
}
2006-12-17 14:14:16 +01:00
return $this -> _get_css () + array (
2009-05-13 16:33:36 +02:00
'img_icon' => $var [ 'favicon_file' ],
'img_shortcut' => $var [ 'favicon_file' ],
2006-12-11 00:44:18 +01:00
'pngfix' => $pngfix ,
'slider_effects' => $slider_effects ,
'simple_show_hide' => $simple_show_hide ,
'lang_code' => $lang_code ,
2009-10-12 11:41:46 +02:00
'charset' => translation :: charset (),
2006-12-11 00:44:18 +01:00
'website_title' => strip_tags ( $GLOBALS [ 'egw_info' ][ 'server' ][ 'site_title' ] . ( $app ? " [ $app ] " : '' )),
2008-08-18 11:00:19 +02:00
'body_tags' => self :: _get_body_attribs (),
'java_script' => self :: _get_js (),
2006-12-11 00:44:18 +01:00
'meta_robots' => $robots ,
'dir_code' => lang ( 'language_direction_rtl' ) != 'rtl' ? '' : ' dir="rtl"' ,
2010-01-17 04:20:45 +01:00
'include_wz_tooltip' => $include_wz_tooltip ,
2010-06-02 10:10:43 +02:00
'webserver_url' => $GLOBALS [ 'egw_info' ][ 'server' ][ 'webserver_url' ],
2006-12-11 00:44:18 +01:00
);
}
/**
* Get navbar as array to eg . set as vars for a template ( from idots ' navbar . inc . php )
*
* @ param array $apps navbar apps from _get_navbar_apps
* @ return array
*/
2008-08-18 11:00:19 +02:00
protected function _get_navbar ( $apps )
2006-12-11 00:44:18 +01:00
{
$var [ 'img_root' ] = $GLOBALS [ 'egw_info' ][ 'server' ][ 'webserver_url' ] . '/phpgwapi/templates/' . $this -> template . '/images' ;
if ( isset ( $GLOBALS [ 'egw_info' ][ 'flags' ][ 'app_header' ]))
{
$var [ 'current_app_title' ] = $GLOBALS [ 'egw_info' ][ 'flags' ][ 'app_header' ];
}
else
{
$var [ 'current_app_title' ] = $apps [ $GLOBALS [ 'egw_info' ][ 'flags' ][ 'currentapp' ]][ 'title' ];
2009-11-18 21:00:26 +01:00
}
$var [ 'currentapp' ] = $GLOBALS [ 'egw_info' ][ 'flags' ][ 'currentapp' ];
2007-01-10 00:14:21 +01:00
2006-12-11 00:44:18 +01:00
// current users for admins
2008-08-07 23:12:44 +02:00
$var [ 'current_users' ] = $this -> _current_users ();
2008-07-21 16:40:54 +02:00
2006-12-11 00:44:18 +01:00
// quick add selectbox
$var [ 'quick_add' ] = $this -> _get_quick_add ();
2007-01-05 15:06:34 +01:00
$var [ 'user_info' ] = $this -> _user_time_info ();
2008-07-21 16:40:54 +02:00
2006-12-11 00:44:18 +01:00
if ( $GLOBALS [ 'egw_info' ][ 'user' ][ 'lastpasswd_change' ] == 0 )
{
$api_messages = lang ( 'You are required to change your password during your first login' ) . '<br />' .
2009-10-12 11:41:46 +02:00
lang ( 'Click this image on the navbar: %1' , '<img src="' . common :: image ( 'preferences' , 'navbar.gif' ) . '">' );
2006-12-11 00:44:18 +01:00
}
elseif ( $GLOBALS [ 'egw_info' ][ 'user' ][ 'lastpasswd_change' ] < time () - ( 86400 * 30 ))
{
$api_messages = lang ( 'it has been more then %1 days since you changed your password' , 30 );
}
// This is gonna change
if ( isset ( $cd ))
{
$var [ 'messages' ] = $api_messages . '<br />' . checkcode ( $cd );
}
2010-06-02 23:28:07 +02:00
if ( substr ( $GLOBALS [ 'egw_info' ][ 'server' ][ 'login_logo_file' ], 0 , 4 ) == 'http' ||
$GLOBALS [ 'egw_info' ][ 'server' ][ 'login_logo_file' ][ 0 ] == '/' )
2006-12-11 00:44:18 +01:00
{
$var [ 'logo_file' ] = $GLOBALS [ 'egw_info' ][ 'server' ][ 'login_logo_file' ];
}
else
{
2009-10-12 11:41:46 +02:00
$var [ 'logo_file' ] = common :: image ( 'phpgwapi' , $GLOBALS [ 'egw_info' ][ 'server' ][ 'login_logo_file' ] ? $GLOBALS [ 'egw_info' ][ 'server' ][ 'login_logo_file' ] : 'logo' );
2006-12-11 00:44:18 +01:00
}
$var [ 'logo_url' ] = $GLOBALS [ 'egw_info' ][ 'server' ][ 'login_logo_url' ] ? $GLOBALS [ 'egw_info' ][ 'server' ][ 'login_logo_url' ] : 'http://www.eGroupWare.org' ;
2008-07-21 16:40:54 +02:00
2006-12-11 00:44:18 +01:00
if ( substr ( $var [ 'logo_url' ], 0 , 4 ) != 'http' )
{
$var [ 'logo_url' ] = 'http://' . $var [ 'logo_url' ];
}
$var [ 'logo_title' ] = $GLOBALS [ 'egw_info' ][ 'server' ][ 'login_logo_title' ] ? $GLOBALS [ 'egw_info' ][ 'server' ][ 'login_logo_title' ] : 'www.eGroupWare.org' ;
2008-07-21 16:40:54 +02:00
2006-12-11 00:44:18 +01:00
return $var ;
}
2007-01-05 15:06:34 +01:00
/**
2008-08-18 11:00:19 +02:00
* Returns html with user and time
*
* @ return void
*/
protected static function _user_time_info ()
2007-01-05 15:06:34 +01:00
{
2009-10-12 11:41:46 +02:00
$now = new egw_time ();
$user_info = '<b>' . common :: display_fullname () . '</b>' . ' - ' . lang ( $now -> format ( 'l' )) . ' ' . $now -> format ( true );
2007-01-05 15:06:34 +01:00
2009-11-01 13:48:25 +01:00
$user_tzs = egw_time :: getUserTimezones ();
if ( count ( $user_tzs ) > 1 )
2009-10-12 11:41:46 +02:00
{
2009-11-01 13:48:25 +01:00
$tz = $GLOBALS [ 'egw_info' ][ 'user' ][ 'preferences' ][ 'common' ][ 'tz' ];
$user_info .= html :: form ( html :: select ( 'tz' , $tz , $user_tzs , true , ' onchange="this.form.submit();"' ), array (),
2009-10-12 11:41:46 +02:00
'/index.php' , '' , 'tz_selection' , ' style="display: inline;"' , 'GET' );
}
return $user_info ;
2007-01-05 15:06:34 +01:00
}
2008-08-18 11:00:19 +02:00
/**
* Prepare the current users
*
* @ return string
*/
protected static function _current_users ()
2007-01-10 00:14:21 +01:00
{
if ( $GLOBALS [ 'egw_info' ][ 'user' ][ 'apps' ][ 'admin' ] && $GLOBALS [ 'egw_info' ][ 'user' ][ 'preferences' ][ 'common' ][ 'show_currentusers' ])
{
2009-10-12 11:41:46 +02:00
$current_users = '<a href="' . egw :: link ( '/index.php' , 'menuaction=admin.uicurrentsessions.list_sessions' ) . '">' .
2008-08-07 23:12:44 +02:00
lang ( 'Current users' ) . ': ' . $GLOBALS [ 'egw' ] -> session -> session_count () . '</a>' ;
2007-01-10 00:14:21 +01:00
return $current_users ;
}
}
2006-12-11 00:44:18 +01:00
/**
* Prepare the quick add selectbox
*
* @ return string
*/
2008-08-18 11:00:19 +02:00
protected static function _get_quick_add ()
2006-12-11 00:44:18 +01:00
{
2008-03-09 00:21:42 +01:00
$apps = egw_link :: app_list ( 'add' );
2006-12-11 00:44:18 +01:00
asort ( $apps ); // sort them alphabetic
2008-07-21 16:40:54 +02:00
2006-12-11 00:44:18 +01:00
$options = array ( lang ( 'Add' ) . ' ...' );
foreach ( $apps as $app => $label )
{
2009-10-12 11:41:46 +02:00
$link = egw :: link ( '/index.php' , egw_link :: add ( $app , $GLOBALS [ 'egw_info' ][ 'flags' ][ 'currentapp' ], $GLOBALS [ 'egw_info' ][ 'flags' ][ 'currentid' ]) +
2006-12-11 00:44:18 +01:00
( is_array ( $GLOBALS [ 'egw_info' ][ 'flags' ][ 'quick_add' ]) ? $GLOBALS [ 'egw_info' ][ 'flags' ][ 'quick_add' ] : array ()));
2008-03-09 00:21:42 +01:00
if (( $popup = egw_link :: is_popup ( $app , 'add' )))
2006-12-11 00:44:18 +01:00
{
list ( $w , $h ) = explode ( 'x' , $popup );
2010-05-09 11:41:38 +02:00
$action = " window.open(' $link ','_blank','width='+ $w +',height='+ $h +',location=no,menubar=no,toolbar=no,scrollbars=yes,status=yes'); " ;
2006-12-11 00:44:18 +01:00
}
else
{
$action = " location.href = ' $link '; " ;
}
$options [ $action ] = $label ;
}
2008-07-21 16:40:54 +02:00
return html :: select ( 'quick_add' , '' , $options , true , $options = ' onchange="eval(this.value); this.value=0; return false;"' );
2006-12-11 00:44:18 +01:00
}
2008-07-21 16:40:54 +02:00
2008-08-18 11:00:19 +02:00
/**
* Prepare notification signal ( blinking bell )
*
* @ return string
*/
protected static function _get_notification_bell ()
2008-03-21 21:11:59 +01:00
{
return html :: div (
html :: a_href (
html :: image ( 'notifications' , 'notificationbell' , lang ( 'notifications' )),
2009-10-26 16:10:05 +01:00
'javascript: egwpopup_display();'
2008-03-21 21:11:59 +01:00
),
'id="notificationbell"' , // options
'' , // class
'display: none' //style
2008-07-21 16:40:54 +02:00
);
2007-11-22 09:29:16 +01:00
}
2008-07-21 16:40:54 +02:00
2008-08-18 11:00:19 +02:00
/**
* Get the link to an application ' s index page
*
* @ param string $app
* @ return string
*/
public function index ( $app )
{
$data =& $GLOBALS [ 'egw_info' ][ 'user' ][ 'apps' ][ $app ];
if ( ! isset ( $data ))
{
throw new egw_exception_wrong_parameter ( " ' $app ' not a valid app for this user! " );
}
$index = '/' . $app . '/index.php' ;
if ( isset ( $data [ 'index' ]))
{
if ( $data [ 'index' ][ 0 ] == '/' )
{
$index = $data [ 'index' ];
}
else
{
$index = '/index.php?menuaction=' . $data [ 'index' ];
}
}
2009-10-12 11:41:46 +02:00
return egw :: link ( $index , $GLOBALS [ 'egw_info' ][ 'flags' ][ 'params' ][ $app ]);
2008-08-18 11:00:19 +02:00
}
2006-12-11 00:44:18 +01:00
/**
* Prepare an array with apps used to render the navbar
2008-07-21 16:40:54 +02:00
*
2006-12-11 00:44:18 +01:00
* This is similar to the former common :: navbar () method - though it returns the vars and does not place them in global scope .
*
* @ return array
*/
2008-08-18 11:00:19 +02:00
protected static function _get_navbar_apps ()
2006-12-11 00:44:18 +01:00
{
list ( $first ) = each ( $GLOBALS [ 'egw_info' ][ 'user' ][ 'apps' ]);
if ( is_array ( $GLOBALS [ 'egw_info' ][ 'user' ][ 'apps' ][ 'admin' ]) && $first != 'admin' )
{
$newarray [ 'admin' ] = $GLOBALS [ 'egw_info' ][ 'user' ][ 'apps' ][ 'admin' ];
foreach ( $GLOBALS [ 'egw_info' ][ 'user' ][ 'apps' ] as $index => $value )
{
if ( $index != 'admin' )
{
$newarray [ $index ] = $value ;
}
}
$GLOBALS [ 'egw_info' ][ 'user' ][ 'apps' ] = $newarray ;
reset ( $GLOBALS [ 'egw_info' ][ 'user' ][ 'apps' ]);
}
unset ( $index );
unset ( $value );
unset ( $newarray );
2008-07-21 16:40:54 +02:00
2006-12-11 00:44:18 +01:00
$apps = array ();
foreach ( $GLOBALS [ 'egw_info' ][ 'user' ][ 'apps' ] as $app => $data )
{
if ( is_long ( $app ))
{
continue ;
}
if ( $app == 'preferences' || $GLOBALS [ 'egw_info' ][ 'apps' ][ $app ][ 'status' ] != 2 && $GLOBALS [ 'egw_info' ][ 'apps' ][ $app ][ 'status' ] != 3 )
{
$apps [ $app ][ 'title' ] = $GLOBALS [ 'egw_info' ][ 'apps' ][ $app ][ 'title' ];
2008-08-18 11:00:19 +02:00
$apps [ $app ][ 'url' ] = self :: index ( $app );
2006-12-11 00:44:18 +01:00
$apps [ $app ][ 'name' ] = $app ;
// create popup target
if ( $data [ 'status' ] == 4 )
{
$apps [ $app ][ 'target' ] = ' target="' . $app . '" onClick="' . " if (this != '') { window.open(this+' " .
2007-04-30 07:42:05 +02:00
( strpos ( $apps [ $app ][ 'url' ], '?' ) !== false ? '&' : '?' ) .
2007-06-08 12:24:20 +02:00
" referer='+encodeURIComponent(location),this.target,'width=800,height=600,scrollbars=yes,resizable=yes'); return false; } else { return true; } " . '"' ;
2006-12-11 00:44:18 +01:00
}
elseif ( isset ( $GLOBALS [ 'egw_info' ][ 'flags' ][ 'navbar_target' ]) && $GLOBALS [ 'egw_info' ][ 'flags' ][ 'navbar_target' ])
{
$apps [ $app ][ 'target' ] = 'target="' . $GLOBALS [ 'egw_info' ][ 'flags' ][ 'navbar_target' ] . '"' ;
}
else
{
$apps [ $app ][ 'target' ] = '' ;
}
2008-08-18 11:00:19 +02:00
$icon = isset ( $data [ 'icon' ]) ? $data [ 'icon' ] : 'navbar' ;
$icon_app = isset ( $data [ 'icon_app' ]) ? $data [ 'icon_app' ] : $app ;
2006-12-11 00:44:18 +01:00
if ( $app != $GLOBALS [ 'egw_info' ][ 'flags' ][ 'currentapp' ])
{
2009-10-12 11:41:46 +02:00
$apps [ $app ][ 'icon' ] = common :: image ( $icon_app , Array ( $icon , 'nonav' ));
$apps [ $app ][ 'icon_hover' ] = common :: image_on ( $icon_app , Array ( $icon , 'nonav' ), '-over' );
2006-12-11 00:44:18 +01:00
}
else
{
2009-10-12 11:41:46 +02:00
$apps [ $app ][ 'icon' ] = common :: image_on ( $icon_app , Array ( $icon , 'nonav' ), '-over' );
$apps [ $app ][ 'icon_hover' ] = common :: image ( $icon_app , Array ( $icon , 'nonav' ));
2006-12-11 00:44:18 +01:00
}
}
}
if ( $GLOBALS [ 'egw_info' ][ 'flags' ][ 'currentapp' ] == 'preferences' || $GLOBALS [ 'egw_info' ][ 'flags' ][ 'currentapp' ] == 'about' )
{
2010-06-03 00:43:41 +02:00
$app = $app_title = 'EGroupware' ;
2006-12-11 00:44:18 +01:00
}
else
{
$app = $GLOBALS [ 'egw_info' ][ 'flags' ][ 'currentapp' ];
$app_title = $GLOBALS [ 'egw_info' ][ 'apps' ][ $app ][ 'title' ];
}
if ( $GLOBALS [ 'egw_info' ][ 'user' ][ 'apps' ][ 'preferences' ]) // preferences last
{
$prefs = $apps [ 'preferences' ];
unset ( $apps [ 'preferences' ]);
$apps [ 'preferences' ] = $prefs ;
}
// We handle this here becuase its special
$apps [ 'about' ][ 'title' ] = lang ( 'About %1' , $app_title );
2009-10-12 11:41:46 +02:00
$apps [ 'about' ][ 'url' ] = egw :: link ( '/about.php' , 'app=' . $app );
$apps [ 'about' ][ 'icon' ] = common :: image ( 'phpgwapi' , Array ( 'about' , 'nonav' ));
$apps [ 'about' ][ 'icon_hover' ] = common :: image_on ( 'phpgwapi' , Array ( 'about' , 'nonav' ), '-over' );
2010-06-04 10:06:02 +02:00
$apps [ 'about' ][ 'name' ] = 'about' ;
2006-12-11 00:44:18 +01:00
$apps [ 'logout' ][ 'title' ] = lang ( 'Logout' );
2009-10-12 11:41:46 +02:00
$apps [ 'logout' ][ 'url' ] = egw :: link ( '/logout.php' );
$apps [ 'logout' ][ 'icon' ] = common :: image ( 'phpgwapi' , Array ( 'logout' , 'nonav' ));
$apps [ 'logout' ][ 'icon_hover' ] = common :: image_on ( 'phpgwapi' , Array ( 'logout' , 'nonav' ), '-over' );
2008-07-21 16:40:54 +02:00
2006-12-11 00:44:18 +01:00
return $apps ;
}
2008-07-21 16:40:54 +02:00
2006-12-11 00:44:18 +01:00
/**
* Used by template headers for including CSS in the header
*
2006-12-17 14:14:16 +01:00
* 'app_css' - css styles from a ) the menuaction 's css-method and b) the $GLOBALS[' egw_info '][' flags '][' css ' ]
* 'file_css' - link tag of the app . css file of the current app
* 'theme_css' - url of the theme css file
* 'print_css' - url of the print css file
2008-07-21 16:40:54 +02:00
*
2006-12-11 00:44:18 +01:00
* @ author Dave Hall ( * based * on verdilak ? css inclusion code )
2006-12-17 14:14:16 +01:00
* @ return array with keys 'app_css' from the css method of the menuaction - class and 'file_css' ( app . css file of the application )
2006-12-11 00:44:18 +01:00
*/
2008-08-18 11:00:19 +02:00
protected function _get_css ()
2006-12-11 00:44:18 +01:00
{
$app_css = '' ;
if ( isset ( $_GET [ 'menuaction' ]))
{
list ( $app , $class , $method ) = explode ( '.' , $_GET [ 'menuaction' ]);
2008-10-13 20:23:02 +02:00
if ( is_array ( $GLOBALS [ $class ] -> public_functions ) && $GLOBALS [ $class ] -> public_functions [ 'css' ])
2006-12-11 00:44:18 +01:00
{
2008-10-13 20:23:02 +02:00
error_log ( " Deprecated functionality in $app class $class : using of public_function css, use \$ GLOBALS['egw_info']['flags']['css'] or an app.css file! " );
2006-12-11 00:44:18 +01:00
$app_css .= $GLOBALS [ $class ] -> css ();
}
}
if ( isset ( $GLOBALS [ 'egw_info' ][ 'flags' ][ 'css' ]))
{
$app_css .= $GLOBALS [ 'egw_info' ][ 'flags' ][ 'css' ];
}
// search for app specific css file
if ( @ isset ( $GLOBALS [ 'egw_info' ][ 'flags' ][ 'currentapp' ]))
{
$appname = $GLOBALS [ 'egw_info' ][ 'flags' ][ 'currentapp' ];
2006-12-17 14:14:16 +01:00
$css_file = '/' . $appname . '/templates/' . $GLOBALS [ 'egw_info' ][ 'server' ][ 'template_set' ] . '/app.css' ;
if ( ! file_exists ( EGW_SERVER_ROOT . $css_file ))
2006-12-11 00:44:18 +01:00
{
2006-12-17 14:14:16 +01:00
$css_file = '/' . $appname . '/templates/default/app.css' ;
2008-07-21 16:40:54 +02:00
2006-12-17 14:14:16 +01:00
if ( ! file_exists ( EGW_SERVER_ROOT . $css_file )) $css_file = '' ;
2006-12-11 00:44:18 +01:00
}
2006-12-17 14:14:16 +01:00
if ( $css_file )
2006-12-11 00:44:18 +01:00
{
2006-12-17 14:14:16 +01:00
$css_file = '<LINK href="' . $GLOBALS [ 'egw_info' ][ 'server' ][ 'webserver_url' ] .
$css_file . '?' . filemtime ( EGW_SERVER_ROOT . $css_file ) . '" type=text/css rel=StyleSheet>' ;
2006-12-11 00:44:18 +01:00
}
}
2006-12-17 14:14:16 +01:00
#_debug_array($GLOBALS['egw_info']['user']['preferences']['common']);
2010-06-02 11:20:55 +02:00
$theme_css = $this -> template_dir . '/css/' . $GLOBALS [ 'egw_info' ][ 'user' ][ 'preferences' ][ 'common' ][ 'theme' ] . '.css' ;
2006-12-17 14:14:16 +01:00
if ( ! file_exists ( EGW_SERVER_ROOT . $theme_css ))
{
2010-06-02 11:20:55 +02:00
$theme_css = $this -> template_dir . '/css/' . $this -> template . '.css' ;
2006-12-17 14:14:16 +01:00
}
$theme_css = $GLOBALS [ 'egw_info' ][ 'server' ][ 'webserver_url' ] . $theme_css . '?' . filemtime ( EGW_SERVER_ROOT . $theme_css );
2010-06-02 11:20:55 +02:00
$print_css = $this -> template_dir . '/print.css' ;
2009-11-30 17:21:02 +01:00
if ( ! file_exists ( EGW_SERVER_ROOT . $print_css ))
2006-12-17 14:14:16 +01:00
{
$print_css = '/phpgwapi/templates/idots/print.css' ;
}
$print_css = $GLOBALS [ 'egw_info' ][ 'server' ][ 'webserver_url' ] . $print_css . '?' . filemtime ( EGW_SERVER_ROOT . $print_css );
2008-07-21 16:40:54 +02:00
2006-12-17 14:14:16 +01:00
return array (
'app_css' => $app_css ,
'css_file' => $css_file ,
'theme_css' => $theme_css ,
'print_css' => $print_css ,
);
2006-12-11 00:44:18 +01:00
}
/**
* Used by the template headers for including javascript in the header
*
* The method is included here to make it easier to change the js support
* in eGW . One change then all templates will support it ( as long as they
* include a call to this method ) .
*
* @ author Dave Hall ( * vaguely based * on verdilak ? css inclusion code )
* @ return string the javascript to be included
*/
2008-08-18 11:00:19 +02:00
public static function _get_js ()
2006-12-11 00:44:18 +01:00
{
$java_script = '' ;
2008-07-21 16:40:54 +02:00
2006-12-11 00:44:18 +01:00
// always include javascript helper functions
$GLOBALS [ 'egw' ] -> js -> validate_file ( 'jsapi' , 'jsapi' );
2010-02-12 10:04:44 +01:00
// GLOBAL var to tell egroupware wether or not to enable the IE selectBox resize hack
if ( $GLOBALS [ 'egw_info' ][ 'user' ][ 'preferences' ][ 'common' ][ 'enable_ie_dropdownmenuhack' ])
{
$java_script .= " <script type= \" text/javascript \" > \n var enable_ie_dropdownmenuhack=1; \n </script> \n " ;
}
2006-12-11 00:44:18 +01:00
//viniciuscb: in Concisus this condition is inexistent, and in all
//pages the javascript globals are inserted. Today, because
//filescenter needs these javascript globals, this
//include_jsbackend is a must to the javascript globals be
//included.
if ( $GLOBALS [ 'egw_info' ][ 'flags' ][ 'include_jsbackend' ])
{
if ( ! $GLOBALS [ 'egw_info' ][ 'flags' ][ 'nojsapi' ])
{
$GLOBALS [ 'egw' ] -> js -> validate_jsapi ();
}
2008-07-21 16:40:54 +02:00
2006-12-11 00:44:18 +01:00
if ( @ is_object ( $GLOBALS [ 'egw' ] -> js ))
{
$java_script .= $GLOBALS [ 'egw' ] -> js -> get_javascript_globals ();
}
}
2008-07-21 16:40:54 +02:00
2006-12-11 00:44:18 +01:00
if ( $GLOBALS [ 'egw' ] -> acl -> check ( 'run' , 1 , 'notifications' ) && ! $GLOBALS [ 'egw_info' ][ 'user' ][ 'preferences' ][ 'notifications' ][ 'disable_ajaxpopup' ])
{
$GLOBALS [ 'egw_info' ][ 'flags' ][ 'include_xajax' ] = true ;
}
2008-07-21 16:40:54 +02:00
2006-12-11 00:44:18 +01:00
if ( $GLOBALS [ 'egw_info' ][ 'flags' ][ 'include_xajax' ])
{
2010-01-08 00:39:17 +01:00
require_once ( EGW_API_INC . '/xajax/xajax_core/xajax.inc.php' );
2010-05-09 11:41:38 +02:00
2010-01-08 00:39:17 +01:00
$xajax = new xajax ();
$xajax -> configure ( 'requestURI' , egw :: link ( '/xajax.php' ));
$xajax -> configure ( 'javascript URI' , $GLOBALS [ 'egw_info' ][ 'server' ][ 'webserver_url' ] . '/phpgwapi/inc/xajax' );
$xajax -> configure ( 'waitCursor' , false );
$xajax -> register ( XAJAX_FUNCTION , 'doXMLHTTP' );
2010-01-08 02:16:29 +01:00
$xajax -> register ( XAJAX_FUNCTION , 'doXMLHTTP' , array ( 'mode' => " 'synchronous' " , 'alias' => 'doXMLHTTPsync' ));
2010-05-09 11:41:38 +02:00
2010-01-08 00:39:17 +01:00
$java_script .= $xajax -> getJavascript ();
2006-12-11 00:44:18 +01:00
}
2008-07-21 16:40:54 +02:00
/* this flag is for all javascript code that has to be put before other jscode .
2006-12-11 00:44:18 +01:00
Think of conf vars etc ... ( pim @ lingewoud . nl ) */
if ( isset ( $GLOBALS [ 'egw_info' ][ 'flags' ][ 'java_script_thirst' ]))
{
$java_script .= $GLOBALS [ 'egw_info' ][ 'flags' ][ 'java_script_thirst' ] . " \n " ;
}
2008-07-21 16:40:54 +02:00
2006-12-11 00:44:18 +01:00
if ( @ is_object ( $GLOBALS [ 'egw' ] -> js ))
{
$java_script .= $GLOBALS [ 'egw' ] -> js -> get_script_links ();
}
if ( @ isset ( $_GET [ 'menuaction' ]))
{
list ( $app , $class , $method ) = explode ( '.' , $_GET [ 'menuaction' ]);
if ( is_array ( $GLOBALS [ $class ] -> public_functions ) &&
$GLOBALS [ $class ] -> public_functions [ 'java_script' ])
{
$java_script .= $GLOBALS [ $class ] -> java_script ();
}
}
if ( isset ( $GLOBALS [ 'egw_info' ][ 'flags' ][ 'java_script' ]))
{
$java_script .= $GLOBALS [ 'egw_info' ][ 'flags' ][ 'java_script' ] . " \n " ;
}
return $java_script ;
}
/**
* Returns on ( Un ) Load attributes from js class
*
* @ author Dave Hall - skwashd at egroupware . org
* @ returns string body attributes
*/
2008-08-18 11:00:19 +02:00
protected static function _get_body_attribs ()
2006-12-11 00:44:18 +01:00
{
if ( @ is_object ( $GLOBALS [ 'egw' ] -> js ))
{
return $GLOBALS [ 'egw' ] -> js -> get_body_attribs ();
}
else
{
return '' ;
}
}
2010-06-02 12:59:58 +02:00
/**
* List available themes
*
* Themes are css file in the template directory
*
* @ param string $themes_dir = 'css'
*/
function list_themes ()
{
$list = array ();
if (( $dh = @ opendir ( EGW_SERVER_ROOT . $this -> template_dir . SEP . 'css' )))
{
while (( $file = readdir ( $dh )))
{
if ( preg_match ( '/' . " \ .css $ " . '/i' , $file ))
{
list ( $name ) = explode ( '.' , $file );
$list [ $name ] = $name ;
}
}
closedir ( $dh );
}
return $list ;
}
/**
* List available templates
*
2010-06-03 00:43:41 +02:00
* @ param boolean $full_data = false true : value is array with values for keys 'name' , 'title' , ...
2010-06-02 12:59:58 +02:00
* @ returns array alphabetically sorted list of templates
*/
2010-06-03 00:43:41 +02:00
static function list_templates ( $full_data = false )
2010-06-02 12:59:58 +02:00
{
$list = array ();
// templates packaged in the api
$d = dir ( EGW_SERVER_ROOT . '/phpgwapi/templates' );
while (( $entry = $d -> read ()))
{
if ( $entry != '..' && file_exists ( EGW_SERVER_ROOT . '/phpgwapi/templates/' . $entry . '/class.' . $entry . '_framework.inc.php' ))
{
if ( file_exists ( $f = EGW_SERVER_ROOT . '/phpgwapi/templates/' . $entry . '/setup/setup.inc.php' ))
{
include ( $f );
2010-06-03 00:43:41 +02:00
$list [ $entry ] = $full_data ? $GLOBALS [ 'egw_info' ][ 'template' ][ $entry ] :
$GLOBALS [ 'egw_info' ][ 'template' ][ $entry ][ 'title' ];
2010-06-02 12:59:58 +02:00
}
else
{
2010-06-03 00:43:41 +02:00
$list [ $entry ] = $full_data ? array (
'name' => $entry ,
'title' => $entry ,
) : $entry ;
2010-06-02 12:59:58 +02:00
}
}
}
$d -> close ();
// templates packaged like apps in own directories (containing as setup/setup.inc.php file!)
$d = dir ( EGW_SERVER_ROOT );
while (( $entry = $d -> read ()))
{
if ( $entry != '..' && ! isset ( $GLOBALS [ 'egw_info' ][ 'apps' ][ $entry ]) &&
2010-06-02 19:33:26 +02:00
file_exists ( $f = EGW_SERVER_ROOT . '/' . $entry . '/setup/setup.inc.php' ))
2010-06-02 12:59:58 +02:00
{
include ( $f );
if ( isset ( $GLOBALS [ 'egw_info' ][ 'template' ][ $entry ]))
{
2010-06-03 00:43:41 +02:00
$list [ $entry ] = $full_data ? $GLOBALS [ 'egw_info' ][ 'template' ][ $entry ] :
$GLOBALS [ 'egw_info' ][ 'template' ][ $entry ][ 'title' ];
2010-06-02 12:59:58 +02:00
}
}
}
$d -> close ();
ksort ( $list );
return $list ;
}
2006-12-11 00:44:18 +01:00
}
/**
* Public functions to be compatible with the exiting eGW framework
*/
if ( ! function_exists ( 'parse_navbar' ))
{
/**
* echo ' s out the navbar
*
* @ deprecated use $GLOBALS [ 'egw' ] -> framework :: navbar () or $GLOBALS [ 'egw' ] -> framework :: render ()
*/
function parse_navbar ()
{
echo $GLOBALS [ 'egw' ] -> framework -> navbar ();
}
}
if ( ! function_exists ( 'display_sidebox' ))
{
/**
* echo ' s out a sidebox menu
*
* @ deprecated use $GLOBALS [ 'egw' ] -> framework :: sidebox ()
*/
function display_sidebox ( $appname , $menu_title , $file )
{
$GLOBALS [ 'egw' ] -> framework -> sidebox ( $appname , $menu_title , $file );
}
2007-01-09 23:42:01 +01:00
}