--- loncom/interface/lonrequestcourse.pm	2014/05/06 20:42:27	1.80
+++ loncom/interface/lonrequestcourse.pm	2014/05/14 18:20:09	1.83
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Request a course
 #
-# $Id: lonrequestcourse.pm,v 1.80 2014/05/06 20:42:27 raeburn Exp $
+# $Id: lonrequestcourse.pm,v 1.83 2014/05/14 18:20:09 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -174,6 +174,22 @@ sub handler {
                 } else {
                     &textbook_request_disabled($r,$dom,\%can_request);
                 }
+            } elsif ($action eq 'display') {
+               my ($uname,$udom,$result,$warning) = &domcoord_display($dom);
+               if ($warning ne '') {
+                   my $args = { only_body => 1 };
+                   $r->print(&header('Course/Community Requests','','' ,'',$args).
+                             '<h3>'.&mt('Course/Community Request Details').'</h3>'.
+                             '<div class="LC_warning">'.$warning.'</div>'.
+                             &close_popup_form());
+                } else {
+                    $states{'display'} = ['details'];
+                    my $loaditems = &onload_action($action,$state);
+                    my $page = 0;
+                    &request_administration($r,$action,$state,$page,\%states,$dom,$jscript,
+                                            $loaditems,'','','','','',$showcredits,'','',
+                                            $uname,$udom);
+                }
             } else {
                 if ($can_request{'textbook'}) {
                     &print_textbook_form($r,$dom,\@incdoms,\%domdefs,$domconfig{'requestcourses'},\%can_request);
@@ -232,46 +248,7 @@ sub handler {
     my ($page,$crumb,$newinstcode,$codechk,$checkedcode,$description) =
         &get_breadcrumbs($dom,$action,\$state,\%states,\%trail);
     if ($action eq 'display') {
-        if (($dom eq $env{'request.role.domain'}) && (&Apache::lonnet::allowed('ccc',$dom))) {
-            if ($env{'form.cnum'} ne '') {
-                my $cnum = $env{'form.cnum'};
-                my $queue = $env{'form.queue'};
-                my $reqkey = $cnum.'_'.$queue;
-                my $namespace = 'courserequestqueue';
-                my $domconfig = &Apache::lonnet::get_domainconfiguser($dom);
-                my %queued =
-                    &Apache::lonnet::get($namespace,[$reqkey],$dom,$domconfig);
-                if (ref($queued{$reqkey}) eq 'HASH') {
-                    $uname = $queued{$reqkey}{'ownername'};
-                    $udom  = $queued{$reqkey}{'ownerdom'};
-                    if (($udom =~ /^$match_domain$/) && ($uname =~ /^$match_username$/)) {
-                        $result = &retrieve_settings($dom,$cnum,$udom,$uname);
-                    } else {
-                        if ($env{'form.crstype'} eq 'community') {
-                            $warning = &mt('Invalid username or domain for community requestor');
-                        } else {
-                            $warning = &mt('Invalid username or domain for course requestor');
-                        }
-                    }
-                } else {
-                    if ($env{'form.crstype'} eq 'community') {
-                        $warning = &mt('No information was found for this community request.');
-                    } else {
-                        $warning = &mt('No information was found for this course request.');
-                    }
-                }
-            } else {
-                $warning = &mt('No course request ID provided.');
-            }
-        } else {
-            if ($env{'form.crstype'} eq 'any') {
-               $warning = &mt('You do not have rights to view course or community request information.');
-            } elsif ($env{'form.crstype'} eq 'community') {
-                $warning = &mt('You do not have rights to view community request information.');
-            } else {
-                $warning = &mt('You do not have rights to view course request information.');
-            }
-        }
+        ($uname,$udom,$result,$warning) = &domcoord_display($dom);
     } elsif ((defined($state)) && (defined($action))) {
         if (($action eq 'view') && ($state eq 'details')) {
             if ((defined($env{'form.showdom'})) && (defined($env{'form.cnum'}))) {
@@ -1129,6 +1106,52 @@ END
     return;
 }
 
+sub domcoord_display {
+    my ($dom) = @_;
+    my ($uname,$udom,$result,$warning);
+    if (($dom eq $env{'request.role.domain'}) && (&Apache::lonnet::allowed('ccc',$dom))) {
+        if ($env{'form.cnum'} ne '') {
+            my $cnum = $env{'form.cnum'};
+            my $queue = $env{'form.queue'};
+            my $reqkey = $cnum.'_'.$queue;
+            my $namespace = 'courserequestqueue';
+            my $domconfig = &Apache::lonnet::get_domainconfiguser($dom);
+            my %queued =
+                &Apache::lonnet::get($namespace,[$reqkey],$dom,$domconfig);
+            if (ref($queued{$reqkey}) eq 'HASH') {
+                $uname = $queued{$reqkey}{'ownername'};
+                $udom  = $queued{$reqkey}{'ownerdom'};
+                if (($udom =~ /^$match_domain$/) && ($uname =~ /^$match_username$/)) {
+                    $result = &retrieve_settings($dom,$cnum,$udom,$uname);
+                } else {
+                    if ($env{'form.crstype'} eq 'community') {
+                        $warning = &mt('Invalid username or domain for community requestor');
+                    } else {
+                        $warning = &mt('Invalid username or domain for course requestor');
+                    }
+                }
+            } else {
+                if ($env{'form.crstype'} eq 'community') {
+                    $warning = &mt('No information was found for this community request.');
+                } else {
+                    $warning = &mt('No information was found for this course request.');
+                }
+            }
+        } else {
+            $warning = &mt('No course request ID provided.');
+        }
+    } else {
+        if ($env{'form.crstype'} eq 'any') {
+            $warning = &mt('You do not have rights to view course or community request information.');
+        } elsif ($env{'form.crstype'} eq 'community') {
+            $warning = &mt('You do not have rights to view community request information.');
+        } else {
+            $warning = &mt('You do not have rights to view course request information.');
+        }
+    }
+    return ($uname,$udom,$result,$warning);
+}
+
 sub enrollment_lcsec_js {
     my %alerts = &section_check_alerts();
     my $secname = $alerts{'badsec'};
@@ -4393,25 +4416,26 @@ sub generate_date_items {
 
 sub print_textbook_form {
     my ($r,$dom,$incdoms,$domdefs,$settings,$can_request) = @_;
-    my ($bookshash,%ordered);
+    my (%prefab,%ordered,%numprefab);
     my $crstype = 'textbook';
 #
-#  Retrieve list of textbook courses cloneable by user
+#  Retrieve list of prefabricated courses (textbook courses and templates) cloneable by user
 #
-    my $numbook = 0;
-    if (ref($settings) eq 'HASH') {
-        $bookshash = $settings->{'textbooks'};
-        if (ref($bookshash) eq 'HASH') {
-            foreach my $item (keys(%{$bookshash})) {
-                my ($clonedom,$clonecrs) = split(/_/,$item);
-                if (ref($bookshash->{$item}) eq 'HASH') {
+    foreach my $type ('textbooks','templates') {
+        $numprefab{$type} = 0;
+        if (ref($settings) eq 'HASH') {
+            $prefab{$type} = $settings->{$type};
+            if (ref($prefab{$type}) eq 'HASH') {
+                foreach my $item (keys(%{$prefab{$type}})) {
                     my ($clonedom,$clonecrs) = split(/_/,$item);
-                    if (&Apache::loncoursequeueadmin::can_clone_course($env{'user.name'},
-                                        $env{'user.domain'},$clonecrs,$clonedom,$crstype)) {
-
-                        my $num = $bookshash->{$item}{'order'};
-                        $ordered{$num} = $item;
-                        $numbook ++;
+                    if (ref($prefab{$type}{$item}) eq 'HASH') {
+                        if (&Apache::loncoursequeueadmin::can_clone_course($env{'user.name'},
+                                          $env{'user.domain'},$clonecrs,$clonedom,$crstype)) {
+
+                            my $num = $prefab{$type}{$item}{'order'};
+                            $ordered{$type}{$num} = $item;
+                            $numprefab{$type} ++;
+                        }
                     }
                 }
             }
@@ -4447,7 +4471,7 @@ sub print_textbook_form {
 
     my $numcurrent = scalar(keys(%cloneable));
 
-    my $jscript = &textbook_request_javascript($numbook,$numcurrent);
+    my $jscript = &textbook_request_javascript(\%numprefab,$numcurrent);
     my %loaditems;
     $loaditems{'onload'} = 'javascript:uncheckAllRadio();';
     $r->print(&header('Course Request',$jscript,\%loaditems));
@@ -4498,9 +4522,16 @@ sub print_textbook_form {
         $r->print('<div>'. 
                   '<fieldset><legend>'.&mt('Course Content').'</legend>');
         if (keys(%ordered)) {
-            $r->print('<span class="LC_nobreak"><label>'.
-                      '<input type="radio" name="cloning" value="textbook" onclick="javascript:cloneChoice();" />'.
-                      &mt('Load textbook content').'</span>'.('&nbsp;'x2).' ');
+            if (ref($ordered{'textbooks'}) eq 'HASH') {
+                $r->print('<span class="LC_nobreak"><label>'.
+                          '<input type="radio" name="cloning" value="textbook" onclick="javascript:cloneChoice();" />'.
+                          &mt('Load textbook content').'</span>'.('&nbsp;'x2).' ');
+            }
+            if (ref($ordered{'templates'}) eq 'HASH') {
+                $r->print('<span class="LC_nobreak"><label>'.
+                          '<input type="radio" name="cloning" value="template" onclick="javascript:cloneChoice();" />'.
+                          &mt('Load pre-existing template').'</span>'.('&nbsp;'x2).' ');
+            }
         }
         if (keys(%cloneable)) {
             $r->print('<span class="LC_nobreak"><label>'.
@@ -4518,31 +4549,51 @@ sub print_textbook_form {
 # Table of cloneable textbook courses
 #
     if (keys(%ordered)) {
-        $r->print('<div id="showtextbook" style="display:none">'.
-                  &Apache::loncommon::start_data_table().
-                  &Apache::loncommon::start_data_table_header_row().
-                  '<th>'.&mt('Title').'</th>'.
-                  '<th>'.&mt('Author(s)').'</th>'.
-                  '<th>'.&mt('Subject').'</th>'.
-                  '<th>'.&mt('Book').'</th>'.
-                  &Apache::loncommon::end_data_table_header_row());
-        my @items = sort { $a <=> $b } keys(%ordered);
-        foreach my $num (@items) {
-            my $item = $ordered{$num};
-            my $cleantitle=&HTML::Entities::encode($bookshash->{$item}->{'title'},'<>&"');
-            $cleantitle=~s/'/\\'/g;
-            $cleantitle =~ s/^\s+//;
-            $r->print(&Apache::loncommon::start_data_table_row().
-                      '<td><label><input type="radio" name="book" value="'.$item.'" />'.
-                      $cleantitle.'</label></td>'.
-                      '<td>'.$bookshash->{$item}->{'author'}.'</td>'.
-                      '<td>'.$bookshash->{$item}->{'subject'}.'</td>'.
-                      '<td><img border="0" src="'.$bookshash->{$item}->{'image'}.
-                      '" alt="'.$cleantitle.'" /></td>'. 
-                      &Apache::loncommon::end_data_table_row());
+        foreach my $type ('textbooks','templates') {
+            my $divid = 'showtextbook';
+            my $radioid = 'book';
+            if ($type eq 'templates') {
+                $divid = 'showtemplate'; 
+                $radioid = 'template';
+            }
+            if (ref($ordered{$type}) eq 'HASH') {
+                $r->print('<div id="'.$divid.'" style="display:none">'.
+                          &Apache::loncommon::start_data_table().
+                          &Apache::loncommon::start_data_table_header_row().
+                          '<th>'.&mt('Title').'</th>');
+                if ($type eq 'textbooks') {
+                    $r->print('<th>'.&mt('Author(s)').'</th>');
+                }
+                $r->print('<th>'.&mt('Subject').'</th>');
+                if ($type eq 'textbooks') {
+                    $r->print('<th>'.&mt('Publisher').'</th>'.
+                              '<th>'.&mt('Book').'</th>');
+                }
+                $r->print(&Apache::loncommon::end_data_table_header_row());
+                my @items = sort { $a <=> $b } keys(%{$ordered{$type}});
+                foreach my $num (@items) {
+                    my $item = $ordered{$type}{$num};
+                    my $cleantitle=&HTML::Entities::encode($prefab{$type}{$item}{'title'},'<>&"');
+                    $cleantitle=~s/'/\\'/g;
+                    $cleantitle =~ s/^\s+//;
+                    $r->print(&Apache::loncommon::start_data_table_row().
+                              '<td><label><input type="radio" name="'.$radioid.'" value="'.$item.'" />'.
+                              $cleantitle.'</label></td>');
+                    if ($type eq 'textbooks') {
+                         $r->print('<td>'.$prefab{$type}{$item}{'author'}.'</td>');
+                    }
+                    $r->print('<td>'.$prefab{$type}{$item}{'subject'}.'</td>');
+                    if ($type eq 'textbooks') {
+                        $r->print('<td>'.$prefab{$type}{$item}{'publisher'}.'</td>'.
+                                  '<td><img border="0" src="'.$prefab{$type}{$item}{'image'}.
+                                  '" alt="'.$cleantitle.'" /></td>');
+                    }
+                    $r->print(&Apache::loncommon::end_data_table_row());
+                }
+                $r->print(&Apache::loncommon::end_data_table().
+                          '</div>');
+            }
         }
-        $r->print(&Apache::loncommon::end_data_table().
-                  '</div>');
     }
 
 #
@@ -4710,6 +4761,8 @@ sub process_textbook_request {
     my ($clonefrom,$clonedom,$clonecrs);
     if ($reqtype eq 'textbook') {
         $clonefrom = $env{'form.book'};
+    } elsif ($reqtype eq 'template') {
+        $clonefrom = $env{'form.template'};
     } elsif ($reqtype eq 'existing') {
         $clonefrom = $env{'form.owned'};
     }
@@ -4781,21 +4834,23 @@ sub process_textbook_request {
 }
 
 sub textbook_request_javascript {
-    my ($numbook,$numcurrent) = @_;
+    my ($numprefab,$numcurrent) = @_;
+    return unless (ref($numprefab) eq 'HASH');
+    return if (!$numprefab->{'textbooks'} && !$numprefab->{'templates'} && !$numcurrent);
     my %lt = &Apache::lonlocal::texthash(
                  choose   => 'Please select a content option.',
                  textbook => 'Please select a textbook, or choose a different option.',
+                 template => 'Please select a template, or choose a different option.',        
                  existing => 'Please select one of your existing courses to copy, or choose a different option.',
                  title    => 'Please enter a course title.',
              );
-    return if (!$numbook && !$numcurrent);
     return <<"ENDSCRIPT";
 function cloneChoice() {
     if (document.requestcourse.cloning) {
         var radioLength = document.requestcourse.cloning.length;
         if (radioLength == undefined) {
             var val = document.requestcourse.cloning.value;
-            if ((val == 'textbook') || (val == 'existing')) {
+            if ((val == 'textbook') || (val == 'template') || (val == 'existing')) {
                 var elem = document.getElementById('show'+val);
                 if (document.requestcourse.cloning.checked) {
                     elem.style.display = 'block';
@@ -4807,7 +4862,7 @@ function cloneChoice() {
         } else {
             for (var i=0; i<radioLength; i++) {
                 var val = document.requestcourse.cloning[i].value;
-                if ((val == 'textbook') || (val == 'existing')) {
+                if ((val == 'textbook') || (val == 'template') || (val == 'existing')) {
                     var elem = document.getElementById('show'+val);
                     if (document.requestcourse.cloning[i].checked) {
                         elem.style.display = 'block';
@@ -4815,6 +4870,9 @@ function cloneChoice() {
                         if (val == 'textbook') {
                             uncheckRadio('book');
                         }
+                        if (val == 'template') {
+                            uncheckRadio('template');
+                        }
                         if (val == 'existing') {
                             uncheckRadio('owned');
                         }
@@ -4842,11 +4900,15 @@ function uncheckRadio(radioGroupName) {
 
 function uncheckAllRadio() {
     uncheckRadio('cloning');
-    var numbook = $numbook;
+    var numbook = $numprefab->{'textbooks'};
+    var numtemplate = $numprefab->{'templates'};
     var numcurrent = $numcurrent;
     if (numbook > 0) {
         uncheckRadio('textbook'); 
     }
+    if (nutemplate > 0) {
+        uncheckRadio('template');
+    }m
     if (numcurrent > 0) {
         uncheckRadio('existing');
     }
@@ -4877,12 +4939,16 @@ function validTextbookReq() {
             }
         }
         var group;
-        if ((cloneChoice == 'textbook') || (cloneChoice == 'existing')) {
+        if ((cloneChoice == 'textbook') || (cloneChoice == 'template') || (cloneChoice == 'existing')) {
             var group;
             if (cloneChoice == 'textbook') {
                 group = document.getElementsByName('book');
             } else {
-                group = document.getElementsByName('owned');
+                if (cloneChoice == 'template') {
+                    group = document.getElementsByName('template');
+                } else {
+                    group = document.getElementsByName('owned');
+                }
             }
             var groupLength = group.length;
             var chosen = 0;
@@ -4902,7 +4968,11 @@ function validTextbookReq() {
                if (cloneChoice == 'textbook') {
                    alert("$lt{'textbook'}");
                } else {
-                   alert("$lt{'existing'}");
+                   if (cloneChoice == 'template') {
+                       alert("$lt{'template'}");
+                   } else {
+                       alert("$lt{'existing'}");
+                   }
                }
                return false;
             }