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 //=======================================================================
60 //=======================================================================
61 // Functions for drag-and-drop functionality
66 var Dom = YAHOO.util.Dom;
67 var Event = YAHOO.util.Event;
68 var DDM = YAHOO.util.DragDropMgr;
72 var uls = document.getElementsByTagName('ul');
75 for (i=0; i<uls.length;i=i+1) {
76 if (uls[i].className == "draglist" || uls[i].className == "draglist_alt") {
77 ddtarget = YAHOO.util.DragDropMgr.getDDById(uls[i].id);
78 // 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,
79 // it has to be unlinked multiple times, so we need to test whether it is allready a target, otherwise we'll have a problem when closing the group
81 new YAHOO.util.DDTarget(uls[i].id);
83 var children = uls[i].getElementsByTagName('li');
84 for( j=0; j<children.length; j=j+1) {
85 // The yahoo drag and drop is (broken or not) in such a way, that if an element is subscribed as a target multiple times,
86 // it has to be unlinked multiple times, so we need to test whether it is allready a target, otherwise we'll have a problem when closing the group
87 ddtarget = YAHOO.util.DragDropMgr.getDDById(children[j].id);
89 new DDList(children[j].id);
98 // drag and drop implementation
100 DDList = function(id, sGroup, config) {
102 DDList.superclass.constructor.call(this, id, sGroup, config);
104 this.logger = this.logger || YAHOO;
105 var el = this.getDragEl();
106 Dom.setStyle(el, "opacity", 0.67); // The proxy is slightly transparent
108 this.goingUp = false;
112 YAHOO.extend(DDList, YAHOO.util.DDProxy, {
114 startDrag: function(x, y) {
115 this.logger.log(this.id + " startDrag");
117 // make the proxy look like the source element
118 var dragEl = this.getDragEl();
119 var clickEl = this.getEl();
120 Dom.setStyle(clickEl, "visibility", "hidden");
122 dragEl.innerHTML = clickEl.innerHTML;
124 Dom.setStyle(dragEl, "color", Dom.getStyle(clickEl, "color"));
125 Dom.setStyle(dragEl, "backgroundColor", Dom.getStyle(clickEl, "backgroundColor"));
126 Dom.setStyle(dragEl, "border", "2px solid gray");
129 endDrag: function(e) {
131 var srcEl = this.getEl();
132 var proxy = this.getDragEl();
134 // Show the proxy element and animate it to the src element's location
135 Dom.setStyle(proxy, "visibility", "");
136 var a = new YAHOO.util.Motion(
143 YAHOO.util.Easing.easeOut
145 var proxyid = proxy.id;
146 var thisid = this.id;
148 // Hide the proxy and show the source element when finished with the animation
149 a.onComplete.subscribe(function() {
150 Dom.setStyle(proxyid, "visibility", "hidden");
151 Dom.setStyle(thisid, "visibility", "");
154 // if we are in basketgrouping page, when finished moving, edit the basket's info to reflect new status
155 if(typeof(basketgroups) != 'undefined') {
156 a.onComplete.subscribe(function() {
157 var reg = new RegExp("[-]+", "g");
158 // add a changed input to each moved basket, so we know which baskets to modify,
159 // and so we don't need to modify each and every basket and basketgroup each time the page is loaded
160 // FIXME: we shouldn't use getElementsByTagName, it's not explicit enough :-(
161 srcEl.getElementsByTagName('input')[1].value = "1";
162 if ( srcEl.parentNode.parentNode.className == "workarea" ) {
163 var dstbgroupid = srcEl.parentNode.parentNode.getElementsByTagName('input')[srcEl.parentNode.parentNode.getElementsByTagName('input').length-2].name.split(reg)[1];
164 srcEl.className="grouped";
165 srcEl.getElementsByTagName('input')[0].value = dstbgroupid;
166 //FIXME: again, we shouldn't be using getElementsByTagName!!
167 srcEl.parentNode.parentNode.getElementsByTagName('input')[srcEl.parentNode.parentNode.getElementsByTagName('input').length-1].value = 1;
169 else if ( srcEl.parentNode.parentNode.className == "workarea_alt" ){
170 srcEl.className="ungrouped";
171 srcEl.getElementsByTagName('input')[0].value = "0";
177 onDragDrop: function(e, id) {
179 // If there is one drop interaction, the li was dropped either on the list,
180 // or it was dropped on the current location of the source element.
181 if (DDM.interactionInfo.drop.length === 1) {
183 // The position of the cursor at the time of the drop (YAHOO.util.Point)
184 var pt = DDM.interactionInfo.point;
186 // The region occupied by the source element at the time of the drop
187 var region = DDM.interactionInfo.sourceRegion;
189 // Check to see if we are over the source element's location. We will
190 // append to the bottom of the list once we are sure it was a drop in
191 // the negative space (the area of the list without any list items)
192 if (!region.intersect(pt)) {
193 var destEl = Dom.get(id);
194 var destDD = DDM.getDDById(id);
195 destEl.appendChild(this.getEl());
196 destDD.isEmpty = false;
202 onDrag: function(e) {
204 // Keep track of the direction of the drag for use during onDragOver
205 var y = Event.getPageY(e);
207 if (y < this.lastY) {
209 } else if (y > this.lastY) {
210 this.goingUp = false;
215 onDragOver: function(e, id) {
217 var srcEl = this.getEl();
218 var destEl = Dom.get(id);
220 // We are only concerned with list items, we ignore the dragover
221 // notifications for the list.
222 if (destEl.nodeName.toLowerCase() == "li") {
223 var orig_p = srcEl.parentNode;
224 var p = destEl.parentNode;
227 p.insertBefore(srcEl, destEl); // insert above
229 p.insertBefore(srcEl, destEl.nextSibling); // insert below
241 //creates new group, parameter is the group's name
242 function newGroup(event, name) {
246 if (!enterpressed(event) && event != "button"){
249 var pardiv = document.getElementById('groups');
250 var newdiv = document.createElement('div');
251 var newh3 = document.createElement('h3');
252 var newul = document.createElement('ul');
253 var newclose = document.createElement('a');
254 var newrename = document.createElement('a');
255 var newbasketgroupname = document.createElement('input');
256 var nbgclosed = document.createElement('input');
257 var newp = document.createElement('p');
258 var reg=new RegExp("[-]+", "g");
261 while( i < pardiv.getElementsByTagName('input').length ){
262 if (! isNaN(parseInt(pardiv.getElementsByTagName('input')[i].name.split(reg)[1])) && parseInt(pardiv.getElementsByTagName('input')[i].name.split(reg)[1]) > maxid){
263 maxid = parseInt(pardiv.getElementsByTagName('input')[i].name.split(reg)[1]);
267 // var bgid = parseInt(pardiv.getElementsByTagName('input')[pardiv.getElementsByTagName('input').length-2].name.split(reg)[1]) + 1;
268 var bgid = maxid + 1;
269 var newchanged = document.createElement('input');
272 newul.className='draglist';
274 newh3.innerHTML=name;
275 // newh3.style.display="inline";
277 newclose.innerHTML="close";
278 newclose.href="javascript: closebasketgroup('"+bgid+"', 'bg-"+bgid+"');";
280 newrename.href="javascript:" + "renameinit("+bgid+");";
281 newrename.innerHTML="rename";
283 // newp.style.display="inline";
284 newp.innerHTML=" [ ";
285 newp.appendChild(newrename);
286 newp.innerHTML+=" / ";
287 newp.appendChild(newclose);
288 newp.innerHTML+=" ]";
290 newbasketgroupname.type="hidden";
291 newbasketgroupname.name="basketgroup-" + bgid + "-name";
292 newbasketgroupname.id = "basketgroup-" + bgid + "-name";
293 newbasketgroupname.value=name;
295 nbgclosed.type="hidden";
296 nbgclosed.name="basketgroup-" + bgid + "-closed";
298 nbgclosed.id=nbgclosed.name;
300 newchanged.type="hidden";
301 newchanged.id="basketgroup-"+bgid+"-changed";
302 newchanged.name=newchanged.id;
303 newchanged.value="1";
305 newdiv.style.backgroundColor='red';
306 newdiv.appendChild(newh3);
307 newdiv.appendChild(newp);
308 newdiv.appendChild(newul);
309 newdiv.appendChild(newbasketgroupname);
310 newdiv.appendChild(nbgclosed);
311 newdiv.appendChild(newchanged);
312 newdiv.className='workarea';
313 pardiv.appendChild(newdiv);
315 YAHOO.util.Event.onDOMReady(DDApp.init, DDApp, true);
318 //this traps enters in input fields
319 function enterpressed(event){
321 if (window.event) keycode = window.event.keyCode;
322 else if (event) keycode = event.which;
336 //Closes a basketgroup
337 function closebasketgroup(bgid) {
338 var answer=confirm(_("Are you sure you want to close this basketgroup?"));
344 tagname='basketgroup-'+bgid+'-closed';
346 var closeinput = document.getElementById(tagname);
347 closeinput.value = 1;
348 var changed = document.getElementById("basketgroup-"+bgid+"-changed");
351 var div = document.getElementById(tagname).parentNode;
352 var stufftoremove = div.getElementsByTagName('p')[0];
353 var ul = document.getElementById(ulid);
354 var lis = ul.getElementsByTagName('li');
355 if (lis.length == 0 ) {
356 alert(_("Why close an empty basket?"));
359 var cantprint = document.createElement('p');
361 div.className = "closed";
362 ul.className="closed";
364 for(i=0; i<lis.length; ++i) {
365 ddtarget = YAHOO.util.DragDropMgr.getDDById(lis[i].id);
368 ddtarget = YAHOO.util.DragDropMgr.getDDById(ul.id);
370 div.removeChild(stufftoremove);
371 // the print button is disabled because the page's content might (or is probably) not in sync with what the database contains
372 cantprint.innerHTML=_("You need to save the page before printing");
373 cantprint.id = 'cantprint-' + bgid;
374 var unclosegroup = document.createElement('a');
375 unclosegroup.href='javascript:unclosegroup('+bgid+');';
376 unclosegroup.innerHTML=_("reopen basketgroup");
377 unclosegroup.id = 'unclose-' + bgid;
379 div.appendChild(cantprint);
380 div.appendChild(unclosegroup);
383 function closeandprint(bg){
384 if(document.location = '/cgi-bin/koha/acqui/basketgroup.pl?op=closeandprint&basketgroupid=' + bg ){
385 setTimeout("window.location.reload();",3000);
387 alert(_('Error downloading the file'));
391 //function that lets the user unclose a basketgroup as long as he hasn't submitted the changes to the page.
392 function unclosegroup(bgid){
393 var div = document.getElementById('basketgroup-'+bgid+'-closed').parentNode;
394 var divtodel = document.getElementById('unclose-' + bgid);
396 div.removeChild(divtodel);
398 divtodel = document.getElementById('unclose-' + bgid);
400 div.removeChild(divtodel);
402 var closeinput = document.getElementById('basketgroup-'+bgid+'-closed');
403 var ul = document.getElementById('bg-'+bgid);
405 var newclose = document.createElement('a');
406 var newrename = document.createElement('a');
407 var newp = document.createElement('p');
409 newclose.innerHTML="close";
410 newclose.href="javascript: closebasketgroup('"+bgid+"', 'bg-"+bgid+"');";
412 newrename.href="javascript:" + "renameinit("+bgid+");";
413 newrename.innerHTML="rename";
415 var todel = div.getElementsByTagName('p')[0];
416 div.removeChild(todel);
418 var changed = document.getElementById("basketgroup-"+bgid+"-changed");
421 newp.innerHTML=" [ ";
422 newp.appendChild(newrename);
423 newp.innerHTML+=" / ";
424 newp.appendChild(newclose);
425 newp.innerHTML+=" ]";
427 div.insertBefore(newp, ul);
428 closeinput.value="0";
429 div.className = "workarea";
430 ul.className="draglist";
432 //rescan draglists, we have a new target (again :-)
433 YAHOO.util.Event.onDOMReady(DDApp.init, DDApp, true);
436 //a function to filter basketgroups using a regex (javascript regex)
437 function filterGroups(event, searchstring ){
438 if (!enterpressed(event) && event != "button"){
441 var reg = new RegExp(searchstring, "g");
442 var Dom = YAHOO.util.Dom;
443 var divs = Dom.getElementsByClassName("workarea", "div");
445 for (var i = 0; i < divs.length; ++i){
446 if (! reg.exec(divs[i].innerHTML)){
447 divs[i].style.display='none';
450 divs[i].style.display='';
453 divs = Dom.getElementsByClassName("closed", "div");
454 for (var i = 0; i < divs.length; ++i){
455 if (! reg.exec(divs[i].innerHTML)){
456 divs[i].style.display='none';
459 divs[i].style.display='';
464 //function to hide (or show) closed baskets (if show is true, it shows all the closed baskets)
465 function showhideclosegroups(show){
466 var Dom = YAHOO.util.Dom;
467 var divs = Dom.getElementsByClassName("closed", "div");
472 else display = 'none';
473 for(var i = 0; i < divs.length; ++i){
474 divs[i].style.display=display;
478 function renameinit(bgid){
479 var ul = document.getElementById('bg-'+bgid);
480 var div = ul.parentNode;
481 var nameelm = div.getElementsByTagName('h3')[0];
482 var p = div.getElementsByTagName('p')[0];
485 var nameinput = document.createElement("input");
486 nameinput.type = "text";
487 nameinput.id="rename-"+bgid;
488 nameinput.value = nameelm.innerHTML;
489 nameinput.onkeypress = function(e){rename(e, bgid, document.getElementById('rename-'+bgid).value); };
490 // nameinput.setAttribute('onkeypress', 'rename(event, bgid, document.getElementById(rename-'+bgid+').value);');
492 div.removeChild(nameelm);
493 div.insertBefore(nameinput, p);
496 function rename(event, bgid, name){
497 if (!enterpressed(event)){
500 var ul = document.getElementById('bg-'+bgid);
501 var div = ul.parentNode;
502 var p = div.getElementsByTagName('p')[0];
503 var nameinput = document.getElementById("rename-"+bgid);
504 var changedinput = document.getElementById("basketgroup-"+bgid+"-changed");
505 var newh3 = document.createElement("h3");
506 var hiddenname = document.getElementById("basketgroup-"+bgid+"-name");
508 div.removeChild(nameinput);
510 newh3.innerHTML=name;
511 hiddenname.value=name;
512 changedinput.value = 1;
513 div.insertBefore(newh3, p);
516 //=======================================================================
517 //a logging function (a bit buggy, might open millions of log pages when initializing, but works fine after...
518 function log(message) {
519 if (!log.window_ || log.window_.closed) {
520 var win = window.open("", null, "width=400,height=200," +
521 "scrollbars=yes,resizable=yes,status=no," +
522 "location=no,menubar=no,toolbar=no");
524 var doc = win.document;
525 doc.write("<html><head><title>Debug Log</title></head>" +
526 "<body></body></html>");
530 var logLine = log.window_.document.createElement("div");
531 logLine.appendChild(log.window_.document.createTextNode(message));
532 log.window_.document.body.appendChild(logLine);
535 //=======================================================================
536 function getElementsByClass( searchClass, domNode, tagName) {
537 if (domNode == null) domNode = document;
538 if (tagName == null) tagName = '*';
539 var el = new Array();
540 var tags = domNode.getElementsByTagName(tagName);
541 var tcl = " "+searchClass+" ";
542 for(i=0,j=0; i<tags.length; i++) {
543 var test = " " + tags[i].className + " ";
544 if (test.indexOf(tcl) != -1)
551 function calcTotalRow(cell) {
553 var string = cell.name;
554 var pos = string.indexOf(",", 0);
555 var bud_id = string.substring(0, pos);
556 var val1 = cell.value;
557 var remainingTotal = document.getElementById("budget_est_"+bud_id);
559 var budgetTotal = document.getElementById("budget_tot_"+bud_id ).textContent;
560 var arr = getElementsByClass(cell.className);
562 budgetTotal = budgetTotal.replace(/\,/, "");
564 //percent strip and convert
565 if ( val1.match(/\%/) ) {
566 val1 = val1.replace(/\%/, "");
567 cell.value = (val1 / 100) * Math.abs(budgetTotal ) ;
570 for ( var i=0, len=arr.length; i<len; ++i ){
571 remainingNew += Math.abs(arr[i].value);
574 var cc = new Number(cell.value);
575 cell.value = cc.toFixed(2); // TIDYME...
576 remainingNew = Math.abs( budgetTotal ) - remainingNew ;
578 if ( remainingNew == 0) {
579 remainingTotal.style.color = 'black';
581 else if ( remainingNew > 0 ) {
582 remainingTotal.style.color = 'green';
583 } else { // if its negative, make it red..
584 remainingTotal.style.color = 'red';
587 remainingTotal.textContent = remainingNew.toFixed(2) ;
590 function autoFillRow(bud_id) {
592 var remainingTotal = document.getElementById("budget_est_"+bud_id);
593 var remainingNew = new Number;
594 var budgetTotal = document.getElementById("budget_tot_"+bud_id ).textContent;
595 var arr = getElementsByClass("plan_entry_" + bud_id);
597 budgetTotal = budgetTotal.replace(/\,/, "");
598 var qty = new Number;
600 var novalueArr = new Array();
601 for ( var i=0, len=arr.length; i<len; ++i ) {
602 remainingNew += Math.abs (arr[i].value );
604 if ( arr[i].value == 0 ) {
605 novalueArr[qty] = arr[i];
610 remainingNew = Math.abs( budgetTotal) - remainingNew ;
611 var newCell = new Number (remainingNew / qty);
612 var rest = new Number (remainingNew - (newCell.toFixed(2) * (novalueArr.length - 1)));
614 for (var i = 0; i<novalueArr.length; ++i) {
615 if (i == novalueArr.length - 1) {
616 novalueArr[i].value = rest.toFixed(2);
618 novalueArr[i].value = newCell.toFixed(2);
622 remainingTotal.textContent = '0.00' ;
623 remainingTotal.style.color = 'black';
627 function messenger(X,Y,etc){ // FIXME: unused?
628 win=window.open("","mess","height="+X+",width="+Y+",screenX=150,screenY=0");
630 win.document.close();
631 win.document.write("<body link='#333333' bgcolor='#ffffff' text='#000000'><font size='2'><p><br />");
632 win.document.write(etc);
633 win.document.write("<center><form><input type=button onclick='self.close()' value='Close'></form></center>");
634 win.document.write("</font></body></html>");
638 //=======================================================================
640 // NEXT BLOCK IS USED BY NEWORDERBEMPTY
642 function updateCosts(){
643 var quantity = new Number($("#quantity").val());
644 var discount = new Number($("#discount").val());
645 var applygst = new Number ($("#applygst").val());
646 var listprice = new Number($("#listprice").val());
647 var exchangerate = new Number($("#currency_rate").val());
650 var rrp = new Number(listprice*exchangerate);
652 if ( 100-discount != 100 ) { //Prevent rounding issues if no discount
653 ecost = new Number(Math.floor(rrp * (100 - discount )) / 100);
655 var total = new Number( ecost * quantity);
656 $("#rrp").val(rrp.toFixed(2));
657 $("#ecost").val(ecost.toFixed(2));
658 $("#total").val(total.toFixed(2));
659 $("listprice").val(listprice.toFixed(2));
664 // Calculates total amount in a suggestion
666 function calcNewsuggTotal(){
668 var quantity = new Number(document.getElementById('quantity').value);
669 // var currency = f.currency.value;
670 var currcode = new String(document.getElementById('currency').value);
671 var price = new Number(document.getElementById('price').value);
672 var exchangerate = new Number(document.getElementById(currcode).value);
674 var total = new Number(quantity*price*exchangerate);
676 document.getElementById('total').value = total.toFixed(2);
677 document.getElementById('price').value = price.toFixed(2);
682 // ----------------------------------------
683 //USED BY NEWORDEREMPTY.PL
685 function fetchSortDropbox(f) {
686 var budgetId=f.budget_id.value;
687 var handleSuccess = function(o){
688 if(o.responseText !== undefined){
689 sort_dropbox.innerHTML = o.responseText;
693 var callback = { success:handleSuccess };
694 var sUrl = '../acqui/fetch_sort_dropbox.pl?sort=1&budget_id='+budgetId
695 var sort_dropbox = document.getElementById('sort1');
696 var request1 = YAHOO.util.Connect.asyncRequest('GET', sUrl, callback);
699 // FIXME: --------- twice , coz the 2 requests get mixed up otherwise
701 var handleSuccess2 = function(o){
702 if(o.responseText !== undefined){
703 sort2_dropbox.innerHTML = o.responseText;
707 var callback2 = { success:handleSuccess };
708 var sUrl2 = '../acqui/fetch_sort_dropbox.pl?sort=2&budget_id='+budgetId;
709 var sort2_dropbox = document.getElementById('sort2');
710 var request2 = YAHOO.util.Connect.asyncRequest('GET', sUrl2, callback2);
717 //USED BY NEWORDEREMPTY.PL
718 function fetchSortDropbox(f) {
719 var budgetId=f.budget_id.value;
723 var sort_zone = document.getElementById('sort'+i+'_zone');
724 var url = '../acqui/fetch_sort_dropbox.pl?sort='+i+'&budget_id='+budgetId;
727 xmlhttp = new XMLHttpRequest();
728 if ( typeof xmlhttp.overrideMimeType != 'undefined') {
729 xmlhttp.overrideMimeType('text/xml');
732 xmlhttp.open('GET', url, false);
735 xmlhttp.onreadystatechange = function() {
736 if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
739 // wait for the call to complete
742 // rc = eval ( xmlhttp.responseText );
743 var retRootType = xmlhttp.responseXML.firstChild.nodeName;
744 var existingInputs = sort_zone.getElementsByTagName('input');
745 if (existingInputs.length > 0 && retRootType == 'input') {
746 // when sort is already an input, do not override to preseve value
749 sort_zone.innerHTML = xmlhttp.responseText;
759 //USED BY NEWORDEREMPTY.PL
760 function totalExceedsBudget(budgetId, total) {
763 xmlhttp = new XMLHttpRequest();
764 if ( typeof xmlhttp.overrideMimeType != 'undefined') {
765 xmlhttp.overrideMimeType('text/xml');
768 var url = '../acqui/check_budget_total.pl?budget_id=' + budgetId + "&total=" + total;
769 xmlhttp.open('GET', url, false);
772 xmlhttp.onreadystatechange = function() {
773 if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
775 actTotal = eval ( xmlhttp.responseText );
777 if ( Math.abs(actTotal) < Math.abs(total) ) {
778 // if budget is to low :(
788 //USED BY AQBUDGETS.TMPL
789 function budgetExceedsParent(budgetTotal, budgetId, newBudgetParent, periodID) {
793 xmlhttp = new XMLHttpRequest();
794 if ( typeof xmlhttp.overrideMimeType != 'undefined') {
795 xmlhttp.overrideMimeType('text/xml');
798 // make the call... yawn
799 // var url = '../admin/check_parent_total.pl?budget_id=' + budgetId + '&parent_id=' + newBudgetParent + "&total=" + budgetTotal + "&period_id="+ periodID ;
802 var url = '../admin/check_parent_total.pl?total=' + budgetTotal + "&period_id="+ periodID ;
804 if (budgetId ) { url += '&budget_id=' + budgetId };
805 if ( newBudgetParent ) { url += '&parent_id=' + newBudgetParent};
808 xmlhttp.open('GET', url, false);
811 xmlhttp.onreadystatechange = function() {
812 if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
815 // wait for the call to complete
819 var result = eval ( xmlhttp.responseText );
822 return _("- Budget total exceeds parent allocation\n");
823 } else if (result == '2') {
824 return _("- Budget total exceeds period allocation\n");
833 //USED BY AQBUDGETS.TMPL
834 function checkBudgetParent(budgetId, newBudgetParent) {
836 xmlhttp = new XMLHttpRequest();
837 if ( typeof xmlhttp.overrideMimeType != 'undefined') {
838 xmlhttp.overrideMimeType('text/xml');
841 var url = '../admin/check_budget_parent.pl?budget_id=' + budgetId + '&new_parent=' + newBudgetParent;
842 xmlhttp.open('GET', url, false);
845 xmlhttp.onreadystatechange = function() {
846 if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
847 // do something with the results
849 // wait for the call to complete
853 var result = eval ( xmlhttp.responseText );
856 return _("- New budget-parent is beneath budget\n");
857 // } else if (result == '2') {
858 // return "- New budget-parent has insufficent funds\n";
865 function addColumn(p_sType, p_aArgs, p_oValue)
867 var allRows = document.getElementById('plan').rows;
868 var colnum = p_oValue[0];
869 var code = p_oValue[1];
870 var colnum = new Number(colnum);
872 for (var i=0; i<allRows.length; i++) {
873 var allCells = allRows[i].cells;
874 allCells[colnum+1].style.display="table-cell";
877 // make a menuitem object
878 var hids = document.getElementsByName("hide_cols")
879 for (var i=0; i<hids.length; i++) {
880 if (hids[i].value == code) {
882 x.parentNode.removeChild(x) // sigh...
889 function delColumn(n, code)
891 var allRows = document.getElementById('plan').rows;
895 var nn = new Number(n);
897 for (var i=0; i<allRows.length; i++) {
898 var allCells = allRows[i].cells;
899 allCells[nn+1].style.display="none";
903 var hids = document.getElementsByName("hide_cols")
904 for (var i=0; i<hids.length; i++) {
905 if (hids[i].value == code) {
912 // add hide_col to form
913 var el = document.createElement("input");
914 el.setAttribute("type", 'hidden' );
915 el.setAttribute("value", code);
916 el.setAttribute("name", 'hide_cols');
917 document.getElementById("hide_div").appendChild(el);