');
+}
+
+
+
sub parmval {
my ($what,$id,$def,$uname,$udom,$csec,$cgroup,$courseopt)=@_;
return &parmval_by_symb($what,&symbcache($id),$def,$uname,$udom,$csec,
@@ -767,17 +791,7 @@ sub valout {
}
} else {
if ($type eq 'date_interval') {
- my ($totalsecs,$donesuffix) = split(/_/,$value,2);
- my ($usesdone,$donebuttontext,$proctor,$secretkey);
- if ($donesuffix =~ /^done\:([^\:]+)\:(.*)$/) {
- $donebuttontext = $1;
- (undef,$proctor,$secretkey) = split(/_/,$2);
- $usesdone = 'done';
- } elsif ($donesuffix =~ /^done(|_.+)$/) {
- $donebuttontext = &mt('Done');
- ($usesdone,$proctor,$secretkey) = split(/_/,$donesuffix);
- }
- my ($sec,$min,$hour,$mday,$mon,$year)=gmtime($totalsecs);
+ my ($sec,$min,$hour,$mday,$mon,$year)=gmtime($value);
my @timer;
$year=$year-70;
$mday--;
@@ -810,13 +824,6 @@ sub valout {
push(@timer,&mt('[quant,_1,sec]',0));
}
$result.=join(", ",@timer);
- if ($usesdone eq 'done') {
- if ($secretkey) {
- $result .= ' '.&mt('+ "[_1]" with proctor key: [_2]',$donebuttontext,$secretkey);
- } else {
- $result .= ' + "'.$donebuttontext.'"';
- }
- }
} elsif (&isdateparm($type)) {
$result = &Apache::lonlocal::locallocaltime($value).
&date_sanity_info($value);
@@ -834,12 +841,8 @@ sub plink {
my ($type,$dis,$value,$marker,$return,$call)=@_;
my $winvalue=$value;
unless ($winvalue) {
- if ((&isdateparm($type)) || (&is_specialstring($type))) {
+ if (&isdateparm($type)) {
$winvalue=$env{'form.recent_'.$type};
- } elsif ($type eq 'string_yesno') {
- if ($env{'form.recent_string'} =~ /^(yes|no)$/i) {
- $winvalue=$env{'form.recent_string'};
- }
} else {
$winvalue=$env{'form.recent_'.(split(/\_/,$type))[0]};
}
@@ -872,22 +875,20 @@ sub page_js {
$pjump_def
function psub() {
- var specstring = /^string_!(yesno|any)/i;
if (document.parmform.pres_marker.value!='') {
document.parmform.action+='#'+document.parmform.pres_marker.value;
var typedef=new Array();
typedef=document.parmform.pres_type.value.split('_');
- if (document.parmform.pres_type.value!='') {
- if ((typedef[0]=='date') ||
- (specstring.test(document.parmform.pres_type.value))) {
- eval('document.parmform.recent_'+
- document.parmform.pres_type.value+
- '.value=document.parmform.pres_value.value;');
- } else {
- eval('document.parmform.recent_'+typedef[0]+
- '.value=document.parmform.pres_value.value;');
- }
+ if (document.parmform.pres_type.value!='') {
+ if (typedef[0]=='date') {
+ eval('document.parmform.recent_'+
+ document.parmform.pres_type.value+
+ '.value=document.parmform.pres_value.value;');
+ } else {
+ eval('document.parmform.recent_'+typedef[0]+
+ '.value=document.parmform.pres_value.value;');
}
+ }
document.parmform.submit();
} else {
document.parmform.pres_value.value='';
@@ -902,7 +903,9 @@ sub page_js {
var newWin = window.open(url, wdwName, options);
newWin.focus();
}
+
// ]]>
+
$selscript
ENDJS
@@ -929,35 +932,126 @@ function showHide_courseContent() {
COURSECONTENTSCRIPT
}
+sub toggleparmtextbox_js {
+ return <<"ENDSCRIPT";
+
+if (!document.getElementsByClassName) {
+ function getElementsByClassName(node, classname) {
+ var a = [];
+ var re = new RegExp('(^| )'+classname+'( |$)');
+ var els = node.getElementsByTagName("*");
+ for(var i=0,j=els.length; i "group_or_section('cgroup')",
@@ -1048,13 +1116,14 @@ sub startpage {
';
my $start_page =
- &Apache::loncommon::start_page('Set/Modify Course Parameters',$js,
- {'add_entries' => \%loaditems,});
+ &Apache::loncommon::start_page('Set/Modify Course Parameters',$js,
+ {'add_entries' => \%loaditems,});
my $breadcrumbs =
&Apache::lonhtmlcommon::breadcrumbs('Table Mode Parameter Setting','Table_Mode');
my $escfilter=&Apache::lonhtmlcommon::entity_encode($env{'form.filter'});
my $escpart=&Apache::lonhtmlcommon::entity_encode($env{'form.part'});
$r->print($start_page.$breadcrumbs);
+ &startSettingsScreen($r,'parmset',$crstype);
$r->print(<
@@ -1069,11 +1138,11 @@ ENDHEAD
sub print_row {
my ($r,$which,$part,$name,$symbp,$rid,$default,$defaulttype,$display,$defbgone,
- $defbgtwo,$defbgthree,$parmlev,$uname,$udom,$csec,$cgroup,$usersgroups,$noeditgrp,
- $readonly)=@_;
+ $defbgtwo,$defbgthree,$parmlev,$uname,$udom,$csec,$cgroup,$usersgroups,$noeditgrp)=@_;
my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
my $courseopt=&Apache::lonnet::get_courseresdata($cnum,$cdom);
+
# get the values for the parameter in cascading order
# empty levels will remain empty
my ($result,@outpar)=&parmval($$part{$which}.'.'.$$name{$which},
@@ -1113,33 +1182,32 @@ sub print_row {
my ($othergrp,$grp_parm,$controlgrp);
if ($parmlev eq 'general') {
-
if ($uname) {
- &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);
+ &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
} elsif ($cgroup) {
- &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,$noeditgrp,$readonly);
+ &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp);
} elsif ($csec) {
- &print_td($r,9,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);
+ &print_td($r,9,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
} else {
- &print_td($r,14,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);
+ &print_td($r,14,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
}
} elsif ($parmlev eq 'map') {
if ($uname) {
- &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);
+ &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
} elsif ($cgroup) {
- &print_td($r,5,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,$noeditgrp,$readonly);
+ &print_td($r,5,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp);
} elsif ($csec) {
- &print_td($r,8,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);
+ &print_td($r,8,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
} else {
- &print_td($r,13,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);
+ &print_td($r,13,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
}
} else {
if ($uname) {
if (@{$usersgroups} > 1) {
my ($coursereply,$grp_parm,$controlgrp);
($coursereply,$othergrp,$grp_parm,$controlgrp) =
- &check_other_groups($$part{$which}.'.'.$$name{$which},
+ &print_usergroups($r,$$part{$which}.'.'.$$name{$which},
$rid,$cgroup,$defbgone,$usersgroups,$result,$courseopt);
if ($coursereply && $result > 3) {
if (defined($controlgrp)) {
@@ -1152,33 +1220,32 @@ sub print_row {
}
}
- &print_td($r,14,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);
-
- &print_td($r,13,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);
- &print_td($r,12,'#FFDDDD',$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);
- &print_td($r,11,'#FFDDDD',$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);
- &print_td($r,10,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);
-
- if ($csec) {
- &print_td($r,9,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);
- &print_td($r,8,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);
- &print_td($r,7,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);
- }
+ &print_td($r,14,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
+ &print_td($r,13,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
+ &print_td($r,12,'#FFDDDD',$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
+ &print_td($r,11,'#FFDDDD',$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
+ &print_td($r,10,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
+
+ if ($csec) {
+ &print_td($r,9,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
+ &print_td($r,8,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
+ &print_td($r,7,$defbgtwo,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
+ }
if ($cgroup) {
- &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,$noeditgrp,$readonly);
- &print_td($r,5,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,$noeditgrp,$readonly);
- &print_td($r,4,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,$noeditgrp,$readonly);
+ &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp);
+ &print_td($r,5,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp);
+ &print_td($r,4,$defbgthree,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,$noeditgrp);
}
- if ($uname) {
+ if ($uname) {
if ($othergrp) {
$r->print($othergrp);
}
- &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);
- &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);
- &print_td($r,1,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);
- }
+ &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
+ &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
+ &print_td($r,1,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display);
+ }
} # end of $parmlev if/else
$r->print('
'.$effective_parm.'
');
@@ -1197,27 +1264,25 @@ sub print_row {
}
sub print_td {
- my ($r,$which,$defbg,$result,$outpar,$mprefix,$value,$typeoutpar,$display,$noeditgrp,$readonly)=@_;
+ my ($r,$which,$defbg,$result,$outpar,$mprefix,$value,$typeoutpar,$display,$noeditgrp)=@_;
$r->print('
'."\n");
}
-sub check_other_groups {
- my ($what,$rid,$cgroup,$defbg,$usersgroups,$result,$courseopt) = @_;
+sub print_usergroups {
+ my ($r,$what,$rid,$cgroup,$defbg,$usersgroups,$result,$courseopt) = @_;
my $courseid = $env{'request.course.id'};
my $output;
my $symb = &symbcache($rid);
@@ -1246,6 +1311,7 @@ sub check_other_groups {
if (($coursereply) && ($cgroup ne $resultgroup)) {
if ($result > 3) {
$bgcolor = '#AAFFAA';
+ $grp_parm = &valout($coursereply,$resulttype);
}
$grp_parm = &valout($coursereply,$resulttype);
$output = '
';
@@ -1391,21 +1457,14 @@ sub isdateparm {
return (($type=~/^date/) && (!($type eq 'date_interval')));
}
-# Determine if parameter type is specialized string type (i.e.,
-# not just string or string_yesno.
-
-sub is_specialstring {
- my $type=shift;
- return (($type=~/^string_/) && (($type ne 'string_yesno')));
-}
-
#
# parmmenu displays a list of the selected parameters.
# It also offers a link to show/hide the complete parameter list
# from which you can select all desired parameters.
#
sub parmmenu {
- my ($r)=@_;
+ my ($r,$allparms,$pscat,$keyorder)=@_;
+ my $tempkey;
$r->print(<
// print('');
- &shortCuts($r);
+ &shortCuts($r,$allparms,$pscat,$keyorder);
$r->print('');
}
# return a hash
@@ -1548,8 +1607,8 @@ sub lookUpTableParameter {
'lenient' => 'grading',
'retrypartial' => 'tries',
'discussvote' => 'misc',
- 'examcode' => 'high_level_randomization',
- );
+ 'examcode' => 'high_level_randomization',
+ );
}
sub whatIsMyCategory {
@@ -1600,9 +1659,7 @@ sub category_order {
sub parmboxes {
my ($r,$allparms,$pscat,$keyorder)=@_;
- my $tempkey;
- my $tempparameter;
- my %categories = &categories;
+ my %categories = &categories();
my %category_order = &category_order();
my %categoryList = (
'time_settings' => [],
@@ -1617,41 +1674,35 @@ sub parmboxes {
'misc' => [],
);
- foreach $tempparameter (keys %$allparms) {
+ foreach my $tempparameter (keys(%$allparms)) {
&whatIsMyCategory($tempparameter, \%categoryList);
}
#part to print the parm-list
- $r->print('
'."\n");
-
- #Print parameters
- for my $key (sort { $category_order{$a} <=> $category_order{$b} } keys %categoryList) {
- next if(@{$categoryList{$key}} == 0);
+ foreach my $key (sort { $category_order{$a} <=> $category_order{$b} } keys(%categoryList)) {
+ next if (@{$categoryList{$key}} == 0);
+ next if ($key eq '');
$r->print('
'
- .'
'
- .&mt($categories{$key})
- .'
'."\n");
- foreach $tempkey (&keysindisplayorderCategory($categoryList{$key},$keyorder)) {
- next if ($tempkey eq '');
+ .'
');
+ '');
+ &endSettingsScreen($r);
$r->print(&Apache::loncommon::end_page());
}
@@ -4283,57 +4239,26 @@ sub date_shift_two {
my ($r) = @_;
my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
- my $sec = $env{'request.course.sec'};
+ my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'};
&Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=dateshift1&timebase='.$env{'form.timebase'},
text=>"Shifting Dates"});
my $start_page=&Apache::loncommon::start_page('Shift Dates');
my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Shift');
$r->print($start_page.$breadcrumbs);
+ &startSettingsScreen($r,'parmset',$crstype);
my $timeshifted=&Apache::lonhtmlcommon::get_date_from_form('timeshifted');
- $r->print('
'.&mt('Shift Dates').'
');
- if ($sec ne '') {
- my @groups;
- if ($env{'request.course.groups'} ne '') {
- @groups = split(/:/,$env{'request.course.groups'});
- }
- if (@groups) {
- $r->print('
'.
- &mt("Shift dates set just for your section/group(s), such that [_1] becomes [_2]",
- &Apache::lonlocal::locallocaltime($env{'form.timebase'}),
- &Apache::lonlocal::locallocaltime($timeshifted)).
- '
');
- } else {
- $r->print('
'.
- &mt("Shift dates set just for your section, such that [_1] becomes [_2]",
- &Apache::lonlocal::locallocaltime($env{'form.timebase'}),
- &Apache::lonlocal::locallocaltime($timeshifted)).
- '
');
- }
- } else {
- $r->print('
'.&mt('Shifting all dates such that [_1] becomes [_2]',
- &Apache::lonlocal::locallocaltime($env{'form.timebase'}),
- &Apache::lonlocal::locallocaltime($timeshifted)).
- '
');
- }
+ $r->print('
'.&mt('Shift Dates').'
'.
+ '
'.&mt('Shifting all dates such that [_1] becomes [_2]',
+ &Apache::lonlocal::locallocaltime($env{'form.timebase'}),
+ &Apache::lonlocal::locallocaltime($timeshifted)).'
');
my $delta=$timeshifted-$env{'form.timebase'};
- my $numchanges = 0;
- my $result = &dateshift($delta,\$numchanges);
- if ($result eq 'ok') {
- $r->print(
- &Apache::lonhtmlcommon::confirm_success(&mt('Completed shifting of [quant,_1,date setting]',
- $numchanges)));
- } elsif ($result eq 'con_delayed') {
- $r->print(
- &Apache::lonhtmlcommon::confirm_success(&mt('Queued shifting of [quant,_1,date setting]',
- $numchanges)));
- } else {
- $r->print(
- &Apache::lonhtmlcommon::confirm_success(&mt('An error occurred attempting to shift dates'),1));
- }
+ &dateshift($delta);
$r->print(
+ &Apache::lonhtmlcommon::confirm_success(&mt('Done')).
'
';
$output .= '';
- $output .= '';
+ $output .= '';
return ($output);
}
@@ -4676,6 +4570,8 @@ sub addmetafield {
$r->print(&Apache::lonhtmlcommon::breadcrumbs('Add Metadata Field'));
my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
+ my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'};
+ &startSettingsScreen($r,'parmset',$crstype);
if (exists($env{'form.undelete'})) {
my @meta_fields = &Apache::loncommon::get_env_multiple('form.undeletefield');
foreach my $meta_field(@meta_fields) {
@@ -4685,10 +4581,7 @@ sub addmetafield {
my $put_result = &Apache::lonnet::put('environment',
{'metadata.'.$meta_field.'.options'=>$options},$dom,$crs);
- $r->print(&mt('Undeleted Metadata Field [_1] with result [_2]',
- ''.$env{'course.'.$env{'request.course.id'}.'.metadata.'.$meta_field.'.added'}.
- '',$put_result).
- ' ');
+ $r->print('Undeleted Metadata Field '.$env{'course.'.$env{'request.course.id'}.'.metadata.'.$meta_field.'.added'}." with result ".$put_result.' ');
}
$r->print(&continue());
} elsif (exists($env{'form.fieldname'})) {
@@ -4700,17 +4593,12 @@ sub addmetafield {
{'metadata.'.$meta_field.'.values'=>"",
'metadata.'.$meta_field.'.added'=>"$display_field",
'metadata.'.$meta_field.'.options'=>""},$dom,$crs);
- $r->print(&mt('Added new Metadata Field [_1] with result [_2]',
- ''.$env{'form.fieldname'}.'',$put_result).
- ' ');
+ $r->print('Added new Metadata Field '.$env{'form.fieldname'}." with result ".$put_result.' ');
$r->print(&continue());
} else {
my $fields = &get_deleted_meta_fieldnames($env{'request.course.id'});
if ($fields) {
- $r->print(&mt('You may undelete previously deleted fields.').
- ' '.
- &mt('Check those you wish to undelete and click Undelete.').
- ' ');
+ $r->print('You may undelete previously deleted fields. Check those you wish to undelete and click Undelete. ');
$r->print('
');
foreach my $key(keys(%$fields)) {
$r->print(''.$$fields{$key}.' print('');
$r->print('
');
}
- $r->print(''.
- &mt('[_1]Or[_2] you may enter a new metadata field name.',
- '','').
- '
');
+ $r->print('Or you may enter a new metadata field name.
'.
+ &Apache::loncommon::end_data_table_header_row());
my $shown=0;
my $folder='';
if ($env{'form.displayfilter'} eq 'currentfolder') {
@@ -5145,12 +5029,6 @@ sub parm_change_log {
}
if ($last) { ($folder) = &Apache::lonnet::decode_symb($last); }
}
- my $numgroups = 0;
- my @groups;
- if ($env{'request.course.groups'} ne '') {
- @groups = split(/:/,$env{'request.course.groups'});
- $numgroups = scalar(@groups);
- }
foreach my $id (sort
{
if ($parmlog{$b}{'exe_time'} ne $parmlog{$a}{'exe_time'}) {
@@ -5172,8 +5050,7 @@ sub parm_change_log {
$parmlog{$id}{'exe_uname'},
$parmlog{$id}{'exe_udom'});
my $send_msg_link='';
- if ((!$readonly) &&
- (($parmlog{$id}{'exe_uname'} ne $env{'user.name'})
+ if ((($parmlog{$id}{'exe_uname'} ne $env{'user.name'})
|| ($parmlog{$id}{'exe_udom'} ne $env{'user.domain'}))) {
$send_msg_link =' '.
&Apache::loncommon::messagewrapper(&mt('Send message'),
@@ -5191,11 +5068,10 @@ sub parm_change_log {
my ($realm,$section,$parmname,$part,$what,$middle,$uname,$udom,$issection,$realmdescription)=
&components($changed,$parmlog{$id}{'uname'},$parmlog{$id}{'udom'},undef,undef,$typeflag);
if ($env{'request.course.sec'} ne '') {
- next if (($issection ne '') && (!(($issection eq $env{'request.course.sec'}) ||
- ($numgroups && (grep(/^\Q$issection\E$/,@groups))))));
+ next if (($issection ne '') && ($issection ne $env{'request.course.sec'}));
if ($uname ne '') {
my $stusection = &Apache::lonnet::getsection($uname,$udom,$env{'request.course.id'});
- next if (($stusection ne '-1') && ($stusection ne $env{'request.course.sec'}));
+ next if (($stusection ne '-1') && ($stusection ne $env{'request.course.sec'}));
}
}
if ($env{'form.displayfilter'} eq 'currentfolder') {
@@ -5251,31 +5127,27 @@ sub parm_change_log {
}
}
}
- $output .= '';
-
- unless ($readonly) {
- $output .= '
';
- if ($stillactive) {
- my $parmitem = &standard_parameter_names($parmname);
- $parmitem = &mt($parmitem);
- my $title=&mt('Changed [_1]',$parmitem);
- my $description=&mt('Changed [_1] for [_2] to [_3]',
- $parmitem,$realmdescription,
- (&isdateparm($istype{$parmname})?&Apache::lonlocal::locallocaltime($value):$value));
- if (($uname) && ($udom)) {
- $output .=
- &Apache::loncommon::messagewrapper('Notify User',
- $uname,$udom,$title,
- $description);
- } else {
- $output .=
- &Apache::lonrss::course_blog_link($id,$title,
- $description);
- }
- }
- $output .= '