1 //=======================================================================
3 // acqui/uncertainprice.tmpl uses this
4 function uncheckbox(form, field) {
5 var price = new Number(form.elements['price' + field].value);
7 var errmsg = "ERROR: Price is not a valid number, please check the price and try again!"
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];
16 form.elements['price' + field].value = tmpprice;
19 form.elements['uncertainprice' + field].checked = false;
23 // returns false if value is empty
24 function isNotNull(f,noalert) {
25 if (f.value.length ==0) {
31 function isNull(f,noalert) {
32 if (f.value.length > 0) {
44 //Function returns false if v is not a number (if maybenull is 0, it also returns an error if the number is 0)
45 function isNum(v,maybenull) {
46 var n = new Number(v.value);
50 if (maybenull==0 && v.value=='') {
58 // this function checks if date is like DD/MM/YYYY
59 function CheckDate(field) {
64 var date = d.split("/");
67 if ( (date.length < 2) && (ok==1) ) {
68 msg = _("Separator must be /");
69 alert(msg); ok=0; field.focus();
76 if ( ((isNaN(dd))||(dd<1)||(dd>31)) && (ok==1) ) {
77 msg = _("day not correct.");
78 alert(msg); ok=0; field.focus();
82 if ( ((isNaN(mm))||(mm<1)||(mm>12)) && (ok==1) ) {
83 msg = _("month not correct.");
84 alert(msg); ok=0; field.focus();
88 if ( ((isNaN(yyyy))||(yyyy<amin)||(yyyy>amax)) && (ok==1) ) {
89 msg = _("years not correct.");
90 alert(msg); ok=0; field.focus();
93 // check day/month combination
94 if ((mm==4 || mm==6 || mm==9 || mm==11) && dd==31) {
95 msg = _("Invalid Day/Month combination. Please ensure that you have a valid day/month combination.");
96 alert(msg); ok=0; field.focus();
99 // check for february 29th
101 var isleap = (yyyy % 4 == 0 && (yyyy % 100 != 0 || yyyy % 400 == 0));
102 if (dd>29 || (dd==29 && !isleap)) {
103 msg = _("Invalid Day. This year is not a leap year. Please enter a value less than 29 for the day.");
104 alert(msg); ok=0; field.focus();
112 // Checks wether start date is greater than end date
113 function CompareDate(startdate, enddate) {
114 startdate=startdate.split("/");
115 syear = startdate[2];
116 smonth = startdate[1];
118 enddate=enddate.split("/");
123 var sdate = new Date(syear,smonth-1,sday);
124 var edate = new Date(eyear,emonth-1,eday);
126 msg = _("Start date after end date, please check the dates!");
127 alert(msg); ok=0; field.focus();
133 // checks wether end date is before today, returns false if it is
134 function CheckEndDate(enddate) {
135 enddate=enddate.split("/");
139 var edate = new Date(eyear,emonth-1,eday);
140 var today = new Date( );
142 msg = _("End date before today, Invalid end date!");
143 alert(msg); ok=0; field.focus();
151 //=======================================================================
153 //=======================================================================
154 // Functions for drag-and-drop functionality
159 var Dom = YAHOO.util.Dom;
160 var Event = YAHOO.util.Event;
161 var DDM = YAHOO.util.DragDropMgr;
165 var uls = document.getElementsByTagName('ul');
168 for (i=0; i<uls.length;i=i+1) {
169 if (uls[i].className == "draglist" || uls[i].className == "draglist_alt") {
170 ddtarget = YAHOO.util.DragDropMgr.getDDById(uls[i].id);
171 // The yahoo drag and drop is written (broken or not) in such a way, that if an element is subscribed as a target multiple times,
172 // it has to be unlinked multiple times, so we need to test wether it is allready a target, otherwise we'll have a problem when closing the group
174 new YAHOO.util.DDTarget(uls[i].id);
176 var children = uls[i].getElementsByTagName('li');
177 for( j=0; j<children.length; j=j+1) {
178 // The yahoo drag and drop is (broken or not) in such a way, that if an element is subscribed as a target multiple times,
179 // it has to be unlinked multiple times, so we need to test wether it is allready a target, otherwise we'll have a problem when closing the group
180 ddtarget = YAHOO.util.DragDropMgr.getDDById(children[j].id);
182 new DDList(children[j].id);
191 // drag and drop implementation
193 DDList = function(id, sGroup, config) {
195 DDList.superclass.constructor.call(this, id, sGroup, config);
197 this.logger = this.logger || YAHOO;
198 var el = this.getDragEl();
199 Dom.setStyle(el, "opacity", 0.67); // The proxy is slightly transparent
201 this.goingUp = false;
205 YAHOO.extend(DDList, YAHOO.util.DDProxy, {
207 startDrag: function(x, y) {
208 this.logger.log(this.id + " startDrag");
210 // make the proxy look like the source element
211 var dragEl = this.getDragEl();
212 var clickEl = this.getEl();
213 Dom.setStyle(clickEl, "visibility", "hidden");
215 dragEl.innerHTML = clickEl.innerHTML;
217 Dom.setStyle(dragEl, "color", Dom.getStyle(clickEl, "color"));
218 Dom.setStyle(dragEl, "backgroundColor", Dom.getStyle(clickEl, "backgroundColor"));
219 Dom.setStyle(dragEl, "border", "2px solid gray");
222 endDrag: function(e) {
224 var srcEl = this.getEl();
225 var proxy = this.getDragEl();
227 // Show the proxy element and animate it to the src element's location
228 Dom.setStyle(proxy, "visibility", "");
229 var a = new YAHOO.util.Motion(
236 YAHOO.util.Easing.easeOut
238 var proxyid = proxy.id;
239 var thisid = this.id;
241 // Hide the proxy and show the source element when finished with the animation
242 a.onComplete.subscribe(function() {
243 Dom.setStyle(proxyid, "visibility", "hidden");
244 Dom.setStyle(thisid, "visibility", "");
247 // if we are in basketgrouping page, when finished moving, edit the basket's info to reflect new status
248 if(typeof(basketgroups) != 'undefined') {
249 a.onComplete.subscribe(function() {
250 var reg = new RegExp("[-]+", "g");
251 // add a changed input to each moved basket, so we know which baskets to modify,
252 // and so we don't need to modify each and every basket and basketgroup each time the page is loaded
253 // FIXME: we shouldn't use getElementsByTagName, it's not explicit enough :-(
254 srcEl.getElementsByTagName('input')[1].value = "1";
255 if ( srcEl.parentNode.parentNode.className == "workarea" ) {
256 var dstbgroupid = srcEl.parentNode.parentNode.getElementsByTagName('input')[srcEl.parentNode.parentNode.getElementsByTagName('input').length-2].name.split(reg)[1];
257 srcEl.className="grouped";
258 srcEl.getElementsByTagName('input')[0].value = dstbgroupid;
259 //FIXME: again, we shouldn't be using getElementsByTagName!!
260 srcEl.parentNode.parentNode.getElementsByTagName('input')[srcEl.parentNode.parentNode.getElementsByTagName('input').length-1].value = 1;
262 else if ( srcEl.parentNode.parentNode.className == "workarea_alt" ){
263 srcEl.className="ungrouped";
264 srcEl.getElementsByTagName('input')[0].value = "0";
270 onDragDrop: function(e, id) {
272 // If there is one drop interaction, the li was dropped either on the list,
273 // or it was dropped on the current location of the source element.
274 if (DDM.interactionInfo.drop.length === 1) {
276 // The position of the cursor at the time of the drop (YAHOO.util.Point)
277 var pt = DDM.interactionInfo.point;
279 // The region occupied by the source element at the time of the drop
280 var region = DDM.interactionInfo.sourceRegion;
282 // Check to see if we are over the source element's location. We will
283 // append to the bottom of the list once we are sure it was a drop in
284 // the negative space (the area of the list without any list items)
285 if (!region.intersect(pt)) {
286 var destEl = Dom.get(id);
287 var destDD = DDM.getDDById(id);
288 destEl.appendChild(this.getEl());
289 destDD.isEmpty = false;
295 onDrag: function(e) {
297 // Keep track of the direction of the drag for use during onDragOver
298 var y = Event.getPageY(e);
300 if (y < this.lastY) {
302 } else if (y > this.lastY) {
303 this.goingUp = false;
308 onDragOver: function(e, id) {
310 var srcEl = this.getEl();
311 var destEl = Dom.get(id);
313 // We are only concerned with list items, we ignore the dragover
314 // notifications for the list.
315 if (destEl.nodeName.toLowerCase() == "li") {
316 var orig_p = srcEl.parentNode;
317 var p = destEl.parentNode;
320 p.insertBefore(srcEl, destEl); // insert above
322 p.insertBefore(srcEl, destEl.nextSibling); // insert below
334 //creates new group, parameter is the group's name
335 function newGroup(event, name) {
339 if (!enterpressed(event) && event != "button"){
342 var pardiv = document.getElementById('groups');
343 var newdiv = document.createElement('div');
344 var newh3 = document.createElement('h3');
345 var newul = document.createElement('ul');
346 var newclose = document.createElement('a');
347 var newrename = document.createElement('a');
348 var newbasketgroupname = document.createElement('input');
349 var nbgclosed = document.createElement('input');
350 var newp = document.createElement('p');
351 var reg=new RegExp("[-]+", "g");
354 while( i < pardiv.getElementsByTagName('input').length ){
355 if (! isNaN(parseInt(pardiv.getElementsByTagName('input')[i].name.split(reg)[1])) && parseInt(pardiv.getElementsByTagName('input')[i].name.split(reg)[1]) > maxid){
356 maxid = parseInt(pardiv.getElementsByTagName('input')[i].name.split(reg)[1]);
360 // var bgid = parseInt(pardiv.getElementsByTagName('input')[pardiv.getElementsByTagName('input').length-2].name.split(reg)[1]) + 1;
361 var bgid = maxid + 1;
362 var newchanged = document.createElement('input');
365 newul.className='draglist';
367 newh3.innerHTML=name;
368 // newh3.style.display="inline";
370 newclose.innerHTML="close";
371 newclose.href="javascript: closebasketgroup('"+bgid+"', 'bg-"+bgid+"');";
373 newrename.href="javascript:" + "renameinit("+bgid+");";
374 newrename.innerHTML="rename";
376 // newp.style.display="inline";
377 newp.innerHTML=" [ ";
378 newp.appendChild(newrename);
379 newp.innerHTML+=" / ";
380 newp.appendChild(newclose);
381 newp.innerHTML+=" ]";
383 newbasketgroupname.type="hidden";
384 newbasketgroupname.name="basketgroup-" + bgid + "-name";
385 newbasketgroupname.id = "basketgroup-" + bgid + "-name";
386 newbasketgroupname.value=name;
388 nbgclosed.type="hidden";
389 nbgclosed.name="basketgroup-" + bgid + "-closed";
391 nbgclosed.id=nbgclosed.name;
393 newchanged.type="hidden";
394 newchanged.id="basketgroup-"+bgid+"-changed";
395 newchanged.name=newchanged.id;
396 newchanged.value="1";
398 newdiv.style.backgroundColor='red';
399 newdiv.appendChild(newh3);
400 newdiv.appendChild(newp);
401 newdiv.appendChild(newul);
402 newdiv.appendChild(newbasketgroupname);
403 newdiv.appendChild(nbgclosed);
404 newdiv.appendChild(newchanged);
405 newdiv.className='workarea';
406 pardiv.appendChild(newdiv);
408 YAHOO.util.Event.onDOMReady(DDApp.init, DDApp, true);
411 //this traps enters in input fields
412 function enterpressed(event){
414 if (window.event) keycode = window.event.keyCode;
415 else if (event) keycode = event.which;
429 //Closes a basketgroup
430 function closebasketgroup(bgid) {
431 var answer=confirm(_("Are you sure you want to close this basketgroup?"));
437 tagname='basketgroup-'+bgid+'-closed';
439 var closeinput = document.getElementById(tagname);
440 closeinput.value = 1;
441 var changed = document.getElementById("basketgroup-"+bgid+"-changed");
444 var div = document.getElementById(tagname).parentNode;
445 var stufftoremove = div.getElementsByTagName('p')[0];
446 var ul = document.getElementById(ulid);
447 var lis = ul.getElementsByTagName('li');
448 if (lis.length == 0 ) {
449 alert(_("Why close an empty basket?"));
452 var cantprint = document.createElement('p');
454 div.className = "closed";
455 ul.className="closed";
457 for(i=0; i<lis.length; ++i) {
458 ddtarget = YAHOO.util.DragDropMgr.getDDById(lis[i].id);
461 ddtarget = YAHOO.util.DragDropMgr.getDDById(ul.id);
463 div.removeChild(stufftoremove);
464 // the print button is disabled because the page's content might (or is probably) not in sync with what the database contains
465 cantprint.innerHTML=_("You need to save the page before printing");
466 cantprint.id = 'cantprint-' + bgid;
467 var unclosegroup = document.createElement('a');
468 unclosegroup.href='javascript:unclosegroup('+bgid+');';
469 unclosegroup.innerHTML=_("reopen basketgroup");
470 unclosegroup.id = 'unclose-' + bgid;
472 div.appendChild(cantprint);
473 div.appendChild(unclosegroup);
476 function closeandprint(bg){
477 if(document.location = '/cgi-bin/koha/acqui/basketgroup.pl?op=closeandprint&basketgroupid=' + bg ){
478 setTimeout("window.location.reload();",3000);
480 alert('Error downloading the file');
484 //function that lets the user unclose a basketgroup as long as he hasn't submitted the changes to the page.
485 function unclosegroup(bgid){
486 var div = document.getElementById('basketgroup-'+bgid+'-closed').parentNode;
487 var divtodel = document.getElementById('unclose-' + bgid);
489 div.removeChild(divtodel);
491 divtodel = document.getElementById('unclose-' + bgid);
493 div.removeChild(divtodel);
495 var closeinput = document.getElementById('basketgroup-'+bgid+'-closed');
496 var ul = document.getElementById('bg-'+bgid);
498 var newclose = document.createElement('a');
499 var newrename = document.createElement('a');
500 var newp = document.createElement('p');
502 newclose.innerHTML="close";
503 newclose.href="javascript: closebasketgroup('"+bgid+"', 'bg-"+bgid+"');";
505 newrename.href="javascript:" + "renameinit("+bgid+");";
506 newrename.innerHTML="rename";
508 var todel = div.getElementsByTagName('p')[0];
509 div.removeChild(todel);
511 var changed = document.getElementById("basketgroup-"+bgid+"-changed");
514 newp.innerHTML=" [ ";
515 newp.appendChild(newrename);
516 newp.innerHTML+=" / ";
517 newp.appendChild(newclose);
518 newp.innerHTML+=" ]";
520 div.insertBefore(newp, ul);
521 closeinput.value="0";
522 div.className = "workarea";
523 ul.className="draglist";
525 //rescan draglists, we have a new target (again :-)
526 YAHOO.util.Event.onDOMReady(DDApp.init, DDApp, true);
529 //a function to filter basketgroups using a regex (javascript regex)
530 function filterGroups(event, searchstring ){
531 if (!enterpressed(event) && event != "button"){
534 var reg = new RegExp(searchstring, "g");
535 var Dom = YAHOO.util.Dom;
536 var divs = Dom.getElementsByClassName("workarea", "div");
538 for (var i = 0; i < divs.length; ++i){
539 if (! reg.exec(divs[i].innerHTML)){
540 divs[i].style.display='none';
543 divs[i].style.display='';
546 divs = Dom.getElementsByClassName("closed", "div");
547 for (var i = 0; i < divs.length; ++i){
548 if (! reg.exec(divs[i].innerHTML)){
549 divs[i].style.display='none';
552 divs[i].style.display='';
557 //function to hide (or show) closed baskets (if show is true, it shows all the closed baskets)
558 function showhideclosegroups(show){
559 var Dom = YAHOO.util.Dom;
560 var divs = Dom.getElementsByClassName("closed", "div");
565 else display = 'none';
566 for(var i = 0; i < divs.length; ++i){
567 divs[i].style.display=display;
571 function renameinit(bgid){
572 var ul = document.getElementById('bg-'+bgid);
573 var div = ul.parentNode;
574 var nameelm = div.getElementsByTagName('h3')[0];
575 var p = div.getElementsByTagName('p')[0];
578 var nameinput = document.createElement("input");
579 nameinput.type = "text";
580 nameinput.id="rename-"+bgid;
581 nameinput.value = nameelm.innerHTML;
582 nameinput.onkeypress = function(e){rename(e, bgid, document.getElementById('rename-'+bgid).value); };
583 // nameinput.setAttribute('onkeypress', 'rename(event, bgid, document.getElementById(rename-'+bgid+').value);');
585 div.removeChild(nameelm);
586 div.insertBefore(nameinput, p);
589 function rename(event, bgid, name){
590 if (!enterpressed(event)){
593 var ul = document.getElementById('bg-'+bgid);
594 var div = ul.parentNode;
595 var p = div.getElementsByTagName('p')[0];
596 var nameinput = document.getElementById("rename-"+bgid);
597 var changedinput = document.getElementById("basketgroup-"+bgid+"-changed");
598 var newh3 = document.createElement("h3");
599 var hiddenname = document.getElementById("basketgroup-"+bgid+"-name");
601 div.removeChild(nameinput);
603 newh3.innerHTML=name;
604 hiddenname.value=name;
605 changedinput.value = 1;
606 div.insertBefore(newh3, p);
609 //=======================================================================
610 //a logging function (a bit buggy, might open millions of log pages when initializing, but works fine after...
611 function log(message) {
612 if (!log.window_ || log.window_.closed) {
613 var win = window.open("", null, "width=400,height=200," +
614 "scrollbars=yes,resizable=yes,status=no," +
615 "location=no,menubar=no,toolbar=no");
617 var doc = win.document;
618 doc.write("<html><head><title>Debug Log</title></head>" +
619 "<body></body></html>");
623 var logLine = log.window_.document.createElement("div");
624 logLine.appendChild(log.window_.document.createTextNode(message));
625 log.window_.document.body.appendChild(logLine);
627 //=======================================================================
631 function ownerPopup(f) {
632 window.open("/cgi-bin/koha/admin/aqbudget_owner_search.pl?op=budget",'PatronPopup','width=740,height=450,location=yes,toolbar=no,scrollbars=yes,resize=yes');
635 //=======================================================================
636 function getElementsByClass( searchClass, domNode, tagName) {
637 if (domNode == null) domNode = document;
638 if (tagName == null) tagName = '*';
639 var el = new Array();
640 var tags = domNode.getElementsByTagName(tagName);
641 var tcl = " "+searchClass+" ";
642 for(i=0,j=0; i<tags.length; i++) {
643 var test = " " + tags[i].className + " ";
644 if (test.indexOf(tcl) != -1)
651 function calcTotalRow(cell) {
653 var bud_id = cell.className;
654 var val1 = cell.value;
655 var remainingTotal = document.getElementById("budget_est_"+bud_id) ;
657 var budgetTotal = document.getElementById("budget_tot_"+bud_id ).textContent;
658 var arr = getElementsByClass(bud_id);
660 budgetTotal = budgetTotal.replace(/\,/, "");
662 //percent strip and convert
663 if ( val1.match(/\%/) ) {
664 val1 = val1.replace(/\%/, "");
665 cell.value = (val1 / 100) * Math.abs(budgetTotal ) ;
668 for ( var i=0, len=arr.length; i<len; ++i ){
669 remainingNew += Math.abs(arr[i].value);
672 var cc = new Number(cell.value);
673 cell.value = cc.toFixed(2); // TIDYME...
674 remainingNew = Math.abs( budgetTotal ) - remainingNew ;
676 if ( remainingNew == 0) {
677 remainingTotal.style.color = 'black';
679 else if ( remainingNew > 0 ) {
680 remainingTotal.style.color = 'green';
681 } else { // if its negative, make it red..
682 remainingTotal.style.color = 'red';
685 remainingTotal.textContent = remainingNew.toFixed(2) ;
688 function autoFillRow(bud_id) {
690 var remainingTotal = document.getElementById("budget_est_"+bud_id) ;
691 var remainingNew = new Number;
692 var budgetTotal = document.getElementById("budget_tot_"+bud_id ).textContent;
693 var arr = getElementsByClass(bud_id);
695 budgetTotal = budgetTotal.replace(/\,/, "");
696 var qty = new Number;
698 for ( var i=0, len=arr.length; i<len; ++i ) {
699 remainingNew += Math.abs (arr[i].value );
701 if ( arr[i].value == 0 ) {
706 remainingNew = Math.abs( budgetTotal) - remainingNew ;
707 var newCell = new Number (remainingNew / qty);
709 for ( var i=0, len=arr.length; i<len; ++i ) {
710 if ( Math.abs(arr[i].value) == 0 ) {
711 arr[i].value = newCell.toFixed(2) ;
715 remainingTotal.textContent = '0.00' ;
716 remainingTotal.style.color = 'black';
720 function messenger(X,Y,etc){ // FIXME: unused?
721 win=window.open("","mess","height="+X+",width="+Y+",screenX=150,screenY=0");
723 win.document.close();
724 win.document.write("<body link='#333333' bgcolor='#ffffff' text='#000000'><font size='2'><p><br />");
725 win.document.write(etc);
726 win.document.write("<center><form><input type=button onclick='self.close()' value='Close'></form></center>");
727 win.document.write("</font></body></html>");
731 //=======================================================================
733 // NEXT BLOCK IS USED BY NEWORDERBEMPTY
735 function calcNeworderTotal(){
737 var f = document.getElementById('Aform');
738 var quantity = new Number(f.quantity.value);
739 var discount = new Number(f.discount.value);
740 var listinc = new Number (f.listinc.value);
741 var currency = f.currency.value;
742 var applygst = new Number (f.applygst.value);
743 var listprice = new Number(f.listprice.value);
744 var invoiceingst = new Number (f.invoiceincgst.value);
745 var exchangerate = new Number(f.elements[currency].value); //get exchange rate
746 var gst_on=(!listinc && invoiceingst);
749 var rrp = new Number(listprice*exchangerate);
750 var ecost = new Number(rrp * (100 - discount ) / 100);
751 var GST = new Number(0);
753 rrp=rrp * (1+f.gstrate.value / 100);
754 GST=ecost * f.gstrate.value / 100;
757 var total = new Number( (ecost + GST) * quantity);
759 f.rrp.value = rrp.toFixed(2);
762 // f.rrp.value = 'moo'
764 f.ecost.value = ecost.toFixed(2);
765 f.total.value = total.toFixed(2);
766 f.listprice.value = listprice.toFixed(2);
768 // gst-stuff needs verifing, mason.
775 // ----------------------------------------
776 //USED BY NEWORDEREMPTY.PL
778 function fetchSortDropbox(f) {
779 var budgetId=f.budget_id.value;
780 var handleSuccess = function(o){
781 if(o.responseText !== undefined){
782 sort_dropbox.innerHTML = o.responseText;
786 var callback = { success:handleSuccess };
787 var sUrl = '../acqui/fetch_sort_dropbox.pl?sort=1&budget_id='+budgetId
788 var sort_dropbox = document.getElementById('sort1');
789 var request1 = YAHOO.util.Connect.asyncRequest('GET', sUrl, callback);
792 // FIXME: --------- twice , coz the 2 requests get mixed up otherwise
794 var handleSuccess2 = function(o){
795 if(o.responseText !== undefined){
796 sort2_dropbox.innerHTML = o.responseText;
800 var callback2 = { success:handleSuccess };
801 var sUrl2 = '../acqui/fetch_sort_dropbox.pl?sort=2&budget_id='+budgetId;
802 var sort2_dropbox = document.getElementById('sort2');
803 var request2 = YAHOO.util.Connect.asyncRequest('GET', sUrl2, callback2);
810 //USED BY NEWORDEREMPTY.PL
811 function fetchSortDropbox(f) {
812 var budgetId=f.budget_id.value;
816 var sort_dropbox = document.getElementById('sort'+i);
817 var url = '../acqui/fetch_sort_dropbox.pl?sort='+i+'&budget_id='+budgetId;
820 xmlhttp = new XMLHttpRequest();
821 if ( typeof xmlhttp.overrideMimeType != 'undefined') {
822 xmlhttp.overrideMimeType('text/xml');
825 xmlhttp.open('GET', url, false);
828 xmlhttp.onreadystatechange = function() {
829 if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
832 // wait for the call to complete
835 // rc = eval ( xmlhttp.responseText );
836 sort_dropbox.innerHTML = xmlhttp.responseText;
846 //USED BY NEWORDEREMPTY.PL
847 function totalExceedsBudget(budgetId, total) {
850 xmlhttp = new XMLHttpRequest();
851 if ( typeof xmlhttp.overrideMimeType != 'undefined') {
852 xmlhttp.overrideMimeType('text/xml');
855 var url = '../acqui/check_budget_total.pl?budget_id=' + budgetId + "&total=" + total;
856 xmlhttp.open('GET', url, false);
859 xmlhttp.onreadystatechange = function() {
860 if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
862 actTotal = eval ( xmlhttp.responseText );
864 if ( Math.abs(actTotal) < Math.abs(total) ) {
865 // if budget is to low :(
875 //USED BY AQBUDGETS.TMPL
876 function budgetExceedsParent(budgetTotal, budgetId, newBudgetParent, periodID) {
880 xmlhttp = new XMLHttpRequest();
881 if ( typeof xmlhttp.overrideMimeType != 'undefined') {
882 xmlhttp.overrideMimeType('text/xml');
885 // make the call... yawn
886 // var url = '../admin/check_parent_total.pl?budget_id=' + budgetId + '&parent_id=' + newBudgetParent + "&total=" + budgetTotal + "&period_id="+ periodID ;
889 var url = '../admin/check_parent_total.pl?total=' + budgetTotal + "&period_id="+ periodID ;
891 if (budgetId ) { url += '&budget_id=' + budgetId };
892 if ( newBudgetParent ) { url += '&parent_id=' + newBudgetParent};
895 xmlhttp.open('GET', url, false);
898 xmlhttp.onreadystatechange = function() {
899 if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
902 // wait for the call to complete
906 var result = eval ( xmlhttp.responseText );
909 return _("- Budget total exceeds parent allocation\n");
910 } else if (result == '2') {
911 return _("- Budget total exceeds period allocation\n");
920 //USED BY AQBUDGETS.TMPL
921 function checkBudgetParent(budgetId, newBudgetParent) {
923 xmlhttp = new XMLHttpRequest();
924 if ( typeof xmlhttp.overrideMimeType != 'undefined') {
925 xmlhttp.overrideMimeType('text/xml');
928 var url = '../admin/check_budget_parent.pl?budget_id=' + budgetId + '&new_parent=' + newBudgetParent;
929 xmlhttp.open('GET', url, false);
932 xmlhttp.onreadystatechange = function() {
933 if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
934 // do something with the results
936 // wait for the call to complete
940 var result = eval ( xmlhttp.responseText );
943 return _("- New budget-parent is beneath budget\n");
944 // } else if (result == '2') {
945 // return "- New budget-parent has insufficent funds\n";
952 function addColumn(p_sType, p_aArgs, p_oValue)
954 var allRows = document.getElementById('plan').rows;
955 var colnum = p_oValue[0];
956 var code = p_oValue[1];
957 var colnum = new Number(colnum);
959 for (var i=0; i<allRows.length; i++) {
960 var allCells = allRows[i].cells;
961 allCells[colnum+1].style.display="table-cell";
964 // make a menuitem object
965 var hids = document.getElementsByName("hide_cols")
966 for (var i=0; i<hids.length; i++) {
967 if (hids[i].value == code) {
969 x.parentNode.removeChild(x) // sigh...
976 function delColumn(n, code)
978 var allRows = document.getElementById('plan').rows;
982 var nn = new Number(n);
984 for (var i=0; i<allRows.length; i++) {
985 var allCells = allRows[i].cells;
986 allCells[nn+1].style.display="none";
990 var hids = document.getElementsByName("hide_cols")
991 for (var i=0; i<hids.length; i++) {
992 if (hids[i].value == code) {
999 // add hide_col to form
1000 var el = document.createElement("input");
1001 el.setAttribute("type", 'hidden' );
1002 el.setAttribute("value", code);
1003 el.setAttribute("name", 'hide_cols');
1004 document.getElementById("hide_div").appendChild(el);