Annotation of loncom/interface/londocs.pm, revision 1.246

1.1       www         1: # The LearningOnline Network
1.2       www         2: # Documents
1.1       www         3: #
1.246   ! raeburn     4: # $Id: londocs.pm,v 1.245 2006/11/02 21:06:06 albertel Exp $
1.1       www         5: #
1.3       www         6: # Copyright Michigan State University Board of Trustees
1.1       www         7: #
1.3       www         8: # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
1.1       www         9: #
1.3       www        10: # LON-CAPA is free software; you can redistribute it and/or modify
                     11: # it under the terms of the GNU General Public License as published by
                     12: # the Free Software Foundation; either version 2 of the License, or
                     13: # (at your option) any later version.
1.1       www        14: #
1.3       www        15: # LON-CAPA is distributed in the hope that it will be useful,
                     16: # but WITHOUT ANY WARRANTY; without even the implied warranty of
                     17: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     18: # GNU General Public License for more details.
                     19: #
                     20: # You should have received a copy of the GNU General Public License
                     21: # along with LON-CAPA; if not, write to the Free Software
                     22: # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
                     23: #
                     24: # /home/httpd/html/adm/gpl.txt
                     25: #
                     26: # http://www.lon-capa.org/
                     27: #
                     28: 
1.2       www        29: package Apache::londocs;
1.1       www        30: 
                     31: use strict;
1.28      www        32: use Apache::Constants qw(:common :http);
1.158     raeburn    33: use Apache::imsexport;
1.4       www        34: use Apache::lonnet;
                     35: use Apache::loncommon;
1.245     albertel   36: use LONCAPA::map();
                     37: use Apache::lonratedt();
1.15      www        38: use Apache::lonxml;
1.244     albertel   39: use Apache::lonclonecourse;
1.138     raeburn    40: use Apache::lonnavmaps;
1.38      www        41: use HTML::Entities;
1.27      www        42: use GDBM_File;
1.81      www        43: use Apache::lonlocal;
1.143     raeburn    44: use Cwd;
1.228     www        45: use LONCAPA;
1.7       www        46: 
1.8       www        47: my $iconpath;
1.7       www        48: 
1.27      www        49: my %hash;
                     50: 
                     51: my $hashtied;
1.29      www        52: my %alreadyseen=();
1.27      www        53: 
1.40      www        54: my $hadchanges;
                     55: 
1.47      www        56: # Available help topics
                     57: 
                     58: my %help=();
                     59: 
1.245     albertel   60: # Mapread read maps into LONCAPA::map:: global arrays 
1.10      www        61: # @order and @resources, determines status
1.7       www        62: # sets @order - pointer to resources in right order
                     63: # sets @resources - array with the resources with correct idx
                     64: #
                     65: 
                     66: sub mapread {
                     67:     my ($coursenum,$coursedom,$map)=@_;
                     68:     return
1.245     albertel   69:       &LONCAPA::map::mapread('/uploaded/'.$coursedom.'/'.$coursenum.'/'.
                     70: 			     $map);
1.7       www        71: }
                     72: 
                     73: sub storemap {
                     74:     my ($coursenum,$coursedom,$map)=@_;
1.104     albertel   75:     my ($outtext,$errtext)=
1.245     albertel   76:       &LONCAPA::map::storemap('/uploaded/'.$coursedom.'/'.$coursenum.'/'.
                     77: 			      $map,1);
1.104     albertel   78:     if ($errtext) { return ($errtext,2); }
                     79:     
                     80:     $hadchanges=1;
                     81:     return ($errtext,0);
1.7       www        82: }
                     83: 
1.74      www        84: # ----------------------------------------- Return hash with valid author names
                     85: 
                     86: sub authorhosts {
                     87:     my %outhash=();
                     88:     my $home=0;
                     89:     my $other=0;
1.174     albertel   90:     foreach (keys %env) {
1.74      www        91: 	if ($_=~/^user\.role\.(au|ca)\.(.+)$/) {
                     92: 	    my $role=$1;
                     93: 	    my $realm=$2;
1.174     albertel   94: 	    my ($start,$end)=split(/\./,$env{$_});
1.74      www        95: 	    if (($start) && ($start>time)) { next; }
                     96: 	    if (($end) && (time>$end)) { next; }
                     97: 	    my $ca; my $cd;
                     98: 	    if ($1 eq 'au') {
1.174     albertel   99: 		$ca=$env{'user.name'};
                    100: 		$cd=$env{'user.domain'};
1.74      www       101: 	    } else {
                    102: 		($cd,$ca)=($realm=~/^\/(\w+)\/(\w+)$/);
                    103: 	    }
1.107     albertel  104: 	    my $allowed=0;
                    105: 	    my $myhome=&Apache::lonnet::homeserver($ca,$cd);
                    106: 	    my @ids=&Apache::lonnet::current_machine_ids();
                    107: 	    foreach my $id (@ids) { if ($id eq $myhome) { $allowed=1; } }
                    108: 	    if ($allowed) {
1.74      www       109: 		$home++;
                    110: 		$outhash{'home_'.$ca.'@'.$cd}=1;
                    111: 	    } else {
1.107     albertel  112: 		$outhash{'otherhome_'.$ca.'@'.$cd}=$myhome;
1.74      www       113: 		$other++;
                    114: 	    }
                    115: 	}
                    116:     }
                    117:     return ($home,$other,%outhash);
                    118: }
                    119: # ------------------------------------------------------ Generate "dump" button
                    120: 
                    121: sub dumpbutton {
                    122:     my ($home,$other,%outhash)=&authorhosts();
1.230     albertel  123:     my $type = &Apache::loncommon::course_type();
1.74      www       124:     if ($home+$other==0) { return ''; }
                    125:     my $output='</td><td bgcolor="#DDDDCC">';
                    126:     if ($home) {
                    127: 	return '</td><td bgcolor="#DDDDCC">'.
1.81      www       128: 	    '<input type="submit" name="dumpcourse" value="'.
1.230     albertel  129: 	    &mt('Dump '.$type.' DOCS to Construction Space').'" />'.
1.130     www       130: 	    &Apache::loncommon::help_open_topic('Docs_Dump_Course_Docs');
1.74      www       131:     } else {
                    132: 	return'</td><td bgcolor="#DDDDCC">'.
1.230     albertel  133:      &mt('Dump '.$type.
                    134: 	 ' DOCS to Construction Space: available on other servers');
1.74      www       135:     }
                    136: }
                    137: 
1.164     albertel  138: sub clean {
                    139:     my ($title)=@_;
                    140:     $title=~s/[^\w\/\!\$\%\^\*\-\_\=\+\;\:\,\\\|\`\~]+/\_/gs;
                    141:     return $title;	
                    142: }
1.74      www       143: # -------------------------------------------------------- Actually dump course
                    144: 
                    145: sub dumpcourse {
1.224     albertel  146:     my ($r) = @_;
1.230     albertel  147:     my $type = &Apache::loncommon::course_type();
                    148:     $r->print(&Apache::loncommon::start_page('Dump '.$type.' DOCS to Construction Space').
                    149: 	      '<form name="dumpdoc" method="post">');
1.74      www       150:     my ($home,$other,%outhash)=&authorhosts();
1.75      www       151:     unless ($home) { return ''; }
1.174     albertel  152:     my $origcrsid=$env{'request.course.id'};
1.76      www       153:     my %origcrsdata=&Apache::lonnet::coursedescription($origcrsid);
1.174     albertel  154:     if (($env{'form.authorspace'}) && ($env{'form.authorfolder'}=~/\w/)) {
1.76      www       155: # Do the dumping
1.174     albertel  156: 	unless ($outhash{'home_'.$env{'form.authorspace'}}) { return ''; }
                    157: 	my ($ca,$cd)=split(/\@/,$env{'form.authorspace'});
1.87      www       158: 	$r->print('<h3>'.&mt('Copying Files').'</h3>');
1.174     albertel  159: 	my $title=$env{'form.authorfolder'};
1.164     albertel  160: 	$title=&clean($title);
1.79      www       161: 	my %replacehash=();
1.174     albertel  162: 	foreach (keys %env) {
1.79      www       163: 	    if ($_=~/^form\.namefor\_(.+)/) {
1.174     albertel  164: 		$replacehash{$1}=$env{$_};
1.79      www       165: 	    }
                    166: 	}
1.174     albertel  167: 	my $crs='/uploaded/'.$env{'request.course.id'}.'/';
1.79      www       168: 	$crs=~s/\_/\//g;
                    169: 	foreach (keys %replacehash) {
                    170: 	    my $newfilename=$title.'/'.$replacehash{$_};
1.205     albertel  171: 	    $newfilename=~s/\.(\w+)$//;
                    172: 	    my $ext=$1;
1.164     albertel  173: 	    $newfilename=&clean($newfilename);
1.205     albertel  174: 	    $newfilename.='.'.$ext;
1.79      www       175: 	    my @dirs=split(/\//,$newfilename);
                    176: 	    my $path='/home/'.$ca.'/public_html';
                    177: 	    my $makepath=$path;
                    178: 	    my $fail=0;
                    179: 	    for (my $i=0;$i<$#dirs;$i++) {
                    180: 		$makepath.='/'.$dirs[$i];
                    181: 		unless (-e $makepath) { 
                    182: 		    unless(mkdir($makepath,0777)) { $fail=1; } 
                    183: 		}
                    184: 	    }
                    185: 	    $r->print('<br /><tt>'.$_.'</tt> => <tt>'.$newfilename.'</tt>: ');
                    186: 	    if (my $fh=Apache::File->new('>'.$path.'/'.$newfilename)) {
                    187: 		if ($_=~/\.(sequence|page|html|htm|xml|xhtml)$/) {
1.244     albertel  188: 		    print $fh &Apache::lonclonecourse::rewritefile(
                    189:          &Apache::lonclonecourse::readfile($env{'request.course.id'},$_),
1.79      www       190: 				     (%replacehash,$crs => '')
                    191: 								    );
                    192: 		} else {
                    193: 		    print $fh
1.244     albertel  194:          &Apache::lonclonecourse::readfile($env{'request.course.id'},$_);
1.79      www       195: 		       }
                    196: 		$fh->close();
                    197: 	    } else {
                    198: 		$fail=1;
                    199: 	    }
                    200: 	    if ($fail) {
                    201: 		$r->print('<font color="red">fail</font>');
                    202: 	    } else {
                    203: 		$r->print('<font color="green">ok</font>');
                    204: 	    }
                    205: 	}
1.76      www       206:     } else {
                    207: # Input form
                    208: 	unless ($home==1) {
                    209: 	    $r->print(
1.81      www       210: 		      '<h3>'.&mt('Select the Construction Space').'</h3><select name="authorspace">');
1.76      www       211: 	}
                    212: 	foreach (sort keys %outhash) {
                    213: 	    if ($_=~/^home_(.+)$/) {
                    214: 		if ($home==1) {
                    215: 		    $r->print(
                    216: 		  '<input type="hidden" name="authorspace" value="'.$1.'" />');
                    217: 		} else {
1.133     www       218: 		    $r->print('<option value="'.$1.'">'.$1.' - '.
                    219: 			      &Apache::loncommon::plainname(split(/\@/,$1)).'</option>');
1.76      www       220: 		}
                    221: 	    }
                    222: 	}
                    223: 	unless ($home==1) {
                    224: 	    $r->print('</select>');
                    225: 	}
                    226: 	my $title=$origcrsdata{'description'};
1.227     albertel  227: 	$title=~s/[\/\s]+/\_/gs;
1.164     albertel  228: 	$title=&clean($title);
1.81      www       229: 	$r->print('<h3>'.&mt('Folder in Construction Space').'</h3><input type="text" size="50" name="authorfolder" value="'.$title.'" /><br />');
1.76      www       230: 	&tiehash();
1.81      www       231: 	$r->print('<h3>'.&mt('Filenames in Construction Space').'</h3><table border="2"><tr><th>'.&mt('Internal Filename').'</th><th>'.&mt('Title').'</th><th>'.&mt('Save as ...').'</th></tr>');
1.244     albertel  232: 	foreach (&Apache::lonclonecourse::crsdirlist($origcrsid,'userfiles')) {
1.78      www       233: 	    $r->print('<tr><td>'.$_.'</td>');
                    234: 	    my ($ext)=($_=~/\.(\w+)$/);
                    235: 	    my $title=$hash{'title_'.$hash{
                    236: 		'ids_/uploaded/'.$origcrsdata{'domain'}.'/'.$origcrsdata{'num'}.'/'.$_}};
1.163     albertel  237: 	    $title=~s/&colon;/:/g;
1.78      www       238: 	    $r->print('<td>'.($title?$title:'&nbsp;').'</td>');
1.235     albertel  239: 	    if (!$title) {
1.78      www       240: 		$title=$_;
1.235     albertel  241: 	    } else {
                    242: 		$title=~s|/|_|g;
1.78      www       243: 	    }
                    244: 	    $title=~s/\.(\w+)$//;
1.164     albertel  245: 	    $title=&clean($title);
1.78      www       246: 	    $title.='.'.$ext;
1.79      www       247: 	    $r->print("\n<td><input type='text' size='60' name='namefor_".$_."' value='".$title."' /></td></tr>\n");
1.76      www       248: 	}
1.78      www       249: 	$r->print("</table>\n");
1.76      www       250: 	&untiehash();
                    251: 	$r->print(
1.229     raeburn   252:   '<p><input type="submit" name="dumpcourse" value="'.&mt('Dump [_1] DOCS',$type).'" /></p></form>');
1.75      www       253:     }
1.74      www       254: }
1.76      www       255: 
1.138     raeburn   256: # ------------------------------------------------------ Generate "export" button
                    257: 
                    258: sub exportbutton {
1.230     albertel  259:     my $type = &Apache::loncommon::course_type();
1.138     raeburn   260:     return '</td><td bgcolor="#DDDDCC">'.
                    261:             '<input type="submit" name="exportcourse" value="'.
1.230     albertel  262:             &mt('Export '.$type.' to IMS').'" />'.
1.203     raeburn   263:     &Apache::loncommon::help_open_topic('Docs_Export_Course_Docs');
1.138     raeburn   264: }
                    265: 
                    266: sub exportcourse {
                    267:     my $r=shift;
1.230     albertel  268:     my $type = &Apache::loncommon::course_type();
1.138     raeburn   269:     my %discussiontime = &Apache::lonnet::dump('discussiontimes',
1.174     albertel  270:                                                $env{'course.'.$env{'request.course.id'}.'.domain'}, $env{'course.'.$env{'request.course.id'}.'.num'});
1.138     raeburn   271:     my $numdisc = keys %discussiontime;
                    272:     my $navmap = Apache::lonnavmaps::navmap->new();
                    273:     my $it=$navmap->getIterator(undef,undef,undef,1,undef,undef);
                    274:     my $curRes;
1.143     raeburn   275:     my $outcome;
1.138     raeburn   276: 
                    277:     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
                    278:                                             ['finishexport']);
1.174     albertel  279:     if ($env{'form.finishexport'}) {
1.138     raeburn   280:         &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
                    281:                                             ['archive','discussion']);
                    282: 
1.175     albertel  283:         my @exportitems = &Apache::loncommon::get_env_multiple('form.archive');
                    284:         my @discussions = &Apache::loncommon::get_env_multiple('form.discussion');
1.143     raeburn   285:         if (@exportitems == 0 && @discussions == 0) {
                    286:             $outcome = '<br />As you did not select any content items or discussions for export, an IMS package has not been created.  Please <a href="javascript:history.go(-1)">go back</a> to select either content items or discussions for export';
                    287:         } else {
                    288:             my $now = time;
                    289:             my %symbs;
                    290:             my $manifestok = 0;
                    291:             my $imsresources;
                    292:             my $tempexport;
                    293:             my $copyresult;
                    294:             my $ims_manifest = &create_ims_store($now,\$manifestok,\$outcome,\$tempexport);
                    295:             if ($manifestok) {
1.157     raeburn   296:                 &build_package($now,$navmap,\@exportitems,\@discussions,\$outcome,$tempexport,\$copyresult,$ims_manifest);
1.143     raeburn   297:                 close($ims_manifest);
                    298: 
                    299: #Create zip file in prtspool
                    300:                 my $imszipfile = '/prtspool/'.
1.174     albertel  301:                 $env{'user.name'}.'_'.$env{'user.domain'}.'_'.
1.143     raeburn   302:                    time.'_'.rand(1000000000).'.zip';
                    303:                 my $cwd = &Cwd::getcwd();
                    304:                 my $imszip = '/home/httpd/'.$imszipfile;
                    305:                 chdir $tempexport;
                    306:                 open(OUTPUT, "zip -r $imszip *  2> /dev/null |");
                    307:                 close(OUTPUT);
                    308:                 chdir $cwd;
1.230     albertel  309:                 $outcome .= &mt('Download the zip file from <a href="[_1]">IMS '.lc($type).' archive</a><br />',$imszipfile,);
1.143     raeburn   310:                 if ($copyresult) {
                    311:                     $outcome .= 'The following errors occurred during export - '.$copyresult;
1.138     raeburn   312:                 }
1.143     raeburn   313:             } else {
                    314:                 $outcome = '<br />Unfortunately you will not be able to retrieve an IMS archive of this posts at this time, because there was a problem creating a manifest file.<br />';
1.138     raeburn   315:             }
                    316:         }
1.229     raeburn   317:         $r->print(&Apache::loncommon::start_page('Export '.lc($type).' to IMS content package'));
1.143     raeburn   318:         $r->print($outcome);
1.224     albertel  319:         $r->print(&Apache::loncommon::end_page());
1.138     raeburn   320:     } else {
                    321:         my $display;
                    322:         $display = '<form name="exportdoc" method="post">'."\n";
1.230     albertel  323:         $display .= &mt('Choose which items you wish to export from your '.$type.'.<br /><br />');
1.138     raeburn   324:         $display .= '<table border="0" cellspacing="0" cellpadding="3">'.
                    325:                     '<tr><td><fieldset><legend>&nbsp;<b>Content items</b></legend>'.
                    326:                     '<input type="button" value="check all" '.
                    327:                     'onclick="javascript:checkAll(document.exportdoc.archive)" />'.
                    328:                     '&nbsp;&nbsp;<input type="button" value="uncheck all"'.
                    329:                     ' onclick="javascript:uncheckAll(document.exportdoc.archive)" /></fieldset></td>'.
                    330:                     '<td>&nbsp;</td><td>&nbsp;</td>'.
                    331:                     '<td align="right"><fieldset><legend>&nbsp;<b>Discussion posts'.
                    332:                     '</b></legend><input type="button" value="check all"'.
                    333:                     ' onclick="javascript:checkAll(document.exportdoc.discussion)" />'.
                    334:                     '&nbsp;&nbsp;<input type="button" value="uncheck all"'.
                    335:                     ' onclick="javascript:uncheckAll(document.exportdoc.discussion)" /></fieldset></td>'.
                    336:                     '</tr></table>';
                    337:         my $curRes;
                    338:         my $depth = 0;
                    339:         my $count = 0;
                    340:         my $boards = 0;
                    341:         my $startcount = 5;
                    342:         my %parent = ();
                    343:         my %children = ();
                    344:         my $lastcontainer = $startcount;
                    345:         my @bgcolors = ('#F6F6F6','#FFFFFF');
                    346:         $display .= '<table cellspacing="0"><tr>'.
                    347:             '<td><b>Export content item?<br /></b></td><td>&nbsp;</td><td align="right">'."\n";
                    348:         if ($numdisc > 0) {
                    349:             $display.='<b>Export&nbsp;discussion posts?</b>'."\n";
                    350:         }
                    351:         $display.='&nbsp;</td></tr>';
                    352:         while ($curRes = $it->next()) {
                    353:             if (ref($curRes)) {
                    354:                 $count ++;
                    355:             }
                    356:             if ($curRes == $it->BEGIN_MAP()) {
                    357:                 $depth++;
                    358:                 $parent{$depth} = $lastcontainer;
                    359:             }
                    360:             if ($curRes == $it->END_MAP()) {
                    361:                 $depth--;
                    362:                 $lastcontainer = $parent{$depth};
                    363:             }
                    364:             if (ref($curRes)) {
                    365:                 my $symb = $curRes->symb();
1.158     raeburn   366:                 my $ressymb = $symb;
                    367:                 if ($ressymb =~ m|adm/(\w+)/(\w+)/(\d+)/bulletinboard$|) {
                    368:                     unless ($ressymb =~ m|adm/wrapper/adm|) {
                    369:                         $ressymb = 'bulletin___'.$3.'___adm/wrapper/adm/'.$1.'/'.$2.'/'.$3.'/bulletinboard';
                    370:                     }
                    371:                 }
1.138     raeburn   372:                 my $color = $count%2;
                    373:                 $display .='<tr bgcolor='.$bgcolors[$color].'><td>'."\n".
                    374:                     '<input type="checkbox" name="archive" value="'.$count.'" ';
                    375:                 if (($curRes->is_sequence()) || ($curRes->is_page())) {
                    376:                     my $checkitem = $count + $boards + $startcount;
                    377:                     $display .= 'onClick="javascript:propagateCheck('."'$checkitem'".')"';
                    378:                 }
                    379:                 $display .= ' />'."\n";
                    380:                 for (my $i=0; $i<$depth; $i++) {
                    381:                     $display .= '<img src="/adm/lonIcons/whitespace1.gif" width="25" height="1" alt="" border="0" /><img src="/adm/lonIcons/whitespace1.gif" width="25" height="1" alt="" border="0" />'."\n";
                    382:                 }
                    383:                 if ($curRes->is_sequence()) {
                    384:                     $display .= '<img src="/adm/lonIcons/navmap.folder.open.gif">&nbsp;'."\n";
                    385:                     $lastcontainer = $count + $startcount + $boards;
                    386:                 } elsif ($curRes->is_page()) {
                    387:                     $display .= '<img src="/adm/lonIcons/navmap.page.open.gif">&nbsp;'."\n";
                    388:                     $lastcontainer = $count + $startcount + $boards;
                    389:                 }
                    390:                 my $currelem = $count+$boards+$startcount;
                    391:                 $children{$parent{$depth}} .= $currelem.':';
                    392:                 $display .= '&nbsp;'.$curRes->title().'</td>';
1.158     raeburn   393:                 if ($discussiontime{$ressymb} > 0) {
1.138     raeburn   394:                     $boards ++;
                    395:                     $currelem = $count+$boards+$startcount;
                    396:                     $display .= '<td>&nbsp;</td><td align="right"><input type="checkbox" name="discussion" value="'.$count.'" />&nbsp;</td>'."\n";
                    397:                 } else {
                    398:                     $display .= '<td colspan="2">&nbsp;</td>'."\n";
                    399:                 }
                    400:             }
                    401:         }
                    402:         my $scripttag = qq|
                    403: <script>
                    404: 
                    405: function checkAll(field) {
1.158     raeburn   406:     if (field.length > 0) {
                    407:         for (i = 0; i < field.length; i++) {
                    408:             field[i].checked = true ;
                    409:         }
                    410:     } else {
                    411:         field.checked = true
                    412:     }
1.138     raeburn   413: }
1.158     raeburn   414:                                                                                 
1.138     raeburn   415: function uncheckAll(field) {
1.158     raeburn   416:     if (field.length > 0) {
                    417:         for (i = 0; i < field.length; i++) {
                    418:             field[i].checked = false ;
                    419:         }
                    420:     } else {
                    421:         field.checked = false ;
                    422:     }
1.138     raeburn   423: }
                    424: 
                    425: function propagateCheck(item) {
                    426:     if (document.exportdoc.elements[item].checked == true) {
                    427:         containerCheck(item)
                    428:     }
                    429: } 
                    430: 
                    431: function containerCheck(item) {
                    432:     document.exportdoc.elements[item].checked = true
                    433:     var numitems = $count + $boards + $startcount
                    434:     var parents = new Array(numitems)
                    435:     for (var i=$startcount; i<numitems; i++) {
                    436:         parents[i] = new Array
                    437:     }
                    438:         |;
                    439: 
                    440:         foreach my $container (sort { $a <=> $b } keys %children) {
                    441:             my @contents = split/:/,$children{$container};
                    442:             for (my $i=0; $i<@contents; $i ++) {
                    443:                 $scripttag .= '    parents['.$container.']['.$i.'] = '.$contents[$i]."\n";
                    444:             }
                    445:         }
                    446: 
                    447:         $scripttag .= qq|
                    448:     if (parents[item].length > 0) {
                    449:         for (var j=0; j<parents[item].length; j++) {
                    450:             containerCheck(parents[item][j])
                    451:         }
                    452:      }   
                    453: }
                    454: 
                    455: </script>
                    456:         |;
1.229     raeburn   457: 	$r->print(&Apache::loncommon::start_page('Export '.lc($type).' to IMS content package',
1.224     albertel  458: 						 $scripttag));
                    459: 	$r->print($display.'</table>'.
1.138     raeburn   460:                   '<p><input type="hidden" name="finishexport" value="1">'.
                    461:                   '<input type="submit" name="exportcourse" value="'.
1.230     albertel  462:                   &mt('Export '.$type.' DOCS').'" /></p></form>'.
1.224     albertel  463: 		  &Apache::loncommon::end_page());
1.138     raeburn   464:     }
                    465: }
                    466: 
1.143     raeburn   467: sub create_ims_store {
                    468:     my ($now,$manifestok,$outcome,$tempexport) = @_;
                    469:     $$tempexport = $Apache::lonnet::perlvar{'lonDaemons'}.'/tmp/ims_exports';
                    470:     my $ims_manifest;
                    471:     if (!-e $$tempexport) {
                    472:         mkdir($$tempexport,0700);
                    473:     }
                    474:     $$tempexport .= '/'.$now;
                    475:     if (!-e $$tempexport) {
                    476:         mkdir($$tempexport,0700);
                    477:     }
1.174     albertel  478:     $$tempexport .= '/'.$env{'user.domain'}.'_'.$env{'user.name'};
1.143     raeburn   479:     if (!-e $$tempexport) {
                    480:         mkdir($$tempexport,0700);
                    481:     }
1.159     raeburn   482:     if (!-e "$$tempexport/resources") {
                    483:         mkdir("$$tempexport/resources",0700);
                    484:     }
1.143     raeburn   485: # open manifest file
                    486:     my $manifest = '/imsmanifest.xml';
                    487:     my $manifestfilename = $$tempexport.$manifest;
                    488:     if ($ims_manifest = Apache::File->new('>'.$manifestfilename)) {
                    489:         $$manifestok=1;
                    490:         print $ims_manifest
                    491: '<?xml version="1.0" encoding="UTF-8"?>'."\n".
                    492: '<manifest xmlns="http://www.imsglobal.org/xsd/imscp_v1p1"'.
                    493: ' xmlns:imsmd="http://www.imsglobal.org/xsd/imsmd_v1p2"'.
                    494: ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"'.
1.174     albertel  495: ' identifier="MANIFEST-'.$env{'request.course.id'}.'-'.$now.'"'.
1.143     raeburn   496: '  xsi:schemaLocation="http://www.imsglobal.org/xsd/imscp_v1p1imscp_v1p1.xsd'.
                    497: '  http://www.imsglobal.org/xsd/imsmd_v1p2 imsmd_v1p2p2.xsd">'."\n".
1.199     raeburn   498: '  <metadata>
                    499:     <schema></schema>
                    500:     <imsmd:lom>
                    501:       <imsmd:general>
                    502:         <imsmd:identifier>'.$env{'request.course.id'}.'</imsmd:identifier>
                    503:         <imsmd:title>
                    504:           <imsmd:langstring xml:lang="en">'.$env{'course.'.$env{'request.course.id'}.'.description'}.'</imsmd:langstring>
                    505:         </imsmd:title>
                    506:       </imsmd:general>
                    507:     </imsmd:lom>
                    508:   </metadata>'."\n".
1.174     albertel  509: '  <organizations default="ORG-'.$env{'request.course.id'}.'-'.$now.'">'."\n".
                    510: '    <organization identifier="ORG-'.$env{'request.course.id'}.'-'.$now.'"'.
1.143     raeburn   511: ' structure="hierarchical">'."\n".
1.199     raeburn   512: '      <title>'.$env{'course.'.$env{'request.course.id'}.'.description'}.'</title>'
1.143     raeburn   513:     } else {
                    514:         $$outcome .= 'An error occurred opening the IMS manifest file.<br />'
                    515: ;
                    516:     }
                    517:     return $ims_manifest;
                    518: }
                    519: 
                    520: sub build_package {
                    521:     my ($now,$navmap,$exportitems,$discussions,$outcome,$tempexport,$copyresult,$ims_manifest) = @_;
                    522: # first iterator to look for dependencies
                    523:     my $it = $navmap->getIterator(undef,undef,undef,1,undef,undef);
                    524:     my $curRes;
                    525:     my $count = 0;
                    526:     my $depth = 0;
                    527:     my $lastcontainer = 0;
                    528:     my %parent = ();
                    529:     my @dependencies = ();
1.174     albertel  530:     my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
                    531:     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
1.143     raeburn   532:     while ($curRes = $it->next()) {
                    533:         if (ref($curRes)) {
                    534:             $count ++;
                    535:         }
                    536:         if ($curRes == $it->BEGIN_MAP()) {
                    537:             $depth++;
                    538:             $parent{$depth} = $lastcontainer;
                    539:         }
                    540:         if ($curRes == $it->END_MAP()) {
                    541:             $depth--;
                    542:             $lastcontainer = $parent{$depth};
                    543:         }
                    544:         if (ref($curRes)) {
                    545:             if ($curRes->is_sequence() || $curRes->is_page()) {
                    546:                 $lastcontainer = $count;
                    547:             }
                    548:             if (grep/^$count$/,@$exportitems) {
                    549:                 &get_dependencies($exportitems,\%parent,$depth,\@dependencies);
                    550:             }
                    551:         }
                    552:     }
                    553: # second iterator to build manifest and store resources
                    554:     $it = $navmap->getIterator(undef,undef,undef,1,undef,undef);
                    555:     $depth = 0;
                    556:     my $prevdepth;
                    557:     $count = 0;
                    558:     my $imsresources;
                    559:     my $pkgdepth;
1.157     raeburn   560:     while ($curRes = $it->next()) {
                    561:         if ($curRes == $it->BEGIN_MAP()) {
                    562:             $prevdepth = $depth;
                    563:             $depth++;
                    564:         }
                    565:         if ($curRes == $it->END_MAP()) {
1.143     raeburn   566:             $prevdepth = $depth;
1.157     raeburn   567:             $depth--;
                    568:         }
                    569: 
                    570:         if (ref($curRes)) {
                    571:             $count ++;
                    572:             if ((grep/^$count$/,@$exportitems) || (grep/^$count$/,@dependencies)) {
                    573:                 my $symb = $curRes->symb();
                    574:                 my $isvisible = 'true';
                    575:                 my $resourceref;
                    576:                 if ($curRes->randomout()) {
                    577:                     $isvisible = 'false';
                    578:                 }
                    579:                 unless ($curRes->is_sequence()) {
1.174     albertel  580:                     $resourceref = 'identifierref="RES-'.$env{'request.course.id'}.'-'.$count.'"';
1.157     raeburn   581:                 }
1.199     raeburn   582:                 my $step = $prevdepth - $depth;
                    583:                 if (($step >= 0) && ($count > 1)) {
                    584:                     while ($step >= 0) {
                    585:                         print $ims_manifest "\n".'  </item>'."\n";
                    586:                         $step --;
                    587:                     }
1.157     raeburn   588:                 }
                    589:                 $prevdepth = $depth;
1.143     raeburn   590: 
1.157     raeburn   591:                 my $itementry =
1.174     albertel  592:               '<item identifier="ITEM-'.$env{'request.course.id'}.'-'.$count.
1.143     raeburn   593:               '" isvisible="'.$isvisible.'" '.$resourceref.'>'.
                    594:               '<title>'.$curRes->title().'</title>';
1.157     raeburn   595:                 print $ims_manifest "\n".$itementry;
1.143     raeburn   596: 
1.157     raeburn   597:                 unless ($curRes->is_sequence()) {
                    598:                     my $content_file;
                    599:                     my @hrefs = ();
                    600:                     &process_content($count,$curRes,$cdom,$cnum,$symb,\$content_file,\@hrefs,$copyresult,$tempexport);
                    601:                     if ($content_file) {
                    602:                         $imsresources .= "\n".
1.174     albertel  603:                      '   <resource identifier="RES-'.$env{'request.course.id'}.'-'.$count.
1.143     raeburn   604:                      '" type="webcontent" href="'.$content_file.'">'."\n".
                    605:                      '       <file href="'.$content_file.'" />'."\n";
1.157     raeburn   606:                         foreach (@hrefs) {
                    607:                             $imsresources .=
1.143     raeburn   608:                      '        <file href="'.$_.'" />'."\n";
1.157     raeburn   609:                         }
1.158     raeburn   610:                         if (grep/^$count$/,@$discussions) {
                    611:                             my $ressymb = $symb;
                    612:                             my $mode;
                    613:                             if ($ressymb =~ m|adm/(\w+)/(\w+)/(\d+)/bulletinboard$|) {
                    614:                                 unless ($ressymb =~ m|adm/wrapper/adm|) {
                    615:                                     $ressymb = 'bulletin___'.$3.'___adm/wrapper/adm/'.$1.'/'.$2.'/'.$3.'/bulletinboard';
                    616:                                 }
                    617:                                 $mode = 'board';
                    618:                             }
                    619:                             my %extras = (
                    620:                                           caller => 'imsexport',
1.159     raeburn   621:                                           tempexport => $tempexport.'/resources',
1.158     raeburn   622:                                           count => $count
                    623:                                          );
                    624:                             my $discresult = &Apache::lonfeedback::list_discussion($mode,undef,$ressymb,\%extras);
                    625:                         }
1.157     raeburn   626:                         $imsresources .= '    </resource>'."\n";
1.143     raeburn   627:                     }
                    628:                 }
1.157     raeburn   629:                 $pkgdepth = $depth;
1.143     raeburn   630:             }
                    631:         }
                    632:     }
1.157     raeburn   633:     while ($pkgdepth > 0) {
1.143     raeburn   634:         print $ims_manifest "    </item>\n";
                    635:         $pkgdepth --;
                    636:     }
                    637:     my $resource_text = qq|
                    638:     </organization>
                    639:   </organizations>
                    640:   <resources>
                    641:     $imsresources
                    642:   </resources>
                    643: </manifest>
                    644:     |;
                    645:     print $ims_manifest $resource_text;
                    646: }
                    647: 
                    648: sub get_dependencies {
                    649:     my ($exportitems,$parent,$depth,$dependencies) = @_;
                    650:     if ($depth > 1) {
1.157     raeburn   651:         if ((!grep/^$$parent{$depth}$/,@$exportitems) && (!grep/^$$parent{$depth}$/,@$dependencies)) {
1.143     raeburn   652:             push @$dependencies, $$parent{$depth};
                    653:             if ($depth > 2) {
                    654:                 &get_dependencies($exportitems,$parent,$depth-1,$dependencies);
                    655:             }
                    656:         }
                    657:     }
                    658: }
                    659: 
                    660: sub process_content {
                    661:     my ($count,$curRes,$cdom,$cnum,$symb,$content_file,$href,$copyresult,$tempexport) = @_;
                    662:     my $content_type;
                    663:     my $message;
1.158     raeburn   664:     my @uploads = ();
1.157     raeburn   665:     if ($curRes->is_sequence()) {
                    666:         $content_type = 'sequence';
                    667:     } elsif ($curRes->is_page()) {
                    668:         $content_type = 'page'; # need to handle individual items in pages.
1.143     raeburn   669:     } elsif ($symb =~ m-public/$cdom/$cnum/syllabus$-) {
                    670:         $content_type = 'syllabus';
1.158     raeburn   671:         my $contents = &Apache::imsexport::templatedpage($content_type);
                    672:         if ($contents) {
                    673:             $$content_file = &store_template($contents,$tempexport,$count,$content_type);
                    674:         }
1.157     raeburn   675:     } elsif ($symb =~ m-\.sequence___\d+___ext-) {
1.143     raeburn   676:         $content_type = 'external';
1.158     raeburn   677:         my $title = $curRes->title;
                    678:         my $contents =  &Apache::imsexport::external($symb,$title);
                    679:         if ($contents) {
                    680:             $$content_file = &store_template($contents,$tempexport,$count,$content_type);
                    681:         }
1.143     raeburn   682:     } elsif ($symb =~ m-adm/navmaps$-) {
                    683:         $content_type =  'navmap';
1.158     raeburn   684:     } elsif ($symb =~ m-adm/[^/]+/[^/]+/(\d+)/smppg$-) {
1.143     raeburn   685:         $content_type = 'simplepage';
1.158     raeburn   686:         my $contents = &Apache::imsexport::templatedpage($content_type,$1,$count,\@uploads);
                    687:         if ($contents) {
                    688:             $$content_file = &store_template($contents,$tempexport,$count,$content_type);
                    689:         }
                    690:     } elsif ($symb =~ m-lib/templates/simpleproblem\.problem$-) {
1.143     raeburn   691:         $content_type = 'simpleproblem';
1.158     raeburn   692:         my $contents =  &Apache::imsexport::simpleproblem($symb);
                    693:         if ($contents) {
                    694:             $$content_file = &store_template($contents,$tempexport,$count,$content_type);
                    695:         }
1.188     raeburn   696:     } elsif ($symb =~ m-lib/templates/examupload\.problem$-) {
1.158     raeburn   697:         $content_type = 'examupload';
                    698:     } elsif ($symb =~ m-adm/(\w+)/(\w+)/(\d+)/bulletinboard$-) {
1.143     raeburn   699:         $content_type = 'bulletinboard';
1.158     raeburn   700:         my $contents =  &Apache::imsexport::templatedpage($content_type,$3,$count,\@uploads,$1,$2);
                    701:         if ($contents) {
                    702:             $$content_file = &store_template($contents,$tempexport,$count,$content_type);
                    703:         }
                    704:     } elsif ($symb =~ m-adm/([^/]+)/([^/]+)/aboutme$-) {
1.143     raeburn   705:         $content_type = 'aboutme';
1.158     raeburn   706:         my $contents =  &Apache::imsexport::templatedpage($content_type,undef,$count,\@uploads,$1,$2);
                    707:         if ($contents) {
                    708:             $$content_file = &store_template($contents,$tempexport,$count,$content_type);
                    709:         }
1.157     raeburn   710:     } elsif ($symb =~ m-\.(sequence|page)___\d+___uploaded/$cdom/$cnum/-) {
                    711:         $$content_file = &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,$href,'uploaded');
1.162     raeburn   712:     } elsif ($symb =~ m-\.(sequence|page)___\d+___([^/]+)/([^/]+)-) {
1.143     raeburn   713:         my $canedit = 0;
1.174     albertel  714:         if ($2 eq $env{'user.domain'} && $3 eq $env{'user.name'})  {
1.143     raeburn   715:             $canedit= 1;
                    716:         }
1.200     raeburn   717: # only include problem code where current user is author
1.143     raeburn   718:         if ($canedit) {
1.157     raeburn   719:             $$content_file = &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,$href,'resource');
1.143     raeburn   720:         } else {
1.157     raeburn   721:             $$content_file = &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,$href,'noedit');
1.143     raeburn   722:         }
1.162     raeburn   723:     } elsif ($symb =~ m-uploaded/$cdom/$cnum-) {
                    724:         $$content_file = &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,$href,'uploaded');
1.143     raeburn   725:     }
1.158     raeburn   726:     if (@uploads > 0) {
                    727:         foreach my $item (@uploads) {
                    728:             my $uploadmsg = '';
1.159     raeburn   729:             &replicate_content($cdom,$cnum,$tempexport,$item,$count,\$uploadmsg,$href,'templateupload');
1.158     raeburn   730:             if ($uploadmsg) {
                    731:                 $$copyresult .= $uploadmsg."\n";
                    732:             }
                    733:         }
                    734:     }
1.157     raeburn   735:     if ($message) {
                    736:         $$copyresult .= $message."\n";
                    737:     }
1.143     raeburn   738: }
                    739: 
                    740: sub replicate_content {
1.157     raeburn   741:     my ($cdom,$cnum,$tempexport,$symb,$count,$message,$href,$caller) = @_;
1.159     raeburn   742:     my ($map,$ind,$url);
                    743:     if ($caller eq 'templateupload') {
                    744:         $url = $symb;
                    745:         $url =~ s#//#/#g;
                    746:     } else { 
                    747:         ($map,$ind,$url)=&Apache::lonnet::decode_symb($symb);
                    748:     }
1.143     raeburn   749:     my $content;
                    750:     my $filename;
                    751:     my $repstatus;
1.157     raeburn   752:     my $content_name;
                    753:     if ($url =~ m-/([^/]+)$-) {
1.143     raeburn   754:         $filename = $1;
                    755:         if (!-e $tempexport.'/resources') {
                    756:             mkdir($tempexport.'/resources',0700);
                    757:         }
1.157     raeburn   758:         if (!-e $tempexport.'/resources/'.$count) {
1.143     raeburn   759:             mkdir($tempexport.'/resources/'.$count,0700);
                    760:         }
1.157     raeburn   761:         my $destination = $tempexport.'/resources/'.$count.'/'.$filename;
1.143     raeburn   762:         my $copiedfile;
                    763:         if ($copiedfile = Apache::File->new('>'.$destination)) {
                    764:             my $content;
1.157     raeburn   765:             if ($caller eq 'resource') {
1.197     raeburn   766:                 my $respath =  $Apache::lonnet::perlvar{'lonDocRoot'}.'/res';
                    767:                 my $filepath = &Apache::lonnet::filelocation($respath,$url);
                    768:                 $content = &Apache::lonnet::getfile($filepath);
1.143     raeburn   769:                 if ($content eq -1) {
                    770:                     $$message = 'Could not copy file '.$filename;
                    771:                 } else {
1.197     raeburn   772:                     &extract_media($url,$cdom,$cnum,\$content,$count,$tempexport,$href,$message,'resource');
1.143     raeburn   773:                     $repstatus = 'ok';
                    774:                 }
1.162     raeburn   775:             } elsif ($caller eq 'uploaded' || $caller eq 'templateupload') {
1.143     raeburn   776:                 my $rtncode;
1.157     raeburn   777:                 $repstatus = &Apache::lonnet::getuploaded('GET',$url,$cdom,$cnum,\$content,$rtncode);
                    778:                 if ($repstatus eq 'ok') {
                    779:                     if ($url =~ /\.html?$/i) {
1.197     raeburn   780:                         &extract_media($url,$cdom,$cnum,\$content,$count,$tempexport,$href,$message,'uploaded');
1.157     raeburn   781:                     }
                    782:                 } else {
1.197     raeburn   783:                     $$message = 'Could not render '.$url.' server message - '.$rtncode."<br />\n";
1.143     raeburn   784:                 }
1.162     raeburn   785:             } elsif ($caller eq 'noedit') {
                    786: # Need to render the resource without the LON-CAPA Internal header and the Post discussion footer, and then set $content equal to this. 
                    787:                 $repstatus = 'ok';
                    788:                 $content = 'Not the owner of this resource'; 
1.143     raeburn   789:             }
                    790:             if ($repstatus eq 'ok') {
                    791:                 print $copiedfile $content;
                    792:             }
                    793:             close($copiedfile);
                    794:         } else {
1.197     raeburn   795:             $$message = 'Could not open destination file for '.$filename."<br />\n";
1.143     raeburn   796:         }
                    797:     } else {
1.197     raeburn   798:         $$message = 'Could not determine name of file for '.$symb."<br />\n";
1.143     raeburn   799:     }
1.157     raeburn   800:     if ($repstatus eq 'ok') {
1.198     raeburn   801:         $content_name = 'resources/'.$count.'/'.$filename;
1.157     raeburn   802:     }
                    803:     return $content_name;
                    804: }
                    805: 
                    806: sub extract_media {
1.197     raeburn   807:     my ($url,$cdom,$cnum,$content,$count,$tempexport,$href,$message,$caller) = @_;
1.198     raeburn   808:     my ($dirpath,$container);
1.197     raeburn   809:     my %allfiles = ();
                    810:     my %codebase = ();
1.198     raeburn   811:     if ($url =~ m-(.*/)([^/]+)$-) {
                    812:         $dirpath = $1;
                    813:         $container = $2;
                    814:     } else {
                    815:         $dirpath = $url;
                    816:         $container = '';
                    817:     }
1.197     raeburn   818:     &Apache::lonnet::extract_embedded_items(undef,undef,\%allfiles,\%codebase,$content);
                    819:     foreach my $embed_file (keys(%allfiles)) {
                    820:         my $filename;
                    821:         if ($embed_file =~ m#([^/]+)$#) {
                    822:             $filename = $1;
                    823:         } else {
                    824:             $filename = $embed_file;
                    825:         }
                    826:         my $newname = 'res/'.$filename;
                    827:         my ($rtncode,$embed_content,$repstatus);
                    828:         my $embed_url;
                    829:         if ($embed_file =~ m-^/-) {
                    830:             $embed_url = $embed_file;           # points to absolute path
                    831:         } else {
                    832:             if ($embed_file =~ m-https?://-) {
                    833:                 next;                           # points to url
                    834:             } else {
1.198     raeburn   835:                 $embed_url = $dirpath.$embed_file;  # points to relative path
1.197     raeburn   836:             }
                    837:         }
                    838:         if ($caller eq 'resource') {
                    839:             my $respath =  $Apache::lonnet::perlvar{'lonDocRoot'}.'/res';  
                    840:             my $embed_path = &Apache::lonnet::filelocation($respath,$embed_url); 
                    841:             $embed_content = &Apache::lonnet::getfile($embed_path);
                    842:             unless ($embed_content eq -1) {
                    843:                 $repstatus = 'ok';
                    844:             }
                    845:         } elsif ($caller eq 'uploaded') {
                    846:             
                    847:             $repstatus = &Apache::lonnet::getuploaded('GET',$embed_url,$cdom,$cnum,\$embed_content,$rtncode);
                    848:         }
                    849:         if ($repstatus eq 'ok') {
                    850:             my $destination = $tempexport.'/resources/'.$count.'/res';
                    851:             if (!-e "$destination") {
                    852:                 mkdir($destination,0755);
                    853:             }
                    854:             $destination .= '/'.$filename;
                    855:             my $copiedfile;
                    856:             if ($copiedfile = Apache::File->new('>'.$destination)) {
                    857:                 print $copiedfile $embed_content;
1.198     raeburn   858:                 push @{$href}, 'resources/'.$count.'/res/'.$filename;
1.197     raeburn   859:                 my $attrib_regexp = '';
                    860:                 if (@{$allfiles{$embed_file}} > 1) {
                    861:                     $attrib_regexp = join('|',@{$allfiles{$embed_file}});
                    862:                 } else {
                    863:                     $attrib_regexp = $allfiles{$embed_file}[0];
                    864:                 }
                    865:                 $$content =~ s#($attrib_regexp\s*=\s*['"]?)\Q$embed_file\E(['"]?)#$1$newname$2#gi;
1.198     raeburn   866:                 if ($caller eq 'resource' && $container =~ /\.(problem|library)$/) {
1.197     raeburn   867:                     $$content =~ s#\Q$embed_file\E#$newname#gi;
                    868:                 }
                    869:             }
                    870:         } else {
                    871:             $$message .= 'replication of embedded file - '.$embed_file.' in '.$url.' failed, reason -'.$rtncode."<br />\n";
                    872:         }
                    873:     }
1.157     raeburn   874:     return;
1.143     raeburn   875: }
1.74      www       876: 
1.158     raeburn   877: sub store_template {
                    878:     my ($contents,$tempexport,$count,$content_type) = @_;
                    879:     if ($contents) {
1.159     raeburn   880:         if ($tempexport) {
                    881:             if (!-e $tempexport.'/resources') {
                    882:                 mkdir($tempexport.'/resources',0700);
                    883:             }
                    884:             if (!-e $tempexport.'/resources/'.$count) {
                    885:                 mkdir($tempexport.'/resources/'.$count,0700);
                    886:             }
                    887:             my $destination = $tempexport.'/resources/'.$count.'/'.$content_type.'.xml';
                    888:             my $storetemplate;
                    889:             if ($storetemplate = Apache::File->new('>'.$destination)) {
                    890:                 print $storetemplate $contents;
                    891:                 close($storetemplate);
                    892:             }
                    893:             if ($content_type eq 'external') {
1.198     raeburn   894:                 return 'resources/'.$count.'/'.$content_type.'.html';
1.159     raeburn   895:             } else {
1.198     raeburn   896:                 return 'resources/'.$count.'/'.$content_type.'.xml';
1.159     raeburn   897:             }
1.158     raeburn   898:         }
                    899:     }
                    900: }
                    901: 
1.73      bowersj2  902: # Imports the given (name, url) resources into the course
                    903: # coursenum, coursedom, and folder must precede the list
                    904: sub group_import {
                    905:     my $coursenum = shift;
                    906:     my $coursedom = shift;
                    907:     my $folder = shift;
1.142     raeburn   908:     my $container = shift;
                    909:     my $caller = shift;
1.73      bowersj2  910:     while (@_) {
                    911: 	my $name = shift;
                    912: 	my $url = shift;
1.142     raeburn   913:         if (($url =~ m#^/uploaded/$coursedom/$coursenum/(default_\d+\.)(page|sequence)$#) && ($caller eq 'londocs')) {
                    914:             my $errtext = '';
                    915:             my $fatal = 0;
                    916:             my $newmapstr = '<map>'."\n".
                    917:                             '<resource id="1" src="" type="start"></resource>'."\n".
                    918:                             '<link from="1" to="2" index="1"></link>'."\n".
                    919:                             '<resource id="2" src="" type="finish"></resource>'."\n".
                    920:                             '</map>';
1.174     albertel  921:             $env{'form.output'}=$newmapstr;
1.189     albertel  922:             my $result=&Apache::lonnet::finishuserfileupload($coursenum,$coursedom,
1.142     raeburn   923:                                                 'output',$1.$2);
                    924:             if ($result != m|^/uploaded/|) {
                    925:                 $errtext.='Map not saved: A network error occured when trying to save the new map. ';
                    926:                 $fatal = 2;
                    927:             }
                    928:             if ($fatal) {
                    929:                 return ($errtext,$fatal);
                    930:             }
                    931:         }
1.73      bowersj2  932: 	if ($url) {
1.245     albertel  933: 	    my $idx = &LONCAPA::map::getresidx($url);
                    934: 	    $LONCAPA::map::order[$#LONCAPA::map::order+1]=$idx;
1.73      bowersj2  935: 	    my $ext = 'false';
                    936: 	    if ($url=~/^http:\/\//) { $ext = 'true'; }
                    937: 	    $url =~ s/:/\&colon;/g;
                    938: 	    $name =~ s/:/\&colon;/g;
1.245     albertel  939: 	    $LONCAPA::map::resources[$idx] = 
1.73      bowersj2  940: 		join ':', ($name, $url, $ext, 'normal', 'res');
                    941: 	}
                    942:     }
1.142     raeburn   943:     return &storemap($coursenum, $coursedom, $folder.'.'.$container);
1.73      bowersj2  944: }
                    945: 
1.114     albertel  946: sub breadcrumbs {
                    947:     my ($where)=@_;
                    948:     &Apache::lonhtmlcommon::clear_breadcrumbs();
1.142     raeburn   949:     my (@folders);
1.174     albertel  950:     if ($env{'form.pagepath'}) {
                    951:         @folders = split('&',$env{'form.pagepath'});
1.142     raeburn   952:     } else {
1.174     albertel  953:         @folders=split('&',$env{'form.folderpath'});
1.142     raeburn   954:     }
1.116     albertel  955:     my $folderpath;
1.168     www       956:     my $cpinfo='';
1.174     albertel  957:     if ($env{'form.markedcopy_url'}) {
1.168     www       958:        $cpinfo='&markedcopy_url='.
1.228     www       959:                &escape($env{'form.markedcopy_url'}).
1.168     www       960:                '&markedcopy_title='.
1.228     www       961:                &escape($env{'form.markedcopy_title'});
1.168     www       962:     }
1.242     www       963:     my $randompick=-1;
                    964:     my $isencrypted=0;
                    965:     my $ishidden=0;
1.116     albertel  966:     while (@folders) {
                    967: 	my $folder=shift(@folders);
                    968: 	my $foldername=shift(@folders);
                    969: 	if ($folderpath) {$folderpath.='&';}
                    970: 	$folderpath.=$folder.'&'.$foldername;
                    971: 	my $url='/adm/coursedocs?folderpath='.
1.228     www       972: 	    &escape($folderpath);
1.242     www       973:             my $name=&unescape($foldername);
                    974: # randompick number, hidden, encrypted is appended with ":"s to the foldername	
                    975:             $name=~s/\:(\d*)\:(\w*)\:(\w*)$//;
                    976:             if ($1 ne '') { 
                    977:                $randompick=$1;
                    978:             } else {
                    979:                $randompick=-1;
                    980:             }
                    981:             if ($2) { $ishidden=1; }
                    982:             if ($3) { $isencrypted=1; }
1.114     albertel  983: 	    &Apache::lonhtmlcommon::add_breadcrumb(
1.168     www       984: 		      {'href'=>$url.$cpinfo,
1.242     www       985: 		       'title'=>$name,
1.117     albertel  986: 		       'text'=>'<font size="+1">'.
1.242     www       987: 			   $name.'</font>'
1.117     albertel  988: 		       });
1.114     albertel  989:     }
1.242     www       990:     return (&Apache::lonhtmlcommon::breadcrumbs(undef,undef,0,'nohelp',
                    991: 					       'LC_docs_path'),$randompick,$ishidden,$isencrypted);
1.114     albertel  992: }
                    993: 
1.7       www       994: sub editor {
1.188     raeburn   995:     my ($r,$coursenum,$coursedom,$folder,$allowed,$upload_output)=@_;
1.10      www       996:     my $errtext='';
                    997:     my $fatal=0;
1.142     raeburn   998:     my $container='sequence';
1.174     albertel  999:     if ($env{'form.pagepath'}) {
1.142     raeburn  1000:         $container='page';
                   1001:     }
1.10      www      1002:     ($errtext,$fatal)=
1.142     raeburn  1003:               &mapread($coursenum,$coursedom,$folder.'.'.$container);
1.245     albertel 1004:     if ($#LONCAPA::map::order<1) {
                   1005: 	my $idx=&LONCAPA::map::getresidx();
1.178     www      1006: 	if ($idx<=0) { $idx=1; }
1.245     albertel 1007:        	$LONCAPA::map::order[0]=$idx;
                   1008:         $LONCAPA::map::resources[$idx]='';
1.17      www      1009:     }
1.174     albertel 1010:     if (defined($env{'form.markcopy'})) {
1.168     www      1011: # Mark for copying
1.245     albertel 1012: 	my ($title,$url)=split(':',$LONCAPA::map::resources[$LONCAPA::map::order[$env{'form.markcopy'}]]);
1.174     albertel 1013: 	$env{'form.markedcopy_title'}=$title;
                   1014: 	$env{'form.markedcopy_url'}=$url;
1.168     www      1015:     }
1.242     www      1016:     my ($breadcrumbtrail,$randompick,$ishidden,$isencrypted)=&breadcrumbs($folder);
                   1017:     $r->print($breadcrumbtrail);
1.7       www      1018:     if ($fatal) {
                   1019: 	   $r->print('<p><font color="red">'.$errtext.'</font></p>');
                   1020:     } else {
                   1021: # ------------------------------------------------------------ Process commands
1.121     www      1022: 
1.16      www      1023: # ---------------- if they are for this folder and user allowed to make changes
1.174     albertel 1024: 	if (($allowed) && ($env{'form.folder'} eq $folder)) {
1.123     www      1025: # set parameters and change order
1.174     albertel 1026: 	    if (defined($env{'form.setparms'})) {
                   1027: 		my $idx=$env{'form.setparms'};
1.123     www      1028: # set parameters
1.174     albertel 1029: 		if ($env{'form.randpick_'.$idx}) {
1.245     albertel 1030: 		    &LONCAPA::map::storeparameter($idx,'parameter_randompick',$env{'form.randpick_'.$idx},'int_pos');
1.121     www      1031: 		} else {
1.245     albertel 1032: 		    &LONCAPA::map::delparameter($idx,'parameter_randompick');
1.121     www      1033: 		}
1.174     albertel 1034: 		if ($env{'form.hidprs_'.$idx}) {
1.245     albertel 1035: 		    &LONCAPA::map::storeparameter($idx,'parameter_hiddenresource','yes','string_yesno');
1.121     www      1036: 		} else {
1.245     albertel 1037: 		    &LONCAPA::map::delparameter($idx,'parameter_hiddenresource');
1.121     www      1038: 		}
1.174     albertel 1039: 		if ($env{'form.encprs_'.$idx}) {
1.245     albertel 1040: 		    &LONCAPA::map::storeparameter($idx,'parameter_encrypturl','yes','string_yesno');
1.121     www      1041: 		} else {
1.245     albertel 1042: 		    &LONCAPA::map::delparameter($idx,'parameter_encrypturl');
1.121     www      1043: 		}
                   1044: 
1.174     albertel 1045: 		if ($env{'form.newpos'}) {
1.123     www      1046: # change order
                   1047: 
1.174     albertel 1048: 		    my $newpos=$env{'form.newpos'}-1;
                   1049: 		    my $currentpos=$env{'form.currentpos'}-1;
1.125     www      1050: 		    my $i;
                   1051: 		    my @neworder=();
                   1052: 		    if ($newpos>$currentpos) {
                   1053: # moving stuff up
                   1054: 			for ($i=0;$i<$currentpos;$i++) {
1.245     albertel 1055: 			    $neworder[$i]=$LONCAPA::map::order[$i];
1.125     www      1056: 			}
                   1057: 			for ($i=$currentpos;$i<$newpos;$i++) {
1.245     albertel 1058: 			    $neworder[$i]=$LONCAPA::map::order[$i+1];
1.125     www      1059: 			}
1.245     albertel 1060:                         $neworder[$newpos]=$LONCAPA::map::order[$currentpos];
                   1061: 			for ($i=$newpos+1;$i<=$#LONCAPA::map::order;$i++) {
                   1062: 			    $neworder[$i]=$LONCAPA::map::order[$i];
1.125     www      1063: 			}
                   1064: 		    } else {
                   1065: # moving stuff down
                   1066: 			for ($i=0;$i<$newpos;$i++) {
1.245     albertel 1067: 			    $neworder[$i]=$LONCAPA::map::order[$i];
1.125     www      1068: 			}
1.245     albertel 1069: 			$neworder[$newpos]=$LONCAPA::map::order[$currentpos];
1.125     www      1070: 			for ($i=$newpos+1;$i<$currentpos+1;$i++) {
1.245     albertel 1071: 			    $neworder[$i]=$LONCAPA::map::order[$i-1];
1.125     www      1072: 			}
1.245     albertel 1073: 			for ($i=$currentpos+1;$i<=$#LONCAPA::map::order;$i++) {
                   1074: 			    $neworder[$i]=$LONCAPA::map::order[$i];
1.125     www      1075: 			}
                   1076: 		    }
1.245     albertel 1077: 		    @LONCAPA::map::order=@neworder;
1.124     www      1078: 		}
                   1079: # store the changed version
1.123     www      1080: 
1.142     raeburn  1081: 		($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container);
1.124     www      1082: 		if ($fatal) {
                   1083: 		    $r->print('<p><font color="red">'.$errtext.'</font></p>');
                   1084: 		    return;
1.123     www      1085: 		}
1.124     www      1086: 		
                   1087: 	    }
1.174     albertel 1088: 	    if ($env{'form.pastemarked'}) {
1.168     www      1089: # paste resource to end of list
1.174     albertel 1090:                 my $url=$env{'form.markedcopy_url'};
                   1091: 		my $title=$env{'form.markedcopy_title'};
1.168     www      1092: # Maps need to be copied first
                   1093: 		if (($url=~/\.(page|sequence)$/) || ($url=~/^\/uploaded\//)) {
                   1094: 		    $title=&mt('Copy of').' '.$title;
                   1095:                     my $newid=$$.time;
                   1096: 		    $url=~/^(.+)\.(\w+)$/;
                   1097: 		    my $newurl=$1.$newid.'.'.$2;
                   1098: 		    my $storefn=$newurl;
                   1099:                     $storefn=~s/^\/\w+\/\w+\/\w+\///;
1.244     albertel 1100: 		    &Apache::lonclonecourse::writefile
1.174     albertel 1101: 			($env{'request.course.id'},$storefn,
1.168     www      1102: 			 &Apache::lonnet::getfile($url));
                   1103: 		    $url=$newurl;
                   1104: 		}
                   1105: 		$title=~s/\</\&lt\;/g;
                   1106: 		$title=~s/\>/\&gt\;/g;
                   1107: 		$title=~s/\:/\&colon;/g;
                   1108: 		my $ext='false';
                   1109: 		if ($url=~/^http\:\/\//) { $ext='true'; }
                   1110: 		$url=~s/\:/\&colon;/g;
                   1111: # Now insert the URL at the bottom
1.245     albertel 1112:                 my $newidx=&LONCAPA::map::getresidx($url);
                   1113: 		$LONCAPA::map::resources[$newidx]=
1.168     www      1114: 		    $title.':'.$url.':'.$ext.':normal:res';
1.245     albertel 1115: 		$LONCAPA::map::order[1+$#LONCAPA::map::order]=$newidx;
1.168     www      1116: # Store the result
                   1117: 		($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container);
                   1118: 		if ($fatal) {
                   1119: 		    $r->print('<p><font color="red">'.$errtext.'</font></p>');
                   1120: 		    return;
                   1121: 		}
1.123     www      1122: 
1.168     www      1123: 	    }
1.188     raeburn  1124:             $r->print($upload_output);
1.174     albertel 1125: 	    if ($env{'form.cmd'}) {
                   1126:                 my ($cmd,$idx)=split(/\_/,$env{'form.cmd'});
1.10      www      1127:                 if ($cmd eq 'del') {
1.245     albertel 1128: 		    my (undef,$url)=split(':',$LONCAPA::map::resources[$LONCAPA::map::order[$idx]]);
1.187     www      1129: 		    if (($url=~m|/+uploaded/\Q$coursedom\E/\Q$coursenum\E/|) &&
1.206     albertel 1130: 			($url!~/\.(page|sequence|problem|exam|quiz|assess|survey|form|library|task)$/)) {
1.187     www      1131: 			&Apache::lonnet::removeuploadedurl($url);
                   1132: 		    } else {
1.245     albertel 1133: 			&LONCAPA::map::makezombie($LONCAPA::map::order[$idx]);
1.128     albertel 1134: 		    }
1.245     albertel 1135: 		    for (my $i=$idx;$i<$#LONCAPA::map::order;$i++) {
                   1136:                         $LONCAPA::map::order[$i] = $LONCAPA::map::order[$i+1];
1.10      www      1137:                     }
1.245     albertel 1138:                     $#LONCAPA::map::order--;
1.171     www      1139:                 } elsif ($cmd eq 'cut') {
1.245     albertel 1140: 		    my (undef,$url)=split(':',$LONCAPA::map::resources[$LONCAPA::map::order[$idx]]);
                   1141: 		    &LONCAPA::map::makezombie($LONCAPA::map::order[$idx]);
                   1142: 		    for (my $i=$idx;$i<$#LONCAPA::map::order;$i++) {
                   1143:                         $LONCAPA::map::order[$i] = $LONCAPA::map::order[$i+1];
1.171     www      1144:                     }
1.245     albertel 1145:                     $#LONCAPA::map::order--;
1.10      www      1146:                 } elsif ($cmd eq 'up') {
1.245     albertel 1147: 		  if (($idx) && (defined($LONCAPA::map::order[$idx-1]))) {
                   1148:                     my $i=$LONCAPA::map::order[$idx-1];
                   1149:                     $LONCAPA::map::order[$idx-1] = $LONCAPA::map::order[$idx];
                   1150:                     $LONCAPA::map::order[$idx] = $i;
1.38      www      1151: 		   }
1.10      www      1152:                 } elsif ($cmd eq 'down') {
1.245     albertel 1153: 		   if (defined($LONCAPA::map::order[$idx+1])) {
                   1154:                     my $i=$LONCAPA::map::order[$idx+1];
                   1155:                     $LONCAPA::map::order[$idx+1] = $LONCAPA::map::order[$idx];
                   1156:                     $LONCAPA::map::order[$idx] = $i;
1.38      www      1157: 		   }
1.36      www      1158:                 } elsif ($cmd eq 'rename') {
1.245     albertel 1159:                     my $ratstr = $LONCAPA::map::resources[$LONCAPA::map::order[$idx]];
1.36      www      1160:                     my ($rtitle,@rrest)=split(/\:/,
1.245     albertel 1161:                        $LONCAPA::map::resources[$LONCAPA::map::order[$idx]]);
1.38      www      1162:                     my $comment=
1.174     albertel 1163:                      &HTML::Entities::decode($env{'form.title'});
1.36      www      1164:                     $comment=~s/\</\&lt\;/g;
                   1165:                     $comment=~s/\>/\&gt\;/g;
                   1166:                     $comment=~s/\:/\&colon;/g;
1.144     albertel 1167: 		    if ($comment=~/\S/) {
1.245     albertel 1168: 			$LONCAPA::map::resources[$LONCAPA::map::order[$idx]]=
                   1169: 			    $comment.':'.join(':',@rrest);
1.144     albertel 1170: 		    }
1.238     www      1171: # Devalidate title cache
1.240     www      1172:                     my $renamed_url=$rrest[0];
                   1173: # Has the &colon;-escaping
                   1174:                     $renamed_url=~s/\&colon\;/\:/g;
                   1175: 		    &Apache::lonnet::devalidate_title_cache($renamed_url);
1.10      www      1176:                 }
                   1177: # Store the changed version
1.104     albertel 1178: 		($errtext,$fatal)=&storemap($coursenum,$coursedom,
1.142     raeburn  1179: 					    $folder.'.'.$container);
1.104     albertel 1180: 		if ($fatal) {
                   1181: 		    $r->print('<p><font color="red">'.$errtext.'</font></p>');
                   1182: 		    return;
                   1183: 		}
1.8       www      1184:             }
1.11      www      1185: # Group import/search
1.174     albertel 1186: 	    if ($env{'form.importdetail'}) {
1.73      bowersj2 1187: 		my @imports;
1.243     www      1188: #		&Apache::lonnet::logthis("imp detail ".$env{'form.importdetail'});
1.174     albertel 1189: 		foreach (split(/\&/,$env{'form.importdetail'})) {
1.73      bowersj2 1190: 		    if (defined($_)) {
                   1191: 			my ($name,$url)=split(/\=/,$_);
1.228     www      1192: 			$name=&unescape($name);
                   1193: 			$url=&unescape($url);
1.73      bowersj2 1194: 			push @imports, $name, $url;
                   1195: 		    }
                   1196: 		}
1.11      www      1197: # Store the changed version
1.104     albertel 1198: 		($errtext,$fatal)=group_import($coursenum, $coursedom, $folder,
1.142     raeburn  1199: 					       $container,'londocs',@imports);
1.104     albertel 1200: 		if ($fatal) {
                   1201: 		    $r->print('<p><font color="red">'.$errtext.'</font></p>');
                   1202: 		    return;
                   1203: 		}
1.11      www      1204:             }
1.53      www      1205: # Loading a complete map
1.223     www      1206: 	   if ($env{'form.loadmap'}) {
                   1207:                if ($env{'form.importmap'}=~/\w/) {
                   1208: 	          foreach (&Apache::lonsequence::attemptread(&Apache::lonnet::filelocation('',$env{'form.importmap'}))) {
                   1209: 		      my ($title,$url,$ext,$type)=split(/\:/,$_);
1.245     albertel 1210:                       my $idx=&LONCAPA::map::getresidx($url);
                   1211:                       $LONCAPA::map::resources[$idx]=$_;
                   1212:                       $LONCAPA::map::order[$#LONCAPA::map::order+1]=$idx;
1.223     www      1213: 	          }
1.53      www      1214: # Store the changed version
1.223     www      1215:   	          ($errtext,$fatal)=&storemap($coursenum,$coursedom,
1.142     raeburn  1216: 					   $folder.'.'.$container);
1.223     www      1217: 	          if ($fatal) {
                   1218: 		      $r->print('<p><font color="red">'.$errtext.'</font></p>');
                   1219: 		      return;
                   1220: 	          }
                   1221:                } else {
                   1222:                    $r->print('<p><font color="red">'.&mt('No map selected.').'</font></p>');
                   1223:                }
1.53      www      1224:            }
1.16      www      1225:        }
                   1226: # ---------------------------------------------------------------- End commands
1.7       www      1227: # ---------------------------------------------------------------- Print screen
1.10      www      1228:         my $idx=0;
1.148     www      1229: 	my $shown=0;
1.242     www      1230:         if (($ishidden) || ($isencrypted) || ($randompick>=0)) {
                   1231:            $r->print('<p>'.&mt('Parameters').':<ul>'.
                   1232:                      ($randompick>=0?'<li>'.&mt('randomly pick [_1] resources',$randompick).'</li>':'').
                   1233:                      ($ishidden?'<li>'.&mt('contents hidden').'</li>':'').
                   1234:                      ($isencrypted?'<li>'.&mt('URLs hidden').'</li>':'').
                   1235:                      '</ul></p>');
                   1236:         }                                                                                                     
                   1237:         if ($randompick>=0) {
                   1238:            $r->print('<p>'.&mt('Caution: this folder is set to randomly pick a subset of resources. Adding or removing resources from this folder will change the set of resources that the students see, resulting in spurious or missing credit for completed problems, not limited to ones you modify. Do not modify the contents of this folder if it is in active student use.').'</p>');
                   1239:         }
1.10      www      1240:         $r->print('<table>');
1.245     albertel 1241:         foreach (@LONCAPA::map::order) {
                   1242:            my ($name,$url)=split(/\:/,$LONCAPA::map::resources[$_]);
1.246   ! raeburn  1243: 	   $name=&LONCAPA::map::qtescape($name);
        !          1244: 	   $url=&LONCAPA::map::qtescape($url);
1.10      www      1245:            unless ($name) {  $name=(split(/\//,$url))[-1]; }
1.148     www      1246:            unless ($name) { $idx++; next; }
1.112     raeburn  1247:            $r->print(&entryline($idx,$name,$url,$folder,$allowed,$_,$coursenum));
1.10      www      1248:            $idx++;
1.148     www      1249: 	   $shown++;
1.10      www      1250:         }
1.148     www      1251: 	unless ($shown) {
1.131     www      1252: 	    $r->print('<tr><td>'.&mt('Currently no documents.').'</td></tr>');
                   1253: 	}
1.168     www      1254:         $r->print("\n</table>\n");
1.174     albertel 1255: 	if ($env{'form.markedcopy_url'}) {
1.168     www      1256: 	    $r->print(<<ENDPASTE);
                   1257: <p><form name="pasteform" action="/adm/coursedocs" method="post">
1.174     albertel 1258: <input type="hidden" name="markedcopy_url" value="$env{'form.markedcopy_url'}" />
                   1259: <input type="hidden" name="markedcopy_title" value="$env{'form.markedcopy_title'}" />
1.168     www      1260: ENDPASTE
                   1261:             $r->print(
                   1262: 	   '<input type="submit" name="pastemarked" value="'.&mt('Paste').
                   1263: 		      '" /> '.&Apache::loncommon::filedescription(
1.174     albertel 1264: 		(split(/\./,$env{'form.markedcopy_url'}))[-1]).': '.
                   1265: 		      $env{'form.markedcopy_title'});
1.168     www      1266:             if ($container eq 'page') {
                   1267: 		$r->print(<<PAGEINFO);
1.174     albertel 1268: <input type="hidden" name="pagepath" value="$env{'form.pagepath'}" />
                   1269: <input type="hidden" name="pagesymb" value="$env{'form.pagesymb'}" />
1.168     www      1270: PAGEINFO
                   1271:             } else {
                   1272: 		$r->print(<<FOLDERINFO);
1.174     albertel 1273: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
1.168     www      1274: FOLDERINFO
                   1275: 	    }
                   1276: 	    $r->print('</form></p>');
                   1277: 	}
1.7       www      1278:     }
                   1279: }
1.1       www      1280: 
1.188     raeburn  1281: sub process_file_upload {
1.194     raeburn  1282:     my ($upload_output,$coursenum,$coursedom,$allfiles,$codebase,$uploadcmd) = @_;
1.188     raeburn  1283: # upload a file, if present
                   1284:     my $parseaction;
1.190     albertel 1285:    if ($env{'form.parserflag'}) {
1.188     raeburn  1286:         $parseaction = 'parse';
                   1287:     }
                   1288:     my $phase_status;
                   1289:     my $folder=$env{'form.folder'};
1.194     raeburn  1290:     if ($folder eq '') {
1.188     raeburn  1291:         $folder='default';
                   1292:     }
1.194     raeburn  1293:     if ( ($folder=~/^$uploadcmd/) || ($uploadcmd eq 'default') ) {
1.188     raeburn  1294:         my $errtext='';
                   1295:         my $fatal=0;
                   1296:         my $container='sequence';
                   1297:         if ($env{'form.pagepath'}) {
                   1298:             $container='page';
                   1299:         }
                   1300:         ($errtext,$fatal)=
                   1301:               &mapread($coursenum,$coursedom,$folder.'.'.$container);
1.245     albertel 1302:         if ($#LONCAPA::map::order<1) {
                   1303:             $LONCAPA::map::order[0]=1;
                   1304:             $LONCAPA::map::resources[1]='';
1.188     raeburn  1305:         }
                   1306:         if ($fatal) {
                   1307:             return 'failed';
                   1308:         }
                   1309:         my $destination = 'docs/';
1.194     raeburn  1310:         if ($folder =~ /^supplemental/) {
                   1311:             $destination = 'supplemental/';
                   1312:         }
                   1313:         if (($folder eq 'default') || ($folder eq 'supplemental')) {
1.188     raeburn  1314:             $destination .= 'default/';
1.194     raeburn  1315:         } elsif ($folder =~ /^(default|supplemental)_(\d+)$/) {
                   1316:             $destination .=  $2.'/';
1.188     raeburn  1317:         }
                   1318: # this is for a course, not a user, so set coursedoc flag
                   1319: # probably the only place in the system where this should be "1"
1.245     albertel 1320:         my $newidx=&LONCAPA::map::getresidx();
1.188     raeburn  1321:         $destination .= $newidx;
1.190     albertel 1322:         my $url=&Apache::lonnet::userfileupload('uploaddoc',1,$destination,
                   1323: 						$parseaction,$allfiles,
                   1324: 						$codebase);
1.188     raeburn  1325:         my $ext='false';
                   1326:         if ($url=~/^http\:\/\//) { $ext='true'; }
                   1327:         $url=~s/\:/\&colon;/g;
                   1328:         my $comment=$env{'form.comment'};
                   1329:         $comment=~s/\</\&lt\;/g;
                   1330:         $comment=~s/\>/\&gt\;/g;
                   1331:         $comment=~s/\:/\&colon;/g;
                   1332:         if ($folder=~/^supplemental/) {
                   1333:               $comment=time.'___&&&___'.$env{'user.name'}.'___&&&___'.
                   1334:                   $env{'user.domain'}.'___&&&___'.$comment;
                   1335:         }
                   1336: 
1.245     albertel 1337:         $LONCAPA::map::resources[$newidx]=
                   1338: 	    $comment.':'.$url.':'.$ext.':normal:res';
                   1339:         $LONCAPA::map::order[$#LONCAPA::map::order+1]= $newidx;
1.190     albertel 1340:         ($errtext,$fatal)=&storemap($coursenum,$coursedom,
                   1341: 				    $folder.'.'.$container);
1.188     raeburn  1342:         if ($fatal) {
                   1343:             $$upload_output .= '<p><font color="red">'.$errtext.'</font></p>';
                   1344:             return 'failed';
                   1345:         } else {
                   1346:             if ($parseaction eq 'parse') {
1.190     albertel 1347:                 my $total_embedded = keys(%{$allfiles});
1.188     raeburn  1348:                 if ($total_embedded > 0) {
                   1349:                     my $num = 0;
                   1350:                     $$upload_output .= 'This file contains embedded multimedia objects, which need to be uploaded to LON-CAPA.<br />
                   1351:    <form name="upload_embedded" action="/adm/coursedocs"
                   1352:                   method="post" enctype="multipart/form-data">
                   1353:    <input type="hidden" name="folderpath" value="'.$env{'form.folderpath'}.'" />   <input type="hidden" name="cmd" value="upload_embedded" />
                   1354:    <input type="hidden" name="newidx" value="'.$newidx.'" />
1.228     www      1355:    <input type="hidden" name="primaryurl" value="'.&escape($url).'" />
1.188     raeburn  1356:    <input type="hidden" name="phasetwo" value="'.$total_embedded.'" />';
                   1357:                     $$upload_output .= '<b>Upload embedded files</b>:<br />
                   1358:    <table>';
1.190     albertel 1359:                     foreach my $embed_file (keys(%{$allfiles})) {
1.188     raeburn  1360:                         $$upload_output .= '<tr><td>'.$embed_file.
1.190     albertel 1361:           '<input name="embedded_item_'.$num.'" type="file" />
1.228     www      1362:            <input name="embedded_orig_'.$num.'" type="hidden" value="'.&escape($embed_file).'" />';
1.188     raeburn  1363:                         my $attrib;
                   1364:                         if (@{$$allfiles{$embed_file}} > 1) {
                   1365:                             $attrib = join(':',@{$$allfiles{$embed_file}});
                   1366:                         } else {
                   1367:                             $attrib = $$allfiles{$embed_file}[0];
                   1368:                         }
                   1369:                         $$upload_output .=
                   1370:            '<input name="embedded_attrib_'.$num.'" type="hidden" value="'.$attrib.'" />';
                   1371:                         if (exists($$codebase{$embed_file})) {
                   1372:                             $$upload_output .= 
1.228     www      1373:           '<input name="codebase_'.$num.'" type="hidden" value="'.&escape($$codebase{$embed_file}).'" />';
1.188     raeburn  1374:                         }
                   1375:                         $$upload_output .= '</td></tr>';
                   1376:                         $num ++;
                   1377:                     }
                   1378:                     $phase_status = 'phasetwo';
                   1379:                     $$upload_output .= '</table><br />
                   1380:    <input type ="submit" value="Complete upload" />
                   1381:    </form>';
                   1382:                 } else {
                   1383:                     $$upload_output .= 'No embedded items identified<br />';
                   1384:                 }
                   1385:             }
                   1386:         }
                   1387:     }
                   1388:     return $phase_status;
                   1389: }
                   1390: 
                   1391: sub process_secondary_uploads {
                   1392:     my ($upload_output,$coursedom,$coursenum,$formname,$num,$newidx) = @_;
                   1393:     my $folder=$env{'form.folder'};
                   1394:     my $destination = 'docs/';
1.195     raeburn  1395:     if ($folder =~ /^supplemental/) {
                   1396:         $destination = 'supplemental/';
                   1397:     }
                   1398:     if (($folder eq 'default') || ($folder eq 'supplemental')) {
1.188     raeburn  1399:         $destination .= 'default/';
1.195     raeburn  1400:     } elsif ($folder =~ /^(default|supplemental)_(\d+)$/) {
1.217     raeburn  1401:         $destination .=  $2.'/';
1.188     raeburn  1402:     }
                   1403:     $destination .= $newidx;
                   1404:     my ($url,$filename);
                   1405:     $url=&Apache::lonnet::userfileupload($formname.$num,1,$destination);
                   1406:     ($filename) = ($url =~ m-^/uploaded/$coursedom/$coursenum/$destination/(.+)$-);
                   1407:     return $filename;
                   1408: }
                   1409: 
1.8       www      1410: # --------------------------------------------------------------- An entry line
                   1411: 
                   1412: sub entryline {
1.112     raeburn  1413:     my ($index,$title,$url,$folder,$allowed,$residx,$coursenum)=@_;
1.38      www      1414:     $title=~s/\&colon\;/\:/g;
                   1415:     $title=&HTML::Entities::encode(&HTML::Entities::decode(
1.228     www      1416:      &unescape($title)),'"<>&\'');
1.38      www      1417:     my $renametitle=$title;
                   1418:     my $foldertitle=$title;
1.142     raeburn  1419:     my $pagetitle=$title;
1.245     albertel 1420:     my $orderidx=$LONCAPA::map::order[$index];
1.109     albertel 1421:     if ($title=~ /^(\d+)___&amp;&amp;&amp;___(\w+)___&amp;&amp;&amp;___(\w+)___&amp;&amp;&amp;___(.*)$/	) { 
                   1422: 	$foldertitle=&Apache::lontexconvert::msgtexconverted($4);
                   1423: 	$renametitle=$4;
                   1424: 	$title='<i>'.&Apache::lonlocal::locallocaltime($1).'</i> '.
                   1425: 	    &Apache::loncommon::plainname($2,$3).': <br />'.
                   1426: 	    $foldertitle;
                   1427:     }
1.222     albertel 1428:     $renametitle=~s/\\/\\\\/g;
1.38      www      1429:     $renametitle=~s/\&quot\;/\\\"/g;
1.8       www      1430:     my $line='<tr>';
                   1431: # Edit commands
1.142     raeburn  1432:     my $container;
1.120     www      1433:     my $folderpath;
1.174     albertel 1434:     if ($env{'form.folderpath'}) {
1.142     raeburn  1435:         $container = 'sequence';
1.228     www      1436: 	$folderpath=&escape($env{'form.folderpath'});
1.174     albertel 1437: 	# $htmlfoldername=&HTML::Entities::encode($env{'form.foldername'},'<>&"');
1.120     www      1438:     }
1.156     albertel 1439:     my ($pagepath,$pagesymb);
1.174     albertel 1440:     if ($env{'form.pagepath'}) {
1.142     raeburn  1441:         $container = 'page';
1.228     www      1442:         $pagepath=&escape($env{'form.pagepath'});
                   1443:         $pagesymb=&escape($env{'form.pagesymb'});
1.142     raeburn  1444:     }
1.168     www      1445:     my $cpinfo='';
1.174     albertel 1446:     if ($env{'form.markedcopy_url'}) {
1.168     www      1447:        $cpinfo='&markedcopy_url='.
1.228     www      1448:                &escape($env{'form.markedcopy_url'}).
1.168     www      1449:                '&markedcopy_title='.
1.228     www      1450:                &escape($env{'form.markedcopy_title'});
1.168     www      1451:     }
1.109     albertel 1452:     if ($allowed) {
1.123     www      1453: 	my $incindex=$index+1;
                   1454: 	my $selectbox='';
1.168     www      1455: 	if (($folder!~/^supplemental/) &&
1.245     albertel 1456: 	    ($#LONCAPA::map::order>0) && 
1.168     www      1457: 	    ((split(/\:/,
1.245     albertel 1458: 	     $LONCAPA::map::resources[$LONCAPA::map::order[0]]))[1] 
1.168     www      1459: 	     ne '') && 
                   1460: 	    ((split(/\:/,
1.245     albertel 1461: 	     $LONCAPA::map::resources[$LONCAPA::map::order[1]]))[1] 
1.168     www      1462: 	     ne '')) {
1.123     www      1463: 	    $selectbox=
1.124     www      1464: 		'<input type="hidden" name="currentpos" value="'.$incindex.'" />'.
1.123     www      1465: 		'<select name="newpos" onChange="this.form.submit()">';
1.245     albertel 1466: 	    for (my $i=1;$i<=$#LONCAPA::map::order+1;$i++) {
1.123     www      1467: 		if ($i==$incindex) {
                   1468: 		    $selectbox.='<option value="" selected="1">('.$i.')</option>';
                   1469: 		} else {
                   1470: 		    $selectbox.='<option value="'.$i.'">'.$i.'</option>';
                   1471: 		}
                   1472: 	    }
                   1473: 	    $selectbox.='</select>';
                   1474: 	}
1.119     www      1475: 	my %lt=&Apache::lonlocal::texthash(
                   1476:                 'up' => 'Move Up',
1.109     albertel 1477: 		'dw' => 'Move Down',
                   1478: 		'rm' => 'Remove',
1.171     www      1479:                 'ct' => 'Cut',
1.168     www      1480: 		'rn' => 'Rename',
                   1481: 		'cp' => 'Copy');
1.211     www      1482: 	my $nocopy=0;
                   1483:         if ($url=~/\.(page|sequence)$/) {
                   1484: 	    foreach (&Apache::lonsequence::attemptread(&Apache::lonnet::filelocation('',$url))) {
                   1485: 		my ($title,$url,$ext,$type)=split(/\:/,$_);
                   1486: 		if (($url=~/\.(page|sequence)/) && ($type ne 'zombie')) {
                   1487: 		    $nocopy=1;
                   1488: 		    last;
                   1489: 		}
                   1490: 	    }
                   1491: 	}
                   1492:         my $copylink='&nbsp;';
1.174     albertel 1493:         if ($env{'form.pagepath'}) {
1.211     www      1494:            unless ($nocopy) {
                   1495:                $copylink=(<<ENDCOPY);
                   1496: <a href='javascript:markcopy("$pagepath","$index","$renametitle","page","$pagesymb");'>
                   1497: <font size="-2" color="#000099">$lt{'cp'}</font></a></td>
                   1498: ENDCOPY
                   1499:             }
1.142     raeburn  1500:             $line.=(<<END);
                   1501: <form name="entry_$index" action="/adm/coursedocs" method="post">
1.174     albertel 1502: <input type="hidden" name="pagepath" value="$env{'form.pagepath'}" />
                   1503: <input type="hidden" name="pagesymb" value="$env{'form.pagesymb'}" />
                   1504: <input type="hidden" name="markedcopy_url" value="$env{'form.markedcopy_url'}" />
                   1505: <input type="hidden" name="markedcopy_title" value="$env{'form.markedcopy_title'}" />
1.142     raeburn  1506: <input type="hidden" name="setparms" value="$orderidx" />
                   1507: <td><table border='0' cellspacing='2' cellpadding='0'>
                   1508: <tr><td bgcolor="#DDDDDD">
1.168     www      1509: <a href='/adm/coursedocs?cmd=up_$index&pagepath=$pagepath&pagesymb=$pagesymb$cpinfo'>
1.142     raeburn  1510: <img src="${iconpath}move_up.gif" alt='$lt{'up'}' border='0' /></a></td></tr>
                   1511: <tr><td bgcolor="#DDDDDD">
1.168     www      1512: <a href='/adm/coursedocs?cmd=down_$index&pagepath=$pagepath&pagesymb=$pagesymb$cpinfo'>
1.142     raeburn  1513: <img src="${iconpath}move_down.gif" alt='$lt{'dw'}' border='0' /></a></td></tr>
                   1514: </table></td>
                   1515: <td>$selectbox
                   1516: </td><td bgcolor="#DDDDDD">
1.156     albertel 1517: <a href='javascript:removeres("$pagepath","$index","$renametitle","page","$pagesymb");'>
1.142     raeburn  1518: <font size="-2" color="#990000">$lt{'rm'}</font></a>
1.171     www      1519: <a href='javascript:cutres("$pagepath","$index","$renametitle","page","$pagesymb");'>
                   1520: <font size="-2" color="#550044">$lt{'ct'}</font></a>
1.213     albertel 1521: <a href='javascript:changename("$pagepath","$index","$renametitle","page","$pagesymb");'>
1.168     www      1522: <font size="-2" color="#009900">$lt{'rn'}</font></a>
1.211     www      1523: $copylink
1.142     raeburn  1524: END
                   1525:         } else {
1.211     www      1526:            unless ($nocopy) {
                   1527:                $copylink=(<<ENDCOPY);
                   1528: <a href='javascript:markcopy("$folderpath","$index","$renametitle","sequence");'>
                   1529: <font size="-2" color="#000099">$lt{'cp'}</font></a></td>
                   1530: ENDCOPY
                   1531:             }
1.142     raeburn  1532:             $line.=(<<END); 
1.121     www      1533: <form name="entry_$index" action="/adm/coursedocs" method="post">
1.174     albertel 1534: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
                   1535: <input type="hidden" name="markedcopy_url" value="$env{'form.markedcopy_url'}" />
                   1536: <input type="hidden" name="markedcopy_title" value="$env{'form.markedcopy_title'}" />
1.122     www      1537: <input type="hidden" name="setparms" value="$orderidx" />
1.54      www      1538: <td><table border='0' cellspacing='2' cellpadding='0'>
                   1539: <tr><td bgcolor="#DDDDDD">
1.168     www      1540: <a href='/adm/coursedocs?cmd=up_$index&folderpath=$folderpath$cpinfo'>
1.90      www      1541: <img src="${iconpath}move_up.gif" alt='$lt{'up'}' border='0' /></a></td></tr>
1.54      www      1542: <tr><td bgcolor="#DDDDDD">
1.168     www      1543: <a href='/adm/coursedocs?cmd=down_$index&folderpath=$folderpath$cpinfo'>
1.90      www      1544: <img src="${iconpath}move_down.gif" alt='$lt{'dw'}' border='0' /></a></td></tr>
1.123     www      1545: </table></td>
                   1546: <td>$selectbox
                   1547: </td><td bgcolor="#DDDDDD">
1.142     raeburn  1548: <a href='javascript:removeres("$folderpath","$index","$renametitle","sequence");'>
1.90      www      1549: <font size="-2" color="#990000">$lt{'rm'}</font></a>
1.171     www      1550: <a href='javascript:cutres("$folderpath","$index","$renametitle","sequence");'>
                   1551: <font size="-2" color="#550044">$lt{'ct'}</font></a>
1.142     raeburn  1552: <a href='javascript:changename("$folderpath","$index","$renametitle","sequence");'>
1.168     www      1553: <font size="-2" color="#009900">$lt{'rn'}</font></a>
1.211     www      1554: $copylink
1.8       www      1555: END
1.142     raeburn  1556:         }
1.8       www      1557:     }
1.16      www      1558: # Figure out what kind of a resource this is
                   1559:     my ($extension)=($url=~/\.(\w+)$/);
                   1560:     my $uploaded=($url=~/^\/*uploaded\//);
1.97      albertel 1561:     my $icon=&Apache::loncommon::icon($url);
1.17      www      1562:     my $isfolder=0;
1.142     raeburn  1563:     my $ispage=0;
1.114     albertel 1564:     my $folderarg;
1.142     raeburn  1565:     my $pagearg;
                   1566:     my $pagefile;
1.16      www      1567:     if ($uploaded) {
1.135     albertel 1568: 	if ($extension eq 'sequence') {
                   1569: 	    $icon=$iconpath.'/folder_closed.gif';
                   1570: 	    $url=~/$coursenum\/([\/\w]+)\.sequence$/;
                   1571: 	    $url='/adm/coursedocs?';
                   1572: 	    $folderarg=$1;
                   1573: 	    $isfolder=1;
1.142     raeburn  1574:         } elsif ($extension eq 'page') {
                   1575:             $icon=$iconpath.'/page.gif';
                   1576:             $url=~/$coursenum\/([\/\w]+)\.page$/;
                   1577:             $pagearg=$1;
                   1578:             $url='/adm/coursedocs?';
                   1579:             $ispage=1;
1.135     albertel 1580: 	} else {
                   1581: 	    &Apache::lonnet::allowuploaded('/adm/coursedoc',$url);
                   1582: 	}
1.16      www      1583:     }
1.215     albertel 1584:     $url=~s-^http(\&colon\;|:)//-/adm/wrapper/ext/-;
1.142     raeburn  1585:     if ((!$isfolder) && ($residx) && ($folder!~/supplemental/) && (!$ispage)) {
1.113     albertel 1586: 	my $symb=&Apache::lonnet::symbclean(
1.50      www      1587:           &Apache::lonnet::declutter('uploaded/'.
1.174     albertel 1588:            $env{'course.'.$env{'request.course.id'}.'.domain'}.'/'.
                   1589:            $env{'course.'.$env{'request.course.id'}.'.num'}.'/'.$folder.
1.50      www      1590:            '.sequence').
                   1591:            '___'.$residx.'___'.
1.113     albertel 1592: 	   &Apache::lonnet::declutter($url));
                   1593: 	(undef,undef,$url)=&Apache::lonnet::decode_symb($symb);
                   1594: 	$url=&Apache::lonnet::clutter($url);
1.127     albertel 1595: 	if ($url=~/^\/*uploaded\//) {
                   1596: 	    $url=~/\.(\w+)$/;
                   1597: 	    my $embstyle=&Apache::loncommon::fileembstyle($1);
                   1598: 	    if (($embstyle eq 'img') || ($embstyle eq 'emb')) {
                   1599: 		$url='/adm/wrapper'.$url;
                   1600: 	    } elsif ($embstyle eq 'ssi') {
                   1601: 		#do nothing with these
                   1602: 	    } elsif ($url!~/\.(sequence|page)$/) {
                   1603: 		$url='/adm/coursedocs/showdoc'.$url;
                   1604: 	    }
1.145     albertel 1605: 	} elsif ($url=~m|^/ext/|) { 
                   1606: 	    $url='/adm/wrapper'.$url;
1.127     albertel 1607: 	}
1.241     www      1608:         if (&Apache::lonnet::symbverify($symb,$url)) {
                   1609: 	    $url.=(($url=~/\?/)?'&':'?').'symb='.&escape($symb);
                   1610:         } else {
                   1611:             $url='';
                   1612:         }
1.152     albertel 1613: 	if ($container eq 'page') {
1.174     albertel 1614: 	    my $symb=$env{'form.pagesymb'};
1.152     albertel 1615: 	    	    
                   1616: 	    $url=&Apache::lonnet::clutter((&Apache::lonnet::decode_symb($symb))[2]);
1.228     www      1617: 	    $url.=(($url=~/\?/)?'&':'?').'symb='.&escape($symb);
1.152     albertel 1618: 	}
1.50      www      1619:     }
1.120     www      1620:     my $parameterset='&nbsp;';
1.216     albertel 1621:     if ($isfolder || $extension eq 'sequence') {
1.228     www      1622: 	my $foldername=&escape($foldertitle);
1.174     albertel 1623: 	my $folderpath=$env{'form.folderpath'};
1.114     albertel 1624: 	if ($folderpath) { $folderpath.='&' };
1.242     www      1625: # Append randompick number, hidden, and encrypted with ":" to foldername, 
                   1626: # so it gets transferred between levels
1.245     albertel 1627: 	$folderpath.=$folderarg.'&'.$foldername.':'.(&LONCAPA::map::getparameter($orderidx,
1.242     www      1628:                                               'parameter_randompick'))[0]
1.245     albertel 1629:                                                .':'.((&LONCAPA::map::getparameter($orderidx,
1.242     www      1630:                                               'parameter_hiddenresource'))[0]=~/^yes$/i)
1.245     albertel 1631:                                                .':'.((&LONCAPA::map::getparameter($orderidx,
1.242     www      1632:                                               'parameter_encrypturl'))[0]=~/^yes$/i);
1.228     www      1633: 	$url.='folderpath='.&escape($folderpath).$cpinfo;
1.147     matthew  1634: 	$parameterset='<label>'.&mt('Randomly Pick: ').
1.165     www      1635: 	    '<input type="text" size="4" onChange="this.form.submit()" name="randpick_'.$orderidx.'" value="'.
1.245     albertel 1636: 	    (&LONCAPA::map::getparameter($orderidx,
1.147     matthew  1637:                                               'parameter_randompick'))[0].
1.165     www      1638:                                               '" />'.
                   1639: '<font size="-2"><a href="javascript:void(0)">'.&mt('Store').'</a></font></label>';
1.147     matthew  1640:        
1.114     albertel 1641:     }
1.142     raeburn  1642:     if ($ispage) {
1.228     www      1643:         my $pagename=&escape($pagetitle);
1.142     raeburn  1644:         my $pagepath;
1.174     albertel 1645:         my $folderpath=$env{'form.folderpath'};
1.142     raeburn  1646:         if ($folderpath) { $pagepath = $folderpath.'&' };
                   1647:         $pagepath.=$pagearg.'&'.$pagename;
1.174     albertel 1648: 	my $symb=$env{'form.pagesymb'};
1.152     albertel 1649: 	if (!$symb) {
                   1650: 	    my $path='uploaded/'.
1.174     albertel 1651: 		$env{'course.'.$env{'request.course.id'}.'.domain'}.'/'.
                   1652: 		$env{'course.'.$env{'request.course.id'}.'.num'}.'/';
1.152     albertel 1653: 	    $symb=&Apache::lonnet::encode_symb($path.$folder.'.sequence',
                   1654: 					       $residx,
                   1655: 					       $path.$pagearg.'.page');
                   1656: 	}
1.228     www      1657: 	$url.='pagepath='.&escape($pagepath).
                   1658: 	    '&pagesymb='.&escape($symb).$cpinfo;
1.142     raeburn  1659:     }
1.113     albertel 1660:     $line.='<td bgcolor="#FFFFBB"><a href="'.$url.'"><img src="'.$icon.
                   1661: 	'" border="0"></a></td>'.
1.241     www      1662:         "<td bgcolor='#FFFFBB'>".($url?"<a href=\"$url\">":'').$title.
                   1663:         ($url?'</a>':' <font size="-2">'.&mt('(re-initialize course to access)').'</font>')."</td>";
1.120     www      1664:     if (($allowed) && ($folder!~/^supplemental/)) {
                   1665:  	my %lt=&Apache::lonlocal::texthash(
                   1666:  			      'hd' => 'Hidden',
1.165     www      1667:  			      'ec' => 'URL hidden');
1.122     www      1668: 	my $enctext=
1.245     albertel 1669: 	    ((&LONCAPA::map::getparameter($orderidx,'parameter_encrypturl'))[0]=~/^yes$/i?' checked="1"':'');
1.122     www      1670: 	my $hidtext=
1.245     albertel 1671: 	    ((&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i?' checked="1"':'');
1.120     www      1672: 	$line.=(<<ENDPARMS);
                   1673: <td bgcolor="#BBBBFF"><font size='-2'>
1.165     www      1674: <nobr><label><input type="checkbox" name="hidprs_$orderidx" onClick="this.form.submit()" $hidtext /> $lt{'hd'}</label></nobr></td>
1.149     albertel 1675: <td bgcolor="#BBBBFF"><font size='-2'>
1.165     www      1676: <nobr><label><input type="checkbox" name="encprs_$orderidx" onClick="this.form.submit()" $enctext /> $lt{'ec'}</label></nobr></td>
1.120     www      1677: <td bgcolor="#BBBBFF"><font size="-2">$parameterset</font></td>
                   1678: ENDPARMS
1.119     www      1679:     }
1.120     www      1680:     $line.="</form></tr>";
1.8       www      1681:     return $line;
                   1682: }
                   1683: 
1.27      www      1684: # ---------------------------------------------------------------- tie the hash
                   1685: 
                   1686: sub tiehash {
1.136     albertel 1687:     my ($mode)=@_;
1.27      www      1688:     $hashtied=0;
1.174     albertel 1689:     if ($env{'request.course.fn'}) {
1.136     albertel 1690: 	if ($mode eq 'write') {
1.174     albertel 1691: 	    if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.".db",
1.136     albertel 1692: 		    &GDBM_WRCREAT(),0640)) {
                   1693:                 $hashtied=2;
                   1694: 	    }
                   1695: 	} else {
1.174     albertel 1696: 	    if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.".db",
1.136     albertel 1697: 		    &GDBM_READER(),0640)) {
1.27      www      1698:                 $hashtied=1;
1.136     albertel 1699: 	    }
                   1700: 	}
1.27      www      1701:     }    
                   1702: }
                   1703: 
                   1704: sub untiehash {
                   1705:     if ($hashtied) { untie %hash; }
                   1706:     $hashtied=0;
1.221     albertel 1707:     return OK;
1.27      www      1708: }
                   1709: 
1.29      www      1710: # --------------------------------------------------------------- check on this
                   1711: 
                   1712: sub checkonthis {
                   1713:     my ($r,$url,$level,$title)=@_;
1.228     www      1714:     $url=&unescape($url);
1.29      www      1715:     $alreadyseen{$url}=1;
                   1716:     $r->rflush();
1.41      www      1717:     if (($url) && ($url!~/^\/uploaded\//) && ($url!~/\*$/)) {
1.108     albertel 1718:        $r->print("\n<br />");
1.29      www      1719:        for (my $i=0;$i<=$level*5;$i++) {
                   1720:            $r->print('&nbsp;');
                   1721:        }
                   1722:        $r->print('<a href="'.$url.'" target="cat">'.
                   1723: 		 ($title?$title:$url).'</a> ');
                   1724:        if ($url=~/^\/res\//) {
                   1725: 	  my $result=&Apache::lonnet::repcopy(
                   1726:                               &Apache::lonnet::filelocation('',$url));
1.172     raeburn  1727:           if ($result eq 'ok') {
1.87      www      1728:              $r->print('<font color="green">'.&mt('ok').'</font>');
1.29      www      1729:              $r->rflush();
1.34      www      1730:              &Apache::lonnet::countacc($url);
                   1731:              $url=~/\.(\w+)$/;
                   1732:              if (&Apache::loncommon::fileembstyle($1) eq 'ssi') {
                   1733: 		 $r->print('<br />');
                   1734:                  $r->rflush();
                   1735:                  for (my $i=0;$i<=$level*5;$i++) {
                   1736:                      $r->print('&nbsp;');
                   1737:                  }
1.84      www      1738:                  $r->print('- '.&mt('Rendering').': ');
1.170     www      1739: 		 my ($errorcount,$warningcount)=split(/:/,
                   1740: 	       &Apache::lonnet::ssi_body($url,
1.173     albertel 1741: 			       ('grade_target'=>'web',
                   1742: 				'return_only_error_and_warning_counts' => 1)));
1.170     www      1743:                  if (($errorcount) ||
                   1744:                      ($warningcount)) {
                   1745: 		     if ($errorcount) {
1.98      www      1746:                         $r->print('<img src="/adm/lonMisc/bomb.gif" /><font color="red"><b>'.
1.170     www      1747: 			  $errorcount.' '.
1.87      www      1748: 				  &mt('error(s)').'</b></font> ');
1.34      www      1749:                      }
1.170     www      1750: 		     if ($warningcount) {
1.34      www      1751:                         $r->print('<font color="blue">'.
1.170     www      1752: 			  $warningcount.' '.
1.84      www      1753: 				  &mt('warning(s)').'</font>');
1.34      www      1754:                      }
                   1755:                  } else {
1.87      www      1756:                      $r->print('<font color="green">'.&mt('ok').'</font>');
1.34      www      1757:                  }
                   1758:                  $r->rflush();
                   1759:              }
1.29      www      1760: 	     my $dependencies=
                   1761:                 &Apache::lonnet::metadata($url,'dependencies');
                   1762:              foreach (split(/\,/,$dependencies)) {
                   1763: 		 if (($_=~/^\/res\//) && (!$alreadyseen{$_})) {
                   1764:                     &checkonthis($r,$_,$level+1);
                   1765:                  }
                   1766:              }
1.172     raeburn  1767:           } elsif ($result eq 'unavailable') {
1.84      www      1768:              $r->print('<font color="red"><b>'.&mt('connection down').'</b></font>');
1.172     raeburn  1769:           } elsif ($result eq 'not_found') {
1.100     www      1770: 	      unless ($url=~/\$/) {
                   1771: 		  $r->print('<font color="red"><b>'.&mt('not found').'</b></font>');
                   1772: 	      } else {
                   1773: 		  $r->print('<font color="yellow"><b>'.&mt('unable to verify variable URL').'</b></font>');
                   1774: 	      }
1.29      www      1775:           } else {
1.84      www      1776:              $r->print('<font color="red"><b>'.&mt('access denied').'</b></font>');
1.29      www      1777:           }
                   1778:       }
                   1779:    }
                   1780: }
                   1781: 
1.1       www      1782: 
1.75      www      1783: #
1.208     albertel 1784: # ----------------------------------------------------------------- List Symbs
                   1785: # 
                   1786: sub list_symbs {
1.224     albertel 1787:     my ($r) = @_;
                   1788: 
                   1789:     $r->print(&Apache::loncommon::start_page('Symb List'));
                   1790:     my $navmap = Apache::lonnavmaps::navmap->new();
                   1791:     $r->print("<pre>\n");
                   1792:     foreach my $res ($navmap->retrieveResources()) {
                   1793: 	$r->print($res->compTitle()."\t".$res->symb()."\n");
                   1794:     }
                   1795:     $r->print("\n</pre>\n");
                   1796:     $r->print('<a href="/adm/coursedocs">'.&mt('Return to DOCS').'</a>');
1.208     albertel 1797: }
                   1798: 
                   1799: 
                   1800: #
1.75      www      1801: # -------------------------------------------------------------- Verify Content
                   1802: # 
                   1803: sub verifycontent {
1.224     albertel 1804:     my ($r) = @_;
1.230     albertel 1805:     my $type = &Apache::loncommon::course_type();
1.26      www      1806:    my $loaderror=&Apache::lonnet::overloaderror($r);
                   1807:    if ($loaderror) { return $loaderror; }
1.229     raeburn  1808:    $r->print(&Apache::loncommon::start_page('Verify '.$type.' Documents'));
1.27      www      1809:    $hashtied=0;
1.30      www      1810:    undef %alreadyseen;
                   1811:    %alreadyseen=();
1.27      www      1812:    &tiehash();
                   1813:    foreach (keys %hash) {
1.140     www      1814:        if ($hash{$_}=~/\.(page|sequence)$/) {
1.228     www      1815: 	   if (($_=~/^src_/) && ($alreadyseen{&unescape($hash{$_})})) {
1.140     www      1816: 	       $r->print('<hr /><font color="red">'.
1.230     albertel 1817: 			 &mt('The following sequence or page is included more than once in your '.$type.': ').
1.228     www      1818: 			 &unescape($hash{$_}).'</font><br />'.
1.140     www      1819: 			 &mt('Note that grading records for problems included in this sequence or folder will overlap.<hr />'));
                   1820: 	   }
                   1821:        }
1.228     www      1822:        if (($_=~/^src\_(.+)$/) && (!$alreadyseen{&unescape($hash{$_})})) {
1.29      www      1823:            &checkonthis($r,$hash{$_},0,$hash{'title_'.$1});
1.27      www      1824:        }
                   1825:    }
                   1826:    &untiehash();
1.108     albertel 1827:    $r->print('<h1>'.&mt('Done').'.</h1>'.'<a href="/adm/coursedocs">'.
                   1828: 	     &mt('Return to DOCS').'</a>');
1.75      www      1829: }
                   1830: 
1.192     www      1831: 
1.75      www      1832: # -------------------------------------------------------------- Check Versions
                   1833: 
1.192     www      1834: sub devalidateversioncache {
                   1835:     my $src=shift;
                   1836:     &Apache::lonnet::devalidate_cache_new('courseresversion',$env{'request.course.id'}.'_'.
                   1837: 					  &Apache::lonnet::clutter($src));
                   1838: }
                   1839: 
1.75      www      1840: sub checkversions {
1.224     albertel 1841:     my ($r) = @_;
1.230     albertel 1842:     my $type = &Apache::loncommon::course_type();
1.229     raeburn  1843:     $r->print(&Apache::loncommon::start_page("Check $type Document Versions"));
1.89      www      1844:     my $header='';
                   1845:     my $startsel='';
                   1846:     my $monthsel='';
                   1847:     my $weeksel='';
                   1848:     my $daysel='';
                   1849:     my $allsel='';
                   1850:     my %changes=();
                   1851:     my $starttime=0;
1.91      www      1852:     my $haschanged=0;
1.92      www      1853:     my %setversions=&Apache::lonnet::dump('resourceversions',
1.174     albertel 1854: 			  $env{'course.'.$env{'request.course.id'}.'.domain'},
                   1855: 			  $env{'course.'.$env{'request.course.id'}.'.num'});
1.92      www      1856: 
                   1857:     $hashtied=0;
                   1858:     &tiehash();
                   1859:     my %newsetversions=();
1.174     albertel 1860:     if ($env{'form.setmostrecent'}) {
1.91      www      1861: 	$haschanged=1;
1.92      www      1862: 	foreach (keys %hash) {
                   1863: 	    if ($_=~/^ids\_(\/res\/.+)$/) {
1.93      www      1864: 		$newsetversions{$1}='mostrecent';
1.192     www      1865:                 &devalidateversioncache($1);
1.92      www      1866: 	    }
                   1867: 	}
1.174     albertel 1868:     } elsif ($env{'form.setcurrent'}) {
1.91      www      1869: 	$haschanged=1;
1.92      www      1870: 	foreach (keys %hash) {
                   1871: 	    if ($_=~/^ids\_(\/res\/.+)$/) {
1.93      www      1872: 		my $getvers=&Apache::lonnet::getversion($1);
                   1873: 		if ($getvers>0) {
                   1874: 		    $newsetversions{$1}=$getvers;
1.192     www      1875: 		    &devalidateversioncache($1);
1.93      www      1876: 		}
1.92      www      1877: 	    }
                   1878: 	}
1.174     albertel 1879:     } elsif ($env{'form.setversions'}) {
1.91      www      1880: 	$haschanged=1;
1.174     albertel 1881: 	foreach (keys %env) {
1.92      www      1882: 	    if ($_=~/^form\.set_version_(.+)$/) {
                   1883: 		my $src=$1;
1.174     albertel 1884: 		if (($env{$_}) && ($env{$_} ne $setversions{$src})) {
                   1885: 		    $newsetversions{$src}=$env{$_};
1.192     www      1886: 		    &devalidateversioncache($src);
1.92      www      1887: 		}
                   1888: 	    }
                   1889: 	}
1.91      www      1890:     }
                   1891:     if ($haschanged) {
1.92      www      1892:         if (&Apache::lonnet::put('resourceversions',\%newsetversions,
1.174     albertel 1893: 			  $env{'course.'.$env{'request.course.id'}.'.domain'},
                   1894: 			  $env{'course.'.$env{'request.course.id'}.'.num'}) eq 'ok') {		
1.92      www      1895: 	    $r->print('<h1>'.&mt('Your Version Settings have been Stored').'</h1>');
                   1896: 	} else {
                   1897: 	    $r->print('<h1><font color="red">'.&mt('An Error Occured while Attempting to Store your Version Settings').'</font></h1>');
                   1898: 	}
1.136     albertel 1899: 	&mark_hash_old();
1.91      www      1900:     }
1.136     albertel 1901:     &changewarning($r,'');
1.174     albertel 1902:     if ($env{'form.timerange'} eq 'all') {
1.89      www      1903: # show all documents
1.230     albertel 1904: 	$header=&mt('All Documents in '.$type);
1.91      www      1905: 	$allsel=1;
1.90      www      1906: 	foreach (keys %hash) {
                   1907: 	    if ($_=~/^ids\_(\/res\/.+)$/) {
                   1908: 		my $src=$1;
                   1909: 		$changes{$src}=1;
                   1910: 	    }
                   1911: 	}
1.89      www      1912:     } else {
                   1913: # show documents which changed
                   1914: 	%changes=&Apache::lonnet::dump
1.174     albertel 1915: 	 ('versionupdate',$env{'course.'.$env{'request.course.id'}.'.domain'},
                   1916:                      $env{'course.'.$env{'request.course.id'}.'.num'});
1.89      www      1917: 	my $firstkey=(keys %changes)[0];
                   1918: 	unless ($firstkey=~/^error\:/) {
1.174     albertel 1919: 	    unless ($env{'form.timerange'}) {
                   1920: 		$env{'form.timerange'}=604800;
1.89      www      1921: 	    }
1.174     albertel 1922: 	    my $seltext=&mt('during the last').' '.$env{'form.timerange'}.' '
1.89      www      1923: 		.&mt('seconds');
1.174     albertel 1924: 	    if ($env{'form.timerange'}==-1) {
1.89      www      1925: 		$seltext='since start of course';
                   1926: 		$startsel='selected';
1.174     albertel 1927: 		$env{'form.timerange'}=time;
1.89      www      1928: 	    }
1.174     albertel 1929: 	    $starttime=time-$env{'form.timerange'};
                   1930: 	    if ($env{'form.timerange'}==2592000) {
1.89      www      1931: 		$seltext=&mt('during the last month').' ('.&Apache::lonlocal::locallocaltime($starttime).')';
                   1932: 		$monthsel='selected';
1.174     albertel 1933: 	    } elsif ($env{'form.timerange'}==604800) {
1.89      www      1934: 		$seltext=&mt('during the last week').' ('.&Apache::lonlocal::locallocaltime($starttime).')';
                   1935: 		$weeksel='selected';
1.174     albertel 1936: 	    } elsif ($env{'form.timerange'}==86400) {
1.89      www      1937: 		$seltext=&mt('since yesterday').' ('.&Apache::lonlocal::locallocaltime($starttime).')';
                   1938: 		$daysel='selected';
                   1939: 	    }
                   1940: 	    $header=&mt('Content changed').' '.$seltext;
                   1941: 	} else {
                   1942: 	    $header=&mt('No content modifications yet.');
                   1943: 	}
                   1944:     }
1.92      www      1945:     %setversions=&Apache::lonnet::dump('resourceversions',
1.174     albertel 1946: 			  $env{'course.'.$env{'request.course.id'}.'.domain'},
                   1947: 			  $env{'course.'.$env{'request.course.id'}.'.num'});
1.89      www      1948:     my %lt=&Apache::lonlocal::texthash
1.229     raeburn  1949: 	      ('st' => 'Version changes since start of '.$type,
1.88      www      1950: 	       'lm' => 'Version changes since last Month',
                   1951: 	       'lw' => 'Version changes since last Week',
                   1952: 	       'sy' => 'Version changes since Yesterday',
1.91      www      1953:                'al' => 'All Resources (possibly large output)',
1.88      www      1954: 	       'sd' => 'Display',
1.84      www      1955: 	       'fi' => 'File',
                   1956: 	       'md' => 'Modification Date',
1.87      www      1957:                'mr' => 'Most recently published Version',
1.229     raeburn  1958: 	       've' => 'Version used in '.$type,
                   1959:                'vu' => 'Set Version to be used in '.$type,
                   1960: 'sv' => 'Set Versions to be used in '.$type.' according to Selections below',
1.91      www      1961: 'sm' => 'Keep all Resources up-to-date with most recent Versions (default)',
                   1962: 'sc' => 'Set all Resource Versions to current Version (Fix Versions)',
1.84      www      1963: 	       'di' => 'Differences');
1.89      www      1964:     $r->print(<<ENDHEADERS);
1.31      www      1965: <form action="/adm/coursedocs" method="post">
1.91      www      1966: <input type="hidden" name="versions" value="1" />
                   1967: <input type="submit" name="setmostrecent" value="$lt{'sm'}" />
                   1968: <input type="submit" name="setcurrent" value="$lt{'sc'}" /><hr />
1.31      www      1969: <select name="timerange">
1.88      www      1970: <option value='all' $allsel>$lt{'al'}</option>
1.84      www      1971: <option value="-1" $startsel>$lt{'st'}</option>
                   1972: <option value="2592000" $monthsel>$lt{'lm'}</option>
                   1973: <option value="604800" $weeksel>$lt{'lw'}</option>
                   1974: <option value="86400" $daysel>$lt{'sy'}</option>
1.31      www      1975: </select>
1.91      www      1976: <input type="submit" name="display" value="$lt{'sd'}" />
1.89      www      1977: <h3>$header</h3>
1.91      www      1978: <input type="submit" name="setversions" value="$lt{'sv'}" />
1.103     matthew  1979: <table border="0">
1.31      www      1980: ENDHEADERS
1.91      www      1981:     foreach (sort keys %changes) {
1.89      www      1982: 	if ($changes{$_}>$starttime) {
                   1983: 	    my ($root,$extension)=($_=~/^(.*)\.(\w+)$/);
                   1984: 	    my $currentversion=&Apache::lonnet::getversion($_);
1.93      www      1985: 	    if ($currentversion<0) {
                   1986: 		$currentversion=&mt('Could not be determined.');
                   1987: 	    }
1.89      www      1988: 	    my $linkurl=&Apache::lonnet::clutter($_);
                   1989: 	    $r->print(
1.103     matthew  1990: 		      '<tr><td colspan="5"><br /><br /><font size="+1"><b>'.
1.91      www      1991: 		      &Apache::lonnet::gettitle($linkurl).
1.103     matthew  1992:                       '</b></font></td></tr>'.
                   1993:                       '<tr><td>&nbsp;&nbsp;&nbsp;</td>'.
                   1994:                       '<td colspan="4">'.
                   1995:                       '<a href="'.$linkurl.'" target="cat">'.$linkurl.
                   1996: 		      '</a></td></tr>'.
                   1997:                       '<tr><td></td>'.
                   1998:                       '<td title="'.$lt{'md'}.'">'.
1.102     matthew  1999: 		      &Apache::lonlocal::locallocaltime(
                   2000:                            &Apache::lonnet::metadata($root.'.'.$extension,
                   2001:                                                      'lastrevisiondate')
                   2002:                                                         ).
1.103     matthew  2003:                       '</td>'.
                   2004:                       '<td title="'.$lt{'mr'}.'"><nobr>Most Recent: '.
                   2005:                       '<font size="+1">'.$currentversion.'</font>'.
                   2006:                       '</nobr></td>'.
1.229     raeburn  2007:                       '<td title="'.$lt{'ve'}.'"><nobr>In '.$type.': '.
1.103     matthew  2008:                       '<font size="+1">');
1.87      www      2009: # Used in course
1.89      www      2010: 	    my $usedversion=$hash{'version_'.$linkurl};
1.93      www      2011: 	    if (($usedversion) && ($usedversion ne 'mostrecent')) {
1.89      www      2012: 		$r->print($usedversion);
                   2013: 	    } else {
                   2014: 		$r->print($currentversion);
                   2015: 	    }
1.103     matthew  2016: 	    $r->print('</font></nobr></td><td title="'.$lt{'vu'}.'">'.
                   2017:                       '<nobr>Use: ');
1.87      www      2018: # Set version
1.92      www      2019: 	    $r->print(&Apache::loncommon::select_form($setversions{$linkurl},
1.89      www      2020: 						      'set_version_'.$linkurl,
1.136     albertel 2021: 						      ('select_form_order' =>
                   2022: 						       ['',1..$currentversion,'mostrecent'],
                   2023: 						       '' => '',
1.93      www      2024: 						       'mostrecent' => 'most recent',
1.89      www      2025: 						       map {$_,$_} (1..$currentversion))));
1.103     matthew  2026: 	    $r->print('</nobr></td></tr><tr><td></td>');
1.89      www      2027: 	    my $lastold=1;
                   2028: 	    for (my $prevvers=1;$prevvers<$currentversion;$prevvers++) {
                   2029: 		my $url=$root.'.'.$prevvers.'.'.$extension;
                   2030: 		if (&Apache::lonnet::metadata($url,'lastrevisiondate')<
                   2031: 		    $starttime) {
                   2032: 		    $lastold=$prevvers;
                   2033: 		}
                   2034: 	    }
1.103     matthew  2035:             # 
                   2036:             # Code to figure out how many version entries should go in
                   2037:             # each of the four columns
                   2038:             my $entries_per_col = 0;
                   2039:             my $num_entries = ($currentversion-$lastold);
                   2040:             if ($num_entries % 4 == 0) {
                   2041:                 $entries_per_col = $num_entries/4;
                   2042:             } else {
                   2043:                 $entries_per_col = $num_entries/4 + 1;
                   2044:             }
                   2045:             my $entries_count = 0;
                   2046:             $r->print('<td valign="top"><font size="-2">'); 
                   2047:             my $cols_output = 1;
1.32      www      2048:             for (my $prevvers=$lastold;$prevvers<$currentversion;$prevvers++) {
1.89      www      2049: 		my $url=$root.'.'.$prevvers.'.'.$extension;
1.103     matthew  2050: 		$r->print('<nobr><a href="'.&Apache::lonnet::clutter($url).
1.91      www      2051: 			  '">'.&mt('Version').' '.$prevvers.'</a> ('.
1.103     matthew  2052: 			  &Apache::lonlocal::locallocaltime(
                   2053:                                 &Apache::lonnet::metadata($url,
                   2054:                                                           'lastrevisiondate')
                   2055:                                                             ).
1.91      www      2056: 			  ')');
1.89      www      2057: 		if (&Apache::loncommon::fileembstyle($extension) eq 'ssi') {
1.33      www      2058:                     $r->print(' <a href="/adm/diff?filename='.
1.89      www      2059: 			      &Apache::lonnet::clutter($root.'.'.$extension).
                   2060: 			      '&versionone='.$prevvers.
                   2061: 			      '">'.&mt('Diffs').'</a>');
                   2062: 		}
1.103     matthew  2063: 		$r->print('</nobr><br />');
                   2064:                 if (++$entries_count % $entries_per_col == 0) {
                   2065:                     $r->print('</font></td>');
                   2066:                     if ($cols_output != 4) {
                   2067:                         $r->print('<td valign="top"><font size="-2">');
                   2068:                         $cols_output++;
                   2069:                     }
                   2070:                 }
1.89      www      2071: 	    }
1.103     matthew  2072:             while($cols_output++ < 4) {
                   2073:                 $r->print('</font></td><td><font>')
                   2074:             }
                   2075: 	    $r->print('</font></td></tr>'."\n");
1.89      www      2076: 	}
                   2077:     }
1.92      www      2078:     $r->print('</table></form>');
1.89      www      2079:     $r->print('<h1>'.&mt('Done').'.</h1>');
                   2080: 
                   2081:     &untiehash();
1.75      www      2082: }
                   2083: 
1.136     albertel 2084: sub mark_hash_old {
                   2085:     my $retie_hash=0;
                   2086:     if ($hashtied) {
                   2087: 	$retie_hash=1;
                   2088: 	&untiehash();
                   2089:     }
                   2090:     &tiehash('write');
                   2091:     $hash{'old'}=1;
                   2092:     &untiehash();
                   2093:     if ($retie_hash) { &tiehash(); }
                   2094: }
                   2095: 
                   2096: sub is_hash_old {
                   2097:     my $untie_hash=0;
                   2098:     if (!$hashtied) {
                   2099: 	$untie_hash=1;
                   2100: 	&tiehash();
                   2101:     }
                   2102:     my $return=$hash{'old'};
                   2103:     if ($untie_hash) { &untiehash(); }
                   2104:     return $return;
                   2105: }
                   2106: 
1.91      www      2107: sub changewarning {
1.177     albertel 2108:     my ($r,$postexec,$message,$url)=@_;
1.136     albertel 2109:     if (!&is_hash_old()) { return; }
1.150     albertel 2110:     my $pathvar='folderpath';
1.228     www      2111:     my $path=&escape($env{'form.folderpath'});
1.177     albertel 2112:     if (!defined($url)) {
                   2113: 	if (defined($env{'form.pagepath'})) {
                   2114: 	    $pathvar='pagepath';
1.228     www      2115: 	    $path=&escape($env{'form.pagepath'});
                   2116: 	    $path.='&amp;pagesymb='.&escape($env{'form.pagesymb'});
1.177     albertel 2117: 	}
                   2118: 	$url='/adm/coursedocs?'.$pathvar.'='.$path;
                   2119:     }
1.230     albertel 2120:     my $course_type = &Apache::loncommon::course_type();
1.177     albertel 2121:     if (!defined($message)) {
                   2122: 	$message='Changes will become active for your current session after [_1], or the next time you log in.';
1.150     albertel 2123:     }
1.185     www      2124:     $r->print("\n\n".
                   2125: '<script>function reinit(tf) { tf.submit();'.$postexec.' }</script>'."\n". 
                   2126: '<form name="reinitform" method="post" action="/adm/roles" target="loncapaclient">'.
1.177     albertel 2127: '<input type="hidden" name="orgurl" value="'.$url.
1.117     albertel 2128: '" /><input type="hidden" name="selectrole" value="1" /><h3><font color="red">'.
1.177     albertel 2129: &mt($message,' <input type="hidden" name="'.
                   2130:     $env{'request.role'}.'" value="1" /><input type="button" value="'.
1.230     albertel 2131:     &mt('re-initializing '.$course_type).'" onClick="reinit(this.form)" />').
1.185     www      2132: $help{'Caching'}.'</font></h3></form>'."\n\n");
1.91      www      2133: }
                   2134: 
1.75      www      2135: # ================================================================ Main Handler
                   2136: sub handler {
                   2137:     my $r = shift;
1.82      www      2138:     &Apache::loncommon::content_type($r,'text/html');
1.75      www      2139:     $r->send_http_header;
                   2140:     return OK if $r->header_only;
1.230     albertel 2141:     my $type = &Apache::loncommon::course_type();
1.75      www      2142: 
                   2143: # --------------------------------------------- Initialize help topics for this
1.209     albertel 2144:     foreach ('Adding_Course_Doc','Main_Course_Documents',
                   2145: 	     'Adding_External_Resource','Navigate_Content',
                   2146: 	     'Adding_Folders','Docs_Overview', 'Load_Map',
                   2147: 	     'Supplemental','Score_Upload_Form','Adding_Pages',
                   2148: 	     'Importing_LON-CAPA_Resource','Uploading_From_Harddrive',
                   2149: 	     'Check_Resource_Versions','Verify_Content') {
                   2150: 	$help{$_}=&Apache::loncommon::help_open_topic('Docs_'.$_);
                   2151:     }
1.75      www      2152:     # Composite help files
                   2153:     $help{'Syllabus'} = &Apache::loncommon::help_open_topic(
                   2154: 		    'Docs_About_Syllabus,Docs_Editing_Templated_Pages');
                   2155:     $help{'Simple Page'} = &Apache::loncommon::help_open_topic(
                   2156: 		    'Docs_About_Simple_Page,Docs_Editing_Templated_Pages');
1.86      albertel 2157:     $help{'Simple Problem'} = &Apache::loncommon::help_open_topic(
                   2158: 		    'Option_Response_Simple');
1.75      www      2159:     $help{'Bulletin Board'} = &Apache::loncommon::help_open_topic(
                   2160: 		    'Docs_About_Bulletin_Board,Docs_Editing_Templated_Pages');
                   2161:     $help{'My Personal Info'} = &Apache::loncommon::help_open_topic(
                   2162: 		  'Docs_About_My_Personal_Info,Docs_Editing_Templated_Pages');
                   2163:     $help{'Caching'} = &Apache::loncommon::help_open_topic('Caching');
1.142     raeburn  2164: 
1.209     albertel 2165: # does this user have privileges to modify docs
                   2166:     my $allowed=&Apache::lonnet::allowed('mdc',$env{'request.course.id'});
                   2167: 
                   2168:   if ($allowed && $env{'form.verify'}) {
1.75      www      2169:       &verifycontent($r);
1.209     albertel 2170:   } elsif ($allowed && $env{'form.listsymbs'}) {
1.208     albertel 2171:       &list_symbs($r);
1.209     albertel 2172:   } elsif ($allowed && $env{'form.versions'}) {
1.75      www      2173:       &checkversions($r);
1.209     albertel 2174:   } elsif ($allowed && $env{'form.dumpcourse'}) {
1.75      www      2175:       &dumpcourse($r);
1.209     albertel 2176:   } elsif ($allowed && $env{'form.exportcourse'}) {
1.138     raeburn  2177:       &exportcourse($r);
1.26      www      2178:   } else {
1.7       www      2179: # is this a standard course?
                   2180: 
1.174     albertel 2181:     my $standard=($env{'request.course.uri'}=~/^\/uploaded\//);
1.155     raeburn  2182:     my $forcestandard = 0;
1.15      www      2183:     my $forcesupplement;
                   2184:     my $script='';
1.19      www      2185:     my $showdoc=0;
1.142     raeburn  2186:     my $containertag;
                   2187:     my $uploadtag;
1.15      www      2188:     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
1.224     albertel 2189: 					    ['folderpath','pagepath',
                   2190: 					     'pagesymb','markedcopy_url',
                   2191: 					     'markedcopy_title']);
1.174     albertel 2192:     if ($env{'form.folderpath'}) {
                   2193: 	my (@folderpath)=split('&',$env{'form.folderpath'});
1.228     www      2194: 	$env{'form.foldername'}=&unescape(pop(@folderpath));
1.174     albertel 2195: 	$env{'form.folder'}=pop(@folderpath);
                   2196:     }
                   2197:     if ($env{'form.pagepath'}) {
                   2198:         my (@pagepath)=split('&',$env{'form.pagepath'});
1.228     www      2199:         $env{'form.pagename'}=&unescape(pop(@pagepath));
1.174     albertel 2200:         $env{'form.folder'}=pop(@pagepath);
1.156     albertel 2201:         $containertag = '<input type="hidden" name="pagepath" value="" />'.
                   2202: 	    '<input type="hidden" name="pagesymb" value="" />';
1.174     albertel 2203:         $uploadtag = '<input type="hidden" name="pagepath" value="'.$env{'form.pagepath'}.'" />'.
                   2204: 	    '<input type="hidden" name="pagesymb" value="'.$env{'form.pagesymb'}.'" />';
1.142     raeburn  2205:     }
1.21      www      2206:     if ($r->uri=~/^\/adm\/coursedocs\/showdoc\/(.*)$/) {
1.127     albertel 2207:        $showdoc='/'.$1;
1.21      www      2208:     }
                   2209:     unless ($showdoc) { # got called from remote
1.237     albertel 2210:        if (($env{'form.folder'}=~/^(?:group|default)_/) || 
1.209     albertel 2211:           ($env{'form.folder'} =~ m:^\d+/(pages|sequences)/:)) {
1.155     raeburn  2212:            $forcestandard = 1;
                   2213:        } 
1.174     albertel 2214:        $forcesupplement=($env{'form.folder'}=~/^supplemental_/);
1.7       www      2215: 
1.15      www      2216:        if ($allowed) { 
                   2217:          &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['cmd']);
                   2218:          $script=&Apache::lonratedt::editscript('simple'); 
                   2219:        }
                   2220:     } else { # got called in sequence from course
                   2221:        $allowed=0;
1.3       www      2222:     }
1.4       www      2223: 
                   2224: # get course data
1.174     albertel 2225:     my $coursenum=$env{'course.'.$env{'request.course.id'}.'.num'};
                   2226:     my $coursedom=$env{'course.'.$env{'request.course.id'}.'.domain'};
1.4       www      2227: 
1.225     albertel 2228: # get personal data 
1.174     albertel 2229:     my $uname=$env{'user.name'};
                   2230:     my $udom=$env{'user.domain'};
1.245     albertel 2231:     my $plainname=&escape(&Apache::loncommon::plainname($uname,$udom));
1.14      www      2232: 
1.8       www      2233: # graphics settings
1.4       www      2234: 
1.176     albertel 2235:     $iconpath = &Apache::loncommon::lonhttpdurl($r->dir_config('lonIconsURL') . "/");
1.8       www      2236: 
1.224     albertel 2237:     if ($allowed) {
                   2238: 	$script .= &editing_js($udom,$uname);
1.171     www      2239:     }
1.42      www      2240: # -------------------------------------------------------------------- Body tag
1.224     albertel 2241:     $script = '<script type="text/javascript">'."\n".$script."\n".'</script>';
1.229     raeburn  2242:     $r->print(&Apache::loncommon::start_page("$type Documents", $script,
1.225     albertel 2243: 					     {'force_register' => $showdoc,}).
1.233     albertel 2244: 	      &Apache::loncommon::help_open_menu('','',273,'RAT'));
1.224     albertel 2245:   
1.188     raeburn  2246:   my %allfiles = ();
                   2247:   my %codebase = ();
                   2248:   my ($upload_result,$upload_output);
                   2249:   if ($allowed) {
                   2250:       if (($env{'form.uploaddoc.filename'}) &&                                               ($env{'form.cmd'}=~/^upload_(\w+)/)) {
                   2251: # Process file upload - phase one - upload and parse primary file.  
1.190     albertel 2252:           $upload_result = &process_file_upload(\$upload_output,$coursenum,
                   2253: 						$coursedom,\%allfiles,
1.194     raeburn  2254: 						\%codebase,$1);
1.188     raeburn  2255:           if ($upload_result eq 'phasetwo') {
                   2256:               $r->print($upload_output);
                   2257:           }
                   2258:       } elsif ($env{'form.phasetwo'}) {
                   2259:           my %newname = ();
                   2260:           my %origname = ();
                   2261:           my %attribs = ();
                   2262:           my $updateflag = 0;
                   2263:           my $residx = $env{'form.newidx'};
1.228     www      2264:           my $primary_url = &unescape($env{'form.primaryurl'});
1.188     raeburn  2265: # Process file upload - phase two - gather secondary files.
                   2266:           for (my $i=0; $i<$env{'form.phasetwo'}; $i++) {
                   2267:               if ($env{'form.embedded_item_'.$i.'.filename'}) {
                   2268:                   my $javacodebase;
                   2269:                   $newname{$i} = &process_secondary_uploads(\$upload_output,$coursedom,$coursenum,'embedded_item_',$i,$residx);
1.228     www      2270:                   $origname{$i} = &unescape($env{'form.embedded_orig_'.$i});
1.188     raeburn  2271:                   if (exists($env{'form.embedded_codebase_'.$i})) {
1.228     www      2272:                       $javacodebase =  &unescape($env{'form.embedded_codebase_'.$i});  
1.188     raeburn  2273:                       $origname{$i} =~ s#^\Q$javacodebase\E/##; 
                   2274:                   }
                   2275:                   my @attributes = ();
                   2276:                   if ($env{'form.embedded_attrib_'.$i} =~ /:/) {
                   2277:                       @attributes = split/:/,$env{'form.embedded_attrib_'.$i};
                   2278:                   } else {
                   2279:                       @attributes = ($env{'form.embedded_attrib_'.$i});
                   2280:                   }
                   2281:                   foreach (@attributes) {
1.228     www      2282:                       push(@{$attribs{$i}},&unescape($_));
1.188     raeburn  2283:                   }
                   2284:                   if ($javacodebase) {
                   2285:                       $codebase{$i} = $javacodebase;
                   2286:                       $codebase{$i} =~ s#/$##;
                   2287:                       $updateflag = 1;
                   2288:                   }
                   2289:               }
                   2290:               unless ($newname{$i} eq $origname{$i}) {
                   2291:                   $updateflag = 1;
                   2292:               }
                   2293:           }
                   2294: # Process file upload - phase three - modify primary file
                   2295:           if ($updateflag) {
                   2296:               my ($content,$rtncode);
                   2297:               my $updateflag = 0;
                   2298:               my $getstatus = &Apache::lonnet::getuploaded('GET',$primary_url,$coursedom,$coursenum,\$content,\$rtncode);
                   2299:               if ($getstatus eq 'ok') {
                   2300:                   foreach my $item (keys %newname) {
                   2301:                       if ($newname{$item} ne $origname{$item}) {
                   2302:                           my $attrib_regexp = '';
                   2303:                           if (@{$attribs{$item}} > 1) {
                   2304:                               $attrib_regexp = join('|',@{$attribs{$item}});
                   2305:                           } else {
                   2306:                               $attrib_regexp = $attribs{$item}[0];
                   2307:                           }
                   2308:                           if ($content =~ m#($attrib_regexp\s*=\s*['"]?)\Q$origname{$item}\E(['"]?)#) {
                   2309:                           } 
                   2310:                           $content =~ s#($attrib_regexp\s*=\s*['"]?)\Q$origname{$item}\E(['"]?)#$1$newname{$item}$2#gi; 
                   2311:                       }
                   2312:                       if (exists($codebase{$item})) {
1.224     albertel 2313:                           $content =~ s/(codebase\s*=\s*["']?)\Q$codebase{$item}\E(["']?)/$1.$2/i; #' stupid emacs
1.188     raeburn  2314:                       }
                   2315:                   }
                   2316: # Save edited file.
                   2317:                   my $saveresult;
                   2318:                   my $docuname=$env{'course.'.$env{'request.course.id'}.'.num'};
                   2319:                   my $docudom=$env{'course.'.$env{'request.course.id'}.'.domain'};
1.191     raeburn  2320:                   my $url = &Apache::lonnet::store_edited_file($primary_url,$content,$docudom,$docuname,\$saveresult);
1.188     raeburn  2321:               } else {
                   2322:                   &Apache::lonnet::logthis('retrieval of uploaded file - '.$primary_url.' - for editing, failed: '.$getstatus); 
                   2323:               }
                   2324:           }
                   2325:       }
                   2326:   }
                   2327: 
                   2328:   unless ($showdoc ||  $upload_result eq 'phasetwo') {
1.81      www      2329: # -----------------------------------------------------------------------------
                   2330:        my %lt=&Apache::lonlocal::texthash(
1.229     raeburn  2331:                 'uplm' => 'Upload a new main '.lc($type).' document',
                   2332:                 'upls' => 'Upload a new supplemental '.lc($type).' document',
1.168     www      2333:                 'impp' => 'Import a document',
                   2334:                 'pubd' => 'Published documents',
1.181     www      2335: 		'copm' => 'All documents out of a published map into this folder',
1.81      www      2336:                 'spec' => 'Special documents',
                   2337:                 'upld' => 'Upload Document',
                   2338:                 'srch' => 'Search',
                   2339:                 'impo' => 'Import',
1.232     www      2340: 		'book' => 'Import Bookmarks',
1.81      www      2341:                 'selm' => 'Select Map',
                   2342:                 'load' => 'Load Map',
1.186     www      2343:                 'reco' => 'Recover Deleted Resources',
1.81      www      2344:                 'newf' => 'New Folder',
1.142     raeburn  2345:                 'newp' => 'New Composite Page',
1.81      www      2346:                 'extr' => 'External Resource',
                   2347:                 'syll' => 'Syllabus',
                   2348:                 'navc' => 'Navigate Contents',
                   2349:                 'sipa' => 'Simple Page',
                   2350:                 'sipr' => 'Simple Problem',
1.219     www      2351:                 'drbx' => 'Drop Box',
1.81      www      2352:                 'scuf' => 'Score Upload Form',
                   2353:                 'bull' => 'Bulletin Board',
1.96      sakharuk 2354:                 'mypi' => 'My Personal Info',
1.101     www      2355: 		'abou' => 'About User',
1.110     raeburn  2356:                 'imsf' => 'Import IMS package',
1.96      sakharuk 2357:                 'file' =>  'File',
                   2358:                 'title' => 'Title',
1.188     raeburn  2359:                 'comment' => 'Comment',
                   2360:                 'parse' => 'If HTML file, upload embedded images/multimedia files'
1.81      www      2361: 					  );
                   2362: # -----------------------------------------------------------------------------
1.42      www      2363:     if ($allowed) {
1.74      www      2364:        my $dumpbut=&dumpbutton();
1.138     raeburn  2365:        my $exportbut=&exportbutton();
1.88      www      2366:        my %lt=&Apache::lonlocal::texthash(
                   2367: 					 'vc' => 'Verify Content',
                   2368: 					 'cv' => 'Check/Set Resource Versions',
1.208     albertel 2369: 					 'ls' => 'List Symbs',
1.88      www      2370: 					  );
1.118     albertel 2371: 
1.174     albertel 2372:        my $folderpath=$env{'form.folderpath'};
1.118     albertel 2373:        if (!$folderpath) {
1.174     albertel 2374: 	   if ($env{'form.folder'} eq '' ||
                   2375: 	       $env{'form.folder'} eq 'supplemental') {
1.118     albertel 2376: 	       $folderpath='default&'.
1.230     albertel 2377: 		   &escape(&mt('Main '.$type.' Documents'));
1.118     albertel 2378: 	   }
                   2379:        }
1.174     albertel 2380:        unless ($env{'form.pagepath'}) {
1.142     raeburn  2381:            $containertag = '<input type="hidden" name="folderpath" value="" />';
                   2382:            $uploadtag = '<input type="hidden" name="folderpath" value="'.$folderpath.'" />';
                   2383:        }
                   2384: 
1.42      www      2385:        $r->print(<<ENDCOURSEVERIFY);
1.36      www      2386: <form name="renameform" method="post" action="/adm/coursedocs">
                   2387: <input type="hidden" name="title" />
                   2388: <input type="hidden" name="cmd" />
1.168     www      2389: <input type="hidden" name="markcopy" />
1.142     raeburn  2390: $containertag
1.36      www      2391: </form>
1.39      www      2392: <form name="simpleedit" method="post" action="/adm/coursedocs">
                   2393: <input type=hidden name="importdetail" value="">
1.142     raeburn  2394: $uploadtag
1.39      www      2395: </form>
1.26      www      2396: <form action="/adm/coursedocs" method="post" name="courseverify">
1.74      www      2397: <table bgcolor="#AAAAAA" width="100%" cellspacing="4" cellpadding="4">
                   2398: <tr><td bgcolor="#DDDDCC">
1.130     www      2399: <input type="submit" name="verify" value="$lt{'vc'}" />$help{'Verify_Content'}
1.74      www      2400: </td><td bgcolor="#DDDDCC">
1.130     www      2401:     <input type="submit" name="versions" value="$lt{'cv'}" />$help{'Check_Resource_Versions'}
1.74      www      2402: $dumpbut
1.138     raeburn  2403: $exportbut
1.218     albertel 2404: </td><td bgcolor="#DDDDCC">
1.208     albertel 2405:     <input type="submit" name="listsymbs" value="$lt{'ls'}" />
1.218     albertel 2406: </td></tr></table>
1.25      www      2407: </form>
                   2408: ENDCOURSEVERIFY
1.74      www      2409:        $r->print(&Apache::loncommon::help_open_topic('Docs_Adding_Course_Doc',
1.230     albertel 2410: 		     &mt('Editing the Table of Contents for your '.$type)));
1.25      www      2411:     }
1.17      www      2412: # --------------------------------------------------------- Standard documents
1.43      www      2413:     $r->print('<table border=2 cellspacing=4 cellpadding=4>');
1.7       www      2414:     if (($standard) && ($allowed) && (!$forcesupplement)) {
1.116     albertel 2415: 	$r->print('<tr><td bgcolor="#BBBBBB">');
                   2416: #  '<h2>'.&mt('Main Course Documents').
                   2417: #  ($allowed?' '.$help{'Main_Course_Documents'}:'').'</h2>');
1.174     albertel 2418:        my $folder=$env{'form.folder'};
1.117     albertel 2419:        if ($folder eq '' || $folder eq 'supplemental') {
1.112     raeburn  2420:            $folder='default';
1.230     albertel 2421: 	   $env{'form.folderpath'}='default&'.&escape(&mt('Main '.$type.' Documents'));
1.112     raeburn  2422:        }
1.51      www      2423:        my $postexec='';
                   2424:        if ($folder eq 'default') {
                   2425: 	   $r->print('<script>this.window.name="loncapaclient";</script>');
                   2426:        } else {
1.117     albertel 2427:            #$postexec='self.close();';
1.51      www      2428:        }
1.40      www      2429:        $hadchanges=0;
1.188     raeburn  2430:        &editor($r,$coursenum,$coursedom,$folder,$allowed,$upload_output);
1.40      www      2431:        if ($hadchanges) {
1.136     albertel 2432: 	   &mark_hash_old()
1.40      www      2433:        }
1.136     albertel 2434:        &changewarning($r,$postexec);
1.16      www      2435:        my $folderseq='/uploaded/'.$coursedom.'/'.$coursenum.'/default_'.time.
                   2436:                      '.sequence';
1.142     raeburn  2437:        my $pageseq = '/uploaded/'.$coursedom.'/'.$coursenum.'/default_'.time.
                   2438:                      '.page';
1.186     www      2439: 	my $container='sequence';
                   2440: 	if ($env{'form.pagepath'}) {
                   2441: 	    $container='page';
                   2442: 	}
                   2443: 	my $readfile='/uploaded/'.$coursedom.'/'.$coursenum.'/'.$folder.'.'.$container;
1.8       www      2444:        $r->print(<<ENDFORM);
1.43      www      2445: <table cellspacing=4 cellpadding=4><tr>
1.81      www      2446: <th bgcolor="#DDDDDD">$lt{'uplm'}</th>
                   2447: <th bgcolor="#DDDDDD">$lt{'impp'}</th>
                   2448: <th bgcolor="#DDDDDD">$lt{'spec'}</th>
1.11      www      2449: </tr>
1.16      www      2450: <tr><td bgcolor="#DDDDDD">
1.96      sakharuk 2451: $lt{'file'}:<br />
1.182     albertel 2452: <form name="uploaddocument" action="/adm/coursedocs" method="post" enctype="multipart/form-data">
1.59      www      2453: <input type="file" name="uploaddoc" size="40">
1.8       www      2454: <br />
1.96      sakharuk 2455: $lt{'title'}:<br />
1.11      www      2456: <input type="text" size="50" name="comment">
1.142     raeburn  2457: $uploadtag
1.10      www      2458: <input type="hidden" name="cmd" value="upload_default">
1.188     raeburn  2459: <br />
                   2460: <nobr>
1.190     albertel 2461: <label>$lt{'parse'}?
1.188     raeburn  2462: <input type="checkbox" name="parserflag" />
1.190     albertel 2463: </label>
1.188     raeburn  2464: </nobr>
                   2465: <br />
                   2466: <br />
1.129     albertel 2467: <nobr>
1.81      www      2468: <input type="submit" value="$lt{'upld'}">
1.60      albertel 2469:  $help{'Uploading_From_Harddrive'}
1.58      albertel 2470: </nobr>
1.60      albertel 2471: </form>
1.11      www      2472: </td>
1.16      www      2473: <td bgcolor="#DDDDDD">
1.39      www      2474: <form action="/adm/coursedocs" method="post" name="simpleeditdefault">
1.168     www      2475: $lt{'pubd'}<br />
1.142     raeburn  2476: $uploadtag
1.232     www      2477: <input type=button onClick="javascript:groupsearch()" value="$lt{'srch'}" />
                   2478: <br />
1.58      albertel 2479: <nobr>
1.232     www      2480: <input type=button onClick="javascript:groupimport();" value="$lt{'impo'}" />
1.58      albertel 2481: $help{'Importing_LON-CAPA_Resource'}
                   2482: </nobr>
1.232     www      2483: <br />
                   2484: <input type=button onClick="javascript:groupopen(0,1,1);" value="$lt{'book'}" />
1.59      www      2485: <p>
                   2486: <hr />
1.181     www      2487: $lt{'copm'}<br />
                   2488: <input type="text" size="40" name="importmap"><br />
1.68      bowersj2 2489: <nobr><input type=button 
1.52      www      2490: onClick="javascript:openbrowser('simpleeditdefault','importmap','sequence,page','')"
1.81      www      2491: value="$lt{'selm'}"> <input type="submit" name="loadmap" value="$lt{'load'}">
1.68      bowersj2 2492: $help{'Load_Map'}</nobr>
1.59      www      2493: </p>
1.52      www      2494: </form>
1.186     www      2495: <hr />
                   2496: <form action="/adm/groupsort" method="post" name="recover">
1.232     www      2497: <input type="button" name="recovermap" onClick="javascript:groupopen('$readfile',1,0)" value="$lt{'reco'}" />
1.186     www      2498: </form>
1.142     raeburn  2499: ENDFORM
1.174     albertel 2500:        unless ($env{'form.pagepath'}) {
1.168     www      2501: 	   $r->print(<<ENDFORM);
                   2502: <hr />
                   2503: <form action="/adm/coursedocs" method="post" name="newext">
                   2504: $uploadtag
                   2505: <input type=hidden name="importdetail" value="">
                   2506: <nobr>
                   2507: <input name="newext" type="button" onClick="javascript:makenewext('newext');"
                   2508: value="$lt{'extr'}" /> $help{'Adding_External_Resource'}
                   2509: </nobr>
                   2510: </form>
1.214     www      2511: <br /><form action="/adm/imsimportdocs" method="post" name="ims">
1.168     www      2512: <input type="hidden" name="folder" value="$folder" />
                   2513: <input name="imsimport" type="button" value="$lt{'imsf'}" onClick="javascript:makeims();" />
                   2514: </nobr>
                   2515: </form>
                   2516: ENDFORM
                   2517:        }
                   2518:        $r->print('</td><td bgcolor="#DDDDDD">');
1.174     albertel 2519:        unless ($env{'form.pagepath'}) {
1.142     raeburn  2520:            $r->print(<<ENDFORM);
1.214     www      2521: <br /><form action="/adm/coursedocs" method="post" name="newfolder">
1.174     albertel 2522: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
1.13      www      2523: <input type=hidden name="importdetail" value="">
1.58      albertel 2524: <nobr>
1.16      www      2525: <input name="newfolder" type="button"
                   2526: onClick="javascript:makenewfolder(this.form,'$folderseq');"
1.81      www      2527: value="$lt{'newf'}" />$help{'Adding_Folders'}
1.58      albertel 2528: </nobr>
1.11      www      2529: </form>
1.214     www      2530: <br /><form action="/adm/coursedocs" method="post" name="newpage">
1.174     albertel 2531: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
1.142     raeburn  2532: <input type=hidden name="importdetail" value="">
                   2533: <nobr>
                   2534: <input name="newpage" type="button"
                   2535: onClick="javascript:makenewpage(this.form,'$pageseq');"
                   2536: value="$lt{'newp'}" />$help{'Adding_Pages'}
                   2537: </nobr>
                   2538: </form>
1.214     www      2539: <br /><form action="/adm/coursedocs" method="post" name="newsyl">
1.142     raeburn  2540: $uploadtag
1.14      www      2541: <input type=hidden name="importdetail" 
                   2542: value="Syllabus=/public/$coursedom/$coursenum/syllabus">
1.58      albertel 2543: <nobr>
1.81      www      2544: <input name="newsyl" type="submit" value="$lt{'syll'}" /> 
1.65      bowersj2 2545:  $help{'Syllabus'}
1.58      albertel 2546: </nobr>
                   2547: </form>
1.214     www      2548: <br /><form action="/adm/coursedocs" method="post" name="newnav">
1.142     raeburn  2549: $uploadtag
1.15      www      2550: <input type=hidden name="importdetail" 
                   2551: value="Navigate Content=/adm/navmaps">
1.58      albertel 2552: <nobr>
1.81      www      2553: <input name="newnav" type="submit" value="$lt{'navc'}" />
1.47      www      2554: $help{'Navigate_Content'}
1.58      albertel 2555: </nobr>
1.22      www      2556: </form>
1.214     www      2557: <br /><form action="/adm/coursedocs" method="post" name="newsmppg">
1.142     raeburn  2558: $uploadtag
1.22      www      2559: <input type=hidden name="importdetail" value="">
1.58      albertel 2560: <nobr>
1.81      www      2561: <input name="newsmppg" type="button" value="$lt{'sipa'}"
1.65      bowersj2 2562: onClick="javascript:makesmppage();" /> $help{'Simple Page'}
1.58      albertel 2563: </nobr>
1.55      www      2564: </form>
1.214     www      2565: <br /><form action="/adm/coursedocs" method="post" name="newsmpproblem">
1.142     raeburn  2566: $uploadtag
1.55      www      2567: <input type=hidden name="importdetail" value="">
1.58      albertel 2568: <nobr>
1.81      www      2569: <input name="newsmpproblem" type="button" value="$lt{'sipr'}"
1.65      bowersj2 2570: onClick="javascript:makesmpproblem();" />$help{'Simple Problem'}
1.62      www      2571: </nobr>
                   2572: </form>
1.219     www      2573: <br /><form action="/adm/coursedocs" method="post" name="newdropbox">
                   2574: $uploadtag      
                   2575: <input type=hidden name="importdetail" value="">
                   2576: <nobr>          
                   2577: <input name="newdropbox" type="button" value="$lt{'drbx'}"
                   2578: onClick="javascript:makedropbox();" />
                   2579: </nobr>         
                   2580: </form> 
1.214     www      2581: <br /><form action="/adm/coursedocs" method="post" name="newexamupload">
1.142     raeburn  2582: $uploadtag
1.62      www      2583: <input type=hidden name="importdetail" value="">
                   2584: <nobr>
1.81      www      2585: <input name="newexamupload" type="button" value="$lt{'scuf'}"
1.62      www      2586: onClick="javascript:makeexamupload();" />
1.66      bowersj2 2587: $help{'Score_Upload_Form'}
1.58      albertel 2588: </nobr>
1.22      www      2589: </form>
1.214     www      2590: <br /><form action="/adm/coursedocs" method="post" name="newbul">
1.142     raeburn  2591: $uploadtag
1.22      www      2592: <input type=hidden name="importdetail" value="">
1.58      albertel 2593: <nobr>
1.81      www      2594: <input name="newbulletin" type="button" value="$lt{'bull'}"
1.22      www      2595: onClick="javascript:makebulboard();" />
1.65      bowersj2 2596: $help{'Bulletin Board'}
1.58      albertel 2597: </nobr>
                   2598: </form>
1.214     www      2599: <br /><form action="/adm/coursedocs" method="post" name="newaboutme">
1.142     raeburn  2600: $uploadtag
1.14      www      2601: <input type=hidden name="importdetail" 
                   2602: value="$plainname=/adm/$udom/$uname/aboutme">
1.58      albertel 2603: <nobr>
1.81      www      2604: <input name="newaboutme" type="submit" value="$lt{'mypi'}" />
1.65      bowersj2 2605: $help{'My Personal Info'}
1.101     www      2606: </nobr>
                   2607: </form>
1.214     www      2608: <br /><form action="/adm/coursedocs" method="post" name="newaboutsomeone">
1.142     raeburn  2609: $uploadtag
1.101     www      2610: <input type=hidden name="importdetail" value="">
                   2611: <nobr>
                   2612: <input name="newaboutsomeone" type="button" value="$lt{'abou'}" 
                   2613: onClick="javascript:makeabout();" />
1.110     raeburn  2614: </nobr>
1.182     albertel 2615: </form>
1.142     raeburn  2616: ENDFORM
                   2617:        }
1.174     albertel 2618:        if ($env{'form.pagepath'}) {
1.142     raeburn  2619:            $r->print(<<ENDBLOCK);
                   2620: <form action="/adm/coursedocs" method="post" name="newsmpproblem">
                   2621: $uploadtag
                   2622: <input type=hidden name="importdetail" value="">
                   2623: <nobr>
                   2624: <input name="newsmpproblem" type="button" value="$lt{'sipr'}"
                   2625: onClick="javascript:makesmpproblem();" />$help{'Simple Problem'}
                   2626: </nobr>
                   2627: </form>
1.214     www      2628: <br /><form action="/adm/coursedocs" method="post" name="newexamupload">
1.142     raeburn  2629: $uploadtag
                   2630: <input type=hidden name="importdetail" value="">
                   2631: <nobr>
                   2632: <input name="newexamupload" type="button" value="$lt{'scuf'}"
                   2633: onClick="javascript:makeexamupload();" />
                   2634: $help{'Score_Upload_Form'}
                   2635: </nobr>
1.182     albertel 2636: </form>
1.142     raeburn  2637: ENDBLOCK
                   2638:        }
                   2639:        $r->print('</td></tr>'."\n".
                   2640: '</table>');
1.24      www      2641:        $r->print('</td></tr>');
1.7       www      2642:     }
                   2643: # ----------------------------------------------------- Supplemental documents
                   2644:     if (!$forcestandard) {
1.116     albertel 2645:        $r->print('<tr><td bgcolor="#BBBBBB">');
                   2646: # '<h2>'.&mt('Supplemental Course Documents').
                   2647: #  ($allowed?' '.$help{'Supplemental'}:'').'</h2>');
1.174     albertel 2648:        my $folder=$env{'form.folder'};
1.117     albertel 2649:        unless ($folder=~/^supplemental/) {
1.116     albertel 2650: 	   $folder='supplemental';
1.117     albertel 2651:        }
                   2652:        if ($folder =~ /^supplemental$/ &&
1.174     albertel 2653: 	   $env{'form.folderpath'} =~ /^default\&/) {
                   2654: 	   $env{'form.folderpath'}='supplemental&'.
1.230     albertel 2655: 	       &escape(&mt('Supplemental '.$type.' Documents'));
1.116     albertel 2656:        }
1.7       www      2657:        &editor($r,$coursenum,$coursedom,$folder,$allowed);
1.8       www      2658:        if ($allowed) {
1.17      www      2659:        my $folderseq=
                   2660:                   '/uploaded/'.$coursedom.'/'.$coursenum.'/supplemental_'.time.
                   2661:                      '.sequence';
                   2662: 
1.8       www      2663:           $r->print(<<ENDSUPFORM);
1.43      www      2664: <table cellspacing=4 cellpadding=4><tr>
1.81      www      2665: <th bgcolor="#DDDDDD">$lt{'upls'}</th>
                   2666: <th bgcolor="#DDDDDD">$lt{'spec'}</th>
1.17      www      2667: </tr>
                   2668: <tr><td bgcolor="#DDDDDD">
1.10      www      2669: <form action="/adm/coursedocs" method="post" enctype="multipart/form-data">
1.59      www      2670: <input type="file" name="uploaddoc" size="40">
1.196     raeburn  2671: <br />
                   2672: <br />
                   2673: <nobr>
                   2674: <label>$lt{'parse'}?
                   2675: <input type="checkbox" name="parserflag" />
                   2676: </label>
                   2677: </nobr>
                   2678: <br /><br />
                   2679: $lt{'comment'}:<br />
1.4       www      2680: <textarea cols=50 rows=4 name='comment'>
                   2681: </textarea>
1.115     albertel 2682: <br />
1.174     albertel 2683: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
1.10      www      2684: <input type="hidden" name="cmd" value="upload_supplemental">
1.58      albertel 2685: <nobr>
1.81      www      2686: <input type="submit" value="$lt{'upld'}">
1.58      albertel 2687:  $help{'Uploading_From_Harddrive'}
                   2688: </nobr>
                   2689: </form>
1.17      www      2690: </td>
                   2691: <td bgcolor="#DDDDDD">
1.18      www      2692: <form action="/adm/coursedocs" method="post" name="supnewfolder">
1.174     albertel 2693: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
1.17      www      2694: <input type=hidden name="importdetail" value="">
1.58      albertel 2695: <nobr>
1.17      www      2696: <input name="newfolder" type="button"
                   2697: onClick="javascript:makenewfolder(this.form,'$folderseq');"
1.81      www      2698: value="$lt{'newf'}" /> $help{'Adding_Folders'}
1.58      albertel 2699: </nobr>
1.17      www      2700: </form>
1.214     www      2701: <br /><form action="/adm/coursedocs" method="post" name="supnewext">
1.174     albertel 2702: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
1.17      www      2703: <input type=hidden name="importdetail" value="">
1.58      albertel 2704: <nobr>
1.18      www      2705: <input name="newext" type="button" 
                   2706: onClick="javascript:makenewext('supnewext');"
1.81      www      2707: value="$lt{'extr'}" /> $help{'Adding_External_Resource'}
1.58      albertel 2708: </nobr>
1.17      www      2709: </form>
1.214     www      2710: <br /><form action="/adm/coursedocs" method="post" name="supnewsyl">
1.174     albertel 2711: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
1.17      www      2712: <input type=hidden name="importdetail" 
                   2713: value="Syllabus=/public/$coursedom/$coursenum/syllabus">
1.58      albertel 2714: <nobr>
1.81      www      2715: <input name="newsyl" type="submit" value="$lt{'syll'}" />
1.65      bowersj2 2716: $help{'Syllabus'}
1.58      albertel 2717: </nobr>
                   2718: </form>
1.214     www      2719: <br /><form action="/adm/coursedocs" method="post" name="subnewaboutme">
1.174     albertel 2720: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
1.17      www      2721: <input type=hidden name="importdetail" 
                   2722: value="$plainname=/adm/$udom/$uname/aboutme">
1.58      albertel 2723: <nobr>
1.81      www      2724: <input name="newaboutme" type="submit" value="$lt{'mypi'}" />
1.65      bowersj2 2725: $help{'My Personal Info'}
1.58      albertel 2726: </nobr>
                   2727: </form>
1.17      www      2728: </td></tr>
1.24      www      2729: </table></td></tr>
1.8       www      2730: ENDSUPFORM
                   2731:        }
1.7       www      2732:     }
1.18      www      2733:     if ($allowed) {
1.182     albertel 2734: 	$r->print('<form method="POST" name="extimport" action="/adm/coursedocs"><input type="hidden" name="title" /><input type="hidden" name="url" /><input type="hidden" name="useform" /></form>');
1.18      www      2735:     }
1.24      www      2736:     $r->print('</table>');
1.19      www      2737:   } else {
1.188     raeburn  2738:       unless ($upload_result eq 'phasetwo') {
1.19      www      2739: # -------------------------------------------------------- This is showdoc mode
1.188     raeburn  2740:           $r->print("<h1>".&mt('Uploaded Document').' - '.
1.141     albertel 2741: 		&Apache::lonnet::gettitle($r->uri).'</h1><p>'.
1.81      www      2742: &mt('It is recommended that you use an up-to-date virus scanner before handling this file.')."</p><p><table>".
1.188     raeburn  2743:           &entryline(0,&mt("Click to download or use your browser's Save Link function"),$showdoc).'</table></p>');
                   2744:       }
1.19      www      2745:   }
1.26      www      2746:  }
1.224     albertel 2747:  $r->print(&Apache::loncommon::end_page());
1.26      www      2748:  return OK;
1.1       www      2749: } 
                   2750: 
1.224     albertel 2751: 
                   2752: sub editing_js {
                   2753:     my ($udom,$uname) = @_;
                   2754:     my $now = time();
                   2755: 
                   2756:     return <<ENDNEWSCRIPT;
                   2757: function makenewfolder(targetform,folderseq) {
                   2758:     var foldername=prompt('Name of New Folder','New Folder');
                   2759:     if (foldername) {
1.236     albertel 2760:        targetform.importdetail.value=escape(foldername)+"="+folderseq;
1.224     albertel 2761:         targetform.submit();
                   2762:     }
                   2763: }
                   2764: 
                   2765: function makenewpage(targetform,folderseq) {
                   2766:     var pagename=prompt('Name of New Page','New Page');
                   2767:     if (pagename) {
1.236     albertel 2768:         targetform.importdetail.value=escape(pagename)+"="+folderseq;
1.224     albertel 2769:         targetform.submit();
                   2770:     }
                   2771: }
                   2772: 
                   2773: function makenewext(targetname) {
                   2774:     this.document.forms.extimport.useform.value=targetname;
                   2775:     window.open('/adm/rat/extpickframe.html');
                   2776: }
                   2777: 
                   2778: function makeexamupload() {
                   2779:    var title=prompt('Listed Title for the Uploaded Score');
                   2780:    if (title) { 
                   2781:     this.document.forms.newexamupload.importdetail.value=
1.236     albertel 2782: 	escape(title)+'=/res/lib/templates/examupload.problem';
1.224     albertel 2783:     this.document.forms.newexamupload.submit();
                   2784:    }
                   2785: }
                   2786: 
                   2787: function makesmppage() {
                   2788:    var title=prompt('Listed Title for the Page');
                   2789:    if (title) { 
                   2790:     this.document.forms.newsmppg.importdetail.value=
1.236     albertel 2791: 	escape(title)+'=/adm/$udom/$uname/$now/smppg';
1.224     albertel 2792:     this.document.forms.newsmppg.submit();
                   2793:    }
                   2794: }
                   2795: 
                   2796: function makesmpproblem() {
                   2797:    var title=prompt('Listed Title for the Problem');
                   2798:    if (title) { 
                   2799:     this.document.forms.newsmpproblem.importdetail.value=
1.236     albertel 2800: 	escape(title)+'=/res/lib/templates/simpleproblem.problem';
1.224     albertel 2801:     this.document.forms.newsmpproblem.submit();
                   2802:    }
                   2803: }
                   2804: 
                   2805: function makedropbox() {
                   2806:    var title=prompt('Listed Title for the Drop Box');
                   2807:    if (title) { 
                   2808:     this.document.forms.newdropbox.importdetail.value=
1.236     albertel 2809:         escape(title)+'=/res/lib/templates/DropBox.problem';
1.224     albertel 2810:     this.document.forms.newdropbox.submit();
                   2811:    }
                   2812: }
                   2813: 
                   2814: function makebulboard() {
                   2815:    var title=prompt('Listed Title for the Bulletin Board');
                   2816:    if (title) {
                   2817:     this.document.forms.newbul.importdetail.value=
1.236     albertel 2818: 	escape(title)+'=/adm/$udom/$uname/$now/bulletinboard';
1.224     albertel 2819:     this.document.forms.newbul.submit();
                   2820:    }
                   2821: }
                   2822: 
                   2823: function makeabout() {
1.236     albertel 2824:    var user=prompt("Enter user:domain for User's 'About Me' Page");
1.224     albertel 2825:    if (user) {
                   2826:        var comp=new Array();
1.236     albertel 2827:        comp=user.split(':');
1.224     albertel 2828:        if ((typeof(comp[0])!=undefined) && (typeof(comp[1])!=undefined)) {
                   2829: 	   if ((comp[0]) && (comp[1])) {
                   2830: 	       this.document.forms.newaboutsomeone.importdetail.value=
1.236     albertel 2831: 		   'About '+escape(user)+'=/adm/'+comp[1]+'/'+comp[0]+'/aboutme';
1.224     albertel 2832: 	       this.document.forms.newaboutsomeone.submit();
                   2833: 	   } else {
1.236     albertel 2834:                alert("Not a valid user:domain");
1.224     albertel 2835:            }
                   2836:        } else {
1.236     albertel 2837:            alert("Please enter both user and domain in the format user:domain"); 
1.224     albertel 2838:        }
                   2839:    }
                   2840: }
                   2841: 
                   2842: function makeims() {
                   2843:     var caller = document.forms.ims.folder.value;
                   2844:     var newlocation = "/adm/imsimportdocs?folder="+caller+"&phase=one";
                   2845:     newWindow = window.open("","IMSimport","HEIGHT=700,WIDTH=750,scrollbars=yes");
                   2846:     newWindow.location.href = newlocation;
                   2847: }
                   2848: 
                   2849: 
                   2850: function finishpick() {
                   2851:     var title=this.document.forms.extimport.title.value;
                   2852:     var url=this.document.forms.extimport.url.value;
                   2853:     var form=this.document.forms.extimport.useform.value;
                   2854:     eval
                   2855:      ('this.document.forms.'+form+'.importdetail.value="'+title+'='+url+
                   2856:     '";this.document.forms.'+form+'.submit();');
                   2857: }
                   2858: 
                   2859: function changename(folderpath,index,oldtitle,container,pagesymb) {
                   2860:     var title=prompt('New Title',oldtitle);
                   2861:     if (title) {
                   2862: 	this.document.forms.renameform.title.value=title;
                   2863: 	this.document.forms.renameform.cmd.value='rename_'+index;
                   2864:         if (container == 'sequence') {
                   2865: 	    this.document.forms.renameform.folderpath.value=folderpath;
                   2866:         }
                   2867:         if (container == 'page') {
                   2868:             this.document.forms.renameform.pagepath.value=folderpath;
                   2869:             this.document.forms.renameform.pagesymb.value=pagesymb;
                   2870:         }
                   2871:         this.document.forms.renameform.submit();
                   2872:     }
                   2873: }
                   2874: 
                   2875: function removeres(folderpath,index,oldtitle,container,pagesymb) {
                   2876:     if (confirm('WARNING: Removing a resource makes associated grades and scores inaccessible!\\nRemove "'+oldtitle+'"?')) {
                   2877: 	this.document.forms.renameform.cmd.value='del_'+index;
                   2878:         if (container == 'sequence') {
                   2879:             this.document.forms.renameform.folderpath.value=folderpath;
                   2880:         }
                   2881:         if (container == 'page') {
                   2882:             this.document.forms.renameform.pagepath.value=folderpath;
                   2883:             this.document.forms.renameform.pagesymb.value=pagesymb;
                   2884:         }
                   2885:         this.document.forms.renameform.submit();
                   2886:     }
                   2887: }
                   2888: 
                   2889: function cutres(folderpath,index,oldtitle,container,pagesymb) {
                   2890:     if (confirm('WARNING: Cutting a resource makes associated grades and scores inaccessible!\\nGrades remain inaccessible if resource is pasted into another folder.\\nCut "'+oldtitle+'"?')) {
                   2891: 	this.document.forms.renameform.cmd.value='cut_'+index;
                   2892: 	this.document.forms.renameform.markcopy.value=index;
                   2893:         if (container == 'sequence') {
                   2894:             this.document.forms.renameform.folderpath.value=folderpath;
                   2895:         }
                   2896:         if (container == 'page') {
                   2897:             this.document.forms.renameform.pagepath.value=folderpath;
                   2898:             this.document.forms.renameform.pagesymb.value=pagesymb;
                   2899:         }
                   2900:         this.document.forms.renameform.submit();
                   2901:     }
                   2902: }
                   2903: 
                   2904: function markcopy(folderpath,index,oldtitle,container,pagesymb) {
                   2905:     this.document.forms.renameform.markcopy.value=index;
                   2906:     if (container == 'sequence') {
                   2907: 	this.document.forms.renameform.folderpath.value=folderpath;
                   2908:     }
                   2909:     if (container == 'page') {
                   2910: 	this.document.forms.renameform.pagepath.value=folderpath;
                   2911: 	this.document.forms.renameform.pagesymb.value=pagesymb;
                   2912:     }
                   2913:     this.document.forms.renameform.submit();
                   2914: }
                   2915: 
                   2916: ENDNEWSCRIPT
                   2917: }
1.1       www      2918: 1;
                   2919: __END__

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>