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

1.1       www         1: # The LearningOnline Network
1.2       www         2: # Documents
1.1       www         3: #
1.278.2.2! albertel    4: # $Id: londocs.pm,v 1.278.2.1 2007/06/28 23:26: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 {
1.277     albertel  907:     my ($coursenum, $coursedom, $folder, $container, $caller, @files) = @_;
                    908: 
                    909:     while (@files) {
                    910: 	my $name = shift(@files);
                    911: 	my $url  = shift(@files);
                    912: 	#FIXME check if file exists before overwriting, might be restoring it
                    913:         if (($url =~ m{^/uploaded/\Q$coursedom\E/\Q$coursenum\E/(default_\d+\.)(page|sequence)$}) 
                    914: 	     && ($caller eq 'londocs')
                    915: 	     && (!&Apache::lonnet::stat_file($url))) {
                    916: 	    
1.142     raeburn   917:             my $errtext = '';
                    918:             my $fatal = 0;
                    919:             my $newmapstr = '<map>'."\n".
                    920:                             '<resource id="1" src="" type="start"></resource>'."\n".
                    921:                             '<link from="1" to="2" index="1"></link>'."\n".
                    922:                             '<resource id="2" src="" type="finish"></resource>'."\n".
                    923:                             '</map>';
1.174     albertel  924:             $env{'form.output'}=$newmapstr;
1.189     albertel  925:             my $result=&Apache::lonnet::finishuserfileupload($coursenum,$coursedom,
1.142     raeburn   926:                                                 'output',$1.$2);
                    927:             if ($result != m|^/uploaded/|) {
                    928:                 $errtext.='Map not saved: A network error occured when trying to save the new map. ';
                    929:                 $fatal = 2;
                    930:             }
                    931:             if ($fatal) {
                    932:                 return ($errtext,$fatal);
                    933:             }
                    934:         }
1.73      bowersj2  935: 	if ($url) {
1.245     albertel  936: 	    my $idx = &LONCAPA::map::getresidx($url);
                    937: 	    $LONCAPA::map::order[$#LONCAPA::map::order+1]=$idx;
1.73      bowersj2  938: 	    my $ext = 'false';
1.263     albertel  939: 	    if ($url=~m{^http://} || $url=~m{^https://}) { $ext = 'true'; }
1.273     albertel  940: 	    $url  = &LONCAPA::map::qtunescape($url);
                    941: 	    $name = &LONCAPA::map::qtunescape($name);
1.245     albertel  942: 	    $LONCAPA::map::resources[$idx] = 
1.73      bowersj2  943: 		join ':', ($name, $url, $ext, 'normal', 'res');
                    944: 	}
                    945:     }
1.142     raeburn   946:     return &storemap($coursenum, $coursedom, $folder.'.'.$container);
1.73      bowersj2  947: }
                    948: 
1.114     albertel  949: sub breadcrumbs {
                    950:     my ($where)=@_;
                    951:     &Apache::lonhtmlcommon::clear_breadcrumbs();
1.142     raeburn   952:     my (@folders);
1.174     albertel  953:     if ($env{'form.pagepath'}) {
                    954:         @folders = split('&',$env{'form.pagepath'});
1.142     raeburn   955:     } else {
1.174     albertel  956:         @folders=split('&',$env{'form.folderpath'});
1.142     raeburn   957:     }
1.116     albertel  958:     my $folderpath;
1.168     www       959:     my $cpinfo='';
1.251     www       960:     my $plain='';
1.174     albertel  961:     if ($env{'form.markedcopy_url'}) {
1.168     www       962:        $cpinfo='&markedcopy_url='.
1.228     www       963:                &escape($env{'form.markedcopy_url'}).
1.168     www       964:                '&markedcopy_title='.
1.228     www       965:                &escape($env{'form.markedcopy_title'});
1.168     www       966:     }
1.242     www       967:     my $randompick=-1;
                    968:     my $isencrypted=0;
                    969:     my $ishidden=0;
1.278.2.1  albertel  970:     my $is_random_order=0;
1.116     albertel  971:     while (@folders) {
                    972: 	my $folder=shift(@folders);
                    973: 	my $foldername=shift(@folders);
                    974: 	if ($folderpath) {$folderpath.='&';}
                    975: 	$folderpath.=$folder.'&'.$foldername;
                    976: 	my $url='/adm/coursedocs?folderpath='.
1.228     www       977: 	    &escape($folderpath);
1.242     www       978:             my $name=&unescape($foldername);
                    979: # randompick number, hidden, encrypted is appended with ":"s to the foldername	
1.278.2.1  albertel  980:             $name=~s/\:(\d*)\:(\w*)\:(\w*):(\d*)$//;
1.242     www       981:             if ($1 ne '') { 
                    982:                $randompick=$1;
                    983:             } else {
                    984:                $randompick=-1;
                    985:             }
                    986:             if ($2) { $ishidden=1; }
                    987:             if ($3) { $isencrypted=1; }
1.278.2.1  albertel  988:             if ($4 ne '') { $is_random_order = 1; }
1.114     albertel  989: 	    &Apache::lonhtmlcommon::add_breadcrumb(
1.168     www       990: 		      {'href'=>$url.$cpinfo,
1.242     www       991: 		       'title'=>$name,
1.117     albertel  992: 		       'text'=>'<font size="+1">'.
1.266     albertel  993: 			   $name.'</font>',
                    994: 		       'no_mt'=>1,
1.117     albertel  995: 		       });
1.251     www       996: 	$plain.=$name.' &gt; ';
1.114     albertel  997:     }
1.251     www       998:     $plain=~s/\&gt\;\s*$//;
1.242     www       999:     return (&Apache::lonhtmlcommon::breadcrumbs(undef,undef,0,'nohelp',
1.278.2.1  albertel 1000: 					       'LC_docs_path'),$randompick,$ishidden,$isencrypted,$plain,$is_random_order);
1.114     albertel 1001: }
                   1002: 
1.247     www      1003: sub log_docs {
                   1004:     return &Apache::lonnet::instructor_log('docslog',@_);
                   1005: }
                   1006: 
                   1007: {
                   1008:     my @oldresources=();
                   1009:     my @oldorder=();
                   1010:     my $parmidx;
                   1011:     my %parmaction=();
                   1012:     my %parmvalue=();
1.249     www      1013:     my $changedflag;
1.247     www      1014: 
                   1015:     sub snapshotbefore {
1.248     albertel 1016:         @oldresources=@LONCAPA::map::resources;
                   1017:         @oldorder=@LONCAPA::map::order;
1.247     www      1018:         $parmidx=undef;
                   1019:         %parmaction=();
                   1020:         %parmvalue=();
1.249     www      1021:         $changedflag=0;
1.247     www      1022:     }
                   1023: 
                   1024:     sub remember_parms {
                   1025:         my ($idx,$parameter,$action,$value)=@_;
                   1026:         $parmidx=$idx;
                   1027:         $parmaction{$parameter}=$action;
                   1028:         $parmvalue{$parameter}=$value;
1.249     www      1029:         $changedflag=1;
1.247     www      1030:     }
                   1031: 
                   1032:     sub log_differences {
1.251     www      1033:         my ($plain)=@_;
1.260     www      1034:         my %storehash=('folder' => $plain,
                   1035:                        'currentfolder' => $env{'form.folder'});
1.247     www      1036:         if ($parmidx) {
                   1037:            $storehash{'parameter_res'}=$oldresources[$parmidx];
                   1038:            foreach my $parm (keys %parmaction) {
                   1039:               $storehash{'parameter_action_'.$parm}=$parmaction{$parm};
                   1040:               $storehash{'parameter_value_'.$parm}=$parmvalue{$parm};
                   1041:            }
                   1042:         }
                   1043:         my $maxidx=$#oldresources;
1.248     albertel 1044:         if ($#LONCAPA::map::resources>$#oldresources) {
                   1045:            $maxidx=$#LONCAPA::map::resources;
1.247     www      1046:         }
                   1047:         for (my $idx=0; $idx<=$maxidx; $idx++) {
                   1048:            if ($LONCAPA::map::resources[$idx] ne $oldresources[$idx]) {
                   1049:               $storehash{'before_resources_'.$idx}=$oldresources[$idx];
                   1050:               $storehash{'after_resources_'.$idx}=$LONCAPA::map::resources[$idx];
1.249     www      1051:               $changedflag=1;
1.247     www      1052:            }
                   1053:            if ($LONCAPA::map::order[$idx] ne $oldorder[$idx]) {
1.252     www      1054:               $storehash{'before_order_res_'.$idx}=$oldresources[$oldorder[$idx]];
                   1055:               $storehash{'after_order_res_'.$idx}=$LONCAPA::map::resources[$LONCAPA::map::order[$idx]];
1.249     www      1056:               $changedflag=1;
1.247     www      1057:            }
                   1058:         }
1.251     www      1059: 	$storehash{'maxidx'}=$maxidx;
1.249     www      1060:         if ($changedflag) { &log_docs(\%storehash); }
1.247     www      1061:     }
                   1062: }
                   1063: 
                   1064: 
                   1065: #
                   1066: # Docs Change Log
                   1067: #
                   1068: sub docs_change_log {
                   1069:     my ($r)=@_;
1.260     www      1070:     my $folder=$env{'form.folder'};
1.247     www      1071:     $r->print(&Apache::loncommon::start_page('Course Document Change Log'));
                   1072:     $r->print(&Apache::lonhtmlcommon::breadcrumbs('Course Document Change Log'));
                   1073:     my %docslog=&Apache::lonnet::dump('nohist_docslog',
                   1074:                                       $env{'course.'.$env{'request.course.id'}.'.domain'},
                   1075:                                       $env{'course.'.$env{'request.course.id'}.'.num'});
1.254     albertel 1076: 
1.247     www      1077:     if ((keys(%docslog))[0]=~/^error\:/) { undef(%docslog); }
1.254     albertel 1078: 
1.247     www      1079:     $r->print('<form action="/adm/coursedocs" method="post" name="docslog">'.
                   1080:               '<input type="hidden" name="docslog" value="1" />');
1.254     albertel 1081: 
1.247     www      1082:     my %saveable_parameters = ('show' => 'scalar',);
                   1083:     &Apache::loncommon::store_course_settings('docs_log',
                   1084:                                               \%saveable_parameters);
                   1085:     &Apache::loncommon::restore_course_settings('docs_log',
                   1086:                                                 \%saveable_parameters);
                   1087:     if (!$env{'form.show'}) { $env{'form.show'}=10; }
1.254     albertel 1088:     my %lt=('hiddenresource' => 'Resources hidden',
                   1089: 	    'encrypturl'     => 'URL hidden',
                   1090: 	    'randompick'     => 'Randomly pick',
1.278.2.1  albertel 1091: 	    'randomorder'    => 'Randomly ordered',
1.254     albertel 1092: 	    'set'            => 'set to',
                   1093: 	    'del'            => 'deleted');
1.259     www      1094:     $r->print(&Apache::loncommon::display_filter().
1.260     www      1095:               '<input type="hidden" name="folder" value="'.$folder.'" />'.
1.247     www      1096:               '<input type="submit" value="'.&mt('Display').'" /></form>');
                   1097:     $r->print(&Apache::loncommon::start_data_table().&Apache::loncommon::start_data_table_header_row().
1.251     www      1098:               '<th>'.&mt('Time').'</th><th>'.&mt('User').'</th><th>'.&mt('Folder').'</th><th>'.&mt('Before').'</th><th>'.
                   1099:               &mt('After').'</th>'.
1.247     www      1100:               &Apache::loncommon::end_data_table_header_row());
                   1101:     my $shown=0;
                   1102:     foreach my $id (sort { $docslog{$b}{'exe_time'}<=>$docslog{$a}{'exe_time'} } (keys(%docslog))) {
1.260     www      1103: 	if ($env{'form.displayfilter'} eq 'currentfolder') {
                   1104: 	    if ($docslog{$id}{'logentry'}{'currentfolder'} ne $folder) { next; }
                   1105: 	}
1.247     www      1106:         my @changes=keys(%{$docslog{$id}{'logentry'}});
1.261     www      1107:         if ($env{'form.displayfilter'} eq 'containing') {
                   1108: 	    my $wholeentry=$docslog{$id}{'exe_uname'}.':'.$docslog{$id}{'exe_udom'}.':'.
                   1109: 		&Apache::loncommon::plainname($docslog{$id}{'exe_uname'},$docslog{$id}{'exe_udom'});
                   1110: 	    foreach my $key (@changes) {
                   1111: 		$wholeentry.=':'.$docslog{$id}{'logentry'}{$key};
                   1112: 	    }
                   1113: 	    if ($wholeentry!~/\Q$env{'form.containingphrase'}\E/i) { next; }         
                   1114: 	}
1.247     www      1115:         my $count = 0;
                   1116:         my $time =
                   1117:             &Apache::lonlocal::locallocaltime($docslog{$id}{'exe_time'});
                   1118:         my $plainname =
                   1119:             &Apache::loncommon::plainname($docslog{$id}{'exe_uname'},
                   1120:                                           $docslog{$id}{'exe_udom'});
                   1121:         my $about_me_link =
                   1122:             &Apache::loncommon::aboutmewrapper($plainname,
                   1123:                                                $docslog{$id}{'exe_uname'},
                   1124:                                                $docslog{$id}{'exe_udom'});
                   1125:         my $send_msg_link='';
                   1126:         if ((($docslog{$id}{'exe_uname'} ne $env{'user.name'})
                   1127:              || ($docslog{$id}{'exe_udom'} ne $env{'user.domain'}))) {
                   1128:             $send_msg_link ='<br />'.
                   1129:                 &Apache::loncommon::messagewrapper(&mt('Send message'),
                   1130:                                                    $docslog{$id}{'exe_uname'},
                   1131:                                                    $docslog{$id}{'exe_udom'});
                   1132:         }
                   1133:         $r->print(&Apache::loncommon::start_data_table_row());
                   1134:         $r->print('<td>'.$time.'</td>
                   1135:                        <td>'.$about_me_link.
                   1136:                   '<br /><tt>'.$docslog{$id}{'exe_uname'}.
                   1137:                                   ':'.$docslog{$id}{'exe_udom'}.'</tt>'.
1.249     www      1138:                   $send_msg_link.'</td><td>'.
1.251     www      1139:                   $docslog{$id}{'logentry'}{'folder'}.'</td><td>');
                   1140: # Before
                   1141: 	for (my $idx=0;$idx<=$docslog{$id}{'logentry'}{'maxidx'};$idx++) {
                   1142: 	    my $oldname=(split(/\:/,$docslog{$id}{'logentry'}{'before_resources_'.$idx}))[0];
                   1143: 	    my $newname=(split(/\:/,$docslog{$id}{'logentry'}{'after_resources_'.$idx}))[0];
                   1144: 	    if ($oldname ne $newname) {
1.252     www      1145: 		$r->print(&LONCAPA::map::qtescape($oldname));
1.251     www      1146: 	    }
                   1147: 	}
1.252     www      1148: 	$r->print('<ul>');
                   1149: 	for (my $idx=0;$idx<=$docslog{$id}{'logentry'}{'maxidx'};$idx++) {
                   1150:             if ($docslog{$id}{'logentry'}{'before_order_res_'.$idx}) {
                   1151: 		$r->print('<li>'.&LONCAPA::map::qtescape((split(/\:/,$docslog{$id}{'logentry'}{'before_order_res_'.$idx}))[0]).'</li>');
                   1152: 	    }
                   1153: 	}
                   1154: 	$r->print('</ul>');
1.251     www      1155: # After
                   1156:         $r->print('</td><td>');
                   1157: 
                   1158: 	for (my $idx=0;$idx<=$docslog{$id}{'logentry'}{'maxidx'};$idx++) {
                   1159: 	    my $oldname=(split(/\:/,$docslog{$id}{'logentry'}{'before_resources_'.$idx}))[0];
                   1160: 	    my $newname=(split(/\:/,$docslog{$id}{'logentry'}{'after_resources_'.$idx}))[0];
                   1161: 	    if ($oldname ne $newname) {
1.252     www      1162: 		$r->print(&LONCAPA::map::qtescape($newname));
1.251     www      1163: 	    }
                   1164: 	}        
1.252     www      1165: 	$r->print('<ul>');
                   1166: 	for (my $idx=0;$idx<=$docslog{$id}{'logentry'}{'maxidx'};$idx++) {
                   1167:             if ($docslog{$id}{'logentry'}{'after_order_res_'.$idx}) {
                   1168: 		$r->print('<li>'.&LONCAPA::map::qtescape((split(/\:/,$docslog{$id}{'logentry'}{'after_order_res_'.$idx}))[0]).'</li>');
                   1169: 	    }
                   1170: 	}
                   1171: 	$r->print('</ul>');
                   1172: 	if ($docslog{$id}{'logentry'}{'parameter_res'}) {
                   1173: 	    $r->print(&LONCAPA::map::qtescape((split(/\:/,$docslog{$id}{'logentry'}{'parameter_res'}))[0]).':<ul>');
1.278.2.1  albertel 1174: 	    foreach my $parameter ('randompick','hiddenresource','encrypturl','randomorder') {
1.252     www      1175: 		if ($docslog{$id}{'logentry'}{'parameter_action_'.$parameter}) {
1.254     albertel 1176: 		    $r->print('<li>'.
                   1177: 			      &mt($lt{$parameter}.' '.$lt{$docslog{$id}{'logentry'}{'parameter_action_'.$parameter}}.' [_1]',
                   1178: 				  $docslog{$id}{'logentry'}{'parameter_value_'.$parameter})
                   1179: 			      .'</li>');
1.252     www      1180: 		}
                   1181: 	    }
                   1182: 	    $r->print('</ul>');
                   1183: 	}
1.251     www      1184: # End
                   1185:         $r->print('</td>'.&Apache::loncommon::end_data_table_row());
1.247     www      1186:         $shown++;
                   1187:         if (!($env{'form.show'} eq &mt('all')
                   1188:               || $shown<=$env{'form.show'})) { last; }
                   1189:     }
                   1190:     $r->print(&Apache::loncommon::end_data_table());
                   1191:     $r->print(&Apache::loncommon::end_page());
                   1192: }
                   1193: 
1.7       www      1194: sub editor {
1.188     raeburn  1195:     my ($r,$coursenum,$coursedom,$folder,$allowed,$upload_output)=@_;
1.10      www      1196:     my $errtext='';
                   1197:     my $fatal=0;
1.142     raeburn  1198:     my $container='sequence';
1.174     albertel 1199:     if ($env{'form.pagepath'}) {
1.142     raeburn  1200:         $container='page';
                   1201:     }
1.10      www      1202:     ($errtext,$fatal)=
1.142     raeburn  1203:               &mapread($coursenum,$coursedom,$folder.'.'.$container);
1.245     albertel 1204:     if ($#LONCAPA::map::order<1) {
                   1205: 	my $idx=&LONCAPA::map::getresidx();
1.178     www      1206: 	if ($idx<=0) { $idx=1; }
1.245     albertel 1207:        	$LONCAPA::map::order[0]=$idx;
                   1208:         $LONCAPA::map::resources[$idx]='';
1.17      www      1209:     }
1.174     albertel 1210:     if (defined($env{'form.markcopy'})) {
1.168     www      1211: # Mark for copying
1.245     albertel 1212: 	my ($title,$url)=split(':',$LONCAPA::map::resources[$LONCAPA::map::order[$env{'form.markcopy'}]]);
1.174     albertel 1213: 	$env{'form.markedcopy_title'}=$title;
                   1214: 	$env{'form.markedcopy_url'}=$url;
1.168     www      1215:     }
1.278.2.1  albertel 1216:     my ($breadcrumbtrail,$randompick,$ishidden,$isencrypted,$plain,$is_random_order)=&breadcrumbs($folder);
1.242     www      1217:     $r->print($breadcrumbtrail);
1.7       www      1218:     if ($fatal) {
                   1219: 	   $r->print('<p><font color="red">'.$errtext.'</font></p>');
                   1220:     } else {
                   1221: # ------------------------------------------------------------ Process commands
1.121     www      1222: 
1.16      www      1223: # ---------------- if they are for this folder and user allowed to make changes
1.174     albertel 1224: 	if (($allowed) && ($env{'form.folder'} eq $folder)) {
1.123     www      1225: # set parameters and change order
1.247     www      1226:             &snapshotbefore();
                   1227: 	    if ($env{'form.changeparms'}) {
1.174     albertel 1228: 		my $idx=$env{'form.setparms'};
1.123     www      1229: # set parameters
1.258     www      1230: 		if ($env{'form.changeparms'} eq 'randompick') {
                   1231: 		    if ($env{'form.randpick_'.$idx}) {
                   1232: 			&LONCAPA::map::storeparameter($idx,'parameter_randompick',$env{'form.randpick_'.$idx},'int_pos');
                   1233: 			&remember_parms($idx,'randompick','set',$env{'form.randpick_'.$idx});
                   1234: 		    } else {
                   1235: 			&LONCAPA::map::delparameter($idx,'parameter_randompick');
                   1236: 			&remember_parms($idx,'randompick','del');
                   1237: 		    }
                   1238: 		}
                   1239: 		if ($env{'form.changeparms'} eq 'hiddenresource') {
                   1240: 		    if ($env{'form.hidprs_'.$idx}) {
                   1241: 			&LONCAPA::map::storeparameter($idx,'parameter_hiddenresource','yes','string_yesno');
                   1242: 			&remember_parms($idx,'hiddenresource','set',$env{'form.hidprs_'.$idx});
                   1243: 		    } else {
                   1244: 			&LONCAPA::map::delparameter($idx,'parameter_hiddenresource');
                   1245: 			&remember_parms($idx,'hiddenresource','del');
                   1246: 		    }
                   1247: 		}
                   1248: 		if ($env{'form.changeparms'} eq 'encrypturl') {
                   1249: 		    if ($env{'form.encprs_'.$idx}) {
                   1250: 			&LONCAPA::map::storeparameter($idx,'parameter_encrypturl','yes','string_yesno');
                   1251: 			&remember_parms($idx,'encrypturl','set',$env{'form.encprs_'.$idx});
                   1252: 		    } else {
                   1253: 			&LONCAPA::map::delparameter($idx,'parameter_encrypturl');
                   1254: 			&remember_parms($idx,'encrypturl','del');
                   1255: 		    }
1.121     www      1256: 		}
1.278.2.1  albertel 1257: 		if ($env{'form.changeparms'} eq 'randomorder') {
                   1258: 		    if ($env{'form.randorder_'.$idx}) {
                   1259: 			&LONCAPA::map::storeparameter($idx,'parameter_randomorder','yes','string_yesno');
                   1260: 			&remember_parms($idx,'randomorder','set',$env{'form.randorder_'.$idx});
                   1261: 		    } else {
                   1262: 			&LONCAPA::map::delparameter($idx,'parameter_randomorder');
                   1263: 			&remember_parms($idx,'randomorder','del');
                   1264: 		    }
                   1265: 		}
1.250     www      1266: # store the changed version
                   1267: 		($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container);
                   1268: 		if ($fatal) {
                   1269: 		    $r->print('<p><font color="red">'.$errtext.'</font></p>');
                   1270: 		    return;
                   1271: 		}
1.247     www      1272: 	    }
1.121     www      1273: 
1.247     www      1274: 	    if ($env{'form.newpos'}) {
1.123     www      1275: # change order
1.247     www      1276: 		my $newpos=$env{'form.newpos'}-1;
                   1277: 		my $currentpos=$env{'form.currentpos'}-1;
                   1278: 		my $i;
                   1279: 		my @neworder=();
                   1280: 		if ($newpos>$currentpos) {
1.125     www      1281: # moving stuff up
1.247     www      1282: 		    for ($i=0;$i<$currentpos;$i++) {
                   1283: 			$neworder[$i]=$LONCAPA::map::order[$i];
                   1284: 		    }
                   1285: 		    for ($i=$currentpos;$i<$newpos;$i++) {
                   1286: 			$neworder[$i]=$LONCAPA::map::order[$i+1];
                   1287: 		    }
                   1288: 		    $neworder[$newpos]=$LONCAPA::map::order[$currentpos];
                   1289: 		    for ($i=$newpos+1;$i<=$#LONCAPA::map::order;$i++) {
                   1290: 			$neworder[$i]=$LONCAPA::map::order[$i];
                   1291: 		    }
                   1292: 		} else {
1.125     www      1293: # moving stuff down
1.247     www      1294: 		    for ($i=0;$i<$newpos;$i++) {
                   1295: 			$neworder[$i]=$LONCAPA::map::order[$i];
                   1296: 		    }
                   1297: 		    $neworder[$newpos]=$LONCAPA::map::order[$currentpos];
                   1298: 		    for ($i=$newpos+1;$i<$currentpos+1;$i++) {
                   1299: 			$neworder[$i]=$LONCAPA::map::order[$i-1];
                   1300: 		    }
                   1301: 		    for ($i=$currentpos+1;$i<=$#LONCAPA::map::order;$i++) {
                   1302: 			$neworder[$i]=$LONCAPA::map::order[$i];
1.125     www      1303: 		    }
1.124     www      1304: 		}
1.247     www      1305: 		@LONCAPA::map::order=@neworder;
1.124     www      1306: # store the changed version
1.142     raeburn  1307: 		($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container);
1.124     www      1308: 		if ($fatal) {
                   1309: 		    $r->print('<p><font color="red">'.$errtext.'</font></p>');
                   1310: 		    return;
1.123     www      1311: 		}
1.247     www      1312: 	    }
1.124     www      1313: 		
1.174     albertel 1314: 	    if ($env{'form.pastemarked'}) {
1.168     www      1315: # paste resource to end of list
1.174     albertel 1316:                 my $url=$env{'form.markedcopy_url'};
                   1317: 		my $title=$env{'form.markedcopy_title'};
1.168     www      1318: # Maps need to be copied first
                   1319: 		if (($url=~/\.(page|sequence)$/) || ($url=~/^\/uploaded\//)) {
                   1320: 		    $title=&mt('Copy of').' '.$title;
                   1321:                     my $newid=$$.time;
                   1322: 		    $url=~/^(.+)\.(\w+)$/;
                   1323: 		    my $newurl=$1.$newid.'.'.$2;
                   1324: 		    my $storefn=$newurl;
1.264     albertel 1325:                     $storefn=~s{^/\w+/$match_domain/$match_username/}{};
1.244     albertel 1326: 		    &Apache::lonclonecourse::writefile
1.174     albertel 1327: 			($env{'request.course.id'},$storefn,
1.168     www      1328: 			 &Apache::lonnet::getfile($url));
                   1329: 		    $url=$newurl;
                   1330: 		}
1.270     albertel 1331: 		$title = &LONCAPA::map::qtunescape($title);
1.168     www      1332: 		my $ext='false';
                   1333: 		if ($url=~/^http\:\/\//) { $ext='true'; }
1.270     albertel 1334: 		$url   = &LONCAPA::map::qtunescape($url);
1.168     www      1335: # Now insert the URL at the bottom
1.245     albertel 1336:                 my $newidx=&LONCAPA::map::getresidx($url);
                   1337: 		$LONCAPA::map::resources[$newidx]=
1.168     www      1338: 		    $title.':'.$url.':'.$ext.':normal:res';
1.245     albertel 1339: 		$LONCAPA::map::order[1+$#LONCAPA::map::order]=$newidx;
1.168     www      1340: # Store the result
                   1341: 		($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container);
                   1342: 		if ($fatal) {
                   1343: 		    $r->print('<p><font color="red">'.$errtext.'</font></p>');
                   1344: 		    return;
                   1345: 		}
1.123     www      1346: 
1.168     www      1347: 	    }
1.188     raeburn  1348:             $r->print($upload_output);
1.174     albertel 1349: 	    if ($env{'form.cmd'}) {
                   1350:                 my ($cmd,$idx)=split(/\_/,$env{'form.cmd'});
1.10      www      1351:                 if ($cmd eq 'del') {
1.245     albertel 1352: 		    my (undef,$url)=split(':',$LONCAPA::map::resources[$LONCAPA::map::order[$idx]]);
1.187     www      1353: 		    if (($url=~m|/+uploaded/\Q$coursedom\E/\Q$coursenum\E/|) &&
1.206     albertel 1354: 			($url!~/\.(page|sequence|problem|exam|quiz|assess|survey|form|library|task)$/)) {
1.187     www      1355: 			&Apache::lonnet::removeuploadedurl($url);
                   1356: 		    } else {
1.245     albertel 1357: 			&LONCAPA::map::makezombie($LONCAPA::map::order[$idx]);
1.128     albertel 1358: 		    }
1.245     albertel 1359: 		    for (my $i=$idx;$i<$#LONCAPA::map::order;$i++) {
                   1360:                         $LONCAPA::map::order[$i] = $LONCAPA::map::order[$i+1];
1.10      www      1361:                     }
1.245     albertel 1362:                     $#LONCAPA::map::order--;
1.171     www      1363:                 } elsif ($cmd eq 'cut') {
1.245     albertel 1364: 		    my (undef,$url)=split(':',$LONCAPA::map::resources[$LONCAPA::map::order[$idx]]);
                   1365: 		    &LONCAPA::map::makezombie($LONCAPA::map::order[$idx]);
                   1366: 		    for (my $i=$idx;$i<$#LONCAPA::map::order;$i++) {
                   1367:                         $LONCAPA::map::order[$i] = $LONCAPA::map::order[$i+1];
1.171     www      1368:                     }
1.245     albertel 1369:                     $#LONCAPA::map::order--;
1.10      www      1370:                 } elsif ($cmd eq 'up') {
1.245     albertel 1371: 		  if (($idx) && (defined($LONCAPA::map::order[$idx-1]))) {
                   1372:                     my $i=$LONCAPA::map::order[$idx-1];
                   1373:                     $LONCAPA::map::order[$idx-1] = $LONCAPA::map::order[$idx];
                   1374:                     $LONCAPA::map::order[$idx] = $i;
1.38      www      1375: 		   }
1.10      www      1376:                 } elsif ($cmd eq 'down') {
1.245     albertel 1377: 		   if (defined($LONCAPA::map::order[$idx+1])) {
                   1378:                     my $i=$LONCAPA::map::order[$idx+1];
                   1379:                     $LONCAPA::map::order[$idx+1] = $LONCAPA::map::order[$idx];
                   1380:                     $LONCAPA::map::order[$idx] = $i;
1.38      www      1381: 		   }
1.36      www      1382:                 } elsif ($cmd eq 'rename') {
1.245     albertel 1383:                     my $ratstr = $LONCAPA::map::resources[$LONCAPA::map::order[$idx]];
1.36      www      1384:                     my ($rtitle,@rrest)=split(/\:/,
1.245     albertel 1385:                        $LONCAPA::map::resources[$LONCAPA::map::order[$idx]]);
1.270     albertel 1386:                     my $comment=$env{'form.title'};
                   1387:                     $comment = &LONCAPA::map::qtunescape($comment);
1.144     albertel 1388: 		    if ($comment=~/\S/) {
1.245     albertel 1389: 			$LONCAPA::map::resources[$LONCAPA::map::order[$idx]]=
                   1390: 			    $comment.':'.join(':',@rrest);
1.144     albertel 1391: 		    }
1.238     www      1392: # Devalidate title cache
1.270     albertel 1393:                     my $renamed_url=&LONCAPA::map::qtescape($rrest[0]);
1.240     www      1394: 		    &Apache::lonnet::devalidate_title_cache($renamed_url);
1.10      www      1395:                 }
                   1396: # Store the changed version
1.104     albertel 1397: 		($errtext,$fatal)=&storemap($coursenum,$coursedom,
1.142     raeburn  1398: 					    $folder.'.'.$container);
1.104     albertel 1399: 		if ($fatal) {
                   1400: 		    $r->print('<p><font color="red">'.$errtext.'</font></p>');
                   1401: 		    return;
                   1402: 		}
1.8       www      1403:             }
1.11      www      1404: # Group import/search
1.174     albertel 1405: 	    if ($env{'form.importdetail'}) {
1.73      bowersj2 1406: 		my @imports;
1.243     www      1407: #		&Apache::lonnet::logthis("imp detail ".$env{'form.importdetail'});
1.174     albertel 1408: 		foreach (split(/\&/,$env{'form.importdetail'})) {
1.73      bowersj2 1409: 		    if (defined($_)) {
                   1410: 			my ($name,$url)=split(/\=/,$_);
1.228     www      1411: 			$name=&unescape($name);
                   1412: 			$url=&unescape($url);
1.73      bowersj2 1413: 			push @imports, $name, $url;
                   1414: 		    }
                   1415: 		}
1.11      www      1416: # Store the changed version
1.249     www      1417: 		($errtext,$fatal)=&group_import($coursenum, $coursedom, $folder,
1.142     raeburn  1418: 					       $container,'londocs',@imports);
1.104     albertel 1419: 		if ($fatal) {
                   1420: 		    $r->print('<p><font color="red">'.$errtext.'</font></p>');
                   1421: 		    return;
                   1422: 		}
1.11      www      1423:             }
1.53      www      1424: # Loading a complete map
1.223     www      1425: 	   if ($env{'form.loadmap'}) {
                   1426:                if ($env{'form.importmap'}=~/\w/) {
                   1427: 	          foreach (&Apache::lonsequence::attemptread(&Apache::lonnet::filelocation('',$env{'form.importmap'}))) {
                   1428: 		      my ($title,$url,$ext,$type)=split(/\:/,$_);
1.245     albertel 1429:                       my $idx=&LONCAPA::map::getresidx($url);
                   1430:                       $LONCAPA::map::resources[$idx]=$_;
                   1431:                       $LONCAPA::map::order[$#LONCAPA::map::order+1]=$idx;
1.223     www      1432: 	          }
1.53      www      1433: # Store the changed version
1.223     www      1434:   	          ($errtext,$fatal)=&storemap($coursenum,$coursedom,
1.142     raeburn  1435: 					   $folder.'.'.$container);
1.223     www      1436: 	          if ($fatal) {
                   1437: 		      $r->print('<p><font color="red">'.$errtext.'</font></p>');
                   1438: 		      return;
                   1439: 	          }
                   1440:                } else {
                   1441:                    $r->print('<p><font color="red">'.&mt('No map selected.').'</font></p>');
                   1442:                }
1.53      www      1443:            }
1.251     www      1444:            &log_differences($plain);
1.16      www      1445:        }
                   1446: # ---------------------------------------------------------------- End commands
1.7       www      1447: # ---------------------------------------------------------------- Print screen
1.10      www      1448:         my $idx=0;
1.148     www      1449: 	my $shown=0;
1.278.2.1  albertel 1450:         if (($ishidden) || ($isencrypted) || ($randompick>=0) 
                   1451: 	    || ($is_random_order)) {
1.242     www      1452:            $r->print('<p>'.&mt('Parameters').':<ul>'.
                   1453:                      ($randompick>=0?'<li>'.&mt('randomly pick [_1] resources',$randompick).'</li>':'').
1.278.2.1  albertel 1454:                      ($is_random_order?'<li>'.&mt('contents randomly ordered').'</li>':'').
1.242     www      1455:                      ($ishidden?'<li>'.&mt('contents hidden').'</li>':'').
                   1456:                      ($isencrypted?'<li>'.&mt('URLs hidden').'</li>':'').
                   1457:                      '</ul></p>');
1.278.2.1  albertel 1458:         }
1.242     www      1459:         if ($randompick>=0) {
                   1460:            $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>');
                   1461:         }
1.278.2.1  albertel 1462:         if ($is_random_order) {
                   1463:            $r->print('<p>'.&mt('Caution: this folder is set to randomly order its contents. Adding or removing resources from this folder will change the order of resources shown. Do not modify the contents of this folder if it is in active student use.').'</p>');
                   1464:         }
1.10      www      1465:         $r->print('<table>');
1.278     albertel 1466:         foreach my $res (@LONCAPA::map::order) {
                   1467:            my ($name,$url)=split(/\:/,$LONCAPA::map::resources[$res]);
1.246     raeburn  1468: 	   $name=&LONCAPA::map::qtescape($name);
1.271     albertel 1469: 	   $url=&LONCAPA::map::qtescape($url);
1.10      www      1470:            unless ($name) {  $name=(split(/\//,$url))[-1]; }
1.148     www      1471:            unless ($name) { $idx++; next; }
1.278     albertel 1472:            $r->print(&entryline($idx,$name,$url,$folder,$allowed,$res,
                   1473: 				$coursenum));
1.10      www      1474:            $idx++;
1.148     www      1475: 	   $shown++;
1.10      www      1476:         }
1.148     www      1477: 	unless ($shown) {
1.131     www      1478: 	    $r->print('<tr><td>'.&mt('Currently no documents.').'</td></tr>');
                   1479: 	}
1.168     www      1480:         $r->print("\n</table>\n");
1.174     albertel 1481: 	if ($env{'form.markedcopy_url'}) {
1.168     www      1482: 	    $r->print(<<ENDPASTE);
                   1483: <p><form name="pasteform" action="/adm/coursedocs" method="post">
1.174     albertel 1484: <input type="hidden" name="markedcopy_url" value="$env{'form.markedcopy_url'}" />
                   1485: <input type="hidden" name="markedcopy_title" value="$env{'form.markedcopy_title'}" />
1.168     www      1486: ENDPASTE
1.278     albertel 1487:             $r->print('<input type="submit" name="pastemarked" value="'.&mt('Paste').'" /> ');
                   1488: 
                   1489: 	    my $type;
                   1490: 	    if ($env{'form.markedcopy_url'} =~ m{^/adm/wrapper/ext}) {
                   1491: 		$type = &mt('External Resource');
                   1492: 		$r->print($type.': '. $env{'form.markedcopy_title'});
                   1493: 	    }  else {
                   1494: 		my $extension = (split(/\./,$env{'form.markedcopy_url'}))[-1];
                   1495: 		my $type = &Apache::loncommon::filedescription($extension);
                   1496: 		my $icon = '<img src="'.&Apache::loncommon::icon($extension).
                   1497: 		    '" class="LC_icon" />';
                   1498: 		$r->print($icon.$type.': '. $env{'form.markedcopy_title'});
                   1499: 	    }
1.168     www      1500:             if ($container eq 'page') {
                   1501: 		$r->print(<<PAGEINFO);
1.174     albertel 1502: <input type="hidden" name="pagepath" value="$env{'form.pagepath'}" />
                   1503: <input type="hidden" name="pagesymb" value="$env{'form.pagesymb'}" />
1.168     www      1504: PAGEINFO
                   1505:             } else {
                   1506: 		$r->print(<<FOLDERINFO);
1.174     albertel 1507: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
1.168     www      1508: FOLDERINFO
                   1509: 	    }
                   1510: 	    $r->print('</form></p>');
                   1511: 	}
1.7       www      1512:     }
                   1513: }
1.1       www      1514: 
1.188     raeburn  1515: sub process_file_upload {
1.194     raeburn  1516:     my ($upload_output,$coursenum,$coursedom,$allfiles,$codebase,$uploadcmd) = @_;
1.188     raeburn  1517: # upload a file, if present
                   1518:     my $parseaction;
1.190     albertel 1519:    if ($env{'form.parserflag'}) {
1.188     raeburn  1520:         $parseaction = 'parse';
                   1521:     }
                   1522:     my $phase_status;
                   1523:     my $folder=$env{'form.folder'};
1.194     raeburn  1524:     if ($folder eq '') {
1.188     raeburn  1525:         $folder='default';
                   1526:     }
1.194     raeburn  1527:     if ( ($folder=~/^$uploadcmd/) || ($uploadcmd eq 'default') ) {
1.188     raeburn  1528:         my $errtext='';
                   1529:         my $fatal=0;
                   1530:         my $container='sequence';
                   1531:         if ($env{'form.pagepath'}) {
                   1532:             $container='page';
                   1533:         }
                   1534:         ($errtext,$fatal)=
                   1535:               &mapread($coursenum,$coursedom,$folder.'.'.$container);
1.245     albertel 1536:         if ($#LONCAPA::map::order<1) {
                   1537:             $LONCAPA::map::order[0]=1;
                   1538:             $LONCAPA::map::resources[1]='';
1.188     raeburn  1539:         }
                   1540:         if ($fatal) {
                   1541:             return 'failed';
                   1542:         }
                   1543:         my $destination = 'docs/';
1.194     raeburn  1544:         if ($folder =~ /^supplemental/) {
                   1545:             $destination = 'supplemental/';
                   1546:         }
                   1547:         if (($folder eq 'default') || ($folder eq 'supplemental')) {
1.188     raeburn  1548:             $destination .= 'default/';
1.194     raeburn  1549:         } elsif ($folder =~ /^(default|supplemental)_(\d+)$/) {
                   1550:             $destination .=  $2.'/';
1.188     raeburn  1551:         }
                   1552: # this is for a course, not a user, so set coursedoc flag
                   1553: # probably the only place in the system where this should be "1"
1.245     albertel 1554:         my $newidx=&LONCAPA::map::getresidx();
1.188     raeburn  1555:         $destination .= $newidx;
1.190     albertel 1556:         my $url=&Apache::lonnet::userfileupload('uploaddoc',1,$destination,
                   1557: 						$parseaction,$allfiles,
                   1558: 						$codebase);
1.188     raeburn  1559:         my $ext='false';
                   1560:         if ($url=~/^http\:\/\//) { $ext='true'; }
1.270     albertel 1561: 	$url     = &LONCAPA::map::qtunescape($url);
1.188     raeburn  1562:         my $comment=$env{'form.comment'};
1.270     albertel 1563: 	$comment = &LONCAPA::map::qtunescape($comment);
1.188     raeburn  1564:         if ($folder=~/^supplemental/) {
                   1565:               $comment=time.'___&&&___'.$env{'user.name'}.'___&&&___'.
                   1566:                   $env{'user.domain'}.'___&&&___'.$comment;
                   1567:         }
                   1568: 
1.245     albertel 1569:         $LONCAPA::map::resources[$newidx]=
                   1570: 	    $comment.':'.$url.':'.$ext.':normal:res';
                   1571:         $LONCAPA::map::order[$#LONCAPA::map::order+1]= $newidx;
1.190     albertel 1572:         ($errtext,$fatal)=&storemap($coursenum,$coursedom,
                   1573: 				    $folder.'.'.$container);
1.188     raeburn  1574:         if ($fatal) {
                   1575:             $$upload_output .= '<p><font color="red">'.$errtext.'</font></p>';
                   1576:             return 'failed';
                   1577:         } else {
                   1578:             if ($parseaction eq 'parse') {
1.190     albertel 1579:                 my $total_embedded = keys(%{$allfiles});
1.188     raeburn  1580:                 if ($total_embedded > 0) {
                   1581:                     my $num = 0;
1.269     albertel 1582: 		    my $state = '
                   1583:    <input type="hidden" name="folderpath" value="'.$env{'form.folderpath'}.'" />
                   1584:    <input type="hidden" name="cmd" value="upload_embedded" />
1.188     raeburn  1585:    <input type="hidden" name="newidx" value="'.$newidx.'" />
1.228     www      1586:    <input type="hidden" name="primaryurl" value="'.&escape($url).'" />
1.188     raeburn  1587:    <input type="hidden" name="phasetwo" value="'.$total_embedded.'" />';
1.269     albertel 1588: 		    $phase_status = 'phasetwo';
                   1589: 
                   1590:                     $$upload_output .= 
                   1591: 			'This file contains embedded multimedia objects, which need to be uploaded to LON-CAPA.<br />'.
                   1592: 			&ask_for_embedded_content('/adm/coursedocs',
                   1593: 						  $state,$allfiles,$codebase);
1.188     raeburn  1594:                 } else {
                   1595:                     $$upload_output .= 'No embedded items identified<br />';
                   1596:                 }
                   1597:             }
                   1598:         }
                   1599:     }
                   1600:     return $phase_status;
                   1601: }
                   1602: 
1.269     albertel 1603: sub ask_for_embedded_content {
1.271     albertel 1604:     my ($actionurl,$state,$allfiles,$codebase,$args)=@_;
1.269     albertel 1605:     my $upload_output = '
                   1606:    <form name="upload_embedded" action="'.$actionurl.'"
                   1607:                   method="post" enctype="multipart/form-data">';
                   1608:     $upload_output .= $state;
1.271     albertel 1609:     $upload_output .= '<b>Upload embedded files</b>:<br />'.
                   1610: 	&Apache::loncommon::start_data_table();
1.269     albertel 1611: 
                   1612:     my $num = 0;
1.276     albertel 1613:     foreach my $embed_file (sort {lc($a) cmp lc($b)} keys(%{$allfiles})) {
1.271     albertel 1614: 	$upload_output .= &Apache::loncommon::start_data_table_row().
                   1615: 	    '<td>'.$embed_file.'</td><td>';
1.274     albertel 1616: 	if ($args->{'ignore_remote_references'}
                   1617: 	    && $embed_file =~ m{^\w+://}) {
                   1618: 	    $upload_output.='<span class="LC_warning">'.&mt("URL points to other server.").'</span>';
                   1619: 	} elsif ($args->{'error_on_invalid_names'}
1.271     albertel 1620: 	    && $embed_file ne &Apache::lonnet::clean_filename($embed_file,{'keep_path' => 1,})) {
                   1621: 	    
                   1622: 	    $upload_output.='<span class="LC_warning">'.&mt("Invalid characters").'</span>';
1.274     albertel 1623: 	    
1.271     albertel 1624: 	} else {
1.274     albertel 1625: 
1.271     albertel 1626: 	    $upload_output .='
1.269     albertel 1627:            <input name="embedded_item_'.$num.'" type="file" value="bob" />
                   1628:            <input name="embedded_orig_'.$num.'" type="hidden" value="'.&escape($embed_file).'" />';
1.271     albertel 1629: 	    my $attrib = join(':',@{$$allfiles{$embed_file}});
                   1630: 	    $upload_output .=
1.269     albertel 1631: 		"\n\t\t".
1.271     albertel 1632: 		'<input name="embedded_attrib_'.$num.'" type="hidden" value="'.
                   1633: 		$attrib.'" />';
                   1634: 	    if (exists($$codebase{$embed_file})) {
                   1635: 		$upload_output .= 
                   1636: 		    "\n\t\t".
                   1637: 		    '<input name="codebase_'.$num.'" type="hidden" value="'.
                   1638: 		    &escape($$codebase{$embed_file}).'" />';
                   1639: 	    }
1.269     albertel 1640: 	}
1.271     albertel 1641: 	$upload_output .= '</td>'.&Apache::loncommon::end_data_table_row();
1.269     albertel 1642: 	$num++;
                   1643:     }
1.271     albertel 1644:     $upload_output .= &Apache::loncommon::end_data_table().'<br />
1.269     albertel 1645:    <input type ="hidden" name="number_embedded_items" value="'.$num.'" />
1.275     albertel 1646:    <input type ="submit" value="'.&mt('Upload Listed Files').'" />
                   1647:    '.&mt('(only files for which a location has been provided will be uploaded)').'
1.269     albertel 1648:    </form>';
                   1649:     return $upload_output;
                   1650: }
                   1651: 
1.188     raeburn  1652: sub process_secondary_uploads {
                   1653:     my ($upload_output,$coursedom,$coursenum,$formname,$num,$newidx) = @_;
                   1654:     my $folder=$env{'form.folder'};
                   1655:     my $destination = 'docs/';
1.195     raeburn  1656:     if ($folder =~ /^supplemental/) {
                   1657:         $destination = 'supplemental/';
                   1658:     }
                   1659:     if (($folder eq 'default') || ($folder eq 'supplemental')) {
1.188     raeburn  1660:         $destination .= 'default/';
1.195     raeburn  1661:     } elsif ($folder =~ /^(default|supplemental)_(\d+)$/) {
1.217     raeburn  1662:         $destination .=  $2.'/';
1.188     raeburn  1663:     }
                   1664:     $destination .= $newidx;
                   1665:     my ($url,$filename);
                   1666:     $url=&Apache::lonnet::userfileupload($formname.$num,1,$destination);
1.265     albertel 1667:     ($filename) = ($url =~ m{^/uploaded/\Q$coursedom\E/\Q$coursenum\E/\Q$destination\E/(.+)$});
1.188     raeburn  1668:     return $filename;
                   1669: }
                   1670: 
1.8       www      1671: # --------------------------------------------------------------- An entry line
                   1672: 
                   1673: sub entryline {
1.112     raeburn  1674:     my ($index,$title,$url,$folder,$allowed,$residx,$coursenum)=@_;
1.270     albertel 1675:     $title=&HTML::Entities::encode($title,'"<>&\'');
1.38      www      1676:     my $renametitle=$title;
                   1677:     my $foldertitle=$title;
1.142     raeburn  1678:     my $pagetitle=$title;
1.245     albertel 1679:     my $orderidx=$LONCAPA::map::order[$index];
1.264     albertel 1680:     if ($title=~ /^(\d+)___&amp;&amp;&amp;___($match_username)___&amp;&amp;&amp;___($match_domain)___&amp;&amp;&amp;___(.*)$/	) { 
1.109     albertel 1681: 	$foldertitle=&Apache::lontexconvert::msgtexconverted($4);
                   1682: 	$renametitle=$4;
                   1683: 	$title='<i>'.&Apache::lonlocal::locallocaltime($1).'</i> '.
                   1684: 	    &Apache::loncommon::plainname($2,$3).': <br />'.
                   1685: 	    $foldertitle;
                   1686:     }
1.222     albertel 1687:     $renametitle=~s/\\/\\\\/g;
1.38      www      1688:     $renametitle=~s/\&quot\;/\\\"/g;
1.8       www      1689:     my $line='<tr>';
                   1690: # Edit commands
1.142     raeburn  1691:     my $container;
1.120     www      1692:     my $folderpath;
1.174     albertel 1693:     if ($env{'form.folderpath'}) {
1.142     raeburn  1694:         $container = 'sequence';
1.228     www      1695: 	$folderpath=&escape($env{'form.folderpath'});
1.174     albertel 1696: 	# $htmlfoldername=&HTML::Entities::encode($env{'form.foldername'},'<>&"');
1.120     www      1697:     }
1.156     albertel 1698:     my ($pagepath,$pagesymb);
1.174     albertel 1699:     if ($env{'form.pagepath'}) {
1.142     raeburn  1700:         $container = 'page';
1.228     www      1701:         $pagepath=&escape($env{'form.pagepath'});
                   1702:         $pagesymb=&escape($env{'form.pagesymb'});
1.142     raeburn  1703:     }
1.168     www      1704:     my $cpinfo='';
1.174     albertel 1705:     if ($env{'form.markedcopy_url'}) {
1.168     www      1706:        $cpinfo='&markedcopy_url='.
1.228     www      1707:                &escape($env{'form.markedcopy_url'}).
1.168     www      1708:                '&markedcopy_title='.
1.228     www      1709:                &escape($env{'form.markedcopy_title'});
1.168     www      1710:     }
1.109     albertel 1711:     if ($allowed) {
1.123     www      1712: 	my $incindex=$index+1;
                   1713: 	my $selectbox='';
1.168     www      1714: 	if (($folder!~/^supplemental/) &&
1.245     albertel 1715: 	    ($#LONCAPA::map::order>0) && 
1.168     www      1716: 	    ((split(/\:/,
1.245     albertel 1717: 	     $LONCAPA::map::resources[$LONCAPA::map::order[0]]))[1] 
1.168     www      1718: 	     ne '') && 
                   1719: 	    ((split(/\:/,
1.245     albertel 1720: 	     $LONCAPA::map::resources[$LONCAPA::map::order[1]]))[1] 
1.168     www      1721: 	     ne '')) {
1.123     www      1722: 	    $selectbox=
1.124     www      1723: 		'<input type="hidden" name="currentpos" value="'.$incindex.'" />'.
1.123     www      1724: 		'<select name="newpos" onChange="this.form.submit()">';
1.245     albertel 1725: 	    for (my $i=1;$i<=$#LONCAPA::map::order+1;$i++) {
1.123     www      1726: 		if ($i==$incindex) {
                   1727: 		    $selectbox.='<option value="" selected="1">('.$i.')</option>';
                   1728: 		} else {
                   1729: 		    $selectbox.='<option value="'.$i.'">'.$i.'</option>';
                   1730: 		}
                   1731: 	    }
                   1732: 	    $selectbox.='</select>';
                   1733: 	}
1.119     www      1734: 	my %lt=&Apache::lonlocal::texthash(
                   1735:                 'up' => 'Move Up',
1.109     albertel 1736: 		'dw' => 'Move Down',
                   1737: 		'rm' => 'Remove',
1.171     www      1738:                 'ct' => 'Cut',
1.168     www      1739: 		'rn' => 'Rename',
                   1740: 		'cp' => 'Copy');
1.211     www      1741: 	my $nocopy=0;
1.268     www      1742:         my $nocut=0;
1.211     www      1743:         if ($url=~/\.(page|sequence)$/) {
                   1744: 	    foreach (&Apache::lonsequence::attemptread(&Apache::lonnet::filelocation('',$url))) {
                   1745: 		my ($title,$url,$ext,$type)=split(/\:/,$_);
                   1746: 		if (($url=~/\.(page|sequence)/) && ($type ne 'zombie')) {
                   1747: 		    $nocopy=1;
                   1748: 		    last;
                   1749: 		}
                   1750: 	    }
                   1751: 	}
1.268     www      1752:         if ($url=~/^\/res\/lib\/templates\//) { 
                   1753:            $nocopy=1; 
                   1754:            $nocut=1;
                   1755:         }
1.211     www      1756:         my $copylink='&nbsp;';
1.267     www      1757:         my $cutlink='&nbsp;';
1.174     albertel 1758:         if ($env{'form.pagepath'}) {
1.268     www      1759:            if (!$nocopy) {
1.211     www      1760:                $copylink=(<<ENDCOPY);
                   1761: <a href='javascript:markcopy("$pagepath","$index","$renametitle","page","$pagesymb");'>
                   1762: <font size="-2" color="#000099">$lt{'cp'}</font></a></td>
                   1763: ENDCOPY
1.268     www      1764:            }
                   1765:            if (!$nocut) {
1.267     www      1766:                $cutlink=(<<ENDCUT);
                   1767: <a href='javascript:cutres("$pagepath","$index","$renametitle","page","$pagesymb");'>
                   1768: <font size="-2" color="#550044">$lt{'ct'}</font></a>
                   1769: ENDCUT
1.211     www      1770:             }
1.142     raeburn  1771:             $line.=(<<END);
                   1772: <form name="entry_$index" action="/adm/coursedocs" method="post">
1.174     albertel 1773: <input type="hidden" name="pagepath" value="$env{'form.pagepath'}" />
                   1774: <input type="hidden" name="pagesymb" value="$env{'form.pagesymb'}" />
                   1775: <input type="hidden" name="markedcopy_url" value="$env{'form.markedcopy_url'}" />
                   1776: <input type="hidden" name="markedcopy_title" value="$env{'form.markedcopy_title'}" />
1.142     raeburn  1777: <input type="hidden" name="setparms" value="$orderidx" />
1.247     www      1778: <input type="hidden" name="changeparms" value="0" />
1.142     raeburn  1779: <td><table border='0' cellspacing='2' cellpadding='0'>
                   1780: <tr><td bgcolor="#DDDDDD">
1.168     www      1781: <a href='/adm/coursedocs?cmd=up_$index&pagepath=$pagepath&pagesymb=$pagesymb$cpinfo'>
1.142     raeburn  1782: <img src="${iconpath}move_up.gif" alt='$lt{'up'}' border='0' /></a></td></tr>
                   1783: <tr><td bgcolor="#DDDDDD">
1.168     www      1784: <a href='/adm/coursedocs?cmd=down_$index&pagepath=$pagepath&pagesymb=$pagesymb$cpinfo'>
1.142     raeburn  1785: <img src="${iconpath}move_down.gif" alt='$lt{'dw'}' border='0' /></a></td></tr>
                   1786: </table></td>
                   1787: <td>$selectbox
                   1788: </td><td bgcolor="#DDDDDD">
1.156     albertel 1789: <a href='javascript:removeres("$pagepath","$index","$renametitle","page","$pagesymb");'>
1.142     raeburn  1790: <font size="-2" color="#990000">$lt{'rm'}</font></a>
1.267     www      1791: $cutlink
1.213     albertel 1792: <a href='javascript:changename("$pagepath","$index","$renametitle","page","$pagesymb");'>
1.168     www      1793: <font size="-2" color="#009900">$lt{'rn'}</font></a>
1.211     www      1794: $copylink
1.142     raeburn  1795: END
                   1796:         } else {
1.268     www      1797:            if (!$nocopy) {
1.211     www      1798:                $copylink=(<<ENDCOPY);
                   1799: <a href='javascript:markcopy("$folderpath","$index","$renametitle","sequence");'>
                   1800: <font size="-2" color="#000099">$lt{'cp'}</font></a></td>
                   1801: ENDCOPY
1.268     www      1802:             }
                   1803:             if (!$nocut) {
1.267     www      1804:                $cutlink=(<<ENDCUT);
                   1805: <a href='javascript:cutres("$folderpath","$index","$renametitle","sequence");'>
                   1806: <font size="-2" color="#550044">$lt{'ct'}</font></a>
                   1807: ENDCUT
1.211     www      1808:             }
1.142     raeburn  1809:             $line.=(<<END); 
1.121     www      1810: <form name="entry_$index" action="/adm/coursedocs" method="post">
1.174     albertel 1811: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
                   1812: <input type="hidden" name="markedcopy_url" value="$env{'form.markedcopy_url'}" />
                   1813: <input type="hidden" name="markedcopy_title" value="$env{'form.markedcopy_title'}" />
1.122     www      1814: <input type="hidden" name="setparms" value="$orderidx" />
1.247     www      1815: <input type="hidden" name="changeparms" value="0" />
1.54      www      1816: <td><table border='0' cellspacing='2' cellpadding='0'>
                   1817: <tr><td bgcolor="#DDDDDD">
1.168     www      1818: <a href='/adm/coursedocs?cmd=up_$index&folderpath=$folderpath$cpinfo'>
1.90      www      1819: <img src="${iconpath}move_up.gif" alt='$lt{'up'}' border='0' /></a></td></tr>
1.54      www      1820: <tr><td bgcolor="#DDDDDD">
1.168     www      1821: <a href='/adm/coursedocs?cmd=down_$index&folderpath=$folderpath$cpinfo'>
1.90      www      1822: <img src="${iconpath}move_down.gif" alt='$lt{'dw'}' border='0' /></a></td></tr>
1.123     www      1823: </table></td>
                   1824: <td>$selectbox
                   1825: </td><td bgcolor="#DDDDDD">
1.142     raeburn  1826: <a href='javascript:removeres("$folderpath","$index","$renametitle","sequence");'>
1.90      www      1827: <font size="-2" color="#990000">$lt{'rm'}</font></a>
1.267     www      1828: $cutlink
1.142     raeburn  1829: <a href='javascript:changename("$folderpath","$index","$renametitle","sequence");'>
1.168     www      1830: <font size="-2" color="#009900">$lt{'rn'}</font></a>
1.211     www      1831: $copylink
1.8       www      1832: END
1.142     raeburn  1833:         }
1.8       www      1834:     }
1.16      www      1835: # Figure out what kind of a resource this is
                   1836:     my ($extension)=($url=~/\.(\w+)$/);
                   1837:     my $uploaded=($url=~/^\/*uploaded\//);
1.97      albertel 1838:     my $icon=&Apache::loncommon::icon($url);
1.17      www      1839:     my $isfolder=0;
1.142     raeburn  1840:     my $ispage=0;
1.114     albertel 1841:     my $folderarg;
1.142     raeburn  1842:     my $pagearg;
                   1843:     my $pagefile;
1.16      www      1844:     if ($uploaded) {
1.135     albertel 1845: 	if ($extension eq 'sequence') {
                   1846: 	    $icon=$iconpath.'/folder_closed.gif';
1.264     albertel 1847: 	    $url=~/\Q$coursenum\E\/([\/\w]+)\.sequence$/;
1.135     albertel 1848: 	    $url='/adm/coursedocs?';
                   1849: 	    $folderarg=$1;
                   1850: 	    $isfolder=1;
1.142     raeburn  1851:         } elsif ($extension eq 'page') {
                   1852:             $icon=$iconpath.'/page.gif';
1.264     albertel 1853:             $url=~/\Q$coursenum\E\/([\/\w]+)\.page$/;
1.142     raeburn  1854:             $pagearg=$1;
                   1855:             $url='/adm/coursedocs?';
                   1856:             $ispage=1;
1.135     albertel 1857: 	} else {
                   1858: 	    &Apache::lonnet::allowuploaded('/adm/coursedoc',$url);
                   1859: 	}
1.16      www      1860:     }
1.215     albertel 1861:     $url=~s-^http(\&colon\;|:)//-/adm/wrapper/ext/-;
1.142     raeburn  1862:     if ((!$isfolder) && ($residx) && ($folder!~/supplemental/) && (!$ispage)) {
1.113     albertel 1863: 	my $symb=&Apache::lonnet::symbclean(
1.50      www      1864:           &Apache::lonnet::declutter('uploaded/'.
1.174     albertel 1865:            $env{'course.'.$env{'request.course.id'}.'.domain'}.'/'.
                   1866:            $env{'course.'.$env{'request.course.id'}.'.num'}.'/'.$folder.
1.50      www      1867:            '.sequence').
                   1868:            '___'.$residx.'___'.
1.113     albertel 1869: 	   &Apache::lonnet::declutter($url));
                   1870: 	(undef,undef,$url)=&Apache::lonnet::decode_symb($symb);
                   1871: 	$url=&Apache::lonnet::clutter($url);
1.127     albertel 1872: 	if ($url=~/^\/*uploaded\//) {
                   1873: 	    $url=~/\.(\w+)$/;
                   1874: 	    my $embstyle=&Apache::loncommon::fileembstyle($1);
                   1875: 	    if (($embstyle eq 'img') || ($embstyle eq 'emb')) {
                   1876: 		$url='/adm/wrapper'.$url;
                   1877: 	    } elsif ($embstyle eq 'ssi') {
                   1878: 		#do nothing with these
                   1879: 	    } elsif ($url!~/\.(sequence|page)$/) {
                   1880: 		$url='/adm/coursedocs/showdoc'.$url;
                   1881: 	    }
1.145     albertel 1882: 	} elsif ($url=~m|^/ext/|) { 
                   1883: 	    $url='/adm/wrapper'.$url;
1.127     albertel 1884: 	}
1.241     www      1885:         if (&Apache::lonnet::symbverify($symb,$url)) {
                   1886: 	    $url.=(($url=~/\?/)?'&':'?').'symb='.&escape($symb);
                   1887:         } else {
                   1888:             $url='';
                   1889:         }
1.152     albertel 1890: 	if ($container eq 'page') {
1.174     albertel 1891: 	    my $symb=$env{'form.pagesymb'};
1.152     albertel 1892: 	    	    
                   1893: 	    $url=&Apache::lonnet::clutter((&Apache::lonnet::decode_symb($symb))[2]);
1.228     www      1894: 	    $url.=(($url=~/\?/)?'&':'?').'symb='.&escape($symb);
1.152     albertel 1895: 	}
1.50      www      1896:     }
1.278.2.2! albertel 1897:     my ($parameterset,$rand_order_text) = ('&nbsp;', '&nbsp;');
1.216     albertel 1898:     if ($isfolder || $extension eq 'sequence') {
1.228     www      1899: 	my $foldername=&escape($foldertitle);
1.174     albertel 1900: 	my $folderpath=$env{'form.folderpath'};
1.114     albertel 1901: 	if ($folderpath) { $folderpath.='&' };
1.242     www      1902: # Append randompick number, hidden, and encrypted with ":" to foldername, 
                   1903: # so it gets transferred between levels
1.245     albertel 1904: 	$folderpath.=$folderarg.'&'.$foldername.':'.(&LONCAPA::map::getparameter($orderidx,
1.242     www      1905:                                               'parameter_randompick'))[0]
1.245     albertel 1906:                                                .':'.((&LONCAPA::map::getparameter($orderidx,
1.242     www      1907:                                               'parameter_hiddenresource'))[0]=~/^yes$/i)
1.245     albertel 1908:                                                .':'.((&LONCAPA::map::getparameter($orderidx,
1.278.2.1  albertel 1909:                                               'parameter_encrypturl'))[0]=~/^yes$/i)
                   1910:                                                .':'.((&LONCAPA::map::getparameter($orderidx,
                   1911:                                               'parameter_randomorder'))[0]=~/^yes$/i);
1.228     www      1912: 	$url.='folderpath='.&escape($folderpath).$cpinfo;
1.147     matthew  1913: 	$parameterset='<label>'.&mt('Randomly Pick: ').
1.258     www      1914: 	    '<input type="text" size="4" onChange="this.form.changeparms.value='."'randompick'".';this.form.submit()" name="randpick_'.$orderidx.'" value="'.
1.245     albertel 1915: 	    (&LONCAPA::map::getparameter($orderidx,
1.147     matthew  1916:                                               'parameter_randompick'))[0].
1.165     www      1917:                                               '" />'.
1.272     albertel 1918: '<font size="-2"><a href="javascript:void(0)">'.&mt('Save').'</a></font></label>';
1.147     matthew  1919:        
1.278.2.2! albertel 1920: 	my $ro_set=
        !          1921: 	    ((&LONCAPA::map::getparameter($orderidx,'parameter_randomorder'))[0]=~/^yes$/i?' checked="checked"':'');
        !          1922: 	$rand_order_text ='
        !          1923: <nobr><label><input type="checkbox" name="randorder_$orderidx" onClick="this.form.changeparms.value=\'randomorder\';this.form.submit()" '.$ro_set.' /> '.&mt('Random Order').' </label></nobr>';
1.114     albertel 1924:     }
1.142     raeburn  1925:     if ($ispage) {
1.228     www      1926:         my $pagename=&escape($pagetitle);
1.142     raeburn  1927:         my $pagepath;
1.174     albertel 1928:         my $folderpath=$env{'form.folderpath'};
1.142     raeburn  1929:         if ($folderpath) { $pagepath = $folderpath.'&' };
                   1930:         $pagepath.=$pagearg.'&'.$pagename;
1.174     albertel 1931: 	my $symb=$env{'form.pagesymb'};
1.152     albertel 1932: 	if (!$symb) {
                   1933: 	    my $path='uploaded/'.
1.174     albertel 1934: 		$env{'course.'.$env{'request.course.id'}.'.domain'}.'/'.
                   1935: 		$env{'course.'.$env{'request.course.id'}.'.num'}.'/';
1.152     albertel 1936: 	    $symb=&Apache::lonnet::encode_symb($path.$folder.'.sequence',
                   1937: 					       $residx,
                   1938: 					       $path.$pagearg.'.page');
                   1939: 	}
1.228     www      1940: 	$url.='pagepath='.&escape($pagepath).
                   1941: 	    '&pagesymb='.&escape($symb).$cpinfo;
1.142     raeburn  1942:     }
1.113     albertel 1943:     $line.='<td bgcolor="#FFFFBB"><a href="'.$url.'"><img src="'.$icon.
                   1944: 	'" border="0"></a></td>'.
1.241     www      1945:         "<td bgcolor='#FFFFBB'>".($url?"<a href=\"$url\">":'').$title.
                   1946:         ($url?'</a>':' <font size="-2">'.&mt('(re-initialize course to access)').'</font>')."</td>";
1.120     www      1947:     if (($allowed) && ($folder!~/^supplemental/)) {
                   1948:  	my %lt=&Apache::lonlocal::texthash(
                   1949:  			      'hd' => 'Hidden',
1.278.2.2! albertel 1950:  			      'ec' => 'URL hidden');
1.122     www      1951: 	my $enctext=
1.278.2.1  albertel 1952: 	    ((&LONCAPA::map::getparameter($orderidx,'parameter_encrypturl'))[0]=~/^yes$/i?' checked="checked"':'');
1.122     www      1953: 	my $hidtext=
1.278.2.1  albertel 1954: 	    ((&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i?' checked="checked"':'');
1.278.2.2! albertel 1955: 
1.120     www      1956: 	$line.=(<<ENDPARMS);
                   1957: <td bgcolor="#BBBBFF"><font size='-2'>
1.258     www      1958: <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 1959: <td bgcolor="#BBBBFF"><font size='-2'>
1.258     www      1960: <nobr><label><input type="checkbox" name="encprs_$orderidx" onClick="this.form.changeparms.value='encrypturl';this.form.submit()" $enctext /> $lt{'ec'}</label></nobr></td>
1.278.2.2! albertel 1961: <td bgcolor="#BBBBFF"><font size="-2">$rand_order_text</font></td>
1.120     www      1962: <td bgcolor="#BBBBFF"><font size="-2">$parameterset</font></td>
                   1963: ENDPARMS
1.119     www      1964:     }
1.120     www      1965:     $line.="</form></tr>";
1.8       www      1966:     return $line;
                   1967: }
                   1968: 
1.27      www      1969: # ---------------------------------------------------------------- tie the hash
                   1970: 
                   1971: sub tiehash {
1.136     albertel 1972:     my ($mode)=@_;
1.27      www      1973:     $hashtied=0;
1.174     albertel 1974:     if ($env{'request.course.fn'}) {
1.136     albertel 1975: 	if ($mode eq 'write') {
1.174     albertel 1976: 	    if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.".db",
1.136     albertel 1977: 		    &GDBM_WRCREAT(),0640)) {
                   1978:                 $hashtied=2;
                   1979: 	    }
                   1980: 	} else {
1.174     albertel 1981: 	    if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.".db",
1.136     albertel 1982: 		    &GDBM_READER(),0640)) {
1.27      www      1983:                 $hashtied=1;
1.136     albertel 1984: 	    }
                   1985: 	}
1.27      www      1986:     }    
                   1987: }
                   1988: 
                   1989: sub untiehash {
                   1990:     if ($hashtied) { untie %hash; }
                   1991:     $hashtied=0;
1.221     albertel 1992:     return OK;
1.27      www      1993: }
                   1994: 
1.29      www      1995: # --------------------------------------------------------------- check on this
                   1996: 
                   1997: sub checkonthis {
                   1998:     my ($r,$url,$level,$title)=@_;
1.228     www      1999:     $url=&unescape($url);
1.29      www      2000:     $alreadyseen{$url}=1;
                   2001:     $r->rflush();
1.41      www      2002:     if (($url) && ($url!~/^\/uploaded\//) && ($url!~/\*$/)) {
1.108     albertel 2003:        $r->print("\n<br />");
1.29      www      2004:        for (my $i=0;$i<=$level*5;$i++) {
                   2005:            $r->print('&nbsp;');
                   2006:        }
                   2007:        $r->print('<a href="'.$url.'" target="cat">'.
                   2008: 		 ($title?$title:$url).'</a> ');
                   2009:        if ($url=~/^\/res\//) {
                   2010: 	  my $result=&Apache::lonnet::repcopy(
                   2011:                               &Apache::lonnet::filelocation('',$url));
1.172     raeburn  2012:           if ($result eq 'ok') {
1.87      www      2013:              $r->print('<font color="green">'.&mt('ok').'</font>');
1.29      www      2014:              $r->rflush();
1.34      www      2015:              &Apache::lonnet::countacc($url);
                   2016:              $url=~/\.(\w+)$/;
                   2017:              if (&Apache::loncommon::fileembstyle($1) eq 'ssi') {
                   2018: 		 $r->print('<br />');
                   2019:                  $r->rflush();
                   2020:                  for (my $i=0;$i<=$level*5;$i++) {
                   2021:                      $r->print('&nbsp;');
                   2022:                  }
1.84      www      2023:                  $r->print('- '.&mt('Rendering').': ');
1.170     www      2024: 		 my ($errorcount,$warningcount)=split(/:/,
                   2025: 	       &Apache::lonnet::ssi_body($url,
1.173     albertel 2026: 			       ('grade_target'=>'web',
                   2027: 				'return_only_error_and_warning_counts' => 1)));
1.170     www      2028:                  if (($errorcount) ||
                   2029:                      ($warningcount)) {
                   2030: 		     if ($errorcount) {
1.98      www      2031:                         $r->print('<img src="/adm/lonMisc/bomb.gif" /><font color="red"><b>'.
1.170     www      2032: 			  $errorcount.' '.
1.87      www      2033: 				  &mt('error(s)').'</b></font> ');
1.34      www      2034:                      }
1.170     www      2035: 		     if ($warningcount) {
1.34      www      2036:                         $r->print('<font color="blue">'.
1.170     www      2037: 			  $warningcount.' '.
1.84      www      2038: 				  &mt('warning(s)').'</font>');
1.34      www      2039:                      }
                   2040:                  } else {
1.87      www      2041:                      $r->print('<font color="green">'.&mt('ok').'</font>');
1.34      www      2042:                  }
                   2043:                  $r->rflush();
                   2044:              }
1.29      www      2045: 	     my $dependencies=
                   2046:                 &Apache::lonnet::metadata($url,'dependencies');
                   2047:              foreach (split(/\,/,$dependencies)) {
                   2048: 		 if (($_=~/^\/res\//) && (!$alreadyseen{$_})) {
                   2049:                     &checkonthis($r,$_,$level+1);
                   2050:                  }
                   2051:              }
1.172     raeburn  2052:           } elsif ($result eq 'unavailable') {
1.84      www      2053:              $r->print('<font color="red"><b>'.&mt('connection down').'</b></font>');
1.172     raeburn  2054:           } elsif ($result eq 'not_found') {
1.100     www      2055: 	      unless ($url=~/\$/) {
                   2056: 		  $r->print('<font color="red"><b>'.&mt('not found').'</b></font>');
                   2057: 	      } else {
                   2058: 		  $r->print('<font color="yellow"><b>'.&mt('unable to verify variable URL').'</b></font>');
                   2059: 	      }
1.29      www      2060:           } else {
1.84      www      2061:              $r->print('<font color="red"><b>'.&mt('access denied').'</b></font>');
1.29      www      2062:           }
                   2063:       }
                   2064:    }
                   2065: }
                   2066: 
1.1       www      2067: 
1.75      www      2068: #
1.208     albertel 2069: # ----------------------------------------------------------------- List Symbs
                   2070: # 
                   2071: sub list_symbs {
1.224     albertel 2072:     my ($r) = @_;
                   2073: 
                   2074:     $r->print(&Apache::loncommon::start_page('Symb List'));
1.257     www      2075:     $r->print(&Apache::lonhtmlcommon::breadcrumbs('Symb List'));
1.224     albertel 2076:     my $navmap = Apache::lonnavmaps::navmap->new();
                   2077:     $r->print("<pre>\n");
                   2078:     foreach my $res ($navmap->retrieveResources()) {
                   2079: 	$r->print($res->compTitle()."\t".$res->symb()."\n");
                   2080:     }
                   2081:     $r->print("\n</pre>\n");
                   2082:     $r->print('<a href="/adm/coursedocs">'.&mt('Return to DOCS').'</a>');
1.208     albertel 2083: }
                   2084: 
                   2085: 
                   2086: #
1.75      www      2087: # -------------------------------------------------------------- Verify Content
                   2088: # 
                   2089: sub verifycontent {
1.224     albertel 2090:     my ($r) = @_;
1.230     albertel 2091:     my $type = &Apache::loncommon::course_type();
1.26      www      2092:    my $loaderror=&Apache::lonnet::overloaderror($r);
                   2093:    if ($loaderror) { return $loaderror; }
1.229     raeburn  2094:    $r->print(&Apache::loncommon::start_page('Verify '.$type.' Documents'));
1.257     www      2095:    $r->print(&Apache::lonhtmlcommon::breadcrumbs('Verify '.$type.' Documents'));
1.27      www      2096:    $hashtied=0;
1.30      www      2097:    undef %alreadyseen;
                   2098:    %alreadyseen=();
1.27      www      2099:    &tiehash();
                   2100:    foreach (keys %hash) {
1.140     www      2101:        if ($hash{$_}=~/\.(page|sequence)$/) {
1.228     www      2102: 	   if (($_=~/^src_/) && ($alreadyseen{&unescape($hash{$_})})) {
1.140     www      2103: 	       $r->print('<hr /><font color="red">'.
1.230     albertel 2104: 			 &mt('The following sequence or page is included more than once in your '.$type.': ').
1.228     www      2105: 			 &unescape($hash{$_}).'</font><br />'.
1.140     www      2106: 			 &mt('Note that grading records for problems included in this sequence or folder will overlap.<hr />'));
                   2107: 	   }
                   2108:        }
1.228     www      2109:        if (($_=~/^src\_(.+)$/) && (!$alreadyseen{&unescape($hash{$_})})) {
1.29      www      2110:            &checkonthis($r,$hash{$_},0,$hash{'title_'.$1});
1.27      www      2111:        }
                   2112:    }
                   2113:    &untiehash();
1.108     albertel 2114:    $r->print('<h1>'.&mt('Done').'.</h1>'.'<a href="/adm/coursedocs">'.
                   2115: 	     &mt('Return to DOCS').'</a>');
1.75      www      2116: }
                   2117: 
1.192     www      2118: 
1.75      www      2119: # -------------------------------------------------------------- Check Versions
                   2120: 
1.192     www      2121: sub devalidateversioncache {
                   2122:     my $src=shift;
                   2123:     &Apache::lonnet::devalidate_cache_new('courseresversion',$env{'request.course.id'}.'_'.
                   2124: 					  &Apache::lonnet::clutter($src));
                   2125: }
                   2126: 
1.75      www      2127: sub checkversions {
1.224     albertel 2128:     my ($r) = @_;
1.230     albertel 2129:     my $type = &Apache::loncommon::course_type();
1.229     raeburn  2130:     $r->print(&Apache::loncommon::start_page("Check $type Document Versions"));
1.257     www      2131:     $r->print(&Apache::lonhtmlcommon::breadcrumbs("Check $type Document Versions"));
1.89      www      2132:     my $header='';
                   2133:     my $startsel='';
                   2134:     my $monthsel='';
                   2135:     my $weeksel='';
                   2136:     my $daysel='';
                   2137:     my $allsel='';
                   2138:     my %changes=();
                   2139:     my $starttime=0;
1.91      www      2140:     my $haschanged=0;
1.92      www      2141:     my %setversions=&Apache::lonnet::dump('resourceversions',
1.174     albertel 2142: 			  $env{'course.'.$env{'request.course.id'}.'.domain'},
                   2143: 			  $env{'course.'.$env{'request.course.id'}.'.num'});
1.92      www      2144: 
                   2145:     $hashtied=0;
                   2146:     &tiehash();
                   2147:     my %newsetversions=();
1.174     albertel 2148:     if ($env{'form.setmostrecent'}) {
1.91      www      2149: 	$haschanged=1;
1.92      www      2150: 	foreach (keys %hash) {
                   2151: 	    if ($_=~/^ids\_(\/res\/.+)$/) {
1.93      www      2152: 		$newsetversions{$1}='mostrecent';
1.192     www      2153:                 &devalidateversioncache($1);
1.92      www      2154: 	    }
                   2155: 	}
1.174     albertel 2156:     } elsif ($env{'form.setcurrent'}) {
1.91      www      2157: 	$haschanged=1;
1.92      www      2158: 	foreach (keys %hash) {
                   2159: 	    if ($_=~/^ids\_(\/res\/.+)$/) {
1.93      www      2160: 		my $getvers=&Apache::lonnet::getversion($1);
                   2161: 		if ($getvers>0) {
                   2162: 		    $newsetversions{$1}=$getvers;
1.192     www      2163: 		    &devalidateversioncache($1);
1.93      www      2164: 		}
1.92      www      2165: 	    }
                   2166: 	}
1.174     albertel 2167:     } elsif ($env{'form.setversions'}) {
1.91      www      2168: 	$haschanged=1;
1.174     albertel 2169: 	foreach (keys %env) {
1.92      www      2170: 	    if ($_=~/^form\.set_version_(.+)$/) {
                   2171: 		my $src=$1;
1.174     albertel 2172: 		if (($env{$_}) && ($env{$_} ne $setversions{$src})) {
                   2173: 		    $newsetversions{$src}=$env{$_};
1.192     www      2174: 		    &devalidateversioncache($src);
1.92      www      2175: 		}
                   2176: 	    }
                   2177: 	}
1.91      www      2178:     }
                   2179:     if ($haschanged) {
1.92      www      2180:         if (&Apache::lonnet::put('resourceversions',\%newsetversions,
1.174     albertel 2181: 			  $env{'course.'.$env{'request.course.id'}.'.domain'},
                   2182: 			  $env{'course.'.$env{'request.course.id'}.'.num'}) eq 'ok') {		
1.272     albertel 2183: 	    $r->print('<h1>'.&mt('Your Version Settings have been Saved').'</h1>');
1.92      www      2184: 	} else {
1.272     albertel 2185: 	    $r->print('<h1><font color="red">'.&mt('An Error Occured while Attempting to Save your Version Settings').'</font></h1>');
1.92      www      2186: 	}
1.136     albertel 2187: 	&mark_hash_old();
1.91      www      2188:     }
1.136     albertel 2189:     &changewarning($r,'');
1.174     albertel 2190:     if ($env{'form.timerange'} eq 'all') {
1.89      www      2191: # show all documents
1.230     albertel 2192: 	$header=&mt('All Documents in '.$type);
1.91      www      2193: 	$allsel=1;
1.90      www      2194: 	foreach (keys %hash) {
                   2195: 	    if ($_=~/^ids\_(\/res\/.+)$/) {
                   2196: 		my $src=$1;
                   2197: 		$changes{$src}=1;
                   2198: 	    }
                   2199: 	}
1.89      www      2200:     } else {
                   2201: # show documents which changed
                   2202: 	%changes=&Apache::lonnet::dump
1.174     albertel 2203: 	 ('versionupdate',$env{'course.'.$env{'request.course.id'}.'.domain'},
                   2204:                      $env{'course.'.$env{'request.course.id'}.'.num'});
1.89      www      2205: 	my $firstkey=(keys %changes)[0];
                   2206: 	unless ($firstkey=~/^error\:/) {
1.174     albertel 2207: 	    unless ($env{'form.timerange'}) {
                   2208: 		$env{'form.timerange'}=604800;
1.89      www      2209: 	    }
1.174     albertel 2210: 	    my $seltext=&mt('during the last').' '.$env{'form.timerange'}.' '
1.89      www      2211: 		.&mt('seconds');
1.174     albertel 2212: 	    if ($env{'form.timerange'}==-1) {
1.89      www      2213: 		$seltext='since start of course';
                   2214: 		$startsel='selected';
1.174     albertel 2215: 		$env{'form.timerange'}=time;
1.89      www      2216: 	    }
1.174     albertel 2217: 	    $starttime=time-$env{'form.timerange'};
                   2218: 	    if ($env{'form.timerange'}==2592000) {
1.89      www      2219: 		$seltext=&mt('during the last month').' ('.&Apache::lonlocal::locallocaltime($starttime).')';
                   2220: 		$monthsel='selected';
1.174     albertel 2221: 	    } elsif ($env{'form.timerange'}==604800) {
1.89      www      2222: 		$seltext=&mt('during the last week').' ('.&Apache::lonlocal::locallocaltime($starttime).')';
                   2223: 		$weeksel='selected';
1.174     albertel 2224: 	    } elsif ($env{'form.timerange'}==86400) {
1.89      www      2225: 		$seltext=&mt('since yesterday').' ('.&Apache::lonlocal::locallocaltime($starttime).')';
                   2226: 		$daysel='selected';
                   2227: 	    }
                   2228: 	    $header=&mt('Content changed').' '.$seltext;
                   2229: 	} else {
                   2230: 	    $header=&mt('No content modifications yet.');
                   2231: 	}
                   2232:     }
1.92      www      2233:     %setversions=&Apache::lonnet::dump('resourceversions',
1.174     albertel 2234: 			  $env{'course.'.$env{'request.course.id'}.'.domain'},
                   2235: 			  $env{'course.'.$env{'request.course.id'}.'.num'});
1.89      www      2236:     my %lt=&Apache::lonlocal::texthash
1.229     raeburn  2237: 	      ('st' => 'Version changes since start of '.$type,
1.88      www      2238: 	       'lm' => 'Version changes since last Month',
                   2239: 	       'lw' => 'Version changes since last Week',
                   2240: 	       'sy' => 'Version changes since Yesterday',
1.91      www      2241:                'al' => 'All Resources (possibly large output)',
1.88      www      2242: 	       'sd' => 'Display',
1.84      www      2243: 	       'fi' => 'File',
                   2244: 	       'md' => 'Modification Date',
1.87      www      2245:                'mr' => 'Most recently published Version',
1.229     raeburn  2246: 	       've' => 'Version used in '.$type,
                   2247:                'vu' => 'Set Version to be used in '.$type,
                   2248: 'sv' => 'Set Versions to be used in '.$type.' according to Selections below',
1.91      www      2249: 'sm' => 'Keep all Resources up-to-date with most recent Versions (default)',
                   2250: 'sc' => 'Set all Resource Versions to current Version (Fix Versions)',
1.84      www      2251: 	       'di' => 'Differences');
1.89      www      2252:     $r->print(<<ENDHEADERS);
1.31      www      2253: <form action="/adm/coursedocs" method="post">
1.91      www      2254: <input type="hidden" name="versions" value="1" />
                   2255: <input type="submit" name="setmostrecent" value="$lt{'sm'}" />
                   2256: <input type="submit" name="setcurrent" value="$lt{'sc'}" /><hr />
1.31      www      2257: <select name="timerange">
1.88      www      2258: <option value='all' $allsel>$lt{'al'}</option>
1.84      www      2259: <option value="-1" $startsel>$lt{'st'}</option>
                   2260: <option value="2592000" $monthsel>$lt{'lm'}</option>
                   2261: <option value="604800" $weeksel>$lt{'lw'}</option>
                   2262: <option value="86400" $daysel>$lt{'sy'}</option>
1.31      www      2263: </select>
1.91      www      2264: <input type="submit" name="display" value="$lt{'sd'}" />
1.89      www      2265: <h3>$header</h3>
1.91      www      2266: <input type="submit" name="setversions" value="$lt{'sv'}" />
1.103     matthew  2267: <table border="0">
1.31      www      2268: ENDHEADERS
1.91      www      2269:     foreach (sort keys %changes) {
1.89      www      2270: 	if ($changes{$_}>$starttime) {
                   2271: 	    my ($root,$extension)=($_=~/^(.*)\.(\w+)$/);
                   2272: 	    my $currentversion=&Apache::lonnet::getversion($_);
1.93      www      2273: 	    if ($currentversion<0) {
                   2274: 		$currentversion=&mt('Could not be determined.');
                   2275: 	    }
1.89      www      2276: 	    my $linkurl=&Apache::lonnet::clutter($_);
                   2277: 	    $r->print(
1.103     matthew  2278: 		      '<tr><td colspan="5"><br /><br /><font size="+1"><b>'.
1.91      www      2279: 		      &Apache::lonnet::gettitle($linkurl).
1.103     matthew  2280:                       '</b></font></td></tr>'.
                   2281:                       '<tr><td>&nbsp;&nbsp;&nbsp;</td>'.
                   2282:                       '<td colspan="4">'.
                   2283:                       '<a href="'.$linkurl.'" target="cat">'.$linkurl.
                   2284: 		      '</a></td></tr>'.
                   2285:                       '<tr><td></td>'.
                   2286:                       '<td title="'.$lt{'md'}.'">'.
1.102     matthew  2287: 		      &Apache::lonlocal::locallocaltime(
                   2288:                            &Apache::lonnet::metadata($root.'.'.$extension,
                   2289:                                                      'lastrevisiondate')
                   2290:                                                         ).
1.103     matthew  2291:                       '</td>'.
                   2292:                       '<td title="'.$lt{'mr'}.'"><nobr>Most Recent: '.
                   2293:                       '<font size="+1">'.$currentversion.'</font>'.
                   2294:                       '</nobr></td>'.
1.229     raeburn  2295:                       '<td title="'.$lt{'ve'}.'"><nobr>In '.$type.': '.
1.103     matthew  2296:                       '<font size="+1">');
1.87      www      2297: # Used in course
1.89      www      2298: 	    my $usedversion=$hash{'version_'.$linkurl};
1.93      www      2299: 	    if (($usedversion) && ($usedversion ne 'mostrecent')) {
1.89      www      2300: 		$r->print($usedversion);
                   2301: 	    } else {
                   2302: 		$r->print($currentversion);
                   2303: 	    }
1.103     matthew  2304: 	    $r->print('</font></nobr></td><td title="'.$lt{'vu'}.'">'.
                   2305:                       '<nobr>Use: ');
1.87      www      2306: # Set version
1.92      www      2307: 	    $r->print(&Apache::loncommon::select_form($setversions{$linkurl},
1.89      www      2308: 						      'set_version_'.$linkurl,
1.136     albertel 2309: 						      ('select_form_order' =>
                   2310: 						       ['',1..$currentversion,'mostrecent'],
                   2311: 						       '' => '',
1.93      www      2312: 						       'mostrecent' => 'most recent',
1.89      www      2313: 						       map {$_,$_} (1..$currentversion))));
1.103     matthew  2314: 	    $r->print('</nobr></td></tr><tr><td></td>');
1.89      www      2315: 	    my $lastold=1;
                   2316: 	    for (my $prevvers=1;$prevvers<$currentversion;$prevvers++) {
                   2317: 		my $url=$root.'.'.$prevvers.'.'.$extension;
                   2318: 		if (&Apache::lonnet::metadata($url,'lastrevisiondate')<
                   2319: 		    $starttime) {
                   2320: 		    $lastold=$prevvers;
                   2321: 		}
                   2322: 	    }
1.103     matthew  2323:             # 
                   2324:             # Code to figure out how many version entries should go in
                   2325:             # each of the four columns
                   2326:             my $entries_per_col = 0;
                   2327:             my $num_entries = ($currentversion-$lastold);
                   2328:             if ($num_entries % 4 == 0) {
                   2329:                 $entries_per_col = $num_entries/4;
                   2330:             } else {
                   2331:                 $entries_per_col = $num_entries/4 + 1;
                   2332:             }
                   2333:             my $entries_count = 0;
                   2334:             $r->print('<td valign="top"><font size="-2">'); 
                   2335:             my $cols_output = 1;
1.32      www      2336:             for (my $prevvers=$lastold;$prevvers<$currentversion;$prevvers++) {
1.89      www      2337: 		my $url=$root.'.'.$prevvers.'.'.$extension;
1.103     matthew  2338: 		$r->print('<nobr><a href="'.&Apache::lonnet::clutter($url).
1.91      www      2339: 			  '">'.&mt('Version').' '.$prevvers.'</a> ('.
1.103     matthew  2340: 			  &Apache::lonlocal::locallocaltime(
                   2341:                                 &Apache::lonnet::metadata($url,
                   2342:                                                           'lastrevisiondate')
                   2343:                                                             ).
1.91      www      2344: 			  ')');
1.89      www      2345: 		if (&Apache::loncommon::fileembstyle($extension) eq 'ssi') {
1.33      www      2346:                     $r->print(' <a href="/adm/diff?filename='.
1.89      www      2347: 			      &Apache::lonnet::clutter($root.'.'.$extension).
                   2348: 			      '&versionone='.$prevvers.
                   2349: 			      '">'.&mt('Diffs').'</a>');
                   2350: 		}
1.103     matthew  2351: 		$r->print('</nobr><br />');
                   2352:                 if (++$entries_count % $entries_per_col == 0) {
                   2353:                     $r->print('</font></td>');
                   2354:                     if ($cols_output != 4) {
                   2355:                         $r->print('<td valign="top"><font size="-2">');
                   2356:                         $cols_output++;
                   2357:                     }
                   2358:                 }
1.89      www      2359: 	    }
1.103     matthew  2360:             while($cols_output++ < 4) {
                   2361:                 $r->print('</font></td><td><font>')
                   2362:             }
                   2363: 	    $r->print('</font></td></tr>'."\n");
1.89      www      2364: 	}
                   2365:     }
1.92      www      2366:     $r->print('</table></form>');
1.89      www      2367:     $r->print('<h1>'.&mt('Done').'.</h1>');
                   2368: 
                   2369:     &untiehash();
1.75      www      2370: }
                   2371: 
1.136     albertel 2372: sub mark_hash_old {
                   2373:     my $retie_hash=0;
                   2374:     if ($hashtied) {
                   2375: 	$retie_hash=1;
                   2376: 	&untiehash();
                   2377:     }
                   2378:     &tiehash('write');
                   2379:     $hash{'old'}=1;
                   2380:     &untiehash();
                   2381:     if ($retie_hash) { &tiehash(); }
                   2382: }
                   2383: 
                   2384: sub is_hash_old {
                   2385:     my $untie_hash=0;
                   2386:     if (!$hashtied) {
                   2387: 	$untie_hash=1;
                   2388: 	&tiehash();
                   2389:     }
                   2390:     my $return=$hash{'old'};
                   2391:     if ($untie_hash) { &untiehash(); }
                   2392:     return $return;
                   2393: }
                   2394: 
1.91      www      2395: sub changewarning {
1.177     albertel 2396:     my ($r,$postexec,$message,$url)=@_;
1.136     albertel 2397:     if (!&is_hash_old()) { return; }
1.150     albertel 2398:     my $pathvar='folderpath';
1.228     www      2399:     my $path=&escape($env{'form.folderpath'});
1.177     albertel 2400:     if (!defined($url)) {
                   2401: 	if (defined($env{'form.pagepath'})) {
                   2402: 	    $pathvar='pagepath';
1.228     www      2403: 	    $path=&escape($env{'form.pagepath'});
                   2404: 	    $path.='&amp;pagesymb='.&escape($env{'form.pagesymb'});
1.177     albertel 2405: 	}
                   2406: 	$url='/adm/coursedocs?'.$pathvar.'='.$path;
                   2407:     }
1.230     albertel 2408:     my $course_type = &Apache::loncommon::course_type();
1.177     albertel 2409:     if (!defined($message)) {
                   2410: 	$message='Changes will become active for your current session after [_1], or the next time you log in.';
1.150     albertel 2411:     }
1.185     www      2412:     $r->print("\n\n".
                   2413: '<script>function reinit(tf) { tf.submit();'.$postexec.' }</script>'."\n". 
                   2414: '<form name="reinitform" method="post" action="/adm/roles" target="loncapaclient">'.
1.177     albertel 2415: '<input type="hidden" name="orgurl" value="'.$url.
1.117     albertel 2416: '" /><input type="hidden" name="selectrole" value="1" /><h3><font color="red">'.
1.177     albertel 2417: &mt($message,' <input type="hidden" name="'.
                   2418:     $env{'request.role'}.'" value="1" /><input type="button" value="'.
1.230     albertel 2419:     &mt('re-initializing '.$course_type).'" onClick="reinit(this.form)" />').
1.185     www      2420: $help{'Caching'}.'</font></h3></form>'."\n\n");
1.91      www      2421: }
                   2422: 
1.257     www      2423: # =========================================== Breadcrumbs for special functions
                   2424: 
                   2425: sub init_breadcrumbs {
                   2426:     my ($form,$text)=@_;
                   2427:     &Apache::lonhtmlcommon::clear_breadcrumbs();
                   2428:     &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/coursedocs",
                   2429: 					    text=>&Apache::loncommon::course_type()." Documents",
                   2430: 					    faq=>273,
                   2431: 					    bug=>'Instructor Interface',
                   2432:                                             help => 'Docs_Adding_Course_Doc'});
                   2433:     &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/coursedocs?".$form.'=1',
                   2434: 					    text=>$text,
                   2435: 					    faq=>273,
                   2436: 					    bug=>'Instructor Interface'});
                   2437: }
                   2438: 
1.75      www      2439: # ================================================================ Main Handler
                   2440: sub handler {
                   2441:     my $r = shift;
1.82      www      2442:     &Apache::loncommon::content_type($r,'text/html');
1.75      www      2443:     $r->send_http_header;
                   2444:     return OK if $r->header_only;
1.230     albertel 2445:     my $type = &Apache::loncommon::course_type();
1.75      www      2446: 
                   2447: # --------------------------------------------- Initialize help topics for this
1.209     albertel 2448:     foreach ('Adding_Course_Doc','Main_Course_Documents',
                   2449: 	     'Adding_External_Resource','Navigate_Content',
                   2450: 	     'Adding_Folders','Docs_Overview', 'Load_Map',
                   2451: 	     'Supplemental','Score_Upload_Form','Adding_Pages',
                   2452: 	     'Importing_LON-CAPA_Resource','Uploading_From_Harddrive',
                   2453: 	     'Check_Resource_Versions','Verify_Content') {
                   2454: 	$help{$_}=&Apache::loncommon::help_open_topic('Docs_'.$_);
                   2455:     }
1.75      www      2456:     # Composite help files
                   2457:     $help{'Syllabus'} = &Apache::loncommon::help_open_topic(
                   2458: 		    'Docs_About_Syllabus,Docs_Editing_Templated_Pages');
                   2459:     $help{'Simple Page'} = &Apache::loncommon::help_open_topic(
                   2460: 		    'Docs_About_Simple_Page,Docs_Editing_Templated_Pages');
1.86      albertel 2461:     $help{'Simple Problem'} = &Apache::loncommon::help_open_topic(
                   2462: 		    'Option_Response_Simple');
1.75      www      2463:     $help{'Bulletin Board'} = &Apache::loncommon::help_open_topic(
                   2464: 		    'Docs_About_Bulletin_Board,Docs_Editing_Templated_Pages');
                   2465:     $help{'My Personal Info'} = &Apache::loncommon::help_open_topic(
                   2466: 		  'Docs_About_My_Personal_Info,Docs_Editing_Templated_Pages');
1.255     raeburn  2467:     $help{'Group Files'} = &Apache::loncommon::help_open_topic('Docs_About_Group_Files');
1.75      www      2468:     $help{'Caching'} = &Apache::loncommon::help_open_topic('Caching');
1.142     raeburn  2469: 
1.209     albertel 2470: # does this user have privileges to modify docs
                   2471:     my $allowed=&Apache::lonnet::allowed('mdc',$env{'request.course.id'});
                   2472:   if ($allowed && $env{'form.verify'}) {
1.257     www      2473:       &init_breadcrumbs('verify','Verify Content');
1.75      www      2474:       &verifycontent($r);
1.209     albertel 2475:   } elsif ($allowed && $env{'form.listsymbs'}) {
1.257     www      2476:       &init_breadcrumbs('listsymbs','List Symbs');
1.208     albertel 2477:       &list_symbs($r);
1.247     www      2478:   } elsif ($allowed && $env{'form.docslog'}) {
1.257     www      2479:       &init_breadcrumbs('docslog','Show Log');
1.247     www      2480:       &docs_change_log($r);
1.209     albertel 2481:   } elsif ($allowed && $env{'form.versions'}) {
1.257     www      2482:       &init_breadcrumbs('versions','Check/Set Resource Versions');
1.75      www      2483:       &checkversions($r);
1.209     albertel 2484:   } elsif ($allowed && $env{'form.dumpcourse'}) {
1.257     www      2485:       &init_breadcrumbs('dumpcourse','Dump '.&Apache::loncommon::course_type().' DOCS to Construction Space');
1.75      www      2486:       &dumpcourse($r);
1.209     albertel 2487:   } elsif ($allowed && $env{'form.exportcourse'}) {
1.257     www      2488:       &init_breadcrumbs('exportcourse','Export '.&Apache::loncommon::course_type().' to IMS');
1.138     raeburn  2489:       &exportcourse($r);
1.26      www      2490:   } else {
1.7       www      2491: # is this a standard course?
                   2492: 
1.174     albertel 2493:     my $standard=($env{'request.course.uri'}=~/^\/uploaded\//);
1.155     raeburn  2494:     my $forcestandard = 0;
1.15      www      2495:     my $forcesupplement;
                   2496:     my $script='';
1.19      www      2497:     my $showdoc=0;
1.142     raeburn  2498:     my $containertag;
                   2499:     my $uploadtag;
1.15      www      2500:     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
1.224     albertel 2501: 					    ['folderpath','pagepath',
                   2502: 					     'pagesymb','markedcopy_url',
                   2503: 					     'markedcopy_title']);
1.174     albertel 2504:     if ($env{'form.folderpath'}) {
                   2505: 	my (@folderpath)=split('&',$env{'form.folderpath'});
1.228     www      2506: 	$env{'form.foldername'}=&unescape(pop(@folderpath));
1.174     albertel 2507: 	$env{'form.folder'}=pop(@folderpath);
                   2508:     }
                   2509:     if ($env{'form.pagepath'}) {
                   2510:         my (@pagepath)=split('&',$env{'form.pagepath'});
1.228     www      2511:         $env{'form.pagename'}=&unescape(pop(@pagepath));
1.174     albertel 2512:         $env{'form.folder'}=pop(@pagepath);
1.156     albertel 2513:         $containertag = '<input type="hidden" name="pagepath" value="" />'.
                   2514: 	    '<input type="hidden" name="pagesymb" value="" />';
1.174     albertel 2515:         $uploadtag = '<input type="hidden" name="pagepath" value="'.$env{'form.pagepath'}.'" />'.
                   2516: 	    '<input type="hidden" name="pagesymb" value="'.$env{'form.pagesymb'}.'" />';
1.142     raeburn  2517:     }
1.21      www      2518:     if ($r->uri=~/^\/adm\/coursedocs\/showdoc\/(.*)$/) {
1.127     albertel 2519:        $showdoc='/'.$1;
1.21      www      2520:     }
                   2521:     unless ($showdoc) { # got called from remote
1.237     albertel 2522:        if (($env{'form.folder'}=~/^(?:group|default)_/) || 
1.209     albertel 2523:           ($env{'form.folder'} =~ m:^\d+/(pages|sequences)/:)) {
1.155     raeburn  2524:            $forcestandard = 1;
                   2525:        } 
1.174     albertel 2526:        $forcesupplement=($env{'form.folder'}=~/^supplemental_/);
1.7       www      2527: 
1.15      www      2528:        if ($allowed) { 
                   2529:          &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['cmd']);
                   2530:          $script=&Apache::lonratedt::editscript('simple'); 
                   2531:        }
                   2532:     } else { # got called in sequence from course
                   2533:        $allowed=0;
1.3       www      2534:     }
1.4       www      2535: 
                   2536: # get course data
1.174     albertel 2537:     my $coursenum=$env{'course.'.$env{'request.course.id'}.'.num'};
                   2538:     my $coursedom=$env{'course.'.$env{'request.course.id'}.'.domain'};
1.4       www      2539: 
1.225     albertel 2540: # get personal data 
1.174     albertel 2541:     my $uname=$env{'user.name'};
                   2542:     my $udom=$env{'user.domain'};
1.245     albertel 2543:     my $plainname=&escape(&Apache::loncommon::plainname($uname,$udom));
1.14      www      2544: 
1.8       www      2545: # graphics settings
1.4       www      2546: 
1.176     albertel 2547:     $iconpath = &Apache::loncommon::lonhttpdurl($r->dir_config('lonIconsURL') . "/");
1.8       www      2548: 
1.224     albertel 2549:     if ($allowed) {
                   2550: 	$script .= &editing_js($udom,$uname);
1.171     www      2551:     }
1.42      www      2552: # -------------------------------------------------------------------- Body tag
1.224     albertel 2553:     $script = '<script type="text/javascript">'."\n".$script."\n".'</script>';
1.229     raeburn  2554:     $r->print(&Apache::loncommon::start_page("$type Documents", $script,
1.225     albertel 2555: 					     {'force_register' => $showdoc,}).
1.233     albertel 2556: 	      &Apache::loncommon::help_open_menu('','',273,'RAT'));
1.224     albertel 2557:   
1.188     raeburn  2558:   my %allfiles = ();
                   2559:   my %codebase = ();
                   2560:   my ($upload_result,$upload_output);
                   2561:   if ($allowed) {
1.264     albertel 2562:       if (($env{'form.uploaddoc.filename'}) &&
                   2563: 	  ($env{'form.cmd'}=~/^upload_(\w+)/)) {
1.188     raeburn  2564: # Process file upload - phase one - upload and parse primary file.  
1.190     albertel 2565:           $upload_result = &process_file_upload(\$upload_output,$coursenum,
                   2566: 						$coursedom,\%allfiles,
1.194     raeburn  2567: 						\%codebase,$1);
1.188     raeburn  2568:           if ($upload_result eq 'phasetwo') {
                   2569:               $r->print($upload_output);
                   2570:           }
                   2571:       } elsif ($env{'form.phasetwo'}) {
                   2572:           my %newname = ();
                   2573:           my %origname = ();
                   2574:           my %attribs = ();
                   2575:           my $updateflag = 0;
                   2576:           my $residx = $env{'form.newidx'};
1.228     www      2577:           my $primary_url = &unescape($env{'form.primaryurl'});
1.188     raeburn  2578: # Process file upload - phase two - gather secondary files.
                   2579:           for (my $i=0; $i<$env{'form.phasetwo'}; $i++) {
                   2580:               if ($env{'form.embedded_item_'.$i.'.filename'}) {
                   2581:                   my $javacodebase;
                   2582:                   $newname{$i} = &process_secondary_uploads(\$upload_output,$coursedom,$coursenum,'embedded_item_',$i,$residx);
1.228     www      2583:                   $origname{$i} = &unescape($env{'form.embedded_orig_'.$i});
1.188     raeburn  2584:                   if (exists($env{'form.embedded_codebase_'.$i})) {
1.228     www      2585:                       $javacodebase =  &unescape($env{'form.embedded_codebase_'.$i});  
1.188     raeburn  2586:                       $origname{$i} =~ s#^\Q$javacodebase\E/##; 
                   2587:                   }
                   2588:                   my @attributes = ();
                   2589:                   if ($env{'form.embedded_attrib_'.$i} =~ /:/) {
                   2590:                       @attributes = split/:/,$env{'form.embedded_attrib_'.$i};
                   2591:                   } else {
                   2592:                       @attributes = ($env{'form.embedded_attrib_'.$i});
                   2593:                   }
                   2594:                   foreach (@attributes) {
1.228     www      2595:                       push(@{$attribs{$i}},&unescape($_));
1.188     raeburn  2596:                   }
                   2597:                   if ($javacodebase) {
                   2598:                       $codebase{$i} = $javacodebase;
                   2599:                       $codebase{$i} =~ s#/$##;
                   2600:                       $updateflag = 1;
                   2601:                   }
                   2602:               }
                   2603:               unless ($newname{$i} eq $origname{$i}) {
                   2604:                   $updateflag = 1;
                   2605:               }
                   2606:           }
                   2607: # Process file upload - phase three - modify primary file
                   2608:           if ($updateflag) {
                   2609:               my ($content,$rtncode);
                   2610:               my $updateflag = 0;
                   2611:               my $getstatus = &Apache::lonnet::getuploaded('GET',$primary_url,$coursedom,$coursenum,\$content,\$rtncode);
                   2612:               if ($getstatus eq 'ok') {
                   2613:                   foreach my $item (keys %newname) {
                   2614:                       if ($newname{$item} ne $origname{$item}) {
                   2615:                           my $attrib_regexp = '';
                   2616:                           if (@{$attribs{$item}} > 1) {
                   2617:                               $attrib_regexp = join('|',@{$attribs{$item}});
                   2618:                           } else {
                   2619:                               $attrib_regexp = $attribs{$item}[0];
                   2620:                           }
                   2621:                           if ($content =~ m#($attrib_regexp\s*=\s*['"]?)\Q$origname{$item}\E(['"]?)#) {
                   2622:                           } 
                   2623:                           $content =~ s#($attrib_regexp\s*=\s*['"]?)\Q$origname{$item}\E(['"]?)#$1$newname{$item}$2#gi; 
                   2624:                       }
                   2625:                       if (exists($codebase{$item})) {
1.224     albertel 2626:                           $content =~ s/(codebase\s*=\s*["']?)\Q$codebase{$item}\E(["']?)/$1.$2/i; #' stupid emacs
1.188     raeburn  2627:                       }
                   2628:                   }
                   2629: # Save edited file.
                   2630:                   my $saveresult;
                   2631:                   my $docuname=$env{'course.'.$env{'request.course.id'}.'.num'};
                   2632:                   my $docudom=$env{'course.'.$env{'request.course.id'}.'.domain'};
1.191     raeburn  2633:                   my $url = &Apache::lonnet::store_edited_file($primary_url,$content,$docudom,$docuname,\$saveresult);
1.188     raeburn  2634:               } else {
                   2635:                   &Apache::lonnet::logthis('retrieval of uploaded file - '.$primary_url.' - for editing, failed: '.$getstatus); 
                   2636:               }
                   2637:           }
                   2638:       }
                   2639:   }
                   2640: 
                   2641:   unless ($showdoc ||  $upload_result eq 'phasetwo') {
1.81      www      2642: # -----------------------------------------------------------------------------
                   2643:        my %lt=&Apache::lonlocal::texthash(
1.229     raeburn  2644:                 'uplm' => 'Upload a new main '.lc($type).' document',
                   2645:                 'upls' => 'Upload a new supplemental '.lc($type).' document',
1.168     www      2646:                 'impp' => 'Import a document',
                   2647:                 'pubd' => 'Published documents',
1.181     www      2648: 		'copm' => 'All documents out of a published map into this folder',
1.81      www      2649:                 'spec' => 'Special documents',
                   2650:                 'upld' => 'Upload Document',
                   2651:                 'srch' => 'Search',
                   2652:                 'impo' => 'Import',
1.232     www      2653: 		'book' => 'Import Bookmarks',
1.81      www      2654:                 'selm' => 'Select Map',
                   2655:                 'load' => 'Load Map',
1.186     www      2656:                 'reco' => 'Recover Deleted Resources',
1.81      www      2657:                 'newf' => 'New Folder',
1.142     raeburn  2658:                 'newp' => 'New Composite Page',
1.81      www      2659:                 'extr' => 'External Resource',
                   2660:                 'syll' => 'Syllabus',
                   2661:                 'navc' => 'Navigate Contents',
                   2662:                 'sipa' => 'Simple Page',
                   2663:                 'sipr' => 'Simple Problem',
1.219     www      2664:                 'drbx' => 'Drop Box',
1.81      www      2665:                 'scuf' => 'Score Upload Form',
                   2666:                 'bull' => 'Bulletin Board',
1.96      sakharuk 2667:                 'mypi' => 'My Personal Info',
1.255     raeburn  2668:                 'grpo' => 'Group Files',
1.101     www      2669: 		'abou' => 'About User',
1.110     raeburn  2670:                 'imsf' => 'Import IMS package',
1.96      sakharuk 2671:                 'file' =>  'File',
                   2672:                 'title' => 'Title',
1.188     raeburn  2673:                 'comment' => 'Comment',
                   2674:                 'parse' => 'If HTML file, upload embedded images/multimedia files'
1.81      www      2675: 					  );
                   2676: # -----------------------------------------------------------------------------
1.42      www      2677:     if ($allowed) {
1.74      www      2678:        my $dumpbut=&dumpbutton();
1.138     raeburn  2679:        my $exportbut=&exportbutton();
1.88      www      2680:        my %lt=&Apache::lonlocal::texthash(
                   2681: 					 'vc' => 'Verify Content',
                   2682: 					 'cv' => 'Check/Set Resource Versions',
1.208     albertel 2683: 					 'ls' => 'List Symbs',
1.247     www      2684:                                          'sl' => 'Show Log'
1.88      www      2685: 					  );
1.118     albertel 2686: 
1.174     albertel 2687:        my $folderpath=$env{'form.folderpath'};
1.118     albertel 2688:        if (!$folderpath) {
1.174     albertel 2689: 	   if ($env{'form.folder'} eq '' ||
                   2690: 	       $env{'form.folder'} eq 'supplemental') {
1.118     albertel 2691: 	       $folderpath='default&'.
1.230     albertel 2692: 		   &escape(&mt('Main '.$type.' Documents'));
1.118     albertel 2693: 	   }
                   2694:        }
1.174     albertel 2695:        unless ($env{'form.pagepath'}) {
1.142     raeburn  2696:            $containertag = '<input type="hidden" name="folderpath" value="" />';
                   2697:            $uploadtag = '<input type="hidden" name="folderpath" value="'.$folderpath.'" />';
                   2698:        }
                   2699: 
1.42      www      2700:        $r->print(<<ENDCOURSEVERIFY);
1.36      www      2701: <form name="renameform" method="post" action="/adm/coursedocs">
                   2702: <input type="hidden" name="title" />
                   2703: <input type="hidden" name="cmd" />
1.168     www      2704: <input type="hidden" name="markcopy" />
1.142     raeburn  2705: $containertag
1.36      www      2706: </form>
1.39      www      2707: <form name="simpleedit" method="post" action="/adm/coursedocs">
1.256     albertel 2708: <input type="hidden" name="importdetail" value="" />
1.142     raeburn  2709: $uploadtag
1.39      www      2710: </form>
1.26      www      2711: <form action="/adm/coursedocs" method="post" name="courseverify">
1.74      www      2712: <table bgcolor="#AAAAAA" width="100%" cellspacing="4" cellpadding="4">
                   2713: <tr><td bgcolor="#DDDDCC">
1.130     www      2714: <input type="submit" name="verify" value="$lt{'vc'}" />$help{'Verify_Content'}
1.74      www      2715: </td><td bgcolor="#DDDDCC">
1.130     www      2716:     <input type="submit" name="versions" value="$lt{'cv'}" />$help{'Check_Resource_Versions'}
1.74      www      2717: $dumpbut
1.138     raeburn  2718: $exportbut
1.218     albertel 2719: </td><td bgcolor="#DDDDCC">
1.208     albertel 2720:     <input type="submit" name="listsymbs" value="$lt{'ls'}" />
1.247     www      2721: </td><td bgcolor="#DDDDCC">
1.260     www      2722:     <input type="hidden" name="folder" value="$env{'form.folder'}" />
1.247     www      2723:     <input type="submit" name="docslog" value="$lt{'sl'}" />
1.218     albertel 2724: </td></tr></table>
1.25      www      2725: </form>
                   2726: ENDCOURSEVERIFY
1.74      www      2727:        $r->print(&Apache::loncommon::help_open_topic('Docs_Adding_Course_Doc',
1.230     albertel 2728: 		     &mt('Editing the Table of Contents for your '.$type)));
1.25      www      2729:     }
1.17      www      2730: # --------------------------------------------------------- Standard documents
1.43      www      2731:     $r->print('<table border=2 cellspacing=4 cellpadding=4>');
1.7       www      2732:     if (($standard) && ($allowed) && (!$forcesupplement)) {
1.116     albertel 2733: 	$r->print('<tr><td bgcolor="#BBBBBB">');
                   2734: #  '<h2>'.&mt('Main Course Documents').
                   2735: #  ($allowed?' '.$help{'Main_Course_Documents'}:'').'</h2>');
1.174     albertel 2736:        my $folder=$env{'form.folder'};
1.117     albertel 2737:        if ($folder eq '' || $folder eq 'supplemental') {
1.112     raeburn  2738:            $folder='default';
1.230     albertel 2739: 	   $env{'form.folderpath'}='default&'.&escape(&mt('Main '.$type.' Documents'));
1.112     raeburn  2740:        }
1.51      www      2741:        my $postexec='';
                   2742:        if ($folder eq 'default') {
                   2743: 	   $r->print('<script>this.window.name="loncapaclient";</script>');
                   2744:        } else {
1.117     albertel 2745:            #$postexec='self.close();';
1.51      www      2746:        }
1.40      www      2747:        $hadchanges=0;
1.188     raeburn  2748:        &editor($r,$coursenum,$coursedom,$folder,$allowed,$upload_output);
1.40      www      2749:        if ($hadchanges) {
1.136     albertel 2750: 	   &mark_hash_old()
1.40      www      2751:        }
1.136     albertel 2752:        &changewarning($r,$postexec);
1.16      www      2753:        my $folderseq='/uploaded/'.$coursedom.'/'.$coursenum.'/default_'.time.
                   2754:                      '.sequence';
1.142     raeburn  2755:        my $pageseq = '/uploaded/'.$coursedom.'/'.$coursenum.'/default_'.time.
                   2756:                      '.page';
1.186     www      2757: 	my $container='sequence';
                   2758: 	if ($env{'form.pagepath'}) {
                   2759: 	    $container='page';
                   2760: 	}
                   2761: 	my $readfile='/uploaded/'.$coursedom.'/'.$coursenum.'/'.$folder.'.'.$container;
1.8       www      2762:        $r->print(<<ENDFORM);
1.43      www      2763: <table cellspacing=4 cellpadding=4><tr>
1.81      www      2764: <th bgcolor="#DDDDDD">$lt{'uplm'}</th>
                   2765: <th bgcolor="#DDDDDD">$lt{'impp'}</th>
                   2766: <th bgcolor="#DDDDDD">$lt{'spec'}</th>
1.11      www      2767: </tr>
1.16      www      2768: <tr><td bgcolor="#DDDDDD">
1.96      sakharuk 2769: $lt{'file'}:<br />
1.182     albertel 2770: <form name="uploaddocument" action="/adm/coursedocs" method="post" enctype="multipart/form-data">
1.59      www      2771: <input type="file" name="uploaddoc" size="40">
1.8       www      2772: <br />
1.96      sakharuk 2773: $lt{'title'}:<br />
1.11      www      2774: <input type="text" size="50" name="comment">
1.142     raeburn  2775: $uploadtag
1.10      www      2776: <input type="hidden" name="cmd" value="upload_default">
1.188     raeburn  2777: <br />
                   2778: <nobr>
1.190     albertel 2779: <label>$lt{'parse'}?
1.188     raeburn  2780: <input type="checkbox" name="parserflag" />
1.190     albertel 2781: </label>
1.188     raeburn  2782: </nobr>
                   2783: <br />
                   2784: <br />
1.129     albertel 2785: <nobr>
1.81      www      2786: <input type="submit" value="$lt{'upld'}">
1.60      albertel 2787:  $help{'Uploading_From_Harddrive'}
1.58      albertel 2788: </nobr>
1.60      albertel 2789: </form>
1.11      www      2790: </td>
1.16      www      2791: <td bgcolor="#DDDDDD">
1.39      www      2792: <form action="/adm/coursedocs" method="post" name="simpleeditdefault">
1.168     www      2793: $lt{'pubd'}<br />
1.142     raeburn  2794: $uploadtag
1.232     www      2795: <input type=button onClick="javascript:groupsearch()" value="$lt{'srch'}" />
                   2796: <br />
1.58      albertel 2797: <nobr>
1.232     www      2798: <input type=button onClick="javascript:groupimport();" value="$lt{'impo'}" />
1.58      albertel 2799: $help{'Importing_LON-CAPA_Resource'}
                   2800: </nobr>
1.232     www      2801: <br />
                   2802: <input type=button onClick="javascript:groupopen(0,1,1);" value="$lt{'book'}" />
1.59      www      2803: <p>
                   2804: <hr />
1.181     www      2805: $lt{'copm'}<br />
                   2806: <input type="text" size="40" name="importmap"><br />
1.68      bowersj2 2807: <nobr><input type=button 
1.52      www      2808: onClick="javascript:openbrowser('simpleeditdefault','importmap','sequence,page','')"
1.81      www      2809: value="$lt{'selm'}"> <input type="submit" name="loadmap" value="$lt{'load'}">
1.68      bowersj2 2810: $help{'Load_Map'}</nobr>
1.59      www      2811: </p>
1.52      www      2812: </form>
1.186     www      2813: <hr />
                   2814: <form action="/adm/groupsort" method="post" name="recover">
1.232     www      2815: <input type="button" name="recovermap" onClick="javascript:groupopen('$readfile',1,0)" value="$lt{'reco'}" />
1.186     www      2816: </form>
1.142     raeburn  2817: ENDFORM
1.174     albertel 2818:        unless ($env{'form.pagepath'}) {
1.168     www      2819: 	   $r->print(<<ENDFORM);
                   2820: <hr />
                   2821: <form action="/adm/coursedocs" method="post" name="newext">
                   2822: $uploadtag
1.256     albertel 2823: <input type="hidden" name="importdetail" value="" />
1.168     www      2824: <nobr>
                   2825: <input name="newext" type="button" onClick="javascript:makenewext('newext');"
                   2826: value="$lt{'extr'}" /> $help{'Adding_External_Resource'}
                   2827: </nobr>
                   2828: </form>
1.214     www      2829: <br /><form action="/adm/imsimportdocs" method="post" name="ims">
1.168     www      2830: <input type="hidden" name="folder" value="$folder" />
                   2831: <input name="imsimport" type="button" value="$lt{'imsf'}" onClick="javascript:makeims();" />
                   2832: </nobr>
                   2833: </form>
                   2834: ENDFORM
                   2835:        }
                   2836:        $r->print('</td><td bgcolor="#DDDDDD">');
1.174     albertel 2837:        unless ($env{'form.pagepath'}) {
1.142     raeburn  2838:            $r->print(<<ENDFORM);
1.214     www      2839: <br /><form action="/adm/coursedocs" method="post" name="newfolder">
1.174     albertel 2840: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
1.256     albertel 2841: <input type="hidden" name="importdetail" value="" />
1.58      albertel 2842: <nobr>
1.16      www      2843: <input name="newfolder" type="button"
                   2844: onClick="javascript:makenewfolder(this.form,'$folderseq');"
1.81      www      2845: value="$lt{'newf'}" />$help{'Adding_Folders'}
1.58      albertel 2846: </nobr>
1.11      www      2847: </form>
1.214     www      2848: <br /><form action="/adm/coursedocs" method="post" name="newpage">
1.174     albertel 2849: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
1.256     albertel 2850: <input type="hidden" name="importdetail" value="" />
1.142     raeburn  2851: <nobr>
                   2852: <input name="newpage" type="button"
                   2853: onClick="javascript:makenewpage(this.form,'$pageseq');"
                   2854: value="$lt{'newp'}" />$help{'Adding_Pages'}
                   2855: </nobr>
                   2856: </form>
1.214     www      2857: <br /><form action="/adm/coursedocs" method="post" name="newsyl">
1.142     raeburn  2858: $uploadtag
1.256     albertel 2859: <input type="hidden" name="importdetail" 
                   2860: value="Syllabus=/public/$coursedom/$coursenum/syllabus" />
1.58      albertel 2861: <nobr>
1.81      www      2862: <input name="newsyl" type="submit" value="$lt{'syll'}" /> 
1.65      bowersj2 2863:  $help{'Syllabus'}
1.58      albertel 2864: </nobr>
                   2865: </form>
1.214     www      2866: <br /><form action="/adm/coursedocs" method="post" name="newnav">
1.142     raeburn  2867: $uploadtag
1.256     albertel 2868: <input type="hidden" name="importdetail" 
                   2869: value="Navigate Content=/adm/navmaps" />
1.58      albertel 2870: <nobr>
1.81      www      2871: <input name="newnav" type="submit" value="$lt{'navc'}" />
1.47      www      2872: $help{'Navigate_Content'}
1.58      albertel 2873: </nobr>
1.22      www      2874: </form>
1.214     www      2875: <br /><form action="/adm/coursedocs" method="post" name="newsmppg">
1.142     raeburn  2876: $uploadtag
1.256     albertel 2877: <input type="hidden" name="importdetail" value="" />
1.58      albertel 2878: <nobr>
1.81      www      2879: <input name="newsmppg" type="button" value="$lt{'sipa'}"
1.65      bowersj2 2880: onClick="javascript:makesmppage();" /> $help{'Simple Page'}
1.58      albertel 2881: </nobr>
1.55      www      2882: </form>
1.214     www      2883: <br /><form action="/adm/coursedocs" method="post" name="newsmpproblem">
1.142     raeburn  2884: $uploadtag
1.256     albertel 2885: <input type="hidden" name="importdetail" value="" />
1.58      albertel 2886: <nobr>
1.81      www      2887: <input name="newsmpproblem" type="button" value="$lt{'sipr'}"
1.65      bowersj2 2888: onClick="javascript:makesmpproblem();" />$help{'Simple Problem'}
1.62      www      2889: </nobr>
                   2890: </form>
1.219     www      2891: <br /><form action="/adm/coursedocs" method="post" name="newdropbox">
                   2892: $uploadtag      
1.256     albertel 2893: <input type="hidden" name="importdetail" value="" />
1.219     www      2894: <nobr>          
                   2895: <input name="newdropbox" type="button" value="$lt{'drbx'}"
                   2896: onClick="javascript:makedropbox();" />
                   2897: </nobr>         
                   2898: </form> 
1.214     www      2899: <br /><form action="/adm/coursedocs" method="post" name="newexamupload">
1.142     raeburn  2900: $uploadtag
1.256     albertel 2901: <input type="hidden" name="importdetail" value="" />
1.62      www      2902: <nobr>
1.81      www      2903: <input name="newexamupload" type="button" value="$lt{'scuf'}"
1.62      www      2904: onClick="javascript:makeexamupload();" />
1.66      bowersj2 2905: $help{'Score_Upload_Form'}
1.58      albertel 2906: </nobr>
1.22      www      2907: </form>
1.214     www      2908: <br /><form action="/adm/coursedocs" method="post" name="newbul">
1.142     raeburn  2909: $uploadtag
1.256     albertel 2910: <input type="hidden" name="importdetail" value="" />
1.58      albertel 2911: <nobr>
1.81      www      2912: <input name="newbulletin" type="button" value="$lt{'bull'}"
1.22      www      2913: onClick="javascript:makebulboard();" />
1.65      bowersj2 2914: $help{'Bulletin Board'}
1.58      albertel 2915: </nobr>
                   2916: </form>
1.214     www      2917: <br /><form action="/adm/coursedocs" method="post" name="newaboutme">
1.142     raeburn  2918: $uploadtag
1.256     albertel 2919: <input type="hidden" name="importdetail" 
                   2920: value="$plainname=/adm/$udom/$uname/aboutme" />
1.58      albertel 2921: <nobr>
1.81      www      2922: <input name="newaboutme" type="submit" value="$lt{'mypi'}" />
1.65      bowersj2 2923: $help{'My Personal Info'}
1.101     www      2924: </nobr>
                   2925: </form>
1.214     www      2926: <br /><form action="/adm/coursedocs" method="post" name="newaboutsomeone">
1.142     raeburn  2927: $uploadtag
1.256     albertel 2928: <input type="hidden" name="importdetail" value="" />
1.101     www      2929: <nobr>
                   2930: <input name="newaboutsomeone" type="button" value="$lt{'abou'}" 
                   2931: onClick="javascript:makeabout();" />
1.110     raeburn  2932: </nobr>
1.182     albertel 2933: </form>
1.255     raeburn  2934: <br /><form action="/adm/coursedocs" method="post" name="newgroupfiles">
                   2935: $uploadtag
1.256     albertel 2936: <input type="hidden" name="importdetail"
                   2937: value="Group Files=/adm/$coursedom/$coursenum/aboutme" />
1.255     raeburn  2938: <nobr>
                   2939: <input name="newgroupfiles" type="submit" value="$lt{'grpo'}" />
                   2940: $help{'Group Files'}
                   2941: </nobr>
                   2942: </form>
1.142     raeburn  2943: ENDFORM
                   2944:        }
1.174     albertel 2945:        if ($env{'form.pagepath'}) {
1.142     raeburn  2946:            $r->print(<<ENDBLOCK);
                   2947: <form action="/adm/coursedocs" method="post" name="newsmpproblem">
                   2948: $uploadtag
1.256     albertel 2949: <input type="hidden" name="importdetail" value="" />
1.142     raeburn  2950: <nobr>
                   2951: <input name="newsmpproblem" type="button" value="$lt{'sipr'}"
                   2952: onClick="javascript:makesmpproblem();" />$help{'Simple Problem'}
                   2953: </nobr>
                   2954: </form>
1.214     www      2955: <br /><form action="/adm/coursedocs" method="post" name="newexamupload">
1.142     raeburn  2956: $uploadtag
1.256     albertel 2957: <input type="hidden" name="importdetail" value="" />
1.142     raeburn  2958: <nobr>
                   2959: <input name="newexamupload" type="button" value="$lt{'scuf'}"
                   2960: onClick="javascript:makeexamupload();" />
                   2961: $help{'Score_Upload_Form'}
                   2962: </nobr>
1.182     albertel 2963: </form>
1.142     raeburn  2964: ENDBLOCK
                   2965:        }
                   2966:        $r->print('</td></tr>'."\n".
                   2967: '</table>');
1.24      www      2968:        $r->print('</td></tr>');
1.7       www      2969:     }
                   2970: # ----------------------------------------------------- Supplemental documents
                   2971:     if (!$forcestandard) {
1.116     albertel 2972:        $r->print('<tr><td bgcolor="#BBBBBB">');
                   2973: # '<h2>'.&mt('Supplemental Course Documents').
                   2974: #  ($allowed?' '.$help{'Supplemental'}:'').'</h2>');
1.174     albertel 2975:        my $folder=$env{'form.folder'};
1.117     albertel 2976:        unless ($folder=~/^supplemental/) {
1.116     albertel 2977: 	   $folder='supplemental';
1.117     albertel 2978:        }
                   2979:        if ($folder =~ /^supplemental$/ &&
1.174     albertel 2980: 	   $env{'form.folderpath'} =~ /^default\&/) {
                   2981: 	   $env{'form.folderpath'}='supplemental&'.
1.230     albertel 2982: 	       &escape(&mt('Supplemental '.$type.' Documents'));
1.116     albertel 2983:        }
1.7       www      2984:        &editor($r,$coursenum,$coursedom,$folder,$allowed);
1.8       www      2985:        if ($allowed) {
1.17      www      2986:        my $folderseq=
                   2987:                   '/uploaded/'.$coursedom.'/'.$coursenum.'/supplemental_'.time.
                   2988:                      '.sequence';
                   2989: 
1.8       www      2990:           $r->print(<<ENDSUPFORM);
1.43      www      2991: <table cellspacing=4 cellpadding=4><tr>
1.81      www      2992: <th bgcolor="#DDDDDD">$lt{'upls'}</th>
                   2993: <th bgcolor="#DDDDDD">$lt{'spec'}</th>
1.17      www      2994: </tr>
                   2995: <tr><td bgcolor="#DDDDDD">
1.10      www      2996: <form action="/adm/coursedocs" method="post" enctype="multipart/form-data">
1.59      www      2997: <input type="file" name="uploaddoc" size="40">
1.196     raeburn  2998: <br />
                   2999: <br />
                   3000: <nobr>
                   3001: <label>$lt{'parse'}?
                   3002: <input type="checkbox" name="parserflag" />
                   3003: </label>
                   3004: </nobr>
                   3005: <br /><br />
                   3006: $lt{'comment'}:<br />
1.4       www      3007: <textarea cols=50 rows=4 name='comment'>
                   3008: </textarea>
1.115     albertel 3009: <br />
1.174     albertel 3010: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
1.10      www      3011: <input type="hidden" name="cmd" value="upload_supplemental">
1.58      albertel 3012: <nobr>
1.81      www      3013: <input type="submit" value="$lt{'upld'}">
1.58      albertel 3014:  $help{'Uploading_From_Harddrive'}
                   3015: </nobr>
                   3016: </form>
1.17      www      3017: </td>
                   3018: <td bgcolor="#DDDDDD">
1.18      www      3019: <form action="/adm/coursedocs" method="post" name="supnewfolder">
1.174     albertel 3020: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
1.256     albertel 3021: <input type="hidden" name="importdetail" value="" />
1.58      albertel 3022: <nobr>
1.17      www      3023: <input name="newfolder" type="button"
                   3024: onClick="javascript:makenewfolder(this.form,'$folderseq');"
1.81      www      3025: value="$lt{'newf'}" /> $help{'Adding_Folders'}
1.58      albertel 3026: </nobr>
1.17      www      3027: </form>
1.214     www      3028: <br /><form action="/adm/coursedocs" method="post" name="supnewext">
1.174     albertel 3029: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
1.256     albertel 3030: <input type="hidden" name="importdetail" value="" />
1.58      albertel 3031: <nobr>
1.18      www      3032: <input name="newext" type="button" 
                   3033: onClick="javascript:makenewext('supnewext');"
1.81      www      3034: value="$lt{'extr'}" /> $help{'Adding_External_Resource'}
1.58      albertel 3035: </nobr>
1.17      www      3036: </form>
1.214     www      3037: <br /><form action="/adm/coursedocs" method="post" name="supnewsyl">
1.174     albertel 3038: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
1.256     albertel 3039: <input type="hidden" name="importdetail" 
                   3040: value="Syllabus=/public/$coursedom/$coursenum/syllabus" />
1.58      albertel 3041: <nobr>
1.81      www      3042: <input name="newsyl" type="submit" value="$lt{'syll'}" />
1.65      bowersj2 3043: $help{'Syllabus'}
1.58      albertel 3044: </nobr>
                   3045: </form>
1.214     www      3046: <br /><form action="/adm/coursedocs" method="post" name="subnewaboutme">
1.174     albertel 3047: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
1.256     albertel 3048: <input type="hidden" name="importdetail" 
                   3049: value="$plainname=/adm/$udom/$uname/aboutme" />
1.58      albertel 3050: <nobr>
1.81      www      3051: <input name="newaboutme" type="submit" value="$lt{'mypi'}" />
1.65      bowersj2 3052: $help{'My Personal Info'}
1.58      albertel 3053: </nobr>
                   3054: </form>
1.17      www      3055: </td></tr>
1.24      www      3056: </table></td></tr>
1.8       www      3057: ENDSUPFORM
                   3058:        }
1.7       www      3059:     }
1.18      www      3060:     if ($allowed) {
1.182     albertel 3061: 	$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      3062:     }
1.24      www      3063:     $r->print('</table>');
1.19      www      3064:   } else {
1.188     raeburn  3065:       unless ($upload_result eq 'phasetwo') {
1.19      www      3066: # -------------------------------------------------------- This is showdoc mode
1.188     raeburn  3067:           $r->print("<h1>".&mt('Uploaded Document').' - '.
1.141     albertel 3068: 		&Apache::lonnet::gettitle($r->uri).'</h1><p>'.
1.81      www      3069: &mt('It is recommended that you use an up-to-date virus scanner before handling this file.')."</p><p><table>".
1.188     raeburn  3070:           &entryline(0,&mt("Click to download or use your browser's Save Link function"),$showdoc).'</table></p>');
                   3071:       }
1.19      www      3072:   }
1.26      www      3073:  }
1.224     albertel 3074:  $r->print(&Apache::loncommon::end_page());
1.26      www      3075:  return OK;
1.1       www      3076: } 
                   3077: 
1.224     albertel 3078: 
                   3079: sub editing_js {
                   3080:     my ($udom,$uname) = @_;
                   3081:     my $now = time();
                   3082: 
                   3083:     return <<ENDNEWSCRIPT;
                   3084: function makenewfolder(targetform,folderseq) {
                   3085:     var foldername=prompt('Name of New Folder','New Folder');
                   3086:     if (foldername) {
1.236     albertel 3087:        targetform.importdetail.value=escape(foldername)+"="+folderseq;
1.224     albertel 3088:         targetform.submit();
                   3089:     }
                   3090: }
                   3091: 
                   3092: function makenewpage(targetform,folderseq) {
                   3093:     var pagename=prompt('Name of New Page','New Page');
                   3094:     if (pagename) {
1.236     albertel 3095:         targetform.importdetail.value=escape(pagename)+"="+folderseq;
1.224     albertel 3096:         targetform.submit();
                   3097:     }
                   3098: }
                   3099: 
                   3100: function makenewext(targetname) {
                   3101:     this.document.forms.extimport.useform.value=targetname;
                   3102:     window.open('/adm/rat/extpickframe.html');
                   3103: }
                   3104: 
                   3105: function makeexamupload() {
                   3106:    var title=prompt('Listed Title for the Uploaded Score');
                   3107:    if (title) { 
                   3108:     this.document.forms.newexamupload.importdetail.value=
1.236     albertel 3109: 	escape(title)+'=/res/lib/templates/examupload.problem';
1.224     albertel 3110:     this.document.forms.newexamupload.submit();
                   3111:    }
                   3112: }
                   3113: 
                   3114: function makesmppage() {
                   3115:    var title=prompt('Listed Title for the Page');
                   3116:    if (title) { 
                   3117:     this.document.forms.newsmppg.importdetail.value=
1.236     albertel 3118: 	escape(title)+'=/adm/$udom/$uname/$now/smppg';
1.224     albertel 3119:     this.document.forms.newsmppg.submit();
                   3120:    }
                   3121: }
                   3122: 
                   3123: function makesmpproblem() {
                   3124:    var title=prompt('Listed Title for the Problem');
                   3125:    if (title) { 
                   3126:     this.document.forms.newsmpproblem.importdetail.value=
1.236     albertel 3127: 	escape(title)+'=/res/lib/templates/simpleproblem.problem';
1.224     albertel 3128:     this.document.forms.newsmpproblem.submit();
                   3129:    }
                   3130: }
                   3131: 
                   3132: function makedropbox() {
                   3133:    var title=prompt('Listed Title for the Drop Box');
                   3134:    if (title) { 
                   3135:     this.document.forms.newdropbox.importdetail.value=
1.236     albertel 3136:         escape(title)+'=/res/lib/templates/DropBox.problem';
1.224     albertel 3137:     this.document.forms.newdropbox.submit();
                   3138:    }
                   3139: }
                   3140: 
                   3141: function makebulboard() {
                   3142:    var title=prompt('Listed Title for the Bulletin Board');
                   3143:    if (title) {
                   3144:     this.document.forms.newbul.importdetail.value=
1.236     albertel 3145: 	escape(title)+'=/adm/$udom/$uname/$now/bulletinboard';
1.224     albertel 3146:     this.document.forms.newbul.submit();
                   3147:    }
                   3148: }
                   3149: 
                   3150: function makeabout() {
1.236     albertel 3151:    var user=prompt("Enter user:domain for User's 'About Me' Page");
1.224     albertel 3152:    if (user) {
                   3153:        var comp=new Array();
1.236     albertel 3154:        comp=user.split(':');
1.224     albertel 3155:        if ((typeof(comp[0])!=undefined) && (typeof(comp[1])!=undefined)) {
                   3156: 	   if ((comp[0]) && (comp[1])) {
                   3157: 	       this.document.forms.newaboutsomeone.importdetail.value=
1.236     albertel 3158: 		   'About '+escape(user)+'=/adm/'+comp[1]+'/'+comp[0]+'/aboutme';
1.224     albertel 3159: 	       this.document.forms.newaboutsomeone.submit();
                   3160: 	   } else {
1.236     albertel 3161:                alert("Not a valid user:domain");
1.224     albertel 3162:            }
                   3163:        } else {
1.236     albertel 3164:            alert("Please enter both user and domain in the format user:domain"); 
1.224     albertel 3165:        }
                   3166:    }
                   3167: }
                   3168: 
                   3169: function makeims() {
                   3170:     var caller = document.forms.ims.folder.value;
                   3171:     var newlocation = "/adm/imsimportdocs?folder="+caller+"&phase=one";
                   3172:     newWindow = window.open("","IMSimport","HEIGHT=700,WIDTH=750,scrollbars=yes");
                   3173:     newWindow.location.href = newlocation;
                   3174: }
                   3175: 
                   3176: 
                   3177: function finishpick() {
                   3178:     var title=this.document.forms.extimport.title.value;
                   3179:     var url=this.document.forms.extimport.url.value;
                   3180:     var form=this.document.forms.extimport.useform.value;
                   3181:     eval
                   3182:      ('this.document.forms.'+form+'.importdetail.value="'+title+'='+url+
                   3183:     '";this.document.forms.'+form+'.submit();');
                   3184: }
                   3185: 
                   3186: function changename(folderpath,index,oldtitle,container,pagesymb) {
                   3187:     var title=prompt('New Title',oldtitle);
                   3188:     if (title) {
                   3189: 	this.document.forms.renameform.title.value=title;
                   3190: 	this.document.forms.renameform.cmd.value='rename_'+index;
                   3191:         if (container == 'sequence') {
                   3192: 	    this.document.forms.renameform.folderpath.value=folderpath;
                   3193:         }
                   3194:         if (container == 'page') {
                   3195:             this.document.forms.renameform.pagepath.value=folderpath;
                   3196:             this.document.forms.renameform.pagesymb.value=pagesymb;
                   3197:         }
                   3198:         this.document.forms.renameform.submit();
                   3199:     }
                   3200: }
                   3201: 
                   3202: function removeres(folderpath,index,oldtitle,container,pagesymb) {
                   3203:     if (confirm('WARNING: Removing a resource makes associated grades and scores inaccessible!\\nRemove "'+oldtitle+'"?')) {
                   3204: 	this.document.forms.renameform.cmd.value='del_'+index;
                   3205:         if (container == 'sequence') {
                   3206:             this.document.forms.renameform.folderpath.value=folderpath;
                   3207:         }
                   3208:         if (container == 'page') {
                   3209:             this.document.forms.renameform.pagepath.value=folderpath;
                   3210:             this.document.forms.renameform.pagesymb.value=pagesymb;
                   3211:         }
                   3212:         this.document.forms.renameform.submit();
                   3213:     }
                   3214: }
                   3215: 
                   3216: function cutres(folderpath,index,oldtitle,container,pagesymb) {
                   3217:     if (confirm('WARNING: Cutting a resource makes associated grades and scores inaccessible!\\nGrades remain inaccessible if resource is pasted into another folder.\\nCut "'+oldtitle+'"?')) {
                   3218: 	this.document.forms.renameform.cmd.value='cut_'+index;
                   3219: 	this.document.forms.renameform.markcopy.value=index;
                   3220:         if (container == 'sequence') {
                   3221:             this.document.forms.renameform.folderpath.value=folderpath;
                   3222:         }
                   3223:         if (container == 'page') {
                   3224:             this.document.forms.renameform.pagepath.value=folderpath;
                   3225:             this.document.forms.renameform.pagesymb.value=pagesymb;
                   3226:         }
                   3227:         this.document.forms.renameform.submit();
                   3228:     }
                   3229: }
                   3230: 
                   3231: function markcopy(folderpath,index,oldtitle,container,pagesymb) {
                   3232:     this.document.forms.renameform.markcopy.value=index;
                   3233:     if (container == 'sequence') {
                   3234: 	this.document.forms.renameform.folderpath.value=folderpath;
                   3235:     }
                   3236:     if (container == 'page') {
                   3237: 	this.document.forms.renameform.pagepath.value=folderpath;
                   3238: 	this.document.forms.renameform.pagesymb.value=pagesymb;
                   3239:     }
                   3240:     this.document.forms.renameform.submit();
                   3241: }
                   3242: 
                   3243: ENDNEWSCRIPT
                   3244: }
1.1       www      3245: 1;
                   3246: __END__

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