Bug 11027: Add a column for basketgroups in late orders table and improve other columns
[koha.git] / koha-tmpl / intranet-tmpl / prog / en / js / acq.js
1 //=======================================================================
2 //input validation:
3 // acqui/uncertainprice.tmpl uses this
4 function uncheckbox(form, field) {
5     var price = new Number(form.elements['price' + field].value);
6     var tmpprice = "";
7     var errmsg = MSG_INVALIDPRICE;
8     if (isNaN(price)) {
9         alert(errmsg);
10         for(var i=0; i<form.elements['price' + field].value.length; ++i) {
11             price = new Number(form.elements['price' + field].value[i]);
12             if(! isNaN(price) || form.elements['price' + field].value[i] == ".") {
13                 tmpprice += form.elements['price' + field].value[i];
14             }
15         }
16         form.elements['price' + field].value = tmpprice;
17         return false;
18     }
19     form.elements['uncertainprice' + field].checked = false;
20     return true;
21 }
22
23 // returns false if value is empty
24 function isNotNull(f,noalert) {
25     if (f.value.length ==0) {
26         return false;
27     }
28     return true;
29 }
30
31 function isNull(f,noalert) {
32     if (f.value.length > 0) {
33         return false;
34     }
35     return true;
36 }
37
38 //Function returns false if v is not a number (if maybenull is 0, it also returns an error if the number is 0)
39 function isNum(v,maybenull) {
40     var n = new Number(v.value);
41     if (isNaN(n)) {
42         return false;
43     }
44     if (maybenull==0 && v.value=='') {
45
46
47     return false;
48     }
49     return true;
50 }
51
52
53 //a logging function (a bit buggy, might open millions of log pages when initializing, but works fine after...
54 function log(message) {
55     if (!log.window_ || log.window_.closed) {
56         var win = window.open("", null, "width=400,height=200," +
57                             "scrollbars=yes,resizable=yes,status=no," +
58                             "location=no,menubar=no,toolbar=no");
59         if (!win) return;
60         var doc = win.document;
61         doc.write("<html><head><title>Debug Log</title></head>" +
62                 "<body></body></html>");
63         doc.close();
64         log.window_ = win;
65     }
66     var logLine = log.window_.document.createElement("div");
67     logLine.appendChild(log.window_.document.createTextNode(message));
68     log.window_.document.body.appendChild(logLine);
69 }
70
71 //=======================================================================
72 function getElementsByClass( searchClass, domNode, tagName) {
73     if (domNode == null) domNode = document;
74     if (tagName == null) tagName = '*';
75     var el = new Array();
76     var tags = domNode.getElementsByTagName(tagName);
77     var tcl = " "+searchClass+" ";
78     for(i=0,j=0; i<tags.length; i++) {
79         var test = " " + tags[i].className + " ";
80         if (test.indexOf(tcl) != -1)
81             el[j++] = tags[i];
82     }
83     return el;
84 }
85
86
87 function calcTotalRow(cell) {
88
89     var string = cell.name;
90     var pos = string.indexOf(",", 0);
91     var bud_id = string.substring(0, pos);
92     var val1 =    cell.value;
93     var remainingTotal =   document.getElementById("budget_est_"+bud_id);
94     var remainingNew =0;
95     var budgetTotal  =  document.getElementById("budget_tot_"+bud_id ).textContent;
96     var arr =  getElementsByClass(cell.className);
97
98     budgetTotal   =  budgetTotal.replace(/\,/, "");
99
100 //percent strip and convert
101     if ( val1.match(/\%/) )   {
102         val1 = val1.replace(/\%/, "");
103         cell.value =    (val1 / 100) *  Math.abs(budgetTotal ) ;
104     }
105
106     for ( var i=0, len=arr.length; i<len; ++i ){
107         remainingNew   +=   Math.abs(arr[i].value);
108     }
109
110     var cc = new Number(cell.value);
111     cell.value =  cc.toFixed(2); // TIDYME...
112     remainingNew    =    Math.abs( budgetTotal  ) -  remainingNew   ;
113
114     if ( remainingNew  == 0)  {
115         remainingTotal.style.color = 'black';
116     }
117     else if ( remainingNew   > 0   )       {
118         remainingTotal.style.color = 'green';
119     } else  {    // if its negative, make it red..
120         remainingTotal.style.color = 'red';
121     }
122
123     remainingTotal.textContent  = remainingNew.toFixed(2) ;
124 }
125
126 function autoFillRow(bud_id) {
127
128     var remainingTotal =   document.getElementById("budget_est_"+bud_id);
129     var remainingNew = new Number;
130     var budgetTotal  =  document.getElementById("budget_tot_"+bud_id ).textContent;
131     var arr =  getElementsByClass("plan_entry_" + bud_id);
132
133     budgetTotal   =  budgetTotal.replace(/\,/, "");
134     var qty = new Number;
135 // get the totals
136     var novalueArr = new Array();
137     for ( var i=0, len=arr.length; i<len; ++i ) {
138         remainingNew   +=   Math.abs (arr[i].value );
139
140         if ( arr[i].value == 0 ) {
141             novalueArr[qty] = arr[i];
142             qty += 1;
143         }
144     }
145
146     remainingNew    =    Math.abs( budgetTotal) -  remainingNew   ;
147     var newCell = new Number (remainingNew / qty);
148     var rest = new Number (remainingNew - (newCell.toFixed(2) * (novalueArr.length - 1)));
149
150     for (var i = 0; i<novalueArr.length; ++i) {
151          if (i == novalueArr.length - 1) {
152              novalueArr[i].value = rest.toFixed(2);
153          }else {
154              novalueArr[i].value = newCell.toFixed(2);
155         }
156     }
157
158     remainingTotal.textContent = '0.00' ;
159     remainingTotal.style.color = 'black';
160 }
161
162
163 function messenger(X,Y,etc){    // FIXME: unused?
164     win=window.open("","mess","height="+X+",width="+Y+",screenX=150,screenY=0");
165     win.focus();
166     win.document.close();
167     win.document.write("<body link='#333333' bgcolor='#ffffff' text='#000000'><font size='2'><p><br />");
168     win.document.write(etc);
169     win.document.write("<center><form><input type=button onclick='self.close()' value='Close'></form></center>");
170     win.document.write("</font></body></html>");
171 }
172
173
174 //=======================================================================
175
176 //  NEXT BLOCK IS USED BY NEWORDERBEMPTY
177
178 function updateCosts(){
179     var quantity = new Number($("#quantity").val());
180     var discount = new Number($("#discount").val());
181     var applygst = new Number ($("#applygst").val());
182     var listprice   =  new Number($("#listprice").val());
183     var currcode = new String($("#currency").val());
184     var exchangerate =  new Number($("#currency_rate_"+currcode).val());
185     var gst_on=false;
186
187     var rrp   = new Number(listprice*exchangerate);
188     var ecost = rrp;
189     if ( 100-discount != 100 ) { //Prevent rounding issues if no discount
190         ecost = new Number(Math.floor(rrp * (100 - discount )) / 100);
191     }
192     var total =  new Number( ecost * quantity);
193     $("#rrp").val(rrp.toFixed(2));
194     $("#ecost").val(ecost.toFixed(2));
195     $("#total").val(total.toFixed(2));
196     $("listprice").val(listprice.toFixed(2));
197
198     return true;
199 }
200
201 // Calculates total amount in a suggestion
202
203 function calcNewsuggTotal(){
204     //collect values
205     var quantity = Number(document.getElementById('quantity').value);
206     var currcode = String(document.getElementById('currency').value);
207     var price   =  Number(document.getElementById('price').value);
208     var exchangerate =  Number(document.getElementById('currency_rate_'+currcode).value);
209
210     var total =  Number(quantity*price*exchangerate);
211
212     document.getElementById('total').value = total.toFixed(2);
213     document.getElementById('price').value =  price.toFixed(2);
214     return true;
215 }
216
217
218 // ----------------------------------------
219 //USED BY NEWORDEREMPTY.PL
220 /*
221 function fetchSortDropbox(f) {
222     var  budgetId=f.budget_id.value;
223     var handleSuccess = function(o){
224         if(o.responseText !== undefined){
225             sort_dropbox.innerHTML   = o.responseText;
226         }
227     }
228
229     var callback = {   success:handleSuccess };
230     var sUrl = '../acqui/fetch_sort_dropbox.pl?sort=1&budget_id='+budgetId
231     var sort_dropbox = document.getElementById('sort1');
232     var request1 = YAHOO.util.Connect.asyncRequest('GET', sUrl, callback);
233     var rr = '00';
234
235 // FIXME: ---------  twice , coz the 2 requests get mixed up otherwise
236
237     var handleSuccess2 = function(o){
238     if(o.responseText !== undefined){
239         sort2_dropbox.innerHTML   = o.responseText;
240         }
241     }
242
243     var callback2 = {   success:handleSuccess };
244     var sUrl2 = '../acqui/fetch_sort_dropbox.pl?sort=2&budget_id='+budgetId;
245     var sort2_dropbox = document.getElementById('sort2');
246     var request2 = YAHOO.util.Connect.asyncRequest('GET', sUrl2, callback2);
247
248 }
249 */
250
251
252
253 //USED BY NEWORDEREMPTY.PL
254 function fetchSortDropbox(f) {
255     var  budgetId=f.budget_id.value;
256
257 for (i=1;i<=2;i++) {
258
259     var sort_zone = document.getElementById('sort'+i+'_zone');
260     var url = '../acqui/fetch_sort_dropbox.pl?sort='+i+'&budget_id='+budgetId;
261
262     var xmlhttp = null;
263     xmlhttp = new XMLHttpRequest();
264     if ( typeof xmlhttp.overrideMimeType != 'undefined') {
265         xmlhttp.overrideMimeType('text/xml');
266     }
267
268     xmlhttp.open('GET', url, false);
269     xmlhttp.send(null);
270
271     xmlhttp.onreadystatechange = function() {
272         if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
273     // stupid JS...
274         } else {
275     // wait for the call to complete
276         }
277     };
278     // rc =  eval ( xmlhttp.responseText );
279     var retRootType = xmlhttp.responseXML.firstChild.nodeName;
280     var existingInputs = sort_zone.getElementsByTagName('input');
281     if (existingInputs.length > 0 && retRootType == 'input') {
282         // when sort is already an input, do not override to preseve value
283         return;
284     }
285     sort_zone.innerHTML = xmlhttp.responseText;
286 }
287 }
288
289
290
291
292
293
294
295 //USED BY NEWORDEREMPTY.PL
296 function totalExceedsBudget(budgetId, total) {
297
298     var xmlhttp = null;
299     xmlhttp = new XMLHttpRequest();
300     if ( typeof xmlhttp.overrideMimeType != 'undefined') {
301         xmlhttp.overrideMimeType('text/xml');
302     }
303
304     var url = '../acqui/check_budget_total.pl?budget_id=' + budgetId + "&total=" + total;
305     xmlhttp.open('GET', url, false);
306     xmlhttp.send(null);
307
308     xmlhttp.onreadystatechange = function() {
309         if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
310
311             actTotal = eval ( xmlhttp.responseText );
312
313             if (  Math.abs(actTotal) < Math.abs(total)  ) {
314             // if budget is to low :(
315                 return true ;
316             } else {
317                 return false;
318             }
319         }
320     }
321 }
322
323
324 //USED BY AQBUDGETS.TMPL
325 function budgetExceedsParent(budgetTotal, budgetId, newBudgetParent, periodID) {
326
327
328     var xmlhttp = null;
329     xmlhttp = new XMLHttpRequest();
330     if ( typeof xmlhttp.overrideMimeType != 'undefined') {
331         xmlhttp.overrideMimeType('text/xml');
332     }
333
334 // make the call... yawn
335 //    var url = '../admin/check_parent_total.pl?budget_id=' + budgetId +   '&parent_id=' + newBudgetParent  + "&total=" + budgetTotal + "&period_id="+ periodID   ;
336
337
338     var url = '../admin/check_parent_total.pl?total=' + budgetTotal + "&period_id="+ periodID   ;
339
340 if (budgetId ) { url +=  '&budget_id=' + budgetId };
341 if ( newBudgetParent  ) { url +=  '&parent_id=' + newBudgetParent};
342
343
344     xmlhttp.open('GET', url, false);
345     xmlhttp.send(null);
346
347     xmlhttp.onreadystatechange = function() {
348         if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
349     // stupid JS...
350         } else {
351     // wait for the call to complete
352         }
353     };
354
355     var result = eval ( xmlhttp.responseText );
356
357     if (result == '1') {
358             return MSG_BUDGET_PARENT_ALLOCATION;
359     } else if (result == '2') {
360             return MSG_BUDGET_PERIOD_ALLOCATION;
361     } else  {
362             return false;
363     }
364 }
365
366
367
368
369 //USED BY AQBUDGETS.TMPL
370 function checkBudgetParent(budgetId, newBudgetParent) {
371     var xmlhttp = null;
372     xmlhttp = new XMLHttpRequest();
373     if ( typeof xmlhttp.overrideMimeType != 'undefined') {
374         xmlhttp.overrideMimeType('text/xml');
375     }
376
377     var url = '../admin/check_budget_parent.pl?budget_id=' + budgetId + '&new_parent=' + newBudgetParent;
378     xmlhttp.open('GET', url, false);
379     xmlhttp.send(null);
380
381     xmlhttp.onreadystatechange = function() {
382         if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
383     // do something with the results
384         } else {
385     // wait for the call to complete
386         }
387     };
388
389     var result = eval ( xmlhttp.responseText );
390
391     if (result == '1') {
392             return MSG_PARENT_BENEATH_BUDGET;
393 //     } else if (result == '2') {
394 //            return "- New budget-parent has insufficent funds\n";
395 //     } else  {
396 //              return false;
397     }
398 }
399
400 function hideColumn(num) {
401     $("#hideall,#showall").removeAttr("checked").parent().removeClass("selected");
402     $("#"+num).parent().removeClass("selected");
403     var hide = Number(num.replace("col","")) + 2;
404     // hide header and cells matching the index
405     $("#plan td:nth-child("+hide+"),#plan th:nth-child("+hide+")").toggle();
406 }
407
408 function showColumn(num){
409     $("#hideall").removeAttr("checked").parent().removeClass("selected");
410     $("#"+num).parent().addClass("selected");
411     // set the index of the table column to hide
412     show = Number(num.replace("col","")) + 2;
413     // hide header and cells matching the index
414     $("#plan td:nth-child("+show+"),#plan th:nth-child("+show+")").toggle();
415 }
416
417 function showAllColumns(){
418     $("#selections").checkCheckboxes();
419     $("#selections span").addClass("selected");
420     $("#plan td:nth-child(2),#plan tr th:nth-child(2)").nextAll().show();
421     $("#hideall").removeAttr("checked").parent().removeClass("selected");
422 }
423 function hideAllColumns(){
424     var allCols = $("#plan th").length;
425     $("#selections").unCheckCheckboxes();
426     $("#selections span").removeClass("selected");
427     $("#plan td:nth-child(2),#plan th:nth-child(2)").nextUntil("th:nth-child("+(allCols-1)+"),td:nth-child("+(allCols-1)+")").hide(); // hide all but the last two columns
428     $("#hideall").attr("checked","checked").parent().addClass("selected");
429 }