version 1.1036, 2011/12/12 00:13:43
|
version 1.1056, 2012/02/28 02:02:16
|
Line 154 sub ssi_with_retries {
|
Line 154 sub ssi_with_retries {
|
# ----------------------------------------------- Filetypes/Languages/Copyright |
# ----------------------------------------------- Filetypes/Languages/Copyright |
my %language; |
my %language; |
my %supported_language; |
my %supported_language; |
|
my %latex_language; # For choosing hyphenation in <transl..> |
|
my %latex_language_bykey; # for choosing hyphenation from metadata |
my %cprtag; |
my %cprtag; |
my %scprtag; |
my %scprtag; |
my %fe; my %fd; my %fm; |
my %fe; my %fd; my %fm; |
Line 186 BEGIN {
|
Line 188 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_bykey{$key} = $latex; |
|
$latex_language{$two} = $latex; |
|
} |
} |
} |
close($fh); |
close($fh); |
} |
} |
Line 1198 sub help_open_topic {
|
Line 1204 sub help_open_topic {
|
|
|
if (!$stayOnPage) { |
if (!$stayOnPage) { |
$link = "javascript:openMyModal('/adm/help/${filename}.hlp',$width,$height,'yes');"; |
$link = "javascript:openMyModal('/adm/help/${filename}.hlp',$width,$height,'yes');"; |
|
} elsif ($stayOnPage eq 'popup') { |
|
$link = "javascript:void(open('/adm/help/${filename}.hlp', 'Help_for_$topic', 'menubar=0,toolbar=1,scrollbars=1,width=$width,height=$height,resizable=yes'))"; |
} else { |
} else { |
$link = "/adm/help/${filename}.hlp"; |
$link = "/adm/help/${filename}.hlp"; |
} |
} |
Line 1230 sub help_open_topic {
|
Line 1238 sub help_open_topic {
|
# 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 ($topic,$text,$not_author) = @_; |
my ($topic,$text,$not_author,$stayOnPage) = @_; |
my $out; |
my $out; |
my $addOther = ''; |
my $addOther = ''; |
if ($topic) { |
if ($topic) { |
$addOther = '<span>'.&Apache::loncommon::help_open_topic($topic,&mt($text), |
$addOther = '<span>'.&help_open_topic($topic,&mt($text),$stayOnPage, undef, 600).'</span> '; |
undef, undef, 600). |
|
'</span> '; |
|
} |
} |
$out = '<span>' # Start cheatsheet |
$out = '<span>' # Start cheatsheet |
.$addOther |
.$addOther |
.'<span>' |
.'<span>' |
.&Apache::loncommon::help_open_topic('Greek_Symbols',&mt('Greek Symbols'), |
.&help_open_topic('Greek_Symbols',&mt('Greek Symbols'),$stayOnPage,undef,600) |
undef,undef,600) |
|
.'</span> <span>' |
.'</span> <span>' |
.&Apache::loncommon::help_open_topic('Other_Symbols',&mt('Other Symbols'), |
.&help_open_topic('Other_Symbols',&mt('Other Symbols'),$stayOnPage,undef,600) |
undef,undef,600) |
|
.'</span>'; |
.'</span>'; |
unless ($not_author) { |
unless ($not_author) { |
$out .= ' <span>' |
$out .= ' <span>' |
.&Apache::loncommon::help_open_topic('Authoring_Output_Tags',&mt('Output Tags'), |
.&help_open_topic('Authoring_Output_Tags',&mt('Output Tags'),$stayOnPage,undef,600) |
undef,undef,600) |
|
.'</span>'; |
.'</span>'; |
} |
} |
$out .= '</span>'; # End cheatsheet |
$out .= '</span>'; # End cheatsheet |
Line 3230 sub languagedescription {
|
Line 3233 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 3242 sub supportedlanguagecode {
|
Line 3263 sub supportedlanguagecode {
|
|
|
=pod |
=pod |
|
|
|
=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 * &latexhyphenation() |
|
|
|
Same as above but what's supplied is the language as it might be stored |
|
in the metadata. |
|
|
|
=cut |
|
|
|
sub latexhyphenation { |
|
my $key = shift; |
|
return $latex_language_bykey{$key}; |
|
} |
|
|
|
=pod |
|
|
=item * ©rightids() |
=item * ©rightids() |
|
|
returns list of all copyrights |
returns list of all copyrights |
Line 4983 body {
|
Line 5033 body {
|
a:focus, |
a:focus, |
a:focus img { |
a:focus img { |
color: red; |
color: red; |
background: yellow; |
|
} |
} |
|
|
form, .inline { |
form, .inline { |
Line 5078 div.LC_confirm_box .LC_success img {
|
Line 5127 div.LC_confirm_box .LC_success img {
|
} |
} |
|
|
.LC_discussion { |
.LC_discussion { |
background: $tabbg; |
background: $data_table_dark; |
border: 1px solid black; |
border: 1px solid black; |
margin: 2px; |
margin: 2px; |
} |
} |
|
|
.LC_disc_action_links_bar { |
|
background: $tabbg; |
|
border: none; |
|
margin: 4px; |
|
} |
|
|
|
.LC_disc_action_left { |
.LC_disc_action_left { |
|
background: $sidebg; |
text-align: left; |
text-align: left; |
|
padding: 4px; |
|
margin: 2px; |
} |
} |
|
|
.LC_disc_action_right { |
.LC_disc_action_right { |
|
background: $sidebg; |
text-align: right; |
text-align: right; |
|
padding: 4px; |
|
margin: 2px; |
} |
} |
|
|
.LC_disc_new_item { |
.LC_disc_new_item { |
background: white; |
background: white; |
border: 2px solid red; |
border: 2px solid red; |
margin: 2px; |
margin: 4px; |
|
padding: 4px; |
} |
} |
|
|
.LC_disc_old_item { |
.LC_disc_old_item { |
background: white; |
background: white; |
border: 1px solid black; |
margin: 4px; |
margin: 2px; |
padding: 4px; |
} |
} |
|
|
table.LC_pastsubmission { |
table.LC_pastsubmission { |
Line 5228 td.LC_table_cell_checkbox {
|
Line 5278 td.LC_table_cell_checkbox {
|
vertical-align: middle; |
vertical-align: middle; |
} |
} |
|
|
li.LC_menubuttons_inline_text img,a { |
li.LC_menubuttons_inline_text img { |
cursor:pointer; |
cursor:pointer; |
text-decoration: none; |
text-decoration: none; |
} |
} |
Line 6083 div.LC_createcourse {
|
Line 6133 div.LC_createcourse {
|
display:none; |
display:none; |
} |
} |
|
|
a:hover, |
|
ol.LC_primary_menu a:hover, |
ol.LC_primary_menu a:hover, |
ol#LC_MenuBreadcrumbs a:hover, |
ol#LC_MenuBreadcrumbs a:hover, |
ol#LC_PathBreadcrumbs a:hover, |
ol#LC_PathBreadcrumbs a:hover, |
Line 6317 ul.LC_TabContent li.active a {
|
Line 6366 ul.LC_TabContent li.active a {
|
background:#FFFFFF; |
background:#FFFFFF; |
outline: none; |
outline: none; |
} |
} |
|
|
|
ul.LC_TabContent li.goback { |
|
float: left; |
|
border-left: none; |
|
} |
|
|
#maincoursedoc { |
#maincoursedoc { |
clear:both; |
clear:both; |
} |
} |
Line 6566 a#LC_content_toolbar_changefolder_toggle
|
Line 6621 a#LC_content_toolbar_changefolder_toggle
|
background-image:url(/res/adm/pages/open-all-folders.gif); |
background-image:url(/res/adm/pages/open-all-folders.gif); |
} |
} |
|
|
|
a#LC_content_toolbar_edittoplevel { |
|
background-image:url(/res/adm/pages/edittoplevel.gif); |
|
} |
|
|
ul#LC_toolbar li a:hover { |
ul#LC_toolbar li a:hover { |
background-position: bottom center; |
background-position: bottom center; |
} |
} |
Line 6740 sub headtag {
|
Line 6799 sub headtag {
|
&& !$args->{'frameset'}) { |
&& !$args->{'frameset'}) { |
$result .= &help_menu_js(); |
$result .= &help_menu_js(); |
$result.=&modal_window(); |
$result.=&modal_window(); |
|
$result.=&togglebox_script(); |
$result.=&wishlist_window(); |
$result.=&wishlist_window(); |
|
$result.=&LCprogressbarUpdate_script(); |
} else { |
} else { |
if ($args->{'add_modal'}) { |
if ($args->{'add_modal'}) { |
$result.=&modal_window(); |
$result.=&modal_window(); |
Line 6748 sub headtag {
|
Line 6809 sub headtag {
|
if ($args->{'add_wishlist'}) { |
if ($args->{'add_wishlist'}) { |
$result.=&wishlist_window(); |
$result.=&wishlist_window(); |
} |
} |
|
if ($args->{'add_togglebox'}) { |
|
$result.=&togglebox_script(); |
|
} |
|
if ($args->{'add_progressbar'}) { |
|
$result.=&LCprogressbarUpdate_script(); |
|
} |
} |
} |
if (ref($args->{'redirect'})) { |
if (ref($args->{'redirect'})) { |
my ($time,$url,$inhibit_continue) = @{$args->{'redirect'}}; |
my ($time,$url,$inhibit_continue) = @{$args->{'redirect'}}; |
Line 6964 sub end_page {
|
Line 7031 sub end_page {
|
|
|
sub wishlist_window { |
sub wishlist_window { |
return(<<'ENDWISHLIST'); |
return(<<'ENDWISHLIST'); |
<script type="text/javascript" lang="javascript"> |
<script type="text/javascript"> |
// <![CDATA[ |
// <![CDATA[ |
// <!-- BEGIN LON-CAPA Internal |
// <!-- BEGIN LON-CAPA Internal |
function set_wishlistlink(title, path) { |
function set_wishlistlink(title, path) { |
Line 6986 ENDWISHLIST
|
Line 7053 ENDWISHLIST
|
|
|
sub modal_window { |
sub modal_window { |
return(<<'ENDMODAL'); |
return(<<'ENDMODAL'); |
<script type="text/javascript" lang="javascript"> |
<script type="text/javascript"> |
// <![CDATA[ |
// <![CDATA[ |
// <!-- BEGIN LON-CAPA Internal |
// <!-- BEGIN LON-CAPA Internal |
var modalWindow = { |
var modalWindow = { |
Line 7030 ENDMODAL
|
Line 7097 ENDMODAL
|
} |
} |
|
|
sub modal_link { |
sub modal_link { |
my ($link,$linktext,$width,$height,$target,$scrolling)=@_; |
my ($link,$linktext,$width,$height,$target,$scrolling,$title)=@_; |
unless ($width) { $width=480; } |
unless ($width) { $width=480; } |
unless ($height) { $height=400; } |
unless ($height) { $height=400; } |
unless ($scrolling) { $scrolling='yes'; } |
unless ($scrolling) { $scrolling='yes'; } |
return '<a href="'.$link.'" target="'.$target.'" onclick="openMyModal(\''.$link.'\','.$width.','.$height.',\''.$scrolling.'\'); return false;">'. |
return '<a href="'.$link.'" target="'.$target.'" title="'.$title.'" onclick="openMyModal(\''.$link.'\','.$width.','.$height.',\''.$scrolling.'\'); return false;">'. |
$linktext.'</a>'; |
$linktext.'</a>'; |
} |
} |
|
|
sub modal_adhoc_script { |
sub modal_adhoc_script { |
my ($funcname,$width,$height,$content)=@_; |
my ($funcname,$width,$height,$content)=@_; |
return (<<ENDADHOC); |
return (<<ENDADHOC); |
<script type="text/javascript" lang="javascript"> |
<script type="text/javascript"> |
// <![CDATA[ |
// <![CDATA[ |
var $funcname = function() |
var $funcname = function() |
{ |
{ |
Line 7056 sub modal_adhoc_script {
|
Line 7123 sub modal_adhoc_script {
|
ENDADHOC |
ENDADHOC |
} |
} |
|
|
sub modal_adhoc_window { |
sub modal_adhoc_inner { |
my ($funcname,$width,$height,$content,$linktext)=@_; |
my ($funcname,$width,$height,$content)=@_; |
my $innerwidth=$width-20; |
my $innerwidth=$width-20; |
$content=&js_ready( |
$content=&js_ready( |
&start_page('Dialog',undef,{'only_body'=>1,'bgcolor'=>'#FFFFFF'}). |
&start_page('Dialog',undef,{'only_body'=>1,'bgcolor'=>'#FFFFFF'}). |
Line 7066 sub modal_adhoc_window {
|
Line 7133 sub modal_adhoc_window {
|
&end_scrollbox(). |
&end_scrollbox(). |
&end_page() |
&end_page() |
); |
); |
return &modal_adhoc_script($funcname,$width,$height,$content). |
return &modal_adhoc_script($funcname,$width,$height,$content); |
"<a href=\"javascript:$funcname();void(0);\">".$linktext."</a>"; |
} |
|
|
|
sub modal_adhoc_window { |
|
my ($funcname,$width,$height,$content,$linktext)=@_; |
|
return &modal_adhoc_inner($funcname,$width,$height,$content). |
|
"<a href=\"javascript:$funcname();void(0);\">".$linktext."</a>"; |
|
} |
|
|
|
sub modal_adhoc_launch { |
|
my ($funcname,$width,$height,$content)=@_; |
|
return &modal_adhoc_inner($funcname,$width,$height,$content).(<<ENDLAUNCH); |
|
<script type="text/javascript"> |
|
// <![CDATA[ |
|
$funcname(); |
|
// ]]> |
|
</script> |
|
ENDLAUNCH |
|
} |
|
|
|
sub modal_adhoc_close { |
|
return (<<ENDCLOSE); |
|
<script type="text/javascript"> |
|
// <![CDATA[ |
|
modalWindow.close(); |
|
// ]]> |
|
</script> |
|
ENDCLOSE |
|
} |
|
|
|
sub togglebox_script { |
|
return(<<ENDTOGGLE); |
|
<script type="text/javascript"> |
|
// <![CDATA[ |
|
function LCtoggleDisplay(id,hidetext,showtext) { |
|
link = document.getElementById(id + "link").childNodes[0]; |
|
with (document.getElementById(id).style) { |
|
if (display == "none" ) { |
|
display = "inline"; |
|
link.nodeValue = hidetext; |
|
} else { |
|
display = "none"; |
|
link.nodeValue = showtext; |
|
} |
|
} |
|
} |
|
// ]]> |
|
</script> |
|
ENDTOGGLE |
|
} |
|
|
|
sub start_togglebox { |
|
my ($id,$heading,$headerbg,$hidetext,$showtext)=@_; |
|
unless ($heading) { $heading=''; } else { $heading.=' '; } |
|
unless ($showtext) { $showtext=&mt('show'); } |
|
unless ($hidetext) { $hidetext=&mt('hide'); } |
|
unless ($headerbg) { $headerbg='#FFFFFF'; } |
|
return &start_data_table(). |
|
&start_data_table_header_row(). |
|
'<td bgcolor="'.$headerbg.'">'.$heading. |
|
'[<a id="'.$id.'link" href="javascript:LCtoggleDisplay(\''.$id.'\',\''.$hidetext.'\',\''. |
|
$showtext.'\')">'.$showtext.'</a>]</td>'. |
|
&end_data_table_header_row(). |
|
'<tr id="'.$id.'" style="display:none""><td>'; |
|
} |
|
|
|
sub end_togglebox { |
|
return '</td></tr>'.&end_data_table(); |
|
} |
|
|
|
sub LCprogressbar_script { |
|
my ($id)=@_; |
|
return(<<ENDPROGRESS); |
|
<script type="text/javascript"> |
|
// <![CDATA[ |
|
\$('#progressbar$id').progressbar({ |
|
value: 0, |
|
change: function(event, ui) { |
|
var newVal = \$(this).progressbar('option', 'value'); |
|
\$('.pblabel', this).text(LCprogressTxt); |
|
} |
|
}); |
|
// ]]> |
|
</script> |
|
ENDPROGRESS |
|
} |
|
|
|
sub LCprogressbarUpdate_script { |
|
return(<<ENDPROGRESSUPDATE); |
|
<style type="text/css"> |
|
.ui-progressbar { position:relative; } |
|
.pblabel { position: absolute; width: 100%; text-align: center; line-height: 1.9em; } |
|
</style> |
|
<script type="text/javascript"> |
|
// <![CDATA[ |
|
var LCprogressTxt='---'; |
|
|
|
function LCupdateProgress(percent,progresstext,id) { |
|
LCprogressTxt=progresstext; |
|
\$('#progressbar'+id).progressbar('value',percent); |
|
} |
|
// ]]> |
|
</script> |
|
ENDPROGRESSUPDATE |
|
} |
|
|
|
my $LClastpercent; |
|
my $LCidcnt; |
|
my $LCcurrentid; |
|
|
|
sub LCprogressbar { |
|
my ($r)=(@_); |
|
$LClastpercent=0; |
|
$LCidcnt++; |
|
$LCcurrentid=$$.'_'.$LCidcnt; |
|
my $starting=&mt('Starting'); |
|
my $content=(<<ENDPROGBAR); |
|
<p> |
|
<div id="progressbar$LCcurrentid"> |
|
<span class="pblabel">$starting</span> |
|
</div> |
|
</p> |
|
ENDPROGBAR |
|
&r_print($r,$content.&LCprogressbar_script($LCcurrentid)); |
|
} |
|
|
|
sub LCprogressbarUpdate { |
|
my ($r,$val,$text)=@_; |
|
unless ($val) { |
|
if ($LClastpercent) { |
|
$val=$LClastpercent; |
|
} else { |
|
$val=0; |
|
} |
|
} |
|
if ($val<0) { $val=0; } |
|
if ($val>100) { $val=0; } |
|
$LClastpercent=$val; |
|
unless ($text) { $text=$val.'%'; } |
|
$text=&js_ready($text); |
|
&r_print($r,<<ENDUPDATE); |
|
<script type="text/javascript"> |
|
// <![CDATA[ |
|
LCupdateProgress($val,'$text','$LCcurrentid'); |
|
// ]]> |
|
</script> |
|
ENDUPDATE |
|
} |
|
|
|
sub LCprogressbarClose { |
|
my ($r)=@_; |
|
$LClastpercent=0; |
|
&r_print($r,<<ENDCLOSE); |
|
<script type="text/javascript"> |
|
// <![CDATA[ |
|
\$("#progressbar$LCcurrentid").hide('slow'); |
|
// ]]> |
|
</script> |
|
ENDCLOSE |
|
} |
|
|
|
sub r_print { |
|
my ($r,$to_print)=@_; |
|
if ($r) { |
|
$r->print($to_print); |
|
$r->rflush(); |
|
} else { |
|
print($to_print); |
|
} |
} |
} |
|
|
sub html_encode { |
sub html_encode { |
Line 7077 sub html_encode {
|
Line 7311 sub html_encode {
|
|
|
return $result; |
return $result; |
} |
} |
|
|
sub js_ready { |
sub js_ready { |
my ($result) = @_; |
my ($result) = @_; |
|
|
Line 8407 sub get_standard_codeitems {
|
Line 8642 sub get_standard_codeitems {
|
|
|
=item * sorted_slots() |
=item * sorted_slots() |
|
|
Sorts an array of slot names in order of slot start time (earliest first). |
Sorts an array of slot names in order of an optional sort key, |
|
default sort is by slot start time (earliest first). |
|
|
Inputs: |
Inputs: |
|
|
Line 8417 slotsarr - Reference to array of unsort
|
Line 8653 slotsarr - Reference to array of unsort
|
|
|
slots - Reference to hash of hash, where outer hash keys are slot names. |
slots - Reference to hash of hash, where outer hash keys are slot names. |
|
|
|
sortkey - Name of key in inner hash to be sorted on (e.g., starttime). |
|
|
=back |
=back |
|
|
Returns: |
Returns: |
|
|
=over 4 |
=over 4 |
|
|
sorted - An array of slot names sorted by the start time of the slot. |
sorted - An array of slot names sorted by a specified sort key |
|
(default sort key is start time of the slot). |
=back |
|
|
|
=back |
=back |
|
|
Line 8433 sorted - An array of slot names sorted
|
Line 8670 sorted - An array of slot names sorted
|
|
|
|
|
sub sorted_slots { |
sub sorted_slots { |
my ($slotsarr,$slots) = @_; |
my ($slotsarr,$slots,$sortkey) = @_; |
|
if ($sortkey eq '') { |
|
$sortkey = 'starttime'; |
|
} |
my @sorted; |
my @sorted; |
if ((ref($slotsarr) eq 'ARRAY') && (ref($slots) eq 'HASH')) { |
if ((ref($slotsarr) eq 'ARRAY') && (ref($slots) eq 'HASH')) { |
@sorted = |
@sorted = |
sort { |
sort { |
if (ref($slots->{$a}) && ref($slots->{$b})) { |
if (ref($slots->{$a}) && ref($slots->{$b})) { |
return $slots->{$a}{'starttime'} <=> $slots->{$b}{'starttime'} |
return $slots->{$a}{$sortkey} <=> $slots->{$b}{$sortkey} |
} |
} |
if (ref($slots->{$a})) { return -1;} |
if (ref($slots->{$a})) { return -1;} |
if (ref($slots->{$b})) { return 1;} |
if (ref($slots->{$b})) { return 1;} |
Line 8449 sub sorted_slots {
|
Line 8689 sub sorted_slots {
|
return @sorted; |
return @sorted; |
} |
} |
|
|
|
=pod |
|
|
|
=item * get_future_slots() |
|
|
|
Inputs: |
|
|
|
=over 4 |
|
|
|
cnum - course number |
|
|
|
cdom - course domain |
|
|
|
now - current UNIX time |
|
|
|
symb - optional symb |
|
|
|
=back |
|
|
|
Returns: |
|
|
|
=over 4 |
|
|
|
sorted_reservable - ref to array of student_schedulable slots currently |
|
reservable, ordered by end date of reservation period. |
|
|
|
reservable_now - ref to hash of student_schedulable slots currently |
|
reservable. |
|
|
|
Keys in inner hash are: |
|
(a) symb: either blank or symb to which slot use is restricted. |
|
(b) endreserve: end date of reservation period. |
|
|
|
sorted_future - ref to array of student_schedulable slots reservable in |
|
the future, ordered by start date of reservation period. |
|
|
|
future_reservable - ref to hash of student_schedulable slots reservable |
|
in the future. |
|
|
|
Keys in inner hash are: |
|
(a) symb: either blank or symb to which slot use is restricted. |
|
(b) startreserve: start date of reservation period. |
|
|
|
=back |
|
|
|
=cut |
|
|
|
sub get_future_slots { |
|
my ($cnum,$cdom,$now,$symb) = @_; |
|
my (%reservable_now,%future_reservable,@sorted_reservable,@sorted_future); |
|
my %slots = &Apache::lonnet::get_course_slots($cnum,$cdom); |
|
foreach my $slot (keys(%slots)) { |
|
next unless($slots{$slot}->{'type'} eq 'schedulable_student'); |
|
if ($symb) { |
|
next if (($slots{$slot}->{'symb'} ne '') && |
|
($slots{$slot}->{'symb'} ne $symb)); |
|
} |
|
if (($slots{$slot}->{'starttime'} > $now) && |
|
($slots{$slot}->{'endtime'} > $now)) { |
|
if (($slots{$slot}->{'allowedsections'}) || ($slots{$slot}->{'allowedusers'})) { |
|
my $userallowed = 0; |
|
if ($slots{$slot}->{'allowedsections'}) { |
|
my @allowed_sec = split(',',$slots{$slot}->{'allowedsections'}); |
|
if (!defined($env{'request.role.sec'}) |
|
&& grep(/^No section assigned$/,@allowed_sec)) { |
|
$userallowed=1; |
|
} else { |
|
if (grep(/^\Q$env{'request.role.sec'}\E$/,@allowed_sec)) { |
|
$userallowed=1; |
|
} |
|
} |
|
unless ($userallowed) { |
|
if (defined($env{'request.course.groups'})) { |
|
my @groups = split(/:/,$env{'request.course.groups'}); |
|
foreach my $group (@groups) { |
|
if (grep(/^\Q$group\E$/,@allowed_sec)) { |
|
$userallowed=1; |
|
last; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
if ($slots{$slot}->{'allowedusers'}) { |
|
my @allowed_users = split(',',$slots{$slot}->{'allowedusers'}); |
|
my $user = $env{'user.name'}.':'.$env{'user.domain'}; |
|
if (grep(/^\Q$user\E$/,@allowed_users)) { |
|
$userallowed = 1; |
|
} |
|
} |
|
next unless($userallowed); |
|
} |
|
my $startreserve = $slots{$slot}->{'startreserve'}; |
|
my $endreserve = $slots{$slot}->{'endreserve'}; |
|
my $symb = $slots{$slot}->{'symb'}; |
|
if (($startreserve < $now) && |
|
(!$endreserve || $endreserve > $now)) { |
|
my $lastres = $endreserve; |
|
if (!$lastres) { |
|
$lastres = $slots{$slot}->{'starttime'}; |
|
} |
|
$reservable_now{$slot} = { |
|
symb => $symb, |
|
endreserve => $lastres |
|
}; |
|
} elsif (($startreserve > $now) && |
|
(!$endreserve || $endreserve > $startreserve)) { |
|
$future_reservable{$slot} = { |
|
symb => $symb, |
|
startreserve => $startreserve |
|
}; |
|
} |
|
} |
|
} |
|
my @unsorted_reservable = keys(%reservable_now); |
|
if (@unsorted_reservable > 0) { |
|
@sorted_reservable = |
|
&sorted_slots(\@unsorted_reservable,\%reservable_now,'endreserve'); |
|
} |
|
my @unsorted_future = keys(%future_reservable); |
|
if (@unsorted_future > 0) { |
|
@sorted_future = |
|
&sorted_slots(\@unsorted_future,\%future_reservable,'startreserve'); |
|
} |
|
return (\@sorted_reservable,\%reservable_now,\@sorted_future,\%future_reservable); |
|
} |
|
|
=pod |
=pod |
|
|
Line 9343 sub check_for_traversal {
|
Line 9708 sub check_for_traversal {
|
return $cleanpath; |
return $cleanpath; |
} |
} |
|
|
|
sub is_archive_file { |
|
my ($mimetype) = @_; |
|
if (($mimetype eq 'application/octet-stream') || |
|
($mimetype eq 'application/x-stuffit') || |
|
($mimetype =~ m{^application/(x\-)?(compressed|tar|zip|tgz|gz|gtar|gzip|gunzip|bz|bz2|bzip2)})) { |
|
return 1; |
|
} |
|
return; |
|
} |
|
|
|
sub decompress_form { |
|
my ($mimetype,$archiveurl,$action,$noextract,$hiddenelements) = @_; |
|
my %lt = &Apache::lonlocal::texthash ( |
|
this => 'This file is an archive file.', |
|
youm => 'You may wish to extract its contents.', |
|
camt => 'Extraction of contents is recommended for Camtasia zip files.', |
|
perm => 'Permanently remove archive file after extraction of contents?', |
|
extr => 'Extract contents', |
|
yes => 'Yes', |
|
no => 'No', |
|
); |
|
my $output = '<p>'.$lt{'this'}.' '.$lt{'youm'}.'<br />'; |
|
if ($mimetype =~ m{^application/(x\-)?(compressed|zip)}) { |
|
$output .= $lt{'camt'}; |
|
} |
|
$output .= '</p>'; |
|
$output .= <<"START"; |
|
<div id="uploadfileresult"> |
|
<form name="uploaded_decompress" action="$action" method="post"> |
|
<input type="hidden" name="archiveurl" value="$archiveurl" /> |
|
START |
|
if (ref($hiddenelements) eq 'HASH') { |
|
foreach my $hidden (sort(keys(%{$hiddenelements}))) { |
|
$output .= '<input type="hidden" name="'.$hidden.'" value="'.$hiddenelements->{$hidden}.'" />'."\n"; |
|
} |
|
} |
|
$output .= <<"END"; |
|
<span class="LC_nobreak">$lt{'perm'} |
|
<label><input type="radio" name="archivedelete" value="0" checked="checked" />$lt{'no'}</label> |
|
<label><input type="radio" name="archivedelete" value="1" />$lt{'yes'}</label></span><br /> |
|
<input type="submit" name="decompress" value="$lt{'extr'}" /> |
|
</form> |
|
$noextract |
|
</div> |
|
END |
|
return $output; |
|
} |
|
|
|
sub decompress_uploaded_file { |
|
my ($file,$dir) = @_; |
|
&Apache::lonnet::appenv({'cgi.file' => $file}); |
|
&Apache::lonnet::appenv({'cgi.dir' => $dir}); |
|
my $result = &Apache::lonnet::ssi_body('/cgi-bin/decompress.pl'); |
|
my ($handle) = ($env{'user.environment'} =~m{/([^/]+)\.id$}); |
|
my $lonidsdir = $Apache::lonnet::perlvar{'lonIDsDir'}; |
|
&Apache::lonnet::transfer_profile_to_env($lonidsdir,$handle,1); |
|
my $decompressed = $env{'cgi.decompressed'}; |
|
&Apache::lonnet::delenv('cgi.file'); |
|
&Apache::lonnet::delenv('cgi.dir'); |
|
&Apache::lonnet::delenv('cgi.decompressed'); |
|
return ($decompressed,$result); |
|
} |
|
|
|
sub process_decompression { |
|
my ($docudom,$docuname,$file,$destination,$dir_root,$hiddenelem) = @_; |
|
my ($dir,$error,$warning,$output); |
|
if ($file !~ /\.(zip|tar|bz2|gz|tar.gz|tar.bz2|tgz)$/) { |
|
$error = &mt('File name not a supported archive file type.'). |
|
'<br />'.&mt('File name should end with one of: [_1].', |
|
'.zip, .tar, .bz2, .gz, .tar.gz, .tar.bz2, .tgz'); |
|
} else { |
|
my $docuhome = &Apache::lonnet::homeserver($docuname,$docudom); |
|
if ($docuhome eq 'no_host') { |
|
$error = &mt('Could not determine home server for course.'); |
|
} else { |
|
my @ids=&Apache::lonnet::current_machine_ids(); |
|
my $currdir = "$dir_root/$destination"; |
|
my ($currdirlistref,$currlisterror) = |
|
&Apache::lonnet::dirlist($currdir,$docudom,$docuname,1); |
|
if (grep(/^\Q$docuhome\E$/,@ids)) { |
|
$dir = &LONCAPA::propath($docudom,$docuname). |
|
"$dir_root/$destination"; |
|
} else { |
|
$dir = $Apache::lonnet::perlvar{'lonDocRoot'}. |
|
"$dir_root/$docudom/$docuname/$destination"; |
|
unless (&Apache::lonnet::repcopy_userfile("$dir/$file") eq 'ok') { |
|
$error = &mt('Archive file not found.'); |
|
} |
|
} |
|
if ($dir eq '') { |
|
$error = &mt('Directory containing archive file unavailable.'); |
|
} elsif (!$error) { |
|
my ($decompressed,$display) = &decompress_uploaded_file($file,$dir); |
|
if ($decompressed eq 'ok') { |
|
$output = &mt('Files extracted successfully from archive.').'<br />'; |
|
my ($warning,$result,@contents); |
|
my ($newdirlistref,$newlisterror) = |
|
&Apache::lonnet::dirlist($currdir,$docudom, |
|
$docuname,1); |
|
my (%is_dir,%changes,@newitems); |
|
my $dirptr = 16384; |
|
if (ref($currdirlistref) eq 'ARRAY') { |
|
my @curritems; |
|
foreach my $dir_line (@{$currdirlistref}) { |
|
my ($item,$rest)=split(/\&/,$dir_line,2); |
|
unless ($item =~ /\.+$/) { |
|
push(@curritems,$item); |
|
} |
|
} |
|
if (ref($newdirlistref) eq 'ARRAY') { |
|
foreach my $dir_line (@{$newdirlistref}) { |
|
my ($item,undef,undef,$testdir)=split(/\&/,$dir_line,4); |
|
unless ($item =~ /^\.+$/) { |
|
if ($dirptr&$testdir) { |
|
$is_dir{$item} = 1; |
|
} |
|
push(@newitems,$item); |
|
} |
|
} |
|
my @diffs = &compare_arrays(\@curritems,\@newitems); |
|
if (@diffs > 0) { |
|
foreach my $item (@diffs) { |
|
$changes{$item} = 1; |
|
} |
|
} |
|
} |
|
} elsif (ref($newdirlistref) eq 'ARRAY') { |
|
foreach my $dir_line (@{$newdirlistref}) { |
|
my ($item,undef,undef,$testdir)=split(/\&/,$dir_line,5); |
|
unless ($item =~ /\.+$/) { |
|
push(@newitems,$item); |
|
if ($dirptr&$testdir) { |
|
$is_dir{$item} = 1; |
|
} |
|
$changes{$item} = 1; |
|
} |
|
} |
|
} |
|
if (keys(%changes) > 0) { |
|
foreach my $item (sort(@newitems)) { |
|
if ($changes{$item}) { |
|
push(@contents,$item); |
|
} |
|
} |
|
} |
|
if (@contents > 0) { |
|
my (%children,%parent,%dirorder,%titles); |
|
my $wantform = 1; |
|
my ($count,$datatable) = &get_extracted($docudom,$docuname, |
|
$currdir,\%is_dir, |
|
\%children,\%parent, |
|
\@contents,\%dirorder, |
|
\%titles,$wantform); |
|
if ($datatable ne '') { |
|
$output .= &archive_options_form('decompressed',$datatable, |
|
$count,$hiddenelem); |
|
my $startcount = 4; |
|
$output .= &archive_javascript($startcount,$count, |
|
\%titles,\%children); |
|
} |
|
} else { |
|
$warning = &mt('No new items extracted from archive file.'); |
|
} |
|
} else { |
|
$output = $display; |
|
$error = &mt('An error occurred during extraction from the archive file.'); |
|
} |
|
} |
|
} |
|
} |
|
if ($error) { |
|
$output .= '<p class="LC_error">'.&mt('Not extracted.').'<br />'. |
|
$error.'</p>'."\n"; |
|
} |
|
if ($warning) { |
|
$output .= '<p class="LC_warning">'.$warning.'</p>'."\n"; |
|
} |
|
return $output; |
|
} |
|
|
|
sub get_extracted { |
|
my ($docudom,$docuname,$currdir,$is_dir,$children,$parent,$contents,$dirorder, |
|
$titles,$wantform) = @_; |
|
my $count = 0; |
|
my $depth = 0; |
|
my $datatable; |
|
my @hierarchy; |
|
return unless ((ref($is_dir) eq 'HASH') && (ref($children) eq 'HASH') && |
|
(ref($parent) eq 'HASH') && (ref($contents) eq 'ARRAY') && |
|
(ref($dirorder) eq 'HASH') && (ref($titles) eq 'HASH')); |
|
foreach my $item (@{$contents}) { |
|
$count ++; |
|
@{$dirorder->{$count}} = @hierarchy; |
|
$titles->{$count} = $item; |
|
&archive_hierarchy($depth,$count,$parent,$children); |
|
if ($wantform) { |
|
$datatable .= &archive_row($is_dir->{$item},$item, |
|
$currdir,$depth,$count); |
|
} |
|
if ($is_dir->{$item}) { |
|
$depth ++; |
|
push(@hierarchy,$count); |
|
$parent->{$depth} = $count; |
|
$datatable .= |
|
&recurse_extracted_archive("$currdir/$item",$docudom,$docuname, |
|
\$depth,\$count,\@hierarchy,$dirorder, |
|
$children,$parent,$titles,$wantform); |
|
$depth --; |
|
pop(@hierarchy); |
|
} |
|
} |
|
return ($count,$datatable); |
|
} |
|
|
|
sub recurse_extracted_archive { |
|
my ($currdir,$docudom,$docuname,$depth,$count,$hierarchy,$dirorder, |
|
$children,$parent,$titles,$wantform) = @_; |
|
my $result=''; |
|
unless ((ref($depth)) && (ref($count)) && (ref($hierarchy) eq 'ARRAY') && |
|
(ref($children) eq 'HASH') && (ref($parent) eq 'HASH') && |
|
(ref($dirorder) eq 'HASH')) { |
|
return $result; |
|
} |
|
my $dirptr = 16384; |
|
my ($newdirlistref,$newlisterror) = |
|
&Apache::lonnet::dirlist($currdir,$docudom,$docuname,1); |
|
if (ref($newdirlistref) eq 'ARRAY') { |
|
foreach my $dir_line (@{$newdirlistref}) { |
|
my ($item,undef,undef,$testdir)=split(/\&/,$dir_line,5); |
|
unless ($item =~ /^\.+$/) { |
|
$$count ++; |
|
@{$dirorder->{$$count}} = @{$hierarchy}; |
|
$titles->{$$count} = $item; |
|
&archive_hierarchy($$depth,$$count,$parent,$children); |
|
|
|
my $is_dir; |
|
if ($dirptr&$testdir) { |
|
$is_dir = 1; |
|
} |
|
if ($wantform) { |
|
$result .= &archive_row($is_dir,$item,$currdir,$$depth,$$count); |
|
} |
|
if ($is_dir) { |
|
$$depth ++; |
|
push(@{$hierarchy},$$count); |
|
$parent->{$$depth} = $$count; |
|
$result .= |
|
&recurse_extracted_archive("$currdir/$item",$docudom, |
|
$docuname,$depth,$count, |
|
$hierarchy,$dirorder,$children, |
|
$parent,$titles,$wantform); |
|
$$depth --; |
|
pop(@{$hierarchy}); |
|
} |
|
} |
|
} |
|
} |
|
return $result; |
|
} |
|
|
|
sub archive_hierarchy { |
|
my ($depth,$count,$parent,$children) =@_; |
|
if ((ref($parent) eq 'HASH') && (ref($children) eq 'HASH')) { |
|
if (exists($parent->{$depth})) { |
|
$children->{$parent->{$depth}} .= $count.':'; |
|
} |
|
} |
|
return; |
|
} |
|
|
|
sub archive_row { |
|
my ($is_dir,$item,$currdir,$depth,$count) = @_; |
|
my ($name) = ($item =~ m{([^/]+)$}); |
|
my %choices = &Apache::lonlocal::texthash ( |
|
'display' => 'Add as File', |
|
'dependency' => 'Include as dependency', |
|
'discard' => 'Discard', |
|
); |
|
if ($is_dir) { |
|
$choices{'display'} = &mt('Add as Folder'); |
|
} |
|
my $output = &start_data_table_row().'<td align="right">'.$count.'</td>'."\n"; |
|
my $offset = 0; |
|
foreach my $action ('display','dependency','discard') { |
|
$offset ++; |
|
$output .= '<td><span class="LC_nobreak">'. |
|
'<label><input type="radio" name="archive_'.$count. |
|
'" id="archive_'.$action.'_'.$count.'" value="'.$action.'"'; |
|
my $text = $choices{$action}; |
|
if ($is_dir) { |
|
$output .= ' onclick="javascript:propagateCheck(this.form,'."'$count'".');"'; |
|
if ($action eq 'display') { |
|
$text = &mt('Add as Folder'); |
|
} |
|
} else { |
|
$output .= ' onclick="javascript:dependencyCheck(this.form,'."$count,$offset".');"'; |
|
|
|
} |
|
$output .= ' /> '.$choices{$action}.'</label></span>'; |
|
if ($action eq 'dependency') { |
|
$output .= '<div id="arc_depon_'.$count.'" style="display:none;">'."\n". |
|
&mt('Used by:').' <select name="archive_dependent_on_'.$count.'" '. |
|
'onchange="propagateSelect(this.form,'."$count,$offset".')">'."\n". |
|
'<option value=""></option>'."\n". |
|
'</select>'."\n". |
|
'</div>'; |
|
} |
|
$output .= '</td>'; |
|
} |
|
$output .= '<td><input type="hidden" name="archive_content_'.$count.'" value="'. |
|
&HTML::Entities::encode("$currdir/$item",'"<>&').'" />'.(' ' x 2); |
|
for (my $i=0; $i<$depth; $i++) { |
|
$output .= ('<img src="/adm/lonIcons/whitespace1.gif" class="LC_docs_spacer" alt="" />' x2)."\n"; |
|
} |
|
if ($is_dir) { |
|
$output .= '<img src="/adm/lonIcons/navmap.folder.open.gif" alt="" /> '."\n". |
|
'<input type="hidden" name="archive_directory" value="'.$count.'" />'."\n"; |
|
} else { |
|
$output .= '<input type="hidden" name="archive_file" value="'.$count.'" />'."\n"; |
|
} |
|
$output .= ' '.$name.'</td>'."\n". |
|
&end_data_table_row(); |
|
return $output; |
|
} |
|
|
|
sub archive_options_form { |
|
my ($form,$output,$count,$hiddenelem) = @_; |
|
return '<form name="'.$form.'" method="post" action="">'."\n". |
|
'<input type="hidden" name="phase" value="decompress_cleanup" />'."\n". |
|
'<p>'. |
|
&mt('How should each item be incorporated in the course?'). |
|
'</p>'. |
|
'<div class="LC_columnSection"><fieldset>'. |
|
'<legend>'.&mt('Content actions for all').'</legend>'. |
|
'<input type="button" value="'.&mt('Display in Contents').'" '. |
|
'onclick="javascript:checkAll(document.'.$form.",'display'".')" />'. |
|
' <input type="button" value="'.&mt('Include as dependency for a displayed item').'"'. |
|
' onclick="javascript:checkAll(document.'.$form.",'dependency'".')" />'. |
|
' <input type="button" value="'.&mt('Discard').'"'. |
|
' onclick="javascript:checkAll(document.'.$form.",'discard'".')" />'. |
|
'</fieldset></div>'. |
|
&start_data_table()."\n". |
|
$output."\n". |
|
&end_data_table()."\n". |
|
'<input type="hidden" name="archive_count" value="'.$count.'" />'. |
|
$hiddenelem. |
|
'<br /><input type="submit" name="archive_submit" value="'.&mt('Save').'" />'. |
|
'</form>'; |
|
} |
|
|
|
sub archive_javascript { |
|
my ($startcount,$numitems,$titles,$children) = @_; |
|
return unless ((ref($titles) eq 'HASH') && (ref($children) eq 'HASH')); |
|
my $scripttag = <<START; |
|
<script type="text/javascript"> |
|
// <![CDATA[ |
|
|
|
function checkAll(form,prefix) { |
|
var idstr = new RegExp("^archive_"+prefix+"_\\\\d+\$"); |
|
for (var i=0; i < form.elements.length; i++) { |
|
var id = form.elements[i].id; |
|
if ((id != '') && (id != undefined)) { |
|
if (idstr.test(id)) { |
|
if (form.elements[i].type == 'radio') { |
|
form.elements[i].checked = true; |
|
var nostart = i-$startcount; |
|
var offset = nostart%6; |
|
var count = (nostart-offset)/6; |
|
dependencyCheck(form,count,offset); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
function propagateCheck(form,count) { |
|
if (count > 0) { |
|
var startelement = $startcount + ((count-1) * 6); |
|
for (var j=1; j<5; j++) { |
|
if (j != 3) { |
|
var item = startelement + j; |
|
if (form.elements[item].type == 'radio') { |
|
if (form.elements[item].checked) { |
|
containerCheck(form,count,j); |
|
break; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
numitems = $numitems |
|
var titles = new Array(numitems); |
|
var parents = new Array(numitems); |
|
for (var i=0; i<numitems; i++) { |
|
parents[i] = new Array; |
|
} |
|
|
|
START |
|
|
|
foreach my $container (sort { $a <=> $b } (keys(%{$children}))) { |
|
my @contents = split(/:/,$children->{$container}); |
|
for (my $i=0; $i<@contents; $i ++) { |
|
$scripttag .= 'parents['.$container.']['.$i.'] = '.$contents[$i]."\n"; |
|
} |
|
} |
|
|
|
foreach my $key (sort { $a <=> $b } (keys(%{$titles}))) { |
|
$scripttag .= "titles[$key] = '".$titles->{$key}."';\n"; |
|
} |
|
|
|
$scripttag .= <<END; |
|
|
|
function containerCheck(form,count,offset) { |
|
if (count > 0) { |
|
dependencyCheck(form,count,offset); |
|
var item = (offset+$startcount)+6*(count-1); |
|
form.elements[item].checked = true; |
|
if(Object.prototype.toString.call(parents[count]) === '[object Array]') { |
|
if (parents[count].length > 0) { |
|
for (var j=0; j<parents[count].length; j++) { |
|
containerCheck(form,parents[count][j],offset); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
function dependencyCheck(form,count,offset) { |
|
if (count > 0) { |
|
var chosen = (offset+$startcount)+6*(count-1); |
|
var depitem = $startcount + ((count-1) * 6) + 3; |
|
var currtype = form.elements[depitem].type; |
|
if (form.elements[chosen].value == 'dependency') { |
|
document.getElementById('arc_depon_'+count).style.display='block'; |
|
form.elements[depitem].options.length = 0; |
|
form.elements[depitem].options[0] = new Option('Select','',true,true); |
|
for (var i=1; i<count; i++) { |
|
var startelement = $startcount + (i-1) * 6; |
|
for (var j=1; j<5; j++) { |
|
if (j != 3) { |
|
var item = startelement + j; |
|
if (form.elements[item].type == 'radio') { |
|
if (form.elements[item].checked) { |
|
if (form.elements[item].value == 'display') { |
|
var n = form.elements[depitem].options.length; |
|
form.elements[depitem].options[n] = new Option(titles[i],i,false,false); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} else { |
|
document.getElementById('arc_depon_'+count).style.display='none'; |
|
form.elements[depitem].options.length = 0; |
|
form.elements[depitem].options[0] = new Option('Select','',true,true); |
|
} |
|
} |
|
} |
|
|
|
function propagateSelect(form,count,offset) { |
|
if (count > 0) { |
|
var item = (1+offset+$startcount)+6*(count-1); |
|
var picked = form.elements[item].options[form.elements[item].selectedIndex].value; |
|
if (Object.prototype.toString.call(parents[count]) === '[object Array]') { |
|
if (parents[count].length > 0) { |
|
for (var j=0; j<parents[count].length; j++) { |
|
containerSelect(form,parents[count][j],offset,picked); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
function containerSelect(form,count,offset,picked) { |
|
if (count > 0) { |
|
var item = (offset+$startcount)+6*(count-1); |
|
if (form.elements[item].type == 'radio') { |
|
if (form.elements[item].value == 'dependency') { |
|
if (form.elements[item+1].type == 'select-one') { |
|
for (var i=0; i<form.elements[item+1].options.length; i++) { |
|
if (form.elements[item+1].options[i].value == picked) { |
|
form.elements[item+1].selectedIndex = i; |
|
break; |
|
} |
|
} |
|
} |
|
if (Object.prototype.toString.call(parents[count]) === '[object Array]') { |
|
if (parents[count].length > 0) { |
|
for (var j=0; j<parents[count].length; j++) { |
|
containerSelect(form,parents[count][j],offset,picked); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
// ]]> |
|
</script> |
|
END |
|
return $scripttag; |
|
} |
|
|
|
sub process_extracted_files { |
|
my ($context,$docudom,$docuname,$destination,$dir_root,$hiddenelem) = @_; |
|
my $numitems = $env{'form.archive_count'}; |
|
return unless ($numitems); |
|
my @ids=&Apache::lonnet::current_machine_ids(); |
|
my ($prefix,$pathtocheck,$dir,$ishome,$error,$warning,%toplevelitems,%is_dir, |
|
%folders,%containers,%mapinner); |
|
my $docuhome = &Apache::lonnet::homeserver($docuname,$docudom); |
|
if (grep(/^\Q$docuhome\E$/,@ids)) { |
|
$prefix = &LONCAPA::propath($docudom,$docuname); |
|
$pathtocheck = "$dir_root/$destination"; |
|
$dir = $dir_root; |
|
$ishome = 1; |
|
} else { |
|
$prefix = $Apache::lonnet::perlvar{'lonDocRoot'}; |
|
$pathtocheck = "$dir_root/$docudom/$docuname/$destination"; |
|
$dir = "$dir_root/$docudom/$docuname"; |
|
} |
|
my $currdir = "$dir_root/$destination"; |
|
(my $docstype,$mapinner{'0'}) = ($destination =~ m{^(docs|supplemental)/(\w+)/}); |
|
if ($env{'form.folderpath'}) { |
|
my @items = split('&',$env{'form.folderpath'}); |
|
$folders{'0'} = $items[-2]; |
|
$containers{'0'}='sequence'; |
|
} elsif ($env{'form.pagepath'}) { |
|
my @items = split('&',$env{'form.pagepath'}); |
|
$folders{'0'} = $items[-2]; |
|
$containers{'0'}='page'; |
|
} |
|
my @archdirs = &get_env_multiple('form.archive_directory'); |
|
if ($numitems) { |
|
for (my $i=1; $i<=$numitems; $i++) { |
|
my $path = $env{'form.archive_content_'.$i}; |
|
if ($path =~ m{^\Q$pathtocheck\E/([^/]+)$}) { |
|
my $item = $1; |
|
$toplevelitems{$item} = $i; |
|
if (grep(/^\Q$i\E$/,@archdirs)) { |
|
$is_dir{$item} = 1; |
|
} |
|
} |
|
} |
|
} |
|
my ($output,%children,%parent,%titles,%dirorder); |
|
if (keys(%toplevelitems) > 0) { |
|
my @contents = sort(keys(%toplevelitems)); |
|
(my $count,undef) = &get_extracted($docudom,$docuname,$currdir,\%is_dir,\%children, |
|
\%parent,\@contents,\%dirorder,\%titles); |
|
} |
|
my (%referrer,%orphaned,%todelete,%newdest,%newseqid); |
|
if ($numitems) { |
|
for (my $i=1; $i<=$numitems; $i++) { |
|
my $path = $env{'form.archive_content_'.$i}; |
|
if ($path =~ /^\Q$pathtocheck\E/) { |
|
if ($env{'form.archive_'.$i} eq 'discard') { |
|
if ($prefix ne '' && $path ne '') { |
|
if (-e $prefix.$path) { |
|
$todelete{$prefix.$path} = 1; |
|
} |
|
} |
|
} elsif ($env{'form.archive_'.$i} eq 'display') { |
|
my ($title,$url,$outer); |
|
($title) = ($path =~ m{/([^/]+)$}); |
|
$outer = 0; |
|
if (ref($dirorder{$i}) eq 'ARRAY') { |
|
if (@{$dirorder{$i}} > 0) { |
|
foreach my $item (reverse(@{$dirorder{$i}})) { |
|
if ($env{'form.archive_'.$item} eq 'display') { |
|
$outer = $item; |
|
last; |
|
} |
|
} |
|
} |
|
} |
|
my ($errtext,$fatal) = |
|
&LONCAPA::map::mapread('/uploaded/'.$docudom.'/'.$docuname. |
|
'/'.$folders{$outer}.'.'. |
|
$containers{$outer}); |
|
next if ($fatal); |
|
if ((@archdirs > 0) && (grep(/^\Q$i\E$/,@archdirs))) { |
|
if ($context eq 'coursedocs') { |
|
$mapinner{$i} = time; |
|
$folders{$i} = 'default_'.$mapinner{$i}; |
|
$containers{$i} = 'sequence'; |
|
my $url = '/uploaded/'.$docudom.'/'.$docuname.'/'. |
|
$folders{$i}.'.'.$containers{$i}; |
|
my $newidx = &LONCAPA::map::getresidx(); |
|
$LONCAPA::map::resources[$newidx]= |
|
$title.':'.$url.':false:normal:res'; |
|
push(@LONCAPA::map::order,$newidx); |
|
my ($outtext,$errtext) = |
|
&LONCAPA::map::storemap('/uploaded/'.$docudom.'/'. |
|
$docuname.'/'.$folders{$outer}. |
|
'.'.$containers{$outer},1); |
|
$newseqid{$i} = $newidx; |
|
} |
|
} else { |
|
if ($context eq 'coursedocs') { |
|
my $newidx=&LONCAPA::map::getresidx(); |
|
my $url = '/uploaded/'.$docudom.'/'.$docuname.'/'. |
|
$docstype.'/'.$mapinner{$outer}.'/'.$newidx.'/'. |
|
$title; |
|
if (!-e "$prefix$dir/$docstype/$mapinner{$outer}") { |
|
mkdir("$prefix$dir/$docstype/$mapinner{$outer}",0755); |
|
} |
|
if (!-e "$prefix$dir/$docstype/$mapinner{$outer}/$newidx") { |
|
mkdir("$prefix$dir/$docstype/$mapinner{$outer}/$newidx"); |
|
} |
|
if (-e "$prefix$dir/$docstype/$mapinner{$outer}/$newidx") { |
|
system("mv $prefix$path $prefix$dir/$docstype/$mapinner{$outer}/$newidx/$title"); |
|
$newdest{$i} = "$prefix$dir/$docstype/$mapinner{$outer}/$newidx"; |
|
} |
|
$LONCAPA::map::resources[$newidx]= |
|
$title.':'.$url.':false:normal:res'; |
|
push(@LONCAPA::map::order, $newidx); |
|
my ($outtext,$errtext)= |
|
&LONCAPA::map::storemap('/uploaded/'.$docudom.'/'. |
|
$docuname.'/'.$folders{$outer}. |
|
'.'.$containers{$outer},1); |
|
} |
|
} |
|
} elsif ($env{'form.archive_'.$i} eq 'dependency') { |
|
my ($title) = ($path =~ m{/([^/]+)$}); |
|
$referrer{$i} = $env{'form.archive_dependent_on_'.$i}; |
|
if ($env{'form.archive_'.$referrer{$i}} eq 'display') { |
|
if (ref($dirorder{$i}) eq 'ARRAY') { |
|
my ($itemidx,$fullpath); |
|
for (my $j=0; $j<@{$dirorder{$i}}; $j++) { |
|
if (ref($dirorder{$referrer{$i}}) eq 'ARRAY') { |
|
my $container = $dirorder{$referrer{$i}}->[-1]; |
|
for (my $j=0; $j<@{$dirorder{$i}}; $j++) { |
|
if ($dirorder{$i}->[$j] eq $container) { |
|
$itemidx = $j; |
|
} |
|
} |
|
} |
|
} |
|
if ($itemidx ne '') { |
|
if (grep(/^\Q$referrer{$i}\E$/,@archdirs)) { |
|
if ($mapinner{$referrer{$i}}) { |
|
$fullpath = "$prefix$dir/$docstype/$mapinner{$referrer{$i}}"; |
|
for (my $j=$itemidx; $j<@{$dirorder{$i}}; $j++) { |
|
if (grep(/^\Q$dirorder{$i}->[$j]\E$/,@archdirs)) { |
|
unless (defined($newseqid{$dirorder{$i}->[$j]})) { |
|
$fullpath .= '/'.$titles{$dirorder{$i}->[$j]}; |
|
if (!-e $fullpath) { |
|
mkdir($fullpath,0755); |
|
} |
|
} |
|
} else { |
|
last; |
|
} |
|
} |
|
} |
|
} elsif ($newdest{$referrer{$i}}) { |
|
$fullpath = $newdest{$referrer{$i}}; |
|
for (my $j=$itemidx; $j<@{$dirorder{$i}}; $j++) { |
|
if ($env{'form.archive_'.$dirorder{$i}->[$j]} eq 'discard') { |
|
$orphaned{$i} = $env{'form.archive_'.$dirorder{$i}->[$j]}; |
|
last; |
|
} elsif (grep(/^\Q$dirorder{$i}->[$j]\E$/,@archdirs)) { |
|
unless (defined($newseqid{$dirorder{$i}->[$j]})) { |
|
$fullpath .= '/'.$titles{$dirorder{$i}->[$j]}; |
|
if (!-e $fullpath) { |
|
mkdir($fullpath,0755); |
|
} |
|
} |
|
} else { |
|
last; |
|
} |
|
} |
|
} |
|
if ($fullpath ne '') { |
|
system("mv $prefix$path $fullpath/$title"); |
|
} |
|
} |
|
} |
|
} elsif ($env{'form.archive_'.$referrer{$i}} eq 'discard') { |
|
$warning .= &mt('[_1] is a dependency of [_2], which was discarded.', |
|
$path,$env{'form.archive_content_'.$referrer{$i}}).'<br />'; |
|
} |
|
} |
|
} else { |
|
$warning .= &mt('Item extracted from archive: [_1] has unexpected path.',$path).'<br />'; |
|
} |
|
} |
|
if (keys(%todelete)) { |
|
foreach my $key (keys(%todelete)) { |
|
unlink($key); |
|
unless ($ishome) { |
|
#FIXME Need to notify homeserver to delete files. |
|
} |
|
} |
|
} |
|
} else { |
|
$warning = &mt('No items found in archive.'); |
|
} |
|
if ($error) { |
|
$output .= '<p class="LC_error">'.&mt('Not extracted.').'<br />'. |
|
$error.'</p>'."\n"; |
|
} |
|
if ($warning) { |
|
$output .= '<p class="LC_warning">'.$warning.'</p>'."\n"; |
|
} |
|
return $output; |
|
} |
|
|
=pod |
=pod |
|
|
=item * &get_turnedin_filepath() |
=item * &get_turnedin_filepath() |