<?php /**************************************************************************\ * eGroupWare API - JavaScript * * Written by Dave Hall skwashd at phpgroupware.org * * Copyright (C) 2003 Free Software Foundation Inc * * -------------------------------------------------------------------------* * This library is part of the eGroupWare API * * http://www.egroupware.org/api * * ------------------------------------------------------------------------ * * This program is Free Software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2 of the License, or (at your * * option) any later version. * \**************************************************************************/ /* $Id$ */ /** * eGroupWare javascript support class * * Only instanstiate this class using: * <code> * if(!@is_object($GLOBALS['egw']->js)) * { * $GLOBALS['egw']->js =& CreateObject('phpgwapi.javascript'); * } * </code> * * This way a theme can see if this is a defined object and include the data, * while the is_object() wrapper prevents whiping out existing data held in * this instance variables, primarily the $files variable. * * Note: The package argument is the subdirectory of js - all js should live in subdirectories * * @package phpgwapi * @subpackage sessions * @abstract * @author Dave Hall * @copyright © 2003 Free Software Foundation * @license GPL * @uses template * */ class javascript { /** * @var array elements to be used for the on(Un)Load attributes of the body tag */ var $body; /** * @var array list of validated files to be included in the head section of a page */ var $files; /** * @var object used for holding an instance of the Template class */ var $t; /** * @var boolean Load JS API ? */ var $js_api; /** * Constructor * * Initialize the instance variables */ function javascript() { //$this->t =& CreateObject('phpgwapi.Template', ExecMethod('phpgwapi.phpgw.common.get_tpl_dir','phpgwapi')); } /** * Returns the javascript required for displaying a popup message box * * @param string $msg the message to be displayed to user * @returns string the javascript to be used for displaying the message */ function get_alert($msg) { return 'return alert("'.lang($msg).'");'; } /** * Adds on(Un)Load= attributes to the body tag of a page * * @returns string the attributes to be used */ function get_body_attribs() { $js = ''; foreach(array('onLoad','onUnload','onResize') as $what) { if (!empty($this->body[$what])) { $js .= ' '.$what.'="' . str_replace(array('\\\'','"','\\','''),array(''','\\"','\\\\','\\\''),$this->body[$what]) . '"'; } } return $js; } /** * Returns the javascript required for displaying a confirmation message box * * @param string $msg the message to be displayed to user * @returns string the javascript to be used for displaying the message */ function get_confirm($msg) { return 'return confirm("'.lang($msg).'");'; } /** * Used for generating the list of external js files to be included in the head of a page * * NOTE: This method should only be called by the template class. * The validation is done when the file is added so we don't have to worry now * * @returns string the html needed for importing the js into a page */ function get_script_links() { $links = "<!--JS Imports from phpGW javascript class -->\n"; if(!empty($this->files) && is_array($this->files)) { foreach($this->files as $app => $packages) { if(!empty($packages) && is_array($packages)) { foreach($packages as $pkg => $files) { if(!empty($files) && is_array($files)) { foreach($files as $file => $browser) { $pkg = $pkg == '.' ? '' : $pkg.'/'; $browser = $browser == '.' ? '' : $browser.'/'; $f = "/$app/js/$pkg$browser$file" . '.js?'. filectime(EGW_INCLUDE_ROOT."/$app/js/$pkg$browser$file.js") .'">'; $links .= '<script type="text/javascript" src="'. $GLOBALS['egw_info']['server']['webserver_url']. $f. "</script>\n"; } } } } } } return $links; } /** * Sets an onLoad action for a page * * @param string javascript to be used */ function set_onload($code) { $this->body['onLoad'] .= $code; } /** * Sets an onUnload action for a page * * @param string javascript to be used */ function set_onunload($code) { $this->body['onUnload'] .= $code; } /** * Sets an onResize action for a page * * @param string javascript to be used */ function set_onresize($code) { $this->body['onResize'] .= $code; } /** * DO NOT USE - NOT SURE IF I AM GOING TO USE IT - ALSO IT NEEDS SOME CHANGES!!!! * Used for removing a file or package of files to be included in the head section of a page * * @param string $app application to use * @param string $package the name of the package to be removed * @param string $file the name of a file in the package to be removed - if ommitted package is removed */ function unset_script_link($app, $package, $file=False) { /* THIS DOES NOTHING ATM :P if($file !== False) { unset($this->files[$app][$package][$file]); } else { unset($this->files[$app][$package]); } */ } /** * Checks to make sure a valid package and file name is provided * * @param string $package package to be included * @param string $file file to be included - no ".js" on the end * @param string $app application directory to search - default = phpgwapi * @param bool $browser insert specific browser javascript. * * @discuss The browser specific option loads the file which is in the correct * browser folder. Supported folder are those supported by class.browser.inc.php * * @returns bool was the file found? */ function validate_file($package, $file, $app='phpgwapi', $browser=true) { if ($browser) { $browser_folder = html::$user_agent; } else { $browser_folder = '.'; } //echo "<p>".__METHOD__."($package,$file,$app,$browser) --> ".EGW_INCLUDE_ROOT ."/$app/js/$package/$browser_folder/$file.js</p>\n"; if ($this->included_files[$app][$package][$file]) return true; if(is_readable(EGW_INCLUDE_ROOT ."/$app/js/$package/$browser_folder/$file.js")) { $this->files[$app][$package][$file] = $browser_folder; return True; } elseif (is_readable(EGW_INCLUDE_ROOT. "/$app/js/$package/$file.js")) { $this->files[$app][$package][$file] = '.'; return True; } elseif($app != 'phpgwapi') { if(is_readable(EGW_INCLUDE_ROOT ."/phpgwapi/js/$package/$browser_folder/$file.js")) { $this->files['phpgwapi'][$package][$file] = $browser_folder; return True; } elseif(is_readable(EGW_INCLUDE_ROOT ."/phpgwapi/js/$package/$file.js")) { $this->files['phpgwapi'][$package][$file] = '.'; return True; } return False; } } function validate_jsapi() { if (EGW_UNCOMPRESSED_THYAPI) { $this->validate_file('plugins', 'thyPlugins'); } /* This was included together with javascript globals to garantee prior load of dynapi. But it doesn't seems * right to me... maybe on class common, it should load dynapi before everything... */ $this->validate_file('dynapi','dynapi'); // Initialize DynAPI $GLOBALS['egw_info']['flags']['java_script'] .= '<script language="javascript">'."\n"; $GLOBALS['egw_info']['flags']['java_script'] .= "dynapi.library.setPath(GLOBALS['serverRoot']+'/phpgwapi/js/dynapi/')\n"; $GLOBALS['egw_info']['flags']['java_script'] .= "dynapi.library.include('dynapi.library')\n"; $GLOBALS['egw_info']['flags']['java_script'] .= "dynapi.library.include('dynapi.api')\n"; $GLOBALS['egw_info']['flags']['java_script'] .= "</script>\n";/**/ //FIXME: These files are temporary! They should be included inside DynAPI or substituted by // other ones $this->validate_file('jsapi', 'jsapi'); $this->validate_file('wz_dragdrop', 'wz_dragdrop'); $this->validate_file('dJSWin', 'dJSWin'); $this->validate_file('dTabs', 'dTabs'); $this->validate_file('connector', 'connector'); $this->validate_file('xmlrpcMsgCreator','xmlrpc'); $this->validate_file('jsolait','init'); return true; } function get_javascript_globals() { /* Default Global Messages */ $GLOBALS['egw_info']['flags']['java_script_globals']['messages']['jsapi']['parseError'] = lang('Failed to Contact Server or Invalid Response from Server. Try to relogin. Contact Admin in case of faliure.'); $GLOBALS['egw_info']['flags']['java_script_globals']['messages']['jsapi']['serverTimeout'] = lang('Could not contact server. Operation Timed Out!'); $GLOBALS['egw_info']['flags']['java_script_globals']['messages']['jsapi']['dataSourceStartup'] = lang('Starting Up...'); $GLOBALS['egw_info']['flags']['java_script_globals']['messages']['jsapi']['connector_1'] = lang('Contacting Server...'); $GLOBALS['egw_info']['flags']['java_script_globals']['messages']['jsapi']['connector_2'] = lang('Server Contacted. Waiting for response...'); $GLOBALS['egw_info']['flags']['java_script_globals']['messages']['jsapi']['connector_3'] = lang('Server answered. Processing response...'); $GLOBALS['egw_info']['flags']['java_script_globals']['preferences']['common'] =& $GLOBALS['egw_info']['user']['preferences']['common']; /* Default Global API Variables */ $browser = strtolower(ExecMethod('phpgwapi.browser.get_agent')); switch ($browser) { case 'ie': case 'opera': $thyapi_comp = 'thyapi_comp_'.$browser.'.js'; break; default: $thyapi_comp = 'thyapi_comp_gecko.js'; } $GLOBALS['egw_info']['flags']['java_script_globals']['jsapi']['imgDir'] = $GLOBALS['egw_info']['server']['webserver_url'].'/phpgwapi/images'; if (EGW_UNCOMPRESSED_THYAPI) { $jsCode = "<!-- JS Global Variables and ThyAPI Insertion -->\n" . '<script type="text/javascript" src="'.($GLOBALS['egw_info']['server']['webserver_url'] ? $GLOBALS['egw_info']['server']['webserver_url'].'/' : '/'). '/phpgwapi/js/dynapi/dynapi.js"></script>'."\n". '<script language="javascript">'."\n". 'var GLOBALS = new Object();'."\n" . "GLOBALS['serverRoot'] = '".($GLOBALS['egw_info']['server']['webserver_url'] ? $GLOBALS['egw_info']['server']['webserver_url'].'/' : '/')."';\n". "GLOBALS['appname'] = '".$GLOBALS['egw_info']['flags']['currentapp']."';\n". "GLOBALS['httpProtocol'] = '".($_SERVER['HTTPS'] ? 'https://' : 'http://')."';\n"; } else { $jsCode = "<!-- JS Global Variables and ThyAPI Insertion -->\n" . '<script type="text/javascript" src="'.($GLOBALS['egw_info']['server']['webserver_url'] ? $GLOBALS['egw_info']['server']['webserver_url'].'/' : '/'). '/phpgwapi/js/'.$thyapi_comp.'"></script>'."\n". '<script language="javascript">'."\n". 'var GLOBALS = new Object();'."\n" . "GLOBALS['serverRoot'] = '".($GLOBALS['egw_info']['server']['webserver_url'] ? $GLOBALS['egw_info']['server']['webserver_url'].'/' : '/')."';\n". "GLOBALS['appname'] = '".$GLOBALS['egw_info']['flags']['currentapp']."';\n". "GLOBALS['httpProtocol'] = '".($_SERVER['HTTPS'] ? 'https://' : 'http://')."';\n"; } if ($GLOBALS['egw_info']['extra_get_vars']) { $GLOBALS['egw_info']['flags']['java_script_globals']['extra_get_vars'] = $GLOBALS['egw_info']['extra_get_vars']; } $jsCode .= $this->convert_phparray_jsarray("GLOBALS", $GLOBALS['egw_info']['flags']['java_script_globals'], false); if (EGW_UNCOMPRESSED_THYAPI) { $jsCode .= "\ndynapi.library.setPath(GLOBALS['serverRoot']+'/phpgwapi/js/dynapi/');\n". "dynapi.library.include('dynapi.library');\n". "dynapi.library.include('dynapi.api');\n\n"; } // Enable Debug? $config =& CreateObject('phpgwapi.config', 'phpgwapi'); $config_values = $config->read_repository(); if ($config_values['js_debug']) { $jsCode .= "if (dynapi.ua.gecko) dynapi.library.include('dynapi.debug')\n"; } $jsCode .= '</script>'."\n"; return $jsCode; } function convert_phparray_jsarray($name, $array, $new=true) { if (!is_array($array)) { return ''; } if ($new) { $jsCode = "$name = new Object();\n"; } else { $jsCode = ''; } foreach ($array as $index => $value) { if (is_array($value)) { $jsCode .= $name."['".$index."'] = new Object();\n"; $jsCode .= $this->convert_phparray_jsarray($name."['".$index."']", $value,false); continue; } switch(gettype($value)) { case 'string': $value = "'".str_replace(array("\n","\r"),'\n',addslashes($value))."'"; break; case 'boolean': if ($value) { $value = 'true'; } else { $value = 'false'; } break; default: $value = 'null'; } $jsCode .= $name."['".$index."'] = ".$value.";\n"; } return $jsCode; } } ?>