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

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

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