PageRenderTime 71ms CodeModel.GetById 27ms RepoModel.GetById 0ms app.codeStats 1ms

/www/lib/xajax/xajax_core/xajaxAIO.inc.php

http://firmkernel.googlecode.com/
PHP | 1242 lines | 1228 code | 14 blank | 0 comment | 154 complexity | 723f66eecfcb5159b7a37159f9a22a42 MD5 | raw file
Possible License(s): LGPL-3.0
  1. <?php
  2. class xajaxCall{var $sFunction;var $sReturnValue;var $aParameters;var $sMode;var $sRequestType;var $sResponseProcessor;var $sRequestURI;var $sContentType;function xajaxCall($sFunction=''){$this->sFunction=$sFunction;$this->aParameters=array();$this->sMode='';$this->sRequestType='';$this->sResponseProcessor='';$this->sRequestURI='';$this->sContentType='';}
  3. function setFunction($sFunction){$this->sFunction=$sFunction;return $this;}
  4. function clearParameters(){$this->aParameters=array();}
  5. function addParameter($sParameter,$bUseQuotes=true){$this->aParameters[]=array($sParameter,$bUseQuotes);return $this;}
  6. function addFormValuesParameter($sFormID){$this->aParameters[]=array('xajax.getFormValues("'.$sFormID.'")');return $this;}
  7. function setMode($sMode){$this->sMode=$sMode;return $this;}
  8. function setRequestType($sRequestType){$this->sRequestType=$sRequestType;return $this;}
  9. function setResponseProcessor($sResponseProcessor){$this->sResponseProcessor=$sResponseProcessor;return $this;}
  10. function setRequestURI($sRequestURI){$this->sRequestURI=$sRequestURI;return $this;}
  11. function setContentType($sContentType){$this->sContentType=$sContentType;}
  12. function setReturnValue($sReturnValue){$this->sReturnValue=$sReturnValue;}
  13. 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)
  14. $output .='"';$output .=$aParameter[0];if($bUseQuotes)
  15. $output .='"';$separator=',';}
  16. $output .=']';}
  17. if(0 < strlen($this->sMode)){$output .=$separator;$output .='mode:"';$output .=$this->sMode;$output .='"';$separator=',';}
  18. if(0 < strlen($this->sRequestType)){$output .=$separator;$output .='requestType:"';$output .=$this->sRequestType;$output .='"';$separator=',';}
  19. if(0 < strlen($this->sResponseProcessor)){$output .=$separator;$output .='responseProcessor:';$output .=$this->sResponseProcessor;$separator=',';}
  20. if(0 < strlen($this->sRequestURI)){$output .=$separator;$output .='requestURI:"';$output .=$this->sRequestURI;$output .='"';$separator=',';}
  21. if(0 < strlen($this->sContentType)){$output .=$separator;$output .='contentType:"';$output .=$this->sContentType;$output .='"';$separator=',';}
  22. $output .='}); ';if(0 < strlen($this->sReturnValue)){$output .='return ';$output .=$this->sReturnValue;}else{$output .='return false;';}
  23. return $output;}
  24. }
  25. class xajaxPluginManager{var $aRequestPlugins;var $aResponsePlugins;var $aConfigurable;var $aRegistrars;var $aProcessors;var $aClientScriptGenerators;function xajaxPluginManager(){$this->aRequestPlugins=array();$this->aResponsePlugins=array();$this->aConfigurable=array();$this->aRegistrars=array();$this->aProcessors=array();$this->aClientScriptGenerators=array();}
  26. function&getInstance(){static $obj;if(!$obj){$obj=new xajaxPluginManager();}
  27. return $obj;}
  28. function loadPlugins($aFolders){foreach($aFolders as $sFolder){if(is_dir($sFolder))
  29. 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;}
  30. }
  31. }
  32. closedir($handle);}
  33. }
  34. }
  35. function _insertIntoArray(&$aPlugins,&$objPlugin,$nPriority){while(isset($aPlugins[$nPriority]))
  36. $nPriority++;$aPlugins[$nPriority]=&$objPlugin;}
  37. function registerPlugin(&$objPlugin,$nPriority=1000){if(is_a($objPlugin,'xajaxRequestPlugin')){$this->_insertIntoArray($this->aRequestPlugins,$objPlugin,$nPriority);if(method_exists($objPlugin,'register'))
  38. $this->_insertIntoArray($this->aRegistrars,$objPlugin,$nPriority);if(method_exists($objPlugin,'canProcessRequest'))
  39. if(method_exists($objPlugin,'processRequest'))
  40. $this->_insertIntoArray($this->aProcessors,$objPlugin,$nPriority);}
  41. else if(is_a($objPlugin,'xajaxResponsePlugin')){$this->aResponsePlugins[]=&$objPlugin;}
  42. else{}
  43. if(method_exists($objPlugin,'configure'))
  44. $this->_insertIntoArray($this->aConfigurable,$objPlugin,$nPriority);if(method_exists($objPlugin,'generateClientScript'))
  45. $this->_insertIntoArray($this->aClientScriptGenerators,$objPlugin,$nPriority);}
  46. function canProcessRequest(){$bHandled=false;$aKeys=array_keys($this->aProcessors);sort($aKeys);foreach($aKeys as $sKey){$mResult=$this->aProcessors[$sKey]->canProcessRequest();if(true===$mResult)
  47. $bHandled=true;else if(is_string($mResult))
  48. return $mResult;}
  49. return $bHandled;}
  50. function processRequest(){$bHandled=false;$aKeys=array_keys($this->aProcessors);sort($aKeys);foreach($aKeys as $sKey){$mResult=$this->aProcessors[$sKey]->processRequest();if(true===$mResult)
  51. $bHandled=true;else if(is_string($mResult))
  52. return $mResult;}
  53. return $bHandled;}
  54. function configure($sName,$mValue){$aKeys=array_keys($this->aConfigurable);sort($aKeys);foreach($aKeys as $sKey)
  55. $this->aConfigurable[$sKey]->configure($sName,$mValue);}
  56. 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'))
  57. return $mResult;if(is_array($mResult))
  58. return $mResult;if(is_bool($mResult))
  59. if(true===$mResult)
  60. return true;}
  61. }
  62. function generateClientScript(){$aKeys=array_keys($this->aClientScriptGenerators);sort($aKeys);foreach($aKeys as $sKey)
  63. $this->aClientScriptGenerators[$sKey]->generateClientScript();}
  64. function&getPlugin($sName){$aKeys=array_keys($this->aResponsePlugins);sort($aKeys);foreach($aKeys as $sKey)
  65. if(is_a($this->aResponsePlugins[$sKey],$sName))
  66. return $this->aResponsePlugins[$sKey];$bFailure=false;return $bFailure;}
  67. }
  68. class xajaxResponseManager{var $objResponse;var $sCharacterEncoding;var $bOutputEntities;var $aDebugMessages;function xajaxResponseManager(){$this->objResponse=NULL;$this->aDebugMessages=array();}
  69. function&getInstance(){static $obj;if(!$obj){$obj=new xajaxResponseManager();}
  70. return $obj;}
  71. function configure($sName,$mValue){if('characterEncoding'==$sName){$this->sCharacterEncoding=$mValue;if(isset($this->objResponse))
  72. $this->objResponse->setCharacterEncoding($this->sCharacterEncoding);}
  73. else if('outputEntities'==$sName){if(true===$mValue||false===$mValue){$this->bOutputEntities=$mValue;if(isset($this->objResponse))
  74. $this->objResponse->setOutputEntities($this->bOutputEntities);}
  75. }
  76. }
  77. function clear(){$this->objResponse=NULL;}
  78. 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)
  79. $this->objResponse->absorb($mResponse);}else{$objLanguageManager=&xajaxLanguageManager::getInstance();$this->debug(
  80. $objLanguageManager->getText('XJXRM:MXRTERR')
  81. . get_class($this->objResponse)
  82. . ')'
  83. );}
  84. }else if(is_a($mResponse,'xajaxCustomResponse')){if(NULL==$this->objResponse){$this->objResponse=$mResponse;}else if(is_a($this->objResponse,'xajaxCustomResponse')){if($this->objResponse!=$mResponse)
  85. $this->objResponse->absorb($mResponse);}else{$objLanguageManager=&xajaxLanguageManager::getInstance();$this->debug(
  86. $objLanguageManager->getText('XJXRM:MXRTERR')
  87. . get_class($this->objResponse)
  88. . ')'
  89. );}
  90. }else{$objLanguageManager=&xajaxLanguageManager::getInstance();$this->debug($objLanguageManager->getText('XJXRM:IRERR'));}
  91. }
  92. function debug($sMessage){$this->aDebugMessages[]=$sMessage;}
  93. function send(){if(NULL!=$this->objResponse){foreach($this->aDebugMessages as $sMessage)
  94. $this->objResponse->debug($sMessage);$this->aDebugMessages=array();$this->objResponse->printOutput();}
  95. }
  96. function getCharacterEncoding(){return $this->sCharacterEncoding;}
  97. function getOutputEntities(){return $this->bOutputEntities;}
  98. }
  99. class xajaxLanguageManager{var $aMessages;var $sLanguage;function xajaxLanguageManager(){$this->aMessages=array();$this->aMessages['en']=array(
  100. 'LOGHDR:01'=> '** xajax Error Log - ',
  101. 'LOGHDR:02'=> " **\n",
  102. 'LOGHDR:03'=> "\n\n\n",
  103. 'LOGERR:01'=> "** Logging Error **\n\nxajax was unable to write to the error log file:\n",
  104. 'LOGMSG:01'=> "** PHP Error Messages: **",
  105. 'CMPRSJS:RDERR:01'=> 'The xajax uncompressed Javascript file could not be found in the <b>',
  106. 'CMPRSJS:RDERR:02'=> '</b> folder. Error ',
  107. 'CMPRSJS:WTERR:01'=> 'The xajax compressed javascript file could not be written in the <b>',
  108. 'CMPRSJS:WTERR:02'=> '</b> folder. Error ',
  109. 'CMPRSPHP:WTERR:01'=> 'The xajax compressed file <b>',
  110. 'CMPRSPHP:WTERR:02'=> '</b> could not be written to. Error ',
  111. 'CMPRSAIO:WTERR:01'=> 'The xajax compressed file <b>',
  112. 'CMPRSAIO:WTERR:02'=> '/xajaxAIO.inc.php</b> could not be written to. Error ',
  113. 'DTCTURI:01'=> 'xajax Error: xajax failed to automatically identify your Request URI.',
  114. 'DTCTURI:02'=> 'Please set the Request URI explicitly when you instantiate the xajax object.',
  115. 'ARGMGR:ERR:01'=> 'Malformed object argument received: ',
  116. 'ARGMGR:ERR:02'=> ' <==> ',
  117. 'ARGMGR:ERR:03'=> 'The incoming xajax data could not be converted from UTF-8',
  118. 'XJXCTL:IAERR:01'=> 'Invalid attribute [',
  119. 'XJXCTL:IAERR:02'=> '] for element [',
  120. 'XJXCTL:IAERR:03'=> '].',
  121. 'XJXCTL:IRERR:01'=> 'Invalid request object passed to xajaxControl::setEvent',
  122. 'XJXCTL:IEERR:01'=> 'Invalid attribute (event name) [',
  123. 'XJXCTL:IEERR:02'=> '] for element [',
  124. 'XJXCTL:IEERR:03'=> '].',
  125. 'XJXCTL:MAERR:01'=> 'Missing required attribute [',
  126. 'XJXCTL:MAERR:02'=> '] for element [',
  127. 'XJXCTL:MAERR:03'=> '].',
  128. 'XJXCTL:IETERR:01'=> "Invalid end tag designation; should be forbidden or optional.\n",
  129. 'XJXCTL:ICERR:01'=> "Invalid class specified for html control; should be %inline, %block or %flow.\n",
  130. 'XJXCTL:ICLERR:01'=> 'Invalid control passed to addChild; should be derived from xajaxControl.',
  131. 'XJXCTL:ICLERR:02'=> 'Invalid control passed to addChild [',
  132. 'XJXCTL:ICLERR:03'=> '] for element [',
  133. 'XJXCTL:ICLERR:04'=> "].\n",
  134. 'XJXCTL:ICHERR:01'=> 'Invalid parameter passed to xajaxControl::addChildren; should be array of xajaxControl objects',
  135. 'XJXCTL:MRAERR:01'=> 'Missing required attribute [',
  136. 'XJXCTL:MRAERR:02'=> '] for element [',
  137. 'XJXCTL:MRAERR:03'=> '].',
  138. 'XJXPLG:GNERR:01'=> 'Response plugin should override the getName function.',
  139. 'XJXPLG:PERR:01'=> 'Response plugin should override the process function.',
  140. 'XJXPM:IPLGERR:01'=> 'Attempt to register invalid plugin: ',
  141. 'XJXPM:IPLGERR:02'=> ' should be derived from xajaxRequestPlugin or xajaxResponsePlugin.',
  142. 'XJXPM:MRMERR:01'=> 'Failed to locate registration method for the following: ',
  143. 'XJXRSP:EDERR:01'=> 'Passing character encoding to the xajaxResponse constructor is deprecated, instead use $xajax->configure("characterEncoding", ...);',
  144. 'XJXRSP:MPERR:01'=> 'Invalid or missing plugin name detected in call to xajaxResponse::plugin',
  145. 'XJXRSP:CPERR:01'=> "The \$sType parameter of addCreate has been deprecated. Use the addCreateInput() method instead.",
  146. 'XJXRSP:LCERR:01'=> "The xajax response object could not load commands as the data provided was not a valid array.",
  147. 'XJXRSP:AKERR:01'=> 'Invalid tag name encoded in array.',
  148. 'XJXRSP:IEAERR:01'=> 'Improperly encoded array.',
  149. 'XJXRSP:NEAERR:01'=> 'Non-encoded array detected.',
  150. 'XJXRSP:MBEERR:01'=> 'The xajax response output could not be converted to HTML entities because the mb_convert_encoding function is not available',
  151. 'XJXRSP:MXRTERR'=> 'Error: Cannot mix types in a single response.',
  152. 'XJXRSP:MXCTERR'=> 'Error: Cannot mix content types in a single response.',
  153. 'XJXRSP:MXCEERR'=> 'Error: Cannot mix character encodings in a single response.',
  154. 'XJXRSP:MXOEERR'=> 'Error: Cannot mix output entities (true/false) in a single response.',
  155. 'XJXRM:IRERR'=> 'An invalid response was returned while processing this request.',
  156. 'XJXRM:MXRTERR'=> 'Error: You cannot mix response types while processing a single request: '
  157. );$this->sLanguage='en';}
  158. function&getInstance(){static $obj;if(!$obj){$obj=new xajaxLanguageManager();}
  159. return $obj;}
  160. function configure($sName,$mValue){if('language'==$sName){if($mValue!==$this->sLanguage){$sFolder=dirname(__FILE__);@include $sFolder . '/xajax_lang_' . $mValue . '.inc.php';$this->sLanguage=$mValue;}
  161. }
  162. }
  163. function register($sLanguage,$aMessages){$this->aMessages[$sLanguage]=$aMessages;}
  164. function getText($sMessage){if(isset($this->aMessages[$this->sLanguage]))
  165. if(isset($this->aMessages[$this->sLanguage][$sMessage]))
  166. return $this->aMessages[$this->sLanguage][$sMessage];return '(Unknown language or message identifier)'
  167. . $this->sLanguage
  168. . '::'
  169. . $sMessage;}
  170. }
  171. 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{var $aArgs;var $bDecodeUTF8Input;var $sCharacterEncoding;var $nMethod;var $aSequence;function convertStringToBool($sValue){if(0==strcasecmp($sValue,'true'))
  172. return true;if(0==strcasecmp($sValue,'false'))
  173. return false;if(is_numeric($sValue)){if(0==$sValue)
  174. return false;return true;}
  175. return false;}
  176. function argumentStripSlashes(&$sArg){if(false==is_string($sArg))
  177. return;$sArg=stripslashes($sArg);}
  178. function argumentDecodeXML(&$sArg){if(false==is_string($sArg))
  179. return;if(0==strlen($sArg))
  180. 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:
  181. $sKey='';break;case 4:
  182. $sKey=str_replace(
  183. array('<'.'![CDATA[',']]>'),
  184. '',
  185. substr($sArg,$nLast,$nCurrent-$nLast)
  186. );break;case 5:
  187. $mValue='';break;case 6:
  188. if($nLast < $nCurrent){$mValue=str_replace(
  189. array('<'.'![CDATA[',']]>'),
  190. '',
  191. substr($sArg,$nLast,$nCurrent-$nLast)
  192. );$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;}
  193. }
  194. break;case 7:
  195. $aArg[$sKey]=$mValue;break;case 1:
  196. ++$nStackDepth;array_push($aStack,$aArg);$aArg=array();array_push($aStack,$sKey);$sKey='';break;case 8:
  197. if(1 < $nStackDepth){$mValue=$aArg;$sKey=array_pop($aStack);$aArg=array_pop($aStack);--$nStackDepth;}else{$sArg=$aArg;return;}
  198. break;}
  199. $nCurrent+=$nExpectedLength;$nLast=$nCurrent;$bFound=true;break;}
  200. }
  201. }
  202. if(false==$bFound){if(0==$nCurrent){$sArg=str_replace(
  203. array('<'.'![CDATA[',']]>'),
  204. '',
  205. $sArg
  206. );$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;}
  207. return;}
  208. $nCurrent++;}
  209. }
  210. $objLanguageManager=&xajaxLanguageManager::getInstance();trigger_error(
  211. $objLanguageManager->getText('ARGMGR:ERR:01')
  212. . $sExpecting
  213. . $objLanguageManager->getText('ARGMGR:ERR:02')
  214. . $sArg
  215. ,E_USER_ERROR
  216. );}
  217. 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;}
  218. $this->argumentDecodeUTF8_iconv($mArg[$sKey]);}
  219. }
  220. else if(is_string($mArg))
  221. $mArg=iconv("UTF-8",$this->sCharacterEncoding.'//TRANSLIT',$mArg);}
  222. 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;}
  223. $this->argumentDecodeUTF8_mb_convert_encoding($mArg[$sKey]);}
  224. }
  225. else if(is_string($mArg))
  226. $mArg=mb_convert_encoding($mArg,$this->sCharacterEncoding,"UTF-8");}
  227. 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;}
  228. $this->argumentDecodeUTF8_utf8_decode($mArg[$sKey]);}
  229. }
  230. else if(is_string($mArg))
  231. $mArg=utf8_decode($mArg);}
  232. function xajaxArgumentManager(){$this->aArgs=array();$this->bDecodeUTF8Input=false;$this->sCharacterEncoding='UTF-8';$this->nMethod=XAJAX_METHOD_UNKNOWN;$this->aSequence=array(
  233. '<'.'k'.'>'=> array(array(
  234. '<'.'/k'.'>'=> 4
  235. ),3),
  236. '<'.'/k'.'>'=> array(array(
  237. '<'.'v'.'>'=> 3,
  238. '<'.'/e'.'>'=> 4
  239. ),4),
  240. '<'.'v'.'>'=> array(array(
  241. '<'.'xjxobj'.'>'=> 8,
  242. '<'.'/v'.'>'=> 4
  243. ),5),
  244. '<'.'/v'.'>'=> array(array(
  245. '<'.'/e'.'>'=> 4,
  246. '<'.'k'.'>'=> 3
  247. ),6),
  248. '<'.'e'.'>'=> array(array(
  249. '<'.'k'.'>'=> 3,
  250. '<'.'v'.'>'=> 3,
  251. '<'.'/e'.'>'=> 4
  252. ),2),
  253. '<'.'/e'.'>'=> array(array(
  254. '<'.'e'.'>'=> 3,
  255. '<'.'/xjxobj'.'>'=> 9
  256. ),7),
  257. '<'.'xjxobj'.'>'=> array(array(
  258. '<'.'e'.'>'=> 3,
  259. '<'.'/xjxobj'.'>'=> 9
  260. ),1),
  261. '<'.'/xjxobj'.'>'=> array(array(
  262. '<'.'/v'.'>'=> 4
  263. ),8),
  264. 'start'=> array(array(
  265. '<'.'xjxobj'.'>'=> 8
  266. ),9)
  267. );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'];}
  268. if(1==get_magic_quotes_gpc())
  269. array_walk($this->aArgs,array(&$this,'argumentStripSlashes'));array_walk($this->aArgs,array(&$this,'argumentDecodeXML'));}
  270. function&getInstance(){static $obj;if(!$obj){$obj=new xajaxArgumentManager();}
  271. return $obj;}
  272. function configure($sName,$mValue){if('decodeUTF8Input'==$sName){if(true===$mValue||false===$mValue)
  273. $this->bDecodeUTF8Input=$mValue;}else if('characterEncoding'==$sName){$this->sCharacterEncoding=$mValue;}
  274. }
  275. function getRequestMethod(){return $this->nMethod;}
  276. function process(){if($this->bDecodeUTF8Input){$sFunction='';if(function_exists('iconv'))
  277. $sFunction="iconv";else if(function_exists('mb_convert_encoding'))
  278. $sFunction="mb_convert_encoding";else if($this->sCharacterEncoding=="ISO-8859-1")
  279. $sFunction="utf8_decode";else{$objLanguageManager=&xajaxLanguageManager::getInstance();trigger_error(
  280. $objLanguageManager->getText('ARGMGR:ERR:03')
  281. ,E_USER_NOTICE
  282. );}
  283. $mFunction=array(&$this,'argumentDecodeUTF8_' . $sFunction);array_walk($this->aArgs,$mFunction);$this->bDecodeUTF8Input=false;}
  284. return $this->aArgs;}
  285. }
  286. if(false==defined('XAJAX_HTML_CONTROL_DOCTYPE_FORMAT'))define('XAJAX_HTML_CONTROL_DOCTYPE_FORMAT','XHTML');if(false==defined('XAJAX_HTML_CONTROL_DOCTYPE_VERSION'))define('XAJAX_HTML_CONTROL_DOCTYPE_VERSION','1.0');if(false==defined('XAJAX_HTML_CONTROL_DOCTYPE_VALIDATION'))define('XAJAX_HTML_CONTROL_DOCTYPE_VALIDATION','TRANSITIONAL');class xajaxControl{var $sTag;var $sEndTag;var $aAttributes;var $aEvents;var $sClass;function xajaxControl($sTag,$aConfiguration=array()){$this->sTag=$sTag;$this->clearAttributes();if(isset($aConfiguration['attributes']))
  287. if(is_array($aConfiguration['attributes']))
  288. foreach($aConfiguration['attributes'] as $sKey=> $sValue)
  289. $this->setAttribute($sKey,$sValue);$this->clearEvents();if(isset($aConfiguration['event']))
  290. call_user_func_array(array(&$this,'setEvent'),$aConfiguration['event']);else if(isset($aConfiguration['events']))
  291. if(is_array($aConfiguration['events']))
  292. foreach($aConfiguration['events'] as $aEvent)
  293. call_user_func_array(array(&$this,'setEvent'),$aEvent);$this->sClass='%block';$this->sEndTag='forbidden';}
  294. function getClass(){return $this->sClass;}
  295. function clearAttributes(){$this->aAttributes=array();}
  296. function setAttribute($sName,$sValue){$this->aAttributes[$sName]=$sValue;}
  297. function getAttribute($sName){if(false==isset($this->aAttributes[$sName]))
  298. return null;return $this->aAttributes[$sName];}
  299. function clearEvents(){$this->aEvents=array();}
  300. function setEvent($sEvent,&$objRequest,$aParameters=array(),$sBeforeRequest='',$sAfterRequest='; return false;'){$this->aEvents[$sEvent]=array(
  301. &$objRequest,
  302. $aParameters,
  303. $sBeforeRequest,
  304. $sAfterRequest
  305. );}
  306. function getHTML($bFormat=false){ob_start();if($bFormat)
  307. $this->printHTML();else
  308. $this->printHTML(false);return ob_get_clean();}
  309. function printHTML($sIndent=''){$sClass=$this->getClass();if('%inline'!=$sClass)
  310. if(false===(false===$sIndent))
  311. echo $sIndent;echo '<';echo $this->sTag;echo ' ';$this->_printAttributes();$this->_printEvents();if('forbidden'==$this->sEndTag){if('HTML'==XAJAX_HTML_CONTROL_DOCTYPE_FORMAT)
  312. echo '>';else if('XHTML'==XAJAX_HTML_CONTROL_DOCTYPE_FORMAT)
  313. echo '/>';if('%inline'!=$sClass)
  314. if(false===(false===$sIndent))
  315. echo "\n";return;}
  316. else if('optional'==$this->sEndTag){echo '/>';if('%inline'==$sClass)
  317. if(false===(false===$sIndent))
  318. echo "\n";return;}
  319. }
  320. function _printAttributes(){foreach($this->aAttributes as $sKey=> $sValue)
  321. if('disabled'!=$sKey||'false'!=$sValue)
  322. echo "{$sKey}='{$sValue}' ";}
  323. 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);}
  324. $objRequest->useDoubleQuote();echo "{$sKey}='{$sBeforeRequest}";$objRequest->printScript();echo "{$sAfterRequest}' ";}
  325. }
  326. function backtrace(){if(0 <=version_compare(PHP_VERSION,'4.3.0'))
  327. return '<div><div>Backtrace:</div><pre>'
  328. . print_r(debug_backtrace(),true)
  329. . '</pre></div>';return '';}
  330. }
  331. class xajaxControlContainer extends xajaxControl{var $aChildren;var $sChildClass;function xajaxControlContainer($sTag,$aConfiguration=array()){xajaxControl::xajaxControl($sTag,$aConfiguration);$this->clearChildren();if(isset($aConfiguration['child']))
  332. $this->addChild($aConfiguration['child']);else if(isset($aConfiguration['children']))
  333. $this->addChildren($aConfiguration['children']);$this->sEndTag='required';}
  334. function getClass(){$sClass=xajaxControl::getClass();if(0 < count($this->aChildren)&&'%flow'==$sClass)
  335. return $this->getContentClass();else if(0==count($this->aChildren)||'%inline'==$sClass||'%block'==$sClass)
  336. return $sClass;$objLanguageManager=&xajaxLanguageManager::getInstance();trigger_error(
  337. $objLanguageManager->getText('XJXCTL:ICERR:01')
  338. . $this->backtrace()
  339. ,E_USER_ERROR
  340. );}
  341. function getContentClass(){$sClass='';foreach(array_keys($this->aChildren)as $sKey){if(''==$sClass)
  342. $sClass=$this->aChildren[$sKey]->getClass();else if($sClass!=$this->aChildren[$sKey]->getClass())
  343. return '%flow';}
  344. if(''==$sClass)
  345. return '%inline';return $sClass;}
  346. function clearChildren(){$this->sChildClass='%inline';$this->aChildren=array();}
  347. function addChild(&$objControl){$this->aChildren[]=&$objControl;}
  348. function addChildren(&$aChildren){foreach(array_keys($aChildren)as $sKey)
  349. $this->addChild($aChildren[$sKey]);}
  350. function printHTML($sIndent=''){$sClass=$this->getClass();if('%inline'!=$sClass)
  351. if(false===(false===$sIndent))
  352. echo $sIndent;echo '<';echo $this->sTag;echo ' ';$this->_printAttributes();$this->_printEvents();if(0==count($this->aChildren)){if('optional'==$this->sEndTag){echo '/>';if('%inline'!=$sClass)
  353. if(false===(false===$sIndent))
  354. echo "\n";return;}
  355. }
  356. echo '>';$sContentClass=$this->getContentClass();if('%inline'!=$sContentClass)
  357. if(false===(false===$sIndent))
  358. echo "\n";$this->_printChildren($sIndent);if('%inline'!=$sContentClass)
  359. if(false===(false===$sIndent))
  360. echo $sIndent;echo '<' . '/';echo $this->sTag;echo '>';if('%inline'!=$sClass)
  361. if(false===(false===$sIndent))
  362. echo "\n";}
  363. function _printChildren($sIndent=''){if(false==is_a($this,'clsDocument'))
  364. if(false===(false===$sIndent))
  365. $sIndent .="\t";foreach(array_keys($this->aChildren)as $sKey){$objChild=&$this->aChildren[$sKey];$objChild->printHTML($sIndent);}
  366. }
  367. }
  368. class xajaxPlugin{}
  369. class xajaxRequestPlugin extends xajaxPlugin{function configure($sName,$mValue){}
  370. function register($aArgs){return false;}
  371. function generateClientScript(){}
  372. function canProcessRequest(){return false;}
  373. function processRequest(){return false;}
  374. }
  375. class xajaxResponsePlugin extends xajaxPlugin{var $objResponse;function setResponse(&$objResponse){$this->objResponse=&$objResponse;}
  376. function addCommand($aAttributes,$sData){$this->objResponse->addPluginCommand($this,$aAttributes,$sData);}
  377. function getName(){}
  378. function process(){}
  379. }
  380. if(!defined('XAJAX_DEFAULT_CHAR_ENCODING'))define('XAJAX_DEFAULT_CHAR_ENCODING','utf-8');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{var $aSettings;var $bErrorHandler;var $aProcessingEvents;var $bExitAllowed;var $bCleanBuffer;var $sLogFile;var $sCoreIncludeOutput;var $objPluginManager;var $objArgumentManager;var $objResponseManager;var $objLanguageManager;function xajax($sRequestURI=null,$sLanguage=null){$this->bErrorHandler=false;$this->aProcessingEvents=array();$this->bExitAllowed=true;$this->bCleanBuffer=true;$this->sLogFile='';$this->__wakeup();$this->configureMany(
  381. array(
  382. 'characterEncoding'=> XAJAX_DEFAULT_CHAR_ENCODING,
  383. 'decodeUTF8Input'=> false,
  384. 'outputEntities'=> false,
  385. 'defaultMode'=> 'asynchronous',
  386. 'defaultMethod'=> 'POST',
  387. 'wrapperPrefix'=> 'xajax_',
  388. 'debug'=> false,
  389. 'verbose'=> false,
  390. 'useUncompressedScripts'=> false,
  391. 'statusMessages'=> false,
  392. 'waitCursor'=> true,
  393. 'scriptDeferral'=> false,
  394. 'exitAllowed'=> true,
  395. 'errorHandler'=> false,
  396. 'cleanBuffer'=> false,
  397. 'allowBlankResponse'=> false,
  398. 'allowAllResponseTypes'=> false,
  399. 'generateStubs'=> true,
  400. 'logFile'=> '',
  401. 'timeout'=> 6000,
  402. 'version'=> $this->getVersion()
  403. )
  404. );if(null!==$sRequestURI)
  405. $this->configure('requestURI',$sRequestURI);else
  406. $this->configure('requestURI',$this->_detectURI());if(null!==$sLanguage)
  407. $this->configure('language',$sLanguage);if('utf-8'!=XAJAX_DEFAULT_CHAR_ENCODING)$this->configure("decodeUTF8Input",true);}
  408. function __sleep(){$aMembers=get_class_vars(get_class($this));if(isset($aMembers['objLanguageManager']))
  409. unset($aMembers['objLanguageManager']);if(isset($aMembers['objPluginManager']))
  410. unset($aMembers['objPluginManager']);if(isset($aMembers['objArgumentManager']))
  411. unset($aMembers['objArgumentManager']);if(isset($aMembers['objResponseManager']))
  412. unset($aMembers['objResponseManager']);if(isset($aMembers['sCoreIncludeOutput']))
  413. unset($aMembers['sCoreIncludeOutput']);return array_keys($aMembers);}
  414. function __wakeup(){ob_start();$sLocalFolder=dirname(__FILE__);$aPluginFolders=array();$aPluginFolders[]=dirname($sLocalFolder). '/xajax_plugins';$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();}
  415. function&getGlobalResponse(){static $obj;if(!$obj){$obj=new xajaxResponse();}
  416. return $obj;}
  417. function getVersion(){return 'xajax 0.5';}
  418. 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'))
  419. $xuf=&new xajaxUserFunction($xuf);$this->aProcessingEvents[$sEvent]=&$xuf;return true;}
  420. }
  421. if(1 < $nArgs){$aArgs[1]=&$mArg;}
  422. return $this->objPluginManager->register($aArgs);}
  423. function configure($sName,$mValue){if('errorHandler'==$sName){if(true===$mValue||false===$mValue)
  424. $this->bErrorHandler=$mValue;}else if('exitAllowed'==$sName){if(true===$mValue||false===$mValue)
  425. $this->bExitAllowed=$mValue;}else if('cleanBuffer'==$sName){if(true===$mValue||false===$mValue)
  426. $this->bCleanBuffer=$mValue;}else if('logFile'==$sName){$this->sLogFile=$mValue;}
  427. $this->objLanguageManager->configure($sName,$mValue);$this->objArgumentManager->configure($sName,$mValue);$this->objPluginManager->configure($sName,$mValue);$this->objResponseManager->configure($sName,$mValue);$this->aSettings[$sName]=$mValue;}
  428. function configureMany($aOptions){foreach($aOptions as $sName=> $mValue)
  429. $this->configure($sName,$mValue);}
  430. function getConfiguration($sName){if(isset($this->aSettings[$sName]))
  431. return $this->aSettings[$sName];return NULL;}
  432. function canProcessRequest(){return $this->objPluginManager->canProcessRequest();}
  433. function processRequest(){if($this->canProcessRequest()){if($this->bErrorHandler){$GLOBALS['xajaxErrorHandlerText']="";set_error_handler("xajaxErrorHandler");}
  434. $mResult=true;if(isset($this->aProcessingEvents[XAJAX_PROCESSING_EVENT_BEFORE])){$bEndRequest=false;$this->aProcessingEvents[XAJAX_PROCESSING_EVENT_BEFORE]->call(array(&$bEndRequest));$mResult=(false===$bEndRequest);}
  435. if(true===$mResult)
  436. $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);}
  437. 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]);}
  438. }
  439. }
  440. else if(is_string($mResult)){if($this->bCleanBuffer){$er=error_reporting(0);while(ob_get_level()> 0)ob_end_clean();error_reporting($er);}
  441. $this->objResponseManager->clear();$this->objResponseManager->append(new xajaxResponse());if(isset($this->aProcessingEvents[XAJAX_PROCESSING_EVENT_INVALID]))
  442. $this->aProcessingEvents[XAJAX_PROCESSING_EVENT_INVALID]->call();else
  443. $this->objResponseManager->debug($mResult);}
  444. if($this->bErrorHandler){$sErrorMessage=$GLOBALS['xajaxErrorHandlerText'];if(!empty($sErrorMessage)){if(0 < strlen($this->sLogFile)){$fH=@fopen($this->sLogFile,"a");if(NULL!=$fH){fwrite(
  445. $fH,
  446. $this->objLanguageManager->getText('LOGHDR:01')
  447. . strftime("%b %e %Y %I:%M:%S %p")
  448. . $this->objLanguageManager->getText('LOGHDR:02')
  449. . $sErrorMessage
  450. . $this->objLanguageManager->getText('LOGHDR:03')
  451. );fclose($fH);}else{$this->objResponseManager->debug(
  452. $this->objLanguageManager->getText('LOGERR:01')
  453. . $this->sLogFile
  454. );}
  455. }
  456. $this->objResponseManager->debug(
  457. $this->objLanguageManager->getText('LOGMSG:01')
  458. . $sErrorMessage
  459. );}
  460. }
  461. $this->objResponseManager->send();if($this->bErrorHandler)restore_error_handler();if($this->bExitAllowed)exit();}
  462. }
  463. function printJavascript($sJsURI="",$aJsFiles=array()){if(0 < strlen($sJsURI))
  464. $this->configure("javascript URI",$sJsURI);if(0 < count($aJsFiles))
  465. $this->configure("javascript files",$aJsFiles);$this->objPluginManager->generateClientScript();}
  466. function getJavascript($sJsURI='',$aJsFiles=array()){ob_start();$this->printJavascript($sJsURI,$aJsFiles);return ob_get_clean();}
  467. function autoCompressJavascript($sJsFullFilename=NULL,$bAlways=false){$sJsFile='xajax_js/xajax_core.js';if($sJsFullFilename){$realJsFile=$sJsFullFilename;}
  468. else{$realPath=realpath(dirname(dirname(__FILE__)));$realJsFile=$realPath . '/'. $sJsFile;}
  469. if(!file_exists($realJsFile)||true==$bAlways){$srcFile=str_replace('.js','_uncompressed.js',$realJsFile);if(!file_exists($srcFile)){trigger_error(
  470. $this->objLanguageManager->getText('CMPRSJS:RDERR:01')
  471. . dirname($realJsFile)
  472. . $this->objLanguageManager->getText('CMPRSJS:RDERR:02')
  473. ,E_USER_ERROR
  474. );}
  475. require_once(dirname(__FILE__). '/xajaxCompress.inc.php');$javaScript=implode('',file($srcFile));$compressedScript=xajaxCompressFile($javaScript);$fH=@fopen($realJsFile,'w');if(!$fH){trigger_error(
  476. $this->objLanguageManager->getText('CMPRSJS:WTERR:01')
  477. . dirname($realJsFile)
  478. . $this->objLanguageManager->getText('CMPRSJS:WTERR:02')
  479. ,E_USER_ERROR
  480. );}
  481. else{fwrite($fH,$compressedScript);fclose($fH);}
  482. }
  483. }
  484. function _compressSelf($sFolder=null){if(null==$sFolder)
  485. $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)
  486. if('//SkipDebug'==$aFile[$sKey])
  487. ++$nSkip;else if('//EndSkipDebug'==$aFile[$sKey])
  488. --$nSkip;else if(0==$nSkip)
  489. $aParsed[]=$aFile[$sKey];unset($aFile);$compressedScript=xajaxCompressFile(implode('',$aParsed));$sNewPath=$sPath;$fH=@fopen($sNewPath,'w');if(!$fH){trigger_error(
  490. $this->objLanguageManager->getText('CMPRSPHP:WTERR:01')
  491. . $sNewPath
  492. . $this->objLanguageManager->getText('CMPRSPHP:WTERR:02')
  493. ,E_USER_ERROR
  494. );}
  495. else{fwrite($fH,$compressedScript);fclose($fH);}
  496. }
  497. }
  498. }
  499. }
  500. closedir($handle);}
  501. }
  502. function _compile($sFolder=null,$bWriteFile=true){if(null==$sFolder)
  503. $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(
  504. 'xajaxAIO'!=$sName&&
  505. 'legacy'!=$sName&&
  506. 'xajaxCompress'!=$sName
  507. ){if(file_exists($sPath)){$aParsed=array();$aFile=file($sPath);$nSkip=0;foreach(array_keys($aFile)as $sKey)
  508. if('//SkipDebug'==substr($aFile[$sKey],0,11))
  509. ++$nSkip;else if('//EndSkipDebug'==substr($aFile[$sKey],0,14))
  510. --$nSkip;else if('//SkipAIO'==substr($aFile[$sKey],0,9))
  511. ++$nSkip;else if('//EndSkipAIO'==substr($aFile[$sKey],0,12))
  512. --$nSkip;else if('<'.'?php'==substr($aFile[$sKey],0,5)){}
  513. else if('?'.'>'==substr($aFile[$sKey],0,2)){}
  514. else if(0==$nSkip)
  515. $aParsed[]=$aFile[$sKey];unset($aFile);$aOutput[]=xajaxCompressFile(implode('',$aParsed));}
  516. }
  517. }
  518. }
  519. }
  520. closedir($handle);}
  521. if($bWriteFile){$fH=@fopen($sFolder . '/xajaxAIO.inc.php','w');if(!$fH){trigger_error(
  522. $this->objLanguageManager->getText('CMPRSAIO:WTERR:01')
  523. . $sFolder
  524. . $this->objLanguageManager->getText('CMPRSAIO:WTERR:02')
  525. ,E_USER_ERROR
  526. );}
  527. else{fwrite($fH,'<'.'?php ');fwrite($fH,implode('',$aOutput));fclose($fH);}
  528. }
  529. return implode('',$aOutput);}
  530. function _detectURI(){$aURL=array();if(!empty($_SERVER['REQUEST_URI'])){$_SERVER['REQUEST_URI']=str_replace(
  531. array('"',"'",'<','>'),
  532. array('%22','%27','%3C','%3E'),
  533. $_SERVER['REQUEST_URI']
  534. );$aURL=parse_url($_SERVER['REQUEST_URI']);}
  535. if(empty($aURL['scheme'])){if(!empty($_SERVER['HTTP_SCHEME'])){$aURL['scheme']=$_SERVER['HTTP_SCHEME'];}else{$aURL['scheme']=
  536. (!empty($_SERVER['HTTPS'])&&strtolower($_SERVER['HTTPS'])!='off')
  537. ? 'https'
  538. :'http';}
  539. }
  540. 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'];}
  541. }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'];}
  542. }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();}
  543. }
  544. if(empty($aURL['port'])&&!empty($_SERVER['SERVER_PORT'])){$aURL['port']=$_SERVER['SERVER_PORT'];}
  545. if(!empty($aURL['path']))
  546. if(0==strlen(basename($aURL['path'])))
  547. 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']);}
  548. if(isset($sPath['path']))
  549. $aURL['path']=str_replace(array('"',"'",'<','>'),array('%22','%27','%3C','%3E'),$sPath['path']);unset($sPath);}
  550. if(empty($aURL['query'])&&!empty($_SERVER['QUERY_STRING'])){$aURL['query']=$_SERVER['QUERY_STRING'];}
  551. if(!empty($aURL['query'])){$aURL['query']='?'.$aURL['query'];}
  552. $sURL=$aURL['scheme'].'://';if(!empty($aURL['user'])){$sURL.=$aURL['user'];if(!empty($aURL['pass'])){$sURL.=':'.$aURL['pass'];}
  553. $sURL.='@';}
  554. $sURL.=$aURL['host'];if(!empty($aURL['port'])
  555. &&(($aURL['scheme']=='http'&&$aURL['port']!=80)
  556. ||($aURL['scheme']=='https'&&$aURL['port']!=443))){$sURL.=':'.$aURL['port'];}
  557. $sURL.=$aURL['path'].@$aURL['query'];unset($aURL);$aURL=explode("?",$sURL);if(1 < count($aURL)){$aQueries=explode("&",$aURL[1]);foreach($aQueries as $sKey=> $sQuery){if("xjxGenerate"==substr($sQuery,0,11))
  558. unset($aQueries[$sKey]);}
  559. $sQueries=implode("&",$aQueries);$aURL[1]=$sQueries;$sURL=implode("?",$aURL);}
  560. return $sURL;}
  561. function setCharEncoding($sEncoding){$this->configure('characterEncoding',$sEncoding);}
  562. function getCharEncoding(){return $this->getConfiguration('characterEncoding');}
  563. function setFlags($flags){foreach($flags as $name=> $value){$this->configure($name,$value);}
  564. }
  565. function setFlag($name,$value){$this->configure($name,$value);}
  566. function getFlag($name){return $this->getConfiguration($name);}
  567. function setRequestURI($sRequestURI){$this->configure('requestURI',$sRequestURI);}
  568. function getRequestURI(){return $this->getConfiguration('requestURI');}
  569. function setDefaultMode($sDefaultMode){$this->configure('defaultMode',$sDefaultMode);}
  570. function getDefaultMode(){return $this->getConfiguration('defaultMode');}
  571. function setDefaultMethod($sMethod){$this->configure('defaultMethod',$sMethod);}
  572. function getDefaultMethod(){return $this->getConfiguration('defaultMethod');}
  573. function setWrapperPrefix($sPrefix){$this->configure('wrapperPrefix',$sPrefix);}
  574. function getWrapperPrefix(){return $this->getConfiguration('wrapperPrefix');}
  575. function setLogFile($sFilename){$this->configure('logFile',$sFilename);}
  576. function getLogFile(){return $this->getConfiguration('logFile');}
  577. function registerFunction($mFunction,$sIncludeFile=null){$xuf=&new xajaxUserFunction($mFunction,$sIncludeFile);return $this->register(XAJAX_FUNCTION,$xuf);}
  578. function registerCallableObject(&$oObject){$mResult=false;if(0 > version_compare(PHP_VERSION,'5.0'))
  579. eval('$mResult = $this->register(XAJAX_CALLABLE_OBJECT, &$oObject);');else
  580. $mResult=$this->register(XAJAX_CALLABLE_OBJECT,$oObject);return $mResult;}
  581. function registerEvent($sEventName,$mCallback){$this->register(XAJAX_PROCESSING_EVENT,$sEventName,$mCallback);}
  582. }
  583. function xajaxErrorHandler($errno,$errstr,$errfile,$errline){$errorReporting=error_reporting();if(($errno&$errorReporting)==0)return;if($errno==E_NOTICE){$errTypeStr='NOTICE';}
  584. else if($errno==E_WARNING){$errTypeStr='WARNING';}
  585. else if($errno==E_USER_NOTICE){$errTypeStr='USER NOTICE';}
  586. else if($errno==E_USER_WARNING){$errTypeStr='USER WARNING';}
  587. else if($errno==E_USER_ERROR){$errTypeStr='USER FATAL ERROR';}
  588. else if(defined('E_STRICT')&&$errno==E_STRICT){return;}
  589. else{$errTypeStr='UNKNOWN: ' . $errno;}
  590. $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();}
  591. class xajaxResponse{var $aCommands;var $sCharacterEncoding;var $bOutputEntities;var $returnValue;var $objPluginManager;function xajaxResponse(){if(0 < func_num_args()){$objLanguageManager=&xajaxLanguageManager::getInstance();trigger_error(
  592. $objLanguageManager->getText('XJXRSP:EDERR:01')
  593. ,E_USER_ERROR
  594. );}
  595. $this->aCommands=array();$objResponseManager=&xajaxResponseManager::getInstance();$this->sCharacterEncoding=$objResponseManager->getCharacterEncoding();$this->bOutputEntities=$objResponseManager->getOutputEntities();$this->objPluginManager=&xajaxPluginManager::getInstance();}
  596. function setCharacterEncoding($sCharacterEncoding){$this->sCharacterEncoding=$sCharacterEncoding;return $this;}
  597. function setOutputEntities($bOutputEntities){$this->bOutputEntities=(boolean)$bOutputEntities;return $this;}
  598. function&plugin(){$aArgs=func_get_args();$nArgs=func_num_args();if(false==(0 < $nArgs)){$objLanguageManager=&xajaxLanguageManager::getInstance();trigger_error(
  599. $objLanguageManager->getText('XJXRSP:MPERR:01')
  600. ,E_USER_ERROR
  601. );}
  602. $sName=array_shift($aArgs);$objPlugin=&$this->objPluginManager->getPlugin($sName);if(false===$objPlugin){$bReturn=false;return $bReturn;}
  603. $objPlugin->setResponse($this);if(0 < count($aArgs)){$sMethod=array_shift($aArgs);$aFunction=array(&$objPlugin,$sMethod);call_user_func_array($aFunction,$aArgs);}
  604. return $objPlugin;}
  605. function&__get($sPluginName){$objPlugin=&$this->plugin($sPluginName);return $objPlugin;}
  606. function confirmCommands($iCmdNumber,$sMessage){return $this->addCommand(
  607. array(
  608. 'cmd'=>'cc',
  609. 'id'=>$iCmdNumber
  610. ),
  611. $sMessage
  612. );}
  613. function assign($sTarget,$sAttribute,$sData){return $this->addCommand(
  614. array(
  615. 'cmd'=>'as',
  616. 'id'=>$sTarget,
  617. 'prop'=>$sAttribute
  618. ),
  619. $sData
  620. );}
  621. function append($sTarget,$sAttribute,$sData){return $this->addCommand(
  622. array(
  623. 'cmd'=>'ap',
  624. 'id'=>$sTarget,
  625. 'prop'=>$sAttribute
  626. ),
  627. $sData
  628. );}
  629. function prepend($sTarget,$sAttribute,$sData){return $this->addCommand(
  630. array(
  631. 'cmd'=>'pp',
  632. 'id'=>$sTarget,
  633. 'prop'=>$sAttribute
  634. ),
  635. $sData
  636. );}
  637. function replace($sTarget,$sAttribute,$sSearch,$sData){return $this->addCommand(
  638. array(
  639. 'cmd'=>'rp',
  640. 'id'=>$sTarget,
  641. 'prop'=>$sAttribute
  642. ),
  643. array(
  644. 's'=> $sSearch,
  645. 'r'=> $sData
  646. )
  647. );}
  648. function clear($sTarget,$sAttribute){return $this->assign(
  649. $sTarget,
  650. $sAttribute,
  651. ''
  652. );}
  653. function contextAssign($sAttribute,$sData){return $this->addCommand(
  654. array(
  655. 'cmd'=>'c:as',
  656. 'prop'=>$sAttribute
  657. ),
  658. $sData
  659. );}
  660. function contextAppend($sAttribute,$sData){return $this->addCommand(
  661. array(
  662. 'cmd'=>'c:ap',
  663. 'prop'=>$sAttribute
  664. ),
  665. $sData
  666. );}
  667. function contextPrepend($sAttribute,$sData){return $this->addCommand(
  668. array(
  669. 'cmd'=>'c:pp',
  670. 'prop'=>$sAttribute
  671. ),
  672. $sData
  673. );}
  674. function contextClear($sAttribute){return $this->contextAssign(
  675. $sAttribute,
  676. ''
  677. );}
  678. function alert($sMsg){return $this->addCommand(
  679. array(
  680. 'cmd'=>'al'
  681. ),
  682. $sMsg
  683. );}
  684. function debug($sMessage){return $this->addCommand(
  685. array(
  686. 'cmd'=>'dbg'
  687. ),
  688. $sMessage
  689. );}
  690. function redirect($sURL,$iDelay=0){$queryStart=strpos($sURL,'?',strrpos($sURL,'/'));if($queryStart!==FALSE){$queryStart++;$queryEnd=strpos($sURL,'#',$queryStart);if($queryEnd===FALSE)
  691. $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)
  692. $first=false;else
  693. $newQueryPart .='&';$newQueryPart .=rawurlencode($key).'='.rawurlencode($value);}
  694. }else if($_SERVER['QUERY_STRING']){$newQueryPart=rawurlencode($_SERVER['QUERY_STRING']);}
  695. $sURL=str_replace($queryPart,$newQueryPart,$sURL);}
  696. if($iDelay)
  697. $this->script(
  698. 'window.setTimeout("window.location = \''
  699. . $sURL
  700. . '\';",'
  701. .($iDelay*1000)
  702. . ');'
  703. );else
  704. $this->script(
  705. 'window.location = "'
  706. . $sURL
  707. . '";'
  708. );return $this;}
  709. function script($sJS){return $this->addCommand(
  710. array(
  711. 'cmd'=>'js'
  712. ),
  713. $sJS
  714. );}
  715. function call(){$aArgs=func_get_args();$sFunc=array_shift($aArgs);return $this->addCommand(
  716. array(
  717. 'cmd'=>'jc',
  718. 'func'=>$sFunc
  719. ),
  720. $aArgs
  721. );}
  722. function remove($sTarget){return $this->addCommand(
  723. array(
  724. 'cmd'=>'rm',
  725. 'id'=>$sTarget),
  726. ''
  727. );}
  728. function create($sParent,$sTag,$sId,$sType=null){if(false===(null===$sType)){$objLanguageManager=&xajaxLanguageManager::getInstance();trigger_error(
  729. $objLanguageManager->getText('XJXRSP:CPERR:01')
  730. ,E_USER_WARNING
  731. );}
  732. return $this->addCommand(
  733. array(
  734. 'cmd'=>'ce',
  735. 'id'=>$sParent,
  736. 'prop'=>$sId
  737. ),
  738. $sTag
  739. );}
  740. function insert($sBefore,$sTag,$sId){return $this->addCommand(
  741. array(
  742. 'cmd'=>'ie',
  743. 'id'=>$sBefore,
  744. 'prop'=>$sId
  745. ),
  746. $sTag
  747. );}
  748. function insertAfter($sAfter,$sTag,$sId){return $this->addCommand(
  749. array(
  750. 'cmd'=>'ia',
  751. 'id'=>$sAfter,
  752. 'prop'=>$sId
  753. ),
  754. $sTag
  755. );}
  756. function createInput($sParent,$sType,$sName,$sId){return $this->addCommand(
  757. array(
  758. 'cmd'=>'ci',
  759. 'id'=>$sParent,
  760. 'prop'=>$sId,
  761. 'type'=>$sType
  762. ),
  763. $sName
  764. );}
  765. function insertInput($sBefore,$sType,$sName,$sId){return $this->addCommand(
  766. array(
  767. 'cmd'=>'ii',
  768. 'id'=>$sBefore,
  769. 'prop'=>$sId,
  770. 'type'=>$sType
  771. ),
  772. $sName
  773. );}
  774. function insertInputAfter($sAfter,$sType,$sName,$sId){return $this->addCommand(
  775. array(
  776. 'cmd'=>'iia',
  777. 'id'=>$sAfter,
  778. 'prop'=>$sId,
  779. 'type'=>$sType
  780. ),
  781. $sName
  782. );}
  783. function setEvent($sTarget,$sEvent,$sScript){return $this->addCommand(
  784. array(
  785. 'cmd'=>'ev',
  786. 'id'=>$sTarget,
  787. 'prop'=>$sEvent
  788. ),
  789. $sScript
  790. );}
  791. function addEvent($sTarget,$sEvent,$sScript){return $this->setEvent(
  792. $sTarget,
  793. $sEvent,
  794. $sScript
  795. );}
  796. function addHandler($sTarget,$sEvent,$sHandler){return $this->addCommand(
  797. array(
  798. 'cmd'=>'ah',
  799. 'id'=>$sTarget,
  800. 'prop'=>$sEvent
  801. ),
  802. $sHandler
  803. );}
  804. function removeHandler($sTarget,$sEvent,$sHandler){return $this->addCommand(
  805. array(
  806. 'cmd'=>'rh',
  807. 'id'=>$sTarget,
  808. 'prop'=>$sEvent
  809. ),
  810. $sHandler);}
  811. function setFunction($sFunction,$sArgs,$sScript){return $this->addCommand(
  812. array(
  813. 'cmd'=>'sf',
  814. 'func'=>$sFunction,
  815. 'prop'=>$sArgs
  816. ),
  817. $sScript
  818. );}
  819. function wrapFunction($sFunction,$sArgs,$aScripts,$sReturnValueVariable){return $this->addCommand(
  820. array(
  821. 'cmd'=>'wpf',
  822. 'func'=>$sFunction,
  823. 'prop'=>$sArgs,
  824. 'type'=>$sReturnValueVariable
  825. ),
  826. $aScripts
  827. );}
  828. function includeScript($sFileName,$sType=null,$sId=null){$command=array('cmd'=> 'in');if(false===(null===$sType))
  829. $command['type']=$sType;if(false===(null===$sId))
  830. $command['elm_id']=$sId;return $this->addCommand(
  831. $command,
  832. $sFileName
  833. );}
  834. function includeScriptOnce($sFileName,$sType=null,$sId=null){$command=array('cmd'=> 'ino');if(false===(null===$sType))
  835. $command['type']=$sType;if(false===(null===$sId))
  836. $command['elm_id']=$sId;return $this->addCommand(
  837. $command,
  838. $sFileName
  839. );}
  840. function removeScript($sFileName,$sUnload=''){$this->addCommand(
  841. array(
  842. 'cmd'=>'rjs',
  843. 'unld'=>$sUnload
  844. ),
  845. $sFileName
  846. );return $this;}
  847. function includeCSS($sFileName,$sMedia=null){$command=array('cmd'=> 'css');if(false===(null===$sMedia))
  848. $command['media']=$sMedia;return $this->addCommand(
  849. $command,
  850. $sFileName
  851. );}
  852. function removeCSS($sFileName,$sMedia=null){$command=array('cmd'=>'rcss');if(false===(null===$sMedia))
  853. $command['media']=$sMedia;return $this->addCommand(
  854. $command,
  855. $sFileName
  856. );}
  857. function waitForCSS($iTimeout=600){$sData="";$this->addCommand(
  858. array(
  859. 'cmd'=>'wcss',
  860. 'prop'=>$iTimeout
  861. ),
  862. $sData
  863. );return $this;}
  864. function waitFor($script,$tenths){return $this->addCommand(
  865. array(
  866. 'cmd'=>'wf',
  867. 'prop'=>$tenths
  868. ),
  869. $script
  870. );}
  871. function sleep($tenths){$this->addCommand(
  872. array(
  873. 'cmd'=>'s',
  874. 'prop'=>$tenths
  875. ),
  876. ''
  877. );return $this;}
  878. function setReturnValue($value){$this->returnValue=$this->_encodeArray($value);return $this;}
  879. function getContentType(){return 'text/xml';}
  880. function getOutput(){ob_start();$this->_printHeader_XML();$this->_printResponse_XML();return ob_get_clean();}
  881. function printOutput(){$this->_sendHeaders();$this->_printHeader_XML();$this->_printResponse_XML();}
  882. 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");}
  883. $sCharacterSet='';if($this->sCharacterEncoding&&0 < strlen(trim($this->sCharacterEncoding))){$sCharacterSet='; charset="' . trim($this->sCharacterEncoding). '"';}
  884. $sContentType=$this->getContentType();header('content-type: ' . $sContentType . ' ' . $sCharacterSet);}
  885. function getCommandCount(){return count($this->aCommands);}
  886. function loadCommands($mCommands,$bBefore=false){if(is_a($mCommands,'xajaxResponse')){$this->returnValue=$mCommands->returnValue;if($bBefore){$this->aCommands=array_merge($mCommands->aCommands,$this->aCommands);}
  887. else{$this->aCommands=array_merge($this->aCommands,$mCommands->aCommands);}
  888. }
  889. else if(is_array($mCommands)){if($bBefore){$this->aCommands=array_merge($mCommands,$this->aCommands);}
  890. else{$this->aCommands=array_merge($this->aCommands,$mCommands);}
  891. }
  892. else{if(!empty($mCommands)){$objLanguageManager=&xajaxLanguageManager::getInstance();trigger_error(
  893. $objLanguageManager->getText('XJXRSP:LCERR:01')
  894. ,E_USER_ERROR
  895. );}
  896. }
  897. }
  898. function absorb($objResponse){$this->loadCommands($objResponse);}
  899. function addPluginCommand($objPlugin,$aAttributes,$mData){$aAttributes['plg']=$objPlugin->getName();return $this->addCommand($aAttributes,$mData);}
  900. function addCommand($aAttributes,$mData){$aAttributes['data']=$this->_encodeArray($mData);$this->aCommands[]=$aAttributes;return $this;}
  901. 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 '"';}
  902. echo ' ?';echo '>';}
  903. function _printResponse_XML(){echo '<';echo 'xjx>';if(null!==$this->returnValue){echo '<';echo 'xjxrv>';$this->_printArray_XML($this->returnValue);echo '<';echo '/xjxrv>';}
  904. foreach(array_keys($this->aCommands)as $sKey)
  905. $this->_printCommand_XML($this->aCommands[$sKey]);echo '<';echo '/xjx>';}
  906. 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
  907. $mData=&$aAttributes[$sKey];}
  908. }
  909. echo '>';$this->_printArray_XML($mData);echo '<';echo '/cmd>';}
  910. function _printArray_XML(&$mArray){if('object'==gettype($mArray))
  911. $mArray=get_object_vars($mArray);if(false==is_array($mArray)){$this->_printEscapedString_XML($mArray);return;}
  912. echo '<';echo 'xjxobj>';foreach(array_keys($mArray)as $sKey){if(is_array($mArray[$sKey])){echo '<';echo 'e>';foreach(array_keys($mArray[$sKey])as $sInnerKey){if(htmlspecialchars($sInnerKey,ENT_COMPAT,'UTF-8')!=$sInnerKey){$objLanguageManager=&xajaxLanguageManager::getInstance();trigger_error(
  913. $objLanguageManager->getText('XJXRSP:AKERR:01')
  914. ,E_USER_ERROR
  915. );}
  916. if('k'==$sInnerKey||'v'==$sInnerKey){echo '<';echo $sInnerKey;echo '>';$this->_printArray_XML($mArray[$sKey][$sInnerKey]);echo '<';echo '/';echo $sInnerKey;echo '>';}else{$objLanguageManager=&xajaxLanguageManager::getInstance();trigger_error(
  917. $objLanguageManager->getText('XJXRSP:IEAERR:01')
  918. ,E_USER_ERROR
  919. );}
  920. }
  921. echo '<';echo '/e>';}else{$objLanguageManager=&xajaxLanguageManager::getInstance();trigger_error(
  922. $objLanguageManager->getText('XJXRSP:NEAERR:01')
  923. ,E_USER_ERROR
  924. );}
  925. }
  926. echo '<';echo '/xjxobj>';}
  927. function _printEscapedString_XML(&$sData){if(is_null($sData)||false==isset($sData)){echo '*';return;}
  928. if($this->bOutputEntities){if(false===function_exists('mb_convert_encoding')){$objLanguageManager=&xajaxLanguageManager::getInstance();trigger_error(
  929. $objLanguageManager->getText('XJXRSP:MBEERR:01')
  930. ,E_USER_NOTICE
  931. );}
  932. echo call_user_func_array('mb_convert_encoding',array(&$sData,'HTML-ENTITIES',$this->sCharacterEncoding));return;}
  933. $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)
  934. $nCDATA=1;}else
  935. $nCDATA=2;}else
  936. $nCDATA=2;if(0 < $nCDATA){echo '<';echo '![CDATA[';if(is_string($sData)){echo 'S';}else if(is_int($sData)||is_float($sData)){echo 'N';}else if(is_bool($sData)){echo 'B';}
  937. 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)
  938. array_push($aStack,']]]]><','![CDATA[>',$aFragments[$keyFragment]);else
  939. $aStack[]=$aFragments[$keyFragment];++$nStack;}
  940. if(0 < $nOutput)
  941. array_push($aOutput,'<','![]]><','![CDATA[CDATA[',implode('',$aStack));else
  942. $aOutput[]=implode('',$aStack);++$nOutput;}
  943. echo implode('',$aOutput);}else
  944. 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';}
  945. echo $sData;}
  946. }
  947. function _encodeArray(&$mData){if('object'===gettype($mData))
  948. $mData=get_object_vars($mData);if(false===is_array($mData))
  949. return $mData;$aData=array();foreach(array_keys($mData)as $sKey)
  950. $aData[]=array(
  951. 'k'=>$sKey,
  952. 'v'=>$this->_encodeArray($mData[$sKey])
  953. );return $aData;}
  954. }
  955. 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();}
  956. function setCharacterEncoding($sCharacterEncoding){$this->sCharacterEncoding=$sCharacterEncoding;}
  957. function setOutputEntities($bOutputEntities){$this->bOutputEntities=$bOutputEntities;}
  958. function clear(){$this->sOutput='';}
  959. function append($sOutput){$this->sOutput .=$sOutput;}
  960. function absorb($objResponse){if(false==is_a($objResponse,'xajaxCustomResponse')){$objLanguageManager=&xajaxLanguageManager::getInstance();trigger_error(
  961. $objLanguageManager->getText('XJXRSP:MXRTERR')
  962. ,E_USER_ERROR
  963. );}
  964. if($objResponse->getContentType()!=$this->getContentType()){$objLanguageManager=&xajaxLanguageManager::getInstance();trigger_error(
  965. $objLanguageManager->getText('XJXRSP:MXCTERR')
  966. ,E_USER_ERROR
  967. );}
  968. if($objResponse->getCharacterEncoding()!=$this->getCharacterEncoding()){$objLanguageManager=&xajaxLanguageManager::getInstance();trigger_error(
  969. $objLanguageManager->getText('XJXRSP:MXCEERR')
  970. ,E_USER_ERROR
  971. );}
  972. if($objResponse->getOutputEntities()!=$this->getOutputEntities()){$objLanguageManager=&xajaxLanguageManager::getInstance();trigger_error(
  973. $objLanguageManager->getText('XJXRSP:MXOEERR')
  974. ,E_USER_ERROR
  975. );}
  976. $this->sOutput .=$objResponse->getOutput();}
  977. function getContentType(){return $this->sContentType;}
  978. function getCharacterEncoding(){return $this->sCharacterEncoding;}
  979. function getOutputEntities(){return $this->bOutputEntities;}
  980. function getOutput(){return $this->sOutput;}
  981. function printOutput(){$sContentType=$this->sContentType;$sCharacterSet=$this->sCharacterEncoding;header("content-type: {$sContentType}; charset={$sCharacterSet}");echo $this->sOutput;}
  982. }
  983. if(!defined('XAJAX_FUNCTION'))define('XAJAX_FUNCTION','function');class xajaxFunctionPlugin extends xajaxRequestPlugin{var $aFunctions;var $sXajaxPrefix;var $sDefer;var $bDeferScriptGeneration;var $sRequestedFunction;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'];}
  984. 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)
  985. $this->bDeferScriptGeneration=$mValue;else if('deferred'===$mValue)
  986. $this->bDeferScriptGeneration=$mValue;}
  987. }
  988. function register($aArgs){if(1 < count($aArgs)){$sType=$aArgs[0];if(XAJAX_FUNCTION==$sType){$xuf=&$aArgs[1];if(false===is_a($xuf,'xajaxUserFunction'))
  989. $xuf=&new xajaxUserFunction($xuf);if(2 < count($aArgs))
  990. if(is_array($aArgs[2]))
  991. foreach($aArgs[2] as $sName=> $sValue)
  992. $xuf->configure($sName,$sValue);$this->aFunctions[]=&$xuf;return $xuf->generateRequest($this->sXajaxPrefix);}
  993. }
  994. return false;}
  995. function generateClientScript(){if(false===$this->bDeferScriptGeneration||'deferred'===$this->bDeferScriptGeneration){if(0 < count($this->aFunctions)){echo "\n<script type='text/javascript' " . $this->sDefer . "charset='UTF-8'>\n";echo "/* <![CDATA[ */\n";foreach(array_keys($this->aFunctions)as $sKey)
  996. $this->aFunctions[$sKey]->generateClientScript($this->sXajaxPrefix);echo "/* ]]> */\n";echo "</script>\n";}
  997. }
  998. }
  999. function canProcessRequest(){if(NULL==$this->sRequestedFunction)
  1000. return false;return true;}
  1001. function processRequest(){if(NULL==$this->sRequestedFunction)
  1002. 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;}
  1003. }
  1004. return 'Invalid function request received; no request processor found with this name.';}
  1005. }
  1006. $objPluginManager=&xajaxPluginManager::getInstance();$objPluginManager->registerPlugin(new xajaxFunctionPlugin(),100);
  1007. class xajaxCallableObject{var $obj;var $aConfiguration;function xajaxCallableObject(&$obj){$this->obj=&$obj;$this->aConfiguration=array();}
  1008. function getName(){return get_class($this->obj);}
  1009. function configure($sMethod,$sName,$sValue){$sMethod=strtolower($sMethod);if(false==isset($this->aConfiguration[$sMethod]))
  1010. $this->aConfiguration[$sMethod]=array();$this->aConfiguration[$sMethod][$sName]=$sValue;}
  1011. function generateRequests($sXajaxPrefix){$aRequests=array();$sClass=get_class($this->obj);foreach(get_class_methods($this->obj)as $sMethodName){$bInclude=true;if("__call"==$sMethodName)
  1012. $bInclude=false;if($sClass==$sMethodName)
  1013. $bInclude=false;if($bInclude)
  1014. $aRequests[strtolower($sMethodName)]=&
  1015. new xajaxRequest("{$sXajaxPrefix}{$sClass}.{$sMethodName}");}
  1016. return $aRequests;}
  1017. function generateClientScript($sXajaxPrefix){$sClass=get_class($this->obj);echo "{$sXajaxPrefix}{$sClass} = {};\n";foreach(get_class_methods($this->obj)as $sMethodName){$bInclude=true;if(2 < strlen($sMethodName))
  1018. if("__"==substr($sMethodName,0,2))
  1019. $bInclude=false;if($sClass==$sMethodName)
  1020. $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['*']))
  1021. foreach($this->aConfiguration['*'] as $sKey=> $sValue)
  1022. echo "{$sSeparator}{$sKey}: {$sValue}";if(isset($this->aConfiguration[strtolower($sMethodName)]))
  1023. foreach($this->aConfiguration[strtolower($sMethodName)] as $sKey=> $sValue)
  1024. echo "{$sSeparator}{$sKey}: {$sValue}";echo " } ); ";echo "};\n";}
  1025. }
  1026. }
  1027. function isClass($sClass){if(get_class($this->obj)===$sClass)
  1028. return true;return false;}
  1029. function hasMethod($sMethod){return method_exists($this->obj,$sMethod)||method_exists($this->obj,"__call");}
  1030. function call($sMethod,$aArgs){$objResponseManager=&xajaxResponseManager::getInstance();$objResponseManager->append(
  1031. call_user_func_array(
  1032. array(&$this->obj,$sMethod),
  1033. $aArgs
  1034. )
  1035. );}
  1036. }
  1037. class xajaxEvent{var $sName;var $aConfiguration;var $aHandlers;function xajaxEvent($sName){$this->sName=$sName;$this->aConfiguration=array();$this->aHandlers=array();}
  1038. function getName(){return $this->sName;}
  1039. function configure($sName,$mValue){$this->aConfiguration[$sName]=$mValue;}
  1040. function addHandler(&$xuf){$this->aHandlers[]=&$xuf;}
  1041. function generateRequest($sXajaxPrefix,$sEventPrefix){$sEvent=$this->sName;return new xajaxRequest("{$sXajaxPrefix}{$sEventPrefix}{$sEvent}");}
  1042. function generateClientScript($sXajaxPrefix,$sEventPrefix){$sMode='';$sMethod='';if(isset($this->aConfiguration['mode']))
  1043. $sMode=$this->aConfiguration['mode'];if(isset($this->aConfiguration['method']))
  1044. $sMethod=$this->aConfiguration['method'];if(0 < strlen($sMode))
  1045. $sMode=", mode: '{$sMode}'";if(0 < strlen($sMethod))
  1046. $sMethod=", method: '{$sMethod}'";$sEvent=$this->sName;echo "{$sXajaxPrefix}{$sEventPrefix}{$sEvent} = function() { return xajax.request( { xjxevt: '{$sEvent}' }, { parameters: arguments{$sMode}{$sMethod} } ); };\n";}
  1047. function fire($aArgs){$objResponseManager=&xajaxResponseManager::getInstance();foreach(array_keys($this->aHandlers)as $sKey)
  1048. $this->aHandlers[$sKey]->call($aArgs);}
  1049. }
  1050. class xajaxUserFunction{var $sAlias;var $uf;var $sInclude;var $aConfiguration;function xajaxUserFunction($uf,$sInclude=NULL,$aConfiguration=array()){$this->sAlias='';$this->uf=&$uf;$this->sInclude=$sInclude;$this->aConfiguration=array();foreach($aConfiguration as $sKey=> $sValue)
  1051. $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);}
  1052. }
  1053. function getName(){if(is_array($this->uf))
  1054. return $this->uf[1];return $this->uf;}
  1055. function configure($sName,$sValue){if('alias'==$sName)
  1056. $this->sAlias=$sValue;else
  1057. $this->aConfiguration[$sName]=$sValue;}
  1058. function generateRequest($sXajaxPrefix){$sAlias=$this->getName();if(0 < strlen($this->sAlias))
  1059. $sAlias=$this->sAlias;return new xajaxRequest("{$sXajaxPrefix}{$sAlias}");}
  1060. function generateClientScript($sXajaxPrefix){$sFunction=$this->getName();$sAlias=$sFunction;if(0 < strlen($this->sAlias))
  1061. $sAlias=$this->sAlias;echo "{$sXajaxPrefix}{$sAlias} = function() { ";echo "return xajax.request( ";echo "{ xjxfun: '{$sFunction}' }, ";echo "{ parameters: arguments";$sSeparator=", ";foreach($this->aConfiguration as $sKey=> $sValue)
  1062. echo "{$sSeparator}{$sKey}: {$sValue}";echo " } ); ";echo "};\n";}
  1063. function call($aArgs=array()){$objResponseManager=&xajaxResponseManager::getInstance();if(NULL!=$this->sInclude){ob_start();require_once $this->sInclude;$sOutput=ob_get_clean();}
  1064. $mFunction=$this->uf;$objResponseManager->append(call_user_func_array($mFunction,$aArgs));}
  1065. }
  1066. if(!defined('XAJAX_EVENT'))define('XAJAX_EVENT','xajax event');if(!defined('XAJAX_EVENT_HANDLER'))define('XAJAX_EVENT_HANDLER','xajax event handler');class xajaxEventPlugin extends xajaxRequestPlugin{var $aEvents;var $sXajaxPrefix;var $sEventPrefix;var $sDefer;var $bDeferScriptGeneration;var $sRequestedEvent;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'];}
  1067. 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)
  1068. $this->bDeferScriptGeneration=$mValue;else if('deferred'===$mValue)
  1069. $this->bDeferScriptGeneration=$mValue;}
  1070. }
  1071. 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))
  1072. if(is_array($aArgs[2]))
  1073. foreach($aArgs[2] as $sKey=> $sValue)
  1074. $xe->configure($sKey,$sValue);$this->aEvents[$sEvent]=&$xe;return $xe->generateRequest($this->sXajaxPrefix,$this->sEventPrefix);}
  1075. }
  1076. 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'))
  1077. $xuf=&new xajaxUserFunction($xuf);$objEvent=&$this->aEvents[$sEvent];$objEvent->addHandler($xuf);return true;}
  1078. }
  1079. }
  1080. }
  1081. return false;}
  1082. function generateClientScript(){if(false===$this->bDeferScriptGeneration||'deferred'===$this->bDeferScriptGeneration){if(0 < count($this->aEvents)){echo "\n<script type='text/javascript' ";echo $this->sDefer;echo "charset='UTF-8'>\n";echo "/* <![CDATA[ */\n";foreach(array_keys($this->aEvents)as $sKey)
  1083. $this->aEvents[$sKey]->generateClientScript($this->sXajaxPrefix,$this->sEventPrefix);echo "/* ]]> */\n";echo "</script>\n";}
  1084. }
  1085. }
  1086. function canProcessRequest(){if(NULL==$this->sRequestedEvent)
  1087. return false;return true;}
  1088. function processRequest(){if(NULL==$this->sRequestedEvent)
  1089. 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;}
  1090. }
  1091. return 'Invalid event request received; no event was registered with this name.';}
  1092. }
  1093. $objPluginManager=&xajaxPluginManager::getInstance();$objPluginManager->registerPlugin(new xajaxEventPlugin(),103);
  1094. 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';$this->bDebug=false;$this->bVerboseDebug=false;$this->nScriptLoadTimeout=2000;$this->bUseUncompressedScripts=false;$this->bDeferScriptGeneration=false;$this->sLanguage=null;$this->nResponseQueueSize=null;}
  1095. 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)
  1096. $this->sDefaultMode=$mValue;}else if("defaultMethod"==$sName){if("POST"==$mValue||"GET"==$mValue)
  1097. $this->sDefaultMethod=$mValue;}else if("debug"==$sName){if(true===$mValue||false===$mValue)
  1098. $this->bDebug=$mValue;}else if("verboseDebug"==$sName){if(true===$mValue||false===$mValue)
  1099. $this->bVerboseDebug=$mValue;}else if("scriptLoadTimeout"==$sName){$this->nScriptLoadTimeout=$mValue;}else if("useUncompressedScripts"==$sName){if(true===$mValue||false===$mValue)
  1100. $this->bUseUncompressedScripts=$mValue;}else if('deferScriptGeneration'==$sName){if(true===$mValue||false===$mValue)
  1101. $this->bDeferScriptGeneration=$mValue;else if('deferred'==$mValue)
  1102. $this->bDeferScriptGeneration=$mValue;}else if('language'==$sName){$this->sLanguage=$mValue;}else if('responseQueueSize'==$sName){$this->nResponseQueueSize=$mValue;}
  1103. }
  1104. function generateClientScript(){if(false===$this->bDeferScriptGeneration){$this->printJavascriptConfig();$this->printJavascriptInclude();}
  1105. else if(true===$this->bDeferScriptGeneration){$this->printJavascriptInclude();}
  1106. else if('deferred'==$this->bDeferScriptGeneration){$this->printJavascriptConfig();}
  1107. }
  1108. function getJavascriptConfig(){ob_start();$this->printJavascriptConfig();return ob_get_clean();}
  1109. 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 ';';}
  1110. echo $sCrLf;echo '/* ]]> */';echo $sCrLf;echo '<';echo '/script>';echo $sCrLf;}
  1111. function getJavascriptInclude(){ob_start();$this->printJavascriptInclude();return ob_get_clean();}
  1112. 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)
  1113. $aJsFiles[]=array($this->_getScriptFilename('xajax_js/xajax_debug.js'),'xajax.debug');if(true===$this->bVerboseDebug)
  1114. $aJsFiles[]=array($this->_getScriptFilename('xajax_js/xajax_verbose.js'),'xajax.debug.verbose');if(null!==$this->sLanguage)
  1115. $aJsFiles[]=array($this->_getScriptFilename('xajax_js/xajax_lang_' . $this->sLanguage . '.js'),'xajax');}
  1116. if($sJsURI!=''&&substr($sJsURI,-1)!='/')
  1117. $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;}
  1118. 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;}
  1119. }
  1120. }
  1121. function _getScriptFilename($sFilename){if($this->bUseUncompressedScripts){return str_replace('.js','_uncompressed.js',$sFilename);}
  1122. return $sFilename;}
  1123. }
  1124. $objPluginManager=&xajaxPluginManager::getInstance();$objPluginManager->registerPlugin(new xajaxIncludeClientScriptPlugin(),99);
  1125. if(!defined('XAJAX_CALLABLE_OBJECT'))define('XAJAX_CALLABLE_OBJECT','callable object');class xajaxCallableObjectPlugin extends xajaxRequestPlugin{var $aCallableObjects;var $sXajaxPrefix;var $sDefer;var $bDeferScriptGeneration;var $sRequestedClass;var $sRequestedMethod;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'];}
  1126. 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)
  1127. $this->bDeferScriptGeneration=$mValue;else if('deferred'===$mValue)
  1128. $this->bDeferScriptGeneration=$mValue;}
  1129. }
  1130. function register($aArgs){if(1 < count($aArgs)){$sType=$aArgs[0];if(XAJAX_CALLABLE_OBJECT==$sType){$xco=&$aArgs[1];if(false===is_a($xco,'xajaxCallableObject'))
  1131. $xco=&new xajaxCallableObject($xco);if(2 < count($aArgs))
  1132. if(is_array($aArgs[2]))
  1133. foreach($aArgs[2] as $sKey=> $aValue)
  1134. foreach($aValue as $sName=> $sValue)
  1135. $xco->configure($sKey,$sName,$sValue);$this->aCallableObjects[]=&$xco;return $xco->generateRequests($this->sXajaxPrefix);}
  1136. }
  1137. return false;}
  1138. 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)
  1139. $this->aCallableObjects[$sKey]->generateClientScript($this->sXajaxPrefix);echo '/* ]]> */';echo $sCrLf;echo '<';echo '/script>';echo $sCrLf;}
  1140. }
  1141. }
  1142. function canProcessRequest(){if(NULL==$this->sRequestedClass)
  1143. return false;if(NULL==$this->sRequestedMethod)
  1144. return false;return true;}
  1145. function processRequest(){if(NULL==$this->sRequestedClass)
  1146. return false;if(NULL==$this->sRequestedMethod)
  1147. 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;}
  1148. }
  1149. }
  1150. return 'Invalid request for a callable object.';}
  1151. }
  1152. $objPluginManager=&xajaxPluginManager::getInstance();$objPluginManager->registerPlugin(new xajaxCallableObjectPlugin(),102);
  1153. class xajaxScriptPlugin extends xajaxRequestPlugin{var $sRequest;var $sHash;var $sRequestURI;var $bDeferScriptGeneration;var $bValidateHash;var $bWorking;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'];}
  1154. if(isset($_GET['xjxGenerateStyle'])){$this->sRequest='style';$this->sHash=$_GET['xjxGenerateStyle'];}
  1155. }
  1156. function configure($sName,$mValue){if('requestURI'==$sName){$this->sRequestURI=$mValue;}else if('deferScriptGeneration'==$sName){if(true===$mValue||false===$mValue)
  1157. $this->bDeferScriptGeneration=$mValue;}else if('deferScriptValidateHash'==$sName){if(true===$mValue||false===$mValue)
  1158. $this->bValidateHash=$mValue;}
  1159. }
  1160. function generateClientScript(){if($this->bWorking)
  1161. return;if(true===$this->bDeferScriptGeneration){$this->bWorking=true;$sQueryBase='?';if(0 < strpos($this->sRequestURI,'?'))
  1162. $sQueryBase='&';$aScripts=$this->_getSections('script');if(0 < count($aScripts)){$sHash=md5(implode($aScripts));$sQuery=$sQueryBase . "xjxGenerateJavascript=" . $sHash;echo "\n<script type='text/javascript' src='" . $this->sRequestURI . $sQuery . "' charset='UTF-8'></script>\n";}
  1163. $aStyles=$this->_getSections('style');if(0 < count($aStyles)){$sHash=md5(implode($aStyles));$sQuery=$sQueryBase . "xjxGenerateStyle=" . $sHash;echo "\n<link href='" . $this->sRequestURI . $sQuery . "' rel='Stylesheet' />\n";}
  1164. $this->bWorking=false;}
  1165. }
  1166. function canProcessRequest(){return(''!=$this->sRequest);}
  1167. function&_getSections($sType){$objPluginManager=&xajaxPluginManager::getInstance();$objPluginManager->configure('deferScriptGeneration','deferred');$aSections=array();ob_start();$objPluginManager->generateClientScript();$sScript=ob_get_clean();$aParts=explode('</' . $sType . '>',$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))
  1168. $aSections[]=$sPart;}
  1169. }
  1170. }
  1171. $objPluginManager->configure('deferScriptGeneration',$this->bDeferScriptGeneration);return $aSections;}
  1172. function processRequest(){if($this->canProcessRequest()){$aSections=&$this->_getSections($this->sRequest);$sHash=md5(implode($aSections));if(false==$this->bValidateHash||$sHash==$this->sHash){$sType='text/javascript';if('style'==$this->sRequest)
  1173. $sType='text/css';$objResponse=&new xajaxCustomResponse($sType);foreach($aSections as $sSection)
  1174. $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;}
  1175. return 'Invalid script or style request.';trigger_error('Hash mismatch: ' . $this->sRequest . ': ' . $sHash . ' <==> ' . $this->sHash,E_USER_ERROR);}
  1176. }
  1177. }
  1178. $objPluginManager=&xajaxPluginManager::getInstance();$objPluginManager->registerPlugin(new xajaxScriptPlugin(),9999);
  1179. if(!defined('XAJAX_FORM_VALUES'))define('XAJAX_FORM_VALUES','get form values');if(!defined('XAJAX_INPUT_VALUE'))define('XAJAX_INPUT_VALUE','get input value');if(!defined('XAJAX_CHECKED_VALUE'))define('XAJAX_CHECKED_VALUE','get checked value');if(!defined('XAJAX_ELEMENT_INNERHTML'))define('XAJAX_ELEMENT_INNERHTML','get element innerHTML');if(!defined('XAJAX_QUOTED_VALUE'))define('XAJAX_QUOTED_VALUE','quoted value');if(!defined('XAJAX_JS_VALUE'))define('XAJAX_JS_VALUE','unquoted value');class xajaxRequest{var $sName;var $sQuoteCharacter;var $aParameters;function xajaxRequest($sName){$this->aParameters=array();$this->sQuoteCharacter='"';$this->sName=$sName;}
  1180. function useSingleQuote(){$this->sQuoteCharacter="'";}
  1181. function useDoubleQuote(){$this->sQuoteCharacter='"';}
  1182. function clearParameters(){$this->aParameters=array();}
  1183. function addParameter(){$aArgs=func_get_args();if(1 < count($aArgs))
  1184. $this->setParameter(
  1185. count($this->aParameters),
  1186. $aArgs[0],
  1187. $aArgs[1]);}
  1188. 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]=
  1189. "xajax.getFormValues("
  1190. . $this->sQuoteCharacter
  1191. . $sFormID
  1192. . $this->sQuoteCharacter
  1193. . ")";}
  1194. else if(XAJAX_INPUT_VALUE==$sType){$sInputID=$aArgs[2];$this->aParameters[$nParameter]=
  1195. "xajax.$("
  1196. . $this->sQuoteCharacter
  1197. . $sInputID
  1198. . $this->sQuoteCharacter
  1199. . ").value";}
  1200. else if(XAJAX_CHECKED_VALUE==$sType){$sCheckedID=$aArgs[2];$this->aParameters[$nParameter]=
  1201. "xajax.$("
  1202. . $this->sQuoteCharacter
  1203. . $sCheckedID
  1204. . $this->sQuoteCharacter
  1205. . ").checked";}
  1206. else if(XAJAX_ELEMENT_INNERHTML==$sType){$sElementID=$aArgs[2];$this->aParameters[$nParameter]=
  1207. "xajax.$("
  1208. . $this->sQuoteCharacter
  1209. . $sElementID
  1210. . $this->sQuoteCharacter
  1211. . ").innerHTML";}
  1212. else if(XAJAX_QUOTED_VALUE==$sType){$sValue=$aArgs[2];$this->aParameters[$nParameter]=
  1213. $this->sQuoteCharacter
  1214. . $sValue
  1215. . $this->sQuoteCharacter;}
  1216. else if(XAJAX_JS_VALUE==$sType){$sValue=$aArgs[2];$this->aParameters[$nParameter]=$sValue;}
  1217. }
  1218. }
  1219. function getScript(){ob_start();$this->printScript();return ob_get_clean();}
  1220. function printScript(){echo $this->sName;echo '(';$sSeparator='';foreach($this->aParameters as $sParameter){echo $sSeparator;echo $sParameter;$sSeparator=', ';}
  1221. echo ')';}
  1222. }
  1223. class xajaxCustomRequest extends xajaxRequest{var $aVariables;var $sScript;function xajaxCustomRequest($sScript){$this->aVariables=array();$this->sScript=$sScript;}
  1224. function clearVariables(){$this->aVariables=array();}
  1225. function setVariable($sName,$sValue){$this->aVariables[$sName]=$sValue;}
  1226. function printScript(){$sScript=$this->sScript;foreach($this->aVariables as $sKey=> $sValue)
  1227. $sScript=str_replace($sKey,$sValue,$sScript);echo $sScript;}
  1228. }