X-Git-Url: https://delta.frontaccounting.com/gitweb/?a=blobdiff_plain;f=js%2Futils.js;h=f4a4f65cc0f4717af7a14d434325566bf0f018d5;hb=c4eae7a18f0eb824e6eda7be2ba6fa820e9e58c9;hp=cb1c0db3a4aef078ae75c9032e14b17c9493c696;hpb=0004b53d41de75563d76342c5403aa101b8a4518;p=fa-stable.git diff --git a/js/utils.js b/js/utils.js index cb1c0db3..f4a4f65c 100644 --- a/js/utils.js +++ b/js/utils.js @@ -1,24 +1,63 @@ +/********************************************************************** + 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 . +***********************************************************************/ // // JsHttpRequest class extensions. // - JsHttpRequest.request= function(submit) { - var url = window.location.toString(); - url = url.substring(0, url.indexOf('?')); +// Main functions for asynchronus form submitions +// Trigger is the source of request and can have following forms: +// - 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'; + 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); - JsHttpRequest.query( - 'POST '+url, // backend - this.formValues(submit), + var upload = form && form.enctype=='multipart/form-data'; + + var url = form ? form.action : + 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; + + JsHttpRequest.query( + (upload ? "form." : "")+"POST "+url, // force form loader + content, // Function is called when an answer arrives. function(result, errors) { - // Write errors to the debug div. - document.getElementById('msgbox').innerHTML = errors; - // Write the answer. + var newwin = 0; if (result) { for(var i in result ) { atom = result[i]; - cmd = atom['n']; property = atom['p']; type = atom['c']; @@ -28,67 +67,84 @@ // 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."+property+"=data;"); + 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 + } + } else if(cmd=='di') { // disable/enable element objElement.disabled = data; } else if(cmd=='fc') { // set focus _focus = data; } else if(cmd=='js') { // evaluate js code eval(data); } else if(cmd=='rd') { // client-side redirection - _page_reload = true; 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+'
Unknown ajax function: '+cmd; } - } - Behaviour.apply(); + } + + // 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) + // collect all form input values plus inp trigger value + JsHttpRequest.formInputs = function(inp, objForm, upload) { - var objForm; - var submitObj; + var submitObj = inp; var q = {}; - + if (typeof(inp) == "string") submitObj = document.getElementsByName(inp)[0]; else submitObj = inp; - if(submitObj) { - objForm = submitObj.form; - } + + objForm = objForm || (submitObj && submitObj.form); + if (objForm) { var formElements = objForm.elements; 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) - || (el.type == 'submit' && el.name!=submitObj.name)) + || (el.type == 'submit' && (!submitObj || el.name!=submitObj.name))) continue; if (el.disabled && el.disabled == true) continue; - var name = el.name; if (name) { if(el.type=='select-multiple') @@ -106,14 +162,13 @@ } } } - // this is to avoid caching problems - q['_random'] = Math.random()*1234567; return q; } // // User price formatting // -function price_format(post, num, dec, label) { +function price_format(post, num, dec, label, color) { + var el = label ? document.getElementById(post) : document.getElementsByName(post)[0]; //num = num.toString().replace(/\$|\,/g,''); if(isNaN(num)) num = "0"; @@ -132,9 +187,12 @@ function price_format(post, num, dec, label) { num = ((sign)?'':'-') + num; if(dec!=0) num = num + user.ds + cents; if(label) - document.getElementById(post).innerHTML = num; + el.innerHTML = num; else - document.getElementsByName(post)[0].value = num; + el.value = num; + if(color) { + el.style.color = (sign) ? '' : '#FF0000'; + } } function get_amount(doc, label) { @@ -143,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() { @@ -156,22 +214,89 @@ function goBack() { function setFocus(name, byId) { - if(!name) { - if (_focus) - name = _focus; // last focus set in onfocus handlers - else { // no current focus - set it from from hidden var (first page display) - var cur = document.getElementsByName('_focus')[0]; - if(cur) name = cur.value; - } + if(typeof(name)=='object') + el = name; + else { + if(!name) { // page load/ajax update + if (_focus) + name = _focus; // last focus set in onfocus handlers + 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(byId || !(el = document.getElementsByName(name)[0])) + el = document.getElementById(name); } - if(byId) - el = document.getElementById(name); - else - el = document.getElementsByName(name)[0]; if(el && 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()}; + + var tmp = function() {el.focus(); if (el.select) el.select();}; setTimeout(tmp, 0); } } +/* + Find closest element in neighbourhood and set focus. + dir is arrow keycode. +*/ +function move_focus(dir, e0, neighbours) +{ + var p0 = element_pos(e0); + var t; + var l=0; + for(var i=0; ip0.y)) || (dir==38 && (p.yp0.x)))) { + var l1 = (p.y-p0.y)*(p.y-p0.y)+(p.x-p0.x)*(p.x-p0.x); + if ((l1