Merged changes in main branch up to v.2.1.2
[fa-stable.git] / includes / ajax.inc
index ab57b30b8a36acee153e2f027f752dce56c629ab..a8a6981c8553e43c3dda82892094ddebea097e70 100644 (file)
@@ -1,4 +1,14 @@
 <?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 {
@@ -15,9 +25,9 @@ class Ajax extends JsHttpRequest {
        //      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.
@@ -25,11 +35,17 @@ class Ajax extends JsHttpRequest {
        //
        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)
@@ -70,6 +86,14 @@ class Ajax extends JsHttpRequest {
                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)
@@ -95,15 +119,29 @@ class Ajax extends JsHttpRequest {
        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']]))
+// 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]);
-
+//                     display_error('unset '.$com['t']);
+                 }
+                 else
+                 if($com['n'] == 'up' && $com['t'] == '_page_body') {
+                         $cmds = array($com);
+                         foreach( $this->aCommands as $k=> $cmd) {
+                               if ($cmd['n'] == 'fc') {        // save focus
+                                       $cmds[] = $cmd; break;
+                               }
+                         }
+                         $this->aCommands = $cmds;
+                         break;
+                 }
                }
-
+//             display_error('Activate:'.htmlentities(print_r($this->triggers, true)));
+//             display_error('Commands :'.htmlentities(print_r($this->aCommands, true)));
            $GLOBALS['_RESULT'] = $this->aCommands;
 //         exit();
        }
@@ -114,4 +152,11 @@ function in_ajax() {
     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;
+}
 ?>