<?php
+/**********************************************************************
+ Copyright (C) FrontAccounting, LLC.
+ Released under the terms of the GNU General Public License, GPL,
+ as published by the Free Software Foundation, either version 3
+ of the License, or (at your option) any later version.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the License here <http://www.gnu.org/licenses/gpl-3.0.html>.
+***********************************************************************/
require_once($path_to_root. "/includes/JsHttpRequest.php");
class Ajax extends JsHttpRequest {
var $aCommands = array();
var $triggers = array();
- function Ajax()
+ function __construct()
{
- $this->JsHttpRequest($_SESSION['language']->encoding);
+ parent::__construct(@$_SESSION['language']->encoding);
}
//
// This function is used in ctrl routines to activate
// update of ajaxified html element selected by given name/id.
//
function activate($trigname) {
-// if (in_ajax())
-// display_error('Activate '. $trigger);
+ if (in_ajax()) {
$this->triggers[$trigname] = true;
+ }
}
//
// Javascript clientside redirection.
//
function redirect($url) {
if(in_ajax()) {
- $this->_addCommand(true, array('n'=>'rd'),$url);
- $this->run();
+ $this->_addCommand(true, array('n'=>'rd'), absolute_url($url));
+ $this->run();
}
}
//
+ // Popup window (target=_blank)
+ //
+ function popup($url) {
+ $this->_addCommand(true, array('n'=>'pu'), absolute_url($url));
+ }
+ //
// Adds an executable Javascript code.
//
function addScript($trigger, $sJS)
return $this;
}
//
+ // Set current focus.
+ //
+ function addFocus($trigger, $sTarget)
+ {
+ $this->_addCommand($trigger, array('n'=>'fc'),$sTarget);
+ return $this;
+ }
+ //
// Internal procedure adding command to response.
//
function _addCommand($trigger, $aAttributes, $mData)
{
- if ($this->isActive() && ($trigger !== false)) {
-// display_error('adding '.$trigger.':'.htmlentities($mData));
+ if ($this->isActive() && ($trigger !== false)) {
- $aAttributes['why'] = $trigger;
- $aAttributes['data'] = $mData;
- $this->aCommands[] = $aAttributes;
- }
+ $aAttributes['why'] = $trigger;
+ $aAttributes['data'] = $mData;
+ $this->aCommands[] = $aAttributes;
+ }
}
- /*
- * Register binds function with ajax call parameter
-
- function register($trigger, $function)
+
+ function run()
{
- if (isset($_REQUEST[$trigger])) {
- $function(&$this);
- }
- }
- */
- function run() {
-
if (!$this->isActive()) return;
-// $this->addScript(true, "setFocus('".$_POST['_focus']."');");
-
+
// remove not active commands
foreach ($this->aCommands as $idx => $com) {
- if ($com['why'] !== true && !isset($this->triggers[$com['why']]))
- unset($this->aCommands[$idx]);
-
+// If we should reload whole page content ignore all commands but the update.
+// This is page repost equivalent, although header and footer are not reloaded.
+ if ($com['why'] !== true && !isset($this->triggers[$com['why']])) {
+ unset($this->aCommands[$idx]);
+ }
+ elseif($com['n'] == 'up' && $com['t'] == '_page_body') {
+ $cmds = array($com);
+ foreach( $this->aCommands as $k=> $cmd) {
+ if ($cmd['n'] == 'fc' || $cmd['n'] == 'js') { // save focus
+ $cmds[] = $cmd; //break;
+ }
+ }
+ $this->aCommands = $cmds;
+ break;
+ }
}
-
$GLOBALS['_RESULT'] = $this->aCommands;
-// exit();
}
}
return $Ajax->isActive();
}
-?>
+// Returns absolute path of relative $url. To be used in ajax calls
+// for proper redirection from any referer page.
+//
+function absolute_url($url)
+{
+ return strpos($url, '..')===0 ? dirname($_SERVER['PHP_SELF']).'/'.$url : $url;
+}