![]() ![]() | ![]() |
- mode <head> </headh> <</body> elimination
1: # The LearningOnline Network 2: # Pick a course 3: # 4: # $Id: lonpickcourse.pm,v 1.40 2006/03/15 22:11:04 albertel Exp $ 5: # 6: # Copyright Michigan State University Board of Trustees 7: # 8: # This file is part of the LearningOnline Network with CAPA (LON-CAPA). 9: # 10: # LON-CAPA is free software; you can redistribute it and/or modify 11: # it under the terms of the GNU General Public License as published by 12: # the Free Software Foundation; either version 2 of the License, or 13: # (at your option) any later version. 14: # 15: # LON-CAPA is distributed in the hope that it will be useful, 16: # but WITHOUT ANY WARRANTY; without even the implied warranty of 17: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18: # GNU General Public License for more details. 19: # 20: # You should have received a copy of the GNU General Public License 21: # along with LON-CAPA; if not, write to the Free Software 22: # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 23: # 24: # /home/httpd/html/adm/gpl.txt 25: # 26: # http://www.lon-capa.org/ 27: # 28: 29: package Apache::lonpickcourse; 30: 31: use strict; 32: use Apache::Constants qw(:common); 33: use Apache::loncommon; 34: use Apache::loncoursedata; 35: use Apache::lonnet; 36: use Apache::lonlocal; 37: 38: sub handler { 39: my $r = shift; 40: &Apache::loncommon::content_type($r,'text/html'); 41: $r->send_http_header; 42: return OK if $r->header_only; 43: 44: # ------------------------------------------------------------ Print the screen 45: $r->print(&Apache::lonxml::xmlbegin(). 46: &Apache::loncommon::head()); 47: 48: # Get parameters from query string 49: &Apache::loncommon::get_unprocessed_cgi 50: ($ENV{'QUERY_STRING'},['domainfilter','descriptfilter', 51: 'sincefilter','form','cnumelement', 52: 'cdomelement','cnameelement','roleelement', 53: 'pickedcourse','instcodefilter', 54: 'ownerfilter','coursefilter','multiple']); 55: # domain filter and selection 56: my $domainfilter=$env{'form.domainfilter'}; 57: $domainfilter=~s/\W//g; 58: unless ($domainfilter) { $domainfilter=''; } 59: my $domainselectform=&Apache::loncommon::select_dom_form($domainfilter, 60: 'domainfilter',1); 61: # description filter 62: my $descriptfilter=$env{'form.descriptfilter'}; 63: unless ($descriptfilter) { $descriptfilter=''; } 64: my $listdescript=&HTML::Entities::encode($descriptfilter,'<>&"'); 65: # institutional code filter 66: my $instcodefilter=$env{'form.instcodefilter'}; 67: unless ($instcodefilter) { $instcodefilter=''; } 68: my $listinstcode=&HTML::Entities::encode($instcodefilter,'<>&"'); 69: # course owner filter 70: my $ownerfilter=$env{'form.ownerfilter'}; 71: unless ($ownerfilter) { $ownerfilter=''; } 72: my $listowner=&HTML::Entities::encode($ownerfilter,'<>&"'); 73: # course ID filter for DCs only 74: my ($courseidtag,$coursefilter); 75: if ($env{'user.adv'} && $domainfilter && exists($env{'user.role.dc./'. 76: $domainfilter.'/'})) { 77: $coursefilter=$env{'form.coursefilter'}; 78: unless ($coursefilter) { $coursefilter=''; } 79: my $listcourseid=&HTML::Entities::encode($coursefilter,'<>&"'); 80: $courseidtag = &mt('LON-CAPA course ID'); 81: $courseidtag .= qq|: <input type="text" name="coursefilter" size="25" value="$listcourseid" /> 82: <br /> 83: |; 84: } 85: # last course activity filter and selection 86: my $sincefilter=$env{'form.sincefilter'}; 87: $sincefilter=~s/[^\d-]//g; 88: unless ($sincefilter) { $sincefilter=-1; } 89: my $sincefilterform=&Apache::loncommon::select_form($sincefilter, 90: 'sincefilter',('-1'=>'', 91: '86400' => 'today', 92: '604800' => 'last week', 93: '2592000' => 'last month', 94: '7776000' => 'last three months', 95: '15552000' => 'last six months', 96: '31104000' => 'last year', 97: 'select_form_order' => 98: ['-1','86400','604800','2592000','7776000', 99: '15552000','31104000'])); 100: # if called from loncreateuser, report sections, then close 101: my ($loaditem,$seclist); 102: my $num_sections = 0; 103: if ($env{'form.form'} eq 'cu' && $env{'form.pickedcourse'}) { 104: $loaditem = 'onLoad="setSections()"'; 105: my ($cdom,$cnum) = split/_/,$env{'form.pickedcourse'}; 106: my %sections_count = (); 107: $num_sections = &Apache::loncommon::get_sections($cdom,$cnum,\%sections_count); 108: my @sections = (); 109: if ($num_sections > 0) { 110: @sections = (sort {$a <=> $b} keys(%sections_count)); 111: $seclist = join('","',@sections); 112: } 113: } 114: my $jscript; 115: my $title = 'Selecting a course'; 116: # Setup for multiple course selections, if flag for multiples set. 117: my $multiple = $env{'form.multiple'}; 118: my $multelement; 119: if ($multiple) { 120: $title = 'Selecting course(s)'; 121: $jscript = &Apache::loncommon::check_uncheck_jscript(); 122: $multelement = '<input type="hidden" name="multiple" value="'.$multiple.'" />'; 123: } 124: $r->print(&Apache::loncommon::bodytag($title,undef,$loaditem,undef,undef,undef,undef,1)); 125: my %lt=&Apache::lonlocal::texthash( 126: 'cac' => 'Course Activity', 127: 'cde' => 'Course Description', 128: 'cdo' => 'Course Domain', 129: 'cin' => 'Course Institutional Code', 130: 'cow' => "Course Owner's Username"); 131: my ($name_code,$name_input); 132: if (defined($env{'form.cnameelement'}) && $env{'form.cnameelement'} ne '') { 133: $name_code = "opener.document.$env{'form.form'}.$env{'form.cnameelement'}.value=cdesc;"; 134: $name_input ='<input type="hidden" name="cnameelement" value="'. 135: $env{'form.cnameelement'}.'" />'; 136: } 137: my $submitopener = ''; 138: my $autosubmit = ''; 139: my $roleelement = ''; 140: my $lastaction = 'self.close()'; 141: if ($env{'form.form'} eq 'cu') { 142: $lastaction = 'document.courselist.pickedcourse.value = cdom+"_"+cname;'."\n". 143: 'document.courselist.submit();'; 144: } 145: my $roledom = $env{'form.roleelement'}; 146: if ($roledom) { 147: $roleelement = '<input type="hidden" name="roleelement" value="'.$roledom.'" />'; 148: $submitopener = &Apache::lonroles::processpick(); 149: $autosubmit = 'process_pick("'.$roledom.'")'; 150: } 151: $r->print(<<ENDSCRIPT); 152: <script> 153: function gochoose(cname,cdom,cdesc,multiple,caller) { 154: var openerForm = "$env{'form.form'}"; 155: courseCount = 0; 156: var courses = ''; 157: if (multiple) { 158: if (typeof(document.courselist.course_id.length) == 'undefined') { 159: // only 1 course checkbox was created 160: if (document.courselist.course_id.checked) { 161: courses = courses + document.courselist.course_id.value + "&&"; 162: courseCount ++; 163: } 164: } else { 165: for (var j=0; j<document.courselist.course_id.length; j++) { 166: if (document.courselist.course_id[j].checked) { 167: courses = courses + document.courselist.course_id[j].value + "&&"; 168: courseCount ++; 169: } 170: } 171: } 172: opener.document.$env{'form.form'}.coursetotal.value = courseCount; 173: if (typeof(opener.document.$env{'form.form'}.coursepick.length) == 174: 'undefined') { 175: if (opener.document.$env{'form.form'}.coursepick.value == 'specific') { 176: opener.document.$env{'form.form'}.coursepick.checked = true; 177: } else { 178: opener.document.$env{'form.form'}.coursepick.checked = false; 179: } 180: } else { 181: for (var j=0; j<opener.document.$env{'form.form'}.coursepick.length; j++) { 182: if (opener.document.$env{'form.form'}.coursepick[j].value == 'specific') { 183: opener.document.$env{'form.form'}.coursepick[j].checked = true; 184: } else { 185: opener.document.$env{'form.form'}.coursepick[j].checked = false; 186: } 187: } 188: } 189: if (courseCount > 0) { 190: courses = courses.substr(0,courses.length-2); 191: opener.document.$env{'form.form'}.courselist.value = courses; 192: } 193: } else { 194: $name_code 195: opener.document.$env{'form.form'}.$env{'form.cnumelement'}.value=cname; 196: var slct=opener.document.$env{'form.form'}.$env{'form.cdomelement'}; 197: if (slct.options == undefined) { 198: opener.document.$env{'form.form'}.$env{'form.cdomelement'}.value=cdom; 199: } 200: else { 201: var i; 202: for (i=0;i<slct.length;i++) { 203: if (slct.options[i].value==cdom) { slct.selectedIndex=i; } 204: } 205: } 206: } 207: $autosubmit 208: $lastaction 209: } 210: 211: function setSections() { 212: var numSections = $num_sections 213: var sectionsArray = new Array("$seclist") 214: opener.document.$env{"form.form"}.currsec.length = 0 215: if (numSections == 0) { 216: opener.document.$env{"form.form"}.currsec.multiple=false 217: opener.document.$env{"form.form"}.currsec.size=1; 218: opener.document.$env{"form.form"}.currsec.options[0] = new Option('No existing sections','',false,false) 219: } else { 220: if (numSections == 1) { 221: opener.document.$env{"form.form"}.currsec.multiple=false; 222: opener.document.$env{"form.form"}.currsec.size=1; 223: opener.document.$env{"form.form"}.currsec.options[0] = new Option('Select','',true,true); 224: opener.document.$env{"form.form"}.currsec.options[1] = new Option('No section','',false,false) 225: opener.document.$env{"form.form"}.currsec.options[2] = new Option(sectionsArray[0],sectionsArray[0],false,false); 226: } else { 227: for (var i=0; i<numSections; i++) { 228: opener.document.$env{"form.form"}.currsec.options[i] = new Option(sectionsArray[i],sectionsArray[i],false,false) 229: } 230: opener.document.$env{"form.form"}.currsec.multiple=true 231: if (numSections < 3) { 232: opener.document.$env{"form.form"}.currsec.size=numSections; 233: } else { 234: opener.document.$env{"form.form"}.currsec.size=3; 235: } 236: opener.document.$env{"form.form"}.currsec.options[0].selected = false 237: } 238: } 239: self.close() 240: } 241: 242: $jscript 243: </script> 244: $submitopener 245: <form method="post" name="filterpicker"> 246: <input type="hidden" name="cnumelement" value="$env{'form.cnumelement'}" /> 247: <input type="hidden" name="cdomelement" value="$env{'form.cdomelement'}" /> 248: $name_input 249: <input type="hidden" name="form" value="$env{'form.form'}" /> 250: $roleelement 251: $multelement 252: $lt{'cac'}: $sincefilterform 253: <br /> 254: $lt{'cdo'}: $domainselectform 255: <br /> 256: $lt{'cin'}: 257: <input type="text" name="instcodefilter" size="10" value="$listinstcode" /> 258: <br /> 259: $lt{'cow'}: 260: <input type="text" name="ownerfilter" size="10" value="$listowner" /> 261: <br /> 262: $courseidtag 263: $lt{'cde'}: 264: <input type="text" name="descriptfilter" size="40" value="$listdescript" /> 265: <p><input type="submit" name="gosearch" value="Search" /></p> 266: </form> 267: <hr /> 268: ENDSCRIPT 269: # ---------------------------------------------------------------- Get the data 270: if ($env{'form.gosearch'}) { 271: $r->print(&mt('Searching').' ...<br /> <br />'); 272: $r->rflush(); 273: unless ($descriptfilter) { $descriptfilter='.'; } 274: unless ($instcodefilter) { $instcodefilter='.'; } 275: unless ($ownerfilter) { $ownerfilter='.'; } 276: unless ($coursefilter) { $coursefilter='.'; } 277: my $timefilter=($sincefilter==-1?1:time-$sincefilter); 278: my %courses= 279: &Apache::lonnet::courseiddump 280: ($domainfilter,$descriptfilter,$timefilter,$instcodefilter,$ownerfilter,$coursefilter); 281: $r->print('<form name="courselist">'); 282: my %by_descrip; 283: my $numcourses = keys(%courses); 284: foreach my $course (keys(%courses)) { 285: my $descr; 286: if ($courses{$course} =~ m/^([^:]*):/i) { 287: $descr = &Apache::lonnet::unescape($1); 288: } else { 289: $descr = &Apache::lonnet::unescape($courses{$course}); 290: } 291: my $description = $descr; 292: push (@{$by_descrip{$description}}, $course); 293: } 294: if ($numcourses > 1 && $multiple) { 295: $r->print('<input type="button" value="check all" 296: onclick="javascript:checkAll(document.courselist.course_id)" /> <input type="button" value="uncheck all" 297: onclick="javascript:uncheckAll(document.courselist.course_id)" /> 298: <br /><br />'); 299: } 300: foreach my $description (sort 301: { lc($a) cmp lc($b) } (keys(%by_descrip))) { 302: foreach my $course (@{$by_descrip{$description}}) { 303: my $cleandesc=&HTML::Entities::encode($description,'<>&"'); 304: $cleandesc=~s/'/\\'/g; 305: my ($cdom,$cnum)=split(/\_/,$course); 306: my ($descr,$instcode,$owner) = split/:/,$courses{$course}; 307: $r->print(&course_chooser($multiple,$cdom,$cnum,$cleandesc)); 308: $r->print($description.'('. 309: ($Apache::lonnet::domaindescription{$cdom}? 310: $Apache::lonnet::domaindescription{$cdom}:$cdom).")"); 311: unless ($instcode eq '') { 312: $r->print(" - ".&Apache::lonnet::unescape($instcode)); 313: } 314: unless ($owner eq '') { 315: $r->print(", owner - ".&Apache::lonnet::unescape($owner)); 316: } 317: if ($multiple) { $r->print("</label>\n"); } 318: $r->print("<br />\n"); 319: } 320: } 321: if (!%courses) { 322: $r->print(&mt('None found')); 323: } elsif ($multiple) { 324: $r->print('<input type="button" value="Submit" onClick="gochoose('."'','','',1)".'" />'); 325: } 326: $r->print('<input type="hidden" name="form" value="'.$env{'form.form'}.'" />'."\n". 327: '<input type="hidden" name="pickedcourse" value="" />'."\n". 328: '<input type="hidden" name="cnumelement" value="'.$env{'form.cnumelement'}.'" />'."\n". 329: '<input type="hidden" name="cdomelement" value="'.$env{'form.cdomelement'}.'" />'."\n"); 330: if ((exists($env{'form.roleelement'})) && ($env{'form.form'} eq 'rolechoice')) { 331: $r->print('<input type="hidden" name="roleelement" value="'.$env{'form.roleelement'}.'" />'."\n"); 332: } 333: $r->print("</form>\n"); 334: } 335: $r->print(&Apache::loncommon::end_page()); 336: return OK; 337: } 338: 339: sub course_chooser { 340: my ($multiple,$cdom,$cnum,$cleandesc) = @_; 341: my $output; 342: if ($multiple) { 343: $output = '<label><input type="checkbox" name="course_id" value="'.$cdom.'_'.$cnum.'" />'."\n"; 344: } else { 345: $output = '<input type="button" value="Select" onClick="gochoose('. 346: "'".$cnum."','".$cdom."','".$cleandesc."')".'" />'."\n"; 347: } 348: return $output; 349: } 350: 351: 1; 352: __END__