Fixed get_post() support for numeric fields.
[fa-stable.git] / js / utils.js
index 25b6e19a70a59b23611ffb509e581bfd6624fca2..08334e2fb7a225d8357150edf30aa944826acb49 100644 (file)
@@ -1,13 +1,28 @@
 /**********************************************************************
     Copyright (C) FrontAccounting, LLC.
 /**********************************************************************
     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 
+       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
        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.  
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
     See the License here <http://www.gnu.org/licenses/gpl-3.0.html>.
 ***********************************************************************/
     See the License here <http://www.gnu.org/licenses/gpl-3.0.html>.
 ***********************************************************************/
+function set_mark(img) {
+       var box = document.getElementById('ajaxmark');
+       if(box) {
+               if(img) box.src = user.theme+'images/'+ img;
+               box.style.visibility = img ? 'visible' : 'hidden';
+       }
+}
+
+function disp_msg(msg, cl) {
+       var box = document.getElementById('msgbox');
+       box.innerHTML= "<div class='"+(cl || 'err_msg')+"'>"+ msg+'</div>';
+//     box.style.display = msg=='' ? 'none':'block';
+    if (msg!='') window.scrollTo(0,element_pos(box).y-10);
+}
+
 //
 //     JsHttpRequest class extensions.
 //
 //
 //     JsHttpRequest class extensions.
 //
 //     - input object - all form values are also submited
 //  - arbitrary string - POST var trigger with value 1 is added to request;
 //             if form parameter exists also form values are submited, otherwise
 //     - input object - all form values are also submited
 //  - arbitrary string - POST var trigger with value 1 is added to request;
 //             if form parameter exists also form values are submited, otherwise
-//             request is directed to current location 
-// 
-    JsHttpRequest.request= function(trigger, form) {
-               var mark = document.getElementById('ajaxmark');
-               if(mark) mark.style.visibility = 'visible';
+//             request is directed to current location
+//
+JsHttpRequest.request= function(trigger, form, tout) {
+//     if (trigger.type=='submit' && !validate(trigger)) return false;
+       tout = tout || 10000;   // default timeout value
+       document.getElementById('msgbox').innerHTML='';
+       set_mark(tout>10000 ? 'progressbar.gif' : 'ajax-loader.gif');
+       JsHttpRequest._request(trigger, form, tout, 0);
+};
+
+JsHttpRequest._request = function(trigger, form, tout, retry) {
                if (trigger.tagName=='A') {
                        var content = {};
                        var upload = 0;
                        var url = trigger.href;
                        if (trigger.id) content[trigger.id] = 1;
                } else {
                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" ? 
+               var submitObj = typeof(trigger) == "string" ?
                        document.getElementsByName(trigger)[0] : trigger;
                        document.getElementsByName(trigger)[0] : trigger;
-               
+
                form = form || (submitObj && submitObj.form);
 
                var upload = form && form.enctype=='multipart/form-data';
                form = form || (submitObj && submitObj.form);
 
                var upload = form && form.enctype=='multipart/form-data';
-               
-               var url = form ? form.action : 
+
+               var url = form ? form.getAttribute('action') :
                  window.location.toString();
 
                var content = this.formInputs(trigger, form, upload);
 
                if (!form) url = url.substring(0, url.indexOf('?'));
                  window.location.toString();
 
                var content = this.formInputs(trigger, form, upload);
 
                if (!form) url = url.substring(0, url.indexOf('?'));
-               
-               if (!submitObj) 
+
+               if (!submitObj) {
                        content[trigger] = 1;
                        content[trigger] = 1;
-                       
+                       }
                }
                        // this is to avoid caching problems
                content['_random'] = Math.random()*1234567;
 
                }
                        // this is to avoid caching problems
                content['_random'] = Math.random()*1234567;
 
+               var tcheck = setTimeout(
+                       function() {
+                               for(var id in JsHttpRequest.PENDING)  {
+                                       var call = JsHttpRequest.PENDING[id];
+                                       if (call != false) {
+                                       if (call._ldObj.xr) // needed for gecko
+                                               call._ldObj.xr.onreadystatechange = function(){};
+                                       call.abort(); // why this doesn't kill request in firebug?
+//                                             call._ldObj.xr.abort();
+                                               delete JsHttpRequest.PENDING[id];
+                                       }
+                               }
+                               set_mark(retry ? 'ajax-loader2.gif':'warning.png' );
+                               if(retry)
+                                       JsHttpRequest._request(trigger, form, tout, retry-1);
+                       }, tout );
+
         JsHttpRequest.query(
             (upload ? "form." : "")+"POST "+url, // force form loader
                content,
         JsHttpRequest.query(
             (upload ? "form." : "")+"POST "+url, // force form loader
                content,
-            // Function is called when an answer arrives. 
+            // Function is called when an answer arrives.
            function(result, errors) {
                 // Write the answer.
                        var newwin = 0;
                if (result) {
            function(result, errors) {
                 // Write the answer.
                        var newwin = 0;
                if (result) {
-                         for(var i in result ) { 
+                         for(var i in result ) {
                          atom = result[i];
                          cmd = atom['n'];
                          property = atom['p'];
                          atom = result[i];
                          cmd = atom['n'];
                          property = atom['p'];
                        // seek element by id if there is no elemnt with given name
                          objElement = document.getElementsByName(id)[0] || document.getElementById(id);
                  if(cmd=='as') {
                        // seek element by id if there is no elemnt with given name
                          objElement = document.getElementsByName(id)[0] || document.getElementById(id);
                  if(cmd=='as') {
-                                 eval("objElement.setAttribute('"+property+"',"+data+");");
+                                 eval("objElement.setAttribute('"+property+"','"+data+"');");
                          } else if(cmd=='up') {
 //                             if(!objElement) alert('No element "'+id+'"');
                                if(objElement) {
                          } else if(cmd=='up') {
 //                             if(!objElement) alert('No element "'+id+'"');
                                if(objElement) {
                          } else if(cmd=='fc') { // set focus
                                  _focus = data;
                          } else if(cmd=='js') {        // evaluate js code
                          } else if(cmd=='fc') { // set focus
                                  _focus = data;
                          } else if(cmd=='js') {        // evaluate js code
-                                 eval(data);
+                               __isGecko ? eval(data) : setTimeout(function(){eval(data);}, 200); // timeout required by IE7/8
                          } else if(cmd=='rd') {        // client-side redirection
                                  window.location = data;
                          } else if(cmd=='pu') {        // pop-up
                                  newwin = 1;
                          } 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');
+                                 window.open(data,'REP_WINDOW','toolbar=no,scrollbars=yes,resizable=yes,menubar=no');
                          } else {
                                  errors = errors+'<br>Unknown ajax function: '+cmd;
                        }
                  }
                          } else {
                                  errors = errors+'<br>Unknown ajax function: '+cmd;
                        }
                  }
-
+                if(tcheck)
+                  JsHttpRequest.clearTimeout(tcheck);
         // Write errors to the debug div.
                  document.getElementById('msgbox').innerHTML = errors;
         // Write errors to the debug div.
                  document.getElementById('msgbox').innerHTML = errors;
-                 var mark = document.getElementById('ajaxmark');
-                 if(mark) mark.style.visibility = 'hidden';
+                 set_mark();
 
                  Behaviour.apply();
 
 
                  Behaviour.apply();
 
                        window.scrollTo(0,0);
                        //document.getElementById('msgbox').scrollIntoView(true);
          // Restore focus if we've just lost focus because of DOM element refresh
                        window.scrollTo(0,0);
                        //document.getElementById('msgbox').scrollIntoView(true);
          // Restore focus if we've just lost focus because of DOM element refresh
-                       if(!newwin) { 
+                       if(!newwin) {
                                setFocus();
                        }
                }
             },
                                setFocus();
                        }
                }
             },
-            false  // do not disable caching
+               false  // do not disable caching
         );
         );
-    }
+       };
        // collect all form input values plus inp trigger value
        JsHttpRequest.formInputs = function(inp, objForm, upload)
        {
        // collect all form input values plus inp trigger value
        JsHttpRequest.formInputs = function(inp, objForm, upload)
        {
                var q = {};
 
                if (typeof(inp) == "string")
                var q = {};
 
                if (typeof(inp) == "string")
-                       submitObj = document.getElementsByName(inp)[0];
-               else
-                       submitObj = inp;
-               
+                       submitObj = document.getElementsByName(inp)[0]||inp;
+
                objForm = objForm || (submitObj && submitObj.form);
 
                if (objForm)
                objForm = objForm || (submitObj && submitObj.form);
 
                if (objForm)
                          var el = formElements[i];
                          var name = el.name;
                                if (!el.name) continue;
                          var el = formElements[i];
                          var name = el.name;
                                if (!el.name) continue;
-                               if(upload) { // for form containing file inputs collect all 
+                               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())
                                        // 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 (submitObj.type=='submit' && el==submitObj)
+                                       {
+                                               q[name] =  el.value;
+                                               continue;
+                                       }
                                }
                                if (el.type )
                                }
                                if (el.type )
-                                 if( 
-                                 ((el.type == 'radio' || el.type == 'checkbox') && el.checked == false)
+                                 if(
+                                 (el.type == 'radio' && el.checked == false)
                                  || (el.type == 'submit' && (!submitObj || el.name!=submitObj.name)))
                                        continue;
                                if (el.disabled && el.disabled == true)
                                  || (el.type == 'submit' && (!submitObj || el.name!=submitObj.name)))
                                        continue;
                                if (el.disabled && el.disabled == true)
                                {
                                        if(el.type=='select-multiple')
                                        {
                                {
                                        if(el.type=='select-multiple')
                                        {
+                                               name = name.substr(0,name.length-2);
+                                               q[name] = new Array;
                                                for (var j = 0; j < el.length; j++)
                                                {
                                                for (var j = 0; j < el.length; j++)
                                                {
+                                                       s = name.substring(0, name.length-2);
                                                        if (el.options[j].selected == true)
                                                        if (el.options[j].selected == true)
-                                                               q[name] = el.options[j].value;
+                                                               q[name].push(el.options[j].value);
                                                }
                                        }
                                        else
                                                }
                                        }
                                        else
+                                       if (el.type=='file')
+                                               q[name] = el;
+                                       else
                                        {
                                        {
-                                               q[name] = el.value;
+                                               if (el.type == 'checkbox') {
+                                                       q[name] = (el.checked == true);
+                                               } else {
+                                                       q[name] = el.value;
+                                               }
                                        }
                                        }
-                               } 
+                               }
                        }
                }
                return q;
                        }
                }
                return q;
-       }
+       };
 //
 //     User price formatting
 //
 //
 //     User price formatting
 //
@@ -173,19 +222,24 @@ function price_format(post, num, dec, label, color) {
        if(isNaN(num))
                num = "0";
        sign = (num == (num = Math.abs(num)));
        if(isNaN(num))
                num = "0";
        sign = (num == (num = Math.abs(num)));
+       var max = dec=='max';
+       if(max) dec = num==0 ? 2 : 15 - Math.floor(Math.log(Math.abs(num)));
        if(dec<0) dec = 2;
        decsize = Math.pow(10, dec);
        num = Math.floor(num*decsize+0.50000000001);
        cents = num%decsize;
        num = Math.floor(num/decsize).toString();
        for( i=cents.toString().length; i<dec; i++){
        if(dec<0) dec = 2;
        decsize = Math.pow(10, dec);
        num = Math.floor(num*decsize+0.50000000001);
        cents = num%decsize;
        num = Math.floor(num/decsize).toString();
        for( i=cents.toString().length; i<dec; i++){
-               cents = "0" + cents;
+               cents = "0"+cents;
        }
        }
+       if (max) // strip trailing 0
+               cents = cents.toString().replace(/0+$/,'');
        for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)
                num = num.substring(0,num.length-(4*i+3))+user.ts+
                        num.substring(num.length-(4*i+3));
         num = ((sign)?'':'-') + num;
        for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)
                num = num.substring(0,num.length-(4*i+3))+user.ts+
                        num.substring(num.length-(4*i+3));
         num = ((sign)?'':'-') + num;
-        if(dec!=0) num = num + user.ds + cents;
+       if(dec!=0 && (!max || cents!=0))
+               num = num + user.ds + cents;
        if(label)
            el.innerHTML = num;
        else
        if(label)
            el.innerHTML = num;
        else
@@ -197,42 +251,45 @@ function price_format(post, num, dec, label, color) {
 
 function get_amount(doc, label) {
            if(label)
 
 function get_amount(doc, label) {
            if(label)
-               var val = document.getElementById(doc).innerHTML;
+                       var val = document.getElementById(doc).innerHTML;
            else
            else
-               var val = document.getElementsByName(doc)[0].value;
+                       var val = typeof(doc) == "string" ?
+                       document.getElementsByName(doc)[0].value : doc.value;
+
                val = val.replace(new RegExp('\\'+user.ts, 'g'),'');
                val = +val.replace(new RegExp('\\'+user.ds, 'g'),'.');
                return isNaN(val) ? 0 : val;
 }
 
                val = val.replace(new RegExp('\\'+user.ts, 'g'),'');
                val = +val.replace(new RegExp('\\'+user.ds, 'g'),'.');
                return isNaN(val) ? 0 : val;
 }
 
-function goBack() {
-       if (window.history.length <= 1)
+function goBack(deep) {
+       if (window.opener)
         window.close();
        else
         window.close();
        else
-        window.history.go(-1);
+        window.history.go(deep || -1);
 }
 
 function setFocus(name, byId) {
 }
 
 function setFocus(name, byId) {
-
+ var el = null;
  if(typeof(name)=='object')
        el = name;
  else {
        if(!name) { // page load/ajax update
  if(typeof(name)=='object')
        el = name;
  else {
        if(!name) { // page load/ajax update
-               if (_focus)     
+               if (_focus)
                        name = _focus;  // last focus set in onfocus handlers
                        name = _focus;  // last focus set in onfocus handlers
-               else 
+               else
                        if (document.forms.length) {    // no current focus (first page display) -  set it from from last form
                          var cur = document.getElementsByName('_focus')[document.forms.length-1];
                          if(cur) name = cur.value;
                        }
          }
                        if (document.forms.length) {    // no current focus (first page display) -  set it from from last form
                          var cur = document.getElementsByName('_focus')[document.forms.length-1];
                          if(cur) name = cur.value;
                        }
          }
-         if(byId || !(el = document.getElementsByName(name)[0]))
-               el = document.getElementById(name);
+      if (name)
+           if(byId || !(el = document.getElementsByName(name)[0]))
+                 el = document.getElementById(name);
   }
   }
-  if(el && el.focus) {
+  if (el != null && el.focus) {
     // The timeout is needed to prevent unpredictable behaviour on IE & Gecko.
     // Using tmp var prevents crash on IE5
     // The timeout is needed to prevent unpredictable behaviour on IE & Gecko.
     // Using tmp var prevents crash on IE5
-       
+
     var tmp = function() {el.focus(); if (el.select) el.select();};
        setTimeout(tmp, 0);
   }
     var tmp = function() {el.focus(); if (el.select) el.select();};
        setTimeout(tmp, 0);
   }
@@ -249,8 +306,9 @@ function move_focus(dir, e0, neighbours)
        for(var i=0; i<neighbours.length; i++) {
                var e = neighbours[i];
                var p = element_pos(e);
        for(var i=0; i<neighbours.length; i++) {
                var e = neighbours[i];
                var p = element_pos(e);
-               if (p!=null && (e.className=='menu_option' || e.className=='printlink')) {
-                       if (((dir==40) && (p.y>p0.y)) || (dir==38 && (p.y<p0.y)) 
+               if (p!=null && (e.className=='menu_option' || e.className=='printlink'
+                                || e.className == 'repclass_link' || e.className == 'repopts_link')) {
+                       if (((dir==40) && (p.y>p0.y)) || (dir==38 && (p.y<p0.y))
                                || ((dir==37) && (p.x<p0.x)) || ((dir==39 && (p.x>p0.x)))) {
                                        var l1 = (p.y-p0.y)*(p.y-p0.y)+(p.x-p0.x)*(p.x-p0.x);
                                        if ((l1<l) || (l==0)) {
                                || ((dir==37) && (p.x<p0.x)) || ((dir==39 && (p.x>p0.x)))) {
                                        var l1 = (p.y-p0.y)*(p.y-p0.y)+(p.x-p0.x)*(p.x-p0.x);
                                        if ((l1<l) || (l==0)) {
@@ -264,7 +322,7 @@ function move_focus(dir, e0, neighbours)
        return t;
 }
 
        return t;
 }
 
-var __isFireFox = navigator.userAgent.match(/gecko/i);
+var __isGecko = navigator.userAgent.match(/gecko/i); // i.e. Gecko or KHTML, like Gecko ;)
 //returns the absolute position of some element within document
 function element_pos(e) {
        var res = new Object();
 //returns the absolute position of some element within document
 function element_pos(e) {
        var res = new Object();
@@ -275,15 +333,16 @@ function element_pos(e) {
                var offsetParent = e.offsetParent;
                var parentNode = e.parentNode;
 
                var offsetParent = e.offsetParent;
                var parentNode = e.parentNode;
 
-               while (offsetParent !== null) {
+               while (offsetParent !== null && offsetParent.style.display != 'none') {
                        res.x += offsetParent.offsetLeft;
                        res.y += offsetParent.offsetTop;
                        res.x += offsetParent.offsetLeft;
                        res.y += offsetParent.offsetTop;
+                       // the second case is for IE6/7 in some doctypes
                        if (offsetParent != document.body && offsetParent != document.documentElement) {
                                res.x -= offsetParent.scrollLeft;
                                res.y -= offsetParent.scrollTop;
                        }
                              //next lines are necessary to support FireFox problem with offsetParent
                        if (offsetParent != document.body && offsetParent != document.documentElement) {
                                res.x -= offsetParent.scrollLeft;
                                res.y -= offsetParent.scrollTop;
                        }
                              //next lines are necessary to support FireFox problem with offsetParent
-                       if (__isFireFox) {
+                       if (__isGecko) {
                                while (offsetParent != parentNode && parentNode !== null) {
                                        res.x -= parentNode.scrollLeft;
                                        res.y -= parentNode.scrollTop;
                                while (offsetParent != parentNode && parentNode !== null) {
                                        res.x -= parentNode.scrollLeft;
                                        res.y -= parentNode.scrollTop;
@@ -296,6 +355,11 @@ function element_pos(e) {
                }
        }
        // parentNode has style.display set to none
                }
        }
        // parentNode has style.display set to none
-       if (parentNode!=document.documentElement) return null;
+       if (parentNode != document.documentElement) return null;
        return res;
        return res;
-}
\ No newline at end of file
+}
+
+function string_contains(haystack, needle) {
+  var words = haystack.split(' ');
+  return words.indexOf(needle) > -1;
+}