Javascript now works with multiple classes on elements.
authorCambell <cambell.prince@gmail.com>
Thu, 13 Nov 2014 14:25:07 +0000 (21:25 +0700)
committerJanusz Dobrowolski <janusz@frontaccounting.eu>
Fri, 14 Nov 2014 18:18:38 +0000 (19:18 +0100)
js/inserts.js
js/utils.js

index 3448c86949691da79ffa36722467b7e72b8caadc..0c991a86390794fae73e70a9c25e2a52dbd67c10 100644 (file)
@@ -1,11 +1,11 @@
 /**********************************************************************
     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>.
 ***********************************************************************/
 var _focus;
     See the License here <http://www.gnu.org/licenses/gpl-3.0.html>.
 ***********************************************************************/
 var _focus;
@@ -46,7 +46,7 @@ function _expand(tabobj) {
 
   if (ul.getAttribute("rel")){
        for (var i=0; i<alltabs.length; i++){
 
   if (ul.getAttribute("rel")){
        for (var i=0; i<alltabs.length; i++){
-         alltabs[i].className = "ajaxbutton"  //deselect all tabs
+         alltabs[i].className = "ajaxbutton"  //deselect all tabs // Review CP 2014-11 This will remove all other classes from the element.
        }
        tabobj.className = "current";
        JsHttpRequest.request(tabobj)
        }
        tabobj.className = "current";
        JsHttpRequest.request(tabobj)
@@ -61,17 +61,17 @@ function expandtab(tabcontentid, tabnumber) {
 
 function _set_combo_input(e) {
                e.setAttribute('_last', e.value);
 
 function _set_combo_input(e) {
                e.setAttribute('_last', e.value);
-               e.onblur=function() { 
+               e.onblur=function() {
                  var but_name = this.name.substring(0, this.name.length-4)+'button';
                  var button = document.getElementsByName(but_name)[0];
                  var select = document.getElementsByName(this.getAttribute('rel'))[0];
                  save_focus(select);
                  var but_name = this.name.substring(0, this.name.length-4)+'button';
                  var button = document.getElementsByName(but_name)[0];
                  var select = document.getElementsByName(this.getAttribute('rel'))[0];
                  save_focus(select);
-// submit request if there is submit_on_change option set and 
+// submit request if there is submit_on_change option set and
 // search field has changed.
 // search field has changed.
-               
+
                  if (button && (this.value != this.getAttribute('_last'))) {
                        JsHttpRequest.request(button);
                  if (button && (this.value != this.getAttribute('_last'))) {
                        JsHttpRequest.request(button);
-                 } else if(this.className=='combo2') {
+                 } else if(string_contains(this.className, 'combo2')) {
                                this.style.display = 'none';
                                select.style.display = 'inline';
                                setFocus(select);
                                this.style.display = 'none';
                                select.style.display = 'inline';
                                setFocus(select);
@@ -82,12 +82,12 @@ function _set_combo_input(e) {
                        var select = document.getElementsByName(this.getAttribute('rel'))[0];
                        if(select && select.selectedIndex>=0) {
                          var len = select.length;
                        var select = document.getElementsByName(this.getAttribute('rel'))[0];
                        if(select && select.selectedIndex>=0) {
                          var len = select.length;
-                         var byid = this.className=='combo' || this.className=='combo3';
+                         var byid = string_contains(this.className, 'combo') || string_contains(this.className, 'combo3');
                          var ac = this.value.toUpperCase();
                          select.options[select.selectedIndex].selected = false;
                          for (i = 0; i < len; i++) {
                                var txt = byid ? select.options[i].value : select.options[i].text;
                          var ac = this.value.toUpperCase();
                          select.options[select.selectedIndex].selected = false;
                          for (i = 0; i < len; i++) {
                                var txt = byid ? select.options[i].value : select.options[i].text;
-                               if (this.className=='combo3') {
+                               if (string_contains(this.className, 'combo3')) {
                                  if(txt.toUpperCase().indexOf(ac) == 0) {
                                        select.options[i].selected = true;
                                        break;
                                  if(txt.toUpperCase().indexOf(ac) == 0) {
                                        select.options[i].selected = true;
                                        break;
@@ -101,7 +101,7 @@ function _set_combo_input(e) {
                          }
                        }
                };
                          }
                        }
                };
-       e.onkeydown = function(ev) { 
+       e.onkeydown = function(ev) {
                        ev = ev||window.event;
                        key = ev.keyCode||ev.which;
                        if(key == 13) {
                        ev = ev||window.event;
                        key = ev.keyCode||ev.which;
                        if(key == 13) {
@@ -112,7 +112,7 @@ function _set_combo_input(e) {
 }
 
 function _update_box(s) {
 }
 
 function _update_box(s) {
-       var byid = s.className=='combo' || s.className=='combo3';
+       var byid = string_contains(s.className, 'combo') || string_contains(s.className, 'combo3');
        var rel = s.getAttribute('rel');
        var box = document.getElementsByName(rel)[0];
                if(box && s.selectedIndex>=0) {
        var rel = s.getAttribute('rel');
        var box = document.getElementsByName(rel)[0];
                if(box && s.selectedIndex>=0) {
@@ -128,29 +128,29 @@ function _update_box(s) {
 
 function _set_combo_select(e) {
                // When combo position is changed via js (eg from searchbox)
 
 function _set_combo_select(e) {
                // When combo position is changed via js (eg from searchbox)
-               // no onchange event is generated. To ensure proper change 
+               // no onchange event is generated. To ensure proper change
                // signaling we must track selectedIndex in onblur handler.
                e.setAttribute('_last', e.selectedIndex);
                e.onblur = function() {
                    var box = document.getElementsByName(this.getAttribute('rel'))[0];
                // signaling we must track selectedIndex in onblur handler.
                e.setAttribute('_last', e.selectedIndex);
                e.onblur = function() {
                    var box = document.getElementsByName(this.getAttribute('rel'))[0];
-//                     if(this.className=='combo')
+//                     if(string_contains(this.className, 'combo'))
 //                         _update_box(this);
                        if ((this.selectedIndex != this.getAttribute('_last'))
 //                         _update_box(this);
                        if ((this.selectedIndex != this.getAttribute('_last'))
-                               ||((this.className=='combo' || this.className=='combo3') && _update_box(this))
+                               ||((string_contains(this.className, 'combo') || string_contains(this.className, 'combo3')) && _update_box(this))
                                )
                                        this.onchange();
                }
                e.onchange = function() {
                        var s = this;
                        this.setAttribute('_last', this.selectedIndex);
                                )
                                        this.onchange();
                }
                e.onchange = function() {
                        var s = this;
                        this.setAttribute('_last', this.selectedIndex);
-                       if(s.className=='combo' || this.className=='combo3')
+                       if(string_contains(s.className, 'combo') || string_contains(this.className, 'combo3'))
                            _update_box(s);
                        if(s.selectedIndex>=0) {
                                 var sname = '_'+s.name+'_update';
                                 var update = document.getElementsByName(sname)[0];
                                 if(update) {
                                            JsHttpRequest.request(update);
                            _update_box(s);
                        if(s.selectedIndex>=0) {
                                 var sname = '_'+s.name+'_update';
                                 var update = document.getElementsByName(sname)[0];
                                 if(update) {
                                            JsHttpRequest.request(update);
-                               } 
+                               }
                        }
                        return true;
                }
                        }
                        return true;
                }
@@ -178,7 +178,7 @@ function _set_combo_select(e) {
 var _w;
 
 function callEditor(key) {
 var _w;
 
 function callEditor(key) {
-  var el = document.getElementsByName(editors[key][1])[0]; 
+  var el = document.getElementsByName(editors[key][1])[0];
   if(_w) _w.close(); // this is really necessary to have window on top in FF2 :/
   var left = (screen.width - editors[key][2]) / 2;
   var top = (screen.height - editors[key][3]) / 2;
   if(_w) _w.close(); // this is really necessary to have window on top in FF2 :/
   var left = (screen.width - editors[key][2]) / 2;
   var top = (screen.height - editors[key][3]) / 2;
@@ -186,7 +186,7 @@ function callEditor(key) {
          "edit","scrollbars=yes,resizable=0,width="+editors[key][2]+",height="+editors[key][3]+",left="+left+",top="+top+",screenX="+left+",screenY="+top);
   if (_w.opener == null)
          _w.opener = self;
          "edit","scrollbars=yes,resizable=0,width="+editors[key][2]+",height="+editors[key][3]+",left="+left+",top="+top+",screenX="+left+",screenY="+top);
   if (_w.opener == null)
          _w.opener = self;
-  editors._call = key; // store call point for passBack 
+  editors._call = key; // store call point for passBack
   _w.focus();
 }
 
   _w.focus();
 }
 
@@ -196,7 +196,7 @@ function passBack(value) {
                var back = o.editors[o.editors._call]; // form input bindings
                var to = o.document.getElementsByName(back[1])[0];
                if (to) {
                var back = o.editors[o.editors._call]; // form input bindings
                var to = o.document.getElementsByName(back[1])[0];
                if (to) {
-                       if (to[0] != undefined) 
+                       if (to[0] != undefined)
                                to[0].value = value; // ugly hack to set selector to any value
                        to.value = value;
                        // update page after item selection
                                to[0].value = value; // ugly hack to set selector to any value
                        to.value = value;
                        // update page after item selection
@@ -230,12 +230,12 @@ function fix_date(date, last)
                day = dat[2]; month = dat[1]; year = dat[0];
        }
        if (cur[1] != undefined && cur[1] != "") // day or month entered, could be string 3
                day = dat[2]; month = dat[1]; year = dat[0];
        }
        if (cur[1] != undefined && cur[1] != "") // day or month entered, could be string 3
-       { 
+       {
                if (user.datefmt == 0 || user.datefmt == 3 || ((user.datefmt == 2 || user.datefmt == 5) && (cur[2] == undefined || cur[2] == "")))
                        day = cur[1];
                if (user.datefmt == 0 || user.datefmt == 3 || ((user.datefmt == 2 || user.datefmt == 5) && (cur[2] == undefined || cur[2] == "")))
                        day = cur[1];
-               else    
+               else
                        month = cur[1];
                        month = cur[1];
-       }               
+       }
        if (cur[0] != undefined && cur[0] != "") // day or month entered. could be string 3
        {
                if (cur[1] == undefined || cur[1] == "")
        if (cur[0] != undefined && cur[0] != "") // day or month entered. could be string 3
        {
                if (cur[1] == undefined || cur[1] == "")
@@ -244,7 +244,7 @@ function fix_date(date, last)
                        month = cur[0];
                else if (user.datefmt == 2 || user.datefmt == 5)
                        year = cur[0];
                        month = cur[0];
                else if (user.datefmt == 2 || user.datefmt == 5)
                        year = cur[0];
-               else    
+               else
                        day = cur[0];
        }
        if (cur[2] != undefined && cur[2] != "") // year,
                        day = cur[0];
        }
        if (cur[2] != undefined && cur[2] != "") // year,
@@ -253,11 +253,11 @@ function fix_date(date, last)
                        day = cur[2];
                else
                        year = cur[2];
                        day = cur[2];
                else
                        year = cur[2];
-       }               
+       }
        if (user.datefmt<3) {
                if (day<10) day = '0'+parseInt(day, 10);
                if (month<10) month = '0'+parseInt(month, 10);
        if (user.datefmt<3) {
                if (day<10) day = '0'+parseInt(day, 10);
                if (month<10) month = '0'+parseInt(month, 10);
-       }       
+       }
        if (year<100) year = year<60 ? (2000+parseInt(year,10)) : (1900+parseInt(year,10));
 
 //     console.info(day,month,year)
        if (year<100) year = year<60 ? (2000+parseInt(year,10)) : (1900+parseInt(year,10));
 
 //     console.info(day,month,year)
@@ -276,32 +276,32 @@ var inserts = {
                if(e.onfocus==undefined) {
                        e.onfocus = function() {
                            save_focus(this);
                if(e.onfocus==undefined) {
                        e.onfocus = function() {
                            save_focus(this);
-                               if (this.className == 'combo' || this.className == 'combo3') 
+                               if (this.className == 'combo' || this.className == 'combo3')
                                        this.select();
                        };
                }
                if (e.className == 'combo' || e.className == 'combo2' || e.className == 'combo3') {
                                _set_combo_input(e);
                                        this.select();
                        };
                }
                if (e.className == 'combo' || e.className == 'combo2' || e.className == 'combo3') {
                                _set_combo_input(e);
-               } 
+               }
                else
                if(e.type == 'text' ) {
                else
                if(e.type == 'text' ) {
-                               e.onkeydown = function(ev) { 
+                               e.onkeydown = function(ev) {
                                        ev = ev||window.event;
                                        key = ev.keyCode||ev.which;
                                        if(key == 13) {
                                                if(e.className == 'searchbox') e.onblur();
                                                return false;
                                        ev = ev||window.event;
                                        key = ev.keyCode||ev.which;
                                        if(key == 13) {
                                                if(e.className == 'searchbox') e.onblur();
                                                return false;
-                                       } 
+                                       }
                                        return true;
                                }
                        }
        },
                                        return true;
                                }
                        }
        },
-       'input.combo2,input[aspect="fallback"]': 
+       'input.combo2,input[aspect="fallback"]':
        function(e) {
            // this hides search button for js enabled browsers
            e.style.display = 'none';
        },
        function(e) {
            // this hides search button for js enabled browsers
            e.style.display = 'none';
        },
-       'div.js_only': 
+       'div.js_only':
        function(e) {
            // this shows divs for js enabled browsers only
            e.style.display = 'block';
        function(e) {
            // this shows divs for js enabled browsers only
            e.style.display = 'block';
@@ -326,7 +326,7 @@ var inserts = {
 
        },
 //     '.ajaxsubmit,.editbutton,.navibutton': // much slower on IE7
 
        },
 //     '.ajaxsubmit,.editbutton,.navibutton': // much slower on IE7
-       'button.ajaxsubmit,input.ajaxsubmit,input.editbutton,button.editbutton,button.navibutton': 
+       'button.ajaxsubmit,input.ajaxsubmit,input.editbutton,button.editbutton,button.navibutton':
        function(e) {
                        e.onclick = function() {
                                if (validate(e)) {
        function(e) {
                        e.onclick = function() {
                                if (validate(e)) {
@@ -389,7 +389,7 @@ var inserts = {
                                  "edit","Scrollbars=0,resizable=0,width=800,height=600, top="+top+",left="+left+",screenX="+left+",screenY="+top);
                          if (_w.opener == null)
                                  _w.opener = self;
                                  "edit","Scrollbars=0,resizable=0,width=800,height=600, top="+top+",left="+left+",screenX="+left+",screenY="+top);
                          if (_w.opener == null)
                                  _w.opener = self;
-                       //  editors._call = key; // store call point for passBack 
+                       //  editors._call = key; // store call point for passBack
 //                       _w.moveTo(50, 50);
                          _w.focus();
                        return false;
 //                       _w.moveTo(50, 50);
                          _w.focus();
                        return false;
@@ -402,7 +402,7 @@ var inserts = {
                        };
                }
                var c = e.className;
                        };
                }
                var c = e.className;
-               if (c == 'combo' || c == 'combo2' || c == 'combo3')
+               if (string_contains(c, 'combo') || string_contains(c, 'combo2') || string_contains(c, 'combo3'))
                        _set_combo_select(e);
                else {
                        e.onkeydown = function(ev) {    // block unintentional page escape with 'history back' key pressed on buttons
                        _set_combo_select(e);
                else {
                        e.onkeydown = function(ev) {    // block unintentional page escape with 'history back' key pressed on buttons
@@ -433,7 +433,7 @@ var inserts = {
                }
        },
        'a': function(e) { // traverse menu
                }
        },
        'a': function(e) { // traverse menu
-               e.onkeydown = function(ev) { 
+               e.onkeydown = function(ev) {
                        ev = ev||window.event;
                        key = ev.keyCode||ev.which;
                        if(key==37 || key==38 || key==39 || key==40) {
                        ev = ev||window.event;
                        key = ev.keyCode||ev.which;
                        if(key==37 || key==38 || key==39 || key==40) {
@@ -443,18 +443,18 @@ var inserts = {
                        }
                }
                // prevent unneeded transaction entry abortion
                        }
                }
                // prevent unneeded transaction entry abortion
-               if (e.className == 'shortcut' 
-                || e.className == 'menu_option' 
+               if (e.className == 'shortcut'
+                || e.className == 'menu_option'
                 || e.className == 'menu_tab'
                 || e.className == 'selected')
                        e.onclick = function(ev) {
                 || e.className == 'menu_tab'
                 || e.className == 'selected')
                        e.onclick = function(ev) {
-                               if (_validate._processing 
+                               if (_validate._processing
                                 && _validate._modified
                                 && !confirm(_validate._processing)) {
                                        ev.returnValue = false;
                                        return false;
                                }
                                 && _validate._modified
                                 && !confirm(_validate._processing)) {
                                        ev.returnValue = false;
                                        return false;
                                }
-                               if (_hotkeys.alt)       // ommit Chrome accesskeys 
+                               if (_hotkeys.alt)       // ommit Chrome accesskeys
                                        return false;
                                window.location = e.href;
                        }
                                        return false;
                                window.location = e.href;
                        }
@@ -482,12 +482,12 @@ var inserts = {
                }
        }
 /*     'tr.editrow': function(e) {
                }
        }
 /*     'tr.editrow': function(e) {
-                       e.onkeydown = function(ev) { 
+                       e.onkeydown = function(ev) {
                        ev = ev||window.event;
                        key = ev.keyCode||ev.which;
                        if(key == 13) {
                          // Find & click additem/update button
                        ev = ev||window.event;
                        key = ev.keyCode||ev.which;
                        if(key == 13) {
                          // Find & click additem/update button
-                         
+
                        } else  if(key == 27) {
                          return false;
                        }
                        } else  if(key == 27) {
                          return false;
                        }
@@ -520,7 +520,7 @@ function stopEv(ev) {
                        return false;
 }
 /*
                        return false;
 }
 /*
-       Modified accesskey system. While Alt key is pressed letter keys moves 
+       Modified accesskey system. While Alt key is pressed letter keys moves
        focus to next marked link. Alt key release activates focused link.
 */
 function setHotKeys() {
        focus to next marked link. Alt key release activates focused link.
 */
 function setHotKeys() {
@@ -538,7 +538,7 @@ function setHotKeys() {
                        var l = document.getElementsBySelector('[accesskey='+key+']');
                        var cnt = l.length;
                        _hotkeys.list = l;
                        var l = document.getElementsBySelector('[accesskey='+key+']');
                        var cnt = l.length;
                        _hotkeys.list = l;
-                       for (var i=0; i<cnt; i++) { 
+                       for (var i=0; i<cnt; i++) {
                                n = (n+1)%cnt;
                                // check also if the link is visible
                                if (l[n].accessKey==key && (l[n].offsetWidth || l[n].offsetHeight)) {
                                n = (n+1)%cnt;
                                // check also if the link is visible
                                if (l[n].accessKey==key && (l[n].offsetWidth || l[n].offsetHeight)) {
@@ -563,7 +563,7 @@ function setHotKeys() {
                                        var el = form.elements[i];
                                        var asp = el.getAttribute('aspect');
 
                                        var el = form.elements[i];
                                        var asp = el.getAttribute('aspect');
 
-                                       if (el.className!='editbutton' && (asp && asp.indexOf('selector') !== -1) && (key==13 || key==27)) {
+                                       if (!string_contains(el.className, 'editbutton') && (asp && asp.indexOf('selector') !== -1) && (key==13 || key==27)) {
                                                passBack(key==13 ? el.getAttribute('rel') : false);
                                                ev.returnValue = false;
                                                return false;
                                                passBack(key==13 ? el.getAttribute('rel') : false);
                                                ev.returnValue = false;
                                                return false;
@@ -589,7 +589,7 @@ function setHotKeys() {
                if (editors!=='undefined' && editors[key]) {
                        callEditor(key);
                        return stopEv(ev); // prevent default binding
                if (editors!=='undefined' && editors[key]) {
                        callEditor(key);
                        return stopEv(ev); // prevent default binding
-               } 
+               }
                return true;
        };
        document.onkeyup = function(ev) {
                return true;
        };
        document.onkeyup = function(ev) {
@@ -601,7 +601,7 @@ function setHotKeys() {
                                _hotkeys.alt = false;
                                if (_hotkeys.focus >= 0) {
                                        var link = _hotkeys.list[_hotkeys.focus];
                                _hotkeys.alt = false;
                                if (_hotkeys.focus >= 0) {
                                        var link = _hotkeys.list[_hotkeys.focus];
-                                       if(link.onclick) 
+                                       if(link.onclick)
                                                link.onclick();
                                        else
                                                if (link.target=='_blank') {
                                                link.onclick();
                                        else
                                                if (link.target=='_blank') {
@@ -611,7 +611,7 @@ function setHotKeys() {
                                                        window.location = link.href;
                                }
                        return stopEv(ev);
                                                        window.location = link.href;
                                }
                        return stopEv(ev);
-                       } 
+                       }
                }
                return true;
        }
                }
                return true;
        }
index c5aec13332dea4100dd439ad3cd98f7f5225249b..478cd158e3d326ab1b8acd732144a352f239359f 100644 (file)
@@ -1,11 +1,11 @@
 /**********************************************************************
     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>.
 ***********************************************************************/
 function set_mark(img) {
     See the License here <http://www.gnu.org/licenses/gpl-3.0.html>.
 ***********************************************************************/
 function set_mark(img) {
@@ -31,8 +31,8 @@ function disp_msg(msg, cl) {
 //     - 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 
-// 
+//             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
 JsHttpRequest.request= function(trigger, form, tout) {
 //     if (trigger.type=='submit' && !validate(trigger)) return false;
        tout = tout || 10000;   // default timeout value
@@ -48,27 +48,27 @@ JsHttpRequest._request = function(trigger, form, tout, retry) {
                        var url = trigger.href;
                        if (trigger.id) content[trigger.id] = 1;
                } else {
                        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.getAttribute('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) {
                        content[trigger] = 1;
                        }
                }
                        // this is to avoid caching problems
                content['_random'] = Math.random()*1234567;
                if (!submitObj) {
                        content[trigger] = 1;
                        }
                }
                        // this is to avoid caching problems
                content['_random'] = Math.random()*1234567;
-       
+
                var tcheck = setTimeout(
                        function() {
                                for(var id in JsHttpRequest.PENDING)  {
                var tcheck = setTimeout(
                        function() {
                                for(var id in JsHttpRequest.PENDING)  {
@@ -89,12 +89,12 @@ JsHttpRequest._request = function(trigger, form, tout, retry) {
         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'];
@@ -141,7 +141,7 @@ JsHttpRequest._request = function(trigger, form, tout, retry) {
                        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();
                        }
                }
@@ -157,7 +157,7 @@ JsHttpRequest._request = function(trigger, form, tout, retry) {
 
                if (typeof(inp) == "string")
                        submitObj = document.getElementsByName(inp)[0]||inp;
 
                if (typeof(inp) == "string")
                        submitObj = document.getElementsByName(inp)[0]||inp;
-               
+
                objForm = objForm || (submitObj && submitObj.form);
 
                if (objForm)
                objForm = objForm || (submitObj && submitObj.form);
 
                if (objForm)
@@ -168,7 +168,7 @@ JsHttpRequest._request = function(trigger, form, tout, retry) {
                          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())
                                        if (submitObj.type=='submit' && el==submitObj)
                                        // form elements and add value of trigger submit button
                                        // (internally form is submitted via form.submit() not button click())
                                        if (submitObj.type=='submit' && el==submitObj)
@@ -178,7 +178,7 @@ JsHttpRequest._request = function(trigger, form, tout, retry) {
                                        }
                                }
                                if (el.type )
                                        }
                                }
                                if (el.type )
-                                 if( 
+                                 if(
                                  ((el.type == 'radio' || el.type == 'checkbox') && el.checked == false)
                                  || (el.type == 'submit' && (!submitObj || el.name!=submitObj.name)))
                                        continue;
                                  ((el.type == 'radio' || el.type == 'checkbox') && el.checked == false)
                                  || (el.type == 'submit' && (!submitObj || el.name!=submitObj.name)))
                                        continue;
@@ -204,7 +204,7 @@ JsHttpRequest._request = function(trigger, form, tout, retry) {
                                        {
                                                q[name] = el.value;
                                        }
                                        {
                                                q[name] = el.value;
                                        }
-                               } 
+                               }
                        }
                }
                return q;
                        }
                }
                return q;
@@ -224,7 +224,7 @@ function price_format(post, num, dec, label, color) {
        decsize = Math.pow(10, dec);
        num = Math.floor(num*decsize+0.50000000001);
        cents = num%decsize;
        decsize = Math.pow(10, dec);
        num = Math.floor(num*decsize+0.50000000001);
        cents = num%decsize;
-       num = Math.floor(num/decsize).toString(); 
+       num = Math.floor(num/decsize).toString();
        for( i=cents.toString().length; i<dec; i++){
                cents = "0"+cents;
        }
        for( i=cents.toString().length; i<dec; i++){
                cents = "0"+cents;
        }
@@ -249,9 +249,9 @@ function get_amount(doc, label) {
            if(label)
                        var val = document.getElementById(doc).innerHTML;
            else
            if(label)
                        var val = document.getElementById(doc).innerHTML;
            else
-                       var val = typeof(doc) == "string" ? 
+                       var val = typeof(doc) == "string" ?
                        document.getElementsByName(doc)[0].value : doc.value;
                        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;
@@ -270,22 +270,22 @@ function setFocus(name, byId) {
        el = name;
  else {
        if(!name) { // page load/ajax update
        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 (name) 
+      if (name)
            if(byId || !(el = document.getElementsByName(name)[0]))
                  el = document.getElementById(name);
   }
   if (el != null && el.focus) {
     // The timeout is needed to prevent unpredictable behaviour on IE & Gecko.
     // Using tmp var prevents crash on IE5
            if(byId || !(el = document.getElementsByName(name)[0]))
                  el = document.getElementById(name);
   }
   if (el != null && el.focus) {
     // 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);
   }
@@ -304,7 +304,7 @@ function move_focus(dir, e0, neighbours)
                var p = element_pos(e);
                if (p!=null && (e.className=='menu_option' || e.className=='printlink'
                                 || e.className == 'repclass_link' || e.className == 'repopts_link')) {
                var p = element_pos(e);
                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)) 
+                       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)) {
@@ -354,3 +354,7 @@ function element_pos(e) {
        if (parentNode != document.documentElement) return null;
        return res;
 }
        if (parentNode != document.documentElement) return null;
        return res;
 }
+
+function string_contains(haystack, needle) {
+  return haystack.indexOf(needle) > -1;
+}