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

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

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