From 19215ae75e275a243eeb9ab239ebf832307c0563 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 7 Jan 2010 23:33:20 +0000 Subject: [PATCH] adding stock xajax_0.5_minimal --- phpgwapi/inc/xajax/copyright.inc.php | 54 + phpgwapi/inc/xajax/xajax_core/legacy.inc.php | 73 + .../support/xajaxCallableObject.inc.php | 228 ++ .../plugin_layer/support/xajaxEvent.inc.php | 162 + .../support/xajaxUserFunction.inc.php | 233 ++ .../xajaxCallableObjectPlugin.inc.php | 219 + .../xajaxDefaultIncludePlugin.inc.php | 352 ++ .../plugin_layer/xajaxEventPlugin.inc.php | 229 ++ .../plugin_layer/xajaxFunctionPlugin.inc.php | 231 ++ .../plugin_layer/xajaxScriptPlugin.inc.php | 266 ++ phpgwapi/inc/xajax/xajax_core/xajax.inc.php | 1423 +++++++ .../xajax_core/xajaxArgumentManager.inc.php | 466 +++ .../inc/xajax/xajax_core/xajaxCall.inc.php | 389 ++ .../xajax/xajax_core/xajaxCompress.inc.php | 148 + .../inc/xajax/xajax_core/xajaxControl.inc.php | 682 ++++ .../xajax_core/xajaxLanguageManager.inc.php | 188 + .../inc/xajax/xajax_core/xajaxPlugin.inc.php | 191 + .../xajax_core/xajaxPluginManager.inc.php | 344 ++ .../inc/xajax/xajax_core/xajaxRequest.inc.php | 359 ++ .../xajax/xajax_core/xajaxResponse.inc.php | 1908 +++++++++ .../xajax_core/xajaxResponseManager.inc.php | 231 ++ .../xajax/xajax_core/xajax_lang_de.inc.php | 88 + .../xajax/xajax_core/xajax_lang_nl.inc.php | 79 + phpgwapi/inc/xajax/xajax_js/xajax_core.js | 411 ++ .../xajax/xajax_js/xajax_core_uncompressed.js | 3553 +++++++++++++++++ phpgwapi/inc/xajax/xajax_js/xajax_debug.js | 117 + .../xajax_js/xajax_debug_uncompressed.js | 883 ++++ phpgwapi/inc/xajax/xajax_js/xajax_lang_bg.js | 10 + .../xajax_js/xajax_lang_bg_uncompressed.js | 81 + phpgwapi/inc/xajax/xajax_js/xajax_lang_de.js | 9 + .../xajax_js/xajax_lang_de_uncompressed.js | 84 + phpgwapi/inc/xajax/xajax_js/xajax_lang_es.js | 10 + .../xajax_js/xajax_lang_es_uncompressed.js | 81 + phpgwapi/inc/xajax/xajax_js/xajax_lang_fr.js | 8 + .../xajax_js/xajax_lang_fr_uncompressed.js | 65 + phpgwapi/inc/xajax/xajax_js/xajax_lang_nl.js | 9 + .../xajax_js/xajax_lang_nl_uncompressed.js | 84 + phpgwapi/inc/xajax/xajax_js/xajax_lang_tr.js | 10 + .../xajax_js/xajax_lang_tr_uncompressed.js | 82 + phpgwapi/inc/xajax/xajax_js/xajax_legacy.js | 14 + .../xajax_js/xajax_legacy_uncompressed.js | 69 + phpgwapi/inc/xajax/xajax_js/xajax_verbose.js | 18 + .../xajax_js/xajax_verbose_uncompressed.js | 176 + 43 files changed, 14317 insertions(+) create mode 100644 phpgwapi/inc/xajax/copyright.inc.php create mode 100644 phpgwapi/inc/xajax/xajax_core/legacy.inc.php create mode 100644 phpgwapi/inc/xajax/xajax_core/plugin_layer/support/xajaxCallableObject.inc.php create mode 100644 phpgwapi/inc/xajax/xajax_core/plugin_layer/support/xajaxEvent.inc.php create mode 100644 phpgwapi/inc/xajax/xajax_core/plugin_layer/support/xajaxUserFunction.inc.php create mode 100644 phpgwapi/inc/xajax/xajax_core/plugin_layer/xajaxCallableObjectPlugin.inc.php create mode 100644 phpgwapi/inc/xajax/xajax_core/plugin_layer/xajaxDefaultIncludePlugin.inc.php create mode 100644 phpgwapi/inc/xajax/xajax_core/plugin_layer/xajaxEventPlugin.inc.php create mode 100644 phpgwapi/inc/xajax/xajax_core/plugin_layer/xajaxFunctionPlugin.inc.php create mode 100644 phpgwapi/inc/xajax/xajax_core/plugin_layer/xajaxScriptPlugin.inc.php create mode 100644 phpgwapi/inc/xajax/xajax_core/xajax.inc.php create mode 100644 phpgwapi/inc/xajax/xajax_core/xajaxArgumentManager.inc.php create mode 100644 phpgwapi/inc/xajax/xajax_core/xajaxCall.inc.php create mode 100644 phpgwapi/inc/xajax/xajax_core/xajaxCompress.inc.php create mode 100644 phpgwapi/inc/xajax/xajax_core/xajaxControl.inc.php create mode 100644 phpgwapi/inc/xajax/xajax_core/xajaxLanguageManager.inc.php create mode 100644 phpgwapi/inc/xajax/xajax_core/xajaxPlugin.inc.php create mode 100644 phpgwapi/inc/xajax/xajax_core/xajaxPluginManager.inc.php create mode 100644 phpgwapi/inc/xajax/xajax_core/xajaxRequest.inc.php create mode 100644 phpgwapi/inc/xajax/xajax_core/xajaxResponse.inc.php create mode 100644 phpgwapi/inc/xajax/xajax_core/xajaxResponseManager.inc.php create mode 100644 phpgwapi/inc/xajax/xajax_core/xajax_lang_de.inc.php create mode 100644 phpgwapi/inc/xajax/xajax_core/xajax_lang_nl.inc.php create mode 100644 phpgwapi/inc/xajax/xajax_js/xajax_core.js create mode 100644 phpgwapi/inc/xajax/xajax_js/xajax_core_uncompressed.js create mode 100644 phpgwapi/inc/xajax/xajax_js/xajax_debug.js create mode 100644 phpgwapi/inc/xajax/xajax_js/xajax_debug_uncompressed.js create mode 100644 phpgwapi/inc/xajax/xajax_js/xajax_lang_bg.js create mode 100644 phpgwapi/inc/xajax/xajax_js/xajax_lang_bg_uncompressed.js create mode 100644 phpgwapi/inc/xajax/xajax_js/xajax_lang_de.js create mode 100644 phpgwapi/inc/xajax/xajax_js/xajax_lang_de_uncompressed.js create mode 100644 phpgwapi/inc/xajax/xajax_js/xajax_lang_es.js create mode 100644 phpgwapi/inc/xajax/xajax_js/xajax_lang_es_uncompressed.js create mode 100644 phpgwapi/inc/xajax/xajax_js/xajax_lang_fr.js create mode 100644 phpgwapi/inc/xajax/xajax_js/xajax_lang_fr_uncompressed.js create mode 100644 phpgwapi/inc/xajax/xajax_js/xajax_lang_nl.js create mode 100644 phpgwapi/inc/xajax/xajax_js/xajax_lang_nl_uncompressed.js create mode 100644 phpgwapi/inc/xajax/xajax_js/xajax_lang_tr.js create mode 100644 phpgwapi/inc/xajax/xajax_js/xajax_lang_tr_uncompressed.js create mode 100644 phpgwapi/inc/xajax/xajax_js/xajax_legacy.js create mode 100644 phpgwapi/inc/xajax/xajax_js/xajax_legacy_uncompressed.js create mode 100644 phpgwapi/inc/xajax/xajax_js/xajax_verbose.js create mode 100644 phpgwapi/inc/xajax/xajax_js/xajax_verbose_uncompressed.js diff --git a/phpgwapi/inc/xajax/copyright.inc.php b/phpgwapi/inc/xajax/copyright.inc.php new file mode 100644 index 0000000000..238b294fcc --- /dev/null +++ b/phpgwapi/inc/xajax/copyright.inc.php @@ -0,0 +1,54 @@ +setOutputEntities(true); } + function outputEntitiesOff() { $this->setOutputEntities(false); } + function addConfirmCommands() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'confirmCommands'), $temp); } + function addAssign() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'assign'), $temp); } + function addAppend() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'append'), $temp); } + function addPrepend() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'prepend'), $temp); } + function addReplace() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'replace'), $temp); } + function addClear() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'clear'), $temp); } + function addAlert() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'alert'), $temp); } + function addRedirect() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'redirect'), $temp); } + function addScript() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'script'), $temp); } + function addScriptCall() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'call'), $temp); } + function addRemove() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'remove'), $temp); } + function addCreate() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'create'), $temp); } + function addInsert() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'insert'), $temp); } + function addInsertAfter() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'insertAfter'), $temp); } + function addCreateInput() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'createInput'), $temp); } + function addInsertInput() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'insertInput'), $temp); } + function addInsertInputAfter() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'insertInputAfter'), $temp); } + function addRemoveHandler() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'removeHandler'), $temp); } + function addIncludeScript() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'includeScript'), $temp); } + function addIncludeCSS() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'includeCSS'), $temp); } + function &getXML() { return $this; } +} + +class legacyXajax extends xajax { + function legacyXajax($sRequestURI='', $sWrapperPrefix='xajax_', $sEncoding=XAJAX_DEFAULT_CHAR_ENCODING, $bDebug=false) + { + parent::xajax(); + $this->configure('requestURI', $sRequestURI); + $this->configure('wrapperPrefix', $sWrapperPrefix); + $this->configure('characterEncoding', $sEncoding); + $this->configure('debug', $bDebug); + } + function registerExternalFunction($mFunction, $sInclude) + { + $xuf =& new xajaxUserFunction($mFunction, $sInclude); + $this->register(XAJAX_FUNCTION, $xuf); + } + function registerCatchAllFunction($mFunction) + { + if (is_array($mFunction)) array_shift($mFunction); + $this->register(XAJAX_PROCESSING_EVENT, XAJAX_PROCESSING_EVENT_INVALID, $mFunction); + } + function registerPreFunction($mFunction) + { + if (is_array($mFunction)) array_shift($mFunction); + $this->register(XAJAX_PROCESSING_EVENT, XAJAX_PROCESSING_EVENT_BEFORE, $mFunction); + } + function canProcessRequests() { return $this->canProcessRequest(); } + function processRequests() { return $this->processRequest(); } + function setCallableObject(&$oObject) { return $this->register(XAJAX_CALLABLE_OBJECT, $oObject); } + function debugOn() { return $this->configure('debug',true); } + function debugOff() { return $this->configure('debug',false); } + function statusMessagesOn() { return $this->configure('statusMessages',true); } + function statusMessagesOff() { return $this->configure('statusMessages',false); } + function waitCursorOn() { return $this->configure('waitCursor',true); } + function waitCursorOff() { return $this->configure('waitCursor',false); } + function exitAllowedOn() { return $this->configure('exitAllowed',true); } + function exitAllowedOff() { return $this->configure('exitAllowed',false); } + function errorHandlerOn() { return $this->configure('errorHandler',true); } + function errorHandlerOff() { return $this->configure('errorHandler',false); } + function cleanBufferOn() { return $this->configure('cleanBuffer',true); } + function cleanBufferOff() { return $this->configure('cleanBuffer',false); } + function decodeUTF8InputOn() { return $this->configure('decodeUTF8Input',true); } + function decodeUTF8InputOff() { return $this->configure('decodeUTF8Input',false); } + function outputEntitiesOn() { return $this->configure('outputEntities',true); } + function outputEntitiesOff() { return $this->configure('outputEntities',false); } + function allowBlankResponseOn() { return $this->configure('allowBlankResponse',true); } + function allowBlankResponseOff() { return $this->configure('allowBlankResponse',false); } +} diff --git a/phpgwapi/inc/xajax/xajax_core/plugin_layer/support/xajaxCallableObject.inc.php b/phpgwapi/inc/xajax/xajax_core/plugin_layer/support/xajaxCallableObject.inc.php new file mode 100644 index 0000000000..25a6f1f22d --- /dev/null +++ b/phpgwapi/inc/xajax/xajax_core/plugin_layer/support/xajaxCallableObject.inc.php @@ -0,0 +1,228 @@ + for a detailed description, copyright + and license information. +*/ + +/* + @package xajax + @version $Id: xajaxCallableObject.inc.php 362 2007-05-29 15:32:24Z calltoconstruct $ + @copyright Copyright (c) 2005-2007 by Jared White & J. Max Wilson + @copyright Copyright (c) 2008-2009 by Joseph Woolley, Steffen Konerow, Jared White & J. Max Wilson + @license http://www.xajaxproject.org/bsd_license.txt BSD License +*/ + +/* + Class: xajaxCallableObject + + A class that stores a reference to an object whose methods can be called from + the client via a xajax request. will call + generateClientScript> so that stub functions can be + generated and sent to the browser. +*/ +class xajaxCallableObject +{ + /* + Object: obj + + A reference to the callable object. + */ + var $obj; + + /* + Array: aConfiguration + + An associative array that will contain configuration options for zero + or more of the objects methods. These configuration options will + define the call options for each request. The call options will be + passed to the client browser when the function stubs are generated. + */ + var $aConfiguration; + + /* + Function: xajaxCallableObject + + Constructs and initializes the + + obj - (object): The object to reference. + */ + function xajaxCallableObject(&$obj) + { + $this->obj =& $obj; + $this->aConfiguration = array(); + } + + /* + Function: getName + + Returns the name of this callable object. This is typically the + class name of the object. + */ + function getName() + { + return get_class($this->obj); + } + + /* + Function: configure + + Used to set configuration options / call options for each method. + + sMethod - (string): The name of the method. + sName - (string): The name of the configuration option. + sValue - (string): The value to be set. + */ + function configure($sMethod, $sName, $sValue) + { + $sMethod = strtolower($sMethod); + + if (false == isset($this->aConfiguration[$sMethod])) + $this->aConfiguration[$sMethod] = array(); + + $this->aConfiguration[$sMethod][$sName] = $sValue; + } + + /* + Function: generateRequests + + Produces an array of objects, one for each method + exposed by this callable object. + + sXajaxPrefix - (string): The prefix to be prepended to the + javascript function names; this will correspond to the name + used for the function stubs that are generated by the + generateClientScript> call. + */ + function generateRequests($sXajaxPrefix) + { + $aRequests = array(); + + $sClass = get_class($this->obj); + + foreach (get_class_methods($this->obj) as $sMethodName) + { + $bInclude = true; + // exclude magic __call method + if ("__call" == $sMethodName) + $bInclude = false; + // exclude constructor + if ($sClass == $sMethodName) + $bInclude = false; + if ($bInclude) + $aRequests[strtolower($sMethodName)] =& + new xajaxRequest("{$sXajaxPrefix}{$sClass}.{$sMethodName}"); + } + + return $aRequests; + } + + /* + Function: generateClientScript + + Called by generateClientScript> while is + generating the javascript to be sent to the browser. + + sXajaxPrefix - (string): The prefix to be prepended to the + javascript function names. + */ + function generateClientScript($sXajaxPrefix) + { + $sClass = get_class($this->obj); + + echo "{$sXajaxPrefix}{$sClass} = {};\n"; + + foreach (get_class_methods($this->obj) as $sMethodName) + { + $bInclude = true; + // exclude magic __call, __construct, __destruct methods + if (2 < strlen($sMethodName)) + if ("__" == substr($sMethodName, 0, 2)) + $bInclude = false; + // exclude constructor + if ($sClass == $sMethodName) + $bInclude = false; + if ($bInclude) + { + echo "{$sXajaxPrefix}{$sClass}.{$sMethodName} = function() { "; + echo "return xajax.request( "; + echo "{ xjxcls: '{$sClass}', xjxmthd: '{$sMethodName}' }, "; + echo "{ parameters: arguments"; + + $sSeparator = ", "; + if (isset($this->aConfiguration['*'])) + foreach ($this->aConfiguration['*'] as $sKey => $sValue) + echo "{$sSeparator}{$sKey}: {$sValue}"; + if (isset($this->aConfiguration[strtolower($sMethodName)])) + foreach ($this->aConfiguration[strtolower($sMethodName)] as $sKey => $sValue) + echo "{$sSeparator}{$sKey}: {$sValue}"; + + echo " } ); "; + echo "};\n"; + } + } + } + + /* + Function: isClass + + Determins if the specified class name matches the class name of the + object referenced by obj>. + + sClass - (string): The name of the class to check. + + Returns: + + boolean - True of the specified class name matches the class of + the object being referenced; false otherwise. + */ + function isClass($sClass) + { + if(get_class($this->obj) === $sClass) + return true; + return false; + } + + /* + Function: hasMethod + + Determines if the specified method name is one of the methods of the + object referenced by obj>. + + sMethod - (object): The name of the method to check. + + Returns: + + boolean - True of the referenced object contains the specified method, + false otherwise. + */ + function hasMethod($sMethod) + { + return method_exists($this->obj, $sMethod) || method_exists($this->obj, "__call"); + } + + /* + Function: call + + Call the specified method of the object being referenced using the specified + array of arguments. + + sMethod - (string): The name of the method to call. + aArgs - (array): The arguments to pass to the method. + */ + function call($sMethod, $aArgs) + { + $objResponseManager =& xajaxResponseManager::getInstance(); + $objResponseManager->append( + call_user_func_array( + array(&$this->obj, $sMethod), + $aArgs + ) + ); + } +} diff --git a/phpgwapi/inc/xajax/xajax_core/plugin_layer/support/xajaxEvent.inc.php b/phpgwapi/inc/xajax/xajax_core/plugin_layer/support/xajaxEvent.inc.php new file mode 100644 index 0000000000..cfe1ee06c7 --- /dev/null +++ b/phpgwapi/inc/xajax/xajax_core/plugin_layer/support/xajaxEvent.inc.php @@ -0,0 +1,162 @@ + for a detailed description, copyright + and license information. +*/ + +/* + @package xajax + @version $Id: xajaxEvent.inc.php 362 2007-05-29 15:32:24Z calltoconstruct $ + @copyright Copyright (c) 2005-2007 by Jared White & J. Max Wilson + @copyright Copyright (c) 2008-2009 by Joseph Woolley, Steffen Konerow, Jared White & J. Max Wilson + @license http://www.xajaxproject.org/bsd_license.txt BSD License +*/ + +// require_once is necessary here as the function plugin also includes this +//SkipAIO +require_once dirname(__FILE__) . '/xajaxUserFunction.inc.php'; +//EndSkipAIO + +/* + Class: xajaxEvent + + A container class which holds a reference to handler functions and configuration + options associated with a registered event. +*/ +class xajaxEvent +{ + /* + String: sName + + The name of the event. + */ + var $sName; + + /* + Array: aConfiguration + + Configuration / call options to be used when initiating a xajax request + to trigger this event. + */ + var $aConfiguration; + + /* + Array: aHandlers + + A list of objects associated with this registered + event. Each of these functions will be called when the event is triggered. + */ + var $aHandlers; + + /* + Function: xajaxEvent + + Construct and initialize this object. + */ + function xajaxEvent($sName) + { + $this->sName = $sName; + $this->aConfiguration = array(); + $this->aHandlers = array(); + } + + /* + Function: getName + + Returns the name of the event. + + Returns: + + string - the name of the event. + */ + function getName() + { + return $this->sName; + } + + /* + Function: configure + + Sets/stores configuration options that will be used when generating + the client script that is sent to the browser. + */ + function configure($sName, $mValue) + { + $this->aConfiguration[$sName] = $mValue; + } + + /* + Function: addHandler + + Adds a object to the list of handlers that will + be fired when the event is triggered. + */ + function addHandler(&$xuf) + { + $this->aHandlers[] =& $xuf; + } + + /* + Function: generateRequest + + Generates a object that corresponds to the + event so that the client script can easily invoke this event. + + sXajaxPrefix - (string): The prefix that will be prepended to + the client script stub function associated with this event. + + sEventPrefix - (string): The prefix prepended to the client script + function stub and script. + */ + function generateRequest($sXajaxPrefix, $sEventPrefix) + { + $sEvent = $this->sName; + return new xajaxRequest("{$sXajaxPrefix}{$sEventPrefix}{$sEvent}"); + } + + /* + Function: generateClientScript + + Generates a block of javascript code that declares a stub function + that can be used to easily trigger the event from the browser. + */ + function generateClientScript($sXajaxPrefix, $sEventPrefix) + { + $sMode = ''; + $sMethod = ''; + + if (isset($this->aConfiguration['mode'])) + $sMode = $this->aConfiguration['mode']; + + if (isset($this->aConfiguration['method'])) + $sMethod = $this->aConfiguration['method']; + + if (0 < strlen($sMode)) + $sMode = ", mode: '{$sMode}'"; + + if (0 < strlen($sMethod)) + $sMethod = ", method: '{$sMethod}'"; + + $sEvent = $this->sName; + echo "{$sXajaxPrefix}{$sEventPrefix}{$sEvent} = function() { return xajax.request( { xjxevt: '{$sEvent}' }, { parameters: arguments{$sMode}{$sMethod} } ); };\n"; + } + + /* + Function: fire + + Called by the when the event has been triggered. + */ + function fire($aArgs) + { + $objResponseManager =& xajaxResponseManager::getInstance(); + + foreach (array_keys($this->aHandlers) as $sKey) + $this->aHandlers[$sKey]->call($aArgs); + } +} diff --git a/phpgwapi/inc/xajax/xajax_core/plugin_layer/support/xajaxUserFunction.inc.php b/phpgwapi/inc/xajax/xajax_core/plugin_layer/support/xajaxUserFunction.inc.php new file mode 100644 index 0000000000..72d073e719 --- /dev/null +++ b/phpgwapi/inc/xajax/xajax_core/plugin_layer/support/xajaxUserFunction.inc.php @@ -0,0 +1,233 @@ + for a detailed description, copyright + and license information. +*/ + +/* + @package xajax + @version $Id: xajaxUserFunction.inc.php 362 2007-05-29 15:32:24Z calltoconstruct $ + @copyright Copyright (c) 2005-2007 by Jared White & J. Max Wilson + @copyright Copyright (c) 2008-2009 by Joseph Woolley, Steffen Konerow, Jared White & J. Max Wilson + @license http://www.xajaxproject.org/bsd_license.txt BSD License +*/ + +/* + Class: xajaxUserFunction + + Construct instances of this class to define functions that will be registered + with the request processor. This class defines the parameters that + are needed for the definition of a xajax enabled function. While you can + still specify functions by name during registration, it is advised that you + convert to using this class when you wish to register external functions or + to specify call options as well. +*/ +class xajaxUserFunction +{ + /* + String: sAlias + + An alias to use for this function. This is useful when you want + to call the same xajax enabled function with a different set of + call options from what was already registered. + */ + var $sAlias; + + /* + Object: uf + + A string or array which defines the function to be registered. + */ + var $uf; + + /* + String: sInclude + + The path and file name of the include file that contains the function. + */ + var $sInclude; + + /* + Array: aConfiguration + + An associative array containing call options that will be sent to the + browser curing client script generation. + */ + var $aConfiguration; + + /* + Function: xajaxUserFunction + + Constructs and initializes the object. + + $uf - (mixed): A function specification in one of the following formats: + + - a three element array: + (string) Alternate function name: when a method of a class has the same + name as another function in the system, you can provide an alias to + help avoid collisions. + (object or class name) Class: the name of the class or an instance of + the object which contains the function to be called. + (string) Method: the name of the method that will be called. + - a two element array: + (object or class name) Class: the name of the class or an instance of + the object which contains the function to be called. + (string) Method: the name of the method that will be called. + - a string: + the name of the function that is available at global scope (not in a + class. + $sInclude - (string, optional): The path and file name of the include file + that contains the class or function to be called. + + $aConfiguration - (array, optional): An associative array of call options + that will be used when sending the request from the client. + + Examples: + + $myFunction = array('alias', 'myClass', 'myMethod'); + $myFunction = array('alias', &$myObject, 'myMethod'); + $myFunction = array('myClass', 'myMethod'); + $myFunction = array(&$myObject, 'myMethod'); + $myFunction = 'myFunction'; + + $myUserFunction = new xajaxUserFunction($myFunction, 'myFile.inc.php', array( + 'method' => 'get', + 'mode' => 'synchronous' + )); + + $xajax->register(XAJAX_FUNCTION, $myUserFunction); + */ + function xajaxUserFunction($uf, $sInclude=NULL, $aConfiguration=array()) + { + $this->sAlias = ''; + $this->uf =& $uf; + $this->sInclude = $sInclude; + $this->aConfiguration = array(); + foreach ($aConfiguration as $sKey => $sValue) + $this->configure($sKey, $sValue); + + if (is_array($this->uf) && 2 < count($this->uf)) + { + $this->sAlias = $this->uf[0]; + $this->uf = array_slice($this->uf, 1); + } + +//SkipDebug + if (is_array($this->uf) && 2 != count($this->uf)) + trigger_error( + 'Invalid function declaration for xajaxUserFunction.', + E_USER_ERROR + ); +//EndSkipDebug + } + + /* + Function: getName + + Get the name of the function being referenced. + + Returns: + + string - the name of the function contained within this object. + */ + function getName() + { + // Do not use sAlias here! + if (is_array($this->uf)) + return $this->uf[1]; + return $this->uf; + } + + /* + Function: configure + + Call this to set call options for this instance. + */ + function configure($sName, $sValue) + { + if ('alias' == $sName) + $this->sAlias = $sValue; + else + $this->aConfiguration[$sName] = $sValue; + } + + /* + Function: generateRequest + + Constructs and returns a object which is capable + of generating the javascript call to invoke this xajax enabled + function. + */ + function generateRequest($sXajaxPrefix) + { + $sAlias = $this->getName(); + if (0 < strlen($this->sAlias)) + $sAlias = $this->sAlias; + return new xajaxRequest("{$sXajaxPrefix}{$sAlias}"); + } + + /* + Function: generateClientScript + + Called by the that is referencing this function + reference during the client script generation phase. This function + will generate the javascript function stub that is sent to the + browser on initial page load. + */ + function generateClientScript($sXajaxPrefix) + { + $sFunction = $this->getName(); + $sAlias = $sFunction; + if (0 < strlen($this->sAlias)) + $sAlias = $this->sAlias; + echo "{$sXajaxPrefix}{$sAlias} = function() { "; + echo "return xajax.request( "; + echo "{ xjxfun: '{$sFunction}' }, "; + echo "{ parameters: arguments"; + + $sSeparator = ", "; + foreach ($this->aConfiguration as $sKey => $sValue) + echo "{$sSeparator}{$sKey}: {$sValue}"; + + echo " } ); "; + echo "};\n"; + } + + /* + Function: call + + Called by the that references this function during the + request processing phase. This function will call the specified + function, including an external file if needed and passing along + the specified arguments. + */ + function call($aArgs=array()) + { + $objResponseManager =& xajaxResponseManager::getInstance(); + + if (NULL != $this->sInclude) + { + ob_start(); + require_once $this->sInclude; + $sOutput = ob_get_clean(); + +//SkipDebug + if (0 < strlen($sOutput)) + { + $sOutput = 'From include file: ' . $this->sInclude . ' => ' . $sOutput; + $objResponseManager->debug($sOutput); + } +//EndSkipDebug + } + + $mFunction = $this->uf; + $objResponseManager->append(call_user_func_array($mFunction, $aArgs)); + } +} +?> diff --git a/phpgwapi/inc/xajax/xajax_core/plugin_layer/xajaxCallableObjectPlugin.inc.php b/phpgwapi/inc/xajax/xajax_core/plugin_layer/xajaxCallableObjectPlugin.inc.php new file mode 100644 index 0000000000..4b67fb50b7 --- /dev/null +++ b/phpgwapi/inc/xajax/xajax_core/plugin_layer/xajaxCallableObjectPlugin.inc.php @@ -0,0 +1,219 @@ + for a detailed description, copyright + and license information. +*/ + +/* + @package xajax + @version $Id: xajaxCallableObjectPlugin.inc.php 362 2007-05-29 15:32:24Z calltoconstruct $ + @copyright Copyright (c) 2005-2007 by Jared White & J. Max Wilson + @copyright Copyright (c) 2008-2009 by Joseph Woolley, Steffen Konerow, Jared White & J. Max Wilson + @license http://www.xajaxproject.org/bsd_license.txt BSD License +*/ + +/* + Constant: XAJAX_CALLABLE_OBJECT + Specifies that the item being registered via the register> function is a + object who's methods will be callable from the browser. +*/ +if (!defined ('XAJAX_CALLABLE_OBJECT')) define ('XAJAX_CALLABLE_OBJECT', 'callable object'); + +//SkipAIO +require dirname(__FILE__) . '/support/xajaxCallableObject.inc.php'; +//EndSkipAIO + +/* + Class: xajaxCallableObjectPlugin +*/ +class xajaxCallableObjectPlugin extends xajaxRequestPlugin +{ + /* + Array: aCallableObjects + */ + var $aCallableObjects; + + /* + String: sXajaxPrefix + */ + var $sXajaxPrefix; + + /* + String: sDefer + */ + var $sDefer; + + var $bDeferScriptGeneration; + + /* + String: sRequestedClass + */ + var $sRequestedClass; + + /* + String: sRequestedMethod + */ + var $sRequestedMethod; + + /* + Function: xajaxCallableObjectPlugin + */ + function xajaxCallableObjectPlugin() + { + $this->aCallableObjects = array(); + + $this->sXajaxPrefix = 'xajax_'; + $this->sDefer = ''; + $this->bDeferScriptGeneration = false; + + $this->sRequestedClass = NULL; + $this->sRequestedMethod = NULL; + + if (!empty($_GET['xjxcls'])) $this->sRequestedClass = $_GET['xjxcls']; + if (!empty($_GET['xjxmthd'])) $this->sRequestedMethod = $_GET['xjxmthd']; + if (!empty($_POST['xjxcls'])) $this->sRequestedClass = $_POST['xjxcls']; + if (!empty($_POST['xjxmthd'])) $this->sRequestedMethod = $_POST['xjxmthd']; + } + + /* + Function: configure + */ + function configure($sName, $mValue) + { + if ('wrapperPrefix' == $sName) { + $this->sXajaxPrefix = $mValue; + } else if ('scriptDefferal' == $sName) { + if (true === $mValue) $this->sDefer = 'defer '; + else $this->sDefer = ''; + } else if ('deferScriptGeneration' == $sName) { + if (true === $mValue || false === $mValue) + $this->bDeferScriptGeneration = $mValue; + else if ('deferred' === $mValue) + $this->bDeferScriptGeneration = $mValue; + } + } + + /* + Function: register + */ + function register($aArgs) + { + if (1 < count($aArgs)) + { + $sType = $aArgs[0]; + + if (XAJAX_CALLABLE_OBJECT == $sType) + { + $xco =& $aArgs[1]; + +//SkipDebug + if (false === is_object($xco)) + { + trigger_error("To register a callable object, please provide an instance of the desired class.", E_USER_WARNING); + return false; + } +//EndSkipDebug + + if (false === is_a($xco, 'xajaxCallableObject')) + $xco =& new xajaxCallableObject($xco); + + if (2 < count($aArgs)) + if (is_array($aArgs[2])) + foreach ($aArgs[2] as $sKey => $aValue) + foreach ($aValue as $sName => $sValue) + $xco->configure($sKey, $sName, $sValue); + + $this->aCallableObjects[] =& $xco; + + return $xco->generateRequests($this->sXajaxPrefix); + } + } + + return false; + } + + /* + Function: generateClientScript + */ + function generateClientScript() + { + if (false === $this->bDeferScriptGeneration || 'deferred' === $this->bDeferScriptGeneration) + { + if (0 < count($this->aCallableObjects)) + { + $sCrLf = "\n"; + + echo $sCrLf; + echo '<'; + echo 'script type="text/javascript" '; + echo $this->sDefer; + echo 'charset="UTF-8">'; + echo $sCrLf; + echo '/* <'; + echo '![CDATA[ */'; + echo $sCrLf; + + foreach(array_keys($this->aCallableObjects) as $sKey) + $this->aCallableObjects[$sKey]->generateClientScript($this->sXajaxPrefix); + + echo '/* ]]> */'; + echo $sCrLf; + echo '<'; + echo '/script>'; + echo $sCrLf; + } + } + } + + /* + Function: canProcessRequest + */ + function canProcessRequest() + { + if (NULL == $this->sRequestedClass) + return false; + if (NULL == $this->sRequestedMethod) + return false; + + return true; + } + + /* + Function: processRequest + */ + function processRequest() + { + if (NULL == $this->sRequestedClass) + return false; + if (NULL == $this->sRequestedMethod) + return false; + + $objArgumentManager =& xajaxArgumentManager::getInstance(); + $aArgs = $objArgumentManager->process(); + + foreach (array_keys($this->aCallableObjects) as $sKey) + { + $xco =& $this->aCallableObjects[$sKey]; + + if ($xco->isClass($this->sRequestedClass)) + { + if ($xco->hasMethod($this->sRequestedMethod)) + { + $xco->call($this->sRequestedMethod, $aArgs); + return true; + } + } + } + + return 'Invalid request for a callable object.'; + } +} + +$objPluginManager =& xajaxPluginManager::getInstance(); +$objPluginManager->registerPlugin(new xajaxCallableObjectPlugin(), 102); diff --git a/phpgwapi/inc/xajax/xajax_core/plugin_layer/xajaxDefaultIncludePlugin.inc.php b/phpgwapi/inc/xajax/xajax_core/plugin_layer/xajaxDefaultIncludePlugin.inc.php new file mode 100644 index 0000000000..361521d5e9 --- /dev/null +++ b/phpgwapi/inc/xajax/xajax_core/plugin_layer/xajaxDefaultIncludePlugin.inc.php @@ -0,0 +1,352 @@ + for a detailed description, copyright + and license information. +*/ + +/* + @package xajax + @version $Id: xajaxDefaultIncludePlugin.inc.php 362 2007-05-29 15:32:24Z calltoconstruct $ + @copyright Copyright (c) 2005-2007 by Jared White & J. Max Wilson + @copyright Copyright (c) 2008-2009 by Joseph Woolley, Steffen Konerow, Jared White & J. Max Wilson + @license http://www.xajaxproject.org/bsd_license.txt BSD License +*/ + +/* + Class: xajaxIncludeClientScript + + Generates the SCRIPT tags necessary to 'include' the xajax javascript + library on the browser. + + This is called when the page is first loaded. +*/ +class xajaxIncludeClientScriptPlugin extends xajaxRequestPlugin +{ + var $sJsURI; + var $aJsFiles; + var $sDefer; + var $sRequestURI; + var $sStatusMessages; + var $sWaitCursor; + var $sVersion; + var $sDefaultMode; + var $sDefaultMethod; + var $bDebug; + var $bVerboseDebug; + var $nScriptLoadTimeout; + var $bUseUncompressedScripts; + var $bDeferScriptGeneration; + var $sLanguage; + var $nResponseQueueSize; + + function xajaxIncludeClientScriptPlugin() + { + $this->sJsURI = ''; + $this->aJsFiles = array(); + $this->sDefer = ''; + $this->sRequestURI = ''; + $this->sStatusMessages = 'false'; + $this->sWaitCursor = 'true'; + $this->sVersion = 'unknown'; + $this->sDefaultMode = 'asynchronous'; + $this->sDefaultMethod = 'POST'; // W3C: Method is case sensitive + $this->bDebug = false; + $this->bVerboseDebug = false; + $this->nScriptLoadTimeout = 2000; + $this->bUseUncompressedScripts = false; + $this->bDeferScriptGeneration = false; + $this->sLanguage = null; + $this->nResponseQueueSize = null; + } + + /* + Function: configure + */ + function configure($sName, $mValue) + { + if ('javascript URI' == $sName) { + $this->sJsURI = $mValue; + } else if ("javascript files" == $sName) { + $this->aJsFiles = $mValue; + } else if ("scriptDefferal" == $sName) { + if (true === $mValue) $this->sDefer = "defer "; + else $this->sDefer = ""; + } else if ("requestURI" == $sName) { + $this->sRequestURI = $mValue; + } else if ("statusMessages" == $sName) { + if (true === $mValue) $this->sStatusMessages = "true"; + else $this->sStatusMessages = "false"; + } else if ("waitCursor" == $sName) { + if (true === $mValue) $this->sWaitCursor = "true"; + else $this->sWaitCursor = "false"; + } else if ("version" == $sName) { + $this->sVersion = $mValue; + } else if ("defaultMode" == $sName) { + if ("asynchronous" == $mValue || "synchronous" == $mValue) + $this->sDefaultMode = $mValue; + } else if ("defaultMethod" == $sName) { + if ("POST" == $mValue || "GET" == $mValue) // W3C: Method is case sensitive + $this->sDefaultMethod = $mValue; + } else if ("debug" == $sName) { + if (true === $mValue || false === $mValue) + $this->bDebug = $mValue; + } else if ("verboseDebug" == $sName) { + if (true === $mValue || false === $mValue) + $this->bVerboseDebug = $mValue; + } else if ("scriptLoadTimeout" == $sName) { + $this->nScriptLoadTimeout = $mValue; + } else if ("useUncompressedScripts" == $sName) { + if (true === $mValue || false === $mValue) + $this->bUseUncompressedScripts = $mValue; + } else if ('deferScriptGeneration' == $sName) { + if (true === $mValue || false === $mValue) + $this->bDeferScriptGeneration = $mValue; + else if ('deferred' == $mValue) + $this->bDeferScriptGeneration = $mValue; + } else if ('language' == $sName) { + $this->sLanguage = $mValue; + } else if ('responseQueueSize' == $sName) { + $this->nResponseQueueSize = $mValue; + } + } + + /* + Function: generateClientScript + */ + function generateClientScript() + { + if (false === $this->bDeferScriptGeneration) + { + $this->printJavascriptConfig(); + $this->printJavascriptInclude(); + } + else if (true === $this->bDeferScriptGeneration) + { + $this->printJavascriptInclude(); + } + else if ('deferred' == $this->bDeferScriptGeneration) + { + $this->printJavascriptConfig(); + } + } + + /* + Function: getJavascriptConfig + + Generates the xajax settings that will be used by the xajax javascript + library when making requests back to the server. + + Returns: + + string - The javascript code necessary to configure the settings on + the browser. + */ + function getJavascriptConfig() + { + ob_start(); + $this->printJavascriptConfig(); + return ob_get_clean(); + } + + /* + Function: printJavascriptConfig + + See + */ + function printJavascriptConfig() + { + $sCrLf = "\n"; + + echo $sCrLf; + echo '<'; + echo 'script type="text/javascript" '; + echo $this->sDefer; + echo 'charset="UTF-8">'; + echo $sCrLf; + echo '/* <'; + echo '![CDATA[ */'; + echo $sCrLf; + echo 'try { if (undefined == xajax.config) xajax.config = {}; } catch (e) { xajax = {}; xajax.config = {}; };'; + echo $sCrLf; + echo 'xajax.config.requestURI = "'; + echo $this->sRequestURI; + echo '";'; + echo $sCrLf; + echo 'xajax.config.statusMessages = '; + echo $this->sStatusMessages; + echo ';'; + echo $sCrLf; + echo 'xajax.config.waitCursor = '; + echo $this->sWaitCursor; + echo ';'; + echo $sCrLf; + echo 'xajax.config.version = "'; + echo $this->sVersion; + echo '";'; + echo $sCrLf; + echo 'xajax.config.legacy = false;'; + echo $sCrLf; + echo 'xajax.config.defaultMode = "'; + echo $this->sDefaultMode; + echo '";'; + echo $sCrLf; + echo 'xajax.config.defaultMethod = "'; + echo $this->sDefaultMethod; + echo '";'; + + if (false === (null === $this->nResponseQueueSize)) + { + echo $sCrLf; + echo 'xajax.config.responseQueueSize = '; + echo $this->nResponseQueueSize; + echo ';'; + } + + echo $sCrLf; + echo '/* ]]> */'; + echo $sCrLf; + echo '<'; + echo '/script>'; + echo $sCrLf; + } + + /* + Function: getJavascriptInclude + + Generates SCRIPT tags necessary to load the javascript libraries on + the browser. + + sJsURI - (string): The relative or fully qualified PATH that will be + used to compose the URI to the specified javascript files. + aJsFiles - (array): List of javascript files to include. + + Returns: + + string - The SCRIPT tags that will cause the browser to load the + specified files. + */ + function getJavascriptInclude() + { + ob_start(); + $this->printJavascriptInclude(); + return ob_get_clean(); + } + + /* + Function: printJavascriptInclude + + See + */ + function printJavascriptInclude() + { + $aJsFiles = $this->aJsFiles; + $sJsURI = $this->sJsURI; + + if (0 == count($aJsFiles)) { + $aJsFiles[] = array($this->_getScriptFilename('xajax_js/xajax_core.js'), 'xajax'); + + if (true === $this->bDebug) + $aJsFiles[] = array($this->_getScriptFilename('xajax_js/xajax_debug.js'), 'xajax.debug'); + + if (true === $this->bVerboseDebug) + $aJsFiles[] = array($this->_getScriptFilename('xajax_js/xajax_verbose.js'), 'xajax.debug.verbose'); + + if (null !== $this->sLanguage) + $aJsFiles[] = array($this->_getScriptFilename('xajax_js/xajax_lang_' . $this->sLanguage . '.js'), 'xajax'); + } + + if ($sJsURI != '' && substr($sJsURI, -1) != '/') + $sJsURI .= '/'; + + $sCrLf = "\n"; + + foreach ($aJsFiles as $aJsFile) { + echo '<'; + echo 'script type="text/javascript" src="'; + echo $sJsURI; + echo $aJsFile[0]; + echo '" '; + echo $this->sDefer; + echo 'charset="UTF-8"><'; + echo '/script>'; + echo $sCrLf; + } + + if (0 < $this->nScriptLoadTimeout) { + foreach ($aJsFiles as $aJsFile) { + echo '<'; + echo 'script type="text/javascript" '; + echo $this->sDefer; + echo 'charset="UTF-8">'; + echo $sCrLf; + echo '/* <'; + echo '![CDATA[ */'; + echo $sCrLf; + echo 'window.setTimeout('; + echo $sCrLf; + echo ' function() {'; + echo $sCrLf; + echo ' var scriptExists = false;'; + echo $sCrLf; + echo ' try { if ('; + echo $aJsFile[1]; + echo '.isLoaded) scriptExists = true; }'; + echo $sCrLf; + echo ' catch (e) {}'; + echo $sCrLf; + echo ' if (!scriptExists) {'; + echo $sCrLf; + echo ' alert("Error: the '; + echo $aJsFile[1]; + echo ' Javascript component could not be included. Perhaps the URL is incorrect?\nURL: '; + echo $sJsURI; + echo $aJsFile[0]; + echo '");'; + echo $sCrLf; + echo ' }'; + echo $sCrLf; + echo ' }, '; + echo $this->nScriptLoadTimeout; + echo ');'; + echo $sCrLf; + echo '/* ]]> */'; + echo $sCrLf; + echo '<'; + echo '/script>'; + echo $sCrLf; + } + } + } + + /* + Function: _getScriptFilename + + Returns the name of the script file, based on the current settings. + + sFilename - (string): The base filename. + + Returns: + + string - The filename as it should be specified in the script tags + on the browser. + */ + function _getScriptFilename($sFilename) + { + if ($this->bUseUncompressedScripts) { + return str_replace('.js', '_uncompressed.js', $sFilename); + } + return $sFilename; + } +} + +/* + Register the xajaxIncludeClientScriptPlugin object with the xajaxPluginManager. +*/ +$objPluginManager =& xajaxPluginManager::getInstance(); +$objPluginManager->registerPlugin(new xajaxIncludeClientScriptPlugin(), 99); diff --git a/phpgwapi/inc/xajax/xajax_core/plugin_layer/xajaxEventPlugin.inc.php b/phpgwapi/inc/xajax/xajax_core/plugin_layer/xajaxEventPlugin.inc.php new file mode 100644 index 0000000000..3347b61204 --- /dev/null +++ b/phpgwapi/inc/xajax/xajax_core/plugin_layer/xajaxEventPlugin.inc.php @@ -0,0 +1,229 @@ + for a detailed description, copyright + and license information. +*/ + +/* + @package xajax + @version $Id: xajaxEventPlugin.inc.php 362 2007-05-29 15:32:24Z calltoconstruct $ + @copyright Copyright (c) 2005-2007 by Jared White & J. Max Wilson + @copyright Copyright (c) 2008-2009 by Joseph Woolley, Steffen Konerow, Jared White & J. Max Wilson + @license http://www.xajaxproject.org/bsd_license.txt BSD License +*/ + +/* + Constant: XAJAX_EVENT + Specifies that the item being registered via the register> function + is an event. + + Constant: XAJAX_EVENT_HANDLER + Specifies that the item being registered via the register> function + is an event handler. +*/ +if (!defined ('XAJAX_EVENT')) define ('XAJAX_EVENT', 'xajax event'); +if (!defined ('XAJAX_EVENT_HANDLER')) define ('XAJAX_EVENT_HANDLER', 'xajax event handler'); + +//SkipAIO +require dirname(__FILE__) . '/support/xajaxEvent.inc.php'; +//EndSkipAIO + +/* + Class: xajaxEventPlugin + + Plugin that adds server side event handling capabilities to xajax. Events can + be registered, then event handlers attached. +*/ +class xajaxEventPlugin extends xajaxRequestPlugin +{ + /* + Array: aEvents + */ + var $aEvents; + + /* + String: sXajaxPrefix + */ + var $sXajaxPrefix; + + /* + String: sEventPrefix + */ + var $sEventPrefix; + + /* + String: sDefer + */ + var $sDefer; + + var $bDeferScriptGeneration; + + /* + String: sRequestedEvent + */ + var $sRequestedEvent; + + /* + Function: xajaxEventPlugin + */ + function xajaxEventPlugin() + { + $this->aEvents = array(); + + $this->sXajaxPrefix = 'xajax_'; + $this->sEventPrefix = 'event_'; + $this->sDefer = ''; + $this->bDeferScriptGeneration = false; + + $this->sRequestedEvent = NULL; + + if (isset($_GET['xjxevt'])) $this->sRequestedEvent = $_GET['xjxevt']; + if (isset($_POST['xjxevt'])) $this->sRequestedEvent = $_POST['xjxevt']; + } + + /* + Function: configure + */ + function configure($sName, $mValue) + { + if ('wrapperPrefix' == $sName) { + $this->sXajaxPrefix = $mValue; + } else if ('eventPrefix' == $sName) { + $this->sEventPrefix = $mValue; + } else if ('scriptDefferal' == $sName) { + if (true === $mValue) $this->sDefer = 'defer '; + else $this->sDefer = ''; + } else if ('deferScriptGeneration' == $sName) { + if (true === $mValue || false === $mValue) + $this->bDeferScriptGeneration = $mValue; + else if ('deferred' === $mValue) + $this->bDeferScriptGeneration = $mValue; + } + } + + /* + Function: register + + $sType - (string): type of item being registered + $sEvent - (string): the name of the event + $ufHandler - (function name or reference): a reference to the user function to call + $aConfiguration - (array): an array containing configuration options + */ + function register($aArgs) + { + if (1 < count($aArgs)) + { + $sType = $aArgs[0]; + + if (XAJAX_EVENT == $sType) + { + $sEvent = $aArgs[1]; + + if (false === isset($this->aEvents[$sEvent])) + { + $xe =& new xajaxEvent($sEvent); + + if (2 < count($aArgs)) + if (is_array($aArgs[2])) + foreach ($aArgs[2] as $sKey => $sValue) + $xe->configure($sKey, $sValue); + + $this->aEvents[$sEvent] =& $xe; + + return $xe->generateRequest($this->sXajaxPrefix, $this->sEventPrefix); + } + } + + if (XAJAX_EVENT_HANDLER == $sType) + { + $sEvent = $aArgs[1]; + + if (isset($this->aEvents[$sEvent])) + { + if (isset($aArgs[2])) + { + $xuf =& $aArgs[2]; + + if (false === is_a($xuf, 'xajaxUserFunction')) + $xuf =& new xajaxUserFunction($xuf); + + $objEvent =& $this->aEvents[$sEvent]; + $objEvent->addHandler($xuf); + + return true; + } + } + } + } + + return false; + } + + /* + Function: generateClientScript + */ + function generateClientScript() + { + if (false === $this->bDeferScriptGeneration || 'deferred' === $this->bDeferScriptGeneration) + { + if (0 < count($this->aEvents)) + { + echo "\n\n"; + } + } + } + + /* + Function: canProcessRequest + */ + function canProcessRequest() + { + if (NULL == $this->sRequestedEvent) + return false; + + return true; + } + + /* + Function: processRequest + */ + function processRequest() + { + if (NULL == $this->sRequestedEvent) + return false; + + $objArgumentManager =& xajaxArgumentManager::getInstance(); + $aArgs = $objArgumentManager->process(); + + foreach (array_keys($this->aEvents) as $sKey) + { + $objEvent =& $this->aEvents[$sKey]; + + if ($objEvent->getName() == $this->sRequestedEvent) + { + $objEvent->fire($aArgs); + return true; + } + } + + return 'Invalid event request received; no event was registered with this name.'; + } +} + +$objPluginManager =& xajaxPluginManager::getInstance(); +$objPluginManager->registerPlugin(new xajaxEventPlugin(), 103); diff --git a/phpgwapi/inc/xajax/xajax_core/plugin_layer/xajaxFunctionPlugin.inc.php b/phpgwapi/inc/xajax/xajax_core/plugin_layer/xajaxFunctionPlugin.inc.php new file mode 100644 index 0000000000..601c3801e6 --- /dev/null +++ b/phpgwapi/inc/xajax/xajax_core/plugin_layer/xajaxFunctionPlugin.inc.php @@ -0,0 +1,231 @@ + for a detailed description, copyright + and license information. +*/ + +/* + @package xajax + @version $Id: xajaxFunctionPlugin.inc.php 362 2007-05-29 15:32:24Z calltoconstruct $ + @copyright Copyright (c) 2005-2007 by Jared White & J. Max Wilson + @copyright Copyright (c) 2008-2009 by Joseph Woolley, Steffen Konerow, Jared White & J. Max Wilson + @license http://www.xajaxproject.org/bsd_license.txt BSD License +*/ + +/* + Constant: XAJAX_FUNCTION + Specifies that the item being registered via the register> function + is a php function available at global scope, or a specific function from + an instance of an object. +*/ +if (!defined ('XAJAX_FUNCTION')) define ('XAJAX_FUNCTION', 'function'); + +// require_once is necessary here as the xajaxEvent class will include this also +//SkipAIO +require_once dirname(__FILE__) . '/support/xajaxUserFunction.inc.php'; +//EndSkipAIO + +/* + Class: xajaxFunctionPlugin +*/ +class xajaxFunctionPlugin extends xajaxRequestPlugin +{ + /* + Array: aFunctions + + An array of object that are registered and + available via a call. + */ + var $aFunctions; + + /* + String: sXajaxPrefix + + A configuration setting that is stored locally and used during + the client script generation phase. + */ + var $sXajaxPrefix; + + /* + String: sDefer + + Configuration option that can be used to request that the + javascript file is loaded after the page has been fully loaded. + */ + var $sDefer; + + var $bDeferScriptGeneration; + + /* + String: sRequestedFunction + + This string is used to temporarily hold the name of the function + that is being requested (during the request processing phase). + + Since canProcessRequest loads this value from the get or post + data, it is unnecessary to load it again. + */ + var $sRequestedFunction; + + /* + Function: xajaxFunctionPlugin + + Constructs and initializes the . The GET and POST + data is searched for xajax function call parameters. This will later + be used to determine if the request is for a registered function in + canProcessRequest> + */ + function xajaxFunctionPlugin() + { + $this->aFunctions = array(); + + $this->sXajaxPrefix = 'xajax_'; + $this->sDefer = ''; + $this->bDeferScriptGeneration = false; + + $this->sRequestedFunction = NULL; + + if (isset($_GET['xjxfun'])) $this->sRequestedFunction = $_GET['xjxfun']; + if (isset($_POST['xjxfun'])) $this->sRequestedFunction = $_POST['xjxfun']; + } + + /* + Function: configure + + Sets/stores configuration options used by this plugin. + */ + function configure($sName, $mValue) + { + if ('wrapperPrefix' == $sName) { + $this->sXajaxPrefix = $mValue; + } else if ('scriptDefferal' == $sName) { + if (true === $mValue) $this->sDefer = 'defer '; + else $this->sDefer = ''; + } else if ('deferScriptGeneration' == $sName) { + if (true === $mValue || false === $mValue) + $this->bDeferScriptGeneration = $mValue; + else if ('deferred' === $mValue) + $this->bDeferScriptGeneration = $mValue; + } + } + + /* + Function: register + + Provides a mechanism for functions to be registered and made available to + the page via the javascript call. + */ + function register($aArgs) + { + if (1 < count($aArgs)) + { + $sType = $aArgs[0]; + + if (XAJAX_FUNCTION == $sType) + { + $xuf =& $aArgs[1]; + + if (false === is_a($xuf, 'xajaxUserFunction')) + $xuf =& new xajaxUserFunction($xuf); + + if (2 < count($aArgs)) + if (is_array($aArgs[2])) + foreach ($aArgs[2] as $sName => $sValue) + $xuf->configure($sName, $sValue); + + $this->aFunctions[] =& $xuf; + + return $xuf->generateRequest($this->sXajaxPrefix); + } + } + + return false; + } + + /* + Function: generateClientScript + + Called by the during the client script generation + phase. This is used to generate a block of javascript code that will + contain function declarations that can be used on the browser through + javascript to initiate xajax requests. + */ + function generateClientScript() + { + if (false === $this->bDeferScriptGeneration || 'deferred' === $this->bDeferScriptGeneration) + { + if (0 < count($this->aFunctions)) + { + echo "\n\n"; + } + } + } + + /* + Function: canProcessRequest + + Determines whether or not the current request can be processed + by this plugin. + + Returns: + + boolean - True if the current request can be handled by this plugin; + false otherwise. + */ + function canProcessRequest() + { + if (NULL == $this->sRequestedFunction) + return false; + + return true; + } + + /* + Function: processRequest + + Called by the when a request needs to be + processed. + + Returns: + + mixed - True when the request has been processed successfully. + An error message when an error has occurred. + */ + function processRequest() + { + if (NULL == $this->sRequestedFunction) + return false; + + $objArgumentManager =& xajaxArgumentManager::getInstance(); + $aArgs = $objArgumentManager->process(); + + foreach (array_keys($this->aFunctions) as $sKey) + { + $xuf =& $this->aFunctions[$sKey]; + + if ($xuf->getName() == $this->sRequestedFunction) + { + $xuf->call($aArgs); + return true; + } + } + + return 'Invalid function request received; no request processor found with this name.'; + } +} + +$objPluginManager =& xajaxPluginManager::getInstance(); +$objPluginManager->registerPlugin(new xajaxFunctionPlugin(), 100); diff --git a/phpgwapi/inc/xajax/xajax_core/plugin_layer/xajaxScriptPlugin.inc.php b/phpgwapi/inc/xajax/xajax_core/plugin_layer/xajaxScriptPlugin.inc.php new file mode 100644 index 0000000000..2173a239fe --- /dev/null +++ b/phpgwapi/inc/xajax/xajax_core/plugin_layer/xajaxScriptPlugin.inc.php @@ -0,0 +1,266 @@ + for a detailed description, copyright + and license information. +*/ + +/* + @package xajax + @version $Id: xajaxScriptPlugin.inc.php 362 2007-05-29 15:32:24Z calltoconstruct $ + @copyright Copyright (c) 2005-2007 by Jared White & J. Max Wilson + @copyright Copyright (c) 2008-2009 by Joseph Woolley, Steffen Konerow, Jared White & J. Max Wilson + @license http://www.xajaxproject.org/bsd_license.txt BSD License +*/ + +/* + Class: xajaxScriptPlugin + + Contains the code that can produce script and style data during deferred script + generation. This allows the xajax generated javascript and style sheet information + to be loaded via an external file reference instead of inlined into the page + source. +*/ +class xajaxScriptPlugin extends xajaxRequestPlugin +{ + /* + String: sRequest + */ + var $sRequest; + + /* + String: sHash + */ + var $sHash; + + /* + String: sRequestURI + */ + var $sRequestURI; + + /* + Boolean: bDeferScriptGeneration + */ + var $bDeferScriptGeneration; + + /* + Boolean: bValidateHash + */ + var $bValidateHash; + + /* + Boolean: bWorking + */ + var $bWorking; + + /* + Function: xajaxScriptPlugin + + Construct and initialize the xajax script plugin object. During + initialization, this plugin will look for hash codes in the + GET data (parameters passed on the request URI) and store them + for later use. + */ + function xajaxScriptPlugin() + { + $this->sRequestURI = ''; + $this->bDeferScriptGeneration = false; + $this->bValidateHash = true; + + $this->bWorking = false; + + $this->sRequest = ''; + $this->sHash = null; + + if (isset($_GET['xjxGenerateJavascript'])) { + $this->sRequest = 'script'; + $this->sHash = $_GET['xjxGenerateJavascript']; + } + + if (isset($_GET['xjxGenerateStyle'])) { + $this->sRequest = 'style'; + $this->sHash = $_GET['xjxGenerateStyle']; + } + } + + /* + Function: configure + + Sets/stores configuration options used by this plugin. See also: + . This plugin will watch for and store the current + setting for the following configuration options: + + - (string): The requestURI of the current script file. + - (boolean): A flag that indicates whether + script deferral is in effect or not. + - (boolean): A flag that indicates whether + or not the script hash should be validated. + */ + function configure($sName, $mValue) + { + if ('requestURI' == $sName) { + $this->sRequestURI = $mValue; + } else if ('deferScriptGeneration' == $sName) { + if (true === $mValue || false === $mValue) + $this->bDeferScriptGeneration = $mValue; + } else if ('deferScriptValidateHash' == $sName) { + if (true === $mValue || false === $mValue) + $this->bValidateHash = $mValue; + } + } + + /* + Function: generateClientScript + + Called by the when the text of the client script + (or style) declarations are needed. + + This function will only output script or style information if the + request URI contained an appropriate hash code and script deferral + is in effect. + */ + function generateClientScript() + { + if ($this->bWorking) + return; + + if (true === $this->bDeferScriptGeneration) + { + $this->bWorking = true; + + $sQueryBase = '?'; + if (0 < strpos($this->sRequestURI, '?')) + $sQueryBase = '&'; + + $aScripts = $this->_getSections('script'); + if (0 < count($aScripts)) + { +// echo ""; + + $sHash = md5(implode($aScripts)); + $sQuery = $sQueryBase . "xjxGenerateJavascript=" . $sHash; + + echo "\n\n"; + } + + $aStyles = $this->_getSections('style'); + if (0 < count($aStyles)) + { +// echo ""; + + $sHash = md5(implode($aStyles)); + $sQuery = $sQueryBase . "xjxGenerateStyle=" . $sHash; + + echo "\n\n"; + } + + $this->bWorking = false; + } + } + + /* + Function: canProcessRequest + + Called by the to determine if this plugin can + process the current request. This will return true when the + requestURI contains an appropriate hash code. + */ + function canProcessRequest() + { + return ('' != $this->sRequest); + } + + function &_getSections($sType) + { + $objPluginManager =& xajaxPluginManager::getInstance(); + + $objPluginManager->configure('deferScriptGeneration', 'deferred'); + + $aSections = array(); + + // buffer output + + ob_start(); + $objPluginManager->generateClientScript(); + $sScript = ob_get_clean(); + + // parse out blocks + + $aParts = explode('', $sScript); + foreach ($aParts as $sPart) + { + $aValues = explode('<' . $sType, $sPart, 2); + if (2 == count($aValues)) + { + list($sJunk, $sPart) = $aValues; + + $aValues = explode('>', $sPart, 2); + if (2 == count($aValues)) + { + list($sJunk, $sPart) = $aValues; + + if (0 < strlen($sPart)) + $aSections[] = $sPart; + } + } + } + + $objPluginManager->configure('deferScriptGeneration', $this->bDeferScriptGeneration); + + return $aSections; + } + + /* + Function: processRequest + + Called by the when the current request should be + processed. This plugin will generate the javascript or style sheet information + that would normally be output by the other xajax plugin objects, when script + deferral is in effect. If script deferral is disabled, this function returns + without performing any functions. + */ + function processRequest() + { + if ($this->canProcessRequest()) + { + $aSections =& $this->_getSections($this->sRequest); + +// echo ""; + + // validate the hash + $sHash = md5(implode($aSections)); + if (false == $this->bValidateHash || $sHash == $this->sHash) + { + $sType = 'text/javascript'; + if ('style' == $this->sRequest) + $sType = 'text/css'; + + $objResponse =& new xajaxCustomResponse($sType); + + foreach ($aSections as $sSection) + $objResponse->append($sSection . "\n"); + + $objResponseManager =& xajaxResponseManager::getInstance(); + $objResponseManager->append($objResponse); + + header ('Expires: ' . gmdate('D, d M Y H:i:s', time() + (60*60*24)) . ' GMT'); + + return true; + } + + return 'Invalid script or style request.'; + trigger_error('Hash mismatch: ' . $this->sRequest . ': ' . $sHash . ' <==> ' . $this->sHash, E_USER_ERROR); + } + } +} + +/* + Register the plugin with the xajax plugin manager. +*/ +$objPluginManager =& xajaxPluginManager::getInstance(); +$objPluginManager->registerPlugin(new xajaxScriptPlugin(), 9999); diff --git a/phpgwapi/inc/xajax/xajax_core/xajax.inc.php b/phpgwapi/inc/xajax/xajax_core/xajax.inc.php new file mode 100644 index 0000000000..5bc1c85098 --- /dev/null +++ b/phpgwapi/inc/xajax/xajax_core/xajax.inc.php @@ -0,0 +1,1423 @@ + for a detailed description, copyright + and license information. +*/ + +/* + @package xajax + @version $Id: xajax.inc.php 362 2007-05-29 15:32:24Z calltoconstruct $ + @copyright Copyright (c) 2005-2007 by Jared White & J. Max Wilson + @copyright Copyright (c) 2008-2009 by Joseph Woolley, Steffen Konerow, Jared White & J. Max Wilson + @license http://www.xajaxproject.org/bsd_license.txt BSD License +*/ + +/* + Section: Standard Definitions +*/ + +/* + String: XAJAX_DEFAULT_CHAR_ENCODING + + Default character encoding used by both the and + classes. +*/ +if (!defined ('XAJAX_DEFAULT_CHAR_ENCODING')) define ('XAJAX_DEFAULT_CHAR_ENCODING', 'utf-8'); + +/* + String: XAJAX_PROCESSING_EVENT + String: XAJAX_PROCESSING_EVENT_BEFORE + String: XAJAX_PROCESSING_EVENT_AFTER + String: XAJAX_PROCESSING_EVENT_INVALID + + Identifiers used to register processing events. Processing events are essentially + hooks into the xajax core that can be used to add functionality into the request + processing sequence. +*/ +if (!defined ('XAJAX_PROCESSING_EVENT')) define ('XAJAX_PROCESSING_EVENT', 'xajax processing event'); +if (!defined ('XAJAX_PROCESSING_EVENT_BEFORE')) define ('XAJAX_PROCESSING_EVENT_BEFORE', 'beforeProcessing'); +if (!defined ('XAJAX_PROCESSING_EVENT_AFTER')) define ('XAJAX_PROCESSING_EVENT_AFTER', 'afterProcessing'); +if (!defined ('XAJAX_PROCESSING_EVENT_INVALID')) define ('XAJAX_PROCESSING_EVENT_INVALID', 'invalidRequest'); + +/* + Class: xajax + + The xajax class uses a modular plug-in system to facilitate the processing + of special Ajax requests made by a PHP page. It generates Javascript that + the page must include in order to make requests. It handles the output + of response commands (see ). Many flags and settings can be + adjusted to effect the behavior of the xajax class as well as the client-side + javascript. +*/ +class xajax +{ + /**#@+ + * @access protected + */ + + /* + Array: aSettings + + This array is used to store all the configuration settings that are set during + the run of the script. This provides a single data store for the settings + in case we need to return the value of a configuration option for some reason. + + It is advised that individual plugins store a local copy of the settings they + wish to track, however, settings are available via a reference to the + object using getConfiguration>. + */ + var $aSettings; + + /* + Boolean: bErrorHandler + + This is a configuration setting that the main xajax object tracks. It is used + to enable an error handler function which will trap php errors and return them + to the client as part of the response. The client can then display the errors + to the user if so desired. + */ + var $bErrorHandler; + + /* + Array: aProcessingEvents + + Stores the processing event handlers that have been assigned during this run + of the script. + */ + var $aProcessingEvents; + + /* + Boolean: bExitAllowed + + A configuration option that is tracked by the main object. Setting this + to true allows to exit immediatly after processing a xajax request. If + this is set to false, xajax will allow the remaining code and HTML to be sent + as part of the response. Typically this would result in an error, however, + a response processor on the client side could be designed to handle this condition. + */ + var $bExitAllowed; + + /* + Boolean: bCleanBuffer + + A configuration option that is tracked by the main object. Setting this + to true allows to clear out any pending output buffers so that the + is (virtually) the only output when handling a request. + */ + var $bCleanBuffer; + + /* + String: sLogFile + + A configuration setting tracked by the main object. Set the name of the + file on the server that you wish to have php error messages written to during + the processing of requests. + */ + var $sLogFile; + + /* + String: sCoreIncludeOutput + + This is populated with any errors or warnings produced while including the xajax + core components. This is useful for debugging core updates. + */ + var $sCoreIncludeOutput; + + /* + Object: objPluginManager + + This stores a reference to the global + */ + var $objPluginManager; + + /* + Object: objArgumentManager + + Stores a reference to the global + */ + var $objArgumentManager; + + /* + Object: objResponseManager + + Stores a reference to the global + */ + var $objResponseManager; + + /* + Object: objLanguageManager + + Stores a reference to the global + */ + var $objLanguageManager; + + /**#@-*/ + + /* + Constructor: xajax + + Constructs a xajax instance and initializes the plugin system. + + Parameters: + + sRequestURI - (optional): The sRequestURI> to be used + for calls back to the server. If empty, xajax fills in the current + URI that initiated this request. + */ + function xajax($sRequestURI=null, $sLanguage=null) + { + $this->bErrorHandler = false; + $this->aProcessingEvents = array(); + $this->bExitAllowed = true; + $this->bCleanBuffer = true; + $this->sLogFile = ''; + + $this->__wakeup(); + + // The default configuration settings. + $this->configureMany( + array( + 'characterEncoding' => XAJAX_DEFAULT_CHAR_ENCODING, + 'decodeUTF8Input' => false, + 'outputEntities' => false, + 'defaultMode' => 'asynchronous', + 'defaultMethod' => 'POST', // W3C: Method is case sensitive + 'wrapperPrefix' => 'xajax_', + 'debug' => false, + 'verbose' => false, + 'useUncompressedScripts' => false, + 'statusMessages' => false, + 'waitCursor' => true, + 'scriptDeferral' => false, + 'exitAllowed' => true, + 'errorHandler' => false, + 'cleanBuffer' => false, + 'allowBlankResponse' => false, + 'allowAllResponseTypes' => false, + 'generateStubs' => true, + 'logFile' => '', + 'timeout' => 6000, + 'version' => $this->getVersion() + ) + ); + + if (null !== $sRequestURI) + $this->configure('requestURI', $sRequestURI); + else + $this->configure('requestURI', $this->_detectURI()); + + if (null !== $sLanguage) + $this->configure('language', $sLanguage); + + if ('utf-8' != XAJAX_DEFAULT_CHAR_ENCODING) $this->configure("decodeUTF8Input", true); + + } + + /* + Function: __sleep + */ + function __sleep() + { + $aMembers = get_class_vars(get_class($this)); + + if (isset($aMembers['objLanguageManager'])) + unset($aMembers['objLanguageManager']); + + if (isset($aMembers['objPluginManager'])) + unset($aMembers['objPluginManager']); + + if (isset($aMembers['objArgumentManager'])) + unset($aMembers['objArgumentManager']); + + if (isset($aMembers['objResponseManager'])) + unset($aMembers['objResponseManager']); + + if (isset($aMembers['sCoreIncludeOutput'])) + unset($aMembers['sCoreIncludeOutput']); + + return array_keys($aMembers); + } + + /* + Function: __wakeup + */ + function __wakeup() + { + ob_start(); + + $sLocalFolder = dirname(__FILE__); + +//SkipAIO + require $sLocalFolder . '/xajaxPluginManager.inc.php'; + require $sLocalFolder . '/xajaxLanguageManager.inc.php'; + require $sLocalFolder . '/xajaxArgumentManager.inc.php'; + require $sLocalFolder . '/xajaxResponseManager.inc.php'; + require $sLocalFolder . '/xajaxRequest.inc.php'; + require $sLocalFolder . '/xajaxResponse.inc.php'; +//EndSkipAIO + + // this is the list of folders where xajax will look for plugins + // that will be automatically included at startup. + $aPluginFolders = array(); + $aPluginFolders[] = dirname($sLocalFolder) . '/xajax_plugins'; + +//SkipAIO + $aPluginFolders[] = $sLocalFolder . '/plugin_layer'; +//EndSkipAIO + + // Setup plugin manager + $this->objPluginManager =& xajaxPluginManager::getInstance(); + $this->objPluginManager->loadPlugins($aPluginFolders); + + $this->objLanguageManager =& xajaxLanguageManager::getInstance(); + $this->objArgumentManager =& xajaxArgumentManager::getInstance(); + $this->objResponseManager =& xajaxResponseManager::getInstance(); + + $this->sCoreIncludeOutput = ob_get_clean(); + } + + /* + Function: getGlobalResponse + + Returns the object preconfigured with the encoding + and entity settings from this instance of . This is used + for singleton-pattern response development. + + Returns: + + : A object which can be used to return + response commands. See also the class. + */ + function &getGlobalResponse() + { + static $obj; + if (!$obj) { + $obj = new xajaxResponse(); + } + return $obj; + } + + /* + Function: getVersion + + Returns: + + string : The current xajax version. + */ + function getVersion() + { + return 'xajax 0.5'; + } + + /* + Function: register + + Call this function to register request handlers, including functions, + callable objects and events. New plugins can be added that support + additional registration methods and request processors. + + + Parameters: + + $sType - (string): Type of request handler being registered; standard + options include: + XAJAX_FUNCTION: a function declared at global scope. + XAJAX_CALLABLE_OBJECT: an object who's methods are to be registered. + XAJAX_EVENT: an event which will cause zero or more event handlers + to be called. + XAJAX_EVENT_HANDLER: register an event handler function. + + $sFunction || $objObject || $sEvent - (mixed): + when registering a function, this is the name of the function + when registering a callable object, this is the object being registered + when registering an event or event handler, this is the name of the event + + $sIncludeFile || $aCallOptions || $sEventHandler + when registering a function, this is the (optional) include file. + when registering a callable object, this is an (optional) array + of call options for the functions being registered. + when registering an event handler, this is the name of the function. + */ + function register($sType, $mArg) + { + $aArgs = func_get_args(); + $nArgs = func_num_args(); + + if (2 < $nArgs) + { + if (XAJAX_PROCESSING_EVENT == $aArgs[0]) + { + $sEvent = $aArgs[1]; + $xuf =& $aArgs[2]; + + if (false == is_a($xuf, 'xajaxUserFunction')) + $xuf =& new xajaxUserFunction($xuf); + + $this->aProcessingEvents[$sEvent] =& $xuf; + + return true; + } + } + + if (1 < $nArgs) + { + // for php4 + $aArgs[1] =& $mArg; + } + + return $this->objPluginManager->register($aArgs); + } + + /* + Function: configure + + Call this function to set options that will effect the processing of + xajax requests. Configuration settings can be specific to the xajax + core, request processor plugins and response plugins. + + + Parameters: + + Options include: + javascript URI - (string): The path to the folder that contains the + xajax javascript files. + errorHandler - (boolean): true to enable the xajax error handler, see + bErrorHandler> + exitAllowed - (boolean): true to allow xajax to exit after processing + a request. See bExitAllowed> for more information. + */ + function configure($sName, $mValue) + { + if ('errorHandler' == $sName) { + if (true === $mValue || false === $mValue) + $this->bErrorHandler = $mValue; + } else if ('exitAllowed' == $sName) { + if (true === $mValue || false === $mValue) + $this->bExitAllowed = $mValue; + } else if ('cleanBuffer' == $sName) { + if (true === $mValue || false === $mValue) + $this->bCleanBuffer = $mValue; + } else if ('logFile' == $sName) { + $this->sLogFile = $mValue; + } + + $this->objLanguageManager->configure($sName, $mValue); + $this->objArgumentManager->configure($sName, $mValue); + $this->objPluginManager->configure($sName, $mValue); + $this->objResponseManager->configure($sName, $mValue); + + $this->aSettings[$sName] = $mValue; + } + + /* + Function: configureMany + + Set an array of configuration options. + + Parameters: + + $aOptions - (array): Associative array of configuration settings + */ + function configureMany($aOptions) + { + foreach ($aOptions as $sName => $mValue) + $this->configure($sName, $mValue); + } + + /* + Function: getConfiguration + + Get the current value of a configuration setting that was previously set + via configure> or configureMany> + + Parameters: + + $sName - (string): The name of the configuration setting + + Returns: + + $mValue : (mixed): The value of the setting if set, null otherwise. + */ + function getConfiguration($sName) + { + if (isset($this->aSettings[$sName])) + return $this->aSettings[$sName]; + return NULL; + } + + /* + Function: canProcessRequest + + Determines if a call is a xajax request or a page load request. + + Return: + + boolean - True if this is a xajax request, false otherwise. + */ + function canProcessRequest() + { + return $this->objPluginManager->canProcessRequest(); + } + + /* + Function: processRequest + + If this is a xajax request (see canProcessRequest>), call the + requested PHP function, build the response and send it back to the + browser. + + This is the main server side engine for xajax. It handles all the + incoming requests, including the firing of events and handling of the + response. If your RequestURI is the same as your web page, then this + function should be called before ANY headers or HTML is output from + your script. + + This function may exit, if a request is processed. See bAllowExit> + */ + function processRequest() + { +//SkipDebug + // Check to see if headers have already been sent out, in which case we can't do our job + if (headers_sent($filename, $linenumber)) { + echo "Output has already been sent to the browser at {$filename}:{$linenumber}.\n"; + echo 'Please make sure the command $xajax->processRequest() is placed before this.'; + exit(); + } +//EndSkipDebug + + if ($this->canProcessRequest()) + { + // Use xajax error handler if necessary + if ($this->bErrorHandler) { + $GLOBALS['xajaxErrorHandlerText'] = ""; + set_error_handler("xajaxErrorHandler"); + } + + $mResult = true; + + // handle beforeProcessing event + if (isset($this->aProcessingEvents[XAJAX_PROCESSING_EVENT_BEFORE])) + { + $bEndRequest = false; + $this->aProcessingEvents[XAJAX_PROCESSING_EVENT_BEFORE]->call(array(&$bEndRequest)); + $mResult = (false === $bEndRequest); + } + + if (true === $mResult) + $mResult = $this->objPluginManager->processRequest(); + + if (true === $mResult) + { + if ($this->bCleanBuffer) { + $er = error_reporting(0); + while (ob_get_level() > 0) ob_end_clean(); + error_reporting($er); + } + + // handle afterProcessing event + if (isset($this->aProcessingEvents[XAJAX_PROCESSING_EVENT_AFTER])) + { + $bEndRequest = false; + $this->aProcessingEvents[XAJAX_PROCESSING_EVENT_AFTER]->call(array(&$bEndRequest)); + if (true === $bEndRequest) + { + $this->objResponseManager->clear(); + $this->objResponseManager->append($aResult[1]); + } + } + } + else if (is_string($mResult)) + { + if ($this->bCleanBuffer) { + $er = error_reporting(0); + while (ob_get_level() > 0) ob_end_clean(); + error_reporting($er); + } + + // $mResult contains an error message + // the request was missing the cooresponding handler function + // or an error occurred while attempting to execute the + // handler. replace the response, if one has been started + // and send a debug message. + + $this->objResponseManager->clear(); + $this->objResponseManager->append(new xajaxResponse()); + + // handle invalidRequest event + if (isset($this->aProcessingEvents[XAJAX_PROCESSING_EVENT_INVALID])) + $this->aProcessingEvents[XAJAX_PROCESSING_EVENT_INVALID]->call(); + else + $this->objResponseManager->debug($mResult); + } + + if ($this->bErrorHandler) { + $sErrorMessage = $GLOBALS['xajaxErrorHandlerText']; + if (!empty($sErrorMessage)) { + if (0 < strlen($this->sLogFile)) { + $fH = @fopen($this->sLogFile, "a"); + if (NULL != $fH) { + fwrite( + $fH, + $this->objLanguageManager->getText('LOGHDR:01') + . strftime("%b %e %Y %I:%M:%S %p") + . $this->objLanguageManager->getText('LOGHDR:02') + . $sErrorMessage + . $this->objLanguageManager->getText('LOGHDR:03') + ); + fclose($fH); + } else { + $this->objResponseManager->debug( + $this->objLanguageManager->getText('LOGERR:01') + . $this->sLogFile + ); + } + } + $this->objResponseManager->debug( + $this->objLanguageManager->getText('LOGMSG:01') + . $sErrorMessage + ); + } + } + + $this->objResponseManager->send(); + + if ($this->bErrorHandler) restore_error_handler(); + + if ($this->bExitAllowed) exit(); + } + } + + /* + Function: printJavascript + + Prints the xajax Javascript header and wrapper code into your page. + This should be used to print the javascript code between the HEAD + and /HEAD tags at the top of the page. + + The javascript code output by this function is dependent on the plugins + that are included and the functions that are registered. + + Parameters: + + $sJsURI - (string, optional, deprecated): the path to the xajax javascript file(s) + + This option is deprecated and will be removed in future versions; instead + please use configure> with the option name 'javascript URI' + $aJsFiles - (array, optional, deprecated): an array of xajax javascript files + that will be loaded via SCRIPT tags. This option is deprecated and will + be removed in future versions; please use configure> with the + option name 'javascript files' instead. + */ + function printJavascript($sJsURI="", $aJsFiles=array()) + { + if (0 < strlen($sJsURI)) + $this->configure("javascript URI", $sJsURI); + + if (0 < count($aJsFiles)) + $this->configure("javascript files", $aJsFiles); + + $this->objPluginManager->generateClientScript(); + } + + /* + Function: getJavascript + + See printJavascript> for more information. + */ + function getJavascript($sJsURI='', $aJsFiles=array()) + { + ob_start(); + $this->printJavascript($sJsURI, $aJsFiles); + return ob_get_clean(); + } + + /* + Function: autoCompressJavascript + + Creates a new xajax_core, xajax_debug, etc... file out of the + _uncompressed file with a similar name. This strips out the + comments and extraneous whitespace so the file is as small as + possible without modifying the function of the code. + + Parameters: + + sJsFullFilename - (string): The relative path and name of the file + to be compressed. + bAlways - (boolean): Compress the file, even if it already exists. + */ + function autoCompressJavascript($sJsFullFilename=NULL, $bAlways=false) + { + $sJsFile = 'xajax_js/xajax_core.js'; + + if ($sJsFullFilename) { + $realJsFile = $sJsFullFilename; + } + else { + $realPath = realpath(dirname(dirname(__FILE__))); + $realJsFile = $realPath . '/'. $sJsFile; + } + + // Create a compressed file if necessary + if (!file_exists($realJsFile) || true == $bAlways) { + $srcFile = str_replace('.js', '_uncompressed.js', $realJsFile); + if (!file_exists($srcFile)) { + trigger_error( + $this->objLanguageManager->getText('CMPRSJS:RDERR:01') + . dirname($realJsFile) + . $this->objLanguageManager->getText('CMPRSJS:RDERR:02') + , E_USER_ERROR + ); + } + require_once(dirname(__FILE__) . '/xajaxCompress.inc.php'); + $javaScript = implode('', file($srcFile)); + $compressedScript = xajaxCompressFile($javaScript); + $fH = @fopen($realJsFile, 'w'); + if (!$fH) { + trigger_error( + $this->objLanguageManager->getText('CMPRSJS:WTERR:01') + . dirname($realJsFile) + . $this->objLanguageManager->getText('CMPRSJS:WTERR:02') + , E_USER_ERROR + ); + } + else { + fwrite($fH, $compressedScript); + fclose($fH); + } + } + } + + function _compressSelf($sFolder=null) + { + if (null == $sFolder) + $sFolder = dirname(dirname(__FILE__)); + + require_once(dirname(__FILE__) . '/xajaxCompress.inc.php'); + + if ($handle = opendir($sFolder)) { + while (!(false === ($sName = readdir($handle)))) { + if ('.' != $sName && '..' != $sName && is_dir($sFolder . '/' . $sName)) { + $this->_compressSelf($sFolder . '/' . $sName); + } else if (8 < strlen($sName) && 0 == strpos($sName, '.compressed')) { + if ('.inc.php' == substr($sName, strlen($sName) - 8, 8)) { + $sName = substr($sName, 0, strlen($sName) - 8); + $sPath = $sFolder . '/' . $sName . '.inc.php'; + if (file_exists($sPath)) { + + $aParsed = array(); + $aFile = file($sPath); + $nSkip = 0; + foreach (array_keys($aFile) as $sKey) + if ('//SkipDebug' == $aFile[$sKey]) + ++$nSkip; + else if ('//EndSkipDebug' == $aFile[$sKey]) + --$nSkip; + else if (0 == $nSkip) + $aParsed[] = $aFile[$sKey]; + unset($aFile); + + $compressedScript = xajaxCompressFile(implode('', $aParsed)); + + $sNewPath = $sPath; + $fH = @fopen($sNewPath, 'w'); + if (!$fH) { + trigger_error( + $this->objLanguageManager->getText('CMPRSPHP:WTERR:01') + . $sNewPath + . $this->objLanguageManager->getText('CMPRSPHP:WTERR:02') + , E_USER_ERROR + ); + } + else { + fwrite($fH, $compressedScript); + fclose($fH); + } + } + } + } + } + + closedir($handle); + } + } + + function _compile($sFolder=null, $bWriteFile=true) + { + if (null == $sFolder) + $sFolder = dirname(__FILE__); + + require_once(dirname(__FILE__) . '/xajaxCompress.inc.php'); + + $aOutput = array(); + + if ($handle = opendir($sFolder)) { + while (!(false === ($sName = readdir($handle)))) { + if ('.' != $sName && '..' != $sName && is_dir($sFolder . '/' . $sName)) { + $aOutput[] = $this->_compile($sFolder . '/' . $sName, false); + } else if (8 < strlen($sName)) { + if ('.inc.php' == substr($sName, strlen($sName) - 8, 8)) { + $sName = substr($sName, 0, strlen($sName) - 8); + $sPath = $sFolder . '/' . $sName . '.inc.php'; + if ( + 'xajaxAIO' != $sName && + 'legacy' != $sName && + 'xajaxCompress' != $sName + ) { + if (file_exists($sPath)) { + + $aParsed = array(); + $aFile = file($sPath); + $nSkip = 0; + foreach (array_keys($aFile) as $sKey) + if ('//SkipDebug' == substr($aFile[$sKey], 0, 11)) + ++$nSkip; + else if ('//EndSkipDebug' == substr($aFile[$sKey], 0, 14)) + --$nSkip; + else if ('//SkipAIO' == substr($aFile[$sKey], 0, 9)) + ++$nSkip; + else if ('//EndSkipAIO' == substr($aFile[$sKey], 0, 12)) + --$nSkip; + else if ('<'.'?php' == substr($aFile[$sKey], 0, 5)) {} + else if ('?'.'>' == substr($aFile[$sKey], 0, 2)) {} + else if (0 == $nSkip) + $aParsed[] = $aFile[$sKey]; + unset($aFile); + + $aOutput[] = xajaxCompressFile(implode('', $aParsed)); + } + } + } + } + } + + closedir($handle); + } + + if ($bWriteFile) + { + $fH = @fopen($sFolder . '/xajaxAIO.inc.php', 'w'); + if (!$fH) { + trigger_error( + $this->objLanguageManager->getText('CMPRSAIO:WTERR:01') + . $sFolder + . $this->objLanguageManager->getText('CMPRSAIO:WTERR:02') + , E_USER_ERROR + ); + } + else { + fwrite($fH, '<'.'?php '); + fwrite($fH, implode('', $aOutput)); + fclose($fH); + } + } + + return implode('', $aOutput); + } + + /* + Function: _detectURI + + Returns the current requests URL based upon the SERVER vars. + + Returns: + + string : The URL of the current request. + */ + function _detectURI() { + $aURL = array(); + + // Try to get the request URL + if (!empty($_SERVER['REQUEST_URI'])) { + + $_SERVER['REQUEST_URI'] = str_replace( + array('"',"'",'<','>'), + array('%22','%27','%3C','%3E'), + $_SERVER['REQUEST_URI'] + ); + + $aURL = parse_url($_SERVER['REQUEST_URI']); + } + + // Fill in the empty values + if (empty($aURL['scheme'])) { + if (!empty($_SERVER['HTTP_SCHEME'])) { + $aURL['scheme'] = $_SERVER['HTTP_SCHEME']; + } else { + $aURL['scheme'] = + (!empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) != 'off') + ? 'https' + : 'http'; + } + } + + if (empty($aURL['host'])) { + if (!empty($_SERVER['HTTP_X_FORWARDED_HOST'])) { + if (strpos($_SERVER['HTTP_X_FORWARDED_HOST'], ':') > 0) { + list($aURL['host'], $aURL['port']) = explode(':', $_SERVER['HTTP_X_FORWARDED_HOST']); + } else { + $aURL['host'] = $_SERVER['HTTP_X_FORWARDED_HOST']; + } + } else if (!empty($_SERVER['HTTP_HOST'])) { + if (strpos($_SERVER['HTTP_HOST'], ':') > 0) { + list($aURL['host'], $aURL['port']) = explode(':', $_SERVER['HTTP_HOST']); + } else { + $aURL['host'] = $_SERVER['HTTP_HOST']; + } + } else if (!empty($_SERVER['SERVER_NAME'])) { + $aURL['host'] = $_SERVER['SERVER_NAME']; + } else { + echo $this->objLanguageManager->getText('DTCTURI:01'); + echo $this->objLanguageManager->getText('DTCTURI:02'); + exit(); + } + } + + if (empty($aURL['port']) && !empty($_SERVER['SERVER_PORT'])) { + $aURL['port'] = $_SERVER['SERVER_PORT']; + } + + if (!empty($aURL['path'])) + if (0 == strlen(basename($aURL['path']))) + unset($aURL['path']); + + if (empty($aURL['path'])) { + $sPath = array(); + if (!empty($_SERVER['PATH_INFO'])) { + $sPath = parse_url($_SERVER['PATH_INFO']); + } else { + $sPath = parse_url($_SERVER['PHP_SELF']); + } + if (isset($sPath['path'])) + $aURL['path'] = str_replace(array('"',"'",'<','>'), array('%22','%27','%3C','%3E'), $sPath['path']); + unset($sPath); + } + + if (empty($aURL['query']) && !empty($_SERVER['QUERY_STRING'])) { + $aURL['query'] = $_SERVER['QUERY_STRING']; + } + + if (!empty($aURL['query'])) { + $aURL['query'] = '?'.$aURL['query']; + } + + // Build the URL: Start with scheme, user and pass + $sURL = $aURL['scheme'].'://'; + if (!empty($aURL['user'])) { + $sURL.= $aURL['user']; + if (!empty($aURL['pass'])) { + $sURL.= ':'.$aURL['pass']; + } + $sURL.= '@'; + } + + // Add the host + $sURL.= $aURL['host']; + + // Add the port if needed + if (!empty($aURL['port']) + && (($aURL['scheme'] == 'http' && $aURL['port'] != 80) + || ($aURL['scheme'] == 'https' && $aURL['port'] != 443))) { + $sURL.= ':'.$aURL['port']; + } + + // Add the path and the query string + $sURL.= $aURL['path'].@$aURL['query']; + + // Clean up + unset($aURL); + + $aURL = explode("?", $sURL); + + if (1 < count($aURL)) + { + $aQueries = explode("&", $aURL[1]); + + foreach ($aQueries as $sKey => $sQuery) + { + if ("xjxGenerate" == substr($sQuery, 0, 11)) + unset($aQueries[$sKey]); + } + + $sQueries = implode("&", $aQueries); + + $aURL[1] = $sQueries; + + $sURL = implode("?", $aURL); + } + + return $sURL; + } + + + /* + Deprecated functions + */ + + /* + Function: setCharEncoding + + Sets the character encoding that will be used for the HTTP output. + Typically, you will not need to use this method since the default + character encoding can be configured using the constant + . + + Parameters: + + sEncoding - (string): The encoding to use. + - examples include (UTF-8, ISO-8859-1) + + Note: + deprecated : This function will be removed in future versions. Please + use configure> instead. + */ + function setCharEncoding($sEncoding) + { + $this->configure('characterEncoding', $sEncoding); + } + + /* + Function: getCharEncoding + + Returns the current character encoding. See also setCharEncoding> + and + + Returns: + + string : The character encoding. + + Note: + deprecated : This function will be removed in future versions. Please + use getConfiguration> instead. + */ + function getCharEncoding() + { + return $this->getConfiguration('characterEncoding'); + } + + /* + Function: setFlags + + Sets a series of flags. See also, setFlag>. + + Parameters: + + flags - (array): An associative array containing the name of the flag + and the value to set. + + Note: + deprecated : This function will be removed in future versions. Please + use configureMany> instead. + */ + function setFlags($flags) + { + foreach ($flags as $name => $value) { + $this->configure($name, $value); + } + } + + /* + Function: setFlag + + Sets a single flag (boolean true or false). + + Available flags are as follows (flag, default value): + - debug, false + - verbose, false + - statusMessages, false + - waitCursor, true + - scriptDeferral, false + - exitAllowed, true + - errorHandler, false + - cleanBuffer, false + - decodeUTF8Input, false + - outputEntities, false + - allowBlankResponse, false + - allowAllResponseTypes, false + - generateStubs, true + + Parameters: + + name - (string): The name of the flag to set. + value - (boolean): The value to set. + + Note: + + deprecated : This function will be removed in future versions. Please + use configure> instead. + */ + function setFlag($name, $value) + { + $this->configure($name, $value); + + } + + /* + Function: getFlag + + Returns the current value of the flag. See also setFlag>. + + Parameters: + + name - (string): The name of the flag. + + Returns: + + boolean : The value currently associated with the flag. + + Note: + deprecated : This function will be removed in future versions. Instead, + use getConfiguration>. + */ + function getFlag($name) + { + return $this->getConfiguration($name); + } + + /* + Function: setRequestURI + + Sets the URI to which requests will be sent. + + Parameters: + + sRequestURI - (string): The URI + + Note: + + $xajax->setRequestURI("http://www.xajaxproject.org"); + + deprecated : This function will be removed in future versions. Please + use configure> instead. + */ + function setRequestURI($sRequestURI) + { + $this->configure('requestURI', $sRequestURI); + } + + /* + Function: getRequestURI + + Returns: + + string : The current request URI that will be configured on the client + side. This is the default URI for all requests made from the current + page. See setRequestURI>. + + Note: + deprecated : This function will be removed in future versions. Please + use getConfiguration> instead. + */ + function getRequestURI() + { + return $this->getConfiguration('requestURI'); + } + + /* + Function: setDefaultMode + + Sets the default mode for requests from the browser. + + Parameters: + + sDefaultMode - (string): The mode to set as the default. + + - 'synchronous' + - 'asynchronous' + + Note: + deprecated : This function will be removed in future versions. Please + use configure> instead. + */ + function setDefaultMode($sDefaultMode) + { + $this->configure('defaultMode', $sDefaultMode); + } + + /* + Function: getDefaultMode + + Get the default request mode that will be used by the browser + for submitting requests to the server. See also setDefaultMode> + + Returns: + + string - The default mode to be used by the browser for each + request. + + Note: + deprecated : This function will be removed in future versions. Please + use getConfiguration> instead. + */ + function getDefaultMode() + { + return $this->getConfiguration('defaultMode'); + } + + /* + Function: setDefaultMethod + + Sets the default method for making xajax requests. + + Parameters: + + sMethod - (string): The name of the method. + + - 'GET' + - 'POST' + Note: + deprecated : This function will be removed in future versions. Please + use configure> instead. + */ + function setDefaultMethod($sMethod) + { + $this->configure('defaultMethod', $sMethod); + } + + /* + Function: getDefaultMethod + + Gets the default method for making xajax requests. + + Returns: + + string - The current method configured. + + Note: + deprecated : This function will be removed in future versions. Please + use getConfiguration> instead. + */ + function getDefaultMethod() + { + return $this->getConfiguration('defaultMethod'); + } + + /* + Function: setWrapperPrefix + + Sets the prefix that will be prepended to the javascript wrapper + functions. This allows a little flexibility in setting the naming + for the wrapper functions. + + Parameters: + + sPrefix - (string): The prefix to be used. + - default is 'xajax_' + + Note: + deprecated : This function will be removed in future versions. Please + use configure> instead. + */ + function setWrapperPrefix($sPrefix) + { + $this->configure('wrapperPrefix', $sPrefix); + } + + /* + Function: getWrapperPrefix + + Gets the current javascript wrapper prefix. See also, setWrapperPrefix> + + Returns: + + string - The current wrapper prefix. + + Note: + deprecated : This function will be removed in future versions. Please + use getConfiguration> instead. + */ + function getWrapperPrefix() + { + return $this->getConfiguration('wrapperPrefix'); + } + + /* + Function: setLogFile + + Specifies a log file that will be written to by xajax during a + request. This is only used by the error handling system at this + point. If you do not invoke this method or you pass in an empty + string, then no log file will be written to. + + Parameters: + + sFilename - (string): The full or reletive path to the log file. + + Note: + deprecated : This function will be removed in future versions. Please + use configure> instead. + */ + function setLogFile($sFilename) + { + $this->configure('logFile', $sFilename); + } + + /* + Function: getLogFile + + Returns the current log file path. See also setLogFile>. + + Returns: + + string : The log file path. + + Note: + deprecated : This function will be removed in future versions. Please + use getConfiguration> instead. + */ + function getLogFile() + { + return $this->getConfiguration('logFile'); + } + + /* + Function: registerFunction + + Registers a PHP function or method with the xajax request processor. This + makes the function available to the browser via an asynchronous + (or synchronous) javascript call. + + Parameters: + + mFunction - (string or array): The string containing the function name + or an array containing the following: + - (string) The function name as it will be called from javascript. + - (object, by reference) A reference to an instance of a class + containing the specified function. + - (string) The function as it is found in the class passed in the second + parameter. + sIncludeFile - (string, optional): The server path to the PHP file to + include when calling this function. This will enable xajax to load + only the include file that is needed for this function call, thus + reducing server load. + + Note: + deprecated : This function will be removed in future versions. Please + use register> instead. + */ + function registerFunction($mFunction, $sIncludeFile=null) + { + $xuf =& new xajaxUserFunction($mFunction, $sIncludeFile); + return $this->register(XAJAX_FUNCTION, $xuf); + } + + /* + Function: registerCallableObject + + Registers an object whose methods will be searched for a match to the + incoming request. If more than one callable object is registered, the + first on that contains the requested method will be used. + + Parameters: + + oObject - (object, by reference): The object whose methods will be + registered. + + Note: + deprecated : This function will be removed in future versions. Please + use register> instead. + */ + function registerCallableObject(&$oObject) + { + $mResult = false; + + if (0 > version_compare(PHP_VERSION, '5.0')) + // for PHP4; using eval because PHP5 will complain it is deprecated + eval('$mResult = $this->register(XAJAX_CALLABLE_OBJECT, &$oObject);'); + else + // for PHP5 + $mResult = $this->register(XAJAX_CALLABLE_OBJECT, $oObject); + + return $mResult; + } + + /* + Function: registerEvent + + Assigns a callback function with the specified xajax event. Events + are triggered during the processing of a request. + + List: Available events: + - beforeProcessing: triggered before the request is processed. + - afterProcessing: triggered after the request is processed. + - invalidRequest: triggered if no matching function/method is found. + + Parameters: + + mCallback - (function): The function or object callback to be assigned. + sEventName - (string): The name of the event. + + Note: + deprecated : This function will be removed in future versions. Please + use register> instead. + */ + function registerEvent($sEventName, $mCallback) + { + $this->register(XAJAX_PROCESSING_EVENT, $sEventName, $mCallback); + } + +} + +/* + Section: Global functions +*/ + +/* + Function xajaxErrorHandler + + This function is registered with PHP's set_error_handler if the xajax + error handling system is enabled. + + See bUserErrorHandler> +*/ +function xajaxErrorHandler($errno, $errstr, $errfile, $errline) +{ + $errorReporting = error_reporting(); + if (($errno & $errorReporting) == 0) return; + + if ($errno == E_NOTICE) { + $errTypeStr = 'NOTICE'; + } + else if ($errno == E_WARNING) { + $errTypeStr = 'WARNING'; + } + else if ($errno == E_USER_NOTICE) { + $errTypeStr = 'USER NOTICE'; + } + else if ($errno == E_USER_WARNING) { + $errTypeStr = 'USER WARNING'; + } + else if ($errno == E_USER_ERROR) { + $errTypeStr = 'USER FATAL ERROR'; + } + else if (defined('E_STRICT') && $errno == E_STRICT) { + return; + } + else { + $errTypeStr = 'UNKNOWN: ' . $errno; + } + + $sCrLf = "\n"; + + ob_start(); + echo $GLOBALS['xajaxErrorHandlerText']; + echo $sCrLf; + echo '----'; + echo $sCrLf; + echo '['; + echo $errTypeStr; + echo '] '; + echo $errstr; + echo $sCrLf; + echo 'Error on line '; + echo $errline; + echo ' of file '; + echo $errfile; + $GLOBALS['xajaxErrorHandlerText'] = ob_get_clean(); +} + diff --git a/phpgwapi/inc/xajax/xajax_core/xajaxArgumentManager.inc.php b/phpgwapi/inc/xajax/xajax_core/xajaxArgumentManager.inc.php new file mode 100644 index 0000000000..aa803edb2f --- /dev/null +++ b/phpgwapi/inc/xajax/xajax_core/xajaxArgumentManager.inc.php @@ -0,0 +1,466 @@ + for a detailed description, copyright + and license information. +*/ + +/* + @package xajax + @version $Id: xajaxArgumentManager.inc.php 362 2007-05-29 15:32:24Z calltoconstruct $ + @copyright Copyright (c) 2005-2007 by Jared White & J. Max Wilson + @copyright Copyright (c) 2008-2009 by Joseph Woolley, Steffen Konerow, Jared White & J. Max Wilson + @license http://www.xajaxproject.org/bsd_license.txt BSD License +*/ + +if (!defined('XAJAX_METHOD_UNKNOWN')) define('XAJAX_METHOD_UNKNOWN', 0); +if (!defined('XAJAX_METHOD_GET')) define('XAJAX_METHOD_GET', 1); +if (!defined('XAJAX_METHOD_POST')) define('XAJAX_METHOD_POST', 2); + +/* + Class: xajaxArgumentManager + + This class processes the input arguments from the GET or POST data of + the request. If this is a request for the initial page load, no arguments + will be processed. During a xajax request, any arguments found in the + GET or POST will be converted to a PHP array. +*/ +class xajaxArgumentManager +{ + /* + Array: aArgs + + An array of arguments received via the GET or POST parameter + xjxargs. + */ + var $aArgs; + + /* + Boolean: bDecodeUTF8Input + + A configuration option used to indicate whether input data should be + UTF8 decoded automatically. + */ + var $bDecodeUTF8Input; + + /* + String: sCharacterEncoding + + The character encoding in which the input data will be received. + */ + var $sCharacterEncoding; + + /* + Integer: nMethod + + Stores the method that was used to send the arguments from the client. Will + be one of: XAJAX_METHOD_UNKNOWN, XAJAX_METHOD_GET, XAJAX_METHOD_POST + */ + var $nMethod; + + /* + Array: aSequence + + Stores the decoding sequence table. + */ + var $aSequence; + + /* + Function: convertStringToBool + + Converts a string to a bool var. + + Parameters: + $sValue - (string): + + Returns: + (bool) : true / false + + */ + + function convertStringToBool($sValue) + { + if (0 == strcasecmp($sValue, 'true')) + return true; + if (0 == strcasecmp($sValue, 'false')) + return false; + if (is_numeric($sValue)) + { + if (0 == $sValue) + return false; + return true; + } + return false; + } + + function argumentStripSlashes(&$sArg) + { + if (false == is_string($sArg)) + return; + + $sArg = stripslashes($sArg); + } + + function argumentDecodeXML(&$sArg) + { + if (false == is_string($sArg)) + return; + + if (0 == strlen($sArg)) + return; + + $nStackDepth = 0; + $aStack = array(); + $aArg = array(); + + $nCurrent = 0; + $nLast = 0; + $aExpecting = array(); + $nFound = 0; + list($aExpecting, $nFound) = $this->aSequence['start']; + + $nLength = strlen($sArg); + + $sKey = ''; + $mValue = ''; + + while ($nCurrent < $nLength) + { + $bFound = false; + + foreach ($aExpecting as $sExpecting => $nExpectedLength) + { + if ($sArg[$nCurrent] == $sExpecting[0]) + { + if ($sExpecting == substr($sArg, $nCurrent, $nExpectedLength)) + { + list($aExpecting, $nFound) = $this->aSequence[$sExpecting]; + + switch ($nFound) + { + case 3: // k + $sKey = ''; + break; + case 4: // /k + $sKey = str_replace( + array('<'.'![CDATA[', ']]>'), + '', + substr($sArg, $nLast, $nCurrent - $nLast) + ); + break; + case 5: // v + $mValue = ''; + break; + case 6: // /v + if ($nLast < $nCurrent) + { + $mValue = str_replace( + array('<'.'![CDATA[', ']]>'), + '', + substr($sArg, $nLast, $nCurrent - $nLast) + ); + + $cType = substr($mValue, 0, 1); + $sValue = substr($mValue, 1); + switch ($cType) { + case 'S': $mValue = false === $sValue ? '' : $sValue; break; + case 'B': $mValue = $this->convertStringToBool($sValue); break; + case 'N': $mValue = floatval($sValue); break; + case '*': $mValue = null; break; + } + } + break; + case 7: // /e + $aArg[$sKey] = $mValue; + break; + case 1: // xjxobj + ++$nStackDepth; + array_push($aStack, $aArg); + $aArg = array(); + array_push($aStack, $sKey); + $sKey = ''; + break; + case 8: // /xjxobj + if (1 < $nStackDepth) { + $mValue = $aArg; + $sKey = array_pop($aStack); + $aArg = array_pop($aStack); + --$nStackDepth; + } else { + $sArg = $aArg; + return; + } + break; + } + $nCurrent += $nExpectedLength; + $nLast = $nCurrent; + $bFound = true; + break; + } + } + } + + if (false == $bFound) + { + if (0 == $nCurrent) + { + $sArg = str_replace( + array('<'.'![CDATA[', ']]>'), + '', + $sArg + ); + + $cType = substr($sArg, 0, 1); + $sValue = substr($sArg, 1); + switch ($cType) { + case 'S': $sArg = false === $sValue ? '' : $sValue; break; + case 'B': $sArg = $this->convertStringToBool($sValue); break; + case 'N': $sArg = floatval($sValue); break; + case '*': $sArg = null; break; + } + + return; + } + +// for larger arg data, performance may suffer using concatenation +// $sText .= $sArg[$nCurrent]; + $nCurrent++; + } + } + + $objLanguageManager =& xajaxLanguageManager::getInstance(); + + trigger_error( + $objLanguageManager->getText('ARGMGR:ERR:01') + . $sExpecting + . $objLanguageManager->getText('ARGMGR:ERR:02') + . $sArg + , E_USER_ERROR + ); + } + + function argumentDecodeUTF8_iconv(&$mArg) + { + if (is_array($mArg)) + { + foreach (array_keys($mArg) as $sKey) + { + $sNewKey = $sKey; + $this->argumentDecodeUTF8_iconv($sNewKey); + + if ($sNewKey != $sKey) + { + $mArg[$sNewKey] = $mArg[$sKey]; + unset($mArg[$sKey]); + $sKey = $sNewKey; + } + + $this->argumentDecodeUTF8_iconv($mArg[$sKey]); + } + } + else if (is_string($mArg)) + $mArg = iconv("UTF-8", $this->sCharacterEncoding.'//TRANSLIT', $mArg); + } + + function argumentDecodeUTF8_mb_convert_encoding(&$mArg) + { + if (is_array($mArg)) + { + foreach (array_keys($mArg) as $sKey) + { + $sNewKey = $sKey; + $this->argumentDecodeUTF8_mb_convert_encoding($sNewKey); + + if ($sNewKey != $sKey) + { + $mArg[$sNewKey] = $mArg[$sKey]; + unset($mArg[$sKey]); + $sKey = $sNewKey; + } + + $this->argumentDecodeUTF8_mb_convert_encoding($mArg[$sKey]); + } + } + else if (is_string($mArg)) + $mArg = mb_convert_encoding($mArg, $this->sCharacterEncoding, "UTF-8"); + } + + function argumentDecodeUTF8_utf8_decode(&$mArg) + { + if (is_array($mArg)) + { + foreach (array_keys($mArg) as $sKey) + { + $sNewKey = $sKey; + $this->argumentDecodeUTF8_utf8_decode($sNewKey); + + if ($sNewKey != $sKey) + { + $mArg[$sNewKey] = $mArg[$sKey]; + unset($mArg[$sKey]); + $sKey = $sNewKey; + } + + $this->argumentDecodeUTF8_utf8_decode($mArg[$sKey]); + } + } + else if (is_string($mArg)) + $mArg = utf8_decode($mArg); + } + + /* + Constructor: xajaxArgumentManager + + Initializes configuration settings to their default values and reads + the argument data from the GET or POST data. + */ + function xajaxArgumentManager() + { + $this->aArgs = array(); + + $this->bDecodeUTF8Input = false; + $this->sCharacterEncoding = 'UTF-8'; + $this->nMethod = XAJAX_METHOD_UNKNOWN; + + $this->aSequence = array( + '<'.'k'.'>' => array(array( + '<'.'/k'.'>' => 4 + ), 3), + '<'.'/k'.'>' => array(array( + '<'.'v'.'>' => 3, + '<'.'/e'.'>' => 4 + ), 4), + '<'.'v'.'>' => array(array( + '<'.'xjxobj'.'>' => 8, + '<'.'/v'.'>' => 4 + ), 5), + '<'.'/v'.'>' => array(array( + '<'.'/e'.'>' => 4, + '<'.'k'.'>' => 3 + ), 6), + '<'.'e'.'>' => array(array( + '<'.'k'.'>' => 3, + '<'.'v'.'>' => 3, + '<'.'/e'.'>' => 4 + ), 2), + '<'.'/e'.'>' => array(array( + '<'.'e'.'>' => 3, + '<'.'/xjxobj'.'>' => 9 + ), 7), + '<'.'xjxobj'.'>' => array(array( + '<'.'e'.'>' => 3, + '<'.'/xjxobj'.'>' => 9 + ), 1), + '<'.'/xjxobj'.'>' => array(array( + '<'.'/v'.'>' => 4 + ), 8), + 'start' => array(array( + '<'.'xjxobj'.'>' => 8 + ), 9) + ); + + if (isset($_POST['xjxargs'])) { + $this->nMethod = XAJAX_METHOD_POST; + $this->aArgs = $_POST['xjxargs']; + } else if (isset($_GET['xjxargs'])) { + $this->nMethod = XAJAX_METHOD_GET; + $this->aArgs = $_GET['xjxargs']; + } + + if (1 == get_magic_quotes_gpc()) + array_walk($this->aArgs, array(&$this, 'argumentStripSlashes')); + + array_walk($this->aArgs, array(&$this, 'argumentDecodeXML')); + } + + /* + Function: getInstance + + Returns: + + object - A reference to an instance of this class. This function is + used to implement the singleton pattern. + */ + function &getInstance() + { + static $obj; + if (!$obj) { + $obj = new xajaxArgumentManager(); + } + return $obj; + } + + /* + Function: configure + + Accepts configuration settings from the main object. + + Parameters: + + + The tracks the following configuration settings: + + - (boolean): See bDecodeUTF8Input> + - (string): See sCharacterEncoding> + */ + function configure($sName, $mValue) + { + if ('decodeUTF8Input' == $sName) { + if (true === $mValue || false === $mValue) + $this->bDecodeUTF8Input = $mValue; + } else if ('characterEncoding' == $sName) { + $this->sCharacterEncoding = $mValue; + } + } + + /* + Function: getRequestMethod + + Returns the method that was used to send the arguments from the client. + */ + function getRequestMethod() + { + return $this->nMethod; + } + + /* + Function: process + + Returns the array of arguments that were extracted and parsed from + the GET or POST data. + */ + function process() + { + if ($this->bDecodeUTF8Input) + { + $sFunction = ''; + + if (function_exists('iconv')) + $sFunction = "iconv"; + else if (function_exists('mb_convert_encoding')) + $sFunction = "mb_convert_encoding"; + else if ($this->sCharacterEncoding == "ISO-8859-1") + $sFunction = "utf8_decode"; + else { + $objLanguageManager =& xajaxLanguageManager::getInstance(); + trigger_error( + $objLanguageManager->getText('ARGMGR:ERR:03') + , E_USER_NOTICE + ); + } + + $mFunction = array(&$this, 'argumentDecodeUTF8_' . $sFunction); + + array_walk($this->aArgs, $mFunction); + + $this->bDecodeUTF8Input = false; + } + + return $this->aArgs; + } +} diff --git a/phpgwapi/inc/xajax/xajax_core/xajaxCall.inc.php b/phpgwapi/inc/xajax/xajax_core/xajaxCall.inc.php new file mode 100644 index 0000000000..83243f9f43 --- /dev/null +++ b/phpgwapi/inc/xajax/xajax_core/xajaxCall.inc.php @@ -0,0 +1,389 @@ + for a detailed description, copyright + and license information. +*/ + +/* + @package xajax + @version $Id: xajaxCall.inc.php 362 2007-05-29 15:32:24Z calltoconstruct $ + @copyright Copyright (c) 2005-2007 by Jared White & J. Max Wilson + @copyright Copyright (c) 2008-2009 by Joseph Woolley, Steffen Konerow, Jared White & J. Max Wilson + @license http://www.xajaxproject.org/bsd_license.txt BSD License +*/ + +/* + Class: xajaxCall + + Create a piece of javascript code that will invoke the + function. + + This class is deprecated and will be removed in future versions; please use + instead. +*/ +class xajaxCall { + + /**#@+ + * @access protected + */ + + /* + String: sFunction + + Required: The name of the xajax enabled function to call + */ + var $sFunction; + + /* + String: sReturnValue + + Required: The value to return once the has + returned. (for asynchronous calls, this is immediate) + */ + var $sReturnValue; + + /* + Array: aParameters + + The associative array that will be used to store the parameters for this + call. + - key: The textual representation of the parameter. + - value: A boolean value indicating whether or not to use quotes around + this parameter. + */ + var $aParameters; + + /* + String: sMode + + The mode to use for the call + - 'synchronous' + - 'asynchronous' + */ + var $sMode; + + /* + String: sRequestType + + The request type that will be used for the call + - 'GET' + - 'POST' + */ + var $sRequestType; + + /* + String: sResponseProcessor + + The name of the javascript function that will be invoked + to handle the response. + */ + var $sResponseProcessor; + + /* + String: sRequestURI + + The URI for where this request will be sent. + */ + var $sRequestURI; + + /* + String: sContentType + + The content type to use for the request. + */ + var $sContentType; + + /* + Constructor: xajaxCall + + Initializes the xajaxCall object. + + Parameters: + + sFunction - (string): The name of the xajax enabled function + that will be invoked when this javascript code is executed + on the browser. This function name should match a PHP + function from your script. + */ + function xajaxCall($sFunction = '') { + $this->sFunction = $sFunction; + $this->aParameters = array(); + $this->sMode = ''; + $this->sRequestType = ''; + $this->sResponseProcessor = ''; + $this->sRequestURI = ''; + $this->sContentType = ''; + } + + /* + Function: setFunction + + Override the function name set in the constructor. + + Parameters: + + sFunction - (string): The name of the xajax enabled function + that will be invoked when this javascript code is executed + on the browser. This function name should match a PHP + function from your script. + + Returns: + + object : The object. + */ + function setFunction($sFunction) { + $this->sFunction = $sFunction; + return $this; + } + + /* + Function: clearParameters + + Clear the list of parameters being accumulated for this + call. + + Returns: + + object : The object. + */ + function clearParameters() { + $this->aParameters = array(); + } + + /* + Function: addParameter + + Adds a parameter to the list that will be specified for the + request generated by this object. + + Parameters: + + sParameter - (string): The parameter value or name. + bUseQuotes - (boolean): Whether or not to put quotes around this value. + + If you specify the name of a javascript variable, or provide a javascript + function call as a parameter, do not use quotes around the value. + + Returns: + + object : The object. + */ + function addParameter($sParameter, $bUseQuotes = true) { + $this->aParameters[] = array($sParameter, $bUseQuotes); + return $this; + } + + /* + Function: addFormValuesParameter + + Add a parameter value that is the result of calling + for the specified form. + + Parameters: + + sFormID - (string): The id of the form for which you wish to return + the input values. + + Returns: + + object : The object. + */ + function addFormValuesParameter($sFormID) { + $this->aParameters[] = array('xajax.getFormValues("'.$sFormID.'")'); + return $this; + } + + /* + Function: setMode + + Sets the mode that will be specified for this + + Parameters: + + $sMode - (string): The mode to be set. + - 'synchronous' + - 'asynchronous' + + Returns: + + object : The object. + */ + function setMode($sMode) { + $this->sMode = $sMode; + return $this; + } + + /* + Function: setRequestType + + Sets the request type which will be specified for the + generated . + + Parameters: + + - 'GET' + - 'POST' + + Returns: + + object : The object. + */ + function setRequestType($sRequestType) { + $this->sRequestType = $sRequestType; + return $this; + } + + /* + Function: setResponseProcessor + + Sets the name of the javascript function that will be used + to process this response. This is an advanced function, use + with caution. + + Parameters: + + Returns: + + object : The object. + */ + function setResponseProcessor($sResponseProcessor) { + $this->sResponseProcessor = $sResponseProcessor; + return $this; + } + + /* + Function: setRequestURI + + Override the default URI with the specified one. + + Parameters: + + sRequestURI - (string): The URI that the generated request will be sent + to. + + Returns: + + object : The object. + */ + function setRequestURI($sRequestURI) { + $this->sRequestURI = $sRequestURI; + return $this; + } + + /* + Function: setContentType + + Sets the content type that will be used by the generated request. + + Parameters: + + Returns: + + object : The object. + */ + function setContentType($sContentType) { + $this->sContentType = $sContentType; + } + + /* + Function: setReturnValue + + Sets the value that will be returned after the generated call. + Set to an empty string if no return value is desired. + + Parameters: + + Returns: + + object : The object. + */ + function setReturnValue($sReturnValue) { + $this->sReturnValue = $sReturnValue; + } + + /* + Function: generate + + Construct a statement in javascript that can be used + to make a xajax request with the parameters and settings previously + configured for this object. + + The output from this function can be used as an event handler in your + javascript code. + + Returns: + + string - The javascript statement that will invoked the + function on the browser, causing a xajax request to be sent to + the server. + */ + function generate() { + $output = 'xajax.call("'; + $output .= $this->sFunction; + $output .= '", {'; + $separator = ''; + if (0 < count($this->aParameters)) { + $output .= 'parameters: ['; + foreach ($this->aParameters as $aParameter) { + $output .= $separator; + $bUseQuotes = $aParameter[1]; + if ($bUseQuotes) + $output .= '"'; + $output .= $aParameter[0]; + if ($bUseQuotes) + $output .= '"'; + $separator = ','; + } + $output .= ']'; + } + if (0 < strlen($this->sMode)) { + $output .= $separator; + $output .= 'mode:"'; + $output .= $this->sMode; + $output .= '"'; + $separator = ','; + } + if (0 < strlen($this->sRequestType)) { + $output .= $separator; + $output .= 'requestType:"'; + $output .= $this->sRequestType; + $output .= '"'; + $separator = ','; + } + if (0 < strlen($this->sResponseProcessor)) { + $output .= $separator; + $output .= 'responseProcessor:'; + $output .= $this->sResponseProcessor; + $separator = ','; + } + if (0 < strlen($this->sRequestURI)) { + $output .= $separator; + $output .= 'requestURI:"'; + $output .= $this->sRequestURI; + $output .= '"'; + $separator = ','; + } + if (0 < strlen($this->sContentType)) { + $output .= $separator; + $output .= 'contentType:"'; + $output .= $this->sContentType; + $output .= '"'; + $separator = ','; + } + $output .= '}); '; + if (0 < strlen($this->sReturnValue)) { + $output .= 'return '; + $output .= $this->sReturnValue; + } else { + $output .= 'return false;'; + } + + return $output; + } +} diff --git a/phpgwapi/inc/xajax/xajax_core/xajaxCompress.inc.php b/phpgwapi/inc/xajax/xajax_core/xajaxCompress.inc.php new file mode 100644 index 0000000000..5f68cd98aa --- /dev/null +++ b/phpgwapi/inc/xajax/xajax_core/xajaxCompress.inc.php @@ -0,0 +1,148 @@ + will call this function internally to compress the javascript code for + more efficient delivery. + + Parameters: + + $sFile - (stirng): The file to be compressed. +*/ +function xajaxCompressFile($sFile) +{ + //remove windows cariage returns + $sFile = str_replace("\r",'',$sFile); + + //array to store replaced literal strings + $literal_strings = array(); + + //explode the string into lines + $lines = explode("\n",$sFile); + //loop through all the lines, building a new string at the same time as removing literal strings + $clean = ''; + $inComment = false; + $literal = ''; + $inQuote = false; + $escaped = false; + $quoteChar = ''; + + $iLen = count($lines); + for($i=0; $i<$iLen; ++$i) + { + $line = $lines[$i]; + $inNormalComment = false; + + //loop through line's characters and take out any literal strings, replace them with ___i___ where i is the index of this string + $jLen = strlen($line); + for($j=0; $j<$jLen; ++$j) + { + $c = substr($line,$j,1); + $d = substr($line,$j,2); + + //look for start of quote + if(!$inQuote && !$inComment) + { + //is this character a quote or a comment + if(($c=='"' || $c=="'") && !$inComment && !$inNormalComment) + { + $inQuote = true; + $inComment = false; + $escaped = false; + $quoteChar = $c; + $literal = $c; + } + else if($d=="/*" && !$inNormalComment) + { + $inQuote = false; + $inComment = true; + $escaped = false; + $quoteChar = $d; + $literal = $d; + $j++; + } + else if($d=="//") //ignore string markers that are found inside comments + { + $inNormalComment = true; + } + else + { + if (!$inNormalComment) + $clean .= $c; + } + } + else //allready in a string so find end quote + { + if($c == $quoteChar && !$escaped && !$inComment) + { + $inQuote = false; + $literal .= $c; + + //subsitute in a marker for the string + $clean .= "___" . count($literal_strings) . "___"; + + //push the string onto our array + array_push($literal_strings,$literal); + + } + else if($inComment && $d=="*/") + { + $inComment = false; + $literal .= $d; + ++$j; + } + else if($c == "\\" && !$escaped) + $escaped = true; + else + $escaped = false; + + $literal .= $c; + } + } + if($inComment) $literal .= "\n"; + $clean .= "\n"; + } + //explode the clean string into lines again + $lines = explode("\n",$clean); + + //now process each line at a time + $iLen = count($lines); + for($i=0; $i<$iLen; ++$i) + { + $line = $lines[$i]; + + //remove comments + $line = preg_replace("/\/\/(.*)/","",$line); + + //strip leading and trailing whitespace + $line = trim($line); + + //remove all whitespace with a single space + $line = preg_replace("/\s+/"," ",$line); + + //remove any whitespace that occurs after/before an operator + $line = preg_replace("/\s*([!\}\{;,&=\|\-\+\*\/\)\(:])\s*/","\\1",$line); + + $lines[$i] = $line; + } + + //implode the lines + $sFile = implode("\n",$lines); + + //make sure there is a max of 1 \n after each line + $sFile = preg_replace("/[\n]+/","\n",$sFile); + + //strip out line breaks that immediately follow a semi-colon + $sFile = preg_replace("/;\n/",";",$sFile); + + //curly brackets aren't on their own + $sFile = preg_replace("/[\n]*\{[\n]*/","{",$sFile); + + //finally loop through and replace all the literal strings: + $iLen = count($literal_strings); + for($i=0; $i<$iLen; ++$i) + $sFile = str_replace('___'.$i.'___',$literal_strings[$i],$sFile); + + return $sFile; +} diff --git a/phpgwapi/inc/xajax/xajax_core/xajaxControl.inc.php b/phpgwapi/inc/xajax/xajax_core/xajaxControl.inc.php new file mode 100644 index 0000000000..4e413a1709 --- /dev/null +++ b/phpgwapi/inc/xajax/xajax_core/xajaxControl.inc.php @@ -0,0 +1,682 @@ + for a detailed description, copyright + and license information. +*/ + +/* + @package xajax + @version $Id: xajaxControl.inc.php 362 2007-05-29 15:32:24Z calltoconstruct $ + @copyright Copyright (c) 2005-2007 by Jared White & J. Max Wilson + @copyright Copyright (c) 2008-2009 by Joseph Woolley, Steffen Konerow, Jared White & J. Max Wilson + @license http://www.xajaxproject.org/bsd_license.txt BSD License +*/ + +/* + Constant: XAJAX_HTML_CONTROL_DOCTYPE_FORMAT + + Defines the doctype of the current document; this will effect how the HTML is formatted + when the html control library is used to construct html documents and fragments. This can + be one of the following values: + + 'XHTML' - (default) Typical effects are that certain elements are closed with '/>' + 'HTML' - Typical differences are that closing tags for certain elements cannot be '/>' +*/ +if (false == defined('XAJAX_HTML_CONTROL_DOCTYPE_FORMAT')) define('XAJAX_HTML_CONTROL_DOCTYPE_FORMAT', 'XHTML'); + +/* + Constant: XAJAX_HTML_CONTROL_DOCTYPE_VERSION +*/ +if (false == defined('XAJAX_HTML_CONTROL_DOCTYPE_VERSION')) define('XAJAX_HTML_CONTROL_DOCTYPE_VERSION', '1.0'); + +/* + Constant: XAJAX_HTML_CONTROL_DOCTYPE_VALIDATION +*/ +if (false == defined('XAJAX_HTML_CONTROL_DOCTYPE_VALIDATION')) define('XAJAX_HTML_CONTROL_DOCTYPE_VALIDATION', 'TRANSITIONAL'); + +/* + Class: xajaxControl + + The base class for all xajax enabled controls. Derived classes will generate the + HTML and javascript code that will be sent to the browser via printHTML> + or sent to the browser in a via getHTML>. +*/ +class xajaxControl +{ + /* + String: sTag + */ + var $sTag; + + /* + Boolean: sEndTag + + 'required' - (default) Indicates the control must have a full end tag + 'optional' - The control may have an abbr. begin tag or a full end tag + 'forbidden' - The control must have an abbr. begin tag and no end tag + */ + var $sEndTag; + + /* + Array: aAttributes + + An associative array of attributes that will be used in the generation + of the HMTL code for this control. + */ + var $aAttributes; + + /* + Array: aEvents + + An associative array of events that will be assigned to this control. Each + event declaration will include a reference to a object; it's + script will be extracted using printScript> or + getScript>. + */ + var $aEvents; + + /* + String: sClass + + Contains a declaration of the class of this control. %inline controls do not + need to be indented, %block controls should be indented. + */ + var $sClass; + + /* + Function: xajaxControl + + Parameters: + + $aConfiguration - (array): An associative array that contains a variety + of configuration options for this object. + + Note: + This array may contain the following entries: + + 'attributes' - (array): An associative array containing attributes + that will be passed to the setAttribute> function. + + 'children' - (array): An array of derived objects that + will be the children of this control. + */ + function xajaxControl($sTag, $aConfiguration=array()) + { + $this->sTag = $sTag; + + $this->clearAttributes(); + + if (isset($aConfiguration['attributes'])) + if (is_array($aConfiguration['attributes'])) + foreach ($aConfiguration['attributes'] as $sKey => $sValue) + $this->setAttribute($sKey, $sValue); + + $this->clearEvents(); + + if (isset($aConfiguration['event'])) + call_user_func_array(array(&$this, 'setEvent'), $aConfiguration['event']); + + else if (isset($aConfiguration['events'])) + if (is_array($aConfiguration['events'])) + foreach ($aConfiguration['events'] as $aEvent) + call_user_func_array(array(&$this, 'setEvent'), $aEvent); + + $this->sClass = '%block'; + $this->sEndTag = 'forbidden'; + } + + /* + Function: getClass + + Returns the *adjusted* class of the element + */ + function getClass() + { + return $this->sClass; + } + + /* + Function: clearAttributes + + Removes all attributes assigned to this control. + */ + function clearAttributes() + { + $this->aAttributes = array(); + } + + /* + Function: setAttribute + + Call to set various control specific attributes to be included in the HTML + script that is returned when printHTML> or getHTML> + is called. + + Parameters: + $sName - (string): The attribute name to set the value. + $sValue - (string): The value to be set. + */ + function setAttribute($sName, $sValue) + { +//SkipDebug + if (class_exists('clsValidator')) + { + $objValidator =& clsValidator::getInstance(); + if (false == $objValidator->attributeValid($this->sTag, $sName)) { + $objLanguageManager =& xajaxLanguageManager::getInstance(); + trigger_error( + $objLanguageManager->getText('XJXCTL:IAERR:01') + . $sName + . $objLanguageManager->getText('XJXCTL:IAERR:02') + . $this->sTag + . $objLanguageManager->getText('XJXCTL:IAERR:03') + , E_USER_ERROR + ); + } + } +//EndSkipDebug + + $this->aAttributes[$sName] = $sValue; + } + + /* + Function: getAttribute + + Call to obtain the value currently associated with the specified attribute + if set. + + Parameters: + + sName - (string): The name of the attribute to be returned. + + Returns: + + mixed : The value associated with the attribute, or null. + */ + function getAttribute($sName) + { + if (false == isset($this->aAttributes[$sName])) + return null; + + return $this->aAttributes[$sName]; + } + + /* + Function: clearEvents + + Clear the events that have been associated with this object. + */ + function clearEvents() + { + $this->aEvents = array(); + } + + /* + Function: setEvent + + Call this function to assign a object as the handler for + the specific DOM event. The printScript> function will + be called to generate the javascript for this request. + + Parameters: + + sEvent - (string): A string containing the name of the event to be assigned. + objRequest - (xajaxRequest object): The object to be associated + with the specified event. + aParameters - (array, optional): An array containing parameter declarations + that will be passed to this object just before the javascript + is generated. + sBeforeRequest - (string, optional): a string containing a snippet of javascript code + to execute prior to calling the xajaxRequest function + sAfterRequest - (string, optional): a string containing a snippet of javascript code + to execute after calling the xajaxRequest function + */ + function setEvent($sEvent, &$objRequest, $aParameters=array(), $sBeforeRequest='', $sAfterRequest='; return false;') + { +//SkipDebug + if (false == is_a($objRequest, 'xajaxRequest')) { + $objLanguageManager =& xajaxLanguageManager::getInstance(); + trigger_error( + $objLanguageManager->getText('XJXCTL:IRERR:01') + . $this->backtrace() + , E_USER_ERROR + ); + } + + if (class_exists('clsValidator')) { + $objValidator =& clsValidator::getInstance(); + if (false == $objValidator->attributeValid($this->sTag, $sEvent)) { + $objLanguageManager =& xajaxLanguageManager::getInstance(); + trigger_error( + $objLanguageManager->getText('XJXCTL:IEERR:01') + . $sEvent + . $objLanguageManager->getText('XJXCTL:IEERR:02') + . $this->sTag + . $objLanguageManager->getText('XJXCTL:IEERR:03') + , E_USER_ERROR + ); + } + } +//EndSkipDebug + + $this->aEvents[$sEvent] = array( + &$objRequest, + $aParameters, + $sBeforeRequest, + $sAfterRequest + ); + } + + /* + Function: getHTML + + Generates and returns the HTML representation of this control and + it's children. + + Returns: + + string : The HTML representation of this control. + */ + function getHTML($bFormat=false) + { + ob_start(); + if ($bFormat) + $this->printHTML(); + else + $this->printHTML(false); + return ob_get_clean(); + } + + /* + Function: printHTML + + Generates and prints the HTML representation of this control and + it's children. + + Returns: + + string : The HTML representation of this control. + */ + function printHTML($sIndent='') + { +//SkipDebug + if (class_exists('clsValidator')) + { + $objValidator =& clsValidator::getInstance(); + $sMissing = ''; + if (false == $objValidator->checkRequiredAttributes($this->sTag, $this->aAttributes, $sMissing)) { + $objLanguageManager =& xajaxLanguageManager::getInstance(); + trigger_error( + $objLanguageManager->getText('XJXCTL:MAERR:01') + . $sMissing + . $objLanguageManager->getText('XJXCTL:MAERR:02') + . $this->sTag + . $objLanguageManager->getText('XJXCTL:MAERR:03') + , E_USER_ERROR + ); + } + } +//EndSkipDebug + + $sClass = $this->getClass(); + + if ('%inline' != $sClass) + // this odd syntax is necessary to detect request for no formatting + if (false === (false === $sIndent)) + echo $sIndent; + + echo '<'; + echo $this->sTag; + echo ' '; + $this->_printAttributes(); + $this->_printEvents(); + + if ('forbidden' == $this->sEndTag) + { + if ('HTML' == XAJAX_HTML_CONTROL_DOCTYPE_FORMAT) + echo '>'; + else if ('XHTML' == XAJAX_HTML_CONTROL_DOCTYPE_FORMAT) + echo '/>'; + + if ('%inline' != $sClass) + // this odd syntax is necessary to detect request for no formatting + if (false === (false === $sIndent)) + echo "\n"; + + return; + } + else if ('optional' == $this->sEndTag) + { + echo '/>'; + + if ('%inline' == $sClass) + // this odd syntax is necessary to detect request for no formatting + if (false === (false === $sIndent)) + echo "\n"; + + return; + } +//SkipDebug + else + { + $objLanguageManager =& xajaxLanguageManager::getInstance(); + trigger_error( + $objLanguageManager->getText('XJXCTL:IETERR:01') + . $this->backtrace() + , E_USER_ERROR + ); + } +//EndSkipDebug + } + + function _printAttributes() + { + // NOTE: Special case here: disabled='false' does not work in HTML; does work in javascript + foreach ($this->aAttributes as $sKey => $sValue) + if ('disabled' != $sKey || 'false' != $sValue) + echo "{$sKey}='{$sValue}' "; + } + + function _printEvents() + { + foreach (array_keys($this->aEvents) as $sKey) + { + $aEvent =& $this->aEvents[$sKey]; + $objRequest =& $aEvent[0]; + $aParameters = $aEvent[1]; + $sBeforeRequest = $aEvent[2]; + $sAfterRequest = $aEvent[3]; + + foreach ($aParameters as $aParameter) + { + $nParameter = $aParameter[0]; + $sType = $aParameter[1]; + $sValue = $aParameter[2]; + $objRequest->setParameter($nParameter, $sType, $sValue); + } + + $objRequest->useDoubleQuote(); + + echo "{$sKey}='{$sBeforeRequest}"; + + $objRequest->printScript(); + + echo "{$sAfterRequest}' "; + } + } + + function backtrace() + { + // debug_backtrace was added to php in version 4.3.0 + // version_compare was added to php in version 4.0.7 + if (0 <= version_compare(PHP_VERSION, '4.3.0')) + return '
Backtrace:
' 
+				. print_r(debug_backtrace(), true) 
+				. '
'; + return ''; + } +} + +/* + Class: xajaxControlContainer + + This class is used as the base class for controls that will contain + other child controls. +*/ +class xajaxControlContainer extends xajaxControl +{ + /* + Array: aChildren + + An array of child controls. + */ + var $aChildren; + + /* + Boolean: sChildClass + + Will contain '%inline' if all children are class = '%inline', '%block' if all children are '%block' or + '%flow' if both '%inline' and '%block' elements are detected. + */ + var $sChildClass; + + /* + Function: xajaxControlContainer + + Called to construct and configure this control. + + Parameters: + + aConfiguration - (array): See xajaxControl> for more + information. + */ + function xajaxControlContainer($sTag, $aConfiguration=array()) + { + xajaxControl::xajaxControl($sTag, $aConfiguration); + + $this->clearChildren(); + + if (isset($aConfiguration['child'])) + $this->addChild($aConfiguration['child']); + + else if (isset($aConfiguration['children'])) + $this->addChildren($aConfiguration['children']); + + $this->sEndTag = 'required'; + } + + /* + Function: getClass + + Returns the *adjusted* class of the element + */ + function getClass() + { + $sClass = xajaxControl::getClass(); + + if (0 < count($this->aChildren) && '%flow' == $sClass) + return $this->getContentClass(); + else if (0 == count($this->aChildren) || '%inline' == $sClass || '%block' == $sClass) + return $sClass; + + $objLanguageManager =& xajaxLanguageManager::getInstance(); + trigger_error( + $objLanguageManager->getText('XJXCTL:ICERR:01') + . $this->backtrace() + , E_USER_ERROR + ); + } + + /* + Function: getContentClass + + Returns the *adjusted* class of the content (children) of this element + */ + function getContentClass() + { + $sClass = ''; + + foreach (array_keys($this->aChildren) as $sKey) + { + if ('' == $sClass) + $sClass = $this->aChildren[$sKey]->getClass(); + else if ($sClass != $this->aChildren[$sKey]->getClass()) + return '%flow'; + } + + if ('' == $sClass) + return '%inline'; + + return $sClass; + } + + /* + Function: clearChildren + + Clears the list of child controls associated with this control. + */ + function clearChildren() + { + $this->sChildClass = '%inline'; + $this->aChildren = array(); + } + + /* + Function: addChild + + Adds a control to the array of child controls. Child controls + must be derived from . + */ + function addChild(&$objControl) + { +//SkipDebug + if (false == is_a($objControl, 'xajaxControl')) { + $objLanguageManager =& xajaxLanguageManager::getInstance(); + trigger_error( + $objLanguageManager->getText('XJXCTL:ICLERR:01') + . $this->backtrace() + , E_USER_ERROR + ); + } + + if (class_exists('clsValidator')) + { + $objValidator =& clsValidator::getInstance(); + if (false == $objValidator->childValid($this->sTag, $objControl->sTag)) { + $objLanguageManager =& xajaxLanguageManager::getInstance(); + trigger_error( + $objLanguageManager->getText('XJXCTL:ICLERR:02') + . $objControl->sTag + . $objLanguageManager->getText('XJXCTL:ICLERR:03') + . $this->sTag + . $objLanguageManager->getText('XJXCTL:ICLERR:04') + . $this->backtrace() + , E_USER_ERROR + ); + } + } +//EndSkipDebug + + $this->aChildren[] =& $objControl; + } + + function addChildren(&$aChildren) + { +//SkipDebug + if (false == is_array($aChildren)) { + $objLanguageManager =& xajaxLanguageManager::getInstance(); + trigger_error( + $objLanguageManager->getText('XJXCTL:ICHERR:01') + . $this->backtrace() + , E_USER_ERROR + ); + } +//EndSkipDebug + + foreach (array_keys($aChildren) as $sKey) + $this->addChild($aChildren[$sKey]); + } + + function printHTML($sIndent='') + { +//SkipDebug + if (class_exists('clsValidator')) + { + $objValidator =& clsValidator::getInstance(); + $sMissing = ''; + if (false == $objValidator->checkRequiredAttributes($this->sTag, $this->aAttributes, $sMissing)) { + $objLanguageManager =& xajaxLanguageManager::getInstance(); + trigger_error( + $objLanguageManager->getText('XJXCTL:MRAERR:01') + . $sMissing + . $objLanguageManager->getText('XJXCTL:MRAERR:02') + . $this->sTag + . $objLanguageManager->getText('XJXCTL:MRAERR:03') + , E_USER_ERROR + ); + } + } +//EndSkipDebug + + $sClass = $this->getClass(); + + if ('%inline' != $sClass) + // this odd syntax is necessary to detect request for no formatting + if (false === (false === $sIndent)) + echo $sIndent; + + echo '<'; + echo $this->sTag; + echo ' '; + $this->_printAttributes(); + $this->_printEvents(); + + if (0 == count($this->aChildren)) + { + if ('optional' == $this->sEndTag) + { + echo '/>'; + + if ('%inline' != $sClass) + // this odd syntax is necessary to detect request for no formatting + if (false === (false === $sIndent)) + echo "\n"; + + return; + } +//SkipDebug + else if ('required' != $this->sEndTag) + trigger_error("Invalid end tag designation; should be optional or required.\n" + . $this->backtrace(), + E_USER_ERROR + ); +//EndSkipDebug + } + + echo '>'; + + $sContentClass = $this->getContentClass(); + + if ('%inline' != $sContentClass) + // this odd syntax is necessary to detect request for no formatting + if (false === (false === $sIndent)) + echo "\n"; + + $this->_printChildren($sIndent); + + if ('%inline' != $sContentClass) + // this odd syntax is necessary to detect request for no formatting + if (false === (false === $sIndent)) + echo $sIndent; + + echo '<' . '/'; + echo $this->sTag; + echo '>'; + + if ('%inline' != $sClass) + // this odd syntax is necessary to detect request for no formatting + if (false === (false === $sIndent)) + echo "\n"; + } + + function _printChildren($sIndent='') + { + if (false == is_a($this, 'clsDocument')) + // this odd syntax is necessary to detect request for no formatting + if (false === (false === $sIndent)) + $sIndent .= "\t"; + + // children + foreach (array_keys($this->aChildren) as $sKey) + { + $objChild =& $this->aChildren[$sKey]; + $objChild->printHTML($sIndent); + } + } +} diff --git a/phpgwapi/inc/xajax/xajax_core/xajaxLanguageManager.inc.php b/phpgwapi/inc/xajax/xajax_core/xajaxLanguageManager.inc.php new file mode 100644 index 0000000000..4e7390755d --- /dev/null +++ b/phpgwapi/inc/xajax/xajax_core/xajaxLanguageManager.inc.php @@ -0,0 +1,188 @@ + for a detailed description, copyright + and license information. +*/ + +/* + @package xajax + @version $Id: xajaxLanguageManager.inc.php 362 2007-05-29 15:32:24Z calltoconstruct $ + @copyright Copyright (c) 2005-2007 by Jared White & J. Max Wilson + @copyright Copyright (c) 2008-2009 by Joseph Woolley, Steffen Konerow, Jared White & J. Max Wilson + @license http://www.xajaxproject.org/bsd_license.txt BSD License +*/ + +/* + Class: xajaxLanguageManager + + This class contains the default language (english) and the code used to supply + debug and error messages upon request; as well as the code used to load alternate + language text as requested via the function. +*/ +class xajaxLanguageManager +{ + /* + Array: aMessages + + An array of the currently registered languages. + */ + var $aMessages; + + /* + String: sLanguage + + The currently configured language. + */ + var $sLanguage; + + /* + Function: xajaxLanguageManager + + Construct and initialize the one and only xajax language manager object. + */ + function xajaxLanguageManager() + { + $this->aMessages = array(); + + $this->aMessages['en'] = array( + 'LOGHDR:01' => '** xajax Error Log - ', + 'LOGHDR:02' => " **\n", + 'LOGHDR:03' => "\n\n\n", + 'LOGERR:01' => "** Logging Error **\n\nxajax was unable to write to the error log file:\n", + 'LOGMSG:01' => "** PHP Error Messages: **", + 'CMPRSJS:RDERR:01' => 'The xajax uncompressed Javascript file could not be found in the ', + 'CMPRSJS:RDERR:02' => ' folder. Error ', + 'CMPRSJS:WTERR:01' => 'The xajax compressed javascript file could not be written in the ', + 'CMPRSJS:WTERR:02' => ' folder. Error ', + 'CMPRSPHP:WTERR:01' => 'The xajax compressed file ', + 'CMPRSPHP:WTERR:02' => ' could not be written to. Error ', + 'CMPRSAIO:WTERR:01' => 'The xajax compressed file ', + 'CMPRSAIO:WTERR:02' => '/xajaxAIO.inc.php could not be written to. Error ', + 'DTCTURI:01' => 'xajax Error: xajax failed to automatically identify your Request URI.', + 'DTCTURI:02' => 'Please set the Request URI explicitly when you instantiate the xajax object.', + 'ARGMGR:ERR:01' => 'Malformed object argument received: ', + 'ARGMGR:ERR:02' => ' <==> ', + 'ARGMGR:ERR:03' => 'The incoming xajax data could not be converted from UTF-8', + 'XJXCTL:IAERR:01' => 'Invalid attribute [', + 'XJXCTL:IAERR:02' => '] for element [', + 'XJXCTL:IAERR:03' => '].', + 'XJXCTL:IRERR:01' => 'Invalid request object passed to xajaxControl::setEvent', + 'XJXCTL:IEERR:01' => 'Invalid attribute (event name) [', + 'XJXCTL:IEERR:02' => '] for element [', + 'XJXCTL:IEERR:03' => '].', + 'XJXCTL:MAERR:01' => 'Missing required attribute [', + 'XJXCTL:MAERR:02' => '] for element [', + 'XJXCTL:MAERR:03' => '].', + 'XJXCTL:IETERR:01' => "Invalid end tag designation; should be forbidden or optional.\n", + 'XJXCTL:ICERR:01' => "Invalid class specified for html control; should be %inline, %block or %flow.\n", + 'XJXCTL:ICLERR:01' => 'Invalid control passed to addChild; should be derived from xajaxControl.', + 'XJXCTL:ICLERR:02' => 'Invalid control passed to addChild [', + 'XJXCTL:ICLERR:03' => '] for element [', + 'XJXCTL:ICLERR:04' => "].\n", + 'XJXCTL:ICHERR:01' => 'Invalid parameter passed to xajaxControl::addChildren; should be array of xajaxControl objects', + 'XJXCTL:MRAERR:01' => 'Missing required attribute [', + 'XJXCTL:MRAERR:02' => '] for element [', + 'XJXCTL:MRAERR:03' => '].', + 'XJXPLG:GNERR:01' => 'Response plugin should override the getName function.', + 'XJXPLG:PERR:01' => 'Response plugin should override the process function.', + 'XJXPM:IPLGERR:01' => 'Attempt to register invalid plugin: ', + 'XJXPM:IPLGERR:02' => ' should be derived from xajaxRequestPlugin or xajaxResponsePlugin.', + 'XJXPM:MRMERR:01' => 'Failed to locate registration method for the following: ', + 'XJXRSP:EDERR:01' => 'Passing character encoding to the xajaxResponse constructor is deprecated, instead use $xajax->configure("characterEncoding", ...);', + 'XJXRSP:MPERR:01' => 'Invalid or missing plugin name detected in call to xajaxResponse::plugin', + 'XJXRSP:CPERR:01' => "The \$sType parameter of addCreate has been deprecated. Use the addCreateInput() method instead.", + 'XJXRSP:LCERR:01' => "The xajax response object could not load commands as the data provided was not a valid array.", + 'XJXRSP:AKERR:01' => 'Invalid tag name encoded in array.', + 'XJXRSP:IEAERR:01' => 'Improperly encoded array.', + 'XJXRSP:NEAERR:01' => 'Non-encoded array detected.', + 'XJXRSP:MBEERR:01' => 'The xajax response output could not be converted to HTML entities because the mb_convert_encoding function is not available', + 'XJXRSP:MXRTERR' => 'Error: Cannot mix types in a single response.', + 'XJXRSP:MXCTERR' => 'Error: Cannot mix content types in a single response.', + 'XJXRSP:MXCEERR' => 'Error: Cannot mix character encodings in a single response.', + 'XJXRSP:MXOEERR' => 'Error: Cannot mix output entities (true/false) in a single response.', + 'XJXRM:IRERR' => 'An invalid response was returned while processing this request.', + 'XJXRM:MXRTERR' => 'Error: You cannot mix response types while processing a single request: ' + ); + + $this->sLanguage = 'en'; + } + + /* + Function: getInstance + + Implements the singleton pattern: provides a single instance of the xajax + language manager object to all object which request it. + */ + function &getInstance() + { + static $obj; + if (!$obj) { + $obj = new xajaxLanguageManager(); + } + return $obj; + } + + /* + Function: configure + + Called by the main xajax object as configuration options are set. See also: + . The tracks the following configuration + options. + Parameters: + + - language (string, default 'en'): The currently selected language. + */ + function configure($sName, $mValue) + { + if ('language' == $sName) { + if ($mValue !== $this->sLanguage) { + $sFolder = dirname(__FILE__); + @include $sFolder . '/xajax_lang_' . $mValue . '.inc.php'; + // require $sFolder . '/xajax_lang_' . $mValue . '.inc.php'; + $this->sLanguage = $mValue; + } + } + } + + /* + Function: register + + Called to register an array of alternate language messages. + + Parameters: + + sLanguage - (string): the character code which represents the language being registered. + aMessages - (array): the array of translated debug and error messages + */ + function register($sLanguage, $aMessages) { + $this->aMessages[$sLanguage] = $aMessages; + } + + /* + Function: getText + + Called by the main xajax object and other objects during the initial page generation + or request processing phase to obtain language specific debug and error messages. + + sMessage - (string): A code indicating the message text being requested. + */ + function getText($sMessage) + { + if (isset($this->aMessages[$this->sLanguage])) + if (isset($this->aMessages[$this->sLanguage][$sMessage])) + return $this->aMessages[$this->sLanguage][$sMessage]; + + return '(Unknown language or message identifier)' + . $this->sLanguage + . '::' + . $sMessage; + } +} diff --git a/phpgwapi/inc/xajax/xajax_core/xajaxPlugin.inc.php b/phpgwapi/inc/xajax/xajax_core/xajaxPlugin.inc.php new file mode 100644 index 0000000000..b0209db267 --- /dev/null +++ b/phpgwapi/inc/xajax/xajax_core/xajaxPlugin.inc.php @@ -0,0 +1,191 @@ + for a detailed description, copyright + and license information. +*/ + +/* + @package xajax + @version $Id: xajaxPlugin.inc.php 362 2007-05-29 15:32:24Z calltoconstruct $ + @copyright Copyright (c) 2005-2007 by Jared White & J. Max Wilson + @copyright Copyright (c) 2008-2009 by Joseph Woolley, Steffen Konerow, Jared White & J. Max Wilson + @license http://www.xajaxproject.org/bsd_license.txt BSD License +*/ + +/* + Class: xajaxPlugin + + The base class for all xajax plugins. +*/ +class xajaxPlugin +{ +} + +/* + Class: xajaxRequestPlugin + + The base class for all xajax request plugins. + + Request plugins handle the registration, client script generation and processing of + xajax enabled requests. Each plugin should have a unique signature for both + the registration and processing of requests. During registration, the user will + specify a type which will allow the plugin to detect and handle it. During client + script generation, the plugin will generate a stub with the + prescribed call options and request signature. During request processing, the + plugin will detect the signature generated previously and process the request + accordingly. +*/ +class xajaxRequestPlugin extends xajaxPlugin +{ + /* + Function: configure + + Called by the when a configuration setting is changing. + Plugins should store a local copy of the settings they wish to use during + registration, client script generation or request processing. + */ + function configure($sName, $mValue) + { + } + + /* + Function: register + + Called by the when a user script when a function, event + or callable object is to be registered. Additional plugins may support other + registration types. + */ + function register($aArgs) + { + return false; + } + + /* + Function: generateClientScript + + Called by when the page's HTML is being sent to the browser. + This allows each plugin to inject some script / style or other appropriate tags + into the HEAD of the document. Each block must be appropriately enclosed, meaning + javascript code must be enclosed in SCRIPT and /SCRIPT tags. + */ + function generateClientScript() + { + } + + /* + Function: canProcessRequest + + Called by the when a request has been received to determine + if the request is for a xajax enabled function or for the initial page load. + */ + function canProcessRequest() + { + return false; + } + + /* + Function: processRequest + + Called by the when a request is being processed. This + will only occur when has determined that the current request is a valid + (registered) xajax enabled function via canProcessRequest>. + + Returns: + false + */ + function processRequest() + { + return false; + } +} + +/* + Class: xajaxResponsePlugin + + Base class for all xajax response plugins. + + A response plugin provides additional services not already provided by the + class with regard to sending response commands to the + client. In addition, a response command may send javascript to the browser + at page load to aid in the processing of it's response commands. +*/ +class xajaxResponsePlugin extends xajaxPlugin +{ + /* + Object: objResponse + + A reference to the current object that is being used + to build the response that will be sent to the client browser. + */ + var $objResponse; + + /* + Function: setResponse + + Called by the object that is currently being used + to build the response that will be sent to the client browser. + + Parameters: + + objResponse - (object): A reference to the object + */ + function setResponse(&$objResponse) + { + $this->objResponse =& $objResponse; + } + + /* + Function: addCommand + + Used internally to add a command to the response command list. This + will call addPluginCommand> using the reference provided + in setResponse>. + */ + function addCommand($aAttributes, $sData) + { + $this->objResponse->addPluginCommand($this, $aAttributes, $sData); + } + + /* + Function: getName + + Called by the when the user script requests a plugin. + This name must match the plugin name requested in the called to + plugin>. + */ + function getName() + { +//SkipDebug + $objLanguageManager =& xajaxLanguageManager::getInstance(); + trigger_error( + $objLanguageManager->getText('XJXPLG:GNERR:01') + , E_USER_ERROR + ); +//EndSkipDebug + } + + /* + Function: process + + Called by when a user script requests the service of a + response plugin. The parameters provided by the user will be used to + determine which response command and parameters will be sent to the + client upon completion of the xajax request process. + */ + function process() + { +//SkipDebug + $objLanguageManager =& xajaxLanguageManager::getInstance(); + trigger_error( + $objLanguageManager->getText('XJXPLG:PERR:01') + , E_USER_ERROR + ); +//EndSkipDebug + } +} diff --git a/phpgwapi/inc/xajax/xajax_core/xajaxPluginManager.inc.php b/phpgwapi/inc/xajax/xajax_core/xajaxPluginManager.inc.php new file mode 100644 index 0000000000..f44db4c9db --- /dev/null +++ b/phpgwapi/inc/xajax/xajax_core/xajaxPluginManager.inc.php @@ -0,0 +1,344 @@ + for a detailed description, copyright + and license information. +*/ + +/* + @package xajax + @version $Id: xajaxPluginManager.inc.php 362 2007-05-29 15:32:24Z calltoconstruct $ + @copyright Copyright (c) 2005-2007 by Jared White & J. Max Wilson + @copyright Copyright (c) 2008-2009 by Joseph Woolley, Steffen Konerow, Jared White & J. Max Wilson + @license http://www.xajaxproject.org/bsd_license.txt BSD License +*/ + +//SkipAIO +require(dirname(__FILE__) . '/xajaxPlugin.inc.php'); +//EndSkipAIO + +/* + Class: xajaxPluginManager +*/ +class xajaxPluginManager +{ + /* + Array: aRequestPlugins + */ + var $aRequestPlugins; + + /* + Array: aResponsePlugins + */ + var $aResponsePlugins; + + /* + Array: aConfigurable + */ + var $aConfigurable; + + /* + Array: aRegistrars + */ + var $aRegistrars; + + /* + Array: aProcessors + */ + var $aProcessors; + + /* + Array: aClientScriptGenerators + */ + var $aClientScriptGenerators; + + /* + Function: xajaxPluginManager + + Construct and initialize the one and only xajax plugin manager. + */ + function xajaxPluginManager() + { + $this->aRequestPlugins = array(); + $this->aResponsePlugins = array(); + + $this->aConfigurable = array(); + $this->aRegistrars = array(); + $this->aProcessors = array(); + $this->aClientScriptGenerators = array(); + } + + /* + Function: getInstance + + Implementation of the singleton pattern: returns the one and only instance of the + xajax plugin manager. + + Returns: + + object : a reference to the one and only instance of the + plugin manager. + */ + function &getInstance() + { + static $obj; + if (!$obj) { + $obj = new xajaxPluginManager(); + } + return $obj; + } + + /* + Function: loadPlugins + + Loads plugins from the folders specified. + + Parameters: + $aFolders - (array): Array of folders to check for plugins + */ + function loadPlugins($aFolders) + { + foreach ($aFolders as $sFolder) { + if (is_dir($sFolder)) + if ($handle = opendir($sFolder)) { + while (!(false === ($sName = readdir($handle)))) { + $nLength = strlen($sName); + if (8 < $nLength) { + $sFileName = substr($sName, 0, $nLength - 8); + $sExtension = substr($sName, $nLength - 8, 8); + if ('.inc.php' == $sExtension) { + require $sFolder . '/' . $sFileName . $sExtension; + } + } + } + + closedir($handle); + } + } + } + + /* + Function: _insertIntoArray + + Inserts an entry into an array given the specified priority number. + If a plugin already exists with the given priority, the priority is + automatically incremented until a free spot is found. The plugin + is then inserted into the empty spot in the array. + + Parameters: + + $aPlugins - (array): Plugins array + $objPlugin - (object): A reference to an instance of a plugin. + $nPriority - (number): The desired priority, used to order + the plugins. + + */ + function _insertIntoArray(&$aPlugins, &$objPlugin, $nPriority) + { + while (isset($aPlugins[$nPriority])) + $nPriority++; + + $aPlugins[$nPriority] =& $objPlugin; + } + + /* + Function: registerPlugin + + Registers a plugin. + + Parameters: + + objPlugin - (object): A reference to an instance of a plugin. + + Note: + Below is a table for priorities and their description: + 0 thru 999: Plugins that are part of or extensions to the xajax core + 1000 thru 8999: User created plugins, typically, these plugins don't care about order + 9000 thru 9999: Plugins that generally need to be last or near the end of the plugin list + */ + function registerPlugin(&$objPlugin, $nPriority=1000) + { + if (is_a($objPlugin, 'xajaxRequestPlugin')) + { + $this->_insertIntoArray($this->aRequestPlugins, $objPlugin, $nPriority); + + if (method_exists($objPlugin, 'register')) + $this->_insertIntoArray($this->aRegistrars, $objPlugin, $nPriority); + + if (method_exists($objPlugin, 'canProcessRequest')) + if (method_exists($objPlugin, 'processRequest')) + $this->_insertIntoArray($this->aProcessors, $objPlugin, $nPriority); + } + else if (is_a($objPlugin, 'xajaxResponsePlugin')) + { + $this->aResponsePlugins[] =& $objPlugin; + } + else + { +//SkipDebug + $objLanguageManager =& xajaxLanguageManager::getInstance(); + trigger_error( + $objLanguageManager->getText('XJXPM:IPLGERR:01') + . get_class($objPlugin) + . $objLanguageManager->getText('XJXPM:IPLGERR:02') + , E_USER_ERROR + ); +//EndSkipDebug + } + + if (method_exists($objPlugin, 'configure')) + $this->_insertIntoArray($this->aConfigurable, $objPlugin, $nPriority); + + if (method_exists($objPlugin, 'generateClientScript')) + $this->_insertIntoArray($this->aClientScriptGenerators, $objPlugin, $nPriority); + } + + /* + Function: canProcessRequest + + Calls each of the request plugins and determines if the + current request can be processed by one of them. If no processor identifies + the current request, then the request must be for the initial page load. + + See canProcessRequest> for more information. + */ + function canProcessRequest() + { + $bHandled = false; + + $aKeys = array_keys($this->aProcessors); + sort($aKeys); + foreach ($aKeys as $sKey) { + $mResult = $this->aProcessors[$sKey]->canProcessRequest(); + if (true === $mResult) + $bHandled = true; + else if (is_string($mResult)) + return $mResult; + } + + return $bHandled; + } + + /* + Function: processRequest + + Calls each of the request plugins to request that they process the + current request. If the plugin processes the request, it will + return true. + */ + function processRequest() + { + $bHandled = false; + + $aKeys = array_keys($this->aProcessors); + sort($aKeys); + foreach ($aKeys as $sKey) { + $mResult = $this->aProcessors[$sKey]->processRequest(); + if (true === $mResult) + $bHandled = true; + else if (is_string($mResult)) + return $mResult; + } + + return $bHandled; + } + + /* + Function: configure + + Call each of the request plugins passing along the configuration + setting specified. + + Parameters: + + sName - (string): The name of the configuration setting to set. + mValue - (mixed): The value to be set. + */ + function configure($sName, $mValue) + { + $aKeys = array_keys($this->aConfigurable); + sort($aKeys); + foreach ($aKeys as $sKey) + $this->aConfigurable[$sKey]->configure($sName, $mValue); + } + + /* + Function: register + + Call each of the request plugins and give them the opportunity to + handle the registration of the specified function, event or callable object. + + Parameters: + $aArgs - (array) : + */ + function register($aArgs) + { + $aKeys = array_keys($this->aRegistrars); + sort($aKeys); + foreach ($aKeys as $sKey) + { + $objPlugin =& $this->aRegistrars[$sKey]; + $mResult =& $objPlugin->register($aArgs); + if (is_a($mResult, 'xajaxRequest')) + return $mResult; + if (is_array($mResult)) + return $mResult; + if (is_bool($mResult)) + if (true === $mResult) + return true; + } +//SkipDebug + $objLanguageManager =& xajaxLanguageManager::getInstance(); + trigger_error( + $objLanguageManager->getText('XJXPM:MRMERR:01') + . print_r($aArgs, true) + , E_USER_ERROR + ); +//EndSkipDebug + } + + /* + Function: generateClientScript + + Call each of the request and response plugins giving them the + opportunity to output some javascript to the page being generated. This + is called only when the page is being loaded initially. This is not + called when processing a request. + */ + function generateClientScript() + { + $aKeys = array_keys($this->aClientScriptGenerators); + sort($aKeys); + foreach ($aKeys as $sKey) + $this->aClientScriptGenerators[$sKey]->generateClientScript(); + } + + /* + Function: getPlugin + + Locate the specified response plugin by name and return + a reference to it if one exists. + + Parameters: + $sName - (string): Name of the plugin. + + Returns: + mixed : Returns plugin or false if not found. + */ + function &getPlugin($sName) + { + $aKeys = array_keys($this->aResponsePlugins); + sort($aKeys); + foreach ($aKeys as $sKey) + if (is_a($this->aResponsePlugins[$sKey], $sName)) + return $this->aResponsePlugins[$sKey]; + + $bFailure = false; + return $bFailure; + } +} diff --git a/phpgwapi/inc/xajax/xajax_core/xajaxRequest.inc.php b/phpgwapi/inc/xajax/xajax_core/xajaxRequest.inc.php new file mode 100644 index 0000000000..981d7577a9 --- /dev/null +++ b/phpgwapi/inc/xajax/xajax_core/xajaxRequest.inc.php @@ -0,0 +1,359 @@ + for a detailed description, copyright + and license information. +*/ + +/* + @package xajax + @version $Id: xajaxRequest.inc.php 362 2007-05-29 15:32:24Z calltoconstruct $ + @copyright Copyright (c) 2005-2007 by Jared White & J. Max Wilson + @copyright Copyright (c) 2008-2009 by Joseph Woolley, Steffen Konerow, Jared White & J. Max Wilson + @license http://www.xajaxproject.org/bsd_license.txt BSD License +*/ + +/* + Constant: XAJAX_FORM_VALUES + Specifies that the parameter will consist of an array of form values. +*/ +if (!defined ('XAJAX_FORM_VALUES')) define ('XAJAX_FORM_VALUES', 'get form values'); +/* + Constant: XAJAX_INPUT_VALUE + Specifies that the parameter will contain the value of an input control. +*/ +if (!defined ('XAJAX_INPUT_VALUE')) define ('XAJAX_INPUT_VALUE', 'get input value'); +/* + Constant: XAJAX_CHECKED_VALUE + Specifies that the parameter will consist of a boolean value of a checkbox. +*/ +if (!defined ('XAJAX_CHECKED_VALUE')) define ('XAJAX_CHECKED_VALUE', 'get checked value'); +/* + Constant: XAJAX_ELEMENT_INNERHTML + Specifies that the parameter value will be the innerHTML value of the element. +*/ +if (!defined ('XAJAX_ELEMENT_INNERHTML')) define ('XAJAX_ELEMENT_INNERHTML', 'get element innerHTML'); +/* + Constant: XAJAX_QUOTED_VALUE + Specifies that the parameter will be a quoted value (string). +*/ +if (!defined ('XAJAX_QUOTED_VALUE')) define ('XAJAX_QUOTED_VALUE', 'quoted value'); +/* + Constant: XAJAX_JS_VALUE + Specifies that the parameter will be a non-quoted value (evaluated by the + browsers javascript engine at run time. +*/ +if (!defined ('XAJAX_JS_VALUE')) define ('XAJAX_JS_VALUE', 'unquoted value'); + +/* + Class: xajaxRequest + + Used to store and generate the client script necessary to invoke + a xajax request from the browser to the server script. + + This object is typically generated by the register> method + and can be used to quickly generate the javascript that is used + to initiate a xajax request to the registered function, object, event + or other xajax call. +*/ +class xajaxRequest +{ + /* + String: sName + + The name of the function. + */ + var $sName; + + /* + String: sQuoteCharacter + + A string containing either a single or a double quote character + that will be used during the generation of the javascript for + this function. This can be set prior to calling printScript> + */ + var $sQuoteCharacter; + + /* + Array: aParameters + + An array of parameters that will be used to populate the argument list + for this function when the javascript is output in printScript> + */ + var $aParameters; + + /* + Function: xajaxRequest + + Construct and initialize this request. + + sName - (string): The name of this request. + */ + function xajaxRequest($sName) + { + $this->aParameters = array(); + $this->sQuoteCharacter = '"'; + $this->sName = $sName; + } + + /* + Function: useSingleQuote + + Call this to instruct the request to use single quotes when generating + the javascript. + */ + function useSingleQuote() + { + $this->sQuoteCharacter = "'"; + } + + /* + Function: useDoubleQuote + + Call this to instruct the request to use double quotes while generating + the javascript. + */ + function useDoubleQuote() + { + $this->sQuoteCharacter = '"'; + } + + /* + Function: clearParameters + + Clears the parameter list associated with this request. + */ + function clearParameters() + { + $this->aParameters = array(); + } + + /* + Function: addParameter + + Adds a parameter value to the parameter list for this request. + + sType - (string): The type of the value to be used. + sValue - (string: The value to be used. + + See Also: + See setParameter> for details. + */ + function addParameter() + { + $aArgs = func_get_args(); + + if (1 < count($aArgs)) + $this->setParameter( + count($this->aParameters), + $aArgs[0], + $aArgs[1]); + } + + /* + Function: setParameter + + Sets a specific parameter value. + + Parameters: + + nParameter - (number): The index of the parameter to set + sType - (string): The type of value + sValue - (string): The value as it relates to the specified type + + Note: + + Types should be one of the following , , + , , . + The value should be as follows: + - Use the ID of the form you want to process. + - The string data to be passed. + - A string containing valid javascript (either a javascript + variable name that will be in scope at the time of the call or a + javascript function call whose return value will become the parameter. + + */ + function setParameter() + { + $aArgs = func_get_args(); + + if (2 < count($aArgs)) + { + $nParameter = $aArgs[0]; + $sType = $aArgs[1]; + + if (XAJAX_FORM_VALUES == $sType) + { + $sFormID = $aArgs[2]; + $this->aParameters[$nParameter] = + "xajax.getFormValues(" + . $this->sQuoteCharacter + . $sFormID + . $this->sQuoteCharacter + . ")"; + } + else if (XAJAX_INPUT_VALUE == $sType) + { + $sInputID = $aArgs[2]; + $this->aParameters[$nParameter] = + "xajax.$(" + . $this->sQuoteCharacter + . $sInputID + . $this->sQuoteCharacter + . ").value"; + } + else if (XAJAX_CHECKED_VALUE == $sType) + { + $sCheckedID = $aArgs[2]; + $this->aParameters[$nParameter] = + "xajax.$(" + . $this->sQuoteCharacter + . $sCheckedID + . $this->sQuoteCharacter + . ").checked"; + } + else if (XAJAX_ELEMENT_INNERHTML == $sType) + { + $sElementID = $aArgs[2]; + $this->aParameters[$nParameter] = + "xajax.$(" + . $this->sQuoteCharacter + . $sElementID + . $this->sQuoteCharacter + . ").innerHTML"; + } + else if (XAJAX_QUOTED_VALUE == $sType) + { + $sValue = $aArgs[2]; + $this->aParameters[$nParameter] = + $this->sQuoteCharacter + . $sValue + . $this->sQuoteCharacter; + } + else if (XAJAX_JS_VALUE == $sType) + { + $sValue = $aArgs[2]; + $this->aParameters[$nParameter] = $sValue; + } + } + } + + /* + Function: getScript + + Returns a string representation of the script output (javascript) from + this request object. See also: + */ + function getScript() + { + ob_start(); + $this->printScript(); + return ob_get_clean(); + } + + /* + Function: printScript + + Generates a block of javascript code that can be used to invoke + the specified xajax request. + */ + function printScript() + { + echo $this->sName; + echo '('; + + $sSeparator = ''; + + foreach ($this->aParameters as $sParameter) + { + echo $sSeparator; + echo $sParameter; + $sSeparator = ', '; + } + + echo ')'; + } +} + +/* + Class: xajaxCustomRequest + + This class extends the class such that simple javascript + can be put in place of a xajax request to the server. The primary purpose + of this class is to provide simple scripting services to the + based objects, like , and . +*/ +class xajaxCustomRequest extends xajaxRequest +{ + /* + Array: aVariables; + */ + var $aVariables; + + /* + String: sScript; + */ + var $sScript; + + /* + Function: xajaxCustomRequest + + Constructs and initializes an instance of the object. + + Parameters: + + sScript - (string): The javascript (template) that will be printed + upon request. + aVariables - (associative array, optional): An array of variable name, + value pairs that will be passed to setVariable> + */ + function xajaxCustomRequest($sScript) + { + $this->aVariables = array(); + $this->sScript = $sScript; + } + + /* + Function: clearVariables + + Clears the array of variables that will be used to modify the script before + it is printed and sent to the client. + */ + function clearVariables() + { + $this->aVariables = array(); + } + + /* + Function: setVariable + + Sets a value that will be used to modify the script before it is sent to + the browser. The object will perform a string + replace operation on each of the values set with this function. + + Parameters: + $sName - (string): Variable name + $sValue - (string): Value + + */ + function setVariable($sName, $sValue) + { + $this->aVariables[$sName] = $sValue; + } + + /* + Function: printScript + */ + function printScript() + { + $sScript = $this->sScript; + foreach ($this->aVariables as $sKey => $sValue) + $sScript = str_replace($sKey, $sValue, $sScript); + echo $sScript; + } +} diff --git a/phpgwapi/inc/xajax/xajax_core/xajaxResponse.inc.php b/phpgwapi/inc/xajax/xajax_core/xajaxResponse.inc.php new file mode 100644 index 0000000000..483b5d1c98 --- /dev/null +++ b/phpgwapi/inc/xajax/xajax_core/xajaxResponse.inc.php @@ -0,0 +1,1908 @@ + for a detailed description, copyright + and license information. +*/ + +/* + @package xajax + @version $Id: xajaxResponse.inc.php 361 2007-05-24 12:48:14Z calltoconstruct $ + @copyright Copyright (c) 2005-2007 by Jared White & J. Max Wilson + @copyright Copyright (c) 2008-2009 by Joseph Woolley, Steffen Konerow, Jared White & J. Max Wilson + @license http://www.xajaxproject.org/bsd_license.txt BSD License +*/ + +/* + Class: xajaxResponse + + Collect commands to be sent back to the browser in response to a xajax + request. Commands are encoded and packaged in a format that is acceptable + to the response handler from the javascript library running on the client + side. + + Common commands include: + - assign>: Assign a value to an elements property. + - append>: Append a value on to an elements property. + - script>: Execute a portion of javascript code. + - call>: Execute an existing javascript function. + - alert>: Display an alert dialog to the user. + + Elements are identified by the value of the HTML id attribute. If you do + not see your updates occuring on the browser side, ensure that you are + using the correct id in your response. +*/ +class xajaxResponse +{ + /**#@+ + * @access protected + */ + + /* + Array: aCommands + + Stores the commands that will be sent to the browser in the response. + */ + var $aCommands; + + /* + String: sCharacterEncoding + + The name of the encoding method you wish to use when dealing with + special characters. See setEncoding> for more information. + */ + var $sCharacterEncoding; + + /* + Boolean: bOutputEntities + + Convert special characters to the HTML equivellent. See also + bOutputEntities> and setFlag>. + */ + var $bOutputEntities; + + /* + Mixed: returnValue + + A string, array or integer value to be returned to the caller when + using 'synchronous' mode requests. See setMode> for details. + */ + var $returnValue; + + /* + Object: objPluginManager + + A reference to the global plugin manager. + */ + var $objPluginManager; + + /**#@-*/ + + /* + Constructor: xajaxResponse + + Create and initialize a xajaxResponse object. + */ + function xajaxResponse() + { + //SkipDebug + if (0 < func_num_args()) { + $objLanguageManager =& xajaxLanguageManager::getInstance(); + trigger_error( + $objLanguageManager->getText('XJXRSP:EDERR:01') + , E_USER_ERROR + ); + } + //EndSkipDebug + + $this->aCommands = array(); + + $objResponseManager =& xajaxResponseManager::getInstance(); + + $this->sCharacterEncoding = $objResponseManager->getCharacterEncoding(); + $this->bOutputEntities = $objResponseManager->getOutputEntities(); + + $this->objPluginManager =& xajaxPluginManager::getInstance(); + } + + /* + Function: setCharacterEncoding + + Overrides the default character encoding (or the one specified in the + constructor) to the specified character encoding. + + Parameters: + + sCharacterEncoding - (string): The encoding method to use for this response. + + See also, xajaxResponse>() + + Returns: + + object - The xajaxResponse object. + */ + function setCharacterEncoding($sCharacterEncoding) + { + $this->sCharacterEncoding = $sCharacterEncoding; + return $this; + } + + /* + Function: setOutputEntities + + Convert special characters to their HTML equivellent automatically + (only works if the mb_string extension is available). + + Parameters: + + bOption - (boolean): Convert special characters + + Returns: + + object - The xajaxResponse object. + */ + function setOutputEntities($bOutputEntities) + { + $this->bOutputEntities = (boolean)$bOutputEntities; + return $this; + } + + /* + Function: plugin + + Provides access to registered response plugins. If you are using PHP + 4 or 5, pass the plugin name as the first argument, the plugin method + name as the second argument and subsequent arguments (if any) to be + passed along to the plugin. + + Optionally, if you use PHP 5, you can pass just the plugin name as the + first argument and the plugin object will be returned. You can then + access the methods of the plugin directly. + + Parameters: + + sName - (string): Name of the plugin. + sFunction - (string, optional): The name of the method to call. + arg1...argn - (mixed, optional): Additional arguments to pass on to + the plugin function. + + Returns: + + object - The plugin specified by sName. + */ + function &plugin() + { + $aArgs = func_get_args(); + $nArgs = func_num_args(); + + //SkipDebug + if (false == (0 < $nArgs)) { + $objLanguageManager =& xajaxLanguageManager::getInstance(); + trigger_error( + $objLanguageManager->getText('XJXRSP:MPERR:01') + , E_USER_ERROR + ); + } + //EndSkipDebug + + $sName = array_shift($aArgs); + + $objPlugin =& $this->objPluginManager->getPlugin($sName); + + if (false === $objPlugin) + { + $bReturn = false; + return $bReturn; + } + + $objPlugin->setResponse($this); + + if (0 < count($aArgs)) + { + $sMethod = array_shift($aArgs); + + $aFunction = array(&$objPlugin, $sMethod); + call_user_func_array($aFunction, $aArgs); + } + + return $objPlugin; + } + + /* + Function: __get + + Magic function for PHP 5. Used to permit plugins to be called as if they + where native members of the xajaxResponse instance. + + Parameters: + + sPluginName - (string): The name of the plugin. + + Returns: + + object - The plugin specified by sPluginName. + */ + function &__get($sPluginName) + { + $objPlugin =& $this->plugin($sPluginName); + return $objPlugin; + } + + /* + Function: confirmCommands + + Response command that prompts user with [ok] [cancel] style + message box. If the user clicks cancel, the specified + number of response commands following this one, will be + skipped. + + Parameters: + + iCmdNumber - (integer): The number of commands to skip upon cancel. + sMessage - (string): The message to display to the user. + + Returns: + + object : The xajaxResponse object. + */ + function confirmCommands($iCmdNumber, $sMessage) + { + return $this->addCommand( + array( + 'cmd'=>'cc', + 'id'=>$iCmdNumber + ), + $sMessage + ); + } + + /* + Function: assign + + Response command indicating that the specified value should be + assigned to the given element's attribute. + + Parameters: + + sTarget - (string): The id of the html element on the browser. + sAttribute - (string): The property to be assigned. + sData - (string): The value to be assigned to the property. + + Returns: + + object : The object. + + */ + function assign($sTarget,$sAttribute,$sData) + { + return $this->addCommand( + array( + 'cmd'=>'as', + 'id'=>$sTarget, + 'prop'=>$sAttribute + ), + $sData + ); + } + + /* + Function: append + + Response command that indicates the specified data should be appended + to the given element's property. + + Parameters: + + sTarget - (string): The id of the element to be updated. + sAttribute - (string): The name of the property to be appended to. + sData - (string): The data to be appended to the property. + + Returns: + + object : The object. + */ + function append($sTarget,$sAttribute,$sData) + { + return $this->addCommand( + array( + 'cmd'=>'ap', + 'id'=>$sTarget, + 'prop'=>$sAttribute + ), + $sData + ); + } + + /* + Function: prepend + + Response command to prepend the specified value onto the given + element's property. + + Parameters: + + sTarget - (string): The id of the element to be updated. + sAttribute - (string): The property to be updated. + sData - (string): The value to be prepended. + + Returns: + + object : The object. + */ + function prepend($sTarget,$sAttribute,$sData) + { + return $this->addCommand( + array( + 'cmd'=>'pp', + 'id'=>$sTarget, + 'prop'=>$sAttribute + ), + $sData + ); + } + + /* + Function: replace + + Replace a specified value with another value within the given + element's property. + + Parameters: + + sTarget - (string): The id of the element to update. + sAttribute - (string): The property to be updated. + sSearch - (string): The needle to search for. + sData - (string): The data to use in place of the needle. + */ + function replace($sTarget,$sAttribute,$sSearch,$sData) + { + return $this->addCommand( + array( + 'cmd'=>'rp', + 'id'=>$sTarget, + 'prop'=>$sAttribute + ), + array( + 's' => $sSearch, + 'r' => $sData + ) + ); + } + + /* + Function: clear + + Response command used to clear the specified property of the + given element. + + Parameters: + + sTarget - (string): The id of the element to be updated. + sAttribute - (string): The property to be clared. + + Returns: + + object - The object. + */ + function clear($sTarget,$sAttribute) + { + return $this->assign( + $sTarget, + $sAttribute, + '' + ); + } + + /* + Function: contextAssign + + Response command used to assign a value to a member of a + javascript object (or element) that is specified by the context + member of the request. The object is referenced using the 'this' keyword + in the sAttribute parameter. + + Parameters: + + sAttribute - (string): The property to be updated. + sData - (string): The value to assign. + + Returns: + + object : The object. + */ + function contextAssign($sAttribute, $sData) + { + return $this->addCommand( + array( + 'cmd'=>'c:as', + 'prop'=>$sAttribute + ), + $sData + ); + } + + /* + Function: contextAppend + + Response command used to append a value onto the specified member + of the javascript context object (or element) specified by the context + member of the request. The object is referenced using the 'this' keyword + in the sAttribute parameter. + + Parameters: + + sAttribute - (string): The member to be appended to. + sData - (string): The value to append. + + Returns: + + object : The object. + */ + function contextAppend($sAttribute, $sData) + { + return $this->addCommand( + array( + 'cmd'=>'c:ap', + 'prop'=>$sAttribute + ), + $sData + ); + } + + /* + Function: contextPrepend + + Response command used to prepend the speicified data to the given + member of the current javascript object specified by context in the + current request. The object is access via the 'this' keyword in the + sAttribute parameter. + + Parameters: + + sAttribute - (string): The member to be updated. + sData - (string): The value to be prepended. + + Returns: + + object : The object. + */ + function contextPrepend($sAttribute, $sData) + { + return $this->addCommand( + array( + 'cmd'=>'c:pp', + 'prop'=>$sAttribute + ), + $sData + ); + } + + /* + Function: contextClear + + Response command used to clear the value of the property specified + in the sAttribute parameter. The member is access via the 'this' + keyword and can be used to update a javascript object specified + by context in the request parameters. + + Parameters: + + sAttribute - (string): The member to be cleared. + + Returns: + + object : The object. + */ + function contextClear($sAttribute) + { + return $this->contextAssign( + $sAttribute, + '' + ); + } + + /* + Function: alert + + Response command that is used to display an alert message to the user. + + Parameters: + + sMsg - (string): The message to be displayed. + + Returns: + + object : The object. + */ + function alert($sMsg) + { + return $this->addCommand( + array( + 'cmd'=>'al' + ), + $sMsg + ); + } + + function debug($sMessage) + { + return $this->addCommand( + array( + 'cmd'=>'dbg' + ), + $sMessage + ); + } + + /* + Function: redirect + + Response command that causes the browser to navigate to the specified + URL. + + Parameters: + + sURL - (string): The relative or fully qualified URL. + iDelay - (integer, optional): Number of seconds to delay before + the redirect occurs. + + Returns: + + object : The object. + */ + function redirect($sURL, $iDelay=0) + { + //we need to parse the query part so that the values are rawurlencode()'ed + //can't just use parse_url() cos we could be dealing with a relative URL which + // parse_url() can't deal with. + $queryStart = strpos($sURL, '?', strrpos($sURL, '/')); + if ($queryStart !== FALSE) + { + $queryStart++; + $queryEnd = strpos($sURL, '#', $queryStart); + if ($queryEnd === FALSE) + $queryEnd = strlen($sURL); + $queryPart = substr($sURL, $queryStart, $queryEnd-$queryStart); + parse_str($queryPart, $queryParts); + $newQueryPart = ""; + if ($queryParts) + { + $first = true; + foreach($queryParts as $key => $value) + { + if ($first) + $first = false; + else + $newQueryPart .= '&'; + $newQueryPart .= rawurlencode($key).'='.rawurlencode($value); + } + } else if ($_SERVER['QUERY_STRING']) { + //couldn't break up the query, but there's one there + //possibly "http://url/page.html?query1234" type of query? + //just encode it and hope it works + $newQueryPart = rawurlencode($_SERVER['QUERY_STRING']); + } + $sURL = str_replace($queryPart, $newQueryPart, $sURL); + } + if ($iDelay) + $this->script( + 'window.setTimeout("window.location = \'' + . $sURL + . '\';",' + . ($iDelay*1000) + . ');' + ); + else + $this->script( + 'window.location = "' + . $sURL + . '";' + ); + return $this; + } + + /* + Function: script + + Response command that is used to execute a portion of javascript on + the browser. The script runs in it's own context, so variables declared + locally, using the 'var' keyword, will no longer be available after the + call. To construct a variable that will be accessable globally, even + after the script has executed, leave off the 'var' keyword. + + Parameters: + + sJS - (string): The script to execute. + + Returns: + + object : The object. + */ + function script($sJS) + { + return $this->addCommand( + array( + 'cmd'=>'js' + ), + $sJS + ); + } + + /* + Function: call + + Response command that indicates that the specified javascript + function should be called with the given (optional) parameters. + + Parameters: + + arg1 - (string): The name of the function to call. + arg2 .. argn : arguments to be passed to the function. + + Returns: + + object : The object. + */ + function call() { + $aArgs = func_get_args(); + $sFunc = array_shift($aArgs); + return $this->addCommand( + array( + 'cmd'=>'jc', + 'func'=>$sFunc + ), + $aArgs + ); + } + + /* + Function: remove + + Response command used to remove an element from the document. + + Parameters: + + sTarget - (string): The id of the element to be removed. + + Returns: + + object : The object. + */ + function remove($sTarget) + { + return $this->addCommand( + array( + 'cmd'=>'rm', + 'id'=>$sTarget), + '' + ); + } + + /* + Function: create + + Response command used to create a new element on the browser. + + Parameters: + + sParent - (string): The id of the parent element. + sTag - (string): The tag name to be used for the new element. + sId - (string): The id to assign to the new element. + sType - (string, optional): The type of tag, deprecated, use + createInput> instead. + + Returns: + + object : The object. + */ + function create($sParent, $sTag, $sId, $sType=null) + { + //SkipDebug + if (false === (null === $sType)) { + $objLanguageManager =& xajaxLanguageManager::getInstance(); + trigger_error( + $objLanguageManager->getText('XJXRSP:CPERR:01') + , E_USER_WARNING + ); + } + //EndSkipDebug + + return $this->addCommand( + array( + 'cmd'=>'ce', + 'id'=>$sParent, + 'prop'=>$sId + ), + $sTag + ); + } + + /* + Function: insert + + Response command used to insert a new element just prior to the specified + element. + + Parameters: + + sBefore - (string): The element used as a reference point for the + insertion. + sTag - (string): The tag to be used for the new element. + sId - (string): The id to be used for the new element. + + Returns: + + object : The object. + */ + function insert($sBefore, $sTag, $sId) + { + return $this->addCommand( + array( + 'cmd'=>'ie', + 'id'=>$sBefore, + 'prop'=>$sId + ), + $sTag + ); + } + + /* + Function: insertAfter + + Response command used to insert a new element after the specified + one. + + Parameters: + + sAfter - (string): The id of the element that will be used as a reference + for the insertion. + sTag - (string): The tag name to be used for the new element. + sId - (string): The id to be used for the new element. + + Returns: + + object : The object. + */ + function insertAfter($sAfter, $sTag, $sId) + { + return $this->addCommand( + array( + 'cmd'=>'ia', + 'id'=>$sAfter, + 'prop'=>$sId + ), + $sTag + ); + } + + /* + Function: createInput + + Response command used to create an input element on the browser. + + Parameters: + + sParent - (string): The id of the parent element. + sType - (string): The type of the new input element. + sName - (string): The name of the new input element. + sId - (string): The id of the new element. + + Returns: + + object : The object. + */ + function createInput($sParent, $sType, $sName, $sId) + { + return $this->addCommand( + array( + 'cmd'=>'ci', + 'id'=>$sParent, + 'prop'=>$sId, + 'type'=>$sType + ), + $sName + ); + } + + /* + Function: insertInput + + Response command used to insert a new input element preceeding the + specified element. + + Parameters: + + sBefore - (string): The id of the element to be used as the reference + point for the insertion. + sType - (string): The type of the new input element. + sName - (string): The name of the new input element. + sId - (string): The id of the new input element. + + Returns: + + object : The object. + */ + function insertInput($sBefore, $sType, $sName, $sId) + { + return $this->addCommand( + array( + 'cmd'=>'ii', + 'id'=>$sBefore, + 'prop'=>$sId, + 'type'=>$sType + ), + $sName + ); + } + + /* + Function: insertInputAfter + + Response command used to insert a new input element after the + specified element. + + Parameters: + + sAfter - (string): The id of the element that is to be used + as the insertion point for the new element. + sType - (string): The type of the new input element. + sName - (string): The name of the new input element. + sId - (string): The id of the new input element. + + Returns: + + object : The object. + */ + function insertInputAfter($sAfter, $sType, $sName, $sId) + { + return $this->addCommand( + array( + 'cmd'=>'iia', + 'id'=>$sAfter, + 'prop'=>$sId, + 'type'=>$sType + ), + $sName + ); + } + + /* + Function: setEvent + + Response command used to set an event handler on the browser. + + Parameters: + + sTarget - (string): The id of the element that contains the event. + sEvent - (string): The name of the event. + sScript - (string): The javascript to execute when the event is fired. + + Returns: + + object : The object. + */ + function setEvent($sTarget,$sEvent,$sScript) + { + return $this->addCommand( + array( + 'cmd'=>'ev', + 'id'=>$sTarget, + 'prop'=>$sEvent + ), + $sScript + ); + } + + + /* + Function: addEvent + + Response command used to set an event handler on the browser. + + Parameters: + + sTarget - (string): The id of the element that contains the event. + sEvent - (string): The name of the event. + sScript - (string): The javascript to execute when the event is fired. + + Returns: + + object : The object. + + Note: + + This function is depreciated and will be removed in a future version. + Use instead. + */ + function addEvent($sTarget,$sEvent,$sScript) + { + return $this->setEvent( + $sTarget, + $sEvent, + $sScript + ); + } + + /* + Function: addHandler + + Response command used to install an event handler on the specified element. + + Parameters: + + sTarget - (string): The id of the element. + sEvent - (string): The name of the event to add the handler to. + sHandler - (string): The javascript function to call when the event is fired. + + You can add more than one event handler to an element's event using this method. + + Returns: + + object - The object. + */ + function addHandler($sTarget,$sEvent,$sHandler) + { + return $this->addCommand( + array( + 'cmd'=>'ah', + 'id'=>$sTarget, + 'prop'=>$sEvent + ), + $sHandler + ); + } + + /* + Function: removeHandler + + Response command used to remove an event handler from an element. + + Parameters: + + sTarget - (string): The id of the element. + sEvent - (string): The name of the event. + sHandler - (string): The javascript function that is called when the + event is fired. + + Returns: + + object : The object. + */ + function removeHandler($sTarget,$sEvent,$sHandler) + { + return $this->addCommand( + array( + 'cmd'=>'rh', + 'id'=>$sTarget, + 'prop'=>$sEvent + ), + $sHandler); + } + + /* + Function: setFunction + + Response command used to construct a javascript function on the browser. + + Parameters: + + sFunction - (string): The name of the function to construct. + sArgs - (string): Comma separated list of parameter names. + sScript - (string): The javascript code that will become the body of the + function. + + Returns: + + object : The object. + */ + function setFunction($sFunction, $sArgs, $sScript) + { + return $this->addCommand( + array( + 'cmd'=>'sf', + 'func'=>$sFunction, + 'prop'=>$sArgs + ), + $sScript + ); + } + + /* + Function: wrapFunction + + Response command used to construct a wrapper function around + and existing javascript function on the browser. + + Parameters: + + sFunction - (string): The name of the existing function to wrap. + sArgs - (string): The comma separated list of parameters for the function. + aScripts - (array): An array of javascript code snippets that will + be used to build the body of the function. The first piece of code + specified in the array will occur before the call to the original + function, the second will occur after the original function is called. + sReturnValueVariable - (string): The name of the variable that will + retain the return value from the call to the original function. + + Returns: + + object : The object. + */ + function wrapFunction($sFunction, $sArgs, $aScripts, $sReturnValueVariable) + { + return $this->addCommand( + array( + 'cmd'=>'wpf', + 'func'=>$sFunction, + 'prop'=>$sArgs, + 'type'=>$sReturnValueVariable + ), + $aScripts + ); + } + + /* + Function: includeScript + + Response command used to load a javascript file on the browser. + + Parameters: + + sFileName - (string): The relative or fully qualified URI of the + javascript file. + + sType - (string): Determines the script type . Defaults to 'text/javascript'. + + + Returns: + + object : The object. + */ + function includeScript($sFileName, $sType = null, $sId = null) + { + $command = array('cmd' => 'in'); + + if (false === (null === $sType)) + $command['type'] = $sType; + + if (false === (null === $sId)) + $command['elm_id'] = $sId; + + return $this->addCommand( + $command, + $sFileName + ); + } + + /* + Function: includeScriptOnce + + Response command used to include a javascript file on the browser + if it has not already been loaded. + + Parameters: + + sFileName - (string): The relative for fully qualified URI of the + javascript file. + + sType - (string): Determines the script type . Defaults to 'text/javascript'. + + Returns: + + object : The object. + */ + function includeScriptOnce($sFileName, $sType = null, $sId = null) + { + $command = array('cmd' => 'ino'); + + if (false === (null === $sType)) + $command['type'] = $sType; + + if (false === (null === $sId)) + $command['elm_id'] = $sId; + + return $this->addCommand( + $command, + $sFileName + ); + } + + /* + Function: removeScript + + Response command used to remove a SCRIPT reference to a javascript + file on the browser. Optionally, you can call a javascript function + just prior to the file being unloaded (for cleanup). + + Parameters: + + sFileName - (string): The relative or fully qualified URI of the + javascript file. + sUnload - (string): Name of a javascript function to call prior + to unlaoding the file. + + Returns: + + object : The object. + */ + function removeScript($sFileName, $sUnload = '') { + $this->addCommand( + array( + 'cmd'=>'rjs', + 'unld'=>$sUnload + ), + $sFileName + ); + return $this; + } + + /* + Function: includeCSS + + Response command used to include a LINK reference to + the specified CSS file on the browser. This will cause the + browser to load and apply the style sheet. + + Parameters: + + sFileName - (string): The relative or fully qualified URI of + the css file. + + sMedia - (string): Determines the media type of the CSS file. Defaults to 'screen'. + + Returns: + + object : The object. + */ + function includeCSS($sFileName, $sMedia = null) + { + $command = array('cmd' => 'css'); + + if (false === (null === $sMedia)) + $command['media'] = $sMedia; + + return $this->addCommand( + $command, + $sFileName + ); + } + + /* + Function: removeCSS + + Response command used to remove a LINK reference to + a CSS file on the browser. This causes the browser to + unload the style sheet, effectively removing the style + changes it caused. + + Parameters: + + sFileName - (string): The relative or fully qualified URI + of the css file. + + Returns: + + object : The object. + */ + function removeCSS($sFileName, $sMedia = null) + { + $command = array('cmd'=>'rcss'); + + if (false === (null === $sMedia)) + $command['media'] = $sMedia; + + return $this->addCommand( + $command, + $sFileName + ); + } + + /* + Function: waitForCSS + + Response command instructing xajax to pause while the CSS + files are loaded. The browser is not typically a multi-threading + application, with regards to javascript code. Therefore, the + CSS files included or removed with includeCSS> and + removeCSS> respectively, will not be loaded or + removed until the browser regains control from the script. This + command returns control back to the browser and pauses the execution + of the response until the CSS files, included previously, are + loaded. + + Parameters: + + iTimeout - (integer): The number of 1/10ths of a second to pause + before timing out and continuing with the execution of the + response commands. + + Returns: + + object : The object. + */ + function waitForCSS($iTimeout = 600) { + $sData = ""; + $this->addCommand( + array( + 'cmd'=>'wcss', + 'prop'=>$iTimeout + ), + $sData + ); + return $this; + } + + /* + Function: waitFor + + Response command instructing xajax to delay execution of the response + commands until a specified condition is met. Note, this returns control + to the browser, so that other script operations can execute. xajax + will continue to monitor the specified condition and, when it evaulates + to true, will continue processing response commands. + + Parameters: + + script - (string): A piece of javascript code that evaulates to true + or false. + tenths - (integer): The number of 1/10ths of a second to wait before + timing out and continuing with the execution of the response + commands. + + Returns: + + object : The object. + */ + function waitFor($script, $tenths) { + return $this->addCommand( + array( + 'cmd'=>'wf', + 'prop'=>$tenths + ), + $script + ); + } + + /* + Function: sleep + + Response command which instructs xajax to pause execution + of the response commands, returning control to the browser + so it can perform other commands asynchronously. After + the specified delay, xajax will continue execution of the + response commands. + + Parameters: + + tenths - (integer): The number of 1/10ths of a second to + sleep. + + Returns: + + object : The object. + */ + function sleep($tenths) { + $this->addCommand( + array( + 'cmd'=>'s', + 'prop'=>$tenths + ), + '' + ); + return $this; + } + + /* + Function: setReturnValue + + Stores a value that will be passed back as part of the response. + When making synchronous requests, the calling javascript can + obtain this value immediately as the return value of the + function. + + Parameters: + + value - (mixed): Any value. + + Returns: + + object : The object. + */ + function setReturnValue($value) { + $this->returnValue = $this->_encodeArray($value); + return $this; + } + + /* + Function: getContentType + + Returns the current content type that will be used for the + response packet. (typically: "text/xml") + + Returns: + + string : The content type. + */ + function getContentType() + { + return 'text/xml'; + } + + /* + Function: getOutput + */ + function getOutput() + { + ob_start(); + $this->_printHeader_XML(); + $this->_printResponse_XML(); + return ob_get_clean(); + } + + /* + Function: printOutput + + Prints the output, generated from the commands added to the response, + that will be sent to the browser. + + Returns: + + string : The textual representation of the response commands. + */ + function printOutput() + { + $this->_sendHeaders(); + $this->_printHeader_XML(); + $this->_printResponse_XML(); + } + + /* + Function: _sendHeaders + + Used internally to generate the response headers. + */ + function _sendHeaders() + { + $objArgumentManager =& xajaxArgumentManager::getInstance(); + if (XAJAX_METHOD_GET == $objArgumentManager->getRequestMethod()) + { + header ("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); + header ("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); + header ("Cache-Control: no-cache, must-revalidate"); + header ("Pragma: no-cache"); + } + + $sCharacterSet = ''; + if ($this->sCharacterEncoding && 0 < strlen(trim($this->sCharacterEncoding))) { + $sCharacterSet = '; charset="' . trim($this->sCharacterEncoding) . '"'; + } + + $sContentType = $this->getContentType(); + + header('content-type: ' . $sContentType . ' ' . $sCharacterSet); + } + + /* + Function: getCommandCount + + Returns: + + integer : The number of commands in the response. + */ + function getCommandCount() + { + return count($this->aCommands); + } + + /* + Function: loadCommands + + Merges the response commands from the specified + object with the response commands in this object. + + Parameters: + + mCommands - (object): object. + bBefore - (boolean): Add the new commands to the beginning + of the list. + + */ + function loadCommands($mCommands, $bBefore=false) + { + if (is_a($mCommands, 'xajaxResponse')) { + $this->returnValue = $mCommands->returnValue; + + if ($bBefore) { + $this->aCommands = array_merge($mCommands->aCommands, $this->aCommands); + } + else { + $this->aCommands = array_merge($this->aCommands, $mCommands->aCommands); + } + } + else if (is_array($mCommands)) { + if ($bBefore) { + $this->aCommands = array_merge($mCommands, $this->aCommands); + } + else { + $this->aCommands = array_merge($this->aCommands, $mCommands); + } + } + else { + //SkipDebug + if (!empty($mCommands)) { + $objLanguageManager =& xajaxLanguageManager::getInstance(); + trigger_error( + $objLanguageManager->getText('XJXRSP:LCERR:01') + , E_USER_ERROR + ); + } + //EndSkipDebug + } + } + + function absorb($objResponse) + { + $this->loadCommands($objResponse); + } + + /* + Function: addPluginCommand + + Adds a response command that is generated by a plugin. + + Parameters: + + objPlugin - (object): A reference to a plugin object. + aAttributes - (array): Array containing the attributes for this + response command. + mData - (mixed): The data to be sent with this command. + + Returns: + + object : The object. + */ + function addPluginCommand($objPlugin, $aAttributes, $mData) + { + $aAttributes['plg'] = $objPlugin->getName(); + return $this->addCommand($aAttributes, $mData); + } + + /* + Function: addCommand + + Add a response command to the array of commands that will + be sent to the browser. + + Parameters: + + aAttributes - (array): Associative array of attributes that + will describe the command. + mData - (mixed): The data to be associated with this command. + + Returns: + + object : The command. + */ + function addCommand($aAttributes, $mData) + { + $aAttributes['data'] = $this->_encodeArray($mData); + $this->aCommands[] = $aAttributes; + return $this; + } + + /* + Function: _printHeader_XML + + Used internally to print XML start tag. + */ + function _printHeader_XML() + { + echo '<'; + echo '?'; + echo 'xml version="1.0"'; + + $sEncoding = trim($this->sCharacterEncoding); + if ($this->sCharacterEncoding && 0 < strlen($sEncoding)) { + echo ' encoding="'; + echo $sEncoding; + echo '"'; + } + + echo ' ?'; + echo '>'; + } + + /* + Function: _printResponse_XML + + Used internally to generate the command output. + */ + function _printResponse_XML() + { + echo '<'; + echo 'xjx>'; + + if (null !== $this->returnValue) + { + echo '<'; + echo 'xjxrv>'; + + $this->_printArray_XML($this->returnValue); + + echo '<'; + echo '/xjxrv>'; + } + + foreach(array_keys($this->aCommands) as $sKey) + $this->_printCommand_XML($this->aCommands[$sKey]); + + echo '<'; + echo '/xjx>'; + } + + /* + Function: _printCommand_XML + + Prints an XML representation of the command. + + Parameters: + + aAttributes - (array): Associative array of attributes for this + command. + */ + function _printCommand_XML(&$aAttributes) + { + echo '<'; + echo 'cmd'; + + $mData = ''; + + foreach (array_keys($aAttributes) as $sKey) { + if ($sKey) { + if ('data' != $sKey) { + echo ' '; + echo $sKey; + echo '="'; + echo $aAttributes[$sKey]; + echo '"'; + } else + $mData =& $aAttributes[$sKey]; + } + } + + echo '>'; + + $this->_printArray_XML($mData); + + echo '<'; + echo '/cmd>'; + } + + /* + Function: _printArray_XML + + Prints an XML representation of a php array suitable + for inclusion in the response to the browser. Arrays + sent via this method will be converted into a javascript + array on the browser. + + Parameters: + + mArray - (array): Array to be converted. + */ + function _printArray_XML(&$mArray) { + if ('object' == gettype($mArray)) + $mArray = get_object_vars($mArray); + + if (false == is_array($mArray)) { + $this->_printEscapedString_XML($mArray); + return; + } + + echo '<'; + echo 'xjxobj>'; + + foreach (array_keys($mArray) as $sKey) { + if (is_array($mArray[$sKey])) { + echo '<'; + echo 'e>'; + + foreach (array_keys($mArray[$sKey]) as $sInnerKey) { + //SkipDebug + if (htmlspecialchars($sInnerKey, ENT_COMPAT, 'UTF-8') != $sInnerKey) { + $objLanguageManager =& xajaxLanguageManager::getInstance(); + trigger_error( + $objLanguageManager->getText('XJXRSP:AKERR:01') + , E_USER_ERROR + ); + } + //EndSkipDebug + + if ('k' == $sInnerKey || 'v' == $sInnerKey) { + echo '<'; + echo $sInnerKey; + echo '>'; + $this->_printArray_XML($mArray[$sKey][$sInnerKey]); + echo '<'; + echo '/'; + echo $sInnerKey; + echo '>'; + } else { + //SkipDebug + $objLanguageManager =& xajaxLanguageManager::getInstance(); + trigger_error( + $objLanguageManager->getText('XJXRSP:IEAERR:01') + , E_USER_ERROR + ); + //EndSkipDebug + } + } + + echo '<'; + echo '/e>'; + } else { + //SkipDebug + $objLanguageManager =& xajaxLanguageManager::getInstance(); + trigger_error( + $objLanguageManager->getText('XJXRSP:NEAERR:01') + , E_USER_ERROR + ); + //EndSkipDebug + } + } + + echo '<'; + echo '/xjxobj>'; + } + + /* + Function: _printEscapedString_XML + + Escape the specified data if necessary, so special characters in the + command data does not interfere with the structure of the response. + + This could be overridden to allow for transport encodings other than + XML. + + Parameters: + + sData - (string): The data to be escaped. + + Returns: + + string : The escaped data. + */ + function _printEscapedString_XML(&$sData) + { + if (is_null($sData) || false == isset($sData)) { + echo '*'; + return; + } + + if ($this->bOutputEntities) { + //SkipDebug + if (false === function_exists('mb_convert_encoding')) { + $objLanguageManager =& xajaxLanguageManager::getInstance(); + trigger_error( + $objLanguageManager->getText('XJXRSP:MBEERR:01') + , E_USER_NOTICE + ); + } + //EndSkipDebug + + echo call_user_func_array('mb_convert_encoding', array(&$sData, 'HTML-ENTITIES', $this->sCharacterEncoding)); + return; + } + + $nCDATA = 0; + + $bNoOpenCDATA = (false === strpos($sData, '<'.'![CDATA[')); + if ($bNoOpenCDATA) { + $bNoCloseCDATA = (false === strpos($sData, ']]>')); + if ($bNoCloseCDATA) { + $bSpecialChars = (htmlspecialchars($sData, ENT_COMPAT, 'UTF-8') != $sData); + if ($bSpecialChars) + $nCDATA = 1; + } else + $nCDATA = 2; + } else + $nCDATA = 2; + + if (0 < $nCDATA) { + echo '<'; + echo '![CDATA['; + + // PHP defines numeric values as integer or float (double and real are aliases of float) + if (is_string($sData)) { + echo 'S'; + } else if (is_int($sData) || is_float($sData)) { + echo 'N'; + } else if (is_bool($sData)) { + echo 'B'; + } + + if (1 < $nCDATA) { + $aSegments = explode('<'.'![CDATA[', $sData); + $aOutput = array(); + $nOutput = 0; + foreach (array_keys($aSegments) as $keySegment) { + $aFragments = explode(']]>', $aSegments[$keySegment]); + $aStack = array(); + $nStack = 0; + foreach (array_keys($aFragments) as $keyFragment) { + if (0 < $nStack) + array_push($aStack, ']]]]><', '![CDATA[>', $aFragments[$keyFragment]); + else + $aStack[] = $aFragments[$keyFragment]; + ++$nStack; + } + if (0 < $nOutput) + array_push($aOutput, '<', '![]]><', '![CDATA[CDATA[', implode('', $aStack)); + else + $aOutput[] = implode('', $aStack); + ++$nOutput; + } + echo implode('', $aOutput); + } else + echo $sData; + + echo ']]>'; + } else { + if (is_string($sData)) { + echo 'S'; + } else if (is_int($sData) || is_float($sData)) { + echo 'N'; + } else if (is_bool($sData)) { + echo 'B'; + } + echo $sData; + } + } + + /* + Function: _encodeArray + + Recursively serializes a data structure in an array so that it can + be sent to the browser. This can be thought of as the opposite of + _parseObjXml>. + + Parameters: + + mData - (mixed): The data to be evaluated. + + Returns: + + mixed : The object constructed from the data. + */ + function _encodeArray(&$mData) { + if ('object' === gettype($mData)) + $mData = get_object_vars($mData); + + if (false === is_array($mData)) + return $mData; + + $aData = array(); + foreach (array_keys($mData) as $sKey) + $aData[] = array( + // key does not need to be encoded + 'k'=>$sKey, + 'v'=>$this->_encodeArray($mData[$sKey]) + ); + return $aData; + } + +}// end class xajaxResponse + +class xajaxCustomResponse +{ + var $sOutput; + var $sContentType; + + var $sCharacterEncoding; + var $bOutputEntities; + + function xajaxCustomResponse($sContentType) + { + $this->sOutput = ''; + $this->sContentType = $sContentType; + + $objResponseManager =& xajaxResponseManager::getInstance(); + + $this->sCharacterEncoding = $objResponseManager->getCharacterEncoding(); + $this->bOutputEntities = $objResponseManager->getOutputEntities(); + } + + function setCharacterEncoding($sCharacterEncoding) + { + $this->sCharacterEncoding = $sCharacterEncoding; + } + + function setOutputEntities($bOutputEntities) + { + $this->bOutputEntities = $bOutputEntities; + } + + function clear() + { + $this->sOutput = ''; + } + + function append($sOutput) + { + $this->sOutput .= $sOutput; + } + + function absorb($objResponse) + { + //SkipDebug + if (false == is_a($objResponse, 'xajaxCustomResponse')) { + $objLanguageManager =& xajaxLanguageManager::getInstance(); + trigger_error( + $objLanguageManager->getText('XJXRSP:MXRTERR') + , E_USER_ERROR + ); + } + + if ($objResponse->getContentType() != $this->getContentType()) { + $objLanguageManager =& xajaxLanguageManager::getInstance(); + trigger_error( + $objLanguageManager->getText('XJXRSP:MXCTERR') + , E_USER_ERROR + ); + } + + if ($objResponse->getCharacterEncoding() != $this->getCharacterEncoding()) { + $objLanguageManager =& xajaxLanguageManager::getInstance(); + trigger_error( + $objLanguageManager->getText('XJXRSP:MXCEERR') + , E_USER_ERROR + ); + } + + if ($objResponse->getOutputEntities() != $this->getOutputEntities()) { + $objLanguageManager =& xajaxLanguageManager::getInstance(); + trigger_error( + $objLanguageManager->getText('XJXRSP:MXOEERR') + , E_USER_ERROR + ); + } + //EndSkipDebug + + $this->sOutput .= $objResponse->getOutput(); + } + + function getContentType() + { + return $this->sContentType; + } + + function getCharacterEncoding() + { + return $this->sCharacterEncoding; + } + + function getOutputEntities() + { + return $this->bOutputEntities; + } + + function getOutput() + { + return $this->sOutput; + } + + function printOutput() + { + $sContentType = $this->sContentType; + $sCharacterSet = $this->sCharacterEncoding; + + header("content-type: {$sContentType}; charset={$sCharacterSet}"); + + echo $this->sOutput; + } +} diff --git a/phpgwapi/inc/xajax/xajax_core/xajaxResponseManager.inc.php b/phpgwapi/inc/xajax/xajax_core/xajaxResponseManager.inc.php new file mode 100644 index 0000000000..795eceac58 --- /dev/null +++ b/phpgwapi/inc/xajax/xajax_core/xajaxResponseManager.inc.php @@ -0,0 +1,231 @@ + for a detailed description, copyright + and license information. +*/ + +/* + @package xajax + @version $Id: xajaxResponseManager.inc.php 362 2007-05-29 15:32:24Z calltoconstruct $ + @copyright Copyright (c) 2005-2007 by Jared White & J. Max Wilson + @copyright Copyright (c) 2008-2009 by Joseph Woolley, Steffen Konerow, Jared White & J. Max Wilson + @license http://www.xajaxproject.org/bsd_license.txt BSD License +*/ + +/* + Class: xajaxResponseManager + + This class stores and tracks the response that will be returned after + processing a request. The response manager represents a single point + of contact for working with objects as well as + objects. +*/ +class xajaxResponseManager +{ + /* + Object: objResponse + + The current response object that will be sent back to the browser + once the request processing phase is complete. + */ + var $objResponse; + + /* + String: sCharacterEncoding + */ + var $sCharacterEncoding; + + /* + Boolean: bOutputEntities + */ + var $bOutputEntities; + + /* + Array: aDebugMessages + */ + var $aDebugMessages; + + /* + Function: xajaxResponseManager + + Construct and initialize the one and only xajaxResponseManager object. + */ + function xajaxResponseManager() + { + $this->objResponse = NULL; + $this->aDebugMessages = array(); + } + + /* + Function: getInstance + + Implementation of the singleton pattern: provide a single instance of the + to all who request it. + */ + function &getInstance() + { + static $obj; + if (!$obj) { + $obj = new xajaxResponseManager(); + } + return $obj; + } + + /* + Function: configure + + Called by the xajax object when configuration options are set in the main script. Option + values are passed to each of the main xajax components and stored locally as needed. The + will track the characterEncoding and outputEntities settings. + + Parameters: + $sName - (string): Setting name + $mValue - (mixed): Value + */ + function configure($sName, $mValue) + { + if ('characterEncoding' == $sName) + { + $this->sCharacterEncoding = $mValue; + + if (isset($this->objResponse)) + $this->objResponse->setCharacterEncoding($this->sCharacterEncoding); + } + else if ('outputEntities' == $sName) + { + if (true === $mValue || false === $mValue) + { + $this->bOutputEntities = $mValue; + + if (isset($this->objResponse)) + $this->objResponse->setOutputEntities($this->bOutputEntities); + } + } + } + + /* + Function: clear + + Clear the current response. A new response will need to be appended + before the request processing is complete. + */ + function clear() + { + $this->objResponse = NULL; + } + + /* + Function: append + + Used, primarily internally, to append one response object onto the end of another. You can + append one xajaxResponse to the end of another, or append a xajaxCustomResponse onto the end of + another xajaxCustomResponse. However, you cannot append a standard response object onto the end + of a custom response and likewise, you cannot append a custom response onto the end of a standard + response. + + Parameters: + + $mResponse - (object): The new response object to be added to the current response object. + + If no prior response has been appended, this response becomes the main response object to which other + response objects will be appended. + */ + function append($mResponse) + { + if (is_a($mResponse, 'xajaxResponse')) { + if (NULL == $this->objResponse) { + $this->objResponse = $mResponse; + } else if (is_a($this->objResponse, 'xajaxResponse')) { + if ($this->objResponse != $mResponse) + $this->objResponse->absorb($mResponse); + } else { + $objLanguageManager =& xajaxLanguageManager::getInstance(); + $this->debug( + $objLanguageManager->getText('XJXRM:MXRTERR') + . get_class($this->objResponse) + . ')' + ); + } + } else if (is_a($mResponse, 'xajaxCustomResponse')) { + if (NULL == $this->objResponse) { + $this->objResponse = $mResponse; + } else if (is_a($this->objResponse, 'xajaxCustomResponse')) { + if ($this->objResponse != $mResponse) + $this->objResponse->absorb($mResponse); + } else { + $objLanguageManager =& xajaxLanguageManager::getInstance(); + $this->debug( + $objLanguageManager->getText('XJXRM:MXRTERR') + . get_class($this->objResponse) + . ')' + ); + } + } else { + $objLanguageManager =& xajaxLanguageManager::getInstance(); + $this->debug($objLanguageManager->getText('XJXRM:IRERR')); + } + } + + /* + Function: debug + + Appends a debug message on the end of the debug message queue. Debug messages + will be sent to the client with the normal response (if the response object supports + the sending of debug messages, see: ) + + Parameters: + + $sMessage - (string): The text of the debug message to be sent. + */ + function debug($sMessage) + { + $this->aDebugMessages[] = $sMessage; + } + + /* + Function: send + + Prints the response object to the output stream, thus sending the response to the client. + */ + function send() + { + if (NULL != $this->objResponse) { + foreach ($this->aDebugMessages as $sMessage) + $this->objResponse->debug($sMessage); + $this->aDebugMessages = array(); + $this->objResponse->printOutput(); + } + } + + /* + Function: getCharacterEncoding + + Called automatically by new response objects as they are constructed to obtain the + current character encoding setting. As the character encoding is changed, the + will automatically notify the current response object since it would have been constructed + prior to the setting change, see . + */ + function getCharacterEncoding() + { + return $this->sCharacterEncoding; + } + + /* + Function: getOutputEntities + + Called automatically by new response objects as they are constructed to obtain the + current output entities setting. As the output entities setting is changed, the + will automatically notify the current response object since it would + have been constructed prior to the setting change, see . + */ + function getOutputEntities() + { + return $this->bOutputEntities; + } +} \ No newline at end of file diff --git a/phpgwapi/inc/xajax/xajax_core/xajax_lang_de.inc.php b/phpgwapi/inc/xajax/xajax_core/xajax_lang_de.inc.php new file mode 100644 index 0000000000..63d35c9a6e --- /dev/null +++ b/phpgwapi/inc/xajax/xajax_core/xajax_lang_de.inc.php @@ -0,0 +1,88 @@ + for a detailed description, copyright + and license information. + + Translations provided by: (Thank you!) + - mic + - q_no +*/ + +/* + @package xajax + @version $Id: xajax_lang_de.inc.php 362 2007-05-29 15:32:24Z calltoconstruct $ + @copyright Copyright (c) 2005-2007 by Jared White & J. Max Wilson + @copyright Copyright (c) 2008-2009 by Joseph Woolley, Steffen Konerow, Jared White & J. Max Wilson + @license http://www.xajaxproject.org/bsd_license.txt BSD License +*/ + +//SkipAIO + +$objLanguageManager =& xajaxLanguageManager::getInstance(); +$objLanguageManager->register('de', array( + 'LOGHDR:01' => '** xajax Fehler Protokoll - ', + 'LOGHDR:02' => " **\n", + 'LOGHDR:03' => "\n\n\n", + 'LOGERR:01' => "** Protokolliere Fehler **\n\nxajax konnte den Fehler nicht in die Protokolldatei schreiben:\n", + 'LOGMSG:01' => "** PHP Fehlermeldungen: **", + 'CMPRSJS:RDERR:01' => 'Die unkomprimierte JavaScript-Datei konnte nicht gefunden werden im Verzeichnis: ', + 'CMPRSJS:RDERR:02' => '. Fehler ', + 'CMPRSJS:WTERR:01' => 'Die komprimierte xajax JavaScript-Datei konnte nicht in das Verzeichnis ', + 'CMPRSJS:WTERR:02' => ' geschrieben werden. Fehler ', + 'CMPRSPHP:WTERR:01' => 'Die komprimierte xajax Datei ', + 'CMPRSPHP:WTERR:02' => ' konnte nicht geschrieben werden. Fehler ', + 'CMPRSAIO:WTERR:01' => 'Die komprimierte xajax Datei ', + 'CMPRSAIO:WTERR:02' => '/xajaxAIO.inc.php konnte nicht geschrieben werden. Fehler ', + 'DTCTURI:01' => 'xajax Fehler: xajax konnte die Request URI nicht automatisch identifizieren.', + 'DTCTURI:02' => 'Bitte setzen sie die Request URI explizit wenn sie die xajax Klasse instanziieren.', + 'ARGMGR:ERR:01' => 'Fehlerhaftes Objekt erhalten: ', + 'ARGMGR:ERR:02' => ' <==> ', + 'ARGMGR:ERR:03' => 'Die erhaltenen xajax Daten konnte nicht aus UTF8 konvertiert werden.', + 'XJXCTL:IAERR:01' => 'Ungültiges Attribut [', + 'XJXCTL:IAERR:02' => '] für Element [', + 'XJXCTL:IAERR:03' => '].', + 'XJXCTL:IRERR:01' => 'Ungültiges Request-Objekt übergeben an xajaxControl::setEvent', + 'XJXCTL:IEERR:01' => 'Ungültiges Attribut (event name) [', + 'XJXCTL:IEERR:02' => '] für Element [', + 'XJXCTL:IEERR:03' => '].', + 'XJXCTL:MAERR:01' => 'Erforderliches Attribut fehlt [', + 'XJXCTL:MAERR:02' => '] für Element [', + 'XJXCTL:MAERR:03' => '].', + 'XJXCTL:IETERR:01' => "Ungültiges End-Tag; Sollte 'forbidden' oder 'optional' sein.\n", + 'XJXCTL:ICERR:01' => "Ungültige Klasse für html control angegeben.; Sollte %inline, %block oder %flow sein.\n", + 'XJXCTL:ICLERR:01' => 'Ungültige Klasse (control) an addChild übergeben; Sollte abgeleitet sein von xajaxControl.', + 'XJXCTL:ICLERR:02' => 'Ungültige Klasse (control) an addChild übergeben [', + 'XJXCTL:ICLERR:03' => '] für Element [', + 'XJXCTL:ICLERR:04' => "].\n", + 'XJXCTL:ICHERR:01' => 'Ungültiger Parameter übergeben für xajaxControl::addChildren; Array aus xajaxControl Objekten erwartet.', + 'XJXCTL:MRAERR:01' => 'Erforderliches Attribut fehlt [', + 'XJXCTL:MRAERR:02' => '] für Element [', + 'XJXCTL:MRAERR:03' => '].', + 'XJXPLG:GNERR:01' => 'Response plugin sollte die Funktion getName überschreiben.', + 'XJXPLG:PERR:01' => 'Response plugin sollte die process Funktion überschreiben.', + 'XJXPM:IPLGERR:01' => 'Versuch ungültiges Plugin zu registrieren: : ', + 'XJXPM:IPLGERR:02' => ' Ableitung von xajaxRequestPlugin oder xajaxResponsePlugin erwartet.', + 'XJXPM:MRMERR:01' => 'Konnte die Registrierungsmethode nicht finden für: : ', + 'XJXRSP:EDERR:01' => 'Die Angabe der Zeichensatzkodierung in der xajaxResponse ist veraltet. Die neue Funktion lautet: $xajax->configure("characterEncoding", ...);', + 'XJXRSP:MPERR:01' => 'Ungültiger oder fehlender Pluginname festgestellt im Aufruf von xajaxResponse::plugin', + 'XJXRSP:CPERR:01' => "Der Parameter \$sType in addCreate ist veraltet. Die neue Funktion lautet addCreateInput()", + 'XJXRSP:LCERR:01' => "Das xajax response Objeckt konnte die Befehler nich verarbeiten, da kein gültiges Array übergeben wurde.", + 'XJXRSP:AKERR:01' => 'Ungültiger Tag-Name im Array.', + 'XJXRSP:IEAERR:01' => 'Ungeeignet kodiertes Array.', + 'XJXRSP:NEAERR:01' => 'Nicht kodiertes Array festgestellt.', + 'XJXRSP:MBEERR:01' => 'Die Ausgabe vonn xajax response konnte nicht in htmlentities umgewandelt werden, da die Funktion mb_convert_encoding nicht verfügbar ist.', + 'XJXRSP:MXRTERR' => 'Fehler: Kann keine verschiedenen Typen in einer einzelnen Antwort verarbeiten.', + 'XJXRSP:MXCTERR' => 'Fehler: Kann keine verschiedenen Content-Types in einer einzelnen Antwort verarbeiten.', + 'XJXRSP:MXCEERR' => 'Fehler: Kann keine verschiedenen Zeichensatzkodierungen in einer einzelnen Antwort verarbeiten.', + 'XJXRSP:MXOEERR' => 'Fehler: Kann keine output entities (true/false) in ener einzelnen Antwort verarbeiten.', + 'XJXRM:IRERR' => 'Ungültige Antwort erhalten während der Ausführung der Anfrage.', + 'XJXRM:MXRTERR' => 'Fehler: Kann kkeine verschiedenen reponse types benutzen während der Ausführung einer Anfrage: ' + )); + +//EndSkipAIO \ No newline at end of file diff --git a/phpgwapi/inc/xajax/xajax_core/xajax_lang_nl.inc.php b/phpgwapi/inc/xajax/xajax_core/xajax_lang_nl.inc.php new file mode 100644 index 0000000000..6e19638328 --- /dev/null +++ b/phpgwapi/inc/xajax/xajax_core/xajax_lang_nl.inc.php @@ -0,0 +1,79 @@ + for a detailed description, copyright + and license information. + + Translations provided by: (Thank you!) + - Jeffrey +*/ + +//SkipAIO + +$objLanguageManager =& xajaxLanguageManager::getInstance(); +$objLanguageManager->register('nl', array( + 'LOGHDR:01' => '** xajax Foutmelding logboek - ', + 'LOGHDR:02' => " **\n", + 'LOGHDR:03' => "\n\n\n", + 'LOGERR:01' => "** Logboek fouten **\n\nxajax was niet in staat om te schrijven naar het logboek:\n", + 'LOGMSG:01' => "** PHP Foutmeldingen: **", + 'CMPRSJS:RDERR:01' => 'Het xajax ongecomprimeerde Javascript bestand kon niet worden gevonden in de: ', + 'CMPRSJS:RDERR:02' => '. map. ', + 'CMPRSJS:WTERR:01' => 'Het xajax gecomprimeerde Javascript bestand kon niet worden geschreven in de: ', + 'CMPRSJS:WTERR:02' => ' map. Fout ', + 'CMPRSPHP:WTERR:01' => 'Naar het xajax gecomprimeerde bestand ', + 'CMPRSPHP:WTERR:02' => ' kon niet worden geschreven. Fout ', + 'CMPRSAIO:WTERR:01' => 'Naar het xajax gecomprimeerde bestand ', + 'CMPRSAIO:WTERR:02' => '/xajaxAIO.inc.php kon niet worden geschreven. Fout ', + 'DTCTURI:01' => 'xajax Fout: xajax kon de Request URI niet automatisch identificeren.', + 'DTCTURI:02' => 'Alstublieft, specificeer de Request URI expliciet bij het initiëren van het xajax object.', + 'ARGMGR:ERR:01' => 'Misvormd object argument ontvangen: ', + 'ARGMGR:ERR:02' => ' <==> ', + 'ARGMGR:ERR:03' => 'De binnenkomende xajax data kon niet wordt geconverteerd van UTF-8.', + 'XJXCTL:IAERR:01' => 'Ongeldig attribuut [', + 'XJXCTL:IAERR:02' => '] voor element [', + 'XJXCTL:IAERR:03' => '].', + 'XJXCTL:IRERR:01' => 'Ongeldige object aanvraag doorgegeven aan xajaxControl::setEvent', + 'XJXCTL:IEERR:01' => 'Ongeldig attribuut (event name) [', + 'XJXCTL:IEERR:02' => '] voor element [', + 'XJXCTL:IEERR:03' => '].', + 'XJXCTL:MAERR:01' => 'Ontbrekend attribuut [', + 'XJXCTL:MAERR:02' => '] voor element [', + 'XJXCTL:MAERR:03' => '].', + 'XJXCTL:IETERR:01' => "Ongeldige eind-tag; zou 'forbidden' of 'optional' moeten zijn..\n", + 'XJXCTL:ICERR:01' => "Ongeldige klasse gespecificeerd voor html control.; zou %inline, %block of %flow moeten zijn.\n", + 'XJXCTL:ICLERR:01' => 'Ongeldige (control) doorgegeven aan addChild; Zou moeten worden afgeleid van xajaxControl.', + 'XJXCTL:ICLERR:02' => 'Ongeldige (control) doorgegeven aan addChild [', + 'XJXCTL:ICLERR:03' => '] voor element [', + 'XJXCTL:ICLERR:04' => "].\n", + 'XJXCTL:ICHERR:01' => 'Ongeldige parameter doorgegeven aan xajaxControl::addChildren; Array moet bestaan uit xajaxControl objecten.', + 'XJXCTL:MRAERR:01' => 'Ontbrekend attribuut [', + 'XJXCTL:MRAERR:02' => '] voor element [', + 'XJXCTL:MRAERR:03' => '].', + 'XJXPLG:GNERR:01' => 'Retourneer plugin zou de getName functie moeten overschrijven.', + 'XJXPLG:PERR:01' => 'Retourneer plugin zou de proces functie moeten overschrijven.', + 'XJXPM:IPLGERR:01' => 'Poging om ongeldige plugin te registreren: : ', + 'XJXPM:IPLGERR:02' => ' afleiding moet komen van xajaxRequestPlugin of xajaxResponsePlugin.', + 'XJXPM:MRMERR:01' => 'Localisatie van registratie methode faalde voor het volgende: : ', + 'XJXRSP:EDERR:01' => 'Doorgeven van karakter decodering naar de xajaxResponse constructie is verouderd. De nieuwe functie luidt: $xajax->configure("characterEncoding", ...);', + 'XJXRSP:MPERR:01' => 'Ongeldige of ontbrekende plugin naam gedetecteerd in een aanvraag naar xajaxResponse::plugin', + 'XJXRSP:CPERR:01' => "De parameter \$sType in addCreate is verouderd.. De nieuwe functie luidt addCreateInput()", + 'XJXRSP:LCERR:01' => "Het xajax antwoord object kon de commando's niet laden, gezien de meegegeven data geen geldige array is.", + 'XJXRSP:AKERR:01' => 'Ongeldige ge-encodeerde tag naam in array', + 'XJXRSP:IEAERR:01' => 'Ungeeignet kodiertes Array.', + 'XJXRSP:NEAERR:01' => 'Niet gecodeerde array gedetecteerd.', + 'XJXRSP:MBEERR:01' => 'De xajax output kon niet worden geconverteerd naar HTML entities, gezien mb_convert_encoding niet beschikbaar is.', + 'XJXRSP:MXRTERR' => 'Fout: Kann keine verschiedenen Typen in einer einzelnen Antwort verarbeiten.', + 'XJXRSP:MXCTERR' => 'Fout: Kan geen meerdere typen verwisselen in een enkele teruggave.', + 'XJXRSP:MXCEERR' => 'Fout: Kan geen meerdere karakter decoderingen verwerken in een enkele teruggave.', + 'XJXRSP:MXOEERR' => 'Fout: kan geen output entities (true/false) in een enkele teruggave verwerken.', + 'XJXRM:IRERR' => 'Een ongeldig antwoord is geretourneerd tijdens het verwerken van deze aanvraag.', + 'XJXRM:MXRTERR' => 'Fout: Kan geen meerdere typen verwisselen tijdens het verwerken van een enkele aanvraag: ' + )); + +//EndSkipAIO \ No newline at end of file diff --git a/phpgwapi/inc/xajax/xajax_js/xajax_core.js b/phpgwapi/inc/xajax/xajax_js/xajax_core.js new file mode 100644 index 0000000000..2d9299ded1 --- /dev/null +++ b/phpgwapi/inc/xajax/xajax_js/xajax_core.js @@ -0,0 +1,411 @@ + +if('undefined'==typeof xajax) +xajax={};if('undefined'==typeof xajax.config) +xajax.config={};xajax.config.setDefault=function(option,defaultValue){if('undefined'==typeof xajax.config[option]) +xajax.config[option]=defaultValue;} +xajax.config.setDefault('commonHeaders',{'If-Modified-Since':'Sat, 1 Jan 2000 00:00:00 GMT' +});xajax.config.setDefault('postHeaders',{});xajax.config.setDefault('getHeaders',{});xajax.config.setDefault('waitCursor',false);xajax.config.setDefault('statusMessages',false);xajax.config.setDefault('baseDocument',document);xajax.config.setDefault('requestURI',xajax.config.baseDocument.URL);xajax.config.setDefault('defaultMode','asynchronous');xajax.config.setDefault('defaultHttpVersion','HTTP/1.1');xajax.config.setDefault('defaultContentType','application/x-www-form-urlencoded');xajax.config.setDefault('defaultResponseDelayTime',1000);xajax.config.setDefault('defaultExpirationTime',10000);xajax.config.setDefault('defaultMethod','POST');xajax.config.setDefault('defaultRetry',5);xajax.config.setDefault('defaultReturnValue',false);xajax.config.setDefault('maxObjectDepth',20);xajax.config.setDefault('maxObjectSize',2000);xajax.config.setDefault('responseQueueSize',1000);xajax.config.status={update:function(){return{onRequest:function(){window.status='Sending Request...';}, +onWaiting:function(){window.status='Waiting for Response...';}, +onProcessing:function(){window.status='Processing...';}, +onComplete:function(){window.status='Done.';} +} +}, +dontUpdate:function(){return{onRequest:function(){}, +onWaiting:function(){}, +onProcessing:function(){}, +onComplete:function(){} +} +} +} +xajax.config.cursor={update:function(){return{onWaiting:function(){if(xajax.config.baseDocument.body) +xajax.config.baseDocument.body.style.cursor='wait';}, +onComplete:function(){xajax.config.baseDocument.body.style.cursor='auto';} +} +}, +dontUpdate:function(){return{onWaiting:function(){}, +onComplete:function(){} +} +} +} +xajax.tools={} +xajax.tools.$=function(sId){if(!sId) +return null;var oDoc=xajax.config.baseDocument;var obj=oDoc.getElementById(sId);if(obj) +return obj;if(oDoc.all) +return oDoc.all[sId];return obj;} +xajax.tools.arrayContainsValue=function(array,valueToCheck){var i=0;var l=array.length;while(i < l){if(array[i]==valueToCheck) +return true;++i;} +return false;} +xajax.tools.doubleQuotes=function(haystack){return haystack.replace(new RegExp("'",'g'),'"');} +xajax.tools.singleQuotes=function(haystack){return haystack.replace(new RegExp('"','g'),"'");} +xajax.tools._escape=function(data){if('undefined'==typeof data) +return data;if('string'!=typeof data) +return data;var needCDATA=false;if(encodeURIComponent(data)!=data){needCDATA=true;var segments=data.split('');var fragLen=fragments.length;segment='';for(var j=0;j < fragLen;++j){if(0!=j) +segment+=']]]]>';segment+=fragments[j];} +if(0!=i) +data.push('';return data;} +xajax.tools._objectToXML=function(obj,guard){var aXml=[];aXml.push('');for(var key in obj){++guard.size;if(guard.maxSize < guard.size) +return aXml.join('');if('undefined'!=typeof obj[key]){if('constructor'==key) +continue;if('function'==typeof obj[key]) +continue;aXml.push('');var val=xajax.tools._escape(key);aXml.push(val);aXml.push('');if('object'==typeof obj[key]){++guard.depth;if(guard.maxDepth > guard.depth){try{aXml.push(xajax.tools._objectToXML(obj[key],guard));}catch(e){} +} +--guard.depth;}else{var val=xajax.tools._escape(obj[key]);if('undefined'==typeof val||null==val){aXml.push('*');}else{var sType=typeof val;if('string'==sType) +aXml.push('S');else if('boolean'==sType) +aXml.push('B');else if('number'==sType) +aXml.push('N');aXml.push(val);} +} +aXml.push('');} +} +aXml.push('');return aXml.join('');} +xajax.tools._enforceDataType=function(value){value=new String(value);var type=value.substr(0,1);value=value.substr(1);if('*'==type) +value=null;else if('N'==type) +value=value-0;else if('B'==type) +value=!!value;return value;} +xajax.tools._nodeToObject=function(node){if(null==node) +return '';if('undefined'!=typeof node.nodeName){if('#cdata-section'==node.nodeName||'#text'==node.nodeName){var data='';do if(node.data)data+=node.data;while(node=node.nextSibling);return xajax.tools._enforceDataType(data);}else if('xjxobj'==node.nodeName){var key=null;var value=null;var data=new Array;var child=node.firstChild;while(child){if('e'==child.nodeName){var grandChild=child.firstChild;while(grandChild){if('k'==grandChild.nodeName) +key=xajax.tools._enforceDataType(grandChild.firstChild.data);else('v'==grandChild.nodeName) +value=xajax.tools._nodeToObject(grandChild.firstChild);grandChild=grandChild.nextSibling;} +if(null!=key){data[key]=value;key=value=null;} +} +child=child.nextSibling;} +return data;} +} +throw{code:10001,data:node.nodeName};} +xajax.tools.getRequestObject=function(){if('undefined'!=typeof XMLHttpRequest){xajax.tools.getRequestObject=function(){return new XMLHttpRequest();} +}else if('undefined'!=typeof ActiveXObject){xajax.tools.getRequestObject=function(){try{return new ActiveXObject('Msxml2.XMLHTTP.4.0');}catch(e){xajax.tools.getRequestObject=function(){try{return new ActiveXObject('Msxml2.XMLHTTP');}catch(e2){xajax.tools.getRequestObject=function(){return new ActiveXObject('Microsoft.XMLHTTP');} +return xajax.tools.getRequestObject();} +} +return xajax.tools.getRequestObject();} +} +}else if(window.createRequest){xajax.tools.getRequestObject=function(){return window.createRequest();} +}else{xajax.tools.getRequestObject=function(){throw{code:10002};} +} +return xajax.tools.getRequestObject();} +xajax.tools.getBrowserHTML=function(sValue){var oDoc=xajax.config.baseDocument;if(!oDoc.body) +return '';var elWorkspace=xajax.$('xajax_temp_workspace');if(!elWorkspace){elWorkspace=oDoc.createElement('div');elWorkspace.setAttribute('id','xajax_temp_workspace');elWorkspace.style.display='none';elWorkspace.style.visibility='hidden';oDoc.body.appendChild(elWorkspace);} +elWorkspace.innerHTML=sValue;var browserHTML=elWorkspace.innerHTML;elWorkspace.innerHTML='';return browserHTML;} +xajax.tools.willChange=function(element,attribute,newData){if('string'==typeof element) +element=xajax.$(element);if(element){var oldData;eval('oldData=element.'+attribute);return(newData!=oldData);} +return false;} +xajax.tools.getFormValues=function(parent){var submitDisabledElements=false;if(arguments.length > 1&&arguments[1]==true) +submitDisabledElements=true;var prefix='';if(arguments.length > 2) +prefix=arguments[2];if('string'==typeof parent) +parent=xajax.$(parent);var aFormValues={};if(parent) +if(parent.childNodes) +xajax.tools._getFormValues(aFormValues,parent.childNodes,submitDisabledElements,prefix);return aFormValues;} +xajax.tools._getFormValues=function(aFormValues,children,submitDisabledElements,prefix){var iLen=children.length;for(var i=0;i < iLen;++i){var child=children[i];if('undefined'!=typeof child.childNodes) +xajax.tools._getFormValues(aFormValues,child.childNodes,submitDisabledElements,prefix);xajax.tools._getFormValue(aFormValues,child,submitDisabledElements,prefix);} +} +xajax.tools._getFormValue=function(aFormValues,child,submitDisabledElements,prefix){if(!child.name) +return;if('PARAM'==child.tagName)return;if(child.disabled) +if(true==child.disabled) +if(false==submitDisabledElements) +return;if(prefix!=child.name.substring(0,prefix.length)) +return;if(child.type) +if(child.type=='radio'||child.type=='checkbox') +if(false==child.checked) +return;var name=child.name;var values=[];if('select-multiple'==child.type){var jLen=child.length;for(var j=0;j < jLen;++j){var option=child.options[j];if(true==option.selected) +values.push(option.value);} +}else{values=child.value;} +var keyBegin=name.indexOf('[');if(0 <=keyBegin){var n=name;var k=n.substr(0,n.indexOf('['));var a=n.substr(n.indexOf('['));if(typeof aFormValues[k]=='undefined') +aFormValues[k]=[];var p=aFormValues;while(a.length!=0){var sa=a.substr(0,a.indexOf(']')+1);var lk=k;var lp=p;a=a.substr(a.indexOf(']')+1);p=p[k];k=sa.substr(1,sa.length-2);if(k==''){if('select-multiple'==child.type){k=lk;p=lp;}else{k=p.length;} +} +if(typeof p[k]=='undefined') +p[k]=[];} +p[k]=values;}else{aFormValues[name]=values;} +} +xajax.tools.stripOnPrefix=function(sEventName){sEventName=sEventName.toLowerCase();if(0==sEventName.indexOf('on')) +sEventName=sEventName.replace(/on/,'');return sEventName;} +xajax.tools.addOnPrefix=function(sEventName){sEventName=sEventName.toLowerCase();if(0!=sEventName.indexOf('on')) +sEventName='on'+sEventName;return sEventName;} +xajax.tools.xml={};xajax.tools.xml.parseAttributes=function(child,obj){var iLen=child.attributes.length;for(var i=0;i < iLen;++i){var attr=child.attributes[i];obj[attr.name]=attr.value;} +} +xajax.tools.xml.parseChildren=function(child,obj){obj.data='';if(0 < child.childNodes.length){if(1 < child.childNodes.length){var grandChild=child.firstChild;do{if('#cdata-section'==grandChild.nodeName||'#text'==grandChild.nodeName){obj.data+=grandChild.data;} +}while(grandChild=grandChild.nextSibling);}else{var grandChild=child.firstChild;if('xjxobj'==grandChild.nodeName){obj.data=xajax.tools._nodeToObject(grandChild);return;}else if('#cdata-section'==grandChild.nodeName||'#text'==grandChild.nodeName){obj.data=grandChild.data;} +} +}else if('undefined'!=typeof child.data){obj.data=child.data;} +obj.data=xajax.tools._enforceDataType(obj.data);} +xajax.tools.xml.processFragment=function(xmlNode,seq,oRet,oRequest){var xx=xajax;var xt=xx.tools;while(xmlNode){if('cmd'==xmlNode.nodeName){var obj={};obj.fullName='*unknown*';obj.sequence=seq;obj.request=oRequest;obj.context=oRequest.context;xt.xml.parseAttributes(xmlNode,obj);xt.xml.parseChildren(xmlNode,obj);xt.queue.push(xx.response,obj);}else if('xjxrv'==xmlNode.nodeName){oRet=xt._nodeToObject(xmlNode.firstChild);}else if('debugmsg'==xmlNode.nodeName){}else +throw{code:10004,data:xmlNode.nodeName} +++seq;xmlNode=xmlNode.nextSibling;} +return oRet;} +xajax.tools.queue={} +xajax.tools.queue.create=function(size){return{start:0, +size:size, +end:0, +commands:[], +timeout:null +} +} +xajax.tools.queue.retry=function(obj,count){var retries=obj.retries;if(retries){--retries;if(1 > retries) +return false;}else retries=count;obj.retries=retries;return true;} +xajax.tools.queue.rewind=function(theQ){if(0 < theQ.start) +--theQ.start;else +theQ.start=theQ.size;} +xajax.tools.queue.setWakeup=function(theQ,when){if(null!=theQ.timeout){clearTimeout(theQ.timeout);theQ.timeout=null;} +theQ.timout=setTimeout(function(){xajax.tools.queue.process(theQ);},when);} +xajax.tools.queue.process=function(theQ){if(null!=theQ.timeout){clearTimeout(theQ.timeout);theQ.timeout=null;} +var obj=xajax.tools.queue.pop(theQ);while(null!=obj){try{if(false==xajax.executeCommand(obj)) +return false;}catch(e){} +delete obj;obj=xajax.tools.queue.pop(theQ);} +return true;} +xajax.tools.queue.push=function(theQ,obj){var next=theQ.end+1;if(next > theQ.size) +next=0;if(next!=theQ.start){theQ.commands[theQ.end]=obj;theQ.end=next;}else +throw{code:10003} +} +xajax.tools.queue.pushFront=function(theQ,obj){xajax.tools.queue.rewind(theQ);theQ.commands[theQ.start]=obj;} +xajax.tools.queue.pop=function(theQ){var next=theQ.start;if(next==theQ.end) +return null;next++;if(next > theQ.size) +next=0;var obj=theQ.commands[theQ.start];delete theQ.commands[theQ.start];theQ.start=next;return obj;} +xajax.responseProcessor={};xajax.responseProcessor.xml=function(oRequest){var xx=xajax;var xt=xx.tools;var xcb=xx.callback;var gcb=xcb.global;var lcb=oRequest.callback;var oRet=oRequest.returnValue;if(xt.arrayContainsValue(xx.responseSuccessCodes,oRequest.request.status)){xcb.execute([gcb,lcb],'onSuccess',oRequest);var seq=0;if(oRequest.request.responseXML){var responseXML=oRequest.request.responseXML;if(responseXML.documentElement){oRequest.status.onProcessing();var child=responseXML.documentElement.firstChild;oRet=xt.xml.processFragment(child,seq,oRet,oRequest);} +} +var obj={};obj.fullName='Response Complete';obj.sequence=seq;obj.request=oRequest;obj.context=oRequest.context;obj.cmd='rcmplt';xt.queue.push(xx.response,obj);if(null==xx.response.timeout) +xt.queue.process(xx.response);}else if(xt.arrayContainsValue(xx.responseRedirectCodes,oRequest.request.status)){xcb.execute([gcb,lcb],'onRedirect',oRequest);window.location=oRequest.request.getResponseHeader('location');xx.completeResponse(oRequest);}else if(xt.arrayContainsValue(xx.responseErrorsForAlert,oRequest.request.status)){xcb.execute([gcb,lcb],'onFailure',oRequest);xx.completeResponse(oRequest);} +return oRet;} +xajax.js={} +xajax.js.includeScriptOnce=function(command){command.fullName='includeScriptOnce';var fileName=command.data;var oDoc=xajax.config.baseDocument;var loadedScripts=oDoc.getElementsByTagName('script');var iLen=loadedScripts.length;for(var i=0;i < iLen;++i){var script=loadedScripts[i];if(script.src){if(0 <=script.src.indexOf(fileName)) +return true;} +} +return xajax.js.includeScript(command);} +xajax.js.includeScript=function(command){command.fullName='includeScript';var oDoc=xajax.config.baseDocument;var objHead=oDoc.getElementsByTagName('head');var objScript=oDoc.createElement('script');objScript.src=command.data;if('undefined'==typeof command.type)objScript.type='text/javascript';else objScript.type=command.type;if('undefined'!=typeof command.type)objScript.setAttribute('id',command.elm_id);objHead[0].appendChild(objScript);return true;} +xajax.js.removeScript=function(command){command.fullName='removeScript';var fileName=command.data;var unload=command.unld;var oDoc=xajax.config.baseDocument;var loadedScripts=oDoc.getElementsByTagName('script');var iLen=loadedScripts.length;for(var i=0;i < iLen;++i){var script=loadedScripts[i];if(script.src){if(0 <=script.src.indexOf(fileName)){if('undefined'!=typeof unload){var args={};args.data=unload;args.context=window;xajax.js.execute(args);} +var parent=script.parentNode;parent.removeChild(script);} +} +} +return true;} +xajax.js.sleep=function(command){command.fullName='sleep';if(xajax.tools.queue.retry(command,command.prop)){xajax.tools.queue.setWakeup(xajax.response,100);return false;} +return true;} +xajax.js.confirmCommands=function(command){command.fullName='confirmCommands';var msg=command.data;var numberOfCommands=command.id;if(false==confirm(msg)){while(0 < numberOfCommands){xajax.tools.queue.pop(xajax.response);--numberOfCommands;} +} +return true;} +xajax.js.execute=function(args){args.fullName='execute Javascript';var returnValue=true;args.context.xajaxDelegateCall=function(){eval(args.data);} +args.context.xajaxDelegateCall();return returnValue;} +xajax.js.waitFor=function(args){args.fullName='waitFor';var bResult=false;var cmdToEval='bResult = (';cmdToEval+=args.data;cmdToEval+=');';try{args.context.xajaxDelegateCall=function(){eval(cmdToEval);} +args.context.xajaxDelegateCall();}catch(e){} +if(false==bResult){if(xajax.tools.queue.retry(args,args.prop)){xajax.tools.queue.setWakeup(xajax.response,100);return false;} +} +return true;} +xajax.js.call=function(args){args.fullName='call js function';var parameters=args.data;var scr=new Array();scr.push(args.func);scr.push('(');if('undefined'!=typeof parameters){if('object'==typeof parameters){var iLen=parameters.length;if(0 < iLen){scr.push('parameters[0]');for(var i=1;i < iLen;++i) +scr.push(', parameters['+i+']');} +} +} +scr.push(');');args.context.xajaxDelegateCall=function(){eval(scr.join(''));} +args.context.xajaxDelegateCall();return true;} +xajax.js.setFunction=function(args){args.fullName='setFunction';var code=new Array();code.push(args.func);code.push(' = function(');if('object'==typeof args.prop){var separator='';for(var m in args.prop){code.push(separator);code.push(args.prop[m]);separator=',';} +}else code.push(args.prop);code.push(') { ');code.push(args.data);code.push(' }');args.context.xajaxDelegateCall=function(){eval(code.join(''));} +args.context.xajaxDelegateCall();return true;} +xajax.js.wrapFunction=function(args){args.fullName='wrapFunction';var code=new Array();code.push(args.func);code.push(' = xajax.js.makeWrapper(');code.push(args.func);code.push(', args.prop, args.data, args.type, args.context);');args.context.xajaxDelegateCall=function(){eval(code.join(''));} +args.context.xajaxDelegateCall();return true;} +xajax.js.makeWrapper=function(origFun,args,codeBlocks,returnVariable,context){var originalCall='';if(0 < returnVariable.length){originalCall+=returnVariable;originalCall+=' = ';} +var originalCall='origFun(';originalCall+=args;originalCall+='); ';var code='wrapper = function(';code+=args;code+=') { ';if(0 < returnVariable.length){code+=' var ';code+=returnVariable;code+=' = null;';} +var separator='';var bLen=codeBlocks.length;for(var b=0;b < bLen;++b){code+=separator;code+=codeBlocks[b];separator=originalCall;} +if(0 < returnVariable.length){code+=' return ';code+=returnVariable;code+=';';} +code+=' } ';var wrapper=null;context.xajaxDelegateCall=function(){eval(code);} +context.xajaxDelegateCall();return wrapper;} +xajax.dom={} +xajax.dom.assign=function(element,property,data){if('string'==typeof element) +element=xajax.$(element);switch(property){case 'innerHTML': +element.innerHTML=data;break;case 'outerHTML': +if('undefined'==typeof element.outerHTML){var r=xajax.config.baseDocument.createRange();r.setStartBefore(element);var df=r.createContextualFragment(data);element.parentNode.replaceChild(df,element);}else element.outerHTML=data;break;default: +if(xajax.tools.willChange(element,property,data)) +eval('element.'+property+' = data;');break;} +return true;} +xajax.dom.append=function(element,property,data){if('string'==typeof element) +element=xajax.$(element);eval('element.'+property+' += data;');return true;} +xajax.dom.prepend=function(element,property,data){if('string'==typeof element) +element=xajax.$(element);eval('element.'+property+' = data + element.'+property);return true;} +xajax.dom.replace=function(element,sAttribute,aData){var sSearch=aData['s'];var sReplace=aData['r'];if(sAttribute=='innerHTML') +sSearch=xajax.tools.getBrowserHTML(sSearch);if('string'==typeof element) +element=xajax.$(element);eval('var txt = element.'+sAttribute);var bFunction=false;if('function'==typeof txt){txt=txt.join('');bFunction=true;} +var start=txt.indexOf(sSearch);if(start >-1){var newTxt=[];while(start >-1){var end=start+sSearch.length;newTxt.push(txt.substr(0,start));newTxt.push(sReplace);txt=txt.substr(end,txt.length-end);start=txt.indexOf(sSearch);} +newTxt.push(txt);newTxt=newTxt.join('');if(bFunction){eval('element.'+sAttribute+'=newTxt;');}else if(xajax.tools.willChange(element,sAttribute,newTxt)){eval('element.'+sAttribute+'=newTxt;');} +} +return true;} +xajax.dom.remove=function(element){if('string'==typeof element) +element=xajax.$(element);if(element&&element.parentNode&&element.parentNode.removeChild) +element.parentNode.removeChild(element);return true;} +xajax.dom.create=function(objParent,sTag,sId){if('string'==typeof objParent) +objParent=xajax.$(objParent);var target=xajax.config.baseDocument.createElement(sTag);target.setAttribute('id',sId);if(objParent) +objParent.appendChild(target);return true;} +xajax.dom.insert=function(objSibling,sTag,sId){if('string'==typeof objSibling) +objSibling=xajax.$(objSibling);var target=xajax.config.baseDocument.createElement(sTag);target.setAttribute('id',sId);objSibling.parentNode.insertBefore(target,objSibling);return true;} +xajax.dom.insertAfter=function(objSibling,sTag,sId){if('string'==typeof objSibling) +objSibling=xajax.$(objSibling);var target=xajax.config.baseDocument.createElement(sTag);target.setAttribute('id',sId);objSibling.parentNode.insertBefore(target,objSibling.nextSibling);return true;} +xajax.dom.contextAssign=function(args){args.fullName='context assign';var code=[];code.push('this.');code.push(args.prop);code.push(' = data;');code=code.join('');args.context.xajaxDelegateCall=function(data){eval(code);} +args.context.xajaxDelegateCall(args.data);return true;} +xajax.dom.contextAppend=function(args){args.fullName='context append';var code=[];code.push('this.');code.push(args.prop);code.push(' += data;');code=code.join('');args.context.xajaxDelegateCall=function(data){eval(code);} +args.context.xajaxDelegateCall(args.data);return true;} +xajax.dom.contextPrepend=function(args){args.fullName='context prepend';var code=[];code.push('this.');code.push(args.prop);code.push(' = data + this.');code.push(args.prop);code.push(';');code=code.join('');args.context.xajaxDelegateCall=function(data){eval(code);} +args.context.xajaxDelegateCall(args.data);return true;} +xajax.css={} +xajax.css.add=function(fileName,media){var oDoc=xajax.config.baseDocument;var oHeads=oDoc.getElementsByTagName('head');var oHead=oHeads[0];var oLinks=oHead.getElementsByTagName('link');var found=false;var iLen=oLinks.length;for(var i=0;i < iLen&&false==found;++i) +if(0 <=oLinks[i].href.indexOf(fileName)&&oLinks[i].media==media) +found=true;if(false==found){var oCSS=oDoc.createElement('link');oCSS.rel='stylesheet';oCSS.type='text/css';oCSS.href=fileName;oCSS.media=media;oHead.appendChild(oCSS);} +return true;} +xajax.css.remove=function(fileName,media){var oDoc=xajax.config.baseDocument;var oHeads=oDoc.getElementsByTagName('head');var oHead=oHeads[0];var oLinks=oHead.getElementsByTagName('link');var i=0;while(i < oLinks.length) +if(0 <=oLinks[i].href.indexOf(fileName)&&oLinks[i].media==media) +oHead.removeChild(oLinks[i]);else++i;return true;} +xajax.css.waitForCSS=function(args){var oDocSS=xajax.config.baseDocument.styleSheets;var ssEnabled=[];var iLen=oDocSS.length;for(var i=0;i < iLen;++i){ssEnabled[i]=0;try{ssEnabled[i]=oDocSS[i].cssRules.length;}catch(e){try{ssEnabled[i]=oDocSS[i].rules.length;}catch(e){} +} +} +var ssLoaded=true;var iLen=ssEnabled.length;for(var i=0;i < iLen;++i) +if(0==ssEnabled[i]) +ssLoaded=false;if(false==ssLoaded){if(xajax.tools.queue.retry(args,args.prop)){xajax.tools.queue.setWakeup(xajax.response,10);return false;} +} +return true;} +xajax.forms={} +xajax.forms.getInput=function(type,name,id){if('undefined'==typeof window.addEventListener){xajax.forms.getInput=function(type,name,id){return xajax.config.baseDocument.createElement('');} +}else{xajax.forms.getInput=function(type,name,id){var oDoc=xajax.config.baseDocument;var Obj=oDoc.createElement('input');Obj.setAttribute('type',type);Obj.setAttribute('name',name);Obj.setAttribute('id',id);return Obj;} +} +return xajax.forms.getInput(type,name,id);} +xajax.forms.createInput=function(command){command.fullName='createInput';var objParent=command.id;var sType=command.type;var sName=command.data;var sId=command.prop;if('string'==typeof objParent) +objParent=xajax.$(objParent);var target=xajax.forms.getInput(sType,sName,sId);if(objParent&&target){objParent.appendChild(target);} +return true;} +xajax.forms.insertInput=function(command){command.fullName='insertInput';var objSibling=command.id;var sType=command.type;var sName=command.data;var sId=command.prop;if('string'==typeof objSibling) +objSibling=xajax.$(objSibling);var target=xajax.forms.getInput(sType,sName,sId);if(target&&objSibling&&objSibling.parentNode) +objSibling.parentNode.insertBefore(target,objSibling);return true;} +xajax.forms.insertInputAfter=function(command){command.fullName='insertInputAfter';var objSibling=command.id;var sType=command.type;var sName=command.data;var sId=command.prop;if('string'==typeof objSibling) +objSibling=xajax.$(objSibling);var target=xajax.forms.getInput(sType,sName,sId);if(target&&objSibling&&objSibling.parentNode) +objSibling.parentNode.insertBefore(target,objSibling.nextSibling);return true;} +xajax.events={} +xajax.events.setEvent=function(command){command.fullName='addEvent';var element=command.id;var sEvent=command.prop;var code=command.data;if('string'==typeof element) +element=xajax.$(element);sEvent=xajax.tools.addOnPrefix(sEvent);code=xajax.tools.doubleQuotes(code);eval('element.'+sEvent+' = function() { '+code+'; }');return true;} +xajax.events.addHandler=function(element,sEvent,fun){if(window.addEventListener){xajax.events.addHandler=function(command){command.fullName='addHandler';var element=command.id;var sEvent=command.prop;var fun=command.data;if('string'==typeof element) +element=xajax.$(element);sEvent=xajax.tools.stripOnPrefix(sEvent);eval('element.addEventListener("'+sEvent+'", '+fun+', false);');return true;} +}else{xajax.events.addHandler=function(command){command.fullName='addHandler';var element=command.id;var sEvent=command.prop;var fun=command.data;if('string'==typeof element) +element=xajax.$(element);sEvent=xajax.tools.addOnPrefix(sEvent);eval('element.attachEvent("'+sEvent+'", '+fun+', false);');return true;} +} +return xajax.events.addHandler(element,sEvent,fun);} +xajax.events.removeHandler=function(element,sEvent,fun){if(window.removeEventListener){xajax.events.removeHandler=function(command){command.fullName='removeHandler';var element=command.id;var sEvent=command.prop;var fun=command.data;if('string'==typeof element) +element=xajax.$(element);sEvent=xajax.tools.stripOnPrefix(sEvent);eval('element.removeEventListener("'+sEvent+'", '+fun+', false);');return true;} +}else{xajax.events.removeHandler=function(command){command.fullName='removeHandler';var element=command.id;var sEvent=command.prop;var fun=command.data;if('string'==typeof element) +element=xajax.$(element);sEvent=xajax.tools.addOnPrefix(sEvent);eval('element.detachEvent("'+sEvent+'", '+fun+', false);');return true;} +} +return xajax.events.removeHandler(element,sEvent,fun);} +xajax.callback={} +xajax.callback.create=function(){var xx=xajax;var xc=xx.config;var xcb=xx.callback;var oCB={} +oCB.timers={};oCB.timers.onResponseDelay=xcb.setupTimer( +(arguments.length > 0) +? arguments[0] +:xc.defaultResponseDelayTime);oCB.timers.onExpiration=xcb.setupTimer( +(arguments.length > 1) +? arguments[1] +:xc.defaultExpirationTime);oCB.onRequest=null;oCB.onResponseDelay=null;oCB.onExpiration=null;oCB.beforeResponseProcessing=null;oCB.onFailure=null;oCB.onRedirect=null;oCB.onSuccess=null;oCB.onComplete=null;return oCB;} +xajax.callback.setupTimer=function(iDelay){return{timer:null,delay:iDelay};} +xajax.callback.clearTimer=function(oCallback,sFunction){if('undefined'!=typeof oCallback.timers){if('undefined'!=typeof oCallback.timers[sFunction]){clearTimeout(oCallback.timers[sFunction].timer);} +}else if('object'==typeof oCallback){var iLen=oCallback.length;for(var i=0;i < iLen;++i) +xajax.callback.clearTimer(oCallback[i],sFunction);} +} +xajax.callback.execute=function(oCallback,sFunction,args){if('undefined'!=typeof oCallback[sFunction]){var func=oCallback[sFunction];if('function'==typeof func){if('undefined'!=typeof oCallback.timers[sFunction]){oCallback.timers[sFunction].timer=setTimeout(function(){func(args);},oCallback.timers[sFunction].delay);} +else{func(args);} +} +}else if('object'==typeof oCallback){var iLen=oCallback.length;for(var i=0;i < iLen;++i) +xajax.callback.execute(oCallback[i],sFunction,args);} +} +xajax.callback.global=xajax.callback.create();xajax.response=xajax.tools.queue.create(xajax.config.responseQueueSize);xajax.responseSuccessCodes=['0','200'];xajax.responseErrorsForAlert=['400','401','402','403','404','500','501','502','503'];xajax.responseRedirectCodes=['301','302','307'];if('undefined'==typeof xajax.command) +xajax.command={};xajax.command.create=function(sequence,request,context){var newCmd={};newCmd.cmd='*';newCmd.fullName='* unknown command name *';newCmd.sequence=sequence;newCmd.request=request;newCmd.context=context;return newCmd;} +if('undefined'==typeof xajax.command.handler) +xajax.command.handler={};if('undefined'==typeof xajax.command.handler.handlers) +xajax.command.handler.handlers=[];xajax.command.handler.register=function(shortName,func){xajax.command.handler.handlers[shortName]=func;} +xajax.command.handler.unregister=function(shortName){var func=xajax.command.handler.handlers[shortName];delete xajax.command.handler.handlers[shortName];return func;} +xajax.command.handler.isRegistered=function(command){var shortName=command.cmd;if(xajax.command.handler.handlers[shortName]) +return true;return false;} +xajax.command.handler.call=function(command){var shortName=command.cmd;return xajax.command.handler.handlers[shortName](command);} +xajax.command.handler.register('rcmplt',function(args){xajax.completeResponse(args.request);return true;});xajax.command.handler.register('css',function(args){args.fullName='includeCSS';if('undefined'==typeof args.media) +args.media='screen';return xajax.css.add(args.data,args.media);});xajax.command.handler.register('rcss',function(args){args.fullName='removeCSS';if('undefined'==typeof args.media) +args.media='screen';return xajax.css.remove(args.data,args.media);});xajax.command.handler.register('wcss',function(args){args.fullName='waitForCSS';return xajax.css.waitForCSS(args);});xajax.command.handler.register('as',function(args){args.fullName='assign/clear';try{return xajax.dom.assign(args.target,args.prop,args.data);}catch(e){} +return true;});xajax.command.handler.register('ap',function(args){args.fullName='append';return xajax.dom.append(args.target,args.prop,args.data);});xajax.command.handler.register('pp',function(args){args.fullName='prepend';return xajax.dom.prepend(args.target,args.prop,args.data);});xajax.command.handler.register('rp',function(args){args.fullName='replace';return xajax.dom.replace(args.id,args.prop,args.data);});xajax.command.handler.register('rm',function(args){args.fullName='remove';return xajax.dom.remove(args.id);});xajax.command.handler.register('ce',function(args){args.fullName='create';return xajax.dom.create(args.id,args.data,args.prop);});xajax.command.handler.register('ie',function(args){args.fullName='insert';return xajax.dom.insert(args.id,args.data,args.prop);});xajax.command.handler.register('ia',function(args){args.fullName='insertAfter';return xajax.dom.insertAfter(args.id,args.data,args.prop);});xajax.command.handler.register('c:as',xajax.dom.contextAssign);xajax.command.handler.register('c:ap',xajax.dom.contextAppend);xajax.command.handler.register('c:pp',xajax.dom.contextPrepend);xajax.command.handler.register('s',xajax.js.sleep);xajax.command.handler.register('ino',xajax.js.includeScriptOnce);xajax.command.handler.register('in',xajax.js.includeScript);xajax.command.handler.register('rjs',xajax.js.removeScript);xajax.command.handler.register('wf',xajax.js.waitFor);xajax.command.handler.register('js',xajax.js.execute);xajax.command.handler.register('jc',xajax.js.call);xajax.command.handler.register('sf',xajax.js.setFunction);xajax.command.handler.register('wpf',xajax.js.wrapFunction);xajax.command.handler.register('al',function(args){args.fullName='alert';alert(args.data);return true;});xajax.command.handler.register('cc',xajax.js.confirmCommands);xajax.command.handler.register('ci',xajax.forms.createInput);xajax.command.handler.register('ii',xajax.forms.insertInput);xajax.command.handler.register('iia',xajax.forms.insertInputAfter);xajax.command.handler.register('ev',xajax.events.setEvent);xajax.command.handler.register('ah',xajax.events.addHandler);xajax.command.handler.register('rh',xajax.events.removeHandler);xajax.command.handler.register('dbg',function(args){args.fullName='debug message';return true;});xajax.initializeRequest=function(oRequest){var xx=xajax;var xc=xx.config;oRequest.append=function(opt,def){if('undefined'!=typeof this[opt]){for(var itmName in def) +if('undefined'==typeof this[opt][itmName]) +this[opt][itmName]=def[itmName];}else this[opt]=def;} +oRequest.append('commonHeaders',xc.commonHeaders);oRequest.append('postHeaders',xc.postHeaders);oRequest.append('getHeaders',xc.getHeaders);oRequest.set=function(option,defaultValue){if('undefined'==typeof this[option]) +this[option]=defaultValue;} +oRequest.set('statusMessages',xc.statusMessages);oRequest.set('waitCursor',xc.waitCursor);oRequest.set('mode',xc.defaultMode);oRequest.set('method',xc.defaultMethod);oRequest.set('URI',xc.requestURI);oRequest.set('httpVersion',xc.defaultHttpVersion);oRequest.set('contentType',xc.defaultContentType);oRequest.set('retry',xc.defaultRetry);oRequest.set('returnValue',xc.defaultReturnValue);oRequest.set('maxObjectDepth',xc.maxObjectDepth);oRequest.set('maxObjectSize',xc.maxObjectSize);oRequest.set('context',window);var xcb=xx.callback;var gcb=xcb.global;var lcb=xcb.create();lcb.take=function(frm,opt){if('undefined'!=typeof frm[opt]){lcb[opt]=frm[opt];lcb.hasEvents=true;} +delete frm[opt];} +lcb.take(oRequest,'onRequest');lcb.take(oRequest,'onResponseDelay');lcb.take(oRequest,'onExpiration');lcb.take(oRequest,'beforeResponseProcessing');lcb.take(oRequest,'onFailure');lcb.take(oRequest,'onRedirect');lcb.take(oRequest,'onSuccess');lcb.take(oRequest,'onComplete');if('undefined'!=typeof oRequest.callback){if(lcb.hasEvents) +oRequest.callback=[oRequest.callback,lcb];}else +oRequest.callback=lcb;oRequest.status=(oRequest.statusMessages) +? xc.status.update() +:xc.status.dontUpdate();oRequest.cursor=(oRequest.waitCursor) +? xc.cursor.update() +:xc.cursor.dontUpdate();oRequest.method=oRequest.method.toUpperCase();if('GET'!=oRequest.method) +oRequest.method='POST';oRequest.requestRetry=oRequest.retry;oRequest.append('postHeaders',{'content-type':oRequest.contentType +});delete oRequest['append'];delete oRequest['set'];delete oRequest['take'];if('undefined'==typeof oRequest.URI) +throw{code:10005} +} +xajax.processParameters=function(oRequest){var xx=xajax;var xt=xx.tools;var rd=[];var separator='';for(var sCommand in oRequest.functionName){if('constructor'!=sCommand){rd.push(separator);rd.push(sCommand);rd.push('=');rd.push(encodeURIComponent(oRequest.functionName[sCommand]));separator='&';} +} +var dNow=new Date();rd.push('&xjxr=');rd.push(dNow.getTime());delete dNow;if(oRequest.parameters){var i=0;var iLen=oRequest.parameters.length;while(i < iLen){var oVal=oRequest.parameters[i];if('object'==typeof oVal&&null!=oVal){try{var oGuard={};oGuard.depth=0;oGuard.maxDepth=oRequest.maxObjectDepth;oGuard.size=0;oGuard.maxSize=oRequest.maxObjectSize;oVal=xt._objectToXML(oVal,oGuard);}catch(e){oVal='';} +rd.push('&xjxargs[]=');oVal=encodeURIComponent(oVal);rd.push(oVal);++i;}else{rd.push('&xjxargs[]=');oVal=xt._escape(oVal);if('undefined'==typeof oVal||null==oVal){rd.push('*');}else{var sType=typeof oVal;if('string'==sType) +rd.push('S');else if('boolean'==sType) +rd.push('B');else if('number'==sType) +rd.push('N');oVal=encodeURIComponent(oVal);rd.push(oVal);} +++i;} +} +} +oRequest.requestURI=oRequest.URI;if('GET'==oRequest.method){oRequest.requestURI+=oRequest.requestURI.indexOf('?')==-1 ? '?':'&';oRequest.requestURI+=rd.join('');rd=[];} +oRequest.requestData=rd.join('');} +xajax.prepareRequest=function(oRequest){var xx=xajax;var xt=xx.tools;oRequest.request=xt.getRequestObject();oRequest.setRequestHeaders=function(headers){if('object'==typeof headers){for(var optionName in headers) +this.request.setRequestHeader(optionName,headers[optionName]);} +} +oRequest.setCommonRequestHeaders=function(){this.setRequestHeaders(this.commonHeaders);} +oRequest.setPostRequestHeaders=function(){this.setRequestHeaders(this.postHeaders);} +oRequest.setGetRequestHeaders=function(){this.setRequestHeaders(this.getHeaders);} +if('asynchronous'==oRequest.mode){oRequest.request.onreadystatechange=function(){if(oRequest.request.readyState!=4) +return;xajax.responseReceived(oRequest);} +oRequest.finishRequest=function(){return this.returnValue;} +}else{oRequest.finishRequest=function(){return xajax.responseReceived(oRequest);} +} +if('undefined'!=typeof oRequest.userName&&'undefined'!=typeof oRequest.password){oRequest.open=function(){this.request.open( +this.method, +this.requestURI, +'asynchronous'==this.mode, +oRequest.userName, +oRequest.password);} +}else{oRequest.open=function(){this.request.open( +this.method, +this.requestURI, +'asynchronous'==this.mode);} +} +if('POST'==oRequest.method){oRequest.applyRequestHeaders=function(){this.setCommonRequestHeaders();try{this.setPostRequestHeaders();}catch(e){this.method='GET';this.requestURI+=this.requestURI.indexOf('?')==-1 ? '?':'&';this.requestURI+=this.requestData;this.requestData='';if(0==this.requestRetry)this.requestRetry=1;throw e;} +} +}else{oRequest.applyRequestHeaders=function(){this.setCommonRequestHeaders();this.setGetRequestHeaders();} +} +} +xajax.request=function(){var numArgs=arguments.length;if(0==numArgs) +return false;var oRequest={} +if(1 < numArgs) +oRequest=arguments[1];oRequest.functionName=arguments[0];var xx=xajax;xx.initializeRequest(oRequest);xx.processParameters(oRequest);while(0 < oRequest.requestRetry){try{--oRequest.requestRetry;xx.prepareRequest(oRequest);return xx.submitRequest(oRequest);}catch(e){xajax.callback.execute( +[xajax.callback.global,oRequest.callback], +'onFailure',oRequest);if(0==oRequest.requestRetry) +throw e;} +} +} +xajax.call=function(){var numArgs=arguments.length;if(0==numArgs) +return false;var oRequest={} +if(1 < numArgs) +oRequest=arguments[1];oRequest.functionName={xjxfun:arguments[0]};var xx=xajax;xx.initializeRequest(oRequest);xx.processParameters(oRequest);while(0 < oRequest.requestRetry){try{--oRequest.requestRetry;xx.prepareRequest(oRequest);return xx.submitRequest(oRequest);}catch(e){xajax.callback.execute( +[xajax.callback.global,oRequest.callback], +'onFailure',oRequest);if(0==oRequest.requestRetry) +throw e;} +} +} +xajax.submitRequest=function(oRequest){oRequest.status.onRequest();var xcb=xajax.callback;var gcb=xcb.global;var lcb=oRequest.callback;xcb.execute([gcb,lcb],'onResponseDelay',oRequest);xcb.execute([gcb,lcb],'onExpiration',oRequest);xcb.execute([gcb,lcb],'onRequest',oRequest);oRequest.open();oRequest.applyRequestHeaders();oRequest.cursor.onWaiting();oRequest.status.onWaiting();xajax._internalSend(oRequest);return oRequest.finishRequest();} +xajax._internalSend=function(oRequest){oRequest.request.send(oRequest.requestData);} +xajax.abortRequest=function(oRequest){oRequest.aborted=true;oRequest.request.abort();xajax.completeResponse(oRequest);} +xajax.responseReceived=function(oRequest){var xx=xajax;var xcb=xx.callback;var gcb=xcb.global;var lcb=oRequest.callback;if(oRequest.aborted) +return;xcb.clearTimer([gcb,lcb],'onExpiration');xcb.clearTimer([gcb,lcb],'onResponseDelay');xcb.execute([gcb,lcb],'beforeResponseProcessing',oRequest);var fProc=xx.getResponseProcessor(oRequest);if('undefined'==typeof fProc){xcb.execute([gcb,lcb],'onFailure',oRequest);xx.completeResponse(oRequest);return;} +return fProc(oRequest);} +xajax.getResponseProcessor=function(oRequest){var fProc;if('undefined'==typeof oRequest.responseProcessor){var cTyp=oRequest.request.getResponseHeader('content-type');if(cTyp){if(0 <=cTyp.indexOf('text/xml')){fProc=xajax.responseProcessor.xml;} +} +}else fProc=oRequest.responseProcessor;return fProc;} +xajax.executeCommand=function(command){if(xajax.command.handler.isRegistered(command)){if(command.id) +command.target=xajax.$(command.id);if(false==xajax.command.handler.call(command)){xajax.tools.queue.pushFront(xajax.response,command);return false;} +} +return true;} +xajax.completeResponse=function(oRequest){xajax.callback.execute( +[xajax.callback.global,oRequest.callback], +'onComplete',oRequest);oRequest.cursor.onComplete();oRequest.status.onComplete();delete oRequest['functionName'];delete oRequest['requestURI'];delete oRequest['requestData'];delete oRequest['requestRetry'];delete oRequest['request'];delete oRequest['set'];delete oRequest['open'];delete oRequest['setRequestHeaders'];delete oRequest['setCommonRequestHeaders'];delete oRequest['setPostRequestHeaders'];delete oRequest['setGetRequestHeaders'];delete oRequest['applyRequestHeaders'];delete oRequest['finishRequest'];delete oRequest['status'];delete oRequest['cursor'];} +xajax.$=xajax.tools.$;xajax.getFormValues=xajax.tools.getFormValues;xajax.isLoaded=true;xjx={} +xjx.$=xajax.tools.$;xjx.getFormValues=xajax.tools.getFormValues;xjx.call=xajax.call;xjx.request=xajax.request; \ No newline at end of file diff --git a/phpgwapi/inc/xajax/xajax_js/xajax_core_uncompressed.js b/phpgwapi/inc/xajax/xajax_js/xajax_core_uncompressed.js new file mode 100644 index 0000000000..0c58ab4dfb --- /dev/null +++ b/phpgwapi/inc/xajax/xajax_js/xajax_core_uncompressed.js @@ -0,0 +1,3553 @@ +/* + File: xajax_core.js + + This file contains the definition of the main xajax javascript core. + + This is the client side code which runs on the web browser or similar + web enabled application. Include this in the HEAD of each page for + which you wish to use xajax. + + Title: xajax core javascript library + + Please see for a detailed description, copyright + and license information. +*/ + +/* + @package xajax + @version $Id: xajax_core_uncompressed.js 327 2007-02-28 16:55:26Z calltoconstruct $ + @copyright Copyright (c) 2005-2007 by Jared White & J. Max Wilson + @copyright Copyright (c) 2008-2009 by Joseph Woolley, Steffen Konerow, Jared White & J. Max Wilson + @license http://www.xajaxproject.org/bsd_license.txt BSD License +*/ + +/* + Class: xajax.config + + This class contains all the default configuration settings. These + are application level settings; however, they can be overridden + by including a xajax.config definition prior to including the + file, or by specifying the appropriate configuration + options on a per call basis. +*/ +if ('undefined' == typeof xajax) + xajax = {}; + +if ('undefined' == typeof xajax.config) + xajax.config = {}; + +/* + Function: xajax.config.setDefault + + This function will set a default configuration option if it is + not already set. + + Parameters: + option - (string): + The name of the option that will be set. + + defaultValue - (unknown): + The value to use if a value was not already set. +*/ +xajax.config.setDefault = function(option, defaultValue) { + if ('undefined' == typeof xajax.config[option]) + xajax.config[option] = defaultValue; +} + +/* + Object: commonHeaders + + An array of header entries where the array key is the header + option name and the associated value is the value that will + set when the request object is initialized. + + These headers will be set for both POST and GET requests. +*/ +xajax.config.setDefault('commonHeaders', { + 'If-Modified-Since': 'Sat, 1 Jan 2000 00:00:00 GMT' + }); + +/* + Object: postHeaders + + An array of header entries where the array key is the header + option name and the associated value is the value that will + set when the request object is initialized. +*/ +xajax.config.setDefault('postHeaders', {}); + +/* + Object: getHeaders + + An array of header entries where the array key is the header + option name and the associated value is the value that will + set when the request object is initialized. +*/ +xajax.config.setDefault('getHeaders', {}); + +/* + Boolean: waitCursor + + true - xajax should display a wait cursor when making a request + false - xajax should not show a wait cursor during a request +*/ +xajax.config.setDefault('waitCursor', false); + +/* + Boolean: statusMessages + + true - xajax should update the status bar during a request + false - xajax should not display the status of the request +*/ +xajax.config.setDefault('statusMessages', false); + +/* + Object: baseDocument + + The base document that will be used throughout the code for + locating elements by ID. +*/ +xajax.config.setDefault('baseDocument', document); + +/* + String: requestURI + + The URI that requests will be sent to. +*/ +xajax.config.setDefault('requestURI', xajax.config.baseDocument.URL); + +/* + String: defaultMode + + The request mode. + + 'asynchronous' - The request will immediately return, the + response will be processed when (and if) it is received. + + 'synchronous' - The request will block, waiting for the + response. This option allows the server to return + a value directly to the caller. +*/ +xajax.config.setDefault('defaultMode', 'asynchronous'); + +/* + String: defaultHttpVersion + + The Hyper Text Transport Protocol version designated in the + header of the request. +*/ +xajax.config.setDefault('defaultHttpVersion', 'HTTP/1.1'); + +/* + String: defaultContentType + + The content type designated in the header of the request. +*/ +xajax.config.setDefault('defaultContentType', 'application/x-www-form-urlencoded'); + +/* + Integer: defaultResponseDelayTime + + The delay time, in milliseconds, associated with the + event. +*/ +xajax.config.setDefault('defaultResponseDelayTime', 1000); + +/* + Integer: defaultExpirationTime + + The amount of time to wait, in milliseconds, before a request + is considered expired. This is used to trigger the + to form a URL. +*/ +xajax.config.setDefault('defaultMethod', 'POST'); // W3C: Method is case sensitive + +/* + Integer: defaultRetry + + The number of times a request should be retried + if it expires. +*/ +xajax.config.setDefault('defaultRetry', 5); + +/* + Object: defaultReturnValue + + The value returned by when in asynchronous + mode, or when a syncrhonous call does not specify the + return value. +*/ +xajax.config.setDefault('defaultReturnValue', false); + +/* + Integer: maxObjectDepth + + The maximum depth of recursion allowed when serializing + objects to be sent to the server in a request. +*/ +xajax.config.setDefault('maxObjectDepth', 20); + +/* + Integer: maxObjectSize + + The maximum number of members allowed when serializing + objects to be sent to the server in a request. +*/ +xajax.config.setDefault('maxObjectSize', 2000); + +xajax.config.setDefault('responseQueueSize', 1000); + +/* + Class: xajax.config.status + + Provides support for updating the browser's status bar during + the request process. By splitting the status bar functionality + into an object, the xajax developer has the opportunity to + customize the status bar messages prior to sending xajax requests. +*/ +xajax.config.status = { + /* + Function: update + + Constructs and returns a set of event handlers that will be + called by the xajax framework to set the status bar messages. + */ + update: function() { + return { + onRequest: function() { + window.status = 'Sending Request...'; + }, + onWaiting: function() { + window.status = 'Waiting for Response...'; + }, + onProcessing: function() { + window.status = 'Processing...'; + }, + onComplete: function() { + window.status = 'Done.'; + } + } + }, + /* + Function: dontUpdate + + Constructs and returns a set of event handlers that will be + called by the xajax framework where status bar updates + would normally occur. + */ + dontUpdate: function() { + return { + onRequest: function() {}, + onWaiting: function() {}, + onProcessing: function() {}, + onComplete: function() {} + } + } +} + +/* + Class: xajax.config.cursor + + Provides the base functionality for updating the browser's cursor + during requests. By splitting this functionalityh into an object + of it's own, xajax developers can now customize the functionality + prior to submitting requests. +*/ +xajax.config.cursor = { + /* + Function: update + + Constructs and returns a set of event handlers that will be + called by the xajax framework to effect the status of the + cursor during requests. + */ + update: function() { + return { + onWaiting: function() { + if (xajax.config.baseDocument.body) + xajax.config.baseDocument.body.style.cursor = 'wait'; + }, + onComplete: function() { + xajax.config.baseDocument.body.style.cursor = 'auto'; + } + } + }, + /* + Function: dontUpdate + + Constructs and returns a set of event handlers that will + be called by the xajax framework where cursor status changes + would typically be made during the handling of requests. + */ + dontUpdate: function() { + return { + onWaiting: function() {}, + onComplete: function() {} + } + } +} + +/* + Class: xajax.tools + + This contains utility functions which are used throughout + the xajax core. +*/ +xajax.tools = {} + +/* + Function: xajax.tools.$ + + Shorthand for finding a uniquely named element within + the document. + + Parameters: + sId - (string): + The unique name of the element (specified by the + ID attribute), not to be confused with the name + attribute on form elements. + + Returns: + + object - The element found or null. + + Note: + This function uses the + which allows to operate on the main window + document as well as documents from contained + iframes and child windows. + + See also: + and +*/ +xajax.tools.$ = function(sId) { + if (!sId) + return null; + + var oDoc = xajax.config.baseDocument; + + var obj = oDoc.getElementById(sId); + if (obj) + return obj; + + if (oDoc.all) + return oDoc.all[sId]; + + return obj; +} + +/* + Function xajax.tools.arrayContainsValue + + Looks for a value within the specified array and, if found, + returns true; otherwise it returns false. + + Parameters: + array - (object): + The array to be searched. + + valueToCheck - (object): + The value to search for. + + Returns: + + true : The value is one of the values contained in the + array. + + false : The value was not found in the specified array. +*/ +xajax.tools.arrayContainsValue = function(array, valueToCheck) { + var i = 0; + var l = array.length; + while (i < l) { + if (array[i] == valueToCheck) + return true; + ++i; + } + return false; +} + +/* + Function: xajax.tools.doubleQuotes + + Replace all occurances of the single quote character with a double + quote character. + + Parameters: + + haystack - The source string to be scanned. + + Returns: + + string - A new string with the modifications applied. +*/ +xajax.tools.doubleQuotes = function(haystack) { + return haystack.replace(new RegExp("'", 'g'), '"'); +} + +/* + Function: xajax.tools.singleQuotes + + Replace all occurances of the double quote character with a single + quote character. + + haystack - The source string to be scanned. + + Returns: + + string - A new string with the modification applied. +*/ +xajax.tools.singleQuotes = function(haystack) { + return haystack.replace(new RegExp('"', 'g'), "'"); +} + +/* + Function: xajax.tools._escape + + Determine if the specified value contains special characters and + create a CDATA section so the value can be safely transmitted. + + Parameters: + + data - (string or other): + The source string value to be evaluated or an object of unknown + type. + + Returns: + + string - The string value, escaped if necessary or the object provided + if it is not a string. + + Note: + When the specified object is NOT a string, the value is returned + as is. +*/ +xajax.tools._escape = function(data) { + if ('undefined' == typeof data) + return data; + + // 'object' is handled elsewhere, + // 'string' handled below, + // 'number' will be returned here + // 'boolean' will be returned here + if ('string' != typeof data) + return data; + + var needCDATA = false; + + if (encodeURIComponent(data) != data) { + needCDATA = true; + + var segments = data.split(''); + var fragLen = fragments.length; + segment = ''; + for (var j = 0; j < fragLen; ++j) { + if (0 != j) + segment += ']]]]>'; + segment += fragments[j]; + } + if (0 != i) + data.push(''; + + return data; +} + +/* + Function: xajax.tools._objectToXML + + Convert a javascript object or array into XML suitable for + transmission to the server. + + Parameters: + + obj - The object or array to convert. + + guard - An object used to track the level of recursion + when encoding javascript objects. When an object + contains a reference to it's parent and the parent + contains a reference to the child, an infinite + recursion will cause some browsers to crash. + + Returns: + + string - the xml representation of the object or array. + + See also: + + and +*/ +xajax.tools._objectToXML = function(obj, guard) { + var aXml = []; + aXml.push(''); + for (var key in obj) { + ++guard.size; + if (guard.maxSize < guard.size) + return aXml.join(''); + if ('undefined' != typeof obj[key]) { + if ('constructor' == key) + continue; + if ('function' == typeof obj[key]) + continue; + aXml.push(''); + var val = xajax.tools._escape(key); + aXml.push(val); + aXml.push(''); + if ('object' == typeof obj[key]) { + ++guard.depth; + if (guard.maxDepth > guard.depth) { + try { + aXml.push(xajax.tools._objectToXML(obj[key], guard)); + } catch (e) { + // do nothing, if the debug module is installed + // it will catch the exception and handle it + } + } + --guard.depth; + } else { + var val = xajax.tools._escape(obj[key]); + if ('undefined' == typeof val || null == val) { + aXml.push('*'); + } else { + var sType = typeof val; + if ('string' == sType) + aXml.push('S'); + else if ('boolean' == sType) + aXml.push('B'); + else if ('number' == sType) + aXml.push('N'); + aXml.push(val); + } + } + + aXml.push(''); + } + } + aXml.push(''); + + return aXml.join(''); +} + +/* + Function: xajax.tools._enforceDataType + + Ensure that the javascript variable created is of the correct data type. + + Parameters: + value (string) + + Returns: + + (unknown) - The value provided converted to the correct data type. +*/ +xajax.tools._enforceDataType = function(value) { + value = new String(value); + var type = value.substr(0, 1); + value = value.substr(1); + + if ('*' == type) + value = null; + else if ('N' == type) + value = value - 0; + else if ('B' == type) + value = !!value; +// else if ('S' == type) +// value = new String(value); + + return value; +} + +/* + Function: xajax.tools._nodeToObject + + Deserialize a javascript object from an XML node. + + Parameters: + + node - A node, likely from the xml returned by the server. + + Returns: + + object - The object extracted from the xml node. +*/ +xajax.tools._nodeToObject = function(node) { + if (null == node) + return ''; + + if ('undefined' != typeof node.nodeName) { + if ('#cdata-section' == node.nodeName || '#text' == node.nodeName) { + var data = ''; + do if (node.data) data += node.data; while (node = node.nextSibling); + return xajax.tools._enforceDataType(data); + } else if ('xjxobj' == node.nodeName) { + var key = null; + var value = null; + var data = new Array; + var child = node.firstChild; + while (child) { + if ('e' == child.nodeName) { + var grandChild = child.firstChild; + while (grandChild) { + if ('k' == grandChild.nodeName) + // Don't support objects here, only number, string, etc... + key = xajax.tools._enforceDataType(grandChild.firstChild.data); + else ('v' == grandChild.nodeName) + // Value might be object, string, number, boolean... even null or undefined + value = xajax.tools._nodeToObject(grandChild.firstChild); + grandChild = grandChild.nextSibling; + } + // Allow the value to be null or undefined (or a value) + if (null != key) { // && null != value) { + data[key] = value; + key = value = null; + } + } + child = child.nextSibling; + } + return data; + } + } + + throw { code: 10001, data: node.nodeName }; +} + +/* + Function: xajax.tools.getRequestObject + + Construct an XMLHttpRequest object dependent on the capabilities + of the browser. + + Returns: + + object - Javascript XHR object. +*/ +xajax.tools.getRequestObject = function() { + if ('undefined' != typeof XMLHttpRequest) { + xajax.tools.getRequestObject = function() { + return new XMLHttpRequest(); + } + } else if ('undefined' != typeof ActiveXObject) { + xajax.tools.getRequestObject = function() { + try { + return new ActiveXObject('Msxml2.XMLHTTP.4.0'); + } catch (e) { + xajax.tools.getRequestObject = function() { + try { + return new ActiveXObject('Msxml2.XMLHTTP'); + } catch (e2) { + xajax.tools.getRequestObject = function() { + return new ActiveXObject('Microsoft.XMLHTTP'); + } + return xajax.tools.getRequestObject(); + } + } + return xajax.tools.getRequestObject(); + } + } + } else if (window.createRequest) { + xajax.tools.getRequestObject = function() { + return window.createRequest(); + } + } else { + xajax.tools.getRequestObject = function() { + throw { code: 10002 }; + } + } + + // this would seem to cause an infinite loop, however, the function should + // be reassigned by now and therefore, it will not loop. + return xajax.tools.getRequestObject(); +} + +/* + Function: xajax.tools.getBrowserHTML + + Insert the specified string of HTML into the document, then + extract it. This gives the browser the ability to validate + the code and to apply any transformations it deems appropriate. + + Parameters: + + sValue - (string): + A block of html code or text to be inserted into the + browser's document. + + Returns: + + The (potentially modified) html code or text. +*/ +xajax.tools.getBrowserHTML = function(sValue) { + var oDoc = xajax.config.baseDocument; + if (!oDoc.body) + return ''; + + var elWorkspace = xajax.$('xajax_temp_workspace'); + if (!elWorkspace) + { + elWorkspace = oDoc.createElement('div'); + elWorkspace.setAttribute('id', 'xajax_temp_workspace'); + elWorkspace.style.display = 'none'; + elWorkspace.style.visibility = 'hidden'; + oDoc.body.appendChild(elWorkspace); + } + elWorkspace.innerHTML = sValue; + var browserHTML = elWorkspace.innerHTML; + elWorkspace.innerHTML = ''; + + return browserHTML; +} + +/* + Function: xajax.tools.willChange + + Tests to see if the specified data is the same as the current + value of the element's attribute. + + Parameters: + element - (string or object): + The element or it's unique name (specified by the ID attribute) + + attribute - (string): + The name of the attribute. + + newData - (string): + The value to be compared with the current value of the specified + element. + + Returns: + + true - The specified value differs from the current attribute value. + false - The specified value is the same as the current value. +*/ +xajax.tools.willChange = function(element, attribute, newData) { + if ('string' == typeof element) + element = xajax.$(element); + if (element) { + var oldData; + eval('oldData=element.'+attribute); + return (newData != oldData); + } + + return false; +} + +/* + Function: xajax.tools.getFormValues + + Build an associative array of form elements and their values from + the specified form. + + Parameters: + + element - (string): The unique name (id) of the form to be processed. + disabled - (boolean, optional): Include form elements which are currently disabled. + prefix - (string, optional): A prefix used for selecting form elements. + + Returns: + + An associative array of form element id and value. +*/ +xajax.tools.getFormValues = function(parent) { + var submitDisabledElements = false; + if (arguments.length > 1 && arguments[1] == true) + submitDisabledElements = true; + + var prefix = ''; + if(arguments.length > 2) + prefix = arguments[2]; + + if ('string' == typeof parent) + parent = xajax.$(parent); + + var aFormValues = {}; + +// JW: Removing these tests so that form values can be retrieved from a specified +// container element like a DIV, regardless of whether they exist in a form or not. +// +// if (parent.tagName) +// if ('FORM' == parent.tagName.toUpperCase()) + if (parent) + if (parent.childNodes) + xajax.tools._getFormValues(aFormValues, parent.childNodes, submitDisabledElements, prefix); + + return aFormValues; +} + +/* + Function: xajax.tools._getFormValues + + Used internally by to recursively get the value + of form elements. This function will extract all form element values + regardless of the depth of the element within the form. +*/ +xajax.tools._getFormValues = function(aFormValues, children, submitDisabledElements, prefix) +{ + var iLen = children.length; + for (var i = 0; i < iLen; ++i) { + var child = children[i]; + if ('undefined' != typeof child.childNodes) + xajax.tools._getFormValues(aFormValues, child.childNodes, submitDisabledElements, prefix); + xajax.tools._getFormValue(aFormValues, child, submitDisabledElements, prefix); + } +} + +/* + Function: xajax.tools._getFormValue + + Used internally by to extract a single form value. + This will detect the type of element (radio, checkbox, multi-select) and + add it's value(s) to the form values array. +*/ +xajax.tools._getFormValue = function(aFormValues, child, submitDisabledElements, prefix) +{ + if (!child.name) + return; + + if ('PARAM' == child.tagName) return; + + if (child.disabled) + if (true == child.disabled) + if (false == submitDisabledElements) + return; + + if (prefix != child.name.substring(0, prefix.length)) + return; + + if (child.type) + if (child.type == 'radio' || child.type == 'checkbox') + if (false == child.checked) + return; + + var name = child.name; + + var values = []; + + if ('select-multiple' == child.type) { + var jLen = child.length; + for (var j = 0; j < jLen; ++j) { + var option = child.options[j]; + if (true == option.selected) + values.push(option.value); + } + } else { + values = child.value; + } + + var keyBegin = name.indexOf('['); + if (0 <= keyBegin) { + var n = name; + var k = n.substr(0, n.indexOf('[')); + var a = n.substr(n.indexOf('[')); + if (typeof aFormValues[k] == 'undefined') + aFormValues[k] = []; + var p = aFormValues; // pointer reset + while (a.length != 0) { + var sa = a.substr(0, a.indexOf(']')+1); + + var lk = k; //save last key + var lp = p; //save last pointer + + a = a.substr(a.indexOf(']')+1); + p = p[k]; + k = sa.substr(1, sa.length-2); + if (k == '') { + if ('select-multiple' == child.type) { + k = lk; //restore last key + p = lp; + } else { + k = p.length; + } + } + if (typeof p[k] == 'undefined') + p[k] = []; + } + p[k] = values; + } else { + aFormValues[name] = values; + } +} + +/* + Function: xajax.tools.stripOnPrefix + + Detect, and if found, remove the prefix 'on' from the specified + string. This is used while working with event handlers. + + Parameters: + + sEventName - (string): The string to be modified. + + Returns: + + string - The modified string. +*/ +xajax.tools.stripOnPrefix = function(sEventName) { + sEventName = sEventName.toLowerCase(); + if (0 == sEventName.indexOf('on')) + sEventName = sEventName.replace(/on/,''); + + return sEventName; +} + +/* + Function: xajax.tools.addOnPrefix + + Detect, and add if not found, the prefix 'on' from the specified + string. This is used while working with event handlers. + + Parameters: + + sEventName - (string): The string to be modified. + + Returns: + + string - The modified string. +*/ +xajax.tools.addOnPrefix = function(sEventName) { + sEventName = sEventName.toLowerCase(); + if (0 != sEventName.indexOf('on')) + sEventName = 'on' + sEventName; + + return sEventName; +} + +/* + Class: xajax.tools.xml + + An object that contains utility function for processing + xml response packets. +*/ +xajax.tools.xml = {}; + +/* + Function: xajax.tools.xml.parseAttributes + + Take the parameters passed in the command of the XML response + and convert them to parameters of the args object. This will + serve as the command object which will be stored in the + response command queue. + + Parameters: + + child - (object): The xml child node which contains the + attributes for the current response command. + + obj - (object): The current response command that will have the + attributes applied. +*/ +xajax.tools.xml.parseAttributes = function(child, obj) { + var iLen = child.attributes.length; + for (var i = 0; i < iLen; ++i) { + var attr = child.attributes[i]; + obj[attr.name] = attr.value; + } +} + +/* + Function: xajax.tools.xml.parseChildren + + Parses the child nodes of the command of the response XML. Generally, + the child nodes contain the data element of the command; this member + may be an object, which will be deserialized by + + Parameters: + + child - (object): The xml node that contains the child (data) for + the current response command object. + + obj - (object): The response command object. +*/ +xajax.tools.xml.parseChildren = function(child, obj) { + obj.data = ''; + if (0 < child.childNodes.length) { + if (1 < child.childNodes.length) { + var grandChild = child.firstChild; + do { + if ('#cdata-section' == grandChild.nodeName || '#text' == grandChild.nodeName) { + obj.data += grandChild.data; + } + } while (grandChild = grandChild.nextSibling); + } else { + var grandChild = child.firstChild; + if ('xjxobj' == grandChild.nodeName) { + obj.data = xajax.tools._nodeToObject(grandChild); + return; + } else if ('#cdata-section' == grandChild.nodeName || '#text' == grandChild.nodeName) { + obj.data = grandChild.data; + } + } + } else if ('undefined' != typeof child.data) { + obj.data = child.data; + } + + obj.data = xajax.tools._enforceDataType(obj.data); +} + +/* + Function: xajax.tools.xml.processFragment + + Parameters: + + xmlNode - (object): The first xml node in the xml fragment. + seq - (number): A counter used to keep track of the sequence + of this command in the response. + oRet - (object): A variable that is used to return the request + "return value" for use with synchronous requests. +*/ +xajax.tools.xml.processFragment = function(xmlNode, seq, oRet, oRequest) { + var xx = xajax; + var xt = xx.tools; + while (xmlNode) { + if ('cmd' == xmlNode.nodeName) { + var obj = {}; + obj.fullName = '*unknown*'; + obj.sequence = seq; + obj.request = oRequest; + obj.context = oRequest.context; + + xt.xml.parseAttributes(xmlNode, obj); + xt.xml.parseChildren(xmlNode, obj); + + xt.queue.push(xx.response, obj); + } else if ('xjxrv' == xmlNode.nodeName) { + oRet = xt._nodeToObject(xmlNode.firstChild); + } else if ('debugmsg' == xmlNode.nodeName) { + // txt = xt._nodeToObject(xmlNode.firstChild); + } else + throw { code: 10004, data: xmlNode.nodeName } + + ++seq; + xmlNode = xmlNode.nextSibling; + } + return oRet; +} + +/* + Class: xajax.tools.queue + + This contains the code and variables for building, populating + and processing First In Last Out (FILO) buffers. +*/ +xajax.tools.queue = {} + +/* + Function: create + + Construct and return a new queue object. + + Parameters: + + size - (integer): + The number of entries the queue will be able to hold. +*/ +xajax.tools.queue.create = function(size) { + return { + start: 0, + size: size, + end: 0, + commands: [], + timeout: null + } +} + +/* + Function: xajax.tools.queue.retry + + Maintains a retry counter for the given object. + + Parameters: + + obj - (object): + The object to track the retry count for. + + count - (integer): + The number of times the operation should be attempted + before a failure is indicated. + + Returns: + + true - The object has not exhausted all the retries. + false - The object has exhausted the retry count specified. +*/ +xajax.tools.queue.retry = function(obj, count) { + var retries = obj.retries; + if (retries) { + --retries; + if (1 > retries) + return false; + } else retries = count; + obj.retries = retries; + return true; +} + +/* + Function: xajax.tools.queue.rewind + + Rewind the buffer head pointer, effectively reinserting the + last retrieved object into the buffer. + + Parameters: + + theQ - (object): + The queue to be rewound. +*/ +xajax.tools.queue.rewind = function(theQ) { + if (0 < theQ.start) + --theQ.start; + else + theQ.start = theQ.size; +} + +/* + Function: xajax.tools.queue.setWakeup + + Set or reset a timeout that is used to restart processing + of the queue. This allows the queue to asynchronously wait + for an event to occur (giving the browser time to process + pending events, like loading files) + + Parameters: + + theQ - (object): + The queue to process upon timeout. + + when - (integer): + The number of milliseconds to wait before starting/ + restarting the processing of the queue. +*/ +xajax.tools.queue.setWakeup = function(theQ, when) { + if (null != theQ.timeout) { + clearTimeout(theQ.timeout); + theQ.timeout = null; + } + theQ.timout = setTimeout(function() { xajax.tools.queue.process(theQ); }, when); +} + +/* + Function: xajax.tools.queue.process + + While entries exist in the queue, pull and entry out and + process it's command. When a command returns false, the + processing is halted. + + Parameters: + + theQ - (object): The queue object to process. This should + have been crated by calling . + + Returns: + + true - The queue was fully processed and is now empty. + false - The queue processing was halted before the + queue was fully processed. + + Note: + + - Use or call this function to + cause the queue processing to continue. + + - This will clear the associated timeout, this function is not + designed to be reentrant. + + - When an exception is caught, do nothing; if the debug module + is installed, it will catch the exception and handle it. +*/ +xajax.tools.queue.process = function(theQ) { + if (null != theQ.timeout) { + clearTimeout(theQ.timeout); + theQ.timeout = null; + } + var obj = xajax.tools.queue.pop(theQ); + while (null != obj) { + try { + if (false == xajax.executeCommand(obj)) + return false; + } catch (e) { + } + delete obj; + + obj = xajax.tools.queue.pop(theQ); + } + return true; +} + +/* + Function: xajax.tools.queue.push + + Push a new object into the tail of the buffer maintained by the + specified queue object. + + Parameters: + + theQ - (object): + The queue in which you would like the object stored. + + obj - (object): + The object you would like stored in the queue. +*/ +xajax.tools.queue.push = function(theQ, obj) { + var next = theQ.end + 1; + if (next > theQ.size) + next = 0; + if (next != theQ.start) { + theQ.commands[theQ.end] = obj; + theQ.end = next; + } else + throw { code: 10003 } +} + +/* + Function: xajax.tools.queue.pushFront + + Push a new object into the head of the buffer maintained by + the specified queue object. This effectively pushes an object + to the front of the queue... it will be processed first. + + Parameters: + + theQ - (object): + The queue in which you would like the object stored. + + obj - (object): + The object you would like stored in the queue. +*/ +xajax.tools.queue.pushFront = function(theQ, obj) { + xajax.tools.queue.rewind(theQ); + theQ.commands[theQ.start] = obj; +} + +/* + Function: xajax.tools.queue.pop + + Attempt to pop an object off the head of the queue. + + Parameters: + + theQ - (object): + The queue object you would like to modify. + + Returns: + + object - The object that was at the head of the queue or + null if the queue was empty. +*/ +xajax.tools.queue.pop = function(theQ) { + var next = theQ.start; + if (next == theQ.end) + return null; + next++; + if (next > theQ.size) + next = 0; + var obj = theQ.commands[theQ.start]; + delete theQ.commands[theQ.start]; + theQ.start = next; + return obj; +} + +/* + Class: xajax.responseProcessor +*/ +xajax.responseProcessor = {}; + +/* + Function: xajax.responseProcessor.xml + + Parse the response XML into a series of commands. The commands + are constructed by calling and + . + + Parameters: + + oRequest - (object): The request context object. +*/ +xajax.responseProcessor.xml = function(oRequest) { + var xx = xajax; + var xt = xx.tools; + var xcb = xx.callback; + var gcb = xcb.global; + var lcb = oRequest.callback; + + var oRet = oRequest.returnValue; + + if (xt.arrayContainsValue(xx.responseSuccessCodes, oRequest.request.status)) { + xcb.execute([gcb, lcb], 'onSuccess', oRequest); + var seq = 0; + if (oRequest.request.responseXML) { + var responseXML = oRequest.request.responseXML; + if (responseXML.documentElement) { + oRequest.status.onProcessing(); + + var child = responseXML.documentElement.firstChild; + oRet = xt.xml.processFragment(child, seq, oRet, oRequest); + } + } + var obj = {}; + obj.fullName = 'Response Complete'; + obj.sequence = seq; + obj.request = oRequest; + obj.context = oRequest.context; + obj.cmd = 'rcmplt'; + xt.queue.push(xx.response, obj); + + // do not re-start the queue if a timeout is set + if (null == xx.response.timeout) + xt.queue.process(xx.response); + } else if (xt.arrayContainsValue(xx.responseRedirectCodes, oRequest.request.status)) { + xcb.execute([gcb, lcb], 'onRedirect', oRequest); + window.location = oRequest.request.getResponseHeader('location'); + xx.completeResponse(oRequest); + } else if (xt.arrayContainsValue(xx.responseErrorsForAlert, oRequest.request.status)) { + xcb.execute([gcb, lcb], 'onFailure', oRequest); + xx.completeResponse(oRequest); + } + + return oRet; +} + +/* + Class: xajax.js + + Contains the functions for javascript file and function + manipulation. +*/ +xajax.js = {} + +/* + Function: xajax.js.includeScriptOnce + + Add a reference to the specified script file if one does not + already exist in the HEAD of the current document. + + This will effecitvely cause the script file to be loaded in + the browser. + + Parameters: + + fileName - (string): The URI of the file. + + Returns: + + true - The reference exists or was added. +*/ +xajax.js.includeScriptOnce = function(command) { + command.fullName = 'includeScriptOnce'; + var fileName = command.data; + // Check for existing script tag for this file. + var oDoc = xajax.config.baseDocument; + var loadedScripts = oDoc.getElementsByTagName('script'); + var iLen = loadedScripts.length; + for (var i = 0; i < iLen; ++i) { + var script = loadedScripts[i]; + if (script.src) { + if (0 <= script.src.indexOf(fileName)) + return true; + } + } + return xajax.js.includeScript(command); +} + +/* + Function: xajax.js.includeScript + + Adds a SCRIPT tag referencing the specified file. This + effectively causes the script to be loaded in the browser. + + Parameters: + + command (object) - Xajax response object + + Returns: + + true - The reference was added. +*/ +xajax.js.includeScript = function(command) { + command.fullName = 'includeScript'; + var oDoc = xajax.config.baseDocument; + var objHead = oDoc.getElementsByTagName('head'); + var objScript = oDoc.createElement('script'); + objScript.src = command.data; + if ('undefined' == typeof command.type) objScript.type = 'text/javascript'; + else objScript.type = command.type; + if ('undefined' != typeof command.type) objScript.setAttribute('id', command.elm_id); + objHead[0].appendChild(objScript); + return true; +} + +/* + Function: xajax.js.removeScript + + Locates a SCRIPT tag in the HEAD of the document which references + the specified file and removes it. + + Parameters: + + command (object) - Xajax response object + + Returns: + + true - The script was not found or was removed. +*/ +xajax.js.removeScript = function(command) { + command.fullName = 'removeScript'; + var fileName = command.data; + var unload = command.unld; + var oDoc = xajax.config.baseDocument; + var loadedScripts = oDoc.getElementsByTagName('script'); + var iLen = loadedScripts.length; + for (var i = 0; i < iLen; ++i) { + var script = loadedScripts[i]; + if (script.src) { + if (0 <= script.src.indexOf(fileName)) { + if ('undefined' != typeof unload) { + var args = {}; + args.data = unload; + args.context = window; + xajax.js.execute(args); + } + var parent = script.parentNode; + parent.removeChild(script); + } + } + } + return true; +} + +/* + Function: xajax.js.sleep + + Causes the processing of items in the queue to be delayed + for the specified amount of time. This is an asynchronous + operation, therefore, other operations will be given an + opportunity to execute during this delay. + + Parameters: + + args - (object): The response command containing the following + parameters. + - args.prop: The number of 10ths of a second to sleep. + + Returns: + + true - The sleep operation completed. + false - The sleep time has not yet expired, continue sleeping. +*/ +xajax.js.sleep = function(command) { + command.fullName = 'sleep'; + // inject a delay in the queue processing + // handle retry counter + if (xajax.tools.queue.retry(command, command.prop)) { + xajax.tools.queue.setWakeup(xajax.response, 100); + return false; + } + // wake up, continue processing queue + return true; +} + +/* + Function: xajax.js.confirmCommands + + Prompt the user with the specified text, if the user responds by clicking + cancel, then skip the specified number of commands in the response command + queue. If the user clicks Ok, the command processing resumes normal + operation. + + Parameters: + + command (object) - xajax response object + + Returns: + + true - The operation completed successfully. +*/ +xajax.js.confirmCommands = function(command) { + command.fullName = 'confirmCommands'; + var msg = command.data; + var numberOfCommands = command.id; + if (false == confirm(msg)) { + while (0 < numberOfCommands) { + xajax.tools.queue.pop(xajax.response); + --numberOfCommands; + } + } + return true; +} + +/* + Function: xajax.js.execute + + Execute the specified string of javascript code, using the current + script context. + + Parameters: + + args - The response command object containing the following: + - args.data: (string): The javascript to be evaluated. + - args.context: (object): The javascript object that to be + referenced as 'this' in the script. + + Returns: + + unknown - A value set by the script using 'returnValue = ' + true - If the script does not set a returnValue. +*/ +xajax.js.execute = function(args) { + args.fullName = 'execute Javascript'; + var returnValue = true; + args.context.xajaxDelegateCall = function() { + eval(args.data); + } + args.context.xajaxDelegateCall(); + return returnValue; +} + +/* + Function: xajax.js.waitFor + + Test for the specified condition, using the current script + context; if the result is false, sleep for 1/10th of a + second and try again. + + Parameters: + + args - The response command object containing the following: + + - args.data: (string): The javascript to evaluate. + - args.prop: (integer): The number of 1/10ths of a + second to wait before giving up. + - args.context: (object): The current script context object + which is accessable in the javascript being evaulated + via the 'this' keyword. + + Returns: + + false - The condition evaulates to false and the sleep time + has not expired. + true - The condition evaluates to true or the sleep time has + expired. +*/ +xajax.js.waitFor = function(args) { + args.fullName = 'waitFor'; + + var bResult = false; + var cmdToEval = 'bResult = ('; + cmdToEval += args.data; + cmdToEval += ');'; + try { + args.context.xajaxDelegateCall = function() { + eval(cmdToEval); + } + args.context.xajaxDelegateCall(); + } catch (e) { + } + if (false == bResult) { + // inject a delay in the queue processing + // handle retry counter + if (xajax.tools.queue.retry(args, args.prop)) { + xajax.tools.queue.setWakeup(xajax.response, 100); + return false; + } + // give up, continue processing queue + } + return true; +} + +/* + Function: xajax.js.call + + Call a javascript function with a series of parameters using + the current script context. + + Parameters: + + args - The response command object containing the following: + - args.data: (array): The parameters to pass to the function. + - args.func: (string): The name of the function to call. + - args.context: (object): The current script context object + which is accessable in the function name via the 'this' + keyword. + + Returns: + + true - The call completed successfully. +*/ +xajax.js.call = function(args) { + args.fullName = 'call js function'; + + var parameters = args.data; + + var scr = new Array(); + scr.push(args.func); + scr.push('('); + if ('undefined' != typeof parameters) { + if ('object' == typeof parameters) { + var iLen = parameters.length; + if (0 < iLen) { + scr.push('parameters[0]'); + for (var i = 1; i < iLen; ++i) + scr.push(', parameters[' + i + ']'); + } + } + } + scr.push(');'); + args.context.xajaxDelegateCall = function() { + eval(scr.join('')); + } + args.context.xajaxDelegateCall(); + return true; +} + +/* + Function: xajax.js.setFunction + + Constructs the specified function using the specified javascript + as the body of the function. + + Parameters: + + args - The response command object which contains the following: + + - args.func: (string): The name of the function to construct. + - args.data: (string): The script that will be the function body. + - args.context: (object): The current script context object + which is accessable in the script name via the 'this' keyword. + + Returns: + + true - The function was constructed successfully. +*/ +xajax.js.setFunction = function(args) { + args.fullName = 'setFunction'; + + var code = new Array(); + code.push(args.func); + code.push(' = function('); + if ('object' == typeof args.prop) { + var separator = ''; + for (var m in args.prop) { + code.push(separator); + code.push(args.prop[m]); + separator = ','; + } + } else code.push(args.prop); + code.push(') { '); + code.push(args.data); + code.push(' }'); + args.context.xajaxDelegateCall = function() { + eval(code.join('')); + } + args.context.xajaxDelegateCall(); + return true; +} + +/* + Function: xajax.js.wrapFunction + + Construct a javascript function which will call the original function with + the same name, potentially executing code before and after the call to the + original function. + + Parameters: + + args - (object): The response command object which will contain + the following: + + - args.func: (string): The name of the function to be wrapped. + - args.prop: (string): List of parameters used when calling the function. + - args.data: (array): The portions of code to be called before, after + or even between calls to the original function. + - args.context: (object): The current script context object which is + accessable in the function name and body via the 'this' keyword. + + Returns: + + true - The wrapper function was constructed successfully. +*/ +xajax.js.wrapFunction = function(args) { + args.fullName = 'wrapFunction'; + + var code = new Array(); + code.push(args.func); + code.push(' = xajax.js.makeWrapper('); + code.push(args.func); + code.push(', args.prop, args.data, args.type, args.context);'); + args.context.xajaxDelegateCall = function() { + eval(code.join('')); + } + args.context.xajaxDelegateCall(); + return true; +} + +/* + Function: xajax.js.makeWrapper + + + Helper function used in the wrapping of an existing javascript function. + + Parameters: + + origFun - (string): The name of the original function. + args - (string): The list of parameters used when calling the function. + codeBlocks - (array): Array of strings of javascript code to be executed + before, after and perhaps between calls to the original function. + returnVariable - (string): The name of the variable used to retain the + return value from the call to the original function. + context - (object): The current script context object which is accessable + in the function name and body via the 'this' keyword. + + Returns: + + object - The complete wrapper function. +*/ +xajax.js.makeWrapper = function(origFun, args, codeBlocks, returnVariable, context) { + var originalCall = ''; + if (0 < returnVariable.length) { + originalCall += returnVariable; + originalCall += ' = '; + } + var originalCall = 'origFun('; + originalCall += args; + originalCall += '); '; + + var code = 'wrapper = function('; + code += args; + code += ') { '; + + if (0 < returnVariable.length) { + code += ' var '; + code += returnVariable; + code += ' = null;'; + } + var separator = ''; + var bLen = codeBlocks.length; + for (var b = 0; b < bLen; ++b) { + code += separator; + code += codeBlocks[b]; + separator = originalCall; + } + if (0 < returnVariable.length) { + code += ' return '; + code += returnVariable; + code += ';'; + } + code += ' } '; + + var wrapper = null; + context.xajaxDelegateCall = function() { + eval(code); + } + context.xajaxDelegateCall(); + return wrapper; +} + +/* + Class: xajax.dom +*/ +xajax.dom = {} + +/* + Function: xajax.dom.assign + + Assign an element's attribute to the specified value. + + Parameters: + + element - (object): The HTML element to effect. + property - (string): The name of the attribute to set. + data - (string): The new value to be applied. + + Returns: + + true - The operation completed successfully. +*/ +xajax.dom.assign = function(element, property, data) { + if ('string' == typeof element) + element = xajax.$(element); + + switch (property) { + case 'innerHTML': + element.innerHTML = data; + break; + case 'outerHTML': + if ('undefined' == typeof element.outerHTML) { + var r = xajax.config.baseDocument.createRange(); + r.setStartBefore(element); + var df = r.createContextualFragment(data); + element.parentNode.replaceChild(df, element); + } else element.outerHTML = data; + break; + default: + if (xajax.tools.willChange(element, property, data)) + eval('element.' + property + ' = data;'); + break; + } + return true; +} + +/* + Function: xajax.dom.append + + Append the specified value to an element's attribute. + + Parameters: + + element - (object): The HTML element to effect. + property - (string): The name of the attribute to append to. + data - (string): The new value to be appended. + + Returns: + + true - The operation completed successfully. +*/ +xajax.dom.append = function(element, property, data) { + if ('string' == typeof element) + element = xajax.$(element); + + eval('element.' + property + ' += data;'); + return true; +} + +/* + Function: xajax.dom.prepend + + Prepend the specified value to an element's attribute. + + Parameters: + + element - (object): The HTML element to effect. + property - (string): The name of the attribute. + data - (string): The new value to be prepended. + + Returns: + + true - The operation completed successfully. +*/ +xajax.dom.prepend = function(element, property, data) { + if ('string' == typeof element) + element = xajax.$(element); + + eval('element.' + property + ' = data + element.' + property); + return true; +} + +/* + Function: xajax.dom.replace + + Search and replace the specified text. + + Parameters: + + element - (string or object): The name of, or the element itself which is + to be modified. + sAttribute - (string): The name of the attribute to be set. + aData - (array): The search text and replacement text. + + Returns: + + true - The operation completed successfully. +*/ +xajax.dom.replace = function(element, sAttribute, aData) { + var sSearch = aData['s']; + var sReplace = aData['r']; + + if (sAttribute == 'innerHTML') + sSearch = xajax.tools.getBrowserHTML(sSearch); + + if ('string' == typeof element) + element = xajax.$(element); + + eval('var txt = element.' + sAttribute); + + var bFunction = false; + if ('function' == typeof txt) { + txt = txt.join(''); + bFunction = true; + } + + var start = txt.indexOf(sSearch); + if (start > -1) { + var newTxt = []; + while (start > -1) { + var end = start + sSearch.length; + newTxt.push(txt.substr(0, start)); + newTxt.push(sReplace); + txt = txt.substr(end, txt.length - end); + start = txt.indexOf(sSearch); + } + newTxt.push(txt); + newTxt = newTxt.join(''); + + if (bFunction) { + eval('element.' + sAttribute + '=newTxt;'); + } else if (xajax.tools.willChange(element, sAttribute, newTxt)) { + eval('element.' + sAttribute + '=newTxt;'); + } + } + return true; +} + +/* + Function: xajax.dom.remove + + Delete an element. + + Parameters: + + element - (string or object): The name of, or the element itself which + will be deleted. + + Returns: + + true - The operation completed successfully. +*/ +xajax.dom.remove = function(element) { + if ('string' == typeof element) + element = xajax.$(element); + + if (element && element.parentNode && element.parentNode.removeChild) + element.parentNode.removeChild(element); + + return true; +} + +/* + Function: xajax.dom.create + + Create a new element and append it to the specified parent element. + + Parameters: + + objParent - (string or object): The name of, or the element itself + which will contain the new element. + sTag - (string): The tag name for the new element. + sId - (string): The value to be assigned to the id attribute of + the new element. + + Returns: + + true - The operation completed successfully. +*/ +xajax.dom.create = function(objParent, sTag, sId) { + if ('string' == typeof objParent) + objParent = xajax.$(objParent); + var target = xajax.config.baseDocument.createElement(sTag); + target.setAttribute('id', sId); + if (objParent) + objParent.appendChild(target); + return true; +} + +/* + Function: xajax.dom.insert + + Insert a new element before the specified element. + + Parameters: + + objSibling - (string or object): The name of, or the element itself + that will be used as the reference point for insertion. + sTag - (string): The tag name for the new element. + sId - (string): The value that will be assigned to the new element's + id attribute. + + Returns: + + true - The operation completed successfully. +*/ +xajax.dom.insert = function(objSibling, sTag, sId) { + if ('string' == typeof objSibling) + objSibling = xajax.$(objSibling); + var target = xajax.config.baseDocument.createElement(sTag); + target.setAttribute('id', sId); + objSibling.parentNode.insertBefore(target, objSibling); + return true; +} + +/* + Function: xajax.dom.insertAfter + + Insert a new element after the specified element. + + Parameters: + + objSibling - (string or object): The name of, or the element itself + that will be used as the reference point for insertion. + sTag - (string): The tag name for the new element. + sId - (string): The value that will be assigned to the new element's + id attribute. + + Returns: + + true - The operation completed successfully. +*/ +xajax.dom.insertAfter = function(objSibling, sTag, sId) { + if ('string' == typeof objSibling) + objSibling = xajax.$(objSibling); + var target = xajax.config.baseDocument.createElement(sTag); + target.setAttribute('id', sId); + objSibling.parentNode.insertBefore(target, objSibling.nextSibling); + return true; +} + +/* + Function: xajax.dom.contextAssign + + Assign a value to a named member of the current script context object. + + Parameters: + + args - (object): The response command object which will contain the + following: + + - args.prop: (string): The name of the member to assign. + - args.data: (string or object): The value to assign to the member. + - args.context: (object): The current script context object which + is accessable via the 'this' keyword. + + Returns: + + true - The operation completed successfully. +*/ +xajax.dom.contextAssign = function(args) { + args.fullName = 'context assign'; + + var code = []; + code.push('this.'); + code.push(args.prop); + code.push(' = data;'); + code = code.join(''); + args.context.xajaxDelegateCall = function(data) { + eval(code); + } + args.context.xajaxDelegateCall(args.data); + return true; +} + +/* + Function: xajax.dom.contextAppend + + Appends a value to a named member of the current script context object. + + Parameters: + + args - (object): The response command object which will contain the + following: + + - args.prop: (string): The name of the member to append to. + - args.data: (string or object): The value to append to the member. + - args.context: (object): The current script context object which + is accessable via the 'this' keyword. + + Returns: + + true - The operation completed successfully. +*/ +xajax.dom.contextAppend = function(args) { + args.fullName = 'context append'; + + var code = []; + code.push('this.'); + code.push(args.prop); + code.push(' += data;'); + code = code.join(''); + args.context.xajaxDelegateCall = function(data) { + eval(code); + } + args.context.xajaxDelegateCall(args.data); + return true; +} + +/* + Function: xajax.dom.contextPrepend + + Prepend a value to a named member of the current script context object. + + Parameters: + + args - (object): The response command object which will contain the + following: + + - args.prop: (string): The name of the member to prepend to. + - args.data: (string or object): The value to prepend to the member. + - args.context: (object): The current script context object which + is accessable via the 'this' keyword. + + Returns: + + true - The operation completed successfully. +*/ +xajax.dom.contextPrepend = function(args) { + args.fullName = 'context prepend'; + + var code = []; + code.push('this.'); + code.push(args.prop); + code.push(' = data + this.'); + code.push(args.prop); + code.push(';'); + code = code.join(''); + args.context.xajaxDelegateCall = function(data) { + eval(code); + } + args.context.xajaxDelegateCall(args.data); + return true; +} + + +/* + Class: xajax.css +*/ +xajax.css = {} + +/* + Function: xajax.css.add + + Add a LINK reference to the specified .css file if it does not + already exist in the HEAD of the current document. + + Parameters: + + filename - (string): The URI of the .css file to reference. + + media - (string): The media type of the css file (print/screen/handheld,..) + + Returns: + + true - The operation completed successfully. +*/ +xajax.css.add = function(fileName, media) { + var oDoc = xajax.config.baseDocument; + var oHeads = oDoc.getElementsByTagName('head'); + var oHead = oHeads[0]; + var oLinks = oHead.getElementsByTagName('link'); + + var found = false; + var iLen = oLinks.length; + for (var i = 0; i < iLen && false == found; ++i) + if (0 <= oLinks[i].href.indexOf(fileName) && oLinks[i].media == media) + found = true; + + if (false == found) { + var oCSS = oDoc.createElement('link'); + oCSS.rel = 'stylesheet'; + oCSS.type = 'text/css'; + oCSS.href = fileName; + oCSS.media = media; + oHead.appendChild(oCSS); + } + + return true; +} + +/* + Function: xajax.css.remove + + Locate and remove a LINK reference from the current document's + HEAD. + + Parameters: + + filename - (string): The URI of the .css file. + + Returns: + + true - The operation completed successfully. +*/ +xajax.css.remove = function(fileName, media) { + var oDoc = xajax.config.baseDocument; + var oHeads = oDoc.getElementsByTagName('head'); + var oHead = oHeads[0]; + var oLinks = oHead.getElementsByTagName('link'); + + var i = 0; + while (i < oLinks.length) + if (0 <= oLinks[i].href.indexOf(fileName) && oLinks[i].media == media) + oHead.removeChild(oLinks[i]); + else ++i; + + return true; +} + +/* + Function: xajax.css.waitForCSS + + Attempt to detect when all .css files have been loaded once + they are referenced by a LINK tag in the HEAD of the current + document. + + Parameters: + + args - (object): The response command object which will contain + the following: + + - args.prop - (integer): The number of 1/10ths of a second + to wait before giving up. + + Returns: + + true - The .css files appear to be loaded. + false - The .css files do not appear to be loaded and the timeout + has not expired. +*/ +xajax.css.waitForCSS = function(args) { + var oDocSS = xajax.config.baseDocument.styleSheets; + var ssEnabled = []; + var iLen = oDocSS.length; + for (var i = 0; i < iLen; ++i) { + ssEnabled[i] = 0; + try { + ssEnabled[i] = oDocSS[i].cssRules.length; + } catch (e) { + try { + ssEnabled[i] = oDocSS[i].rules.length; + } catch (e) { + } + } + } + + var ssLoaded = true; + var iLen = ssEnabled.length; + for (var i = 0; i < iLen; ++i) + if (0 == ssEnabled[i]) + ssLoaded = false; + + if (false == ssLoaded) { + // inject a delay in the queue processing + // handle retry counter + if (xajax.tools.queue.retry(args, args.prop)) { + xajax.tools.queue.setWakeup(xajax.response, 10); + return false; + } + // give up, continue processing queue + } + return true; +} + + +/* + Class: xajax.forms +*/ +xajax.forms = {} + +/* + Function: xajax.forms.getInput + + Create and return a form input element with the specified parameters. + + Parameters: + + type - (string): The type of input element desired. + name - (string): The value to be assigned to the name attribute. + id - (string): The value to be assigned to the id attribute. + + Returns: + + object - The new input element. +*/ +xajax.forms.getInput = function(type, name, id) { + if ('undefined' == typeof window.addEventListener) { + xajax.forms.getInput = function(type, name, id) { + return xajax.config.baseDocument.createElement(''); + } + } else { + xajax.forms.getInput = function(type, name, id) { + var oDoc = xajax.config.baseDocument; + var Obj = oDoc.createElement('input'); + Obj.setAttribute('type', type); + Obj.setAttribute('name', name); + Obj.setAttribute('id', id); + return Obj; + } + } + return xajax.forms.getInput(type, name, id); +} + +/* + Function: xajax.forms.createInput + + Create a new input element under the specified parent. + + Parameters: + + objParent - (string or object): The name of, or the element itself + that will be used as the reference for the insertion. + sType - (string): The value to be assigned to the type attribute. + sName - (string): The value to be assigned to the name attribute. + sId - (string): The value to be assigned to the id attribute. + + Returns: + + true - The operation completed successfully. +*/ +xajax.forms.createInput = function(command) { + command.fullName = 'createInput'; + var objParent = command.id; + + var sType = command.type; + var sName = command.data; + var sId = command.prop; + if ('string' == typeof objParent) + objParent = xajax.$(objParent); + var target = xajax.forms.getInput(sType, sName, sId); + if (objParent && target) + { + objParent.appendChild(target); + } + return true; +} + +/* + Function: xajax.forms.insertInput + + Insert a new input element before the specified element. + + Parameters: + + objSibling - (string or object): The name of, or the element itself + that will be used as the reference for the insertion. + sType - (string): The value to be assigned to the type attribute. + sName - (string): The value to be assigned to the name attribute. + sId - (string): The value to be assigned to the id attribute. + + Returns: + + true - The operation completed successfully. +*/ +xajax.forms.insertInput = function(command) { + command.fullName = 'insertInput'; + var objSibling = command.id; + var sType = command.type; + var sName = command.data; + var sId = command.prop; + if ('string' == typeof objSibling) + objSibling = xajax.$(objSibling); + var target = xajax.forms.getInput(sType, sName, sId); + if (target && objSibling && objSibling.parentNode) + objSibling.parentNode.insertBefore(target, objSibling); + return true; +} + +/* + Function: xajax.forms.insertInputAfter + + Insert a new input element after the specified element. + + Parameters: + + objSibling - (string or object): The name of, or the element itself + that will be used as the reference for the insertion. + sType - (string): The value to be assigned to the type attribute. + sName - (string): The value to be assigned to the name attribute. + sId - (string): The value to be assigned to the id attribute. + + Returns: + + true - The operation completed successfully. +*/ +xajax.forms.insertInputAfter = function(command) { + command.fullName = 'insertInputAfter'; + var objSibling = command.id; + var sType = command.type; + var sName = command.data; + var sId = command.prop; + if ('string' == typeof objSibling) + objSibling = xajax.$(objSibling); + var target = xajax.forms.getInput(sType, sName, sId); + if (target && objSibling && objSibling.parentNode) + objSibling.parentNode.insertBefore(target, objSibling.nextSibling); + return true; +} + +/* + Class: xajax.events +*/ +xajax.events = {} + +/* + Function: xajax.events.setEvent + + Set an event handler. + + Parameters: + + command - (object): Response command object. + - id: Element ID + - prop: Event + - data: Code + + Returns: + + true - The operation completed successfully. +*/ +xajax.events.setEvent = function(command) { + command.fullName = 'addEvent'; + var element = command.id; + var sEvent = command.prop; + var code = command.data; + if ('string' == typeof element) + element = xajax.$(element); + sEvent = xajax.tools.addOnPrefix(sEvent); + code = xajax.tools.doubleQuotes(code); + eval('element.' + sEvent + ' = function() { ' + code + '; }'); + return true; +} + +/* + Function: xajax.events.addHandler + + Add an event handler to the specified element. + + Parameters: + + element - (string or object): The name of, or the element itself + which will have the event handler assigned. + sEvent - (string): The name of the event. + fun - (string): The function to be called. + + Returns: + + true - The operation completed successfully. +*/ +xajax.events.addHandler = function(element, sEvent, fun) { + if (window.addEventListener) { + xajax.events.addHandler = function(command) { + command.fullName = 'addHandler'; + var element = command.id; + var sEvent = command.prop; + var fun = command.data; + if ('string' == typeof element) + element = xajax.$(element); + sEvent = xajax.tools.stripOnPrefix(sEvent); + eval('element.addEventListener("' + sEvent + '", ' + fun + ', false);'); + return true; + } + } else { + xajax.events.addHandler = function(command) { + command.fullName = 'addHandler'; + var element = command.id; + var sEvent = command.prop; + var fun = command.data; + if ('string' == typeof element) + element = xajax.$(element); + sEvent = xajax.tools.addOnPrefix(sEvent); + eval('element.attachEvent("' + sEvent + '", ' + fun + ', false);'); + return true; + } + } + return xajax.events.addHandler(element, sEvent, fun); +} + +/* + Function: xajax.events.removeHandler + + Remove an event handler from an element. + + Parameters: + + element - (string or object): The name of, or the element itself which + will have the event handler removed. + event - (string): The name of the event for which this handler is + associated. + fun - The function to be removed. + + Returns: + + true - The operation completed successfully. +*/ +xajax.events.removeHandler = function(element, sEvent, fun) { + if (window.removeEventListener) { + xajax.events.removeHandler = function(command) { + command.fullName = 'removeHandler'; + var element = command.id; + var sEvent = command.prop; + var fun = command.data; + if ('string' == typeof element) + element = xajax.$(element); + sEvent = xajax.tools.stripOnPrefix(sEvent); + eval('element.removeEventListener("' + sEvent + '", ' + fun + ', false);'); + return true; + } + } else { + xajax.events.removeHandler = function(command) { + command.fullName = 'removeHandler'; + var element = command.id; + var sEvent = command.prop; + var fun = command.data; + if ('string' == typeof element) + element = xajax.$(element); + sEvent = xajax.tools.addOnPrefix(sEvent); + eval('element.detachEvent("' + sEvent + '", ' + fun + ', false);'); + return true; + } + } + return xajax.events.removeHandler(element, sEvent, fun); +} + +/* + Class: xajax.callback +*/ +xajax.callback = {} + +/* + Function: xajax.callback.create + + Create a blank callback object. Two optional arguments let you + set the delay time for the onResponseDelay and onExpiration events. + + Returns: + + object - The callback object. +*/ +xajax.callback.create = function() { + var xx = xajax; + var xc = xx.config; + var xcb = xx.callback; + + var oCB = {} + oCB.timers = {}; + + oCB.timers.onResponseDelay = xcb.setupTimer( + (arguments.length > 0) + ? arguments[0] + : xc.defaultResponseDelayTime); + + oCB.timers.onExpiration = xcb.setupTimer( + (arguments.length > 1) + ? arguments[1] + : xc.defaultExpirationTime); + + oCB.onRequest = null; + oCB.onResponseDelay = null; + oCB.onExpiration = null; + oCB.beforeResponseProcessing = null; + oCB.onFailure = null; + oCB.onRedirect = null; + oCB.onSuccess = null; + oCB.onComplete = null; + + return oCB; +} + +/* + Function: xajax.callback.setupTimer + + Create a timer to fire an event in the future. This will + be used fire the onRequestDelay and onExpiration events. + + Parameters: + + iDelay - (integer): The amount of time in milliseconds to delay. + + Returns: + + object - A callback timer object. +*/ +xajax.callback.setupTimer = function(iDelay) +{ + return { timer: null, delay: iDelay }; +} + +/* + Function: xajax.callback.clearTimer + + Clear a callback timer for the specified function. + + Parameters: + + oCallback - (object): The callback object (or objects) that + contain the specified function timer to be cleared. + sFunction - (string): The name of the function associated + with the timer to be cleared. +*/ +xajax.callback.clearTimer = function(oCallback, sFunction) +{ + if ('undefined' != typeof oCallback.timers) { + if ('undefined' != typeof oCallback.timers[sFunction]) { + clearTimeout(oCallback.timers[sFunction].timer); + } + } else if ('object' == typeof oCallback) { + var iLen = oCallback.length; + for (var i = 0; i < iLen; ++i) + xajax.callback.clearTimer(oCallback[i], sFunction); + } +} + +/* + Function: xajax.callback.execute + + Execute a callback event. + + Parameters: + + oCallback - (object): The callback object (or objects) which + contain the event handlers to be executed. + sFunction - (string): The name of the event to be triggered. + args - (object): The request object for this request. +*/ +xajax.callback.execute = function(oCallback, sFunction, args) { + if ('undefined' != typeof oCallback[sFunction]) { + var func = oCallback[sFunction]; + if ('function' == typeof func) { + if ('undefined' != typeof oCallback.timers[sFunction]) { + oCallback.timers[sFunction].timer = setTimeout(function() { + func(args); + }, oCallback.timers[sFunction].delay); + } + else { + func(args); + } + } + } else if ('object' == typeof oCallback) { + var iLen = oCallback.length; + for (var i = 0; i < iLen; ++i) + xajax.callback.execute(oCallback[i], sFunction, args); + } +} + +/* + Class: xajax.callback.global + + The global callback object which is active for every request. +*/ +xajax.callback.global = xajax.callback.create(); + +/* + Class: xajax +*/ + +/* + Object: xajax.response + + The response queue that holds response commands, once received + from the server, until they are processed. +*/ +xajax.response = xajax.tools.queue.create(xajax.config.responseQueueSize); + +/* + Object: responseSuccessCodes + + This array contains a list of codes which will be returned from the + server upon successful completion of the server portion of the + request. + + These values should match those specified in the HTTP standard. +*/ +xajax.responseSuccessCodes = ['0', '200']; + +// 10.4.1 400 Bad Request +// 10.4.2 401 Unauthorized +// 10.4.3 402 Payment Required +// 10.4.4 403 Forbidden +// 10.4.5 404 Not Found +// 10.4.6 405 Method Not Allowed +// 10.4.7 406 Not Acceptable +// 10.4.8 407 Proxy Authentication Required +// 10.4.9 408 Request Timeout +// 10.4.10 409 Conflict +// 10.4.11 410 Gone +// 10.4.12 411 Length Required +// 10.4.13 412 Precondition Failed +// 10.4.14 413 Request Entity Too Large +// 10.4.15 414 Request-URI Too Long +// 10.4.16 415 Unsupported Media Type +// 10.4.17 416 Requested Range Not Satisfiable +// 10.4.18 417 Expectation Failed +// 10.5 Server Error 5xx +// 10.5.1 500 Internal Server Error +// 10.5.2 501 Not Implemented +// 10.5.3 502 Bad Gateway +// 10.5.4 503 Service Unavailable +// 10.5.5 504 Gateway Timeout +// 10.5.6 505 HTTP Version Not Supported + +/* + Object: responseErrorsForAlert + + This array contains a list of status codes returned by + the server to indicate that the request failed for some + reason. +*/ +xajax.responseErrorsForAlert = ['400','401','402','403','404','500','501','502','503']; + +// 10.3.1 300 Multiple Choices +// 10.3.2 301 Moved Permanently +// 10.3.3 302 Found +// 10.3.4 303 See Other +// 10.3.5 304 Not Modified +// 10.3.6 305 Use Proxy +// 10.3.7 306 (Unused) +// 10.3.8 307 Temporary Redirect + +/* + Object: responseRedirectCodes + + An array of status codes returned from the server to + indicate a request for redirect to another URL. + + Typically, this is used by the server to send the browser + to another URL. This does not typically indicate that + the xajax request should be sent to another URL. +*/ +xajax.responseRedirectCodes = ['301','302','307']; + +/* + Class: xajax.command + + The object that manages commands and command handlers. +*/ +if ('undefined' == typeof xajax.command) + xajax.command = {}; + +/* + Function: xajax.command.create + + Creates a new command (object) that will be populated with + command parameters and eventually passed to the command handler. +*/ +xajax.command.create = function(sequence, request, context) { + var newCmd = {}; + newCmd.cmd = '*'; + newCmd.fullName = '* unknown command name *'; + newCmd.sequence = sequence; + newCmd.request = request; + newCmd.context = context; + return newCmd; +} + +/* + Class: xajax.command.handler + + The object that manages command handlers. +*/ +if ('undefined' == typeof xajax.command.handler) + xajax.command.handler = {}; + +/* + Object: handlers + + An array that is used internally in the xajax.command.handler object + to keep track of command handlers that have been registered. +*/ +if ('undefined' == typeof xajax.command.handler.handlers) + xajax.command.handler.handlers = []; + +/* + Function: xajax.command.handler.register + + Registers a new command handler. +*/ +xajax.command.handler.register = function(shortName, func) { + xajax.command.handler.handlers[shortName] = func; +} + +/* + Function: xajax.command.handler.unregister + + Unregisters and returns a command handler. + + Parameters: + shortName - (string): The name of the command handler. + + Returns: + func - (function): The unregistered function. +*/ +xajax.command.handler.unregister = function(shortName) { + var func = xajax.command.handler.handlers[shortName]; + delete xajax.command.handler.handlers[shortName]; + return func; +} + +/* + Function: xajax.command.handler.isRegistered + + + Parameters: + command - (object): + - cmd: The Name of the function. + + Returns: + + boolean - (true or false): depending on whether a command handler has + been created for the specified command (object). + +*/ +xajax.command.handler.isRegistered = function(command) { + var shortName = command.cmd; + if (xajax.command.handler.handlers[shortName]) + return true; + return false; +} + +/* + Function: xajax.command.handler.call + + Calls the registered command handler for the specified command + (you should always check isRegistered before calling this function) + + Parameters: + command - (object): + - cmd: The Name of the function. + + Returns: + true - (boolean) : +*/ +xajax.command.handler.call = function(command) { + var shortName = command.cmd; + return xajax.command.handler.handlers[shortName](command); +} + +xajax.command.handler.register('rcmplt', function(args) { + xajax.completeResponse(args.request); + return true; +}); + +xajax.command.handler.register('css', function(args) { + args.fullName = 'includeCSS'; + if ('undefined' == typeof args.media) + args.media = 'screen'; + return xajax.css.add(args.data, args.media); +}); +xajax.command.handler.register('rcss', function(args) { + args.fullName = 'removeCSS'; + if ('undefined' == typeof args.media) + args.media = 'screen'; + return xajax.css.remove(args.data, args.media); +}); +xajax.command.handler.register('wcss', function(args) { + args.fullName = 'waitForCSS'; + return xajax.css.waitForCSS(args); +}); + +xajax.command.handler.register('as', function(args) { + args.fullName = 'assign/clear'; + try { + return xajax.dom.assign(args.target, args.prop, args.data); + } catch (e) { + // do nothing, if the debug module is installed it will + // catch and handle the exception + } + return true; +}); +xajax.command.handler.register('ap', function(args) { + args.fullName = 'append'; + return xajax.dom.append(args.target, args.prop, args.data); +}); +xajax.command.handler.register('pp', function(args) { + args.fullName = 'prepend'; + return xajax.dom.prepend(args.target, args.prop, args.data); +}); +xajax.command.handler.register('rp', function(args) { + args.fullName = 'replace'; + return xajax.dom.replace(args.id, args.prop, args.data); +}); +xajax.command.handler.register('rm', function(args) { + args.fullName = 'remove'; + return xajax.dom.remove(args.id); +}); +xajax.command.handler.register('ce', function(args) { + args.fullName = 'create'; + return xajax.dom.create(args.id, args.data, args.prop); +}); +xajax.command.handler.register('ie', function(args) { + args.fullName = 'insert'; + return xajax.dom.insert(args.id, args.data, args.prop); +}); +xajax.command.handler.register('ia', function(args) { + args.fullName = 'insertAfter'; + return xajax.dom.insertAfter(args.id, args.data, args.prop); +}); + +xajax.command.handler.register('c:as', xajax.dom.contextAssign); +xajax.command.handler.register('c:ap', xajax.dom.contextAppend); +xajax.command.handler.register('c:pp', xajax.dom.contextPrepend); + +xajax.command.handler.register('s', xajax.js.sleep); +xajax.command.handler.register('ino', xajax.js.includeScriptOnce); +xajax.command.handler.register('in', xajax.js.includeScript); +xajax.command.handler.register('rjs', xajax.js.removeScript); +xajax.command.handler.register('wf', xajax.js.waitFor); +xajax.command.handler.register('js', xajax.js.execute); +xajax.command.handler.register('jc', xajax.js.call); +xajax.command.handler.register('sf', xajax.js.setFunction); +xajax.command.handler.register('wpf', xajax.js.wrapFunction); +xajax.command.handler.register('al', function(args) { + args.fullName = 'alert'; + alert(args.data); + return true; +}); +xajax.command.handler.register('cc', xajax.js.confirmCommands); + +xajax.command.handler.register('ci', xajax.forms.createInput); +xajax.command.handler.register('ii', xajax.forms.insertInput); +xajax.command.handler.register('iia', xajax.forms.insertInputAfter); + +xajax.command.handler.register('ev', xajax.events.setEvent); + +xajax.command.handler.register('ah', xajax.events.addHandler); +xajax.command.handler.register('rh', xajax.events.removeHandler); + +xajax.command.handler.register('dbg', function(args) { + args.fullName = 'debug message'; + return true; +}); + +/* + Function: xajax.initializeRequest + + Initialize a request object, populating default settings, where + call specific settings are not already provided. + + Parameters: + + oRequest - (object): An object that specifies call specific settings + that will, in addition, be used to store all request related + values. This includes temporary values used internally by xajax. +*/ +xajax.initializeRequest = function(oRequest) { + var xx = xajax; + var xc = xx.config; + + oRequest.append = function(opt, def) { + if ('undefined' != typeof this[opt]) { + for (var itmName in def) + if ('undefined' == typeof this[opt][itmName]) + this[opt][itmName] = def[itmName]; + } else this[opt] = def; + } + + oRequest.append('commonHeaders', xc.commonHeaders); + oRequest.append('postHeaders', xc.postHeaders); + oRequest.append('getHeaders', xc.getHeaders); + + oRequest.set = function(option, defaultValue) { + if ('undefined' == typeof this[option]) + this[option] = defaultValue; + } + + oRequest.set('statusMessages', xc.statusMessages); + oRequest.set('waitCursor', xc.waitCursor); + oRequest.set('mode', xc.defaultMode); + oRequest.set('method', xc.defaultMethod); + oRequest.set('URI', xc.requestURI); + oRequest.set('httpVersion', xc.defaultHttpVersion); + oRequest.set('contentType', xc.defaultContentType); + oRequest.set('retry', xc.defaultRetry); + oRequest.set('returnValue', xc.defaultReturnValue); + oRequest.set('maxObjectDepth', xc.maxObjectDepth); + oRequest.set('maxObjectSize', xc.maxObjectSize); + oRequest.set('context', window); + + var xcb = xx.callback; + var gcb = xcb.global; + var lcb = xcb.create(); + + lcb.take = function(frm, opt) { + if ('undefined' != typeof frm[opt]) { + lcb[opt] = frm[opt]; + lcb.hasEvents = true; + } + delete frm[opt]; + } + + lcb.take(oRequest, 'onRequest'); + lcb.take(oRequest, 'onResponseDelay'); + lcb.take(oRequest, 'onExpiration'); + lcb.take(oRequest, 'beforeResponseProcessing'); + lcb.take(oRequest, 'onFailure'); + lcb.take(oRequest, 'onRedirect'); + lcb.take(oRequest, 'onSuccess'); + lcb.take(oRequest, 'onComplete'); + + if ('undefined' != typeof oRequest.callback) { + if (lcb.hasEvents) + oRequest.callback = [oRequest.callback, lcb]; + } else + oRequest.callback = lcb; + + oRequest.status = (oRequest.statusMessages) + ? xc.status.update() + : xc.status.dontUpdate(); + + oRequest.cursor = (oRequest.waitCursor) + ? xc.cursor.update() + : xc.cursor.dontUpdate(); + + oRequest.method = oRequest.method.toUpperCase(); + if ('GET' != oRequest.method) + oRequest.method = 'POST'; // W3C: Method is case sensitive + + oRequest.requestRetry = oRequest.retry; + + oRequest.append('postHeaders', { + 'content-type': oRequest.contentType + }); + + delete oRequest['append']; + delete oRequest['set']; + delete oRequest['take']; + + if ('undefined' == typeof oRequest.URI) + throw { code: 10005 } +} + +/* + Function: xajax.processParameters + + Processes request specific parameters and generates the temporary + variables needed by xajax to initiate and process the request. + + Parameters: + + oRequest - A request object, created initially by a call to + + + Note: + This is called once per request; upon a request failure, this + will not be called for additional retries. +*/ +xajax.processParameters = function(oRequest) { + var xx = xajax; + var xt = xx.tools; + + var rd = []; + + var separator = ''; + for (var sCommand in oRequest.functionName) { + if ('constructor' != sCommand) { + rd.push(separator); + rd.push(sCommand); + rd.push('='); + rd.push(encodeURIComponent(oRequest.functionName[sCommand])); + separator = '&'; + } + } + var dNow = new Date(); + rd.push('&xjxr='); + rd.push(dNow.getTime()); + delete dNow; + + if (oRequest.parameters) { + var i = 0; + var iLen = oRequest.parameters.length; + while (i < iLen) { + var oVal = oRequest.parameters[i]; + if ('object' == typeof oVal && null != oVal) { + try { + var oGuard = {}; + oGuard.depth = 0; + oGuard.maxDepth = oRequest.maxObjectDepth; + oGuard.size = 0; + oGuard.maxSize = oRequest.maxObjectSize; + oVal = xt._objectToXML(oVal, oGuard); + } catch (e) { + oVal = ''; + // do nothing, if the debug module is installed + // it will catch the exception and handle it + } + rd.push('&xjxargs[]='); + oVal = encodeURIComponent(oVal); + rd.push(oVal); + ++i; + } else { + rd.push('&xjxargs[]='); + oVal = xt._escape(oVal); + if ('undefined' == typeof oVal || null == oVal) { + rd.push('*'); + } else { + var sType = typeof oVal; + if ('string' == sType) + rd.push('S'); + else if ('boolean' == sType) + rd.push('B'); + else if ('number' == sType) + rd.push('N'); + oVal = encodeURIComponent(oVal); + rd.push(oVal); + } + ++i; + } + } + } + + oRequest.requestURI = oRequest.URI; + + if ('GET' == oRequest.method) { + oRequest.requestURI += oRequest.requestURI.indexOf('?')== -1 ? '?' : '&'; + oRequest.requestURI += rd.join(''); + rd = []; + } + + oRequest.requestData = rd.join(''); +} + +/* + Function: xajax.prepareRequest + + Prepares the XMLHttpRequest object for this xajax request. + + Parameters: + + oRequest - (object): An object created by a call to + which already contains the necessary parameters and temporary variables + needed to initiate and process a xajax request. + + Note: + This is called each time a request object is being prepared for a + call to the server. If the request is retried, the request must be + prepared again. +*/ +xajax.prepareRequest = function(oRequest) { + var xx = xajax; + var xt = xx.tools; + + oRequest.request = xt.getRequestObject(); + + oRequest.setRequestHeaders = function(headers) { + if ('object' == typeof headers) { + for (var optionName in headers) + this.request.setRequestHeader(optionName, headers[optionName]); + } + } + oRequest.setCommonRequestHeaders = function() { + this.setRequestHeaders(this.commonHeaders); + } + oRequest.setPostRequestHeaders = function() { + this.setRequestHeaders(this.postHeaders); + } + oRequest.setGetRequestHeaders = function() { + this.setRequestHeaders(this.getHeaders); + } + + if ('asynchronous' == oRequest.mode) { + // references inside this function should be expanded + // IOW, don't use shorthand references like xx for xajax + oRequest.request.onreadystatechange = function() { + if (oRequest.request.readyState != 4) + return; + xajax.responseReceived(oRequest); + } + oRequest.finishRequest = function() { + return this.returnValue; + } + } else { + oRequest.finishRequest = function() { + return xajax.responseReceived(oRequest); + } + } + + if ('undefined' != typeof oRequest.userName && 'undefined' != typeof oRequest.password) { + oRequest.open = function() { + this.request.open( + this.method, + this.requestURI, + 'asynchronous' == this.mode, + oRequest.userName, + oRequest.password); + } + } else { + oRequest.open = function() { + this.request.open( + this.method, + this.requestURI, + 'asynchronous' == this.mode); + } + } + + if ('POST' == oRequest.method) { // W3C: Method is case sensitive + oRequest.applyRequestHeaders = function() { + this.setCommonRequestHeaders(); + try { + this.setPostRequestHeaders(); + } catch (e) { + this.method = 'GET'; + this.requestURI += this.requestURI.indexOf('?')== -1 ? '?' : '&'; + this.requestURI += this.requestData; + this.requestData = ''; + if (0 == this.requestRetry) this.requestRetry = 1; + throw e; + } + } + } else { + oRequest.applyRequestHeaders = function() { + this.setCommonRequestHeaders(); + this.setGetRequestHeaders(); + } + } +} + +/* + Function: xajax.request + + Initiates a request to the server. + + Parameters: + + functionName - (object): An object containing the name of the function to execute + on the server. The standard request is: {xjxfun:'function_name'} + + oRequest - (object, optional): A request object which + may contain call specific parameters. This object will be + used by xajax to store all the request parameters as well + as temporary variables needed during the processing of the + request. + +*/ +xajax.request = function() { + var numArgs = arguments.length; + if (0 == numArgs) + return false; + + var oRequest = {} + if (1 < numArgs) + oRequest = arguments[1]; + + oRequest.functionName = arguments[0]; + + var xx = xajax; + + xx.initializeRequest(oRequest); + xx.processParameters(oRequest); + while (0 < oRequest.requestRetry) { + try { + --oRequest.requestRetry; + xx.prepareRequest(oRequest); + return xx.submitRequest(oRequest); + } catch (e) { + xajax.callback.execute( + [xajax.callback.global, oRequest.callback], + 'onFailure', oRequest); + if (0 == oRequest.requestRetry) + throw e; + } + } +} + +/* + Function: xajax.call + + Initiates a call to the server. + + Parameters: + + sFunctionName - (string): The name of the function to execute + on the server. + + oRequestOptions - (object, optional): A request object which + may contain call specific parameters. This object will be + used by xajax to store all the request parameters as well + as temporary variables needed during the processing of the + request. + + Returns: + + unknown - For asynchronous calls, the return value will always + be the value set for +*/ +xajax.call = function() { + var numArgs = arguments.length; + if (0 == numArgs) + return false; + + var oRequest = {} + if (1 < numArgs) + oRequest = arguments[1]; + + oRequest.functionName = { xjxfun: arguments[0] }; + + var xx = xajax; + + xx.initializeRequest(oRequest); + xx.processParameters(oRequest); + + while (0 < oRequest.requestRetry) { + try { + --oRequest.requestRetry; + xx.prepareRequest(oRequest); + return xx.submitRequest(oRequest); + } catch (e) { + xajax.callback.execute( + [xajax.callback.global, oRequest.callback], + 'onFailure', oRequest); + if (0 == oRequest.requestRetry) + throw e; + } + } +} + +/* + Function: xajax.submitRequest + + Create a request object and submit the request using the specified + request type; all request parameters should be finalized by this + point. Upon failure of a POST, this function will fall back to a + GET request. + + Parameters: + + oRequest - (object): The request context object. +*/ +xajax.submitRequest = function(oRequest) { + oRequest.status.onRequest(); + + var xcb = xajax.callback; + var gcb = xcb.global; + var lcb = oRequest.callback; + + xcb.execute([gcb, lcb], 'onResponseDelay', oRequest); + xcb.execute([gcb, lcb], 'onExpiration', oRequest); + xcb.execute([gcb, lcb], 'onRequest', oRequest); + + oRequest.open(); + oRequest.applyRequestHeaders(); + + oRequest.cursor.onWaiting(); + oRequest.status.onWaiting(); + + xajax._internalSend(oRequest); + + // synchronous mode causes response to be processed immediately here + return oRequest.finishRequest(); +} + +/* + Function: xajax._internalSend + + This function is used internally by xajax to initiate a request to the + server. + + Parameters: + + oRequest - (object): The request context object. +*/ +xajax._internalSend = function(oRequest) { + // this may block if synchronous mode is selected + oRequest.request.send(oRequest.requestData); +} + +/* + Function: xajax.abortRequest + + Abort the request. + + Parameters: + + oRequest - (object): The request context object. +*/ +xajax.abortRequest = function(oRequest) +{ + oRequest.aborted = true; + oRequest.request.abort(); + xajax.completeResponse(oRequest); +} + +/* + Function: xajax.responseReceived + + Process the response. + + Parameters: + + oRequest - (object): The request context object. +*/ +xajax.responseReceived = function(oRequest) { + var xx = xajax; + var xcb = xx.callback; + var gcb = xcb.global; + var lcb = oRequest.callback; + // sometimes the responseReceived gets called when the + // request is aborted + if (oRequest.aborted) + return; + + xcb.clearTimer([gcb, lcb], 'onExpiration'); + xcb.clearTimer([gcb, lcb], 'onResponseDelay'); + + xcb.execute([gcb, lcb], 'beforeResponseProcessing', oRequest); + + var fProc = xx.getResponseProcessor(oRequest); + if ('undefined' == typeof fProc) { + xcb.execute([gcb, lcb], 'onFailure', oRequest); + xx.completeResponse(oRequest); + return; + } + + return fProc(oRequest); +} + +/* + Function: xajax.getResponseProcessor + + This function attempts to determine, based on the content type of the + reponse, what processor should be used for handling the response data. + + The default xajax response will be text/xml which will invoke the + xajax xml response processor. Other response processors may be added + in the future. The user can specify their own response processor on + a call by call basis. + + Parameters: + + oRequest - (object): The request context object. +*/ +xajax.getResponseProcessor = function(oRequest) { + var fProc; + + if ('undefined' == typeof oRequest.responseProcessor) { + var cTyp = oRequest.request.getResponseHeader('content-type'); + if (cTyp) { + if (0 <= cTyp.indexOf('text/xml')) { + fProc = xajax.responseProcessor.xml; + // } else if (0 <= cTyp.indexOf('application/json')) { + // fProc = xajax.responseProcessor.json; + } + } + } else fProc = oRequest.responseProcessor; + + return fProc; +} + +/* + Function: xajax.executeCommand + + Perform a lookup on the command specified by the response command + object passed in the first parameter. If the command exists, the + function checks to see if the command references a DOM object by + ID; if so, the object is located within the DOM and added to the + command data. The command handler is then called. + + If the command handler returns true, it is assumed that the command + completed successfully. If the command handler returns false, then the + command is considered pending; xajax enters a wait state. It is up + to the command handler to set an interval, timeout or event handler + which will restart the xajax response processing. + + Parameters: + + obj - (object): The response command to be executed. + + Returns: + + true - The command completed successfully. + false - The command signalled that it needs to pause processing. +*/ +xajax.executeCommand = function(command) { + if (xajax.command.handler.isRegistered(command)) { + // it is important to grab the element here as the previous command + // might have just created the element + if (command.id) + command.target = xajax.$(command.id); + // process the command + if (false == xajax.command.handler.call(command)) { + xajax.tools.queue.pushFront(xajax.response, command); + return false; + } + } + return true; +} + +/* + Function: xajax.completeResponse + + Called by the response command queue processor when all commands have + been processed. + + Parameters: + + oRequest - (object): The request context object. +*/ +xajax.completeResponse = function(oRequest) { + xajax.callback.execute( + [xajax.callback.global, oRequest.callback], + 'onComplete', oRequest); + oRequest.cursor.onComplete(); + oRequest.status.onComplete(); + // clean up -- these items are restored when the request is initiated + delete oRequest['functionName']; + delete oRequest['requestURI']; + delete oRequest['requestData']; + delete oRequest['requestRetry']; + delete oRequest['request']; + delete oRequest['set']; + delete oRequest['open']; + delete oRequest['setRequestHeaders']; + delete oRequest['setCommonRequestHeaders']; + delete oRequest['setPostRequestHeaders']; + delete oRequest['setGetRequestHeaders']; + delete oRequest['applyRequestHeaders']; + delete oRequest['finishRequest']; + delete oRequest['status']; + delete oRequest['cursor']; +} + +/* + Function: xajax.$ + + Shortcut to . +*/ +xajax.$ = xajax.tools.$; + +/* + Function: xajax.getFormValues + + Shortcut to . +*/ +xajax.getFormValues = xajax.tools.getFormValues; + +/* + Boolean: xajax.isLoaded + + true - xajax module is loaded. +*/ +xajax.isLoaded = true; + + +/* + Class: xjx + + Contains shortcut's to frequently used functions. +*/ +xjx = {} + +/* + Function: xjx.$ + + Shortcut to . +*/ +xjx.$ = xajax.tools.$; + +/* + Function: xjx.getFormValues + + Shortcut to . +*/ +xjx.getFormValues = xajax.tools.getFormValues; + +/* + Function: xjx.call + + Shortcut to . +*/ +xjx.call = xajax.call; + +xjx.request = xajax.request; diff --git a/phpgwapi/inc/xajax/xajax_js/xajax_debug.js b/phpgwapi/inc/xajax/xajax_js/xajax_debug.js new file mode 100644 index 0000000000..1b58e74c0e --- /dev/null +++ b/phpgwapi/inc/xajax/xajax_js/xajax_debug.js @@ -0,0 +1,117 @@ + +try{if('undefined'==typeof xajax) +throw{name:'SequenceError',message:'Error: xajax core was not detected, debug module disabled.'} +if('undefined'==typeof xajax.debug) +xajax.debug={} +xajax.debug.workId='xajaxWork'+new Date().getTime();xajax.debug.windowSource='about:blank';xajax.debug.windowID='xajax_debug_'+xajax.debug.workId;if('undefined'==typeof xajax.debug.windowStyle) +xajax.debug.windowStyle= +'width=800,'+ +'height=600,'+ +'scrollbars=yes,'+ +'resizable=yes,'+ +'status=yes';if('undefined'==typeof xajax.debug.windowTemplate) +xajax.debug.windowTemplate= +''+ +''+ +'xajax debug output'+ +''+ +''+ +'

xajax debug output

'+ +'
'+ +'';xajax.debug.text=[];xajax.debug.text[100]='WARNING: ';xajax.debug.text[101]='ERROR: ';xajax.debug.text[102]='XAJAX DEBUG MESSAGE:\n';xajax.debug.text[103]='...\n[LONG RESPONSE]\n...';xajax.debug.text[104]='SENDING REQUEST';xajax.debug.text[105]='SENT [';xajax.debug.text[106]=' bytes]';xajax.debug.text[107]='CALLING: ';xajax.debug.text[108]='URI: ';xajax.debug.text[109]='INITIALIZING REQUEST';xajax.debug.text[110]='PROCESSING PARAMETERS [';xajax.debug.text[111]=']';xajax.debug.text[112]='NO PARAMETERS TO PROCESS';xajax.debug.text[113]='PREPARING REQUEST';xajax.debug.text[114]='STARTING XAJAX CALL (deprecated: use xajax.request instead)';xajax.debug.text[115]='STARTING XAJAX REQUEST';xajax.debug.text[116]='No response processor is available to process the response from the server.\n';xajax.debug.text[117]='.\nCheck for error messages from the server.';xajax.debug.text[118]='RECEIVED [status: ';xajax.debug.text[119]=', size: ';xajax.debug.text[120]=' bytes, time: ';xajax.debug.text[121]='ms]:\n';xajax.debug.text[122]='The server returned the following HTTP status: ';xajax.debug.text[123]='\nRECEIVED:\n';xajax.debug.text[124]='The server returned a redirect to:
';xajax.debug.text[125]='DONE [';xajax.debug.text[126]='ms]';xajax.debug.text[127]='INITIALIZING REQUEST OBJECT';xajax.debug.exceptions=[];xajax.debug.exceptions[10001]='Invalid response XML: The response contains an unknown tag: {data}.';xajax.debug.exceptions[10002]='GetRequestObject: XMLHttpRequest is not available, xajax is disabled.';xajax.debug.exceptions[10003]='Queue overflow: Cannot push object onto queue because it is full.';xajax.debug.exceptions[10004]='Invalid response XML: The response contains an unexpected tag or text: {data}.';xajax.debug.exceptions[10005]='Invalid request URI: Invalid or missing URI; autodetection failed; please specify a one explicitly.';xajax.debug.exceptions[10006]='Invalid response command: Malformed response command received.';xajax.debug.exceptions[10007]='Invalid response command: Command [{data}] is not a known command.';xajax.debug.exceptions[10008]='Element with ID [{data}] not found in the document.';xajax.debug.exceptions[10009]='Invalid request: Missing function name parameter.';xajax.debug.exceptions[10010]='Invalid request: Missing function object parameter.';xajax.debug.getExceptionText=function(e){if('undefined'!=typeof e.code){if('undefined'!=typeof xajax.debug.exceptions[e.code]){var msg=xajax.debug.exceptions[e.code];if('undefined'!=typeof e.data){msg.replace('{data}',e.data);} +return msg;} +}else if('undefined'!=typeof e.name){var msg=e.name;if('undefined'!=typeof e.message){msg+=': ';msg+=e.message;} +return msg;} +return 'An unknown error has occurred.';} +xajax.debug.writeMessage=function(text,prefix,cls){try{var xd=xajax.debug;if('undefined'==typeof xd.window||true==xd.window.closed){xd.window=window.open(xd.windowSource,xd.windowID,xd.windowStyle);if("about:blank"==xd.windowSource) +xd.window.document.write(xd.windowTemplate);} +var xdw=xd.window;var xdwd=xdw.document;if('undefined'==typeof prefix) +prefix='';if('undefined'==typeof cls) +cls='debugText';text=xajax.debug.prepareDebugText(text);var debugTag=xdwd.getElementById('debugTag');var debugEntry=xdwd.createElement('div');var debugDate=xdwd.createElement('span');var debugText=xdwd.createElement('pre');debugDate.innerHTML=new Date().toString();debugText.innerHTML=prefix+text;debugEntry.appendChild(debugDate);debugEntry.appendChild(debugText);debugTag.insertBefore(debugEntry,debugTag.firstChild);try{debugEntry.className='debugEntry';debugDate.className='debugDate';debugText.className=cls;}catch(e){} +}catch(e){if(text.length > 1000)text=text.substr(0,1000)+xajax.debug.text[102];alert(xajax.debug.text[102]+text);} +} +xajax.debug.prepareDebugText=function(text){try{text=text.replace(/&/g,'&') +.replace(//g,'>') +.replace(/\n/g,'
');return text;}catch(e){xajax.debug.stringReplace=function(haystack,needle,newNeedle){var segments=haystack.split(needle);haystack='';for(var i=0;i < segments.length;++i){if(0!=i) +haystack+=newNeedle;haystack+=segments[i];} +return haystack;} +xajax.debug.prepareDebugText=function(text){text=xajax.debug.stringReplace(text,'&','&');text=xajax.debug.stringReplace(text,'<','<');text=xajax.debug.stringReplace(text,'>','>');text=xajax.debug.stringReplace(text,'\n','
');return text;} +xajax.debug.prepareDebugText(text);} +} +xajax.debug.executeCommand=xajax.executeCommand;xajax.executeCommand=function(args){try{if('undefined'==typeof args.cmd) +throw{code:10006};if(false==xajax.command.handler.isRegistered(args)) +throw{code:10007,data:args.cmd};return xajax.debug.executeCommand(args);}catch(e){var msg='ExecuteCommand (';if('undefined'!=typeof args.sequence){msg+='#';msg+=args.sequence;msg+=', ';} +if('undefined'!=typeof args.cmdFullName){msg+='"';msg+=args.cmdFullName;msg+='"';} +msg+='):\n';msg+=xajax.debug.getExceptionText(e);msg+='\n';xajax.debug.writeMessage(msg,xajax.debug.text[101],'errorText');} +return true;} +xajax.debug.parseAttributes=xajax.parseAttributes;xajax.parseAttributes=function(child,obj){try{xajax.debug.parseAttributes(child,obj);}catch(e){var msg='ParseAttributes:\n';msg+=xajax.debug.getExceptionText(e);msg+='\n';xajax.debug.writeMessage(msg,xajax.debug.text[101],'errorText');} +} +xajax.debug.commandHandler=xajax.command.handler.unregister('dbg');xajax.command.handler.register('dbg',function(args){args.cmdFullName='debug message';xajax.debug.writeMessage(args.data,xajax.debug.text[100],'warningText');return xajax.debug.commandHandler(args);});xajax.debug.$=xajax.tools.$;xajax.tools.$=function(sId){try{var returnValue=xajax.debug.$(sId);if('object'!=typeof returnValue) +throw{code:10008};} +catch(e){var msg='$:';msg+=xajax.debug.getExceptionText(e);msg+='\n';xajax.debug.writeMessage(msg,xajax.debug.text[100],'warningText');} +return returnValue;} +xajax.debug._objectToXML=xajax.tools._objectToXML;xajax.tools._objectToXML=function(obj,guard){try{if(0==guard.size){var msg='OBJECT TO XML: maxDepth = ';msg+=guard.maxDepth;msg+=', maxSize = ';msg+=guard.maxSize;xajax.debug.writeMessage(msg);} +var r=xajax.debug._objectToXML(obj,guard);if(0==guard.depth){var msg='OBJECT TO XML: size = ';msg+=guard.size;xajax.debug.writeMessage(msg);} +return r;}catch(e){var msg='ObjectToXML: ';msg+=xajax.debug.getExceptionText(e);msg+='\n';xajax.debug.writeMessage(msg,xajax.debug.text[101],'errorText');} +return '';} +xajax.debug._internalSend=xajax._internalSend;xajax._internalSend=function(oRequest){try{xajax.debug.writeMessage(xajax.debug.text[104]);xajax.debug.writeMessage( +xajax.debug.text[105]+ +oRequest.requestData.length+ +xajax.debug.text[106] +);oRequest.beginDate=new Date();xajax.debug._internalSend(oRequest);}catch(e){var msg='InternalSend: ';msg+=xajax.debug.getExceptionText(e);msg+='\n';xajax.debug.writeMessage(msg,xajax.debug.text[101],'errorText');throw e;} +} +xajax.debug.submitRequest=xajax.submitRequest;xajax.submitRequest=function(oRequest){var msg=oRequest.method;msg+=': ';text=decodeURIComponent(oRequest.requestData);text=text.replace(new RegExp('&xjx','g'),'\n&xjx');text=text.replace(new RegExp('','g'),'\n');text=text.replace(new RegExp('','g'),'\n');text=text.replace(new RegExp('','g'),'\n\n');msg+=text;xajax.debug.writeMessage(msg);msg=xajax.debug.text[107];var separator='\n';for(var mbr in oRequest.functionName){msg+=separator;msg+=mbr;msg+=': ';msg+=oRequest.functionName[mbr];separator='\n';} +msg+=separator;msg+=xajax.debug.text[108];msg+=separator;msg+=oRequest.URI;xajax.debug.writeMessage(msg);try{return xajax.debug.submitRequest(oRequest);}catch(e){xajax.debug.writeMessage(e.message);if(0 < oRequest.retry) +throw e;} +} +xajax.debug.initializeRequest=xajax.initializeRequest;xajax.initializeRequest=function(oRequest){try{var msg=xajax.debug.text[109];xajax.debug.writeMessage(msg);return xajax.debug.initializeRequest(oRequest);}catch(e){var msg='InitializeRequest: ';msg+=xajax.debug.getExceptionText(e);msg+='\n';xajax.debug.writeMessage(msg,xajax.debug.text[101],'errorText');throw e;} +} +xajax.debug.processParameters=xajax.processParameters;xajax.processParameters=function(oRequest){try{if('undefined'!=typeof oRequest.parameters){var msg=xajax.debug.text[110];msg+=oRequest.parameters.length;msg+=xajax.debug.text[111];xajax.debug.writeMessage(msg);}else{var msg=xajax.debug.text[112];xajax.debug.writeMessage(msg);} +return xajax.debug.processParameters(oRequest);}catch(e){var msg='ProcessParameters: ';msg+=xajax.debug.getExceptionText(e);msg+='\n';xajax.debug.writeMessage(msg,xajax.debug.text[101],'errorText');throw e;} +} +xajax.debug.prepareRequest=xajax.prepareRequest;xajax.prepareRequest=function(oRequest){try{var msg=xajax.debug.text[113];xajax.debug.writeMessage(msg);return xajax.debug.prepareRequest(oRequest);}catch(e){var msg='PrepareRequest: ';msg+=xajax.debug.getExceptionText(e);msg+='\n';xajax.debug.writeMessage(msg,xajax.debug.text[101],'errorText');throw e;} +} +xajax.debug.call=xajax.call;xajax.call=function(){try{xajax.debug.writeMessage(xajax.debug.text[114]);var numArgs=arguments.length;if(0==numArgs) +throw{code:10009};var functionName=arguments[0];var oOptions={} +if(1 < numArgs) +oOptions=arguments[1];oOptions.debugging=true;return xajax.debug.call(functionName,oOptions);}catch(e){var msg='Call: ';msg+=xajax.debug.getExceptionText(e);msg+='\n';xajax.debug.writeMessage(msg,xajax.debug.text[101],'errorText');throw e;} +} +xajax.debug.request=xajax.request;xajax.request=function(){try{xajax.debug.writeMessage(xajax.debug.text[115]);var numArgs=arguments.length;if(0==numArgs) +throw{code:10010};var oFunction=arguments[0];var oOptions={} +if(1 < numArgs) +oOptions=arguments[1];oOptions.debugging=true;return xajax.debug.request(oFunction,oOptions);}catch(e){var msg='Request: ';msg+=xajax.debug.getExceptionText(e);msg+='\n';xajax.debug.writeMessage(msg,xajax.debug.text[101],'errorText');throw e;} +} +xajax.debug.getResponseProcessor=xajax.getResponseProcessor;xajax.getResponseProcessor=function(oRequest){try{var fProc=xajax.debug.getResponseProcessor(oRequest);if('undefined'==typeof fProc){var msg=xajax.debug.text[116];try{var contentType=oRequest.request.getResponseHeader('content-type');msg+="Content-Type: ";msg+=contentType;if('text/html'==contentType){msg+=xajax.debug.text[117];} +}catch(e){} +xajax.debug.writeMessage(msg,xajax.debug.text[101],'errorText');} +return fProc;}catch(e){var msg='GetResponseProcessor: ';msg+=xajax.debug.getExceptionText(e);msg+='\n';xajax.debug.writeMessage(msg,xajax.debug.text[101],'errorText');throw e;} +} +xajax.debug.responseReceived=xajax.responseReceived;xajax.responseReceived=function(oRequest){var xx=xajax;var xt=xx.tools;var xd=xx.debug;var oRet;try{var status=oRequest.request.status;if(xt.arrayContainsValue(xx.responseSuccessCodes,status)){var packet=oRequest.request.responseText;packet=packet.replace(new RegExp('','g'),'\n');packet=packet.replace(new RegExp('','g'),'\n');packet=packet.replace(new RegExp('','g'),'\n');packet=packet.replace(new RegExp('','g'),'\n\n');packet=packet.replace(new RegExp('','g'),'\n');oRequest.midDate=new Date();var msg=xajax.debug.text[118];msg+=oRequest.request.status;msg+=xajax.debug.text[119];msg+=packet.length;msg+=xajax.debug.text[120];msg+=(oRequest.midDate-oRequest.beginDate);msg+=xajax.debug.text[121];msg+=packet;xd.writeMessage(msg);}else if(xt.arrayContainsValue(xx.responseErrorsForAlert,status)){var msg=xajax.debug.text[122];msg+=status;msg+=xajax.debug.text[123];msg+=oRequest.request.responseText;xd.writeMessage(msg,xajax.debug.text[101],'errorText');}else if(xt.arrayContainsValue(xx.responseRedirectCodes,status)){var msg=xajax.debug.text[124];msg+=oRequest.request.getResponseHeader('location');xd.writeMessage(msg);} +oRet=xd.responseReceived(oRequest);}catch(e){var msg='ResponseReceived: ';msg+=xajax.debug.getExceptionText(e);msg+='\n';xd.writeMessage(msg,xajax.debug.text[101],'errorText');} +return oRet;} +xajax.debug.completeResponse=xajax.completeResponse;xajax.completeResponse=function(oRequest){try{var returnValue=xajax.debug.completeResponse(oRequest);oRequest.endDate=new Date();var msg=xajax.debug.text[125];msg+=(oRequest.endDate-oRequest.beginDate);msg+=xajax.debug.text[126];xajax.debug.writeMessage(msg);return returnValue;}catch(e){var msg='CompleteResponse: ';msg+=xajax.debug.getExceptionText(e);msg+='\n';xajax.debug.writeMessage(msg,xajax.debug.text[101],'errorText');throw e;} +} +xajax.debug.getRequestObject=xajax.tools.getRequestObject;xajax.tools.getRequestObject=function(){try{xajax.debug.writeMessage(xajax.debug.text[127]);return xajax.debug.getRequestObject();}catch(e){var msg='GetRequestObject: ';msg+=xajax.debug.getExceptionText(e);msg+='\n';xajax.debug.writeMessage(msg,xajax.debug.text[101],'errorText');throw e;} +} +if(xajax.dom.assign){xajax.debug.assign=xajax.dom.assign;xajax.dom.assign=function(element,property,data){try{return xajax.debug.assign(element,property,data);}catch(e){var msg='xajax.dom.assign: ';msg+=xajax.debug.getExceptionText(e);msg+='\n';msg+='Eval: element.';msg+=property;msg+=' = data;\n';xajax.debug.writeMessage(msg,xajax.debug.text[101],'errorText');} +return true;} +} +if(xajax.tools){if(xajax.tools.queue){if(xajax.tools.queue.retry){if('undefined'==typeof xajax.debug.tools) +xajax.debug.tools={};if('undefined'==typeof xajax.debug.tools.queue) +xajax.debug.tools.queue={};xajax.debug.tools.queue.retry=xajax.tools.queue.retry;xajax.tools.queue.retry=function(obj,count){if(xajax.debug.tools.queue.retry(obj,count)) +return true;if(obj.cmd&&'s'==obj.cmd) +return false;xajax.debug.writeMessage('Retry count exceeded.');return false;} +} +} +} +xajax.debug.isLoaded=true;xjx={} +xjx.$=xajax.tools.$;xjx.getFormValues=xajax.tools.getFormValues;xjx.call=xajax.call;xjx.request=xajax.request;xajax.$=xajax.tools.$;xajax.getFormValues=xajax.tools.getFormValues;}catch(e){alert(e.name+': '+e.message);} diff --git a/phpgwapi/inc/xajax/xajax_js/xajax_debug_uncompressed.js b/phpgwapi/inc/xajax/xajax_js/xajax_debug_uncompressed.js new file mode 100644 index 0000000000..1317182f2e --- /dev/null +++ b/phpgwapi/inc/xajax/xajax_js/xajax_debug_uncompressed.js @@ -0,0 +1,883 @@ +/* + File: xajax_debug.js + + This optional file contains the debugging module for use with xajax. If + you include this module after the standard module, you + will receive debugging messages, including errors, that occur during + the processing of your xajax requests. + + Title: xajax debugging module + + Please see for a detailed description, copyright + and license information. +*/ + +/* + @package xajax + @version $Id: xajax_debug_uncompressed.js 327 2007-02-28 16:55:26Z calltoconstruct $ + @copyright Copyright (c) 2005-2007 by Jared White & J. Max Wilson + @copyright Copyright (c) 2008-2009 by Joseph Woolley, Steffen Konerow, Jared White & J. Max Wilson + @license http://www.xajaxproject.org/bsd_license.txt BSD License +*/ + +try +{ + /* + Class: xajax.debug + + This object contains the variables and functions used to display process state + messages and to trap error conditions and report them to the user via + a secondary browser window or alert messages as necessary. + */ + if ('undefined' == typeof xajax) + throw { name: 'SequenceError', message: 'Error: xajax core was not detected, debug module disabled.' } + + if ('undefined' == typeof xajax.debug) + xajax.debug = {} + + /* + String: xajax.debug.workId + + Stores a 'unique' identifier for this session so that an existing debugging + window can be detected, else one will be created. + */ + xajax.debug.workId = 'xajaxWork'+ new Date().getTime(); + + /* + String: xajax.debug.windowSource + + The default URL that is given to the debugging window upon creation. + */ + xajax.debug.windowSource = 'about:blank'; + + /* + String: xajax.debug.windowID + + A 'unique' name used to identify the debugging window that is attached + to this xajax session. + */ + xajax.debug.windowID = 'xajax_debug_'+xajax.debug.workId; + + /* + String: windowStyle + + The parameters that will be used to create the debugging window. + */ + if ('undefined' == typeof xajax.debug.windowStyle) + xajax.debug.windowStyle = + 'width=800,' + + 'height=600,' + + 'scrollbars=yes,' + + 'resizable=yes,' + + 'status=yes'; + + /* + String: windowTemplate + + The HTML template and CSS style information used to populate the + debugging window upon creation. + */ + if ('undefined' == typeof xajax.debug.windowTemplate) + xajax.debug.windowTemplate = + '' + + '' + + 'xajax debug output' + + '' + + '' + + '

xajax debug output

' + + '
' + + ''; + + /* + Object: window + + A reference to the debugging window, once constructed, where messages will + be displayed throughout the request process. This is constructed internally + as needed. + */ + + /* + Array: xajax.debug.text + */ + xajax.debug.text = []; + xajax.debug.text[100] = 'WARNING: '; + xajax.debug.text[101] = 'ERROR: '; + xajax.debug.text[102] = 'XAJAX DEBUG MESSAGE:\n'; + xajax.debug.text[103] = '...\n[LONG RESPONSE]\n...'; + xajax.debug.text[104] = 'SENDING REQUEST'; + xajax.debug.text[105] = 'SENT ['; + xajax.debug.text[106] = ' bytes]'; + xajax.debug.text[107] = 'CALLING: '; + xajax.debug.text[108] = 'URI: '; + xajax.debug.text[109] = 'INITIALIZING REQUEST'; + xajax.debug.text[110] = 'PROCESSING PARAMETERS ['; + xajax.debug.text[111] = ']'; + xajax.debug.text[112] = 'NO PARAMETERS TO PROCESS'; + xajax.debug.text[113] = 'PREPARING REQUEST'; + xajax.debug.text[114] = 'STARTING XAJAX CALL (deprecated: use xajax.request instead)'; + xajax.debug.text[115] = 'STARTING XAJAX REQUEST'; + xajax.debug.text[116] = 'No response processor is available to process the response from the server.\n'; + xajax.debug.text[117] = '.\nCheck for error messages from the server.'; + xajax.debug.text[118] = 'RECEIVED [status: '; + xajax.debug.text[119] = ', size: '; + xajax.debug.text[120] = ' bytes, time: '; + xajax.debug.text[121] = 'ms]:\n'; + xajax.debug.text[122] = 'The server returned the following HTTP status: '; + xajax.debug.text[123] = '\nRECEIVED:\n'; + xajax.debug.text[124] = 'The server returned a redirect to:
'; + xajax.debug.text[125] = 'DONE ['; + xajax.debug.text[126] = 'ms]'; + xajax.debug.text[127] = 'INITIALIZING REQUEST OBJECT'; + + /* + Array: xajax.debug.exceptions + */ + xajax.debug.exceptions = []; + xajax.debug.exceptions[10001] = 'Invalid response XML: The response contains an unknown tag: {data}.'; + xajax.debug.exceptions[10002] = 'GetRequestObject: XMLHttpRequest is not available, xajax is disabled.'; + xajax.debug.exceptions[10003] = 'Queue overflow: Cannot push object onto queue because it is full.'; + xajax.debug.exceptions[10004] = 'Invalid response XML: The response contains an unexpected tag or text: {data}.'; + xajax.debug.exceptions[10005] = 'Invalid request URI: Invalid or missing URI; autodetection failed; please specify a one explicitly.'; + xajax.debug.exceptions[10006] = 'Invalid response command: Malformed response command received.'; + xajax.debug.exceptions[10007] = 'Invalid response command: Command [{data}] is not a known command.'; + xajax.debug.exceptions[10008] = 'Element with ID [{data}] not found in the document.'; + xajax.debug.exceptions[10009] = 'Invalid request: Missing function name parameter.'; + xajax.debug.exceptions[10010] = 'Invalid request: Missing function object parameter.'; + + /* + Function: xajax.debug.getExceptionText + + Parameters: + e - (object): Exception + */ + xajax.debug.getExceptionText = function(e) { + if ('undefined' != typeof e.code) { + if ('undefined' != typeof xajax.debug.exceptions[e.code]) { + var msg = xajax.debug.exceptions[e.code]; + if ('undefined' != typeof e.data) { + msg.replace('{data}', e.data); + } + return msg; + } + } else if ('undefined' != typeof e.name) { + var msg = e.name; + if ('undefined' != typeof e.message) { + msg += ': '; + msg += e.message; + } + return msg; + } + return 'An unknown error has occurred.'; + } + + /* + Function: xajax.debug.writeMessage + + Output a debug message to the debug window if available or send to an + alert box. If the debug window has not been created, attempt to + create it. + + Parameters: + + text - (string): The text to output. + + prefix - (string): The prefix to use; this is prepended onto the + message; it should indicate the type of message (warning, error) + + cls - (stirng): The className that will be applied to the message; + invoking a style from the CSS provided in + . Should be one of the following: + - warningText + - errorText + */ + xajax.debug.writeMessage = function(text, prefix, cls) { + try { + var xd = xajax.debug; + if ('undefined' == typeof xd.window || true == xd.window.closed) { + xd.window = window.open(xd.windowSource, xd.windowID, xd.windowStyle); + if ("about:blank" == xd.windowSource) + xd.window.document.write(xd.windowTemplate); + } + var xdw = xd.window; + var xdwd = xdw.document; + if ('undefined' == typeof prefix) + prefix = ''; + if ('undefined' == typeof cls) + cls = 'debugText'; + + text = xajax.debug.prepareDebugText(text); + + var debugTag = xdwd.getElementById('debugTag'); + var debugEntry = xdwd.createElement('div'); + var debugDate = xdwd.createElement('span'); + var debugText = xdwd.createElement('pre'); + + debugDate.innerHTML = new Date().toString(); + debugText.innerHTML = prefix + text; + + debugEntry.appendChild(debugDate); + debugEntry.appendChild(debugText); + debugTag.insertBefore(debugEntry, debugTag.firstChild); + // don't allow 'style' issues to hinder the debug output + try { + debugEntry.className = 'debugEntry'; + debugDate.className = 'debugDate'; + debugText.className = cls; + } catch (e) { + } + } catch (e) { + if (text.length > 1000) text = text.substr(0,1000) + xajax.debug.text[102]; + alert(xajax.debug.text[102] + text); + } + } + + /* + Function: xajax.debug.prepareDebugText + + Convert special characters to their HTML equivellents so they + will show up in the . + + Parameters: + text - (string): Debug text + */ + xajax.debug.prepareDebugText = function(text) { + try { + text = text.replace(/&/g, '&') + .replace(//g, '>') + .replace(/\n/g, '
'); + return text; + } catch (e) { + xajax.debug.stringReplace = function(haystack, needle, newNeedle) { + var segments = haystack.split(needle); + haystack = ''; + for (var i = 0; i < segments.length; ++i) { + if (0 != i) + haystack += newNeedle; + haystack += segments[i]; + } + return haystack; + } + xajax.debug.prepareDebugText = function(text) { + text = xajax.debug.stringReplace(text, '&', '&'); + text = xajax.debug.stringReplace(text, '<', '<'); + text = xajax.debug.stringReplace(text, '>', '>'); + text = xajax.debug.stringReplace(text, '\n', '
'); + return text; + } + xajax.debug.prepareDebugText(text); + } + } + + /* + Function: xajax.debug.executeCommand + + Catch any exceptions that are thrown by a response command handler + and display a message in the debugger. + + This is a wrapper function which surrounds the standard + function. + */ + xajax.debug.executeCommand = xajax.executeCommand; + xajax.executeCommand = function(args) { + try { + if ('undefined' == typeof args.cmd) + throw { code: 10006 }; + if (false == xajax.command.handler.isRegistered(args)) + throw { code: 10007, data: args.cmd }; + return xajax.debug.executeCommand(args); + } catch(e) { + var msg = 'ExecuteCommand ('; + if ('undefined' != typeof args.sequence) { + msg += '#'; + msg += args.sequence; + msg += ', '; + } + if ('undefined' != typeof args.cmdFullName) { + msg += '"'; + msg += args.cmdFullName; + msg += '"'; + } + msg += '):\n'; + msg += xajax.debug.getExceptionText(e); + msg += '\n'; + xajax.debug.writeMessage(msg, xajax.debug.text[101], 'errorText'); + } + return true; + } + + /* + Function: xajax.parseAttributes + + Catch any exception thrown during the parsing of response + command attributes and display an appropriate debug message. + + This is a wrapper around the standard + function. + + Parameters: + child - (object): Childnode + obj - (object): Object + + */ + xajax.debug.parseAttributes = xajax.parseAttributes; + xajax.parseAttributes = function(child, obj) { + try { + xajax.debug.parseAttributes(child, obj); + } catch(e) { + var msg = 'ParseAttributes:\n'; + msg += xajax.debug.getExceptionText(e); + msg += '\n'; + xajax.debug.writeMessage(msg, xajax.debug.text[101], 'errorText'); + } + } + + xajax.debug.commandHandler = xajax.command.handler.unregister('dbg'); + xajax.command.handler.register('dbg', function(args) { + args.cmdFullName = 'debug message'; + xajax.debug.writeMessage(args.data, xajax.debug.text[100], 'warningText'); + return xajax.debug.commandHandler(args); + }); + + + /* + Function: xajax.tools.$ + + Catch any exceptions thrown while attempting to locate an + HTML element by it's unique name. + + This is a wrapper around the standard function. + + Parameters: + sId - (string): Element ID or name + + */ + xajax.debug.$ = xajax.tools.$; + xajax.tools.$ = function(sId) { + try { + var returnValue = xajax.debug.$(sId); + if ('object' != typeof returnValue) + throw { code: 10008 }; + } + catch (e) { + var msg = '$:'; + msg += xajax.debug.getExceptionText(e); + msg += '\n'; + xajax.debug.writeMessage(msg, xajax.debug.text[100], 'warningText'); + } + return returnValue; + } + + /* + Function: xajax.tools._objectToXML + + Generate a message indicating that a javascript object is + being converted to xml. Indicate the max depth and size. Then + display the size of the object upon completion. Catch any + exceptions thrown during the conversion process. + + This is a wrapper around the standard + function. + + Parameters: + obj - (object): + guard - (object): + + */ + xajax.debug._objectToXML = xajax.tools._objectToXML; + xajax.tools._objectToXML = function(obj, guard) { + try { + if (0 == guard.size) { + var msg = 'OBJECT TO XML: maxDepth = '; + msg += guard.maxDepth; + msg += ', maxSize = '; + msg += guard.maxSize; + xajax.debug.writeMessage(msg); + } + var r = xajax.debug._objectToXML(obj, guard); + if (0 == guard.depth) { + var msg = 'OBJECT TO XML: size = '; + msg += guard.size; + xajax.debug.writeMessage(msg); + } + return r; + } catch(e) { + var msg = 'ObjectToXML: '; + msg += xajax.debug.getExceptionText(e); + msg += '\n'; + xajax.debug.writeMessage(msg, xajax.debug.text[101], 'errorText'); + } + return ''; + } + + /* + Function: xajax._internalSend + + Generate a message indicating that the xajax request is + about the be sent to the server. + + This is a wrapper around the standard + function. + */ + xajax.debug._internalSend = xajax._internalSend; + xajax._internalSend = function(oRequest) { + try { + xajax.debug.writeMessage(xajax.debug.text[104]); + xajax.debug.writeMessage( + xajax.debug.text[105] + + oRequest.requestData.length + + xajax.debug.text[106] + ); + oRequest.beginDate = new Date(); + xajax.debug._internalSend(oRequest); + } catch (e) { + var msg = 'InternalSend: '; + msg += xajax.debug.getExceptionText(e); + msg += '\n'; + xajax.debug.writeMessage(msg, xajax.debug.text[101], 'errorText'); + throw e; + } + } + + /* + Function: xajax.submitRequest + + Generate a message indicating that a request is ready to be + submitted; providing the URL and the function being invoked. + + Catch any exceptions thrown and display a message. + + This is a wrapper around the standard + function. + */ + xajax.debug.submitRequest = xajax.submitRequest; + xajax.submitRequest = function(oRequest) { + var msg = oRequest.method; + msg += ': '; + text = decodeURIComponent(oRequest.requestData); + text = text.replace(new RegExp('&xjx', 'g'), '\n&xjx'); + text = text.replace(new RegExp('', 'g'), '\n'); + text = text.replace(new RegExp('', 'g'), '\n'); + text = text.replace(new RegExp('', 'g'), '\n\n'); + msg += text; + xajax.debug.writeMessage(msg); + msg = xajax.debug.text[107]; + var separator = '\n'; + for (var mbr in oRequest.functionName) { + msg += separator; + msg += mbr; + msg += ': '; + msg += oRequest.functionName[mbr]; + separator = '\n'; + } + msg += separator; + msg += xajax.debug.text[108]; + msg += separator; + msg += oRequest.URI; + xajax.debug.writeMessage(msg); + + try { + return xajax.debug.submitRequest(oRequest); + } catch (e) { + xajax.debug.writeMessage(e.message); + if (0 < oRequest.retry) + throw e; + } + } + + /* + Function: xajax.initializeRequest + + Generate a message indicating that the request object is + being initialized. + + This is a wrapper around the standard + function. + */ + xajax.debug.initializeRequest = xajax.initializeRequest; + xajax.initializeRequest = function(oRequest) { + try { + var msg = xajax.debug.text[109]; + xajax.debug.writeMessage(msg); + return xajax.debug.initializeRequest(oRequest); + } catch (e) { + var msg = 'InitializeRequest: '; + msg += xajax.debug.getExceptionText(e); + msg += '\n'; + xajax.debug.writeMessage(msg, xajax.debug.text[101], 'errorText'); + throw e; + } + } + + /* + Function: xajax.processParameters + + Generate a message indicating that the request object is + being populated with the parameters provided. + + This is a wrapper around the standard + function. + */ + xajax.debug.processParameters = xajax.processParameters; + xajax.processParameters = function(oRequest) { + try { + if ('undefined' != typeof oRequest.parameters) { + var msg = xajax.debug.text[110]; + msg += oRequest.parameters.length; + msg += xajax.debug.text[111]; + xajax.debug.writeMessage(msg); + } else { + var msg = xajax.debug.text[112]; + xajax.debug.writeMessage(msg); + } + return xajax.debug.processParameters(oRequest); + } catch (e) { + var msg = 'ProcessParameters: '; + msg += xajax.debug.getExceptionText(e); + msg += '\n'; + xajax.debug.writeMessage(msg, xajax.debug.text[101], 'errorText'); + throw e; + } + } + + /* + Function: xajax.prepareRequest + + Generate a message indicating that the request is being + prepared. This may occur more than once for a request + if it errors and a retry is attempted. + + This is a wrapper around the standard + */ + xajax.debug.prepareRequest = xajax.prepareRequest; + xajax.prepareRequest = function(oRequest) { + try { + var msg = xajax.debug.text[113]; + xajax.debug.writeMessage(msg); + return xajax.debug.prepareRequest(oRequest); + } catch (e) { + var msg = 'PrepareRequest: '; + msg += xajax.debug.getExceptionText(e); + msg += '\n'; + xajax.debug.writeMessage(msg, xajax.debug.text[101], 'errorText'); + throw e; + } + } + + /* + Function: xajax.call + + Validates that a function name was provided, generates a message + indicating that a xajax call is starting and sets a flag in the + request object indicating that debugging is enabled for this call. + + This is a wrapper around the standard function. + */ + xajax.debug.call = xajax.call; + xajax.call = function() { + try { + xajax.debug.writeMessage(xajax.debug.text[114]); + + var numArgs = arguments.length; + + if (0 == numArgs) + throw { code: 10009 }; + + var functionName = arguments[0]; + var oOptions = {} + if (1 < numArgs) + oOptions = arguments[1]; + + oOptions.debugging = true; + + return xajax.debug.call(functionName, oOptions); + } catch (e) { + var msg = 'Call: '; + msg += xajax.debug.getExceptionText(e); + msg += '\n'; + xajax.debug.writeMessage(msg, xajax.debug.text[101], 'errorText'); + throw e; + } + } + + /* + Function: xajax.request + + Validates that a function name was provided, generates a message + indicating that a xajax request is starting and sets a flag in the + request object indicating that debugging is enabled for this request. + + This is a wrapper around the standard function. + */ + xajax.debug.request = xajax.request; + xajax.request = function() { + try { + xajax.debug.writeMessage(xajax.debug.text[115]); + + var numArgs = arguments.length; + + if (0 == numArgs) + throw { code: 10010 }; + + var oFunction = arguments[0]; + var oOptions = {} + if (1 < numArgs) + oOptions = arguments[1]; + + oOptions.debugging = true; + + return xajax.debug.request(oFunction, oOptions); + } catch (e) { + var msg = 'Request: '; + msg += xajax.debug.getExceptionText(e); + msg += '\n'; + xajax.debug.writeMessage(msg, xajax.debug.text[101], 'errorText'); + throw e; + } + } + + /* + Function: xajax.getResponseProcessor + + Generate an error message when no reponse processor is available + to process the type of response returned from the server. + + This is a wrapper around the standard + function. + */ + xajax.debug.getResponseProcessor = xajax.getResponseProcessor; + xajax.getResponseProcessor = function(oRequest) { + try { + var fProc = xajax.debug.getResponseProcessor(oRequest); + + if ('undefined' == typeof fProc) { + var msg = xajax.debug.text[116]; + try { + var contentType = oRequest.request.getResponseHeader('content-type'); + msg += "Content-Type: "; + msg += contentType; + if ('text/html' == contentType) { + msg += xajax.debug.text[117]; + } + } catch (e) { + } + xajax.debug.writeMessage(msg, xajax.debug.text[101], 'errorText'); + } + + return fProc; + } catch (e) { + var msg = 'GetResponseProcessor: '; + msg += xajax.debug.getExceptionText(e); + msg += '\n'; + xajax.debug.writeMessage(msg, xajax.debug.text[101], 'errorText'); + throw e; + } + } + + /* + Function: xajax.responseReceived + + Generate a message indicating that a response has been received + from the server; provide some statistical data regarding the + response and the response time. + + Catch any exceptions that are thrown during the processing of + the response and generate a message. + + This is a wrapper around the standard + function. + */ + xajax.debug.responseReceived = xajax.responseReceived; + xajax.responseReceived = function(oRequest) { + var xx = xajax; + var xt = xx.tools; + var xd = xx.debug; + + var oRet; + + try { + var status = oRequest.request.status; + if (xt.arrayContainsValue(xx.responseSuccessCodes, status)) { + var packet = oRequest.request.responseText; + packet = packet.replace(new RegExp('', 'g'), '\n'); + packet = packet.replace(new RegExp('', 'g'), '\n'); + packet = packet.replace(new RegExp('', 'g'), '\n'); + packet = packet.replace(new RegExp('', 'g'), '\n\n'); + packet = packet.replace(new RegExp('', 'g'), '\n'); + oRequest.midDate = new Date(); + var msg = xajax.debug.text[118]; + msg += oRequest.request.status; + msg += xajax.debug.text[119]; + msg += packet.length; + msg += xajax.debug.text[120]; + msg += (oRequest.midDate - oRequest.beginDate); + msg += xajax.debug.text[121]; + msg += packet; + xd.writeMessage(msg); + } else if (xt.arrayContainsValue(xx.responseErrorsForAlert, status)) { + var msg = xajax.debug.text[122]; + msg += status; + msg += xajax.debug.text[123]; + msg += oRequest.request.responseText; + xd.writeMessage(msg, xajax.debug.text[101], 'errorText'); + } else if (xt.arrayContainsValue(xx.responseRedirectCodes, status)) { + var msg = xajax.debug.text[124]; + msg += oRequest.request.getResponseHeader('location'); + xd.writeMessage(msg); + } + oRet = xd.responseReceived(oRequest); + } catch (e) { + var msg = 'ResponseReceived: '; + msg += xajax.debug.getExceptionText(e); + msg += '\n'; + xd.writeMessage(msg, xajax.debug.text[101], 'errorText'); + } + + return oRet; + } + + /* + Function: xajax.completeResponse + + Generate a message indicating that the request has completed + and provide some statistics regarding the request and response. + + This is a wrapper around the standard + function. + */ + xajax.debug.completeResponse = xajax.completeResponse; + xajax.completeResponse = function(oRequest) { + try { + var returnValue = xajax.debug.completeResponse(oRequest); + oRequest.endDate = new Date(); + var msg = xajax.debug.text[125]; + msg += (oRequest.endDate - oRequest.beginDate); + msg += xajax.debug.text[126]; + xajax.debug.writeMessage(msg); + return returnValue; + } catch (e) { + var msg = 'CompleteResponse: '; + msg += xajax.debug.getExceptionText(e); + msg += '\n'; + xajax.debug.writeMessage(msg, xajax.debug.text[101], 'errorText'); + throw e; + } + } + + /* + Function: xajax.tools.getRequestObject + + Generate a message indicating that the request object is + being initialized. + + Catch any exceptions that are thrown during the process or + initializing a new request object. + + This is a wrapper around the standard + function. + */ + xajax.debug.getRequestObject = xajax.tools.getRequestObject; + xajax.tools.getRequestObject = function() { + try { + xajax.debug.writeMessage(xajax.debug.text[127]); + return xajax.debug.getRequestObject(); + } catch (e) { + var msg = 'GetRequestObject: '; + msg += xajax.debug.getExceptionText(e); + msg += '\n'; + xajax.debug.writeMessage(msg, xajax.debug.text[101], 'errorText'); + throw e; + } + } + + /* + Function: xajax.dom.assign + + Catch any exceptions thrown during the assignment and + display an error message. + + This is a wrapper around the standard + function. + */ + if (xajax.dom.assign) { + xajax.debug.assign = xajax.dom.assign; + xajax.dom.assign = function(element, property, data) { + try { + return xajax.debug.assign(element, property, data); + } catch (e) { + var msg = 'xajax.dom.assign: '; + msg += xajax.debug.getExceptionText(e); + msg += '\n'; + msg += 'Eval: element.'; + msg += property; + msg += ' = data;\n'; + xajax.debug.writeMessage(msg, xajax.debug.text[101], 'errorText'); + } + return true; + } + } + + /* + Function: xajax.tools.queue.retry + */ + if (xajax.tools) { + if (xajax.tools.queue) { + if (xajax.tools.queue.retry) { + if ('undefined' == typeof xajax.debug.tools) + xajax.debug.tools = {}; + if ('undefined' == typeof xajax.debug.tools.queue) + xajax.debug.tools.queue = {}; + xajax.debug.tools.queue.retry = xajax.tools.queue.retry; + xajax.tools.queue.retry = function(obj, count) { + if (xajax.debug.tools.queue.retry(obj, count)) + return true; + // no 'exceeded' message for sleep command + if (obj.cmd && 's' == obj.cmd) + return false; + xajax.debug.writeMessage('Retry count exceeded.'); + return false; + } + } + } + } + + /* + Boolean: xajax.debug.isLoaded + + true - indicates that the debugging module is loaded + */ + xajax.debug.isLoaded = true; + + /* + Section: Redefine shortcuts. + + Must redefine these shortcuts so they point to the new debug (wrapper) versions: + - + - + - + + Must redefine these shortcuts as well: + - + - + */ + xjx = {} + + xjx.$ = xajax.tools.$; + xjx.getFormValues = xajax.tools.getFormValues; + xjx.call = xajax.call; + xjx.request = xajax.request; + + xajax.$ = xajax.tools.$; + xajax.getFormValues = xajax.tools.getFormValues; +} catch (e) { + alert(e.name + ': ' + e.message); +} diff --git a/phpgwapi/inc/xajax/xajax_js/xajax_lang_bg.js b/phpgwapi/inc/xajax/xajax_js/xajax_lang_bg.js new file mode 100644 index 0000000000..abb957c252 --- /dev/null +++ b/phpgwapi/inc/xajax/xajax_js/xajax_lang_bg.js @@ -0,0 +1,10 @@ + +if('undefined'!=typeof xajax.debug){xajax.debug.text=[];xajax.debug.text[100]='ПРЕДУПРЕЖДЕНИЕ: ';xajax.debug.text[101]='ГРЕШКА: ';xajax.debug.text[102]='XAJAX ДЕБЪГ СЪОБЩЕНИЕ:\n';xajax.debug.text[103]='...\n[ДЪЛЪГ ОТГОВОР]\n...';xajax.debug.text[104]='ИЗПРАЩАНЕ НА ЗАЯВКИ';xajax.debug.text[105]='ИЗПРАТЕНИ [';xajax.debug.text[106]=' байта]';xajax.debug.text[107]='ИЗВИКВАНЕ: ';xajax.debug.text[108]='Адрес: ';xajax.debug.text[109]='ИНИЦИАЛИЗИРАНЕ НА ЗАЯВКАТА';xajax.debug.text[110]='ОБРАБОТВАНЕ НА ПАРАМЕТРИТЕ [';xajax.debug.text[111]=']';xajax.debug.text[112]='НЯМА ПАРАМЕТРИ ЗА ОБРАБОТВАНЕ';xajax.debug.text[113]='ПОДГОТВЯВАНЕ НА ЗАЯВКАТА';xajax.debug.text[114]='СТАРТИРАНЕ НА XAJAX ПОВИКВАНЕТО (остаряло: вместо това използвай xajax.request)';xajax.debug.text[115]='СТАРТИРАНЕ НА XAJAX ЗАЯВКАТА';xajax.debug.text[116]='Няма регистрирани функции, които да обработят заявката ви на сървъра!\n';xajax.debug.text[117]='.\nПровери за съобщения за грешки на сървъра.';xajax.debug.text[118]='ПОЛУЧЕНИ [статус: ';xajax.debug.text[119]=', размер: ';xajax.debug.text[120]=' байта, време: ';xajax.debug.text[121]='мсек]:\n';xajax.debug.text[122]='Сървъра върна следния HTTP статус: ';xajax.debug.text[123]='\nПОЛУЧЕНИ:\n';xajax.debug.text[124]='Сървъра върна пренасочване към:
';xajax.debug.text[125]='ГОТОВО [';xajax.debug.text[126]='мсек]';xajax.debug.text[127]='ИНИЦИАЛИЗИРАНЕ НА ОБЕКТА НА ЗАЯВКАТА';xajax.debug.exceptions=[];xajax.debug.exceptions[10001]='Невалиден XML отговор: Отговора съдържа непознат таг: {data}.';xajax.debug.exceptions[10002]='GetRequestObject: Няма XMLHttpRequest, xajax е изключен.';xajax.debug.exceptions[10003]='Препълване на опашката: Обекта не може да бъде сложен на опашката, защото тя е пълна.';xajax.debug.exceptions[10004]='Невалиден XML отговор: Отговора съдържа неочакван таг или текст: {data}.';xajax.debug.exceptions[10005]='Невалиден адрес: Невалиден или липсващ адрес; автоматичното откриване неуспешнп; please specify a one explicitly.';xajax.debug.exceptions[10006]='Невалидна команда в отговора: Получена беше невалидна команда като отговор.';xajax.debug.exceptions[10007]='Невалидна команда в отговора: Командата [{data}] е непозната.';xajax.debug.exceptions[10008]='Елемент с ID [{data}] не беше намерен в документа.';xajax.debug.exceptions[10009]='Невалидна заявка: Параметъра с името на функцията липсва.';xajax.debug.exceptions[10010]='Невалидна заявка: Липсва обекта на функцията.';} +if('undefined'!=typeof xajax.config){if('undefined'!=typeof xajax.config.status){xajax.config.status.update=function(){return{onRequest:function(){window.status='Изпращане на заявка...';}, +onWaiting:function(){window.status='Изчакване на отговор...';}, +onProcessing:function(){window.status='Изпълнение...';}, +onComplete:function(){window.status='Готово.';} +} +} +} +} diff --git a/phpgwapi/inc/xajax/xajax_js/xajax_lang_bg_uncompressed.js b/phpgwapi/inc/xajax/xajax_js/xajax_lang_bg_uncompressed.js new file mode 100644 index 0000000000..9adefd34ed --- /dev/null +++ b/phpgwapi/inc/xajax/xajax_js/xajax_lang_bg_uncompressed.js @@ -0,0 +1,81 @@ +/** + * translation for: xajax v.x.x + * @version: 1.0.0 + * @author: mic + * @copyright xajax project + * @license GNU/GPL + * @package xajax x.x.x + * @since v.x.x.x + * save as UTF-8 + */ + +if ('undefined' != typeof xajax.debug) { + /* + Array: text + */ + xajax.debug.text = []; + xajax.debug.text[100] = 'ПРЕДУПРЕЖДЕНИЕ: '; + xajax.debug.text[101] = 'ГРЕШКА: '; + xajax.debug.text[102] = 'XAJAX ДЕБЪГ СЪОБЩЕНИЕ:\n'; + xajax.debug.text[103] = '...\n[ДЪЛЪГ ОТГОВОР]\n...'; + xajax.debug.text[104] = 'ИЗПРАЩАНЕ НА ЗАЯВКИ'; + xajax.debug.text[105] = 'ИЗПРАТЕНИ ['; + xajax.debug.text[106] = ' байта]'; + xajax.debug.text[107] = 'ИЗВИКВАНЕ: '; + xajax.debug.text[108] = 'Адрес: '; + xajax.debug.text[109] = 'ИНИЦИАЛИЗИРАНЕ НА ЗАЯВКАТА'; + xajax.debug.text[110] = 'ОБРАБОТВАНЕ НА ПАРАМЕТРИТЕ ['; + xajax.debug.text[111] = ']'; + xajax.debug.text[112] = 'НЯМА ПАРАМЕТРИ ЗА ОБРАБОТВАНЕ'; + xajax.debug.text[113] = 'ПОДГОТВЯВАНЕ НА ЗАЯВКАТА'; + xajax.debug.text[114] = 'СТАРТИРАНЕ НА XAJAX ПОВИКВАНЕТО (остаряло: вместо това използвай xajax.request)'; + xajax.debug.text[115] = 'СТАРТИРАНЕ НА XAJAX ЗАЯВКАТА'; + xajax.debug.text[116] = 'Няма регистрирани функции, които да обработят заявката ви на сървъра!\n'; + xajax.debug.text[117] = '.\nПровери за съобщения за грешки на сървъра.'; + xajax.debug.text[118] = 'ПОЛУЧЕНИ [статус: '; + xajax.debug.text[119] = ', размер: '; + xajax.debug.text[120] = ' байта, време: '; + xajax.debug.text[121] = 'мсек]:\n'; + xajax.debug.text[122] = 'Сървъра върна следния HTTP статус: '; + xajax.debug.text[123] = '\nПОЛУЧЕНИ:\n'; + xajax.debug.text[124] = 'Сървъра върна пренасочване към:
'; + xajax.debug.text[125] = 'ГОТОВО ['; + xajax.debug.text[126] = 'мсек]'; + xajax.debug.text[127] = 'ИНИЦИАЛИЗИРАНЕ НА ОБЕКТА НА ЗАЯВКАТА'; + + xajax.debug.exceptions = []; + xajax.debug.exceptions[10001] = 'Невалиден XML отговор: Отговора съдържа непознат таг: {data}.'; + xajax.debug.exceptions[10002] = 'GetRequestObject: Няма XMLHttpRequest, xajax е изключен.'; + xajax.debug.exceptions[10003] = 'Препълване на опашката: Обекта не може да бъде сложен на опашката, защото тя е пълна.'; + xajax.debug.exceptions[10004] = 'Невалиден XML отговор: Отговора съдържа неочакван таг или текст: {data}.'; + xajax.debug.exceptions[10005] = 'Невалиден адрес: Невалиден или липсващ адрес; автоматичното откриване неуспешнп; please specify a one explicitly.'; + xajax.debug.exceptions[10006] = 'Невалидна команда в отговора: Получена беше невалидна команда като отговор.'; + xajax.debug.exceptions[10007] = 'Невалидна команда в отговора: Командата [{data}] е непозната.'; + xajax.debug.exceptions[10008] = 'Елемент с ID [{data}] не беше намерен в документа.'; + xajax.debug.exceptions[10009] = 'Невалидна заявка: Параметъра с името на функцията липсва.'; + xajax.debug.exceptions[10010] = 'Невалидна заявка: Липсва обекта на функцията.'; +} + +if ('undefined' != typeof xajax.config) { + if ('undefined' != typeof xajax.config.status) { + /* + Object: update + */ + xajax.config.status.update = function() { + return { + onRequest: function() { + window.status = 'Изпращане на заявка...'; + }, + onWaiting: function() { + window.status = 'Изчакване на отговор...'; + }, + onProcessing: function() { + window.status = 'Изпълнение...'; + }, + onComplete: function() { + window.status = 'Готово.'; + } + } + } + } +} \ No newline at end of file diff --git a/phpgwapi/inc/xajax/xajax_js/xajax_lang_de.js b/phpgwapi/inc/xajax/xajax_js/xajax_lang_de.js new file mode 100644 index 0000000000..c2253269a4 --- /dev/null +++ b/phpgwapi/inc/xajax/xajax_js/xajax_lang_de.js @@ -0,0 +1,9 @@ +if('undefined'!=typeof xajax.debug){xajax.debug.text=[];xajax.debug.text[100]='WARNUNG: ';xajax.debug.text[101]='FEHLER: ';xajax.debug.text[102]='XAJAX FEHLERSUCHE NACHRICHT:\n';xajax.debug.text[103]='...\n[UMGFANGREICHE ANTWORT]\n...';xajax.debug.text[104]='SENDE ANFRAGE';xajax.debug.text[105]='GESENDET [';xajax.debug.text[106]=' bytes]';xajax.debug.text[107]='STARTE AUFRUF: ';xajax.debug.text[108]='URI: ';xajax.debug.text[109]='BEGINNE ANFRAGE';xajax.debug.text[110]='PARAMETER IN BEARBEITUNG [';xajax.debug.text[111]=']';xajax.debug.text[112]='KEINE PARAMETER ZU VERARBEITEN';xajax.debug.text[113]='BEREITE REQUEST VOR';xajax.debug.text[114]='BEGINNE XAJAX CALL (veraltet: verwendet stattdessen xajax.request)';xajax.debug.text[115]='BEGINNE XAJAX ANFRAGE';xajax.debug.text[116]='Die vom Server erhaltenen Daten konnten nicht verarbeitet werden.\n';xajax.debug.text[117]='.\nPrüfe auf Fehlermeldungen des Servers.';xajax.debug.text[118]='ERHALTEN [status: ';xajax.debug.text[119]=', Größe: ';xajax.debug.text[120]=' bytes, Zeit: ';xajax.debug.text[121]='ms]:\n';xajax.debug.text[122]='Der Server hat folgenden HTTP-Status zurück gesendet: ';xajax.debug.text[123]='\nERHALTEN:\n';xajax.debug.text[124]='Der Server lieferte einen Redirect nach:
';xajax.debug.text[125]='ABGESCHLOSSEN [';xajax.debug.text[126]='ms]';xajax.debug.text[127]='INITIALISIERE REQUEST OBJEKT';xajax.debug.exceptions=[];xajax.debug.exceptions[10001]='Ungültige XML-Antwort: die Antwort enthält ein ungültiges Tag: {data}.';xajax.debug.exceptions[10002]='GetRequestObject: XMLHttpRequest ist nicht verfügbar, XajaX ist nicht verfügbar.';xajax.debug.exceptions[10003]='Warteschleife-Überlauf: kann Objekt nicht an Warteschleife übergeben da diese voll ist.';xajax.debug.exceptions[10004]='Ungültige XML-Antwort: die Antwort enthält einen unerwarteten Tag oder Text: {data}.';xajax.debug.exceptions[10005]='Ungültige Request-URI: Ungültige oder Fehlende URI; Autoerkennung fehlgeschlagen; bitte nur eine einzige URI angeben.';xajax.debug.exceptions[10006]='Ungültiges Antwort-Befehl: Unvollständiges Objekt zurück erhalten.';xajax.debug.exceptions[10007]='Ungültiges Antwort-Befehl: Befehl [{data}] ist nicht bekannt.';xajax.debug.exceptions[10008]='Es konnte kein Element mit der ID [{data}] konnte im Dokument gefunden werden.';xajax.debug.exceptions[10009]='Ungültige Anfrage: Fehlender Funktionsparameter - name.';xajax.debug.exceptions[10010]='Ungültige Anfrage: Fehlender Funktionsparameter - object.';} +if('undefined'!=typeof xajax.config){if('undefined'!=typeof xajax.config.status){xajax.config.status.update=function(){return{onRequest:function(){window.status='Sende Anfrage...';}, +onWaiting:function(){window.status='Warten auf Antwort...';}, +onProcessing:function(){window.status='Verarbeitung...';}, +onComplete:function(){window.status='Fertig.';} +} +} +} +} diff --git a/phpgwapi/inc/xajax/xajax_js/xajax_lang_de_uncompressed.js b/phpgwapi/inc/xajax/xajax_js/xajax_lang_de_uncompressed.js new file mode 100644 index 0000000000..c396c379ef --- /dev/null +++ b/phpgwapi/inc/xajax/xajax_js/xajax_lang_de_uncompressed.js @@ -0,0 +1,84 @@ +/** + * translation for: xajax v.x.x + * @version: 1.0.0 + * @author: mic + * @copyright xajax project + * @license GNU/GPL + * @package xajax x.x.x + * @since v.x.x.x + * save as UTF-8 + */ + +if ('undefined' != typeof xajax.debug) { + /* + Array: text + */ + xajax.debug.text = []; + xajax.debug.text[100] = 'WARNUNG: '; + xajax.debug.text[101] = 'FEHLER: '; + xajax.debug.text[102] = 'XAJAX FEHLERSUCHE NACHRICHT:\n'; + xajax.debug.text[103] = '...\n[UMGFANGREICHE ANTWORT]\n...'; + xajax.debug.text[104] = 'SENDE ANFRAGE'; + xajax.debug.text[105] = 'GESENDET ['; + xajax.debug.text[106] = ' bytes]'; + xajax.debug.text[107] = 'STARTE AUFRUF: '; + xajax.debug.text[108] = 'URI: '; + xajax.debug.text[109] = 'BEGINNE ANFRAGE'; + xajax.debug.text[110] = 'PARAMETER IN BEARBEITUNG ['; + xajax.debug.text[111] = ']'; + xajax.debug.text[112] = 'KEINE PARAMETER ZU VERARBEITEN'; + xajax.debug.text[113] = 'BEREITE REQUEST VOR'; + xajax.debug.text[114] = 'BEGINNE XAJAX CALL (veraltet: verwendet stattdessen xajax.request)'; + xajax.debug.text[115] = 'BEGINNE XAJAX ANFRAGE'; + xajax.debug.text[116] = 'Die vom Server erhaltenen Daten konnten nicht verarbeitet werden.\n'; + xajax.debug.text[117] = '.\nPrüfe auf Fehlermeldungen des Servers.'; + xajax.debug.text[118] = 'ERHALTEN [status: '; + xajax.debug.text[119] = ', Größe: '; + xajax.debug.text[120] = ' bytes, Zeit: '; + xajax.debug.text[121] = 'ms]:\n'; + xajax.debug.text[122] = 'Der Server hat folgenden HTTP-Status zurück gesendet: '; + xajax.debug.text[123] = '\nERHALTEN:\n'; + xajax.debug.text[124] = 'Der Server lieferte einen Redirect nach:
'; + xajax.debug.text[125] = 'ABGESCHLOSSEN ['; + xajax.debug.text[126] = 'ms]'; + xajax.debug.text[127] = 'INITIALISIERE REQUEST OBJEKT'; + + /* + Array: exceptions + */ + xajax.debug.exceptions = []; + xajax.debug.exceptions[10001] = 'Ungültige XML-Antwort: die Antwort enthält ein ungültiges Tag: {data}.'; + xajax.debug.exceptions[10002] = 'GetRequestObject: XMLHttpRequest ist nicht verfügbar, XajaX ist nicht verfügbar.'; + xajax.debug.exceptions[10003] = 'Warteschleife-Überlauf: kann Objekt nicht an Warteschleife übergeben da diese voll ist.'; + xajax.debug.exceptions[10004] = 'Ungültige XML-Antwort: die Antwort enthält einen unerwarteten Tag oder Text: {data}.'; + xajax.debug.exceptions[10005] = 'Ungültige Request-URI: Ungültige oder Fehlende URI; Autoerkennung fehlgeschlagen; bitte nur eine einzige URI angeben.'; + xajax.debug.exceptions[10006] = 'Ungültiges Antwort-Befehl: Unvollständiges Objekt zurück erhalten.'; + xajax.debug.exceptions[10007] = 'Ungültiges Antwort-Befehl: Befehl [{data}] ist nicht bekannt.'; + xajax.debug.exceptions[10008] = 'Es konnte kein Element mit der ID [{data}] konnte im Dokument gefunden werden.'; + xajax.debug.exceptions[10009] = 'Ungültige Anfrage: Fehlender Funktionsparameter - name.'; + xajax.debug.exceptions[10010] = 'Ungültige Anfrage: Fehlender Funktionsparameter - object.'; +} + +if ('undefined' != typeof xajax.config) { + if ('undefined' != typeof xajax.config.status) { + /* + Object: update + */ + xajax.config.status.update = function() { + return { + onRequest: function() { + window.status = 'Sende Anfrage...'; + }, + onWaiting: function() { + window.status = 'Warten auf Antwort...'; + }, + onProcessing: function() { + window.status = 'Verarbeitung...'; + }, + onComplete: function() { + window.status = 'Fertig.'; + } + } + } + } +} diff --git a/phpgwapi/inc/xajax/xajax_js/xajax_lang_es.js b/phpgwapi/inc/xajax/xajax_js/xajax_lang_es.js new file mode 100644 index 0000000000..ed1862a79a --- /dev/null +++ b/phpgwapi/inc/xajax/xajax_js/xajax_lang_es.js @@ -0,0 +1,10 @@ + +if('undefined'!=typeof xajax.debug){xajax.debug.text=[];xajax.debug.text[100]='ALERTA: ';xajax.debug.text[101]='ERROR: ';xajax.debug.text[102]='MENSAJE XAJAX DEBUG:\n';xajax.debug.text[103]='...\n[RESPUESTA LARGA]\n...';xajax.debug.text[104]='ENVIANDO PETICION';xajax.debug.text[105]='ENVIADO [';xajax.debug.text[106]=' bytes]';xajax.debug.text[107]='LLAMADA: ';xajax.debug.text[108]='URI: ';xajax.debug.text[109]='INICIALIZANDO PETICION';xajax.debug.text[110]='PROCESANDO PARAMETROS [';xajax.debug.text[111]=']';xajax.debug.text[112]='NO HAY PARAMETROS A PROCESAR';xajax.debug.text[113]='PREPARANDO PETICION';xajax.debug.text[114]='INICIANDO XAJAX CALL (En desuso: use xajax.request)';xajax.debug.text[115]='INICIANDO XAJAX REQUEST';xajax.debug.text[116]='Ningn procesador de respuesta esta disponible para tratar la respuesta del servidor.\n';xajax.debug.text[117]='.\nRevisa mensajes de error del servidor.';xajax.debug.text[118]='RECIBIDO [status: ';xajax.debug.text[119]=', size: ';xajax.debug.text[120]=' bytes, time: ';xajax.debug.text[121]='ms]:\n';xajax.debug.text[122]='El servidor retorno el siguiente estado HTTP: ';xajax.debug.text[123]='\nRECIBIDO:\n';xajax.debug.text[124]='El servidor retorno una redireccion a:
';xajax.debug.text[125]='HECHO [';xajax.debug.text[126]='ms]';xajax.debug.text[127]='INICIALIZANDO PETICION OBJETO';xajax.debug.exceptions=[];xajax.debug.exceptions[10001]='Invalid response XML: La respuesta contiene una etiqueta desconocida: {data}.';xajax.debug.exceptions[10002]='GetRequestObject: XMLHttpRequest no disponible, xajax esta deshabilitado.';xajax.debug.exceptions[10003]='Queue overflow: No se puede colocar objeto en cola porque esta llena.';xajax.debug.exceptions[10004]='Invalid response XML: La respuesta contiene una etiqueta o texto inesperado: {data}.';xajax.debug.exceptions[10005]='Invalid request URI: URI invalida o perdida; autodeteccion fallida; por favor especifica una explicitamente.';xajax.debug.exceptions[10006]='Invalid response command: Orden de respuesta mal formado recibido.';xajax.debug.exceptions[10007]='Invalid response command: Comando [{data}] no es un comando conocido.';xajax.debug.exceptions[10008]='Elemento con ID [{data}] no encontrado en el documento.';xajax.debug.exceptions[10009]='Invalid request: Nombre parametro de funcion perdido.';xajax.debug.exceptions[10010]='Invalid request: Objeto parametro de funcion perdido.';} +if('undefined'!=typeof xajax.config){if('undefined'!=typeof xajax.config.status){xajax.config.status.update=function(){return{onRequest:function(){window.status='Enviando Peticion...';}, +onWaiting:function(){window.status='Esperando Respuesta...';}, +onProcessing:function(){window.status='Procesando...';}, +onComplete:function(){window.status='Hecho.';} +} +} +} +} diff --git a/phpgwapi/inc/xajax/xajax_js/xajax_lang_es_uncompressed.js b/phpgwapi/inc/xajax/xajax_js/xajax_lang_es_uncompressed.js new file mode 100644 index 0000000000..c35aeda753 --- /dev/null +++ b/phpgwapi/inc/xajax/xajax_js/xajax_lang_es_uncompressed.js @@ -0,0 +1,81 @@ +/** + * translation for: xajax v.x.x + * @version: 1.0.0 + * @author: mic + * @copyright xajax project + * @license GNU/GPL + * @package xajax x.x.x + * @since v.x.x.x + * save as UTF-8 + */ + +if ('undefined' != typeof xajax.debug) { + /* + Array: text + */ + xajax.debug.text = []; + xajax.debug.text[100] = 'ALERTA: '; + xajax.debug.text[101] = 'ERROR: '; + xajax.debug.text[102] = 'MENSAJE XAJAX DEBUG:\n'; + xajax.debug.text[103] = '...\n[RESPUESTA LARGA]\n...'; + xajax.debug.text[104] = 'ENVIANDO PETICION'; + xajax.debug.text[105] = 'ENVIADO ['; + xajax.debug.text[106] = ' bytes]'; + xajax.debug.text[107] = 'LLAMADA: '; + xajax.debug.text[108] = 'URI: '; + xajax.debug.text[109] = 'INICIALIZANDO PETICION'; + xajax.debug.text[110] = 'PROCESANDO PARAMETROS ['; + xajax.debug.text[111] = ']'; + xajax.debug.text[112] = 'NO HAY PARAMETROS A PROCESAR'; + xajax.debug.text[113] = 'PREPARANDO PETICION'; + xajax.debug.text[114] = 'INICIANDO XAJAX CALL (En desuso: use xajax.request)'; + xajax.debug.text[115] = 'INICIANDO XAJAX REQUEST'; + xajax.debug.text[116] = 'Ning�n procesador de respuesta esta disponible para tratar la respuesta del servidor.\n'; + xajax.debug.text[117] = '.\nRevisa mensajes de error del servidor.'; + xajax.debug.text[118] = 'RECIBIDO [status: '; + xajax.debug.text[119] = ', size: '; + xajax.debug.text[120] = ' bytes, time: '; + xajax.debug.text[121] = 'ms]:\n'; + xajax.debug.text[122] = 'El servidor retorno el siguiente estado HTTP: '; + xajax.debug.text[123] = '\nRECIBIDO:\n'; + xajax.debug.text[124] = 'El servidor retorno una redireccion a:
'; + xajax.debug.text[125] = 'HECHO ['; + xajax.debug.text[126] = 'ms]'; + xajax.debug.text[127] = 'INICIALIZANDO PETICION OBJETO'; + + xajax.debug.exceptions = []; + xajax.debug.exceptions[10001] = 'Invalid response XML: La respuesta contiene una etiqueta desconocida: {data}.'; + xajax.debug.exceptions[10002] = 'GetRequestObject: XMLHttpRequest no disponible, xajax esta deshabilitado.'; + xajax.debug.exceptions[10003] = 'Queue overflow: No se puede colocar objeto en cola porque esta llena.'; + xajax.debug.exceptions[10004] = 'Invalid response XML: La respuesta contiene una etiqueta o texto inesperado: {data}.'; + xajax.debug.exceptions[10005] = 'Invalid request URI: URI invalida o perdida; autodeteccion fallida; por favor especifica una explicitamente.'; + xajax.debug.exceptions[10006] = 'Invalid response command: Orden de respuesta mal formado recibido.'; + xajax.debug.exceptions[10007] = 'Invalid response command: Comando [{data}] no es un comando conocido.'; + xajax.debug.exceptions[10008] = 'Elemento con ID [{data}] no encontrado en el documento.'; + xajax.debug.exceptions[10009] = 'Invalid request: Nombre parametro de funcion perdido.'; + xajax.debug.exceptions[10010] = 'Invalid request: Objeto parametro de funcion perdido.'; +} + +if ('undefined' != typeof xajax.config) { + if ('undefined' != typeof xajax.config.status) { + /* + Object: update + */ + xajax.config.status.update = function() { + return { + onRequest: function() { + window.status = 'Enviando Peticion...'; + }, + onWaiting: function() { + window.status = 'Esperando Respuesta...'; + }, + onProcessing: function() { + window.status = 'Procesando...'; + }, + onComplete: function() { + window.status = 'Hecho.'; + } + } + } + } +} \ No newline at end of file diff --git a/phpgwapi/inc/xajax/xajax_js/xajax_lang_fr.js b/phpgwapi/inc/xajax/xajax_js/xajax_lang_fr.js new file mode 100644 index 0000000000..a246abef97 --- /dev/null +++ b/phpgwapi/inc/xajax/xajax_js/xajax_lang_fr.js @@ -0,0 +1,8 @@ +xajax.debug.text=[];xajax.debug.text[100]='ATTENTION : ';xajax.debug.text[101]='ERREUR : ';xajax.debug.text[102]='MESSAGE DE DEBUG XAJAX :\n';xajax.debug.text[103]='...\n[RPONSE LONGUE]\n...';xajax.debug.text[104]='ENVOI DE LA REQUTE';xajax.debug.text[105]='ENVOY [';xajax.debug.text[106]=' octets]';xajax.debug.text[107]='APPEL : ';xajax.debug.text[108]='URI : ';xajax.debug.text[109]='INITIALISATION DE LA REQUTE';xajax.debug.text[110]='TRAITEMENT DES PARAMTRES [';xajax.debug.text[111]=']';xajax.debug.text[112]='AUCUN PARAMTRE TRAITER';xajax.debug.text[113]='PRPARATION DE LA REQUTE';xajax.debug.text[114]='DBUT DE L\'APPEL XAJAX (dprci: utilisez plutt xajax.request)';xajax.debug.text[115]='DBUT DE LA REQUTE';xajax.debug.text[116]='Aucun traitement disponible pour traiter la rponse du serveur.\n';xajax.debug.text[117]='.\nVrifie s\'il existe des messages d\'erreur du serveur.';xajax.debug.text[118]='REUS [statut : ';xajax.debug.text[119]=', taille: ';xajax.debug.text[120]=' octets, temps: ';xajax.debug.text[121]='ms] :\n';xajax.debug.text[122]='Le serveur a retourn la statut HTTP suivant : ';xajax.debug.text[123]='\nREUS :\n';xajax.debug.text[124]='Le serveur a indiqu une redirection vers :
';xajax.debug.text[125]='FAIT [';xajax.debug.text[126]='ms]';xajax.debug.text[127]='INITIALISATION DE L\'OBJET REQUTE';xajax.debug.exceptions=[];xajax.debug.exceptions[10001]='Rponse XML non valide : La rponse contient une balise inconnue : {data}.';xajax.debug.exceptions[10002]='GetRequestObject : XMLHttpRequest n\'est pas disponible, xajax est dsactiv.';xajax.debug.exceptions[10003]='File pleine : Ne peut ajouter un objet la file car elle est pleine.';xajax.debug.exceptions[10004]='Rponse XML non valide : La rponse contient une balise ou un texte inattendu : {data}.';xajax.debug.exceptions[10005]='URI de la requte non valide : URI non valide ou manquante; auto-dtection choue; veuillez en spcifier une explicitement.';xajax.debug.exceptions[10006]='Rponse de commande invalide : Commande de rponse reue mal forme.';xajax.debug.exceptions[10007]='Rponse de commande invalide : Commande [{data}] est inconnue.';xajax.debug.exceptions[10008]='L\'lment d\'ID [{data}] est introuvable dans le document.';xajax.debug.exceptions[10009]='Requte invalide : Aucun nom de fonction indiqu en paramtre.';xajax.debug.exceptions[10010]='Requte invalide : Aucun objet indiqu en paramtre pour la fonction.';if('undefined'!=typeof xajax.config){if('undefined'!=typeof xajax.config.status){xajax.config.status.update=function(){return{onRequest:function(){window.status='Envoi de la requte...';}, +onWaiting:function(){window.status='Attente de la rponse...';}, +onProcessing:function(){window.status='En cours de traitement...';}, +onComplete:function(){window.status='Fait.';} +} +} +} +} diff --git a/phpgwapi/inc/xajax/xajax_js/xajax_lang_fr_uncompressed.js b/phpgwapi/inc/xajax/xajax_js/xajax_lang_fr_uncompressed.js new file mode 100644 index 0000000000..a9d488bdf8 --- /dev/null +++ b/phpgwapi/inc/xajax/xajax_js/xajax_lang_fr_uncompressed.js @@ -0,0 +1,65 @@ + xajax.debug.text = []; + xajax.debug.text[100] = 'ATTENTION : '; + xajax.debug.text[101] = 'ERREUR : '; + xajax.debug.text[102] = 'MESSAGE DE DEBUG XAJAX :\n'; + xajax.debug.text[103] = '...\n[R�PONSE LONGUE]\n...'; + xajax.debug.text[104] = 'ENVOI DE LA REQU�TE'; + xajax.debug.text[105] = 'ENVOY� ['; + xajax.debug.text[106] = ' octets]'; + xajax.debug.text[107] = 'APPEL : '; + xajax.debug.text[108] = 'URI : '; + xajax.debug.text[109] = 'INITIALISATION DE LA REQU�TE'; + xajax.debug.text[110] = 'TRAITEMENT DES PARAM�TRES ['; + xajax.debug.text[111] = ']'; + xajax.debug.text[112] = 'AUCUN PARAM�TRE � TRAITER'; + xajax.debug.text[113] = 'PR�PARATION DE LA REQU�TE'; + xajax.debug.text[114] = 'D�BUT DE L\'APPEL XAJAX (d�pr�ci�: utilisez plut�t xajax.request)'; + xajax.debug.text[115] = 'D�BUT DE LA REQU�TE'; + xajax.debug.text[116] = 'Aucun traitement disponible pour traiter la r�ponse du serveur.\n'; + xajax.debug.text[117] = '.\nV�rifie s\'il existe des messages d\'erreur du serveur.'; + xajax.debug.text[118] = 'RE�US [statut : '; + xajax.debug.text[119] = ', taille: '; + xajax.debug.text[120] = ' octets, temps: '; + xajax.debug.text[121] = 'ms] :\n'; + xajax.debug.text[122] = 'Le serveur a retourn� la statut HTTP suivant : '; + xajax.debug.text[123] = '\nRE�US :\n'; + xajax.debug.text[124] = 'Le serveur a indiqu� une redirection vers :
'; + xajax.debug.text[125] = 'FAIT ['; + xajax.debug.text[126] = 'ms]'; + xajax.debug.text[127] = 'INITIALISATION DE L\'OBJET REQU�TE'; + + xajax.debug.exceptions = []; + xajax.debug.exceptions[10001] = 'R�ponse XML non valide : La r�ponse contient une balise inconnue : {data}.'; + xajax.debug.exceptions[10002] = 'GetRequestObject : XMLHttpRequest n\'est pas disponible, xajax est d�sactiv�.'; + xajax.debug.exceptions[10003] = 'File pleine : Ne peut ajouter un objet � la file car elle est pleine.'; + xajax.debug.exceptions[10004] = 'R�ponse XML non valide : La r�ponse contient une balise ou un texte inattendu : {data}.'; + xajax.debug.exceptions[10005] = 'URI de la requ�te non valide : URI non valide ou manquante; auto-d�tection �chou�e; veuillez en sp�cifier une explicitement.'; + xajax.debug.exceptions[10006] = 'R�ponse de commande invalide : Commande de r�ponse re�ue mal form�e.'; + xajax.debug.exceptions[10007] = 'R�ponse de commande invalide : Commande [{data}] est inconnue.'; + xajax.debug.exceptions[10008] = 'L\'�l�ment d\'ID [{data}] est introuvable dans le document.'; + xajax.debug.exceptions[10009] = 'Requ�te invalide : Aucun nom de fonction indiqu� en param�tre.'; + xajax.debug.exceptions[10010] = 'Requ�te invalide : Aucun objet indiqu� en param�tre pour la fonction.'; + + if ('undefined' != typeof xajax.config) { + if ('undefined' != typeof xajax.config.status) { + /* + Object: mise � jour + */ + xajax.config.status.update = function() { + return { + onRequest: function() { + window.status = 'Envoi de la requ�te...'; + }, + onWaiting: function() { + window.status = 'Attente de la r�ponse...'; + }, + onProcessing: function() { + window.status = 'En cours de traitement...'; + }, + onComplete: function() { + window.status = 'Fait.'; + } + } + } + } + } \ No newline at end of file diff --git a/phpgwapi/inc/xajax/xajax_js/xajax_lang_nl.js b/phpgwapi/inc/xajax/xajax_js/xajax_lang_nl.js new file mode 100644 index 0000000000..9b529cf1cb --- /dev/null +++ b/phpgwapi/inc/xajax/xajax_js/xajax_lang_nl.js @@ -0,0 +1,9 @@ +if('undefined'!=typeof xajax.debug){xajax.debug.text=[];xajax.debug.text[100]='FOUTMELDING: ';xajax.debug.text[101]='FOUT: ';xajax.debug.text[102]='XAJAX FOUTMELDINGS BERICHT:\n';xajax.debug.text[103]='...\n[LANG ANTWOORD]\n...';xajax.debug.text[104]='VERZENDING AANVRAAG';xajax.debug.text[105]='VERZONDEN [';xajax.debug.text[106]=' bytes]';xajax.debug.text[107]='AANROEPING: ';xajax.debug.text[108]='URI: ';xajax.debug.text[109]='INITIALISATIE AANVRAAG';xajax.debug.text[110]='VERWERKING PARAMETERS [';xajax.debug.text[111]=']';xajax.debug.text[112]='GEEN PARAMETERS OM TE VERWERKEN';xajax.debug.text[113]='VOORBEREIDING AANVRAAG';xajax.debug.text[114]='BEGIN XAJAX AANVRAAG (verouderd: gebruik xajax.request)';xajax.debug.text[115]='BEGIN XAJAX AANVRAAG';xajax.debug.text[116]='Er is geen verwerkingsbestand gespecificeerd om de aanvraag te verwerken.\n';xajax.debug.text[117]='.\nBekijk foutmeldingen van de server.';xajax.debug.text[118]='ONTVANGEN [status: ';xajax.debug.text[119]=', omvang: ';xajax.debug.text[120]=' bytes, Zeit: ';xajax.debug.text[121]='ms]:\n';xajax.debug.text[122]='De server retourneert de volgende HTTP-status: ';xajax.debug.text[123]='\nONTVANGEN:\n';xajax.debug.text[124]='De server retourneert een doorverwijzing naar:
';xajax.debug.text[125]='KLAAR [';xajax.debug.text[126]='ms]';xajax.debug.text[127]='INITIALISATIE OBJECT AANVRAAG';xajax.debug.exceptions=[];xajax.debug.exceptions[10001]='Ongeldig XML-antwoord: het antwoord bevat een onbekende tag: {data}.';xajax.debug.exceptions[10002]='GetRequestObject: XMLHttpRequest is niet beschikbaar, XajaX is uitgeschakeld.';xajax.debug.exceptions[10003]='Wachtrij limiet overschreden: kan het object niet in de wachtrij plaatsen, omdat die vol is.';xajax.debug.exceptions[10004]='Ongeldig XML-antwoord: het antwoord bevat een onverwachte tag of tekst: {data}.';xajax.debug.exceptions[10005]='Ongeldige Request-URI: Ongeldige of ontbrekende URI; automatische detectie faalt; specificeer een URI expliciet.';xajax.debug.exceptions[10006]='Ongeldig antwoord bevel: misvormd antwoord bevel ontvangen.';xajax.debug.exceptions[10007]='Ongeldig antwoord bevel: Bevel [{data}] is niet bekend.';xajax.debug.exceptions[10008]='Element met het ID [{data}] kon niet in het document worden gevonden.';xajax.debug.exceptions[10009]='Ongeldige aanvraag: Missende functie parameter - naam.';xajax.debug.exceptions[10010]='Ongeldige aanvraag: Missende functie parameter - object.';} +if('undefined'!=typeof xajax.config){if('undefined'!=typeof xajax.config.status){xajax.config.status.update=function(){return{onRequest:function(){window.status="Verzenden aanvraag...";}, +onWaiting:function(){window.status="Wachten op antwoord...";}, +onProcessing:function(){window.status="Verwerking...";}, +onComplete:function(){window.status="Afgesloten.";} +} +} +} +} diff --git a/phpgwapi/inc/xajax/xajax_js/xajax_lang_nl_uncompressed.js b/phpgwapi/inc/xajax/xajax_js/xajax_lang_nl_uncompressed.js new file mode 100644 index 0000000000..22fc154a4b --- /dev/null +++ b/phpgwapi/inc/xajax/xajax_js/xajax_lang_nl_uncompressed.js @@ -0,0 +1,84 @@ +/** + * translation for: xajax v.x.x + * @version: 1.0.0 + * @author: jeffrey + * @copyright xajax project + * @license GNU/GPL + * @package xajax x.x.x + * @since v.x.x.x + * save as UTF-8 + */ + +if ('undefined' != typeof xajax.debug) { + /* + Array: text + */ + xajax.debug.text = []; + xajax.debug.text[100] = 'FOUTMELDING: '; + xajax.debug.text[101] = 'FOUT: '; + xajax.debug.text[102] = 'XAJAX FOUTMELDINGS BERICHT:\n'; + xajax.debug.text[103] = '...\n[LANG ANTWOORD]\n...'; + xajax.debug.text[104] = 'VERZENDING AANVRAAG'; + xajax.debug.text[105] = 'VERZONDEN ['; + xajax.debug.text[106] = ' bytes]'; + xajax.debug.text[107] = 'AANROEPING: '; + xajax.debug.text[108] = 'URI: '; + xajax.debug.text[109] = 'INITIALISATIE AANVRAAG'; + xajax.debug.text[110] = 'VERWERKING PARAMETERS ['; + xajax.debug.text[111] = ']'; + xajax.debug.text[112] = 'GEEN PARAMETERS OM TE VERWERKEN'; + xajax.debug.text[113] = 'VOORBEREIDING AANVRAAG'; + xajax.debug.text[114] = 'BEGIN XAJAX AANVRAAG (verouderd: gebruik xajax.request)'; + xajax.debug.text[115] = 'BEGIN XAJAX AANVRAAG'; + xajax.debug.text[116] = 'Er is geen verwerkingsbestand gespecificeerd om de aanvraag te verwerken.\n'; + xajax.debug.text[117] = '.\nBekijk foutmeldingen van de server.'; + xajax.debug.text[118] = 'ONTVANGEN [status: '; + xajax.debug.text[119] = ', omvang: '; + xajax.debug.text[120] = ' bytes, Zeit: '; + xajax.debug.text[121] = 'ms]:\n'; + xajax.debug.text[122] = 'De server retourneert de volgende HTTP-status: '; + xajax.debug.text[123] = '\nONTVANGEN:\n'; + xajax.debug.text[124] = 'De server retourneert een doorverwijzing naar:
'; + xajax.debug.text[125] = 'KLAAR ['; + xajax.debug.text[126] = 'ms]'; + xajax.debug.text[127] = 'INITIALISATIE OBJECT AANVRAAG'; + + /* + Array: exceptions + */ + xajax.debug.exceptions = []; + xajax.debug.exceptions[10001] = 'Ongeldig XML-antwoord: het antwoord bevat een onbekende tag: {data}.'; + xajax.debug.exceptions[10002] = 'GetRequestObject: XMLHttpRequest is niet beschikbaar, XajaX is uitgeschakeld.'; + xajax.debug.exceptions[10003] = 'Wachtrij limiet overschreden: kan het object niet in de wachtrij plaatsen, omdat die vol is.'; + xajax.debug.exceptions[10004] = 'Ongeldig XML-antwoord: het antwoord bevat een onverwachte tag of tekst: {data}.'; + xajax.debug.exceptions[10005] = 'Ongeldige Request-URI: Ongeldige of ontbrekende URI; automatische detectie faalt; specificeer een URI expliciet.'; + xajax.debug.exceptions[10006] = 'Ongeldig antwoord bevel: misvormd antwoord bevel ontvangen.'; + xajax.debug.exceptions[10007] = 'Ongeldig antwoord bevel: Bevel [{data}] is niet bekend.'; + xajax.debug.exceptions[10008] = 'Element met het ID [{data}] kon niet in het document worden gevonden.'; + xajax.debug.exceptions[10009] = 'Ongeldige aanvraag: Missende functie parameter - naam.'; + xajax.debug.exceptions[10010] = 'Ongeldige aanvraag: Missende functie parameter - object.'; +} + +if ('undefined' != typeof xajax.config) { + if ('undefined' != typeof xajax.config.status) { + /* + Object: update + */ + xajax.config.status.update = function() { + return { + onRequest: function() { + window.status = "Verzenden aanvraag..."; + }, + onWaiting: function() { + window.status = "Wachten op antwoord..."; + }, + onProcessing: function() { + window.status = "Verwerking..."; + }, + onComplete: function() { + window.status = "Afgesloten."; + } + } + } + } +} diff --git a/phpgwapi/inc/xajax/xajax_js/xajax_lang_tr.js b/phpgwapi/inc/xajax/xajax_js/xajax_lang_tr.js new file mode 100644 index 0000000000..ed22aa0156 --- /dev/null +++ b/phpgwapi/inc/xajax/xajax_js/xajax_lang_tr.js @@ -0,0 +1,10 @@ + +if('undefined'!=typeof xajax.debug){xajax.debug.text=[];xajax.debug.text[100]='IKAZ: ';xajax.debug.text[101]='HATA: ';xajax.debug.text[102]='XAJAX DEBUG (HATA AYIKLAMASI) MESAJI:\n';xajax.debug.text[103]='...\n[UZUN YANIT]\n...';xajax.debug.text[104]='ISTEK GÖNDERILIYOR';xajax.debug.text[105]='GÖNDERILDI [';xajax.debug.text[106]=' byte]';xajax.debug.text[107]='ÇAGIRILIYOR: ';xajax.debug.text[108]='URI: ';xajax.debug.text[109]='ISTEK BASLATILIYOR';xajax.debug.text[110]='PARAMETRELER ISLENIYOR [';xajax.debug.text[111]=']';xajax.debug.text[112]='ISLENECEK PARAMETRE YOK';xajax.debug.text[113]='ISTEK HAZIRLANIYOR';xajax.debug.text[114]='XAJAX ÇAGRISI BASLATILIYOR (kullanimi tavsiye edilmiyor: yerine xajax.request kullanin)';xajax.debug.text[115]='XAJAX ISTEGI BASLATILIYOR';xajax.debug.text[116]='Sunucudan gelen cevabi isleyecek cevap islemcisi yok.\n';xajax.debug.text[117]='.\nSunucudan gelen hata mesajlarini kontrol edin.';xajax.debug.text[118]='ALINDI [durum: ';xajax.debug.text[119]=', boyut: ';xajax.debug.text[120]=' byte, süre: ';xajax.debug.text[121]='ms]:\n';xajax.debug.text[122]='Sunucu asagidaki HTTP durumunu gönderdi: ';xajax.debug.text[123]='\nALINDI:\n';xajax.debug.text[124]='Sunucu su adrese yönlendirme istegi gönderdi :
';xajax.debug.text[125]='TAMAMLANDI [';xajax.debug.text[126]='ms]';xajax.debug.text[127]='ISTEK NESNESI BASLATILIYOR';xajax.debug.exceptions=[];xajax.debug.exceptions[10001]='Geçersiz XML cevabi: Cevap bilinmeyen bir etiket tasiyor: {data}.';xajax.debug.exceptions[10002]='GetRequestObject: XMLHttpRequest hazir degil, xajax nesnesi etkisizlestirildi.';xajax.debug.exceptions[10003]='Islem kuyrugu fazla yüklendi: Kuyruk dolu oldugu için nesne kuyruga eklenemiyor.';xajax.debug.exceptions[10004]='Geçersiz XML cevabi: Cevap bilinmeyen bir etiket veya metin tasiyor: {data}.';xajax.debug.exceptions[10005]='Geçersiz istek URI: Geçersiz veya kayip URI; otomatik tespit yapilamadi; lütfen açikça bir tane belirleyiniz.';xajax.debug.exceptions[10006]='Geçersiz cevap komutu: Bozulmus cevap komutu alindi.';xajax.debug.exceptions[10007]='Geçersiz cevap komutu: [{data}] komutu bilinmiyor.';xajax.debug.exceptions[10008]='[{data}] ID li element dosya içinde bulunamadi.';xajax.debug.exceptions[10009]='Geçersiz istek: Fonksiyon isim parametresi eksik.';xajax.debug.exceptions[10010]='Geçersiz istek: Fonksiyon nesne parametresi eksik.';} +if('undefined'!=typeof xajax.config){if('undefined'!=typeof xajax.config.status){xajax.config.status.update=function(){return{onRequest:function(){window.status='İstek Gönderiliyor...';}, +onWaiting:function(){window.status='Cevap Bekleniyor...';}, +onProcessing:function(){window.status='İşlem Devam Ediyor...';}, +onComplete:function(){window.status='Tamamlandı.';} +} +} +} +} diff --git a/phpgwapi/inc/xajax/xajax_js/xajax_lang_tr_uncompressed.js b/phpgwapi/inc/xajax/xajax_js/xajax_lang_tr_uncompressed.js new file mode 100644 index 0000000000..1bcc0263e7 --- /dev/null +++ b/phpgwapi/inc/xajax/xajax_js/xajax_lang_tr_uncompressed.js @@ -0,0 +1,82 @@ +/** + * translation for: xajax v.x.x + * @version: 1.0.0 + * @author: mic + * @copyright xajax project + * @license GNU/GPL + * @package xajax x.x.x + * @since v.x.x.x + * save as UTF-8 + */ + +if ('undefined' != typeof xajax.debug) { + + xajax.debug.text = []; + xajax.debug.text[100] = 'IKAZ: '; + xajax.debug.text[101] = 'HATA: '; + xajax.debug.text[102] = 'XAJAX DEBUG (HATA AYIKLAMASI) MESAJI:\n'; + xajax.debug.text[103] = '...\n[UZUN YANIT]\n...'; + xajax.debug.text[104] = 'ISTEK GÖNDERILIYOR'; + xajax.debug.text[105] = 'GÖNDERILDI ['; + xajax.debug.text[106] = ' byte]'; + xajax.debug.text[107] = 'ÇAGIRILIYOR: '; + xajax.debug.text[108] = 'URI: '; + xajax.debug.text[109] = 'ISTEK BASLATILIYOR'; + xajax.debug.text[110] = 'PARAMETRELER ISLENIYOR ['; + xajax.debug.text[111] = ']'; + xajax.debug.text[112] = 'ISLENECEK PARAMETRE YOK'; + xajax.debug.text[113] = 'ISTEK HAZIRLANIYOR'; + xajax.debug.text[114] = 'XAJAX ÇAGRISI BASLATILIYOR (kullanimi tavsiye edilmiyor: yerine xajax.request kullanin)'; + xajax.debug.text[115] = 'XAJAX ISTEGI BASLATILIYOR'; + xajax.debug.text[116] = 'Sunucudan gelen cevabi isleyecek cevap islemcisi yok.\n'; + xajax.debug.text[117] = '.\nSunucudan gelen hata mesajlarini kontrol edin.'; + xajax.debug.text[118] = 'ALINDI [durum: '; + xajax.debug.text[119] = ', boyut: '; + xajax.debug.text[120] = ' byte, süre: '; + xajax.debug.text[121] = 'ms]:\n'; + xajax.debug.text[122] = 'Sunucu asagidaki HTTP durumunu gönderdi: '; + xajax.debug.text[123] = '\nALINDI:\n'; + xajax.debug.text[124] = 'Sunucu su adrese yönlendirme istegi gönderdi :
'; + xajax.debug.text[125] = 'TAMAMLANDI ['; + xajax.debug.text[126] = 'ms]'; + xajax.debug.text[127] = 'ISTEK NESNESI BASLATILIYOR'; + + /* + Array: exceptions + */ + xajax.debug.exceptions = []; + xajax.debug.exceptions[10001] = 'Geçersiz XML cevabi: Cevap bilinmeyen bir etiket tasiyor: {data}.'; + xajax.debug.exceptions[10002] = 'GetRequestObject: XMLHttpRequest hazir degil, xajax nesnesi etkisizlestirildi.'; + xajax.debug.exceptions[10003] = 'Islem kuyrugu fazla yüklendi: Kuyruk dolu oldugu için nesne kuyruga eklenemiyor.'; + xajax.debug.exceptions[10004] = 'Geçersiz XML cevabi: Cevap bilinmeyen bir etiket veya metin tasiyor: {data}.'; + xajax.debug.exceptions[10005] = 'Geçersiz istek URI: Geçersiz veya kayip URI; otomatik tespit yapilamadi; lütfen açikça bir tane belirleyiniz.'; + xajax.debug.exceptions[10006] = 'Geçersiz cevap komutu: Bozulmus cevap komutu alindi.'; + xajax.debug.exceptions[10007] = 'Geçersiz cevap komutu: [{data}] komutu bilinmiyor.'; + xajax.debug.exceptions[10008] = '[{data}] ID li element dosya içinde bulunamadi.'; + xajax.debug.exceptions[10009] = 'Geçersiz istek: Fonksiyon isim parametresi eksik.'; + xajax.debug.exceptions[10010] = 'Geçersiz istek: Fonksiyon nesne parametresi eksik.'; +} + +if ('undefined' != typeof xajax.config) { + if ('undefined' != typeof xajax.config.status) { + /* + Object: update + */ + xajax.config.status.update = function() { + return { + onRequest: function() { + window.status = 'İstek Gönderiliyor...'; + }, + onWaiting: function() { + window.status = 'Cevap Bekleniyor...'; + }, + onProcessing: function() { + window.status = 'İşlem Devam Ediyor...'; + }, + onComplete: function() { + window.status = 'Tamamlandı.'; + } + } + } + } +} diff --git a/phpgwapi/inc/xajax/xajax_js/xajax_legacy.js b/phpgwapi/inc/xajax/xajax_js/xajax_legacy.js new file mode 100644 index 0000000000..84e933e5fa --- /dev/null +++ b/phpgwapi/inc/xajax/xajax_js/xajax_legacy.js @@ -0,0 +1,14 @@ + +try{if('undefined'==typeof xajax) +throw{name:'SequenceError',message:'Error: xajax core was not detected, legacy module disabled.'} +if('undefined'==typeof xajax.legacy) +xajax.legacy={} +xajax.legacy.call=xajax.call;xajax.call=function(sFunction,objParameters){var oOpt={} +oOpt.parameters=objParameters;if(undefined!=xajax.loadingFunction){if(undefined==oOpt.callback) +oOpt.callback={} +oOpt.callback.onResponseDelay=xajax.loadingFunction;} +if(undefined!=xajax.doneLoadingFunction){if(undefined==oOpt.callback) +oOpt.callback={} +oOpt.callback.onComplete=xajax.doneLoadingFunction;} +return xajax.legacy.call(sFunction,oOpt);} +xajax.legacy.isLoaded=true;}catch(e){alert(e.name+': '+e.message);} diff --git a/phpgwapi/inc/xajax/xajax_js/xajax_legacy_uncompressed.js b/phpgwapi/inc/xajax/xajax_js/xajax_legacy_uncompressed.js new file mode 100644 index 0000000000..62ea1b8ad2 --- /dev/null +++ b/phpgwapi/inc/xajax/xajax_js/xajax_legacy_uncompressed.js @@ -0,0 +1,69 @@ +/* + File: xajax_legacy.js + + Provides support for legacy scripts that have not been updated to the + latest syntax. + + Title: xajax legacy support module + + Please see for a detailed description, copyright + and license information. +*/ + +/* + @package xajax + @version $Id: xajax_legacy_uncompressed.php 327 2007-02-28 16:55:26Z calltoconstruct $ + @copyright Copyright (c) 2005-2007 by Jared White & J. Max Wilson + @copyright Copyright (c) 2008-2009 by Joseph Woolley, Steffen Konerow, Jared White & J. Max Wilson + @license http://www.xajaxproject.org/bsd_license.txt BSD License +*/ + +try +{ + /* + Class: xajax.legacy + */ + if ('undefined' == typeof xajax) + throw { name: 'SequenceError', message: 'Error: xajax core was not detected, legacy module disabled.' } + + if ('undefined' == typeof xajax.legacy) + xajax.legacy = {} + + /* + Function: xajax.legacy.call + + Convert call parameters from the 0.2.x syntax to the new *improved* + call format. + + Parameters: + sFunction - (string): Registered PHP Functionname to be called + objParametes - (object): Paramter object for the request. + + This is a wrapper function around the standard function. + */ + xajax.legacy.call = xajax.call; + xajax.call = function(sFunction, objParameters) { + var oOpt = {} + oOpt.parameters = objParameters; + if (undefined != xajax.loadingFunction) { + if (undefined == oOpt.callback) + oOpt.callback = {} + oOpt.callback.onResponseDelay = xajax.loadingFunction; + } + if (undefined != xajax.doneLoadingFunction) { + if (undefined == oOpt.callback) + oOpt.callback = {} + oOpt.callback.onComplete = xajax.doneLoadingFunction; + } + return xajax.legacy.call(sFunction, oOpt); + } + + /* + Boolean: isLoaded + + true - Indicates that the module is loaded. + */ + xajax.legacy.isLoaded = true; +} catch (e) { + alert(e.name + ': ' + e.message); +} diff --git a/phpgwapi/inc/xajax/xajax_js/xajax_verbose.js b/phpgwapi/inc/xajax/xajax_js/xajax_verbose.js new file mode 100644 index 0000000000..d3c457a382 --- /dev/null +++ b/phpgwapi/inc/xajax/xajax_js/xajax_verbose.js @@ -0,0 +1,18 @@ + +try{if('undefined'==typeof xajax) +throw{name:'SequenceError',message:'Error: xajax core was not detected, verbose module disabled.'} +if('undefined'==typeof xajax.debug) +throw{name:'SequenceError',message:'Error: xajax debugger was not detected, verbose module disabled.'} +xajax.debug.verbose={} +xajax.debug.verbose.expandObject=function(obj){var rec=true;if(1 < arguments.length) +rec=arguments[1];if('function'==typeof(obj)){return '[Function]';}else if('object'==typeof(obj)){if(true==rec){var t=' { ';var separator='';for(var m in obj){t+=separator;t+=m;t+=': ';try{t+=xajax.debug.verbose.expandObject(obj[m],false);}catch(e){t+='[n/a]';} +separator=', ';} +t+=' } ';return t;}else return '[Object]';}else return '"'+obj+'"';} +xajax.debug.verbose.makeFunction=function(obj,name){return function(){var fun=name;fun+='(';var separator='';var pLen=arguments.length;for(var p=0;p < pLen;++p){fun+=separator;fun+=xajax.debug.verbose.expandObject(arguments[p]);separator=',';} +fun+=');';var msg='--> ';msg+=fun;xajax.debug.writeMessage(msg);var returnValue=true;var code='returnValue = obj(';separator='';for(var p=0;p < pLen;++p){code+=separator;code+='arguments['+p+']';separator=',';} +code+=');';eval(code);msg='<-- ';msg+=fun;msg+=' returns ';msg+=xajax.debug.verbose.expandObject(returnValue);xajax.debug.writeMessage(msg);return returnValue;} +} +xajax.debug.verbose.hook=function(x,base){for(var m in x){if('function'==typeof(x[m])){x[m]=xajax.debug.verbose.makeFunction(x[m],base+m);} +} +} +xajax.debug.verbose.hook(xajax,'xajax.');xajax.debug.verbose.hook(xajax.callback,'xajax.callback.');xajax.debug.verbose.hook(xajax.css,'xajax.css.');xajax.debug.verbose.hook(xajax.dom,'xajax.dom.');xajax.debug.verbose.hook(xajax.events,'xajax.events.');xajax.debug.verbose.hook(xajax.forms,'xajax.forms.');xajax.debug.verbose.hook(xajax.js,'xajax.js.');xajax.debug.verbose.hook(xajax.tools,'xajax.tools.');xajax.debug.verbose.hook(xajax.tools.queue,'xajax.tools.queue.');xajax.debug.verbose.hook(xajax.command,'xajax.command.');xajax.debug.verbose.hook(xajax.command.handler,'xajax.command.handler.');xajax.debug.verbose.isLoaded=true;}catch(e){alert(e.name+': '+e.message);} diff --git a/phpgwapi/inc/xajax/xajax_js/xajax_verbose_uncompressed.js b/phpgwapi/inc/xajax/xajax_js/xajax_verbose_uncompressed.js new file mode 100644 index 0000000000..a3d82ad9cd --- /dev/null +++ b/phpgwapi/inc/xajax/xajax_js/xajax_verbose_uncompressed.js @@ -0,0 +1,176 @@ +/* + File: xajax_verbose.js + + The xajax verbose debugging module. This is an optional module, include in + your project with care. :) + + Title: xajax verbose debugging module + + Please see for a detailed description, copyright + and license information. +*/ + +/* + @package xajax + @version $Id: xajax_verbose_uncompressed 327 2007-02-28 16:55:26Z calltoconstruct $ + @copyright Copyright (c) 2005-2007 by Jared White & J. Max Wilson + @copyright Copyright (c) 2008-2009 by Joseph Woolley, Steffen Konerow, Jared White & J. Max Wilson + @license http://www.xajaxproject.org/bsd_license.txt BSD License +*/ + +try { + if ('undefined' == typeof xajax) + throw { name: 'SequenceError', message: 'Error: xajax core was not detected, verbose module disabled.' } + if ('undefined' == typeof xajax.debug) + throw { name: 'SequenceError', message: 'Error: xajax debugger was not detected, verbose module disabled.' } + + /* + Class: xajax.debug.verbose + + Provide a high level of detail which can be used to debug hard to find + problems. + */ + xajax.debug.verbose = {} + + /* + Function: xajax.debug.verbose.expandObject + + Generate a debug message expanding all the first level + members found therein. + + + Parameters: + + obj - (object): The object to be enumerated. + + Returns: + + string - The textual representation of all the first + level members. + */ + xajax.debug.verbose.expandObject = function(obj) { + var rec = true; + if (1 < arguments.length) + rec = arguments[1]; + if ('function' == typeof (obj)) { + return '[Function]'; + } else if ('object' == typeof (obj)) { + if (true == rec) { + var t = ' { '; + var separator = ''; + for (var m in obj) { + t += separator; + t += m; + t += ': '; + try { + t += xajax.debug.verbose.expandObject(obj[m], false); + } catch (e) { + t += '[n/a]'; + } + separator = ', '; + } + t += ' } '; + return t; + } else return '[Object]'; + } else return '"' + obj + '"'; + } + + /* + Function: xajax.debug.verbose.makeFunction + + Generate a wrapper function around the specified function. + + Parameters: + + obj - (object): The object that contains the function to be + wrapped. + name - (string): The name of the function to be wrapped. + + Returns: + + function - The wrapper function. + */ + xajax.debug.verbose.makeFunction = function(obj, name) { + return function() { + var fun = name; + fun += '('; + + var separator = ''; + var pLen = arguments.length; + for (var p = 0; p < pLen; ++p) { + fun += separator; + fun += xajax.debug.verbose.expandObject(arguments[p]); + separator = ','; + } + + fun += ');'; + + var msg = '--> '; + msg += fun; + + xajax.debug.writeMessage(msg); + + var returnValue = true; + var code = 'returnValue = obj('; + separator = ''; + for (var p = 0; p < pLen; ++p) { + code += separator; + code += 'arguments[' + p + ']'; + separator = ','; + } + code += ');'; + + eval(code); + + msg = '<-- '; + msg += fun; + msg += ' returns '; + msg += xajax.debug.verbose.expandObject(returnValue); + + xajax.debug.writeMessage(msg); + + return returnValue; + } + } + + /* + Function: xajax.debug.verbose.hook + + Generate a wrapper function around each of the functions + contained within the specified object. + + Parameters: + + x - (object): The object to be scanned. + base - (string): The base reference to be prepended to the + generated wrapper functions. + */ + xajax.debug.verbose.hook = function(x, base) { + for (var m in x) { + if ('function' == typeof (x[m])) { + x[m] = xajax.debug.verbose.makeFunction(x[m], base + m); + } + } + } + + xajax.debug.verbose.hook(xajax, 'xajax.'); + xajax.debug.verbose.hook(xajax.callback, 'xajax.callback.'); + xajax.debug.verbose.hook(xajax.css, 'xajax.css.'); + xajax.debug.verbose.hook(xajax.dom, 'xajax.dom.'); + xajax.debug.verbose.hook(xajax.events, 'xajax.events.'); + xajax.debug.verbose.hook(xajax.forms, 'xajax.forms.'); + xajax.debug.verbose.hook(xajax.js, 'xajax.js.'); + xajax.debug.verbose.hook(xajax.tools, 'xajax.tools.'); + xajax.debug.verbose.hook(xajax.tools.queue, 'xajax.tools.queue.'); + xajax.debug.verbose.hook(xajax.command, 'xajax.command.'); + xajax.debug.verbose.hook(xajax.command.handler, 'xajax.command.handler.'); + + /* + Boolean: isLoaded + + true - indicates that the verbose debugging module is loaded. + */ + xajax.debug.verbose.isLoaded = true; +} catch (e) { + alert(e.name + ': ' + e.message); +}