[Koha-cvs] koha placerequest.pl request.pl C4/Reserves2.pm... [dev_week]

Kyle Hall kyle.m.hall at gmail.com
Wed Oct 31 13:14:25 CET 2007


CVSROOT:	/sources/koha
Module name:	koha
Branch:		dev_week
Changes by:	Kyle Hall <kylemhall>	07/10/31 12:14:24

Modified files:
	.              : placerequest.pl request.pl 
	C4             : Reserves2.pm 
	koha-tmpl/intranet-tmpl/ccfls/en: request.tmpl 
	koha-tmpl/intranet-tmpl/npl/en: request.tmpl 
Added files:
	koha-tmpl/intranet-tmpl/ccfls/en/images: arrow_down.png 
	                                         arrow_up.png cross.png 
	                                         go-bottom.png 
	                                         go-down.png go-top.png 
	                                         go-up.png lock.png 
	                                         lock_open.png 
	koha-tmpl/intranet-tmpl/npl/en/images: cross.png go-bottom.png 
	                                       go-down.png go-top.png 
	                                       go-up.png lock.png 
	                                       lock_open.png 

Log message:
	Updating Reserves System.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/koha/placerequest.pl?cvsroot=koha&only_with_tag=dev_week&r1=1.4&r2=1.4.6.1
http://cvs.savannah.gnu.org/viewcvs/koha/request.pl?cvsroot=koha&only_with_tag=dev_week&r1=1.28.2.4.2.3&r2=1.28.2.4.2.4
http://cvs.savannah.gnu.org/viewcvs/koha/C4/Reserves2.pm?cvsroot=koha&only_with_tag=dev_week&r1=1.38.4.6&r2=1.38.4.7
http://cvs.savannah.gnu.org/viewcvs/koha/koha-tmpl/intranet-tmpl/ccfls/en/request.tmpl?cvsroot=koha&only_with_tag=dev_week&r1=1.1.2.1.2.4&r2=1.1.2.1.2.5
http://cvs.savannah.gnu.org/viewcvs/koha/koha-tmpl/intranet-tmpl/ccfls/en/images/arrow_down.png?cvsroot=koha&only_with_tag=dev_week&rev=1.1.2.1
http://cvs.savannah.gnu.org/viewcvs/koha/koha-tmpl/intranet-tmpl/ccfls/en/images/arrow_up.png?cvsroot=koha&only_with_tag=dev_week&rev=1.1.2.1
http://cvs.savannah.gnu.org/viewcvs/koha/koha-tmpl/intranet-tmpl/ccfls/en/images/cross.png?cvsroot=koha&only_with_tag=dev_week&rev=1.1.2.1
http://cvs.savannah.gnu.org/viewcvs/koha/koha-tmpl/intranet-tmpl/ccfls/en/images/go-bottom.png?cvsroot=koha&only_with_tag=dev_week&rev=1.1.2.1
http://cvs.savannah.gnu.org/viewcvs/koha/koha-tmpl/intranet-tmpl/ccfls/en/images/go-down.png?cvsroot=koha&only_with_tag=dev_week&rev=1.1.2.1
http://cvs.savannah.gnu.org/viewcvs/koha/koha-tmpl/intranet-tmpl/ccfls/en/images/go-top.png?cvsroot=koha&only_with_tag=dev_week&rev=1.1.2.1
http://cvs.savannah.gnu.org/viewcvs/koha/koha-tmpl/intranet-tmpl/ccfls/en/images/go-up.png?cvsroot=koha&only_with_tag=dev_week&rev=1.1.2.1
http://cvs.savannah.gnu.org/viewcvs/koha/koha-tmpl/intranet-tmpl/ccfls/en/images/lock.png?cvsroot=koha&only_with_tag=dev_week&rev=1.1.2.1
http://cvs.savannah.gnu.org/viewcvs/koha/koha-tmpl/intranet-tmpl/ccfls/en/images/lock_open.png?cvsroot=koha&only_with_tag=dev_week&rev=1.1.2.1
http://cvs.savannah.gnu.org/viewcvs/koha/koha-tmpl/intranet-tmpl/npl/en/request.tmpl?cvsroot=koha&only_with_tag=dev_week&r1=1.3.2.2.2.4&r2=1.3.2.2.2.5
http://cvs.savannah.gnu.org/viewcvs/koha/koha-tmpl/intranet-tmpl/npl/en/images/cross.png?cvsroot=koha&only_with_tag=dev_week&rev=1.1.2.1
http://cvs.savannah.gnu.org/viewcvs/koha/koha-tmpl/intranet-tmpl/npl/en/images/go-bottom.png?cvsroot=koha&only_with_tag=dev_week&rev=1.1.2.1
http://cvs.savannah.gnu.org/viewcvs/koha/koha-tmpl/intranet-tmpl/npl/en/images/go-down.png?cvsroot=koha&only_with_tag=dev_week&rev=1.1.2.1
http://cvs.savannah.gnu.org/viewcvs/koha/koha-tmpl/intranet-tmpl/npl/en/images/go-top.png?cvsroot=koha&only_with_tag=dev_week&rev=1.1.2.1
http://cvs.savannah.gnu.org/viewcvs/koha/koha-tmpl/intranet-tmpl/npl/en/images/go-up.png?cvsroot=koha&only_with_tag=dev_week&rev=1.1.2.1
http://cvs.savannah.gnu.org/viewcvs/koha/koha-tmpl/intranet-tmpl/npl/en/images/lock.png?cvsroot=koha&only_with_tag=dev_week&rev=1.1.2.1
http://cvs.savannah.gnu.org/viewcvs/koha/koha-tmpl/intranet-tmpl/npl/en/images/lock_open.png?cvsroot=koha&only_with_tag=dev_week&rev=1.1.2.1

Patches:
Index: placerequest.pl
===================================================================
RCS file: /sources/koha/koha/Attic/placerequest.pl,v
retrieving revision 1.4
retrieving revision 1.4.6.1
diff -u -b -r1.4 -r1.4.6.1
--- placerequest.pl	15 Jan 2003 03:12:22 -0000	1.4
+++ placerequest.pl	31 Oct 2007 12:14:21 -0000	1.4.6.1
@@ -41,6 +41,13 @@
 my $type=$input->param('type');
 my $title=$input->param('title');
 my $bornum=borrdata($borrower,'');
+my $expireDay = $input->param('expireDay');
+my $expireMonth = $input->param('expireMonth');
+my $expireYear = $input->param('expireYear');
+
+my $expireDate;
+if ( $expireDay && $expireMonth && $expireYear ) { $expireDate = "$expireYear-$expireMonth-$expireDay"; }
+
 if ($type eq 'str8' && $bornum ne ''){
     my $count=@bibitems;
     @bibitems=sort @bibitems;
@@ -60,12 +67,12 @@
 my $const;
 if ($input->param('request') eq 'any'){
   $const='a';
-  CreateReserve(\$env,$branch,$bornum->{'borrowernumber'},$biblio,$const,\@realbi,$rank[0],$notes,$title);
+  CreateReserve(\$env,$branch,$bornum->{'borrowernumber'},$biblio,$const,\@realbi, GetNextFreePriority( $biblio ), $notes,$title, '', $expireDate);
 } elsif ($reqbib[0] ne ''){
   $const='o';
-  CreateReserve(\$env,$branch,$bornum->{'borrowernumber'},$biblio,$const,\@reqbib,$rank[0],$notes,$title);
+  CreateReserve(\$env,$branch,$bornum->{'borrowernumber'},$biblio,$const,\@reqbib, GetNextFreePriority( $biblio ), $notes,$title, '', $expireDate);
 } else {
-  CreateReserve(\$env,$branch,$bornum->{'borrowernumber'},$biblio,'a',\@realbi,$rank[0],$notes,$title);
+  CreateReserve(\$env,$branch,$bornum->{'borrowernumber'},$biblio,'a',\@realbi, GetNextFreePriority(), $notes,$title, '', $expireDate);
 }
 #print @realbi;
 

Index: request.pl
===================================================================
RCS file: /sources/koha/koha/Attic/request.pl,v
retrieving revision 1.28.2.4.2.3
retrieving revision 1.28.2.4.2.4
diff -u -b -r1.28.2.4.2.3 -r1.28.2.4.2.4
--- request.pl	11 Jun 2007 23:58:59 -0000	1.28.2.4.2.3
+++ request.pl	31 Oct 2007 12:14:21 -0000	1.28.2.4.2.4
@@ -1,6 +1,6 @@
 #!/usr/bin/perl
 
-# $Id: request.pl,v 1.28.2.4.2.3 2007/06/11 23:58:59 rangi Exp $
+# $Id: request.pl,v 1.28.2.4.2.4 2007/10/31 12:14:21 kylemhall Exp $
 
 #script to place reserves/requests
 #writen 2/1/00 by chris at katipo.oc.nz
@@ -37,6 +37,8 @@
 use CGI;
 use C4::Date;
 
+CancelExpiredReserves();
+
 my $input = new CGI;
 my ($template, $borrowernumber, $cookie)
     = get_template_and_user({template_name => "request.tmpl",
@@ -46,8 +48,59 @@
                             flagsrequired => {reserveforothers => 1},
                          });
 
-# get biblio information....
+# Look for a passed biblionumber
 my $bib = $input->param('bib');
+
+# Check for actions
+my $action = $input->param('action');
+
+warn "Action: $action";
+
+if ( $action eq 'move' ) {
+	my $where = $input->param('where');
+	my $borrowernumber = $input->param('borrowernumber');
+	my $biblionumber = $input->param('biblionumber');
+	my $date = $input->param('date');
+	
+	$date = convertDate( $date );  ## Convert date from MM/DD/YY to YYYY-MM-DD
+   
+	AlterPriority( $where, $borrowernumber, $biblionumber, $date );
+} elsif ( $action eq 'cancel' ) {
+	my $borrowernumber = $input->param('borrowernumber');
+	my $biblionumber = $input->param('biblionumber');
+	CancelReserve( $biblionumber, '', $borrowernumber );
+} elsif ( $action eq 'lock' ) {
+	my $borrowernumber = $input->param('borrowernumber');
+	my $biblionumber = $input->param('biblionumber');
+	my $date = $input->param('date');
+	
+	$date = convertDate( $date );
+
+	TogglePriorityLock( $borrowernumber, $biblionumber, $date );
+} elsif ( $action eq 'setLowestPriority' ) {
+	my $borrowernumber = $input->param('borrowernumber');
+	my $biblionumber = $input->param('biblionumber');
+	my $date = $input->param('date');
+	
+	$date = convertDate( $date );
+
+	ToggleLowestPriority( $borrowernumber, $biblionumber, $date );
+} elsif ( $action eq 'updatePickupLocation' ) {
+	my $borrowernumber = $input->param('borrowernumber');
+	my $biblionumber = $input->param('biblionumber');
+	my $date = $input->param('date');
+	my $newBranchcode = $input->param('branchcode');
+
+	$date = convertDate( $date );
+
+	UpdatePickupLocation( $borrowernumber, $biblionumber, $date, $newBranchcode );
+}
+
+## We need to put the biblionumber into $bib so the rest of the script works.
+$bib = $input->param('biblionumber') if $action;
+FixPriorities( $bib );
+
+# Get biblio information....
 my $dat = bibdata($bib);
 
 # get existing reserves .....
@@ -59,19 +112,6 @@
     }
 }
 
-# make priorities options
-my $num = $count + 1;
-my $newpriority = $num;
-
-#priorityoptions building
-my @optionloop;
-for (my $i=1; $i<=$num; $i++){
-	my %option;
-	$option{num}=$i;
-	$option{selected}=($i==$num);
-	push(@optionloop, \%option);
-}
-
 # todays date
 my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =localtime(time);
 $year=$year+1900;
@@ -142,14 +182,6 @@
 my $branches = getbranches();
 foreach my $res (sort {$a->{'found'} cmp $b->{'found'}} @$reserves){
 	my %reserve;
-#    my $prioropt = priorityoptions($totalcount, $res->{'priority'});
-	my @optionloop;
-	for (my $i=1; $i<=$totalcount; $i++){
-		my %option;
-		$option{num}=$i;
-		$option{selected}=($i==$res->{'priority'});
-		push(@optionloop, \%option);
-	}
 	my @branchloop;
 	foreach my $br (keys %$branches) {
 # 		(next) unless $branches->{$br}->{'IS'};
@@ -158,7 +190,8 @@
 		my %abranch;
 		$abranch{'selected'}=($br eq $res->{'branchcode'});
 		$abranch{'branch'}=$br;
-		$abranch{'branchname'}=$branches->{$br}->{'branchname'};
+		$abranch{'branchname'}=$branches->{$br}->{'branchcode'}; ## Uncomment this line for branch codes in 'Pickup Location'
+#		$abranch{'branchname'}=$branches->{$br}->{'branchname'}; ## Uncomment this line for full branch names in 'Pickup Location'
 		push(@branchloop,\%abranch);
 	}
 
@@ -182,6 +215,9 @@
 	} 
 	
    $reserve{'date'} = format_date($res->{'reservedate'});
+	$reserve{'priority'} = $res->{'priority'};
+	$reserve{'lockPriority'} = $res->{'lockPriority'};
+	$reserve{'lowestPriority'} = $res->{'lowestPriority'};
 	$reserve{'borrowernumber'}=$res->{'borrowernumber'};
 	$reserve{'biblionumber'}=$res->{'biblionumber'};
 	$reserve{'bornum'}=$res->{'borrowernumber'};
@@ -196,7 +232,6 @@
 	$reserve{'itemtype'}=$res->{'itemtype'};
 	$reserve{'ccode'}=$res->{'ccode'};
 	$reserve{'branchloop'}=\@branchloop;
-	$reserve{'optionloop'}=\@optionloop;
 	$reserve{'itemnumber'}      = $res->{'itemnumber'};
 	push(@reserveloop,\%reserve);
 }
@@ -206,8 +241,9 @@
 my %select_branches;
 my ($count2, at branches)=branches();
 for (my $i=0;$i<$count2;$i++){
-	push @select_branch, $branches[$i]->{'branchcode'};#
-	$select_branches{$branches[$i]->{'branchcode'}} = $branches[$i]->{'branchname'};
+	push @select_branch, $branches[$i]->{'branchcode'};
+#	$select_branches{$branches[$i]->{'branchcode'}} = $branches[$i]->{'branchcode'}; ##Uncomment this one for branch codes
+	$select_branches{$branches[$i]->{'branchcode'}} = $branches[$i]->{'branchname'}; ##Uncomment this one for full branch names
 }
 my $CGIbranch=CGI::scrolling_list( -name     => 'pickup',
 			-values   => \@select_branch,
@@ -219,13 +255,13 @@
 my $time = time();
 
 #setup colours
-$template->param(	optionloop =>\@optionloop,
+$template->param(	
 								CGIbranch => $CGIbranch,
 								reserveloop => \@reserveloop,
 								'time' => $time,
 								bibitemloop => \@bibitemloop,
 								date => $date,
-								newpriority => $newpriority,
+			nextRank => $count+1,
 								bib => $bib,
 								title =>$dat->{title});
 								
@@ -239,3 +275,16 @@
 	-type => C4::Interface::CGI::Output::guesstype($template->output),
 	-expires=>'now'
 ), $template->output;
+
+## Converts a date from MM/DD/YYYY to YYYY-MM-DD
+sub convertDate {
+	my ( $date ) = @_;
+	## Convert the date to MySQL Format.
+	my @dateParts = split( /\//, $date );
+	my $month = $dateParts[0];
+	my $day = $dateParts[1];
+	my $year = $dateParts[2];
+	$date = "$year-$month-$day";
+	
+	return $date;
+}
\ No newline at end of file

Index: C4/Reserves2.pm
===================================================================
RCS file: /sources/koha/koha/C4/Attic/Reserves2.pm,v
retrieving revision 1.38.4.6
retrieving revision 1.38.4.7
diff -u -b -r1.38.4.6 -r1.38.4.7
--- C4/Reserves2.pm	4 Aug 2007 15:54:38 -0000	1.38.4.6
+++ C4/Reserves2.pm	31 Oct 2007 12:14:21 -0000	1.38.4.7
@@ -3,7 +3,7 @@
 
 package C4::Reserves2;
 
-# $Id: Reserves2.pm,v 1.38.4.6 2007/08/04 15:54:38 rangi Exp $
+# $Id: Reserves2.pm,v 1.38.4.7 2007/10/31 12:14:21 kylemhall Exp $
 
 # Copyright 2000-2002 Katipo Communications
 # Copyright 2007 Liblime
@@ -28,8 +28,9 @@
 use DBI;
 use C4::Context;
 use C4::Search;
-	# FIXME - C4::Reserves2 uses C4::Search, which uses C4::Reserves2.
-	# So Perl complains that all of the functions here get redefined.
+
+# FIXME - C4::Reserves2 uses C4::Search, which uses C4::Reserves2.
+# So Perl complains that all of the functions here get redefined.
 #use C4::Accounts;
 
 use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
@@ -56,6 +57,7 @@
 =cut
 
 @ISA = qw(Exporter);
+
 # FIXME Take out CalcReserveFee after it can be removed from opac-reserves.pl
 @EXPORT = qw(
     &FindReserves
@@ -71,10 +73,403 @@
     &getreservetitle
     &getAllreservenotes
     &Findgroupreserve
-	CanBeReserved
+  &CanBeReserved
+  AlterPriority
+  TogglePriorityLock
+  ToggleLowestPriority
+  GetNextFreePriority
+  FixPriorities
+  UpdatePickupLocation
+  CancelExpiredReserves
 );
 
-# make all your functions, whether exported or not;
+## UpdatePickupLocation
+## Updates the branchcode set as the pickup location for the item
+## Input: Borrowernumber, Biblionumber, Today's Date ( YYYY-MM-DD ), Branchcode of the new pickup location
+sub UpdatePickupLocation {
+  my ( $borrowernumber, $biblionumber, $date, $newBranchcode ) = @_;
+
+  my $dbh = C4::Context->dbh;
+  
+    my $sth = $dbh->prepare(
+        "UPDATE reserves SET branchcode = ?
+         WHERE borrowernumber = ? AND biblionumber = ? and reservedate = ?"
+    );
+               
+    $sth->execute( $newBranchcode, $borrowernumber, $biblionumber, $date );
+    $sth->finish;
+}
+
+## CancelExpiredReserves
+## This function finds all expired reserves and cancels them.
+## If the expirationDate field is set, and is <= today, it will be canceled
+sub CancelExpiredReserves {
+  my $dbh = C4::Context->dbh;
+  
+    my $sth = $dbh->prepare(
+        "UPDATE reserves SET priority = ?, cancellationdate = CURRENT_DATE()
+         WHERE expirationDate IS NOT NULL 
+         AND expirationDate <= CURRENT_DATE()"
+    );
+               
+    $sth->execute( 0 );
+    $sth->finish;
+                   
+}
+
+## TogglePriorityLock
+## This function locks the given reserves priority, or unlocks it if it is already locked.
+## A side-effect is that the funtion will unset lowestPriority, as lockPriority and lowestPriority are mutually exclusive.
+## Input: Borrowernumber, Biblionumber, Date reserve was placed
+sub TogglePriorityLock {
+    my ( $borrowernumber, $biblionumber, $date ) = @_;
+
+    my $dbh = C4::Context->dbh;
+
+    ## Find this reserve
+    my $sth =
+      $dbh->prepare(
+'SELECT * FROM reserves WHERE biblionumber = ? AND borrowernumber = ? AND reservedate = ? AND cancellationdate IS NULL'
+      );
+    $sth->execute( $biblionumber, $borrowernumber, $date );
+    my $reserve = $sth->fetchrow_hashref();
+    $sth->finish();
+
+    my $lockPriority = $reserve->{'lockPriority'};
+
+    my $newLockPriority;
+    if ( $lockPriority == 1 ) {
+        $newLockPriority = 0;
+    }
+    else {
+        $newLockPriority = 1;
+    }
+    
+    my $sth = $dbh->prepare(
+        "UPDATE reserves SET lockPriority = ?, lowestPriority = ?
+                           WHERE biblionumber     = ?
+                             AND borrowernumber   = ?
+                             AND reservedate      = ?"
+    );
+    $sth->execute(
+        $newLockPriority, 0,             $reserve->{'biblionumber'},
+        $reserve->{'borrowernumber'}, $reserve->{'reservedate'}
+    );
+    $sth->finish;
+    
+}
+
+## ToggleLowestPriority
+## This funtion sets the lowestPriority field to true if is false, and false if it is true.
+## A side-effect is that lockPriority will be set to false, because the two are mutually exclusive.
+## Input: Borrowernumber, Biblionumber, Date reserve was placed
+sub ToggleLowestPriority {
+    my ( $borrowernumber, $biblionumber, $date ) = @_;
+
+    my $dbh = C4::Context->dbh;
+
+    ## Find this reserve
+    my $sth =
+      $dbh->prepare(
+'SELECT * FROM reserves WHERE biblionumber = ? AND borrowernumber = ? AND reservedate = ? AND cancellationdate IS NULL'
+      );
+    $sth->execute( $biblionumber, $borrowernumber, $date );
+    my $reserve = $sth->fetchrow_hashref();
+    $sth->finish();
+
+    my $lowestPriority = $reserve->{'lowestPriority'};
+
+    my $newLowestPriority;
+    if ( $lowestPriority == 1 ) {
+        $newLowestPriority = 0;
+    }
+    else {
+        $newLowestPriority = 1;
+    }
+
+    my $sth = $dbh->prepare(
+        "UPDATE reserves SET lowestPriority = ?, lockPriority = ?
+                           WHERE biblionumber     = ?
+                             AND borrowernumber   = ?
+                             AND reservedate      = ?"
+    );
+    $sth->execute(
+        $newLowestPriority, 0,           $reserve->{'biblionumber'},
+        $reserve->{'borrowernumber'}, $reserve->{'reservedate'}
+    );
+    $sth->finish;
+
+    FixPriorities( $biblionumber );
+}
+
+## AlterPriority
+## This function changes a reserve's priority up, down, to the top, or to the bottom.
+## Input: $where is 'up', 'down', 'top' or 'bottom'. Biblionumber, Date reserve was placed
+## Outpute: None on success, -1 on failure
+sub AlterPriority {
+    my ( $where, $borrowernumber, $biblionumber, $date ) = @_;
+
+    my $newPriority;
+
+    my $dbh = C4::Context->dbh;
+
+    ## Find this reserve
+    my $sth =
+      $dbh->prepare(
+'SELECT * FROM reserves WHERE biblionumber = ? AND borrowernumber = ? AND reservedate = ? AND cancellationdate IS NULL'
+      );
+    $sth->execute( $biblionumber, $borrowernumber, $date );
+    my $reserve = $sth->fetchrow_hashref();
+    $sth->finish();
+
+    if ( $where eq 'up' || $where eq 'down' ) {
+        my $oldPriority = $reserve->{'priority'};
+        if ( $where eq 'up' ) {
+            $newPriority = $oldPriority - 1;
+        }
+        else {
+            $newPriority = $oldPriority + 1;
+        }
+
+        my $reserveToSwitch;
+        ## Find the reserve that we will be switching priorities with.
+        my $canBeSwitched = 0;
+        while ( !$canBeSwitched ) {
+
+            my $sth =
+              $dbh->prepare(
+                'SELECT * FROM reserves WHERE biblionumber = ? AND priority = ?'
+              );
+            $sth->execute( $biblionumber, $newPriority );
+            $reserveToSwitch = $sth->fetchrow_hashref();
+            $sth->finish();
+
+            ## If the reserve we want to switch with is locked, we must skip over it. Find the next unlocked priority.
+            if ( $reserveToSwitch->{'lockPriority'} ) {
+                if ( $where eq 'up' ) {
+                    $newPriority--;
+                }
+                else {
+                    $newPriority++;
+                }
+            }
+            else {
+                $canBeSwitched = 1;
+            }
+
+            ## If all the reserve ahead of this one are locked in place, we cannot move it up. Return -1 to signify move failed.
+            if ( $newPriority == 0 ) {
+                return -1;
+            }
+
+        }
+
+        ## Switch the priorties of the two reserves
+        my $sth = $dbh->prepare(
+            "UPDATE reserves SET priority = ?
+                               WHERE biblionumber     = ?
+                                 AND borrowernumber   = ?
+                                 AND reservedate      = ?"
+        );
+        $sth->execute(
+            $newPriority,                 $reserve->{'biblionumber'},
+            $reserve->{'borrowernumber'}, $reserve->{'reservedate'}
+        );
+        $sth->finish;
+
+        my $sth = $dbh->prepare(
+            "UPDATE reserves SET priority = ?
+                               WHERE biblionumber     = ?
+                                 AND borrowernumber   = ?
+                                 AND reservedate      = ?"
+        );
+        $sth->execute(
+            $oldPriority,
+            $reserveToSwitch->{'biblionumber'},
+            $reserveToSwitch->{'borrowernumber'},
+            $reserveToSwitch->{'reservedate'}
+        );
+        $sth->finish;
+
+    }
+
+    if ( $where eq 'top' ) {
+        $newPriority = AlterPriority( 'up', $borrowernumber, $biblionumber, $date );
+        while ( $newPriority > 1 ) {
+          $newPriority = AlterPriority( $where, $borrowernumber, $biblionumber, $date );        
+        }
+    }
+    
+    if ( $where eq 'bottom' ) {
+        my $targetPriority = GetLastUsedPriority( $biblionumber );
+        $newPriority = AlterPriority( 'down', $borrowernumber, $biblionumber, $date );
+        while ( $newPriority < $targetPriority ) {
+            $newPriority = AlterPriority( 'down', $borrowernumber, $biblionumber, $date );    
+        }
+    }
+
+    return $newPriority;
+
+}
+
+## FixPriorities
+## Renumbers the priorities to all priority numbers are consecutive.
+## Input: Biblionumber
+sub FixPriorities {
+    my ( $biblionumber ) = @_;
+
+    my $dbh = C4::Context->dbh;
+
+    my @lockedPriorities = _GetLockedPriorities($biblionumber);
+
+    my ( $reservesCount, $reserves ) = FindReserves($biblionumber);
+
+    my @lowestPriorityReserves;
+
+    my $workingPriority = 1;
+
+    foreach my $res (@$reserves) {
+        if ( $res->{'lowestPriority'} ) {
+            push( @lowestPriorityReserves, $res );
+        } elsif ( $res->{'found'} eq 'W' ) {
+            ## We don't want to alter the priority of Waiting reserves.
+            ## Do Nothing.
+        } else {
+            unless ( $res->{'lockPriority'} ) {
+
+                my $thisPriorityLocked = 1;
+                while ($thisPriorityLocked) {
+                    if ( _inArray( $workingPriority, @lockedPriorities ) ) {
+                        $workingPriority++;
+                    }
+                    else {
+                        $thisPriorityLocked = 0;
+                    }
+                }
+
+                my $sth = $dbh->prepare(
+                    "UPDATE reserves SET priority = ?
+                                   WHERE biblionumber     = ?
+                                     AND borrowernumber   = ?
+                                     AND reservedate      = ?"
+                );
+                $sth->execute(
+                    $workingPriority,
+                    $res->{'biblionumber'},
+                    $res->{'borrowernumber'},
+                    $res->{'reservedate'}
+                );
+                $sth->finish;
+            }
+            $workingPriority++;
+        }
+    }
+    
+    foreach my $res ( @lowestPriorityReserves ) {
+                my $sth = $dbh->prepare(
+                    "UPDATE reserves SET priority = ?
+                                   WHERE biblionumber     = ?
+                                     AND borrowernumber   = ?
+                                     AND reservedate      = ?"
+                );
+                $sth->execute(
+                    $workingPriority,
+                    $res->{'biblionumber'},
+                    $res->{'borrowernumber'},
+                    $res->{'reservedate'}
+                );
+                
+                $workingPriority++;
+    
+    }
+}
+
+## Generic function to test for an element being in an array
+sub _inArray {
+    my ( $elt, @array ) = @_;
+    foreach my $a (@array) {
+        if ( $elt == $a ) {
+            return 1;
+        }
+    }
+
+    return 0;
+}
+
+## Returns a list of reserves priorities wehere lockPriority is set.
+sub _GetLockedPriorities {
+    my ($biblionumber) = @_;
+
+    my $dbh = C4::Context->dbh;
+
+    my $sth =
+      $dbh->prepare(
+"SELECT * FROM reserves WHERE biblionumber = ? AND lockPriority = '1' AND cancellationdate IS NULL"
+      );
+    $sth->execute($biblionumber);
+
+    my @lockedPriorities;
+    while ( my $reserve = $sth->fetchrow_hashref() ) {
+        push( @lockedPriorities, $reserve->{'priority'} );
+    }
+    $sth->finish();
+
+    return @lockedPriorities;
+}
+
+## Because we can lock a reserves priority, there can be holes in the list of used priorities.
+## This function counts up until it finds the next unused priority.
+sub GetNextFreePriority {
+    my ($biblionumber) = @_;
+
+    my $dbh = C4::Context->dbh;
+
+    my $isPriorityUsed = 1;
+    my $i = 1;
+
+    while ( $isPriorityUsed ) {
+      my $sth =
+        $dbh->prepare(
+          "SELECT COUNT(*) as priorityUsed FROM reserves WHERE biblionumber = ? AND priority = ? AND ( cancellationdate IS NULL OR cancellationdate < CURRENT_DATE() )"
+        );
+      $sth->execute( $biblionumber, $i );
+
+ 
+      my $data = $sth->fetchrow_hashref();
+      my $priorityUsed = $data->{'priorityUsed'};      
+      $sth->finish();
+
+      if ( $priorityUsed ) {
+        $i++;
+      } else {
+        $isPriorityUsed = 0;
+      }
+    }
+    
+    return $i;
+}
+
+## Returns the lowest priority number currently being used.
+sub GetLastUsedPriority {
+    my ($biblionumber) = @_;
+
+    my $dbh = C4::Context->dbh;
+
+    my $isPriorityUsed = 1;
+    my $i = 1;
+
+    my $sth =
+        $dbh->prepare( ## Everything past biblionumber = ? can probably be removed
+          "SELECT MAX(priority) as lastPriority FROM reserves WHERE biblionumber = ? AND ( cancellationdate IS NULL OR cancellationdate < CURRENT_DATE() )"
+        );
+    $sth->execute( $biblionumber );
+
+ 
+    my $data = $sth->fetchrow_hashref();
+    my $lastPriority = $data->{'lastPriority'};
+
+    return $lastPriority;
+}
 
 =item FindReserves
 
@@ -104,19 +499,24 @@
 reserves, borrowers, and biblio tables of the Koha database.
 
 =cut
+
 #'
 sub FindReserves {
-	my ($bib,$bor)=@_;
+    my ( $bib, $bor ) = @_;
 	my $dbh = C4::Context->dbh;
+
 	# Find the desired items in the reserves
-	my $query="SELECT *,reserves.branchcode,biblio.title AS btitle, reserves.timestamp as rtimestamp,itemnumber FROM reserves,borrowers,biblio ";
+    my $query =
+"SELECT *,reserves.branchcode,biblio.title AS btitle, reserves.timestamp as rtimestamp,itemnumber FROM reserves,borrowers,biblio";
+
 	# FIXME - These three bits of SQL seem to contain a fair amount of
 	# redundancy. Wouldn't it be better to have a @clauses array, add
 	# one or two clauses as necessary, then join(" AND ", @clauses) ?
 	# FIXME: not keen on quote() and interpolation either, but it looks safe
-	if ($bib ne ''){
+    if ( $bib ne '' ) {
 		$bib = $dbh->quote($bib);
-		if ($bor ne ''){
+        if ( $bor ne '' ) {
+
 			# Both $bib and $bor specified
 			# Find a particular book for a particular patron
 			$bor = $dbh->quote($bor);
@@ -126,7 +526,9 @@
 						and biblio.biblionumber     = $bib
 						and cancellationdate is NULL
 						and (found <> 'F' or found is NULL)";
-		} else {
+        }
+        else {
+
 			# $bib specified, but not $bor
 			# Find a particular book for all patrons
 			$query .= " where reserves.borrowernumber = borrowers.borrowernumber
@@ -135,7 +537,9 @@
 					and cancellationdate is NULL
 					and (found <> 'F' or found is NULL)";
 		}
-	} else {
+    }
+    else {
+
 		# FIXME - Check that $bor was given
 		# No $bib given.
 		# Find all books for the given patron.
@@ -145,33 +549,42 @@
 					and cancellationdate is NULL and
 					(found <> 'F' or found is NULL)";
 	}
-	$query.=" order by priority";
-	my $sth=$dbh->prepare($query);
+    $query .= " order by priority";
+    my $sth = $dbh->prepare($query);
 	$sth->execute;
 	my @results;
-	while (my $data=$sth->fetchrow_hashref){
+    while ( my $data = $sth->fetchrow_hashref ) {
+
 		# FIXME - What is this if-statement doing? How do constraints work?
-		if ($data->{'constrainttype'} eq 'o') {
-			my $csth=$dbh->prepare("SELECT biblioitemnumber FROM reserveconstraints
+        if ( $data->{'constrainttype'} eq 'o' ) {
+            my $csth = $dbh->prepare(
+                "SELECT biblioitemnumber FROM reserveconstraints
 							WHERE biblionumber   = ?
 							AND borrowernumber = ?
-							AND reservedate    = ?");
-			$csth->execute($data->{'biblionumber'}, $data->{'borrowernumber'}, $data->{'reservedate'});
+							AND reservedate    = ?"
+            );
+            $csth->execute(
+                $data->{'biblionumber'},
+                $data->{'borrowernumber'},
+                $data->{'reservedate'}
+            );
 			my ($bibitemno) = $csth->fetchrow_array;
 			$csth->finish;
+
 			# Look up the book we just found.
 			my $bdata = C4::Search::bibitemdata($bibitemno);
+
 			# Add the results of this latest search to the current
 			# results.
 			# FIXME - An 'each' would probably be more efficient.
-			foreach my $key (keys %$bdata) {
+            foreach my $key ( keys %$bdata ) {
 				$data->{$key} = $bdata->{$key};
 			}
 		}
 		push @results, $data;
 	}
 	$sth->finish;
-	return($#results+1,\@results);
+    return ( $#results + 1, \@results );
 }
 
 =item CheckReserves
@@ -204,44 +617,57 @@
 table in the Koha database.
 
 =cut
+
 #'
 sub CheckReserves {
-    my ($item, $barcode) = @_;
+    my ( $item, $barcode ) = @_;
+
    #warn "In CheckReserves: itemnumber = $item , barcode: $barcode";
     my $dbh = C4::Context->dbh;
-    my ( $sth, $query ) ;
-    if (C4::Context->preference("item-level_itypes") ) {
-		$query = "SELECT items.biblionumber, items.biblioitemnumber, itemtypes.notforloan, itemtypes.notforreserve
+    my ( $sth, $query );
+    if ( C4::Context->preference("item-level_itypes") ) {
+        $query =
+"SELECT items.biblionumber, items.biblioitemnumber, itemtypes.notforloan, itemtypes.notforreserve
                              FROM items, itemtypes
-                            WHERE  items.itype = itemtypes.itemtype " ;
-	} else {
-		$query = "SELECT items.biblionumber, items.biblioitemnumber, itemtypes.notforloan, itemtypes.notforreserve
+                            WHERE  items.itype = itemtypes.itemtype ";
+    }
+    else {
+        $query =
+"SELECT items.biblionumber, items.biblioitemnumber, itemtypes.notforloan, itemtypes.notforreserve
                              FROM items, biblioitems, itemtypes
                             WHERE items.biblioitemnumber = biblioitems.biblioitemnumber
                               AND biblioitems.itemtype = itemtypes.itemtype ";
-    };
+    }
 	if ($item) {
     		$query .=  " AND itemnumber= ?"; 	#   . $dbh->quote($item);
 		$sth = $dbh->prepare($query);
 		$sth->execute($item);
-	} else {
-	 	$query .=  " AND barcode=?";   		# . $dbh->quote($barcode);  # the execute() placeholder handles quoting.
+    }
+    else {
+        $query .=
+          " AND barcode=?"
+          ; # . $dbh->quote($barcode);  # the execute() placeholder handles quoting.
 		$sth = $dbh->prepare($query);
 		$sth->execute($barcode);
-	};
+    }
 
-#	# FIXME - This function uses $item later on. Ought to set it here.
+    #	# FIXME - This function uses $item later on. Ought to set it here.
     
-    my ($biblio, $bibitem, $notforloan, $notforreserve) = $sth->fetchrow_array;
+    my ( $biblio, $bibitem, $notforloan, $notforreserve ) =
+      $sth->fetchrow_array;
     $sth->finish;
-# if item is not for loan it cannot be reserved either.....
-    return (0, 0) if ($notforloan);
+
+    # if item is not for loan it cannot be reserved either.....
+    return ( 0, 0 ) if ($notforloan);
+
     # if item cant be reserved
-    return (0, 0) if ($notforreserve);
-# get the reserves...
+    return ( 0, 0 ) if ($notforreserve);
+
+    # get the reserves...
     # Find this item in the reserves
-    my ($count, @reserves) = Findgroupreserve($bibitem, $biblio);
-#warn "Found $count reserves.";    
+    my ( $count, @reserves ) = Findgroupreserve( $bibitem, $biblio );
+
+    #warn "Found $count reserves.";
 	# $priority and $highest are used to find the most important item
     # in the list returned by &Findgroupreserve. (The lower $priority,
     # the more important the item.)
@@ -250,10 +676,13 @@
     my $highest;
     if ($count) {
 	foreach my $res (@reserves) {
+
 	    # FIXME - $item might be undefined or empty: the caller
 	    # might be searching by barcode.
-	    if ($res->{'itemnumber'} == $item) {
-			if ( C4::Context->preference('itemlevelreserves') && $res->{'Found'} ne 'W' ) {
+            if ( $res->{'itemnumber'} == $item ) {
+                if ( C4::Context->preference('itemlevelreserves')
+                    && $res->{'Found'} ne 'W' )
+                {
 				 return ( "Reserved", $res );
 			}
 			else {
@@ -262,10 +691,12 @@
 		    }
 	    } 
 		else {
+
 		# See if this item is more important than what we've got
 		# so far.
-			if ($res->{'priority'} != 0 && $res->{'priority'} < $priority) {
-				if ( C4::Context->preference('itemlevelreserves') ){			
+                if ( $res->{'priority'} != 0 && $res->{'priority'} < $priority )
+                {
+                    if ( C4::Context->preference('itemlevelreserves') ) {
 				}
 				else {
 					$priority = $res->{'priority'};
@@ -281,9 +712,10 @@
     # next in line to get this book.
     if ($highest) {	# FIXME - $highest might be undefined
 	$highest->{'itemnumber'} = $item;
-	return ("Reserved", $highest);
-    } else {
-	return (0, 0);
+        return ( "Reserved", $highest );
+    }
+    else {
+        return ( 0, 0 );
     }
 }
 
@@ -304,47 +736,56 @@
 priorities of the other people who are waiting on the book.
 
 =cut
+
 #'
 sub CancelReserve {
-    my ($biblio, $item, $borr) = @_;
+    my ( $biblio, $item, $borr ) = @_;
     my $dbh = C4::Context->dbh;
+
     #warn "In CancelReserve";
-    if (($item and $borr) and (not $biblio)) {
+    if ( ( $item and $borr ) and ( not $biblio ) ) {
+
 		# removing a waiting reserve record....
 		# update the database...
-		my $sth = $dbh->prepare("update reserves set cancellationdate = now(),
+        my $sth = $dbh->prepare(
+            "update reserves set cancellationdate = now(),
 											found            = Null,
 											priority         = 0
 									where itemnumber       = ?
-										and borrowernumber   = ?");
-		$sth->execute($item,$borr);
+										and borrowernumber   = ?"
+        );
+        $sth->execute( $item, $borr );
 		$sth->finish;
     }
-    if (($biblio and $borr) and (not $item)) {
+    if ( ( $biblio and $borr ) and ( not $item ) ) {
+
 		# removing a reserve record....
 		# get the prioritiy on this record....
 		my $priority;
-		my $sth=$dbh->prepare("SELECT priority FROM reserves
+        my $sth = $dbh->prepare(
+            "SELECT priority FROM reserves
 										WHERE biblionumber   = ?
 										AND borrowernumber = ?
 										AND cancellationdate is NULL
-										AND (found <> 'F' or found is NULL)");
-		$sth->execute($biblio,$borr);
+										AND (found <> 'F' or found is NULL)"
+        );
+        $sth->execute( $biblio, $borr );
 		($priority) = $sth->fetchrow_array;
 		$sth->finish;
 
 		# update the database, removing the record...
-		$sth = $dbh->prepare("update reserves set cancellationdate = now(),
+        $sth = $dbh->prepare(
+            "update reserves set cancellationdate = now(),
 											found            = Null,
 											priority         = 0
 									where biblionumber     = ?
 										and borrowernumber   = ?
 										and cancellationdate is NULL
-										and (found <> 'F' or found is NULL)");
-		$sth->execute($biblio,$borr);
+										and (found <> 'F' or found is NULL)"
+        );
+        $sth->execute( $biblio, $borr );
 		$sth->finish;
-		# now fix the priority on the others....
-		fixpriority($priority, $biblio);
+
     }
 }
 
@@ -359,6 +800,7 @@
 whose keys are fields from the reserves table in the Koha database.
 
 =cut
+
 #'
 sub FillReserve {
     my ($res) = @_;
@@ -366,7 +808,8 @@
 
     # fill in a reserve record....
     # FIXME - Remove some of the redundancy here
-    my $biblio = $res->{'biblionumber'}; my $qbiblio =$biblio;
+    my $biblio  = $res->{'biblionumber'};
+    my $qbiblio = $biblio;
     my $borr = $res->{'borrowernumber'}; 
     my $resdate = $res->{'reservedate'}; 
 
@@ -377,8 +820,8 @@
                                 WHERE biblionumber   = ?
                                   AND borrowernumber = ?
                                   AND reservedate    = ?";
-    my $sth=$dbh->prepare($query);
-    $sth->execute($qbiblio,$borr,$resdate);
+        my $sth = $dbh->prepare($query);
+        $sth->execute( $qbiblio, $borr, $resdate );
     ($priority) = $sth->fetchrow_array;
     $sth->finish;
     }
@@ -391,42 +834,23 @@
                                  AND reservedate      = ?
                                  AND borrowernumber   = ?";
     my $sth = $dbh->prepare($query);
-    $sth->execute($qbiblio,$resdate,$borr);
+        $sth->execute( $qbiblio, $resdate, $borr );
     $sth->finish;
     }
 
-    # now fix the priority on the others (if the priority wasn't
-    # already sorted!)....
-    unless ($priority == 0) {
-	fixpriority($priority, $biblio);
-    }
-}
-
-# Only used internally
-# Decrements (makes more important) the reserves for all of the
-# entries waiting on the given book, if their priority is > $priority.
-sub fixpriority {
-    my ($priority, $biblio) =  @_;
-    my $dbh = C4::Context->dbh;
-    my ($count, $reserves) = FindReserves($biblio);
-    foreach my $rec (@$reserves) {
-	if ($rec->{'priority'} > $priority) {
-	    my $sth = $dbh->prepare("UPDATE reserves SET priority = ?
-                               WHERE biblionumber     = ?
-                                 AND borrowernumber   = ?
-                                 AND reservedate      = ?");
-	    $sth->execute($rec->{'priority'},$rec->{'biblionumber'},$rec->{'borrowernumber'},$rec->{'reservedate'});
-	    $sth->finish;
-	}
-    }
+    FixPriorities($biblio)
+      ;    ## This internal function reflows the priority numbers.
 }
 
 # XXX - POD
 sub ReserveWaiting {
-    my ($item, $borr) = @_;
+warn "Executing Reserves2::ReserveWaiting";
+    my ( $item, $borr ) = @_;
     my $dbh = C4::Context->dbh;
-# get priority and biblionumber....
-    my $sth = $dbh->prepare("SELECT reserves.priority     as priority,
+
+    # get priority and biblionumber....
+    my $sth = $dbh->prepare(
+        "SELECT reserves.priority     as priority,
                         reserves.biblionumber as biblionumber,
                         reserves.branchcode   as branchcode,
                         reserves.timestamp     as timestamp
@@ -435,54 +859,63 @@
                        AND items.itemnumber        = ?
                        AND reserves.borrowernumber = ?
                        AND reserves.cancellationdate is NULL
-                       AND (reserves.found <> 'F' or reserves.found is NULL)");
-    $sth->execute($item,$borr);
+                       AND (reserves.found <> 'F' or reserves.found is NULL)"
+    );
+    $sth->execute( $item, $borr );
     my $data = $sth->fetchrow_hashref;
     $sth->finish;
     my $biblio = $data->{'biblionumber'};
     my $timestamp = $data->{'timestamp'};
-# update reserves record....
-    $sth = $dbh->prepare("UPDATE reserves SET priority = 0, found = 'W', itemnumber = ?
+
+    # update reserves record....
+    $sth = $dbh->prepare(
+        "UPDATE reserves SET priority = 0, found = 'W', itemnumber = ?
                             WHERE borrowernumber = ?
                               AND biblionumber = ?
-                              AND timestamp = ?");
-    $sth->execute($item,$borr,$biblio,$timestamp);
+                              AND timestamp = ?"
+    );
+    $sth->execute( $item, $borr, $biblio, $timestamp );
     $sth->finish;
-# now fix up the remaining priorities....
-    fixpriority($data->{'priority'}, $biblio);
+
+    # now fix up the remaining priorities....
+    FixPriorities( $biblio );
     my $branchcode = $data->{'branchcode'};
     return $branchcode;
 }
 
 sub CheckWaiting {
-    my ($borr)=@_;
+    my ($borr) = @_;
     my $dbh = C4::Context->dbh;
     my @itemswaiting;
-    my $sth = $dbh->prepare("SELECT * FROM reserves
+    my $sth = $dbh->prepare(
+        "SELECT * FROM reserves
                          WHERE borrowernumber = ?
                            AND reserves.found = 'W'
-                           AND cancellationdate is NULL");
+                           AND cancellationdate is NULL"
+    );
     $sth->execute($borr);
-    while (my $data=$sth->fetchrow_hashref) {
-	  push(@itemswaiting,$data);
+    while ( my $data = $sth->fetchrow_hashref ) {
+        push( @itemswaiting, $data );
     }
     $sth->finish;
-    return (scalar(@itemswaiting),\@itemswaiting);
+    return ( scalar(@itemswaiting), \@itemswaiting );
 }
 
 # for SMFPL 
 sub getAllreservenotes {
-    my ($biblionumber)=@_;
+    my ($biblionumber) = @_;
     my $dbh = C4::Context->dbh;
     my @notes;
-    my $sth = $dbh->prepare("SELECT borrowernumber, reservenotes, priority  FROM reserves WHERE biblionumber = ?
-                           AND reserves.found = 'W' AND cancellationdate is NULL order by priority");
+    my $sth = $dbh->prepare(
+"SELECT borrowernumber, reservenotes, priority  FROM reserves WHERE biblionumber = ?
+                           AND reserves.found = 'W' AND cancellationdate is NULL order by priority"
+    );
     $sth->execute($biblionumber);
-    while (my $data=$sth->fetchrow_hashref) {
-	  push(@notes,$data);
+    while ( my $data = $sth->fetchrow_hashref ) {
+        push( @notes, $data );
     }
     $sth->finish;
-    return (\@notes);
+    return ( \@notes );
 }
 
 =item Findgroupreserve
@@ -504,11 +937,13 @@
 C<biblioitemnumber>.
 
 =cut
+
 #'
 sub Findgroupreserve {
-	my ($bibitem,$biblio)=@_;
+    my ( $bibitem, $biblio ) = @_;
 	my $dbh = C4::Context->dbh;
-	my $sth=$dbh->prepare("SELECT reserves.biblionumber               AS biblionumber,
+    my $sth = $dbh->prepare(
+        "SELECT reserves.biblionumber               AS biblionumber,
                       reserves.borrowernumber             AS borrowernumber,
                       reserves.reservedate                AS reservedate,
                       reserves.branchcode                 AS branchcode,
@@ -527,8 +962,9 @@
                       AND reserves.reservedate    =reserveconstraints.reservedate )
                    OR reserves.constrainttype='a' )
                   AND reserves.cancellationdate is NULL
-                  AND (reserves.found <> 'F' or reserves.found is NULL)");
-    if (C4::Context->preference('itemlevelreserves')){
+                  AND (reserves.found <> 'F' or reserves.found is NULL)"
+    );
+    if ( C4::Context->preference('itemlevelreserves') ) {
 		$sth = $dbh->prepare(
 			"SELECT reserves.biblionumber               AS biblionumber,
              reserves.borrowernumber             AS borrowernumber,
@@ -548,48 +984,64 @@
          $sth->execute($biblio);
      }
      else {
-		 $sth->execute($biblio, $bibitem);
+        $sth->execute( $biblio, $bibitem );
 	 }
      my @results;
-     while (my $data=$sth->fetchrow_hashref){
-		 push(@results,$data);
+    while ( my $data = $sth->fetchrow_hashref ) {
+        push( @results, $data );
      }
      $sth->finish;
-     return(scalar(@results), at results);
+    return ( scalar(@results), @results );
 }
 
 # FIXME - A somewhat different version of this function appears in
 # C4::Reserves. Pick one and stick with it.
 # XXX - POD
 sub CreateReserve {
-  my
-($env,$branch,$borrnum,$biblionumber,$constraint,$bibitems,$priority,$notes,$title,$itemnumbers)= @_;
-  my $fee=CalcReserveFee($env,$borrnum,$biblionumber,$constraint,$bibitems);
+    my (
+        $env,      $branch,   $borrnum, $biblionumber, $constraint,
+        $bibitems, $priority, $notes,   $title,        $itemnumbers, $expirationDate
+      )
+      = @_;
+      
+    warn "Epiration date: $expirationDate";
+    
+    unless ( $expirationDate ) { $expirationDate = 'NULL'; }
+      
+    my $fee =
+      CalcReserveFee( $env, $borrnum, $biblionumber, $constraint, $bibitems );
   my $dbh = C4::Context->dbh;
-  my $const = lc substr($constraint,0,1);
+    my $const   = lc substr( $constraint, 0, 1 );
   my @datearr = localtime(time);
-  my $resdate =(1900+$datearr[5])."-".($datearr[4]+1)."-".$datearr[3];
+    my $resdate =
+      ( 1900 + $datearr[5] ) . "-" . ( $datearr[4] + 1 ) . "-" . $datearr[3];
+
   #eval {
   # updates take place here
-  if ($fee > 0) {
-#    print $fee;
-    my $nextacctno = _getnextacctno($env,$borrnum,$dbh);
-    my $usth = $dbh->prepare("insert into accountlines
+    if ( $fee > 0 ) {
+
+        #    print $fee;
+        my $nextacctno = _getnextacctno( $env, $borrnum, $dbh );
+        my $usth = $dbh->prepare(
+            "insert into accountlines
     (borrowernumber,accountno,date,amount,description,accounttype,amountoutstanding)
 						          values
-    (?,?,now(),?,?,'Res',?)");
-    $usth->execute($borrnum,$nextacctno,$fee,'Reserve Charge -'.$title,$fee);
+    (?,?,now(),?,?,'Res',?)"
+        );
+        $usth->execute( $borrnum, $nextacctno, $fee,
+            'Reserve Charge -' . $title, $fee );
     $usth->finish;
   }
     
     if ( C4::Context->preference('itemlevelreserves') ) { 
-		my $sth = $dbh->prepare( 
-			"INSERT INTO reserves (borrowernumber,biblionumber,reservedate,branchcode,constrainttype,priority,reservenotes,itemnumber) VALUES (?,?,?,?,?,?,?,?)"                                                                                                                                       
+        my $sth =
+          $dbh->prepare(
+"INSERT INTO reserves (borrowernumber,biblionumber,reservedate,branchcode,constrainttype,priority,reservenotes,itemnumber, expirationDate) VALUES (?,?,?,?,?,?,?,?,?)"
           );
         if ( $constraint ne 'a' ) { 
 			foreach my $item (@$bibitems) {
 				$sth->execute( $borrnum, $biblionumber, $resdate, $branch,
-					$const, $priority, $notes, $item );
+                    $const, $priority, $notes, $item, $expirationDate );
 				$priority++;
 			}
 			$sth->finish();
@@ -602,12 +1054,13 @@
 		}
     }        
     else {
-		my $sth = $dbh->prepare(
-			"INSERT INTO reserves (borrowernumber,biblionumber,reservedate,branchcode,constrainttype,priority,reservenotes) VALUES (?,?,?,?,?,?,?)" 
+        my $sth =
+          $dbh->prepare(
+"INSERT INTO reserves (borrowernumber,biblionumber,reservedate,branchcode,constrainttype,priority,reservenotes, expirationDate) VALUES (?,?,?,?,?,?,?,?)"
 		);
 		
 		 $sth->execute( $borrnum, $biblionumber, $resdate, $branch, $const,
-			 $priority, $notes ); 
+            $priority, $notes, $expirationDate );
         $sth->finish;
 		
         if ( ( $const eq "o" ) || ( $const eq "e" ) ) {
@@ -615,8 +1068,9 @@
 			my $i        = 0;
 			while ( $i < $numitems ) {
 				my $biblioitem = @$bibitems[$i];
-				my $sth        = $dbh->prepare(
-					"INSERT INTO  reserveconstraints (borrowernumber,biblionumber,reservedate,biblioitemnumber) VALUES (?,?,?,?)"
+                my $sth        =
+                  $dbh->prepare(
+"INSERT INTO  reserveconstraints (borrowernumber,biblionumber,reservedate,biblioitemnumber) VALUES (?,?,?,?)"
 				);
                 $sth->execute( $borrnum, $biblionumber, $resdate, $biblioitem ); 
                 $sth->finish; 
@@ -624,7 +1078,7 @@
             }
         }
 	}
-    return();
+    return ();
 }
 
 # FIXME - A functionally identical version of this function appears in
@@ -632,45 +1086,56 @@
 # XXX - Internal use only
 # FIXME - opac-reserves.pl need to use it, temporarily put into @EXPORT
 sub CalcReserveFee {
-  my ($env,$borrnum,$biblionumber,$constraint,$bibitems) = @_;
+    my ( $env, $borrnum, $biblionumber, $constraint, $bibitems ) = @_;
+
   #check for issues;
   my $dbh = C4::Context->dbh;
-  my $const = lc substr($constraint,0,1);
-  my $sth = $dbh->prepare("SELECT * FROM borrowers,categories
+    my $const = lc substr( $constraint, 0, 1 );
+    my $sth   = $dbh->prepare(
+        "SELECT * FROM borrowers,categories
                 WHERE (borrowernumber = ?)
-                  AND (borrowers.categorycode = categories.categorycode)");
+                  AND (borrowers.categorycode = categories.categorycode)"
+    );
   $sth->execute($borrnum);
   my $data = $sth->fetchrow_hashref;
   $sth->finish();
   my $fee = $data->{'reservefee'};
-  my $cntitems = @->$bibitems;
-  if ($fee > 0) {
+    my $cntitems = @- > $bibitems;
+
+    if ( $fee > 0 ) {
+
     # check for items on issue
     # first find biblioitem records
     my @biblioitems;
-    my $sth1 = $dbh->prepare("SELECT * FROM biblio,biblioitems
+        my $sth1 = $dbh->prepare(
+            "SELECT * FROM biblio,biblioitems
                    WHERE (biblio.biblionumber = ?)
-                     AND (biblio.biblionumber = biblioitems.biblionumber)");
+                     AND (biblio.biblionumber = biblioitems.biblionumber)"
+        );
     $sth1->execute($biblionumber);
-    while (my $data1=$sth1->fetchrow_hashref) {
-      if ($const eq "a") {
-        push @biblioitems,$data1;
-      } else {
+        while ( my $data1 = $sth1->fetchrow_hashref ) {
+            if ( $const eq "a" ) {
+                push @biblioitems, $data1;
+            }
+            else {
         my $found = 0;
 	my $x = 0;
-	while ($x < $cntitems) {
-          if (@$bibitems->{'biblioitemnumber'} == $data->{'biblioitemnumber'}) {
+                while ( $x < $cntitems ) {
+                    if ( @$bibitems->{'biblioitemnumber'} ==
+                        $data->{'biblioitemnumber'} )
+                    {
             $found = 1;
 	  }
 	  $x++;
 	}
-	if ($const eq 'o') {
-	  if ( $found == 1) {
-	    push @biblioitems,$data1;
+                if ( $const eq 'o' ) {
+                    if ( $found == 1 ) {
+                        push @biblioitems, $data1;
 	  }
-        } else {
-	  if ($found == 0) {
-	    push @biblioitems,$data1;
+                }
+                else {
+                    if ( $found == 0 ) {
+                        push @biblioitems, $data1;
 	  }
 	}
       }
@@ -680,100 +1145,131 @@
     my $issues = 0;
     my $x = 0;
     my $allissued = 1;
-    while ($x < $cntitemsfound) {
+        while ( $x < $cntitemsfound ) {
       my $bitdata = $biblioitems[$x];
-      my $sth2 = $dbh->prepare("SELECT * FROM items
-                     WHERE biblioitemnumber = ?");
-      $sth2->execute($bitdata->{'biblioitemnumber'});
-      while (my $itdata=$sth2->fetchrow_hashref) {
-        my $sth3 = $dbh->prepare("SELECT * FROM issues
+            my $sth2    = $dbh->prepare(
+                "SELECT * FROM items
+                     WHERE biblioitemnumber = ?"
+            );
+            $sth2->execute( $bitdata->{'biblioitemnumber'} );
+            while ( my $itdata = $sth2->fetchrow_hashref ) {
+                my $sth3 = $dbh->prepare(
+                    "SELECT * FROM issues
                        WHERE itemnumber = ?
-                         AND returndate IS NULL");
-        $sth3->execute($itdata->{'itemnumber'});
-        if (my $isdata=$sth3->fetchrow_hashref) {
-	} else {
+                         AND returndate IS NULL"
+                );
+                $sth3->execute( $itdata->{'itemnumber'} );
+                if ( my $isdata = $sth3->fetchrow_hashref ) {
+                }
+                else {
 	  $allissued = 0;
 	}
       }
       $x++;
     }
-    if ($allissued == 0) {
-      my $rsth = $dbh->prepare("SELECT * FROM reserves WHERE biblionumber = ?");
+        if ( $allissued == 0 ) {
+            my $rsth =
+              $dbh->prepare("SELECT * FROM reserves WHERE biblionumber = ?");
       $rsth->execute($biblionumber);
-      if (my $rdata = $rsth->fetchrow_hashref) {
-      } else {
+            if ( my $rdata = $rsth->fetchrow_hashref ) {
+            }
+            else {
         $fee = 0;
       }
     }
   }
-#  print "fee $fee";
+
+    #  print "fee $fee";
   return $fee;
 }
 
 # XXX - Internal use
 sub _getnextacctno {
-  my ($env,$bornumber,$dbh)=@_;
+    my ( $env, $bornumber, $dbh ) = @_;
   my $nextaccntno = 1;
-  my $sth = $dbh->prepare("select * from accountlines
+    my $sth         = $dbh->prepare(
+        "select * from accountlines
   where (borrowernumber = ?)
-  order by accountno desc");
+  order by accountno desc"
+    );
   $sth->execute($bornumber);
-  if (my $accdata=$sth->fetchrow_hashref){
+    if ( my $accdata = $sth->fetchrow_hashref ) {
     $nextaccntno = $accdata->{'accountno'} + 1;
   }
   $sth->finish;
-  return($nextaccntno);
+    return ($nextaccntno);
 }
 
 # XXX - POD
-sub updatereserves{
+sub updatereserves {
+
   #subroutine to update a reserve
-  my ($rank,$biblio,$borrower,$del,$branch)=@_;
+    my ( $rank, $biblio, $borrower, $del, $branch ) = @_;
   my $dbh = C4::Context->dbh;
-  if ($del == 0){
-    my $sth = $dbh->prepare("Update reserves set priority=?,branchcode=? where
-    biblionumber=? and borrowernumber=?");
-    $sth->execute($rank,$branch,$biblio,$borrower);
+    if ( $del == 0 ) {
+        my $sth = $dbh->prepare(
+            "Update reserves set priority=?,branchcode=? where
+    biblionumber=? and borrowernumber=?"
+        );
+        $sth->execute( $rank, $branch, $biblio, $borrower );
     $sth->finish();
-  } else {
-    my $sth=$dbh->prepare("Select * from reserves where biblionumber=? and
-    borrowernumber=?");
-    $sth->execute($biblio,$borrower);
-    my $data=$sth->fetchrow_hashref;
+    }
+    else {
+        my $sth = $dbh->prepare(
+            "Select * from reserves where biblionumber=? and
+    borrowernumber=?"
+        );
+        $sth->execute( $biblio, $borrower );
+        my $data = $sth->fetchrow_hashref;
     $sth->finish();
-    $sth=$dbh->prepare("Select * from reserves where biblionumber=? and
+        $sth = $dbh->prepare(
+            "Select * from reserves where biblionumber=? and
     priority > ? and cancellationdate is NULL
-    order by priority") || die $dbh->errstr;
-    $sth->execute($biblio,$data->{'priority'}) || die $sth->errstr;
-    while (my $data=$sth->fetchrow_hashref){
+    order by priority"
+          )
+          || die $dbh->errstr;
+        $sth->execute( $biblio, $data->{'priority'} ) || die $sth->errstr;
+
+        while ( my $data = $sth->fetchrow_hashref ) {
       $data->{'priority'}--;
-      my $sth3=$dbh->prepare("Update reserves set priority=?
-      where biblionumber=? and borrowernumber=?");
-      $sth3->execute($data->{'priority'},$data->{'biblionumber'},$data->{'borrowernumber'}) || die $sth3->errstr;
+            my $sth3 = $dbh->prepare(
+                "Update reserves set priority=?
+      where biblionumber=? and borrowernumber=?"
+            );
+            $sth3->execute(
+                $data->{'priority'},
+                $data->{'biblionumber'},
+                $data->{'borrowernumber'}
+              )
+              || die $sth3->errstr;
       $sth3->finish();
     }
     $sth->finish();
-    $sth=$dbh->prepare("update reserves set cancellationdate=now() where biblionumber=?
-    and borrowernumber=?");
-    $sth->execute($biblio,$borrower);
+        $sth = $dbh->prepare(
+            "update reserves set cancellationdate=now() where biblionumber=?
+    and borrowernumber=?"
+        );
+        $sth->execute( $biblio, $borrower );
     $sth->finish;
   }
 }
 
 # XXX - POD
 sub UpdateReserve {
+
     #subroutine to update a reserve
-    my ($rank,$biblio,$borrower,$branch,$itemnumber)=@_;
+    my ( $rank, $biblio, $borrower, $branch, $itemnumber ) = @_;
     return if $rank eq "W";
     return if $rank eq "n";
-	if (!$itemnumber){
-		$itemnumber=0;
+    if ( !$itemnumber ) {
+        $itemnumber = 0;
 	}
     my $dbh = C4::Context->dbh;
 	if ( $rank eq "del" ) {
 		if ( C4::Context->preference('itemlevelreserves') ) {
-			if ($itemnumber == 0){
-				my $sth = $dbh->prepare( "UPDATE reserves SET cancellationdate=now() WHERE biblionumber=? AND borrowernumber=?
+            if ( $itemnumber == 0 ) {
+                my $sth = $dbh->prepare(
+"UPDATE reserves SET cancellationdate=now() WHERE biblionumber=? AND borrowernumber=?
                 AND cancellationdate is NULL 
                 AND (found <> 'F' or found is NULL) AND (itemnumber is NULL or itemnumber = 0)"
                 );
@@ -781,16 +1277,18 @@
                 $sth->finish();
             }
             else {
-				my $sth = $dbh->prepare(
-				"UPDATE reserves SET cancellationdate=now() WHERE itemnumber=? AND borrowernumber=? AND cancellationdate is NULL AND (found <> 'F' or found is NULL)"
+                my $sth =
+                  $dbh->prepare(
+"UPDATE reserves SET cancellationdate=now() WHERE itemnumber=? AND borrowernumber=? AND cancellationdate is NULL AND (found <> 'F' or found is NULL)"
 				);
 				$sth->execute( $itemnumber, $borrower );
 				$sth->finish();
 			}
         }
         else {
-			my $sth = $dbh->prepare(
-				"UPDATE reserves SET cancellationdate=now() WHERE biblionumber   = ? AND borrowernumber = ? AND cancellationdate is NULL AND (found <> 'F' or found is NULL)" 
+            my $sth =
+              $dbh->prepare(
+"UPDATE reserves SET cancellationdate=now() WHERE biblionumber   = ? AND borrowernumber = ? AND cancellationdate is NULL AND (found <> 'F' or found is NULL)"
 			);
             $sth->execute( $biblio, $borrower );
             $sth->finish;
@@ -798,25 +1296,29 @@
     }
 	else {
 		if ( C4::Context->preference('itemlevelreserves') ) { 
-			if ($itemnumber == 0){
-				my $sth = $dbh->prepare(
-				"UPDATE reserves SET priority = ? ,branchcode = ? WHERE biblionumber   = ? AND borrowernumber = ?  AND cancellationdate is NULL AND (found <> 'F' or found is NULL) AND (itemnumber is NULL or itemnumber = 0) limit 1"
+            if ( $itemnumber == 0 ) {
+                my $sth =
+                  $dbh->prepare(
+"UPDATE reserves SET priority = ? ,branchcode = ? WHERE biblionumber   = ? AND borrowernumber = ?  AND cancellationdate is NULL AND (found <> 'F' or found is NULL) AND (itemnumber is NULL or itemnumber = 0) limit 1"
 				);				
 				$sth->execute( $rank, $branch, $biblio, $borrower ); 
 				$sth->finish;
 			}
 			else {
-				my $sth = $dbh->prepare(
-				"UPDATE reserves SET priority = ? ,branchcode = ? WHERE biblionumber   = ? AND borrowernumber = ? AND itemnumber= ? AND cancellationdate is NULL AND (found <> 'F' or found is NULL)"
+                my $sth =
+                  $dbh->prepare(
+"UPDATE reserves SET priority = ? ,branchcode = ? WHERE biblionumber   = ? AND borrowernumber = ? AND itemnumber= ? AND cancellationdate is NULL AND (found <> 'F' or found is NULL)"
 				);
 				warn $itemnumber;
-				$sth->execute( $rank, $branch, $biblio, $borrower, $itemnumber ); 
+                $sth->execute( $rank, $branch, $biblio, $borrower,
+                    $itemnumber );
 				$sth->finish;
 			}
 		}
         else {
-			my $sth = $dbh->prepare(
-				"UPDATE reserves SET priority = ? ,branchcode = ?, itemnumber = NULL, found = NULL WHERE biblionumber   = ? AND borrowernumber = ? AND cancellationdate is NULL AND (found <> 'F' or found is NULL)"
+            my $sth =
+              $dbh->prepare(
+"UPDATE reserves SET priority = ? ,branchcode = ?, itemnumber = NULL, found = NULL WHERE biblionumber   = ? AND borrowernumber = ? AND cancellationdate is NULL AND (found <> 'F' or found is NULL)"
 			);
             $sth->execute( $rank, $branch, $biblio, $borrower );
             $sth->finish;
@@ -826,31 +1328,34 @@
 
 # XXX - POD
 sub getreservetitle {
- my ($biblio,$bor,$date,$timestamp)=@_;
+    my ( $biblio, $bor, $date, $timestamp ) = @_;
  my $dbh = C4::Context->dbh;
- my $sth=$dbh->prepare("Select * from reserveconstraints,biblioitems where
+    my $sth = $dbh->prepare(
+        "Select * from reserveconstraints,biblioitems where
  reserveconstraints.biblioitemnumber=biblioitems.biblioitemnumber
  and reserveconstraints.biblionumber=? and reserveconstraints.borrowernumber
  = ? and reserveconstraints.reservedate=? and
- reserveconstraints.timestamp=?");
- $sth->execute($biblio,$bor,$date,$timestamp);
- my $data=$sth->fetchrow_hashref;
+ reserveconstraints.timestamp=?"
+    );
+    $sth->execute( $biblio, $bor, $date, $timestamp );
+    my $data = $sth->fetchrow_hashref;
  $sth->finish;
- return($data);
+    return ($data);
 }
 
 # Checks if an item (or itemtype) can be reserved
 
 sub CanBeReserved {
-	my ($itemnumber,$itemtype) = @_;
+    my ( $itemnumber, $itemtype ) = @_;
 	my $dbh = C4::Context->dbh();
-	if ($itemtype){
+    if ($itemtype) {
+
 		# we have an itemtype so just need to check that
 		my $query = "SELECT notforreserve FROM itemtypes WHERE itemtype = ?";
 		my $sth = $dbh->prepare($query);
 		$sth->execute($itemtype);
-		my $data=$sth->fetchrow_hashref();
-		if ($data->{'notforreserve'} == 1){
+        my $data = $sth->fetchrow_hashref();
+        if ( $data->{'notforreserve'} == 1 ) {
 			return 0;
 		}
 		else {
@@ -858,10 +1363,12 @@
 		}
 		$sth->finish();
 	} 
-	elsif ($itemnumber){
+    elsif ($itemnumber) {
+
 		# check first at item level then if needed get itemtype and check that
 		}
 	else {
 		return 0; #nothing passsed in, dont call the function this way
 	}
 }
+

Index: koha-tmpl/intranet-tmpl/ccfls/en/request.tmpl
===================================================================
RCS file: /sources/koha/koha/koha-tmpl/intranet-tmpl/ccfls/en/Attic/request.tmpl,v
retrieving revision 1.1.2.1.2.4
retrieving revision 1.1.2.1.2.5
diff -u -b -r1.1.2.1.2.4 -r1.1.2.1.2.5
--- koha-tmpl/intranet-tmpl/ccfls/en/request.tmpl	22 May 2007 11:50:38 -0000	1.1.2.1.2.4
+++ koha-tmpl/intranet-tmpl/ccfls/en/request.tmpl	31 Oct 2007 12:14:22 -0000	1.1.2.1.2.5
@@ -48,21 +48,12 @@
 <!-- TMPL_VAR Name="author" --></h2>
 <div class="data">
 	<table>
-		<tr><th>Rank</th><td>
-<select name="rank-request">
-			<!-- TMPL_LOOP Name="optionloop" -->
-				<option value="<!-- TMPL_VAR Name="num" -->"<!-- TMPL_IF Name="selected" --> selected="selected"<!-- /TMPL_IF -->>
-					<!-- TMPL_VAR Name="num" -->
-				</option>
-			<!-- /TMPL_LOOP -->
-			</select>
-			</td></tr>
-
 		<tr><th><label for="rsvnotes">Notes</label></th><td><input type="text" size="20" name="notes" id="rsvnotes"></tr>
 		<tr><th><label for="date">Date</label></th><td><!-- TMPL_VAR name="date" --></td></tr>
 		<tr><th><label for="pickup">Pickup</label></th><td><!-- TMPL_VAR name="CGIbranch" --></td></tr>
 		<tr><th>Request</th><td><input type="checkbox" name="request" id="request" value="any" checked="checked" /><label for="request">Next Available, (or choose from list below)</label></tr>
 		<tr><th><label for="member">Card Number</label></th><td><input type="text" size="10" name="member" id="member" /> <a href="/cgi-bin/koha/members/members-home.pl?quicksearch=1" onclick="PopWin(this, 'newwin', 300, 400); return false;">(Quick Search)</a></td></tr>
+		<tr><th><label>Not Needed After:</th><td><input name="expireMonth" type="text" size="2" max="2" />/<input name="expireDay" type="text" size="2" max="2" />/<input name="expireYear" type="text" size="4" max="4" /><i>(Optional: Input Date in the Format MM/DD/YYYY)</i></td></tr>
 	</table>
 </div>
 
@@ -107,34 +98,51 @@
 <input type="submit" name="submit"  value="Place New Request"  class="submit" onclick="this.value='Please wait...'; this.disabled=true;" />
 </form>
 <!-- TMPL_IF NAME="reserveloop" -->
-<form name="T<!-- TMPL_VAR Name="time" -->" action="modrequest.pl" method="post">
+<form name="updateReservesForm" action="modrequest.pl" method="post">
 <h3>Modify Existing Requests</h3>
 <div class="table"><table>
 	<tr>
-		<th>Rank</th>
+		<th></th>
+		<th></th>
 		<th>Patron</th>
 		<th>Notes</th>
 		<th>Date</th>
 		<th>Pickup Location</th>
 		<th>Request</th>
+		<th><img src="<!-- TMPL_VAR NAME='themelang' -->/images/lock.png" border="0"/ title="Toggle Lock In Place - If the reserve is locked in place, it's rank will not change."></th>
+		<th><img src="<!-- TMPL_VAR NAME='themelang' -->/images/go-bottom.png" border="0"/ title="Toggle Set to Lowest Priority"></th>
+		<th><img src="<!-- TMPL_VAR NAME='themelang' -->/images/cross.png" border="0"/ title="Cancel Reserves"></th>
 	</tr>
 
 	<!-- TMPL_LOOP Name="reserveloop" -->
-		<tr>
+		<tr width=100>
+			<td style="white-space:nowrap;">
+				<a title="Move Reserve Up" href="/cgi-bin/koha/request.pl?action=move&where=up&borrowernumber=<!-- TMPL_VAR Name="borrowernumber" -->&biblionumber=<!-- TMPL_VAR Name="biblionumber" -->&date=<!-- TMPL_VAR Name="date" -->">
+					<img src="<!-- TMPL_VAR NAME='themelang' -->/images/go-up.png" border="0" />
+				</a>
+
+				<a title="Move Reserve To Top" href="/cgi-bin/koha/request.pl?action=move&where=top&borrowernumber=<!-- TMPL_VAR Name="borrowernumber" -->&biblionumber=<!-- TMPL_VAR Name="biblionumber" -->&date=<!-- TMPL_VAR Name="date" -->">
+					<img src="<!-- TMPL_VAR NAME='themelang' -->/images/go-top.png" border="0" />
+				</a>
+				
+				<a title="Move Reserve To Bottom" href="/cgi-bin/koha/request.pl?action=move&where=bottom&borrowernumber=<!-- TMPL_VAR Name="borrowernumber" -->&biblionumber=<!-- TMPL_VAR Name="biblionumber" -->&date=<!-- TMPL_VAR Name="date" -->">
+					<img src="<!-- TMPL_VAR NAME='themelang' -->/images/go-bottom.png" border="0" />
+				</a>
+
+				<a title="Move Reserve Down" href="/cgi-bin/koha/request.pl?action=move&where=down&borrowernumber=<!-- TMPL_VAR Name="borrowernumber" -->&biblionumber=<!-- TMPL_VAR Name="biblionumber" -->&date=<!-- TMPL_VAR Name="date" -->">
+					<img src="<!-- TMPL_VAR NAME='themelang' -->/images/go-down.png" border="0" />
+				</a>
+			</td>
+
 			<td>
 			<input type="hidden" name="borrowernumber" value="<!-- TMPL_VAR Name="borrowernumber" -->" />
 			<input type="hidden" name="biblio" value="<!-- TMPL_VAR Name="biblionumber" -->" />
-			<select name="rank-request">
 				<!-- TMPL_IF Name="wait" -->
-					<option value="W" selected="selected">Consigned</option>
+					Consigned
+				<!-- TMPL_ELSE -->
+					<!-- TMPL_VAR Name="priority" -->
 				<!-- /TMPL_IF -->
-				<!-- TMPL_LOOP Name="optionloop" -->
-					<option value="<!-- TMPL_VAR Name="num" -->"<!-- TMPL_IF Name="selected" --> selected="selected"<!-- /TMPL_IF -->>
-						<!-- TMPL_VAR Name="num" -->
-					</option>
-				<!-- /TMPL_LOOP -->
-				<option value="del">Del</option>
-			</select></td>
+			</td>
 			<td>
 			<a href="/cgi-bin/koha/members/moremember.pl?bornum=<!-- TMPL_VAR Name="borrowernumber" -->"><!-- TMPL_VAR Name="firstname" --> <!-- TMPL_VAR Name="surname" --></a>
 			</td>
@@ -149,7 +157,7 @@
 				<!-- /TMPL_IF -->
 				
 				<!-- TMPL_ELSE -->
-					<select name="pickup">
+					<select name="pickup<!-- TMPL_VAR Name="borrowernumber" -->" id="pickup<!-- TMPL_VAR Name="borrowernumber" -->" onchange="javascript:location.href = '/cgi-bin/koha/request.pl?action=updatePickupLocation&borrowernumber=<!-- TMPL_VAR Name="borrowernumber" -->&biblionumber=<!-- TMPL_VAR Name="biblionumber" -->&date=<!-- TMPL_VAR Name="date" -->&branchcode=' + document.updateReservesForm.pickup<!-- TMPL_VAR Name="borrowernumber" -->.options[document.updateReservesForm.pickup<!-- TMPL_VAR Name="borrowernumber" -->.selectedIndex].value;">
 						<!-- TMPL_LOOP Name="branchloop" -->
 							<option value="<!-- TMPL_VAR Name="branch" -->"<!-- TMPL_IF Name="selected" --> selected="selected"<!-- /TMPL_IF -->>
 								<!-- TMPL_VAR Name="branchname" -->
@@ -173,13 +181,40 @@
 					<!-- /TMPL_IF -->
 				<!-- /TMPL_IF -->
 
-			</td>
+</td>
+
+<td>
+  <a title="Toggle Lock In Place" href="/cgi-bin/koha/request.pl?action=lock&borrowernumber=<!-- TMPL_VAR Name="borrowernumber" -->&biblionumber=<!-- TMPL_VAR Name="biblionumber" -->&date=<!-- TMPL_VAR Name="date" -->">
+	<!-- TMPL_IF NAME="lockPriority" -->
+		<img src="<!-- TMPL_VAR NAME='themelang' -->/images/lock.png" border="0"/>
+	<!-- TMPL_ELSE -->
+		<img src="<!-- TMPL_VAR NAME='themelang' -->/images/lock_open.png" border="0"/>
+	<!-- /TMPL_IF -->
+  </a>
+</td>
+
+<td>
+  <a title="Toggle Lowest Priority" href="/cgi-bin/koha/request.pl?action=setLowestPriority&borrowernumber=<!-- TMPL_VAR Name="borrowernumber" -->&biblionumber=<!-- TMPL_VAR Name="biblionumber" -->&date=<!-- TMPL_VAR Name="date" -->">
+	<!-- TMPL_IF NAME="lowestPriority" -->
+		<img src="<!-- TMPL_VAR NAME='themelang' -->/images/go-bottom.png" border="0"/ title="Unset Lowest Priority" />
+	<!-- TMPL_ELSE -->
+		<img src="<!-- TMPL_VAR NAME='themelang' -->/images/go-down.png" border="0"/ title="Set To Lowest Priority" />
+	<!-- /TMPL_IF -->
+  </a>
+</td>
+
+<td>
+	<a title="Cancel Reserve" href="/cgi-bin/koha/request.pl?action=cancel&borrowernumber=<!-- TMPL_VAR Name="borrowernumber" -->&biblionumber=<!-- TMPL_VAR Name="biblionumber" -->&date=<!-- TMPL_VAR Name="date" -->">
+		<img src="<!-- TMPL_VAR NAME='themelang' -->/images/cross.png" border="0"/>
+	</a>
+</td>
+
 		</tr>
 	<!-- /TMPL_LOOP -->
 </table>
-<p>Delete a request by selecting "del" from the rank list.</p>
-<p><input type="submit" name="submit"  value="Update List" class="submit" /></p>
-</div></form><!-- /TMPL_IF -->
+</div>
+</form>
+<!-- /TMPL_IF -->
 </div>
 
 </dd>

Index: koha-tmpl/intranet-tmpl/npl/en/request.tmpl
===================================================================
RCS file: /sources/koha/koha/koha-tmpl/intranet-tmpl/npl/en/Attic/request.tmpl,v
retrieving revision 1.3.2.2.2.4
retrieving revision 1.3.2.2.2.5
diff -u -b -r1.3.2.2.2.4 -r1.3.2.2.2.5
--- koha-tmpl/intranet-tmpl/npl/en/request.tmpl	11 Jun 2007 23:52:00 -0000	1.3.2.2.2.4
+++ koha-tmpl/intranet-tmpl/npl/en/request.tmpl	31 Oct 2007 12:14:23 -0000	1.3.2.2.2.5
@@ -1,8 +1,9 @@
 <!-- TMPL_INCLUDE NAME="doc-head-open.inc" -->Koha -- Catalogue: Add Reserve for <!-- TMPL_VAR Name="title" --><!-- TMPL_INCLUDE NAME="doc-head-close.inc" -->
 <!-- TMPL_INCLUDE NAME="masthead.inc" -->
 <!-- TMPL_INCLUDE NAME="intranet-nav.inc" -->
+
 <div id="main">
-<form action="placerequest.pl" method="post" id="requestForm">
+<form action="placerequest.pl" method="post" id="mainform">
 
 <input type="hidden" name="biblio" value="<!-- TMPL_VAR Name="bib" -->" />
 <input type="hidden" name="type" value="str8" />
@@ -13,24 +14,12 @@
 <!-- TMPL_VAR Name="author" --></h2>
 <div class="data">
 	<table>
-		<tr><th>Rank</th><td>
-<!-- TMPL_IF NAME="CAN_user_editcatalogue" -->  <!-- FOR SMFPL -->
-	<select name="rank-request">
-			<!-- TMPL_LOOP Name="optionloop" -->
-				<option value="<!-- TMPL_VAR Name="num" -->"<!-- TMPL_IF Name="selected" --> selected="selected"<!-- /TMPL_IF -->>
-					<!-- TMPL_VAR Name="num" -->
-				</option>
-			<!-- /TMPL_LOOP -->
-			</select>
-	<!-- TMPL_ELSE --><input type="text" size="2" name="rank-request" readonly="readonly" value="<!-- TMPL_VAR NAME="newpriority" -->" />
-	<!-- /TMPL_IF -->
-			</td></tr>
-
 		<tr><th><label for="rsvnotes">Notes</label></th><td><input type="text" size="20" name="notes" id="rsvnotes"></tr>
 		<tr><th><label for="date">Date</label></th><td><!-- TMPL_VAR name="date" --></td></tr>
 		<tr><th><label for="pickup">Pickup</label></th><td><!-- TMPL_VAR name="CGIbranch" --></td></tr>
-		<tr><th>Request</th><td><input type="checkbox" name="request" id="request" value="any" /><label for="request">Next Available, (or choose from list below)</label></tr>
+		<tr><th>Request</th><td><input type="checkbox" name="request" id="request" value="any" checked="checked" /><label for="request">Next Available, (or choose from list below)</label></tr>
 		<tr><th><label for="member">Card Number</label></th><td><input type="text" size="10" name="member" id="member" /> <a href="/cgi-bin/koha/members/members-home.pl?quicksearch=1" onclick="PopWin(this, 'newwin', 300, 400); return false;">(Quick Search)</a></td></tr>
+		<tr><th><label>Not Needed After:</th><td><input name="expireMonth" type="text" size="2" max="2" />/<input name="expireDay" type="text" size="2" max="2" />/<input name="expireYear" type="text" size="4" max="4" /><i>(Optional: Input Date in the Format MM/DD/YYYY)</i></td></tr>
 	</table>
 </div>
 
@@ -49,9 +38,8 @@
 			<!-- TMPL_IF Name="itemlost" -->
 				Cannot be selected
 			<!-- TMPL_ELSE -->
-				<input type="checkbox" name="reqbib" value="<!-- TMPL_VAR Name="biblioitemnumber" -->" />
+				<input type="checkbox" name="reqbib" value="<!-- TMPL_VAR Name="biblioitemnumber" -->" checked="checked" />
 				<input type="hidden" name="biblioitem" value="<!-- TMPL_VAR Name="biblioitemnumber" -->" />
-				<input type="hidden" name="itemnumber" value="<!-- TMPL_VAR Name="itemnumber" -->"  />
 			<!-- /TMPL_IF -->
 		</td>
 		<td>
@@ -73,40 +61,54 @@
 <!-- /TMPL_LOOP -->
 </table></div>
 
-<input type="submit" name="submit"  value="Place New Request"  id="requestSubmit" class="submit" />
-
+<input type="submit" name="submit"  value="Place New Request"  class="submit" onclick="this.value='Please wait...'; this.disabled=true;" />
 </form>
 <!-- TMPL_IF NAME="reserveloop" -->
-<form name="T<!-- TMPL_VAR Name="time" -->" action="modrequest.pl" method="post">
+<form name="updateReservesForm" action="modrequest.pl" method="post">
 <h3>Modify Existing Requests</h3>
 <div class="table"><table>
 	<tr>
-		<th>Rank</th>
+		<th></th>
+		<th></th>
 		<th>Patron</th>
 		<th>Notes</th>
 		<th>Date</th>
 		<th>Pickup Location</th>
 		<th>Request</th>
+		<th><img src="<!-- TMPL_VAR NAME='themelang' -->/images/lock.png" border="0"/ title="Toggle Lock In Place - If the reserve is locked in place, it's rank will not change."></th>
+		<th><img src="<!-- TMPL_VAR NAME='themelang' -->/images/go-bottom.png" border="0"/ title="Toggle Set to Lowest Priority"></th>
+		<th><img src="<!-- TMPL_VAR NAME='themelang' -->/images/cross.png" border="0"/ title="Cancel Reserves"></th>
 	</tr>
 
 	<!-- TMPL_LOOP Name="reserveloop" -->
-		<tr>
+		<tr width=100>
+			<td style="white-space:nowrap;">
+				<a title="Move Reserve Up" href="/cgi-bin/koha/request.pl?action=move&where=up&borrowernumber=<!-- TMPL_VAR Name="borrowernumber" -->&biblionumber=<!-- TMPL_VAR Name="biblionumber" -->&date=<!-- TMPL_VAR Name="date" -->">
+					<img src="<!-- TMPL_VAR NAME='themelang' -->/images/go-up.png" border="0" />
+				</a>
+
+				<a title="Move Reserve To Top" href="/cgi-bin/koha/request.pl?action=move&where=top&borrowernumber=<!-- TMPL_VAR Name="borrowernumber" -->&biblionumber=<!-- TMPL_VAR Name="biblionumber" -->&date=<!-- TMPL_VAR Name="date" -->">
+					<img src="<!-- TMPL_VAR NAME='themelang' -->/images/go-top.png" border="0" />
+				</a>
+				
+				<a title="Move Reserve To Bottom" href="/cgi-bin/koha/request.pl?action=move&where=bottom&borrowernumber=<!-- TMPL_VAR Name="borrowernumber" -->&biblionumber=<!-- TMPL_VAR Name="biblionumber" -->&date=<!-- TMPL_VAR Name="date" -->">
+					<img src="<!-- TMPL_VAR NAME='themelang' -->/images/go-bottom.png" border="0" />
+				</a>
+
+				<a title="Move Reserve Down" href="/cgi-bin/koha/request.pl?action=move&where=down&borrowernumber=<!-- TMPL_VAR Name="borrowernumber" -->&biblionumber=<!-- TMPL_VAR Name="biblionumber" -->&date=<!-- TMPL_VAR Name="date" -->">
+					<img src="<!-- TMPL_VAR NAME='themelang' -->/images/go-down.png" border="0" />
+				</a>
+			</td>
+
 			<td>
 			<input type="hidden" name="borrowernumber" value="<!-- TMPL_VAR Name="borrowernumber" -->" />
 			<input type="hidden" name="biblio" value="<!-- TMPL_VAR Name="biblionumber" -->" />
-			<input type="hidden" name="itemnumber" value="<!-- TMPL_VAR Name="itemnumber" -->" />
-			<select name="rank-request" <!-- TMPL_UNLESS NAME="CAN_user_editcatalogue" -->disabled="disabled"<!-- /TMPL_UNLESS --> <!-- FOR SMFPL -->>
-				
 				<!-- TMPL_IF Name="wait" -->
-					<option value="W" selected="selected">Consigned</option>
+					Consigned
+				<!-- TMPL_ELSE -->
+					<!-- TMPL_VAR Name="priority" -->
 				<!-- /TMPL_IF -->
-				<!-- TMPL_LOOP Name="optionloop" -->
-					<option value="<!-- TMPL_VAR Name="num" -->"<!-- TMPL_IF Name="selected" --> selected="selected"<!-- /TMPL_IF -->>
-						<!-- TMPL_VAR Name="num" -->
-					</option>
-				<!-- /TMPL_LOOP -->
-				<option value="del">Del</option>
-			</select></td>
+			</td>
 			<td>
 			<a href="/cgi-bin/koha/members/moremember.pl?bornum=<!-- TMPL_VAR Name="borrowernumber" -->"><!-- TMPL_VAR Name="firstname" --> <!-- TMPL_VAR Name="surname" --></a>
 			</td>
@@ -121,7 +123,7 @@
 				<!-- /TMPL_IF -->
 				
 				<!-- TMPL_ELSE -->
-					<select name="pickup">
+					<select name="pickup<!-- TMPL_VAR Name="borrowernumber" -->" id="pickup<!-- TMPL_VAR Name="borrowernumber" -->" onchange="javascript:location.href = '/cgi-bin/koha/request.pl?action=updatePickupLocation&borrowernumber=<!-- TMPL_VAR Name="borrowernumber" -->&biblionumber=<!-- TMPL_VAR Name="biblionumber" -->&date=<!-- TMPL_VAR Name="date" -->&branchcode=' + document.updateReservesForm.pickup<!-- TMPL_VAR Name="borrowernumber" -->.options[document.updateReservesForm.pickup<!-- TMPL_VAR Name="borrowernumber" -->.selectedIndex].value;">
 						<!-- TMPL_LOOP Name="branchloop" -->
 							<option value="<!-- TMPL_VAR Name="branch" -->"<!-- TMPL_IF Name="selected" --> selected="selected"<!-- /TMPL_IF -->>
 								<!-- TMPL_VAR Name="branchname" -->
@@ -140,23 +142,44 @@
 						Next Available
 					<!-- TMPL_ELSE -->
 						<!-- TMPL_IF Name="constrainttypeo" -->
-							 <!-- TMPL_IF NAME="itemnumber" --> 
-						  	 	  This Item only : <!-- TMPL_VAR NAME="barcode" -->
-							 <!-- TMPL_ELSE --> 
 							 	  This type only : <!-- TMPL_VAR Name="volumeddesc" --> <!-- TMPL_VAR Name="itemtype" -->
 							 <!-- /TMPL_IF -->
 						<!-- /TMPL_IF -->
 					<!-- /TMPL_IF -->
+
+</td>
+
+<td>
+  <a title="Toggle Lock In Place" href="/cgi-bin/koha/request.pl?action=lock&borrowernumber=<!-- TMPL_VAR Name="borrowernumber" -->&biblionumber=<!-- TMPL_VAR Name="biblionumber" -->&date=<!-- TMPL_VAR Name="date" -->">
+	<!-- TMPL_IF NAME="lockPriority" -->
+		<img src="<!-- TMPL_VAR NAME='themelang' -->/images/lock.png" border="0"/>
+	<!-- TMPL_ELSE -->
+		<img src="<!-- TMPL_VAR NAME='themelang' -->/images/lock_open.png" border="0"/>
 				<!-- /TMPL_IF -->
+  </a>
+</td>
+
+<td>
+  <a title="Toggle Lowest Priority" href="/cgi-bin/koha/request.pl?action=setLowestPriority&borrowernumber=<!-- TMPL_VAR Name="borrowernumber" -->&biblionumber=<!-- TMPL_VAR Name="biblionumber" -->&date=<!-- TMPL_VAR Name="date" -->">
+	<!-- TMPL_IF NAME="lowestPriority" -->
+		<img src="<!-- TMPL_VAR NAME='themelang' -->/images/go-bottom.png" border="0"/ title="Unset Lowest Priority" />
+	<!-- TMPL_ELSE -->
+		<img src="<!-- TMPL_VAR NAME='themelang' -->/images/go-down.png" border="0"/ title="Set To Lowest Priority" />
+	<!-- /TMPL_IF -->
+  </a>
+</td>
+
+<td>
+	<a title="Cancel Reserve" href="/cgi-bin/koha/request.pl?action=cancel&borrowernumber=<!-- TMPL_VAR Name="borrowernumber" -->&biblionumber=<!-- TMPL_VAR Name="biblionumber" -->&date=<!-- TMPL_VAR Name="date" -->">
+		<img src="<!-- TMPL_VAR NAME='themelang' -->/images/cross.png" border="0"/>
+	</a>
+</td>
 
-			</td>
 		</tr>
 	<!-- /TMPL_LOOP -->
 </table>
-<!-- TMPL_IF NAME="CAN_user_editcatalogue" --> <!-- FOR SMFPL -->
-<p>Delete a request by selecting "del" from the rank list.</p>
-<p><input type="submit" name="submit"  value="Update List" class="submit" /></p>
-<!-- /TMPL_IF -->
-</div></form><!-- /TMPL_IF -->
 </div>
+</form>
+<!-- /TMPL_IF -->
 <!-- TMPL_INCLUDE Name="intranet-bottom.inc" -->
+

Index: koha-tmpl/intranet-tmpl/ccfls/en/images/arrow_down.png
===================================================================
RCS file: koha-tmpl/intranet-tmpl/ccfls/en/images/arrow_down.png
diff -N koha-tmpl/intranet-tmpl/ccfls/en/images/arrow_down.png
Binary files /dev/null and /tmp/cvsG82L0K differ

Index: koha-tmpl/intranet-tmpl/ccfls/en/images/arrow_up.png
===================================================================
RCS file: koha-tmpl/intranet-tmpl/ccfls/en/images/arrow_up.png
diff -N koha-tmpl/intranet-tmpl/ccfls/en/images/arrow_up.png
Binary files /dev/null and /tmp/cvsVjU7xL differ

Index: koha-tmpl/intranet-tmpl/ccfls/en/images/cross.png
===================================================================
RCS file: koha-tmpl/intranet-tmpl/ccfls/en/images/cross.png
diff -N koha-tmpl/intranet-tmpl/ccfls/en/images/cross.png
Binary files /dev/null and /tmp/cvsYI28LL differ

Index: koha-tmpl/intranet-tmpl/ccfls/en/images/go-bottom.png
===================================================================
RCS file: koha-tmpl/intranet-tmpl/ccfls/en/images/go-bottom.png
diff -N koha-tmpl/intranet-tmpl/ccfls/en/images/go-bottom.png
Binary files /dev/null and /tmp/cvsDTb5nO differ

Index: koha-tmpl/intranet-tmpl/ccfls/en/images/go-down.png
===================================================================
RCS file: koha-tmpl/intranet-tmpl/ccfls/en/images/go-down.png
diff -N koha-tmpl/intranet-tmpl/ccfls/en/images/go-down.png
Binary files /dev/null and /tmp/cvsSAtRVO differ

Index: koha-tmpl/intranet-tmpl/ccfls/en/images/go-top.png
===================================================================
RCS file: koha-tmpl/intranet-tmpl/ccfls/en/images/go-top.png
diff -N koha-tmpl/intranet-tmpl/ccfls/en/images/go-top.png
Binary files /dev/null and /tmp/cvsxJKkaP differ

Index: koha-tmpl/intranet-tmpl/ccfls/en/images/go-up.png
===================================================================
RCS file: koha-tmpl/intranet-tmpl/ccfls/en/images/go-up.png
diff -N koha-tmpl/intranet-tmpl/ccfls/en/images/go-up.png
Binary files /dev/null and /tmp/cvs28TFgN differ

Index: koha-tmpl/intranet-tmpl/ccfls/en/images/lock.png
===================================================================
RCS file: koha-tmpl/intranet-tmpl/ccfls/en/images/lock.png
diff -N koha-tmpl/intranet-tmpl/ccfls/en/images/lock.png
Binary files /dev/null and /tmp/cvsT5TUHN differ

Index: koha-tmpl/intranet-tmpl/ccfls/en/images/lock_open.png
===================================================================
RCS file: koha-tmpl/intranet-tmpl/ccfls/en/images/lock_open.png
diff -N koha-tmpl/intranet-tmpl/ccfls/en/images/lock_open.png
Binary files /dev/null and /tmp/cvs3gWvKQ differ

Index: koha-tmpl/intranet-tmpl/npl/en/images/cross.png
===================================================================
RCS file: koha-tmpl/intranet-tmpl/npl/en/images/cross.png
diff -N koha-tmpl/intranet-tmpl/npl/en/images/cross.png
Binary files /dev/null and /tmp/cvsUDIL7Q differ

Index: koha-tmpl/intranet-tmpl/npl/en/images/go-bottom.png
===================================================================
RCS file: koha-tmpl/intranet-tmpl/npl/en/images/go-bottom.png
diff -N koha-tmpl/intranet-tmpl/npl/en/images/go-bottom.png
Binary files /dev/null and /tmp/cvswsAhCN differ

Index: koha-tmpl/intranet-tmpl/npl/en/images/go-down.png
===================================================================
RCS file: koha-tmpl/intranet-tmpl/npl/en/images/go-down.png
diff -N koha-tmpl/intranet-tmpl/npl/en/images/go-down.png
Binary files /dev/null and /tmp/cvswtZ4hO differ

Index: koha-tmpl/intranet-tmpl/npl/en/images/go-top.png
===================================================================
RCS file: koha-tmpl/intranet-tmpl/npl/en/images/go-top.png
diff -N koha-tmpl/intranet-tmpl/npl/en/images/go-top.png
Binary files /dev/null and /tmp/cvs1prD2M differ

Index: koha-tmpl/intranet-tmpl/npl/en/images/go-up.png
===================================================================
RCS file: koha-tmpl/intranet-tmpl/npl/en/images/go-up.png
diff -N koha-tmpl/intranet-tmpl/npl/en/images/go-up.png
Binary files /dev/null and /tmp/cvsaCvFOP differ

Index: koha-tmpl/intranet-tmpl/npl/en/images/lock.png
===================================================================
RCS file: koha-tmpl/intranet-tmpl/npl/en/images/lock.png
diff -N koha-tmpl/intranet-tmpl/npl/en/images/lock.png
Binary files /dev/null and /tmp/cvs2KRhKS differ

Index: koha-tmpl/intranet-tmpl/npl/en/images/lock_open.png
===================================================================
RCS file: koha-tmpl/intranet-tmpl/npl/en/images/lock_open.png
diff -N koha-tmpl/intranet-tmpl/npl/en/images/lock_open.png
Binary files /dev/null and /tmp/cvsHjH21S differ





More information about the Koha-cvs mailing list