--- loncom/interface/lonmenu.pm 2006/12/06 11:34:37 1.207 +++ loncom/interface/lonmenu.pm 2008/09/20 17:01:48 1.239.2.1 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Routines to control the menu # -# $Id: lonmenu.pm,v 1.207 2006/12/06 11:34:37 foxr Exp $ +# $Id: lonmenu.pm,v 1.239.2.1 2008/09/20 17:01:48 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -46,7 +46,7 @@ use Apache::lonenc(); use Apache::lonlocal; use LONCAPA qw(:DEFAULT :match); -use vars qw(@desklines $readdesk); +use vars qw(@desklines %category_names %category_members %category_positions $readdesk); my @inlineremote; @@ -54,14 +54,28 @@ my @inlineremote; # ================================================================ Little texts +sub show_course { + my $course = !$env{'user.adv'}; + if (!$env{'user.adv'}) { + foreach my $env (keys(%env)) { + next if ($env !~ m/^user\.priv\./); + if ($env !~ m/^user\.priv\.(?:st|cm)/) { + $course = 0; + last; + } + } + } + return $course; +} sub initlittle { return &Apache::lonlocal::texthash('ret' => 'Return to Last Location', 'nav' => 'Navigate Contents', 'main' => 'Main Menu', - 'roles' => ($env{'user.adv'}? - 'Roles':'Courses'), - 'docs' => 'Course Documents', + 'roles' => (&show_course()? + 'Courses':'Roles'), + 'other' => 'Other Roles', + 'docs' => 'Edit Course', 'exit' => 'Exit', 'login' => 'Log In', 'launch' => 'Launch Remote Control', @@ -88,7 +102,10 @@ sub menubuttons { my $reloadlink=''; my $docs=''; my $groups=''; + my $roles=''.$lt{'roles'}.''; + my $role_selector; my $showgroups=0; + my ($cnum,$cdom); my $escurl=&escape(&Apache::lonenc::check_encrypt($env{'request.noversionuri'})); my $escsymb=&escape(&Apache::lonenc::check_encrypt($env{'request.symb'})); @@ -104,15 +121,21 @@ sub menubuttons { } } if ($env{'request.course.id'}) { + $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; my %coursegroups; my $viewgrps_permission = &Apache::lonnet::allowed('vcg',$env{'request.course.id'}.($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:'')); if (!$viewgrps_permission) { - %coursegroups = &Apache::lonnet::get_active_groups($env{'user.domain'},$env{'user.name'},$env{'course.'.$env{'request.course.id'}.'.domain'}, $env{'course.'.$env{'request.course.id'}.'.num'}); + %coursegroups = &Apache::lonnet::get_active_groups($env{'user.domain'},$env{'user.name'},$cdom,$cnum); } if ((keys(%coursegroups) > 0) || ($viewgrps_permission)) { $showgroups = 1; } + $role_selector = &roles_selector($cdom,$cnum); + if ($role_selector) { + $roles = ''.$role_selector.'  '.$lt{'other'}.''; + } } if ($env{'browser.interface'} eq 'textual') { @@ -121,9 +144,7 @@ sub menubuttons { $navmaps=(<$lt{'nav'} ENDNAV - if (($env{'request.noversionuri'}=~/^\/adm\//) && - ($env{'request.noversionuri'}!~/^\/adm\/wrapper\//) && - ($env{'request.noversionuri'}!~/^\/adm\/.*\/(smppg|bulletinboard|aboutme)(\?|$)/)) { + if (&show_return_link()) { my $escreload=&escape('return:'); $reloadlink=(<$lt{'ret'} @@ -149,8 +170,7 @@ $utility
$lt{'main'} -$reloadlink $navmaps $docs $groups -$lt{'roles'} +$reloadlink $navmaps $docs $groups $roles $lt{'exit'}

@@ -186,6 +206,7 @@ ENDMAINMENU ENDINLINEMENU } + $roles = ''.$lt{'roles'}.''; # Do we have a NAV link? if ($env{'request.course.id'}) { my $link='/adm/navmaps?postdata='.$escurl.'&postsymb='. @@ -196,7 +217,7 @@ ENDINLINEMENU $navmaps=(<$lt{'nav'} ENDNAV -my $is_group = (&Apache::loncommon::course_type() eq 'Group'); + my $is_group = (&Apache::loncommon::course_type() eq 'Group'); if (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) { my $text = ($is_group) ? $lt{'gdoc'} : $lt{'docs'}; $docs=(<$lt{'groups'} ENDGROUPS } - if ( - ($env{'request.noversionuri'}=~m[^/(res|public)/] && - $env{'request.symb'} eq '') - || - (($env{'request.noversionuri'}=~/^\/adm\//) && - ($env{'request.noversionuri'}!~/^\/adm\/wrapper\//) && - ($env{'request.noversionuri'}!~ - m[^/adm/.*/(smppg|bulletinboard|aboutme)($|\?)]) - ) - ) { + if (&show_return_link()) { my $escreload=&escape('return:'); $reloadlink=(<$lt{'ret'} ENDRELOAD } + if ($role_selector) { + $roles = ''.$role_selector.''.$lt{'other'}.''; + } } if (($env{'request.state'} eq 'construct') && ($env{'request.course.id'})) { my $escreload=&escape('return:'); @@ -236,10 +251,6 @@ ENDCRELOAD } my $form=&serverform(); my $utility=&utilityfunctions(); - my $remote; - if ($env{'user.adv'}) { - $remote = ''.$lt{'launch'}.'' - } my $helplink=&Apache::loncommon::top_nav_help('Help'); return (<$lt{'roles'} +$roles $helplink $lt{'exit'} @@ -274,6 +284,19 @@ ENDINLINEMENU } } +sub show_return_link { + return (($env{'request.noversionuri'}=~m{^/(res|public)/} && + $env{'request.symb'} eq '') + || + ($env{'request.noversionuri'}=~ m{^/cgi-bin/printout.pl}) + || + (($env{'request.noversionuri'}=~/^\/adm\//) && + ($env{'request.noversionuri'}!~/^\/adm\/wrapper\//) && + ($env{'request.noversionuri'}!~ + m[^/adm/.*/(smppg|bulletinboard|aboutme)($|\?)]) + )); +} + # ====================================== This gets called in the header section sub registerurl { @@ -334,16 +357,18 @@ sub innerregister { } else { $newmail= 'swmenu.setstatus("you have","messages");'; } - } elsif (($textual) + } + if (($textual) && ($env{'request.symb'}) && ($env{'request.course.id'})) { $newmail.= ''; my ($mapurl,$rid,$resurl)= &Apache::lonnet::decode_symb(&Apache::lonnet::symbread()); - $newmail.=$env{'course.'.$env{'request.course.id'}.'.description'}; + my $coursetitle=$env{'course.'.$env{'request.course.id'}.'.description'}; + $newmail.=$coursetitle; my $maptitle=&Apache::lonnet::gettitle($mapurl); my $restitle=&Apache::lonnet::gettitle(&Apache::lonnet::symbread()); - if ($maptitle && $maptitle ne 'default.sequence') { + if ($maptitle && ($maptitle ne 'default.sequence') && ($maptitle ne $coursetitle)) { $newmail.=', '.$maptitle; } if ($restitle) { @@ -398,19 +423,24 @@ sub innerregister { ### my $editbutton = ''; if ($env{'user.author'}) { - if ($env{'request.role'}=~/^(ca|au)/) { + if ($env{'request.role'}=~/^(aa|ca|au)/) { # Set defaults for authors my ($top,$bottom) = ('con-','struct'); my $action = "go('/priv/".$env{'user.name'}."');"; my $cadom = $env{'request.role.domain'}; my $caname = $env{'user.name'}; - my $desc = "Enter my resource construction space"; + my $desc = "Enter my construction space"; # Set defaults for co-authors if ($env{'request.role'} =~ /^ca/) { ($cadom,$caname)=($env{'request.role'}=~/($match_domain)\/($match_username)$/); ($top,$bottom) = ('co con-','struct'); $action = "go('/priv/".$caname."');"; $desc = "Enter construction space as co-author"; + } elsif ($env{'request.role'} =~ /^aa/) { + ($cadom,$caname)=($env{'request.role'}=~/($match_domain)\/($match_username)$/); + ($top,$bottom) = ('co con-','struct'); + $action = "go('/priv/".$caname."');"; + $desc = "Enter construction space as assistant co-author"; } # Check that we are on the correct machine my $home = &Apache::lonnet::homeserver($caname,$cadom); @@ -445,7 +475,7 @@ sub innerregister { # Finally, turn the button on or off if ($cfile && !$const_space) { $editbutton=&switch - ('','',6,1,'cstr.gif','edit[_1]','resource[_2]', + ('','',6,1,'pcstr.gif','edit[_1]','resource[_2]', "go('".$cfile."');","Edit this resource"); } elsif ($editbutton eq '') { $editbutton=&clear(6,1); @@ -464,8 +494,9 @@ sub innerregister { } else { $currdir =~ s#[^/]+$##; my $cleandisfn = &Apache::loncommon::escape_single($thisdisfn); + my $esc_currdir = &Apache::loncommon::escape_single($currdir); $menuitems=(< +$inlineremote[21] $inlineremote[23] +ENDARROWSINLINE + if (&hidden_button_check() ne 'yes') { + $inlinebuttons .= (< +ENDINLINEICONS + } + } else { + if ($inlineremote[21] ne '' || $inlineremote[23] ne '') { + $inlinebuttons=(<$inlineremote[21] $inlineremote[23] -$inlineremote[61]$inlineremote[62]$inlineremote[63] -$inlineremote[71]$inlineremote[72]$inlineremote[73] -$inlineremote[81]$inlineremote[82]$inlineremote[83] -$inlineremote[91]$inlineremote[92]$inlineremote[93] -ENDINLINE - } +ENDFIRSTLINE + } + if (&hidden_button_check() ne 'yes') { + foreach my $row (6..9) { + if ($inlineremote[${row}.'1'] ne '' + || $inlineremote[$row.'2'] ne '' + || $inlineremote[$row.'3'] ne '') { + $inlinebuttons .= <<"ENDLINE"; +$inlineremote["${row}1"]$inlineremote["${row}2"]$inlineremote["${row}3"] +ENDLINE + } + } + } + } + } } $result =(< // BEGIN LON-CAPA Internal $timesync -$newmail $tablestart $inlinebuttons $tableend +$newmail @@ -755,12 +823,19 @@ sub load_remote_msg {

$link

ENDREMOTEFORM } + +sub get_menu_name { + my $hostid = $Apache::lonnet::perlvar{'lonHostID'}; + $hostid =~ s/\W//g; + return 'LCmenu'.$hostid; +} + # ================================================================= Reopen menu sub reopenmenu { if (($env{'browser.interface'} eq 'textual') || ($env{'environment.remote'} eq 'off')) { return ''; } - my $menuname='LCmenu'.$Apache::lonnet::perlvar{'lonHostID'}; + my $menuname = &get_menu_name(); my $nothing = &Apache::lonhtmlcommon::javascript_nothing(); return('window.open('.$nothing.',"'.$menuname.'","",false);'); } @@ -773,16 +848,17 @@ sub open { ($env{'environment.remote'} eq 'off')) { return ''; } - my $menuname='LCmenu'.$Apache::lonnet::perlvar{'lonHostID'}; - unless (shift eq 'unix') { + my $menuname = &get_menu_name(); + +# unless (shift eq 'unix') { # resizing does not work on linux because of virtual desktop sizes - $returnval.=(<'.$text.''; } else { - $inlineremote[10*$row+$col]="\n
". + $inlineremote[$idx]="\n
". $desc.' '.$text.''; } } else { # Inline Remote + if ($env{'environment.icons'} ne 'classic') { + $img=~s/\.gif$/\.png/; + } if ($nobreak==2) { return ''; } my $text=$top.' '.$bot; $text=~s/\s*\-\s*//gs; - my $lonhttpdPort=$Apache::lonnet::perlvar{'lonhttpdPort'}; - if (!defined($lonhttpdPort)) { $lonhttpdPort='8080'; } my $pic= - ''.$text.''; + ''.$text.''; if ($env{'browser.interface'} eq 'faketextual') { # Accessibility if ($nobreak==3) { - $inlineremote[10*$row+$col]="\n". + $inlineremote[$idx]="\n". ''.$text. ''. ''.$pic.''; } elsif ($nobreak) { - $inlineremote[10*$row+$col]="\n". + $inlineremote[$idx]="\n". ''. ''.$pic.' - '.$text.''; + '.$text.''; } else { - $inlineremote[10*$row+$col]="\n". + $inlineremote[$idx]="\n". ''. ''.$pic. ''. - $desc.''; + ''.$desc.''; } } else { # Inline Menu - $inlineremote[10*$row+$col]= - ''.$pic. - ''.$desc.''; + if ($env{'environment.icons'} eq 'iconsonly') { + $inlineremote[$idx]=''.$pic.''; + } else { + $inlineremote[$idx]= + ''.$pic. + ''.$desc.''; + } } } return ''; @@ -880,19 +965,19 @@ sub switch { sub secondlevel { my $output=''; my - ($uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act,$desc)=@_; + ($uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act,$desc,$cat)=@_; if ($prt eq 'any') { - $output.=switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc); + $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat); } elsif ($prt=~/^r(\w+)/) { if ($rol eq $1) { - $output.=switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc); + $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat); } } return $output; } sub openmenu { - my $menuname='LCmenu'.$Apache::lonnet::perlvar{'lonHostID'}; + my $menuname = &get_menu_name(); if (($env{'browser.interface'} eq 'textual') || ($env{'environment.remote'} eq 'off')) { return ''; } my $nothing = &Apache::lonhtmlcommon::javascript_nothing(); @@ -900,10 +985,32 @@ sub openmenu { } sub inlinemenu { - @inlineremote=(); - undef @inlineremote; + undef(@inlineremote); + undef(%category_members); &rawconfig(1); - return join('',map { (defined($_)?$_:'') } @inlineremote); + my $output=''; + for (my $col=1; $col<=2; $col++) { + $output.='"; + } + $output.="
'; + for (my $row=1; $row<=8; $row++) { + foreach my $cat (keys(%category_members)) { + if ($category_positions{$cat} ne "$col,$row") { next; } + $output.=''; + my %active=(); + foreach my $menu_item (split(/\:/,$category_members{$cat})) { + if ($inlineremote[$menu_item]) { + $active{$menu_item}=1; + } + } + foreach my $item (sort(keys(%active))) { + $output.=$inlineremote[$item]; + } + $output.='
'.&mt($category_names{$cat}).'
'; + } + } + $output.="
"; + return $output; } sub rawconfig { @@ -920,6 +1027,7 @@ sub rawconfig { my $uname=$env{'user.name'}; my $udom=$env{'user.domain'}; my $adv=$env{'user.adv'}; + my $show_course=&show_course(); my $author=$env{'user.author'}; my $crs=''; if ($env{'request.course.id'}) { @@ -934,11 +1042,12 @@ sub rawconfig { my $rol=$env{'request.role'}; my $requested_domain = $env{'request.role.domain'}; foreach my $line (@desklines) { - my ($row,$col,$pro,$prt,$img,$top,$bot,$act,$desc)=split(/\:/,$line); + my ($row,$col,$pro,$prt,$img,$top,$bot,$act,$desc,$cat)=split(/\:/,$line); $prt=~s/\$uname/$uname/g; $prt=~s/\$udom/$udom/g; $prt=~s/\$crs/$crs/g; $prt=~s/\$requested_domain/$requested_domain/g; + if ($category_names{$cat}!~/\w/) { $cat='oth'; } my $type = &Apache::loncommon::course_type(); if ($type eq 'Group') { $desc = &convert_menu_function($desc,$type); @@ -947,29 +1056,39 @@ sub rawconfig { $output.=&clear($row,$col); } elsif ($pro eq 'any') { $output.=&secondlevel( - $uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act,$desc); + $uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act,$desc,$cat); } elsif ($pro eq 'smp') { unless ($adv) { $output.=&secondlevel( - $uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act,$desc); + $uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act,$desc,$cat); } } elsif ($pro eq 'adv') { if ($adv) { $output.=&secondlevel( - $uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act,$desc); + $uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act,$desc,$cat); + } + } elsif ($pro eq 'shc') { + if ($show_course) { + $output.=&secondlevel( + $uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act,$desc,$cat); + } + } elsif ($pro eq 'nsc') { + if (!$show_course) { + $output.=&secondlevel( + $uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act,$desc,$cat); } } elsif (($pro=~/^p(\w+)/) && ($prt)) { if (&Apache::lonnet::allowed($1,$prt)) { - $output.=switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc); + $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat); } } elsif ($pro eq 'course') { if ($env{'request.course.fn'}) { - $output.=switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc); + $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat); } } elsif ($pro =~ /^courseenv_(.*)$/) { my $key = $1; if ($env{'course.'.$env{'request.course.id'}.'.'.$key}) { - $output.=switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc); + $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat); } } elsif ($pro =~ /^course_(.*)$/) { # Check for permissions inside of a course @@ -977,16 +1096,17 @@ sub rawconfig { (&Apache::lonnet::allowed($1,$env{'request.course.id'}. ($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:'')) )) { - $output.=switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc); + $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat); } } elsif ($pro eq 'author') { if ($author) { if ((($prt eq 'rca') && ($env{'request.role'}=~/^ca/)) || + (($prt eq 'raa') && ($env{'request.role'}=~/^aa/)) || (($prt eq 'rau') && ($env{'request.role'}=~/^au/))) { # Check that we are on the correct machine my $cadom=$requested_domain; my $caname=$env{'user.name'}; - if ($prt eq 'rca') { + if (($prt eq 'rca') || ($prt eq 'raa')) { ($cadom,$caname)= ($env{'request.role'}=~/($match_domain)\/($match_username)$/); } @@ -996,8 +1116,8 @@ sub rawconfig { my @ids=&Apache::lonnet::current_machine_ids(); foreach my $id (@ids) { if ($id eq $home) { $allowed=1; } } if ($allowed) { - $output.=switch($caname,$cadom, - $row,$col,$img,$top,$bot,$act,$desc); + $output.=&switch($caname,$cadom, + $row,$col,$img,$top,$bot,$act,$desc,$cat); } } } @@ -1019,7 +1139,7 @@ sub rawconfig { sub close { if (($env{'browser.interface'} eq 'textual') || ($env{'environment.remote'} eq 'off')) { return ''; } - my $menuname='LCmenu'.$Apache::lonnet::perlvar{'lonHostID'}; + my $menuname = &get_menu_name(); return(< window.status='Accessing Remote Control'; @@ -1203,7 +1323,7 @@ function annotate() { '$start_page_annotate' +"
" - +"" + +"" +"<\\/form>" +'$end_page_annotate'); annotator.document.close(); @@ -1287,6 +1407,232 @@ sub convert_menu_function { return $rolename; } +sub hidden_button_check { + my $hidden; + if ($env{'request.course.id'} eq '') { + return; + } + if ($env{'request.role.adv'}) { + return; + } + my $buttonshide = &Apache::lonnet::EXT('resource.0.buttonshide'); + return $buttonshide; +} + +sub roles_selector { + my ($cdom,$cnum) = @_; + my $now = time; + my (%courseroles,%seccount,%gotnosection); + my $is_cc; + my $role_selector; + if ($env{'user.role.cc./'.$cdom.'/'.$cnum}) { + my ($start,$end) = split(/\./,$env{'user.role.cc./'.$cdom.'/'.$cnum}); + + if ((($start) && ($start<0)) || + (($end) && ($end<$now)) || + (($start) && ($now<$start))) { + $is_cc = 0; + } else { + $is_cc = 1; + } + } + if ($is_cc) { + my %adv_roles = + &Apache::lonnet::get_course_adv_roles($env{'request.course.id'},1); + foreach my $role (keys(%adv_roles)) { + my ($urole,$usec) = split(/:/,$role); + if (!$gotnosection{$urole}) { + $seccount{$urole} ++; + $gotnosection{$urole} = 1; + } + if (ref($courseroles{$urole}) eq 'ARRAY') { + if ($usec ne '') { + if (!grep(/^Q$usec\E$/,@{$courseroles{$urole}})) { + push(@{$courseroles{$urole}},$usec); + $seccount{$urole} ++; + } + } + } else { + @{$courseroles{$urole}} = (); + if ($usec ne '') { + $seccount{$urole} ++; + push(@{$courseroles{$urole}},$usec); + } + } + } + my %sections_count = &Apache::loncommon::get_sections($cdom,$cnum); + @{$courseroles{'st'}} = (); + if (keys(%sections_count) > 0) { + push(@{$courseroles{'st'}},keys(%sections_count)); + } + } else { + foreach my $item (keys(%env)) { + if ($item =~ m-^user\.role\.([^.]+)\./\Q$cdom\E/\Q$cnum\E/?(\w*)$-) { + my $role = $1; + my $sec = $2; + next if ($role eq 'gr'); + my ($start,$end) = split(/\./,$env{$item}); + next if (($start && $start > $now) || ($end && $end < $now)); + if ($sec eq '') { + if (!$gotnosection{$role}) { + $seccount{$role} ++; + $gotnosection{$role} = 1; + } + } + if (ref($courseroles{$role}) eq 'ARRAY') { + if ($sec ne '') { + if (!grep(/^Q$sec\E$/,@{$courseroles{$role}})) { + push(@{$courseroles{$role}},$sec); + $seccount{$role} ++; + } + } + } else { + @{$courseroles{$role}} = (); + if ($sec ne '') { + $seccount{$role} ++; + push(@{$courseroles{$role}},$sec); + } + } + } + } + } + my @roles_order = ('cc','in','ta','ep','ad','st'); + if (keys(%courseroles) > 1) { + $role_selector = &jump_to_role($cdom,$cnum,\%seccount,\%courseroles); + $role_selector .= ' + '."\n". + ''."\n". + ''."\n". + ''."\n". + ''."\n". + '
'; + } + return $role_selector; +} + +sub jump_to_role { + my ($cdom,$cnum,$seccount,$courseroles) = @_; + my %lt = &Apache::lonlocal::texthash( + this => 'This role has section(s) associated with it.', + ente => 'Enter a specific section.', + orlb => 'Enter a specific section, or leave blank for no section.', + avai => 'Available sections are:', + youe => 'You entered an invalid section choice:', + plst => 'Please try again', + ); + my $js; + if (ref($courseroles) eq 'HASH') { + $js = ' var secpick = new Array("'.$lt{'ente'}.'","'.$lt{'orlb'}.'");'."\n". + ' var numsec = new Array();'."\n". + ' var rolesections = new Array();'."\n". + ' var rolenames = new Array();'."\n". + ' var roleseclist = new Array();'."\n"; + my @items = keys(%{$courseroles}); + for (my $i=0; $i<@items; $i++) { + $js .= ' rolenames['.$i.'] = "'.$items[$i].'";'."\n"; + my ($secs,$secstr); + if (ref($courseroles->{$items[$i]}) eq 'ARRAY') { + my @sections = sort { $a <=> $b } @{$courseroles->{$items[$i]}}; + $secs = join('","',@sections); + $secstr = join(', ',@sections); + } + $js .= ' rolesections['.$i.'] = new Array("'.$secs.'");'."\n". + ' roleseclist['.$i.'] = "'.$secstr.'";'."\n". + ' numsec['.$i.'] = "'.$seccount->{$items[$i]}.'";'."\n"; + } + } + my $output = <<"END"; + +END + return $output; +} + # ================================================================ Main Program @@ -1299,7 +1645,11 @@ BEGIN { $configline=(split(/\#/,$configline))[0]; $configline=~s/^\s+//; chomp($configline); - if ($configline) { + if ($configline=~/^cat\:/) { + my @entries=split(/\:/,$configline); + $category_positions{$entries[2]}=$entries[1]; + $category_names{$entries[2]}=$entries[3]; + } elsif ($configline) { push(@desklines,$configline); } }