Diff for /loncom/interface/lonwishlist.pm between versions 1.7 and 1.19

version 1.7, 2010/08/20 10:38:41 version 1.19, 2014/01/29 16:25:44
Line 1 Line 1
 # The LearningOnline Network with CAPA  # The LearningOnline Network with CAPA
 # Routines to control the wishlist  # Utility-routines for wishlist
 #  #
 # $Id$  # $Id$
 #  #
Line 39  It is only available for user with acces Line 39  It is only available for user with acces
   
 The wishlist-module uses the CPAN-module "Tree" for easily handling the directory-structure of the wishlist. Each node in the tree has an index to be referenced by.  The wishlist-module uses the CPAN-module "Tree" for easily handling the directory-structure of the wishlist. Each node in the tree has an index to be referenced by.
   
   =back
   
 =cut  =cut
   
 package Apache::lonwishlist;  package Apache::lonwishlist;
   
 use strict;  use strict;
 use Apache::Constants qw(:common);  
 use Apache::lonnet;  use Apache::lonnet;
 use Apache::loncommon();  use Apache::loncommon();
 use Apache::lonhtmlcommon;  use Apache::lonhtmlcommon;
 use Apache::lonlocal;  use Apache::lonlocal;
 use LONCAPA;  use LONCAPA qw(:DEFAULT :match);
 use Tree;  use Tree;
   
   
Line 61  my %TreeToHash; Line 62  my %TreeToHash;
 my @allFolders;  my @allFolders;
 my @allNodes;  my @allNodes;
 my $indentConst = 20;  my $indentConst = 20;
   my $foldersOption;
   
 =pod  =pod
   
Line 70  my $indentConst = 20; Line 72  my $indentConst = 20;
   
 =item * &getWishlist()  =item * &getWishlist()
   
      Get the wishlist-data via lonnet::dump() and returns the got data in a hash.       Get the wishlist-data via lonnet::getkeys() and lonnet::get() and returns the got data in a hash.
   
   
 =item * &putWishlist(wishlist)  =item * &putWishlist(wishlist)
Line 90  my $indentConst = 20; Line 92  my $indentConst = 20;
   
 # Read wishlist from user-data  # Read wishlist from user-data
 sub getWishlist {  sub getWishlist {
     my %wishlist = &Apache::lonnet::dump('wishlist');      my @keys = &Apache::lonnet::getkeys('wishlist');
       my %wishlist = &Apache::lonnet::get('wishlist',\@keys);
     foreach my $i ( keys %wishlist) {      foreach my $i ( keys %wishlist) {
         #File not found. This appears at the first time using the wishlist          #File not found. This appears at the first time using the wishlist
         #Create file and put 'root' into it          #Create file and put 'root' into it
        if ($i =~m/^error:No such file/) {         if ($i =~m/^error:No such file/) {
            &Apache::lonnet::logthis($i.'! Create file by putting in the "root" of the directory tree.');             &Apache::lonnet::logthis($i.'! Create file by putting in the "root" of the directory tree.');
            &Apache::lonnet::put('wishlist', {'root' => ''});             &Apache::lonnet::put('wishlist', {'root' => ''});
            %wishlist = &Apache::lonnet::dump('wishlist');             my $options = '<option value="" selected="selected">('.&mt('Top level').')</option>';
              &Apache::lonnet::put('wishlist', {'folders' => $options});
              @keys = &Apache::lonnet::getkeys('wishlist');
              %wishlist = &Apache::lonnet::get('wishlist',\@keys);
        }         }
        elsif ($i =~ /^(con_lost|error|no_such_host)/i) {         elsif ($i =~ /^(con_lost|error|no_such_host)/i) {
            &Apache::lonnet::logthis('ERROR while attempting to get wishlist: '.$i);             &Apache::lonnet::logthis('ERROR while attempting to get wishlist: '.$i);
Line 105  sub getWishlist { Line 111  sub getWishlist {
        }         }
     }      }
   
     # if we got no keys in hash returned by dump(), return error.      # if we got no keys in hash returned by get(), return error.
     # wishlist will not be loaded, instead the user will be asked to try again later      # wishlist will not be loaded, instead the user will be asked to try again later
     if ((keys %wishlist) == 0) {      if ((keys %wishlist) == 0) {
         &Apache::lonnet::logthis('ERROR while attempting to get wishlist: no keys retrieved!');          &Apache::lonnet::logthis('ERROR while attempting to get wishlist: no keys retrieved!');
Line 183  sub deleteWishlist { Line 189  sub deleteWishlist {
   
 # Create a new entry  # Create a new entry
 sub newEntry() {  sub newEntry() {
     my ($title, $path, $note) = @_;      my ($rootgiven, $title, $path, $note) = @_;
   
       $root = $rootgiven;
       @childrenRt = $root->children();
   
     my $date = gmtime();      my $date = gmtime();
     # Create Entry-Object      # Create Entry-Object
     my $entry = Entry->new(title => $title, path => $path, note => $note, date => $date);      my $entry = Entry->new(title => $title, path => $path, note => $note, date => $date);
Line 194  sub newEntry() { Line 204  sub newEntry() {
     if ($folderIndex ne '') {      if ($folderIndex ne '') {
         @allFolders = ();          @allFolders = ();
         &getFoldersToArray(\@childrenRt);          &getFoldersToArray(\@childrenRt);
         my $folderToInsertOn = &Tree::getNodeByIndex($folderIndex,\@allFolders);          my $folderToInsertOn = &Apache::Tree::getNodeByIndex($folderIndex,\@allFolders);
         $folderToInsertOn->add_child($tree);          $folderToInsertOn->add_child($tree);
     }      }
     else {      else {
         $root->add_child($tree);          $root->add_child($tree);
     }      }
     &saveChanges();      return &saveChanges();
 }  }
   
   
 # Delete entries  # Delete entries
 sub deleteEntries {  sub deleteEntries {
       my $rootgiven = shift;
     my $marked = shift;      my $marked = shift;
     &getNodesToArray(\@childrenRt);  
   
       $root = $rootgiven;
       @childrenRt = $root->children();
   
       &getNodesToArray(\@childrenRt);
     foreach my $m (@$marked) {      foreach my $m (@$marked) {
         my $found = &Tree::getNodeByIndex($m, \@allNodes);          my $found = &Apache::Tree::getNodeByIndex($m, \@allNodes);
         &Tree::removeNode($found);          # be sure, that entry exists (may have been deleted before, e.g. in an other browsertab)
           if (defined $found) {
               &Apache::Tree::removeNode($found);
           }
     }      }
     @allNodes = ();      @allNodes = ();
     &saveChanges();      return &saveChanges();
 }  }
   
   
 # Sort entries  # Sort entries
 sub sortEntries {  sub sortEntries {
       my $rootgiven = shift;
     my $indexNode = shift;      my $indexNode = shift;
     my $at = shift;      my $at = shift;
   
       $root = $rootgiven;
       @childrenRt = $root->children();
           
     &getNodesToArray(\@childrenRt);      &getNodesToArray(\@childrenRt);
     my $foundNode = &Tree::getNodeByIndex($indexNode, \@allNodes);      my $foundNode = &Apache::Tree::getNodeByIndex($indexNode, \@allNodes);
   
     &Tree::moveNode($foundNode,$at,undef);      &Apache::Tree::moveNode($foundNode,$at,undef);
     @allNodes = ();      @allNodes = ();
       return &saveChanges();
 }  }
   
   
 # Move entries  # Move entries
 sub moveEntries {  sub moveEntries {
       my $rootgiven = shift;
     my $indexNodesToMove = shift;      my $indexNodesToMove = shift;
     my $indexParent = shift;      my $indexParent = shift;
     my @nodesToMove = ();      my @nodesToMove = ();
   
       $root = $rootgiven;
       @childrenRt = $root->children();
   
     # get all nodes that should be moved      # get all nodes that should be moved
     &getNodesToArray(\@childrenRt);      &getNodesToArray(\@childrenRt);
     foreach my $index (@$indexNodesToMove) {      foreach my $index (@$indexNodesToMove) {
         my $foundNode = &Tree::getNodeByIndex($index, \@allNodes);          my $foundNode = &Apache::Tree::getNodeByIndex($index, \@allNodes);
         push(@nodesToMove, $foundNode);          push(@nodesToMove, $foundNode);
     }      }
   
Line 256  sub moveEntries { Line 282  sub moveEntries {
         }          }
         if (!$parentIsIn) {          if (!$parentIsIn) {
             if ($indexParent ne "root") {              if ($indexParent ne "root") {
                 $foundParent = &Tree::getNodeByIndex($indexParent, \@allNodes);                  $foundParent = &Apache::Tree::getNodeByIndex($indexParent, \@allNodes);
                 &Tree::moveNode($node,undef,$foundParent);                  &Apache::Tree::moveNode($node,undef,$foundParent);
             }              }
             else {              else {
                 &Tree::moveNode($node,undef,$root);                  &Apache::Tree::moveNode($node,undef,$root);
             }              }
         }          }
     }      }
     @allNodes = ();      @allNodes = ();
       return &saveChanges();
 }  }
   
   
 # Set a new title for an entry  # Set a new title for an entry
 sub setNewTitle {  sub setNewTitle {
     my ($nodeindex, $newTitle) = @_;      my ($rootgiven, $nodeindex, $newTitle) = @_;
   
       $root = $rootgiven;
       @childrenRt = $root->children();
   
     &getNodesToArray(\@childrenRt);      &getNodesToArray(\@childrenRt);
     my $found = &Tree::getNodeByIndex($nodeindex, \@allNodes);      my $found = &Apache::Tree::getNodeByIndex($nodeindex, \@allNodes);
     $found->value()->title($newTitle);       $found->value()->title($newTitle); 
     @allNodes = ();      @allNodes = ();
       return &saveChanges();
 }  }
   
   
 # Set a new path for an entry  # Set a new path for an entry
 sub setNewPath {  sub setNewPath {
     my ($nodeindex, $newPath) = @_;      my ($rootgiven, $nodeindex, $newPath) = @_;
   
       $root = $rootgiven;
       @childrenRt = $root->children();
   
     &getNodesToArray(\@childrenRt);      &getNodesToArray(\@childrenRt);
     my $found = &Tree::getNodeByIndex($nodeindex, \@allNodes);      my $found = &Apache::Tree::getNodeByIndex($nodeindex, \@allNodes);
     if ($found->value()->path()) {      if ($found->value()->path()) {
         $found->value()->path($newPath);           $found->value()->path($newPath); 
         return 1;          return &saveChanges();
     }      }
     @allNodes = ();      @allNodes = ();
     return 0;      return 0;
Line 294  sub setNewPath { Line 330  sub setNewPath {
   
 # Set a new note for an entry  # Set a new note for an entry
 sub setNewNote {  sub setNewNote {
     my ($nodeindex, $newNote) = @_;      my ($rootgiven, $nodeindex, $newNote) = @_;
   
       $root = $rootgiven;
       @childrenRt = $root->children();
   
     &getNodesToArray(\@childrenRt);      &getNodesToArray(\@childrenRt);
     my $found = &Tree::getNodeByIndex($nodeindex, \@allNodes);      my $found = &Apache::Tree::getNodeByIndex($nodeindex, \@allNodes);
     $found->value()->note($newNote);       $found->value()->note($newNote); 
     @allNodes = ();      @allNodes = ();
       return &saveChanges();
 }  }
   
   
 # Save all changes  # Save all changes
 sub saveChanges {  sub saveChanges {
     @childrenRt = $root->children();      @childrenRt = $root->children();
     &Tree::TreeIndex(\@childrenRt);      &Apache::Tree::TreeIndex(\@childrenRt);
     &Tree::setCountZero();      &Apache::Tree::setCountZero();
     &Tree::RootToHash(\@childrenRt);      &Apache::Tree::RootToHash(\@childrenRt);
     &Tree::TreeToHash(\@childrenRt);      &Apache::Tree::TreeToHash(\@childrenRt);
     &deleteWishlist();      &deleteWishlist();
     &putWishlist(\%TreeToHash);      &putWishlist(\%TreeToHash);
       return $root;
   
 }  }
   
Line 327  sub saveChanges { Line 369  sub saveChanges {
      Recursive call starting with all children of the root of the tree (parameter nodes is reference to an array containing the nodes of the current level).        Recursive call starting with all children of the root of the tree (parameter nodes is reference to an array containing the nodes of the current level). 
   
   
 =item * &getfoldersOption()  
   
      Returns the option-tag build by &getFoldersForOption(nodes). Use it to transfer this to other modules (e.g. lonmenu.pm).   
   
   
 =item * &getFoldersToArray(children)  =item * &getFoldersToArray(children)
   
      Puts all nodes that represent folders in the wishlist into an array.        Puts all nodes that represent folders in the wishlist into an array. 
Line 344  sub saveChanges { Line 381  sub saveChanges {
      Recursive call starting with all children of the root of the tree (parameter nodes is reference to an array containing the nodes of the current level).            Recursive call starting with all children of the root of the tree (parameter nodes is reference to an array containing the nodes of the current level).     
     
   
  =back  =back
   
 =cut  =cut
   
Line 352  sub saveChanges { Line 389  sub saveChanges {
 # Return the names for all exiting folders in option-tags, so  # Return the names for all exiting folders in option-tags, so
 # a new link or a new folder can be created in an existing folder  # a new link or a new folder can be created in an existing folder
 my $indent = 0;  my $indent = 0;
 my $foldersOption;  
 sub getFoldersForOption {  sub getFoldersForOption {
     my $nodes = shift;      my $nodes = shift;
   
Line 373  sub getFoldersForOption { Line 409  sub getFoldersForOption {
 }  }
   
   
 sub getfoldersOption {  
    if (&getWishlist ne 'error') {  
        %TreeHash = &getWishlist();  
        $root = &Tree::HashToTree();  
        @childrenRt = $root->children();  
        &getFoldersForOption(\@childrenRt);  
        my $options = '<option value="" selected="selected">('.&mt('Top level').')</option>'.$foldersOption;  
        $foldersOption = '';  
        return $options;  
    }  
    else {  
        return '';  
    }  
 }  
   
   
 # Put all folder-nodes to an array  # Put all folder-nodes to an array
 sub getFoldersToArray {  sub getFoldersToArray {
     my $children = shift;      my $children = shift;
Line 446  sub getNodesToArray { Line 466  sub getNodesToArray {
      Recursive call starting with all children of the root of the tree (parameter nodes is reference to an array containing the nodes of the current level).            Recursive call starting with all children of the root of the tree (parameter nodes is reference to an array containing the nodes of the current level).     
   
   
 =item * &wishlistImport(nodes)  =item * &wishlistImport(nodes, numskipped)
   
      Returns the table-HTML-markup for the wishlist in mode "import".       Returns the table-HTML-markup for the wishlist in mode "import".
      Recursive call starting with all children of the root of the tree (parameter nodes is reference to an array containing the nodes of the current level).            Recursive call starting with all children of the root of the tree (parameter nodes is reference to an array containing the nodes of the current level).
         Side effect: increments the scalar ref: numskipped with a count of items in 
        Stored Links unavailable for selection, (e.g., now marked obsolete or
        inaccessible in Community context).
   
 =item * &makePage(mode, marked)  =item * &makePage(mode, marked)
   
Line 458  sub getNodesToArray { Line 480  sub getNodesToArray {
      Calls &wishlistView(nodes), &wishlistEdit(nodes) or &wishlistMove(nodes, marked).       Calls &wishlistView(nodes), &wishlistEdit(nodes) or &wishlistMove(nodes, marked).
     
   
   =item * &makePopUpNewLink(title, path)
   
        Returns the HTML-markup for the pop-up-window 'Add Link'. If this is called up from a browsed resource, the input-fields titel and path are pre-filled with the resources' meta-data-title and it's path. 
   
   
   =item * &makePopUpNewFolder()
   
        Returns the HTML-markup for the pop-up-window 'Add Folder'.
   
   
 =item * &makePageSet()  =item * &makePageSet()
   
      Returns the HTML-Markup for the page shown when a link was set by using the icon when viewing a resource.       Returns the HTML-Markup for the page shown when a link was set by using the icon when viewing a resource.
Line 481  sub getNodesToArray { Line 513  sub getNodesToArray {
 # Return a script-tag containing Javascript-function  # Return a script-tag containing Javascript-function
 # needed for wishlist actions like 'new link' ect.  # needed for wishlist actions like 'new link' ect.
 sub JSforWishlist {  sub JSforWishlist {
     my $startPagePopup = &Apache::loncommon::start_page('Wishlist',undef,      my $startPagePopup = &Apache::loncommon::start_page('Stored Links',undef,
                                                             {'only_body' => 1,                                                              {'only_body' => 1,
                                                              'js_ready'  => 1,                                                               'js_ready'  => 1,
                                                              'bgcolor'   => '#FFFFFF',});                                                               'bgcolor'   => '#FFFFFF',});
Line 491  sub JSforWishlist { Line 523  sub JSforWishlist {
     &getFoldersToArray(\@childrenRt);      &getFoldersToArray(\@childrenRt);
     &getFoldersForOption(\@childrenRt);      &getFoldersForOption(\@childrenRt);
   
     # texthash  
     my %lt = &Apache::lonlocal::texthash(  
                  'nl' => 'New Link',  
                  'nf' => 'New Folder',  
                  'lt' => 'Link Title',  
                  'ft' => 'Folder Title',  
                  'pa' => 'Path',  
                  'nt' => 'Note',  
                  'si' => 'Save in',  
                  'cl' => 'Cancel');  
   
   
     my $inPageNewLink = '<h1>'.$lt{'nl'}.'</h1>'.  
                         '<form method="post" name="newlink" action="/adm/wishlist" target="wishlist" '.  
                         'onsubmit="return newlinksubmit();" >'.  
                         &Apache::lonhtmlcommon::start_pick_box().  
                         &Apache::lonhtmlcommon::row_title($lt{'lt'}).  
                         '<input type="text" name="title" size="45" value="" />'.  
                         &Apache::lonhtmlcommon::row_closure().  
                         &Apache::lonhtmlcommon::row_title($lt{'pa'}).  
                         '<input type="text" name="path" size="45" value="" />'.  
                         &Apache::lonhtmlcommon::row_closure().  
                         &Apache::lonhtmlcommon::row_title($lt{'nt'}).  
                         '<textarea name="note" rows="3" cols="35" style="width:100%"></textarea>'.  
                         &Apache::lonhtmlcommon::row_closure(1).  
                         &Apache::lonhtmlcommon::end_pick_box().  
                         '<br/><br/>'.  
                         '<input type="submit" value="'.$lt{'si'}.'" />'.  
                         '<select name="folders">'.  
                         '<option value="" selected="selected">('.&mt('Top level').')</option>'.  
                         $foldersOption.  
                         '</select>'.  
                         '<input type="button" value="'.$lt{'cl'}.'" onclick="javascript:window.close();" />'.  
                         '</form>';  
       
     my $inPageNewFolder = '<h1>'.$lt{'nf'}.'</h1>'.  
                           '<form method="post" name="newfolder" action="/adm/wishlist" target="wishlist" '.  
                           'onsubmit="return newfoldersubmit();" >'.  
                           &Apache::lonhtmlcommon::start_pick_box().  
                           &Apache::lonhtmlcommon::row_title($lt{'ft'}).  
                           '<input type="text" name="title" size="45" value="" /><br />'.  
                           &Apache::lonhtmlcommon::row_closure().  
                           &Apache::lonhtmlcommon::row_title($lt{'nt'}).  
                           '<textarea name="note" rows="3" cols="35" style="width:100%"></textarea><br />'.  
                           &Apache::lonhtmlcommon::row_closure(1).  
                           &Apache::lonhtmlcommon::end_pick_box().  
                           '<br/><br/>'.  
                           '<input type="submit" value="'.$lt{'si'}.'" />'.  
                           '<select name="folders">'.  
                           '<option value="" selected="selected">('.&mt('Top level').')</option>'.  
                           $foldersOption.  
                           '</select>'.  
                           '<input type="button" value="'.$lt{'cl'}.'" onclick="javascript:window.close();" />'.  
                           '</form>';  
   
     # Remove all \n for inserting on javascript document.write  
     $inPageNewLink =~ s/\n//g;  
     $inPageNewFolder =~ s/\n//g;  
   
     # it is checked, wether a path links to a LON-CAPA-resource or an external website. links to course-contents are not allowed      # it is checked, wether a path links to a LON-CAPA-resource or an external website. links to course-contents are not allowed
     # because they probably will return a kind of 'no access' (unless the user is already in the course, the path links to).      # because they probably will return a kind of 'no access' (unless the user is already in the course, the path links to).
     # also importing these kind of links into a course does not make much sense.      # also importing these kind of links into a course does not make much sense.
Line 557  sub JSforWishlist { Line 530  sub JSforWishlist {
     # that means that it is checked wether a path contains .problem, .quiz, .exam etc.      # that means that it is checked wether a path contains .problem, .quiz, .exam etc.
     # this is good for most cases but crashes as soon as a real external website contains one of this pattern in its URL.      # this is good for most cases but crashes as soon as a real external website contains one of this pattern in its URL.
     # so maybe there's a better way to find out wether a given URL belongs to a LON-CAPA-server or not ...?      # so maybe there's a better way to find out wether a given URL belongs to a LON-CAPA-server or not ...?
     my $warningLinkNotAllowed1 = &mt('You can only insert links to LON-CAPA resources from the resource-pool '.      my $warningLinkNotAllowed1 =
                                     'or to external websites. Paths to LON-CAPA resources must be of the form /res/dom/usr... . '.          &mt('You can only insert links to LON-CAPA resources from the resource-pool'.
                                     'Paths to external websites must contain the network protocol (e.g. http://...).');              ' or to external websites.'.
     my $warningLinkNotAllowed2 = &mt('The following link is not allowed: ');              ' Paths to LON-CAPA resources must be of the form /res/domain/user/...'.
               ' Paths to external websites must contain the network protocol, e.g. http://...');
       my $warningLinkNotAllowed2 = &mt('The following link is not allowed:').' ';
     my $warningLink = &mt('You must insert a title and a path!');      my $warningLink = &mt('You must insert a title and a path!');
     my $warningFolder = &mt('You must insert a title!');      my $warningFolder = &mt('You must insert a title!');
     my $warningDelete = &mt('Are you sure you want to delete the selected entries? Deleting a folder also deletes all entries within this folder!');      my $warningDelete = &mt('Are you sure you want to delete the selected entries? Deleting a folder also deletes all entries within this folder!');
     my $warningSave = &mt('You have unsaved changes. You can either save these changes now by clicking "ok" or click "cancel" if you do not want to save your changes.');      my $warningSave = &mt('You have unsaved changes. You can either save these changes now by clicking "OK" or click "Cancel" if you do not want to save your changes.');
     my $warningMove = &mt('You must select a destination folder!');      my $warningMoveS = &mt('You must select at minimum one entry to move!');
       my $warningMoveD = &mt('You must select a destination folder!');
     $foldersOption = '';      $foldersOption = '';
   
     my $js = &Apache::lonhtmlcommon::scripttag(<<JAVASCRIPT);      my $js = &Apache::lonhtmlcommon::scripttag(<<JAVASCRIPT);
     function newLink() {      function newLink() {
         newlinkWin=window.open('','newlinkWin','width=580,height=320,scrollbars=yes');          newlinkWin=window.open('/adm/wishlist?mode=newLink','newlinkWin','width=580,height=350, scrollbars=yes');
         newlinkWin.document.write('$startPagePopup'   
                               +'<script type="text\/javascript">'  
                               +'function newlinksubmit(){'  
                               +'var path = document.getElementsByName("path")[0].value;'  
                               +'var title = document.getElementsByName("title")[0].value;'  
                               +'if (!path || !title) {'  
                               +'alert("$warningLink");'  
                               +'return false;}'  
                               +'var linkOK = (path.match(/^http:(\\\\/\\\\/)/) || path.match(/^https:(\\\\/\\\\/)/))'  
                               +'&& !(path.match(/\\.problem/) || path.match(/\\.exam/)'  
                               +'|| path.match(/\\.quiz/) || path.match(/\\.assess/)'  
                               +'|| path.match(/\\.survey/) || path.match(/\\.form/)'  
                               +'|| path.match(/\\.library/) || path.match(/\\.page/)'  
                               +'|| path.match(/\\.sequence/));'  
                               +'if (!path.match(/^(\\\\/res\\\\/)/) && !linkOK) {'  
                               +'alert("$warningLinkNotAllowed1");'  
                               +'return false;}'  
                               +'else {'  
                               +'window.close();'  
                               +'return true;}}'  
                               +'<\/scr'+'ipt>'  
                               +'$inPageNewLink'  
                               +'$endPagePopup');  
         newlinkWin.document.close();  
     }      }
   
     function newFolder() {      function newFolder() {
         newfolderWin=window.open('','newfolderWin','width=580,height=270, scrollbars=yes');          newfolderWin=window.open('/adm/wishlist?mode=newFolder','newfolderWin','width=580,height=270, scrollbars=yes');
         newfolderWin.document.write('$startPagePopup'   
                               +'<script type="text\/javascript">'  
                               +'function newfoldersubmit(){'  
                               +'var title = document.getElementsByName("title")[0].value;'  
                               +'if (!title) {'  
                               +'alert("$warningFolder");'  
                               +'return false;}'  
                               +'else {'  
                               +'window.close();'  
                               +'return true;}}'  
                               +'<\/scr'+'ipt>'  
                               +'$inPageNewFolder'  
                               +'$endPagePopup');  
         newfolderWin.document.close();  
     }      }
   
     function setFormAction(action,mode) {      function setFormAction(action,mode) {
Line 638  sub JSforWishlist { Line 576  sub JSforWishlist {
             r = linksOK();              r = linksOK();
         }          }
         else if (action == 'move') {          else if (action == 'move') {
             r = selectDestinationFolder();              r = selectDestinationFolder(mode);
         }          }
         document.getElementsByName('list')[0].setAttribute("action", "/adm/wishlist?mode="+mode);           document.getElementsByName('list')[0].setAttribute("action", "/adm/wishlist?mode="+mode); 
         if (r) {          if (r) {
Line 874  sub JSforWishlist { Line 812  sub JSforWishlist {
   
     function setChecked(row,checked) {      function setChecked(row,checked) {
         var childCHECK = document.getElementById(row.id.replace('row','check'));          var childCHECK = document.getElementById(row.id.replace('row','check'));
         childCHECK.checked = checked;          if (!childCHECK.disabled) {
               childCHECK.checked = checked;
           }
     }      }
   
     function getPreviousFolderRows(row) {      function getPreviousFolderRows(row) {
Line 1042  sub JSforWishlist { Line 982  sub JSforWishlist {
         }          }
     }      }
   
     function selectDestinationFolder() {      function selectDestinationFolder(mode) {
         var mark = document.getElementsByName('mark');          var mark = document.getElementsByName('mark');
         var i = 0;          var i = 0;
         for (i = 0; i < mark.length; i++) {          for (i = 0; i < mark.length; i++) {
Line 1051  sub JSforWishlist { Line 991  sub JSforWishlist {
                 return true;                  return true;
             }              }
         }          }
         alert('$warningMove');          if (mode == 'move') {
               alert('$warningMoveS');
           }
           else {
               alert('$warningMoveD');
           }
         return false;          return false;
     }      }
   
Line 1069  sub JSforWishlist { Line 1014  sub JSforWishlist {
     function checkAll() {      function checkAll() {
         var checkboxes = document.getElementsByName('check');          var checkboxes = document.getElementsByName('check');
         for (var i = 0; i < checkboxes.length; i++) {          for (var i = 0; i < checkboxes.length; i++) {
             checkboxes[i].checked = "checked";              if (!checkboxes[i].disabled) {
                   checkboxes[i].checked = "checked";
               }
         }          }
     }      }
   
     function uncheckAll() {      function uncheckAll() {
         var checkboxes = document.getElementsByName('check');          var checkboxes = document.getElementsByName('check');
         for (var i = 0; i < checkboxes.length; i++) {          for (var i = 0; i < checkboxes.length; i++) {
             checkboxes[i].checked = "";              if (!checkboxes[i].disabled) {
                   checkboxes[i].checked = "";
               }
         }          }
     }      }
   
Line 1149  JAVASCRIPT Line 1098  JAVASCRIPT
   
 # HTML-Markup for table if in view-mode  # HTML-Markup for table if in view-mode
 my $wishlistHTMLview;  my $wishlistHTMLview;
 my $indent = $indentConst;  my $indent_view = $indentConst;
 sub wishlistView {  sub wishlistView {
     my $nodes = shift;      my $nodes = shift;
   
Line 1164  sub wishlistView { Line 1113  sub wishlistView {
     
         # checkboxes          # checkboxes
         $wishlistHTMLview .= '<td><input type="checkbox" name="mark" id="check'.$index.'" value="'.$index.'" '.          $wishlistHTMLview .= '<td><input type="checkbox" name="mark" id="check'.$index.'" value="'.$index.'" '.
                              'onclick="selectAction('."'row".$index."'".')"/></td>';                               'onclick="selectAction('."'row".$index."'".')" /></td>';
   
         # entry is a folder          # entry is a folder
         if ($n->value()->path() eq '') {          if ($n->value()->path() eq '') {
             $wishlistHTMLview .= '<td id="padd'.$index.'" style="padding-left:'.(($indent-$indentConst)<0?0:($indent-$indentConst)).'px; min-width: 220px;">'.              $wishlistHTMLview .= '<td id="padd'.$index.'" style="padding-left:'.(($indent_view-$indentConst)<0?0:($indent_view-$indentConst)).'px; min-width: 220px;">'.
                                  '<a href="javascript:;" onclick="folderAction('."'row".$index."'".')" style="vertical-align:top">'.                                   '<a href="javascript:;" onclick="folderAction('."'row".$index."'".')" style="vertical-align:top">'.
                                  '<img src="/adm/lonIcons/arrow.closed.gif" id="img'.$index.'" alt = "" class="LC_icon"/>'.                                   '<img src="/adm/lonIcons/arrow.closed.gif" id="img'.$index.'" alt = "" class="LC_icon"/>'.
                                  '<img src="/adm/lonIcons/navmap.folder.closed.gif" id="imgFolder'.$index.'" alt="folder"/>'.                                   '<img src="/adm/lonIcons/navmap.folder.closed.gif" id="imgFolder'.$index.'" alt="folder"/>'.
Line 1176  sub wishlistView { Line 1125  sub wishlistView {
         }          }
         # entry is a link          # entry is a link
         else {          else {
             $wishlistHTMLview .= '<td id="padd'.$index.'" style="padding-left:'.(($indent-$indentConst)<=0?$indentConst:$indent).'px; min-width: 220px;">'.              $wishlistHTMLview .= '<td id="padd'.$index.'" style="padding-left:'.(($indent_view-$indentConst)<=0?$indentConst:$indent_view).'px; min-width: 220px;">'.
                                  '<a href="javascript:preview('."'".$n->value()->path()."'".');">'.                                   '<a href="javascript:preview('."'".$n->value()->path()."'".');">'.
                                  '<img src="/res/adm/pages/wishlist-link.png" id="img'.$index.'" alt="link" />'.                                   '<img src="/res/adm/pages/wishlist-link.png" id="img'.$index.'" alt="link" />'.
                                  $n->value()->title().'</a></td>';                                   $n->value()->title().'</a></td>';
Line 1206  sub wishlistView { Line 1155  sub wishlistView {
         # if the entry is a folder, it could have other entries as content. if it has, call wishlistView for those entries           # if the entry is a folder, it could have other entries as content. if it has, call wishlistView for those entries 
         my @children = $n->children();          my @children = $n->children();
         if ($#children >=0) {          if ($#children >=0) {
             $indent += 20;              $indent_view += 20;
             &wishlistView(\@children);              &wishlistView(\@children);
             $indent -= 20;              $indent_view -= 20;
         }          }
     }      }
 }  }
Line 1216  sub wishlistView { Line 1165  sub wishlistView {
   
 # HTML-Markup for table if in edit-mode  # HTML-Markup for table if in edit-mode
 my $wishlistHTMLedit;  my $wishlistHTMLedit;
 my $indent = $indentConst;  my $indent_edit = $indentConst;
 sub wishlistEdit {  sub wishlistEdit {
     my $nodes = shift;      my $nodes = shift;
     my $curNode = 1;      my $curNode = 1;
Line 1232  sub wishlistEdit { Line 1181  sub wishlistEdit {
   
         # checkboxes          # checkboxes
         $wishlistHTMLedit .= '<td><input type="checkbox" name="mark" id="check'.$index.'" value="'.$index.'" '.          $wishlistHTMLedit .= '<td><input type="checkbox" name="mark" id="check'.$index.'" value="'.$index.'" '.
                              'onclick="selectAction('."'row".$index."'".')"/></td>';                               'onclick="selectAction('."'row".$index."'".')" /></td>';
   
         # option-tags for sorting entries. we need the numbers from 1 to n with n being the number of entries on the same level as the current entry.          # option-tags for sorting entries. we need the numbers from 1 to n with n being the number of entries on the same level as the current entry.
         # set the number for the current entry into brackets           # set the number for the current entry into brackets 
Line 1251  sub wishlistEdit { Line 1200  sub wishlistEdit {
         if ($n->value()->path() eq '') {          if ($n->value()->path() eq '') {
             $wishlistHTMLedit .= '<td><select class="LC_hidden" name="sel" id="sel'.$index.'" onchange="submitSelect();">'.              $wishlistHTMLedit .= '<td><select class="LC_hidden" name="sel" id="sel'.$index.'" onchange="submitSelect();">'.
                                  $options.'</select></td>'.                                   $options.'</select></td>'.
                                  '<td id="padd'.$index.'" style="padding-left:'.(($indent-$indentConst)<0?0:($indent-$indentConst)).'px;">'.                                   '<td id="padd'.$index.'" style="padding-left:'.(($indent_edit-$indentConst)<0?0:($indent_edit-$indentConst)).'px;">'.
                                  '<a href="javascript:;" onclick="folderAction('."'row".$index."'".')" style="vertical-align:top" >'.                                   '<a href="javascript:;" onclick="folderAction('."'row".$index."'".')" style="vertical-align:top" >'.
                                  '<img src="/adm/lonIcons/arrow.closed.gif" id="img'.$index.'" alt = ""  class="LC_icon"/>'.                                   '<img src="/adm/lonIcons/arrow.closed.gif" id="img'.$index.'" alt = ""  class="LC_icon"/>'.
                                  '<img src="/adm/lonIcons/navmap.folder.closed.gif" id="imgFolder'.$index.'" alt="folder"/></a>'.                                   '<img src="/adm/lonIcons/navmap.folder.closed.gif" id="imgFolder'.$index.'" alt="folder"/></a>'.
                                  '<input type="text" name="newtitle" value="'.$n->value()->title().'" alt = "'.$n->value()->title().'"/>'.                                   '<input type="text" name="newtitle" value="'.$n->value()->title().'" alt = "'.$n->value()->title().'" />'.
                                  '</td><td></td>';                                   '</td><td></td>';
   
         }          }
Line 1263  sub wishlistEdit { Line 1212  sub wishlistEdit {
         else {          else {
             $wishlistHTMLedit .= '<td><select class="LC_hidden" name="sel" id="sel'.$index.'" onchange="submitSelect();">'.              $wishlistHTMLedit .= '<td><select class="LC_hidden" name="sel" id="sel'.$index.'" onchange="submitSelect();">'.
                                  $options.'</select></td>'.                                   $options.'</select></td>'.
                                  '<td id="padd'.$index.'" style="padding-left:'.(($indent-$indentConst)<=0?$indentConst:$indent).'px;">'.                                   '<td id="padd'.$index.'" style="padding-left:'.(($indent_edit-$indentConst)<=0?$indentConst:$indent_edit).'px;">'.
                                  '<img src="/res/adm/pages/wishlist-link.png" id="img'.$index.'" alt="link"/>'.                                   '<img src="/res/adm/pages/wishlist-link.png" id="img'.$index.'" alt="link"/>'.
                                  '<input type="text" name="newtitle" value="'.$n->value()->title().'" alt = "'.$n->value()->title().'"/></td>'.                                   '<input type="text" name="newtitle" value="'.$n->value()->title().'" alt = "'.$n->value()->title().'" /></td>'.
                                  '<td><input type="text" name="newpath" value="'.$n->value()->path().'" alt = "'.$n->value()->path().'"/></td>';                                   '<td><input type="text" name="newpath" value="'.$n->value()->path().'" alt = "'.$n->value()->path().'" /></td>';
         }          }
                   
         # note-icon, different icons for an entries with note and those without          # note-icon, different icons for an entries with note and those without
Line 1293  sub wishlistEdit { Line 1242  sub wishlistEdit {
         # if the entry is a folder, it could have other entries as content. if it has, call wishlistEdit for those entries           # if the entry is a folder, it could have other entries as content. if it has, call wishlistEdit for those entries 
         my @children = $n->children();          my @children = $n->children();
         if ($#children >=0) {          if ($#children >=0) {
             $indent += 20;              $indent_edit += 20;
             &wishlistEdit(\@children);              &wishlistEdit(\@children);
             $indent -= 20;              $indent_edit -= 20;
         }          }
     }      }
 }  }
Line 1305  sub wishlistEdit { Line 1254  sub wishlistEdit {
 # HTML-Markup for table if in move-mode  # HTML-Markup for table if in move-mode
 my $wishlistHTMLmove ='<tr id="root" class="LC_odd_row"><td><input type="radio" name="mark" id="radioRoot" value="root" /></td>'.  my $wishlistHTMLmove ='<tr id="root" class="LC_odd_row"><td><input type="radio" name="mark" id="radioRoot" value="root" /></td>'.
                       '<td>'.&mt('Top level').'</td><td></td></tr>';                        '<td>'.&mt('Top level').'</td><td></td></tr>';
 my $indent = $indentConst;  my $indent_move = $indentConst;
 sub wishlistMove {  sub wishlistMove {
     my $nodes = shift;      my $nodes = shift;
     my $marked = shift;      my $marked = shift;
Line 1329  sub wishlistMove { Line 1278  sub wishlistMove {
             # display a radio-button, if the folder was not selected to be moved              # display a radio-button, if the folder was not selected to be moved
             if (!$isIn) {              if (!$isIn) {
                 $wishlistHTMLmove .= '<td><input type="radio" name="mark" id="radio'.$index.'" value="'.$index.'" /></td>'.                  $wishlistHTMLmove .= '<td><input type="radio" name="mark" id="radio'.$index.'" value="'.$index.'" /></td>'.
                                      '<td id="padd'.$index.'" style="padding-left:'.(($indent-$indentConst)<0?0:($indent-$indentConst)).'px; min-width: 220px;">';                                       '<td id="padd'.$index.'" style="padding-left:'.(($indent_move-$indentConst)<0?0:($indent_move-$indentConst)).'px; min-width: 220px;">';
             }              }
             # higlight the title, if the folder was selected to be moved              # highlight the title, if the folder was selected to be moved
             else {              else {
                 $wishlistHTMLmove .= '<td></td>'.                  $wishlistHTMLmove .= '<td></td>'.
                                      '<td id="padd'.$index.'" style="padding-left:'.(($indent-$indentConst)<0?0:($indent-$indentConst)).'px; min-width: 220px;'.                                       '<td id="padd'.$index.'" style="padding-left:'.(($indent_move-$indentConst)<0?0:($indent_move-$indentConst)).'px; min-width: 220px;'.
                                      'color:red;">';                                       'color:red;">';
             }              }
             #arrow- and folder-image, all folders are open, and title              #arrow- and folder-image, all folders are open, and title
Line 1351  sub wishlistMove { Line 1300  sub wishlistMove {
             }              }
             # link-image and title              # link-image and title
             $wishlistHTMLmove .= '<td></td>'.              $wishlistHTMLmove .= '<td></td>'.
                                  '<td id="padd'.$index.'" style="padding-left:'.(($indent-$indentConst)<=0?$indentConst:$indent).'px; min-width: 220px;">'.                                   '<td id="padd'.$index.'" style="padding-left:'.(($indent_move-$indentConst)<=0?$indentConst:$indent_move).'px; min-width: 220px;">'.
                                  '<a href="javascript:preview('."'".$n->value()->path()."'".');" '.$highlight.'>'.                                   '<a href="javascript:preview('."'".$n->value()->path()."'".');" '.$highlight.'>'.
                                  '<img src="/res/adm/pages/wishlist-link.png" id="img'.$index.'" alt="link"/>'.                                   '<img src="/res/adm/pages/wishlist-link.png" id="img'.$index.'" alt="link"/>'.
                                  $n->value()->title().'</a></td>';                                   $n->value()->title().'</a></td>';
Line 1381  sub wishlistMove { Line 1330  sub wishlistMove {
         # if the entry is a folder, it could have other entries as content. if it has, call wishlistMove for those entries           # if the entry is a folder, it could have other entries as content. if it has, call wishlistMove for those entries 
         my @children = $n->children();          my @children = $n->children();
         if ($#children >=0) {          if ($#children >=0) {
             $indent += 20;              $indent_move += 20;
             &wishlistMove(\@children, $marked);              &wishlistMove(\@children, $marked);
             $indent -= 20;              $indent_move -= 20;
         }          }
     }      }
 }  }
Line 1392  sub wishlistMove { Line 1341  sub wishlistMove {
   
 # HTML-Markup for table if in import-mode  # HTML-Markup for table if in import-mode
 my $wishlistHTMLimport;  my $wishlistHTMLimport;
 my $indent = $indentConst;  my $indent_imp = $indentConst;
 my $form = 1;  my $form = 1;
 sub wishlistImport {  sub wishlistImport {
     my $nodes = shift;      my ($nodes,$numskipped) = @_;
   
       my ($is_community,%nopick);
       if ($env{'request.course.id'}) {
           if (&Apache::loncommon::course_type() eq 'Community') {
               $is_community = 1;
           }
       }
   
     foreach my $n (@$nodes) {      foreach my $n (@$nodes) {
         my $index = $n->value()->nindex();          my $index = $n->value()->nindex();
           if ($n->value()->path() =~ m{^(/res/$match_domain/$match_username/)}) {
               if ($is_community) {
                   unless (&Apache::lonnet::allowed('bro',$n->value()->path())) {
                       $nopick{$n->value()->path()} = $n->value()->title();
                       $$numskipped ++;
                   }
               } else {
                   unless (&Apache::lonnet::allowed('bre',$n->value()->path())) {
                       $nopick{$n->value()->path()} = $n->value()->title();
                       $$numskipped ++;
                   }
               }
           }
   
         # start row, use data_table routines to set class to LC_even or LC_odd automatically. this row contains a checkbox, the title and the note-icon.          # start row, use data_table routines to set class to LC_even or LC_odd automatically. this row contains a checkbox, the title and the note-icon.
         # only display the top level entries on load          # only display the top level entries on load
Line 1407  sub wishlistImport { Line 1376  sub wishlistImport {
   
     
         # checkboxes          # checkboxes
         $wishlistHTMLimport .= '<td>'.          $wishlistHTMLimport .= '<td>';
                                '<input type="checkbox" name="check" id="check'.$index.'" value="'.$index.'" '.          my ($disabled,$onclick,$image,$style);
                                'onclick="selectAction('."'row".$index."'".')"/>'.          if ($nopick{$n->value()->path()}) {
                                '<input type="hidden" name="title'.$index.'" value="'.&escape($n->value()->title()).'">'.              $disabled = ' disabled="disabled"';
                                '<input type="hidden" name="filelink'.$index.'" value="'.&escape($n->value()->path()).'">'.              $image = 'wishlist-link-lighter.png';
                                '<input type="hidden" name="id'.$index.'">'.              $style = 'style="color:#808080;"';
                                '</td>';          } else {
               $onclick = ' onclick="selectAction('."'row".$index."'".')"';
               $image = 'wishlist-link.png';
           }
           $wishlistHTMLimport .= '<input type="checkbox" name="check" id="check'.$index.'" value="'.$index.'" '.
                                  $disabled.$onclick.' />'.
                                  '<input type="hidden" name="title'.$index.'" value="'.&escape($n->value()->title()).'" />'.
                                  '<input type="hidden" name="filelink'.$index.'" value="'.&escape($n->value()->path()).'" />'.
                                  '<input type="hidden" name="id'.$index.'" />';
           $wishlistHTMLimport .= '</td>';
   
         # entry is a folder          # entry is a folder
         if ($n->value()->path() eq '') {          if ($n->value()->path() eq '') {
             $wishlistHTMLimport .= '<td id="padd'.$index.'" style="padding-left:'.(($indent-$indentConst)<0?0:($indent-$indentConst)).'px; min-width: 220px;">'.              $wishlistHTMLimport .= '<td id="padd'.$index.'" style="padding-left:'.(($indent_imp-$indentConst)<0?0:($indent_imp-$indentConst)).'px; min-width: 220px;">'.
                                    '<a href="javascript:;" onclick="folderAction('."'row".$index."'".')" style="vertical-align:top">'.                                     '<a href="javascript:;" onclick="folderAction('."'row".$index."'".')" style="vertical-align:top">'.
                                    '<img src="/adm/lonIcons/arrow.closed.gif" id="img'.$index.'" alt = "" class="LC_icon"/>'.                                     '<img src="/adm/lonIcons/arrow.closed.gif" id="img'.$index.'" alt = "" class="LC_icon"/>'.
                                    '<img src="/adm/lonIcons/navmap.folder.closed.gif" id="imgFolder'.$index.'" alt="folder"/>'.                                     '<img src="/adm/lonIcons/navmap.folder.closed.gif" id="imgFolder'.$index.'" alt="folder"/>'.
Line 1425  sub wishlistImport { Line 1403  sub wishlistImport {
         }          }
         # entry is a link          # entry is a link
         else {          else {
             $wishlistHTMLimport .= '<td id="padd'.$index.'" style="padding-left:'.(($indent-$indentConst)<=0?$indentConst:$indent).'px; min-width: 220px;">'.              $wishlistHTMLimport .= '<td id="padd'.$index.'" style="padding-left:'.(($indent_imp-$indentConst)<=0?$indentConst:$indent_imp).'px; min-width: 220px;">';
                                    '<a href="javascript:preview('."'".$n->value()->path()."'".');">'.              unless ($nopick{$n->value()->path()}) {
                                    '<img src="/res/adm/pages/wishlist-link.png" id="img'.$index.'" alt="link" />'.                  $wishlistHTMLimport .= '<a href="javascript:preview('."'".$n->value()->path()."'".');">';
                                    $n->value()->title().'</a></td>';              }
               $wishlistHTMLimport .= '<img src="/res/adm/pages/'.$image.'" id="img'.$index.'" alt="link" />'.
                                      '<span '.$style.'>'.$n->value()->title().'</span></a></td>';
                                    $form++;                                     $form++;
         }          }
   
Line 1456  sub wishlistImport { Line 1436  sub wishlistImport {
         # if the entry is a folder, it could have other entries as content. if it has, call wishlistImport for those entries           # if the entry is a folder, it could have other entries as content. if it has, call wishlistImport for those entries 
         my @children = $n->children();          my @children = $n->children();
         if ($#children >=0) {          if ($#children >=0) {
             $indent += 20;              $indent_imp += 20;
             &wishlistImport(\@children);              &wishlistImport(\@children,$numskipped);
             $indent -= 20;              $indent_imp -= 20;
         }          }
     }      }
       return;
 }  }
   
 # Returns the HTML-Markup for wishlist  # Returns the HTML-Markup for wishlist
 sub makePage {  sub makePage {
       my $rootgiven = shift;
     my $mode = shift;      my $mode = shift;
     my $marked = shift;      my $marked = shift;
   
       $root = $rootgiven;
       @childrenRt = $root->children();
   
     # breadcrumbs and start_page      # breadcrumbs and start_page
     &Apache::lonhtmlcommon::clear_breadcrumbs();      &Apache::lonhtmlcommon::clear_breadcrumbs();
     &Apache::lonhtmlcommon::add_breadcrumb(      &Apache::lonhtmlcommon::add_breadcrumb(
               { href => '/adm/wishlist?mode='.$mode,                { href => '/adm/wishlist?mode='.$mode,
                 text => 'Wishlist'});                  text => 'Stored Links'});
     my $startPage = &Apache::loncommon::start_page('Wishlist',undef,      my $startPage = &Apache::loncommon::start_page('Stored Links',undef,
                                                      {'add_entries' => {                                                       {'add_entries' => {
                                                         'onload' => 'javascript:onLoadAction('."'".$mode."'".');',                                                          'onload' => 'javascript:onLoadAction('."'".$mode."'".');',
                                                         'onunload' => 'javascript:window.name = '."'loncapaclient'"}});                                                          'onunload' => 'javascript:window.name = '."'loncapaclient'"}});
   
     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs(&mt('Wishlist').&Apache::loncommon::help_open_topic('Wishlist'));      my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs(&mt('Stored Links'),'Wishlist');
   
     # get javascript-code for wishlist-interactions      # get javascript-code for wishlist-interactions
     my $js = &JSforWishlist();      my $js = &JSforWishlist();
Line 1554  sub makePage { Line 1539  sub makePage {
   
     # start form       # start form 
     my $inner .= '<form name="list" action ="/adm/wishlist" method="post">'.      my $inner .= '<form name="list" action ="/adm/wishlist" method="post">'.
                  '<input type="hidden" id="action" name="action" value=""/>';                   '<input type="hidden" id="action" name="action" value="" />';
     
     # only display subbox in view- or edit-mode      # only display subbox in view- or edit-mode
     if ($mode eq 'view' || $mode eq 'edit') {      if ($mode eq 'view' || $mode eq 'edit') {
Line 1570  sub makePage { Line 1555  sub makePage {
             $inner .= &Apache::loncommon::end_data_table();              $inner .= &Apache::loncommon::end_data_table();
         }          }
         else {          else {
             $inner .= '<span class="LC_info">'.&mt("Your wishlist ist currently empty.").'</span>';              $inner .= '<span class="LC_info">'.&mt("Your Stored Links list is currently empty.").'</span>';
         }          }
         $wishlistHTMLedit = '';          $wishlistHTMLedit = '';
     }      }
Line 1580  sub makePage { Line 1565  sub makePage {
             $inner .= '<table class="LC_data_table LC_tableOfContent">'.$wishlistHTMLview.'</table>';              $inner .= '<table class="LC_data_table LC_tableOfContent">'.$wishlistHTMLview.'</table>';
         }          }
         else {          else {
             $inner .= '<span class="LC_info">'.&mt("Your wishlist ist currently empty.").'</span>';              $inner .= '<span class="LC_info">'.&mt("Your Stored Links list is currently empty.").'</span>';
         }          }
         $wishlistHTMLview = '';          $wishlistHTMLview = '';
     }      }
Line 1591  sub makePage { Line 1576  sub makePage {
         }          }
         if ($markStr) {          if ($markStr) {
             $markStr = substr($markStr, 0, length($markStr)-1);              $markStr = substr($markStr, 0, length($markStr)-1);
             $inner .= '<input type="hidden" value="'.$markStr.'" name="markedToMove"/>';              $inner .= '<input type="hidden" value="'.$markStr.'" name="markedToMove" />';
             $inner .= '<p><span class="LC_info">'.&mt('You have selected the red marked entries to be moved to another folder. '.              $inner .= '<p><span class="LC_info">'.&mt('You have selected the red marked entries to be moved to another folder. '.
                                                    'Now choose the new destination folder.').'</span></p>';                                                     'Now choose the new destination folder.').'</span></p>';
             &wishlistMove(\@childrenRt, $marked);              &wishlistMove(\@childrenRt, $marked);
             $inner .= '<table class="LC_data_table LC_tableOfContent">'.$wishlistHTMLmove.'</table><br/><br/>';              $inner .= '<table class="LC_data_table LC_tableOfContent">'.$wishlistHTMLmove.'</table><br/><br/>';
             $inner .= '<input type="button" value="'.&mt('Move').'" onclick="setFormAction('."'move','view'".');"/>'.              $inner .= '<input type="button" value="'.&mt('Move').'" onclick="setFormAction('."'move','view'".');" />'.
                       '<input type="button" value="'.&mt('Cancel').'" onclick="go('."'/adm/wishlist'".')"/>';                        '<input type="button" value="'.&mt('Cancel').'" onclick="go('."'/adm/wishlist'".')" />';
   
             $wishlistHTMLmove ='<tr id="root" class="LC_odd_row"><td><input type="radio" name="mark" id="radioRoot" value="root" /></td>'.              $wishlistHTMLmove ='<tr id="root" class="LC_odd_row"><td><input type="radio" name="mark" id="radioRoot" value="root" /></td>'.
                                '<td>'.&mt('Top level').'</td><td></td></tr>';                                 '<td>'.&mt('Top level').'</td><td></td></tr>';
         }          }
         else {          else {
             $inner .= '<p><span class="LC_info">'.&mt("You haven't marked any entry to move.").'</span></p>'.              $inner .= '<p><span class="LC_info">'.&mt("You haven't marked any entry to move.").'</span></p>'.
                       '<input type="button" value="'.&mt('Back').'" onclick="go('."'/adm/wishlist'".')"/>';                        '<input type="button" value="'.&mt('Back').'" onclick="go('."'/adm/wishlist'".')" />';
         }          }
     }      }
           
Line 1621  sub makePage { Line 1606  sub makePage {
 }  }
   
   
   # Returns the HTML-Markup for the PopUp, shown when a new link should set, when NOT
   # beeing in the wishlist-interface (method is called in lonmenu and lonsearchcat)
   sub makePopUpNewLink {
       my ($title, $path) = @_;
   
       # Get all existing folders to offer posibility to set a new link
       # into a folder
       my %TreeHashLink = &Apache::lonwishlist::getWishlist();
       my $rootLink = &Apache::Tree::HashToTree(\%TreeHashLink);
       my @childrenRtLink = $rootLink->children();
   
       $foldersOption = '';
       @allFolders = ();
       &getFoldersToArray(\@childrenRtLink);
       &getFoldersForOption(\@childrenRtLink);
   
       my $options = '<option value="" selected="selected">('.&mt('Top level').')</option>'.$foldersOption;
       $foldersOption = '';
       @allFolders = ();
   
       # HTML-Markup for the Pop-Up-window 'Set a link for this resource to wishlist'
       my $startPageWishlistlink = 
           &Apache::loncommon::start_page('Save to Stored Links',undef,
                                         {'only_body' => 1,
                                          'bgcolor'   => '#FFFFFF',});
   
       my $warningLink = &mt('You must insert a title!');
       my $warningLinkNotAllowed1 =
           &mt('You can only insert links to LON-CAPA resources from the resource-pool'.
               ' or to external websites.'.
               ' Paths to LON-CAPA resources must be of the form /res/domain/user/...'.
               ' Paths to external websites must contain the network protocol, e.g. http://...');
   
       my $inPageWishlistlink1 = '<h1>'.&mt('Save to Stored Links').'</h1>';
       # If no title is delivered, 'New Link' is called up from the wishlist-interface, so after
       # submitting the window should close instead of offering a link to wishlist (like it should do
       # if we call 'Set New Link' from within a browsed ressource)
       if (!$title) {
           $inPageWishlistlink1 .= '<form method="post" name="newlink" action="/adm/wishlist" target="wishlist"'.
                                   'onsubmit="return newlinksubmit();" >';
       }
       else {
           $inPageWishlistlink1 .= '<form method="post" name="newlink" action="/adm/wishlist?mode=set" '.
                                   'onsubmit="return newlinksubmit();" >';
       }
       $inPageWishlistlink1 .= &Apache::lonhtmlcommon::start_pick_box().
                               &Apache::lonhtmlcommon::row_title(&mt('Link Title'));
   
       my $inPageWishlistlink2 = &Apache::lonhtmlcommon::row_closure().
                                 &Apache::lonhtmlcommon::row_title(&mt('Path'));
   
       my $inPageWishlistlink3 = &Apache::lonhtmlcommon::row_closure().
                                 &Apache::lonhtmlcommon::row_title(&mt('Note')).
                                 '<textarea name="note" rows="3" cols="35" style="width:100%"></textarea>'.
                                 &Apache::lonhtmlcommon::row_closure(1).
                                 &Apache::lonhtmlcommon::end_pick_box().
                                 '<br/><br/>'.
                                 '<input type="submit" value="'.&mt('Save in').'" />'.
                                 '<select name="folders">'.
                                 $options.
                                 '</select>'.
                                 '<input type="button" value="'.&mt('Cancel').'" onclick="javascript:window.close();" />'.
                                 '</form>';
       $options = '';
   
       my $endPageWishlistlink = &Apache::loncommon::end_page();
   
       my $popUp = $startPageWishlistlink.
       $inPageWishlistlink1.
       '<input type="text" name="title" size="45" value="" />'.
       $inPageWishlistlink2.
       '<input type="text" name="path" size="45" value="" />'.
       $inPageWishlistlink3;
   
       # JavaScript-function to set title and path of ressource automatically
       # and show warning, if no title was set or path is invalid
       $popUp .= <<SCRIPT;
       <script type="text\/javascript">
       document.getElementsByName("title")[0].value = '$title';
       document.getElementsByName("path")[0].value = '$path';
       var fromwishlist = false;
       var titleget = '$title';
       if (!titleget) {
           fromwishlist = true;
       } 
       function newlinksubmit(){
       var title = document.getElementsByName("title")[0].value;
       var path = document.getElementsByName("path")[0].value;
       if (!title) {
           alert("$warningLink");
           return false;}
       var linkOK = (path.match(/\^http:(\\\/\\\/)/) || path.match(/\^https:(\\\/\\\/)/))
       && !(path.match(/\\.problem/) || path.match(/\\.exam/)
       || path.match(/\\.quiz/) || path.match(/\\.assess/)
       || path.match(/\\.survey/) || path.match(/\\.form/)
       || path.match(/\\.library/) || path.match(/\\.page/)
       || path.match(/\\.sequence/));
       if (!path.match(/\^(\\\/res\\\/)/) && !linkOK) {
           alert("$warningLinkNotAllowed1");
           return false;}
       if (fromwishlist) {
           window.close();
       }
       return true;}
       <\/script>
   SCRIPT
   
       $popUp .= $endPageWishlistlink;
   
       return $popUp;
   }
   
   sub makePopUpNewFolder {
       # Get all existing folders to offer posibility to create a new folder
       # into an existing folder
       my %TreeHashLink = &Apache::lonwishlist::getWishlist();
       my $rootLink = &Apache::Tree::HashToTree(\%TreeHashLink);
       my @childrenRtLink = $rootLink->children();
   
       $foldersOption = '';
       @allFolders = ();
       &getFoldersToArray(\@childrenRtLink);
       &getFoldersForOption(\@childrenRtLink);
   
       my $options = '<option value="" selected="selected">('.&mt('Top level').')</option>'.$foldersOption;
       $foldersOption = '';
       @allFolders = ();
   
       # HTML-Markup for the Pop-Up-window 'New Folder'
       my $startPageWishlistfolder = 
           &Apache::loncommon::start_page('New Folder',undef,
                                         {'only_body' => 1,
                                          'bgcolor'   => '#FFFFFF',});
   
       my $warningFolder = &mt('You must insert a title!');
   
   
       my $inPageNewFolder = '<h1>'.&mt('New Folder').'</h1>'.
                             '<form method="post" name="newfolder" action="/adm/wishlist" target="wishlist" '.
                             'onsubmit="return newfoldersubmit();" >'.
                             &Apache::lonhtmlcommon::start_pick_box().
                             &Apache::lonhtmlcommon::row_title(&mt('Folder title')).
                             '<input type="text" name="title" size="45" value="" /><br />'.
                             &Apache::lonhtmlcommon::row_closure().
                             &Apache::lonhtmlcommon::row_title(&mt('Note')).
                             '<textarea name="note" rows="3" cols="35" style="width:100%"></textarea><br />'.
                             &Apache::lonhtmlcommon::row_closure(1).
                             &Apache::lonhtmlcommon::end_pick_box().
                             '<br/><br/>'.
                             '<input type="submit" value="'.&mt('Save in').'" />'.
                             '<select name="folders">'.
                             $options.
                             '</select>'.
                             '<input type="button" value="'.&mt('Cancel').'" onclick="javascript:window.close();" />'.
                             '</form>';
       my $endPageWishlistfolder = &Apache::loncommon::end_page();
   
       my $popUp = $startPageWishlistfolder.
       $inPageNewFolder;
   
       $popUp .= <<SCRIPT;
       <script type="text\/javascript">
           function newfoldersubmit(){
               var title = document.getElementsByName("title")[0].value;
               if (!title) {
               alert("$warningFolder");
               return false;}
               else {
               window.close();
               return true;}}
       <\/script>
   SCRIPT
   
       $popUp .= $endPageWishlistfolder;
   
       return $popUp;
   }
   
 # Returns the HTML-Markup for the page, shown when a link was set  # Returns the HTML-Markup for the page, shown when a link was set
 sub makePageSet {  sub makePageSet {
     # start_page       my $title = 'Stored Links';
     my $startPage = &Apache::loncommon::start_page('Wishlist',undef,  
                                                    {'only_body' => 1});      # start_page
       my $output =
           &Apache::loncommon::start_page($title,undef,
                                          {'only_body' => 1})
          .'<h1>'.&mt($title).'</h1>';
           
     # confirm success and offer link to wishlist      # confirm success and offer link to wishlist
     my $message = &Apache::lonhtmlcommon::confirm_success(&mt('Link successfully set!'));      $output .=
     $message = &Apache::loncommon::confirmwrapper($message);          &Apache::loncommon::confirmwrapper(
               &Apache::lonhtmlcommon::confirm_success(
     my $inner .= '<br>'.$message.'<br/><br/>'.                  &mt('Link successfully saved!')))
                  '<a href="javascript:;" onclick="opener.open('."'/adm/wishlist'".');window.close();">'.&mt('Go to wishlist').'</a>'.         .&Apache::lonhtmlcommon::actionbox(
                  '&nbsp;<a href="javascript:;" onclick="window.close();">'.&mt('Close this window').'</a>';              ['<a href="javascript:;" onclick="opener.open('."'/adm/wishlist'".');window.close();">'.&mt('Go to Stored Links').'</a>',
                '<a href="javascript:;" onclick="window.close();">'.&mt('Close this window').'</a>'
               ]);
   
     # end_page       # end_page 
     my $endPage =  &Apache::loncommon::end_page();      $output .= &Apache::loncommon::end_page();
   
     # put all page-elements together      return $output;
     my $page = $startPage.$inner.$endPage;  
   
     return $page;  
 }  }
   
   
 # Returns the HTML-Markup for the page, shown when links should be imported into a course  # Returns the HTML-Markup for the page, shown when links should be imported into a course
 sub makePageImport {  sub makePageImport {
       my $rootgiven = shift;
     my $rat = shift;      my $rat = shift;
   
       $root = $rootgiven;
       @childrenRt = $root->children();
     # start_page       # start_page 
     my $startPage = &Apache::loncommon::start_page('Wishlist',undef,      my $startPage = &Apache::loncommon::start_page('Stored Links',undef,
                                                    {'only_body' => 1});                                                     {'only_body' => 1});
           
     # get javascript-code for wishlist-interactions      # get javascript-code for wishlist-interactions
     my $js = &JSforWishlist();      my $js = &JSforWishlist();
     $js .= &JSforImport($rat);      $js .= &JSforImport($rat);
   
     my $inner = '<h1>'.&mt('Import Resources from Wishlist').'</h1>';      my $inner = '<h1>'.&mt('Import Resources from Stored Links').'</h1>';
     if (!$rat) {      if (!$rat) {
         $inner .= '<p><span class="LC_info">'.&mt("Please note that you  can use the checkboxes corresponding to a folder to ".          $inner .=
                                                   "easily check all links within this folder. The folder structure itself can't be imported. ".              '<ul>'.
                                                   "All checked links will be imported into the current folder of your course.").'</span></p>';              '<li class="LC_info">'.&mt('Use the checkboxes corresponding to a folder to '.
                   'easily check all links within the folder.').'</li>'.
               '<li class="LC_info">'.&mt('The folder structure itself cannot be imported.').'</li>'.
               '<li class="LC_info">'.&mt('All checked links will be imported into the current folder of your course.').'</li>'.
               '</ul>';
     }      }
     else {      else {
         $inner .= '<p><span class="LC_info">'.&mt("Please note that you  can use the checkboxes corresponding to a folder to ".          $inner .=
                                                   "easily check all links within this folder. The folder structure itself can't be imported. ")              '<ul>'.
                                                   .'</span></p>';              '<li class="LC_info">'.&mt('Use the checkboxes corresponding to a folder to '.
                   'easily check all links within this folder.').'</li>'.
               '<li class="LC_info">'.&mt('The folder structure itself cannot be imported.').'</li>'.
               '</ul>';
     }      }
     my %wishlist = &getWishlist();      my %wishlist = &getWishlist();
     my $fnum = (keys %wishlist)-1;  
   
     $inner .= '<form method="post" name="groupsort">'.      #FIXME Saved string containing all folders in wishlist.db-file (key 'folders') in first version of lonwishlist
               '<input type="hidden" value="'.$fnum.'" name="fnum">'.      #After splitting lonwishlist into two modules, this is not necessary anymore. So, dependent from when the wishlist
               '<input type="button" onclick="javascript:checkAll()" id="checkallbutton" value="'.&mt('Check All').'">'.      #was first called (i.e. when wishlist.db was created), there might be an entry 'folders' or not. Number of links in
               '<input type="button" onclick="javascript:uncheckAll()" id="uncheckallbutton" value="'.&mt('Uncheck All').'">'.      #wishlist.db depends on wether this entry exists or not...JW  
               '<input type="button" value="'.&mt('Import Checked').'" onclick="finish_import();">'.          my $fnum;
               '<input type="button" value="'.&mt('Cancel').'" onclick="window.close();"><br/><br/>';       if (defined $wishlist{'folders'}) {
           $fnum = (keys %wishlist)-2;
       }
       else {
           $fnum = (keys %wishlist)-1;
       }
   
       $inner .= '<form method="post" name="groupsort" action="">'.
                 '<input type="hidden" value="'.$fnum.'" name="fnum" />'.
                 '<input type="button" onclick="javascript:checkAll()" id="checkallbutton" value="'.&mt('Check All').'" />'.
                 '<input type="button" onclick="javascript:uncheckAll()" id="uncheckallbutton" value="'.&mt('Uncheck All').'" />'.
                 '<input type="button" value="'.&mt('Import Checked').'" onclick="finish_import();" />'.    
                 '<input type="button" value="'.&mt('Cancel').'" onclick="window.close();" /><br/><br/>'; 
   
           
     # wishlist-table      # wishlist-table
     &wishlistImport(\@childrenRt);      my $numskipped = 0;
       &wishlistImport(\@childrenRt,\$numskipped);
     if ($wishlistHTMLimport ne '') {      if ($wishlistHTMLimport ne '') {
         $inner .= '<table class="LC_data_table LC_tableOfContent">'.$wishlistHTMLimport.'</table>';          $inner .= '<table class="LC_data_table LC_tableOfContent">'.$wishlistHTMLimport.'</table>';
     }      }
     else {      else {
         $inner .= '<span class="LC_info">'.&mt("Your wishlist ist currently empty.").'</span>';          $inner .= '<span class="LC_info">'.&mt("Your Stored Links list is currently empty.").'</span>';
       }
       if ($numskipped > 0) {
           $inner .= '<p class="LC_info">'.&mt('Note: where a Stored Link is unavailable for import in the current context it is grayed out.').'</p>';
     }      }
     $wishlistHTMLimport = '';      $wishlistHTMLimport = '';
   
Line 1705  sub makeErrorPage { Line 1897  sub makeErrorPage {
     # breadcrumbs and start_page       # breadcrumbs and start_page 
     &Apache::lonhtmlcommon::add_breadcrumb(      &Apache::lonhtmlcommon::add_breadcrumb(
               { href => '/adm/wishlist',                { href => '/adm/wishlist',
                 text => 'Wishlist'});                  text => 'Stored Links'});
     my $startPage = &Apache::loncommon::start_page('Wishlist');      my $startPage = &Apache::loncommon::start_page('Stored Links');
           
     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs(&mt('Wishlist').&Apache::loncommon::help_open_topic('Wishlist'));      my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs(&mt('Stored Links'),'Wishlist');
     &Apache::lonhtmlcommon::clear_breadcrumbs();      &Apache::lonhtmlcommon::clear_breadcrumbs();
   
     # error-message      # error-message
     my $inner .= '<span class="LC_error">'.&mt('An error occurred! Please try again later.').'</span>';      my $inner .= '<p class="LC_error">'.&mt('An error occurred! Please try again later.').'</p>';
   
     # end_page       # end_page 
     my $endPage =  &Apache::loncommon::end_page();      my $endPage =  &Apache::loncommon::end_page();
Line 1723  sub makeErrorPage { Line 1915  sub makeErrorPage {
     return $page;      return $page;
 }  }
   
 # ----------------------------------------------------- Main Handler, package lonwishlist  
 sub handler {  
     my ($r) = @_;  
     &Apache::loncommon::content_type($r,'text/html');  
     $r->send_http_header;  
   
     if (&getWishlist() ne 'error') {  
         # get wishlist entries from user-data db-file and build a tree out of these entries  
         %TreeHash = &getWishlist();  
         $root = &Tree::HashToTree();  
         @childrenRt = $root->children();  
   
         # greate a new entry  
         if ($env{'form.title'}) {  
            &newEntry($env{'form.title'}, $env{'form.path'}, $env{'form.note'});  
         }  
   
         # get unprocessed_cgi (i.e. marked entries, mode ...)   
         &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['action','mark','markedToMove','mode','newtitle','note','rat']);  
   
         # change the order of entries within a level, that means sorting the entries  
         my $changeOrder = 0;  
         if (defined $env{'form.sel'}) {  
             my @sel = &Apache::loncommon::get_env_multiple('form.sel');  
             my $indexNode;  
             my $at;  
             for (my $s=0; $s<($#sel+1); $s++) {  
                 if ($sel[$s] ne '') {  
                     $indexNode = $s;  
                     $at = $sel[$s]-1;  
                 }  
             }  
             if ($at ne '') {  
                 $changeOrder = 1;  
                 &sortEntries($indexNode,$at);  
                 &saveChanges();  
             }  
         }  
   
         # get all marked (checkboxes) entries  
         my @marked = ();  
         if (defined $env{'form.mark'}) {  
             @marked = &Apache::loncommon::get_env_multiple('form.mark');  
         }  
   
         # move entries from one folder to another  
         if (defined $env{'form.markedToMove'}) {  
            my $markedToMove = $env{'form.markedToMove'};  
            my @ToMove = split(/\,/,$markedToMove);  
            my $moveTo = $env{'form.mark'};  
            if (defined $moveTo){   
                &moveEntries(\@ToMove,$moveTo);  
                &saveChanges();  
            }  
            $changeOrder = 1;  
       
         }  
   
         # delete entries  
         if ($env{'form.action'} eq 'delete') {  
             &deleteEntries(\@marked);  
         }  
      
   
         # get all titles and notes and save them  
         # only save, if user wants to save changes  
         # do not save, when current action is 'delete' or 'sort' or 'move'   
         my @newTitles = ();  
         my @newPaths = ();  
         my @newNotes = ();  
         if ((defined $env{'form.newtitle'} || defined $env{'form.newpath'} || defined $env{'form.newnote'})  
             && ($env{'form.action'} ne 'noSave') && ($env{'form.action'} ne 'delete') && !$changeOrder) {  
             @newTitles = &Apache::loncommon::get_env_multiple('form.newtitle');  
             @newPaths = &Apache::loncommon::get_env_multiple('form.newpath');  
             @newNotes = &Apache::loncommon::get_env_multiple('form.newnote');  
             my $node = 0;  
             foreach my $t (@newTitles) {  
                &setNewTitle($node, $t);  
                $node++;  
             }  
             $node = 0;  
             my $path = 0;  
             for (my $i = 0; $i < ($#newTitles+1); $i++ ) {  
                if (&setNewPath($node, $newPaths[$path])) {  
                      $path++;  
                }  
                $node++;  
             }  
             $node = 0;  
             foreach my $n (@newNotes) {  
                &setNewNote($node, $n);  
                $node++;  
             }  
             &saveChanges();  
         }  
   
         # Create HTML-markup  
         my $page;  
         if ($env{'form.mode'} eq 'edit') {  
             $page = &makePage("edit");  
         }  
         elsif ($env{'form.mode'} eq 'move') {  
             $page = &makePage("move", \@marked);  
         }  
         elsif ($env{'form.mode'} eq 'import') {  
             $page = &makePageImport($env{'form.rat'});  
         }  
         elsif ($env{'form.mode'} eq 'set') {  
             $page = &makePageSet();  
         }  
         else {  
             $page = &makePage("view");  
         }  
         @marked = ();  
         $r->print($page);  
     }  
     # An error occured, print an error-page  
     else {  
         my $errorPage = &makeErrorPage();  
         $r->print($errorPage);  
     }  
     return OK;  
 }  
   
 # ----------------------------------------------------- package Tree  # ----------------------------------------------------- package Tree
 # Extend CPAN-Module Tree by function like 'moveNode' or 'deleteNode'  # Extend CPAN-Module Tree by function like 'moveNode' or 'deleteNode'
 package Tree;  package Apache::Tree;
   
 =pod  =pod
   
Line 1916  sub getNodeByIndex { Line 1985  sub getNodeByIndex {
     my $nodes = shift;      my $nodes = shift;
     my $found;      my $found;
           
     for my $n (@$nodes) {      foreach my $n (@$nodes) {
         my $curIndex = $n->value()->nindex();          my $curIndex = $n->value()->nindex();
         if ($n->value()->nindex() == $index) {          if ($curIndex == $index) {
             $found = $n;              $found = $n;
         }          }
     }      }
Line 2032  sub TreeToHash { Line 2101  sub TreeToHash {
 # build a tree-object for each entry in the hash  # build a tree-object for each entry in the hash
 # afterwards call &buildTree to connect the tree-objects  # afterwards call &buildTree to connect the tree-objects
 sub HashToTree {  sub HashToTree {
       my $TreeHash = shift;
     my @TreeNodes = ();      my @TreeNodes = ();
     my $root;      my $root;
   
     foreach my $key (keys %TreeHash) {      foreach my $key (keys %$TreeHash) {
         if ($key eq 'root') {          if ($key eq 'root') {
             $root = Tree->new("root");              $root = Tree->new("root");
         }          }
         else {          elsif ($key ne 'folders') {
         my @attributes = @{ $TreeHash{$key} };          my @attributes = @{ $$TreeHash{$key} };
         my $tmpNode;          my $tmpNode;
             $tmpNode = Tree->new(Entry->new(title=>$attributes[0],              $tmpNode = Tree->new(Entry->new(title=>$attributes[0],
                                             path=>$attributes[1],                                              path=>$attributes[1],
Line 2054  sub HashToTree { Line 2124  sub HashToTree {
         shift(@attributes);          shift(@attributes);
         shift(@attributes);          shift(@attributes);
         shift(@attributes);          shift(@attributes);
         $TreeHash{$key} = [ @attributes ];          $$TreeHash{$key} = [ @attributes ];
         }          }
     }      }
     # if there are nodes, build up the tree-structure      # if there are nodes, build up the tree-structure
     if (defined $TreeHash{'root'} && $TreeHash{'root'} ne '') {      if (defined $$TreeHash{'root'} && $$TreeHash{'root'} ne '') {
         my @childrenRtIn = @{ $TreeHash{'root'} };          my @childrenRtIn = @{ $$TreeHash{'root'} };
         &buildTree(\$root, \@childrenRtIn,\@TreeNodes,\%TreeHash);          &buildTree(\$root, \@childrenRtIn,\@TreeNodes,$TreeHash);
     }      }
     return $root;       return $root; 
 }  }

Removed from v.1.7  
changed lines
  Added in v.1.19


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>