version 1.529, 2015/02/22 15:23:57
|
version 1.551, 2016/12/09 20:12:09
|
Line 224 sub end_tex {
|
Line 224 sub end_tex {
|
} |
} |
|
|
sub homework_js { |
sub homework_js { |
|
my ($postsubmit,$timeout); |
|
if (($env{'request.course.id'}) && ($env{'request.state'} ne 'construct')) { |
|
my $crstype = &Apache::loncommon::course_type(); |
|
if ($crstype eq 'Community') { |
|
$crstype = 'community'; |
|
} elsif ($crstype eq 'Placement') { |
|
$crstype = 'placement'; |
|
} else { |
|
if ($env{'course.'.$env{'request.course.id'}.'.internal.coursecode'}) { |
|
$crstype = 'official'; |
|
} elsif ($env{'course.'.$env{'request.course.id'}.'.internal.textbook'}) { |
|
$crstype = 'textbook'; |
|
} else { |
|
$crstype = 'unofficial'; |
|
} |
|
} |
|
$postsubmit = $env{'course.'.$env{'request.course.id'}.'.internal.postsubmit'}; |
|
if ($postsubmit eq '') { |
|
my %domdefs = &Apache::lonnet::get_domain_defaults($env{'course.'.$env{'request.course.id'}.'.domain'}); |
|
$postsubmit = $domdefs{'postsubmit'}; |
|
unless ($postsubmit eq 'off') { |
|
$timeout = $domdefs{$crstype.'postsubtimeout'}; |
|
} |
|
} elsif ($postsubmit eq '0') { |
|
$postsubmit = 'off'; |
|
} elsif ($postsubmit eq '1') { |
|
$postsubmit = 'on'; |
|
$timeout = $env{'course.'.$env{'request.course.id'}.'.internal.postsubtimeout'}; |
|
if ($timeout eq '') { |
|
my %domdefs = &Apache::lonnet::get_domain_defaults($env{'course.'.$env{'request.course.id'}.'.domain'}); |
|
$timeout = $domdefs{$crstype.'postsubtimeout'}; |
|
} |
|
} |
|
if ($timeout eq '') { |
|
$timeout = 60; |
|
} |
|
} else { |
|
my %domdefs = &Apache::lonnet::get_domain_defaults($env{'request.role.domain'}); |
|
$postsubmit = $domdefs{'postsubmit'}; |
|
unless ($postsubmit eq 'off') { |
|
$timeout = 60; |
|
} |
|
} |
|
my $jstimeout = 0; |
|
if ($timeout) { |
|
$jstimeout = 1000 * $timeout; |
|
} |
return &Apache::loncommon::resize_textarea_js(). |
return &Apache::loncommon::resize_textarea_js(). |
&Apache::loncommon::colorfuleditor_js(). |
&Apache::loncommon::colorfuleditor_js(). |
&setmode_javascript(). |
&setmode_javascript(). |
<<'JS'; |
<<"JS"; |
<script type="text/javascript"> |
<script type="text/javascript"> |
// <![CDATA[ |
// <![CDATA[ |
function setSubmittedPart (part,prefix) { |
function setSubmittedPart (part,prefix) { |
Line 242 function setSubmittedPart (part,prefix)
|
Line 289 function setSubmittedPart (part,prefix)
|
} |
} |
} |
} |
|
|
|
function disableAutoComplete (id) { |
|
var field = document.getElementById(id); |
|
if (field != null && field != undefined){ |
|
if ('autocomplete' in field) { |
|
field.autocomplete = "off"; |
|
} else { |
|
field.setAttribute("autocomplete", "off"); |
|
} |
|
} |
|
} |
|
|
function image_response_click (which, e) { |
function image_response_click (which, e) { |
init_geometry(); |
init_geometry(); |
if (!e) { e = window.event; } //IE |
if (!e) { e = window.event; } //IE |
Line 258 function image_response_click (which, e)
|
Line 316 function image_response_click (which, e)
|
|
|
var submithandled = 0; |
var submithandled = 0; |
var keypresshandled = 0; |
var keypresshandled = 0; |
|
var postsubmit = '$postsubmit'; |
|
|
$(document).ready(function(){ |
\$(document).ready(function(){ |
|
if (postsubmit != 'off') { |
$(document).keypress(function(event){ |
\$(document).keypress(function(event){ |
var keycode = (event.keyCode ? event.keyCode : event.which); |
var keycode = (event.keyCode ? event.keyCode : event.which); |
if ((keycode == '13') && (keypresshandled == 0)) { |
if ((keycode == '13') && (keypresshandled == 0)) { |
if ( $( document.activeElement ).hasClass("LC_textline") ) { |
if ( \$( document.activeElement ).hasClass("LC_textline") ) { |
keypresshandled = 1; |
keypresshandled = 1; |
var idsArray = $( document.activeElement ).attr("id").split(/HWVAL_/); |
var idsArray = \$( document.activeElement ).attr("id").split(/HWVAL_/); |
if (idsArray.length) { |
if (idsArray.length) { |
event.preventDefault(); |
event.preventDefault(); |
var itemsArray = idsArray[1].split(/_/); |
var itemsArray = idsArray[1].split(/_/); |
var buttonId = idsArray[0]+'submit_'+itemsArray[0]; |
var buttonId = idsArray[0]+'submit_'+itemsArray[0]; |
$("#"+buttonId).trigger("click"); |
\$("#"+buttonId).trigger("click"); |
} |
} |
} |
} |
} |
} |
}); |
}); |
|
|
$(document).delegate('form :submit', 'click', function( event ) { |
\$(document).delegate('form :submit', 'click', function( event ) { |
if ( $( this ).hasClass( "LC_hwk_submit" ) ) { |
if ( \$( this ).hasClass( "LC_hwk_submit" ) ) { |
var buttonId = this.id; |
var buttonId = this.id; |
|
var timeout = $jstimeout; |
if (submithandled == 0) { |
if (submithandled == 0) { |
submithandled = 1; |
submithandled = 1; |
$( "#msg_"+buttonId ).css({"display": "inline","background-color": "#87cefa", |
\$( "#msg_"+buttonId ).css({"display": "inline","background-color": "#87cefa", |
"color": "black","padding": "2px"}) ; |
"color": "black","padding": "2px"}) ; |
if (( $(this.form).id == "LC_page" ) && ($('input[name="all_submit"]').length )) { |
if (( \$(this.form).id == "LC_page" ) && (\$('input[name="all_submit"]').length )) { |
if (buttonId != "all_submit") { |
if (buttonId != "all_submit") { |
$( ".LC_status_"+buttonId ).hide(); |
\$( ".LC_status_"+buttonId ).hide(); |
if (( "#"+buttonId+"_pressed" ).length) { |
if (( "#"+buttonId+"_pressed" ).length) { |
$( "#"+buttonId+"_pressed" ).val( "1" ); |
\$( "#"+buttonId+"_pressed" ).val( "1" ); |
} |
} |
} |
} |
} else { |
} else { |
$( ".LC_status_"+buttonId ).hide(); |
\$( ".LC_status_"+buttonId ).hide(); |
} |
} |
$(this.form).submit(); |
\$(this.form).submit(); |
$( ".LC_hwk_submit" ).prop( "disabled", true); |
\$( ".LC_hwk_submit" ).prop( "disabled", true); |
$( ".LC_textline" ).prop( "readonly", "readonly"); |
\$( ".LC_textline" ).prop( "readonly", "readonly"); |
event.preventDefault(); |
event.preventDefault(); |
|
|
|
if (timeout > 0) { |
|
setTimeout(function(){ |
|
\$( "#msg_"+buttonId ).css({"display": "none"}); |
|
if (( \$(this.form).id == "LC_page" ) && (\$('input[name="all_submit"]').length )) { |
|
if (buttonId != "all_submit") { |
|
if (( "#"+buttonId+"_pressed" ).length) { |
|
\$( "#"+buttonId+"_pressed" ).val( "" ); |
|
} |
|
} |
|
} |
|
\$( ".LC_hwk_submit" ).prop( "disabled", false); |
|
\$( ".LC_textline" ).prop( "readonly", false); |
|
submithandled = 0; |
|
keypresshandled = 0; |
|
}, timeout); |
|
} |
return true; |
return true; |
} |
} |
} |
} |
}); |
}); |
|
} |
}); |
}); |
|
|
// ]]> |
// ]]> |
Line 341 sub page_start {
|
Line 419 sub page_start {
|
$extra_head .= &homework_js(). |
$extra_head .= &homework_js(). |
&Apache::lonhtmlcommon::dragmath_js("EditMathPopup"); |
&Apache::lonhtmlcommon::dragmath_js("EditMathPopup"); |
if (&Apache::lonhtmlcommon::htmlareabrowser()) { |
if (&Apache::lonhtmlcommon::htmlareabrowser()) { |
my %textarea_args = ( |
my %textarea_args; |
|
if (($env{'request.state'} ne 'construct') || |
|
($env{'environment.nocodemirror'})) { |
|
%textarea_args = ( |
dragmath => 'math', |
dragmath => 'math', |
); |
); |
|
} |
$extra_head .= &Apache::lonhtmlcommon::htmlareaselectactive(\%textarea_args); |
$extra_head .= &Apache::lonhtmlcommon::htmlareaselectactive(\%textarea_args); |
} |
} |
my $is_task = ($env{'request.uri'} =~ /\.task$/); |
my $is_task = ($env{'request.uri'} =~ /\.task$/); |
Line 414 sub page_start {
|
Line 496 sub page_start {
|
} |
} |
} |
} |
if ($needs_upload) { |
if ($needs_upload) { |
$extra_head .= &Apache::lonhtmlcommon::file_submissionchk_js(); |
$extra_head .= &Apache::lonhtmlcommon::file_submissionchk_js() |
|
.'<script type="text/javascript" |
|
src="/res/adm/includes/file_upload.js"></script>'; |
} |
} |
} |
} |
|
|
Line 445 sub page_start {
|
Line 529 sub page_start {
|
} elsif (!defined($found{'body'}) |
} elsif (!defined($found{'body'}) |
&& $env{'request.state'} eq 'construct') { |
&& $env{'request.state'} eq 'construct') { |
if ($target eq 'web' || $target eq 'edit') { |
if ($target eq 'web' || $target eq 'edit') { |
# Breadcrumbs for Authoring Space |
unless ($env{'form.inhibitmenu'} eq 'yes') { |
&Apache::lonhtmlcommon::clear_breadcrumbs(); |
# Breadcrumbs for Authoring Space |
&Apache::lonhtmlcommon::add_breadcrumb({ |
&Apache::lonhtmlcommon::clear_breadcrumbs(); |
'text' => 'Authoring Space', |
&Apache::lonhtmlcommon::add_breadcrumb({ |
'href' => &Apache::loncommon::authorspace($env{'request.uri'}), |
'text' => 'Authoring Space', |
}); |
'href' => &Apache::loncommon::authorspace($env{'request.uri'}), |
# breadcrumbs (and tools) will be created |
}); |
# in start_page->bodytag->innerregister |
# breadcrumbs (and tools) will be created |
|
# in start_page->bodytag->innerregister |
|
|
# FIXME Where are we? |
# FIXME Where are we? |
# &Apache::lonhtmlcommon::add_breadcrumb({ |
# &Apache::lonhtmlcommon::add_breadcrumb({ |
# 'text' => 'Problem Editing', # 'Problem Testing' |
# 'text' => 'Problem Editing', # 'Problem Testing' |
# 'href' => '', |
# 'href' => '', |
# }); |
# }); |
$pageheader =&Apache::loncommon::head_subbox( |
$pageheader = &Apache::loncommon::head_subbox( |
&Apache::loncommon::CSTR_pageheader()); |
&Apache::loncommon::CSTR_pageheader()); |
} |
} |
|
} |
} elsif (!defined($found{'body'})) { |
} elsif (!defined($found{'body'})) { |
my %add_entries; |
my %add_entries; |
my $background=&Apache::lonxml::get_param('background',$parstack, |
my $background=&Apache::lonxml::get_param('background',$parstack, |
Line 590 sub setup_rndseed {
|
Line 676 sub setup_rndseed {
|
} |
} |
$env{'form.'.$Apache::inputtags::part.'.rndseed'}=$rndseed; |
$env{'form.'.$Apache::inputtags::part.'.rndseed'}=$rndseed; |
} |
} |
if ( ($env{'form.resetdata'} eq &mt('New Problem Variation') |
if ( ($env{'form.resetdata'} eq 'new_problem_variation' |
&& $env{'form.submitted'} eq 'yes') || |
&& $env{'form.submitted'} eq 'yes') || |
$env{'form.newrandomization'} eq &mt('New Randomization')) { |
$env{'form.newrandomization'} eq &mt('New Randomization')) { |
srand(time); |
srand(time); |
Line 676 sub problem_edit_action_button {
|
Line 762 sub problem_edit_action_button {
|
|
|
sub problem_edit_buttons { |
sub problem_edit_buttons { |
my ($mode)=@_; |
my ($mode)=@_; |
|
# Buttons that save |
|
my $result = '<div style="float:right">'; |
|
if ($mode eq 'editxml') { |
|
$result.=&problem_edit_action_button('subsaveedit','saveeditxml','s','Save and EditXML'); |
|
$result.=&problem_edit_action_button('subsaveview','saveviewxml','v','Save and View'); |
|
} else { |
|
$result.=&problem_edit_action_button('subsaveedit','saveedit','s','Save and Edit'); |
|
$result.=&problem_edit_action_button('subsaveview','saveview','v','Save and View'); |
|
} |
|
$result.="\n</div>\n"; |
# Buttons that do not save |
# Buttons that do not save |
my $result='<div class="LC_edit_problem_discards">'. |
$result .= '<div>'. |
&problem_edit_action_button('subdiscview','discard','d','Discard Edits and View',1); |
&problem_edit_action_button('subdiscview','discard','d','Discard Edits and View',1); |
if ($mode eq 'editxml') { |
if ($mode eq 'editxml') { |
$result.=&problem_edit_action_button('subedit','edit','e','Edit',1); |
$result.=&problem_edit_action_button('subedit','edit','e','Edit',1); |
$result.=&problem_edit_action_button('subundo','undoxml','u','Undo',1); |
$result.=&problem_edit_action_button('subundo','undoxml','u','Undo',1); |
$result.=&Apache::lonhtmlcommon::dragmath_button("LC_editxmltext",1); |
if ($env{'environment.nocodemirror'}) { |
|
$result.=&Apache::lonhtmlcommon::dragmath_button("LC_editxmltext",1); |
|
} |
} else { |
} else { |
$result.=&problem_edit_action_button('subeditxml','editxml','x','EditXML',1); |
$result.=&problem_edit_action_button('subeditxml','editxml','x','EditXML',1); |
$result.=&problem_edit_action_button('subundo','undo','u','Undo',1); |
$result.=&problem_edit_action_button('subundo','undo','u','Undo',1); |
} |
} |
$result.="\n</div>"; |
$result.="\n</div>"; |
# Buttons that save |
|
$result.='<div class="LC_edit_problem_saves">'; |
|
if ($mode eq 'editxml') { |
|
$result.=&problem_edit_action_button('subsaveedit','saveeditxml','s','Save and EditXML'); |
|
$result.=&problem_edit_action_button('subsaveview','saveviewxml','v','Save and View'); |
|
} else { |
|
$result.=&problem_edit_action_button('subsaveedit','saveedit','s','Save and Edit'); |
|
$result.=&problem_edit_action_button('subsaveview','saveview','v','Save and View'); |
|
} |
|
$result.="\n</div>\n"; |
|
return $result; |
return $result; |
} |
} |
|
|
sub insert_menu_datastructure { |
|
|
|
my $template_menu = &template_dropdown_datastructure(); |
|
my $responseblock_menu = &responseblock_dropdown_datastructure(); |
|
my $conditional_scripting = &conditional_scripting_datastructure(); |
|
my $misc = &misc_datastructure(); |
|
|
|
my @menu = ($template_menu, $responseblock_menu, $conditional_scripting, $misc); |
|
return \@menu; |
|
|
|
} |
|
|
|
sub template_dropdown_datastructure { |
|
# gathering the all templates and their path, title, category and help topic |
|
my @templates = &Apache::lonhomework::get_template_list('problem'); |
|
# template category => title |
|
my %tmplthash = (); |
|
# template title => path |
|
my %tmpltcontent = (); |
|
|
|
foreach my $template (@templates){ |
|
# put in hash if the template is not empty |
|
unless ($template->[1] eq ''){ |
|
push(@{$tmplthash{$template->[2]}}, $template->[1]); |
|
push(@{$tmpltcontent{$template->[1]}},$template->[0]); |
|
} |
|
} |
|
|
|
my $catList = []; |
|
foreach my $cat (sort keys %tmplthash) { |
|
my $catItems = []; |
|
foreach my $title (sort @{$tmplthash{$cat}}) { |
|
my $path = $tmpltcontent{$title}->[0]; |
|
my $code; |
|
open(FH, "<$path"); |
|
while(<FH>){ |
|
$code.= $_ unless $_ =~ /(<problem>)|(<\/problem>)/; |
|
} |
|
close(FH); |
|
|
|
if ($code ne '') { |
|
my $href = 'javascript:insertText(\'' . &convert_for_js(&HTML::Entities::encode($code)) . '\')'; |
|
my $currItem = [$href, $title, undef]; |
|
push @{$catItems}, $currItem; |
|
} |
|
} |
|
push @{$catList}, [$catItems, $cat, undef]; |
|
} |
|
|
|
my $templDropdown = [$catList, &mt("Complete Problem Templates"), undef]; |
|
return $templDropdown; |
|
} |
|
|
|
sub responseblock_dropdown_datastructure { |
|
|
|
my $mathCat = [ |
|
[ |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_formularesponse())) . "\')", &mt("Formula Response"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_functionplotresponse())) . "\')", &mt("Function Plot Response"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_mathresponse())) . "\')", &mt("Math Response"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_numericalresponse())) . "\')", &mt("Numerical Response"), undef] |
|
], |
|
&mt("Math"), |
|
undef |
|
]; |
|
|
|
my $miscCat = [ |
|
[ |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_imageresponse())) . "\')", &mt("Click on Image"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_customresponse())) . "\')", &mt("Custom Response"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_externalresponse())) . "\')", &mt("External Response"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_matchresponse())) . "\')", &mt("Match Response"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_radiobuttonresponse())) . "\')", &mt("One out of N Statement"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_optionresponse())) . "\')", &mt("Optionresponse"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_rankresponse())) . "\')", &mt("Rank Values"), undef] |
|
], |
|
&mt("Misc"), |
|
undef |
|
]; |
|
|
|
my $chemCat = [ |
|
[ |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_reactionresponse())) . "\')", &mt("Chemical Reaction"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_organicresponse())) . "\')", &mt("Organic Structure"), undef] |
|
], |
|
&mt("Chemical"), |
|
undef |
|
]; |
|
|
|
my $textCat = [ |
|
[ |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_stringresponse())) . "\')", &mt("String Response"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_essayresponse())) . "\')", &mt("Essay"), undef] |
|
], |
|
&mt("Text"), |
|
undef |
|
]; |
|
|
|
my $cats = [[$mathCat, $miscCat, $chemCat, $textCat], &mt("Response Types"), undef]; |
|
return $cats; |
|
} |
|
|
|
|
|
sub conditional_scripting_datastructure { |
|
# TODO: corresponding routines should be used for the javascript:insertText parts |
|
# instead of the placeholder routine default_xml_tag with the tags |
|
# e.g. &default_xml_tag("postanswerdate") should be replaced with a routine which |
|
# returns the corresponding content for this case |
|
|
|
#TODO translated is currently temporarily here, another solution should be found where the |
|
# needed string can be retrieved |
|
|
|
my $translatedTag = ' |
|
<translated> |
|
<lang which="en"></lang> |
|
<lang which="default"></lang> |
|
</translated>'; |
|
|
|
my $cat = [ |
|
[ |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode($translatedTag)) . "\')", &mt("Translated Tag"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&default_xml_tag("block"))) . "\')", &mt("Conditional Block"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&default_xml_tag("postanswerdate"))) . "\')", &mt("After Answer Block"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&default_xml_tag("preduedate"))) . "\')", &mt("Before Due Date Block"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&default_xml_tag("solved"))) . "\')", &mt("Block For After Solved"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&default_xml_tag("notsolved"))) . "\')", &mt("Block For When Not Solved"), undef] |
|
], |
|
&mt("Contitional Scripting"), |
|
undef |
|
]; |
|
|
|
return $cat; |
|
} |
|
|
|
sub misc_datastructure { |
|
|
|
my $graphicalCat = [ |
|
[ |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_img())) . "\')", &mt("Image"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::lonplot::insert_gnuplot())) . "\')", &mt("GNU Plot"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_organicstructure())) . "\')", &mt("Organic Structure"), undef] |
|
], |
|
"Graphical", |
|
undef |
|
]; |
|
|
|
my $advancedCat = [ |
|
[ |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_script())) . "\')", &mt("Script Block"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&default_xml_tag("allow"))) . "\')", &mt("File Dependencies"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&default_xml_tag("import"))) . "\')", &mt("Import a File"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::londefdef::insert_meta())) . "\')", &mt("Custom Metadata"), undef] |
|
], |
|
"advanced", |
|
undef |
|
]; |
|
|
|
my $cats = [[$graphicalCat, $advancedCat], &mt("misc"), undef]; |
|
return $cats; |
|
} |
|
|
|
# helper routine for the datastructure building subroutines |
|
sub default_xml_tag { |
|
my ($tag) = @_; |
|
return "\n<$tag></$tag>"; |
|
} |
|
|
|
|
|
sub helpmenu_datastructure { |
|
|
|
my $width = 500; |
|
my $height = 600; |
|
|
|
my $helpers = [ |
|
['Problem_LON-CAPA_Functions', &mt('Script Functions')], |
|
['Greek_Symbols', &mt('Greek Symbols')], |
|
['Other_Symbols', &mt('Other Symbols')], |
|
['Authoring_Output_Tags', &mt('Output Tags')], |
|
['Authoring_Multilingual_Problems', |
|
&mt('How to create problems in different languages')] |
|
]; |
|
|
|
my $help_structure = []; |
|
|
|
foreach my $count (0..(scalar(@{$helpers})-1)) { |
|
my $filename = $helpers->[$count]->[0]; |
|
my $title = $helpers->[$count]->[1]; |
|
my $href = &HTML::Entities::encode("javascript:openMyModal('/adm/help/$filename.hlp',$width,$height,'yes');"); |
|
push @{$help_structure}, [$href, $title, undef]; |
|
} |
|
|
|
return $help_structure; |
|
} |
|
|
|
# we need substitution to not break javascript code |
|
sub convert_for_js { |
|
my $return = shift; |
|
$return =~ s|script|ESCAPEDSCRIPT|g; |
|
$return =~ s|\n|\\r\\n|g; |
|
$return =~ s|'|\\'|g; |
|
$return =~ s|'|\\'|g; |
|
return $return; |
|
} |
|
|
|
sub problem_edit_header { |
sub problem_edit_header { |
my ($mode)=@_; |
my ($mode)=@_; |
my $return = '<input type="hidden" name="submitted" value="edit" />'. |
my $return = '<input type="hidden" name="submitted" value="edit" />'. |
Line 916 sub problem_edit_header {
|
Line 800 sub problem_edit_header {
|
'<input type="hidden" name="problemmode" value="saveedit" />'. |
'<input type="hidden" name="problemmode" value="saveedit" />'. |
&problem_edit_buttons(); |
&problem_edit_buttons(); |
|
|
$return.='<hr style="clear:both;visibility:hidden;" /> |
$return .= '</div></div>' . &Apache::lonxml::message_location(); |
</div></div>' |
|
.&Apache::lonxml::message_location(); |
|
$return .= '<link rel="stylesheet" href="/adm/codemirror/codemirror-combined.css" /> |
$return .= '<link rel="stylesheet" href="/adm/codemirror/codemirror-combined.css" /> |
<script type="text/javascript" src="/adm/codemirror/codemirror-compressed-colorful.js"></script>'; |
<script type="text/javascript" src="/adm/codemirror/codemirror-compressed-colorful.js"></script>'; |
|
|
Line 931 sub problem_edit_header {
|
Line 813 sub problem_edit_header {
|
$(\'.LC_edit_actionbar\').scrollToFixed( |
$(\'.LC_edit_actionbar\').scrollToFixed( |
{ |
{ |
fixed: function(){ |
fixed: function(){ |
$(this).find(\'.LC_edit_actionbar\').css(\'height\', \'31px\'); |
//$(this).find(\'.LC_edit_actionbar\').css(\'height\', \'31px\'); |
|
$(this).find(\'.LC_edit_actionbar\'); |
} |
} |
} |
} |
); |
); |
Line 1070 $show_all
|
Line 953 $show_all
|
</div> |
</div> |
<input type="submit" name="changeproblemmode" value="'.&mt("Change View").'" /> |
<input type="submit" name="changeproblemmode" value="'.&mt("Change View").'" /> |
<input type="submit" name="clear_style_file" accesskey="d" value="'.&mt('Show Default View').'" /> |
<input type="submit" name="clear_style_file" accesskey="d" value="'.&mt('Show Default View').'" /> |
<input type="submit" name="resetdata" accesskey="r" value="'.&mt('Reset Submissions').'" /> |
<button type="submit" name="resetdata" accesskey="r" value="reset_submissions"> |
|
'.&mt('Reset Submissions').'</button> |
</div> |
</div> |
<hr /> |
<hr /> |
<div class="LC_edit_problem_header_randomize_row"> |
<div class="LC_edit_problem_header_randomize_row"> |
Line 1103 $show_all
|
Line 987 $show_all
|
'onclick="javascript:setmode(this.form,'."'edit'".')" />'; |
'onclick="javascript:setmode(this.form,'."'edit'".')" />'; |
$result .= '<input type="button" name="submitmode" accesskey="x" value="'.&mt('EditXML').'" '. |
$result .= '<input type="button" name="submitmode" accesskey="x" value="'.&mt('EditXML').'" '. |
'onclick="javascript:setmode(this.form,'."'editxml'".')" />'; |
'onclick="javascript:setmode(this.form,'."'editxml'".')" />'; |
|
if ($env{'browser.type'} ne 'explorer' || $env{'browser.version'} > 9) { |
|
my $uri = $env{'request.uri'}; |
|
my $daxeurl = '/daxepage'.$uri; |
|
$result .= '<input type="button" value="'.&mt('Edit with Daxe').'" '. |
|
'onclick="window.open(\''.$daxeurl.'\',\'_blank\');" />'; |
|
} |
$result.=' |
$result.=' |
</div> |
</div> |
<hr /> |
<hr /> |
Line 1129 sub initialize_storage {
|
Line 1019 sub initialize_storage {
|
|| $Apache::lonhomework::type eq 'practice') { |
|| $Apache::lonhomework::type eq 'practice') { |
|
|
my $namespace = $symb || $env{'request.uri'}; |
my $namespace = $symb || $env{'request.uri'}; |
if ($env{'form.resetdata'} eq &mt('Reset Submissions') || |
if ($env{'form.resetdata'} eq 'reset_submissions' || |
($env{'form.resetdata'} eq &mt('New Problem Variation') |
($env{'form.resetdata'} eq 'new_problem_variation' |
&& $env{'form.submitted'} eq 'yes') || |
&& $env{'form.submitted'} eq 'yes') || |
$env{'form.newrandomization'} eq &mt('New Randomization')) { |
$env{'form.newrandomization'} eq &mt('New Randomization')) { |
&Apache::lonnet::tmpreset($namespace,'',$domain,$name); |
&Apache::lonnet::tmpreset($namespace,'',$domain,$name); |
Line 1405 sub store_aggregates {
|
Line 1295 sub store_aggregates {
|
} else { |
} else { |
$anoncounter{$symb."\0".$part} = 1; |
$anoncounter{$symb."\0".$part} = 1; |
} |
} |
my $needsrelease = $Apache::lonnet::needsrelease{'parameter:type:'.$Apache::lonhomework::results{'resource.'.$part.'.type'}}; |
my $needsrelease = $Apache::lonnet::needsrelease{'parameter:type:'.$Apache::lonhomework::results{'resource.'.$part.'.type'}.'::'}; |
if ($needsrelease) { |
if ($needsrelease) { |
my $curr_required = $env{'course.'.$env{'request.course.id'}.'.internal.releaserequired'}; |
my $curr_required = $env{'course.'.$env{'request.course.id'}.'.internal.releaserequired'}; |
if ($curr_required eq '') { |
if ($curr_required eq '') { |
&Apache::lonnet::update_released_required($needsrelease); |
&Apache::lonnet::update_released_required($needsrelease); |
Line 1517 sub init_problem_globals {
|
Line 1407 sub init_problem_globals {
|
@Apache::inputtags::importlist = (); |
@Apache::inputtags::importlist = (); |
@Apache::inputtags::previous=(); |
@Apache::inputtags::previous=(); |
@Apache::inputtags::previous_version=(); |
@Apache::inputtags::previous_version=(); |
|
$Apache::inputtags::leniency=''; |
$Apache::structuretags::printanswer='No'; |
$Apache::structuretags::printanswer='No'; |
@Apache::structuretags::whileconds=(); |
@Apache::structuretags::whileconds=(); |
@Apache::structuretags::whilebody=(); |
@Apache::structuretags::whilebody=(); |
Line 1532 sub reset_problem_globals {
|
Line 1423 sub reset_problem_globals {
|
undef(%Apache::lonhomework::history); |
undef(%Apache::lonhomework::history); |
undef(%Apache::lonhomework::results); |
undef(%Apache::lonhomework::results); |
undef($Apache::inputtags::part); |
undef($Apache::inputtags::part); |
|
undef($Apache::inputtags::leniency); |
if ($type eq 'Task') { |
if ($type eq 'Task') { |
undef($Apache::inputtags::slot_name); |
undef($Apache::inputtags::slot_name); |
} elsif ($type eq 'problem') { |
} elsif ($type eq 'problem') { |
Line 1635 sub start_problem {
|
Line 1527 sub start_problem {
|
my $status; |
my $status; |
my $accessmsg; |
my $accessmsg; |
my $resource_due; |
my $resource_due; |
|
my $ipused; |
|
|
my $name= &get_resource_name($parstack,$safeeval); |
my $name= &get_resource_name($parstack,$safeeval); |
my ($result,$form_tag_start,$slot_name,$slot,$probpartlist); |
my ($result,$form_tag_start,$slot_name,$slot,$probpartlist); |
Line 1643 sub start_problem {
|
Line 1536 sub start_problem {
|
$target eq 'tex') { |
$target eq 'tex') { |
if ($env{'form.markaccess'}) { |
if ($env{'form.markaccess'}) { |
my @interval=&Apache::lonnet::EXT("resource.0.interval"); |
my @interval=&Apache::lonnet::EXT("resource.0.interval"); |
&Apache::lonnet::set_first_access($interval[1],$interval[0]); |
my ($timelimit) = split(/_/,$interval[0]); |
|
&Apache::lonnet::set_first_access($interval[1],$timelimit); |
} |
} |
|
|
($status,$accessmsg,$slot_name,$slot) = |
($status,$accessmsg,$slot_name,$slot,$ipused) = |
&Apache::lonhomework::check_slot_access('0','problem'); |
&Apache::lonhomework::check_slot_access('0','problem'); |
push (@Apache::inputtags::status,$status); |
push (@Apache::inputtags::status,$status); |
} |
} |
Line 1694 sub start_problem {
|
Line 1588 sub start_problem {
|
($symb eq '' || $Apache::lonhomework::type eq 'practice')) { |
($symb eq '' || $Apache::lonhomework::type eq 'practice')) { |
$form_tag_start.='<input type="hidden" name="rndseed" value="'. |
$form_tag_start.='<input type="hidden" name="rndseed" value="'. |
$rndseed.'" />'. |
$rndseed.'" />'. |
'<input type="submit" name="resetdata" |
'<button type="submit" name="resetdata" |
value="'.&mt('New Problem Variation').'" />'; |
value="new_problem_variation">'.&mt('New Problem Variation').'</button>'; |
if (exists($env{'form.username'})) { |
if (exists($env{'form.username'})) { |
$form_tag_start.= |
$form_tag_start.= |
'<input type="hidden" name="username" |
'<input type="hidden" name="username" |
Line 1717 sub start_problem {
|
Line 1611 sub start_problem {
|
$form_tag_start.='<hr />'; |
$form_tag_start.='<hr />'; |
} elsif (($env{'request.state'} ne "construct") && |
} elsif (($env{'request.state'} ne "construct") && |
($Apache::lonhomework::type eq 'randomizetry') && |
($Apache::lonhomework::type eq 'randomizetry') && |
($status eq 'CAN_ANSWER')) { |
($status eq 'CAN_ANSWER') && |
|
($env{'course.'.$env{'request.course.id'}.'.type'} ne 'Placement') && |
|
(!$env{'request.role.adv'})) { |
|
# "New Problem Variation Each Try" header suppressed for Placement Tests, unless course personnel. |
my $reqtries = &Apache::lonnet::EXT("resource.$Apache::inputtags::part.randomizeontries"); |
my $reqtries = &Apache::lonnet::EXT("resource.$Apache::inputtags::part.randomizeontries"); |
my $problemstatus = &get_problem_status($Apache::inputtags::part); |
my $problemstatus = &get_problem_status($Apache::inputtags::part); |
$form_tag_start.=&randomizetry_problem_header($problemstatus,$reqtries); |
$form_tag_start.=&randomizetry_problem_header($problemstatus,$reqtries); |
Line 1737 sub start_problem {
|
Line 1634 sub start_problem {
|
( $status eq 'NOTRESERVABLE') || |
( $status eq 'NOTRESERVABLE') || |
( $status eq 'RESERVABLE') || |
( $status eq 'RESERVABLE') || |
( $status eq 'RESERVABLE_LATER') || |
( $status eq 'RESERVABLE_LATER') || |
( $status eq 'INVALID_ACCESS')) { |
( $status eq 'INVALID_ACCESS') || |
|
( $status eq 'NEED_DIFFERENT_IP')) { |
my $bodytext=&Apache::lonxml::get_all_text("/problem",$parser, |
my $bodytext=&Apache::lonxml::get_all_text("/problem",$parser, |
$style); |
$style); |
if ( $target eq "web" ) { |
if ( $target eq "web" ) { |
Line 1770 sub start_problem {
|
Line 1668 sub start_problem {
|
&Apache::lonnavmaps::timeToHumanString($accessmsg,'start')); |
&Apache::lonnavmaps::timeToHumanString($accessmsg,'start')); |
} elsif ($status eq 'NOTRESERVABLE') { |
} elsif ($status eq 'NOTRESERVABLE') { |
$msg.=&mt('Not available to make a reservation.'); |
$msg.=&mt('Not available to make a reservation.'); |
} |
} elsif ($status eq 'NEED_DIFFERENT_IP') { |
|
if ($ipused) { |
|
$msg.=&mt('You must use the same computer ([_1]) you used when you first accessed this resource using your time/place-based reservation.',"IP: $ipused"); |
|
} else { |
|
$msg.=&mt('Each student must use a different computer to access this resource at this time and/or place.').'<br />'. |
|
&mt('Somebody else has already used this particular computer for that purpose.'); |
|
} |
|
} |
$result.=$msg.'<br />'; |
$result.=$msg.'<br />'; |
} elsif ($target eq 'tex') { |
} elsif ($target eq 'tex') { |
my $startminipage = ($env{'form.problem_split'}=~/yes/i)? '' |
my $startminipage = ($env{'form.problem_split'}=~/yes/i)? '' |
Line 1790 sub start_problem {
|
Line 1695 sub start_problem {
|
$result .= |
$result .= |
&Apache::bridgetask::proctor_validation_screen($slot); |
&Apache::bridgetask::proctor_validation_screen($slot); |
} elsif ($target eq 'grade') { |
} elsif ($target eq 'grade') { |
&Apache::bridgetask::proctor_check_auth($slot_name,$slot, |
my $checkinresult = &Apache::bridgetask::proctor_check_auth($slot_name,$slot, |
'problem'); |
'problem'); |
|
if ($checkinresult = /^error:/) { |
|
$result .= 'error'; |
|
} |
} |
} |
} elsif ($target eq 'web') { |
} elsif ($target eq 'web') { |
if ($status eq 'CAN_ANSWER') { |
if ($status eq 'CAN_ANSWER') { |
Line 1801 sub start_problem {
|
Line 1709 sub start_problem {
|
$Apache::lonhomework::history{'resource.0.checkedin'}; |
$Apache::lonhomework::history{'resource.0.checkedin'}; |
if ($checked_in eq '') { |
if ($checked_in eq '') { |
# unproctored slot access, self checkin |
# unproctored slot access, self checkin |
&Apache::bridgetask::check_in('problem',undef,undef, |
my $needsiptied; |
$slot_name); |
if (ref($slot)) { |
$checked_in = |
$needsiptied = $slot->{'iptied'}; |
$Apache::lonhomework::results{"resource.0.checkedin"}; |
} |
|
my $check = &Apache::bridgetask::check_in('problem',undef,undef, |
|
$slot_name,$needsiptied); |
|
if ($check =~ /^error: /) { |
|
&Apache::lonnet::logthis("Error during self-checkin of problem (symb: $env{'request.symb'}) using slot: $slot_name"); |
|
} else { |
|
$checked_in = |
|
$Apache::lonhomework::results{"resource.0.checkedin"}; |
|
} |
} |
} |
if ((ref($slot) eq 'HASH') && ($checked_in ne '')) { |
if ((ref($slot) eq 'HASH') && ($checked_in ne '')) { |
if ($slot->{'starttime'} < time()) { |
if ($slot->{'starttime'} < time()) { |
Line 1827 sub start_problem {
|
Line 1743 sub start_problem {
|
'<input type="hidden" name="submitted" value="yes" />'; |
'<input type="hidden" name="submitted" value="yes" />'; |
# create a page header and exit |
# create a page header and exit |
if ($env{'request.state'} eq "construct") { |
if ($env{'request.state'} eq "construct") { |
$result.= &problem_web_to_edit_header($env{'form.rndseed'}); |
if ($env{'form.inhibitmenu'} eq 'yes') { |
|
# error messages can be useful in any case |
|
$result.= &Apache::lonxml::message_location(); |
|
} else { |
|
$result.= &problem_web_to_edit_header($env{'form.rndseed'}); |
|
} |
if ($Apache::lonhomework::type eq 'practice') { |
if ($Apache::lonhomework::type eq 'practice') { |
$result.= '<input type="submit" name="resetdata" '. |
$result.= '<button type="submit" name="resetdata" '. |
'value="'.&mt('New Problem Variation').'" />'. |
'value="new_problem_variation">'.&mt('New Problem Variation').'</button>'. |
&practice_problem_header().'<hr />'; |
&practice_problem_header().'<hr />'; |
} |
} |
} |
} |
# if we are viewing someone else preserve that info |
# if we are viewing someone else preserve that info |
Line 2013 sub end_problem {
|
Line 1934 sub end_problem {
|
# Added separately at end of this routine, after added |
# Added separately at end of this routine, after added |
# <script></script> so document will be valid xhtml. |
# <script></script> so document will be valid xhtml. |
# |
# |
$result.= &Apache::loncommon::end_page({'discussion' => 1, |
my $showdisc = 1; |
|
if (($env{'course.'.$env{'request.course.id'}.'.type'} eq 'Placement') && |
|
(!$env{'request.role.adv'})) { |
|
# For Placement Tests footer with "Post Discussion" and "Send Feedback" links is suppressed. |
|
$showdisc = 0; |
|
my ($symb)= &Apache::lonnet::whichuser(); |
|
if ($symb) { |
|
my $navmap = Apache::lonnavmaps::navmap->new(); |
|
if (ref($navmap)) { |
|
my $hastries = &Apache::lonplacementtest::has_tries($symb,$navmap); |
|
# For Placement Tests test status is displayed if this is the last resource in the course |
|
# and there are no tries left |
|
unless ($hastries) { |
|
if (&Apache::lonplacementtest::is_lastres($symb,$navmap)) { |
|
my ($score,$incomplete) = |
|
&Apache::lonplacementtest::check_completion(undef,undef,1); |
|
if (!$incomplete) { |
|
$result .= &Apache::lonplacementtest::showresult(1,1); |
|
} elsif ($incomplete < 100) { |
|
$result.= &Apache::lonplacementtest::showincomplete($incomplete,1); |
|
} |
|
} else { |
|
# For Placement Tests score is displayed if test has just been completed |
|
my ($score,$incomplete) = &Apache::lonplacementtest::check_completion(undef,undef,1); |
|
if (!$incomplete) { |
|
$result.= &Apache::lonplacementtest::showresult(1,1); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
$result.= &Apache::loncommon::end_page({'discussion' => $showdisc, |
'notbody' => 1}); |
'notbody' => 1}); |
} elsif ($target eq 'tex') { |
} elsif ($target eq 'tex') { |
my $endminipage = ''; |
my $endminipage = ''; |
Line 2110 sub start_library {
|
Line 2063 sub start_library {
|
'<input type="hidden" name="submitted" value="yes" />'; |
'<input type="hidden" name="submitted" value="yes" />'; |
$result.=&problem_web_to_edit_header($rndseed); |
$result.=&problem_web_to_edit_header($rndseed); |
if ($Apache::lonhomework::type eq 'practice') { |
if ($Apache::lonhomework::type eq 'practice') { |
$result.= '<input type="submit" name="resetdata" '. |
$result.= '<button type="submit" name="resetdata" '. |
'value="'.&mt('New Problem Variation').'" />'. |
'value="new_problem_variation">'.&mt('New Problem Variation').'</button>'. |
&practice_problem_header().'<hr />'; |
&practice_problem_header().'<hr />'; |
} |
} |
} |
} |
return $result; |
return $result; |
Line 2735 sub start_part {
|
Line 2688 sub start_part {
|
my $id= &Apache::lonxml::get_id($parstack,$safeeval); |
my $id= &Apache::lonxml::get_id($parstack,$safeeval); |
$Apache::inputtags::part=$id; |
$Apache::inputtags::part=$id; |
push(@Apache::inputtags::partlist,$id); |
push(@Apache::inputtags::partlist,$id); |
|
$Apache::inputtags::leniency=''; |
@Apache::inputtags::response=(); |
@Apache::inputtags::response=(); |
@Apache::inputtags::previous=(); |
@Apache::inputtags::previous=(); |
@Apache::inputtags::previous_version=(); |
@Apache::inputtags::previous_version=(); |
Line 2900 sub end_part {
|
Line 2854 sub end_part {
|
} |
} |
pop @Apache::inputtags::status; |
pop @Apache::inputtags::status; |
$Apache::inputtags::part=''; |
$Apache::inputtags::part=''; |
|
$Apache::inputtags::leniency=''; |
$Apache::lonhomework::type = $Apache::lonhomework::default_type; |
$Apache::lonhomework::type = $Apache::lonhomework::default_type; |
return $result; |
return $result; |
} |
} |
Line 3055 sub end_startouttext {
|
Line 3010 sub end_startouttext {
|
.'<td><span class="LC_nobreak">'.&mt('Delete?').' ' |
.'<td><span class="LC_nobreak">'.&mt('Delete?').' ' |
.&Apache::edit::deletelist($target,$token) |
.&Apache::edit::deletelist($target,$token) |
.'</span></td>' |
.'</span></td>' |
.'<td><span id="math_'.$areaid.'">' |
.'<td><span id="math_'.$areaid.'">'; |
.&Apache::lonhtmlcommon::dragmath_button($areaid,1) |
if ($env{'environment.nocodemirror'}) { |
.'</span></td>' |
$result.=&Apache::lonhtmlcommon::dragmath_button($areaid,1); |
|
} else { |
|
$result.=' '; |
|
} |
|
$result.='</span></td>' |
.'<td>' |
.'<td>' |
.&Apache::edit::insertlist($target,$token) |
.&Apache::edit::insertlist($target,$token) |
.'</td>' |
.'</td>' |