version 1.587, 2007/09/24 23:29:53
|
version 1.1028.2.1, 2011/12/26 13:47:18
|
Line 61 use POSIX qw(strftime mktime);
|
Line 61 use POSIX qw(strftime mktime);
|
use Apache::lonmenu(); |
use Apache::lonmenu(); |
use Apache::lonenc(); |
use Apache::lonenc(); |
use Apache::lonlocal; |
use Apache::lonlocal; |
|
use Apache::lonnet(); |
use HTML::Entities; |
use HTML::Entities; |
use Apache::lonhtmlcommon(); |
use Apache::lonhtmlcommon(); |
use Apache::loncoursedata(); |
use Apache::loncoursedata(); |
use Apache::lontexconvert(); |
use Apache::lontexconvert(); |
use Apache::lonclonecourse(); |
use Apache::lonclonecourse(); |
use LONCAPA qw(:DEFAULT :match); |
use LONCAPA qw(:DEFAULT :match); |
|
use DateTime::TimeZone; |
|
use DateTime::Locale::Catalog; |
|
|
# ---------------------------------------------- Designs |
# ---------------------------------------------- Designs |
use vars qw(%defaultdesign); |
use vars qw(%defaultdesign); |
Line 78 my $readit;
|
Line 81 my $readit;
|
## Global Variables |
## Global Variables |
## |
## |
|
|
|
|
|
# ----------------------------------------------- SSI with retries: |
|
# |
|
|
|
=pod |
|
|
|
=head1 Server Side include with retries: |
|
|
|
=over 4 |
|
|
|
=item * &ssi_with_retries(resource,retries form) |
|
|
|
Performs an ssi with some number of retries. Retries continue either |
|
until the result is ok or until the retry count supplied by the |
|
caller is exhausted. |
|
|
|
Inputs: |
|
|
|
=over 4 |
|
|
|
resource - Identifies the resource to insert. |
|
|
|
retries - Count of the number of retries allowed. |
|
|
|
form - Hash that identifies the rendering options. |
|
|
|
=back |
|
|
|
Returns: |
|
|
|
=over 4 |
|
|
|
content - The content of the response. If retries were exhausted this is empty. |
|
|
|
response - The response from the last attempt (which may or may not have been successful. |
|
|
|
=back |
|
|
|
=back |
|
|
|
=cut |
|
|
|
sub ssi_with_retries { |
|
my ($resource, $retries, %form) = @_; |
|
|
|
|
|
my $ok = 0; # True if we got a good response. |
|
my $content; |
|
my $response; |
|
|
|
# Try to get the ssi done. within the retries count: |
|
|
|
do { |
|
($content, $response) = &Apache::lonnet::ssi($resource, %form); |
|
$ok = $response->is_success; |
|
if (!$ok) { |
|
&Apache::lonnet::logthis("Failed ssi_with_retries on $resource: ".$response->is_success.', '.$response->code.', '.$response->message); |
|
} |
|
$retries--; |
|
} while (!$ok && ($retries > 0)); |
|
|
|
if (!$ok) { |
|
$content = ''; # On error return an empty content. |
|
} |
|
return ($content, $response); |
|
|
|
} |
|
|
|
|
|
|
# ----------------------------------------------- Filetypes/Languages/Copyright |
# ----------------------------------------------- Filetypes/Languages/Copyright |
my %language; |
my %language; |
my %supported_language; |
my %supported_language; |
|
my %latex_language; # Language name LaTeX uses for selecting hyphenation. |
my %cprtag; |
my %cprtag; |
my %scprtag; |
my %scprtag; |
my %fe; my %fd; my %fm; |
my %fe; my %fd; my %fm; |
Line 113 BEGIN {
|
Line 187 BEGIN {
|
while (my $line = <$fh>) { |
while (my $line = <$fh>) { |
next if ($line=~/^\#/); |
next if ($line=~/^\#/); |
chomp($line); |
chomp($line); |
my ($key,$two,$country,$three,$enc,$val,$sup)=(split(/\t/,$line)); |
my ($key,$two,$country,$three,$enc,$val,$sup,$latex)=(split(/\t/,$line)); |
$language{$key}=$val.' - '.$enc; |
$language{$key}=$val.' - '.$enc; |
if ($sup) { |
if ($sup) { |
$supported_language{$key}=$sup; |
$supported_language{$key}=$sup; |
} |
} |
|
if ($latex) { |
|
$latex_language{$two} = $latex; |
|
} |
} |
} |
close($fh); |
close($fh); |
} |
} |
Line 198 BEGIN {
|
Line 275 BEGIN {
|
} |
} |
} |
} |
&Apache::lonnet::logthis( |
&Apache::lonnet::logthis( |
"<font color=yellow>INFO: Read file types</font>"); |
"<span style='color:yellow;'>INFO: Read file types</span>"); |
$readit=1; |
$readit=1; |
} # end of unless($readit) |
} # end of unless($readit) |
|
|
Line 214 BEGIN {
|
Line 291 BEGIN {
|
|
|
=over 4 |
=over 4 |
|
|
=item * browser_and_searcher_javascript () |
=item * &browser_and_searcher_javascript() |
|
|
X<browsing, javascript>X<searching, javascript>Returns a string |
X<browsing, javascript>X<searching, javascript>Returns a string |
containing javascript with two functions, C<openbrowser> and |
containing javascript with two functions, C<openbrowser> and |
C<opensearcher>. Returned string does not contain E<lt>scriptE<gt> |
C<opensearcher>. Returned string does not contain E<lt>scriptE<gt> |
tags. |
tags. |
|
|
=item * openbrowser(formname,elementname,only,omit) [javascript] |
=item * &openbrowser(formname,elementname,only,omit) [javascript] |
|
|
inputs: formname, elementname, only, omit |
inputs: formname, elementname, only, omit |
|
|
Line 234 with the given extension. Can be a comm
|
Line 311 with the given extension. Can be a comm
|
Specifying 'omit' will restrict the browser to NOT displaying files |
Specifying 'omit' will restrict the browser to NOT displaying files |
with the given extension. Can be a comma separated list. |
with the given extension. Can be a comma separated list. |
|
|
=item * opensearcher(formname, elementname) [javascript] |
=item * &opensearcher(formname,elementname) [javascript] |
|
|
Inputs: formname, elementname |
Inputs: formname, elementname |
|
|
Line 257 sub browser_and_searcher_javascript {
|
Line 334 sub browser_and_searcher_javascript {
|
} |
} |
url += 'catalogmode=interactive&'; |
url += 'catalogmode=interactive&'; |
url += 'mode=$mode&'; |
url += 'mode=$mode&'; |
|
url += 'inhibitmenu=yes&'; |
url += 'form=' + formname + '&'; |
url += 'form=' + formname + '&'; |
if (only != null) { |
if (only != null) { |
url += 'only=' + only + '&'; |
url += 'only=' + only + '&'; |
Line 318 sub storeresurl {
|
Line 396 sub storeresurl {
|
unless ($resurl=~/^\/res/) { return 0; } |
unless ($resurl=~/^\/res/) { return 0; } |
$resurl=~s/\/$//; |
$resurl=~s/\/$//; |
&Apache::lonnet::put('environment',{'lastresurl' => $resurl}); |
&Apache::lonnet::put('environment',{'lastresurl' => $resurl}); |
&Apache::lonnet::appenv('environment.lastresurl' => $resurl); |
&Apache::lonnet::appenv({'environment.lastresurl' => $resurl}); |
return 1; |
return 1; |
} |
} |
|
|
Line 332 sub studentbrowser_javascript {
|
Line 410 sub studentbrowser_javascript {
|
|| ($env{'request.role'}=~/^(au|dc|su)/) |
|| ($env{'request.role'}=~/^(au|dc|su)/) |
) { return ''; } |
) { return ''; } |
return (<<'ENDSTDBRW'); |
return (<<'ENDSTDBRW'); |
<script type="text/javascript" language="Javascript" > |
<script type="text/javascript" language="Javascript"> |
|
// <![CDATA[ |
var stdeditbrowser; |
var stdeditbrowser; |
function openstdbrowser(formname,uname,udom,roleflag,ignorefilter) { |
function openstdbrowser(formname,uname,udom,clicker,roleflag,ignorefilter,courseadvonly) { |
var url = '/adm/pickstudent?'; |
var url = '/adm/pickstudent?'; |
var filter; |
var filter; |
if (!ignorefilter) { |
if (!ignorefilter) { |
Line 346 sub studentbrowser_javascript {
|
Line 425 sub studentbrowser_javascript {
|
} |
} |
} |
} |
url += 'form=' + formname + '&unameelement='+uname+ |
url += 'form=' + formname + '&unameelement='+uname+ |
'&udomelement='+udom; |
'&udomelement='+udom+ |
|
'&clicker='+clicker; |
if (roleflag) { url+="&roles=1"; } |
if (roleflag) { url+="&roles=1"; } |
|
if (courseadvonly) { url+="&courseadvonly=1"; } |
var title = 'Student_Browser'; |
var title = 'Student_Browser'; |
var options = 'scrollbars=1,resizable=1,menubar=0'; |
var options = 'scrollbars=1,resizable=1,menubar=0'; |
options += ',width=700,height=600'; |
options += ',width=700,height=600'; |
stdeditbrowser = open(url,title,options,'1'); |
stdeditbrowser = open(url,title,options,'1'); |
stdeditbrowser.focus(); |
stdeditbrowser.focus(); |
} |
} |
|
// ]]> |
</script> |
</script> |
ENDSTDBRW |
ENDSTDBRW |
} |
} |
|
|
|
sub resourcebrowser_javascript { |
|
unless ($env{'request.course.id'}) { return ''; } |
|
return (<<'ENDRESBRW'); |
|
<script type="text/javascript" language="Javascript"> |
|
// <![CDATA[ |
|
var reseditbrowser; |
|
function openresbrowser(formname,reslink) { |
|
var url = '/adm/pickresource?form='+formname+'&reslink='+reslink; |
|
var title = 'Resource_Browser'; |
|
var options = 'scrollbars=1,resizable=1,menubar=0'; |
|
options += ',width=700,height=500'; |
|
reseditbrowser = open(url,title,options,'1'); |
|
reseditbrowser.focus(); |
|
} |
|
// ]]> |
|
</script> |
|
ENDRESBRW |
|
} |
|
|
sub selectstudent_link { |
sub selectstudent_link { |
my ($form,$unameele,$udomele)=@_; |
my ($form,$unameele,$udomele,$courseadvonly,$clickerid)=@_; |
|
my $callargs = "'".&Apache::lonhtmlcommon::entity_encode($form)."','". |
|
&Apache::lonhtmlcommon::entity_encode($unameele)."','". |
|
&Apache::lonhtmlcommon::entity_encode($udomele)."'"; |
if ($env{'request.course.id'}) { |
if ($env{'request.course.id'}) { |
if (!&Apache::lonnet::allowed('srm',$env{'request.course.id'}) |
if (!&Apache::lonnet::allowed('srm',$env{'request.course.id'}) |
&& !&Apache::lonnet::allowed('srm',$env{'request.course.id'}. |
&& !&Apache::lonnet::allowed('srm',$env{'request.course.id'}. |
'/'.$env{'request.course.sec'})) { |
'/'.$env{'request.course.sec'})) { |
return ''; |
return ''; |
} |
} |
return "<a href='".'javascript:openstdbrowser("'.$form.'","'.$unameele. |
$callargs.=",'".&Apache::lonhtmlcommon::entity_encode($clickerid)."'"; |
'","'.$udomele.'","","1");'."'>".&mt('Select User')."</a>"; |
if ($courseadvonly) { |
|
$callargs .= ",'',1,1"; |
|
} |
|
return '<span class="LC_nobreak">'. |
|
'<a href="javascript:openstdbrowser('.$callargs.');">'. |
|
&mt('Select User').'</a></span>'; |
} |
} |
if ($env{'request.role'}=~/^(au|dc|su)/) { |
if ($env{'request.role'}=~/^(au|dc|su)/) { |
return "<a href='".'javascript:openstdbrowser("'.$form.'","'.$unameele. |
$callargs .= ",'',1"; |
'","'.$udomele.'",1);'."'>".&mt('Select User')."</a>"; |
return '<span class="LC_nobreak">'. |
|
'<a href="javascript:openstdbrowser('.$callargs.');">'. |
|
&mt('Select User').'</a></span>'; |
} |
} |
return ''; |
return ''; |
} |
} |
|
|
|
sub selectresource_link { |
|
my ($form,$reslink,$arg)=@_; |
|
|
|
my $callargs = "'".&Apache::lonhtmlcommon::entity_encode($form)."','". |
|
&Apache::lonhtmlcommon::entity_encode($reslink)."'"; |
|
unless ($env{'request.course.id'}) { return $arg; } |
|
return '<span class="LC_nobreak">'. |
|
'<a href="javascript:openresbrowser('.$callargs.');">'. |
|
$arg.'</a></span>'; |
|
} |
|
|
|
|
|
|
|
sub authorbrowser_javascript { |
|
return <<"ENDAUTHORBRW"; |
|
<script type="text/javascript" language="JavaScript"> |
|
// <![CDATA[ |
|
var stdeditbrowser; |
|
|
|
function openauthorbrowser(formname,udom) { |
|
var url = '/adm/pickauthor?'; |
|
url += 'form='+formname+'&roledom='+udom; |
|
var title = 'Author_Browser'; |
|
var options = 'scrollbars=1,resizable=1,menubar=0'; |
|
options += ',width=700,height=600'; |
|
stdeditbrowser = open(url,title,options,'1'); |
|
stdeditbrowser.focus(); |
|
} |
|
|
|
// ]]> |
|
</script> |
|
ENDAUTHORBRW |
|
} |
|
|
sub coursebrowser_javascript { |
sub coursebrowser_javascript { |
my ($domainfilter,$sec_element,$formname)=@_; |
my ($domainfilter,$sec_element,$formname,$role_element,$crstype) = @_; |
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 $wintitle = 'Course_Browser'; |
my $output = ' |
if ($crstype eq 'Community') { |
<script type="text/javascript"> |
$wintitle = 'Community_Browser'; |
|
} |
|
my $id_functions = &javascript_index_functions(); |
|
my $output = ' |
|
<script type="text/javascript" language="JavaScript"> |
|
// <![CDATA[ |
var stdeditbrowser;'."\n"; |
var stdeditbrowser;'."\n"; |
$output .= <<"ENDSTDBRW"; |
|
function opencrsbrowser(formname,uname,udom,desc,extra_element,multflag,crstype) { |
$output .= <<"ENDSTDBRW"; |
|
function opencrsbrowser(formname,uname,udom,desc,extra_element,multflag,type,type_elem) { |
var url = '/adm/pickcourse?'; |
var url = '/adm/pickcourse?'; |
var domainfilter = ''; |
|
var formid = getFormIdByName(formname); |
var formid = getFormIdByName(formname); |
if (formid > -1) { |
var domainfilter = getDomainFromSelectbox(formname,udom); |
var domid = getIndexByName(formid,udom); |
|
if (domid > -1) { |
|
if (document.forms[formid].elements[domid].type == 'select-one') { |
|
domainfilter=document.forms[formid].elements[domid].options[document.forms[formid].elements[domid].selectedIndex].value; |
|
} |
|
if (document.forms[formid].elements[domid].type == 'hidden') { |
|
domainfilter=document.forms[formid].elements[domid].value; |
|
} |
|
} |
|
} |
|
if (domainfilter != null) { |
if (domainfilter != null) { |
if (domainfilter != '') { |
if (domainfilter != '') { |
url += 'domainfilter='+domainfilter+'&'; |
url += 'domainfilter='+domainfilter+'&'; |
Line 407 sub coursebrowser_javascript {
|
Line 547 sub coursebrowser_javascript {
|
'&cdomelement='+udom+ |
'&cdomelement='+udom+ |
'&cnameelement='+desc; |
'&cnameelement='+desc; |
if (extra_element !=null && extra_element != '') { |
if (extra_element !=null && extra_element != '') { |
if (formname == 'rolechoice') { |
if (formname == 'rolechoice' || formname == 'studentform') { |
url += '&roleelement='+extra_element; |
url += '&roleelement='+extra_element; |
if (domainfilter == null || domainfilter == '') { |
if (domainfilter == null || domainfilter == '') { |
url += '&domainfilter='+extra_element; |
url += '&domainfilter='+extra_element; |
Line 416 sub coursebrowser_javascript {
|
Line 556 sub coursebrowser_javascript {
|
else { |
else { |
if (formname == 'portform') { |
if (formname == 'portform') { |
url += '&setroles='+extra_element; |
url += '&setroles='+extra_element; |
|
} else { |
|
if (formname == 'rules') { |
|
url += '&fixeddom='+extra_element; |
|
} |
} |
} |
} |
} |
} |
} |
if (multflag !=null && multflag != '') { |
if (type != null && type != '') { |
url += '&multiple='+multflag; |
url += '&type='+type; |
} |
} |
if (crstype == 'Course/Group') { |
if (type_elem != null && type_elem != '') { |
if (formname == 'cu') { |
url += '&typeelement='+type_elem; |
crstype = document.cu.crstype.options[document.cu.crstype.selectedIndex].value; |
|
if (crstype == "") { |
|
alert("$crs_or_grp_alert"); |
|
return; |
|
} |
|
} |
|
} |
} |
if (crstype !=null && crstype != '') { |
if (formname == 'ccrs') { |
url += '&type='+crstype; |
var ownername = document.forms[formid].ccuname.value; |
|
var ownerdom = document.forms[formid].ccdomain.options[document.forms[formid].ccdomain.selectedIndex].value; |
|
url += '&cloner='+ownername+':'+ownerdom; |
} |
} |
var title = 'Course_Browser'; |
if (multflag !=null && multflag != '') { |
|
url += '&multiple='+multflag; |
|
} |
|
var title = '$wintitle'; |
var options = 'scrollbars=1,resizable=1,menubar=0'; |
var options = 'scrollbars=1,resizable=1,menubar=0'; |
options += ',width=700,height=600'; |
options += ',width=700,height=600'; |
stdeditbrowser = open(url,title,options,'1'); |
stdeditbrowser = open(url,title,options,'1'); |
stdeditbrowser.focus(); |
stdeditbrowser.focus(); |
} |
} |
|
$id_functions |
|
ENDSTDBRW |
|
if (($sec_element ne '') || ($role_element ne '')) { |
|
$output .= &setsec_javascript($sec_element,$formname,$role_element); |
|
} |
|
$output .= ' |
|
// ]]> |
|
</script>'; |
|
return $output; |
|
} |
|
|
|
sub javascript_index_functions { |
|
return <<"ENDJS"; |
|
|
|
function getFormIdByName(formname) { |
|
for (var i=0;i<document.forms.length;i++) { |
|
if (document.forms[i].name == formname) { |
|
return i; |
|
} |
|
} |
|
return -1; |
|
} |
|
|
function getFormIdByName(formname) { |
function getIndexByName(formid,item) { |
for (var i=0;i<document.forms.length;i++) { |
for (var i=0;i<document.forms[formid].elements.length;i++) { |
if (document.forms[i].name == formname) { |
if (document.forms[formid].elements[i].name == item) { |
return i; |
return i; |
|
} |
|
} |
|
return -1; |
|
} |
|
|
|
function getDomainFromSelectbox(formname,udom) { |
|
var userdom; |
|
var formid = getFormIdByName(formname); |
|
if (formid > -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; |
|
} |
} |
|
return userdom; |
|
} |
|
|
|
ENDJS |
|
|
|
} |
|
|
function getIndexByName(formid,item) { |
sub javascript_array_indexof { |
for (var i=0;i<document.forms[formid].elements.length;i++) { |
return <<ENDJS; |
if (document.forms[formid].elements[i].name == item) { |
<script type="text/javascript" language="JavaScript"> |
return i; |
// <![CDATA[ |
|
|
|
if (!Array.prototype.indexOf) { |
|
Array.prototype.indexOf = function (searchElement /*, fromIndex */ ) { |
|
"use strict"; |
|
if (this === void 0 || this === null) { |
|
throw new TypeError(); |
|
} |
|
var t = Object(this); |
|
var len = t.length >>> 0; |
|
if (len === 0) { |
|
return -1; |
|
} |
|
var n = 0; |
|
if (arguments.length > 0) { |
|
n = Number(arguments[1]); |
|
if (n !== n) { // shortcut for verifying if it's NaN |
|
n = 0; |
|
} else if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0)) { |
|
n = (n > 0 || -1) * Math.floor(Math.abs(n)); |
|
} |
|
} |
|
if (n >= len) { |
|
return -1; |
|
} |
|
var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0); |
|
for (; k < len; k++) { |
|
if (k in t && t[k] === searchElement) { |
|
return k; |
} |
} |
} |
} |
return -1; |
return -1; |
} |
} |
ENDSTDBRW |
} |
if ($sec_element ne '') { |
|
$output .= &setsec_javascript($sec_element,$formname); |
// ]]> |
|
</script> |
|
|
|
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 .= ' |
url += 'form=' + formname + '&unameelement='+uname+ |
</script>'; |
'&udomelement='+udom+ |
return $output; |
'&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<slct.length;i++) { |
|
if (slct.options[i].value==fixeddom) { slct.selectedIndex=i; } |
|
} |
|
} |
|
if (slct.type == 'hidden') { |
|
slct.value = fixeddom; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
return; |
|
} |
|
|
|
$id_functions |
|
ENDUSERBRW |
} |
} |
|
|
sub setsec_javascript { |
sub setsec_javascript { |
my ($sec_element,$formname) = @_; |
my ($sec_element,$formname,$role_element) = @_; |
|
my (@courserolenames,@communityrolenames,$rolestr,$courserolestr, |
|
$communityrolestr); |
|
if ($role_element ne '') { |
|
my @allroles = ('st','ta','ep','in','ad'); |
|
foreach my $crstype ('Course','Community') { |
|
if ($crstype eq 'Community') { |
|
foreach my $role (@allroles) { |
|
push(@communityrolenames,&Apache::lonnet::plaintext($role,$crstype)); |
|
} |
|
push(@communityrolenames,&Apache::lonnet::plaintext('co')); |
|
} else { |
|
foreach my $role (@allroles) { |
|
push(@courserolenames,&Apache::lonnet::plaintext($role,$crstype)); |
|
} |
|
push(@courserolenames,&Apache::lonnet::plaintext('cc')); |
|
} |
|
} |
|
$rolestr = '"'.join('","',@allroles).'"'; |
|
$courserolestr = '"'.join('","',@courserolenames).'"'; |
|
$communityrolestr = '"'.join('","',@communityrolenames).'"'; |
|
} |
my $setsections = qq| |
my $setsections = qq| |
function setSect(sectionlist) { |
function setSect(sectionlist) { |
var sectionsArray = sectionlist.split(","); |
var sectionsArray = new Array(); |
|
if ((sectionlist != '') && (typeof sectionlist != "undefined")) { |
|
sectionsArray = sectionlist.split(","); |
|
} |
var numSections = sectionsArray.length; |
var numSections = sectionsArray.length; |
document.$formname.$sec_element.length = 0; |
document.$formname.$sec_element.length = 0; |
if (numSections == 0) { |
if (numSections == 0) { |
Line 499 function setSect(sectionlist) {
|
Line 798 function setSect(sectionlist) {
|
} |
} |
} |
} |
} |
} |
|
|
|
function setRole(crstype) { |
|; |
|; |
|
if ($role_element eq '') { |
|
$setsections .= ' return; |
|
} |
|
'; |
|
} else { |
|
$setsections .= qq| |
|
var elementLength = document.$formname.$role_element.length; |
|
var allroles = Array($rolestr); |
|
var courserolenames = Array($courserolestr); |
|
var communityrolenames = Array($communityrolestr); |
|
if (elementLength != undefined) { |
|
if (document.$formname.$role_element.options[5].value == 'cc') { |
|
if (crstype == 'Course') { |
|
return; |
|
} else { |
|
allroles[5] = 'co'; |
|
for (var i=0; i<6; i++) { |
|
document.$formname.$role_element.options[i].value = allroles[i]; |
|
document.$formname.$role_element.options[i].text = communityrolenames[i]; |
|
} |
|
} |
|
} else { |
|
if (crstype == 'Community') { |
|
return; |
|
} else { |
|
allroles[5] = 'cc'; |
|
for (var i=0; i<6; i++) { |
|
document.$formname.$role_element.options[i].value = allroles[i]; |
|
document.$formname.$role_element.options[i].text = courserolenames[i]; |
|
} |
|
} |
|
} |
|
} |
|
return; |
|
} |
|
|; |
|
} |
return $setsections; |
return $setsections; |
} |
} |
|
|
|
|
sub selectcourse_link { |
sub selectcourse_link { |
my ($form,$unameele,$udomele,$desc,$extra_element,$multflag,$selecttype)=@_; |
my ($form,$unameele,$udomele,$desc,$extra_element,$multflag,$selecttype, |
return "<a href='".'javascript:opencrsbrowser("'.$form.'","'.$unameele. |
$typeelement) = @_; |
'","'.$udomele.'","'.$desc.'","'.$extra_element.'","'.$multflag.'","'.$selecttype.'");'."'>".&mt('Select Course')."</a>"; |
my $type = $selecttype; |
|
my $linktext = &mt('Select Course'); |
|
if ($selecttype eq 'Community') { |
|
$linktext = &mt('Select Community'); |
|
} elsif ($selecttype eq 'Course/Community') { |
|
$linktext = &mt('Select Course/Community'); |
|
$type = ''; |
|
} elsif ($selecttype eq 'Select') { |
|
$linktext = &mt('Select'); |
|
$type = ''; |
|
} |
|
return '<span class="LC_nobreak">' |
|
."<a href='" |
|
.'javascript:opencrsbrowser("'.$form.'","'.$unameele |
|
.'","'.$udomele.'","'.$desc.'","'.$extra_element |
|
.'","'.$multflag.'","'.$type.'","'.$typeelement.'");' |
|
."'>".$linktext.'</a>' |
|
.'</span>'; |
|
} |
|
|
|
sub selectauthor_link { |
|
my ($form,$udom)=@_; |
|
return '<a href="javascript:openauthorbrowser('."'$form','$udom'".');">'. |
|
&mt('Select Author').'</a>'; |
|
} |
|
|
|
sub selectuser_link { |
|
my ($form,$unameelem,$domelem,$lastelem,$firstelem,$emailelem,$hdomelem, |
|
$coursedom,$linktext,$caller) = @_; |
|
return '<a href="javascript:openuserbrowser('."'$form','$unameelem','$domelem',". |
|
"'$lastelem','$firstelem','$emailelem','$hdomelem','$coursedom','$caller'". |
|
');">'.$linktext.'</a>'; |
} |
} |
|
|
sub check_uncheck_jscript { |
sub check_uncheck_jscript { |
Line 535 ENDSCRT
|
Line 903 ENDSCRT
|
return $jscript; |
return $jscript; |
} |
} |
|
|
|
sub select_timezone { |
|
my ($name,$selected,$onchange,$includeempty)=@_; |
|
my $output='<select name="'.$name.'" '.$onchange.'>'."\n"; |
|
if ($includeempty) { |
|
$output .= '<option value=""'; |
|
if (($selected eq '') || ($selected eq 'local')) { |
|
$output .= ' selected="selected" '; |
|
} |
|
$output .= '> </option>'; |
|
} |
|
my @timezones = DateTime::TimeZone->all_names; |
|
foreach my $tzone (@timezones) { |
|
$output.= '<option value="'.$tzone.'"'; |
|
if ($tzone eq $selected) { |
|
$output.=' selected="selected"'; |
|
} |
|
$output.=">$tzone</option>\n"; |
|
} |
|
$output.="</select>"; |
|
return $output; |
|
} |
|
|
|
sub select_datelocale { |
|
my ($name,$selected,$onchange,$includeempty)=@_; |
|
my $output='<select name="'.$name.'" '.$onchange.'>'."\n"; |
|
if ($includeempty) { |
|
$output .= '<option value=""'; |
|
if ($selected eq '') { |
|
$output .= ' selected="selected" '; |
|
} |
|
$output .= '> </option>'; |
|
} |
|
my (@possibles,%locale_names); |
|
my @locales = DateTime::Locale::Catalog::Locales; |
|
foreach my $locale (@locales) { |
|
if (ref($locale) eq 'HASH') { |
|
my $id = $locale->{'id'}; |
|
if ($id ne '') { |
|
my $en_terr = $locale->{'en_territory'}; |
|
my $native_terr = $locale->{'native_territory'}; |
|
my @languages = &Apache::lonlocal::preferred_languages(); |
|
if (grep(/^en$/,@languages) || !@languages) { |
|
if ($en_terr ne '') { |
|
$locale_names{$id} = '('.$en_terr.')'; |
|
} elsif ($native_terr ne '') { |
|
$locale_names{$id} = $native_terr; |
|
} |
|
} else { |
|
if ($native_terr ne '') { |
|
$locale_names{$id} = $native_terr.' '; |
|
} elsif ($en_terr ne '') { |
|
$locale_names{$id} = '('.$en_terr.')'; |
|
} |
|
} |
|
push (@possibles,$id); |
|
} |
|
} |
|
} |
|
foreach my $item (sort(@possibles)) { |
|
$output.= '<option value="'.$item.'"'; |
|
if ($item eq $selected) { |
|
$output.=' selected="selected"'; |
|
} |
|
$output.=">$item"; |
|
if ($locale_names{$item} ne '') { |
|
$output.=" $locale_names{$item}</option>\n"; |
|
} |
|
$output.="</option>\n"; |
|
} |
|
$output.="</select>"; |
|
return $output; |
|
} |
|
|
|
sub select_language { |
|
my ($name,$selected,$includeempty) = @_; |
|
my %langchoices; |
|
if ($includeempty) { |
|
%langchoices = ('' => 'No language preference'); |
|
} |
|
foreach my $id (&languageids()) { |
|
my $code = &supportedlanguagecode($id); |
|
if ($code) { |
|
$langchoices{$code} = &plainlanguagedescription($id); |
|
} |
|
} |
|
return &select_form($selected,$name,\%langchoices); |
|
} |
|
|
=pod |
=pod |
|
|
=item * linked_select_forms(...) |
=item * &linked_select_forms(...) |
|
|
linked_select_forms returns a string containing a <script></script> block |
linked_select_forms returns a string containing a <script></script> block |
and html for two <select> menus. The select menus will be linked in that |
and html for two <select> menus. The select menus will be linked in that |
changing the value of the first menu will result in new values being placed |
changing the value of the first menu will result in new values being placed |
in the second menu. The values in the select menu will appear in alphabetical |
in the second menu. The values in the select menu will appear in alphabetical |
order. |
order unless a defined order is provided. |
|
|
linked_select_forms takes the following ordered inputs: |
linked_select_forms takes the following ordered inputs: |
|
|
Line 562 linked_select_forms takes the following
|
Line 1017 linked_select_forms takes the following
|
|
|
=item * $hashref, a reference to a hash containing the data for the menus. |
=item * $hashref, a reference to a hash containing the data for the menus. |
|
|
|
=item * $menuorder, the order of values in the first menu |
|
|
=back |
=back |
|
|
Below is an example of such a hash. Only the 'text', 'default', and |
Below is an example of such a hash. Only the 'text', 'default', and |
Line 578 $menu{$choice1}->{'select2'}.
|
Line 1035 $menu{$choice1}->{'select2'}.
|
B2 => "Choice B2", |
B2 => "Choice B2", |
B3 => "Choice B3", |
B3 => "Choice B3", |
B4 => "Choice B4" |
B4 => "Choice B4" |
} |
}, |
|
order => ['B4','B3','B1','B2'], |
}, |
}, |
A2 => { text =>"Choice A2" , |
A2 => { text =>"Choice A2" , |
default => "C2", |
default => "C2", |
Line 586 $menu{$choice1}->{'select2'}.
|
Line 1044 $menu{$choice1}->{'select2'}.
|
C1 => "Choice C1", |
C1 => "Choice C1", |
C2 => "Choice C2", |
C2 => "Choice C2", |
C3 => "Choice C3" |
C3 => "Choice C3" |
} |
}, |
|
order => ['C2','C1','C3'], |
}, |
}, |
A3 => { text =>"Choice A3" , |
A3 => { text =>"Choice A3" , |
default => "D6", |
default => "D6", |
Line 598 $menu{$choice1}->{'select2'}.
|
Line 1057 $menu{$choice1}->{'select2'}.
|
D5 => "Choice D5", |
D5 => "Choice D5", |
D6 => "Choice D6", |
D6 => "Choice D6", |
D7 => "Choice D7" |
D7 => "Choice D7" |
} |
}, |
|
order => ['D4','D3','D2','D1','D7','D6','D5'], |
} |
} |
); |
); |
|
|
Line 610 sub linked_select_forms {
|
Line 1070 sub linked_select_forms {
|
$firstdefault, |
$firstdefault, |
$firstselectname, |
$firstselectname, |
$secondselectname, |
$secondselectname, |
$hashref |
$hashref, |
|
$menuorder, |
) = @_; |
) = @_; |
my $second = "document.$formname.$secondselectname"; |
my $second = "document.$formname.$secondselectname"; |
my $first = "document.$formname.$firstselectname"; |
my $first = "document.$formname.$firstselectname"; |
# output the javascript to do the changing |
# output the javascript to do the changing |
my $result = ''; |
my $result = ''; |
$result.="<script type=\"text/javascript\">\n"; |
$result.='<script type="text/javascript" language="JavaScript">'."\n"; |
|
$result.="// <![CDATA[\n"; |
$result.="var select2data = new Object();\n"; |
$result.="var select2data = new Object();\n"; |
$" = '","'; |
$" = '","'; |
my $debug = ''; |
my $debug = ''; |
Line 624 sub linked_select_forms {
|
Line 1086 sub linked_select_forms {
|
$result.="select2data.d_$s1 = new Object();\n"; |
$result.="select2data.d_$s1 = new Object();\n"; |
$result.="select2data.d_$s1.def = new String('". |
$result.="select2data.d_$s1.def = new String('". |
$hashref->{$s1}->{'default'}."');\n"; |
$hashref->{$s1}->{'default'}."');\n"; |
$result.="select2data.d_$s1.values = new Array("; |
$result.="select2data.d_$s1.values = new Array("; |
my @s2values = sort(keys( %{ $hashref->{$s1}->{'select2'} } )); |
my @s2values = sort(keys( %{ $hashref->{$s1}->{'select2'} } )); |
|
if (ref($hashref->{$s1}->{'order'}) eq 'ARRAY') { |
|
@s2values = @{$hashref->{$s1}->{'order'}}; |
|
} |
$result.="\"@s2values\");\n"; |
$result.="\"@s2values\");\n"; |
$result.="select2data.d_$s1.texts = new Array("; |
$result.="select2data.d_$s1.texts = new Array("; |
my @s2texts; |
my @s2texts; |
Line 659 function select1_changed() {
|
Line 1124 function select1_changed() {
|
} |
} |
} |
} |
} |
} |
|
// ]]> |
</script> |
</script> |
END |
END |
# output the initial values for the selection lists |
# output the initial values for the selection lists |
$result .= "<select size=\"1\" name=\"$firstselectname\" onchange=\"select1_changed()\">\n"; |
$result .= "<select size=\"1\" name=\"$firstselectname\" onchange=\"select1_changed()\">\n"; |
foreach my $value (sort(keys(%$hashref))) { |
my @order = sort(keys(%{$hashref})); |
|
if (ref($menuorder) eq 'ARRAY') { |
|
@order = @{$menuorder}; |
|
} |
|
foreach my $value (@order) { |
$result.=" <option value=\"$value\" "; |
$result.=" <option value=\"$value\" "; |
$result.=" selected=\"selected\" " if ($value eq $firstdefault); |
$result.=" selected=\"selected\" " if ($value eq $firstdefault); |
$result.=">".&mt($hashref->{$value}->{'text'})."</option>\n"; |
$result.=">".&mt($hashref->{$value}->{'text'})."</option>\n"; |
Line 673 END
|
Line 1143 END
|
$result .= $middletext; |
$result .= $middletext; |
$result .= "<select size=\"1\" name=\"$secondselectname\">\n"; |
$result .= "<select size=\"1\" name=\"$secondselectname\">\n"; |
my $seconddefault = $hashref->{$firstdefault}->{'default'}; |
my $seconddefault = $hashref->{$firstdefault}->{'default'}; |
foreach my $value (sort(keys(%select2))) { |
|
|
my @secondorder = sort(keys(%select2)); |
|
if (ref($hashref->{$firstdefault}->{'order'}) eq 'ARRAY') { |
|
@secondorder = @{$hashref->{$firstdefault}->{'order'}}; |
|
} |
|
foreach my $value (@secondorder) { |
$result.=" <option value=\"$value\" "; |
$result.=" <option value=\"$value\" "; |
$result.=" selected=\"selected\" " if ($value eq $seconddefault); |
$result.=" selected=\"selected\" " if ($value eq $seconddefault); |
$result.=">".&mt($select2{$value})."</option>\n"; |
$result.=">".&mt($select2{$value})."</option>\n"; |
Line 685 END
|
Line 1160 END
|
|
|
=pod |
=pod |
|
|
=item * help_open_topic($topic, $text, $stayOnPage, $width, $height) |
=item * &help_open_topic($topic,$text,$stayOnPage,$width,$height,$imgid) |
|
|
Returns a string corresponding to an HTML link to the given help |
Returns a string corresponding to an HTML link to the given help |
$topic, where $topic corresponds to the name of a .tex file in |
$topic, where $topic corresponds to the name of a .tex file in |
Line 703 a new window using Javascript. (Default
|
Line 1178 a new window using Javascript. (Default
|
|
|
$width and $height are optional numerical parameters that will |
$width and $height are optional numerical parameters that will |
override the width and height of the popped up window, which may |
override the width and height of the popped up window, which may |
be useful for certain help topics with big pictures included. |
be useful for certain help topics with big pictures included. |
|
|
|
$imgid is the id of the img tag used for the help icon. This may be |
|
used in a javascript call to switch the image src. See |
|
lonhtmlcommon::htmlareaselectactive() for an example. |
|
|
=cut |
=cut |
|
|
sub help_open_topic { |
sub help_open_topic { |
my ($topic, $text, $stayOnPage, $width, $height) = @_; |
my ($topic, $text, $stayOnPage, $width, $height, $imgid) = @_; |
$text = "" if (not defined $text); |
$text = "" if (not defined $text); |
$stayOnPage = 0 if (not defined $stayOnPage); |
$stayOnPage = 0 if (not defined $stayOnPage); |
if ($env{'browser.interface'} eq 'textual') { |
|
$stayOnPage=1; |
|
} |
|
$width = 350 if (not defined $width); |
$width = 350 if (not defined $width); |
$height = 400 if (not defined $height); |
$height = 400 if (not defined $height); |
my $filename = $topic; |
my $filename = $topic; |
Line 731 sub help_open_topic {
|
Line 1207 sub help_open_topic {
|
} |
} |
|
|
# Add the text |
# Add the text |
if ($text ne "") { |
if ($text ne "") { |
$template .= |
$template.='<span class="LC_help_open_topic">' |
"<table bgcolor='#3333AA' cellspacing='1' cellpadding='1' border='0'><tr>". |
.'<a target="_top" href="'.$link.'">' |
"<td bgcolor='#5555FF'><a target=\"_top\" href=\"$link\"><font color='#FFFFFF' size='2'>$text</font></a>"; |
.$text.'</a>'; |
} |
} |
|
|
# Add the graphic |
# (Always) Add the graphic |
my $title = &mt('Online Help'); |
my $title = &mt('Online Help'); |
my $helpicon=&lonhttpdurl("/adm/help/gif/smallHelp.gif"); |
my $helpicon=&lonhttpdurl("/adm/help/help.png"); |
$template .= <<"ENDTEMPLATE"; |
if ($imgid ne '') { |
<a target="_top" href="$link" title="$title"><img src="$helpicon" border="0" alt="(Help: $topic)" /></a> |
$imgid = ' id="'.$imgid.'"'; |
ENDTEMPLATE |
} |
if ($text ne '') { $template.='</td></tr></table>' }; |
$template.=' <a target="_top" href="'.$link.'" title="'.$title.'">' |
|
.'<img src="'.$helpicon.'" border="0"' |
|
.' alt="'.&mt('Help: [_1]',$topic).'"' |
|
.' title="'.$title.'" style="vertical-align:middle;"'.$imgid |
|
.' /></a>'; |
|
if ($text ne "") { |
|
$template.='</span>'; |
|
} |
return $template; |
return $template; |
|
|
} |
} |
Line 751 ENDTEMPLATE
|
Line 1234 ENDTEMPLATE
|
# This is a quicky function for Latex cheatsheet editing, since it |
# This is a quicky function for Latex cheatsheet editing, since it |
# appears in at least four places |
# appears in at least four places |
sub helpLatexCheatsheet { |
sub helpLatexCheatsheet { |
my $other = shift; |
my ($topic,$text,$not_author) = @_; |
|
my $out; |
my $addOther = ''; |
my $addOther = ''; |
if ($other) { |
if ($topic) { |
$addOther = Apache::loncommon::help_open_topic($other, shift, |
$addOther = '<span>'.&Apache::loncommon::help_open_topic($topic,&mt($text), |
undef, undef, 600) . |
undef, undef, 600). |
'</td><td>'; |
'</span> '; |
} |
} |
return '<table><tr><td>'. |
$out = '<span>' # Start cheatsheet |
$addOther . |
.$addOther |
&Apache::loncommon::help_open_topic("Greek_Symbols",'Greek Symbols', |
.'<span>' |
undef,undef,600) |
.&Apache::loncommon::help_open_topic('Greek_Symbols',&mt('Greek Symbols'), |
.'</td><td>'. |
undef,undef,600) |
&Apache::loncommon::help_open_topic("Other_Symbols",'Other Symbols', |
.'</span> <span>' |
undef,undef,600) |
.&Apache::loncommon::help_open_topic('Other_Symbols',&mt('Other Symbols'), |
.'</td></tr></table>'; |
undef,undef,600) |
|
.'</span>'; |
|
unless ($not_author) { |
|
$out .= ' <span>' |
|
.&Apache::loncommon::help_open_topic('Authoring_Output_Tags',&mt('Output Tags'), |
|
undef,undef,600) |
|
.'</span>'; |
|
} |
|
$out .= '</span>'; # End cheatsheet |
|
return $out; |
} |
} |
|
|
sub general_help { |
sub general_help { |
my $helptopic='Student_Intro'; |
my $helptopic='Student_Intro'; |
if ($env{'request.role'}=~/^(ca|au)/) { |
if ($env{'request.role'}=~/^(ca|au)/) { |
$helptopic='Authoring_Intro'; |
$helptopic='Authoring_Intro'; |
} elsif ($env{'request.role'}=~/^cc/) { |
} elsif ($env{'request.role'}=~/^(cc|co)/) { |
$helptopic='Course_Coordination_Intro'; |
$helptopic='Course_Coordination_Intro'; |
|
} elsif ($env{'request.role'}=~/^dc/) { |
|
$helptopic='Domain_Coordination_Intro'; |
} |
} |
return $helptopic; |
return $helptopic; |
} |
} |
Line 790 sub update_help_link {
|
Line 1285 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 $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"; |
my $output .= <<"ENDOUTPUT"; |
<script type="text/javascript"> |
<script type="text/javascript"> |
|
// <![CDATA[ |
banner_link = '$banner_link'; |
banner_link = '$banner_link'; |
|
// ]]> |
</script> |
</script> |
ENDOUTPUT |
ENDOUTPUT |
return $output; |
return $output; |
Line 800 ENDOUTPUT
|
Line 1297 ENDOUTPUT
|
sub help_open_menu { |
sub help_open_menu { |
my ($topic,$component_help,$faq,$bug,$stayOnPage,$width,$height,$text) |
my ($topic,$component_help,$faq,$bug,$stayOnPage,$width,$height,$text) |
= @_; |
= @_; |
$stayOnPage = 0 if (not defined $stayOnPage); |
$stayOnPage = 1; |
# only use pop-up help (stayOnPage == 0) |
|
# if environment.remote is on (using remote control UI) |
|
if ($env{'browser.interface'} eq 'textual' || |
|
$env{'environment.remote'} eq 'off' ) { |
|
$stayOnPage=1; |
|
} |
|
my $output; |
my $output; |
if ($component_help) { |
if ($component_help) { |
if (!$text) { |
if (!$text) { |
Line 827 sub help_open_menu {
|
Line 1318 sub help_open_menu {
|
sub top_nav_help { |
sub top_nav_help { |
my ($text) = @_; |
my ($text) = @_; |
$text = &mt($text); |
$text = &mt($text); |
my $stay_on_page = |
my $stay_on_page = 1; |
($env{'browser.interface'} eq 'textual' || |
|
$env{'environment.remote'} eq 'off' ); |
|
my $link = ($stay_on_page) ? "javascript:helpMenu('display')" |
my $link = ($stay_on_page) ? "javascript:helpMenu('display')" |
: "javascript:helpMenu('open')"; |
: "javascript:helpMenu('open')"; |
my $banner_link = &update_help_link(undef,undef,undef,undef,$stay_on_page); |
my $banner_link = &update_help_link(undef,undef,undef,undef,$stay_on_page); |
Line 844 END
|
Line 1334 END
|
|
|
sub help_menu_js { |
sub help_menu_js { |
my ($text) = @_; |
my ($text) = @_; |
|
my $stayOnPage = 1; |
my $stayOnPage = |
|
($env{'browser.interface'} eq 'textual' || |
|
$env{'environment.remote'} eq 'off' ); |
|
|
|
my $width = 620; |
my $width = 620; |
my $height = 600; |
my $height = 600; |
my $helptopic=&general_help(); |
my $helptopic=&general_help(); |
Line 867 sub help_menu_js {
|
Line 1353 sub help_menu_js {
|
|
|
my $template .= <<"ENDTEMPLATE"; |
my $template .= <<"ENDTEMPLATE"; |
<script type="text/javascript"> |
<script type="text/javascript"> |
// <!-- BEGIN LON-CAPA Internal |
|
// <![CDATA[ |
// <![CDATA[ |
|
// <!-- BEGIN LON-CAPA Internal |
var banner_link = ''; |
var banner_link = ''; |
function helpMenu(target) { |
function helpMenu(target) { |
var caller = this; |
var caller = this; |
Line 893 function writeHelp(caller) {
|
Line 1379 function writeHelp(caller) {
|
caller.document.close() |
caller.document.close() |
caller.focus() |
caller.focus() |
} |
} |
// ]]> |
|
// END LON-CAPA Internal --> |
// END LON-CAPA Internal --> |
|
// ]]> |
</script> |
</script> |
ENDTEMPLATE |
ENDTEMPLATE |
return $template; |
return $template; |
Line 905 sub help_open_bug {
|
Line 1391 sub help_open_bug {
|
unless ($env{'user.adv'}) { return ''; } |
unless ($env{'user.adv'}) { return ''; } |
unless ($Apache::lonnet::perlvar{'BugzillaHost'}) { return ''; } |
unless ($Apache::lonnet::perlvar{'BugzillaHost'}) { return ''; } |
$text = "" if (not defined $text); |
$text = "" if (not defined $text); |
$stayOnPage = 0 if (not defined $stayOnPage); |
|
if ($env{'browser.interface'} eq 'textual' || |
|
$env{'environment.remote'} eq 'off' ) { |
|
$stayOnPage=1; |
$stayOnPage=1; |
} |
|
$width = 600 if (not defined $width); |
$width = 600 if (not defined $width); |
$height = 600 if (not defined $height); |
$height = 600 if (not defined $height); |
|
|
Line 931 sub help_open_bug {
|
Line 1413 sub help_open_bug {
|
{ |
{ |
$template .= |
$template .= |
"<table bgcolor='#AA3333' cellspacing='1' cellpadding='1' border='0'><tr>". |
"<table bgcolor='#AA3333' cellspacing='1' cellpadding='1' border='0'><tr>". |
"<td bgcolor='#FF5555'><a target=\"_top\" href=\"$link\"><font color='#FFFFFF' size='2'>$text</font></a>"; |
"<td bgcolor='#FF5555'><a target=\"_top\" href=\"$link\"><span style=\"color:#FFFFFF;font-size:10pt;\">$text</span></a>"; |
} |
} |
|
|
# Add the graphic |
# Add the graphic |
Line 950 sub help_open_faq {
|
Line 1432 sub help_open_faq {
|
unless ($env{'user.adv'}) { return ''; } |
unless ($env{'user.adv'}) { return ''; } |
unless ($Apache::lonnet::perlvar{'FAQHost'}) { return ''; } |
unless ($Apache::lonnet::perlvar{'FAQHost'}) { return ''; } |
$text = "" if (not defined $text); |
$text = "" if (not defined $text); |
$stayOnPage = 0 if (not defined $stayOnPage); |
|
if ($env{'browser.interface'} eq 'textual' || |
|
$env{'environment.remote'} eq 'off' ) { |
|
$stayOnPage=1; |
$stayOnPage=1; |
} |
|
$width = 350 if (not defined $width); |
$width = 350 if (not defined $width); |
$height = 400 if (not defined $height); |
$height = 400 if (not defined $height); |
|
|
Line 976 sub help_open_faq {
|
Line 1454 sub help_open_faq {
|
{ |
{ |
$template .= |
$template .= |
"<table bgcolor='#337733' cellspacing='1' cellpadding='1' border='0'><tr>". |
"<table bgcolor='#337733' cellspacing='1' cellpadding='1' border='0'><tr>". |
"<td bgcolor='#448844'><a target=\"_top\" href=\"$link\"><font color='#FFFFFF' size='2'>$text</font></a>"; |
"<td bgcolor='#448844'><a target=\"_top\" href=\"$link\"><span style=\"color:#FFFFFF; font-size:10pt;\">$text</span></a>"; |
} |
} |
|
|
# Add the graphic |
# Add the graphic |
Line 995 ENDTEMPLATE
|
Line 1473 ENDTEMPLATE
|
|
|
=pod |
=pod |
|
|
=item * change_content_javascript(): |
=item * &change_content_javascript(): |
|
|
This and the next function allow you to create small sections of an |
This and the next function allow you to create small sections of an |
otherwise static HTML page that you can update on the fly with |
otherwise static HTML page that you can update on the fly with |
Line 1050 DOMBASED
|
Line 1528 DOMBASED
|
|
|
=pod |
=pod |
|
|
=item * changable_area($name, $origContent): |
=item * &changable_area($name,$origContent): |
|
|
This provides a "changable area" that can be modified on the fly via |
This provides a "changable area" that can be modified on the fly via |
the Javascript code provided in C<change_content_javascript>. $name is |
the Javascript code provided in C<change_content_javascript>. $name is |
Line 1074 sub changable_area {
|
Line 1552 sub changable_area {
|
|
|
=pod |
=pod |
|
|
=item * resize_textarea_js |
=item * &viewport_geometry_js |
|
|
|
Provides javascript object (Geometry) which can provide information about the viewport geometry for the client browser. |
|
|
|
=cut |
|
|
|
|
|
sub viewport_geometry_js { |
|
return <<"GEOMETRY"; |
|
var Geometry = {}; |
|
function init_geometry() { |
|
if (Geometry.init) { return }; |
|
Geometry.init=1; |
|
if (window.innerHeight) { |
|
Geometry.getViewportHeight = function() { return window.innerHeight; }; |
|
Geometry.getViewportWidth = function() { return window.innerWidth; }; |
|
Geometry.getHorizontalScroll = function() { return window.pageXOffset; }; |
|
Geometry.getVerticalScroll = function() { return window.pageYOffset; }; |
|
} |
|
else if (document.documentElement && document.documentElement.clientHeight) { |
|
Geometry.getViewportHeight = |
|
function() { return document.documentElement.clientHeight; }; |
|
Geometry.getViewportWidth = |
|
function() { return document.documentElement.clientWidth; }; |
|
|
|
Geometry.getHorizontalScroll = |
|
function() { return document.documentElement.scrollLeft; }; |
|
Geometry.getVerticalScroll = |
|
function() { return document.documentElement.scrollTop; }; |
|
} |
|
else if (document.body.clientHeight) { |
|
Geometry.getViewportHeight = |
|
function() { return document.body.clientHeight; }; |
|
Geometry.getViewportWidth = |
|
function() { return document.body.clientWidth; }; |
|
Geometry.getHorizontalScroll = |
|
function() { return document.body.scrollLeft; }; |
|
Geometry.getVerticalScroll = |
|
function() { return document.body.scrollTop; }; |
|
} |
|
} |
|
|
|
GEOMETRY |
|
} |
|
|
|
=pod |
|
|
|
=item * &viewport_size_js() |
|
|
|
Provides a javascript function to set values of two form elements - width and height (elements are passed in as arguments to the javascript function) to the dimensions of the user's browser window. |
|
|
|
=cut |
|
|
|
sub viewport_size_js { |
|
my $geometry = &viewport_geometry_js(); |
|
return <<"DIMS"; |
|
|
|
$geometry |
|
|
|
function getViewportDims(width,height) { |
|
init_geometry(); |
|
width.value = Geometry.getViewportWidth(); |
|
height.value = Geometry.getViewportHeight(); |
|
return; |
|
} |
|
|
|
DIMS |
|
} |
|
|
|
=pod |
|
|
|
=item * &resize_textarea_js() |
|
|
emits the needed javascript to resize a textarea to be as big as possible |
emits the needed javascript to resize a textarea to be as big as possible |
|
|
Line 1083 the id of the element to resize, second
|
Line 1632 the id of the element to resize, second
|
surrounds everything that comes after the textarea, this routine needs |
surrounds everything that comes after the textarea, this routine needs |
to be attached to the <body> for the onload and onresize events. |
to be attached to the <body> for the onload and onresize events. |
|
|
|
=back |
|
|
=cut |
=cut |
|
|
sub resize_textarea_js { |
sub resize_textarea_js { |
|
my $geometry = &viewport_geometry_js(); |
return <<"RESIZE"; |
return <<"RESIZE"; |
<script type="text/javascript"> |
<script type="text/javascript"> |
var Geometry = {}; |
// <![CDATA[ |
function init_geometry() { |
$geometry |
if (Geometry.init) { return }; |
|
Geometry.init=1; |
function getX(element) { |
if (window.innerHeight) { |
var x = 0; |
Geometry.getViewportHeight = function() { return window.innerHeight; }; |
while (element) { |
} |
x += element.offsetLeft; |
else if (document.documentElement && document.documentElement.clientHeight) { |
element = element.offsetParent; |
Geometry.getViewportHeight = |
} |
function() { return document.documentElement.clientHeight; }; |
return x; |
} |
} |
else if (document.body.clientHeight) { |
function getY(element) { |
Geometry.getViewportHeight = |
var y = 0; |
function() { return document.body.clientHeight; }; |
while (element) { |
|
y += element.offsetTop; |
|
element = element.offsetParent; |
} |
} |
|
return y; |
} |
} |
|
|
|
|
function resize_textarea(textarea_id,bottom_id) { |
function resize_textarea(textarea_id,bottom_id) { |
init_geometry(); |
init_geometry(); |
var textarea = document.getElementById(textarea_id); |
var textarea = document.getElementById(textarea_id); |
//alert(textarea); |
//alert(textarea); |
|
|
var textarea_top = textarea.offsetTop; |
var textarea_top = getY(textarea); |
var textarea_height = textarea.offsetHeight; |
var textarea_height = textarea.offsetHeight; |
var bottom = document.getElementById(bottom_id); |
var bottom = document.getElementById(bottom_id); |
var bottom_top = bottom.offsetTop; |
var bottom_top = getY(bottom); |
var bottom_height = bottom.offsetHeight; |
var bottom_height = bottom.offsetHeight; |
var window_height = Geometry.getViewportHeight(); |
var window_height = Geometry.getViewportHeight(); |
var fudge = 23; |
var fudge = 23; |
var new_height = window_height-fudge-textarea_top-bottom_height; |
var new_height = window_height-fudge-textarea_top-bottom_height; |
if (new_height < 300) { |
if (new_height < 300) { |
new_height = 300; |
new_height = 300; |
} |
} |
textarea.style.height=new_height+'px'; |
textarea.style.height=new_height+'px'; |
} |
} |
|
// ]]> |
</script> |
</script> |
RESIZE |
RESIZE |
|
|
Line 1131 RESIZE
|
Line 1687 RESIZE
|
|
|
=pod |
=pod |
|
|
=back |
|
|
|
=head1 Excel and CSV file utility routines |
=head1 Excel and CSV file utility routines |
|
|
=over 4 |
=over 4 |
Line 1144 RESIZE
|
Line 1698 RESIZE
|
|
|
=pod |
=pod |
|
|
=item * csv_translate($text) |
=item * &csv_translate($text) |
|
|
Translate $text to allow it to be output as a 'comma separated values' |
Translate $text to allow it to be output as a 'comma separated values' |
format. |
format. |
Line 1165 sub csv_translate {
|
Line 1719 sub csv_translate {
|
|
|
=pod |
=pod |
|
|
=item * define_excel_formats |
=item * &define_excel_formats() |
|
|
Define some commonly used Excel cell formats. |
Define some commonly used Excel cell formats. |
|
|
Line 1221 sub define_excel_formats {
|
Line 1775 sub define_excel_formats {
|
|
|
=pod |
=pod |
|
|
=item * create_workbook |
=item * &create_workbook() |
|
|
Create an Excel worksheet. If it fails, output message on the |
Create an Excel worksheet. If it fails, output message on the |
request object and return undefs. |
request object and return undefs. |
Line 1246 sub create_workbook {
|
Line 1800 sub create_workbook {
|
my $workbook = Spreadsheet::WriteExcel->new('/home/httpd'.$filename); |
my $workbook = Spreadsheet::WriteExcel->new('/home/httpd'.$filename); |
if (! defined($workbook)) { |
if (! defined($workbook)) { |
$r->log_error("Error creating excel spreadsheet $filename: $!"); |
$r->log_error("Error creating excel spreadsheet $filename: $!"); |
$r->print('<p>'.&mt("Unable to create new Excel file. ". |
$r->print( |
"This error has been logged. ". |
'<p class="LC_error">' |
"Please alert your LON-CAPA administrator"). |
.&mt('Problems occurred in creating the new Excel file.') |
'</p>'); |
.' '.&mt('This error has been logged.') |
|
.' '.&mt('Please alert your LON-CAPA administrator.') |
|
.'</p>' |
|
); |
return (undef); |
return (undef); |
} |
} |
# |
# |
$workbook->set_tempdir('/home/httpd/perl/tmp'); |
$workbook->set_tempdir(LONCAPA::tempdir()); |
# |
# |
my $format = &Apache::loncommon::define_excel_formats($workbook); |
my $format = &Apache::loncommon::define_excel_formats($workbook); |
return ($workbook,$filename,$format); |
return ($workbook,$filename,$format); |
Line 1264 sub create_workbook {
|
Line 1821 sub create_workbook {
|
|
|
=pod |
=pod |
|
|
=item * create_text_file |
=item * &create_text_file() |
|
|
Create a file to write to and eventually make available to the user. |
Create a file to write to and eventually make available to the user. |
If file creation fails, outputs an error message on the request object and |
If file creation fails, outputs an error message on the request object and |
Line 1289 sub create_text_file {
|
Line 1846 sub create_text_file {
|
$fh = Apache::File->new('>/home/httpd'.$filename); |
$fh = Apache::File->new('>/home/httpd'.$filename); |
if (! defined($fh)) { |
if (! defined($fh)) { |
$r->log_error("Couldn't open $filename for output $!"); |
$r->log_error("Couldn't open $filename for output $!"); |
$r->print("Problems occured in creating the output file. ". |
$r->print( |
"This error has been logged. ". |
'<p class="LC_error">' |
"Please alert your LON-CAPA administrator."); |
.&mt('Problems occurred in creating the output file.') |
|
.' '.&mt('This error has been logged.') |
|
.' '.&mt('Please alert your LON-CAPA administrator.') |
|
.'</p>' |
|
); |
} |
} |
return ($fh,$filename) |
return ($fh,$filename) |
} |
} |
Line 1320 sub domain_select {
|
Line 1881 sub domain_select {
|
return &multiple_select_form($name,$value,4,\%domains); |
return &multiple_select_form($name,$value,4,\%domains); |
} else { |
} else { |
$domains{'select_form_order'} = [sort {lc($a) cmp lc($b) } (keys(%domains))]; |
$domains{'select_form_order'} = [sort {lc($a) cmp lc($b) } (keys(%domains))]; |
return &select_form($name,$value,%domains); |
return &select_form($name,$value,\%domains); |
} |
} |
} |
} |
|
|
Line 1332 sub domain_select {
|
Line 1893 sub domain_select {
|
|
|
=over 4 |
=over 4 |
|
|
=cut |
=item * &multiple_select_form($name,$value,$size,$hash,$order) |
|
|
=item * multiple_select_form($name,$value,$size,$hash,$order) |
|
|
|
Returns a string containing a <select> element int multiple mode |
Returns a string containing a <select> element int multiple mode |
|
|
Line 1360 sub multiple_select_form {
|
Line 1919 sub multiple_select_form {
|
$size = scalar(keys(%$hash)); |
$size = scalar(keys(%$hash)); |
} |
} |
} |
} |
$output.="\n<select name='$name' size='$size' multiple='1'>"; |
$output.="\n".'<select name="'.$name.'" size="'.$size.'" multiple="multiple">'; |
my @order; |
my @order; |
if (ref($order) eq 'ARRAY') { |
if (ref($order) eq 'ARRAY') { |
@order = @{$order}; |
@order = @{$order}; |
Line 1384 sub multiple_select_form {
|
Line 1943 sub multiple_select_form {
|
|
|
=pod |
=pod |
|
|
=item * select_form($defdom,$name,%hash) |
=item * &select_form($defdom,$name,$hashref,$onchange) |
|
|
Returns a string containing a <select name='$name' size='1'> form to |
Returns a string containing a <select name='$name' size='1'> form to |
allow a user to select options from a hash option_name => displayed text. |
allow a user to select options from a ref to a hash containing: |
|
option_name => displayed text. An optional $onchange can include |
|
a javascript onchange item, e.g., onchange="this.form.submit();" |
|
|
See lonrights.pm for an example invocation and use. |
See lonrights.pm for an example invocation and use. |
|
|
=cut |
=cut |
|
|
#------------------------------------------- |
#------------------------------------------- |
sub select_form { |
sub select_form { |
my ($def,$name,%hash) = @_; |
my ($def,$name,$hashref,$onchange) = @_; |
my $selectform = "<select name=\"$name\" size=\"1\">\n"; |
return unless (ref($hashref) eq 'HASH'); |
|
if ($onchange) { |
|
$onchange = ' onchange="'.$onchange.'"'; |
|
} |
|
my $selectform = "<select name=\"$name\" size=\"1\"$onchange>\n"; |
my @keys; |
my @keys; |
if (exists($hash{'select_form_order'})) { |
if (exists($hashref->{'select_form_order'})) { |
@keys=@{$hash{'select_form_order'}}; |
@keys=@{$hashref->{'select_form_order'}}; |
} else { |
} else { |
@keys=sort(keys(%hash)); |
@keys=sort(keys(%{$hashref})); |
} |
} |
foreach my $key (@keys) { |
foreach my $key (@keys) { |
$selectform.= |
$selectform.= |
'<option value="'.&HTML::Entities::encode($key,'"<>&').'" '. |
'<option value="'.&HTML::Entities::encode($key,'"<>&').'" '. |
($key eq $def ? 'selected="selected" ' : ''). |
($key eq $def ? 'selected="selected" ' : ''). |
">".&mt($hash{$key})."</option>\n"; |
">".$hashref->{$key}."</option>\n"; |
} |
} |
$selectform.="</select>"; |
$selectform.="</select>"; |
return $selectform; |
return $selectform; |
Line 1417 sub select_form {
|
Line 1983 sub select_form {
|
sub display_filter { |
sub display_filter { |
if (!$env{'form.show'}) { $env{'form.show'}=10; } |
if (!$env{'form.show'}) { $env{'form.show'}=10; } |
if (!$env{'form.displayfilter'}) { $env{'form.displayfilter'}='currentfolder'; } |
if (!$env{'form.displayfilter'}) { $env{'form.displayfilter'}='currentfolder'; } |
return '<nobr><label>'.&mt('Records [_1]', |
return '<span class="LC_nobreak"><label>'.&mt('Records [_1]', |
&Apache::lonmeta::selectbox('show',$env{'form.show'},undef, |
&Apache::lonmeta::selectbox('show',$env{'form.show'},undef, |
(&mt('all'),10,20,50,100,1000,10000))). |
(&mt('all'),10,20,50,100,1000,10000))). |
'</label></nobr> <nobr>'. |
'</label></span> <span class="LC_nobreak">'. |
&mt('Filter [_1]', |
&mt('Filter [_1]', |
&select_form($env{'form.displayfilter'}, |
&select_form($env{'form.displayfilter'}, |
'displayfilter', |
'displayfilter', |
('currentfolder' => 'Current folder/page', |
{'currentfolder' => 'Current folder/page', |
'containing' => 'Containing phrase', |
'containing' => 'Containing phrase', |
'none' => 'None'))). |
'none' => 'None'})). |
'<input type="text" name="containingphrase" size="30" value="'.&HTML::Entities::encode($env{'form.containingphrase'}).'" /></nobr>'; |
'<input type="text" name="containingphrase" size="30" value="'.&HTML::Entities::encode($env{'form.containingphrase'}).'" /></span>'; |
} |
} |
|
|
sub gradeleveldescription { |
sub gradeleveldescription { |
Line 1471 sub select_level_form {
|
Line 2037 sub select_level_form {
|
|
|
=pod |
=pod |
|
|
=item * select_dom_form($defdom,$name,$includeempty,$showdomdesc) |
=item * &select_dom_form($defdom,$name,$includeempty,$showdomdesc,$onchange,$incdoms) |
|
|
Returns a string containing a <select name='$name' size='1'> form to |
Returns a string containing a <select name='$name' size='1'> form to |
allow a user to select the domain to preform an operation in. |
allow a user to select the domain to preform an operation in. |
Line 1480 See loncreateuser.pm for an example invo
|
Line 2046 See loncreateuser.pm for an example invo
|
If the $includeempty flag is set, it also includes an empty choice ("no domain |
If the $includeempty flag is set, it also includes an empty choice ("no domain |
selected"); |
selected"); |
|
|
If the $showdomdesc flag is set, the domain name is followed by the domain description. |
If the $showdomdesc flag is set, the domain name is followed by the domain description. |
|
|
|
The optional $onchange argument specifies what should occur if the domain selector is changed, e.g., 'this.form.submit()' if the form is to be automatically submitted. |
|
|
|
The optional $incdoms is a reference to an array of domains which will be the only available options. |
|
|
=cut |
=cut |
|
|
#------------------------------------------- |
#------------------------------------------- |
sub select_dom_form { |
sub select_dom_form { |
my ($defdom,$name,$includeempty,$showdomdesc) = @_; |
my ($defdom,$name,$includeempty,$showdomdesc,$onchange,$incdoms) = @_; |
my @domains = sort {lc($a) cmp lc($b)} (&Apache::lonnet::all_domains()); |
if ($onchange) { |
|
$onchange = ' onchange="'.$onchange.'"'; |
|
} |
|
my @domains; |
|
if (ref($incdoms) eq 'ARRAY') { |
|
@domains = sort {lc($a) cmp lc($b)} (@{$incdoms}); |
|
} else { |
|
@domains = sort {lc($a) cmp lc($b)} (&Apache::lonnet::all_domains()); |
|
} |
if ($includeempty) { @domains=('',@domains); } |
if ($includeempty) { @domains=('',@domains); } |
my $selectdomain = "<select name=\"$name\" size=\"1\">\n"; |
my $selectdomain = "<select name=\"$name\" size=\"1\"$onchange>\n"; |
foreach my $dom (@domains) { |
foreach my $dom (@domains) { |
$selectdomain.="<option value=\"$dom\" ". |
$selectdomain.="<option value=\"$dom\" ". |
($dom eq $defdom ? 'selected="selected" ' : '').'>'.$dom; |
($dom eq $defdom ? 'selected="selected" ' : '').'>'.$dom; |
Line 1511 sub select_dom_form {
|
Line 2089 sub select_dom_form {
|
|
|
=pod |
=pod |
|
|
=item * home_server_form_item($domain,$name,$defaultflag) |
=item * &home_server_form_item($domain,$name,$defaultflag) |
|
|
input: 4 arguments (two required, two optional) - |
input: 4 arguments (two required, two optional) - |
$domain - domain of new user |
$domain - domain of new user |
Line 1520 input: 4 arguments (two required, two op
|
Line 2098 input: 4 arguments (two required, two op
|
option, and selected by default. |
option, and selected by default. |
$hide - Value of 'hide' causes hiding of the name of the server, |
$hide - Value of 'hide' causes hiding of the name of the server, |
if 1 server found, or default, if 0 found. |
if 1 server found, or default, if 0 found. |
output: returns 1 items: |
output: returns 2 items: |
(a) form element which contains either: |
(a) form element which contains either: |
(i) <select name="$name"> |
(i) <select name="$name"> |
<option value="$hostid1">$hostid $servers{$hostid}</option> |
<option value="$hostid1">$hostid $servers{$hostid}</option> |
Line 1545 sub home_server_form_item {
|
Line 2123 sub home_server_form_item {
|
if ($numlib > 1) { |
if ($numlib > 1) { |
$result .= '<select name="'.$name.'" />'."\n"; |
$result .= '<select name="'.$name.'" />'."\n"; |
if ($default) { |
if ($default) { |
$result .= '<option value="default" selected>'.&mt('default'). |
$result .= '<option value="default" selected="selected">'.&mt('default'). |
'</option>'."\n"; |
'</option>'."\n"; |
} |
} |
foreach my $hostid (sort(keys(%servers))) { |
foreach my $hostid (sort(keys(%servers))) { |
Line 1671 sub decode_user_agent {
|
Line 2249 sub decode_user_agent {
|
|
|
=over 4 |
=over 4 |
|
|
=item * authform_xxxxxx |
=item * &authform_xxxxxx() |
|
|
The authform_xxxxxx subroutines provide javascript and html forms which |
The authform_xxxxxx subroutines provide javascript and html forms which |
handle some of the conveniences required for authentication forms. |
handle some of the conveniences required for authentication forms. |
This is not an optimal method, but it works. |
This is not an optimal method, but it works. |
|
|
See loncreateuser.pm for invocation and use examples. |
|
|
|
=over 4 |
=over 4 |
|
|
=item * authform_header |
=item * authform_header |
Line 1695 See loncreateuser.pm for invocation and
|
Line 2271 See loncreateuser.pm for invocation and
|
|
|
=back |
=back |
|
|
=back |
See loncreateuser.pm for invocation and use examples. |
|
|
=cut |
=cut |
|
|
Line 1725 END
|
Line 2301 END
|
} |
} |
|
|
my $radioval = "'nochange'"; |
my $radioval = "'nochange'"; |
if (exists($in{'curr_authtype'}) && |
if (defined($in{'curr_authtype'})) { |
defined($in{'curr_authtype'}) && |
if ($in{'curr_authtype'} ne '') { |
$in{'curr_authtype'} ne '') { |
$radioval = "'".$in{'curr_authtype'}."arg'"; |
$radioval = "'$in{'curr_authtype'}arg'"; |
} |
} |
} |
my $argfield = 'null'; |
my $argfield = 'null'; |
if ( grep/^mode$/,(keys %in) ) { |
if (defined($in{'mode'})) { |
if ($in{'mode'} eq 'modifycourse') { |
if ($in{'mode'} eq 'modifycourse') { |
if ( grep/^curr_authtype$/,(keys %in) ) { |
if (defined($in{'curr_autharg'})) { |
$radioval = "'$in{'curr_authtype'}'"; |
if ($in{'curr_autharg'} ne '') { |
} |
|
if ( grep/^curr_autharg$/,(keys %in) ) { |
|
unless ($in{'curr_autharg'} eq '') { |
|
$argfield = "'$in{'curr_autharg'}'"; |
$argfield = "'$in{'curr_autharg'}'"; |
} |
} |
} |
} |
Line 1789 function changed_text(choice,currentform
|
Line 2362 function changed_text(choice,currentform
|
} |
} |
|
|
function set_auth_radio_buttons(newvalue,currentform) { |
function set_auth_radio_buttons(newvalue,currentform) { |
|
var numauthchoices = currentform.login.length; |
|
if (typeof numauthchoices == "undefined") { |
|
return; |
|
} |
var i=0; |
var i=0; |
while (i < currentform.login.length) { |
while (i < numauthchoices) { |
if (currentform.login[i].value == newvalue) { break; } |
if (currentform.login[i].value == newvalue) { break; } |
i++; |
i++; |
} |
} |
if (i == currentform.login.length) { |
if (i == numauthchoices) { |
return; |
return; |
} |
} |
current.radiovalue = newvalue; |
current.radiovalue = newvalue; |
Line 1834 sub authform_nochange{
|
Line 2411 sub authform_nochange{
|
return $result; |
return $result; |
} |
} |
|
|
sub authform_kerberos{ |
sub authform_kerberos { |
my %in = ( |
my %in = ( |
formname => 'document.cu', |
formname => 'document.cu', |
kerb_def_dom => 'MSU.EDU', |
kerb_def_dom => 'MSU.EDU', |
Line 1845 sub authform_kerberos{
|
Line 2422 sub authform_kerberos{
|
$autharg,$jscall); |
$autharg,$jscall); |
my ($authnum,%can_assign) = &get_assignable_auth($in{'domain'}); |
my ($authnum,%can_assign) = &get_assignable_auth($in{'domain'}); |
if ($in{'kerb_def_auth'} eq 'krb5') { |
if ($in{'kerb_def_auth'} eq 'krb5') { |
$check5 = ' checked="on"'; |
$check5 = ' checked="checked"'; |
} else { |
} else { |
$check4 = ' checked="on"'; |
$check4 = ' checked="checked"'; |
} |
} |
$krbarg = $in{'kerb_def_dom'}; |
$krbarg = $in{'kerb_def_dom'}; |
if (grep(/^curr_authtype$/,(keys(%in)))) { |
if (defined($in{'curr_authtype'})) { |
if ($in{'curr_authtype'} =~ m/^krb(\d+)$/) { |
if ($in{'curr_authtype'} eq 'krb') { |
$krbver = $1; |
$krbcheck = ' checked="checked"'; |
$krbcheck = ' checked="on"'; |
if (defined($in{'mode'})) { |
if ($krbver eq '5') { |
if ($in{'mode'} eq 'modifyuser') { |
$check5 = ' checked="on"'; |
$krbcheck = ''; |
$check4 = ''; |
} |
} else { |
|
$check4 = ' checked="on"'; |
|
$check5 = ''; |
|
} |
} |
if (grep(/^curr_autharg$/,(keys(%in)))) { |
if (defined($in{'curr_kerb_ver'})) { |
|
if ($in{'curr_krb_ver'} eq '5') { |
|
$check5 = ' checked="checked"'; |
|
$check4 = ''; |
|
} else { |
|
$check4 = ' checked="checked"'; |
|
$check5 = ''; |
|
} |
|
} |
|
if (defined($in{'curr_autharg'})) { |
$krbarg = $in{'curr_autharg'}; |
$krbarg = $in{'curr_autharg'}; |
} |
} |
if (!$can_assign{'krb4'} && !$can_assign{'krb5'}) { |
if (!$can_assign{'krb4'} && !$can_assign{'krb5'}) { |
if (grep(/^curr_autharg$/,(keys(%in)))) { |
if (defined($in{'curr_autharg'})) { |
$result = |
$result = |
&mt('Currently Kerberos authenticated with domain [_1] Version [_2].', |
&mt('Currently Kerberos authenticated with domain [_1] Version [_2].', |
$in{'curr_autharg'},$krbver); |
$in{'curr_autharg'},$krbver); |
Line 1878 sub authform_kerberos{
|
Line 2461 sub authform_kerberos{
|
} |
} |
} else { |
} else { |
if ($authnum == 1) { |
if ($authnum == 1) { |
$authtype = '<input type="hidden" name="login" value="krb">'; |
$authtype = '<input type="hidden" name="login" value="krb" />'; |
} |
} |
} |
} |
if (!$can_assign{'krb4'} && !$can_assign{'krb5'}) { |
if (!$can_assign{'krb4'} && !$can_assign{'krb5'}) { |
return; |
return; |
} elsif ($authtype eq '') { |
} elsif ($authtype eq '') { |
if (grep(/^mode$/,(keys(%in)))) { |
if (defined($in{'mode'})) { |
if ($in{'mode'} eq 'modifycourse') { |
if ($in{'mode'} eq 'modifycourse') { |
if ($authnum == 1) { |
if ($authnum == 1) { |
$authtype = '<input type="hidden" name="login" value="krb">'; |
$authtype = '<input type="hidden" name="login" value="krb" />'; |
} |
} |
} |
} |
} |
} |
Line 1945 sub authform_internal{
|
Line 2528 sub authform_internal{
|
); |
); |
my ($intcheck,$intarg,$result,$authtype,$autharg,$jscall); |
my ($intcheck,$intarg,$result,$authtype,$autharg,$jscall); |
my ($authnum,%can_assign) = &get_assignable_auth($in{'domain'}); |
my ($authnum,%can_assign) = &get_assignable_auth($in{'domain'}); |
if (grep(/^curr_authtype$/,(keys(%in)))) { |
if (defined($in{'curr_authtype'})) { |
if ($in{'curr_authtype'} eq 'internal:') { |
if ($in{'curr_authtype'} eq 'int') { |
if ($can_assign{'int'}) { |
if ($can_assign{'int'}) { |
$intcheck = 'checked="on" '; |
$intcheck = 'checked="checked" '; |
if (grep(/^curr_autharg$/,(keys(%in)))) { |
if (defined($in{'mode'})) { |
|
if ($in{'mode'} eq 'modifyuser') { |
|
$intcheck = ''; |
|
} |
|
} |
|
if (defined($in{'curr_autharg'})) { |
$intarg = $in{'curr_autharg'}; |
$intarg = $in{'curr_autharg'}; |
} |
} |
} else { |
} else { |
Line 1959 sub authform_internal{
|
Line 2547 sub authform_internal{
|
} |
} |
} else { |
} else { |
if ($authnum == 1) { |
if ($authnum == 1) { |
$authtype = '<input type="hidden" name="login" value="int">'; |
$authtype = '<input type="hidden" name="login" value="int" />'; |
} |
} |
} |
} |
if (!$can_assign{'int'}) { |
if (!$can_assign{'int'}) { |
return; |
return; |
} elsif ($authtype eq '') { |
} elsif ($authtype eq '') { |
if (grep(/^mode$/,(keys(%in)))) { |
if (defined($in{'mode'})) { |
if ($in{'mode'} eq 'modifycourse') { |
if ($in{'mode'} eq 'modifycourse') { |
if ($authnum == 1) { |
if ($authnum == 1) { |
$authtype = '<input type="hidden" name="login" value="int">'; |
$authtype = '<input type="hidden" name="login" value="int" />'; |
} |
} |
} |
} |
} |
} |
Line 1978 sub authform_internal{
|
Line 2566 sub authform_internal{
|
$authtype = '<input type="radio" name="login" value="int" '.$intcheck. |
$authtype = '<input type="radio" name="login" value="int" '.$intcheck. |
' onchange="'.$jscall.'" onclick="'.$jscall.'" />'; |
' onchange="'.$jscall.'" onclick="'.$jscall.'" />'; |
} |
} |
$autharg = '<input type="text" size="10" name="intarg" value="'. |
$autharg = '<input type="password" size="10" name="intarg" value="'. |
$intarg.'" onchange="'.$jscall.'" />'; |
$intarg.'" onchange="'.$jscall.'" />'; |
$result = &mt |
$result = &mt |
('[_1] Internally authenticated (with initial password [_2])', |
('[_1] Internally authenticated (with initial password [_2])', |
'<label>'.$authtype,'</label>'.$autharg); |
'<label>'.$authtype,'</label>'.$autharg); |
|
$result.="<label><input type=\"checkbox\" name=\"visible\" onclick='if (this.checked) { this.form.intarg.type=\"text\" } else { this.form.intarg.type=\"password\" }' />".&mt('Visible input').'</label>'; |
return $result; |
return $result; |
} |
} |
|
|
Line 1994 sub authform_local{
|
Line 2583 sub authform_local{
|
); |
); |
my ($loccheck,$locarg,$result,$authtype,$autharg,$jscall); |
my ($loccheck,$locarg,$result,$authtype,$autharg,$jscall); |
my ($authnum,%can_assign) = &get_assignable_auth($in{'domain'}); |
my ($authnum,%can_assign) = &get_assignable_auth($in{'domain'}); |
if (grep(/^curr_authtype$/,(keys(%in)))) { |
if (defined($in{'curr_authtype'})) { |
if ($in{'curr_authtype'} eq 'localauth:') { |
if ($in{'curr_authtype'} eq 'loc') { |
if ($can_assign{'loc'}) { |
if ($can_assign{'loc'}) { |
$loccheck = 'checked="on" '; |
$loccheck = 'checked="checked" '; |
if (grep(/^curr_autharg$/,(keys(%in)))) { |
if (defined($in{'mode'})) { |
|
if ($in{'mode'} eq 'modifyuser') { |
|
$loccheck = ''; |
|
} |
|
} |
|
if (defined($in{'curr_autharg'})) { |
$locarg = $in{'curr_autharg'}; |
$locarg = $in{'curr_autharg'}; |
} |
} |
} else { |
} else { |
Line 2008 sub authform_local{
|
Line 2602 sub authform_local{
|
} |
} |
} else { |
} else { |
if ($authnum == 1) { |
if ($authnum == 1) { |
$authtype = '<input type="hidden" name="login" value="loc">'; |
$authtype = '<input type="hidden" name="login" value="loc" />'; |
} |
} |
} |
} |
if (!$can_assign{'loc'}) { |
if (!$can_assign{'loc'}) { |
return; |
return; |
} elsif ($authtype eq '') { |
} elsif ($authtype eq '') { |
if (grep(/^mode$/,(keys(%in)))) { |
if (defined($in{'mode'})) { |
if ($in{'mode'} eq 'modifycourse') { |
if ($in{'mode'} eq 'modifycourse') { |
if ($authnum == 1) { |
if ($authnum == 1) { |
$authtype = '<input type="hidden" name="login" value="loc">'; |
$authtype = '<input type="hidden" name="login" value="loc" />'; |
} |
} |
} |
} |
} |
} |
Line 2043 sub authform_filesystem{
|
Line 2637 sub authform_filesystem{
|
); |
); |
my ($fsyscheck,$result,$authtype,$autharg,$jscall); |
my ($fsyscheck,$result,$authtype,$autharg,$jscall); |
my ($authnum,%can_assign) = &get_assignable_auth($in{'domain'}); |
my ($authnum,%can_assign) = &get_assignable_auth($in{'domain'}); |
if (grep(/^curr_authtype$/,(keys(%in)))) { |
if (defined($in{'curr_authtype'})) { |
if ($in{'curr_authtype'} eq 'unix:') { |
if ($in{'curr_authtype'} eq 'fsys') { |
if ($can_assign{'fsys'}) { |
if ($can_assign{'fsys'}) { |
$fsyscheck = 'checked="on" '; |
$fsyscheck = 'checked="checked" '; |
|
if (defined($in{'mode'})) { |
|
if ($in{'mode'} eq 'modifyuser') { |
|
$fsyscheck = ''; |
|
} |
|
} |
} else { |
} else { |
$result = &mt('Currently Filesystem Authenticated.'); |
$result = &mt('Currently Filesystem Authenticated.'); |
return $result; |
return $result; |
Line 2054 sub authform_filesystem{
|
Line 2653 sub authform_filesystem{
|
} |
} |
} else { |
} else { |
if ($authnum == 1) { |
if ($authnum == 1) { |
$authtype = '<input type="hidden" name="login" value="fsys">'; |
$authtype = '<input type="hidden" name="login" value="fsys" />'; |
} |
} |
} |
} |
if (!$can_assign{'fsys'}) { |
if (!$can_assign{'fsys'}) { |
return; |
return; |
} elsif ($authtype eq '') { |
} elsif ($authtype eq '') { |
if (grep(/^mode$/,(keys(%in)))) { |
if (defined($in{'mode'})) { |
if ($in{'mode'} eq 'modifycourse') { |
if ($in{'mode'} eq 'modifycourse') { |
if ($authnum == 1) { |
if ($authnum == 1) { |
$authtype = '<input type="hidden" name="login" value="fsys">'; |
$authtype = '<input type="hidden" name="login" value="fsys" />'; |
} |
} |
} |
} |
} |
} |
Line 2080 sub authform_filesystem{
|
Line 2679 sub authform_filesystem{
|
('[_1] Filesystem Authenticated (with initial password [_2])', |
('[_1] Filesystem Authenticated (with initial password [_2])', |
'<label><input type="radio" name="login" value="fsys" '. |
'<label><input type="radio" name="login" value="fsys" '. |
$fsyscheck.'onchange="'.$jscall.'" onclick="'.$jscall.'" />', |
$fsyscheck.'onchange="'.$jscall.'" onclick="'.$jscall.'" />', |
'</label><input type="text" size="10" name="fsysarg" value="" '. |
'</label><input type="password" size="10" name="fsysarg" value="" '. |
'onchange="'.$jscall.'" />'); |
'onchange="'.$jscall.'" />'); |
return $result; |
return $result; |
} |
} |
Line 2128 sub get_assignable_auth {
|
Line 2727 sub get_assignable_auth {
|
} |
} |
|
|
############################################################### |
############################################################### |
## Get Authentication Defaults for Domain ## |
|
############################################################### |
|
|
|
=pod |
|
|
|
=head1 Domains and Authentication |
|
|
|
Returns default authentication type and an associated argument as |
|
listed in file 'domain.tab'. |
|
|
|
=over 4 |
|
|
|
=item * get_auth_defaults |
|
|
|
get_auth_defaults($target_domain) returns the default authentication |
|
type and an associated argument (initial password or a kerberos domain). |
|
These values are stored in lonTabs/domain.tab |
|
|
|
($def_auth, $def_arg) = &get_auth_defaults($target_domain); |
|
|
|
If target_domain is not found in domain.tab, returns nothing (''). |
|
|
|
=cut |
|
|
|
#------------------------------------------- |
|
sub get_auth_defaults { |
|
my $domain=shift; |
|
return (&Apache::lonnet::domain($domain,'auth_def'), |
|
&Apache::lonnet::domain($domain,'auth_arg_def')); |
|
|
|
} |
|
############################################################### |
|
## End Get Authentication Defaults for Domain ## |
|
############################################################### |
|
|
|
############################################################### |
|
## Get Kerberos Defaults for Domain ## |
## Get Kerberos Defaults for Domain ## |
############################################################### |
############################################################### |
## |
## |
Line 2175 sub get_auth_defaults {
|
Line 2738 sub get_auth_defaults {
|
|
|
=pod |
=pod |
|
|
=item * get_kerberos_defaults |
=item * &get_kerberos_defaults() |
|
|
get_kerberos_defaults($target_domain) returns the default kerberos |
get_kerberos_defaults($target_domain) returns the default kerberos |
version and domain. If not found in domain.tabs, it defaults to |
version and domain. If not found, it defaults to version 4 and the |
version 4 and the domain of the server. |
domain of the server. |
|
|
|
=over 4 |
|
|
($def_version, $def_krb_domain) = &get_kerberos_defaults($target_domain); |
($def_version, $def_krb_domain) = &get_kerberos_defaults($target_domain); |
|
|
|
=back |
|
|
|
=back |
|
|
=cut |
=cut |
|
|
#------------------------------------------- |
#------------------------------------------- |
sub get_kerberos_defaults { |
sub get_kerberos_defaults { |
my $domain=shift; |
my $domain=shift; |
my ($krbdef,$krbdefdom) = |
my ($krbdef,$krbdefdom); |
&Apache::loncommon::get_auth_defaults($domain); |
my %domdefaults = &Apache::lonnet::get_domain_defaults($domain); |
unless ($krbdef =~/^krb/ && $krbdefdom) { |
if (($domdefaults{'auth_def'} =~/^krb(4|5)$/) && ($domdefaults{'auth_arg_def'} ne '')) { |
|
$krbdef = $domdefaults{'auth_def'}; |
|
$krbdefdom = $domdefaults{'auth_arg_def'}; |
|
} else { |
$ENV{'SERVER_NAME'}=~/(\w+\.\w+)$/; |
$ENV{'SERVER_NAME'}=~/(\w+\.\w+)$/; |
my $krbdefdom=$1; |
my $krbdefdom=$1; |
$krbdefdom=~tr/a-z/A-Z/; |
$krbdefdom=~tr/a-z/A-Z/; |
Line 2199 sub get_kerberos_defaults {
|
Line 2771 sub get_kerberos_defaults {
|
return ($krbdef,$krbdefdom); |
return ($krbdef,$krbdefdom); |
} |
} |
|
|
=pod |
|
|
|
=back |
|
|
|
=cut |
|
|
|
############################################################### |
############################################################### |
## Thesaurus Functions ## |
## Thesaurus Functions ## |
Line 2215 sub get_kerberos_defaults {
|
Line 2782 sub get_kerberos_defaults {
|
|
|
=over 4 |
=over 4 |
|
|
=item * initialize_keywords |
=item * &initialize_keywords() |
|
|
Initializes the package variable %Keywords if it is empty. Uses the |
Initializes the package variable %Keywords if it is empty. Uses the |
package variable $thesaurus_db_file. |
package variable $thesaurus_db_file. |
Line 2260 sub initialize_keywords {
|
Line 2827 sub initialize_keywords {
|
|
|
=pod |
=pod |
|
|
=item * keyword($word) |
=item * &keyword($word) |
|
|
Returns true if $word is a keyword. A keyword is a word that appears more |
Returns true if $word is a keyword. A keyword is a word that appears more |
than the average number of times in the thesaurus database. Calls |
than the average number of times in the thesaurus database. Calls |
Line 2281 sub keyword {
|
Line 2848 sub keyword {
|
|
|
=pod |
=pod |
|
|
=item * get_related_words |
=item * &get_related_words() |
|
|
Look up a word in the thesaurus. Takes a scalar argument and returns |
Look up a word in the thesaurus. Takes a scalar argument and returns |
an array of words. If the keyword is not in the thesaurus, an empty array |
an array of words. If the keyword is not in the thesaurus, an empty array |
Line 2339 sub get_related_words {
|
Line 2906 sub get_related_words {
|
|
|
=over 4 |
=over 4 |
|
|
=item * plainname($uname,$udom,$first) |
=item * &plainname($uname,$udom,$first) |
|
|
Takes a users logon name and returns it as a string in |
Takes a users logon name and returns it as a string in |
"first middle last generation" form |
"first middle last generation" form |
Line 2368 sub plainname {
|
Line 2935 sub plainname {
|
# -------------------------------------------------------------------- Nickname |
# -------------------------------------------------------------------- Nickname |
=pod |
=pod |
|
|
=item * nickname($uname,$udom) |
=item * &nickname($uname,$udom) |
|
|
Gets a users name and returns it as a string as |
Gets a users name and returns it as a string as |
|
|
Line 2418 sub getnames {
|
Line 2985 sub getnames {
|
} |
} |
|
|
# -------------------------------------------------------------------- getemails |
# -------------------------------------------------------------------- getemails |
|
|
=pod |
=pod |
|
|
=item * getemails($uname,$udom) |
=item * &getemails($uname,$udom) |
|
|
Gets a user's email information and returns it as a hash with keys: |
Gets a user's email information and returns it as a hash with keys: |
notification, critnotification, permanentemail |
notification, critnotification, permanentemail |
|
|
For notification and critnotification, values are comma-separated lists |
For notification and critnotification, values are comma-separated lists |
of e-mail address(es); for permanentemail, value is a single e-mail address. |
of e-mail addresses; for permanentemail, value is a single e-mail address. |
|
|
|
|
=cut |
=cut |
|
|
|
|
sub getemails { |
sub getemails { |
my ($uname,$udom)=@_; |
my ($uname,$udom)=@_; |
if ($udom eq 'public' && $uname eq 'public') { |
if ($udom eq 'public' && $uname eq 'public') { |
Line 2460 sub flush_email_cache {
|
Line 3030 sub flush_email_cache {
|
&Apache::lonnet::devalidate_cache_new('emailscache',$id); |
&Apache::lonnet::devalidate_cache_new('emailscache',$id); |
} |
} |
|
|
|
# -------------------------------------------------------------------- getlangs |
|
|
|
=pod |
|
|
|
=item * &getlangs($uname,$udom) |
|
|
|
Gets a user's language preference and returns it as a hash with key: |
|
language. |
|
|
|
=cut |
|
|
|
|
|
sub getlangs { |
|
my ($uname,$udom) = @_; |
|
if (!$udom) { $udom =$env{'user.domain'}; } |
|
if (!$uname) { $uname=$env{'user.name'}; } |
|
my $id=$uname.':'.$udom; |
|
my ($langs,$cached)=&Apache::lonnet::is_cached_new('userlangs',$id); |
|
if ($cached) { |
|
return %{$langs}; |
|
} else { |
|
my %loadlangs=&Apache::lonnet::get('environment',['languages'], |
|
$udom,$uname); |
|
&Apache::lonnet::do_cache_new('userlangs',$id,\%loadlangs); |
|
return %loadlangs; |
|
} |
|
} |
|
|
|
sub flush_langs_cache { |
|
my ($uname,$udom)=@_; |
|
if (!$udom) { $udom =$env{'user.domain'}; } |
|
if (!$uname) { $uname=$env{'user.name'}; } |
|
return if ($udom eq 'public' && $uname eq 'public'); |
|
my $id=$uname.':'.$udom; |
|
&Apache::lonnet::devalidate_cache_new('userlangs',$id); |
|
} |
|
|
# ------------------------------------------------------------------ Screenname |
# ------------------------------------------------------------------ Screenname |
|
|
=pod |
=pod |
|
|
=item * screenname($uname,$udom) |
=item * &screenname($uname,$udom) |
|
|
Gets a users screenname and returns it as a string |
Gets a users screenname and returns it as a string |
|
|
Line 2479 sub screenname {
|
Line 3086 sub screenname {
|
} |
} |
|
|
|
|
|
# ------------------------------------------------------------- Confirm Wrapper |
|
=pod |
|
|
|
=item confirmwrapper |
|
|
|
Wrap messages about completion of operation in box |
|
|
|
=cut |
|
|
|
sub confirmwrapper { |
|
my ($message)=@_; |
|
if ($message) { |
|
return "\n".'<div class="LC_confirm_box">'."\n" |
|
.$message."\n" |
|
.'</div>'."\n"; |
|
} else { |
|
return $message; |
|
} |
|
} |
|
|
# ------------------------------------------------------------- Message Wrapper |
# ------------------------------------------------------------- Message Wrapper |
|
|
sub messagewrapper { |
sub messagewrapper { |
Line 2489 sub messagewrapper {
|
Line 3116 sub messagewrapper {
|
'&subject='.&escape($subject).'&text='.&escape($text).'" '. |
'&subject='.&escape($subject).'&text='.&escape($text).'" '. |
'title="'.&mt('Send message').'">'.$link.'</a>'; |
'title="'.&mt('Send message').'">'.$link.'</a>'; |
} |
} |
|
|
# --------------------------------------------------------------- Notes Wrapper |
# --------------------------------------------------------------- Notes Wrapper |
|
|
sub noteswrapper { |
sub noteswrapper { |
my ($link,$un,$do)=@_; |
my ($link,$un,$do)=@_; |
return |
return |
"<a href='/adm/email?recordftf=retrieve&recname=$un&recdom=$do'>$link</a>"; |
"<a href='/adm/email?recordftf=retrieve&recname=$un&recdom=$do'>$link</a>"; |
} |
} |
|
|
# ------------------------------------------------------------- Aboutme Wrapper |
# ------------------------------------------------------------- Aboutme Wrapper |
|
|
sub aboutmewrapper { |
sub aboutmewrapper { |
Line 2503 sub aboutmewrapper {
|
Line 3132 sub aboutmewrapper {
|
if (!defined($username) && !defined($domain)) { |
if (!defined($username) && !defined($domain)) { |
return; |
return; |
} |
} |
return '<a href="/adm/'.$domain.'/'.$username.'/aboutme"'. |
return '<a href="/adm/'.$domain.'/'.$username.'/aboutme?forcestudent=1"'. |
($target?' target="$target"':'').' title="'.&mt("View this user's personal page").'">'.$link.'</a>'; |
($target?' target="$target"':'').' title="'.&mt("View this user's personal information page").'">'.$link.'</a>'; |
} |
} |
|
|
# ------------------------------------------------------------ Syllabus Wrapper |
# ------------------------------------------------------------ Syllabus Wrapper |
|
|
|
|
sub syllabuswrapper { |
sub syllabuswrapper { |
my ($linktext,$coursedir,$domain,$fontcolor)=@_; |
my ($linktext,$coursedir,$domain)=@_; |
if ($fontcolor) { |
|
$linktext='<font color="'.$fontcolor.'">'.$linktext.'</font>'; |
|
} |
|
return qq{<a href="/public/$domain/$coursedir/syllabus">$linktext</a>}; |
return qq{<a href="/public/$domain/$coursedir/syllabus">$linktext</a>}; |
} |
} |
|
|
|
# ----------------------------------------------------------------------------- |
|
|
sub track_student_link { |
sub track_student_link { |
my ($linktext,$sname,$sdom,$target,$start) = @_; |
my ($linktext,$sname,$sdom,$target,$start,$only_body) = @_; |
my $link ="/adm/trackstudent?"; |
my $link ="/adm/trackstudent?"; |
my $title = 'View recent activity'; |
my $title = 'View recent activity'; |
if (defined($sname) && $sname !~ /^\s*$/ && |
if (defined($sname) && $sname !~ /^\s*$/ && |
Line 2533 sub track_student_link {
|
Line 3160 sub track_student_link {
|
$target = ''; |
$target = ''; |
} |
} |
if ($start) { $link.='&start='.$start; } |
if ($start) { $link.='&start='.$start; } |
|
if ($only_body) { $link .= '&only_body=1'; } |
$title = &mt($title); |
$title = &mt($title); |
$linktext = &mt($linktext); |
$linktext = &mt($linktext); |
return qq{<a href="$link" title="$title" $target>$linktext</a>}. |
return qq{<a href="$link" title="$title" $target>$linktext</a>}. |
&help_open_topic('View_recent_activity'); |
&help_open_topic('View_recent_activity'); |
} |
} |
|
|
|
sub slot_reservations_link { |
|
my ($linktext,$sname,$sdom,$target) = @_; |
|
my $link ="/adm/slotrequest?command=showresv&origin=aboutme"; |
|
my $title = 'View slot reservation history'; |
|
if (defined($sname) && $sname !~ /^\s*$/ && |
|
defined($sdom) && $sdom !~ /^\s*$/) { |
|
$link .= "&uname=$sname&udom=$sdom"; |
|
$title .= ' of this student'; |
|
} |
|
if (defined($target) && $target !~ /^\s*$/) { |
|
$target = qq{target="$target"}; |
|
} else { |
|
$target = ''; |
|
} |
|
$title = &mt($title); |
|
$linktext = &mt($linktext); |
|
return qq{<a href="$link" title="$title" $target>$linktext</a>}; |
|
# FIXME uncomment when help item created: &help_open_topic('Slot_Reservation_History'); |
|
|
|
} |
|
|
# ===================================================== Display a student photo |
# ===================================================== Display a student photo |
|
|
|
|
Line 2560 sub student_image_tag {
|
Line 3209 sub student_image_tag {
|
|
|
=over 4 |
=over 4 |
|
|
=item * languageids() |
=item * &languageids() |
|
|
returns list of all language ids |
returns list of all language ids |
|
|
Line 2572 sub languageids {
|
Line 3221 sub languageids {
|
|
|
=pod |
=pod |
|
|
=item * languagedescription() |
=item * &languagedescription() |
|
|
returns description of a specified language id |
returns description of a specified language id |
|
|
Line 2585 sub languagedescription {
|
Line 3234 sub languagedescription {
|
($supported_language{$code}?' ('.&mt('interface available').')':''); |
($supported_language{$code}?' ('.&mt('interface available').')':''); |
} |
} |
|
|
|
=pod |
|
|
|
=item * &plainlanguagedescription |
|
|
|
Returns both the plain language description (e.g. 'Creoles and Pidgins, English-based (Other)') |
|
and the language character encoding (e.g. ISO) separated by a ' - ' string. |
|
|
|
=cut |
|
|
sub plainlanguagedescription { |
sub plainlanguagedescription { |
my $code=shift; |
my $code=shift; |
return $language{$code}; |
return $language{$code}; |
} |
} |
|
|
|
=pod |
|
|
|
=item * &supportedlanguagecode |
|
|
|
Returns the supported language code (e.g. sptutf maps to pt) given a language |
|
code. |
|
|
|
=cut |
|
|
sub supportedlanguagecode { |
sub supportedlanguagecode { |
my $code=shift; |
my $code=shift; |
return $supported_language{$code}; |
return $supported_language{$code}; |
Line 2597 sub supportedlanguagecode {
|
Line 3264 sub supportedlanguagecode {
|
|
|
=pod |
=pod |
|
|
=item * copyrightids() |
=item * &latexlanguage() |
|
|
|
Given a language key code returns the correspondnig language to use |
|
to select the correct hyphenation on LaTeX printouts. This is undef if there |
|
is no supported hyphenation for the language code. |
|
|
|
=cut |
|
|
|
sub latexlanguage { |
|
my $code = shift; |
|
return $latex_language{$code}; |
|
} |
|
|
|
=pod |
|
|
|
=item * ©rightids() |
|
|
returns list of all copyrights |
returns list of all copyrights |
|
|
Line 2609 sub copyrightids {
|
Line 3291 sub copyrightids {
|
|
|
=pod |
=pod |
|
|
=item * copyrightdescription() |
=item * ©rightdescription() |
|
|
returns description of a specified copyright id |
returns description of a specified copyright id |
|
|
Line 2621 sub copyrightdescription {
|
Line 3303 sub copyrightdescription {
|
|
|
=pod |
=pod |
|
|
=item * source_copyrightids() |
=item * &source_copyrightids() |
|
|
returns list of all source copyrights |
returns list of all source copyrights |
|
|
Line 2633 sub source_copyrightids {
|
Line 3315 sub source_copyrightids {
|
|
|
=pod |
=pod |
|
|
=item * source_copyrightdescription() |
=item * &source_copyrightdescription() |
|
|
returns description of a specified source copyright id |
returns description of a specified source copyright id |
|
|
Line 2645 sub source_copyrightdescription {
|
Line 3327 sub source_copyrightdescription {
|
|
|
=pod |
=pod |
|
|
=item * filecategories() |
=item * &filecategories() |
|
|
returns list of all file categories |
returns list of all file categories |
|
|
Line 2657 sub filecategories {
|
Line 3339 sub filecategories {
|
|
|
=pod |
=pod |
|
|
=item * filecategorytypes() |
=item * &filecategorytypes() |
|
|
returns list of file types belonging to a given file |
returns list of file types belonging to a given file |
category |
category |
Line 2671 sub filecategorytypes {
|
Line 3353 sub filecategorytypes {
|
|
|
=pod |
=pod |
|
|
=item * fileembstyle() |
=item * &fileembstyle() |
|
|
returns embedding style for a specified file type |
returns embedding style for a specified file type |
|
|
Line 2689 sub filemimetype {
|
Line 3371 sub filemimetype {
|
sub filecategoryselect { |
sub filecategoryselect { |
my ($name,$value)=@_; |
my ($name,$value)=@_; |
return &select_form($value,$name, |
return &select_form($value,$name, |
'' => &mt('Any category'), |
{'' => &mt('Any category'), map { $_,$_ } sort(keys(%category_extensions))}); |
map { $_,$_ } sort(keys(%category_extensions))); |
|
} |
} |
|
|
=pod |
=pod |
|
|
=item * filedescription() |
=item * &filedescription() |
|
|
returns description for a specified file type |
returns description for a specified file type |
|
|
Line 2709 sub filedescription {
|
Line 3390 sub filedescription {
|
|
|
=pod |
=pod |
|
|
=item * filedescriptionex() |
=item * &filedescriptionex() |
|
|
returns description for a specified file type with |
returns description for a specified file type with |
extra formatting |
extra formatting |
Line 2741 sub fileextensions {
|
Line 3422 sub fileextensions {
|
|
|
sub display_languages { |
sub display_languages { |
my %languages=(); |
my %languages=(); |
foreach my $lang (&preferred_languages()) { |
foreach my $lang (&Apache::lonlocal::preferred_languages()) { |
$languages{$lang}=1; |
$languages{$lang}=1; |
} |
} |
&get_unprocessed_cgi($ENV{'QUERY_STRING'},['displaylanguage']); |
&get_unprocessed_cgi($ENV{'QUERY_STRING'},['displaylanguage']); |
Line 2753 sub display_languages {
|
Line 3434 sub display_languages {
|
return %languages; |
return %languages; |
} |
} |
|
|
sub preferred_languages { |
|
my @languages=(); |
|
if ($env{'course.'.$env{'request.course.id'}.'.languages'}) { |
|
@languages=(@languages,split(/\s*(\,|\;|\:)\s*/, |
|
$env{'course.'.$env{'request.course.id'}.'.languages'})); |
|
} |
|
if ($env{'environment.languages'}) { |
|
@languages=(@languages, |
|
split(/\s*(\,|\;|\:)\s*/,$env{'environment.languages'})); |
|
} |
|
my $browser=$ENV{'HTTP_ACCEPT_LANGUAGE'}; |
|
if ($browser) { |
|
my @browser = |
|
map { (split(/\s*;\s*/,$_))[0] } (split(/\s*,\s*/,$browser)); |
|
push(@languages,@browser); |
|
} |
|
if (&Apache::lonnet::domain($env{'user.domain'},'lang_def')) { |
|
@languages=(@languages, |
|
&Apache::lonnet::domain($env{'user.domain'}, |
|
'lang_def')); |
|
} |
|
if (&Apache::lonnet::domain($env{'request.role.domain'},'lang_def')) { |
|
@languages=(@languages, |
|
&Apache::lonnet::domain($env{'request.role.domain'}, |
|
'lang_def')); |
|
} |
|
if (&Apache::lonnet::domain($Apache::lonnet::perlvar{'lonDefDomain'}, |
|
'lang_def')) { |
|
@languages=(@languages, |
|
&Apache::lonnet::domain($Apache::lonnet::perlvar{'lonDefDomain'}, |
|
'lang_def')); |
|
} |
|
# turn "en-ca" into "en-ca,en" |
|
my @genlanguages; |
|
foreach my $lang (@languages) { |
|
unless ($lang=~/\w/) { next; } |
|
push(@genlanguages,$lang); |
|
if ($lang=~/(\-|\_)/) { |
|
push(@genlanguages,(split(/(\-|\_)/,$lang))[0]); |
|
} |
|
} |
|
#uniqueify the languages list |
|
my %count; |
|
@genlanguages = map { $count{$_}++ == 0 ? $_ : () } @genlanguages; |
|
return @genlanguages; |
|
} |
|
|
|
sub languages { |
sub languages { |
my ($possible_langs) = @_; |
my ($possible_langs) = @_; |
my @preferred_langs = &preferred_languages(); |
my @preferred_langs = &Apache::lonlocal::preferred_languages(); |
if (!ref($possible_langs)) { |
if (!ref($possible_langs)) { |
if( wantarray ) { |
if( wantarray ) { |
return @preferred_langs; |
return @preferred_langs; |
Line 2823 sub languages {
|
Line 3457 sub languages {
|
return $preferred_possibilities[0]; |
return $preferred_possibilities[0]; |
} |
} |
|
|
|
sub user_lang { |
|
my ($touname,$toudom,$fromcid) = @_; |
|
my @userlangs; |
|
if (($fromcid ne '') && ($env{'course.'.$fromcid.'.languages'} ne '')) { |
|
@userlangs=(@userlangs,split(/\s*(\,|\;|\:)\s*/, |
|
$env{'course.'.$fromcid.'.languages'})); |
|
} else { |
|
my %langhash = &getlangs($touname,$toudom); |
|
if ($langhash{'languages'} ne '') { |
|
@userlangs = split(/\s*(\,|\;|\:)\s*/,$langhash{'languages'}); |
|
} else { |
|
my %domdefs = &Apache::lonnet::get_domain_defaults($toudom); |
|
if ($domdefs{'lang_def'} ne '') { |
|
@userlangs = ($domdefs{'lang_def'}); |
|
} |
|
} |
|
} |
|
my @languages=&Apache::lonlocal::get_genlanguages(@userlangs); |
|
my $user_lh = Apache::localize->get_handle(@languages); |
|
return $user_lh; |
|
} |
|
|
|
|
############################################################### |
############################################################### |
## Student Answer Attempts ## |
## Student Answer Attempts ## |
############################################################### |
############################################################### |
Line 2833 sub languages {
|
Line 3490 sub languages {
|
|
|
=over 4 |
=over 4 |
|
|
=item * get_previous_attempt($symb, $username, $domain, $course, |
=item * &get_previous_attempt($symb, $username, $domain, $course, |
$getattempt, $regexp, $gradesub) |
$getattempt, $regexp, $gradesub) |
|
|
Return string with previous attempt on problem. Arguments: |
Return string with previous attempt on problem. Arguments: |
Line 2877 sub get_previous_attempt {
|
Line 3534 sub get_previous_attempt {
|
$lasthash{$key}=$returnhash{$version.':'.$key}; |
$lasthash{$key}=$returnhash{$version.':'.$key}; |
} |
} |
} |
} |
$prevattempts='<table border="0" width="100%"><tr><td bgcolor="#777777">'; |
$prevattempts=&start_data_table().&start_data_table_header_row(); |
$prevattempts.='<table border="0" width="100%"><tr bgcolor="#e6ffff"><td>History</td>'; |
$prevattempts.='<th>'.&mt('History').'</th>'; |
|
my (%typeparts,%lasthidden); |
|
my $showsurv=&Apache::lonnet::allowed('vas',$env{'request.course.id'}); |
foreach my $key (sort(keys(%lasthash))) { |
foreach my $key (sort(keys(%lasthash))) { |
my ($ign,@parts) = split(/\./,$key); |
my ($ign,@parts) = split(/\./,$key); |
if ($#parts > 0) { |
if ($#parts > 0) { |
my $data=$parts[-1]; |
my $data=$parts[-1]; |
|
next if ($data eq 'foilorder'); |
pop(@parts); |
pop(@parts); |
$prevattempts.='<td>Part '.join('.',@parts).'<br />'.$data.' </td>'; |
$prevattempts.='<th>'.&mt('Part ').join('.',@parts).'<br />'.$data.' </th>'; |
|
if ($data eq 'type') { |
|
unless ($showsurv) { |
|
my $id = join(',',@parts); |
|
$typeparts{$ign.'.'.$id} = $lasthash{$key}; |
|
if (($lasthash{$key} eq 'anonsurvey') || ($lasthash{$key} eq 'anonsurveycred')) { |
|
$lasthidden{$ign.'.'.$id} = 1; |
|
} |
|
} |
|
} |
} else { |
} else { |
if ($#parts == 0) { |
if ($#parts == 0) { |
$prevattempts.='<th>'.$parts[0].'</th>'; |
$prevattempts.='<th>'.$parts[0].'</th>'; |
Line 2893 sub get_previous_attempt {
|
Line 3562 sub get_previous_attempt {
|
} |
} |
} |
} |
} |
} |
|
$prevattempts.=&end_data_table_header_row(); |
if ($getattempt eq '') { |
if ($getattempt eq '') { |
for ($version=1;$version<=$returnhash{'version'};$version++) { |
for ($version=1;$version<=$returnhash{'version'};$version++) { |
$prevattempts.='</tr><tr bgcolor="#ffffe6"><td>Transaction '.$version.'</td>'; |
my @hidden; |
foreach my $key (sort(keys(%lasthash))) { |
if (%typeparts) { |
my $value = &format_previous_attempt_value($key, |
foreach my $id (keys(%typeparts)) { |
$returnhash{$version.':'.$key}); |
if (($returnhash{$version.':'.$id.'.type'} eq 'anonsurvey') || ($returnhash{$version.':'.$id.'.type'} eq 'anonsurveycred')) { |
$prevattempts.='<td>'.$value.' </td>'; |
push(@hidden,$id); |
} |
} |
|
} |
|
} |
|
$prevattempts.=&start_data_table_row(). |
|
'<td>'.&mt('Transaction [_1]',$version).'</td>'; |
|
if (@hidden) { |
|
foreach my $key (sort(keys(%lasthash))) { |
|
next if ($key =~ /\.foilorder$/); |
|
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.='<td>'.$value.' </td>'; |
|
} else { |
|
$prevattempts.='<td> </td>'; |
|
} |
|
} else { |
|
if ($key =~ /\./) { |
|
my $value = &format_previous_attempt_value($key, |
|
$returnhash{$version.':'.$key}); |
|
$prevattempts.='<td>'.$value.' </td>'; |
|
} else { |
|
$prevattempts.='<td> </td>'; |
|
} |
|
} |
|
} |
|
} else { |
|
foreach my $key (sort(keys(%lasthash))) { |
|
next if ($key =~ /\.foilorder$/); |
|
my $value = &format_previous_attempt_value($key, |
|
$returnhash{$version.':'.$key}); |
|
$prevattempts.='<td>'.$value.' </td>'; |
|
} |
|
} |
|
$prevattempts.=&end_data_table_row(); |
} |
} |
} |
} |
$prevattempts.='</tr><tr bgcolor="#ffffe6"><td>Current</td>'; |
my @currhidden = keys(%lasthidden); |
|
$prevattempts.=&start_data_table_row().'<td>'.&mt('Current').'</td>'; |
foreach my $key (sort(keys(%lasthash))) { |
foreach my $key (sort(keys(%lasthash))) { |
my $value = &format_previous_attempt_value($key,$lasthash{$key}); |
next if ($key =~ /\.foilorder$/); |
if ($key =~/$regexp$/ && (defined &$gradesub)) {$value = &$gradesub($value)} |
if (%typeparts) { |
$prevattempts.='<td>'.$value.' </td>'; |
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.='<td>'.$value.' </td>'; |
|
} else { |
|
$prevattempts.='<td> </td>'; |
|
} |
|
} else { |
|
my $value = &format_previous_attempt_value($key,$lasthash{$key}); |
|
if ($key =~/$regexp$/ && (defined &$gradesub)) { |
|
$value = &$gradesub($value); |
|
} |
|
$prevattempts.='<td>'.$value.' </td>'; |
|
} |
|
} else { |
|
my $value = &format_previous_attempt_value($key,$lasthash{$key}); |
|
if ($key =~/$regexp$/ && (defined &$gradesub)) { |
|
$value = &$gradesub($value); |
|
} |
|
$prevattempts.='<td>'.$value.' </td>'; |
|
} |
} |
} |
$prevattempts.='</tr></table></td></tr></table>'; |
$prevattempts.= &end_data_table_row().&end_data_table(); |
} else { |
} else { |
$prevattempts='Nothing submitted - no attempts.'; |
$prevattempts= |
|
&start_data_table().&start_data_table_row(). |
|
'<td>'.&mt('Nothing submitted - no attempts.').'</td>'. |
|
&end_data_table_row().&end_data_table(); |
} |
} |
} else { |
} else { |
$prevattempts='No data.'; |
$prevattempts= |
|
&start_data_table().&start_data_table_row(). |
|
'<td>'.&mt('No data.').'</td>'. |
|
&end_data_table_row().&end_data_table(); |
} |
} |
} |
} |
|
|
sub format_previous_attempt_value { |
sub format_previous_attempt_value { |
my ($key,$value) = @_; |
my ($key,$value) = @_; |
if ($key =~ /timestamp/) { |
if (($key =~ /timestamp/) || ($key=~/duedate/)) { |
$value = &Apache::lonlocal::locallocaltime($value); |
$value = &Apache::lonlocal::locallocaltime($value); |
} elsif (ref($value) eq 'ARRAY') { |
} elsif (ref($value) eq 'ARRAY') { |
$value = '('.join(', ', @{ $value }).')'; |
$value = '('.join(', ', @{ $value }).')'; |
|
} elsif ($key =~ /answerstring$/) { |
|
my %answers = &Apache::lonnet::str2hash($value); |
|
my @anskeys = sort(keys(%answers)); |
|
if (@anskeys == 1) { |
|
my $answer = $answers{$anskeys[0]}; |
|
if ($answer =~ m{\0}) { |
|
$answer =~ s{\0}{,}g; |
|
} |
|
my $tag_internal_answer_name = 'INTERNAL'; |
|
if ($anskeys[0] eq $tag_internal_answer_name) { |
|
$value = $answer; |
|
} else { |
|
$value = $anskeys[0].'='.$answer; |
|
} |
|
} else { |
|
foreach my $ans (@anskeys) { |
|
my $answer = $answers{$ans}; |
|
if ($answer =~ m{\0}) { |
|
$answer =~ s{\0}{,}g; |
|
} |
|
$value .= $ans.'='.$answer.'<br />';; |
|
} |
|
} |
} else { |
} else { |
$value = &unescape($value); |
$value = &unescape($value); |
} |
} |
Line 2952 sub relative_to_absolute {
|
Line 3725 sub relative_to_absolute {
|
} |
} |
$thisdir=~s-/[^/]*$--; |
$thisdir=~s-/[^/]*$--; |
foreach my $link (@rlinks) { |
foreach my $link (@rlinks) { |
unless (($link=~/^http:\/\//i) || |
unless (($link=~/^https?\:\/\//i) || |
($link=~/^\//) || |
($link=~/^\//) || |
($link=~/^javascript:/i) || |
($link=~/^javascript:/i) || |
($link=~/^mailto:/i) || |
($link=~/^mailto:/i) || |
Line 2968 sub relative_to_absolute {
|
Line 3741 sub relative_to_absolute {
|
|
|
=pod |
=pod |
|
|
=item * get_student_view |
=item * &get_student_view() |
|
|
show a snapshot of what student was looking at |
show a snapshot of what student was looking at |
|
|
Line 2987 sub get_student_view {
|
Line 3760 sub get_student_view {
|
} |
} |
if (defined($target)) { $form{'grade_target'} = $target; } |
if (defined($target)) { $form{'grade_target'} = $target; } |
$feedurl=&Apache::lonnet::clutter($feedurl); |
$feedurl=&Apache::lonnet::clutter($feedurl); |
my $userview=&Apache::lonnet::ssi_body($feedurl,%form); |
my ($userview,$response)=&Apache::lonnet::ssi_body($feedurl,%form); |
$userview=~s/\<body[^\>]*\>//gi; |
$userview=~s/\<body[^\>]*\>//gi; |
$userview=~s/\<\/body\>//gi; |
$userview=~s/\<\/body\>//gi; |
$userview=~s/\<html\>//gi; |
$userview=~s/\<html\>//gi; |
Line 2996 sub get_student_view {
|
Line 3769 sub get_student_view {
|
$userview=~s/\<\/head\>//gi; |
$userview=~s/\<\/head\>//gi; |
$userview=~s/action\s*\=/would_be_action\=/gi; |
$userview=~s/action\s*\=/would_be_action\=/gi; |
$userview=&relative_to_absolute($feedurl,$userview); |
$userview=&relative_to_absolute($feedurl,$userview); |
return $userview; |
if (wantarray) { |
|
return ($userview,$response); |
|
} else { |
|
return $userview; |
|
} |
|
} |
|
|
|
sub get_student_view_with_retries { |
|
my ($symb,$retries,$username,$domain,$courseid,$target,$moreenv) = @_; |
|
|
|
my $ok = 0; # True if we got a good response. |
|
my $content; |
|
my $response; |
|
|
|
# Try to get the student_view done. within the retries count: |
|
|
|
do { |
|
($content, $response) = &get_student_view($symb,$username,$domain,$courseid,$target,$moreenv); |
|
$ok = $response->is_success; |
|
if (!$ok) { |
|
&Apache::lonnet::logthis("Failed get_student_view_with_retries on $symb: ".$response->is_success.', '.$response->code.', '.$response->message); |
|
} |
|
$retries--; |
|
} while (!$ok && ($retries > 0)); |
|
|
|
if (!$ok) { |
|
$content = ''; # On error return an empty content. |
|
} |
|
if (wantarray) { |
|
return ($content, $response); |
|
} else { |
|
return $content; |
|
} |
} |
} |
|
|
=pod |
=pod |
|
|
=item * get_student_answers() |
=item * &get_student_answers() |
|
|
show a snapshot of how student was answering problem |
show a snapshot of how student was answering problem |
|
|
Line 3042 sub submlink {
|
Line 3847 sub submlink {
|
} |
} |
if (!$symb) { $symb=&Apache::lonnet::symbread(); } |
if (!$symb) { $symb=&Apache::lonnet::symbread(); } |
$symb=&escape($symb); |
$symb=&escape($symb); |
if ($target) { $target="target=\"$target\""; } |
if ($target) { $target=" target=\"$target\""; } |
return '<a href="/adm/grades?&command=submission&'. |
return |
'symb='.$symb.'&student='.$uname. |
'<a href="/adm/grades?command=submission'. |
'&userdom='.$udom.'" '.$target.'>'.$text.'</a>'; |
'&symb='.$symb. |
|
'&student='.$uname. |
|
'&userdom='.$udom.'"'. |
|
$target.'>'.$text.'</a>'; |
} |
} |
############################################## |
############################################## |
|
|
Line 3089 sub pprmlink {
|
Line 3897 sub pprmlink {
|
if (!$symb) { $symb=&Apache::lonnet::symbread(); } |
if (!$symb) { $symb=&Apache::lonnet::symbread(); } |
$symb=&escape($symb); |
$symb=&escape($symb); |
if ($target) { $target="target=\"$target\""; } |
if ($target) { $target="target=\"$target\""; } |
return '<a href="/adm/parmset?&command=set&'. |
return '<a href="/adm/parmset?command=set&'. |
'symb='.$symb.'&uname='.$uname. |
'symb='.$symb.'&uname='.$uname. |
'&udom='.$udom.'" '.$target.'>'.$text.'</a>'; |
'&udom='.$udom.'" '.$target.'>'.$text.'</a>'; |
} |
} |
############################################## |
############################################## |
|
|
Line 3105 sub pprmlink {
|
Line 3913 sub pprmlink {
|
|
|
|
|
sub timehash { |
sub timehash { |
my @ltime=localtime(shift); |
my ($thistime) = @_; |
return ( 'seconds' => $ltime[0], |
my $timezone = &Apache::lonlocal::gettimezone(); |
'minutes' => $ltime[1], |
my $dt = DateTime->from_epoch(epoch => $thistime) |
'hours' => $ltime[2], |
->set_time_zone($timezone); |
'day' => $ltime[3], |
my $wday = $dt->day_of_week(); |
'month' => $ltime[4]+1, |
if ($wday == 7) { $wday = 0; } |
'year' => $ltime[5]+1900, |
return ( 'second' => $dt->second(), |
'weekday' => $ltime[6], |
'minute' => $dt->minute(), |
'dayyear' => $ltime[7]+1, |
'hour' => $dt->hour(), |
'dlsav' => $ltime[8] ); |
'day' => $dt->day_of_month(), |
|
'month' => $dt->month(), |
|
'year' => $dt->year(), |
|
'weekday' => $wday, |
|
'dayyear' => $dt->day_of_year(), |
|
'dlsav' => $dt->is_dst() ); |
} |
} |
|
|
sub utc_string { |
sub utc_string { |
Line 3124 sub utc_string {
|
Line 3937 sub utc_string {
|
|
|
sub maketime { |
sub maketime { |
my %th=@_; |
my %th=@_; |
|
my ($epoch_time,$timezone,$dt); |
|
$timezone = &Apache::lonlocal::gettimezone(); |
|
eval { |
|
$dt = DateTime->new( year => $th{'year'}, |
|
month => $th{'month'}, |
|
day => $th{'day'}, |
|
hour => $th{'hour'}, |
|
minute => $th{'minute'}, |
|
second => $th{'second'}, |
|
time_zone => $timezone, |
|
); |
|
}; |
|
if (!$@) { |
|
$epoch_time = $dt->epoch; |
|
if ($epoch_time) { |
|
return $epoch_time; |
|
} |
|
} |
return POSIX::mktime( |
return POSIX::mktime( |
($th{'seconds'},$th{'minutes'},$th{'hours'}, |
($th{'seconds'},$th{'minutes'},$th{'hours'}, |
$th{'day'},$th{'month'}-1,$th{'year'}-1900,0,0,-1)); |
$th{'day'},$th{'month'}-1,$th{'year'}-1900,0,0,-1)); |
Line 3144 sub findallcourses {
|
Line 3975 sub findallcourses {
|
$udom = $env{'user.domain'}; |
$udom = $env{'user.domain'}; |
} |
} |
if (($uname ne $env{'user.name'}) || ($udom ne $env{'user.domain'})) { |
if (($uname ne $env{'user.name'}) || ($udom ne $env{'user.domain'})) { |
my %roleshash = &Apache::lonnet::dump('roles',$udom,$uname); |
my $extra = &Apache::lonnet::freeze_escape({'skipcheck' => 1}); |
|
my %roleshash = &Apache::lonnet::dump('roles',$udom,$uname,'.',undef, |
|
$extra); |
if (!%roles) { |
if (!%roles) { |
%roles = ( |
%roles = ( |
cc => 1, |
cc => 1, |
|
co => 1, |
in => 1, |
in => 1, |
ep => 1, |
ep => 1, |
ta => 1, |
ta => 1, |
Line 3338 sub blockcheck {
|
Line 4172 sub blockcheck {
|
($env{'request.role'} !~ m{^st\./\Q$cdom\E/\Q$cnum\E})); |
($env{'request.role'} !~ m{^st\./\Q$cdom\E/\Q$cnum\E})); |
next if ($no_userblock); |
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. |
# of specified user, unless user has 'evb' privilege. |
|
|
my ($start,$end)=&get_blocks($setters,$activity,$cdom,$cnum); |
my ($start,$end)=&get_blocks($setters,$activity,$cdom,$cnum); |
Line 3403 sub parse_block_record {
|
Line 4237 sub parse_block_record {
|
return ($setuname,$setudom,$title,$blocks); |
return ($setuname,$setudom,$title,$blocks); |
} |
} |
|
|
sub build_block_table { |
sub blocking_status { |
my ($startblock,$endblock,$setters) = @_; |
my ($activity,$uname,$udom) = @_; |
my %lt = &Apache::lonlocal::texthash( |
my %setters; |
'cacb' => 'Currently active communication blocks', |
|
'cour' => 'Course', |
# check for active blocking |
'dura' => 'Duration', |
my ($startblock,$endblock)=&blockcheck(\%setters,$activity,$uname,$udom); |
'blse' => 'Block set by' |
|
); |
my $blocked = $startblock && $endblock ? 1 : 0; |
my $output; |
|
$output = '<br />'.$lt{'cacb'}.':<br />'; |
# caller just wants to know whether a block is active |
$output .= &start_data_table(); |
if (!wantarray) { return $blocked; } |
$output .= ' |
|
<tr> |
# build a link to a popup window containing the details |
<th>'.$lt{'cour'}.'</th> |
my $querystring = "?activity=$activity"; |
<th>'.$lt{'dura'}.'</th> |
# $uname and $udom decide whose portfolio the user is trying to look at |
<th>'.$lt{'blse'}.'</th> |
$querystring .= "&udom=$udom" if $udom; |
</tr> |
$querystring .= "&uname=$uname" if $uname; |
'; |
|
foreach my $course (keys(%{$setters})) { |
my $output .= <<'END_MYBLOCK'; |
my %courseinfo=&Apache::lonnet::coursedescription($course); |
function openWindow(url, wdwName, w, h, toolbar,scrollbar) { |
for (my $i=0; $i<@{$$setters{$course}{staff}}; $i++) { |
var options = "width=" + w + ",height=" + h + ","; |
my ($uname,$udom) = @{$$setters{$course}{staff}[$i]}; |
options += "resizable=yes,scrollbars="+scrollbar+",status=no,"; |
my $fullname = &plainname($uname,$udom); |
options += "menubar=no,toolbar="+toolbar+",location=no,directories=no"; |
if (defined($env{'user.name'}) && defined($env{'user.domain'}) |
var newWin = window.open(url, wdwName, options); |
&& $env{'user.name'} ne 'public' |
newWin.focus(); |
&& $env{'user.domain'} ne 'public') { |
} |
$fullname = &aboutmewrapper($fullname,$uname,$udom); |
END_MYBLOCK |
} |
|
my ($openblock,$closeblock) = @{$$setters{$course}{times}[$i]}; |
$output = Apache::lonhtmlcommon::scripttag($output); |
$openblock = &Apache::lonlocal::locallocaltime($openblock); |
|
$closeblock= &Apache::lonlocal::locallocaltime($closeblock); |
my $popupUrl = "/adm/blockingstatus/$querystring"; |
$output .= &Apache::loncommon::start_data_table_row(). |
my $text = mt('Communication Blocked'); |
'<td>'.$courseinfo{'description'}.'</td>'. |
|
'<td>'.$openblock.' to '.$closeblock.'</td>'. |
$output .= <<"END_BLOCK"; |
'<td>'.$fullname.'</td>'. |
<div class='LC_comblock'> |
&Apache::loncommon::end_data_table_row(); |
<a onclick='openWindow("$popupUrl","Blocking Table",600,300,"no","no");return false;' href='/adm/blockingstatus/$querystring' |
} |
title='$text'> |
} |
<img class='LC_noBorder LC_middle' title='$text' src='/res/adm/pages/comblock.png' alt='$text'/></a> |
$output .= &end_data_table(); |
<a onclick='openWindow("$popupUrl","Blocking Table",600,300,"no","no");return false;' href='/adm/blockingstatus/$querystring' |
|
title='$text'>$text</a> |
|
</div> |
|
|
|
END_BLOCK |
|
|
|
return ($blocked, $output); |
} |
} |
|
|
sub blocking_status { |
############################################### |
my ($activity,$uname,$udom) = @_; |
|
my %setters; |
sub check_ip_acc { |
my ($blocked,$output,$ownitem,$is_course); |
my ($acc)=@_; |
my ($startblock,$endblock)=&blockcheck(\%setters,$activity,$uname,$udom); |
&Apache::lonxml::debug("acc is $acc"); |
if ($startblock && $endblock) { |
if (!defined($acc) || $acc =~ /^\s*$/ || $acc =~/^\s*no\s*$/i) { |
$blocked = 1; |
return 1; |
if (wantarray) { |
} |
my $category; |
my $allowed=0; |
if ($activity eq 'boards') { |
my $ip=$env{'request.host'} || $ENV{'REMOTE_ADDR'}; |
$category = 'Discussion posts in this course'; |
|
} elsif ($activity eq 'blogs') { |
my $name; |
$category = 'Blogs'; |
foreach my $pattern (split(',',$acc)) { |
} elsif ($activity eq 'port') { |
$pattern =~ s/^\s*//; |
if (defined($uname) && defined($udom)) { |
$pattern =~ s/\s*$//; |
if ($uname eq $env{'user.name'} && |
if ($pattern =~ /\*$/) { |
$udom eq $env{'user.domain'}) { |
#35.8.* |
$ownitem = 1; |
$pattern=~s/\*//; |
} |
if ($ip =~ /^\Q$pattern\E/) { $allowed=1; } |
} |
} elsif ($pattern =~ /(\d+\.\d+\.\d+)\.\[(\d+)-(\d+)\]$/) { |
$is_course = &Apache::lonnet::is_course($udom,$uname); |
#35.8.3.[34-56] |
if ($ownitem) { |
my $low=$2; |
$category = 'Your portfolio files'; |
my $high=$3; |
} elsif ($is_course) { |
$pattern=$1; |
my $coursedesc; |
if ($ip =~ /^\Q$pattern\E/) { |
foreach my $course (keys(%setters)) { |
my $last=(split(/\./,$ip))[3]; |
my %courseinfo = |
if ($last <=$high && $last >=$low) { $allowed=1; } |
&Apache::lonnet::coursedescription($course); |
} |
$coursedesc = $courseinfo{'description'}; |
} elsif ($pattern =~ /^\*/) { |
} |
#*.msu.edu |
$category = "Group files in the course '$coursedesc'"; |
$pattern=~s/\*//; |
} else { |
if (!defined($name)) { |
$category = 'Portfolio files belonging to '; |
use Socket; |
if ($env{'user.name'} eq 'public' && |
my $netaddr=inet_aton($ip); |
$env{'user.domain'} eq 'public') { |
($name)=gethostbyaddr($netaddr,AF_INET); |
$category .= &plainname($uname,$udom); |
} |
} else { |
if ($name =~ /\Q$pattern\E$/i) { $allowed=1; } |
$category .= &aboutmewrapper(&plainname($uname,$udom),$uname,$udom); |
} elsif ($pattern =~ /\d+\.\d+\.\d+\.\d+/) { |
} |
#127.0.0.1 |
} |
if ($ip =~ /^\Q$pattern\E/) { $allowed=1; } |
} elsif ($activity eq 'groups') { |
} else { |
$category = 'Groups in this course'; |
#some.name.com |
} |
if (!defined($name)) { |
my $showstart = &Apache::lonlocal::locallocaltime($startblock); |
use Socket; |
my $showend = &Apache::lonlocal::locallocaltime($endblock); |
my $netaddr=inet_aton($ip); |
$output = '<br />'.&mt('[_1] will be inaccessible between [_2] and [_3] because communication is being blocked.',$category,$showstart,$showend).'<br />'; |
($name)=gethostbyaddr($netaddr,AF_INET); |
if (!($activity eq 'port' && !($ownitem) && !($is_course))) { |
|
$output .= &build_block_table($startblock,$endblock,\%setters); |
|
} |
} |
|
if ($name =~ /\Q$pattern\E$/i) { $allowed=1; } |
} |
} |
|
if ($allowed) { last; } |
} |
} |
if (wantarray) { |
return $allowed; |
return ($blocked,$output); |
|
} else { |
|
return $blocked; |
|
} |
|
} |
} |
|
|
############################################### |
############################################### |
Line 3523 sub determinedomain {
|
Line 4359 sub determinedomain {
|
my $domain=shift; |
my $domain=shift; |
if (! $domain) { |
if (! $domain) { |
# Determine domain if we have not been given one |
# 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{'user.domain'}) { $domain=$env{'user.domain'}; } |
if ($env{'request.role.domain'}) { |
if ($env{'request.role.domain'}) { |
$domain=$env{'request.role.domain'}; |
$domain=$env{'request.role.domain'}; |
Line 3546 sub get_domainconf {
|
Line 4382 sub get_domainconf {
|
if (defined($cached)) { return %{$result}; } |
if (defined($cached)) { return %{$result}; } |
|
|
my %domconfig = &Apache::lonnet::get_dom('configuration', |
my %domconfig = &Apache::lonnet::get_dom('configuration', |
['login','rolecolors'],$udom); |
['login','rolecolors','autoenroll'],$udom); |
my %designhash; |
my (%designhash,%legacy); |
if (keys(%domconfig) > 0) { |
if (keys(%domconfig) > 0) { |
if (ref($domconfig{'login'}) eq 'HASH') { |
if (ref($domconfig{'login'}) eq 'HASH') { |
foreach my $key (keys(%{$domconfig{'login'}})) { |
if (keys(%{$domconfig{'login'}})) { |
$designhash{$udom.'.login.'.$key}=$domconfig{'login'}{$key}; |
foreach my $key (keys(%{$domconfig{'login'}})) { |
|
if (ref($domconfig{'login'}{$key}) eq 'HASH') { |
|
if ($key eq 'loginvia') { |
|
if (ref($domconfig{'login'}{'loginvia'}) eq 'HASH') { |
|
foreach my $hostname (keys(%{$domconfig{'login'}{'loginvia'}})) { |
|
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}; |
|
} |
|
} |
|
} else { |
|
$legacy{'login'} = 1; |
} |
} |
|
} else { |
|
$legacy{'login'} = 1; |
} |
} |
if (ref($domconfig{'rolecolors'}) eq 'HASH') { |
if (ref($domconfig{'rolecolors'}) eq 'HASH') { |
foreach my $role (keys(%{$domconfig{'rolecolors'}})) { |
if (keys(%{$domconfig{'rolecolors'}})) { |
if (ref($domconfig{'rolecolors'}{$role}) eq 'HASH') { |
foreach my $role (keys(%{$domconfig{'rolecolors'}})) { |
foreach my $item (keys(%{$domconfig{'rolecolors'}{$role}})) { |
if (ref($domconfig{'rolecolors'}{$role}) eq 'HASH') { |
$designhash{$udom.'.'.$role.'.'.$item}=$domconfig{'rolecolors'}{$role}{$item}; |
foreach my $item (keys(%{$domconfig{'rolecolors'}{$role}})) { |
|
$designhash{$udom.'.'.$role.'.'.$item}=$domconfig{'rolecolors'}{$role}{$item}; |
|
} |
} |
} |
} |
} |
|
} else { |
|
$legacy{'rolecolors'} = 1; |
} |
} |
|
} else { |
|
$legacy{'rolecolors'} = 1; |
} |
} |
} else { |
if (ref($domconfig{'autoenroll'}) eq 'HASH') { |
my $designdir=$Apache::lonnet::perlvar{'lonTabDir'}.'/lonDomColors'; |
if ($domconfig{'autoenroll'}{'co-owners'}) { |
my $designfile = $designdir.'/'.$udom.'.tab'; |
$designhash{$udom.'.autoassign.co-owners'}=$domconfig{'autoenroll'}{'co-owners'}; |
if (-e $designfile) { |
|
if ( open (my $fh,"<$designfile") ) { |
|
while (my $line = <$fh>) { |
|
next if ($line =~ /^\#/); |
|
chomp($line); |
|
my ($key,$val)=(split(/\=/,$line)); |
|
if ($val) { $designhash{$udom.'.'.$key}=$val; } |
|
} |
|
close($fh); |
|
} |
} |
} |
} |
if (-e '/home/httpd/html/adm/lonDomLogos/'.$udom.'.gif') { |
if (keys(%legacy) > 0) { |
$designhash{$udom.'.login.domlogo'} = "/adm/lonDomLogos/$udom.gif"; |
my %legacyhash = &get_legacy_domconf($udom); |
|
foreach my $item (keys(%legacyhash)) { |
|
if ($item =~ /^\Q$udom\E\.login/) { |
|
if ($legacy{'login'}) { |
|
$designhash{$item} = $legacyhash{$item}; |
|
} |
|
} else { |
|
if ($legacy{'rolecolors'}) { |
|
$designhash{$item} = $legacyhash{$item}; |
|
} |
|
} |
|
} |
} |
} |
|
} else { |
|
%designhash = &get_legacy_domconf($udom); |
} |
} |
&Apache::lonnet::do_cache_new('domainconfig',$udom,\%designhash, |
&Apache::lonnet::do_cache_new('domainconfig',$udom,\%designhash, |
$cachetime); |
$cachetime); |
return %designhash; |
return %designhash; |
} |
} |
|
|
|
sub get_legacy_domconf { |
|
my ($udom) = @_; |
|
my %legacyhash; |
|
my $designdir=$Apache::lonnet::perlvar{'lonTabDir'}.'/lonDomColors'; |
|
my $designfile = $designdir.'/'.$udom.'.tab'; |
|
if (-e $designfile) { |
|
if ( open (my $fh,"<$designfile") ) { |
|
while (my $line = <$fh>) { |
|
next if ($line =~ /^\#/); |
|
chomp($line); |
|
my ($key,$val)=(split(/\=/,$line)); |
|
if ($val) { $legacyhash{$udom.'.'.$key}=$val; } |
|
} |
|
close($fh); |
|
} |
|
} |
|
if (-e $Apache::lonnet::perlvar{'lonDocRoot'}.'/adm/lonDomLogos/'.$udom.'.gif') { |
|
$legacyhash{$udom.'.login.domlogo'} = "/adm/lonDomLogos/$udom.gif"; |
|
} |
|
return %legacyhash; |
|
} |
|
|
=pod |
=pod |
|
|
=item * &domainlogo() |
=item * &domainlogo() |
Line 3634 Returns: value of designparamter $which
|
Line 4537 Returns: value of designparamter $which
|
############################################## |
############################################## |
sub designparm { |
sub designparm { |
my ($which,$domain)=@_; |
my ($which,$domain)=@_; |
if ($env{'browser.blackwhite'} eq 'on') { |
|
if ($which=~/\.(font|alink|vlink|link)$/) { |
|
return '#000000'; |
|
} |
|
if ($which=~/\.(pgbg|sidebg)$/) { |
|
return '#FFFFFF'; |
|
} |
|
if ($which=~/\.tabbg$/) { |
|
return '#CCCCCC'; |
|
} |
|
} |
|
if (exists($env{'environment.color.'.$which})) { |
if (exists($env{'environment.color.'.$which})) { |
return $env{'environment.color.'.$which}; |
return $env{'environment.color.'.$which}; |
} |
} |
$domain=&determinedomain($domain); |
$domain=&determinedomain($domain); |
my %domdesign = &get_domainconf($domain); |
my %domdesign; |
|
unless ($domain eq 'public') { |
|
%domdesign = &get_domainconf($domain); |
|
} |
my $output; |
my $output; |
if ($domdesign{$domain.'.'.$which} ne '') { |
if ($domdesign{$domain.'.'.$which} ne '') { |
$output = $domdesign{$domain.'.'.$which}; |
$output = $domdesign{$domain.'.'.$which}; |
} else { |
} else { |
$output = $defaultdesign{$which}; |
$output = $defaultdesign{$which}; |
} |
} |
if (($which =~ /^(student|coordinator|author|admin)\.img$/) || |
if (($which =~ /^(student|coordinator|author|admin)\.img$/) || |
($which =~ /login\.(img|logo|domlogo)/)) { |
($which =~ /login\.(img|logo|domlogo|login)/)) { |
if ($output =~ m{^/(adm|res)/}) { |
if ($output =~ m{^/(adm|res)/}) { |
if ($output =~ m{^/res/}) { |
if ($output =~ m{^/res/}) { |
my $local_name = &Apache::lonnet::filelocation('',$output); |
my $local_name = &Apache::lonnet::filelocation('',$output); |
&Apache::lonnet::repcopy($local_name); |
&Apache::lonnet::repcopy($local_name); |
} |
} |
$output = &lonhttpdurl($output); |
$output = &lonhttpdurl($output); |
} |
} |
} |
} |
return $output; |
return $output; |
} |
} |
|
|
|
############################################## |
|
=pod |
|
|
|
=item * &authorspace() |
|
|
|
Inputs: $url (usually will be undef). |
|
|
|
Returns: Path to Construction Space containing the resource or |
|
directory being viewed (or for which action is being taken). |
|
If $url is provided, and begins /priv/<domain>/<uname> |
|
the path will be that portion of the $context argument. |
|
Otherwise the path will be for the author space of the current |
|
user when the current role is author, or for that of the |
|
co-author/assistant co-author space when the current role |
|
is co-author or assistant co-author. |
|
|
|
=cut |
|
|
|
sub authorspace { |
|
my ($url) = @_; |
|
if ($url ne '') { |
|
if ($url =~ m{^(/priv/$match_domain/$match_username/)}) { |
|
return $1; |
|
} |
|
} |
|
my $caname = ''; |
|
my $cadom = ''; |
|
if ($env{'request.role'} =~ /^(?:ca|aa)/) { |
|
($cadom,$caname) = |
|
($env{'request.role'}=~/($match_domain)\/($match_username)$/); |
|
} elsif ($env{'request.role'} =~ m{^au\./($match_domain)/}) { |
|
$caname = $env{'user.name'}; |
|
$cadom = $env{'user.domain'}; |
|
} |
|
if (($caname ne '') && ($cadom ne '')) { |
|
return "/priv/$cadom/$caname/"; |
|
} |
|
return; |
|
} |
|
|
|
############################################## |
|
=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 = |
|
'<div class="LC_head_subbox">' |
|
.$content |
|
.'</div>' |
|
} |
|
|
|
############################################## |
|
=pod |
|
|
|
=item * &CSTR_pageheader() |
|
|
|
Input: (optional) filename from which breadcrumb trail is built. |
|
In most cases no input as needed, as $env{'request.filename'} |
|
is appropriate for use in building the breadcrumb trail. |
|
|
|
Returns: HTML div with CSTR path and recent box |
|
To be included on Construction Space pages |
|
|
|
=cut |
|
|
|
sub CSTR_pageheader { |
|
my ($trailfile) = @_; |
|
if ($trailfile eq '') { |
|
$trailfile = $env{'request.filename'}; |
|
} |
|
|
|
# this is for resources; directories have customtitle, and crumbs |
|
# and select recent are created in lonpubdir.pm |
|
|
|
my $londocroot = $Apache::lonnet::perlvar{'lonDocRoot'}; |
|
my ($udom,$uname,$thisdisfn)= |
|
($trailfile =~ m{^\Q$londocroot\E/priv/([^/]+)/([^/]+)/(.*)$}); |
|
my $formaction = "/priv/$udom/$uname/$thisdisfn"; |
|
$formaction =~ s{/+}{/}g; |
|
|
|
my $parentpath = ''; |
|
my $lastitem = ''; |
|
if ($thisdisfn =~ m-(.+/)([^/]*)$-) { |
|
$parentpath = $1; |
|
$lastitem = $2; |
|
} else { |
|
$lastitem = $thisdisfn; |
|
} |
|
|
|
my $output = |
|
'<div>' |
|
.&Apache::loncommon::help_open_menu('','',3,'Authoring') #FIXME: Broken? Where is it? |
|
.'<b>'.&mt('Construction Space:').'</b> ' |
|
.'<form name="dirs" method="post" action="'.$formaction |
|
.'" target="_top">' #FIXME lonpubdir: target="_parent" |
|
.&Apache::lonhtmlcommon::crumbs($uname.'/'.$parentpath,'_top','/priv/'.$udom,undef,undef); |
|
|
|
if ($lastitem) { |
|
$output .= |
|
'<span class="LC_filename">' |
|
.$lastitem |
|
.'</span>'; |
|
} |
|
$output .= |
|
'<br />' |
|
#FIXME lonpubdir: &Apache::lonhtmlcommon::crumbs($uname.$thisdisfn.'/','_top','/priv','','+1',1)."</b></tt><br />" |
|
.&Apache::lonhtmlcommon::select_recent('construct','recent','this.form.action=this.form.recent.value;this.form.submit()') |
|
.'</form>' |
|
.&Apache::lonmenu::constspaceform() |
|
.'</div>'; |
|
|
|
return $output; |
|
} |
|
|
############################################### |
############################################### |
############################################### |
############################################### |
|
|
Line 3701 Inputs:
|
Line 4719 Inputs:
|
=item * $forcereg, if page should register as content page (relevant for |
=item * $forcereg, if page should register as content page (relevant for |
text interface only) |
text interface only) |
|
|
=item * $customtitle, alternate text to use instead of $title |
=item * $no_nav_bar, if true, keep the 'what is this' info but remove the |
in the title box that appears, this text |
navigational links |
is not auto translated like the $title is |
|
|
|
=item * $notopbar, 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 * $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 |
|
|
|
=item * $args, optional argument valid values are |
=item * $args, optional argument valid values are |
no_auto_mt_title -> prevents &mt()ing the title arg |
no_auto_mt_title -> prevents &mt()ing the title arg |
inherit_jsmath -> when creating popup window in a page, |
inherit_jsmath -> when creating popup window in a page, |
Line 3731 other decorations will be returned.
|
Line 4740 other decorations will be returned.
|
=cut |
=cut |
|
|
sub bodytag { |
sub bodytag { |
my ($title,$function,$addentries,$bodyonly,$domain,$forcereg,$customtitle, |
my ($title,$function,$addentries,$bodyonly,$domain,$forcereg, |
$notopbar,$bgcolor,$notitle,$no_inline_link,$args)=@_; |
$no_nav_bar,$bgcolor,$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); } |
if (!$args->{'no_auto_mt_title'}) { $title = &mt($title); } |
|
|
$function = &get_users_function() if (!$function); |
$function = &get_users_function() if (!$function); |
Line 3741 sub bodytag {
|
Line 4755 sub bodytag {
|
my $font = &designparm($function.'.font',$domain); |
my $font = &designparm($function.'.font',$domain); |
my $pgbg = $bgcolor || &designparm($function.'.pgbg',$domain); |
my $pgbg = $bgcolor || &designparm($function.'.pgbg',$domain); |
|
|
my %design = ( 'style' => 'margin-top: 0px', |
my %design = ( 'style' => 'margin-top: 0', |
'bgcolor' => $pgbg, |
'bgcolor' => $pgbg, |
'text' => $font, |
'text' => $font, |
'alink' => &designparm($function.'.alink',$domain), |
'alink' => &designparm($function.'.alink',$domain), |
Line 3760 sub bodytag {
|
Line 4774 sub bodytag {
|
if ($env{'request.role'} !~ /^cr/) { |
if ($env{'request.role'} !~ /^cr/) { |
$role = &Apache::lonnet::plaintext($role,&course_type()); |
$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'}; |
$realm = $env{'course.'.$env{'request.course.id'}.'.description'}; |
} else { |
} else { |
$role = &Apache::lonnet::plaintext($role); |
$role = &Apache::lonnet::plaintext($role); |
} |
} |
|
|
if (!$realm) { $realm=' '; } |
if (!$realm) { $realm=' '; } |
# Set messages |
|
my $messages=&domainlogo($domain); |
|
|
|
my $extra_body_attr = &make_attr_string($forcereg,\%design); |
my $extra_body_attr = &make_attr_string($forcereg,\%design); |
|
|
Line 3777 sub bodytag {
|
Line 4792 sub bodytag {
|
|
|
if ($bodyonly) { |
if ($bodyonly) { |
return $bodytag; |
return $bodytag; |
} elsif ($env{'browser.interface'} eq 'textual') { |
} |
# Accessibility |
|
|
|
$bodytag.=&Apache::lonmenu::menubuttons($forcereg,$forcereg); |
|
if (!$notitle) { |
|
$bodytag.='<h1>LON-CAPA: '.$title.'</h1>'; |
|
} |
|
return $bodytag; |
|
} |
|
|
|
my $name = &plainname($env{'user.name'},$env{'user.domain'}); |
my $name = &plainname($env{'user.name'},$env{'user.domain'}); |
if ($env{'user.name'} eq 'public' && $env{'user.domain'} eq 'public') { |
if ($public) { |
undef($role); |
undef($role); |
} else { |
} else { |
$name = &aboutmewrapper($name,$env{'user.name'},$env{'user.domain'}); |
$name = &aboutmewrapper($name,$env{'user.name'},$env{'user.domain'}); |
} |
} |
|
|
my $roleinfo=(<<ENDROLE); |
my $titleinfo = '<h1>'.$title.'</h1>'; |
<td class="LC_title_bar_who"> |
|
<div class="LC_title_bar_name"> |
|
$name |
|
|
|
</div> |
|
<div class="LC_title_bar_role"> |
|
$role |
|
</div> |
|
<div class="LC_title_bar_realm"> |
|
$realm |
|
</div> |
|
</td> |
|
ENDROLE |
|
|
|
my $titleinfo = '<span class="LC_title_bar_title">'.$title.'</span>'; |
|
if ($customtitle) { |
|
$titleinfo = $customtitle; |
|
} |
|
# |
# |
# Extra info if you are the DC |
# Extra info if you are the DC |
my $dc_info = ''; |
my $dc_info = ''; |
Line 3820 ENDROLE
|
Line 4809 ENDROLE
|
$env{'course.'.$env{'request.course.id'}. |
$env{'course.'.$env{'request.course.id'}. |
'.domain'}.'/'})) { |
'.domain'}.'/'})) { |
my $cid = $env{'request.course.id'}; |
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 =~ s/\s+$//; |
$dc_info = '('.$dc_info.')'; |
|
} |
} |
|
|
if ($env{'environment.remote'} eq 'off') { |
$role = '<span class="LC_nobreak">('.$role.')</span>' if $role; |
# No Remote |
&get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['inhibitmenu']); |
if ($env{'request.state'} eq 'construct') { |
|
$forcereg=1; |
|
} |
|
|
|
if (!$customtitle && $env{'request.state'} eq 'construct') { |
if ($no_nav_bar || $env{'form.inhibitmenu'} eq 'yes') { |
# this is for resources; directories have customtitle, and crumbs |
return $bodytag; |
# and select recent are created in lonpubdir.pm |
} |
my ($uname,$thisdisfn)= |
|
($env{'request.filename'} =~ m|^/home/([^/]+)/public_html/(.*)|); |
if ($env{'request.state'} eq 'construct') { $forcereg=1; } |
my $formaction='/priv/'.$uname.'/'.$thisdisfn; |
|
$formaction=~s/\/+/\//g; |
# if ($env{'request.state'} eq 'construct') { |
|
# $titleinfo = &CSTR_pageheader(); #FIXME: Will be removed once all scripts have their own calls |
my $parentpath = ''; |
# } |
my $lastitem = ''; |
|
if ($thisdisfn =~ m-(.+/)([^/]*)$-) { |
|
$parentpath = $1; |
|
$lastitem = $2; |
if ($env{'request.noversionuri'} =~ m{^/res/adm/pages/}) { |
} else { |
if ($dc_info) { |
$lastitem = $thisdisfn; |
$dc_info = qq|<span class="LC_cusr_subheading">$dc_info</span>|; |
} |
} |
$titleinfo = |
$bodytag .= qq|<div id="LC_nav_bar">$name $role<br /> |
&Apache::loncommon::help_open_menu('','',3,'Authoring'). |
<em>$realm</em> $dc_info</div>|; |
'<b>Construction Space</b>: '. |
return $bodytag; |
'<form name="dirs" method="post" action="'.$formaction |
} |
.'" target="_top"><tt><b>' |
|
.&Apache::lonhtmlcommon::crumbs($uname.'/'.$parentpath,'_top','/priv','','+1',1)."<font size=\"+1\">$lastitem</font></b></tt><br />" |
unless ($env{'request.symb'} =~ m/\.page___\d+___/) { |
.&Apache::lonhtmlcommon::select_recent('construct','recent','this.form.action=this.form.recent.value;this.form.submit()') |
$bodytag .= qq|<div id="LC_nav_bar">$name $role</div>|; |
.'</form>' |
} |
.&Apache::lonmenu::constspaceform(); |
|
} |
$bodytag .= Apache::lonhtmlcommon::scripttag( |
|
Apache::lonmenu::utilityfunctions(), 'start'); |
my $titletable; |
|
if (!$notitle) { |
$bodytag .= Apache::lonmenu::primary_menu(); |
$titletable = |
|
'<table id="LC_title_bar">'. |
if ($dc_info) { |
"<tr><td> $titleinfo $dc_info</td>".$roleinfo. |
$dc_info = &dc_courseid_toggle($dc_info); |
'</tr></table>'; |
} |
} |
$bodytag .= qq|<div id="LC_realm">$realm $dc_info</div>|; |
if ($notopbar) { |
|
$bodytag .= $titletable; |
#don't show menus for public users |
} else { |
if (!$public){ |
if ($env{'request.state'} eq 'construct') { |
$bodytag .= Apache::lonmenu::secondary_menu(); |
$bodytag .= &Apache::lonmenu::menubuttons($forcereg,$forcereg, |
$bodytag .= Apache::lonmenu::serverform(); |
$titletable); |
$bodytag .= Apache::lonhtmlcommon::scripttag('', 'end'); |
} else { |
if ($env{'request.state'} eq 'construct') { |
$bodytag .= &Apache::lonmenu::menubuttons($forcereg,$forcereg). |
$bodytag .= &Apache::lonmenu::innerregister($forcereg, |
$titletable; |
$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 .= '<hr style="clear:both" />'; |
|
$bodytag .= Apache::lonhtmlcommon::scripttag('', 'end'); |
} |
} |
return $bodytag; |
|
} |
|
|
|
# |
return $bodytag; |
# Top frame rendering, Remote is up |
} |
# |
|
|
|
my $imgsrc = $img; |
sub dc_courseid_toggle { |
if ($img =~ /^\/adm/) { |
my ($dc_info) = @_; |
$imgsrc = &lonhttpdurl($img); |
return ' <span id="dccidtext" class="LC_cusr_subheading LC_nobreak">'. |
} |
'<a href="javascript:showCourseID();">'. |
my $upperleft='<img src="'.$imgsrc.'" alt="'.$function.'" />'; |
&mt('(More ...)').'</a></span>'. |
|
'<div id="dccid" class="LC_dccid">'.$dc_info.'</div>'; |
# Explicit link to get inline menu |
|
my $menu= ($no_inline_link?'' |
|
:'<br /><a href="/adm/remote?action=collapse">'.&mt('Switch to Inline Menu Mode').'</a>'); |
|
# |
|
if ($notitle) { |
|
return $bodytag; |
|
} |
|
return(<<ENDBODY); |
|
$bodytag |
|
<table id="LC_title_bar" class="LC_with_remote"> |
|
<tr><td class="LC_title_bar_role_logo">$upperleft</td> |
|
<td class="LC_title_bar_domain_logo">$messages </td> |
|
</tr> |
|
<tr><td>$titleinfo $dc_info $menu</td> |
|
$roleinfo |
|
</tr> |
|
</table> |
|
ENDBODY |
|
} |
} |
|
|
sub make_attr_string { |
sub make_attr_string { |
Line 3930 sub make_attr_string {
|
Line 4901 sub make_attr_string {
|
delete($attr_ref->{$key}); |
delete($attr_ref->{$key}); |
} |
} |
} |
} |
$attr_ref->{'onload'} = |
$attr_ref->{'onload'} = $on_load; |
&Apache::lonmenu::loadevents(). $on_load; |
$attr_ref->{'onunload'}= $on_unload; |
$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'}); |
|
} |
} |
|
|
my $attr_string; |
my $attr_string; |
Line 3974 sub make_attr_string {
|
Line 4922 sub make_attr_string {
|
|
|
Returns a uniform footer for LON-CAPA web pages. |
Returns a uniform footer for LON-CAPA web pages. |
|
|
Inputs: none |
Inputs: 1 - optional reference to an args hash |
|
If in the hash, key for noredirectlink has a value which evaluates to true, |
|
a 'Continue' link is not displayed if the page contains an |
|
internal redirect in the <head></head> section, |
|
i.e., $env{'internal.head.redirect'} exists |
|
|
=cut |
=cut |
|
|
sub endbodytag { |
sub endbodytag { |
|
my ($args) = @_; |
my $endbodytag='</body>'; |
my $endbodytag='</body>'; |
$endbodytag=&Apache::lontexconvert::jsMath_process()."\n".$endbodytag; |
$endbodytag=&Apache::lontexconvert::jsMath_process()."\n".$endbodytag; |
if ( exists( $env{'internal.head.redirect'} ) ) { |
if ( exists( $env{'internal.head.redirect'} ) ) { |
$endbodytag= |
if (!(ref($args) eq 'HASH' && $args->{'noredirectlink'})) { |
"<br /><a href=\"$env{'internal.head.redirect'}\">". |
$endbodytag= |
&mt('Continue').'</a>'. |
"<br /><a href=\"$env{'internal.head.redirect'}\">". |
$endbodytag; |
&mt('Continue').'</a>'. |
|
$endbodytag; |
|
} |
} |
} |
return $endbodytag; |
return $endbodytag; |
} |
} |
Line 4010 sub standard_css {
|
Line 4965 sub standard_css {
|
my $img = &designparm($function.'.img', $domain); |
my $img = &designparm($function.'.img', $domain); |
my $tabbg = &designparm($function.'.tabbg', $domain); |
my $tabbg = &designparm($function.'.tabbg', $domain); |
my $font = &designparm($function.'.font', $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 $sidebg = &designparm($function.'.sidebg',$domain); |
my $pgbg_or_bgcolor = |
my $pgbg_or_bgcolor = |
$bgcolor || |
$bgcolor || |
Line 4019 sub standard_css {
|
Line 4976 sub standard_css {
|
my $vlink = &designparm($function.'.vlink', $domain); |
my $vlink = &designparm($function.'.vlink', $domain); |
my $link = &designparm($function.'.link', $domain); |
my $link = &designparm($function.'.link', $domain); |
|
|
my $sans = 'Arial,Helvetica,sans-serif'; |
my $sans = 'Verdana,Arial,Helvetica,sans-serif'; |
my $mono = 'monospace'; |
my $mono = 'monospace'; |
my $data_table_head = $tabbg; |
my $data_table_head = $sidebg; |
my $data_table_light = '#EEEEEE'; |
my $data_table_light = '#FAFAFA'; |
my $data_table_dark = '#DDDDDD'; |
my $data_table_dark = '#F0F0F0'; |
my $data_table_darker = '#CCCCCC'; |
my $data_table_darker = '#CCCCCC'; |
my $data_table_highlight = '#FFFF00'; |
my $data_table_highlight = '#FFFF00'; |
my $mail_new = '#FFBB77'; |
my $mail_new = '#FFBB77'; |
Line 4036 sub standard_css {
|
Line 4993 sub standard_css {
|
my $mail_other_hover = '#669999'; |
my $mail_other_hover = '#669999'; |
my $table_header = '#DDDDDD'; |
my $table_header = '#DDDDDD'; |
my $feedback_link_bg = '#BBBBBB'; |
my $feedback_link_bg = '#BBBBBB'; |
|
my $lg_border_color = '#C8C8C8'; |
|
my $button_hover = '#BF2317'; |
|
|
my $border = ($env{'browser.type'} eq 'explorer') ? '0px 2px 0px 2px' |
my $border = ($env{'browser.type'} eq 'explorer' || |
: '0px 3px 0px 4px'; |
$env{'browser.type'} eq 'safari' ) ? '0 2px 0 2px' |
|
: '0 3px 0 4px'; |
|
|
|
|
return <<END; |
return <<END; |
h1, h2, h3, th { font-family: $sans } |
|
a:focus { color: red; background: yellow } |
|
table.thinborder, |
|
|
|
table.thinborder tr th { |
/* needed for iframe to allow 100% height in FF */ |
border-style: solid; |
body, html { |
border-width: 1px; |
margin: 0; |
background: $tabbg; |
padding: 0 0.5%; |
|
height: 99%; /* to avoid scrollbars */ |
} |
} |
table.thinborder tr td { |
|
border-style: solid; |
body { |
border-width: 1px |
font-family: $sans; |
|
line-height:130%; |
|
font-size:0.83em; |
|
color:$font; |
|
} |
|
|
|
a:focus, |
|
a:focus img { |
|
color: red; |
|
background: yellow; |
|
} |
|
|
|
form, .inline { |
|
display: inline; |
|
} |
|
|
|
.LC_right { |
|
text-align:right; |
|
} |
|
|
|
.LC_middle { |
|
vertical-align:middle; |
|
} |
|
|
|
.LC_400Box { |
|
width:400px; |
|
} |
|
|
|
.LC_iframecontainer { |
|
width: 98%; |
|
margin: 0; |
|
position: fixed; |
|
top: 8.5em; |
|
bottom: 0; |
|
} |
|
|
|
.LC_iframecontainer iframe{ |
|
border: none; |
|
width: 100%; |
|
height: 100%; |
|
} |
|
|
|
.LC_filename { |
|
font-family: $mono; |
|
white-space:pre; |
|
font-size: 120%; |
|
} |
|
|
|
.LC_fileicon { |
|
border: none; |
|
height: 1.3em; |
|
vertical-align: text-bottom; |
|
margin-right: 0.3em; |
|
text-decoration:none; |
|
} |
|
|
|
.LC_setting { |
|
text-decoration:underline; |
} |
} |
|
|
form, .inline { display: inline; } |
|
.center { text-align: center; } |
|
.LC_filename {font-family: $mono;} |
|
.LC_error { |
.LC_error { |
color: red; |
color: red; |
font-size: larger; |
font-size: larger; |
} |
} |
|
|
.LC_warning, |
.LC_warning, |
.LC_diff_removed { |
.LC_diff_removed { |
color: red; |
color: red; |
Line 4073 form, .inline { display: inline; }
|
Line 5086 form, .inline { display: inline; }
|
.LC_diff_added { |
.LC_diff_added { |
color: green; |
color: green; |
} |
} |
.LC_unknown { |
|
color: yellow; |
div.LC_confirm_box { |
|
background-color: #FAFAFA; |
|
border: 1px solid $lg_border_color; |
|
margin-right: 0; |
|
padding: 5px; |
} |
} |
|
|
.LC_icon { |
div.LC_confirm_box .LC_error img, |
border: 0px; |
div.LC_confirm_box .LC_success img { |
|
vertical-align: middle; |
} |
} |
.LC_indexer_icon { |
|
border: 0px; |
.LC_icon { |
height: 22px; |
border: none; |
|
vertical-align: middle; |
} |
} |
|
|
.LC_docs_spacer { |
.LC_docs_spacer { |
width: 25px; |
width: 25px; |
height: 1px; |
height: 1px; |
border: 0px; |
border: none; |
} |
} |
|
|
.LC_internal_info { |
.LC_internal_info { |
color: #999; |
color: #999999; |
|
} |
|
|
|
.LC_discussion { |
|
background: $tabbg; |
|
border: 1px solid black; |
|
margin: 2px; |
|
} |
|
|
|
.LC_disc_action_links_bar { |
|
background: $tabbg; |
|
border: none; |
|
margin: 4px; |
|
} |
|
|
|
.LC_disc_action_left { |
|
text-align: left; |
|
} |
|
|
|
.LC_disc_action_right { |
|
text-align: right; |
|
} |
|
|
|
.LC_disc_new_item { |
|
background: white; |
|
border: 2px solid red; |
|
margin: 2px; |
|
} |
|
|
|
.LC_disc_old_item { |
|
background: white; |
|
border: 1px solid black; |
|
margin: 2px; |
} |
} |
|
|
table.LC_pastsubmission { |
table.LC_pastsubmission { |
Line 4099 table.LC_pastsubmission {
|
Line 5151 table.LC_pastsubmission {
|
margin: 2px; |
margin: 2px; |
} |
} |
|
|
table#LC_top_nav, table#LC_menubuttons { |
table#LC_menubuttons { |
width: 100%; |
width: 100%; |
background: $pgbg; |
background: $pgbg; |
border: 2px; |
border: 2px; |
border-collapse: separate; |
border-collapse: separate; |
padding: 0px; |
padding: 0; |
|
} |
|
|
|
table#LC_title_bar a { |
|
color: $fontmenu; |
|
} |
|
|
|
table#LC_title_bar { |
|
clear: both; |
|
display: none; |
} |
} |
|
|
table#LC_title_bar, table.LC_breadcrumbs, table#LC_nav_location, |
table#LC_title_bar, |
|
table.LC_breadcrumbs, /* obsolete? */ |
table#LC_title_bar.LC_with_remote { |
table#LC_title_bar.LC_with_remote { |
width: 100%; |
width: 100%; |
border-color: $pgbg; |
border-color: $pgbg; |
border-style: solid; |
border-style: solid; |
border-width: $border; |
border-width: $border; |
|
|
background: $pgbg; |
background: $pgbg; |
font-family: $sans; |
color: $fontmenu; |
border-collapse: collapse; |
border-collapse: collapse; |
padding: 0px; |
padding: 0; |
|
margin: 0; |
} |
} |
|
|
table.LC_docs_path { |
ul.LC_breadcrumb_tools_outerlist { |
width: 100%; |
margin: 0; |
border: 0; |
padding: 0; |
background: $pgbg; |
position: relative; |
font-family: $sans; |
list-style: none; |
border-collapse: collapse; |
|
padding: 0px; |
|
} |
} |
|
ul.LC_breadcrumb_tools_outerlist li { |
table#LC_title_bar td { |
display: inline; |
background: $tabbg; |
|
} |
} |
table#LC_title_bar td.LC_title_bar_who { |
|
background: $tabbg; |
.LC_breadcrumb_tools_navigation { |
color: $font; |
padding: 0; |
font: small $sans; |
margin: 0; |
text-align: right; |
float: left; |
} |
|
span.LC_metadata { |
|
font-family: $sans; |
|
} |
} |
span.LC_title_bar_title { |
.LC_breadcrumb_tools_tools { |
font: bold x-large $sans; |
padding: 0; |
|
margin: 0; |
|
float: right; |
} |
} |
table#LC_title_bar td.LC_title_bar_domain_logo { |
|
background: $sidebg; |
table#LC_title_bar td { |
text-align: right; |
background: $tabbg; |
padding: 0px; |
|
} |
} |
table#LC_title_bar td.LC_title_bar_role_logo { |
|
background: $sidebg; |
table#LC_menubuttons img { |
padding: 0px; |
border: none; |
} |
} |
|
|
table#LC_menubuttons_mainmenu { |
.LC_breadcrumbs_component { |
width: 100%; |
float: right; |
border: 0px; |
margin: 0 1em; |
border-spacing: 1px; |
|
padding: 0px 1px; |
|
margin: 0px; |
|
border-collapse: separate; |
|
} |
} |
table#LC_menubuttons img, table#LC_menubuttons_mainmenu img { |
.LC_breadcrumbs_component img { |
border: 0px; |
vertical-align: middle; |
} |
} |
table#LC_top_nav td { |
|
background: $tabbg; |
td.LC_table_cell_checkbox { |
border: 0px; |
text-align: center; |
font-size: small; |
|
} |
} |
table#LC_top_nav td a, div#LC_top_nav a { |
|
color: $font; |
.LC_fontsize_small { |
font-family: $sans; |
font-size: 70%; |
} |
} |
table#LC_top_nav td.LC_top_nav_logo { |
|
background: $tabbg; |
#LC_breadcrumbs { |
|
clear:both; |
|
background: $sidebg; |
|
border-bottom: 1px solid $lg_border_color; |
|
line-height: 2.5em; |
|
overflow: hidden; |
|
margin: 0; |
|
padding: 0; |
text-align: left; |
text-align: left; |
white-space: nowrap; |
|
width: 31px; |
|
} |
} |
table#LC_top_nav td.LC_top_nav_logo img { |
|
border: 0px; |
.LC_head_subbox { |
vertical-align: bottom; |
clear:both; |
} |
background: #F8F8F8; /* $sidebg; */ |
table#LC_top_nav td.LC_top_nav_exit, |
border: 1px solid $sidebg; |
table#LC_top_nav td.LC_top_nav_help { |
margin: 0 0 10px 0; |
width: 2.0em; |
padding: 3px; |
|
text-align: left; |
} |
} |
table#LC_top_nav td.LC_top_nav_login { |
|
width: 4.0em; |
.LC_fontsize_medium { |
text-align: center; |
font-size: 85%; |
} |
} |
table.LC_breadcrumbs td, table.LC_docs_path td { |
|
background: $tabbg; |
.LC_fontsize_large { |
color: $font; |
font-size: 120%; |
font-family: $sans; |
|
font-size: smaller; |
|
} |
} |
table.LC_breadcrumbs td.LC_breadcrumbs_component, |
|
table.LC_docs_path td.LC_docs_path_component { |
.LC_menubuttons_inline_text { |
background: $tabbg; |
|
color: $font; |
color: $font; |
font-family: $sans; |
font-size: 90%; |
font-size: larger; |
padding-left:3px; |
text-align: right; |
|
} |
|
td.LC_table_cell_checkbox { |
|
text-align: center; |
|
} |
} |
|
|
table#LC_mainmenu td.LC_mainmenu_column { |
.LC_menubuttons_inline_text img{ |
vertical-align: top; |
vertical-align: middle; |
} |
} |
|
|
.LC_menubuttons_inline_text { |
li.LC_menubuttons_inline_text img,a { |
color: $font; |
cursor:pointer; |
font-family: $sans; |
text-decoration: none; |
font-size: smaller; |
|
} |
} |
|
|
.LC_menubuttons_link { |
.LC_menubuttons_link { |
Line 4227 table#LC_mainmenu td.LC_mainmenu_column
|
Line 5277 table#LC_mainmenu td.LC_mainmenu_column
|
.LC_menubuttons_category { |
.LC_menubuttons_category { |
color: $font; |
color: $font; |
background: $pgbg; |
background: $pgbg; |
font-family: $sans; |
|
font-size: larger; |
font-size: larger; |
font-weight: bold; |
font-weight: bold; |
} |
} |
|
|
td.LC_menubuttons_text { |
td.LC_menubuttons_text { |
width: 90%; |
|
color: $font; |
color: $font; |
font-family: $sans; |
|
} |
|
|
|
td.LC_menubuttons_img { |
|
} |
} |
|
|
.LC_current_location { |
.LC_current_location { |
font-family: $sans; |
|
background: $tabbg; |
background: $tabbg; |
} |
} |
.LC_new_mail { |
|
font-family: $sans; |
|
font-weight: bold; |
|
} |
|
|
|
.LC_rolesmenu_is { |
|
font-family: $sans; |
|
} |
|
|
|
.LC_rolesmenu_selected { |
|
font-family: $sans; |
|
} |
|
|
|
.LC_rolesmenu_future { |
|
font-family: $sans; |
|
} |
|
|
|
|
|
.LC_rolesmenu_will { |
|
font-family: $sans; |
|
} |
|
|
|
.LC_rolesmenu_will_not { |
|
font-family: $sans; |
|
} |
|
|
|
.LC_rolesmenu_expired { |
|
font-family: $sans; |
|
} |
|
|
|
.LC_rolesinfo { |
|
font-family: $sans; |
|
} |
|
|
|
.LC_dropadd_labeltext { |
|
font-family: $sans; |
|
text-align: right; |
|
} |
|
|
|
.LC_preferences_labeltext { |
|
font-family: $sans; |
|
text-align: right; |
|
} |
|
|
|
table.LC_aboutme_port { |
table.LC_data_table { |
border: 0px; |
|
border-collapse: collapse; |
|
border-spacing: 0px; |
|
} |
|
table.LC_data_table, table.LC_mail_list { |
|
border: 1px solid #000000; |
border: 1px solid #000000; |
border-collapse: separate; |
border-collapse: separate; |
border-spacing: 1px; |
border-spacing: 1px; |
|
background: $pgbg; |
} |
} |
|
|
.LC_data_table_dense { |
.LC_data_table_dense { |
font-size: small; |
font-size: small; |
} |
} |
|
|
table.LC_nested_outer { |
table.LC_nested_outer { |
border: 1px solid #000000; |
border: 1px solid #000000; |
border-collapse: separate; |
border-collapse: collapse; |
border-spacing: 0px; |
border-spacing: 0; |
width: 100%; |
width: 100%; |
} |
} |
|
|
|
table.LC_innerpickbox, |
table.LC_nested { |
table.LC_nested { |
border: 0px; |
border: none; |
border-collapse: separate; |
border-collapse: collapse; |
border-spacing: 0px; |
border-spacing: 0; |
width: 100%; |
width: 100%; |
} |
} |
table.LC_data_table tr th, table.LC_calendar tr th, table.LC_mail_list tr th, |
|
table.LC_prior_tries tr th { |
table.LC_data_table tr th, |
|
table.LC_calendar tr th, |
|
table.LC_prior_tries tr th, |
|
table.LC_innerpickbox tr th { |
font-weight: bold; |
font-weight: bold; |
background-color: $data_table_head; |
background-color: $data_table_head; |
font-size: smaller; |
color:$fontmenu; |
|
font-size:90%; |
|
} |
|
|
|
table.LC_innerpickbox tr th, |
|
table.LC_innerpickbox tr td { |
|
vertical-align: top; |
|
} |
|
|
|
table.LC_data_table tr.LC_info_row > td { |
|
background-color: #CCCCCC; |
|
font-weight: bold; |
|
text-align: left; |
} |
} |
table.LC_data_table tr td, |
|
table.LC_aboutme_port tr td { |
table.LC_data_table tr.LC_odd_row > td { |
background-color: $data_table_light; |
background-color: $data_table_light; |
padding: 2px; |
padding: 2px; |
|
vertical-align: top; |
} |
} |
table.LC_data_table tr.LC_even_row td, |
|
table.LC_aboutme_port tr.LC_even_row td { |
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 { |
background-color: $data_table_dark; |
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 { |
table.LC_data_table tr.LC_data_table_highlight td { |
background-color: $data_table_darker; |
background-color: $data_table_darker; |
} |
} |
|
|
|
table.LC_data_table tr td.LC_leftcol_header { |
|
background-color: $data_table_head; |
|
font-weight: bold; |
|
} |
|
|
table.LC_data_table tr.LC_empty_row td, |
table.LC_data_table tr.LC_empty_row td, |
table.LC_nested tr.LC_empty_row td { |
table.LC_nested tr.LC_empty_row td { |
background-color: #FFFFFF; |
|
font-weight: bold; |
font-weight: bold; |
font-style: italic; |
font-style: italic; |
text-align: center; |
text-align: center; |
padding: 8px; |
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 { |
table.LC_nested tr.LC_empty_row td { |
padding: 4ex |
padding: 4ex |
} |
} |
|
|
table.LC_nested_outer tr th { |
table.LC_nested_outer tr th { |
font-weight: bold; |
font-weight: bold; |
|
color:$fontmenu; |
background-color: $data_table_head; |
background-color: $data_table_head; |
font-size: smaller; |
font-size: small; |
border-bottom: 1px solid #000000; |
border-bottom: 1px solid #000000; |
} |
} |
|
|
table.LC_nested_outer tr td.LC_subheader { |
table.LC_nested_outer tr td.LC_subheader { |
background-color: $data_table_head; |
background-color: $data_table_head; |
font-weight: bold; |
font-weight: bold; |
Line 4356 table.LC_nested_outer tr td.LC_subheader
|
Line 5405 table.LC_nested_outer tr td.LC_subheader
|
border-bottom: 1px solid #000000; |
border-bottom: 1px solid #000000; |
text-align: right; |
text-align: right; |
} |
} |
|
|
table.LC_nested tr.LC_info_row td { |
table.LC_nested tr.LC_info_row td { |
background-color: #CCC; |
background-color: #CCCCCC; |
font-weight: bold; |
font-weight: bold; |
font-size: small; |
font-size: small; |
text-align: center; |
text-align: center; |
} |
} |
table.LC_nested tr.LC_info_row td.LC_left_item { |
|
|
table.LC_nested tr.LC_info_row td.LC_left_item, |
|
table.LC_nested_outer tr th.LC_left_item { |
text-align: left; |
text-align: left; |
} |
} |
|
|
table.LC_nested td { |
table.LC_nested td { |
background-color: #FFF; |
background-color: #FFFFFF; |
font-size: small; |
font-size: small; |
} |
} |
|
|
table.LC_nested_outer tr th.LC_right_item, |
table.LC_nested_outer tr th.LC_right_item, |
table.LC_nested tr.LC_info_row td.LC_right_item, |
table.LC_nested tr.LC_info_row td.LC_right_item, |
table.LC_nested tr.LC_odd_row td.LC_right_item, |
table.LC_nested tr.LC_odd_row td.LC_right_item, |
Line 4377 table.LC_nested tr td.LC_right_item {
|
Line 5431 table.LC_nested tr td.LC_right_item {
|
} |
} |
|
|
table.LC_nested tr.LC_odd_row td { |
table.LC_nested tr.LC_odd_row td { |
background-color: #EEE; |
background-color: #EEEEEE; |
} |
} |
|
|
table.LC_createuser { |
table.LC_createuser { |
} |
} |
|
|
table.LC_createuser tr.LC_section_row td { |
table.LC_createuser tr.LC_section_row td { |
font-size: smaller; |
font-size: small; |
} |
} |
|
|
table.LC_createuser tr.LC_info_row td { |
table.LC_createuser tr.LC_info_row td { |
background-color: #CCC; |
background-color: #CCCCCC; |
font-weight: bold; |
font-weight: bold; |
text-align: center; |
text-align: center; |
} |
} |
Line 4396 table.LC_createuser tr.LC_info_row td {
|
Line 5450 table.LC_createuser tr.LC_info_row td {
|
table.LC_calendar { |
table.LC_calendar { |
border: 1px solid #000000; |
border: 1px solid #000000; |
border-collapse: collapse; |
border-collapse: collapse; |
|
width: 98%; |
} |
} |
|
|
table.LC_calendar_pickdate { |
table.LC_calendar_pickdate { |
font-size: xx-small; |
font-size: xx-small; |
} |
} |
|
|
table.LC_calendar tr td { |
table.LC_calendar tr td { |
border: 1px solid #000000; |
border: 1px solid #000000; |
vertical-align: top; |
vertical-align: top; |
|
width: 14%; |
} |
} |
|
|
table.LC_calendar tr td.LC_calendar_day_empty { |
table.LC_calendar tr td.LC_calendar_day_empty { |
background-color: $data_table_dark; |
background-color: $data_table_dark; |
} |
} |
|
|
table.LC_calendar tr td.LC_calendar_day_current { |
table.LC_calendar tr td.LC_calendar_day_current { |
background-color: $data_table_highlight; |
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; |
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; |
background-color: $mail_new_hover; |
} |
} |
table.LC_mail_list tr.LC_mail_read { |
|
|
table.LC_data_table tr td.LC_mail_read { |
background-color: $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; |
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; |
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; |
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; |
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; |
background-color: $mail_other_hover; |
} |
} |
table.LC_mail_list tr.LC_mail_even { |
*/ |
} |
|
table.LC_mail_list tr.LC_mail_odd { |
|
} |
|
|
|
|
table.LC_data_table tr > td.LC_browser_file, |
table#LC_portfolio_actions { |
table.LC_data_table tr > td.LC_browser_file_published { |
width: auto; |
background: #AAEE77; |
background: $pgbg; |
|
border: 0px; |
|
border-spacing: 2px 2px; |
|
padding: 0px; |
|
margin: 0px; |
|
border-collapse: separate; |
|
} |
|
table#LC_portfolio_actions td.LC_label { |
|
background: $tabbg; |
|
text-align: right; |
|
} |
|
table#LC_portfolio_actions td.LC_value { |
|
background: $tabbg; |
|
} |
} |
|
|
table#LC_cstr_controls { |
table.LC_data_table tr > td.LC_browser_file_locked, |
width: 100%; |
table.LC_data_table tr > td.LC_browser_file_unpublished { |
border-collapse: collapse; |
background: #FFAA99; |
} |
|
table#LC_cstr_controls tr td { |
|
border: 4px solid $pgbg; |
|
padding: 4px; |
|
text-align: center; |
|
background: $tabbg; |
|
} |
} |
table#LC_cstr_controls tr th { |
|
border: 4px solid $pgbg; |
table.LC_data_table tr > td.LC_browser_file_obsolete { |
background: $table_header; |
background: #888888; |
text-align: center; |
|
font-family: $sans; |
|
font-size: smaller; |
|
} |
} |
|
|
table#LC_browser { |
table.LC_data_table tr > td.LC_browser_file_modified, |
|
table.LC_data_table tr > td.LC_browser_file_metamodified { |
|
background: #F8F866; |
} |
} |
table#LC_browser tr th { |
|
background: $table_header; |
table.LC_data_table tr.LC_browser_folder > td { |
|
background: #E0E8FF; |
} |
} |
table#LC_browser tr td { |
|
padding: 2px; |
table.LC_data_table tr > td.LC_roles_is { |
|
/* background: #77FF77; */ |
} |
} |
table#LC_browser tr.LC_browser_file, |
|
table#LC_browser tr.LC_browser_file_published { |
table.LC_data_table tr > td.LC_roles_future { |
background: #CCFF88; |
border-right: 8px solid #FFFF77; |
} |
} |
table#LC_browser tr.LC_browser_file_locked, |
|
table#LC_browser tr.LC_browser_file_unpublished { |
table.LC_data_table tr > td.LC_roles_will { |
background: #FFAA99; |
border-right: 8px solid #FFAA77; |
} |
} |
table#LC_browser tr.LC_browser_file_obsolete { |
|
background: #AAAAAA; |
table.LC_data_table tr > td.LC_roles_expired { |
|
border-right: 8px solid #FF7777; |
} |
} |
table#LC_browser tr.LC_browser_file_modified, |
|
table#LC_browser tr.LC_browser_file_metamodified { |
table.LC_data_table tr > td.LC_roles_will_not { |
background: #FFFF77; |
border-right: 8px solid #AAFF77; |
} |
} |
table#LC_browser tr.LC_browser_folder { |
|
background: #CCCCFF; |
table.LC_data_table tr > td.LC_roles_selected { |
|
border-right: 8px solid #11CC55; |
} |
} |
|
|
span.LC_current_location { |
span.LC_current_location { |
font-size: x-large; |
font-size:larger; |
background: $pgbg; |
background: $pgbg; |
} |
} |
|
|
span.LC_parm_menu_item { |
span.LC_parm_menu_item { |
font-size: larger; |
font-size: larger; |
font-family: $sans; |
|
} |
} |
|
|
span.LC_parm_scope_all { |
span.LC_parm_scope_all { |
color: red; |
color: red; |
} |
} |
|
|
span.LC_parm_scope_folder { |
span.LC_parm_scope_folder { |
color: green; |
color: green; |
} |
} |
|
|
span.LC_parm_scope_resource { |
span.LC_parm_scope_resource { |
color: orange; |
color: orange; |
} |
} |
|
|
span.LC_parm_part { |
span.LC_parm_part { |
color: blue; |
color: blue; |
} |
} |
span.LC_parm_folder, span.LC_parm_symb { |
|
|
span.LC_parm_folder, |
|
span.LC_parm_symb { |
font-size: x-small; |
font-size: x-small; |
font-family: $mono; |
font-family: $mono; |
color: #AAAAAA; |
color: #AAAAAA; |
} |
} |
|
|
td.LC_parm_overview_level_menu, td.LC_parm_overview_map_menu, |
ul.LC_parm_parmlist li { |
td.LC_parm_overview_parm_selectors, td.LC_parm_overview_parm_restrictions { |
display: inline-block; |
|
padding: 0.3em 0.8em; |
|
vertical-align: top; |
|
width: 150px; |
|
border-top:1px solid $lg_border_color; |
|
} |
|
|
|
td.LC_parm_overview_level_menu, |
|
td.LC_parm_overview_map_menu, |
|
td.LC_parm_overview_parm_selectors, |
|
td.LC_parm_overview_restrictions { |
border: 1px solid black; |
border: 1px solid black; |
border-collapse: collapse; |
border-collapse: collapse; |
} |
} |
|
|
table.LC_parm_overview_restrictions td { |
table.LC_parm_overview_restrictions td { |
border-width: 1px 4px 1px 4px; |
border-width: 1px 4px 1px 4px; |
border-style: solid; |
border-style: solid; |
border-color: $pgbg; |
border-color: $pgbg; |
text-align: center; |
text-align: center; |
} |
} |
|
|
table.LC_parm_overview_restrictions th { |
table.LC_parm_overview_restrictions th { |
background: $tabbg; |
background: $tabbg; |
border-width: 1px 4px 1px 4px; |
border-width: 1px 4px 1px 4px; |
border-style: solid; |
border-style: solid; |
border-color: $pgbg; |
border-color: $pgbg; |
} |
} |
|
|
table#LC_helpmenu { |
table#LC_helpmenu { |
border: 0px; |
border: none; |
height: 55px; |
height: 55px; |
border-spacing: 0px; |
border-spacing: 0; |
} |
} |
|
|
table#LC_helpmenu fieldset legend { |
table#LC_helpmenu fieldset legend { |
font-size: larger; |
font-size: larger; |
font-weight: bold; |
|
} |
} |
|
|
table#LC_helpmenu_links { |
table#LC_helpmenu_links { |
width: 100%; |
width: 100%; |
border: 1px solid black; |
border: 1px solid black; |
background: $pgbg; |
background: $pgbg; |
padding: 0px; |
padding: 0; |
border-spacing: 1px; |
border-spacing: 1px; |
} |
} |
|
|
table#LC_helpmenu_links tr td { |
table#LC_helpmenu_links tr td { |
padding: 1px; |
padding: 1px; |
background: $tabbg; |
background: $tabbg; |
Line 4571 table#LC_helpmenu_links tr td {
|
Line 5643 table#LC_helpmenu_links tr td {
|
font-weight: bold; |
font-weight: bold; |
} |
} |
|
|
table#LC_helpmenu_links a:link, table#LC_helpmenu_links a:visited, |
table#LC_helpmenu_links a:link, |
|
table#LC_helpmenu_links a:visited, |
table#LC_helpmenu_links a:active { |
table#LC_helpmenu_links a:active { |
text-decoration: none; |
text-decoration: none; |
color: $font; |
color: $font; |
} |
} |
|
|
table#LC_helpmenu_links a:hover { |
table#LC_helpmenu_links a:hover { |
text-decoration: underline; |
text-decoration: underline; |
color: $vlink; |
color: $vlink; |
Line 4585 table#LC_helpmenu_links a:hover {
|
Line 5659 table#LC_helpmenu_links a:hover {
|
border: 1px solid #339933; |
border: 1px solid #339933; |
margin: -1px; |
margin: -1px; |
} |
} |
|
|
.LC_chrt_popup_up { |
.LC_chrt_popup_up { |
border: 1px solid yellow; |
border: 1px solid yellow; |
margin: -1px; |
margin: -1px; |
} |
} |
|
|
.LC_chrt_popup { |
.LC_chrt_popup { |
border: 1px solid #8888FF; |
border: 1px solid #8888FF; |
background: #CCCCFF; |
background: #CCCCFF; |
} |
} |
|
|
table.LC_pick_box { |
table.LC_pick_box { |
border-collapse: separate; |
border-collapse: separate; |
background: white; |
background: white; |
border: 1px solid black; |
border: 1px solid black; |
border-spacing: 1px; |
border-spacing: 1px; |
} |
} |
|
|
table.LC_pick_box td.LC_pick_box_title { |
table.LC_pick_box td.LC_pick_box_title { |
background: $tabbg; |
background: $sidebg; |
font-weight: bold; |
font-weight: bold; |
text-align: right; |
text-align: left; |
|
vertical-align: top; |
width: 184px; |
width: 184px; |
padding: 8px; |
padding: 8px; |
} |
} |
|
|
table.LC_pick_box td.LC_pick_box_value { |
table.LC_pick_box td.LC_pick_box_value { |
text-align: left; |
text-align: left; |
padding: 8px; |
padding: 8px; |
} |
} |
|
|
table.LC_pick_box td.LC_pick_box_select { |
table.LC_pick_box td.LC_pick_box_select { |
text-align: left; |
text-align: left; |
padding: 8px; |
padding: 8px; |
} |
} |
|
|
table.LC_pick_box td.LC_pick_box_separator { |
table.LC_pick_box td.LC_pick_box_separator { |
padding: 0px; |
padding: 0; |
height: 1px; |
height: 1px; |
background: black; |
background: black; |
} |
} |
|
|
table.LC_pick_box td.LC_pick_box_submit { |
table.LC_pick_box td.LC_pick_box_submit { |
text-align: right; |
text-align: right; |
} |
} |
|
|
table.LC_pick_box td.LC_evenrow_value { |
table.LC_pick_box td.LC_evenrow_value { |
text-align: left; |
text-align: left; |
padding: 8px; |
padding: 8px; |
background-color: $data_table_light; |
background-color: $data_table_light; |
} |
} |
|
|
table.LC_pick_box td.LC_oddrow_value { |
table.LC_pick_box td.LC_oddrow_value { |
text-align: left; |
text-align: left; |
padding: 8px; |
padding: 8px; |
background-color: $data_table_light; |
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 { |
span.LC_helpform_receipt_cat { |
font-weight: bold; |
font-weight: bold; |
} |
} |
|
|
table.LC_group_priv_box { |
table.LC_group_priv_box { |
background: white; |
background: white; |
border: 1px solid black; |
border: 1px solid black; |
border-spacing: 1px; |
border-spacing: 1px; |
} |
} |
|
|
table.LC_group_priv_box td.LC_pick_box_title { |
table.LC_group_priv_box td.LC_pick_box_title { |
background: $tabbg; |
background: $tabbg; |
font-weight: bold; |
font-weight: bold; |
text-align: right; |
text-align: right; |
width: 184px; |
width: 184px; |
} |
} |
|
|
table.LC_group_priv_box td.LC_groups_fixed { |
table.LC_group_priv_box td.LC_groups_fixed { |
background: $data_table_light; |
background: $data_table_light; |
text-align: center; |
text-align: center; |
} |
} |
|
|
table.LC_group_priv_box td.LC_groups_optional { |
table.LC_group_priv_box td.LC_groups_optional { |
background: $data_table_dark; |
background: $data_table_dark; |
text-align: center; |
text-align: center; |
} |
} |
|
|
table.LC_group_priv_box td.LC_groups_functionality { |
table.LC_group_priv_box td.LC_groups_functionality { |
background: $data_table_darker; |
background: $data_table_darker; |
text-align: center; |
text-align: center; |
font-weight: bold; |
font-weight: bold; |
} |
} |
|
|
table.LC_group_priv td { |
table.LC_group_priv td { |
text-align: left; |
text-align: left; |
padding: 0px; |
padding: 0; |
} |
} |
|
|
table.LC_notify_front_page { |
|
background: white; |
|
border: 1px solid black; |
|
padding: 8px; |
|
} |
|
table.LC_notify_front_page td { |
|
padding: 8px; |
|
} |
|
.LC_navbuttons { |
.LC_navbuttons { |
margin: 2ex 0ex 2ex 0ex; |
margin: 2ex 0ex 2ex 0ex; |
} |
} |
|
|
.LC_topic_bar { |
.LC_topic_bar { |
font-family: $sans; |
|
font-weight: bold; |
font-weight: bold; |
width: 100%; |
|
background: $tabbg; |
background: $tabbg; |
vertical-align: middle; |
margin: 1em 0em 1em 2em; |
margin: 2ex 0ex 2ex 0ex; |
padding: 3px; |
|
font-size: 1.2em; |
} |
} |
|
|
.LC_topic_bar span { |
.LC_topic_bar span { |
|
left: 0.5em; |
|
position: absolute; |
vertical-align: middle; |
vertical-align: middle; |
|
font-size: 1.2em; |
} |
} |
.LC_topic_bar img { |
|
vertical-align: bottom; |
|
} |
|
table.LC_course_group_status { |
table.LC_course_group_status { |
margin: 20px; |
margin: 20px; |
} |
} |
|
|
table.LC_status_selector td { |
table.LC_status_selector td { |
vertical-align: top; |
vertical-align: top; |
text-align: center; |
text-align: center; |
padding: 4px; |
padding: 4px; |
} |
} |
table.LC_descriptive_input td.LC_description { |
|
vertical-align: top; |
div.LC_feedback_link { |
text-align: right; |
clear: both; |
font-weight: bold; |
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; |
} |
} |
table.LC_feedback_link { |
|
background: $feedback_link_bg; |
div.LC_feedback_link div.LC_comblock a { |
|
color:$font; |
} |
} |
|
|
span.LC_feedback_link { |
span.LC_feedback_link { |
background: $feedback_link_bg; |
/* background: $feedback_link_bg; */ |
font-size: larger; |
font-size: larger; |
|
} |
|
|
|
span.LC_message_link { |
|
/* background: $feedback_link_bg; */ |
|
font-size: larger; |
|
position: absolute; |
|
right: 1em; |
} |
} |
|
|
table.LC_prior_tries { |
table.LC_prior_tries { |
Line 4750 table.LC_prior_tries td {
|
Line 5842 table.LC_prior_tries td {
|
} |
} |
|
|
.LC_answer_correct { |
.LC_answer_correct { |
background: #AAFFAA; |
background: lightgreen; |
color: black; |
color: darkgreen; |
|
padding: 6px; |
} |
} |
|
|
.LC_answer_charged_try { |
.LC_answer_charged_try { |
background: #FFAAAA ! important; |
background: #FFAAAA; |
color: black; |
color: darkred; |
|
padding: 6px; |
} |
} |
.LC_answer_not_charged_try, |
|
|
.LC_answer_not_charged_try, |
.LC_answer_no_grade, |
.LC_answer_no_grade, |
.LC_answer_late { |
.LC_answer_late { |
background: #FFFFAA; |
background: lightyellow; |
color: black; |
color: black; |
|
padding: 6px; |
} |
} |
|
|
.LC_answer_previous { |
.LC_answer_previous { |
background: #AAAAFF; |
background: lightblue; |
color: black; |
color: darkblue; |
|
padding: 6px; |
} |
} |
|
|
.LC_answer_no_message { |
.LC_answer_no_message { |
background: #FFFFFF; |
background: #FFFFFF; |
color: black; |
color: black; |
|
padding: 6px; |
} |
} |
|
|
.LC_answer_unknown { |
.LC_answer_unknown { |
background: orange; |
background: orange; |
color: black; |
color: black; |
|
padding: 6px; |
} |
} |
|
|
|
|
span.LC_prior_numerical, |
span.LC_prior_numerical, |
span.LC_prior_string, |
span.LC_prior_string, |
span.LC_prior_custom, |
span.LC_prior_custom, |
span.LC_prior_reaction, |
span.LC_prior_reaction, |
span.LC_prior_math { |
span.LC_prior_math { |
font-family: monospace; |
font-family: $mono; |
white-space: pre; |
white-space: pre; |
} |
} |
|
|
span.LC_prior_string { |
span.LC_prior_string { |
font-family: monospace; |
font-family: $mono; |
white-space: pre; |
white-space: pre; |
} |
} |
|
|
Line 4795 table.LC_prior_option {
|
Line 5897 table.LC_prior_option {
|
width: 100%; |
width: 100%; |
border-collapse: collapse; |
border-collapse: collapse; |
} |
} |
table.LC_prior_rank, table.LC_prior_match { |
|
|
table.LC_prior_rank, |
|
table.LC_prior_match { |
border-collapse: collapse; |
border-collapse: collapse; |
} |
} |
|
|
table.LC_prior_option tr td, |
table.LC_prior_option tr td, |
table.LC_prior_rank tr td, |
table.LC_prior_rank tr td, |
table.LC_prior_match tr td { |
table.LC_prior_match tr td { |
border: 1px solid #000000; |
border: 1px solid #000000; |
} |
} |
|
|
span.LC_nobreak { |
.LC_nobreak { |
white-space: nowrap; |
white-space: nowrap; |
} |
} |
|
|
Line 4812 span.LC_cusr_emph {
|
Line 5917 span.LC_cusr_emph {
|
font-style: italic; |
font-style: italic; |
} |
} |
|
|
table.LC_docs_documents { |
span.LC_cusr_subheading { |
background: #BBBBBB; |
font-weight: normal; |
border-width: 0px; |
font-size: 85%; |
border-collapse: collapse; |
|
} |
|
|
|
table.LC_docs_documents td.LC_docs_document { |
|
border: 2px solid black; |
|
padding: 4px; |
|
} |
|
|
|
.LC_docs_course_commands div { |
|
float: left; |
|
border: 4px solid #AAAAAA; |
|
padding: 4px; |
|
background: #DDDDCC; |
|
} |
|
|
|
.LC_docs_entry_move { |
|
border: 0px; |
|
border-collapse: collapse; |
|
} |
} |
|
|
.LC_docs_entry_move td { |
div.LC_docs_entry_move { |
border: 2px solid #BBBBBB; |
border: 1px solid #BBBBBB; |
background: #DDDDDD; |
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; |
background: #DDDDDD; |
font-size: x-small; |
font-size: x-small; |
} |
} |
|
|
|
.LC_docs_entry_parameter { |
|
white-space: nowrap; |
|
} |
|
|
.LC_docs_copy { |
.LC_docs_copy { |
color: #000099; |
color: #000099; |
} |
} |
|
|
.LC_docs_cut { |
.LC_docs_cut { |
color: #550044; |
color: #550044; |
} |
} |
|
|
.LC_docs_rename { |
.LC_docs_rename { |
color: #009900; |
color: #009900; |
} |
} |
|
|
.LC_docs_remove { |
.LC_docs_remove { |
color: #990000; |
color: #990000; |
} |
} |
Line 4862 table.LC_docs_documents td.LC_docs_docum
|
Line 5961 table.LC_docs_documents td.LC_docs_docum
|
font-size: x-small; |
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 td, |
table.LC_docs_adddocs th { |
table.LC_docs_adddocs th { |
border: 1px solid #BBBBBB; |
border: 1px solid #BBBBBB; |
Line 4882 table.LC_docs_adddocs th {
|
Line 5971 table.LC_docs_adddocs th {
|
table.LC_sty_begin { |
table.LC_sty_begin { |
background: #BBFFBB; |
background: #BBFFBB; |
} |
} |
|
|
table.LC_sty_end { |
table.LC_sty_end { |
background: #FFBBBB; |
background: #FFBBBB; |
} |
} |
|
|
|
table.LC_double_column { |
|
border-width: 0; |
|
border-collapse: collapse; |
|
width: 100%; |
|
padding: 2px; |
|
} |
|
|
|
table.LC_double_column tr td.LC_left_col { |
|
top: 2px; |
|
left: 2px; |
|
width: 47%; |
|
vertical-align: top; |
|
} |
|
|
|
table.LC_double_column tr td.LC_right_col { |
|
top: 2px; |
|
right: 2px; |
|
width: 47%; |
|
vertical-align: top; |
|
} |
|
|
|
div.LC_left_float { |
|
float: left; |
|
padding-right: 5%; |
|
padding-bottom: 4px; |
|
} |
|
|
|
div.LC_clear_float_header { |
|
padding-bottom: 2px; |
|
} |
|
|
|
div.LC_clear_float_footer { |
|
padding-top: 10px; |
|
clear: both; |
|
} |
|
|
|
div.LC_grade_show_user { |
|
/* border-left: 5px solid $sidebg; */ |
|
border-top: 5px solid #000000; |
|
margin: 50px 0 0 0; |
|
padding: 15px 0 5px 10px; |
|
} |
|
|
|
div.LC_grade_show_user_odd_row { |
|
/* border-left: 5px solid #000000; */ |
|
} |
|
|
|
div.LC_grade_show_user div.LC_Box { |
|
margin-right: 50px; |
|
} |
|
|
|
div.LC_grade_submissions, |
|
div.LC_grade_message_center, |
|
div.LC_grade_info_links { |
|
margin: 5px; |
|
width: 99%; |
|
background: #FFFFFF; |
|
} |
|
|
|
div.LC_grade_submissions_header, |
|
div.LC_grade_message_center_header { |
|
font-weight: bold; |
|
font-size: large; |
|
} |
|
|
|
div.LC_grade_submissions_body, |
|
div.LC_grade_message_center_body { |
|
border: 1px solid black; |
|
width: 99%; |
|
background: #FFFFFF; |
|
} |
|
|
|
table.LC_scantron_action { |
|
width: 100%; |
|
} |
|
|
|
table.LC_scantron_action tr th { |
|
font-weight:bold; |
|
font-style:normal; |
|
} |
|
|
|
.LC_edit_problem_header, |
|
div.LC_edit_problem_footer { |
|
font-weight: normal; |
|
font-size: medium; |
|
margin: 2px; |
|
} |
|
|
|
div.LC_edit_problem_header, |
|
div.LC_edit_problem_header div, |
|
div.LC_edit_problem_footer, |
|
div.LC_edit_problem_footer div, |
|
div.LC_edit_problem_editxml_header, |
|
div.LC_edit_problem_editxml_header div { |
|
margin-top: 5px; |
|
} |
|
|
|
div.LC_edit_problem_header_title { |
|
font-weight: bold; |
|
font-size: larger; |
|
background: $tabbg; |
|
padding: 3px; |
|
} |
|
|
|
table.LC_edit_problem_header_title { |
|
width: 100%; |
|
background: $tabbg; |
|
} |
|
|
|
div.LC_edit_problem_discards { |
|
float: left; |
|
padding-bottom: 5px; |
|
} |
|
|
|
div.LC_edit_problem_saves { |
|
float: right; |
|
padding-bottom: 5px; |
|
} |
|
|
|
img.stift { |
|
border-width: 0; |
|
vertical-align: middle; |
|
} |
|
|
|
table td.LC_mainmenu_col_fieldset { |
|
vertical-align: top; |
|
} |
|
|
|
div.LC_createcourse { |
|
margin: 10px 10px 10px 10px; |
|
} |
|
|
|
.LC_dccid { |
|
margin: 0.2em 0 0 0; |
|
padding: 0; |
|
font-size: 90%; |
|
display:none; |
|
} |
|
|
|
a:hover, |
|
ol.LC_primary_menu a:hover, |
|
ol#LC_MenuBreadcrumbs a:hover, |
|
ol#LC_PathBreadcrumbs a:hover, |
|
ul#LC_secondary_menu a:hover, |
|
.LC_FormSectionClearButton input:hover |
|
ul.LC_TabContent li:hover a { |
|
color:$button_hover; |
|
text-decoration:none; |
|
} |
|
|
|
h1 { |
|
padding: 0; |
|
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: 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: 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; */ |
|
} |
|
|
|
dl, |
|
ul, |
|
div, |
|
fieldset { |
|
margin: 10px 10px 10px 0; |
|
/* overflow: hidden; */ |
|
} |
|
|
|
fieldset > legend { |
|
font-weight: bold; |
|
padding: 0 5px 0 5px; |
|
} |
|
|
|
#LC_nav_bar { |
|
float: left; |
|
background-color: $pgbg_or_bgcolor; |
|
margin: 0 0 2px 0; |
|
} |
|
|
|
#LC_realm { |
|
margin: 0.2em 0 0 0; |
|
padding: 0; |
|
font-weight: bold; |
|
text-align: center; |
|
background-color: $pgbg_or_bgcolor; |
|
} |
|
|
|
#LC_nav_bar em { |
|
font-weight: bold; |
|
font-style: normal; |
|
} |
|
|
|
ol.LC_primary_menu { |
|
float: right; |
|
margin: 0; |
|
background-color: $pgbg_or_bgcolor; |
|
} |
|
|
|
ol#LC_PathBreadcrumbs { |
|
margin: 0; |
|
} |
|
|
|
ol.LC_primary_menu li { |
|
display: inline; |
|
padding: 5px 5px 0 10px; |
|
vertical-align: top; |
|
} |
|
|
|
ol.LC_primary_menu li img { |
|
vertical-align: bottom; |
|
height: 1.1em; |
|
} |
|
|
|
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; |
|
} |
|
|
|
ol.LC_docs_parameters { |
|
margin-left: 0; |
|
padding: 0; |
|
list-style: none; |
|
} |
|
|
|
ol.LC_docs_parameters li { |
|
margin: 0; |
|
padding-right: 20px; |
|
display: inline; |
|
} |
|
|
|
ol.LC_docs_parameters li:before { |
|
content: "\\002022 \\0020"; |
|
} |
|
|
|
li.LC_docs_parameters_title { |
|
font-weight: bold; |
|
} |
|
|
|
ol.LC_docs_parameters li.LC_docs_parameters_title:before { |
|
content: ""; |
|
} |
|
|
|
ul#LC_secondary_menu { |
|
clear: both; |
|
color: $fontmenu; |
|
background: $tabbg; |
|
list-style: none; |
|
padding: 0; |
|
margin: 0; |
|
width: 100%; |
|
text-align: left; |
|
} |
|
|
|
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: -1px -10px 0 -10px; |
|
padding: 0; |
|
} |
|
|
|
ul.LC_TabContent li, |
|
ul.LC_TabContentBigger li { |
|
float:left; |
|
} |
|
|
|
ul#LC_secondary_menu li a { |
|
color: $fontmenu; |
|
text-decoration: none; |
|
} |
|
|
|
ul.LC_TabContent { |
|
min-height:20px; |
|
} |
|
|
|
ul.LC_TabContent li { |
|
vertical-align:middle; |
|
padding: 0 16px 0 10px; |
|
background-color:$tabbg; |
|
border-bottom:solid 1px $lg_border_color; |
|
border-left: solid 1px $font; |
|
} |
|
|
|
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; |
|
min-height:20px; |
|
} |
|
|
|
ul.LC_TabContent li a:hover, |
|
ul.LC_TabContent li a:focus { |
|
color: $button_hover; |
|
background:none; |
|
outline:none; |
|
} |
|
|
|
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_TabContent li.active a { |
|
color:$font; |
|
background:#FFFFFF; |
|
outline: none; |
|
} |
|
#maincoursedoc { |
|
clear:both; |
|
} |
|
|
|
ul.LC_TabContentBigger { |
|
display:block; |
|
list-style:none; |
|
padding: 0; |
|
} |
|
|
|
ul.LC_TabContentBigger li { |
|
vertical-align:bottom; |
|
height: 30px; |
|
font-size:110%; |
|
font-weight:bold; |
|
color: #737373; |
|
} |
|
|
|
ul.LC_TabContentBigger li.active { |
|
position: relative; |
|
top: 1px; |
|
} |
|
|
|
ul.LC_TabContentBigger li a { |
|
background:url('/adm/lonIcons/tabbgleft.gif') left bottom no-repeat; |
|
height: 30px; |
|
line-height: 30px; |
|
text-align: center; |
|
display: block; |
|
text-decoration: none; |
|
outline: none; |
|
} |
|
|
|
ul.LC_TabContentBigger li.active a { |
|
background:url('/adm/lonIcons/tabbgleft.gif') left top no-repeat; |
|
color:$font; |
|
} |
|
|
|
ul.LC_TabContentBigger li b { |
|
background: url('/adm/lonIcons/tabbgright.gif') no-repeat right bottom; |
|
display: block; |
|
float: left; |
|
padding: 0 30px; |
|
border-bottom: 1px solid $lg_border_color; |
|
} |
|
|
|
ul.LC_TabContentBigger li:hover b { |
|
color:$button_hover; |
|
} |
|
|
|
ul.LC_TabContentBigger li.active b { |
|
background:url('/adm/lonIcons/tabbgright.gif') right top no-repeat; |
|
color:$font; |
|
border: 0; |
|
} |
|
|
|
|
|
ul.LC_CourseBreadcrumbs { |
|
background: $sidebg; |
|
height: 2em; |
|
padding-left: 10px; |
|
margin: 0; |
|
list-style-position: inside; |
|
} |
|
|
|
ol#LC_MenuBreadcrumbs, |
|
ol#LC_PathBreadcrumbs { |
|
padding-left: 10px; |
|
margin: 0; |
|
height: 2.5em; /* equal to #LC_breadcrumbs line-height */ |
|
} |
|
|
|
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%; |
|
} |
|
|
|
ol#LC_MenuBreadcrumbs h1 { |
|
display: inline; |
|
font-size: 90%; |
|
line-height: 2.5em; |
|
margin: 0; |
|
padding: 0; |
|
} |
|
|
|
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_DocsBox { |
|
border: solid 1px $lg_border_color; |
|
padding: 0 0 10px 10px; |
|
} |
|
|
|
.LC_AboutMe_Image { |
|
float:left; |
|
margin-right:10px; |
|
} |
|
|
|
.LC_Clear_AboutMe_Image { |
|
clear:left; |
|
} |
|
|
|
dl.LC_ListStyleClean dt { |
|
padding-right: 5px; |
|
display: table-header-group; |
|
} |
|
|
|
dl.LC_ListStyleClean dd { |
|
display: table-row; |
|
} |
|
|
|
.LC_ListStyleClean, |
|
.LC_ListStyleSimple, |
|
.LC_ListStyleNormal, |
|
.LC_ListStyleSpecial { |
|
/* display:block; */ |
|
list-style-position: inside; |
|
list-style-type: none; |
|
overflow: hidden; |
|
padding: 0; |
|
} |
|
|
|
.LC_ListStyleSimple li, |
|
.LC_ListStyleSimple dd, |
|
.LC_ListStyleNormal li, |
|
.LC_ListStyleNormal dd, |
|
.LC_ListStyleSpecial li, |
|
.LC_ListStyleSpecial dd { |
|
margin: 0; |
|
padding: 5px 5px 5px 10px; |
|
clear: both; |
|
} |
|
|
|
.LC_ListStyleClean li, |
|
.LC_ListStyleClean dd { |
|
padding-top: 0; |
|
padding-bottom: 0; |
|
} |
|
|
|
.LC_ListStyleSimple dd, |
|
.LC_ListStyleSimple li { |
|
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; |
|
} |
|
|
|
table.LC_SimpleTable { |
|
margin:5px; |
|
border:solid 1px $lg_border_color; |
|
} |
|
|
|
table.LC_SimpleTable tr { |
|
padding: 0; |
|
border:solid 1px $lg_border_color; |
|
} |
|
|
|
table.LC_SimpleTable thead { |
|
background:rgb(220,220,220); |
|
} |
|
|
|
div.LC_columnSection { |
|
display: block; |
|
clear: both; |
|
overflow: hidden; |
|
margin: 0; |
|
} |
|
|
|
div.LC_columnSection>* { |
|
float: left; |
|
margin: 10px 20px 10px 0; |
|
overflow:hidden; |
|
} |
|
|
|
table em { |
|
font-weight: bold; |
|
font-style: normal; |
|
} |
|
|
|
table.LC_tableBrowseRes, |
|
table.LC_tableOfContent { |
|
border:none; |
|
border-spacing: 1px; |
|
padding: 3px; |
|
background-color: #FFFFFF; |
|
font-size: 90%; |
|
} |
|
|
|
table.LC_tableOfContent { |
|
border-collapse: collapse; |
|
} |
|
|
|
table.LC_tableBrowseRes a, |
|
table.LC_tableOfContent a { |
|
background-color: transparent; |
|
text-decoration: none; |
|
} |
|
|
|
table.LC_tableOfContent img { |
|
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_everything { |
|
background-image:url(/res/adm/pages/show-all.gif); |
|
} |
|
|
|
a#LC_content_toolbar_uncompleted { |
|
background-image:url(/res/adm/pages/show-incomplete-problems.gif); |
|
} |
|
|
|
#LC_content_toolbar_clearbubbles { |
|
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 ; |
|
} |
|
|
|
a#LC_content_toolbar_changefolder_toggled { |
|
background-image:url(/res/adm/pages/open-all-folders.gif); |
|
} |
|
|
|
ul#LC_toolbar li a:hover { |
|
background-position: bottom center; |
|
} |
|
|
|
ul#LC_toolbar { |
|
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; |
|
} |
|
|
|
|
|
a.LC_toolbarItem { |
|
display:block; |
|
padding: 0; |
|
margin: 0; |
|
height: 32px; |
|
width: 32px; |
|
color:white; |
|
border: none; |
|
background-repeat:no-repeat; |
|
background-color:transparent; |
|
} |
|
|
|
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; |
|
margin: 0 0 0 25px; |
|
line-height: 150%; |
|
} |
|
|
|
.LC_hidden { |
|
display: none; |
|
} |
|
|
END |
END |
} |
} |
|
|
Line 4937 sub headtag {
|
Line 6717 sub headtag {
|
if (!$args->{'frameset'}) { |
if (!$args->{'frameset'}) { |
$result .= &Apache::lonhtmlcommon::htmlareaheaders(); |
$result .= &Apache::lonhtmlcommon::htmlareaheaders(); |
} |
} |
if ($args->{'force_register'}) { |
if ($args->{'force_register'} && $env{'request.noversionuri'} !~ m{^/res/adm/pages/}) { |
$result .= &Apache::lonmenu::registerurl(1); |
$result .= Apache::lonxml::display_title(); |
} |
} |
if (!$args->{'no_nav_bar'} |
if (!$args->{'no_nav_bar'} |
&& !$args->{'only_body'} |
&& !$args->{'only_body'} |
Line 4964 ADDMETA
|
Line 6744 ADDMETA
|
$result .= '<title> LON-CAPA '.$title.'</title>' |
$result .= '<title> LON-CAPA '.$title.'</title>' |
.'<link rel="stylesheet" type="text/css" href="'.$url.'" />' |
.'<link rel="stylesheet" type="text/css" href="'.$url.'" />' |
.$head_extra; |
.$head_extra; |
return $result; |
return $result.'</head>'; |
} |
} |
|
|
=pod |
=pod |
Line 4979 Inputs: none
|
Line 6759 Inputs: none
|
|
|
sub font_settings { |
sub font_settings { |
my $headerstring=''; |
my $headerstring=''; |
if (($env{'browser.os'} eq 'mac') && (!$env{'browser.mathml'})) { |
if (!$env{'browser.mathml'} && $env{'browser.unicode'}) { |
$headerstring.= |
|
'<meta Content-Type="text/html; charset=x-mac-roman" />'; |
|
} elsif (!$env{'browser.mathml'} && $env{'browser.unicode'}) { |
|
$headerstring.= |
$headerstring.= |
'<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />'; |
'<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />'; |
} |
} |
Line 5002 Inputs: none
|
Line 6779 Inputs: none
|
sub xml_begin { |
sub xml_begin { |
my $output=''; |
my $output=''; |
|
|
&Apache::lonhtmlcommon::init_htmlareafields(); |
|
|
|
if ($env{'browser.mathml'}) { |
if ($env{'browser.mathml'}) { |
$output='<?xml version="1.0"?>' |
$output='<?xml version="1.0"?>' |
#.'<?xml-stylesheet type="text/css" href="/adm/MathML/mathml.css"?>'."\n" |
#.'<?xml-stylesheet type="text/css" href="/adm/MathML/mathml.css"?>'."\n" |
Line 5014 sub xml_begin {
|
Line 6789 sub xml_begin {
|
.'<html xmlns:math="http://www.w3.org/1998/Math/MathML" ' |
.'<html xmlns:math="http://www.w3.org/1998/Math/MathML" ' |
.'xmlns="http://www.w3.org/1999/xhtml">'; |
.'xmlns="http://www.w3.org/1999/xhtml">'; |
} else { |
} else { |
$output='<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html>'; |
$output='<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">' |
|
.'<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">'; |
} |
} |
return $output; |
return $output; |
} |
} |
|
|
=pod |
=pod |
|
|
=item * &endheadtag() |
=item * &start_page() |
|
|
Returns a uniform </head> for LON-CAPA web pages. |
|
|
|
Inputs: none |
|
|
|
=cut |
|
|
|
sub endheadtag { |
|
return '</head>'; |
|
} |
|
|
|
=pod |
|
|
|
=item * &head() |
|
|
|
Returns a uniform complete <head>..</head> section for LON-CAPA web pages. |
Returns a complete <html> .. <body> section for LON-CAPA web pages. |
|
|
Inputs: $title - optional title for the page |
Inputs: |
$head_extra - optional extra HTML to put inside the <head> |
|
|
|
=cut |
=over 4 |
|
|
sub head { |
$title - optional title for the page |
my ($title,$head_extra,$args) = @_; |
|
return &headtag($title,$head_extra,$args).&endheadtag(); |
|
} |
|
|
|
=pod |
$head_extra - optional extra HTML to incude inside the <head> |
|
|
=item * &start_page() |
$args - additional optional args supported are: |
|
|
Returns a complete <html> .. <body> section for LON-CAPA web pages. |
=over 8 |
|
|
Inputs: $title - optional title for the page |
only_body -> is true will set &bodytag() onlybodytag |
$head_extra - optional extra HTML to incude inside the <head> |
|
$args - additional optional args supported are: |
|
only_body -> is true will set &bodytag() onlybodytag |
|
arg on |
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 <body> |
add_entries -> additional attributes to add to the <body> |
domain -> force to color decorate a page for a |
domain -> force to color decorate a page for a |
specific domain |
specific domain |
function -> force usage of a specific rolish color |
function -> force usage of a specific rolish color |
scheme |
scheme |
redirect -> see &headtag() |
redirect -> see &headtag() |
bgcolor -> override the default page bg color |
bgcolor -> override the default page bg color |
js_ready -> return a string ready for being used in |
js_ready -> return a string ready for being used in |
a javascript writeln |
a javascript writeln |
html_encode -> return a string ready for being used in |
html_encode -> return a string ready for being used in |
a html attribute |
a html attribute |
force_register -> if is true will turn on the &bodytag() |
force_register -> if is true will turn on the &bodytag() |
$forcereg arg |
$forcereg arg |
body_title -> alternate text to use instead of $title |
frameset -> if true will start with a <frameset> |
in the title box that appears, this text |
|
is not auto translated like the $title is |
|
frameset -> if true will start with a <frameset> |
|
rather than <body> |
rather than <body> |
no_title -> if true the title bar won't be shown |
skip_phases -> hash ref of |
skip_phases -> hash ref of |
|
head -> skip the <html><head> generation |
head -> skip the <html><head> generation |
body -> skip all <body> generation |
body -> skip all <body> generation |
|
no_auto_mt_title -> prevent &mt()ing the title arg |
no_inline_link -> if true and in remote mode, don't show the |
inherit_jsmath -> when creating popup window in a page, |
'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 |
should it have jsmath forced on by the |
current page |
current page |
|
bread_crumbs -> Array containing breadcrumbs |
|
bread_crumbs_component -> if exists show it as headline else show only the breadcrumbs |
|
|
|
=back |
|
|
|
=back |
|
|
=cut |
=cut |
|
|
sub start_page { |
sub start_page { |
my ($title,$head_extra,$args) = @_; |
my ($title,$head_extra,$args) = @_; |
#&Apache::lonnet::logthis("start_page ".join(':',caller(0))); |
#&Apache::lonnet::logthis("start_page ".join(':',caller(0))); |
|
#SD |
|
#I don't see why we copy certain elements of %$args to %head_args |
|
#head args is passed to headtag() and this routine only reads those |
|
#keys that are needed. There doesn't happen any writes or any processing |
|
#of other keys. |
|
#proposal: just pass $args to headtag instead of \%head_args and delete |
|
#marked lines |
|
#<- MARK |
my %head_args; |
my %head_args; |
foreach my $arg ('redirect','force_register','domain','function', |
foreach my $arg ('redirect','force_register','domain','function', |
'bgcolor','frameset','no_nav_bar','only_body', |
'bgcolor','frameset','no_nav_bar','only_body', |
Line 5106 sub start_page {
|
Line 6866 sub start_page {
|
$head_args{$arg} = $args->{$arg}; |
$head_args{$arg} = $args->{$arg}; |
} |
} |
} |
} |
|
#MARK -> |
|
|
$env{'internal.start_page'}++; |
$env{'internal.start_page'}++; |
my $result; |
my $result; |
|
|
if (! exists($args->{'skip_phases'}{'head'}) ) { |
if (! exists($args->{'skip_phases'}{'head'}) ) { |
$result.= |
$result .= |
&xml_begin(). |
&xml_begin() . &headtag($title,$head_extra,\%head_args); |
&headtag($title,$head_extra,\%head_args).&endheadtag(); |
#replace prev line by |
|
# &xml_begin() . &headtag($title, $head_extra, $args); |
} |
} |
|
|
if (! exists($args->{'skip_phases'}{'body'}) ) { |
if (! exists($args->{'skip_phases'}{'body'}) ) { |
Line 5120 sub start_page {
|
Line 6883 sub start_page {
|
my $attr_string = &make_attr_string($args->{'force_register'}, |
my $attr_string = &make_attr_string($args->{'force_register'}, |
$args->{'add_entries'}); |
$args->{'add_entries'}); |
$result .= "\n<frameset $attr_string>\n"; |
$result .= "\n<frameset $attr_string>\n"; |
} else { |
} else { |
$result .= |
$result .= |
&bodytag($title, |
&bodytag($title, |
$args->{'function'}, $args->{'add_entries'}, |
$args->{'function'}, $args->{'add_entries'}, |
$args->{'only_body'}, $args->{'domain'}, |
$args->{'only_body'}, $args->{'domain'}, |
$args->{'force_register'}, $args->{'body_title'}, |
$args->{'force_register'}, $args->{'no_nav_bar'}, |
$args->{'no_nav_bar'}, $args->{'bgcolor'}, |
$args->{'bgcolor'}, $args); |
$args->{'no_title'}, $args->{'no_inline_link'}, |
} |
$args); |
|
} |
|
} |
} |
|
|
if ($args->{'js_ready'}) { |
if ($args->{'js_ready'}) { |
$result = &js_ready($result); |
$result = &js_ready($result); |
} |
} |
if ($args->{'html_encode'}) { |
if ($args->{'html_encode'}) { |
$result = &html_encode($result); |
$result = &html_encode($result); |
} |
} |
return $result; |
|
} |
|
|
|
|
|
=pod |
|
|
|
=item * &head() |
|
|
|
Returns a complete </body></html> section for LON-CAPA web pages. |
# Preparation for new and consistent functionlist at top of screen |
|
# if ($args->{'functionlist'}) { |
Inputs: $args - additional optional args supported are: |
# $result .= &build_functionlist(); |
js_ready -> return a string ready for being used in |
#} |
a javascript writeln |
|
html_encode -> return a string ready for being used in |
# Don't add anything more if only_body wanted or in const space |
a html attribute |
return $result if $args->{'only_body'} |
frameset -> if true will start with a <frameset> |
|| $env{'request.state'} eq 'construct'; |
rather than <body> |
|
dicsussion -> if true will get discussion from |
#Breadcrumbs |
lonxml::xmlend |
if (exists($args->{'bread_crumbs'}) or exists($args->{'bread_crumbs_component'})) { |
(you can pass the target and parser arguments |
&Apache::lonhtmlcommon::clear_breadcrumbs(); |
through optional 'target' and 'parser' args |
#if any br links exists, add them to the breadcrumbs |
to this routine) |
if (exists($args->{'bread_crumbs'}) and ref($args->{'bread_crumbs'}) eq 'ARRAY') { |
|
foreach my $crumb (@{$args->{'bread_crumbs'}}){ |
|
&Apache::lonhtmlcommon::add_breadcrumb($crumb); |
|
} |
|
} |
|
|
=cut |
#if bread_crumbs_component exists show it as headline else show only the breadcrumbs |
|
if(exists($args->{'bread_crumbs_component'})){ |
|
$result .= &Apache::lonhtmlcommon::breadcrumbs($args->{'bread_crumbs_component'}); |
|
}else{ |
|
$result .= &Apache::lonhtmlcommon::breadcrumbs(); |
|
} |
|
} |
|
return $result; |
|
} |
|
|
sub end_page { |
sub end_page { |
my ($args) = @_; |
my ($args) = @_; |
Line 5179 sub end_page {
|
Line 6945 sub end_page {
|
if ($args->{'frameset'}) { |
if ($args->{'frameset'}) { |
$result .= '</frameset>'; |
$result .= '</frameset>'; |
} else { |
} else { |
$result .= &endbodytag(); |
$result .= &endbodytag($args); |
} |
} |
$result .= "\n</html>"; |
$result .= "\n</html>"; |
|
|
Line 5237 sub validate_page {
|
Line 7003 sub validate_page {
|
} |
} |
} |
} |
|
|
|
|
|
sub start_scrollbox { |
|
my ($outerwidth,$width,$height,$id)=@_; |
|
unless ($outerwidth) { $outerwidth='520px'; } |
|
unless ($width) { $width='500px'; } |
|
unless ($height) { $height='200px'; } |
|
my ($table_id,$div_id); |
|
if ($id ne '') { |
|
$table_id = " id='table_$id'"; |
|
$div_id = " id='div_$id'"; |
|
} |
|
return "<table style='width: $outerwidth; border: 1px solid none;'$table_id><tr><td style='width: $width;' bgcolor='#FFFFFF'><div style='overflow:auto; width:$width; height: $height;'$div_id>"; |
|
} |
|
|
|
sub end_scrollbox { |
|
return '</td></tr></table>'; |
|
} |
|
|
sub simple_error_page { |
sub simple_error_page { |
my ($r,$title,$msg) = @_; |
my ($r,$title,$msg) = @_; |
my $page = |
my $page = |
Line 5251 sub simple_error_page {
|
Line 7035 sub simple_error_page {
|
} |
} |
|
|
{ |
{ |
my $row_count; |
my @row_count; |
|
|
|
sub start_data_table_count { |
|
unshift(@row_count, 0); |
|
return; |
|
} |
|
|
|
sub end_data_table_count { |
|
shift(@row_count); |
|
return; |
|
} |
|
|
sub start_data_table { |
sub start_data_table { |
my ($add_class) = @_; |
my ($add_class,$id) = @_; |
my $css_class = (join(' ','LC_data_table',$add_class)); |
my $css_class = (join(' ','LC_data_table',$add_class)); |
undef($row_count); |
my $table_id; |
return '<table class="'.$css_class.'">'."\n"; |
if (defined($id)) { |
|
$table_id = ' id="'.$id.'"'; |
|
} |
|
&start_data_table_count(); |
|
return '<table class="'.$css_class.'"'.$table_id.'>'."\n"; |
} |
} |
|
|
sub end_data_table { |
sub end_data_table { |
undef($row_count); |
&end_data_table_count(); |
return '</table>'."\n";; |
return '</table>'."\n";; |
} |
} |
|
|
sub start_data_table_row { |
sub start_data_table_row { |
my ($add_class) = @_; |
my ($add_class, $id) = @_; |
$row_count++; |
$row_count[0]++; |
my $css_class = ($row_count % 2)?'':'LC_even_row'; |
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 '<tr class="'.$css_class.'">'."\n";; |
$id = (' id="'.$id.'"') unless ($id eq ''); |
|
return '<tr class="'.$css_class.'"'.$id.'>'."\n"; |
} |
} |
|
|
sub continue_data_table_row { |
sub continue_data_table_row { |
my ($add_class) = @_; |
my ($add_class, $id) = @_; |
my $css_class = ($row_count % 2)?'':'LC_even_row'; |
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 '<tr class="'.$css_class.'">'."\n";; |
$id = (' id="'.$id.'"') unless ($id eq ''); |
|
return '<tr class="'.$css_class.'"'.$id.'>'."\n"; |
} |
} |
|
|
sub end_data_table_row { |
sub end_data_table_row { |
Line 5284 sub simple_error_page {
|
Line 7085 sub simple_error_page {
|
} |
} |
|
|
sub start_data_table_empty_row { |
sub start_data_table_empty_row { |
$row_count++; |
# $row_count[0]++; |
return '<tr class="LC_empty_row" >'."\n";; |
return '<tr class="LC_empty_row" >'."\n";; |
} |
} |
|
|
Line 5299 sub simple_error_page {
|
Line 7100 sub simple_error_page {
|
sub end_data_table_header_row { |
sub end_data_table_header_row { |
return '</tr>'."\n";; |
return '</tr>'."\n";; |
} |
} |
|
|
|
sub data_table_caption { |
|
my $caption = shift; |
|
return "<caption class=\"LC_caption\">$caption</caption>"; |
|
} |
} |
} |
|
|
=pod |
=pod |
Line 5365 Returns either 'student','coordinator','
|
Line 7171 Returns either 'student','coordinator','
|
|
|
############################################### |
############################################### |
sub get_users_function { |
sub get_users_function { |
my $function = 'student'; |
my $function = 'norole'; |
if ($env{'request.role'}=~/^(cc|in|ta|ep)/) { |
if ($env{'request.role'}=~/^(st)/) { |
|
$function='student'; |
|
} |
|
if ($env{'request.role'}=~/^(cc|co|in|ta|ep)/) { |
$function='coordinator'; |
$function='coordinator'; |
} |
} |
if ($env{'request.role'}=~/^(su|dc|ad|li)/) { |
if ($env{'request.role'}=~/^(su|dc|ad|li)/) { |
$function='admin'; |
$function='admin'; |
} |
} |
if (($env{'request.role'}=~/^(au|ca)/) || |
if (($env{'request.role'}=~/^(au|ca|aa)/) || |
($ENV{'REQUEST_URI'}=~/^(\/priv|\~)/)) { |
($ENV{'REQUEST_URI'}=~ m{/^(/priv)})) { |
$function='author'; |
$function='author'; |
} |
} |
return $function; |
return $function; |
Line 5383 sub get_users_function {
|
Line 7192 sub get_users_function {
|
|
|
=pod |
=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() |
=item * &check_user_status() |
|
|
Determines current status of supplied role for a |
Determines current status of supplied role for a |
Line 5399 role status: active, previous or future.
|
Line 7240 role status: active, previous or future.
|
|
|
sub check_user_status { |
sub check_user_status { |
my ($udom,$uname,$cdom,$crs,$role,$sec) = @_; |
my ($udom,$uname,$cdom,$crs,$role,$sec) = @_; |
my %userinfo = &Apache::lonnet::dump('roles',$udom,$uname); |
my $extra = &Apache::lonnet::freeze_escape({'skipcheck' => 1}); |
|
my %userinfo = &Apache::lonnet::dump('roles',$udom,$uname,'.',undef,$extra); |
my @uroles = keys %userinfo; |
my @uroles = keys %userinfo; |
my $srchstr; |
my $srchstr; |
my $active_chk = 'none'; |
my $active_chk = 'none'; |
my $now = time; |
my $now = time; |
if (@uroles > 0) { |
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; |
$srchstr = '/'.$cdom.'/'.$crs.'_'.$role; |
} else { |
} else { |
$srchstr = '/'.$cdom.'/'.$crs.'/'.$sec.'_'.$role; |
$srchstr = '/'.$cdom.'/'.$crs.'/'.$sec.'_'.$role; |
Line 5556 previous, future, or all.
|
Line 7398 previous, future, or all.
|
5. reference to array of section restrictions (optional) |
5. reference to array of section restrictions (optional) |
6. reference to results object (hash of hashes). |
6. reference to results object (hash of hashes). |
7. reference to optional userdata hash |
7. reference to optional userdata hash |
Keys of top level hash are roles. |
8. reference to optional statushash |
|
9. flag if privileged users (except those set to unhide in |
|
course settings) should be excluded |
|
Keys of top level results hash are roles. |
Keys of inner hashes are username:domain, with |
Keys of inner hashes are username:domain, with |
values set to access type. |
values set to access type. |
Optional userdata hash returns an array with arguments in the |
Optional userdata hash returns an array with arguments in the |
same order as loncoursedata::get_classlist() for student data. |
same order as loncoursedata::get_classlist() for student data. |
|
|
|
Optional statushash returns |
|
|
Entries for end, start, section and status are blank because |
Entries for end, start, section and status are blank because |
of the possibility of multiple values for non-student roles. |
of the possibility of multiple values for non-student roles. |
|
|
Line 5570 of the possibility of multiple values fo
|
Line 7417 of the possibility of multiple values fo
|
############################################### |
############################################### |
|
|
sub get_course_users { |
sub get_course_users { |
my ($cdom,$cnum,$types,$roles,$sections,$users,$userdata) = @_; |
my ($cdom,$cnum,$types,$roles,$sections,$users,$userdata,$statushash,$hidepriv) = @_; |
my %idx = (); |
my %idx = (); |
my %seclists; |
my %seclists; |
|
|
Line 5590 sub get_course_users {
|
Line 7437 sub get_course_users {
|
my $match = 0; |
my $match = 0; |
my $secmatch = 0; |
my $secmatch = 0; |
my $section = $$classlist{$student}[$idx{section}]; |
my $section = $$classlist{$student}[$idx{section}]; |
|
my $status = $$classlist{$student}[$idx{status}]; |
if ($section eq '') { |
if ($section eq '') { |
$section = 'none'; |
$section = 'none'; |
} |
} |
Line 5609 sub get_course_users {
|
Line 7457 sub get_course_users {
|
next; |
next; |
} |
} |
} |
} |
push(@{$seclists{$student}},$section); |
|
if (defined($$types{'active'})) { |
if (defined($$types{'active'})) { |
if ($$classlist{$student}[$idx{status}] eq 'Active') { |
if ($$classlist{$student}[$idx{status}] eq 'Active') { |
push(@{$$users{st}{$student}},'active'); |
push(@{$$users{st}{$student}},'active'); |
Line 5617 sub get_course_users {
|
Line 7464 sub get_course_users {
|
} |
} |
} |
} |
if (defined($$types{'previous'})) { |
if (defined($$types{'previous'})) { |
if ($$classlist{$student}[$idx{end}] <= $now) { |
if ($$classlist{$student}[$idx{status}] eq 'Expired') { |
push(@{$$users{st}{$student}},'previous'); |
push(@{$$users{st}{$student}},'previous'); |
$match = 1; |
$match = 1; |
} |
} |
} |
} |
if (defined($$types{'future'})) { |
if (defined($$types{'future'})) { |
if (($$classlist{$student}[$idx{start}] > $now) && ($$classlist{$student}[$idx{end}] > $now) || ($$classlist{$student}[$idx{end}] == 0) || ($$classlist{$student}[$idx{end}] eq '')) { |
if ($$classlist{$student}[$idx{status}] eq 'Future') { |
push(@{$$users{st}{$student}},'future'); |
push(@{$$users{st}{$student}},'future'); |
$match = 1; |
$match = 1; |
} |
} |
} |
} |
if ($match && ref($userdata) eq 'HASH') { |
if ($match) { |
$$userdata{$student} = $$classlist{$student}; |
push(@{$seclists{$student}},$section); |
|
if (ref($userdata) eq 'HASH') { |
|
$$userdata{$student} = $$classlist{$student}; |
|
} |
|
if (ref($statushash) eq 'HASH') { |
|
$statushash->{$student}{'st'}{$section} = $status; |
|
} |
} |
} |
} |
} |
} |
} |
if ((@{$roles} > 1) || ((@{$roles} == 1) && ($$roles[0] ne "st"))) { |
if ((@{$roles} > 1) || ((@{$roles} == 1) && ($$roles[0] ne "st"))) { |
my %coursepersonnel = &Apache::lonnet::dump('nohist_userroles',$cdom,$cnum); |
my %coursepersonnel = &Apache::lonnet::dump('nohist_userroles',$cdom,$cnum); |
my $now = time; |
my $now = time; |
|
my %displaystatus = ( previous => 'Expired', |
|
active => 'Active', |
|
future => 'Future', |
|
); |
|
my %nothide; |
|
if ($hidepriv) { |
|
my %coursehash=&Apache::lonnet::coursedescription($cdom.'_'.$cnum); |
|
foreach my $user (split(/\s*\,\s*/,$coursehash{'nothideprivileged'})) { |
|
if ($user !~ /:/) { |
|
$nothide{join(':',split(/[\@]/,$user))}=1; |
|
} else { |
|
$nothide{$user} = 1; |
|
} |
|
} |
|
} |
foreach my $person (sort(keys(%coursepersonnel))) { |
foreach my $person (sort(keys(%coursepersonnel))) { |
my $match = 0; |
my $match = 0; |
my $secmatch = 0; |
my $secmatch = 0; |
Line 5669 sub get_course_users {
|
Line 7537 sub get_course_users {
|
$usec = 'none'; |
$usec = 'none'; |
} |
} |
if ($uname ne '' && $udom ne '') { |
if ($uname ne '' && $udom ne '') { |
|
if ($hidepriv) { |
|
if ((&Apache::lonnet::privileged($uname,$udom)) && |
|
(!$nothide{$uname.':'.$udom})) { |
|
next; |
|
} |
|
} |
if ($end > 0 && $end < $now) { |
if ($end > 0 && $end < $now) { |
$status = 'previous'; |
$status = 'previous'; |
} elsif ($start > $now) { |
} elsif ($start > $now) { |
Line 5691 sub get_course_users {
|
Line 7565 sub get_course_users {
|
if (!grep(/^\Q$usec\E$/,@{$seclists{$uname.':'.$udom}})) { |
if (!grep(/^\Q$usec\E$/,@{$seclists{$uname.':'.$udom}})) { |
push(@{$seclists{$uname.':'.$udom}},$usec); |
push(@{$seclists{$uname.':'.$udom}},$usec); |
} |
} |
|
if (ref($statushash) eq 'HASH') { |
|
$statushash->{$uname.':'.$udom}{$role}{$usec} = $displaystatus{$status}; |
|
} |
} |
} |
} |
} |
} |
} |
Line 5700 sub get_course_users {
|
Line 7577 sub get_course_users {
|
my %csettings = &Apache::lonnet::get('environment',['internal.courseowner'],$cdom,$cnum); |
my %csettings = &Apache::lonnet::get('environment',['internal.courseowner'],$cdom,$cnum); |
if ( defined($csettings{'internal.courseowner'}) ) { |
if ( defined($csettings{'internal.courseowner'}) ) { |
my $owner = $csettings{'internal.courseowner'}; |
my $owner = $csettings{'internal.courseowner'}; |
if ($owner !~ /^[^:]+:[^:]+$/) { |
next if ($owner eq ''); |
$owner = $owner.':'.$cdom; |
my ($ownername,$ownerdom); |
|
if ($owner =~ /^([^:]+):([^:]+)$/) { |
|
$ownername = $1; |
|
$ownerdom = $2; |
|
} else { |
|
$ownername = $owner; |
|
$ownerdom = $cdom; |
|
$owner = $ownername.':'.$ownerdom; |
} |
} |
@{$$users{'ow'}{$owner}} = 'any'; |
@{$$users{'ow'}{$owner}} = 'any'; |
if (defined($userdata) && |
if (defined($userdata) && |
!exists($$userdata{$owner.':'.$cdom})) { |
!exists($$userdata{$owner})) { |
&get_user_info($cdom,$owner,\%idx,$userdata); |
&get_user_info($ownerdom,$ownername,\%idx,$userdata); |
if (!grep(/^none$/,@{$seclists{$owner.':'.$cdom}})) { |
if (!grep(/^none$/,@{$seclists{$owner}})) { |
push(@{$seclists{$owner.':'.$cdom}},'none'); |
push(@{$seclists{$owner}},'none'); |
|
} |
|
if (ref($statushash) eq 'HASH') { |
|
$statushash->{$owner}{'ow'}{'none'} = 'Any'; |
} |
} |
} |
} |
} |
} |
Line 5728 sub get_user_info {
|
Line 7615 sub get_user_info {
|
&plainname($uname,$udom,'lastname'); |
&plainname($uname,$udom,'lastname'); |
$$userdata{$uname.':'.$udom}[$$idx{uname}] = $uname; |
$$userdata{$uname.':'.$udom}[$$idx{uname}] = $uname; |
$$userdata{$uname.':'.$udom}[$$idx{udom}] = $udom; |
$$userdata{$uname.':'.$udom}[$$idx{udom}] = $udom; |
|
my %idhash = &Apache::lonnet::idrget($udom,($uname)); |
|
$$userdata{$uname.':'.$udom}[$$idx{id}] = $idhash{$uname}; |
return; |
return; |
} |
} |
|
|
Line 5839 If the user's status includes multiple t
|
Line 7728 If the user's status includes multiple t
|
the largest default quota which applies to the user determines the |
the largest default quota which applies to the user determines the |
default quota returned. |
default quota returned. |
|
|
|
=back |
|
|
=cut |
=cut |
|
|
############################################### |
############################################### |
Line 5848 sub default_quota {
|
Line 7739 sub default_quota {
|
my ($udom,$inststatus) = @_; |
my ($udom,$inststatus) = @_; |
my ($defquota,$settingstatus); |
my ($defquota,$settingstatus); |
my %quotahash = &Apache::lonnet::get_dom('configuration', |
my %quotahash = &Apache::lonnet::get_dom('configuration', |
['quota'],$udom); |
['quotas'],$udom); |
if (ref($quotahash{'quota'}) eq 'HASH') { |
if (ref($quotahash{'quotas'}) eq 'HASH') { |
if ($inststatus ne '') { |
if ($inststatus ne '') { |
my @statuses = split(/:/,$inststatus); |
my @statuses = map { &unescape($_); } split(/:/,$inststatus); |
foreach my $item (@statuses) { |
foreach my $item (@statuses) { |
if ($quotahash{'quota'}{$item} ne '') { |
if (ref($quotahash{'quotas'}{'defaultquota'}) eq 'HASH') { |
if ($defquota eq '') { |
if ($quotahash{'quotas'}{'defaultquota'}{$item} ne '') { |
$defquota = $quotahash{'quota'}{$item}; |
if ($defquota eq '') { |
$settingstatus = $item; |
$defquota = $quotahash{'quotas'}{'defaultquota'}{$item}; |
} elsif ($quotahash{'quota'}{$item} > $defquota) { |
$settingstatus = $item; |
$defquota = $quotahash{'quota'}{$item}; |
} elsif ($quotahash{'quotas'}{'defaultquota'}{$item} > $defquota) { |
$settingstatus = $item; |
$defquota = $quotahash{'quotas'}{'defaultquota'}{$item}; |
|
$settingstatus = $item; |
|
} |
|
} |
|
} else { |
|
if ($quotahash{'quotas'}{$item} ne '') { |
|
if ($defquota eq '') { |
|
$defquota = $quotahash{'quotas'}{$item}; |
|
$settingstatus = $item; |
|
} elsif ($quotahash{'quotas'}{$item} > $defquota) { |
|
$defquota = $quotahash{'quotas'}{$item}; |
|
$settingstatus = $item; |
|
} |
} |
} |
} |
} |
} |
} |
} |
} |
if ($defquota eq '') { |
if ($defquota eq '') { |
$defquota = $quotahash{'quota'}{'default'}; |
if (ref($quotahash{'quotas'}{'defaultquota'}) eq 'HASH') { |
|
$defquota = $quotahash{'quotas'}{'defaultquota'}{'default'}; |
|
} else { |
|
$defquota = $quotahash{'quotas'}{'default'}; |
|
} |
$settingstatus = 'default'; |
$settingstatus = 'default'; |
} |
} |
} else { |
} else { |
Line 5917 sub get_secgrprole_info {
|
Line 7824 sub get_secgrprole_info {
|
} |
} |
|
|
sub user_picker { |
sub user_picker { |
my ($dom,$srch,$forcenewuser,$caller) = @_; |
my ($dom,$srch,$forcenewuser,$caller,$cancreate,$usertype,$context) = @_; |
my $currdom = $dom; |
my $currdom = $dom; |
my %curr_selected = ( |
my %curr_selected = ( |
srchin => 'dom', |
srchin => 'dom', |
srchby => 'lastname', |
srchby => 'lastname', |
); |
); |
my $srchterm; |
my $srchterm; |
if (ref($srch) eq 'HASH') { |
if ((ref($srch) eq 'HASH') && ($env{'form.origform'} ne 'crtusername')) { |
if ($srch->{'srchby'} ne '') { |
if ($srch->{'srchby'} ne '') { |
$curr_selected{'srchby'} = $srch->{'srchby'}; |
$curr_selected{'srchby'} = $srch->{'srchby'}; |
} |
} |
Line 5971 sub user_picker {
|
Line 7878 sub user_picker {
|
# loncreateuser::print_user_query_page() |
# loncreateuser::print_user_query_page() |
# has been completed. |
# has been completed. |
next if ($option eq 'alc'); |
next if ($option eq 'alc'); |
|
next if (($option eq 'crs') && ($env{'form.form'} eq 'requestcrs')); |
next if ($option eq 'crs' && !$env{'request.course.id'}); |
next if ($option eq 'crs' && !$env{'request.course.id'}); |
if ($curr_selected{'srchin'} eq $option) { |
if ($curr_selected{'srchin'} eq $option) { |
$srchinsel .= ' |
$srchinsel .= ' |
Line 6007 sub user_picker {
|
Line 7915 sub user_picker {
|
$srchtypesel .= "\n </select>\n"; |
$srchtypesel .= "\n </select>\n"; |
|
|
my ($newuserscript,$new_user_create); |
my ($newuserscript,$new_user_create); |
|
my $context_dom = $env{'request.role.domain'}; |
|
if ($context eq 'requestcrs') { |
|
if ($env{'form.coursedom'} ne '') { |
|
$context_dom = $env{'form.coursedom'}; |
|
} |
|
} |
if ($forcenewuser) { |
if ($forcenewuser) { |
if (ref($srch) eq 'HASH') { |
if (ref($srch) eq 'HASH') { |
if ($srch->{'srchby'} eq 'uname' && $srch->{'srchtype'} eq 'exact' && $srch->{'srchin'} eq 'dom' && $srch->{'srchdomain'} eq $env{'request.role.domain'}) { |
if ($srch->{'srchby'} eq 'uname' && $srch->{'srchtype'} eq 'exact' && $srch->{'srchin'} eq 'dom' && $srch->{'srchdomain'} eq $context_dom) { |
$new_user_create = '<p> <input type="submit" name="forcenew" value="'.&HTML::Entities::encode(&mt('Make new user "[_1]"',$srchterm),'<>&"').'" onclick="javascript:setSearch(\'1\','.$caller.');" /> </p>'; |
if ($cancreate) { |
|
$new_user_create = '<p> <input type="submit" name="forcenew" value="'.&HTML::Entities::encode(&mt('Make new user "[_1]"',$srchterm),'<>&"').'" onclick="javascript:setSearch(\'1\','.$caller.');" /> </p>'; |
|
} else { |
|
my $helplink = 'javascript:helpMenu('."'display'".')'; |
|
my %usertypetext = ( |
|
official => 'institutional', |
|
unofficial => 'non-institutional', |
|
); |
|
$new_user_create = '<p class="LC_warning">' |
|
.&mt("You are not authorized to create new $usertypetext{$usertype} users in this domain.") |
|
.' ' |
|
.&mt('Please contact the [_1]helpdesk[_2] for assistance.' |
|
,'<a href="'.$helplink.'">','</a>') |
|
.'</p><br />'; |
|
} |
} |
} |
} |
} |
|
|
Line 6035 function setSearch(createnew,callingForm
|
Line 7962 function setSearch(createnew,callingForm
|
} |
} |
} |
} |
for (var i=0; i<callingForm.srchdomain.length; i++) { |
for (var i=0; i<callingForm.srchdomain.length; i++) { |
if (callingForm.srchdomain.options[i].value == '$env{'request.role.domain'}') { |
if (callingForm.srchdomain.options[i].value == '$context_dom') { |
callingForm.srchdomain.selectedIndex = i; |
callingForm.srchdomain.selectedIndex = i; |
} |
} |
} |
} |
Line 6047 ENDSCRIPT
|
Line 7974 ENDSCRIPT
|
|
|
my $output = <<"END_BLOCK"; |
my $output = <<"END_BLOCK"; |
<script type="text/javascript"> |
<script type="text/javascript"> |
|
// <![CDATA[ |
function validateEntry(callingForm) { |
function validateEntry(callingForm) { |
|
|
var checkok = 1; |
var checkok = 1; |
Line 6115 function validateEntry(callingForm) {
|
Line 8043 function validateEntry(callingForm) {
|
|
|
$newuserscript |
$newuserscript |
|
|
|
// ]]> |
</script> |
</script> |
|
|
$new_user_create |
$new_user_create |
|
|
<table> |
|
<tr> |
|
<td>$lt{'doma'}:</td> |
|
<td>$domform</td> |
|
</td> |
|
</tr> |
|
<tr> |
|
<td>$lt{'usr'}:</td> |
|
<td>$srchbysel |
|
$srchtypesel |
|
<input type="text" size="15" name="srchterm" value="$srchterm" /> |
|
$srchinsel |
|
</td> |
|
</tr> |
|
</table> |
|
<br /> |
|
END_BLOCK |
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. |
|
'<input type="text" size="15" name="srchterm" value="'.$srchterm.'" />'. |
|
$srchinsel. |
|
&Apache::lonhtmlcommon::row_closure(1). |
|
&Apache::lonhtmlcommon::end_pick_box(). |
|
'<br />'; |
return $output; |
return $output; |
} |
} |
|
|
sub username_rule_check { |
sub user_rule_check { |
my ($srch,$caller) = @_; |
my ($usershash,$checks,$alerts,$rulematch,$inst_results,$curr_rules,$got_rules) = @_; |
my ($response,@curr_rules,%inst_results,$rulematch); |
my $response; |
my ($rules,$ruleorder) = &Apache::lonnet::inst_userrules($srch->{'srchdomain'}); |
if (ref($usershash) eq 'HASH') { |
if (ref($srch) eq 'HASH') { |
foreach my $user (keys(%{$usershash})) { |
(my $inst_response,%inst_results) = |
my ($uname,$udom) = split(/:/,$user); |
&Apache::lonnet::get_instuser($srch->{'srchdomain'}, |
next if ($udom eq '' || $uname eq ''); |
$srch->{'srchterm'}); |
my ($id,$newuser); |
my %domconfig = &Apache::lonnet::get_dom('configuration', |
if (ref($usershash->{$user}) eq 'HASH') { |
['usercreation'],$srch->{'srchdomain'}); |
$newuser = $usershash->{$user}->{'newuser'}; |
if (ref($domconfig{'usercreation'}) eq 'HASH') { |
$id = $usershash->{$user}->{'id'}; |
if (ref($domconfig{'usercreation'}{'username_rule'}) eq 'ARRAY') { |
} |
@curr_rules = @{$domconfig{'usercreation'}{'username_rule'}}; |
my $inst_response; |
} |
if (ref($checks) eq 'HASH') { |
} |
if (defined($checks->{'username'})) { |
if (@curr_rules > 0) { |
($inst_response,%{$inst_results->{$user}}) = |
my $domdesc = &Apache::lonnet::domain($srch->{'srchdomain'},'description'); |
&Apache::lonnet::get_instuser($udom,$uname); |
my $instuser_reqd; |
} elsif (defined($checks->{'id'})) { |
my %rule_check = &Apache::lonnet::inst_rulecheck($srch->{'srchdomain'},$srch->{'srchterm'},\@curr_rules); |
($inst_response,%{$inst_results->{$user}}) = |
foreach my $rule (@curr_rules) { |
&Apache::lonnet::get_instuser($udom,undef,$id); |
if ($rule_check{$rule}) { |
} |
$rulematch = $rule; |
} else { |
if ($inst_response eq 'ok') { |
($inst_response,%{$inst_results->{$user}}) = |
if (keys(%inst_results) == 0) { |
&Apache::lonnet::get_instuser($udom,$uname); |
if ($caller eq 'new') { |
return; |
$response = &mt('The username you chose matches the format of usernames defined for <span class="LC_cusr_emph">[_1]</span>, but the user does not exist in the institutional directory.',$domdesc).'<br />'.&mt("You must choose a username with a different format -- one that will not conflict with 'official' institutional usernames."); |
} |
} |
if (!$got_rules->{$udom}) { |
|
my %domconfig = &Apache::lonnet::get_dom('configuration', |
|
['usercreation'],$udom); |
|
if (ref($domconfig{'usercreation'}) eq 'HASH') { |
|
foreach my $item ('username','id') { |
|
if (ref($domconfig{'usercreation'}{$item.'_rule'}) eq 'ARRAY') { |
|
$$curr_rules{$udom}{$item} = |
|
$domconfig{'usercreation'}{$item.'_rule'}; |
} |
} |
} |
} |
last; |
|
} |
} |
|
$got_rules->{$udom} = 1; |
} |
} |
if ($response) { |
foreach my $item (keys(%{$checks})) { |
if ((ref($rules) eq 'HASH') && (ref($ruleorder) eq 'ARRAY')) { |
if (ref($$curr_rules{$udom}) eq 'HASH') { |
if (@{$ruleorder} > 0) { |
if (ref($$curr_rules{$udom}{$item}) eq 'ARRAY') { |
$response .= '<br />'.&mt('Usernames with the following format(s) may <span class="LC_cusr_emph">only</span> be used for verified users at [_1]:',$domdesc).' <ul>'; |
if (@{$$curr_rules{$udom}{$item}} > 0) { |
foreach my $rule (@{$ruleorder}) { |
my %rule_check = &Apache::lonnet::inst_rulecheck($udom,$uname,$id,$item,$$curr_rules{$udom}{$item}); |
if (grep(/^\Q$rule\E$/,@curr_rules)) { |
foreach my $rule (@{$$curr_rules{$udom}{$item}}) { |
if (ref($rules->{$rule}) eq 'HASH') { |
if ($rule_check{$rule}) { |
$response .= '<li>'.$rules->{$rule}{'name'}.': '. |
$$rulematch{$user}{$item} = $rule; |
$rules->{$rule}{'desc'}.'</li>'; |
if ($inst_response eq 'ok') { |
|
if (ref($inst_results) eq 'HASH') { |
|
if (ref($inst_results->{$user}) eq 'HASH') { |
|
if (keys(%{$inst_results->{$user}}) == 0) { |
|
$$alerts{$item}{$udom}{$uname} = 1; |
|
} |
|
} |
|
} |
|
} |
|
last; |
} |
} |
} |
} |
} |
} |
} |
} |
$response .= '</ul>'; |
|
} |
} |
} |
} |
} |
} |
} |
} |
return ($response,$rulematch,$rules,%inst_results); |
return; |
|
} |
|
|
|
sub user_rule_formats { |
|
my ($domain,$domdesc,$curr_rules,$check) = @_; |
|
my %text = ( |
|
'username' => 'Usernames', |
|
'id' => 'IDs', |
|
); |
|
my $output; |
|
my ($rules,$ruleorder) = &Apache::lonnet::inst_userrules($domain,$check); |
|
if ((ref($rules) eq 'HASH') && (ref($ruleorder) eq 'ARRAY')) { |
|
if (@{$ruleorder} > 0) { |
|
$output = '<br />'.&mt("$text{$check} with the following format(s) may <span class=\"LC_cusr_emph\">only</span> be used for verified users at [_1]:",$domdesc).' <ul>'; |
|
foreach my $rule (@{$ruleorder}) { |
|
if (ref($curr_rules) eq 'ARRAY') { |
|
if (grep(/^\Q$rule\E$/,@{$curr_rules})) { |
|
if (ref($rules->{$rule}) eq 'HASH') { |
|
$output .= '<li>'.$rules->{$rule}{'name'}.': '. |
|
$rules->{$rule}{'desc'}.'</li>'; |
|
} |
|
} |
|
} |
|
} |
|
$output .= '</ul>'; |
|
} |
|
} |
|
return $output; |
|
} |
|
|
|
sub instrule_disallow_msg { |
|
my ($checkitem,$domdesc,$count,$mode) = @_; |
|
my $response; |
|
my %text = ( |
|
item => 'username', |
|
items => 'usernames', |
|
match => 'matches', |
|
do => 'does', |
|
action => 'a username', |
|
one => 'one', |
|
); |
|
if ($count > 1) { |
|
$text{'item'} = 'usernames'; |
|
$text{'match'} ='match'; |
|
$text{'do'} = 'do'; |
|
$text{'action'} = 'usernames', |
|
$text{'one'} = 'ones'; |
|
} |
|
if ($checkitem eq 'id') { |
|
$text{'items'} = 'IDs'; |
|
$text{'item'} = 'ID'; |
|
$text{'action'} = 'an ID'; |
|
if ($count > 1) { |
|
$text{'item'} = 'IDs'; |
|
$text{'action'} = 'IDs'; |
|
} |
|
} |
|
$response = &mt("The $text{'item'} you chose $text{'match'} the format of $text{'items'} defined for [_1], but the $text{'item'} $text{'do'} not exist in the institutional directory.",'<span class="LC_cusr_emph">'.$domdesc.'</span>').'<br />'; |
|
if ($mode eq 'upload') { |
|
if ($checkitem eq 'username') { |
|
$response .= &mt("You will need to modify your upload file so it will include $text{'action'} with a different format -- $text{'one'} that will not conflict with 'official' institutional $text{'items'}."); |
|
} elsif ($checkitem eq 'id') { |
|
$response .= &mt("Either upload a file which includes $text{'action'} with a different format -- $text{'one'} that will not conflict with 'official' institutional $text{'items'}, or when associating fields with data columns, omit an association for the Student/Employee ID field."); |
|
} |
|
} elsif ($mode eq 'selfcreate') { |
|
if ($checkitem eq 'id') { |
|
$response .= &mt("You must either choose $text{'action'} with a different format -- $text{'one'} that will not conflict with 'official' institutional $text{'items'}, or leave the ID field blank."); |
|
} |
|
} else { |
|
if ($checkitem eq 'username') { |
|
$response .= &mt("You must choose $text{'action'} with a different format -- $text{'one'} that will not conflict with 'official' institutional $text{'items'}."); |
|
} elsif ($checkitem eq 'id') { |
|
$response .= &mt("You must either choose $text{'action'} with a different format -- $text{'one'} that will not conflict with 'official' institutional $text{'items'}, or leave the ID field blank."); |
|
} |
|
} |
|
return $response; |
|
} |
|
|
|
sub personal_data_fieldtitles { |
|
my %fieldtitles = &Apache::lonlocal::texthash ( |
|
id => 'Student/Employee ID', |
|
permanentemail => 'E-mail address', |
|
lastname => 'Last Name', |
|
firstname => 'First Name', |
|
middlename => 'Middle Name', |
|
generation => 'Generation', |
|
gen => 'Generation', |
|
inststatus => 'Affiliation', |
|
); |
|
return %fieldtitles; |
|
} |
|
|
|
sub sorted_inst_types { |
|
my ($dom) = @_; |
|
my ($usertypes,$order) = &Apache::lonnet::retrieve_inst_usertypes($dom); |
|
my $othertitle = &mt('All users'); |
|
if ($env{'request.course.id'}) { |
|
$othertitle = &mt('Any users'); |
|
} |
|
my @types; |
|
if (ref($order) eq 'ARRAY') { |
|
@types = @{$order}; |
|
} |
|
if (@types == 0) { |
|
if (ref($usertypes) eq 'HASH') { |
|
@types = sort(keys(%{$usertypes})); |
|
} |
|
} |
|
if (keys(%{$usertypes}) > 0) { |
|
$othertitle = &mt('Other users'); |
|
} |
|
return ($othertitle,$usertypes,\@types); |
|
} |
|
|
|
sub get_institutional_codes { |
|
my ($settings,$allcourses,$LC_code) = @_; |
|
# Get complete list of course sections to update |
|
my @currsections = (); |
|
my @currxlists = (); |
|
my $coursecode = $$settings{'internal.coursecode'}; |
|
|
|
if ($$settings{'internal.sectionnums'} ne '') { |
|
@currsections = split(/,/,$$settings{'internal.sectionnums'}); |
|
} |
|
|
|
if ($$settings{'internal.crosslistings'} ne '') { |
|
@currxlists = split(/,/,$$settings{'internal.crosslistings'}); |
|
} |
|
|
|
if (@currxlists > 0) { |
|
foreach (@currxlists) { |
|
if (m/^([^:]+):(\w*)$/) { |
|
unless (grep/^$1$/,@{$allcourses}) { |
|
push @{$allcourses},$1; |
|
$$LC_code{$1} = $2; |
|
} |
|
} |
|
} |
|
} |
|
|
|
if (@currsections > 0) { |
|
foreach (@currsections) { |
|
if (m/^(\w+):(\w*)$/) { |
|
my $sec = $coursecode.$1; |
|
my $lc_sec = $2; |
|
unless (grep/^$sec$/,@{$allcourses}) { |
|
push @{$allcourses},$sec; |
|
$$LC_code{$sec} = $lc_sec; |
|
} |
|
} |
|
} |
|
} |
|
return; |
|
} |
|
|
|
sub get_standard_codeitems { |
|
return ('Year','Semester','Department','Number','Section'); |
} |
} |
|
|
=pod |
=pod |
|
|
|
=head1 Slot Helpers |
|
|
|
=over 4 |
|
|
|
=item * sorted_slots() |
|
|
|
Sorts an array of slot names in order of slot start time (earliest first). |
|
|
|
Inputs: |
|
|
|
=over 4 |
|
|
|
slotsarr - Reference to array of unsorted slot names. |
|
|
|
slots - Reference to hash of hash, where outer hash keys are slot names. |
|
|
=back |
=back |
|
|
|
Returns: |
|
|
|
=over 4 |
|
|
|
sorted - An array of slot names sorted by the start time of the slot. |
|
|
|
=back |
|
|
|
=back |
|
|
|
=cut |
|
|
|
|
|
sub sorted_slots { |
|
my ($slotsarr,$slots) = @_; |
|
my @sorted; |
|
if ((ref($slotsarr) eq 'ARRAY') && (ref($slots) eq 'HASH')) { |
|
@sorted = |
|
sort { |
|
if (ref($slots->{$a}) && ref($slots->{$b})) { |
|
return $slots->{$a}{'starttime'} <=> $slots->{$b}{'starttime'} |
|
} |
|
if (ref($slots->{$a})) { return -1;} |
|
if (ref($slots->{$b})) { return 1;} |
|
return 0; |
|
} @{$slotsarr}; |
|
} |
|
return @sorted; |
|
} |
|
|
|
|
|
=pod |
|
|
=head1 HTTP Helpers |
=head1 HTTP Helpers |
|
|
=over 4 |
=over 4 |
|
|
=item * get_unprocessed_cgi($query,$possible_names) |
=item * &get_unprocessed_cgi($query,$possible_names) |
|
|
Modify the %env hash to contain unprocessed CGI form parameters held in |
Modify the %env hash to contain unprocessed CGI form parameters held in |
$query. The parameters listed in $possible_names (an array reference), |
$query. The parameters listed in $possible_names (an array reference), |
Line 6230 sub get_unprocessed_cgi {
|
Line 8375 sub get_unprocessed_cgi {
|
|
|
=pod |
=pod |
|
|
=item * cacheheader() |
=item * &cacheheader() |
|
|
returns cache-controlling header code |
returns cache-controlling header code |
|
|
Line 6247 sub cacheheader {
|
Line 8392 sub cacheheader {
|
|
|
=pod |
=pod |
|
|
=item * no_cache($r) |
=item * &no_cache($r) |
|
|
specifies header code to not have cache |
specifies header code to not have cache |
|
|
Line 6283 sub content_type {
|
Line 8428 sub content_type {
|
|
|
=pod |
=pod |
|
|
=item * add_to_env($name,$value) |
=item * &add_to_env($name,$value) |
|
|
adds $name to the %env hash with value |
adds $name to the %env hash with value |
$value, if $name already exists, the entry is converted to an array |
$value, if $name already exists, the entry is converted to an array |
Line 6310 sub add_to_env {
|
Line 8455 sub add_to_env {
|
|
|
=pod |
=pod |
|
|
=item * get_env_multiple($name) |
=item * &get_env_multiple($name) |
|
|
gets $name from the %env hash, it seemlessly handles the cases where multiple |
gets $name from the %env hash, it seemlessly handles the cases where multiple |
values may be defined and end up as an array ref. |
values may be defined and end up as an array ref. |
Line 6333 sub get_env_multiple {
|
Line 8478 sub get_env_multiple {
|
return(@values); |
return(@values); |
} |
} |
|
|
|
sub ask_for_embedded_content { |
|
my ($actionurl,$state,$allfiles,$codebase,$args)=@_; |
|
my (%subdependencies,%dependencies,%mapping,%existing,%newfiles,%pathchanges); |
|
my $num = 0; |
|
my $numremref = 0; |
|
my $numinvalid = 0; |
|
my $numpathchg = 0; |
|
my $numexisting = 0; |
|
my ($output,$upload_output,$toplevel,$url,$udom,$uname,$getpropath); |
|
if (($actionurl eq '/adm/portfolio') || ($actionurl eq '/adm/coursegrp_portfolio')) { |
|
my $current_path='/'; |
|
if ($env{'form.currentpath'}) { |
|
$current_path = $env{'form.currentpath'}; |
|
} |
|
if ($actionurl eq '/adm/coursegrp_portfolio') { |
|
$udom = $env{'course.'.$env{'request.course.id'}.'.domain'}; |
|
$uname = $env{'course.'.$env{'request.course.id'}.'.num'}; |
|
$url = '/userfiles/groups/'.$env{'form.group'}.'/portfolio'; |
|
} else { |
|
$udom = $env{'user.domain'}; |
|
$uname = $env{'user.name'}; |
|
$url = '/userfiles/portfolio'; |
|
} |
|
$toplevel = $url.'/'; |
|
$url .= $current_path; |
|
$getpropath = 1; |
|
} elsif (($actionurl eq '/adm/upload') || ($actionurl eq '/adm/testbank') || |
|
($actionurl eq '/adm/imsimport')) { |
|
my ($udom,$uname,$rest) = ($args->{'current_path'} =~ m{/priv/($match_domain)/($match_username)/?(.*)$}); |
|
$url = $Apache::lonnet::perlvar{'lonDocRoot'}."/priv/$udom/$uname/"; |
|
$toplevel = $url; |
|
if ($rest ne '') { |
|
$url .= $rest; |
|
} |
|
} elsif ($actionurl eq '/adm/coursedocs') { |
|
if (ref($args) eq 'HASH') { |
|
$url = $args->{'docs_url'}; |
|
$toplevel = $url; |
|
} |
|
} |
|
my $now = time(); |
|
foreach my $embed_file (keys(%{$allfiles})) { |
|
my $absolutepath; |
|
if ($embed_file =~ m{^\w+://}) { |
|
$newfiles{$embed_file} = 1; |
|
$mapping{$embed_file} = $embed_file; |
|
} else { |
|
if ($embed_file =~ m{^/}) { |
|
$absolutepath = $embed_file; |
|
$embed_file =~ s{^(/+)}{}; |
|
} |
|
if ($embed_file =~ m{/}) { |
|
my ($path,$fname) = ($embed_file =~ m{^(.+)/([^/]*)$}); |
|
$path = &check_for_traversal($path,$url,$toplevel); |
|
my $item = $fname; |
|
if ($path ne '') { |
|
$item = $path.'/'.$fname; |
|
$subdependencies{$path}{$fname} = 1; |
|
} else { |
|
$dependencies{$item} = 1; |
|
} |
|
if ($absolutepath) { |
|
$mapping{$item} = $absolutepath; |
|
} else { |
|
$mapping{$item} = $embed_file; |
|
} |
|
} else { |
|
$dependencies{$embed_file} = 1; |
|
if ($absolutepath) { |
|
$mapping{$embed_file} = $absolutepath; |
|
} else { |
|
$mapping{$embed_file} = $embed_file; |
|
} |
|
} |
|
} |
|
} |
|
foreach my $path (keys(%subdependencies)) { |
|
my %currsubfile; |
|
if (($actionurl eq '/adm/portfolio') || ($actionurl eq '/adm/coursegrp_portfolio')) { |
|
my ($sublistref,$listerror) = |
|
&Apache::lonnet::dirlist($url.$path,$udom,$uname,$getpropath); |
|
if (ref($sublistref) eq 'ARRAY') { |
|
foreach my $line (@{$sublistref}) { |
|
my ($file_name,$rest) = split(/\&/,$line,2); |
|
$currsubfile{$file_name} = 1; |
|
} |
|
} |
|
} elsif (($actionurl eq '/adm/upload') || ($actionurl eq '/adm/testbank')) { |
|
if (opendir(my $dir,$url.'/'.$path)) { |
|
my @subdir_list = grep(!/^\./,readdir($dir)); |
|
map {$currsubfile{$_} = 1;} @subdir_list; |
|
} |
|
} |
|
foreach my $file (keys(%{$subdependencies{$path}})) { |
|
if ($currsubfile{$file}) { |
|
my $item = $path.'/'.$file; |
|
unless ($mapping{$item} eq $item) { |
|
$pathchanges{$item} = 1; |
|
} |
|
$existing{$item} = 1; |
|
$numexisting ++; |
|
} else { |
|
$newfiles{$path.'/'.$file} = 1; |
|
} |
|
} |
|
} |
|
my %currfile; |
|
if (($actionurl eq '/adm/portfolio') || ($actionurl eq '/adm/coursegrp_portfolio')) { |
|
my ($dirlistref,$listerror) = |
|
&Apache::lonnet::dirlist($url,$udom,$uname,$getpropath); |
|
if (ref($dirlistref) eq 'ARRAY') { |
|
foreach my $line (@{$dirlistref}) { |
|
my ($file_name,$rest) = split(/\&/,$line,2); |
|
$currfile{$file_name} = 1; |
|
} |
|
} |
|
} elsif (($actionurl eq '/adm/upload') || ($actionurl eq '/adm/testbank')) { |
|
if (opendir(my $dir,$url)) { |
|
my @dir_list = grep(!/^\./,readdir($dir)); |
|
map {$currfile{$_} = 1;} @dir_list; |
|
} |
|
} |
|
foreach my $file (keys(%dependencies)) { |
|
if ($currfile{$file}) { |
|
unless ($mapping{$file} eq $file) { |
|
$pathchanges{$file} = 1; |
|
} |
|
$existing{$file} = 1; |
|
$numexisting ++; |
|
} else { |
|
$newfiles{$file} = 1; |
|
} |
|
} |
|
foreach my $embed_file (sort {lc($a) cmp lc($b)} keys(%newfiles)) { |
|
$upload_output .= &start_data_table_row(). |
|
'<td><span class="LC_filename">'.$embed_file.'</span>'; |
|
unless ($mapping{$embed_file} eq $embed_file) { |
|
$upload_output .= '<br /><span class="LC_info" style="font-size:smaller;">'.&mt('changed from: [_1]',$mapping{$embed_file}).'</span>'; |
|
} |
|
$upload_output .= '</td><td>'; |
|
if ($args->{'ignore_remote_references'} |
|
&& $embed_file =~ m{^\w+://}) { |
|
$upload_output.='<span class="LC_warning">'.&mt("URL points to other server.").'</span>'; |
|
$numremref++; |
|
} elsif ($args->{'error_on_invalid_names'} |
|
&& $embed_file ne &Apache::lonnet::clean_filename($embed_file,{'keep_path' => 1,})) { |
|
|
|
$upload_output.='<span class="LC_warning">'.&mt('Invalid characters').'</span>'; |
|
$numinvalid++; |
|
} else { |
|
$upload_output .= &embedded_file_element('upload_embedded',$num, |
|
$embed_file,\%mapping, |
|
$allfiles,$codebase); |
|
$num++; |
|
} |
|
$upload_output .= '</td>'.&Apache::loncommon::end_data_table_row()."\n"; |
|
} |
|
foreach my $embed_file (sort {lc($a) cmp lc($b)} keys(%existing)) { |
|
$upload_output .= &start_data_table_row(). |
|
'<td><span class="LC_filename">'.$embed_file.'</span></td>'. |
|
'<td><span class="LC_warning">'.&mt('Already exists').'</span></td>'. |
|
&Apache::loncommon::end_data_table_row()."\n"; |
|
} |
|
if ($upload_output) { |
|
$upload_output = &start_data_table(). |
|
$upload_output. |
|
&end_data_table()."\n"; |
|
} |
|
my $applies = 0; |
|
if ($numremref) { |
|
$applies ++; |
|
} |
|
if ($numinvalid) { |
|
$applies ++; |
|
} |
|
if ($numexisting) { |
|
$applies ++; |
|
} |
|
if ($num) { |
|
$output = '<form name="upload_embedded" action="'.$actionurl.'"'. |
|
' method="post" enctype="multipart/form-data">'."\n". |
|
$state. |
|
'<h3>'.&mt('Upload embedded files'). |
|
':</h3>'.$upload_output.'<br />'."\n". |
|
'<input type ="hidden" name="number_embedded_items" value="'. |
|
$num.'" />'."\n"; |
|
if ($actionurl eq '') { |
|
$output .= '<input type="hidden" name="phase" value="three" />'; |
|
} |
|
} elsif ($applies) { |
|
$output = '<b>'.&mt('Referenced files').'</b>:<br />'; |
|
if ($applies > 1) { |
|
$output .= |
|
&mt('No files need to be uploaded, as one of the following applies to each reference:').'<ul>'; |
|
if ($numremref) { |
|
$output .= '<li>'.&mt('reference is to a URL which points to another server').'</li>'."\n"; |
|
} |
|
if ($numinvalid) { |
|
$output .= '<li>'.&mt('reference is to file with a name containing invalid characters').'</li>'."\n"; |
|
} |
|
if ($numexisting) { |
|
$output .= '<li>'.&mt('reference is to an existing file at the specified location').'</li>'."\n"; |
|
} |
|
$output .= '</ul><br />'; |
|
} elsif ($numremref) { |
|
$output .= '<p>'.&mt('None to upload, as all references are to URLs pointing to another server.').'</p>'; |
|
} elsif ($numinvalid) { |
|
$output .= '<p>'.&mt('None to upload, as all references are to files with names containing invalid characters.').'</p>'; |
|
} elsif ($numexisting) { |
|
$output .= '<p>'.&mt('None to upload, as all references are to existing files.').'</p>'; |
|
} |
|
$output .= $upload_output.'<br />'; |
|
} |
|
my ($pathchange_output,$chgcount); |
|
$chgcount = $num; |
|
if (keys(%pathchanges) > 0) { |
|
foreach my $embed_file (sort {lc($a) cmp lc($b)} keys(%pathchanges)) { |
|
if ($num) { |
|
$output .= &embedded_file_element('pathchange',$chgcount, |
|
$embed_file,\%mapping, |
|
$allfiles,$codebase); |
|
} else { |
|
$pathchange_output .= |
|
&start_data_table_row(). |
|
'<td><input type ="checkbox" name="namechange" value="'. |
|
$chgcount.'" checked="checked" /></td>'. |
|
'<td>'.$mapping{$embed_file}.'</td>'. |
|
'<td>'.$embed_file. |
|
&embedded_file_element('pathchange',$numpathchg,$embed_file, |
|
\%mapping,$allfiles,$codebase). |
|
'</td>'.&end_data_table_row(); |
|
} |
|
$numpathchg ++; |
|
$chgcount ++; |
|
} |
|
} |
|
if ($num) { |
|
if ($numpathchg) { |
|
$output .= '<input type ="hidden" name="number_pathchange_items" value="'. |
|
$numpathchg.'" />'."\n"; |
|
} |
|
if (($actionurl eq '/adm/upload') || ($actionurl eq '/adm/testbank') || |
|
($actionurl eq '/adm/imsimport')) { |
|
$output .= '<input type="hidden" name="phase" value="three" />'."\n"; |
|
} elsif ($actionurl eq '/adm/portfolio' || $actionurl eq '/adm/coursegrp_portfolio') { |
|
$output .= '<input type="hidden" name="action" value="upload_embedded" />'; |
|
} |
|
$output .= '<input type ="submit" value="'.&mt('Upload Listed Files').'" />'."\n". |
|
&mt('(only files for which a location has been provided will be uploaded)').'</form>'."\n"; |
|
} elsif ($numpathchg) { |
|
my %pathchange = (); |
|
$output .= &modify_html_form('pathchange',$actionurl,$state,\%pathchange,$pathchange_output); |
|
if (($actionurl eq '/adm/portfolio') || ($actionurl eq '/adm/coursegrp_portfolio')) { |
|
$output .= '<p>'.&mt('or').'</p>'; |
|
} |
|
} |
|
return ($output,$num,$numpathchg); |
|
} |
|
|
|
sub embedded_file_element { |
|
my ($context,$num,$embed_file,$mapping,$allfiles,$codebase) = @_; |
|
return unless ((ref($mapping) eq 'HASH') && (ref($allfiles) eq 'HASH') && |
|
(ref($codebase) eq 'HASH')); |
|
my $output; |
|
if ($context eq 'upload_embedded') { |
|
$output = '<input name="embedded_item_'.$num.'" type="file" value="" />'."\n"; |
|
} |
|
$output .= '<input name="embedded_orig_'.$num.'" type="hidden" value="'. |
|
&escape($embed_file).'" />'; |
|
unless (($context eq 'upload_embedded') && |
|
($mapping->{$embed_file} eq $embed_file)) { |
|
$output .=' |
|
<input name="embedded_ref_'.$num.'" type="hidden" value="'.&escape($mapping->{$embed_file}).'" />'; |
|
} |
|
my $attrib; |
|
if (ref($allfiles->{$mapping->{$embed_file}}) eq 'ARRAY') { |
|
$attrib = &escape(join(':',@{$allfiles->{$mapping->{$embed_file}}})); |
|
} |
|
$output .= |
|
"\n\t\t". |
|
'<input name="embedded_attrib_'.$num.'" type="hidden" value="'. |
|
$attrib.'" />'; |
|
if (exists($codebase->{$mapping->{$embed_file}})) { |
|
$output .= |
|
"\n\t\t". |
|
'<input name="codebase_'.$num.'" type="hidden" value="'. |
|
&escape($codebase->{$mapping->{$embed_file}}).'" />'; |
|
} |
|
return $output; |
|
} |
|
|
|
sub upload_embedded { |
|
my ($context,$dirpath,$uname,$udom,$dir_root,$url_root,$group,$disk_quota, |
|
$current_disk_usage,$hiddenstate,$actionurl) = @_; |
|
my (%pathchange,$output,$modifyform,$footer,$returnflag); |
|
for (my $i=0; $i<$env{'form.number_embedded_items'}; $i++) { |
|
next if (!exists($env{'form.embedded_item_'.$i.'.filename'})); |
|
my $orig_uploaded_filename = |
|
$env{'form.embedded_item_'.$i.'.filename'}; |
|
foreach my $type ('orig','ref','attrib','codebase') { |
|
if ($env{'form.embedded_'.$type.'_'.$i} ne '') { |
|
$env{'form.embedded_'.$type.'_'.$i} = |
|
&unescape($env{'form.embedded_'.$type.'_'.$i}); |
|
} |
|
} |
|
my ($path,$fname) = |
|
($env{'form.embedded_orig_'.$i} =~ m{(.*/)([^/]*)}); |
|
# no path, whole string is fname |
|
if (!$fname) { $fname = $env{'form.embedded_orig_'.$i} }; |
|
$fname = &Apache::lonnet::clean_filename($fname); |
|
# See if there is anything left |
|
next if ($fname eq ''); |
|
|
|
# Check if file already exists as a file or directory. |
|
my ($state,$msg); |
|
if ($context eq 'portfolio') { |
|
my $port_path = $dirpath; |
|
if ($group ne '') { |
|
$port_path = "groups/$group/$port_path"; |
|
} |
|
($state,$msg) = &check_for_upload($env{'form.currentpath'}.$path, |
|
$fname,$group,'embedded_item_'.$i, |
|
$dir_root,$port_path,$disk_quota, |
|
$current_disk_usage,$uname,$udom); |
|
if ($state eq 'will_exceed_quota' |
|
|| $state eq 'file_locked') { |
|
$output .= $msg; |
|
next; |
|
} |
|
} elsif (($context eq 'author') || ($context eq 'testbank')) { |
|
($state,$msg) = &check_for_existing($path,$fname,'embedded_item_'.$i); |
|
if ($state eq 'exists') { |
|
$output .= $msg; |
|
next; |
|
} |
|
} |
|
# Check if extension is valid |
|
if (($fname =~ /\.(\w+)$/) && |
|
(&Apache::loncommon::fileembstyle($1) eq 'hdn')) { |
|
$output .= &mt('Invalid file extension ([_1]) - reserved for LONCAPA use - rename the file with a different extension and re-upload. ',$1).'<br />'; |
|
next; |
|
} elsif (($fname =~ /\.(\w+)$/) && |
|
(!defined(&Apache::loncommon::fileembstyle($1)))) { |
|
$output .= &mt('Unrecognized file extension ([_1]) - rename the file with a proper extension and re-upload.',$1).'<br />'; |
|
next; |
|
} elsif ($fname=~/\.(\d+)\.(\w+)$/) { |
|
$output .= &mt('File name not allowed - rename the file to remove the number immediately before the file extension([_1]) and re-upload.',$2).'<br />'; |
|
next; |
|
} |
|
|
|
$env{'form.embedded_item_'.$i.'.filename'}=$fname; |
|
if ($context eq 'portfolio') { |
|
my $result; |
|
if ($state eq 'existingfile') { |
|
$result= |
|
&Apache::lonnet::userfileupload('embedded_item_'.$i,'existingfile', |
|
$dirpath.$env{'form.currentpath'}.$path); |
|
} else { |
|
$result= |
|
&Apache::lonnet::userfileupload('embedded_item_'.$i,'', |
|
$dirpath. |
|
$env{'form.currentpath'}.$path); |
|
if ($result !~ m|^/uploaded/|) { |
|
$output .= '<span class="LC_error">' |
|
.&mt('An error occurred ([_1]) while trying to upload [_2] for embedded element [_3].' |
|
,$result,$orig_uploaded_filename,$env{'form.embedded_orig_'.$i}) |
|
.'</span><br />'; |
|
next; |
|
} else { |
|
$output .= &mt('Uploaded [_1]','<span class="LC_filename">'. |
|
$path.$fname.'</span>').'<br />'; |
|
} |
|
} |
|
} elsif ($context eq 'coursedoc') { |
|
my $result = |
|
&Apache::lonnet::userfileupload('embedded_item_'.$i,'coursedoc', |
|
$dirpath.'/'.$path); |
|
if ($result !~ m|^/uploaded/|) { |
|
$output .= '<span class="LC_error">' |
|
.&mt('An error occurred ([_1]) while trying to upload [_2] for embedded element [_3].' |
|
,$result,$orig_uploaded_filename,$env{'form.embedded_orig_'.$i}) |
|
.'</span><br />'; |
|
next; |
|
} else { |
|
$output .= &mt('Uploaded [_1]','<span class="LC_filename">'. |
|
$path.$fname.'</span>').'<br />'; |
|
} |
|
} else { |
|
# Save the file |
|
my $target = $env{'form.embedded_item_'.$i}; |
|
my $fullpath = $dir_root.$dirpath.'/'.$path; |
|
my $dest = $fullpath.$fname; |
|
my $url = $url_root.$dirpath.'/'.$path.$fname; |
|
my @parts=split(/\//,"$dirpath/$path"); |
|
my $count; |
|
my $filepath = $dir_root; |
|
foreach my $subdir (@parts) { |
|
$filepath .= "/$subdir"; |
|
if (!-e $filepath) { |
|
mkdir($filepath,0770); |
|
} |
|
} |
|
my $fh; |
|
if (!open($fh,'>'.$dest)) { |
|
&Apache::lonnet::logthis('Failed to create '.$dest); |
|
$output .= '<span class="LC_error">'. |
|
&mt('An error occurred while trying to upload [_1] for embedded element [_2].',$orig_uploaded_filename,$env{'form.embedded_orig_'.$i}). |
|
'</span><br />'; |
|
} else { |
|
if (!print $fh $env{'form.embedded_item_'.$i}) { |
|
&Apache::lonnet::logthis('Failed to write to '.$dest); |
|
$output .= '<span class="LC_error">'. |
|
&mt('An error occurred while writing the file [_1] for embedded element [_2].',$orig_uploaded_filename,$env{'form.embedded_orig_'.$i}). |
|
'</span><br />'; |
|
} else { |
|
$output .= &mt('Uploaded [_1]','<span class="LC_filename">'. |
|
$url.'</span>').'<br />'; |
|
unless ($context eq 'testbank') { |
|
$footer .= &mt('View embedded file: [_1]', |
|
'<a href="'.$url.'">'.$fname.'</a>').'<br />'; |
|
} |
|
} |
|
close($fh); |
|
} |
|
} |
|
if ($env{'form.embedded_ref_'.$i}) { |
|
$pathchange{$i} = 1; |
|
} |
|
} |
|
if ($output) { |
|
$output = '<p>'.$output.'</p>'; |
|
} |
|
$output .= &modify_html_form('upload_embedded',$actionurl,$hiddenstate,\%pathchange); |
|
$returnflag = 'ok'; |
|
if (keys(%pathchange) > 0) { |
|
if ($context eq 'portfolio') { |
|
$output .= '<p>'.&mt('or').'</p>'; |
|
} elsif ($context eq 'testbank') { |
|
$output .= '<p>'.&mt('Or [_1]continue[_2] the testbank import without modifying the reference(s).','<a href="javascript:document.testbankForm.submit();">','</a>').'</p>'; |
|
$returnflag = 'modify_orightml'; |
|
} |
|
} |
|
return ($output.$footer,$returnflag); |
|
} |
|
|
|
sub modify_html_form { |
|
my ($context,$actionurl,$hiddenstate,$pathchange,$pathchgtable) = @_; |
|
my $end = 0; |
|
my $modifyform; |
|
if ($context eq 'upload_embedded') { |
|
return unless (ref($pathchange) eq 'HASH'); |
|
if ($env{'form.number_embedded_items'}) { |
|
$end += $env{'form.number_embedded_items'}; |
|
} |
|
if ($env{'form.number_pathchange_items'}) { |
|
$end += $env{'form.number_pathchange_items'}; |
|
} |
|
if ($end) { |
|
for (my $i=0; $i<$end; $i++) { |
|
if ($i < $env{'form.number_embedded_items'}) { |
|
next unless($pathchange->{$i}); |
|
} |
|
$modifyform .= |
|
&start_data_table_row(). |
|
'<td><input type ="checkbox" name="namechange" value="'.$i.'" '. |
|
'checked="checked" /></td>'. |
|
'<td>'.$env{'form.embedded_ref_'.$i}. |
|
'<input type="hidden" name="embedded_ref_'.$i.'" value="'. |
|
&escape($env{'form.embedded_ref_'.$i}).'" />'. |
|
'<input type="hidden" name="embedded_codebase_'.$i.'" value="'. |
|
&escape($env{'form.embedded_codebase_'.$i}).'" />'. |
|
'<input type="hidden" name="embedded_attrib_'.$i.'" value="'. |
|
&escape($env{'form.embedded_attrib_'.$i}).'" /></td>'. |
|
'<td>'.$env{'form.embedded_orig_'.$i}. |
|
'<input type="hidden" name="embedded_orig_'.$i.'" value="'. |
|
&escape($env{'form.embedded_orig_'.$i}).'" /></td>'. |
|
&end_data_table_row(); |
|
} |
|
} |
|
} else { |
|
$modifyform = $pathchgtable; |
|
if (($actionurl eq '/adm/upload') || ($actionurl eq '/adm/testbank')) { |
|
$hiddenstate .= '<input type="hidden" name="phase" value="four" />'; |
|
} elsif (($actionurl eq '/adm/portfolio') || ($actionurl eq '/adm/coursegrp_portfolio')) { |
|
$hiddenstate .= '<input type="hidden" name="action" value="modify_orightml" />'; |
|
} |
|
} |
|
if ($modifyform) { |
|
return '<h3>'.&mt('Changes in content of HTML file required').'</h3>'."\n". |
|
'<p>'.&mt('Changes need to be made to the reference(s) used for one or more of the dependencies, if your HTML file is to work correctly:').'<ol>'."\n". |
|
'<li>'.&mt('For consistency between the reference(s) and the location of the corresponding stored file within LON-CAPA.').'</li>'."\n". |
|
'<li>'.&mt('To change absolute paths to relative paths, or replace directory traversal via "../" within the original reference.').'</li>'."\n". |
|
'</ol></p>'."\n".'<p>'. |
|
&mt('LON-CAPA can make the required changes to your HTML file.').'</p>'."\n". |
|
'<form method="post" name="refchanger" action="'.$actionurl.'">'. |
|
&start_data_table()."\n". |
|
&start_data_table_header_row(). |
|
'<th>'.&mt('Change?').'</th>'. |
|
'<th>'.&mt('Current reference').'</th>'. |
|
'<th>'.&mt('Required reference').'</th>'. |
|
&end_data_table_header_row()."\n". |
|
$modifyform. |
|
&end_data_table().'<br />'."\n".$hiddenstate. |
|
'<input type="submit" name="pathchanges" value="'.&mt('Modify HTML file').'" />'. |
|
'</form>'."\n"; |
|
} |
|
return; |
|
} |
|
|
|
sub modify_html_refs { |
|
my ($context,$dirpath,$uname,$udom,$dir_root) = @_; |
|
my $container; |
|
if ($context eq 'portfolio') { |
|
$container = $env{'form.container'}; |
|
} elsif ($context eq 'coursedoc') { |
|
$container = $env{'form.primaryurl'}; |
|
} else { |
|
$container = $Apache::lonnet::perlvar{'lonDocRoot'}.$env{'form.filename'}; |
|
} |
|
my (%allfiles,%codebase,$output,$content); |
|
my @changes = &get_env_multiple('form.namechange'); |
|
return unless (@changes > 0); |
|
if (($context eq 'portfolio') || ($context eq 'coursedoc')) { |
|
return unless ($container =~ m{^/uploaded/\Q$udom\E/\Q$uname\E/}); |
|
$content = &Apache::lonnet::getfile($container); |
|
return if ($content eq '-1'); |
|
} else { |
|
return unless ($container =~ /^\Q$dir_root\E/); |
|
if (open(my $fh,"<$container")) { |
|
$content = join('', <$fh>); |
|
close($fh); |
|
} else { |
|
return; |
|
} |
|
} |
|
my ($count,$codebasecount) = (0,0); |
|
my $mm = new File::MMagic; |
|
my $mime_type = $mm->checktype_contents($content); |
|
if ($mime_type eq 'text/html') { |
|
my $parse_result = |
|
&Apache::lonnet::extract_embedded_items($container,\%allfiles, |
|
\%codebase,\$content); |
|
if ($parse_result eq 'ok') { |
|
foreach my $i (@changes) { |
|
my $orig = &unescape($env{'form.embedded_orig_'.$i}); |
|
my $ref = &unescape($env{'form.embedded_ref_'.$i}); |
|
if ($allfiles{$ref}) { |
|
my $newname = $orig; |
|
my ($attrib_regexp,$codebase); |
|
$attrib_regexp = &unescape($env{'form.embedded_attrib_'.$i}); |
|
if ($attrib_regexp =~ /:/) { |
|
$attrib_regexp =~ s/\:/|/g; |
|
} |
|
if ($content =~ m{($attrib_regexp\s*=\s*['"]?)\Q$ref\E(['"]?)}) { |
|
my $numchg = ($content =~ s{($attrib_regexp\s*=\s*['"]?)\Q$ref\E(['"]?)}{$1$newname$2}gi); |
|
$count += $numchg; |
|
} |
|
if ($env{'form.embedded_codebase_'.$i} ne '') { |
|
$codebase = &unescape($env{'form.embedded_codebase_'.$i}); |
|
my $numchg = ($content =~ s/(codebase\s*=\s*["']?)\Q$codebase\E(["']?)/$1.$2/i); #' stupid emacs |
|
$codebasecount ++; |
|
} |
|
} |
|
} |
|
if ($count || $codebasecount) { |
|
my $saveresult; |
|
if ($context eq 'portfolio' || $context eq 'coursedoc') { |
|
my $url = &Apache::lonnet::store_edited_file($container,$content,$udom,$uname,\$saveresult); |
|
if ($url eq $container) { |
|
my ($fname) = ($container =~ m{/([^/]+)$}); |
|
$output = '<p>'.&mt('Updated [quant,_1,reference] in [_2].', |
|
$count,'<span class="LC_filename">'. |
|
$fname.'</span>').'</p>'; |
|
} else { |
|
$output = '<p class="LC_error">'. |
|
&mt('Error: update failed for: [_1].', |
|
'<span class="LC_filename">'. |
|
$container.'</span>').'</p>'; |
|
} |
|
} else { |
|
if (open(my $fh,">$container")) { |
|
print $fh $content; |
|
close($fh); |
|
$output = '<p>'.&mt('Updated [quant,_1,reference] in [_2].', |
|
$count,'<span class="LC_filename">'. |
|
$container.'</span>').'</p>'; |
|
} else { |
|
$output = '<p class="LC_error">'. |
|
&mt('Error: could not update [_1].', |
|
'<span class="LC_filename">'. |
|
$container.'</span>').'</p>'; |
|
} |
|
} |
|
} |
|
} else { |
|
&logthis('Failed to parse '.$container. |
|
' to modify references: '.$parse_result); |
|
} |
|
} |
|
return $output; |
|
} |
|
|
|
sub check_for_existing { |
|
my ($path,$fname,$element) = @_; |
|
my ($state,$msg); |
|
if (-d $path.'/'.$fname) { |
|
$state = 'exists'; |
|
$msg = &mt('Unable to upload [_1]. A directory by that name was found in [_2].','<span class="LC_filename">'.$fname.'</span>',$path); |
|
} elsif (-e $path.'/'.$fname) { |
|
$state = 'exists'; |
|
$msg = &mt('Unable to upload [_1]. A file by that name was found in [_2].','<span class="LC_filename">'.$fname.'</span>',$path); |
|
} |
|
if ($state eq 'exists') { |
|
$msg = '<span class="LC_error">'.$msg.'</span><br />'; |
|
} |
|
return ($state,$msg); |
|
} |
|
|
|
sub check_for_upload { |
|
my ($path,$fname,$group,$element,$portfolio_root,$port_path, |
|
$disk_quota,$current_disk_usage,$uname,$udom) = @_; |
|
my $filesize = length($env{'form.'.$element}); |
|
if (!$filesize) { |
|
my $msg = '<span class="LC_error">'. |
|
&mt('Unable to upload [_1]. (size = [_2] bytes)', |
|
'<span class="LC_filename">'.$fname.'</span>', |
|
$filesize).'<br />'. |
|
&mt('Either the file you attempted to upload was empty, or your web browser was unable to read its contents.').'<br />'. |
|
'</span>'; |
|
return ('zero_bytes',$msg); |
|
} |
|
$filesize = $filesize/1000; #express in k (1024?) |
|
my $getpropath = 1; |
|
my ($dirlistref,$listerror) = |
|
&Apache::lonnet::dirlist($portfolio_root.$path,$udom,$uname,$getpropath); |
|
my $found_file = 0; |
|
my $locked_file = 0; |
|
my @lockers; |
|
my $navmap; |
|
if ($env{'request.course.id'}) { |
|
$navmap = Apache::lonnavmaps::navmap->new(); |
|
} |
|
if (ref($dirlistref) eq 'ARRAY') { |
|
foreach my $line (@{$dirlistref}) { |
|
my ($file_name,$rest)=split(/\&/,$line,2); |
|
if ($file_name eq $fname){ |
|
$file_name = $path.$file_name; |
|
if ($group ne '') { |
|
$file_name = $group.$file_name; |
|
} |
|
$found_file = 1; |
|
if (&Apache::lonnet::is_locked($file_name,$udom,$uname,\@lockers) eq 'true') { |
|
foreach my $lock (@lockers) { |
|
if (ref($lock) eq 'ARRAY') { |
|
my ($symb,$crsid) = @{$lock}; |
|
if ($crsid eq $env{'request.course.id'}) { |
|
if (ref($navmap)) { |
|
my $res = $navmap->getBySymb($symb); |
|
foreach my $part (@{$res->parts()}) { |
|
my ($slot_status,$slot_time,$slot_name)=$res->check_for_slot($part); |
|
unless (($slot_status == $res->RESERVED) || |
|
($slot_status == $res->RESERVED_LOCATION)) { |
|
$locked_file = 1; |
|
} |
|
} |
|
} else { |
|
$locked_file = 1; |
|
} |
|
} else { |
|
$locked_file = 1; |
|
} |
|
} |
|
} |
|
} else { |
|
my @info = split(/\&/,$rest); |
|
my $currsize = $info[6]/1000; |
|
if ($currsize < $filesize) { |
|
my $extra = $filesize - $currsize; |
|
if (($current_disk_usage + $extra) > $disk_quota) { |
|
my $msg = '<span class="LC_error">'. |
|
&mt('Unable to upload [_1]. (size = [_2] kilobytes). Disk quota will be exceeded if existing (smaller) file with same name (size = [_3] kilobytes) is replaced.', |
|
'<span class="LC_filename">'.$fname.'</span>',$filesize,$currsize).'</span>'. |
|
'<br />'.&mt('Disk quota is [_1] kilobytes. Your current disk usage is [_2] kilobytes.', |
|
$disk_quota,$current_disk_usage); |
|
return ('will_exceed_quota',$msg); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
if (($current_disk_usage + $filesize) > $disk_quota){ |
|
my $msg = '<span class="LC_error">'. |
|
&mt('Unable to upload [_1]. (size = [_2] kilobytes). Disk quota will be exceeded.','<span class="LC_filename">'.$fname.'</span>',$filesize).'</span>'. |
|
'<br />'.&mt('Disk quota is [_1] kilobytes. Your current disk usage is [_2] kilobytes.',$disk_quota,$current_disk_usage); |
|
return ('will_exceed_quota',$msg); |
|
} elsif ($found_file) { |
|
if ($locked_file) { |
|
my $msg = '<span class="LC_error">'; |
|
$msg .= &mt('Unable to upload [_1]. A locked file by that name was found in [_2].','<span class="LC_filename">'.$fname.'</span>','<span class="LC_filename">'.$port_path.$env{'form.currentpath'}.'</span>'); |
|
$msg .= '</span><br />'; |
|
$msg .= &mt('You will be able to rename or delete existing [_1] after a grade has been assigned.','<span class="LC_filename">'.$fname.'</span>'); |
|
return ('file_locked',$msg); |
|
} else { |
|
my $msg = '<span class="LC_error">'; |
|
$msg .= &mt(' A file by that name: [_1] was found in [_2].','<span class="LC_filename">'.$fname.'</span>',$port_path.$env{'form.currentpath'}); |
|
$msg .= '</span>'; |
|
return ('existingfile',$msg); |
|
} |
|
} |
|
} |
|
|
|
sub check_for_traversal { |
|
my ($path,$url,$toplevel) = @_; |
|
my @parts=split(/\//,$path); |
|
my $cleanpath; |
|
my $fullpath = $url; |
|
for (my $i=0;$i<@parts;$i++) { |
|
next if ($parts[$i] eq '.'); |
|
if ($parts[$i] eq '..') { |
|
$fullpath =~ s{([^/]+/)$}{}; |
|
} else { |
|
$fullpath .= $parts[$i].'/'; |
|
} |
|
} |
|
if ($fullpath =~ /^\Q$url\E(.*)$/) { |
|
$cleanpath = $1; |
|
} elsif ($fullpath =~ /^\Q$toplevel\E(.*)$/) { |
|
my $curr_toprel = $1; |
|
my @parts = split(/\//,$curr_toprel); |
|
my ($url_toprel) = ($url =~ /^\Q$toplevel\E(.*)$/); |
|
my @urlparts = split(/\//,$url_toprel); |
|
my $doubledots; |
|
my $startdiff = -1; |
|
for (my $i=0; $i<@urlparts; $i++) { |
|
if ($startdiff == -1) { |
|
unless ($urlparts[$i] eq $parts[$i]) { |
|
$startdiff = $i; |
|
$doubledots .= '../'; |
|
} |
|
} else { |
|
$doubledots .= '../'; |
|
} |
|
} |
|
if ($startdiff > -1) { |
|
$cleanpath = $doubledots; |
|
for (my $i=$startdiff; $i<@parts; $i++) { |
|
$cleanpath .= $parts[$i].'/'; |
|
} |
|
} |
|
} |
|
$cleanpath =~ s{(/)$}{}; |
|
return $cleanpath; |
|
} |
|
|
|
=pod |
|
|
|
=item * &get_turnedin_filepath() |
|
|
|
Determines path in a user's portfolio file for storage of files uploaded |
|
to a specific essayresponse or dropbox item. |
|
|
|
Inputs: 3 required + 1 optional. |
|
$symb is symb for resource, $uname and $udom are for current user (required). |
|
$caller is optional (can be "submission", if routine is called when storing |
|
an upoaded file when "Submit Answer" button was pressed). |
|
|
|
Returns array containing $path and $multiresp. |
|
$path is path in portfolio. $multiresp is 1 if this resource contains more |
|
than one file upload item. Callers of routine should append partid as a |
|
subdirectory to $path in cases where $multiresp is 1. |
|
|
|
Called by: homework/essayresponse.pm and homework/structuretags.pm |
|
|
|
=cut |
|
|
|
sub get_turnedin_filepath { |
|
my ($symb,$uname,$udom,$caller) = @_; |
|
my ($map,$resid,$resurl)=&Apache::lonnet::decode_symb($symb); |
|
my $turnindir; |
|
my %userhash = &Apache::lonnet::userenvironment($udom,$uname,'turnindir'); |
|
$turnindir = $userhash{'turnindir'}; |
|
my ($path,$multiresp); |
|
if ($turnindir eq '') { |
|
if ($caller eq 'submission') { |
|
$turnindir = &mt('turned in'); |
|
$turnindir =~ s/\W+/_/g; |
|
my %newhash = ( |
|
'turnindir' => $turnindir, |
|
); |
|
&Apache::lonnet::put('environment',\%newhash,$udom,$uname); |
|
} |
|
} |
|
if ($turnindir ne '') { |
|
$path = '/'.$turnindir.'/'; |
|
my ($multipart,$turnin,@pathitems); |
|
my $navmap = Apache::lonnavmaps::navmap->new(); |
|
if (defined($navmap)) { |
|
my $mapres = $navmap->getResourceByUrl($map); |
|
if (ref($mapres)) { |
|
my $pcslist = $mapres->map_hierarchy(); |
|
if ($pcslist ne '') { |
|
foreach my $pc (split(/,/,$pcslist)) { |
|
my $res = $navmap->getByMapPc($pc); |
|
if (ref($res)) { |
|
my $title = $res->compTitle(); |
|
$title =~ s/\W+/_/g; |
|
if ($title ne '') { |
|
push(@pathitems,$title); |
|
} |
|
} |
|
} |
|
} |
|
my $maptitle = $mapres->compTitle(); |
|
$maptitle =~ s/\W+/_/g; |
|
if ($maptitle ne '') { |
|
push(@pathitems,$maptitle); |
|
} |
|
unless ($env{'request.state'} eq 'construct') { |
|
my $res = $navmap->getBySymb($symb); |
|
if (ref($res)) { |
|
my $partlist = $res->parts(); |
|
my $totaluploads = 0; |
|
if (ref($partlist) eq 'ARRAY') { |
|
foreach my $part (@{$partlist}) { |
|
my @types = $res->responseType($part); |
|
my @ids = $res->responseIds($part); |
|
for (my $i=0; $i < scalar(@ids); $i++) { |
|
if ($types[$i] eq 'essay') { |
|
my $partid = $part.'_'.$ids[$i]; |
|
if (&Apache::lonnet::EXT("resource.$partid.uploadedfiletypes") ne '') { |
|
$totaluploads ++; |
|
} |
|
} |
|
} |
|
} |
|
if ($totaluploads > 1) { |
|
$multiresp = 1; |
|
} |
|
} |
|
} |
|
} |
|
} else { |
|
return; |
|
} |
|
} else { |
|
return; |
|
} |
|
my $restitle=&Apache::lonnet::gettitle($symb); |
|
$restitle =~ s/\W+/_/g; |
|
if ($restitle eq '') { |
|
$restitle = ($resurl =~ m{/[^/]+$}); |
|
if ($restitle eq '') { |
|
$restitle = time; |
|
} |
|
} |
|
push(@pathitems,$restitle); |
|
$path .= join('/',@pathitems); |
|
} |
|
return ($path,$multiresp); |
|
} |
|
|
=pod |
=pod |
|
|
Line 6342 sub get_env_multiple {
|
Line 9348 sub get_env_multiple {
|
|
|
=over 4 |
=over 4 |
|
|
=item * upfile_store($r) |
=item * &upfile_store($r) |
|
|
Store uploaded file, $r should be the HTTP Request object, |
Store uploaded file, $r should be the HTTP Request object, |
needs $env{'form.upfile'} |
needs $env{'form.upfile'} |
Line 6372 sub upfile_store {
|
Line 9378 sub upfile_store {
|
|
|
=pod |
=pod |
|
|
=item * load_tmp_file($r) |
=item * &load_tmp_file($r) |
|
|
Load uploaded file from tmp, $r should be the HTTP Request object, |
Load uploaded file from tmp, $r should be the HTTP Request object, |
needs $env{'form.datatoken'}, |
needs $env{'form.datatoken'}, |
Line 6396 sub load_tmp_file {
|
Line 9402 sub load_tmp_file {
|
|
|
=pod |
=pod |
|
|
=item * upfile_record_sep() |
=item * &upfile_record_sep() |
|
|
Separate uploaded file into records |
Separate uploaded file into records |
returns array of records, |
returns array of records, |
Line 6418 sub upfile_record_sep {
|
Line 9424 sub upfile_record_sep {
|
|
|
=pod |
=pod |
|
|
=item * record_sep($record) |
=item * &record_sep($record) |
|
|
Separate a record into fields $record should be an item from the upfile_record_sep(), needs $env{'form.upfiletype'} |
Separate a record into fields $record should be an item from the upfile_record_sep(), needs $env{'form.upfiletype'} |
|
|
Line 6503 sub record_sep {
|
Line 9509 sub record_sep {
|
|
|
=pod |
=pod |
|
|
=item * upfile_select_html() |
=item * &upfile_select_html() |
|
|
Return HTML code to select a file from the users machine and specify |
Return HTML code to select a file from the users machine and specify |
the file type. |
the file type. |
Line 6521 sub upfile_select_html {
|
Line 9527 sub upfile_select_html {
|
# xml => &mt('HTML/XML'), |
# xml => &mt('HTML/XML'), |
); |
); |
my $Str = '<input type="file" name="upfile" size="50" />'. |
my $Str = '<input type="file" name="upfile" size="50" />'. |
'<br />Type: <select name="upfiletype">'; |
'<br />'.&mt('Type').': <select name="upfiletype">'; |
foreach my $type (sort(keys(%Types))) { |
foreach my $type (sort(keys(%Types))) { |
$Str .= '<option value="'.$type.'" >'.$Types{$type}."</option>\n"; |
$Str .= '<option value="'.$type.'" >'.$Types{$type}."</option>\n"; |
} |
} |
Line 6550 sub get_samples {
|
Line 9556 sub get_samples {
|
|
|
=pod |
=pod |
|
|
=item * csv_print_samples($r,$records) |
=item * &csv_print_samples($r,$records) |
|
|
Prints a table of sample values from each column uploaded $r is an |
Prints a table of sample values from each column uploaded $r is an |
Apache Request ref, $records is an arrayref from |
Apache Request ref, $records is an arrayref from |
Line 6562 Apache Request ref, $records is an array
|
Line 9568 Apache Request ref, $records is an array
|
###################################################### |
###################################################### |
sub csv_print_samples { |
sub csv_print_samples { |
my ($r,$records) = @_; |
my ($r,$records) = @_; |
my $samples = &get_samples($records,3); |
my $samples = &get_samples($records,5); |
|
|
$r->print(&mt('Samples').'<br /><table border="2"><tr>'); |
$r->print(&mt('Samples').'<br />'.&start_data_table(). |
|
&start_data_table_header_row()); |
foreach my $sample (sort({$a <=> $b} keys(%{ $samples->[0] }))) { |
foreach my $sample (sort({$a <=> $b} keys(%{ $samples->[0] }))) { |
$r->print('<th>'.&mt('Column [_1]',($sample+1)).'</th>'); } |
$r->print('<th>'.&mt('Column [_1]',($sample+1)).'</th>'); } |
$r->print('</tr>'); |
$r->print(&end_data_table_header_row()); |
foreach my $hash (@$samples) { |
foreach my $hash (@$samples) { |
$r->print('<tr>'); |
$r->print(&start_data_table_row()); |
foreach my $sample (sort({$a <=> $b} keys(%{ $samples->[0] }))) { |
foreach my $sample (sort({$a <=> $b} keys(%{ $samples->[0] }))) { |
$r->print('<td>'); |
$r->print('<td>'); |
if (defined($$hash{$sample})) { $r->print($$hash{$sample}); } |
if (defined($$hash{$sample})) { $r->print($$hash{$sample}); } |
$r->print('</td>'); |
$r->print('</td>'); |
} |
} |
$r->print('</tr>'); |
$r->print(&end_data_table_row()); |
} |
} |
$r->print('</tr></table><br />'."\n"); |
$r->print(&end_data_table().'<br />'."\n"); |
} |
} |
|
|
###################################################### |
###################################################### |
Line 6585 sub csv_print_samples {
|
Line 9592 sub csv_print_samples {
|
|
|
=pod |
=pod |
|
|
=item * csv_print_select_table($r,$records,$d) |
=item * &csv_print_select_table($r,$records,$d) |
|
|
Prints a table to create associations between values and table columns. |
Prints a table to create associations between values and table columns. |
|
|
Line 6602 sub csv_print_select_table {
|
Line 9609 sub csv_print_select_table {
|
my $i=0; |
my $i=0; |
my $samples = &get_samples($records,1); |
my $samples = &get_samples($records,1); |
$r->print(&mt('Associate columns with student attributes.')."\n". |
$r->print(&mt('Associate columns with student attributes.')."\n". |
'<table border="2"><tr>'. |
&start_data_table().&start_data_table_header_row(). |
'<th>'.&mt('Attribute').'</th>'. |
'<th>'.&mt('Attribute').'</th>'. |
'<th>'.&mt('Column').'</th></tr>'."\n"); |
'<th>'.&mt('Column').'</th>'. |
|
&end_data_table_header_row()."\n"); |
foreach my $array_ref (@$d) { |
foreach my $array_ref (@$d) { |
my ($value,$display,$defaultcol)=@{ $array_ref }; |
my ($value,$display,$defaultcol)=@{ $array_ref }; |
$r->print('<tr><td>'.$display.'</td>'); |
$r->print(&start_data_table_row().'<td>'.$display.'</td>'); |
|
|
$r->print('<td><select name=f'.$i. |
$r->print('<td><select name="f'.$i.'"'. |
' onchange="javascript:flip(this.form,'.$i.');">'); |
' onchange="javascript:flip(this.form,'.$i.');">'); |
$r->print('<option value="none"></option>'); |
$r->print('<option value="none"></option>'); |
foreach my $sample (sort({$a <=> $b} keys(%{ $samples->[0] }))) { |
foreach my $sample (sort({$a <=> $b} keys(%{ $samples->[0] }))) { |
$r->print('<option value="'.$sample.'"'. |
$r->print('<option value="'.$sample.'"'. |
($sample eq $defaultcol ? ' selected="selected" ' : ''). |
($sample eq $defaultcol ? ' selected="selected" ' : ''). |
'>Column '.($sample+1).'</option>'); |
'>'.&mt('Column [_1]',($sample+1)).'</option>'); |
} |
} |
$r->print('</select></td></tr>'."\n"); |
$r->print('</select></td>'.&end_data_table_row()."\n"); |
$i++; |
$i++; |
} |
} |
|
$r->print(&end_data_table()); |
$i--; |
$i--; |
return $i; |
return $i; |
} |
} |
Line 6629 sub csv_print_select_table {
|
Line 9638 sub csv_print_select_table {
|
|
|
=pod |
=pod |
|
|
=item * csv_samples_select_table($r,$records,$d) |
=item * &csv_samples_select_table($r,$records,$d) |
|
|
Prints a table of sample values from the upload and can make associate samples to internal names. |
Prints a table of sample values from the upload and can make associate samples to internal names. |
|
|
Line 6645 sub csv_samples_select_table {
|
Line 9654 sub csv_samples_select_table {
|
my ($r,$records,$d) = @_; |
my ($r,$records,$d) = @_; |
my $i=0; |
my $i=0; |
# |
# |
my $samples = &get_samples($records,3); |
my $max_samples = 5; |
$r->print('<table border=2><tr><th>'. |
my $samples = &get_samples($records,$max_samples); |
&mt('Field').'</th><th>'.&mt('Samples').'</th></tr>'); |
$r->print(&start_data_table(). |
|
&start_data_table_header_row().'<th>'. |
|
&mt('Field').'</th><th>'.&mt('Samples').'</th>'. |
|
&end_data_table_header_row()); |
|
|
foreach my $key (sort(keys(%{ $samples->[0] }))) { |
foreach my $key (sort(keys(%{ $samples->[0] }))) { |
$r->print('<tr><td><select name="f'.$i.'"'. |
$r->print(&start_data_table_row().'<td><select name="f'.$i.'"'. |
' onchange="javascript:flip(this.form,'.$i.');">'); |
' onchange="javascript:flip(this.form,'.$i.');">'); |
foreach my $option (@$d) { |
foreach my $option (@$d) { |
my ($value,$display,$defaultcol)=@{ $option }; |
my ($value,$display,$defaultcol)=@{ $option }; |
Line 6659 sub csv_samples_select_table {
|
Line 9671 sub csv_samples_select_table {
|
$display.'</option>'); |
$display.'</option>'); |
} |
} |
$r->print('</select></td><td>'); |
$r->print('</select></td><td>'); |
foreach my $line (0..2) { |
foreach my $line (0..($max_samples-1)) { |
if (defined($samples->[$line]{$key})) { |
if (defined($samples->[$line]{$key})) { |
$r->print($samples->[$line]{$key}."<br />\n"); |
$r->print($samples->[$line]{$key}."<br />\n"); |
} |
} |
} |
} |
$r->print('</td></tr>'); |
$r->print('</td>'.&end_data_table_row()); |
$i++; |
$i++; |
} |
} |
|
$r->print(&end_data_table()); |
$i--; |
$i--; |
return($i); |
return($i); |
} |
} |
Line 6676 sub csv_samples_select_table {
|
Line 9689 sub csv_samples_select_table {
|
|
|
=pod |
=pod |
|
|
=item clean_excel_name($name) |
=item * &clean_excel_name($name) |
|
|
Returns a replacement for $name which does not contain any illegal characters. |
Returns a replacement for $name which does not contain any illegal characters. |
|
|
Line 6695 sub clean_excel_name {
|
Line 9708 sub clean_excel_name {
|
|
|
=pod |
=pod |
|
|
=item * check_if_partid_hidden($id,$symb,$udom,$uname) |
=item * &check_if_partid_hidden($id,$symb,$udom,$uname) |
|
|
Returns either 1 or undef |
Returns either 1 or undef |
|
|
Line 6736 sub check_if_partid_hidden {
|
Line 9749 sub check_if_partid_hidden {
|
|
|
=over 4 |
=over 4 |
|
|
=item get_cgi_id |
=item * &get_cgi_id() |
|
|
Inputs: none |
Inputs: none |
|
|
Line 6760 sub get_cgi_id {
|
Line 9773 sub get_cgi_id {
|
|
|
=pod |
=pod |
|
|
=item DrawBarGraph |
=item * &DrawBarGraph() |
|
|
Facilitates the plotting of data in a (stacked) bar graph. |
Facilitates the plotting of data in a (stacked) bar graph. |
Puts plot definition data into the users environment in order for |
Puts plot definition data into the users environment in order for |
Line 6895 sub DrawBarGraph {
|
Line 9908 sub DrawBarGraph {
|
$ValuesHash{$id.'.'.$key} = $value; |
$ValuesHash{$id.'.'.$key} = $value; |
} |
} |
# |
# |
&Apache::lonnet::appenv(%ValuesHash); |
&Apache::lonnet::appenv(\%ValuesHash); |
return '<img src="/cgi-bin/graph.png?'.$identifier.'" border="1" />'; |
return '<img src="/cgi-bin/graph.png?'.$identifier.'" border="1" />'; |
} |
} |
|
|
Line 6904 sub DrawBarGraph {
|
Line 9917 sub DrawBarGraph {
|
|
|
=pod |
=pod |
|
|
=item DrawXYGraph |
=item * &DrawXYGraph() |
|
|
Facilitates the plotting of data in an XY graph. |
Facilitates the plotting of data in an XY graph. |
Puts plot definition data into the users environment in order for |
Puts plot definition data into the users environment in order for |
Line 6985 sub DrawXYGraph {
|
Line 9998 sub DrawXYGraph {
|
$ValuesHash{$id.'.'.$key} = $value; |
$ValuesHash{$id.'.'.$key} = $value; |
} |
} |
# |
# |
&Apache::lonnet::appenv(%ValuesHash); |
&Apache::lonnet::appenv(\%ValuesHash); |
return '<img src="/cgi-bin/graph.png?'.$identifier.'" border="1" />'; |
return '<img src="/cgi-bin/graph.png?'.$identifier.'" border="1" />'; |
} |
} |
|
|
Line 6994 sub DrawXYGraph {
|
Line 10007 sub DrawXYGraph {
|
|
|
=pod |
=pod |
|
|
=item DrawXYYGraph |
=item * &DrawXYYGraph() |
|
|
Facilitates the plotting of data in an XY graph with two Y axes. |
Facilitates the plotting of data in an XY graph with two Y axes. |
Puts plot definition data into the users environment in order for |
Puts plot definition data into the users environment in order for |
Line 7087 sub DrawXYYGraph {
|
Line 10100 sub DrawXYYGraph {
|
$ValuesHash{$id.'.'.$key} = $value; |
$ValuesHash{$id.'.'.$key} = $value; |
} |
} |
# |
# |
&Apache::lonnet::appenv(%ValuesHash); |
&Apache::lonnet::appenv(\%ValuesHash); |
return '<img src="/cgi-bin/graph.png?'.$identifier.'" border="1" />'; |
return '<img src="/cgi-bin/graph.png?'.$identifier.'" border="1" />'; |
} |
} |
|
|
Line 7104 Bad place for them but what the hell.
|
Line 10117 Bad place for them but what the hell.
|
|
|
=over 4 |
=over 4 |
|
|
=item &chartlink |
=item * &chartlink() |
|
|
Returns a link to the chart for a specific student. |
Returns a link to the chart for a specific student. |
|
|
Line 7143 sub chartlink {
|
Line 10156 sub chartlink {
|
|
|
=over 4 |
=over 4 |
|
|
=item &restore_course_settings |
=item * &restore_course_settings() |
|
|
=item &store_course_settings |
=item * &store_course_settings() |
|
|
Restores/Store indicated form parameters from the course environment. |
Restores/Store indicated form parameters from the course environment. |
Will not overwrite existing values of the form parameters. |
Will not overwrite existing values of the form parameters. |
Line 7165 a hash ref describing the data to be sto
|
Line 10178 a hash ref describing the data to be sto
|
|
|
Returns: both routines return nothing |
Returns: both routines return nothing |
|
|
|
=back |
|
|
=cut |
=cut |
|
|
####################################################### |
####################################################### |
Line 7217 sub store_settings {
|
Line 10232 sub store_settings {
|
'got error:'.$put_result); |
'got error:'.$put_result); |
} |
} |
# Make sure these settings stick around in this session, too |
# Make sure these settings stick around in this session, too |
&Apache::lonnet::appenv(%AppHash); |
&Apache::lonnet::appenv(\%AppHash); |
return; |
return; |
} |
} |
|
|
Line 7245 sub restore_settings {
|
Line 10260 sub restore_settings {
|
} |
} |
} |
} |
|
|
|
####################################################### |
|
####################################################### |
|
|
|
=pod |
|
|
|
=head1 Domain E-mail Routines |
|
|
|
=over 4 |
|
|
|
=item * &build_recipient_list() |
|
|
|
Build recipient lists for five types of e-mail: |
|
(a) Error Reports, (b) Package Updates, (c) lonstatus warnings/errors |
|
(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), |
|
mailing type (scalar - errormail, packagesmail, or helpdeskmail), |
|
defdom (domain for which to retrieve configuration settings), |
|
origmail (scalar - email address of recipient from loncapa.conf, |
|
i.e., predates configuration by DC via domainprefs.pm |
|
|
|
Returns: comma separated list of addresses to which to send e-mail. |
|
|
|
=back |
|
|
|
=cut |
|
|
############################################################ |
############################################################ |
############################################################ |
############################################################ |
|
sub build_recipient_list { |
|
my ($defmail,$mailing,$defdom,$origmail) = @_; |
|
my @recipients; |
|
my $otheremails; |
|
my %domconfig = |
|
&Apache::lonnet::get_dom('configuration',['contacts'],$defdom); |
|
if (ref($domconfig{'contacts'}) eq 'HASH') { |
|
if (exists($domconfig{'contacts'}{$mailing})) { |
|
if (ref($domconfig{'contacts'}{$mailing}) eq 'HASH') { |
|
my @contacts = ('adminemail','supportemail'); |
|
foreach my $item (@contacts) { |
|
if ($domconfig{'contacts'}{$mailing}{$item}) { |
|
my $addr = $domconfig{'contacts'}{$item}; |
|
if (!grep(/^\Q$addr\E$/,@recipients)) { |
|
push(@recipients,$addr); |
|
} |
|
} |
|
$otheremails = $domconfig{'contacts'}{$mailing}{'others'}; |
|
} |
|
} |
|
} elsif ($origmail ne '') { |
|
push(@recipients,$origmail); |
|
} |
|
} elsif ($origmail ne '') { |
|
push(@recipients,$origmail); |
|
} |
|
if (defined($defmail)) { |
|
if ($defmail ne '') { |
|
push(@recipients,$defmail); |
|
} |
|
} |
|
if ($otheremails) { |
|
my @others; |
|
if ($otheremails =~ /,/) { |
|
@others = split(/,/,$otheremails); |
|
} else { |
|
push(@others,$otheremails); |
|
} |
|
foreach my $addr (@others) { |
|
if (!grep(/^\Q$addr\E$/,@recipients)) { |
|
push(@recipients,$addr); |
|
} |
|
} |
|
} |
|
my $recipientlist = join(',',@recipients); |
|
return $recipientlist; |
|
} |
|
|
|
############################################################ |
|
############################################################ |
|
|
|
=pod |
|
|
|
=head1 Course Catalog Routines |
|
|
|
=over 4 |
|
|
|
=item * &gather_categories() |
|
|
|
Converts category definitions - keys of categories hash stored in |
|
coursecategories in configuration.db on the primary library server in a |
|
domain - to an array. Also generates javascript and idx hash used to |
|
generate Domain Coordinator interface for editing Course Categories. |
|
|
|
Inputs: |
|
|
|
categories (reference to hash of category definitions). |
|
|
|
cats (reference to array of arrays/hashes which encapsulates hierarchy of |
|
categories and subcategories). |
|
|
|
idx (reference to hash of counters used in Domain Coordinator interface for |
|
editing Course Categories). |
|
|
|
jsarray (reference to array of categories used to create Javascript arrays for |
|
Domain Coordinator interface for editing Course Categories). |
|
|
|
Returns: nothing |
|
|
|
Side effects: populates cats, idx and jsarray. |
|
|
|
=cut |
|
|
|
sub gather_categories { |
|
my ($categories,$cats,$idx,$jsarray) = @_; |
|
my %counters; |
|
my $num = 0; |
|
foreach my $item (keys(%{$categories})) { |
|
my ($cat,$container,$depth) = map { &unescape($_); } split(/:/,$item); |
|
if ($container eq '' && $depth == 0) { |
|
$cats->[$depth][$categories->{$item}] = $cat; |
|
} else { |
|
$cats->[$depth]{$container}[$categories->{$item}] = $cat; |
|
} |
|
my ($escitem,$tail) = split(/:/,$item,2); |
|
if ($counters{$tail} eq '') { |
|
$counters{$tail} = $num; |
|
$num ++; |
|
} |
|
if (ref($idx) eq 'HASH') { |
|
$idx->{$item} = $counters{$tail}; |
|
} |
|
if (ref($jsarray) eq 'ARRAY') { |
|
push(@{$jsarray->[$counters{$tail}]},$item); |
|
} |
|
} |
|
return; |
|
} |
|
|
|
=pod |
|
|
|
=item * &extract_categories() |
|
|
|
Used to generate breadcrumb trails for course categories. |
|
|
|
Inputs: |
|
|
|
categories (reference to hash of category definitions). |
|
|
|
cats (reference to array of arrays/hashes which encapsulates hierarchy of |
|
categories and subcategories). |
|
|
|
trails (reference to array of breacrumb trails for each category). |
|
|
|
allitems (reference to hash - key is category key |
|
(format: escaped(name):escaped(parent category):depth in hierarchy). |
|
|
|
idx (reference to hash of counters used in Domain Coordinator interface for |
|
editing Course Categories). |
|
|
|
jsarray (reference to array of categories used to create Javascript arrays for |
|
Domain Coordinator interface for editing Course Categories). |
|
|
|
subcats (reference to hash of arrays containing all subcategories within each |
|
category, -recursive) |
|
|
|
Returns: nothing |
|
|
|
Side effects: populates trails and allitems hash references. |
|
|
|
=cut |
|
|
|
sub extract_categories { |
|
my ($categories,$cats,$trails,$allitems,$idx,$jsarray,$subcats) = @_; |
|
if (ref($categories) eq 'HASH') { |
|
&gather_categories($categories,$cats,$idx,$jsarray); |
|
if (ref($cats->[0]) eq 'ARRAY') { |
|
for (my $i=0; $i<@{$cats->[0]}; $i++) { |
|
my $name = $cats->[0][$i]; |
|
my $item = &escape($name).'::0'; |
|
my $trailstr; |
|
if ($name eq 'instcode') { |
|
$trailstr = &mt('Official courses (with institutional codes)'); |
|
} elsif ($name eq 'communities') { |
|
$trailstr = &mt('Communities'); |
|
} else { |
|
$trailstr = $name; |
|
} |
|
if ($allitems->{$item} eq '') { |
|
push(@{$trails},$trailstr); |
|
$allitems->{$item} = scalar(@{$trails})-1; |
|
} |
|
my @parents = ($name); |
|
if (ref($cats->[1]{$name}) eq 'ARRAY') { |
|
for (my $j=0; $j<@{$cats->[1]{$name}}; $j++) { |
|
my $category = $cats->[1]{$name}[$j]; |
|
if (ref($subcats) eq 'HASH') { |
|
push(@{$subcats->{$item}},&escape($category).':'.&escape($name).':1'); |
|
} |
|
&recurse_categories($cats,2,$category,$trails,$allitems,\@parents,$subcats); |
|
} |
|
} else { |
|
if (ref($subcats) eq 'HASH') { |
|
$subcats->{$item} = []; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
return; |
|
} |
|
|
|
=pod |
|
|
|
=item *&recurse_categories() |
|
|
|
Recursively used to generate breadcrumb trails for course categories. |
|
|
|
Inputs: |
|
|
|
cats (reference to array of arrays/hashes which encapsulates hierarchy of |
|
categories and subcategories). |
|
|
|
depth (current depth in hierarchy of categories and sub-categories - 0 indexed). |
|
|
|
category (current course category, for which breadcrumb trail is being generated). |
|
|
|
trails (reference to array of breadcrumb trails for each category). |
|
|
|
allitems (reference to hash - key is category key |
|
(format: escaped(name):escaped(parent category):depth in hierarchy). |
|
|
|
parents (array containing containers directories for current category, |
|
back to top level). |
|
|
|
Returns: nothing |
|
|
|
Side effects: populates trails and allitems hash references |
|
|
|
=cut |
|
|
|
sub recurse_categories { |
|
my ($cats,$depth,$category,$trails,$allitems,$parents,$subcats) = @_; |
|
my $shallower = $depth - 1; |
|
if (ref($cats->[$depth]{$category}) eq 'ARRAY') { |
|
for (my $k=0; $k<@{$cats->[$depth]{$category}}; $k++) { |
|
my $name = $cats->[$depth]{$category}[$k]; |
|
my $item = &escape($category).':'.&escape($parents->[-1]).':'.$shallower; |
|
my $trailstr = join(' -> ',(@{$parents},$category)); |
|
if ($allitems->{$item} eq '') { |
|
push(@{$trails},$trailstr); |
|
$allitems->{$item} = scalar(@{$trails})-1; |
|
} |
|
my $deeper = $depth+1; |
|
push(@{$parents},$category); |
|
if (ref($subcats) eq 'HASH') { |
|
my $subcat = &escape($name).':'.$category.':'.$depth; |
|
for (my $j=@{$parents}; $j>=0; $j--) { |
|
my $higher; |
|
if ($j > 0) { |
|
$higher = &escape($parents->[$j]).':'. |
|
&escape($parents->[$j-1]).':'.$j; |
|
} else { |
|
$higher = &escape($parents->[$j]).'::'.$j; |
|
} |
|
push(@{$subcats->{$higher}},$subcat); |
|
} |
|
} |
|
&recurse_categories($cats,$deeper,$name,$trails,$allitems,$parents, |
|
$subcats); |
|
pop(@{$parents}); |
|
} |
|
} else { |
|
my $item = &escape($category).':'.&escape($parents->[-1]).':'.$shallower; |
|
my $trailstr = join(' -> ',(@{$parents},$category)); |
|
if ($allitems->{$item} eq '') { |
|
push(@{$trails},$trailstr); |
|
$allitems->{$item} = scalar(@{$trails})-1; |
|
} |
|
} |
|
return; |
|
} |
|
|
|
=pod |
|
|
|
=item *&assign_categories_table() |
|
|
|
Create a datatable for display of hierarchical categories in a domain, |
|
with checkboxes to allow a course to be categorized. |
|
|
|
Inputs: |
|
|
|
cathash - reference to hash of categories defined for the domain (from |
|
configuration.db) |
|
|
|
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,$type) = @_; |
|
my $output; |
|
if (ref($cathash) eq 'HASH') { |
|
my (@cats,@trails,%allitems,%idx,@jsarray,@path,$maxdepth); |
|
&extract_categories($cathash,\@cats,\@trails,\%allitems,\%idx,\@jsarray); |
|
$maxdepth = scalar(@cats); |
|
if (@cats > 0) { |
|
my $itemcount = 0; |
|
if (ref($cats[0]) eq 'ARRAY') { |
|
my @currcategories; |
|
if ($currcat ne '') { |
|
@currcategories = split('&',$currcat); |
|
} |
|
my $table; |
|
for (my $i=0; $i<@{$cats[0]}; $i++) { |
|
my $parent = $cats[0][$i]; |
|
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) { |
|
if (grep(/^\Q$item\E$/,@currcategories)) { |
|
$checked = ' checked="checked"'; |
|
} |
|
} |
|
my $parent_title = $parent; |
|
if ($parent eq 'communities') { |
|
$parent_title = &mt('Communities'); |
|
} |
|
$table .= '<tr '.$css_class.'><td><span class="LC_nobreak">'. |
|
'<input type="checkbox" name="usecategory" value="'. |
|
$item.'"'.$checked.' />'.$parent_title.'</span>'. |
|
'<input type="hidden" name="catname" value="'.$parent.'" /></td>'; |
|
my $depth = 1; |
|
push(@path,$parent); |
|
$table .= &assign_category_rows($itemcount,\@cats,$depth,$parent,\@path,\@currcategories); |
|
pop(@path); |
|
$table .= '</tr><tr><td colspan="'.$maxdepth.'" class="LC_row_separator"></td></tr>'; |
|
$itemcount ++; |
|
} |
|
if ($itemcount) { |
|
$output = &Apache::loncommon::start_data_table(). |
|
$table. |
|
&Apache::loncommon::end_data_table(); |
|
} |
|
} |
|
} |
|
} |
|
return $output; |
|
} |
|
|
|
=pod |
|
|
|
=item *&assign_category_rows() |
|
|
|
Create a datatable row for display of nested categories in a domain, |
|
with checkboxes to allow a course to be categorized,called recursively. |
|
|
|
Inputs: |
|
|
|
itemcount - track row number for alternating colors |
|
|
|
cats - reference to array of arrays/hashes which encapsulates hierarchy of |
|
categories and subcategories. |
|
|
|
depth - current depth in hierarchy of categories and sub-categories - 0 indexed. |
|
|
|
parent - parent of current category item |
|
|
|
path - Array containing all categories back up through the hierarchy from the |
|
current category to the top level. |
|
|
|
currcategories - reference to array of current categories assigned to the course |
|
|
|
Returns: $output (markup to be displayed). |
|
|
|
=cut |
|
|
|
sub assign_category_rows { |
|
my ($itemcount,$cats,$depth,$parent,$path,$currcategories) = @_; |
|
my ($text,$name,$item,$chgstr); |
|
if (ref($cats) eq 'ARRAY') { |
|
my $maxdepth = scalar(@{$cats}); |
|
if (ref($cats->[$depth]) eq 'HASH') { |
|
if (ref($cats->[$depth]{$parent}) eq 'ARRAY') { |
|
my $numchildren = @{$cats->[$depth]{$parent}}; |
|
my $css_class = $itemcount%2?' class="LC_odd_row"':''; |
|
$text .= '<td><table class="LC_datatable">'; |
|
for (my $j=0; $j<$numchildren; $j++) { |
|
$name = $cats->[$depth]{$parent}[$j]; |
|
$item = &escape($name).':'.&escape($parent).':'.$depth; |
|
my $deeper = $depth+1; |
|
my $checked = ''; |
|
if (ref($currcategories) eq 'ARRAY') { |
|
if (@{$currcategories} > 0) { |
|
if (grep(/^\Q$item\E$/,@{$currcategories})) { |
|
$checked = ' checked="checked"'; |
|
} |
|
} |
|
} |
|
$text .= '<tr><td><span class="LC_nobreak"><label>'. |
|
'<input type="checkbox" name="usecategory" value="'. |
|
$item.'"'.$checked.' />'.$name.'</label></span>'. |
|
'<input type="hidden" name="catname" value="'.$name.'" />'. |
|
'</td><td>'; |
|
if (ref($path) eq 'ARRAY') { |
|
push(@{$path},$name); |
|
$text .= &assign_category_rows($itemcount,$cats,$deeper,$name,$path,$currcategories); |
|
pop(@{$path}); |
|
} |
|
$text .= '</td></tr>'; |
|
} |
|
$text .= '</table></td>'; |
|
} |
|
} |
|
} |
|
return $text; |
|
} |
|
|
|
############################################################ |
|
############################################################ |
|
|
|
|
sub commit_customrole { |
sub commit_customrole { |
my ($udom,$uname,$url,$three,$four,$five,$start,$end) = @_; |
my ($udom,$uname,$url,$three,$four,$five,$start,$end,$context) = @_; |
my $output = &mt('Assigning custom role').' "'.$five.'" by '.$four.'@'.$three.' in '.$url. |
my $output = &mt('Assigning custom role').' "'.$five.'" by '.$four.':'.$three.' in '.$url. |
($start?', '.&mt('starting').' '.localtime($start):''). |
($start?', '.&mt('starting').' '.localtime($start):''). |
($end?', ending '.localtime($end):'').': <b>'. |
($end?', ending '.localtime($end):'').': <b>'. |
&Apache::lonnet::assigncustomrole( |
&Apache::lonnet::assigncustomrole( |
$udom,$uname,$url,$three,$four,$five,$end,$start). |
$udom,$uname,$url,$three,$four,$five,$end,$start,undef,undef,$context). |
'</b><br />'; |
'</b><br />'; |
return $output; |
return $output; |
} |
} |
Line 7271 sub commit_standardrole {
|
Line 10717 sub commit_standardrole {
|
my $result = &commit_studentrole(\$logmsg,$udom,$uname,$url,$three,$start,$end, |
my $result = &commit_studentrole(\$logmsg,$udom,$uname,$url,$three,$start,$end, |
$one,$two,$sec,$context); |
$one,$two,$sec,$context); |
if (($result =~ /^error/) || ($result eq 'not_in_class') || |
if (($result =~ /^error/) || ($result eq 'not_in_class') || |
($result eq 'unknown_course')) { |
($result eq 'unknown_course') || ($result eq 'refused')) { |
$output = "Error: $result\n"; |
$output = $logmsg.' '.&mt('Error: ').$result."\n"; |
} else { |
} else { |
$output = $logmsg.$linefeed.&mt('Assigning').' '.$three.' in '.$url. |
$output = $logmsg.$linefeed.&mt('Assigning').' '.$three.' in '.$url. |
($start?', '.&mt('starting').' '.localtime($start):''). |
($start?', '.&mt('starting').' '.localtime($start):''). |
Line 7289 sub commit_standardrole {
|
Line 10735 sub commit_standardrole {
|
$output = &mt('Assigning').' '.$three.' in '.$url. |
$output = &mt('Assigning').' '.$three.' in '.$url. |
($start?', '.&mt('starting').' '.localtime($start):''). |
($start?', '.&mt('starting').' '.localtime($start):''). |
($end?', '.&mt('ending').' '.localtime($end):'').': '; |
($end?', '.&mt('ending').' '.localtime($end):'').': '; |
my $result = &Apache::lonnet::assignrole($udom,$uname,$url,$three,$end,$start); |
my $result = &Apache::lonnet::assignrole($udom,$uname,$url,$three,$end,$start,'','',$context); |
if ($context eq 'auto') { |
if ($context eq 'auto') { |
$output .= $result.$linefeed; |
$output .= $result.$linefeed; |
} else { |
} else { |
Line 7301 sub commit_standardrole {
|
Line 10747 sub commit_standardrole {
|
|
|
sub commit_studentrole { |
sub commit_studentrole { |
my ($logmsg,$udom,$uname,$url,$three,$start,$end,$one,$two,$sec,$context) = @_; |
my ($logmsg,$udom,$uname,$url,$three,$start,$end,$one,$two,$sec,$context) = @_; |
my ($result,$linefeed); |
my ($result,$linefeed,$oldsecurl,$newsecurl); |
if ($context eq 'auto') { |
if ($context eq 'auto') { |
$linefeed = "\n"; |
$linefeed = "\n"; |
} else { |
} else { |
Line 7313 sub commit_studentrole {
|
Line 10759 sub commit_studentrole {
|
my $secchange = 0; |
my $secchange = 0; |
my $expire_role_result; |
my $expire_role_result; |
my $modify_section_result; |
my $modify_section_result; |
unless ($oldsec eq '-1') { |
if ($oldsec ne '-1') { |
unless ($sec eq $oldsec) { |
if ($oldsec ne $sec) { |
$secchange = 1; |
$secchange = 1; |
|
my $now = time; |
my $uurl='/'.$cid; |
my $uurl='/'.$cid; |
$uurl=~s/\_/\//g; |
$uurl=~s/\_/\//g; |
if ($oldsec) { |
if ($oldsec) { |
$uurl.='/'.$oldsec; |
$uurl.='/'.$oldsec; |
} |
} |
$expire_role_result = &Apache::lonnet::assignrole($udom,$uname,$uurl,'st',time); |
$oldsecurl = $uurl; |
|
$expire_role_result = |
|
&Apache::lonnet::assignrole($udom,$uname,$uurl,'st',$now,'','',$context); |
|
if ($env{'request.course.sec'} ne '') { |
|
if ($expire_role_result eq 'refused') { |
|
my @roles = ('st'); |
|
my @statuses = ('previous'); |
|
my @roledoms = ($one); |
|
my $withsec = 1; |
|
my %roleshash = |
|
&Apache::lonnet::get_my_roles($uname,$udom,'userroles', |
|
\@statuses,\@roles,\@roledoms,$withsec); |
|
if (defined ($roleshash{$two.':'.$one.':st:'.$oldsec})) { |
|
my ($oldstart,$oldend) = |
|
split(':',$roleshash{$two.':'.$one.':st:'.$oldsec}); |
|
if ($oldend > 0 && $oldend <= $now) { |
|
$expire_role_result = 'ok'; |
|
} |
|
} |
|
} |
|
} |
$result = $expire_role_result; |
$result = $expire_role_result; |
} |
} |
} |
} |
if (($expire_role_result eq 'ok') || ($secchange == 0)) { |
if (($expire_role_result eq 'ok') || ($secchange == 0)) { |
$modify_section_result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,'','',$cid); |
$modify_section_result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,'','',$cid,'',$context); |
if ($modify_section_result =~ /^ok/) { |
if ($modify_section_result =~ /^ok/) { |
if ($secchange == 1) { |
if ($secchange == 1) { |
$$logmsg .= "Section for $uname switched from old section: $oldsec to new section: $sec".$linefeed; |
if ($sec eq '') { |
|
$$logmsg .= &mt('Section for [_1] switched from (possibly expired) old section: [_2] to student role without a section.',$uname,$oldsec).$linefeed; |
|
} else { |
|
$$logmsg .= &mt('Section for [_1] switched from (possibly expired) old section: [_2] to new section: [_3].',$uname,$oldsec,$sec).$linefeed; |
|
} |
} elsif ($oldsec eq '-1') { |
} elsif ($oldsec eq '-1') { |
$$logmsg .= "New student role for $uname in section $sec in course $cid".$linefeed; |
if ($sec eq '') { |
|
$$logmsg .= &mt('New student role without a section for [_1] in course [_2].',$uname,$cid).$linefeed; |
|
} else { |
|
$$logmsg .= &mt('New student role for [_1] in section [_2] in course [_3].',$uname,$sec,$cid).$linefeed; |
|
} |
} else { |
} else { |
$$logmsg .= "Student $uname assigned to unchanged section $sec in course $cid".$linefeed; |
if ($sec eq '') { |
|
$$logmsg .= &mt('Student [_1] assigned to course [_2] without a section.',$uname,$cid).$linefeed; |
|
} else { |
|
$$logmsg .= &mt('Student [_1] assigned to section [_2] in course [_3].',$uname,$sec,$cid).$linefeed; |
|
} |
} |
} |
} else { |
} else { |
$$logmsg .= "Error when attempting section change for $uname from old section $oldsec to new section: $sec in course $cid -error: $modify_section_result".$linefeed; |
if ($secchange) { |
|
$$logmsg .= &mt('Error when attempting section change for [_1] from old section "[_2]" to new section: "[_3]" in course [_4] -error:',$uname,$oldsec,$sec,$cid).' '.$modify_section_result.$linefeed; |
|
} else { |
|
$$logmsg .= &mt('Error when attempting to modify role for [_1] for section: "[_2]" in course [_3] -error:',$uname,$sec,$cid).' '.$modify_section_result.$linefeed; |
|
} |
} |
} |
$result = $modify_section_result; |
$result = $modify_section_result; |
} elsif ($secchange == 1) { |
} elsif ($secchange == 1) { |
$$logmsg .= "Error when attempting to expire role for $uname in old section $oldsec in course $cid -error: $expire_role_result".$linefeed; |
if ($oldsec eq '') { |
|
$$logmsg .= &mt('Error when attempting to expire existing role without a section for [_1] in course [_3] -error: ',$uname,$cid).' '.$expire_role_result.$linefeed; |
|
} else { |
|
$$logmsg .= &mt('Error when attempting to expire existing role for [_1] in section [_2] in course [_3] -error: ',$uname,$oldsec,$cid).' '.$expire_role_result.$linefeed; |
|
} |
|
if ($expire_role_result eq 'refused') { |
|
my $newsecurl = '/'.$cid; |
|
$newsecurl =~ s/\_/\//g; |
|
if ($sec ne '') { |
|
$newsecurl.='/'.$sec; |
|
} |
|
if (&Apache::lonnet::allowed('cst',$newsecurl) && !(&Apache::lonnet::allowed('cst',$oldsecurl))) { |
|
if ($sec eq '') { |
|
$$logmsg .= &mt('Although your current role has privileges to add students to section "[_1]", you do not have privileges to modify existing enrollments unaffiliated with any section.',$sec).$linefeed; |
|
} else { |
|
$$logmsg .= &mt('Although your current role has privileges to add students to section "[_1]", you do not have privileges to modify existing enrollments in other sections.',$sec).$linefeed; |
|
} |
|
} |
|
} |
} |
} |
} else { |
} else { |
$$logmsg .= "Incomplete course id defined. Addition of user $uname from domain $udom to course $one\_$two, section $sec not completed.$linefeed"; |
$$logmsg .= &mt('Incomplete course id defined.').$linefeed.&mt('Addition of user [_1] from domain [_2] to course [_3], section [_4] not completed.',$uname,$udom,$one.'_'.$two,$sec).$linefeed; |
$result = "error: incomplete course id\n"; |
$result = "error: incomplete course id\n"; |
} |
} |
return $result; |
return $result; |
Line 7359 sub check_clone {
|
Line 10860 sub check_clone {
|
my $clonehome=&Apache::lonnet::homeserver($clonecrsunum,$clonecrsudom); |
my $clonehome=&Apache::lonnet::homeserver($clonecrsunum,$clonecrsudom); |
my $clonemsg; |
my $clonemsg; |
my $can_clone = 0; |
my $can_clone = 0; |
|
my $lctype = lc($args->{'crstype'}); |
|
if ($lctype ne 'community') { |
|
$lctype = 'course'; |
|
} |
if ($clonehome eq 'no_host') { |
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 { |
} else { |
my %clonedesc = &Apache::lonnet::coursedescription($cloneid,{'one_time' => 1}); |
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; |
$can_clone = 1; |
} else { |
} else { |
my %clonehash = &Apache::lonnet::get('environment',['cloners'], |
my %clonehash = &Apache::lonnet::get('environment',['cloners'], |
Line 7375 sub check_clone {
|
Line 10890 sub check_clone {
|
} elsif (grep(/^\*\:\Q$args->{'ccdomain'}\E$/,@cloners)) { |
} elsif (grep(/^\*\:\Q$args->{'ccdomain'}\E$/,@cloners)) { |
$can_clone = 1; |
$can_clone = 1; |
} else { |
} else { |
|
my $ccrole = 'cc'; |
|
if ($args->{'crstype'} eq 'Community') { |
|
$ccrole = 'co'; |
|
} |
my %roleshash = |
my %roleshash = |
&Apache::lonnet::get_my_roles($args->{'ccuname'}, |
&Apache::lonnet::get_my_roles($args->{'ccuname'}, |
$args->{'ccdomain'}, |
$args->{'ccdomain'}, |
'userroles',['active'],['cc'], |
'userroles',['active'],[$ccrole], |
[$args->{'clonedomain'}]); |
[$args->{'clonedomain'}]); |
if (($roleshash{$args->{'clonecourse'}.':'.$args->{'clonedomain'}.':cc'}) || (grep(/^\Q$args->{'ccuname'}\E:\Q$args->{'ccdomain'}\E$/,@cloners))) { |
if (($roleshash{$args->{'clonecourse'}.':'.$args->{'clonedomain'}.':'.$ccrole}) || (grep(/^\Q$args->{'ccuname'}\E:\Q$args->{'ccdomain'}\E$/,@cloners))) { |
$can_clone = 1; |
$can_clone = 1; |
} else { |
} elsif (&Apache::lonnet::is_course_owner($args->{'clonedomain'},$args->{'clonecourse'},$args->{'ccuname'},$args->{'ccdomain'})) { |
$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'}); |
$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'}); |
|
} |
} |
} |
} |
} |
} |
} |
Line 7392 sub check_clone {
|
Line 10917 sub check_clone {
|
} |
} |
|
|
sub construct_course { |
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 $outcome; |
my $linefeed = '<br />'."\n"; |
my $linefeed = '<br />'."\n"; |
if ($context eq 'auto') { |
if ($context eq 'auto') { |
Line 7430 sub construct_course {
|
Line 10955 sub construct_course {
|
$args->{'crscode'}, |
$args->{'crscode'}, |
$args->{'ccuname'}.':'. |
$args->{'ccuname'}.':'. |
$args->{'ccdomain'}, |
$args->{'ccdomain'}, |
$args->{'crstype'}); |
$args->{'crstype'}, |
|
$cnum,$context,$category); |
|
|
# Note: The testing routines depend on this being output; see |
# Note: The testing routines depend on this being output; see |
# Utils::Course. This needs to at least be output as a comment |
# Utils::Course. This needs to at least be output as a comment |
# if anyone ever decides to not show this, and Utils::Course::new |
# if anyone ever decides to not show this, and Utils::Course::new |
# will need to be suitably modified. |
# will need to be suitably modified. |
$outcome .= &mt('New LON-CAPA [_1] ID: [_2]',$crstype,$$courseid).$linefeed; |
$outcome .= &mt('New LON-CAPA [_1] ID: [_2]',$crstype,$$courseid).$linefeed; |
|
if ($$courseid =~ /^error:/) { |
|
return (0,$outcome); |
|
} |
|
|
# |
# |
# Check if created correctly |
# Check if created correctly |
# |
# |
($$crsudom,$$crsunum)= &LONCAPA::split_courseid($$courseid); |
($$crsudom,$$crsunum)= &LONCAPA::split_courseid($$courseid); |
my $crsuhome=&Apache::lonnet::homeserver($$crsunum,$$crsudom); |
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; |
$outcome .= &mt('Created on').': '.$crsuhome.$linefeed; |
|
|
# |
# |
Line 7455 sub construct_course {
|
Line 10989 sub construct_course {
|
$outcome .= $clonemsg.$linefeed; |
$outcome .= $clonemsg.$linefeed; |
my %oldcenv=&Apache::lonnet::dump('environment',$$crsudom,$$crsunum); |
my %oldcenv=&Apache::lonnet::dump('environment',$$crsudom,$$crsunum); |
# Copy all files |
# Copy all files |
&Apache::lonclonecourse::copycoursefiles($cloneid,$$courseid); |
&Apache::lonclonecourse::copycoursefiles($cloneid,$$courseid,$args->{'datemode'},$args->{'dateshift'}); |
# Restore URL |
# Restore URL |
$cenv{'url'}=$oldcenv{'url'}; |
$cenv{'url'}=$oldcenv{'url'}; |
# Restore title |
# Restore title |
$cenv{'description'}=$oldcenv{'description'}; |
$cenv{'description'}=$oldcenv{'description'}; |
# restore grading mode |
# Restore creation date, creator and creation context. |
if (defined($oldcenv{'grading'})) { |
$cenv{'internal.created'}=$oldcenv{'internal.created'}; |
$cenv{'grading'}=$oldcenv{'grading'}; |
$cenv{'internal.creator'}=$oldcenv{'internal.creator'}; |
} |
$cenv{'internal.creationcontext'}=$oldcenv{'internal.creationcontext'}; |
# Mark as cloned |
# Mark as cloned |
$cenv{'clonedfrom'}=$cloneid; |
$cenv{'clonedfrom'}=$cloneid; |
delete($cenv{'default_enrollment_start_date'}); |
# Need to clone grading mode |
delete($cenv{'default_enrollment_end_date'}); |
my %newenv=&Apache::lonnet::get('environment',['grading'],$$crsudom,$$crsunum); |
|
$cenv{'grading'}=$newenv{'grading'}; |
|
# Do not clone these environment entries |
|
&Apache::lonnet::del('environment', |
|
['default_enrollment_start_date', |
|
'default_enrollment_end_date', |
|
'question.email', |
|
'policy.email', |
|
'comment.email', |
|
'pch.users.denied', |
|
'plc.users.denied', |
|
'hidefromcat', |
|
'categories'], |
|
$$crsudom,$$crsunum); |
} |
} |
|
|
# |
# |
Line 7495 sub construct_course {
|
Line 11042 sub construct_course {
|
} else { |
} else { |
$cenv{'internal.courseowner'} = $args->{'curruser'}; |
$cenv{'internal.courseowner'} = $args->{'curruser'}; |
} |
} |
|
|
my @badclasses = (); # Used to accumulate sections/crosslistings that did not pass classlist access check for course owner. |
my @badclasses = (); # Used to accumulate sections/crosslistings that did not pass classlist access check for course owner. |
if ($args->{'crssections'}) { |
if ($args->{'crssections'}) { |
$cenv{'internal.sectionnums'} = ''; |
$cenv{'internal.sectionnums'} = ''; |
Line 7555 sub construct_course {
|
Line 11101 sub construct_course {
|
} |
} |
if ($args->{'notify_dc'}) { |
if ($args->{'notify_dc'}) { |
if ($uname ne '') { |
if ($uname ne '') { |
push(@notified,$uname.'@'.$udom); |
push(@notified,$uname.':'.$udom); |
} |
} |
} |
} |
if (@notified > 0) { |
if (@notified > 0) { |
Line 7695 sub construct_course {
|
Line 11241 sub construct_course {
|
$outcome .= ($fatal?$errtext:'read ok').' - '; |
$outcome .= ($fatal?$errtext:'read ok').' - '; |
my $title; my $url; |
my $title; my $url; |
if ($args->{'firstres'} eq 'syl') { |
if ($args->{'firstres'} eq 'syl') { |
$title='Syllabus'; |
$title=&mt('Syllabus'); |
$url='/public/'.$$crsudom.'/'.$$crsunum.'/syllabus'; |
$url='/public/'.$$crsudom.'/'.$$crsunum.'/syllabus'; |
} else { |
} else { |
$title='Navigate Contents'; |
$title=&mt('Table of Contents'); |
$url='/adm/navmaps'; |
$url='/adm/navmaps'; |
} |
} |
|
|
Line 7715 sub construct_course {
|
Line 11261 sub construct_course {
|
############################################################ |
############################################################ |
############################################################ |
############################################################ |
|
|
|
#SD |
|
# only Community and Course, or anything else? |
sub course_type { |
sub course_type { |
my ($cid) = @_; |
my ($cid) = @_; |
if (!defined($cid)) { |
if (!defined($cid)) { |
Line 7731 sub group_term {
|
Line 11279 sub group_term {
|
my $crstype = &course_type(); |
my $crstype = &course_type(); |
my %names = ( |
my %names = ( |
'Course' => 'group', |
'Course' => 'group', |
'Group' => 'team', |
'Community' => 'group', |
); |
); |
return $names{$crstype}; |
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 { |
sub icon { |
my ($file)=@_; |
my ($file)=@_; |
my $curfext = lc((split(/\./,$file))[-1]); |
my $curfext = lc((split(/\./,$file))[-1]); |
Line 7752 sub icon {
|
Line 11310 sub icon {
|
return &lonhttpdurl($iconname); |
return &lonhttpdurl($iconname); |
} |
} |
|
|
sub lonhttpd_port { |
|
my $lonhttpd_port=$Apache::lonnet::perlvar{'lonhttpdPort'}; |
|
if (!defined($lonhttpd_port)) { $lonhttpd_port='8080'; } |
|
# IE doesn't like a secure page getting images from a non-secure |
|
# port (when logging we haven't parsed the browser type so default |
|
# back to secure |
|
if ((!exists($env{'browser.type'}) || $env{'browser.type'} eq 'explorer') |
|
&& $ENV{'SERVER_PORT'} == 443) { |
|
return 443; |
|
} |
|
return $lonhttpd_port; |
|
|
|
} |
|
|
|
sub lonhttpdurl { |
sub lonhttpdurl { |
|
# |
|
# Had been used for "small fry" static images on separate port 8080. |
|
# Modify here if lightweight http functionality desired again. |
|
# Currently eliminated due to increasing firewall issues. |
|
# |
my ($url)=@_; |
my ($url)=@_; |
|
return $url; |
my $lonhttpd_port = &lonhttpd_port(); |
|
if ($lonhttpd_port == 443) { |
|
return 'https://'.$ENV{'SERVER_NAME'}.$url; |
|
} |
|
return 'http://'.$ENV{'SERVER_NAME'}.':'.$lonhttpd_port.$url; |
|
} |
} |
|
|
sub connection_aborted { |
sub connection_aborted { |
Line 7809 sub escape_url {
|
Line 11353 sub escape_url {
|
return join('/',@urlslices).'/'.$lastitem; |
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 { |
sub init_user_environment { |
my ($r, $username, $domain, $authhost, $form, $args) = @_; |
my ($r, $username, $domain, $authhost, $form, $args) = @_; |
my $lonids=$Apache::lonnet::perlvar{'lonIDsDir'}; |
my $lonids=$Apache::lonnet::perlvar{'lonIDsDir'}; |
Line 7851 sub init_user_environment {
|
Line 11411 sub init_user_environment {
|
} |
} |
# Give them a new cookie |
# Give them a new cookie |
my $id = ($args->{'robot'} ? 'robot'.$args->{'robot'} |
my $id = ($args->{'robot'} ? 'robot'.$args->{'robot'} |
: $now); |
: $now.$$.int(rand(10000))); |
$cookie="$username\_$id\_$domain\_$authhost"; |
$cookie="$username\_$id\_$domain\_$authhost"; |
|
|
# Initialize roles |
# Initialize roles |
Line 7863 sub init_user_environment {
|
Line 11423 sub init_user_environment {
|
my ($httpbrowser,$clientbrowser,$clientversion,$clientmathml, |
my ($httpbrowser,$clientbrowser,$clientversion,$clientmathml, |
$clientunicode,$clientos) = &decode_user_agent($r); |
$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 |
# ------------------------------------------------------------- Get environment |
|
|
my %userenv = &Apache::lonnet::dump('environment',$domain,$username); |
my %userenv = &Apache::lonnet::dump('environment',$domain,$username); |
my ($tmp) = keys(%userenv); |
my ($tmp) = keys(%userenv); |
if ($tmp !~ /^(con_lost|error|no_such_host)/i) { |
if ($tmp !~ /^(con_lost|error|no_such_host)/i) { |
# default remote control to off |
|
if ($userenv{'remote'} ne 'on') { $userenv{'remote'} = 'off'; } |
|
} else { |
} else { |
undef(%userenv); |
undef(%userenv); |
} |
} |
if (($userenv{'interface'}) && (!$form->{'interface'})) { |
if (($userenv{'interface'}) && (!$form->{'interface'})) { |
$form->{'interface'}=$userenv{'interface'}; |
$form->{'interface'}=$userenv{'interface'}; |
} |
} |
$env{'environment.remote'}=$userenv{'remote'}; |
|
if ($userenv{'texengine'} eq 'ttm') { $clientmathml=1; } |
if ($userenv{'texengine'} eq 'ttm') { $clientmathml=1; } |
|
|
# --------------- Do not trust query string to be put directly into environment |
# --------------- Do not trust query string to be put directly into environment |
foreach my $option ('imagesuppress','appletsuppress', |
foreach my $option ('interface','localpath','localres') { |
'embedsuppress','fontenhance','blackwhite', |
$form->{$option}=~s/[\n\r\=]//gs; |
'interface','localpath','localres') { |
|
$form->{$option}=~s/[\n\r\=]//gs; |
|
} |
} |
# --------------------------------------------------------- Write first profile |
# --------------------------------------------------------- Write first profile |
|
|
Line 7923 sub init_user_environment {
|
Line 11465 sub init_user_environment {
|
$initial_env{"browser.localres"} = $form->{'localres'}; |
$initial_env{"browser.localres"} = $form->{'localres'}; |
} |
} |
|
|
if ($public) { |
|
$initial_env{"environment.remote"} = "off"; |
|
} |
|
if ($form->{'interface'}) { |
if ($form->{'interface'}) { |
$form->{'interface'}=~s/\W//gs; |
$form->{'interface'}=~s/\W//gs; |
$initial_env{"browser.interface"} = $form->{'interface'}; |
$initial_env{"browser.interface"} = $form->{'interface'}; |
$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"; |
|
} |
|
} |
|
} |
} |
|
|
|
my %is_adv = ( is_adv => $env{'user.adv'} ); |
|
my %domdef; |
|
unless ($domain eq 'public') { |
|
%domdef = &Apache::lonnet::get_domain_defaults($domain); |
|
} |
|
|
|
foreach my $tool ('aboutme','blog','portfolio') { |
|
$userenv{'availabletools.'.$tool} = |
|
&Apache::lonnet::usertools_access($username,$domain,$tool,'reload', |
|
undef,\%userenv,\%domdef,\%is_adv); |
|
} |
|
|
|
foreach my $crstype ('official','unofficial','community') { |
|
$userenv{'canrequest.'.$crstype} = |
|
&Apache::lonnet::usertools_access($username,$domain,$crstype, |
|
'reload','requestcourses', |
|
\%userenv,\%domdef,\%is_adv); |
|
} |
|
|
$env{'user.environment'} = "$lonids/$cookie.id"; |
$env{'user.environment'} = "$lonids/$cookie.id"; |
|
|
if (tie(my %disk_env,'GDBM_File',"$lonids/$cookie.id", |
if (tie(my %disk_env,'GDBM_File',"$lonids/$cookie.id", |
Line 7951 sub init_user_environment {
|
Line 11502 sub init_user_environment {
|
} |
} |
untie(%disk_env); |
untie(%disk_env); |
} else { |
} else { |
&Apache::lonnet::logthis("<font color=\"blue\">WARNING: ". |
&Apache::lonnet::logthis("<span style=\"color:blue;\">WARNING: ". |
'Could not create environment storage in lonauth: '.$!.'</font>'); |
'Could not create environment storage in lonauth: '.$!.'</span>'); |
return 'error: '.$!; |
return 'error: '.$!; |
} |
} |
} |
} |
Line 7966 sub init_user_environment {
|
Line 11517 sub init_user_environment {
|
|
|
sub _add_to_env { |
sub _add_to_env { |
my ($idf,$env_data,$prefix) = @_; |
my ($idf,$env_data,$prefix) = @_; |
while (my ($key,$value) = each(%$env_data)) { |
if (ref($env_data) eq 'HASH') { |
$idf->{$prefix.$key} = $value; |
while (my ($key,$value) = each(%$env_data)) { |
$env{$prefix.$key} = $value; |
$idf->{$prefix.$key} = $value; |
|
$env{$prefix.$key} = $value; |
|
} |
|
} |
|
} |
|
|
|
# --- Get the symbolic name of a problem and the url |
|
sub get_symb { |
|
my ($request,$silent) = @_; |
|
(my $url=$env{'form.url'}) =~ s-^https?\://($ENV{'SERVER_NAME'}|$ENV{'HTTP_HOST'})--; |
|
my $symb=($env{'form.symb'} ne '' ? $env{'form.symb'} : (&Apache::lonnet::symbread($url))); |
|
if ($symb eq '') { |
|
if (!$silent) { |
|
$request->print("Unable to handle ambiguous references:$url:."); |
|
return (); |
|
} |
|
} |
|
&Apache::lonenc::check_decrypt(\$symb); |
|
return ($symb); |
|
} |
|
|
|
# --------------------------------------------------------------Get annotation |
|
|
|
sub get_annotation { |
|
my ($symb,$enc) = @_; |
|
|
|
my $key = $symb; |
|
if (!$enc) { |
|
$key = |
|
&Apache::lonnet::clutter((&Apache::lonnet::decode_symb($symb))[2]); |
} |
} |
|
my %annotation=&Apache::lonnet::get('nohist_annotations',[$key]); |
|
return $annotation{$key}; |
} |
} |
|
|
|
sub clean_symb { |
|
my ($symb,$delete_enc) = @_; |
|
|
|
&Apache::lonenc::check_decrypt(\$symb); |
|
my $enc = $env{'request.enc'}; |
|
if ($delete_enc) { |
|
delete($env{'request.enc'}); |
|
} |
|
|
|
return ($symb,$enc); |
|
} |
|
|
|
sub build_release_hashes { |
|
my ($checkparms,$checkresponsetypes,$checkcrstypes,$anonsurvey,$randomizetry) = @_; |
|
return unless((ref($checkparms) eq 'HASH') && (ref($checkresponsetypes) eq 'HASH') && |
|
(ref($checkcrstypes) eq 'HASH') && (ref($anonsurvey) eq 'HASH') && |
|
(ref($randomizetry) eq 'HASH')); |
|
foreach my $key (keys(%Apache::lonnet::needsrelease)) { |
|
my ($item,$name,$value) = split(/:/,$key); |
|
if ($item eq 'parameter') { |
|
if (ref($checkparms->{$name}) eq 'ARRAY') { |
|
unless(grep(/^\Q$name\E$/,@{$checkparms->{$name}})) { |
|
push(@{$checkparms->{$name}},$value); |
|
} |
|
} else { |
|
push(@{$checkparms->{$name}},$value); |
|
} |
|
} elsif ($item eq 'resourcetag') { |
|
if ($name eq 'responsetype') { |
|
$checkresponsetypes->{$value} = $Apache::lonnet::needsrelease{$key} |
|
} |
|
} elsif ($item eq 'course') { |
|
if ($name eq 'crstype') { |
|
$checkcrstypes->{$value} = $Apache::lonnet::needsrelease{$key}; |
|
} |
|
} |
|
} |
|
($anonsurvey->{major},$anonsurvey->{minor}) = split(/\./,$Apache::lonnet::needsrelease{'parameter:type:anonsurvey'}); |
|
($randomizetry->{major},$randomizetry->{minor}) = split(/\./,$Apache::lonnet::needsrelease{'parameter:type:randomizetry'}); |
|
return; |
|
} |
|
|
=pod |
=pod |
|
|