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

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

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