diff --git a/acqui/check_budget_total.pl b/acqui/check_budget_total.pl
new file mode 100755
index 0000000000..723e5aeda0
--- /dev/null
+++ b/acqui/check_budget_total.pl
@@ -0,0 +1,49 @@
+#!/usr/bin/perl
+
+# Copyright 2008-2009 BibLibre SARL
+#
+# This file is part of Koha.
+#
+# Koha is free software; you can redistribute it and/or modify it under the
+# terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# Koha 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 GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
+# Suite 330, Boston, MA 02111-1307 USA
+
+use strict;
+use CGI;
+use C4::Context;
+use C4::Output;
+use C4::Auth;
+use C4::Budgets;
+
+=head1
+
+fetches the budget amount fron the DB
+
+=cut
+
+my $input = new CGI;
+my $budget_id = $input->param('budget_id');
+my $total = $input->param('total');
+
+my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
+ { template_name => "acqui/ajax.tmpl",
+ query => $input,
+ type => "intranet",
+ authnotrequired => 0,
+ debug => 1, } );
+
+my $budget = GetBudget($budget_id);
+
+$template->param( return => $budget->{'budget_amount'} );
+
+output_html_with_http_headers $input, $cookie, $template->output;
+1;
diff --git a/koha-tmpl/intranet-tmpl/prog/en/js/acq.js b/koha-tmpl/intranet-tmpl/prog/en/js/acq.js
new file mode 100644
index 0000000000..88061fc06a
--- /dev/null
+++ b/koha-tmpl/intranet-tmpl/prog/en/js/acq.js
@@ -0,0 +1,968 @@
+//=======================================================================
+//input validation:
+// acqui/uncertainprice.tmpl uses this
+function uncheckbox(form, field) {
+ var price = new Number(form.elements['price' + field].value);
+ var tmpprice = "";
+ var errmsg = "ERROR: Price is not a valid number, please check the price and try again!"
+ if (isNaN(price)) {
+ alert(errmsg);
+ for(var i=0; i
0) {
+ return false;
+ }
+ return true;
+}
+
+
+
+
+
+
+
+//Function returns false if v is not a number (if maybenull is 0, it also returns an error if the number is 0)
+function isNum(v,maybenull) {
+ var n = new Number(v.value);
+ if (isNaN(n)) {
+ return false;
+ }
+ if (maybenull==0 && v.value=='') {
+
+
+ return false;
+ }
+ return true;
+}
+
+// this function checks if date is like DD/MM/YYYY
+function CheckDate(field) {
+ var d = field.value;
+ if (d!="") {
+ var amin = 1900;
+ var amax = 2100;
+ var date = d.split("/");
+ var ok=1;
+ var msg;
+ if ( (date.length < 2) && (ok==1) ) {
+ msg = _("Separator must be /");
+ alert(msg); ok=0; field.focus();
+ return false;
+ }
+ var dd = date[0];
+ var mm = date[1];
+ var yyyy = date[2];
+ // checking days
+ if ( ((isNaN(dd))||(dd<1)||(dd>31)) && (ok==1) ) {
+ msg = _("day not correct.");
+ alert(msg); ok=0; field.focus();
+ return false;
+ }
+ // checking months
+ if ( ((isNaN(mm))||(mm<1)||(mm>12)) && (ok==1) ) {
+ msg = _("month not correct.");
+ alert(msg); ok=0; field.focus();
+ return false;
+ }
+ // checking years
+ if ( ((isNaN(yyyy))||(yyyyamax)) && (ok==1) ) {
+ msg = _("years not correct.");
+ alert(msg); ok=0; field.focus();
+ return false;
+ }
+ // check day/month combination
+ if ((mm==4 || mm==6 || mm==9 || mm==11) && dd==31) {
+ msg = _("Invalid Day/Month combination. Please ensure that you have a valid day/month combination.");
+ alert(msg); ok=0; field.focus();
+ return false;
+ }
+ // check for february 29th
+ if (mm == 2) {
+ var isleap = (yyyy % 4 == 0 && (yyyy % 100 != 0 || yyyy % 400 == 0));
+ if (dd>29 || (dd==29 && !isleap)) {
+ msg = _("Invalid Day. This year is not a leap year. Please enter a value less than 29 for the day.");
+ alert(msg); ok=0; field.focus();
+ return false
+ }
+ }
+ }
+ return true;
+}
+
+// Checks wether start date is greater than end date
+function CompareDate(startdate, enddate) {
+ startdate=startdate.split("/");
+ syear = startdate[2];
+ smonth = startdate[1];
+ sday = startdate[0];
+ enddate=enddate.split("/");
+ eyear = enddate[2];
+ emonth = enddate[1];
+ eday = enddate[0];
+
+ var sdate = new Date(syear,smonth-1,sday);
+ var edate = new Date(eyear,emonth-1,eday);
+ if (sdate > edate) {
+ msg = _("Start date after end date, please check the dates!");
+ alert(msg); ok=0; field.focus();
+ return false;
+ }
+ return true;
+}
+
+// checks wether end date is before today, returns false if it is
+function CheckEndDate(enddate) {
+ enddate=enddate.split("/");
+ eyear = enddate[2];
+ emonth = enddate[1];
+ eday = enddate[0];
+ var edate = new Date(eyear,emonth-1,eday);
+ var today = new Date( );
+ if (today > edate) {
+ msg = _("End date before today, Invalid end date!");
+ alert(msg); ok=0; field.focus();
+ return false;
+ }
+ return true;
+}
+
+
+
+//=======================================================================
+
+//=======================================================================
+// Functions for drag-and-drop functionality
+
+
+(function() {
+
+var Dom = YAHOO.util.Dom;
+var Event = YAHOO.util.Event;
+var DDM = YAHOO.util.DragDropMgr;
+
+DDApp = {
+ init: function() {
+ var uls = document.getElementsByTagName('ul');
+ var i,j;
+ var ddtarget;
+ for (i=0; i this.lastY) {
+ this.goingUp = false;
+ }
+ this.lastY = y;
+ },
+
+ onDragOver: function(e, id) {
+
+ var srcEl = this.getEl();
+ var destEl = Dom.get(id);
+
+ // We are only concerned with list items, we ignore the dragover
+ // notifications for the list.
+ if (destEl.nodeName.toLowerCase() == "li") {
+ var orig_p = srcEl.parentNode;
+ var p = destEl.parentNode;
+
+ if (this.goingUp) {
+ p.insertBefore(srcEl, destEl); // insert above
+ } else {
+ p.insertBefore(srcEl, destEl.nextSibling); // insert below
+ }
+
+ DDM.refreshCache();
+ }
+ }
+});
+})();
+
+
+
+
+//creates new group, parameter is the group's name
+function newGroup(event, name) {
+ if (name == ''){
+ return 0;
+ }
+ if (!enterpressed(event) && event != "button"){
+ return false;
+ }
+ var pardiv = document.getElementById('groups');
+ var newdiv = document.createElement('div');
+ var newh3 = document.createElement('h3');
+ var newul = document.createElement('ul');
+ var newclose = document.createElement('a');
+ var newrename = document.createElement('a');
+ var newbasketgroupname = document.createElement('input');
+ var nbgclosed = document.createElement('input');
+ var newp = document.createElement('p');
+ var reg=new RegExp("[-]+", "g");
+ var i = 0;
+ var maxid = 0;
+ while( i < pardiv.getElementsByTagName('input').length ){
+ if (! isNaN(parseInt(pardiv.getElementsByTagName('input')[i].name.split(reg)[1])) && parseInt(pardiv.getElementsByTagName('input')[i].name.split(reg)[1]) > maxid){
+ maxid = parseInt(pardiv.getElementsByTagName('input')[i].name.split(reg)[1]);
+ }
+ ++i;
+ }
+// var bgid = parseInt(pardiv.getElementsByTagName('input')[pardiv.getElementsByTagName('input').length-2].name.split(reg)[1]) + 1;
+ var bgid = maxid + 1;
+ var newchanged = document.createElement('input');
+
+ newul.id="bg-"+bgid;
+ newul.className='draglist';
+
+ newh3.innerHTML=name;
+// newh3.style.display="inline";
+
+ newclose.innerHTML="close";
+ newclose.href="javascript: closebasketgroup('"+bgid+"', 'bg-"+bgid+"');";
+
+ newrename.href="javascript:" + "renameinit("+bgid+");";
+ newrename.innerHTML="rename";
+
+// newp.style.display="inline";
+ newp.innerHTML=" [ ";
+ newp.appendChild(newrename);
+ newp.innerHTML+=" / ";
+ newp.appendChild(newclose);
+ newp.innerHTML+=" ]";
+
+ newbasketgroupname.type="hidden";
+ newbasketgroupname.name="basketgroup-" + bgid + "-name";
+ newbasketgroupname.id = "basketgroup-" + bgid + "-name";
+ newbasketgroupname.value=name;
+
+ nbgclosed.type="hidden";
+ nbgclosed.name="basketgroup-" + bgid + "-closed";
+ nbgclosed.value="0";
+ nbgclosed.id=nbgclosed.name;
+
+ newchanged.type="hidden";
+ newchanged.id="basketgroup-"+bgid+"-changed";
+ newchanged.name=newchanged.id;
+ newchanged.value="1";
+
+ newdiv.style.backgroundColor='red';
+ newdiv.appendChild(newh3);
+ newdiv.appendChild(newp);
+ newdiv.appendChild(newul);
+ newdiv.appendChild(newbasketgroupname);
+ newdiv.appendChild(nbgclosed);
+ newdiv.appendChild(newchanged);
+ newdiv.className='workarea';
+ pardiv.appendChild(newdiv);
+
+ YAHOO.util.Event.onDOMReady(DDApp.init, DDApp, true);
+}
+
+//this traps enters in input fields
+function enterpressed(event){
+ var keycode;
+ if (window.event) keycode = window.event.keyCode;
+ else if (event) keycode = event.which;
+ else return false;
+
+ if (keycode == 13)
+ {
+ return true;
+ }
+ else return false;
+}
+
+
+
+
+
+//Closes a basketgroup
+function closebasketgroup(bgid) {
+ var answer=confirm(_("Are you sure you want to close this basketgroup?"));
+ if(! answer){
+ return;
+ }
+ ulid = 'bg-'+bgid;
+ var i = 0;
+ tagname='basketgroup-'+bgid+'-closed';
+ var ddtarget;
+ var closeinput = document.getElementById(tagname);
+ closeinput.value = 1;
+ var changed = document.getElementById("basketgroup-"+bgid+"-changed");
+ changed.value=1;
+
+ var div = document.getElementById(tagname).parentNode;
+ var stufftoremove = div.getElementsByTagName('p')[0];
+ var ul = document.getElementById(ulid);
+ var lis = ul.getElementsByTagName('li');
+ if (lis.length == 0 ) {
+ alert(_("Why close an empty basket?"));
+ return;
+ }
+ var cantprint = document.createElement('p');
+
+ div.className = "closed";
+ ul.className="closed";
+
+ for(i=0; iDebug Log" +
+ "