+ my ($shelfnumber)= @_;
+ return unless $shelfnumber && $shelfnumber =~ /^\d+$/;
+ my $sth = $dbh->prepare("DELETE FROM virtualshelves WHERE shelfnumber=?");
+ return $sth->execute($shelfnumber);
+}
+
+=head2 GetBibliosShelves
+
+This finds all the public lists that this bib record is in.
+
+=cut
+
+sub GetBibliosShelves {
+ my ( $biblionumber ) = @_;
+ my $dbh = C4::Context->dbh;
+ my $sth = $dbh->prepare('
+ SELECT vs.shelfname, vs.shelfnumber
+ FROM virtualshelves vs
+ JOIN virtualshelfcontents vc ON (vs.shelfnumber= vc.shelfnumber)
+ WHERE vs.category=2
+ AND vc.biblionumber= ?
+ ');
+ $sth->execute( $biblionumber );
+ return $sth->fetchall_arrayref({});
+}
+
+=head2 ShelvesMax
+
+ $howmany= ShelvesMax($context);
+
+Tells how much shelves are shown in which context.
+POPUP refers to addbybiblionumber popup, MGRPAGE is managing page (in opac or
+staff), COMBO refers to the Add to-combo of search results. MASTHEAD is the
+main Koha toolbar with Lists button.
+
+=cut
+
+sub ShelvesMax {
+ my $which= shift;
+ return SHELVES_POPUP_MAX if $which eq 'POPUP';
+ return SHELVES_MGRPAGE_MAX if $which eq 'MGRPAGE';
+ return SHELVES_COMBO_MAX if $which eq 'COMBO';
+ return SHELVES_MASTHEAD_MAX if $which eq 'MASTHEAD';
+ return SHELVES_MASTHEAD_MAX;
+}
+
+sub HandleDelBorrower {
+#when a member is deleted (DelMember in Members.pm), you should call me first
+#this routine deletes/moves lists and entries for the deleted member/borrower
+#you could just delete everything (and lose more than you want)
+#instead we now try to save all public/shared stuff and keep others happy
+ my ($borrower)= @_;
+ my $query;
+ my $dbh = C4::Context->dbh;
+
+ #Delete shares of this borrower (not lists !)
+ $query="DELETE FROM virtualshelfshares WHERE borrowernumber=?";
+ $dbh->do($query,undef,($borrower));
+
+ #Delete private lists without owner that now have no shares anymore
+ $query="DELETE vs.* FROM virtualshelves vs LEFT JOIN virtualshelfshares sh USING (shelfnumber) WHERE category=1 AND vs.owner IS NULL AND sh.shelfnumber IS NULL";
+ $dbh->do($query);
+
+ #Change owner for private lists which have shares
+ $query="UPDATE virtualshelves LEFT JOIN virtualshelfshares sh USING (shelfnumber) SET owner=NULL where owner=? AND category=1 AND sh.borrowernumber IS NOT NULL";
+ $dbh->do($query,undef,($borrower));
+
+ #Delete unshared private lists
+ $query="DELETE FROM virtualshelves WHERE owner=? AND category=1";
+ $dbh->do($query,undef,($borrower));
+
+ #Handle public lists owned by borrower
+ $query="UPDATE virtualshelves SET owner=NULL WHERE owner=? AND category=2";
+ $dbh->do($query,undef,($borrower));
+
+ #Handle entries added by borrower to lists of others
+ $query="UPDATE virtualshelfcontents SET borrowernumber=NULL WHERE borrowernumber=?";
+ $dbh->do($query,undef,($borrower));
+}
+
+# internal subs
+
+sub _shelf_count {
+ my ($owner, $category) = @_;
+ my @params;
+ # Find out how many shelves total meet the submitted criteria...
+
+ my $query = "SELECT count(*) FROM virtualshelves vs ";
+ if($category==1) {
+ $query.= qq{
+ LEFT JOIN virtualshelfshares sh ON sh.shelfnumber=vs.shelfnumber
+ AND sh.borrowernumber=?
+ WHERE category=1 AND (vs.owner=? OR sh.borrowernumber=?) };
+ @params= ($owner, $owner, $owner);
+ }
+ else {
+ $query.='WHERE category=2';
+ @params= ();
+ }
+ my $sth = $dbh->prepare($query);
+ $sth->execute(@params);
+ my ($total)= $sth->fetchrow;
+ return $total;