Fixed kbd acess issue after AltTab.
[fa-stable.git] / js / utils.js
index dcc0c8d2823210fa29518a633319e88eefb3b9c7..98733d667d84f2542f72b59f3d5f1f1e4d99b23d 100644 (file)
@@ -1,3 +1,13 @@
+/**********************************************************************
+    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>.
+***********************************************************************/
 //
 //     JsHttpRequest class extensions.
 //
 //             request is directed to current location 
 // 
     JsHttpRequest.request= function(trigger, form) {
-
-               
+               var mark = document.getElementById('ajaxmark');
+               if(mark) mark.style.visibility = 'visible';
+               if (trigger.tagName=='A') {
+                       var content = {};
+                       var upload = 0;
+                       var url = trigger.href;
+                       if (trigger.id) content[trigger.id] = 1;
+               } else {
                var submitObj = typeof(trigger) == "string" ? 
                        document.getElementsByName(trigger)[0] : trigger;
                
                form = form || (submitObj && submitObj.form);
 
+               var upload = form && form.enctype=='multipart/form-data';
+               
                var url = form ? form.action : 
                  window.location.toString();
 
-               if (!form) url = url.substring(0, url.indexOf('?'));
+               var content = this.formInputs(trigger, form, upload);
 
-               var values = this.formValues(trigger, form);
+               if (!form) url = url.substring(0, url.indexOf('?'));
+               
                if (!submitObj) 
-                       values[trigger] = 1;
-               // this is to avoid caching problems
-               values['_random'] = Math.random()*1234567;
+                       content[trigger] = 1;
+                       
+               }
+                       // this is to avoid caching problems
+               content['_random'] = Math.random()*1234567;
+
         JsHttpRequest.query(
-            'POST '+url, // backend
-               values,
+            (upload ? "form." : "")+"POST "+url, // force form loader
+               content,
             // Function is called when an answer arrives. 
            function(result, errors) {
                 // Write the answer.
+                       var newwin = 0;
                if (result) {
                          for(var i in result ) { 
                          atom = result[i];
                  if(cmd=='as') {
                                  eval("objElement.setAttribute('"+property+"',"+data+");");
                          } else if(cmd=='up') {
-//                             if(!objElement) debug('No element "'+id+'"');
+//                             if(!objElement) alert('No element "'+id+'"');
+                               if(objElement) {
                            if (objElement.tagName == 'INPUT' || objElement.tagName == 'TEXTAREA')
                                  objElement.value = data;
                            else
                                  objElement.innerHTML = data; // selector, div, span etc
+                               }
                          } else if(cmd=='di') { // disable/enable element
                                  objElement.disabled = data;
                          } else if(cmd=='fc') { // set focus
@@ -59,6 +84,9 @@
                                  eval(data);
                          } else if(cmd=='rd') {        // client-side redirection
                                  window.location = data;
+                         } else if(cmd=='pu') {        // pop-up
+                                 newwin = 1;
+                                 window.open(data,'REP_WINDOW','toolbar=no,scrollbar=no,resizable=yes,menubar=no');
                          } else {
                                  errors = errors+'<br>Unknown ajax function: '+cmd;
                        }
 
         // Write errors to the debug div.
                  document.getElementById('msgbox').innerHTML = errors;
+                 var mark = document.getElementById('ajaxmark');
+                 if(mark) mark.style.visibility = 'hidden';
 
                  Behaviour.apply();
+
                  if (errors.length>0)
                        window.scrollTo(0,0);
                        //document.getElementById('msgbox').scrollIntoView(true);
          // Restore focus if we've just lost focus because of DOM element refresh
-                 setFocus();
+                       if(!newwin) { 
+                               setFocus();
+                       }
                }
             },
             false  // do not disable caching
         );
     }
-       // returns input field values submitted when form button 'name' is pressed
-       //
-       JsHttpRequest.formValues = function(inp, objForm)
+       // collect all form input values plus inp trigger value
+       JsHttpRequest.formInputs = function(inp, objForm, upload)
        {
                var submitObj = inp;
                var q = {};
-               
 
                if (typeof(inp) == "string")
                        submitObj = document.getElementsByName(inp)[0];
                        for( var i=0; i < formElements.length; i++)
                        {
                          var el = formElements[i];
+                         var name = el.name;
                                if (!el.name) continue;
+                               if(upload) { // for form containing file inputs collect all 
+                                       // form elements and add value of trigger submit button
+                                       // (internally form is submitted via form.submit() not button click())
+                                       q[name] = submitObj.type=='submit' && el==submitObj ? el.value : el;
+                                       continue;
+                               }
                                if (el.type )
                                  if( 
                                  ((el.type == 'radio' || el.type == 'checkbox') && el.checked == false)
                                        continue;
                                if (el.disabled && el.disabled == true)
                                        continue;
-                               var name = el.name;
                                if (name)
                                {
                                        if(el.type=='select-multiple')
@@ -164,8 +201,8 @@ function get_amount(doc, label) {
            else
                var val = document.getElementsByName(doc)[0].value;
                val = val.replace(new RegExp('\\'+user.ts, 'g'),'');
-               val = val.replace(new RegExp('\\'+user.ds, 'g'),'.');
-               return 1*val;
+               val = +val.replace(new RegExp('\\'+user.ds, 'g'),'.');
+               return isNaN(val) ? 0 : val;
 }
 
 function goBack() {
@@ -176,7 +213,11 @@ function goBack() {
 }
 
 function setFocus(name, byId) {
-
+  if(document.location.pathname.indexOf('index.php') != -1) {
+       // this is application menu page - set focus on first link
+       // var el = document.getElementById('msgbox');
+       // TODO find first link after msgbox and set focus
+  }
   if(!name) {
        if (_focus)     
                name = _focus;  // last focus set in onfocus handlers