Diff for /loncom/interface/loncommon.pm between versions 1.1181 and 1.1197

version 1.1181, 2014/03/13 14:46:46 version 1.1197, 2014/07/27 11:39:36
Line 69  use Apache::lontexconvert(); Line 69  use Apache::lontexconvert();
 use Apache::lonclonecourse();  use Apache::lonclonecourse();
 use Apache::lonuserutils();  use Apache::lonuserutils();
 use Apache::lonuserstate();  use Apache::lonuserstate();
   use Apache::courseclassifier();
 use LONCAPA qw(:DEFAULT :match);  use LONCAPA qw(:DEFAULT :match);
 use DateTime::TimeZone;  use DateTime::TimeZone;
 use DateTime::Locale::Catalog;  use DateTime::Locale::Catalog;
Line 1315  sub helpLatexCheatsheet { Line 1316  sub helpLatexCheatsheet {
   .&help_open_topic('Other_Symbols',&mt('Other Symbols'),$stayOnPage,undef,600)    .&help_open_topic('Other_Symbols',&mt('Other Symbols'),$stayOnPage,undef,600)
   .'</span>';    .'</span>';
     unless ($not_author) {      unless ($not_author) {
         $out .= ' <span>'          $out .= '<span>'
        .&help_open_topic('Authoring_Output_Tags',&mt('Output Tags'),$stayOnPage,undef,600)                 .&help_open_topic('Authoring_Output_Tags',&mt('Output Tags'),$stayOnPage,undef,600)
                  .'</span> <span>'
                  .&help_open_topic('Authoring_Multilingual_Problems',&mt('How to create problems in different languages'),$stayOnPage,undef,600)
        .'</span>';         .'</span>';
     }      }
     $out .= '</span>'; # End cheatsheet      $out .= '</span>'; # End cheatsheet
Line 2362  Outputs: Line 2365  Outputs:
   
 =item * $clientinfo  =item * $clientinfo
   
   =item * $clientosversion
   
 =back  =back
   
 =back   =back 
Line 2381  sub decode_user_agent { Line 2386  sub decode_user_agent {
     my $clientmathml='';      my $clientmathml='';
     my $clientunicode='0';      my $clientunicode='0';
     my $clientmobile=0;      my $clientmobile=0;
       my $clientosversion='';
     for (my $i=0;$i<=$#browsertype;$i++) {      for (my $i=0;$i<=$#browsertype;$i++) {
         my ($bname,$match,$notmatch,$vreg,$minv,$univ)=split(/\:/,$browsertype[$i]);          my ($bname,$match,$notmatch,$vreg,$minv,$univ)=split(/\%/,$browsertype[$i]);
  if (($httpbrowser=~/$match/i)  && ($httpbrowser!~/$notmatch/i)) {   if (($httpbrowser=~/$match/i)  && ($httpbrowser!~/$notmatch/i)) {
     $clientbrowser=$bname;      $clientbrowser=$bname;
             $httpbrowser=~/$vreg/i;              $httpbrowser=~/$vreg/i;
Line 2402  sub decode_user_agent { Line 2408  sub decode_user_agent {
     if ($httpbrowser=~/next/i) { $clientos='next'; }      if ($httpbrowser=~/next/i) { $clientos='next'; }
     if (($httpbrowser=~/mac/i) ||      if (($httpbrowser=~/mac/i) ||
         ($httpbrowser=~/powerpc/i)) { $clientos='mac'; }          ($httpbrowser=~/powerpc/i)) { $clientos='mac'; }
     if ($httpbrowser=~/win/i) { $clientos='win'; }      if ($httpbrowser=~/win/i) {
           $clientos='win';
           if ($httpbrowser =~/Windows\s+NT\s+(\d+\.\d+)/i) {
               $clientosversion = $1;
           }
       }
     if ($httpbrowser=~/embed/i) { $clientos='pda'; }      if ($httpbrowser=~/embed/i) { $clientos='pda'; }
     if ($httpbrowser=~/(Android|iPod|iPad|iPhone|webOS|Blackberry|Windows Phone|Opera m(?:ob|in)|Fennec)/i) {      if ($httpbrowser=~/(Android|iPod|iPad|iPhone|webOS|Blackberry|Windows Phone|Opera m(?:ob|in)|Fennec)/i) {
         $clientmobile=lc($1);          $clientmobile=lc($1);
Line 2413  sub decode_user_agent { Line 2424  sub decode_user_agent {
         $clientinfo = 'chromeframe-'.$1;          $clientinfo = 'chromeframe-'.$1;
     }      }
     return ($httpbrowser,$clientbrowser,$clientversion,$clientmathml,      return ($httpbrowser,$clientbrowser,$clientversion,$clientmathml,
             $clientunicode,$clientos,$clientmobile,$clientinfo);              $clientunicode,$clientos,$clientmobile,$clientinfo,
               $clientosversion);
 }  }
   
 ###############################################################  ###############################################################
Line 4319  sub findallcourses { Line 4331  sub findallcourses {
 ###############################################  ###############################################
   
 sub blockcheck {  sub blockcheck {
     my ($setters,$activity,$uname,$udom,$url) = @_;      my ($setters,$activity,$uname,$udom,$url,$is_course) = @_;
   
     if (!defined($udom)) {      if (defined($udom) && defined($uname)) {
           # If uname and udom are for a course, check for blocks in the course.
           if (($is_course) || (&Apache::lonnet::is_course($udom,$uname))) {
               my ($startblock,$endblock,$triggerblock) =
                   &get_blocks($setters,$activity,$udom,$uname,$url);
               return ($startblock,$endblock,$triggerblock);
           }
       } else {
         $udom = $env{'user.domain'};          $udom = $env{'user.domain'};
     }  
     if (!defined($uname)) {  
         $uname = $env{'user.name'};          $uname = $env{'user.name'};
     }      }
   
     # If uname and udom are for a course, check for blocks in the course.  
   
     if (&Apache::lonnet::is_course($udom,$uname)) {  
         my ($startblock,$endblock,$triggerblock) =   
             &get_blocks($setters,$activity,$udom,$uname,$url);  
         return ($startblock,$endblock,$triggerblock);  
     }  
   
     my $startblock = 0;      my $startblock = 0;
     my $endblock = 0;      my $endblock = 0;
     my $triggerblock = '';      my $triggerblock = '';
Line 4345  sub blockcheck { Line 4354  sub blockcheck {
     # boards, chat or groups, check for blocking in current course only.      # boards, chat or groups, check for blocking in current course only.
   
     if (($activity eq 'boards' || $activity eq 'chat' ||      if (($activity eq 'boards' || $activity eq 'chat' ||
          $activity eq 'groups') && ($env{'request.course.id'})) {           $activity eq 'groups' || $activity eq 'printout') &&
           ($env{'request.course.id'})) {
         foreach my $key (keys(%live_courses)) {          foreach my $key (keys(%live_courses)) {
             if ($key ne $env{'request.course.id'}) {              if ($key ne $env{'request.course.id'}) {
                 delete($live_courses{$key});                  delete($live_courses{$key});
Line 4609  sub parse_block_record { Line 4619  sub parse_block_record {
 }  }
   
 sub blocking_status {  sub blocking_status {
     my ($activity,$uname,$udom,$url) = @_;      my ($activity,$uname,$udom,$url,$is_course) = @_;
     my %setters;      my %setters;
   
 # check for active blocking  # check for active blocking
     my ($startblock,$endblock,$triggerblock) =       my ($startblock,$endblock,$triggerblock) = 
         &blockcheck(\%setters,$activity,$uname,$udom,$url);          &blockcheck(\%setters,$activity,$uname,$udom,$url,$is_course);
     my $blocked = 0;      my $blocked = 0;
     if ($startblock && $endblock) {      if ($startblock && $endblock) {
         $blocked = 1;          $blocked = 1;
Line 7301  sub headtag { Line 7311  sub headtag {
  '<head>'.   '<head>'.
  &font_settings($args);   &font_settings($args);
   
     my $inhibitprint = &print_suppression();      my $inhibitprint;
       if ($args->{'print_suppress'}) {
           $inhibitprint = &print_suppression();
       }
   
     if (!$args->{'frameset'}) {      if (!$args->{'frameset'}) {
  $result .= &Apache::lonhtmlcommon::htmlareaheaders();   $result .= &Apache::lonhtmlcommon::htmlareaheaders();
Line 7427  sub print_suppression { Line 7440  sub print_suppression {
         }          }
         my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};          my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
         my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};          my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
         my $blocked = &blocking_status('printout',$cnum,$cdom);          my $blocked = &blocking_status('printout',$cnum,$cdom,undef,1);
         if ($blocked) {          if ($blocked) {
             my $checkrole = "cm./$cdom/$cnum";              my $checkrole = "cm./$cdom/$cnum";
             if ($env{'request.course.sec'} ne '') {              if ($env{'request.course.sec'} ne '') {
Line 7709  var modalWindow = { Line 7722  var modalWindow = {
  modalWindow.windowId = "myModal";   modalWindow.windowId = "myModal";
  modalWindow.width = width;   modalWindow.width = width;
  modalWindow.height = height;   modalWindow.height = height;
  modalWindow.content = "<iframe width='"+width+"' height='"+height+"' frameborder='0' scrolling='"+scrolling+"' allowtransparency='"+transparency+"' src='" + source + "' style='"+style+"'>&lt/iframe>";   modalWindow.content = "<iframe width='"+width+"' height='"+height+"' frameborder='0' scrolling='"+scrolling+"' allowtransparency='"+transparency+"' src='" + source + "' style='"+style+"'></iframe>";
  modalWindow.open();   modalWindow.open();
  };   };
 // END LON-CAPA Internal -->  // END LON-CAPA Internal -->
Line 9426  sub personal_data_fieldtitles { Line 9439  sub personal_data_fieldtitles {
   
 sub sorted_inst_types {  sub sorted_inst_types {
     my ($dom) = @_;      my ($dom) = @_;
     my ($usertypes,$order) = &Apache::lonnet::retrieve_inst_usertypes($dom);      my ($usertypes,$order);
       my %domdefaults = &Apache::lonnet::get_domain_defaults($dom);
       if (ref($domdefaults{'inststatus'}) eq 'HASH') {
           $usertypes = $domdefaults{'inststatus'}{'inststatustypes'};
           $order = $domdefaults{'inststatus'}{'inststatusorder'};
       } else {
           ($usertypes,$order) = &Apache::lonnet::retrieve_inst_usertypes($dom);
       }
     my $othertitle = &mt('All users');      my $othertitle = &mt('All users');
     if ($env{'request.course.id'}) {      if ($env{'request.course.id'}) {
         $othertitle  = &mt('Any users');          $othertitle  = &mt('Any users');
Line 9889  sub ask_for_embedded_content { Line 9909  sub ask_for_embedded_content {
                     ($path) =                      ($path) =
                         ($toplevel =~ m{^(\Q/uploaded/$cdom/$cnum/\E(?:docs|supplemental)/(?:default|\d+)/\d+)/});                          ($toplevel =~ m{^(\Q/uploaded/$cdom/$cnum/\E(?:docs|supplemental)/(?:default|\d+)/\d+)/});
                 }                  }
                 $fileloc = &Apache::lonnet::filelocation('',$toplevel);                  if ($toplevel=~/^\/*(uploaded|editupload)/) {
                       $fileloc = $toplevel;
                       $fileloc=~ s/^\s*(\S+)\s*$/$1/;
                       my ($udom,$uname,$fname) =
                           ($fileloc=~ m{^/+(?:uploaded|editupload)/+($match_domain)/+($match_name)/+(.*)$});
                       $fileloc = propath($udom,$uname).'/userfiles/'.$fname;
                   } else {
                       $fileloc = &Apache::lonnet::filelocation('',$toplevel);
                   }
                 $fileloc =~ s{^/}{};                  $fileloc =~ s{^/}{};
                 ($filename) = ($fileloc =~ m{.+/([^/]+)$});                  ($filename) = ($fileloc =~ m{.+/([^/]+)$});
                 $heading = &mt('Status of dependencies in [_1]',"$title ($filename)");                  $heading = &mt('Status of dependencies in [_1]',"$title ($filename)");
Line 10935  sub check_for_upload { Line 10963  sub check_for_upload {
     if (($current_disk_usage + $filesize) > $disk_quota){      if (($current_disk_usage + $filesize) > $disk_quota){
         my $msg = '<p class="LC_warning">'.          my $msg = '<p class="LC_warning">'.
                 &mt('Unable to upload [_1]. (size = [_2] kilobytes). Disk quota will be exceeded.','<span class="LC_filename">'.$fname.'</span>',$filesize).'</p>'.                  &mt('Unable to upload [_1]. (size = [_2] kilobytes). Disk quota will be exceeded.','<span class="LC_filename">'.$fname.'</span>',$filesize).'</p>'.
                   '<br />'.&mt('Disk quota is [_1] kilobytes. Your current disk usage is [_2] kilobytes.',$disk_quota,$current_disk_usage);                    '<p>'.&mt('Disk quota is [_1] kilobytes. Your current disk usage is [_2] kilobytes.',$disk_quota,$current_disk_usage).'</p>';
         return ('will_exceed_quota',$msg);          return ('will_exceed_quota',$msg);
     } elsif ($found_file) {      } elsif ($found_file) {
         if ($locked_file) {          if ($locked_file) {
Line 11045  sub decompress_form { Line 11073  sub decompress_form {
                         "$topdir/media/player.swf",                          "$topdir/media/player.swf",
                         "$topdir/media/swfobject.js",                          "$topdir/media/swfobject.js",
                         "$topdir/media/expressInstall.swf");                          "$topdir/media/expressInstall.swf");
         my @camtasia8 = ("$topdir/","$topdir/$topdir.html",          my @camtasia8_1 = ("$topdir/","$topdir/$topdir.html",
                          "$topdir/$topdir.mp4",                           "$topdir/$topdir.mp4",
                          "$topdir/$topdir\_config.xml",                           "$topdir/$topdir\_config.xml",
                          "$topdir/$topdir\_controller.swf",                           "$topdir/$topdir\_controller.swf",
Line 11067  sub decompress_form { Line 11095  sub decompress_form {
                          "$topdir/skins/express_show/",                           "$topdir/skins/express_show/",
                          "$topdir/skins/express_show/player-min.css",                           "$topdir/skins/express_show/player-min.css",
                          "$topdir/skins/express_show/spritesheet.png");                           "$topdir/skins/express_show/spritesheet.png");
           my @camtasia8_4 = ("$topdir/","$topdir/$topdir.html",
                            "$topdir/$topdir.mp4",
                            "$topdir/$topdir\_config.xml",
                            "$topdir/$topdir\_controller.swf",
                            "$topdir/$topdir\_embed.css",
                            "$topdir/$topdir\_First_Frame.png",
                            "$topdir/$topdir\_player.html",
                            "$topdir/$topdir\_Thumbnails.png",
                            "$topdir/playerProductInstall.swf",
                            "$topdir/scripts/",
                            "$topdir/scripts/config_xml.js",
                            "$topdir/scripts/techsmith-smart-player.min.js",
                            "$topdir/skins/",
                            "$topdir/skins/configuration_express.xml",
                            "$topdir/skins/express_show/",
                            "$topdir/skins/express_show/spritesheet.min.css",
                            "$topdir/skins/express_show/spritesheet.png",
                            "$topdir/skins/express_show/techsmith-smart-player.min.css");
         my @diffs = &compare_arrays(\@paths,\@camtasia6);          my @diffs = &compare_arrays(\@paths,\@camtasia6);
         if (@diffs == 0) {          if (@diffs == 0) {
             $is_camtasia = 6;              $is_camtasia = 6;
         } else {          } else {
             @diffs = &compare_arrays(\@paths,\@camtasia8);              @diffs = &compare_arrays(\@paths,\@camtasia8_1);
             if (@diffs == 0) {              if (@diffs == 0) {
                 $is_camtasia = 8;                  $is_camtasia = 8;
               } else {
                   @diffs = &compare_arrays(\@paths,\@camtasia8_4);
                   if (@diffs == 0) {
                       $is_camtasia = 8;
                   }
             }              }
         }          }
     }      }
Line 14512  sub init_user_environment { Line 14563  sub init_user_environment {
     }      }
 # ------------------------------------ Check browser type and MathML capability  # ------------------------------------ Check browser type and MathML capability
   
     my ($httpbrowser,$clientbrowser,$clientversion,$clientmathml,      my ($httpbrowser,$clientbrowser,$clientversion,$clientmathml,$clientunicode,
         $clientunicode,$clientos,$clientmobile,$clientinfo) = &decode_user_agent($r);          $clientos,$clientmobile,$clientinfo,$clientosversion) = &decode_user_agent($r);
   
 # ------------------------------------------------------------- Get environment  # ------------------------------------------------------------- Get environment
   
Line 14546  sub init_user_environment { Line 14597  sub init_user_environment {
      "browser.os"         => $clientos,       "browser.os"         => $clientos,
              "browser.mobile"     => $clientmobile,               "browser.mobile"     => $clientmobile,
              "browser.info"       => $clientinfo,               "browser.info"       => $clientinfo,
                "browser.osversion"  => $clientosversion,
      "server.domain"      => $Apache::lonnet::perlvar{'lonDefDomain'},       "server.domain"      => $Apache::lonnet::perlvar{'lonDefDomain'},
      "request.course.fn"  => '',       "request.course.fn"  => '',
      "request.course.uri" => '',       "request.course.uri" => '',
Line 14701  sub clean_symb { Line 14753  sub clean_symb {
 =item * &build_filters()  =item * &build_filters()
   
 Create markup for a table used to set filters to use when selecting  Create markup for a table used to set filters to use when selecting
 courses in a domain.  Used by lonpickcourse.pm and lonmodifycourse.pm  courses in a domain.  Used by lonpickcourse.pm, lonmodifycourse.pm
   and quotacheck.pl
   
   
 Inputs:  Inputs:
   
Line 14720  action - form action Line 14774  action - form action
   
 numfiltersref - ref to scalar (count of number of elements in institutional codes -- e.g., 4 for year, semester, department, and number)  numfiltersref - ref to scalar (count of number of elements in institutional codes -- e.g., 4 for year, semester, department, and number)
   
 caller - caller context (e.g., set to 'modifycourse' when routine is called from lonmodifycourse.pm  caller - caller context (e.g., set to 'modifycourse' when routine is called from lonmodifycourse.pm)
   
 cloneruname - username of owner of new course who wants to clone  cloneruname - username of owner of new course who wants to clone
   
Line 14750  clonetext - hidden form elements contain Line 14804  clonetext - hidden form elements contain
   
 clonewarning - warning message about missing information for intended course owner when DC creates a course  clonewarning - warning message about missing information for intended course owner when DC creates a course
   
   
 Returns: $output - HTML for display of search criteria, and hidden form elements.  Returns: $output - HTML for display of search criteria, and hidden form elements.
   
   
 Side Effects: None  Side Effects: None
   
 =cut  =cut
Line 14764  sub build_filters { Line 14820  sub build_filters {
         $codetitlesref,$codedom,$formname,$fixeddom,$prevphase,          $codetitlesref,$codedom,$formname,$fixeddom,$prevphase,
         $cnameelement,$cnumelement,$cdomelement,$setroles,          $cnameelement,$cnumelement,$cdomelement,$setroles,
         $clonetext,$clonewarning) = @_;          $clonetext,$clonewarning) = @_;
     my ($list,$fixeddom,$jscript);      my ($list,$jscript);
     my $onchange = 'javascript:updateFilters(this)';      my $onchange = 'javascript:updateFilters(this)';
     my ($domainselectform,$sincefilterform,$createdfilterform,      my ($domainselectform,$sincefilterform,$createdfilterform,
         $ownerdomselectform,$persondomselectform,$instcodeform,          $ownerdomselectform,$persondomselectform,$instcodeform,
Line 14868  sub build_filters { Line 14924  sub build_filters {
         }          }
         $cloneableonlyform = '<span class="LC_nobreak"><label><input type="radio" name="cloneableonly" value="1" '.$cloneableon.'/>&nbsp;'.&mt('Required').'</label>'.('&nbsp;'x3).'<label><input type="radio" name="cloneableonly" value="" '.$cloneableoff.' />&nbsp;'.&mt('No restriction').'</label></span>';          $cloneableonlyform = '<span class="LC_nobreak"><label><input type="radio" name="cloneableonly" value="1" '.$cloneableon.'/>&nbsp;'.&mt('Required').'</label>'.('&nbsp;'x3).'<label><input type="radio" name="cloneableonly" value="" '.$cloneableoff.' />&nbsp;'.&mt('No restriction').'</label></span>';
         if ($formname eq 'ccrs') {          if ($formname eq 'ccrs') {
             $cloneabletitle = &mt('Cloneable for').' '.$cloneruname.':'.$clonerudom;              $cloneabletitle = &mt('Cloneable for [_1]',$cloneruname.':'.$clonerudom);
         } else {          } else {
             $cloneabletitle = &mt('Cloneable by you');              $cloneabletitle = &mt('Cloneable by you');
         }          }
Line 14876  sub build_filters { Line 14932  sub build_filters {
     my $officialjs;      my $officialjs;
     if ($crstype eq 'Course') {      if ($crstype eq 'Course') {
         if (exists($filter->{'instcodefilter'})) {          if (exists($filter->{'instcodefilter'})) {
             if (($fixeddom) || ($formname eq 'requestcrs')  #            if (($fixeddom) || ($formname eq 'requestcrs') ||
                 || ($formname eq 'modifycourse')) {  #                ($formname eq 'modifycourse') || ($formname eq 'filterpicker')) {
               if ($codedom) { 
                 $officialjs = 1;                  $officialjs = 1;
                 ($instcodeform,$jscript,$$numtitlesref) =                  ($instcodeform,$jscript,$$numtitlesref) =
                     &Apache::courseclassifier::instcode_selectors($codedom,'filterpicker',                      &Apache::courseclassifier::instcode_selectors($codedom,'filterpicker',
                                                                   $officialjs,$codetitlesref);                                                                    $officialjs,$codetitlesref);
                 if ($jscript) {                  if ($jscript) {
                     $jscript = '<script type="text/javascript" language="Javascript">'.                      $jscript = '<script type="text/javascript">'."\n".
                                $jscript.'</script>'."\n";                                 '// <![CDATA['."\n".
                                  $jscript."\n".
                                  '// ]]>'."\n".
                                  '</script>'."\n";
                 }                  }
             }              }
             if ($instcodeform eq '') {              if ($instcodeform eq '') {
Line 14908  sub build_filters { Line 14968  sub build_filters {
         $output .= '<input type="hidden" name="phase" value="courselist" />'."\n".          $output .= '<input type="hidden" name="phase" value="courselist" />'."\n".
                    '<input type="hidden" name="prevphase" value="'.                     '<input type="hidden" name="prevphase" value="'.
                    $prevphase.'" />'."\n";                     $prevphase.'" />'."\n";
     } else {      } elsif ($formname ne 'quotacheck') {
         my $name_input;          my $name_input;
         if ($cnameelement ne '') {          if ($cnameelement ne '') {
             $name_input = '<input type="hidden" name="cnameelement" value="'.              $name_input = '<input type="hidden" name="cnameelement" value="'.
                           $cnameelement.'" />';                            $cnameelement.'" />';
         }          }
         $output .= qq|          $output .= qq|
 <input type="hidden" name="cnumelement" value="$cnumelement.'" />  <input type="hidden" name="cnumelement" value="$cnumelement" />
 <input type="hidden" name="cdomelement" value="$cdomelement.'" />  <input type="hidden" name="cdomelement" value="$cdomelement" />
 $name_input  $name_input
 $roleelement  $roleelement
 $multelement  $multelement
Line 15002  $typeelement Line 15062  $typeelement
   
 =item * &timebased_select_form()  =item * &timebased_select_form()
   
 Create markup for an option response item used to select a time-based  Create markup for a dropdown list used to select a time-based
 filter e.g., Course Activity, Course Created, when searching for courses  filter e.g., Course Activity, Course Created, when searching for courses
 or communities  or communities
   
Line 15045  sub timebased_select_form { Line 15105  sub timebased_select_form {
 =item * &js_changer()  =item * &js_changer()
   
 Create script tag containing Javascript used to submit course search form  Create script tag containing Javascript used to submit course search form
 when course type or domain is changed.  when course type or domain is changed, and also to hide 'Searching ...' on
   page load completion for page showing search result.
   
 Inputs: None  Inputs: None
   
 Returns: markup containing updateFilters() javascript function.   Returns: markup containing updateFilters() and hideSearching() javascript functions. 
   
 Side Effects: None  Side Effects: None
   
Line 15065  function updateFilters(caller) { Line 15126  function updateFilters(caller) {
     }      }
     document.filterpicker.submit();      document.filterpicker.submit();
 }  }
   
   function hideSearching() {
       if (document.getElementById('searching')) {
           document.getElementById('searching').style.display = 'none';
       }
       return;
   }
   
 // ]]>  // ]]>
 </script>  </script>
   
Line 15073  ENDJS Line 15142  ENDJS
   
 =pod  =pod
   
 =back  =item * &search_courses()
   
   Process selected filters form course search form and pass to lonnet::courseiddump
   to retrieve a hash for which keys are courseIDs which match the selected filters.
   
   Inputs:
   
   dom - domain being searched 
   
   type - course type ('Course' or 'Community' or '.' if any).
   
   filter - anonymous hash of criteria and their values
   
   numtitles - for institutional codes - number of categories
   
   cloneruname - optional username of new course owner
   
   clonerudom - optional domain of new course owner
   
   domcloner - Optional "domcloner" flag; has value=1 if user has ccc priv in domain being filtered by, 
               (used when DC is using course creation form)
   
   codetitles - reference to array of titles of components in institutional codes (official courses).
   
   
   Returns: %courses - hash of courses satisfying search criteria, keys = course IDs, values are corresponding colon-separated escaped description, institutional code, owner and type.
   
   
   Side Effects: None
   
 =cut  =cut
   
   
 sub build_release_hashes {  sub search_courses {
     my ($checkparms,$checkresponsetypes,$checkcrstypes,$anonsurvey,$randomizetry) = @_;      my ($dom,$type,$filter,$numtitles,$cloneruname,$clonerudom,$domcloner,$codetitles) = @_;
     return unless((ref($checkparms) eq 'HASH') && (ref($checkresponsetypes) eq 'HASH') &&      my (%courses,%showcourses,$cloner);
                   (ref($checkcrstypes) eq 'HASH') && (ref($anonsurvey) eq 'HASH') &&      if (($filter->{'ownerfilter'} ne '') ||
                   (ref($randomizetry) eq 'HASH'));          ($filter->{'ownerdomfilter'} ne '')) {
     foreach my $key (keys(%Apache::lonnet::needsrelease)) {          $filter->{'combownerfilter'} = $filter->{'ownerfilter'}.':'.
         my ($item,$name,$value) = split(/:/,$key);                                         $filter->{'ownerdomfilter'};
         if ($item eq 'parameter') {      }
             if (ref($checkparms->{$name}) eq 'ARRAY') {      foreach my $item ('descriptfilter','coursefilter','combownerfilter') {
                 unless(grep(/^\Q$name\E$/,@{$checkparms->{$name}})) {          if (!$filter->{$item}) {
                     push(@{$checkparms->{$name}},$value);              $filter->{$item}='.';
                 }          }
             } else {      }
                 push(@{$checkparms->{$name}},$value);      my $now = time;
             }      my $timefilter =
         } elsif ($item eq 'resourcetag') {         ($filter->{'sincefilter'}==-1?1:$now-$filter->{'sincefilter'});
             if ($name eq 'responsetype') {      my ($createdbefore,$createdafter);
                 $checkresponsetypes->{$value} = $Apache::lonnet::needsrelease{$key}      if (($filter->{'createdfilter'} ne '') && ($filter->{'createdfilter'} !=-1)) {
           $createdbefore = $now;
           $createdafter = $now-$filter->{'createdfilter'};
       }
       my ($instcodefilter,$regexpok);
       if ($numtitles) {
           if ($env{'form.official'} eq 'on') {
               $instcodefilter =
                   &Apache::courseclassifier::instcode_search_str($dom,$numtitles,$codetitles);
               $regexpok = 1;
           } elsif ($env{'form.official'} eq 'off') {
               $instcodefilter = &Apache::courseclassifier::instcode_search_str($dom,$numtitles,$codetitles);
               unless ($instcodefilter eq '') {
                   $regexpok = -1;
             }              }
         } elsif ($item eq 'course') {          }
             if ($name eq 'crstype') {      } else {
                 $checkcrstypes->{$value} = $Apache::lonnet::needsrelease{$key};          $instcodefilter = $filter->{'instcodefilter'};
       }
       if ($instcodefilter eq '') { $instcodefilter = '.'; }
       if ($type eq '') { $type = '.'; }
   
       if (($clonerudom ne '') && ($cloneruname ne '')) {
           $cloner = $cloneruname.':'.$clonerudom;
       }
       %courses = &Apache::lonnet::courseiddump($dom,
                                                $filter->{'descriptfilter'},
                                                $timefilter,
                                                $instcodefilter,
                                                $filter->{'combownerfilter'},
                                                $filter->{'coursefilter'},
                                                undef,undef,$type,$regexpok,undef,undef,
                                                undef,undef,$cloner,$env{'form.cc_clone'},
                                                $filter->{'cloneableonly'},
                                                $createdbefore,$createdafter,undef,
                                                $domcloner);
       if (($filter->{'personfilter'} ne '') && ($filter->{'persondomfilter'} ne '')) {
           my $ccrole;
           if ($type eq 'Community') {
               $ccrole = 'co';
           } else {
               $ccrole = 'cc';
           }
           my %rolehash = &Apache::lonnet::get_my_roles($filter->{'personfilter'},
                                                        $filter->{'persondomfilter'},
                                                        'userroles',undef,
                                                        [$ccrole,'in','ad','ep','ta','cr'],
                                                        $dom);
           foreach my $role (keys(%rolehash)) {
               my ($cnum,$cdom,$courserole) = split(':',$role);
               my $cid = $cdom.'_'.$cnum;
               if (exists($courses{$cid})) {
                   if (ref($courses{$cid}) eq 'HASH') {
                       if (ref($courses{$cid}{roles}) eq 'ARRAY') {
                           if (!grep(/^\Q$courserole\E$/,@{$courses{$cid}{roles}})) {
                               push (@{$courses{$cid}{roles}},$courserole);
                           }
                       } else {
                           $courses{$cid}{roles} = [$courserole];
                       }
                       $showcourses{$cid} = $courses{$cid};
                   }
             }              }
         }          }
           %courses = %showcourses;
     }      }
     ($anonsurvey->{major},$anonsurvey->{minor}) = split(/\./,$Apache::lonnet::needsrelease{'parameter:type:anonsurvey'});      return %courses;
     ($randomizetry->{major},$randomizetry->{minor}) = split(/\./,$Apache::lonnet::needsrelease{'parameter:type:randomizetry'});  
     return;  
 }  }
   
   
   =pod
   
   =back
   
   =cut
   
   
 sub update_content_constraints {  sub update_content_constraints {
     my ($cdom,$cnum,$chome,$cid) = @_;      my ($cdom,$cnum,$chome,$cid) = @_;
     my %curr_reqd_hash = &Apache::lonnet::userenvironment($cdom,$cnum,'internal.releaserequired');      my %curr_reqd_hash = &Apache::lonnet::userenvironment($cdom,$cnum,'internal.releaserequired');
Line 15484  sub cleanup_html { Line 15645  sub cleanup_html {
     return $outgoing;      return $outgoing;
 }  }
   
   # Checks for critical messages and returns a redirect url if one exists.
   # $interval indicates how often to check for messages.
   sub critical_redirect {
       my ($interval) = @_;
       if ((time-$env{'user.criticalcheck.time'})>$interval) {
           my @what=&Apache::lonnet::dump('critical', $env{'user.domain'}, 
                                           $env{'user.name'});
           &Apache::lonnet::appenv({'user.criticalcheck.time'=>time});
           my $redirecturl;
           if ($what[0]) {
       if (($what[0] ne 'con_lost') && ($what[0]!~/^error\:/)) {
           $redirecturl='/adm/email?critical=display';
           my $url=&Apache::lonnet::absolute_url().$redirecturl;
                   return (1, $url);
               }
           }
       } 
       return ();
   }
   
 # Use:  # Use:
 #   my $answer=reply("encrypt:passwd:$udom:$uname:$upass",$tryserver);  #   my $answer=reply("encrypt:passwd:$udom:$uname:$upass",$tryserver);
 #  #

Removed from v.1.1181  
changed lines
  Added in v.1.1197


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