From ccbd8bc90db94140085fdb7743aeedc12cab80e5 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 16 Sep 2010 09:53:39 +0000 Subject: [PATCH] new logo for 1.8 --- phpgwapi/inc/class.egw_framework.inc.php | 769 +++++++++++++++++++++ phpgwapi/templates/default/images/logo.png | Bin 3407 -> 5339 bytes phpgwapi/templates/default/images/logo.xcf | Bin 0 -> 14271 bytes 3 files changed, 769 insertions(+) create mode 100644 phpgwapi/inc/class.egw_framework.inc.php create mode 100644 phpgwapi/templates/default/images/logo.xcf diff --git a/phpgwapi/inc/class.egw_framework.inc.php b/phpgwapi/inc/class.egw_framework.inc.php new file mode 100644 index 0000000000..ea56958be0 --- /dev/null +++ b/phpgwapi/inc/class.egw_framework.inc.php @@ -0,0 +1,769 @@ + rewrite in 12/2006 + * @author Pim Snel 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 + * + * 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. + * + * Existing apps either set $GLOBALS['egw_info']['flags']['noheader'] and call common::egw_header() and + * (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(). + * And the app calls common::egw_footer(). + * + * 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 + * and Joseph Engo + * and Mark Peters + * and Lars Kneschke + * Copyright (C) 2000, 2001 Dan Kuykendall + * Copyright (C) 2003 Lars Kneschke + */ +abstract class egw_framework +{ + /** + * Name of the template set, eg. 'idots' + * + * @var string + */ + var $template; + + /** + * true if $this->header() was called + * + * @var boolean + */ + static $header_done = false; + /** + * true if $this->navbar() was called + * + * @var boolean + */ + static $navbar_done = false; + + /** + * Constructor + * + * The constructor instanciates the class in $GLOBALS['egw']->framework, from where it should be used + * + * @return egw_framework + */ + function egw_framework($template) + { + $this->template = $template; + + if (!isset($GLOBALS['egw']->framework)) + { + $GLOBALS['egw']->framework = $this; + } + } + + /** + * Renders an applicaton page with the complete eGW framework (header, navigation and menu) + * + * 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 + * + */ + 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; + + echo $this->header(); + + if (!isset($GLOBALS['egw_info']['flags']['nonavbar']) || !$GLOBALS['egw_info']['flags']['nonavbar']) + { + echo $this->navbar(); + } + echo $content; + + echo $this->footer(); + } + + /** + * Returns the html-header incl. the opening body tag + * + * @return string with html + */ + abstract function header(); + + /** + * Returns the html from the body-tag til the main application area (incl. opening div tag) + * + * @return string with html + */ + abstract function navbar(); + + /** + * Returns the content of one sidebox + * + * @param string $appname + * @param string $menu_title + * @param array $file + */ + abstract function sidebox($appname,$menu_title,$file); + + /** + * Returns the html from the closing div of the main application area to the closing html-tag + * + * @return string + */ + abstract function footer(); + + /** + * displays a login screen + * + * @string $extra_vars for login url + * @return string + */ + abstract function login_screen($extra_vars); + + /** + * displays a login denied message + * + * @return string + */ + abstract function denylogin_screen(); + + /** + * Get footer as array to eg. set as vars for a template (from idots' head.inc.php) + * + * @return array + */ + protected function _get_footer() + { + $var = Array( + 'img_root' => $GLOBALS['egw_info']['server']['webserver_url'] . '/phpgwapi/templates/'.$this->template.'/images', + 'version' => $GLOBALS['egw_info']['server']['versions']['phpgwapi'] + ); + if($GLOBALS['egw_info']['user']['preferences']['common']['show_generation_time']) + { + $totaltime = sprintf('%4.2lf',microtime(true) - $GLOBALS['egw_info']['flags']['page_start_time']); + + $var['page_generation_time'] = '

'.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'] .= '
'; + } + $var['powered_by'] = lang('Powered by').' Stylite\'s'. + ' EGroupware'. + ' Community Version '.$GLOBALS['egw_info']['server']['versions']['phpgwapi']; + + return $var; + } + + /** + * Get the (depricated) application footer + * + * @return string html + */ + protected static function _get_app_footer() + { + ob_start(); + // Include the apps footer files if it exists + if (EGW_APP_INC != EGW_API_INC && // this prevents an endless inclusion on the homepage + // (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']); + if ($class && is_object($GLOBALS[$class]) && is_array($GLOBALS[$class]->public_functions) && + 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(); + + return $content; + } + + /** + * Get header as array to eg. set as vars for a template (from idots' head.inc.php) + * + * @return array + */ + protected function _get_header() + { + // 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']; + } + //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'; + $pngfix =' + '; + } + + 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 = ''; + } + else + { + $simple_show_hide_src = $GLOBALS['egw_info']['server']['webserver_url'] . '/phpgwapi/templates/idots/js/simple_show_hide.js'; + $simple_show_hide = ''; + } + + 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); + } + + if($app!='wiki') $robots =''; + if (substr($GLOBALS['egw_info']['server']['favicon_file'],0,4) == 'http') + { + $var['favicon_file'] = $GLOBALS['egw_info']['server']['favicon_file']; + } + else + { + $var['favicon_file'] = common::image('phpgwapi',$GLOBALS['egw_info']['server']['favicon_file']?$GLOBALS['egw_info']['server']['favicon_file']:'favicon.ico'); + } + + $wz_tooltip = '/phpgwapi/js/wz_tooltip/wz_tooltip.js'; + if (file_exists(EGW_SERVER_ROOT.$wz_tooltip)) + { + $include_wz_tooltip = ''; + } + return $this->_get_css()+array( + 'img_icon' => $var['favicon_file'], + 'img_shortcut' => $var['favicon_file'], + 'pngfix' => $pngfix, + 'slider_effects' => $slider_effects, + 'simple_show_hide' => $simple_show_hide, + 'lang_code' => $lang_code, + 'charset' => translation::charset(), + 'website_title' => strip_tags($GLOBALS['egw_info']['server']['site_title']. ($app ? " [$app]" : '')), + 'body_tags' => self::_get_body_attribs(), + 'java_script' => self::_get_js(), + 'meta_robots' => $robots, + 'dir_code' => lang('language_direction_rtl') != 'rtl' ? '' : ' dir="rtl"', + 'include_wz_tooltip'=> $include_wz_tooltip, + ); + } + + /** + * 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 + */ + protected function _get_navbar($apps) + { + $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']; + } + $var['currentapp'] = $GLOBALS['egw_info']['flags']['currentapp']; + + // current users for admins + $var['current_users'] = $this->_current_users(); + + // quick add selectbox + $var['quick_add'] = $this->_get_quick_add(); + + $var['user_info'] = $this->_user_time_info(); + + if($GLOBALS['egw_info']['user']['lastpasswd_change'] == 0) + { + $api_messages = lang('You are required to change your password during your first login').'
'. + lang('Click this image on the navbar: %1',''); + } + 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 . '
' . checkcode($cd); + } + + if (substr($GLOBALS['egw_info']['server']['login_logo_file'],0,4) == 'http') + { + $var['logo_file'] = $GLOBALS['egw_info']['server']['login_logo_file']; + } + else + { + $var['logo_file'] = common::image('phpgwapi',$GLOBALS['egw_info']['server']['login_logo_file']?$GLOBALS['egw_info']['server']['login_logo_file']:'logo'); + } + $var['logo_url'] = $GLOBALS['egw_info']['server']['login_logo_url']?$GLOBALS['egw_info']['server']['login_logo_url']:'http://www.eGroupWare.org'; + + 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'; + + return $var; + } + + /** + * Returns html with user and time + * + * @return void + */ + protected static function _user_time_info() + { + $now = new egw_time(); + $user_info = ''.common::display_fullname() .''. ' - ' . lang($now->format('l')) . ' ' . $now->format(true); + + $user_tzs = egw_time::getUserTimezones(); + if (count($user_tzs) > 1) + { + $tz = $GLOBALS['egw_info']['user']['preferences']['common']['tz']; + $user_info .= html::form(html::select('tz',$tz,$user_tzs,true,' onchange="this.form.submit();"'),array(), + '/index.php','','tz_selection',' style="display: inline;"','GET'); + } + return $user_info; + } + + /** + * Prepare the current users + * + * @return string + */ + protected static function _current_users() + { + if( $GLOBALS['egw_info']['user']['apps']['admin'] && $GLOBALS['egw_info']['user']['preferences']['common']['show_currentusers']) + { + $current_users = '' . + lang('Current users') . ': ' . $GLOBALS['egw']->session->session_count() . ''; + return $current_users; + } + } + + /** + * Prepare the quick add selectbox + * + * @return string + */ + protected static function _get_quick_add() + { + $apps = egw_link::app_list('add'); + asort($apps); // sort them alphabetic + + $options = array(lang('Add').' ...'); + foreach($apps as $app => $label) + { + $link = egw::link('/index.php',egw_link::add($app,$GLOBALS['egw_info']['flags']['currentapp'],$GLOBALS['egw_info']['flags']['currentid'])+ + (is_array($GLOBALS['egw_info']['flags']['quick_add']) ? $GLOBALS['egw_info']['flags']['quick_add'] : array())); + if (($popup = egw_link::is_popup($app,'add'))) + { + list($w,$h) = explode('x',$popup); + $action = "window.open('$link','_blank','width='+$w+',height='+$h+',location=no,menubar=no,toolbar=no,scrollbars=yes,status=yes');"; + } + else + { + $action = "location.href = '$link';"; + } + $options[$action] = $label; + } + return html::select('quick_add','',$options,true,$options=' onchange="eval(this.value); this.value=0; return false;"'); + } + + /** + * Prepare notification signal (blinking bell) + * + * @return string + */ + protected static function _get_notification_bell() + { + return html::div( + html::a_href( + html::image('notifications','notificationbell',lang('notifications')), + 'javascript: egwpopup_display();' + ), + 'id="notificationbell"', // options + '', // class + 'display: none' //style + ); + } + + /** + * 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']; + } + } + return egw::link($index,$GLOBALS['egw_info']['flags']['params'][$app]); + } + + /** + * Prepare an array with apps used to render the navbar + * + * This is similar to the former common::navbar() method - though it returns the vars and does not place them in global scope. + * + * @return array + */ + protected static function _get_navbar_apps() + { + 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); + + $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']; + $apps[$app]['url'] = self::index($app); + $apps[$app]['name'] = $app; + + // create popup target + if ($data['status'] == 4) + { + $apps[$app]['target'] = ' target="'.$app.'" onClick="'."if (this != '') { window.open(this+'". + (strpos($apps[$app]['url'],'?') !== false ? '&' : '?'). + "referer='+encodeURIComponent(location),this.target,'width=800,height=600,scrollbars=yes,resizable=yes'); return false; } else { return true; }".'"'; + } + 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'] = ''; + } + + $icon = isset($data['icon']) ? $data['icon'] : 'navbar'; + $icon_app = isset($data['icon_app']) ? $data['icon_app'] : $app; + if ($app != $GLOBALS['egw_info']['flags']['currentapp']) + { + $apps[$app]['icon'] = common::image($icon_app,Array($icon,'nonav')); + $apps[$app]['icon_hover'] = common::image_on($icon_app,Array($icon,'nonav'),'-over'); + } + else + { + $apps[$app]['icon'] = common::image_on($icon_app,Array($icon,'nonav'),'-over'); + $apps[$app]['icon_hover'] = common::image($icon_app,Array($icon,'nonav')); + } + } + } + if ($GLOBALS['egw_info']['flags']['currentapp'] == 'preferences' || $GLOBALS['egw_info']['flags']['currentapp'] == 'about') + { + $app = $app_title = 'eGroupWare'; + } + 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); + + $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'); + + $apps['logout']['title'] = lang('Logout'); + $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'); + + return $apps; + } + + /** + * Used by template headers for including CSS in the header + * + * '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 + * + * @author Dave Hall (*based* on verdilak? css inclusion code) + * @return array with keys 'app_css' from the css method of the menuaction-class and 'file_css' (app.css file of the application) + */ + protected function _get_css() + { + $app_css = ''; + if(isset($_GET['menuaction'])) + { + list($app,$class,$method) = explode('.',$_GET['menuaction']); + if(is_array($GLOBALS[$class]->public_functions) && $GLOBALS[$class]->public_functions['css']) + { + error_log("Deprecated functionality in $app class $class: using of public_function css, use \$GLOBALS['egw_info']['flags']['css'] or an app.css file!"); + $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']; + + $css_file = '/'.$appname.'/templates/'.$GLOBALS['egw_info']['server']['template_set'].'/app.css'; + if (!file_exists(EGW_SERVER_ROOT.$css_file)) + { + $css_file = '/'.$appname.'/templates/default/app.css'; + + if (!file_exists(EGW_SERVER_ROOT.$css_file)) $css_file = ''; + } + if($css_file) + { + $css_file = ''; + } + } + #_debug_array($GLOBALS['egw_info']['user']['preferences']['common']); + $theme_css = '/phpgwapi/templates/'.$this->template.'/css/'.$GLOBALS['egw_info']['user']['preferences']['common']['theme'].'.css'; + if(!file_exists(EGW_SERVER_ROOT.$theme_css)) + { + $theme_css = '/phpgwapi/templates/'.$this->template.'/css/'.$this->template.'.css'; + } + $theme_css = $GLOBALS['egw_info']['server']['webserver_url'] . $theme_css .'?'.filemtime(EGW_SERVER_ROOT.$theme_css); + + $print_css = '/phpgwapi/templates/'.$this->template.'/print.css'; + if(!file_exists(EGW_SERVER_ROOT.$print_css)) + { + $print_css = '/phpgwapi/templates/idots/print.css'; + } + $print_css = $GLOBALS['egw_info']['server']['webserver_url'] . $print_css .'?'.filemtime(EGW_SERVER_ROOT.$print_css); + + return array( + 'app_css' => $app_css, + 'css_file' => $css_file, + 'theme_css' => $theme_css, + 'print_css' => $print_css, + ); + } + + /** + * 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 + */ + public static function _get_js() + { + $java_script = ''; + + // always include javascript helper functions + $GLOBALS['egw']->js->validate_file('jsapi','jsapi'); + // 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 .= "\n"; + } + //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(); + } + + if(@is_object($GLOBALS['egw']->js)) + { + $java_script .= $GLOBALS['egw']->js->get_javascript_globals(); + } + } + + if ($GLOBALS['egw']->acl->check('run',1,'notifications') && !$GLOBALS['egw_info']['user']['preferences']['notifications']['disable_ajaxpopup']) + { + $GLOBALS['egw_info']['flags']['include_xajax'] = true; + } + + if ($GLOBALS['egw_info']['flags']['include_xajax']) + { + require_once(EGW_API_INC.'/xajax/xajax_core/xajax.inc.php'); + + $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'); + $xajax->register(XAJAX_FUNCTION,'doXMLHTTP',array('mode' => "'synchronous'",'alias' => 'doXMLHTTPsync')); + + $java_script .= $xajax->getJavascript(); + } + + /* this flag is for all javascript code that has to be put before other jscode. + 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"; + } + + 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 + */ + protected static function _get_body_attribs() + { + if(@is_object($GLOBALS['egw']->js)) + { + return $GLOBALS['egw']->js->get_body_attribs(); + } + else + { + return ''; + } + } +} + +/** + * 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); + } + } diff --git a/phpgwapi/templates/default/images/logo.png b/phpgwapi/templates/default/images/logo.png index 57646bd1375d5fbf63575a2b47ea2595ed056140..e25c1e8b1865390a1c76eb2482c9427f7f95cbda 100644 GIT binary patch delta 5291 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 delta 3344 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 a`yX8G7OlFS^yvTq00{s|MNUMnLSTYL{amyF diff --git a/phpgwapi/templates/default/images/logo.xcf b/phpgwapi/templates/default/images/logo.xcf new file mode 100644 index 0000000000000000000000000000000000000000..8b059fe84ee9871e35e086f24265aca19d9062a9 GIT binary patch literal 14271 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 literal 0 HcmV?d00001