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

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

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