--- loncom/interface/loncommon.pm 2009/04/29 16:57:29 1.799 +++ loncom/interface/loncommon.pm 2010/03/17 20:00:02 1.955 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # a pile of common routines # -# $Id: loncommon.pm,v 1.799 2009/04/29 16:57:29 bisitz Exp $ +# $Id: loncommon.pm,v 1.955 2010/03/17 20:00:02 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -407,6 +407,7 @@ sub studentbrowser_javascript { ) { return ''; } return (<<'ENDSTDBRW'); ENDSTDBRW } @@ -461,6 +463,7 @@ sub selectstudent_link { sub authorbrowser_javascript { return <<"ENDAUTHORBRW"; ENDAUTHORBRW } sub coursebrowser_javascript { - my ($domainfilter,$sec_element,$formname)=@_; - my $crs_or_grp_alert = &mt('Please select the type of LON-CAPA entity - Course or Group - for which you wish to add/modify a user role'); - my $output = ' + my ($domainfilter,$sec_element,$formname,$role_element,$crstype) = @_; + my $wintitle = 'Course_Browser'; + if ($crstype eq 'Community') { + $wintitle = 'Community_Browser'; + } + my $id_functions = &javascript_index_functions(); + my $output = ' '; + return $output; +} - function getFormIdByName(formname) { - for (var i=0;i -1) { + var domid = getIndexByName(formid,udom); + if (domid > -1) { + if (document.forms[formid].elements[domid].type == 'select-one') { + userdom=document.forms[formid].elements[domid].options[document.forms[formid].elements[domid].selectedIndex].value; + } + if (document.forms[formid].elements[domid].type == 'hidden') { + userdom=document.forms[formid].elements[domid].value; } } - return -1; } -ENDSTDBRW - if ($sec_element ne '') { - $output .= &setsec_javascript($sec_element,$formname); + return userdom; +} + +ENDJS + +} + +sub userbrowser_javascript { + my $id_functions = &javascript_index_functions(); + return <<"ENDUSERBRW"; + +function openuserbrowser(formname,uname,udom,ulast,ufirst,uemail,hideudom,crsdom,caller) { + var url = '/adm/pickuser?'; + var userdom = getDomainFromSelectbox(formname,udom); + if (userdom != null) { + if (userdom != '') { + url += 'srchdom='+userdom+'&'; + } } - $output .= ' -'; - return $output; + url += 'form=' + formname + '&unameelement='+uname+ + '&udomelement='+udom+ + '&ulastelement='+ulast+ + '&ufirstelement='+ufirst+ + '&uemailelement='+uemail+ + '&hideudomelement='+hideudom+ + '&coursedom='+crsdom; + if ((caller != null) && (caller != undefined)) { + url += '&caller='+caller; + } + var title = 'User_Browser'; + var options = 'scrollbars=1,resizable=1,menubar=0'; + options += ',width=700,height=600'; + var stdeditbrowser = open(url,title,options,'1'); + stdeditbrowser.focus(); +} + +function fix_domain (formname,udom,origdom,uname) { + var formid = getFormIdByName(formname); + if (formid > -1) { + var unameid = getIndexByName(formid,uname); + var domid = getIndexByName(formid,udom); + var hidedomid = getIndexByName(formid,origdom); + if (hidedomid > -1) { + var fixeddom = document.forms[formid].elements[hidedomid].value; + var unameval = document.forms[formid].elements[unameid].value; + if ((fixeddom != '') && (fixeddom != undefined) && (fixeddom != null) && (unameval != '') && (unameval != undefined) && (unameval != null)) { + if (domid > -1) { + var slct = document.forms[formid].elements[domid]; + if (slct.type == 'select-one') { + var i; + for (i=0;i' ."".&mt('Select Course').'' + .'","'.$multflag.'","'.$type.'","'.$typeelement.'");' + ."'>".$linktext.'' .''; } @@ -625,6 +782,14 @@ sub selectauthor_link { &mt('Select Author').''; } +sub selectuser_link { + my ($form,$unameelem,$domelem,$lastelem,$firstelem,$emailelem,$hdomelem, + $coursedom,$linktext,$caller) = @_; + return ''.$linktext.''; +} + sub check_uncheck_jscript { my $jscript = <<"ENDSCRT"; function checkAll(field) { @@ -825,6 +990,7 @@ sub linked_select_forms { # output the javascript to do the changing my $result = ''; $result.=' END # output the initial values for the selection lists @@ -960,7 +1127,7 @@ sub help_open_topic { $template.=' ' .''.&mt('Help: [_1]',$topic).''; if ($text ne "") { $template.=''; @@ -1003,7 +1170,7 @@ sub general_help { my $helptopic='Student_Intro'; if ($env{'request.role'}=~/^(ca|au)/) { $helptopic='Authoring_Intro'; - } elsif ($env{'request.role'}=~/^cc/) { + } elsif ($env{'request.role'}=~/^(cc|co)/) { $helptopic='Course_Coordination_Intro'; } elsif ($env{'request.role'}=~/^dc/) { $helptopic='Domain_Coordination_Intro'; @@ -1023,7 +1190,9 @@ sub update_help_link { my $banner_link = "/adm/helpmenu?page=banner&topic=$topic&component_help=$component_help&faq=$faq&bug=$bug&origurl=$origurl&stamp=$timestamp&stayonpage=$stayOnPage"; my $output .= <<"ENDOUTPUT"; ENDOUTPUT return $output; @@ -1033,12 +1202,7 @@ ENDOUTPUT sub help_open_menu { my ($topic,$component_help,$faq,$bug,$stayOnPage,$width,$height,$text) = @_; - $stayOnPage = 0 if (not defined $stayOnPage); - # only use pop-up help (stayOnPage == 0) - # if environment.remote is on (using remote control UI) - if ($env{'environment.remote'} eq 'off' ) { - $stayOnPage=1; - } + $stayOnPage = 1; my $output; if ($component_help) { if (!$text) { @@ -1059,8 +1223,8 @@ sub help_open_menu { sub top_nav_help { my ($text) = @_; $text = &mt($text); - my $stay_on_page = - ($env{'environment.remote'} eq 'off' ); + my $stay_on_page = 1; + my $link = ($stay_on_page) ? "javascript:helpMenu('display')" : "javascript:helpMenu('open')"; my $banner_link = &update_help_link(undef,undef,undef,undef,$stay_on_page); @@ -1075,10 +1239,7 @@ END sub help_menu_js { my ($text) = @_; - - my $stayOnPage = - ($env{'environment.remote'} eq 'off' ); - + my $stayOnPage = 1; my $width = 620; my $height = 600; my $helptopic=&general_help(); @@ -1097,8 +1258,8 @@ sub help_menu_js { my $template .= <<"ENDTEMPLATE"; ENDTEMPLATE return $template; @@ -1135,10 +1296,7 @@ sub help_open_bug { unless ($env{'user.adv'}) { return ''; } unless ($Apache::lonnet::perlvar{'BugzillaHost'}) { return ''; } $text = "" if (not defined $text); - $stayOnPage = 0 if (not defined $stayOnPage); - if ($env{'environment.remote'} eq 'off' ) { $stayOnPage=1; - } $width = 600 if (not defined $width); $height = 600 if (not defined $height); @@ -1179,10 +1337,7 @@ sub help_open_faq { unless ($env{'user.adv'}) { return ''; } unless ($Apache::lonnet::perlvar{'FAQHost'}) { return ''; } $text = "" if (not defined $text); - $stayOnPage = 0 if (not defined $stayOnPage); - if ($env{'environment.remote'} eq 'off' ) { $stayOnPage=1; - } $width = 350 if (not defined $width); $height = 400 if (not defined $height); @@ -1390,6 +1545,7 @@ sub resize_textarea_js { my $geometry = &viewport_geometry_js(); return <<"RESIZE"; RESIZE @@ -1548,10 +1705,13 @@ sub create_workbook { my $workbook = Spreadsheet::WriteExcel->new('/home/httpd'.$filename); if (! defined($workbook)) { $r->log_error("Error creating excel spreadsheet $filename: $!"); - $r->print('

'.&mt("Unable to create new Excel file. ". - "This error has been logged. ". - "Please alert your LON-CAPA administrator"). - '

'); + $r->print( + '

' + .&mt('Problems occurred in creating the new Excel file.') + .' '.&mt('This error has been logged.') + .' '.&mt('Please alert your LON-CAPA administrator.') + .'

' + ); return (undef); } # @@ -1591,9 +1751,13 @@ sub create_text_file { $fh = Apache::File->new('>/home/httpd'.$filename); if (! defined($fh)) { $r->log_error("Couldn't open $filename for output $!"); - $r->print(&mt('Problems occurred in creating the output file. ' - .'This error has been logged. ' - .'Please alert your LON-CAPA administrator.')); + $r->print( + '

' + .&mt('Problems occurred in creating the output file.') + .' '.&mt('This error has been logged.') + .' '.&mt('Please alert your LON-CAPA administrator.') + .'

' + ); } return ($fh,$filename) } @@ -1706,7 +1870,7 @@ sub select_form { $selectform.= '\n"; + ">".$hash{$key}."\n"; } $selectform.=""; return $selectform; @@ -1771,7 +1935,7 @@ sub select_level_form { =pod -=item * &select_dom_form($defdom,$name,$includeempty,$showdomdesc,$autosubmit) +=item * &select_dom_form($defdom,$name,$includeempty,$showdomdesc,$onchange,$incdoms) Returns a string containing a \n"; foreach my $dom (@domains) { @@ -1851,7 +2021,7 @@ sub home_server_form_item { if ($numlib > 1) { $result .= '".&mt('Visible input').''; + $result.="'; return $result; } @@ -2810,6 +2980,26 @@ sub screenname { } +# ------------------------------------------------------------- Confirm Wrapper +=pod + +=item confirmwrapper + +Wrap messages about completion of operation in box + +=cut + +sub confirmwrapper { + my ($message)=@_; + if ($message) { + return "\n".'
'."\n" + .$message."\n" + .'
'."\n"; + } else { + return $message; + } +} + # ------------------------------------------------------------- Message Wrapper sub messagewrapper { @@ -2820,13 +3010,15 @@ sub messagewrapper { '&subject='.&escape($subject).'&text='.&escape($text).'" '. 'title="'.&mt('Send message').'">'.$link.''; } + # --------------------------------------------------------------- Notes Wrapper sub noteswrapper { my ($link,$un,$do)=@_; return -"$link"; +"$link"; } + # ------------------------------------------------------------- Aboutme Wrapper sub aboutmewrapper { @@ -2834,20 +3026,21 @@ sub aboutmewrapper { if (!defined($username) && !defined($domain)) { return; } - return ''.$link.''; } # ------------------------------------------------------------ Syllabus Wrapper - sub syllabuswrapper { my ($linktext,$coursedir,$domain)=@_; return qq{$linktext}; } +# ----------------------------------------------------------------------------- + sub track_student_link { - my ($linktext,$sname,$sdom,$target,$start) = @_; + my ($linktext,$sname,$sdom,$target,$start,$only_body) = @_; my $link ="/adm/trackstudent?"; my $title = 'View recent activity'; if (defined($sname) && $sname !~ /^\s*$/ && @@ -2861,6 +3054,7 @@ sub track_student_link { $target = ''; } if ($start) { $link.='&start='.$start; } + if ($only_body) { $link .= '&only_body=1'; } $title = &mt($title); $linktext = &mt($linktext); return qq{$linktext}. @@ -3204,12 +3398,22 @@ sub get_previous_attempt { } $prevattempts=&start_data_table().&start_data_table_header_row(); $prevattempts.=''.&mt('History').''; + my %typeparts; + my $showsurv=&Apache::lonnet::allowed('vas',$env{'request.course.id'}); foreach my $key (sort(keys(%lasthash))) { my ($ign,@parts) = split(/\./,$key); if ($#parts > 0) { my $data=$parts[-1]; pop(@parts); - $prevattempts.=''.&mt('Part ').join('.',@parts).'
'.$data.' '; + if ($data eq 'type') { + unless ($showsurv) { + my $id = join(',',@parts); + $typeparts{$ign.'.'.$id} = $lasthash{$key}; + } + delete($lasthash{$key}); + } else { + $prevattempts.=''.&mt('Part ').join('.',@parts).'
'.$data.' '; + } } else { if ($#parts == 0) { $prevattempts.=''.$parts[0].''; @@ -3219,23 +3423,98 @@ sub get_previous_attempt { } } $prevattempts.=&end_data_table_header_row(); + my %lasthidden; if ($getattempt eq '') { for ($version=1;$version<=$returnhash{'version'};$version++) { - $prevattempts.=&start_data_table_row(). - ''.&mt('Transaction [_1]',$version).''; - foreach my $key (sort(keys(%lasthash))) { - my $value = &format_previous_attempt_value($key, - $returnhash{$version.':'.$key}); - $prevattempts.=''.$value.' '; - } - $prevattempts.=&end_data_table_row(); + my @hidden; + if (%typeparts) { + foreach my $id (keys(%typeparts)) { + if (($returnhash{$version.':'.$id.'.type'} eq 'anonsurvey') || ($returnhash{$version.':'.$id.'.type'} eq 'anonsurveycred')) { + push(@hidden,$id); + $lasthidden{$id} = 1; + } elsif ($lasthidden{$id}) { + if (exists($returnhash{$version.':'.$id.'.award'})) { + delete($lasthidden{$id}); + } + } + } + } + $prevattempts.=&start_data_table_row(). + ''.&mt('Transaction [_1]',$version).''; + if (@hidden) { + foreach my $key (sort(keys(%lasthash))) { + my $hide; + foreach my $id (@hidden) { + if ($key =~ /^\Q$id\E/) { + $hide = 1; + last; + } + } + if ($hide) { + my ($id,$data) = ($key =~ /^(.+)\.([^.]+)$/); + if (($data eq 'award') || ($data eq 'awarddetail')) { + my $value = &format_previous_attempt_value($key, + $returnhash{$version.':'.$key}); + $prevattempts.=''.$value.' '; + } else { + $prevattempts.=' '; + } + } else { + if ($key =~ /\./) { + my $value = &format_previous_attempt_value($key, + $returnhash{$version.':'.$key}); + $prevattempts.=''.$value.' '; + } else { + $prevattempts.=' '; + } + } + } + } else { + foreach my $key (sort(keys(%lasthash))) { + my $value = &format_previous_attempt_value($key, + $returnhash{$version.':'.$key}); + $prevattempts.=''.$value.' '; + } + } + $prevattempts.=&end_data_table_row(); } } + my @currhidden = keys(%lasthidden); $prevattempts.=&start_data_table_row().''.&mt('Current').''; foreach my $key (sort(keys(%lasthash))) { - my $value = &format_previous_attempt_value($key,$lasthash{$key}); - if ($key =~/$regexp$/ && (defined &$gradesub)) {$value = &$gradesub($value)} - $prevattempts.=''.$value.' '; + if (%typeparts) { + my $hidden; + foreach my $id (@currhidden) { + if ($key =~ /^\Q$id\E/) { + $hidden = 1; + last; + } + } + if ($hidden) { + my ($id,$data) = ($key =~ /^(.+)\.([^.]+)$/); + if (($data eq 'award') || ($data eq 'awarddetail')) { + my $value = &format_previous_attempt_value($key,$lasthash{$key}); + if ($key =~/$regexp$/ && (defined &$gradesub)) { + $value = &$gradesub($value); + } + $prevattempts.=''.$value.' '; + } else { + $prevattempts.=' '; + } + } else { + my $value = &format_previous_attempt_value($key,$lasthash{$key}); + if ($key =~/$regexp$/ && (defined &$gradesub)) { + $value = &$gradesub($value); + } + $prevattempts.=''.$value.' '; + } + } else { + my $value = &format_previous_attempt_value($key,$lasthash{$key}); + if ($key =~/$regexp$/ && (defined &$gradesub)) { + $value = &$gradesub($value); + } + $prevattempts.=''.$value.' '; + } } $prevattempts.= &end_data_table_row().&end_data_table(); } else { @@ -3537,6 +3816,7 @@ sub findallcourses { if (!%roles) { %roles = ( cc => 1, + co => 1, in => 1, ep => 1, ta => 1, @@ -3727,7 +4007,7 @@ sub blockcheck { ($env{'request.role'} !~ m{^st\./\Q$cdom\E/\Q$cnum\E})); next if ($no_userblock); - # Retrieve blocking times and identity of blocker for course + # Retrieve blocking times and identity of locker for course # of specified user, unless user has 'evb' privilege. my ($start,$end)=&get_blocks($setters,$activity,$cdom,$cnum); @@ -3792,103 +4072,51 @@ sub parse_block_record { return ($setuname,$setudom,$title,$blocks); } -sub build_block_table { - my ($startblock,$endblock,$setters) = @_; - my %lt = &Apache::lonlocal::texthash( - 'cacb' => 'Currently active communication blocks', - 'cour' => 'Course', - 'dura' => 'Duration', - 'blse' => 'Block set by' - ); - my $output; - $output = '
'.$lt{'cacb'}.':
'; - $output .= &start_data_table(); - $output .= ' - - '.$lt{'cour'}.' - '.$lt{'dura'}.' - '.$lt{'blse'}.' - -'; - foreach my $course (keys(%{$setters})) { - my %courseinfo=&Apache::lonnet::coursedescription($course); - for (my $i=0; $i<@{$$setters{$course}{staff}}; $i++) { - my ($uname,$udom) = @{$$setters{$course}{staff}[$i]}; - my $fullname = &plainname($uname,$udom); - if (defined($env{'user.name'}) && defined($env{'user.domain'}) - && $env{'user.name'} ne 'public' - && $env{'user.domain'} ne 'public') { - $fullname = &aboutmewrapper($fullname,$uname,$udom); - } - my ($openblock,$closeblock) = @{$$setters{$course}{times}[$i]}; - $openblock = &Apache::lonlocal::locallocaltime($openblock); - $closeblock= &Apache::lonlocal::locallocaltime($closeblock); - $output .= &Apache::loncommon::start_data_table_row(). - ''.$courseinfo{'description'}.''. - ''.$openblock.' to '.$closeblock.''. - ''.$fullname.''. - &Apache::loncommon::end_data_table_row(); - } - } - $output .= &end_data_table(); -} - sub blocking_status { - my ($activity,$uname,$udom) = @_; - my %setters; - my ($blocked,$output,$ownitem,$is_course); - my ($startblock,$endblock)=&blockcheck(\%setters,$activity,$uname,$udom); - if ($startblock && $endblock) { - $blocked = 1; - if (wantarray) { - my $category; - if ($activity eq 'boards') { - $category = 'Discussion posts in this course'; - } elsif ($activity eq 'blogs') { - $category = 'Blogs'; - } elsif ($activity eq 'port') { - if (defined($uname) && defined($udom)) { - if ($uname eq $env{'user.name'} && - $udom eq $env{'user.domain'}) { - $ownitem = 1; - } - } - $is_course = &Apache::lonnet::is_course($udom,$uname); - if ($ownitem) { - $category = 'Your portfolio files'; - } elsif ($is_course) { - my $coursedesc; - foreach my $course (keys(%setters)) { - my %courseinfo = - &Apache::lonnet::coursedescription($course); - $coursedesc = $courseinfo{'description'}; - } - $category = "Group portfolio in the course '$coursedesc'"; - } else { - $category = 'Portfolio files belonging to '; - if ($env{'user.name'} eq 'public' && - $env{'user.domain'} eq 'public') { - $category .= &plainname($uname,$udom); - } else { - $category .= &aboutmewrapper(&plainname($uname,$udom),$uname,$udom); - } - } - } elsif ($activity eq 'groups') { - $category = 'Groups in this course'; - } - my $showstart = &Apache::lonlocal::locallocaltime($startblock); - my $showend = &Apache::lonlocal::locallocaltime($endblock); - $output = '
'.&mt('[_1] will be inaccessible between [_2] and [_3] because communication is being blocked.',$category,$showstart,$showend).'
'; - if (!($activity eq 'port' && !($ownitem) && !($is_course))) { - $output .= &build_block_table($startblock,$endblock,\%setters); - } - } - } - if (wantarray) { - return ($blocked,$output); - } else { - return $blocked; - } + my ($activity,$uname,$udom) = @_; + my %setters; + + # check for active blocking + my ($startblock,$endblock)=&blockcheck(\%setters,$activity,$uname,$udom); + + my $blocked = $startblock && $endblock ? 1 : 0; + + # caller just wants to know whether a block is active + if (!wantarray) { return $blocked; } + + # build a link to a popup window containing the details + my $querystring = "?activity=$activity"; + # $uname and $udom decide whose portfolio the user is trying to look at + $querystring .= "&udom=$udom" if $udom; + $querystring .= "&uname=$uname" if $uname; + + my $output .= <<'END_MYBLOCK'; + function openWindow(url, wdwName, w, h, toolbar,scrollbar) { + var options = "width=" + w + ",height=" + h + ","; + options += "resizable=yes,scrollbars="+scrollbar+",status=no,"; + options += "menubar=no,toolbar="+toolbar+",location=no,directories=no"; + var newWin = window.open(url, wdwName, options); + newWin.focus(); + } +END_MYBLOCK + + $output = Apache::lonhtmlcommon::scripttag($output); + + my $popupUrl = "/adm/blockingstatus/$querystring"; + my $text = mt('Communication Blocked'); + + $output .= <<"END_BLOCK"; +
+ + $text + $text +
+ +END_BLOCK + + return ($blocked, $output); } ############################################### @@ -3966,7 +4194,7 @@ sub determinedomain { my $domain=shift; if (! $domain) { # Determine domain if we have not been given one - $domain = $Apache::lonnet::perlvar{'lonDefDomain'}; + $domain = &Apache::lonnet::default_login_domain(); if ($env{'user.domain'}) { $domain=$env{'user.domain'}; } if ($env{'request.role.domain'}) { $domain=$env{'request.role.domain'}; @@ -3989,16 +4217,39 @@ sub get_domainconf { if (defined($cached)) { return %{$result}; } my %domconfig = &Apache::lonnet::get_dom('configuration', - ['login','rolecolors'],$udom); + ['login','rolecolors','autoenroll'],$udom); my (%designhash,%legacy); if (keys(%domconfig) > 0) { if (ref($domconfig{'login'}) eq 'HASH') { if (keys(%{$domconfig{'login'}})) { foreach my $key (keys(%{$domconfig{'login'}})) { if (ref($domconfig{'login'}{$key}) eq 'HASH') { - foreach my $img (keys(%{$domconfig{'login'}{$key}})) { - $designhash{$udom.'.login.'.$key.'_'.$img} = - $domconfig{'login'}{$key}{$img}; + if ($key eq 'loginvia') { + if (ref($domconfig{'login'}{'loginvia'}) eq 'HASH') { + my @ids = &Apache::lonnet::current_machine_ids(); + foreach my $hostname (@ids) { + if (ref($domconfig{'login'}{'loginvia'}{$hostname}) eq 'HASH') { + if ($domconfig{'login'}{'loginvia'}{$hostname}{'server'}) { + my $server = $domconfig{'login'}{'loginvia'}{$hostname}{'server'}; + $designhash{$udom.'.login.loginvia'} = $server; + if ($domconfig{'login'}{'loginvia'}{$hostname}{'serverpath'} eq 'custom') { + + $designhash{$udom.'.login.loginvia_'.$hostname} = $server.':'.$domconfig{'login'}{'loginvia'}{$hostname}{'custompath'}; + } else { + $designhash{$udom.'.login.loginvia_'.$hostname} = $server.':'.$domconfig{'login'}{'loginvia'}{$hostname}{'serverpath'}; + } + if ($domconfig{'login'}{'loginvia'}{$hostname}{'exempt'}) { + $designhash{$udom.'.login.loginvia_exempt_'.$hostname} = $domconfig{'login'}{'loginvia'}{$hostname}{'exempt'}; + } + } + } + } + } + } else { + foreach my $img (keys(%{$domconfig{'login'}{$key}})) { + $designhash{$udom.'.login.'.$key.'_'.$img} = + $domconfig{'login'}{$key}{$img}; + } } } else { $designhash{$udom.'.login.'.$key}=$domconfig{'login'}{$key}; @@ -4025,6 +4276,11 @@ sub get_domainconf { } else { $legacy{'rolecolors'} = 1; } + if (ref($domconfig{'autoenroll'}) eq 'HASH') { + if ($domconfig{'autoenroll'}{'co-owners'}) { + $designhash{$udom.'.autoassign.co-owners'}=$domconfig{'autoenroll'}{'co-owners'}; + } + } if (keys(%legacy) > 0) { my %legacyhash = &get_legacy_domconf($udom); foreach my $item (keys(%legacyhash)) { @@ -4117,41 +4373,132 @@ Returns: value of designparamter $which ############################################## sub designparm { my ($which,$domain)=@_; - if ($env{'browser.blackwhite'} eq 'on') { - if ($which=~/\.(font|alink|vlink|link|textcol)$/) { - return '#000000'; - } - if ($which=~/\.(pgbg|sidebg|bgcol)$/) { - return '#FFFFFF'; - } - if ($which=~/\.tabbg$/) { - return '#CCCCCC'; - } - } if (exists($env{'environment.color.'.$which})) { - return $env{'environment.color.'.$which}; + return $env{'environment.color.'.$which}; } $domain=&determinedomain($domain); my %domdesign = &get_domainconf($domain); my $output; if ($domdesign{$domain.'.'.$which} ne '') { - $output = $domdesign{$domain.'.'.$which}; + $output = $domdesign{$domain.'.'.$which}; } else { $output = $defaultdesign{$which}; } if (($which =~ /^(student|coordinator|author|admin)\.img$/) || ($which =~ /login\.(img|logo|domlogo|login)/)) { if ($output =~ m{^/(adm|res)/}) { - if ($output =~ m{^/res/}) { - my $local_name = &Apache::lonnet::filelocation('',$output); - &Apache::lonnet::repcopy($local_name); - } + if ($output =~ m{^/res/}) { + my $local_name = &Apache::lonnet::filelocation('',$output); + &Apache::lonnet::repcopy($local_name); + } $output = &lonhttpdurl($output); } } return $output; } +############################################## +=pod + +=item * &authorspace() + +Inputs: ./. + +Returns: Path to the Construction Space of the current user's + accessed author space + The author space will be that of the current user + when accessing the own author space + and that of the co-author/assistent co-author + when accessing the co-author's/assistent co-author's + space + +=cut + +sub authorspace { + my $caname = ''; + if ($env{'request.role'} =~ /^ca|^aa/) { + (undef,$caname) = + ($env{'request.role'}=~/($match_domain)\/($match_username)$/); + } else { + $caname = $env{'user.name'}; + } + return '/priv/'.$caname.'/'; +} + +############################################## +=pod + +=item * &head_subbox() + +Inputs: $content (contains HTML code with page functions, etc.) + +Returns: HTML div with $content + To be included in page header + +=cut + +sub head_subbox { + my ($content)=@_; + my $output = + '
' + .$content + .'
' +} + +############################################## +=pod + +=item * &CSTR_pageheader() + +Inputs: ./. + +Returns: HTML div with CSTR path and recent box + To be included on Construction Space pages + +=cut + +sub CSTR_pageheader { + # this is for resources; directories have customtitle, and crumbs + # and select recent are created in lonpubdir.pm + my ($uname,$thisdisfn)= + ($env{'request.filename'} =~ m|^/home/([^/]+)/public_html/(.*)|); + my $formaction='/priv/'.$uname.'/'.$thisdisfn; + $formaction=~s/\/+/\//g; + + my $parentpath = ''; + my $lastitem = ''; + if ($thisdisfn =~ m-(.+/)([^/]*)$-) { + $parentpath = $1; + $lastitem = $2; + } else { + $lastitem = $thisdisfn; + } + + my $output = + '
' + .&Apache::loncommon::help_open_menu('','',3,'Authoring') #FIXME: Broken? Where is it? + .''.&mt('Construction Space:').' ' + .'
' #FIXME lonpubdir: target="_parent" + .&Apache::lonhtmlcommon::crumbs($uname.'/'.$parentpath,'_top','/priv',undef,undef); + + if ($lastitem) { + $output .= + '' + .$lastitem + .''; + } + $output .= + '
' + #FIXME lonpubdir: &Apache::lonhtmlcommon::crumbs($uname.$thisdisfn.'/','_top','/priv','','+1',1)."
" + .&Apache::lonhtmlcommon::select_recent('construct','recent','this.form.action=this.form.recent.value;this.form.submit()') + .'
' + .&Apache::lonmenu::constspaceform() + .'
'; + + return $output; +} + ############################################### ############################################### @@ -4184,20 +4531,15 @@ Inputs: =item * $forcereg, if page should register as content page (relevant for text interface only) -=item * $customtitle, alternate text to use instead of $title - in the title box that appears, this text - is not auto translated like the $title is - -=item * $notopbar, if true, keep the 'what is this' info but remove the - navigational links +=item * $no_nav_bar, if true, keep the 'what is this' info but remove the + navigational links =item * $bgcolor, used to override the bgcolor on a webpage to a specific value -=item * $notitle, if true keep the nav controls, but remove the title bar - -=item * $no_inline_link, if true and in remote mode, don't show the - 'Switch To Inline Menu' link - +#SD +#RC =item * $no_inline_link, if true and in remote mode, don't show the +#RC 'Switch To Inline Menu' link +#RC =item * $args, optional argument valid values are no_auto_mt_title -> prevents &mt()ing the title arg inherit_jsmath -> when creating popup window in a page, @@ -4214,9 +4556,14 @@ other decorations will be returned. =cut sub bodytag { - my ($title,$function,$addentries,$bodyonly,$domain,$forcereg,$customtitle, - $notopbar,$bgcolor,$notitle,$no_inline_link,$args)=@_; + my ($title,$function,$addentries,$bodyonly,$domain,$forcereg, + $no_nav_bar,$bgcolor,$no_inline_link,$args)=@_; + my $public; + if ((($env{'user.name'} eq 'public') && ($env{'user.domain'} eq 'public')) + || ($env{'user.name'} eq '') && ($env{'user.domain'} eq '')) { + $public = 1; + } if (!$args->{'no_auto_mt_title'}) { $title = &mt($title); } $function = &get_users_function() if (!$function); @@ -4224,7 +4571,7 @@ sub bodytag { my $font = &designparm($function.'.font',$domain); my $pgbg = $bgcolor || &designparm($function.'.pgbg',$domain); - my %design = ( 'style' => 'margin-top: 0px', + my %design = ( 'style' => 'margin-top: 0', 'bgcolor' => $pgbg, 'text' => $font, 'alink' => &designparm($function.'.alink',$domain), @@ -4243,6 +4590,9 @@ sub bodytag { if ($env{'request.role'} !~ /^cr/) { $role = &Apache::lonnet::plaintext($role,&course_type()); } + if ($env{'request.course.sec'}) { + $role .= (' 'x2).'- '.&mt('section:').' '.$env{'request.course.sec'}; + } $realm = $env{'course.'.$env{'request.course.id'}.'.description'}; } else { $role = &Apache::lonnet::plaintext($role); @@ -4263,31 +4613,13 @@ sub bodytag { } my $name = &plainname($env{'user.name'},$env{'user.domain'}); - if ($env{'user.name'} eq 'public' && $env{'user.domain'} eq 'public') { + if ($public) { undef($role); } else { $name = &aboutmewrapper($name,$env{'user.name'},$env{'user.domain'}); } - my $roleinfo=(< -
- $name -   -
-
-$role  -
-
-$realm  -
- -ENDROLE - my $titleinfo = '

'.$title.'

'; - if ($customtitle) { - $titleinfo = $customtitle; - } # # Extra info if you are the DC my $dc_info = ''; @@ -4295,93 +4627,76 @@ ENDROLE $env{'course.'.$env{'request.course.id'}. '.domain'}.'/'})) { my $cid = $env{'request.course.id'}; - $dc_info.= $cid.' '.$env{'course.'.$cid.'.internal.coursecode'}; + $dc_info = $cid.' '.$env{'course.'.$cid.'.internal.coursecode'}; $dc_info =~ s/\s+$//; - $dc_info = '('.$dc_info.')'; } - if (($env{'environment.remote'} eq 'off') || ($args->{'suppress_header_logos'})) { + $role = '('.$role.')' if $role; + &get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['inhibitmenu']); + # No Remote - if ($env{'request.state'} eq 'construct') { - $forcereg=1; - } + if ($no_nav_bar || $env{'form.inhibitmenu'} eq 'yes') { + return $bodytag; + } - if (!$customtitle && $env{'request.state'} eq 'construct') { - # this is for resources; directories have customtitle, and crumbs - # and select recent are created in lonpubdir.pm - my ($uname,$thisdisfn)= - ($env{'request.filename'} =~ m|^/home/([^/]+)/public_html/(.*)|); - my $formaction='/priv/'.$uname.'/'.$thisdisfn; - $formaction=~s/\/+/\//g; - - my $parentpath = ''; - my $lastitem = ''; - if ($thisdisfn =~ m-(.+/)([^/]*)$-) { - $parentpath = $1; - $lastitem = $2; - } else { - $lastitem = $thisdisfn; - } - $titleinfo = - &Apache::loncommon::help_open_menu('','',3,'Authoring') - .''.&mt('Construction Space').': ' - .'
' - .&Apache::lonhtmlcommon::crumbs($uname.'/'.$parentpath,'_top','/priv','','+1',1)."$lastitem
" - .&Apache::lonhtmlcommon::select_recent('construct','recent','this.form.action=this.form.recent.value;this.form.submit()') - .'
' - .&Apache::lonmenu::constspaceform(); - } - - my $titletable; - if (!$notitle) { - $titletable = - ''. - "".$roleinfo. - '
$titleinfo $dc_info
'; - } - if ($notopbar) { - $bodytag .= $titletable; - } else { - if ($env{'request.state'} eq 'construct') { - $bodytag .= &Apache::lonmenu::menubuttons($forcereg,$forcereg, - $titletable); - } else { - $bodytag .= &Apache::lonmenu::menubuttons($forcereg,$forcereg). - $titletable; + if ($env{'request.state'} eq 'construct') { $forcereg=1; } + + # if ($env{'request.state'} eq 'construct') { + # $titleinfo = &CSTR_pageheader(); #FIXME: Will be removed once all scripts have their own calls + # } + + + + if ($env{'request.noversionuri'} =~ m{^/res/adm/pages/}) { + if ($dc_info) { + $dc_info = qq|$dc_info|; + } + $bodytag .= qq|
$name $role
+ $realm $dc_info
|; + return $bodytag; + } + + unless ($env{'request.symb'} =~ m/\.page___\d+___/) { + $bodytag .= qq|
$name $role
|; + } + + $bodytag .= Apache::lonhtmlcommon::scripttag( + Apache::lonmenu::utilityfunctions(), 'start'); + + $bodytag .= Apache::lonmenu::primary_menu(); + + if ($dc_info) { + $dc_info = &dc_courseid_toggle($dc_info); + } + $bodytag .= qq|
$realm $dc_info
|; + + #don't show menus for public users + if (!$public){ + $bodytag .= Apache::lonmenu::secondary_menu(); + $bodytag .= Apache::lonmenu::serverform(); + $bodytag .= Apache::lonhtmlcommon::scripttag('', 'end'); + if ($env{'request.state'} eq 'construct') { + $bodytag .= &Apache::lonmenu::innerregister($forcereg,'', + $args->{'bread_crumbs'}); + } elsif ($forcereg) { + $bodytag .= &Apache::lonmenu::innerregister($forcereg); } + }else{ + # this is to seperate menu from content when there's no secondary + # menu. Especially needed for public accessible ressources. + $bodytag .= '
'; + $bodytag .= Apache::lonhtmlcommon::scripttag('', 'end'); } - return $bodytag; - } -# -# Top frame rendering, Remote is up -# + return $bodytag; +} - my $imgsrc = $img; - if ($img =~ /^\/adm/) { - $imgsrc = &lonhttpdurl($img); - } - my $upperleft=''.$function.''; - - # Explicit link to get inline menu - my $menu= ($no_inline_link?'' - :'
'.&mt('Switch to Inline Menu Mode').''); - # - if ($notitle) { - return $bodytag; - } - return(< -$upperleft - $messages  - -$titleinfo $dc_info $menu -$roleinfo - - -ENDBODY +sub dc_courseid_toggle { + my ($dc_info) = @_; + return ' '. + ''. + &mt('(More ...)').''. + '
'.$dc_info.'
'; } sub make_attr_string { @@ -4405,31 +4720,8 @@ sub make_attr_string { delete($attr_ref->{$key}); } } - $attr_ref->{'onload'} = - &Apache::lonmenu::loadevents(). $on_load; - $attr_ref->{'onunload'}= - &Apache::lonmenu::unloadevents().$on_unload; - } - -# Accessibility font enhance - if ($env{'browser.fontenhance'} eq 'on') { - my $style; - foreach my $key (keys(%{$attr_ref})) { - if (lc($key) eq 'style') { - $style.=$attr_ref->{$key}.';'; - delete($attr_ref->{$key}); - } - } - $attr_ref->{'style'}=$style.'; font-size: x-large;'; - } - - if ($env{'browser.blackwhite'} eq 'on') { - delete($attr_ref->{'font'}); - delete($attr_ref->{'link'}); - delete($attr_ref->{'alink'}); - delete($attr_ref->{'vlink'}); - delete($attr_ref->{'bgcolor'}); - delete($attr_ref->{'background'}); + $attr_ref->{'onload'} = $on_load; + $attr_ref->{'onunload'}= $on_unload; } my $attr_string; @@ -4492,6 +4784,7 @@ sub standard_css { my $img = &designparm($function.'.img', $domain); my $tabbg = &designparm($function.'.tabbg', $domain); my $font = &designparm($function.'.font', $domain); + my $fontmenu = &designparm($function.'.fontmenu', $domain); #second colour for later usage my $sidebg = &designparm($function.'.sidebg',$domain); my $pgbg_or_bgcolor = @@ -4508,9 +4801,9 @@ sub standard_css { my $sans = 'Verdana,Arial,Helvetica,sans-serif'; my $mono = 'monospace'; - my $data_table_head = $tabbg; - my $data_table_light = '#EEEEEE'; - my $data_table_dark = '#DDDDDD'; + my $data_table_head = $sidebg; + my $data_table_light = '#FAFAFA'; + my $data_table_dark = '#F0F0F0'; my $data_table_darker = '#CCCCCC'; my $data_table_highlight = '#FFFF00'; my $mail_new = '#FFBB77'; @@ -4523,63 +4816,69 @@ sub standard_css { my $mail_other_hover = '#669999'; my $table_header = '#DDDDDD'; my $feedback_link_bg = '#BBBBBB'; - my $lg_border_color = '#C8C8C8'; + my $lg_border_color = '#C8C8C8'; + my $button_hover = '#BF2317'; my $border = ($env{'browser.type'} eq 'explorer' || - $env{'browser.type'} eq 'safari' ) ? '0px 2px 0px 2px' - : '0px 3px 0px 4px'; + $env{'browser.type'} eq 'safari' ) ? '0 2px 0 2px' + : '0 3px 0 4px'; return < td { background-color: #CCCCCC; font-weight: bold; text-align: left; } -table.LC_data_table tr.LC_odd_row > td, -table.LC_pick_box tr > td.LC_odd_row, -table.LC_aboutme_port tr td { +table.LC_data_table tr.LC_odd_row > td { background-color: $data_table_light; padding: 2px; + vertical-align: top; +} + +table.LC_pick_box tr > td.LC_odd_row { + background-color: $data_table_light; + vertical-align: top; } -table.LC_data_table tr.LC_even_row > td, -table.LC_pick_box tr > td.LC_even_row, -table.LC_aboutme_port tr.LC_even_row td { +table.LC_data_table tr.LC_even_row > td { background-color: $data_table_dark; padding: 2px; + vertical-align: top; +} + +table.LC_pick_box tr > td.LC_even_row { + background-color: $data_table_dark; + vertical-align: top; } table.LC_data_table tr.LC_data_table_highlight td { @@ -4929,19 +5191,30 @@ table.LC_data_table tr td.LC_leftcol_hea table.LC_data_table tr.LC_empty_row td, table.LC_nested tr.LC_empty_row td { - background-color: #FFFFFF; font-weight: bold; font-style: italic; text-align: center; padding: 8px; } +table.LC_data_table tr.LC_empty_row td { + background-color: $sidebg; +} + +table.LC_nested tr.LC_empty_row td { + background-color: #FFFFFF; +} + +table.LC_caption { +} + table.LC_nested tr.LC_empty_row td { padding: 4ex } table.LC_nested_outer tr th { font-weight: bold; + color:$fontmenu; background-color: $data_table_head; font-size: small; border-bottom: 1px solid #000000; @@ -4979,6 +5252,22 @@ table.LC_nested tr td.LC_right_item { text-align: right; } +.ui-accordion table.LC_nested tr.LC_odd_row td.LC_left_item, +.ui-accordion table.LC_nested tr.LC_even_row td.LC_left_item { + text-align: right; + width: 40%; + padding-right:10px; + vertical-align: top; + padding: 5px; +} + +.ui-accordion table.LC_nested tr.LC_odd_row td.LC_right_item, +.ui-accordion table.LC_nested tr.LC_even_row td.LC_right_item { + text-align: left; + width: 60%; + padding: 2px 4px; +} + table.LC_nested tr.LC_odd_row td { background-color: #EEEEEE; } @@ -4999,6 +5288,7 @@ table.LC_createuser tr.LC_info_row td { table.LC_calendar { border: 1px solid #000000; border-collapse: collapse; + width: 98%; } table.LC_calendar_pickdate { @@ -5008,6 +5298,7 @@ table.LC_calendar_pickdate { table.LC_calendar tr td { border: 1px solid #000000; vertical-align: top; + width: 14%; } table.LC_calendar tr td.LC_calendar_day_empty { @@ -5018,47 +5309,47 @@ table.LC_calendar tr td.LC_calendar_day_ background-color: $data_table_highlight; } -table.LC_mail_list tr.LC_mail_new { +table.LC_data_table tr td.LC_mail_new { background-color: $mail_new; } -table.LC_mail_list tr.LC_mail_new:hover { +table.LC_data_table tr.LC_mail_new:hover { background-color: $mail_new_hover; } -table.LC_mail_list tr.LC_mail_even { -} - -table.LC_mail_list tr.LC_mail_odd { -} - -table.LC_mail_list tr.LC_mail_read { +table.LC_data_table tr td.LC_mail_read { background-color: $mail_read; } -table.LC_mail_list tr.LC_mail_read:hover { +/* +table.LC_data_table tr.LC_mail_read:hover { background-color: $mail_read_hover; } +*/ -table.LC_mail_list tr.LC_mail_replied { +table.LC_data_table tr td.LC_mail_replied { background-color: $mail_replied; } -table.LC_mail_list tr.LC_mail_replied:hover { +/* +table.LC_data_table tr.LC_mail_replied:hover { background-color: $mail_replied_hover; } +*/ -table.LC_mail_list tr.LC_mail_other { +table.LC_data_table tr td.LC_mail_other { background-color: $mail_other; } -table.LC_mail_list tr.LC_mail_other:hover { +/* +table.LC_data_table tr.LC_mail_other:hover { background-color: $mail_other_hover; } +*/ table.LC_data_table tr > td.LC_browser_file, table.LC_data_table tr > td.LC_browser_file_published { - background: #CCFF88; + background: #AAEE77; } table.LC_data_table tr > td.LC_browser_file_locked, @@ -5067,40 +5358,40 @@ table.LC_data_table tr > td.LC_browser_f } table.LC_data_table tr > td.LC_browser_file_obsolete { - background: #AAAAAA; + background: #888888; } table.LC_data_table tr > td.LC_browser_file_modified, table.LC_data_table tr > td.LC_browser_file_metamodified { - background: #FFFF77; + background: #F8F866; } table.LC_data_table tr.LC_browser_folder > td { - background: #CCCCFF; + background: #E0E8FF; } table.LC_data_table tr > td.LC_roles_is { -/* background: #77FF77; */ + /* background: #77FF77; */ } table.LC_data_table tr > td.LC_roles_future { - background: #FFFF77; + border-right: 8px solid #FFFF77; } table.LC_data_table tr > td.LC_roles_will { - background: #FFAA77; + border-right: 8px solid #FFAA77; } table.LC_data_table tr > td.LC_roles_expired { - background: #FF7777; + border-right: 8px solid #FF7777; } table.LC_data_table tr > td.LC_roles_will_not { - background: #AAFF77; + border-right: 8px solid #AAFF77; } table.LC_data_table tr > td.LC_roles_selected { - background: #11CC55; + border-right: 8px solid #11CC55; } span.LC_current_location { @@ -5110,7 +5401,6 @@ span.LC_current_location { span.LC_parm_menu_item { font-size: larger; - font-family: $sans; } span.LC_parm_scope_all { @@ -5129,7 +5419,8 @@ span.LC_parm_part { color: blue; } -span.LC_parm_folder, span.LC_parm_symb { +span.LC_parm_folder, +span.LC_parm_symb { font-size: x-small; font-family: $mono; color: #AAAAAA; @@ -5158,21 +5449,20 @@ table.LC_parm_overview_restrictions th { } table#LC_helpmenu { - border: 0px; + border: none; height: 55px; - border-spacing: 0px; + border-spacing: 0; } table#LC_helpmenu fieldset legend { font-size: larger; - font-weight: bold; } table#LC_helpmenu_links { width: 100%; border: 1px solid black; background: $pgbg; - padding: 0px; + padding: 0; border-spacing: 1px; } @@ -5218,22 +5508,14 @@ table.LC_pick_box { } table.LC_pick_box td.LC_pick_box_title { - background: $tabbg; + background: $sidebg; font-weight: bold; - text-align: right; + text-align: left; vertical-align: top; width: 184px; padding: 8px; } -table.LC_pick_box td.LC_selfenroll_pick_box_title { - background: $tabbg; - font-weight: bold; - text-align: right; - width: 350px; - padding: 8px; -} - table.LC_pick_box td.LC_pick_box_value { text-align: left; padding: 8px; @@ -5245,7 +5527,7 @@ table.LC_pick_box td.LC_pick_box_select } table.LC_pick_box td.LC_pick_box_separator { - padding: 0px; + padding: 0; height: 1px; background: black; } @@ -5266,40 +5548,6 @@ table.LC_pick_box td.LC_oddrow_value { background-color: $data_table_light; } -table.LC_helpform_receipt { - width: 620px; - border-collapse: separate; - background: white; - border: 1px solid black; - border-spacing: 1px; -} - -table.LC_helpform_receipt td.LC_pick_box_title { - background: $tabbg; - font-weight: bold; - text-align: right; - width: 184px; - padding: 8px; -} - -table.LC_helpform_receipt td.LC_evenrow_value { - text-align: left; - padding: 8px; - background-color: $data_table_light; -} - -table.LC_helpform_receipt td.LC_oddrow_value { - text-align: left; - padding: 8px; - background-color: $data_table_light; -} - -table.LC_helpform_receipt td.LC_pick_box_separator { - padding: 0px; - height: 1px; - background: black; -} - span.LC_helpform_receipt_cat { font-weight: bold; } @@ -5335,7 +5583,7 @@ table.LC_group_priv_box td.LC_groups_fun table.LC_group_priv td { text-align: left; - padding: 0px; + padding: 0; } table.LC_notify_front_page { @@ -5353,20 +5601,18 @@ table.LC_notify_front_page td { } .LC_topic_bar { - font-family: $sans; font-weight: bold; - width: 100%; background: $tabbg; - vertical-align: middle; - margin: 2ex 0ex 2ex 0ex; + margin: 1em 0em 1em 2em; + padding: 3px; + font-size: 1.2em; } .LC_topic_bar span { + left: 0.5em; + position: absolute; vertical-align: middle; -} - -.LC_topic_bar img { - vertical-align: bottom; + font-size: 1.2em; } table.LC_course_group_status { @@ -5379,25 +5625,47 @@ table.LC_status_selector td { padding: 4px; } -table.LC_descriptive_input td.LC_description { - vertical-align: top; - text-align: right; - font-weight: bold; -} - div.LC_feedback_link { clear: both; - background: white; + background: $sidebg; width: 100%; + padding-bottom: 10px; + border: 1px $tabbg solid; + height: 22px; + line-height: 22px; + padding-top: 5px; +} + +div.LC_feedback_link img { + height: 22px; + vertical-align:middle; +} + +div.LC_feedback_link a { + text-decoration: none; +} + +div.LC_comblock { + display:inline; + color:$font; + font-size:90%; +} + +div.LC_feedback_link div.LC_comblock { + padding-left:5px; +} + +div.LC_feedback_link div.LC_comblock a { + color:$font; } span.LC_feedback_link { - background: $feedback_link_bg; + /* background: $feedback_link_bg; */ font-size: larger; } span.LC_message_link { - background: $feedback_link_bg; + /* background: $feedback_link_bg; */ font-size: larger; position: absolute; right: 1em; @@ -5415,14 +5683,12 @@ table.LC_prior_tries td { .LC_answer_correct { background: lightgreen; - font-family: $sans; color: darkgreen; padding: 6px; } .LC_answer_charged_try { background: #FFAAAA; - font-family: $sans; color: darkred; padding: 6px; } @@ -5431,28 +5697,24 @@ table.LC_prior_tries td { .LC_answer_no_grade, .LC_answer_late { background: lightyellow; - font-family: $sans; color: black; padding: 6px; } .LC_answer_previous { background: lightblue; - font-family: $sans; color: darkblue; padding: 6px; } .LC_answer_no_message { background: #FFFFFF; - font-family: $sans; color: black; padding: 6px; } .LC_answer_unknown { background: orange; - font-family: $sans; color: black; padding: 6px; } @@ -5462,12 +5724,12 @@ span.LC_prior_string, span.LC_prior_custom, span.LC_prior_reaction, span.LC_prior_math { - font-family: monospace; + font-family: $mono; white-space: pre; } span.LC_prior_string { - font-family: monospace; + font-family: $mono; white-space: pre; } @@ -5476,7 +5738,7 @@ table.LC_prior_option { border-collapse: collapse; } -table.LC_prior_rank, +table.LC_prior_rank, table.LC_prior_match { border-collapse: collapse; } @@ -5487,8 +5749,7 @@ table.LC_prior_match tr td { border: 1px solid #000000; } -td.LC_nobreak, -span.LC_nobreak { +.LC_nobreak { white-space: nowrap; } @@ -5501,32 +5762,24 @@ span.LC_cusr_subheading { font-size: 85%; } -table.LC_docs_documents { - background: #BBBBBB; - border-width: 0px; - border-collapse: collapse; -} - -table.LC_docs_documents td.LC_docs_document { - border: 2px solid black; - padding: 4px; -} - -.LC_docs_entry_move { - border: 0px; - border-collapse: collapse; -} - -.LC_docs_entry_move td { - border: 2px solid #BBBBBB; +div.LC_docs_entry_move { + border: 1px solid #BBBBBB; background: #DDDDDD; + width: 22px; + padding: 1px; + margin: 0; } -.LC_docs_editor td.LC_docs_entry_commands { +table.LC_data_table tr > td.LC_docs_entry_commands, +table.LC_data_table tr > td.LC_docs_entry_parameter { background: #DDDDDD; font-size: x-small; } +.LC_docs_entry_parameter { + white-space: nowrap; +} + .LC_docs_copy { color: #000099; } @@ -5548,17 +5801,6 @@ table.LC_docs_documents td.LC_docs_docum font-size: x-small; } -.LC_docs_editor td.LC_docs_entry_title, -.LC_docs_editor td.LC_docs_entry_icon { - background: #FFFFBB; -} - -.LC_docs_editor td.LC_docs_entry_parameter { - background: #BBBBFF; - font-size: x-small; - white-space: nowrap; -} - table.LC_docs_adddocs td, table.LC_docs_adddocs th { border: 1px solid #BBBBBB; @@ -5575,7 +5817,7 @@ table.LC_sty_end { } table.LC_double_column { - border-width: 0px; + border-width: 0; border-collapse: collapse; width: 100%; padding: 2px; @@ -5595,10 +5837,6 @@ table.LC_double_column tr td.LC_right_co vertical-align: top; } -span.LC_role_level { - font-weight: bold; -} - div.LC_left_float { float: left; padding-right: 5%; @@ -5615,56 +5853,41 @@ div.LC_clear_float_footer { } div.LC_grade_show_user { - margin-top: 20px; - border: 1px solid black; +/* border-left: 5px solid $sidebg; */ + border-top: 5px solid #000000; + margin: 50px 0 0 0; + padding: 15px 0 5px 10px; } -div.LC_grade_user_name { - background: #DDDDEE; - border-bottom: 1px solid black; - font-weight: bold; - font-size: large; +div.LC_grade_show_user_odd_row { +/* border-left: 5px solid #000000; */ } -div.LC_grade_show_user_odd_row div.LC_grade_user_name { - background: #DDEEDD; +div.LC_grade_show_user div.LC_Box { + margin-right: 50px; } -div.LC_grade_show_problem, div.LC_grade_submissions, div.LC_grade_message_center, -div.LC_grade_info_links, -div.LC_grade_assign { +div.LC_grade_info_links { margin: 5px; width: 99%; background: #FFFFFF; } -div.LC_grade_show_problem_header, div.LC_grade_submissions_header, -div.LC_grade_message_center_header, -div.LC_grade_assign_header { +div.LC_grade_message_center_header { font-weight: bold; font-size: large; } -div.LC_grade_show_problem_problem, div.LC_grade_submissions_body, -div.LC_grade_message_center_body, -div.LC_grade_assign_body { +div.LC_grade_message_center_body { border: 1px solid black; width: 99%; background: #FFFFFF; } -span.LC_grade_check_note { - font-weight: normal; - font-size: medium; - display: inline; - position: absolute; - right: 1em; -} - table.LC_scantron_action { width: 100%; } @@ -5690,12 +5913,6 @@ div.LC_edit_problem_editxml_header div { margin-top: 5px; } -div.LC_edit_problem_header_edit_row { - background: $tabbg; - padding: 3px; - margin-bottom: 5px; -} - div.LC_edit_problem_header_title { font-weight: bold; font-size: larger; @@ -5704,15 +5921,8 @@ div.LC_edit_problem_header_title { } table.LC_edit_problem_header_title { - font-size: larger; - font-weight: bold; width: 100%; - border-color: $pgbg; - border-style: solid; - border-width: $border; background: $tabbg; - border-collapse: collapse; - padding: 0px } div.LC_edit_problem_discards { @@ -5725,289 +5935,343 @@ div.LC_edit_problem_saves { padding-bottom: 5px; } -hr.LC_edit_problem_divide { - clear: both; - color: $tabbg; - background-color: $tabbg; - height: 3px; - border: 0px; -} - -img.stift{ - border-width:0; - vertical-align:middle; -} - -table#LC_mainmenu{ - margin-top:10px; - width:80%; +img.stift { + border-width: 0; + vertical-align: middle; } -table#LC_mainmenu td.LC_mainmenu_col_fieldset{ +table td.LC_mainmenu_col_fieldset { vertical-align: top; - width: 45%; -} - -.LC_mainmenu_fieldset_category { - color: $font; - background: $pgbg; - font-family: $sans; - font-size: small; - font-weight: bold; } div.LC_createcourse { - margin: 10px 10px 10px 10px; + margin: 10px 10px 10px 10px; } -/* ---- Remove when done ---- -# The following styles is part of the redesign of LON-CAPA and are -# subject to change during this project. -# Don't rely on their current functionality as they might be -# changed or removed. -# --------------------------*/ +.LC_dccid { + margin: 0.2em 0 0 0; + padding: 0; + font-size: 90%; + display:none; +} a:hover, -ol.LC_smallMenu a:hover, +ol.LC_primary_menu a:hover, ol#LC_MenuBreadcrumbs a:hover, ol#LC_PathBreadcrumbs a:hover, -ul#LC_TabMainMenuContent a:hover, +ul#LC_secondary_menu a:hover, .LC_FormSectionClearButton input:hover ul.LC_TabContent li:hover a { - color:#BF2317; - text-decoration:none; + color:$button_hover; + text-decoration:none; } h1 { - padding:5px 10px 5px 20px; - line-height:130%; + padding: 0; + line-height:130%; } -h2,h3,h4,h5,h6 { - margin:5px 0px 5px 0px; - padding:0px; - line-height:130%; +h2, +h3, +h4, +h5, +h6 { + margin: 5px 0 5px 0; + padding: 0; + line-height:130%; } .LC_hcell { - padding:3px 15px 3px 15px; - margin:0px; - background-color:$tabbg; - border-bottom:solid 1px $lg_border_color; + padding:3px 15px 3px 15px; + margin: 0; + background-color:$tabbg; + color:$fontmenu; + border-bottom:solid 1px $lg_border_color; +} + +.LC_Box > .LC_hcell { + margin: 0 -10px 10px -10px; } .LC_noBorder { - border:0px; + border: 0; +} + +.LC_FormSectionClearButton input { + background-color:transparent; + border: none; + cursor:pointer; + text-decoration:underline; } +.LC_help_open_topic { + color: #FFFFFF; + background-color: #EEEEFF; + margin: 1px; + padding: 4px; + border: 1px solid #000033; + white-space: nowrap; + /* vertical-align: middle; */ +} -/* Main Header with discription of Person, Course, etc. */ +dl, +ul, +div, +fieldset { + margin: 10px 10px 10px 0; + /* overflow: hidden; */ +} -.LC_Right { - float: right; - margin: 0px; - padding: 0px; +fieldset > legend { + font-weight: bold; + padding: 0 5px 0 5px; } -.LC_FormSectionClearButton input { - background-color:transparent; - border:0px; - cursor:pointer; - text-decoration:underline; +#LC_nav_bar { + float: left; + margin: 0; } -.LC_help_open_topic { - color: #FFFFFF; - background-color: #EEEEFF; - margin: 1px; - padding: 4px; - border: 1px solid #000033; - white-space: nowrap; -/* vertical-align: middle; */ +#LC_realm { + margin: 0.2em 0 0 0; + padding: 0; + font-weight: bold; + text-align: center; } -dl,ul,div,fieldset { - margin: 10px 10px 10px 0px; - overflow:hidden; +#LC_nav_bar em { + font-weight: bold; + font-style: normal; } -ol.LC_smallMenu, ol#LC_PathBreadcrumbs { - margin: 0px; +ol.LC_primary_menu { + float: right; + margin: 0; } -ol.LC_smallMenu li { - display: inline; - padding: 5px 5px 0px 10px; - vertical-align: top; +ol#LC_PathBreadcrumbs { + margin: 0; } -ol.LC_smallMenu li img { - vertical-align: bottom; +ol.LC_primary_menu li { + display: inline; + padding: 5px 5px 0 10px; + vertical-align: top; } -ol.LC_smallMenu a { - font-size: 90%; - color: RGB(80, 80, 80); - text-decoration: none; +ol.LC_primary_menu li img { + vertical-align: bottom; + height: 1.1em; } -ol#LC_TabMainMenuContent, -ul.LC_TabContent , -ul.LC_TabContentBigger { - display:block; - list-style:none; - margin: 0px; - padding: 0px; +ol.LC_primary_menu a { + color: RGB(80, 80, 80); + text-decoration: none; +} + +ol.LC_primary_menu a.LC_new_message { + font-weight:bold; + color: darkred; +} + +ul#LC_secondary_menu { + clear: both; + color: $fontmenu; + background: $tabbg; + list-style: none; + padding: 0; + margin: 0; + width: 100%; +} + +ul#LC_secondary_menu li { + font-weight: bold; + line-height: 1.8em; + padding: 0 0.8em; + border-right: 1px solid black; + display: inline; + vertical-align: middle; +} + +ul.LC_TabContent { + display:block; + background: $sidebg; + border-bottom: solid 1px $lg_border_color; + list-style:none; + margin: 0 -10px; + padding: 0; } -ol#LC_TabMainMenuContent li, ul.LC_TabContent li, ul.LC_TabContentBigger li { - display: inline; - border-right: solid 1px $lg_border_color; - float:left; - line-height:140%; - white-space:nowrap; -} - -ol#LC_TabMainMenuContent li { - vertical-align: bottom; - border-bottom: solid 1px RGB(175, 175, 175); - padding: 5px 10px 5px 10px; - margin-right:5px; - margin-bottom:3px; - font-weight: bold; - background: url(/adm/lonIcons/lightGreyBG.png) repeat-x left top; -} - -ol#LC_TabMainMenuContent li a { - color: RGB(47, 47, 47); - text-decoration: none; + float:left; +} + +ul#LC_secondary_menu li a { + color: $fontmenu; + text-decoration: none; } ul.LC_TabContent { - min-height:1.6em; + min-height:20px; } ul.LC_TabContent li { - vertical-align:middle; - padding:0px 10px 0px 10px; - background-color:$tabbg; - border-bottom:solid 1px $lg_border_color; -} - -ul.LC_TabContent li a, ul.LC_TabContent li { - color:rgb(47,47,47); - text-decoration:none; - font-size:95%; - font-weight:bold; - padding-right: 16px; -} - -ul.LC_TabContent li:hover, ul.LC_TabContent li.active { - background:#FFFFFF url(/adm/lonIcons/open.gif) no-repeat scroll right center; - border-bottom:solid 1px #FFFFFF; - padding-right: 16px; + vertical-align:middle; + padding: 0 10px 0 10px; + background-color:$tabbg; + border-bottom:solid 1px $lg_border_color; + border-right: solid 1px $font; } -ul.LC_TabContentBigger li { - vertical-align:bottom; - border-top:solid 1px $lg_border_color; - border-left:solid 1px $lg_border_color; - padding:5px 10px 5px 10px; - margin-left:2px; - background:url(/adm/lonIcons/lightGreyBG.png) repeat-x left top; +ul.LC_TabContent .right { + float:right; +} + +ul.LC_TabContent li a, +ul.LC_TabContent li { + color:rgb(47,47,47); + text-decoration:none; + font-size:95%; + font-weight:bold; + padding-right: 16px; + min-height:20px; +} + +ul.LC_TabContent li a:hover { + color: $button_hover; +} + +ul.LC_TabContent li:hover { + color: $button_hover; + cursor:pointer; +} + +ul.LC_TabContent li.active { + color: $font; + background:#FFFFFF url(/adm/lonIcons/open.gif) no-repeat scroll right center; + border-bottom:solid 1px #FFFFFF; + cursor: default; } -ul.LC_TabContentBigger li:hover, -ul.LC_TabContentBigger li.active { - background:url(/adm/lonIcons/lightGreyBG.png) repeat-x right bottom; +#maincoursedoc { + clear:both; +} + +ul.LC_TabContentBigger { + display:block; + list-style:none; + padding: 0; } -ul.LC_TabContentBigger li, +ul.LC_TabContentBigger li { + vertical-align:bottom; + height: 30px; + font-size:110%; + font-weight:bold; + color: #737373; +} + + ul.LC_TabContentBigger li a { - font-size:110%; - font-weight:bold; + background:url('/adm/lonIcons/tabbgleft.gif') left bottom no-repeat; + height: 30px; + line-height: 30px; + text-align: center; + display: block; + text-decoration: none; } -ol#LC_MenuBreadcrumbs, -ol#LC_PathBreadcrumbs, -ul.LC_CourseBreadcrumbs { - border-top: solid 1px RGB(255, 255, 255); - height: 20px; - line-height: 20px; - vertical-align: bottom; - margin: 0px 0px 30px 0px; - padding-left: 10px; - list-style-position: inside; - background: url(/adm/lonIcons/lightGreyBG.png) repeat-x left top; +ul.LC_TabContentBigger li:hover a, +ul.LC_TabContentBigger li.active a { + background:url('/adm/lonIcons/tabbgleft.gif') left top no-repeat; + color:$font; + text-decoration: underline; } -ol#LC_MenuBreadcrumbs li, -ol#LC_PathBreadcrumbs li, -ul.LC_CourseBreadcrumbs li { -/* - background: url(/adm/lonIcons/arrow_white.png) no-repeat left center; -*/ - display: inline; - padding: 0px 0px 0px 10px; -/* vertical-align: bottom; */ - overflow:hidden; + +ul.LC_TabContentBigger li b { + background: url('/adm/lonIcons/tabbgright.gif') no-repeat right bottom; + display: block; + float: left; + padding: 0 30px; } -ol#LC_MenuBreadcrumbs li a, ul.LC_CourseBreadcrumbs li a { - text-decoration: none; - font-size:90%; +ul.LC_TabContentBigger li:hover b, +ul.LC_TabContentBigger li.active b { + background:url('/adm/lonIcons/tabbgright.gif') right top no-repeat; + color:$font; + border-bottom: 1px solid #FFFFFF; } -ol#LC_PathBreadcrumbs li a { - text-decoration:none; - font-size:100%; - font-weight:bold; + +ul.LC_CourseBreadcrumbs { + background: $sidebg; + line-height: 32px; + padding-left: 10px; + margin: 0 0 10px 0; + list-style-position: inside; + } -.LC_BoxPadding { - padding: 10px; +ol#LC_MenuBreadcrumbs, +ol#LC_PathBreadcrumbs { + padding-left: 10px; + margin: 0; + height: 2.5em; /* equal to #LC_breadcrumbs line-height */ } -.LC_ContentBoxSpecial { - border: solid 1px $lg_border_color; +ol#LC_MenuBreadcrumbs li, +ol#LC_PathBreadcrumbs li, +ul.LC_CourseBreadcrumbs li { + display: inline; + white-space: normal; +} + +ol#LC_MenuBreadcrumbs li a, +ul.LC_CourseBreadcrumbs li a { + text-decoration: none; + font-size:90%; } -.LC_ContentBoxSpecialContactInfo { - border: solid 1px $lg_border_color; - max-width:25%; - min-width:25%; +ol#LC_PathBreadcrumbs li a { + text-decoration:none; + font-size:100%; + font-weight:bold; +} + +.LC_Box { + border: solid 1px $lg_border_color; + padding: 0 10px 10px 10px; } .LC_AboutMe_Image { - float:left; - margin-right:10px; + float:left; + margin-right:10px; } .LC_Clear_AboutMe_Image { - clear:left; + clear:left; } dl.LC_ListStyleClean dt { - padding-right: 5px; - display: table-header-group; + padding-right: 5px; + display: table-header-group; } dl.LC_ListStyleClean dd { - display: table-row; + display: table-row; } .LC_ListStyleClean, .LC_ListStyleSimple, .LC_ListStyleNormal, -.LC_ListStyle_Border, .LC_ListStyleSpecial { - /*display:block; */ - list-style-position: inside; - list-style-type: none; - overflow: hidden; - padding: 0px; + /* display:block; */ + list-style-position: inside; + list-style-type: none; + overflow: hidden; + padding: 0; } .LC_ListStyleSimple li, @@ -6016,231 +6280,226 @@ dl.LC_ListStyleClean dd { .LC_ListStyleNormal dd, .LC_ListStyleSpecial li, .LC_ListStyleSpecial dd { - margin: 0px; - padding: 5px 5px 5px 10px; - clear: both; + margin: 0; + padding: 5px 5px 5px 10px; + clear: both; } .LC_ListStyleClean li, .LC_ListStyleClean dd { - padding-top: 0px; - padding-bottom: 0px; + padding-top: 0; + padding-bottom: 0; } .LC_ListStyleSimple dd, .LC_ListStyleSimple li { - border-bottom: solid 1px $lg_border_color; + border-bottom: solid 1px $lg_border_color; } .LC_ListStyleSpecial li, .LC_ListStyleSpecial dd { - list-style-type: none; - background-color: RGB(220, 220, 220); - margin-bottom: 4px; + list-style-type: none; + background-color: RGB(220, 220, 220); + margin-bottom: 4px; } table.LC_SimpleTable { - margin:5px; - border:solid 1px $lg_border_color; + margin:5px; + border:solid 1px $lg_border_color; } table.LC_SimpleTable tr { - padding:0px; - border:solid 1px $lg_border_color; + padding: 0; + border:solid 1px $lg_border_color; } table.LC_SimpleTable thead { - background:rgb(220,220,220); + background:rgb(220,220,220); } div.LC_columnSection { - display: block; - clear: both; - overflow: hidden; - margin:0px; + display: block; + clear: both; + overflow: hidden; + margin: 0; } div.LC_columnSection>* { - float: left; - margin: 10px 20px 10px 0px; - overflow:hidden; -} - -.ContentBoxSpecialTemplate { - border: solid 1px $lg_border_color; -} - -.ContentBoxTemplate { - padding:10px; -} - -div.LC_columnSection > .ContentBoxTemplate, -div.LC_columnSection > .ContentBoxSpecialTemplate { - width: 600px; -} - -.clear { - clear: both; - line-height: 0px; - font-size: 0px; - height: 0px; + float: left; + margin: 10px 20px 10px 0; + overflow:hidden; } .LC_loginpage_container { - text-align:left; - margin : 0 auto; - width:90%; - padding: 10px; - height: auto; - background-color:#FFFFFF; - border:1px solid #CCCCCC; + text-align:left; + margin : 0 auto; + width:90%; + padding: 10px; + height: auto; + background-color:#FFFFFF; + border:1px solid #CCCCCC; } .LC_loginpage_loginContainer { - float:left; - width: 182px; - padding: 2px; - border:1px solid #CCCCCC; - background-color:$loginbg; + float:left; + width: 182px; + padding: 2px; + border:1px solid #CCCCCC; + background-color:$loginbg; } .LC_loginpage_loginContainer h2 { - margin-top:0; - display:block; - background:$bgcol; - color:$textcol; - padding-left:5px; + margin-top: 0; + display:block; + background:$bgcol; + color:$textcol; + padding-left:5px; } .LC_loginpage_loginInfo { - float:left; - width:182px; - border:1px solid #CCCCCC; - padding:2px; + float:left; + width:182px; + border:1px solid #CCCCCC; + padding:2px; } .LC_loginpage_space { - clear: both; - margin-bottom: 20px; - border-bottom: 1px solid #CCCCCC; + clear: both; + margin-bottom: 20px; + border-bottom: 1px solid #CCCCCC; } .LC_loginpage_floatLeft { - float: left; - width: 200px; - margin: 0; + float: left; + width: 200px; + margin: 0; } table em { - font-weight: bold; - font-style: normal; + font-weight: bold; + font-style: normal; } table.LC_tableBrowseRes, table.LC_tableOfContent { - border:none; - border-spacing: 1; - padding: 3px; - background-color: #FFFFFF; - font-size: 90%; + border:none; + border-spacing: 1px; + padding: 3px; + background-color: #FFFFFF; + font-size: 90%; } -table.LC_tableOfContent{ - border-collapse: collapse; +table.LC_tableOfContent { + border-collapse: collapse; } table.LC_tableBrowseRes a, table.LC_tableOfContent a { - background-color: transparent; - text-decoration: none; -} - -table.LC_tableBrowseRes tr.LC_trOdd, -table.LC_tableOfContent tr.LC_trOdd{ - background-color: #EEEEEE; + background-color: transparent; + text-decoration: none; } table.LC_tableOfContent img { - border: none; - height: 1.3em; - vertical-align: text-bottom; - margin-right: 0.3em; + border: none; + height: 1.3em; + vertical-align: text-bottom; + margin-right: 0.3em; } a#LC_content_toolbar_firsthomework { - background-image:url(/res/adm/pages/open-first-problem.gif); -} - -a#LC_content_toolbar_launchnav { - background-image:url(/res/adm/pages/start-navigation.gif); -} - -a#LC_content_toolbar_closenav { - background-image:url(/res/adm/pages/close-navigation.gif); + background-image:url(/res/adm/pages/open-first-problem.gif); } a#LC_content_toolbar_everything { - background-image:url(/res/adm/pages/show-all.gif); + background-image:url(/res/adm/pages/show-all.gif); } a#LC_content_toolbar_uncompleted { - background-image:url(/res/adm/pages/show-incomplete-problems.gif); + background-image:url(/res/adm/pages/show-incomplete-problems.gif); } #LC_content_toolbar_clearbubbles { - background-image:url(/res/adm/pages/mark-discussionentries-read.gif); + background-image:url(/res/adm/pages/mark-discussionentries-read.gif); } a#LC_content_toolbar_changefolder { - background : url(/res/adm/pages/close-all-folders.gif) top center ; + background : url(/res/adm/pages/close-all-folders.gif) top center ; } a#LC_content_toolbar_changefolder_toggled { - background-image:url(/res/adm/pages/open-all-folders.gif); + background-image:url(/res/adm/pages/open-all-folders.gif); } ul#LC_toolbar li a:hover { - background-position: bottom center; + background-position: bottom center; } ul#LC_toolbar { - padding:0; - margin: 2px; - list-style:none; - position:relative; - background-color:white; + padding: 0; + margin: 2px; + list-style:none; + position:relative; + background-color:white; } ul#LC_toolbar li { - border:1px solid white; - padding:0; - margin: 0; - float: left; - display:inline; - vertical-align:middle; -} + border:1px solid white; + padding: 0; + margin: 0; + float: left; + display:inline; + vertical-align:middle; +} a.LC_toolbarItem { - display:block; - padding:0; - margin:0; - height: 32px; - width: 32px; - color:white; - border:0 none; - background-repeat:no-repeat; - background-color:transparent; + display:block; + padding: 0; + margin: 0; + height: 32px; + width: 32px; + color:white; + border: none; + background-repeat:no-repeat; + background-color:transparent; } -ul.LC_functionslist li { - float: left; +ul.LC_funclist { + margin: 0; + padding: 0.5em 1em 0.5em 0; +} + +ul.LC_funclist > li:first-child { + font-weight:bold; + margin-left:0.8em; +} + +ul.LC_funclist + ul.LC_funclist { + /* + left border as a seperator if we have more than + one list + */ + border-left: 1px solid $sidebg; + /* + this hides the left border behind the border of the + outer box if element is wrapped to the next 'line' + */ + margin-left: -1px; +} + +ul.LC_funclist li { + display: inline; white-space: nowrap; - height: 35px; /* at least as high as heighest list item */ - margin: 0px 15px 15px 10px; + margin: 0 0 0 25px; + line-height: 150%; } +.ui-accordion .LC_advanced_toggle { + float: right; + font-size: 90%; + padding: 0px 4px +} END } @@ -6294,7 +6553,7 @@ sub headtag { $result .= &Apache::lonhtmlcommon::htmlareaheaders(); } if ($args->{'force_register'}) { - $result .= &Apache::lonmenu::registerurl(1); + $result .= &Apache::lonmenu::registerurl(); } if (!$args->{'no_nav_bar'} && !$args->{'only_body'} @@ -6369,7 +6628,8 @@ sub xml_begin { .''; } else { - $output=''; + $output='' + .''; } return $output; } @@ -6431,7 +6691,7 @@ $args - additional optional args support only_body -> is true will set &bodytag() onlybodytag arg on - no_nav_bar -> is true will set &bodytag() notopbar arg on + no_nav_bar -> is true will set &bodytag() no_nav_bar arg on add_entries -> additional attributes to add to the domain -> force to color decorate a page for a specific domain @@ -6445,21 +6705,19 @@ $args - additional optional args support a html attribute force_register -> if is true will turn on the &bodytag() $forcereg arg - body_title -> alternate text to use instead of $title - in the title box that appears, this text - is not auto translated like the $title is frameset -> if true will start with a rather than - no_title -> if true the title bar won't be shown skip_phases -> hash ref of head -> skip the generation body -> skip all generation - no_inline_link -> if true and in remote mode, don't show the - 'Switch To Inline Menu' link +#RC no_inline_link -> if true and in remote mode, don't show the +#RC 'Switch To Inline Menu' link no_auto_mt_title -> prevent &mt()ing the title arg inherit_jsmath -> when creating popup window in a page, should it have jsmath forced on by the current page + bread_crumbs -> Array containing breadcrumbs + bread_crumbs_components -> if exists show it as headline else show only the breadcrumbs =back @@ -6492,16 +6750,15 @@ sub start_page { my $attr_string = &make_attr_string($args->{'force_register'}, $args->{'add_entries'}); $result .= "\n\n"; - } else { - $result .= - &bodytag($title, - $args->{'function'}, $args->{'add_entries'}, - $args->{'only_body'}, $args->{'domain'}, - $args->{'force_register'}, $args->{'body_title'}, - $args->{'no_nav_bar'}, $args->{'bgcolor'}, - $args->{'no_title'}, $args->{'no_inline_link'}, - $args); - } + } else { + $result .= + &bodytag($title, + $args->{'function'}, $args->{'add_entries'}, + $args->{'only_body'}, $args->{'domain'}, + $args->{'force_register'}, $args->{'no_nav_bar'}, + $args->{'bgcolor'}, $args->{'no_inline_link'}, + $args); + } } if ($args->{'js_ready'}) { @@ -6511,7 +6768,21 @@ sub start_page { $result = &html_encode($result); } - #Breadcrumbs + # Preparation for new and consistent functionlist at top of screen + # if ($args->{'functionlist'}) { + # $result .= &build_functionlist(); + #} + + # Don't add anything more if only_body wanted + return $result if $args->{'only_body'}; + + #Breadcrumbs for Construction Space provided by &bodytag. + if ( + $env{'request.state'} eq 'construct') { + return $result; + } + + #Breadcrumbs if (exists($args->{'bread_crumbs'}) or exists($args->{'bread_crumbs_component'})) { &Apache::lonhtmlcommon::clear_breadcrumbs(); #if any br links exists, add them to the breadcrumbs @@ -6658,14 +6929,14 @@ sub simple_error_page { my ($add_class) = @_; $row_count[0]++; my $css_class = ($row_count[0] % 2)?'LC_odd_row':'LC_even_row'; - $css_class = (join(' ',$css_class,$add_class)); + $css_class = (join(' ',$css_class,$add_class)) unless ($add_class eq ''); return ''."\n";; } sub continue_data_table_row { my ($add_class) = @_; my $css_class = ($row_count[0] % 2)?'LC_odd_row':'LC_even_row'; - $css_class = (join(' ',$css_class,$add_class)); + $css_class = (join(' ',$css_class,$add_class)) unless ($add_class eq '');; return ''."\n";; } @@ -6689,6 +6960,11 @@ sub simple_error_page { sub end_data_table_header_row { return ''."\n";; } + + sub data_table_caption { + my $caption = shift; + return "$caption"; + } } =pod @@ -6755,14 +7031,17 @@ Returns either 'student','coordinator',' ############################################### sub get_users_function { - my $function = 'student'; - if ($env{'request.role'}=~/^(cc|in|ta|ep)/) { + my $function = 'norole'; + if ($env{'request.role'}=~/^(st)/) { + $function='student'; + } + if ($env{'request.role'}=~/^(cc|co|in|ta|ep)/) { $function='coordinator'; } if ($env{'request.role'}=~/^(su|dc|ad|li)/) { $function='admin'; } - if (($env{'request.role'}=~/^(au|ca)/) || + if (($env{'request.role'}=~/^(au|ca|aa)/) || ($ENV{'REQUEST_URI'}=~/^(\/priv|\~)/)) { $function='author'; } @@ -6773,6 +7052,38 @@ sub get_users_function { =pod +=item * &show_course() + +Used by lonmenu.pm and lonroles.pm to determine whether to use the word +'Courses' or 'Roles' in inline navigation and on screen displaying user's roles. + +Inputs: +None + +Outputs: +Scalar: 1 if 'Course' to be used, 0 otherwise. + +=cut + +############################################### +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; +} + +############################################### + +=pod + =item * &check_user_status() Determines current status of supplied role for a @@ -6795,7 +7106,7 @@ sub check_user_status { my $active_chk = 'none'; my $now = time; if (@uroles > 0) { - if (($role eq 'cc') || ($sec eq '') || (!defined($sec))) { + if (($role eq 'cc') || ($role eq 'co') || ($sec eq '') || (!defined($sec))) { $srchstr = '/'.$cdom.'/'.$crs.'_'.$role; } else { $srchstr = '/'.$cdom.'/'.$crs.'/'.$sec.'_'.$role; @@ -7426,6 +7737,7 @@ sub user_picker { # loncreateuser::print_user_query_page() # has been completed. next if ($option eq 'alc'); + next if (($option eq 'crs') && ($env{'form.form'} eq 'requestcrs')); next if ($option eq 'crs' && !$env{'request.course.id'}); if ($curr_selected{'srchin'} eq $option) { $srchinsel .= ' @@ -7516,6 +7828,7 @@ ENDSCRIPT my $output = <<"END_BLOCK"; $new_user_create - - - - - - - - - - -
$lt{'doma'}:$domform
$lt{'usr'}:$srchbysel - $srchtypesel - - $srchinsel -
-
END_BLOCK + $output .= &Apache::lonhtmlcommon::start_pick_box(). + &Apache::lonhtmlcommon::row_title($lt{'doma'}). + $domform. + &Apache::lonhtmlcommon::row_closure(). + &Apache::lonhtmlcommon::row_title($lt{'usr'}). + $srchbysel. + $srchtypesel. + ''. + $srchinsel. + &Apache::lonhtmlcommon::row_closure(1). + &Apache::lonhtmlcommon::end_pick_box(). + '
'; return $output; } @@ -8478,7 +8788,7 @@ sub csv_print_samples { $r->print(&mt('Samples').'
'.&start_data_table(). &start_data_table_header_row()); foreach my $sample (sort({$a <=> $b} keys(%{ $samples->[0] }))) { - $r->print(''.&mt('Column [_1]',($sample+1)).''); } + $r->print(''.&mt('Column [_1]',($sample+1)).''); } $r->print(&end_data_table_header_row()); foreach my $hash (@$samples) { $r->print(&start_data_table_row()); @@ -8522,7 +8832,7 @@ sub csv_print_select_table { my ($value,$display,$defaultcol)=@{ $array_ref }; $r->print(&start_data_table_row().''.$display.''); - $r->print(''); $r->print(''); foreach my $sample (sort({$a <=> $b} keys(%{ $samples->[0] }))) { @@ -9176,10 +9486,11 @@ sub restore_settings { =item * &build_recipient_list() -Build recipient lists for four types of e-mail: +Build recipient lists for five types of e-mail: (a) Error Reports, (b) Package Updates, (c) lonstatus warnings/errors -(d) Help requests, generated by -lonerrorhandler.pm, CHECKRPMS, loncron, and lonsupportreq.pm respectively. +(d) Help requests, (e) Course requests needing approval, generated by +lonerrorhandler.pm, CHECKRPMS, loncron, lonsupportreq.pm and +loncoursequeueadmin.pm respectively. Inputs: defmail (scalar - email address of default recipient), @@ -9349,6 +9660,8 @@ sub extract_categories { my $trailstr; if ($name eq 'instcode') { $trailstr = &mt('Official courses (with institutional codes)'); + } elsif ($name eq 'communities') { + $trailstr = &mt('Communities'); } else { $trailstr = $name; } @@ -9461,12 +9774,14 @@ cathash - reference to hash of categorie currcat - scalar with an & separated list of categories assigned to a course. +type - scalar contains course type (Course or Community). + Returns: $output (markup to be displayed) =cut sub assign_categories_table { - my ($cathash,$currcat) = @_; + my ($cathash,$currcat,$type) = @_; my $output; if (ref($cathash) eq 'HASH') { my (@cats,@trails,%allitems,%idx,@jsarray,@path,$maxdepth); @@ -9475,15 +9790,20 @@ sub assign_categories_table { if (@cats > 0) { my $itemcount = 0; if (ref($cats[0]) eq 'ARRAY') { - $output = &Apache::loncommon::start_data_table(); my @currcategories; if ($currcat ne '') { @currcategories = split('&',$currcat); } + my $table; for (my $i=0; $i<@{$cats[0]}; $i++) { my $parent = $cats[0][$i]; - my $css_class = $itemcount%2?' class="LC_odd_row"':''; next if ($parent eq 'instcode'); + if ($type eq 'Community') { + next unless ($parent eq 'communities'); + } else { + next if ($parent eq 'communities'); + } + my $css_class = $itemcount%2?' class="LC_odd_row"':''; my $item = &escape($parent).'::0'; my $checked = ''; if (@currcategories > 0) { @@ -9491,18 +9811,26 @@ sub assign_categories_table { $checked = ' checked="checked"'; } } - $output .= ''. - ''.$parent.''. - ''; + my $parent_title = $parent; + if ($parent eq 'communities') { + $parent_title = &mt('Communities'); + } + $table .= ''. + ''.$parent_title.''. + ''; my $depth = 1; push(@path,$parent); - $output .= &assign_category_rows($itemcount,\@cats,$depth,$parent,\@path,\@currcategories); + $table .= &assign_category_rows($itemcount,\@cats,$depth,$parent,\@path,\@currcategories); pop(@path); - $output .= ''; + $table .= ''; $itemcount ++; } - $output .= &Apache::loncommon::end_data_table(); + if ($itemcount) { + $output = &Apache::loncommon::start_data_table(). + $table. + &Apache::loncommon::end_data_table(); + } } } } @@ -9747,12 +10075,26 @@ sub check_clone { my $clonehome=&Apache::lonnet::homeserver($clonecrsunum,$clonecrsudom); my $clonemsg; my $can_clone = 0; - + my $lctype = lc($args->{'crstype'}); + if ($lctype ne 'community') { + $lctype = 'course'; + } if ($clonehome eq 'no_host') { - $clonemsg = &mt('No new course created.').$linefeed.&mt('A new course could not be cloned from the specified original - [_1] - because it is a non-existent course.',$args->{'clonecourse'}.':'.$args->{'clonedomain'}); + if ($args->{'crstype'} eq 'Community') { + $clonemsg = &mt('No new community created.').$linefeed.&mt('A new community could not be cloned from the specified original - [_1] - because it is a non-existent community.',$args->{'clonecourse'}.':'.$args->{'clonedomain'}); + } else { + $clonemsg = &mt('No new course created.').$linefeed.&mt('A new course could not be cloned from the specified original - [_1] - because it is a non-existent course.',$args->{'clonecourse'}.':'.$args->{'clonedomain'}); + } } else { my %clonedesc = &Apache::lonnet::coursedescription($cloneid,{'one_time' => 1}); - if ($env{'request.role.domain'} eq $args->{'clonedomain'}) { + if ($args->{'crstype'} eq 'Community') { + if ($clonedesc{'type'} ne 'Community') { + $clonemsg = &mt('No new community created.').$linefeed.&mt('A new community could not be cloned from the specified original - [_1] - because it is a course not a community.',$args->{'clonecourse'}.':'.$args->{'clonedomain'}); + return ($can_clone, $clonemsg, $cloneid, $clonehome); + } + } + if (($env{'request.role.domain'} eq $args->{'clonedomain'}) && + (&Apache::lonnet::allowed('ccc',$env{'request.role.domain'}))) { $can_clone = 1; } else { my %clonehash = &Apache::lonnet::get('environment',['cloners'], @@ -9763,15 +10105,25 @@ sub check_clone { } elsif (grep(/^\*\:\Q$args->{'ccdomain'}\E$/,@cloners)) { $can_clone = 1; } else { + my $ccrole = 'cc'; + if ($args->{'crstype'} eq 'Community') { + $ccrole = 'co'; + } my %roleshash = &Apache::lonnet::get_my_roles($args->{'ccuname'}, $args->{'ccdomain'}, - 'userroles',['active'],['cc'], + 'userroles',['active'],[$ccrole], [$args->{'clonedomain'}]); - if (($roleshash{$args->{'clonecourse'}.':'.$args->{'clonedomain'}.':cc'}) || (grep(/^\Q$args->{'ccuname'}\E:\Q$args->{'ccdomain'}\E$/,@cloners))) { - $can_clone = 1; - } else { - $clonemsg = &mt('No new course created.').$linefeed.&mt('The new course could not be cloned from the existing course because the new course owner ([_1]) does not have cloning rights in the existing course ([_2]).',$args->{'ccuname'}.':'.$args->{'ccdomain'},$clonedesc{'description'}); + if (($roleshash{$args->{'clonecourse'}.':'.$args->{'clonedomain'}.':'.$ccrole}) || (grep(/^\Q$args->{'ccuname'}\E:\Q$args->{'ccdomain'}\E$/,@cloners))) { + $can_clone = 1; + } elsif (&Apache::lonnet::is_course_owner($args->{'clonedomain'},$args->{'clonecourse'},$args->{'ccuname'},$args->{'ccdomain'})) { + $can_clone = 1; + } else { + if ($args->{'crstype'} eq 'Community') { + $clonemsg = &mt('No new community created.').$linefeed.&mt('The new community could not be cloned from the existing community because the new community owner ([_1]) does not have cloning rights in the existing community ([_2]).',$args->{'ccuname'}.':'.$args->{'ccdomain'},$clonedesc{'description'}); + } else { + $clonemsg = &mt('No new course created.').$linefeed.&mt('The new course could not be cloned from the existing course because the new course owner ([_1]) does not have cloning rights in the existing course ([_2]).',$args->{'ccuname'}.':'.$args->{'ccdomain'},$clonedesc{'description'}); + } } } } @@ -9780,7 +10132,7 @@ sub check_clone { } sub construct_course { - my ($args,$logmsg,$courseid,$crsudom,$crsunum,$udom,$uname,$context) = @_; + my ($args,$logmsg,$courseid,$crsudom,$crsunum,$udom,$uname,$context,$cnum,$category) = @_; my $outcome; my $linefeed = '
'."\n"; if ($context eq 'auto') { @@ -9818,18 +10170,27 @@ sub construct_course { $args->{'crscode'}, $args->{'ccuname'}.':'. $args->{'ccdomain'}, - $args->{'crstype'}); + $args->{'crstype'}, + $cnum,$context,$category); # Note: The testing routines depend on this being output; see # Utils::Course. This needs to at least be output as a comment # if anyone ever decides to not show this, and Utils::Course::new # will need to be suitably modified. $outcome .= &mt('New LON-CAPA [_1] ID: [_2]',$crstype,$$courseid).$linefeed; + if ($$courseid =~ /^error:/) { + return (0,$outcome); + } + # # Check if created correctly # ($$crsudom,$$crsunum)= &LONCAPA::split_courseid($$courseid); my $crsuhome=&Apache::lonnet::homeserver($$crsunum,$$crsudom); + if ($crsuhome eq 'no_host') { + $outcome .= &mt('Course creation failed, unrecognized course home server.').$linefeed; + return (0,$outcome); + } $outcome .= &mt('Created on').': '.$crsuhome.$linefeed; # @@ -9848,6 +10209,10 @@ sub construct_course { $cenv{'url'}=$oldcenv{'url'}; # Restore title $cenv{'description'}=$oldcenv{'description'}; +# Restore creation date, creator and creation context. + $cenv{'internal.created'}=$oldcenv{'internal.created'}; + $cenv{'internal.creator'}=$oldcenv{'internal.creator'}; + $cenv{'internal.creationcontext'}=$oldcenv{'internal.creationcontext'}; # Mark as cloned $cenv{'clonedfrom'}=$cloneid; # Need to clone grading mode @@ -10111,6 +10476,8 @@ sub construct_course { ############################################################ ############################################################ +#SD +# only Community and Course, or anything else? sub course_type { my ($cid) = @_; if (!defined($cid)) { @@ -10127,11 +10494,21 @@ sub group_term { my $crstype = &course_type(); my %names = ( 'Course' => 'group', - 'Group' => 'team', + 'Community' => 'group', ); return $names{$crstype}; } +sub course_types { + my @types = ('official','unofficial','community'); + my %typename = ( + official => 'Official course', + unofficial => 'Unofficial course', + community => 'Community', + ); + return (\@types,\%typename); +} + sub icon { my ($file)=@_; my $curfext = lc((split(/\./,$file))[-1]); @@ -10191,7 +10568,23 @@ sub escape_url { return join('/',@urlslices).'/'.$lastitem; } -# -------------------------------------------------------- Initliaze user login +sub compare_arrays { + my ($arrayref1,$arrayref2) = @_; + my (@difference,%count); + @difference = (); + %count = (); + if ((ref($arrayref1) eq 'ARRAY') && (ref($arrayref2) eq 'ARRAY')) { + foreach my $element (@{$arrayref1}, @{$arrayref2}) { $count{$element}++; } + foreach my $element (keys(%count)) { + if ($count{$element} == 1) { + push(@difference,$element); + } + } + } + return @difference; +} + +# -------------------------------------------------------- Initialize user login sub init_user_environment { my ($r, $username, $domain, $authhost, $form, $args) = @_; my $lonids=$Apache::lonnet::perlvar{'lonIDsDir'}; @@ -10245,40 +10638,22 @@ sub init_user_environment { my ($httpbrowser,$clientbrowser,$clientversion,$clientmathml, $clientunicode,$clientos) = &decode_user_agent($r); -# -------------------------------------- Any accessibility options to remember? - if (($form->{'interface'}) && ($form->{'remember'} eq 'true')) { - foreach my $option ('imagesuppress','appletsuppress', - 'embedsuppress','fontenhance','blackwhite') { - if ($form->{$option} eq 'true') { - &Apache::lonnet::put('environment',{$option => 'on'}, - $domain,$username); - } else { - &Apache::lonnet::del('environment',[$option], - $domain,$username); - } - } - } # ------------------------------------------------------------- Get environment my %userenv = &Apache::lonnet::dump('environment',$domain,$username); my ($tmp) = keys(%userenv); if ($tmp !~ /^(con_lost|error|no_such_host)/i) { - # default remote control to off - if ($userenv{'remote'} ne 'on') { $userenv{'remote'} = 'off'; } } else { undef(%userenv); } if (($userenv{'interface'}) && (!$form->{'interface'})) { $form->{'interface'}=$userenv{'interface'}; } - $env{'environment.remote'}=$userenv{'remote'}; if ($userenv{'texengine'} eq 'ttm') { $clientmathml=1; } # --------------- Do not trust query string to be put directly into environment - foreach my $option ('imagesuppress','appletsuppress', - 'embedsuppress','fontenhance','blackwhite', - 'interface','localpath','localres') { - $form->{$option}=~s/[\n\r\=]//gs; + foreach my $option ('interface','localpath','localres') { + $form->{$option}=~s/[\n\r\=]//gs; } # --------------------------------------------------------- Write first profile @@ -10305,20 +10680,10 @@ sub init_user_environment { $initial_env{"browser.localres"} = $form->{'localres'}; } - if ($public) { - $initial_env{"environment.remote"} = "off"; - } if ($form->{'interface'}) { $form->{'interface'}=~s/\W//gs; $initial_env{"browser.interface"} = $form->{'interface'}; $env{'browser.interface'}=$form->{'interface'}; - foreach my $option ('imagesuppress','appletsuppress', - 'embedsuppress','fontenhance','blackwhite') { - if (($form->{$option} eq 'true') || - ($userenv{$option} eq 'on')) { - $initial_env{"browser.$option"} = "on"; - } - } } foreach my $tool ('aboutme','blog','portfolio') { @@ -10326,7 +10691,7 @@ sub init_user_environment { &Apache::lonnet::usertools_access($username,$domain,$tool,'reload'); } - foreach my $crstype ('official','unofficial') { + foreach my $crstype ('official','unofficial','community') { $userenv{'canrequest.'.$crstype} = &Apache::lonnet::usertools_access($username,$domain,$crstype, 'reload','requestcourses'); 500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.