package ONO::FW::Edu::Apps::Modules::NumberLine;
################################################################################
# COPYRIGHT / LICENSE #
################################################################################
#
# This file is part of the ONO Software Project.
#
# Copyright (C) 2022-2026 Jos Kirps and The Joopita Project [ASBL]
# Copyright (C) 2011-2022 Jos Kirps and Joopita Research ASBL
# Copyright (C) 2006-2011 Jos Kirps and The Joopita Project
# Copyright (C) 2001-2006 Jos Kirps and The WobbleWolf Project
#
# This file, as well as many other parts of the ONO Software Project or
# related elements, are FREE SOFTWARE available under the ARTISTIC LICENSE 2.0.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#
# For the full license, see /ono/osr/license/LICENSE.txt, or write to
# jos_AT_kirps_DOT_com or contact_AT_joopita_DOT_com.
#
################################################################################
# END OF COPYRIGHT / LICENSE, HERE COMES THE CODE ... #
################################################################################
#: This module is a front end application module wrapper that has been
#: created for the Morzino Project (morzino.com) and that has been released
#: as Open Source software.
#:
#: Note that this is NOT a self-contained application, it is only a wrapper
#: that makes heavy use of the ONO Perl Framework application engine.
use strict;
use ONO::IO;
use ONO::FW::Edu::Apps::ToolBox;
use ONO::FW::Edu::Apps::Modules::WorksheetMaker::Input;
use ONO::FW::Apps::PDF;
use ONO::FW::Apps::ToolBox;
use ONO::Lib::Image::Canvas::Draw;
use ONO::Lib::PDF::Draw;
use ONO::Lib::PDF::ToolBox;
use ONO::Lib::PDF::Elements::Ruler;
use ONO::Lib::UI::Check;
use ONO::Lib::UI::Select;
use ONO::FW::Apps::Core;
use ONO::FW::Apps::Core::Graphics;
use ONO::Lib::Parser;
sub learn {
my (
$self,
$option,
$vars_ref,
$HTTP,
$BASE,
) = @_;
################################################################
# INIT - BEGIN
################################################################
my (
$db,
$community,
$action_url,
$form,
$format,
$canvas,
$pdfkey,
$sec,$min,$hour,
$mday,$mon,$year,
$wday,$yday,$timestamp,
$lang,
$BLK_ref,
$vars_ref,
) = ONO::FW::Apps::Core->init($vars_ref);
my %vars = %$vars_ref;
my %BLK = %$BLK_ref;
my $app = "number_line";
my @txt = (
"Number line",
"number(s) on the ruler",
"write numbers",
"draw lines",
"random number box arrangement",
"colorize lines",
"unit",
"entire numbers",
"tens",
"millimeters",
);
if ($vars{'app_lang'} eq "de") {
@txt = (
"Zahlenstrahl",
"Zahl(en) auf dem Lineal",
"Zahlen schreiben",
"zeichnen / verbinden",
"Zahlenkästchen nach Zufall ordnen",
"Linien einfärben",
"Einheit",
"ganze Zahlen",
"Zehner",
"Millimeter",
);
}
if ($vars{'app_lang'} eq "lu") {
@txt = (
"Zahlenstrahl",
"Zuel(en) um Lineal",
"Zuele schreiwen",
"zeechnen / verbannen",
"Zuelekëschten no Zufall uerdnen",
"Stricher faarweg",
"Eenheet",
"ganz Zuelen",
"Zehner",
"Millimeter",
);
}
if ($vars{'app_lang'} eq "fr") {
@txt = (
"Droite numérique",
"nombre(s) sur la règle",
"écrire nombres",
"dessiner / lier",
"cases numériques aléatoirement",
"traits colorés",
"unité",
"nombres entiers",
"dixaines",
"millimètres",
);
}
ONO::FW::Apps::Core->now("",$app,$vars{'app_lang'});
my ($num_comma,$num_delimiter) = ONO::FW::Apps::Core->local_comma_delimiter(ONO::FW::Apps::Core->detect_local($vars{'app_lang'}),$vars_ref);
my $WEB;
$WEB .= ONO::FW::Apps::Core->output_paper_save($pdfkey,$BLK_ref,\%vars,$HTTP,$BASE,"$year$mon$mday");
if (ONO::FW::Apps::Core->running(\%vars,$db) || $vars{'output_web_next_question'}) {
$WEB .= ONO::FW::Apps::Core->blockbackbutton($BASE,$vars_ref);
#############################################################
# WORKSHEET MAKER
#############################################################
if ($vars{'output_worksheet_maker'}) {
$vars_ref = ONO::FW::Edu::Apps::Modules::WorksheetMaker::Input->vars(\%vars);
%vars = %$vars_ref;
}
#############################################################
# ONLINE TRAINING
#############################################################
if ($vars{'output_web'} || $vars{'output_paper'}) {
if ($vars{'app_input_comma_status'}) {
# fix comma bug in app_input_steps = tens case
$vars{'app_input_steps'} = "int_mm";
$vars_ref = \%vars;
}
my $question_number = ONO::FW::Apps::Core->question_number($vars{'output_web_question_number'});
my ($focus_on,$page,$pages,%cache,$whilecounter,$stats_switches,$PDF_OPTS);
my ($stat_correct,$stat_wrong,$stat_todo,$stat_todo_total,@pdf_items);
my $questions_per_page = 1;
if (!$vars{'app_input_exercise_draw'} && !$vars{'app_input_exercise_write'}) {
$vars{'app_input_exercise_draw'} = 1;
$vars{'app_input_exercise_write'} = 1;
}
if ($vars{'app_input_ruler_labels'} eq "") {
$vars{'app_input_ruler_labels'} = "random";
}
if ($vars{'output_paper'}) {
$PDF_OPTS = ONO::FW::Apps::Core->headers_options($BLK_ref,$vars_ref);
ONO::FW::Apps::PDF->new("$BASE/pdf/pdf-$pdfkey.pdf","",$format);
}
if ($vars{'output_paper'} || $vars{'output_worksheet_maker'}) {
if ($vars{'app_input_num_of_items_status'} == 4) {
@pdf_items = (1,1,1,1);
}
if ($vars{'app_input_num_of_items_status'} == 6) {
@pdf_items = (1,1,2,2);
}
if ($vars{'app_input_num_of_items_status'} == 7) {
@pdf_items = (1,2,2,2);
}
if ($vars{'app_input_num_of_items_status'} == 9) {
@pdf_items = (1,2,2,4);
}
if ($vars{'app_input_num_of_items_status'} == 11) {
@pdf_items = (1,2,4,4);
}
if ($vars{'app_input_num_of_items_status'} == 12) {
@pdf_items = (2,2,4,4);
}
if ($vars{'app_input_num_of_items_status'} == 14) {
@pdf_items = (2,4,4,4);
}
if ($vars{'app_input_num_of_items_status'} == 16) {
@pdf_items = (4,4,4,4);
}
$questions_per_page = 16;
}
foreach my $copy (ONO::FW::Apps::Core->unique_copies($vars{'app_input_print_options_unique_copies'})) {
my ($pdf_x,$pdf_y) = (0,0);
my (@pdf_cache,@pdf_cache_ruler_setup,$corr_counter,@corr_cache);
if ($vars{'output_paper'}) {
if ($copy > 1) {
ONO::FW::Apps::PDF->page("",$format);
}
ONO::FW::Apps::Core->headers(\%vars,$format);
ONO::FW::Apps::PDF->title($vars{'app_input_print_options_title'},$PDF_OPTS,$vars{'app_input_print_options_code'},$format);
ONO::FW::Apps::Core->unique_copies_info($canvas,$copy,$vars_ref);
ONO::FW::Apps::Core::Graphics->pdf_draw_item_numbers($canvas,-2,0,1,4,"HV",$vars_ref);
# ONO::Lib::PDF::ToolBox->canvas_test($canvas);
}
if ($vars{'output_web'}) {
if ($vars{'output_web_next_question'}) {
$vars{'output_web_question_number'}++;
$question_number++;
}
$WEB .= qq~<$form>~;
$WEB .= ONO::FW::Apps::Core->question_progress($vars{'app_input_number_of_questions'},$question_number);
# $WEB .= ONO::FW::Apps::Core->stats("",$BLK_ref,"ctmW");
if ($vars{'output_web_next_question'}) {
foreach my $key (keys %vars) {
if ($key =~ /^output_web_answer/) {
$vars{$key} = "";
}
}
}
}
if (ONO::FW::Apps::Core->question_progress_done($vars{'app_input_number_of_questions'},$question_number) || $vars{'output_web_finish'}) {
$vars{'output_progress_done'}++;
$WEB .= ONO::FW::Apps::Core->question_progress_done_msg($app,$db,$community,$form,$action_url,$vars{'app_input_number_of_questions'},$vars{'output_web_mistakes'},$lang,$BLK_ref,\%vars);
} else {
for (my $i = 0; $i < $questions_per_page; $i++) {
# output paper + web
my ($HTML_RULER,$HTML_LINES,$HTML_BOXES,$HTML_INPUT,$html_focus);
if ($vars{'output_paper'} || $vars{'output_web'}) {
my $pdf_items_use = $pdf_items[0];
if ($pdf_y > 45) {
$pdf_items_use = $pdf_items[1];
}
if ($pdf_y > 90) {
$pdf_items_use = $pdf_items[2];
}
if ($pdf_y > 135) {
$pdf_items_use = $pdf_items[3];
}
my $off_y;
my $off_y2 = 5;
# define ruler limits
my ($dim,$from,$to) = (16,0,16);
if ($pdf_items_use > 1) {
($dim,$to) = (7,7);
}
if ($vars{'output_web'}) {
($dim,$to) = (10,10);
}
my (
$start,
$step,
$nums_total,
$nums_ref,
$nums_negative,
$ruler_switches,
$ruler_force_hint,
$ruler_setup_ref,
$DEBUG,
) = &number_generator("",$dim,$pdf_items_use,$vars_ref,$num_comma);
if (ONO::IO->devstation) {
$WEB .= $DEBUG;
}
my @nums = @$nums_ref;
if ($vars{'output_web'}) {
# web input vars
if ($vars{'output_web_cache_nums_total'} && !$vars{'output_web_next_question'}) {
$start = $vars{'output_web_cache_start'};
$step = $vars{'output_web_cache_step'};
$nums_total = $vars{'output_web_cache_nums_total'};
$ruler_switches = $vars{'output_web_cache_ruler_switches'};
$ruler_force_hint = $vars{'output_web_cache_ruler_force_hint'};
}
$HTML_INPUT .= qq~<input type="hidden" name="output_web_cache_start" value="$start">
<input type="hidden" name="output_web_cache_step" value="$step">
<input type="hidden" name="output_web_cache_nums_total" value="$nums_total">
<input type="hidden" name="output_web_cache_ruler_switches" value="$ruler_switches">
<input type="hidden" name="output_web_cache_ruler_force_hint" value="$ruler_force_hint">
~;
for (my $n = 0; $n < $nums_total+1; $n++) {
if ($vars{"output_web_cache_num_$n"} ne "" && !$vars{'output_web_next_question'}) {
$nums[$n] = $vars{"output_web_cache_num_$n"};
}
$HTML_INPUT .= qq~<input type="hidden" name="output_web_cache_num_$n" value="$nums[$n]">~;
}
my %ruler_setup = %$ruler_setup_ref;
foreach my $key (keys %ruler_setup) {
if ($vars{"output_web_cache_ruler_setup_$key"} && !$vars{'output_web_next_question'}) {
$ruler_setup{$key} = $vars{"output_web_cache_ruler_setup_$key"};
}
$HTML_INPUT .= qq~<input type="hidden" name="output_web_cache_ruler_setup_$key" value="$ruler_setup{$key}">~;
$ruler_setup_ref = \%ruler_setup;
}
}
# pdf...
my ($nums_display,$nums_correct,$box_reduce,$line_y,$ruler_x,$ruler_y,$ruler_w,$ruler_h);
my $box_radius = 2;
my $spacer_rand = 6;
if ($pdf_items_use == 1 && $i%2 != 0 && $pdf_x < 50) {
$spacer_rand = 8;
$nums_display = 1;
$off_y2 = -20;
$ruler_x = $pdf_x+5;
$ruler_y = $pdf_y+4;
$ruler_w = 165;
$ruler_h = 16;
}
if ($pdf_items_use == 2 && $i%2 != 0) {
$nums_display = 1;
$off_y2 = -20;
$ruler_x = $pdf_x+5;
$ruler_y = $pdf_y+4;
$ruler_w = 80;
$ruler_h = 16;
}
if ($pdf_items_use == 4) {
$nums_display = 1;
if ($i%2 == 0) {
$off_y = 1;
$off_y2 = 0;
$line_y = 10;
} else {
$off_y2 = -1;
$line_y = 9;
}
$box_reduce = 1;
$box_radius = 1.5;
$ruler_x = $pdf_x+5;
$ruler_y = $pdf_y+13+$off_y;
$ruler_w = 80;
$ruler_h = 7;
}
if ($vars{'output_web'}) {
$spacer_rand = 8;
$line_y = 24;
}
if (($ruler_x && $ruler_y) || $vars{'output_web'}) {
if ($vars{'output_web'}) {
$ruler_switches .= "H";
($ruler_x,$ruler_y) = (0,0);
($ruler_w,$ruler_h) = (900,150);
}
my $COLOR = ONO::Lib::PDF::Elements::Ruler->ruler_random_color();
if ($vars{'output_web'}) {
if ($vars{'output_web_cache_ruler_color'} && !$vars{'output_web_next_question'}) {
$COLOR = $vars{'output_web_cache_ruler_color'};
}
$HTML_INPUT .= qq~<input type="hidden" name="output_web_cache_ruler_color" value="$COLOR">~;
}
$HTML_RULER .= ONO::Lib::PDF::Elements::Ruler->ruler($canvas,$ruler_x,$ruler_y,$ruler_w,$ruler_h,$start,$step,$COLOR,$ruler_switches,$ruler_setup_ref);
$pdf_cache[$i] = "$ruler_x\^$ruler_y\^$ruler_w\^$ruler_h\^$start\^$step\^$ruler_switches\^";
$pdf_cache_ruler_setup[$i] = $ruler_setup_ref;
}
if ($nums_display || $vars{'output_web'}) {
my $spacer = 6 + int(rand(6));
my $ruler_force_hint_num = 99;
if ($ruler_force_hint) {
$ruler_force_hint_num = int(rand($nums_total));
}
for (my $n = 0; $n < $nums_total; $n++) {
my $type = &type_generator("",$vars{'app_input_exercise_write'},$vars{'app_input_exercise_draw'});
my ($c1,$c2,$c3) = (22,22,22);
if (!$vars{'app_input_line_colors_disabled'} && ($type eq "write" || $ruler_force_hint_num == $n || $vars{'output_web'})) {
$c1 = 80 + int(rand(120));
$c2 = 80 + int(rand(120));
$c3 = 80 + int(rand(120));
}
my $COLOR = "0:$c1:$c2:$c3";
if ($vars{'output_web'}) {
if ($vars{"output_web_cache_number_color_$n"} && !$vars{'output_web_next_question'}) {
$COLOR = $vars{"output_web_cache_number_color_$n"};
}
$HTML_INPUT .= qq~<input type="hidden" name="output_web_cache_number_color_$n" value="$COLOR">~;
}
my $font_num = $nums[$n];
my $add_width;
if ($vars{'app_input_comma_status'} == 2) {
$font_num = $font_num/10;
}
if ($vars{'app_input_comma_status'} == 3) {
$font_num = $font_num/100;
}
if ($nums_negative) {
$font_num = $font_num - $start*2;
}
if ($vars{'app_lang'} ne "en") {
$font_num =~ s~\.~\,~;
}
my $font = 10;
if (length $font_num > 3) {
$add_width = 0.8;
$font = 14-((length $font_num)*0.8);
}
if ($pdf_items_use == 4) {
$font--;
}
my $box_x = $pdf_x+$spacer+9-$add_width;
my $box_y = $pdf_y+2+$off_y2;
my $box_w = $pdf_x+$spacer+19+$add_width;
my $box_h = $pdf_y+8+$off_y2-$box_reduce;
my $font_x = $pdf_x+$spacer+14;
my $font_y = $pdf_y+6.25-$box_reduce/2+$off_y2;
my $circ_x1 = $pdf_x+$spacer+14;
my $circ_y1 = $pdf_y+8-$box_reduce+$off_y2;
if ($vars{'output_web'}) {
if ($vars{"output_web_cache_number_line_$n"} && !$vars{'output_web_next_question'}) {
$circ_x1 = $vars{"output_web_cache_number_line_$n"};
}
$HTML_INPUT .= qq~<input type="hidden" name="output_web_cache_number_line_$n" value="$circ_x1">~;
}
my $circ_x2 = $pdf_x+8+$nums[$n]*10-$start*10;
my $circ_y2 = $pdf_y+4+$line_y;
my $line_1 = $pdf_y+9.1-$box_reduce+$off_y2;
my $line_2 = $pdf_y+9-$box_reduce+$off_y2;
my $line_3 = $pdf_y+3+$line_y;
my $line_4 = $pdf_y+2.9+$line_y;
if ($vars{'output_web'}) {
my $canvas2 = "0:0";
my $html_scale = 8;
my $left = $box_x*8;
if ($vars{"output_web_cache_number_left_$n"} && !$vars{'output_web_next_question'}) {
$left = $vars{"output_web_cache_number_left_$n"};
}
$HTML_INPUT .= qq~<input type="hidden" name="output_web_cache_number_left_$n" value="$left">~;
my $NUM = ONO::FW::Apps::Core->make_human_readable($font_num,$num_comma,$num_delimiter);
my $PLA;
if (ONO::IO->devstation) {
$PLA = qq~ placeholder="$NUM"~;
}
my @cp = ONO::Lib::Image::Canvas::Draw->color($COLOR);
my $RES = qq~<input id="output_web_answer_${n}_id" type="text" name="output_web_answer_${n}" value="$vars{"output_web_answer_${n}"}" class="w100 center"$PLA>~;
my $answer = $vars{"output_web_answer_${n}"};
$answer =~ s~\,~\.~g;
$answer =~ s~[^0-9\.\-]~~g;
my $answer_status = 0;
if ($answer ne "") {
$RES = qq~<div class="rel">
<input id="output_web_answer_${n}_id" type="text" name="output_web_answer_${n}" value="$vars{"output_web_answer_${n}"}" class="w100 center"$PLA>
<div class="abs" style="top:18px;right:0px"><img class="block24" src="/ono/osr/images/icons/crystal/32x32/ono/delete.png" alt="wrong"></div>
</div>
~;
if ($answer == $font_num) {
$answer_status = 1;
$nums_correct++;
$RES = qq~<div class="rel">
<div class="box_green pad10_2 bold">$NUM</div>
<div class="abs" style="top:14px;right:0px"><img class="block32" src="/ono/osr/images/icons/crystal/32x32/ono/ok.png" alt="correct"></div>
<input type="hidden" name="output_web_answer_${n}" value="$vars{"output_web_answer_${n}"}">
</div>
~;
} else {
$vars{'output_web_mistakes'}++;
$answer_status = 2;
@cp = (0,238,187,187);
}
}
if (($html_focus eq "" || $answer_status == 2) && $answer_status != 1) {
$html_focus = $n;
$RES .= qq~<script>onojs_focus('output_web_answer_${n}_id');</script>~;
}
if ($ruler_force_hint_num == $n) {
$RES = qq~$font_num~;
}
$HTML_BOXES .= qq~<div class="abs" style="bottom:0px;left:${left}px">
<div class="p10 radius10 center" style="width:70px;background-color:rgb($cp[1],$cp[2],$cp[3]);">
$RES
</div>
</div>
~;
$HTML_LINES .= ONO::Lib::Image::Canvas::Draw->circle($canvas2,$circ_x1*$html_scale,$circ_y1*$html_scale,3,0,$COLOR,$COLOR);
$HTML_LINES .= ONO::Lib::Image::Canvas::Draw->circle($canvas2,$circ_x2*$html_scale,$circ_y2*$html_scale,3,0,$COLOR,$COLOR);
$HTML_LINES .= ONO::Lib::Image::Canvas::Draw->line($canvas2,$circ_x1*$html_scale,$circ_y1*$html_scale,$circ_x1*$html_scale,$line_1*$html_scale,3,$COLOR);
$HTML_LINES .= ONO::Lib::Image::Canvas::Draw->line($canvas2,$circ_x1*$html_scale,$line_2*$html_scale,$circ_x2*$html_scale,$line_3*$html_scale,3,$COLOR);
$HTML_LINES .= ONO::Lib::Image::Canvas::Draw->line($canvas2,$circ_x2*$html_scale,$line_4*$html_scale,$circ_x2*$html_scale,$circ_y2*$html_scale,3,$COLOR);
$spacer = $spacer + 12 + int(rand($spacer_rand));
}
if ($vars{'output_paper'}) {
ONO::Lib::PDF::Draw->rect($canvas,$box_x,$box_y,$box_w,$box_h,1,$COLOR,"0:244:244:244",$box_radius);
$font_num = ONO::FW::Apps::Core->make_human_readable($font_num,$num_comma,$num_delimiter);
if ($type eq "draw" || $ruler_force_hint_num == $n) {
ONO::Lib::PDF::Draw->font("",$font);
ONO::Lib::PDF::Draw->text($canvas,$font_x,$font_y,$font_num,"c");
}
if ($type eq "write" || $ruler_force_hint_num == $n) {
ONO::Lib::PDF::Draw->circle($canvas,$circ_x1,$circ_y1,0.5,0,$COLOR,$COLOR);
ONO::Lib::PDF::Draw->circle($canvas,$circ_x2,$circ_y2,0.5,0,$COLOR,$COLOR);
ONO::Lib::PDF::Draw->line($canvas,$circ_x1,$circ_y1,$circ_x1,$line_1,1,$COLOR);
ONO::Lib::PDF::Draw->line($canvas,$circ_x1,$line_2,$circ_x2,$line_3,1,$COLOR);
ONO::Lib::PDF::Draw->line($canvas,$circ_x2,$line_4,$circ_x2,$circ_y2,1,$COLOR);
}
$corr_cache[$corr_counter] = "$box_x\^$box_y\^$box_w\^$box_h\^$box_radius\^$font\^$font_x\^$font_y\^$font_num\^";
$corr_cache[$corr_counter] .= "$circ_x1\^$circ_y1\^$circ_x2\^$circ_y2\^$line_1\^$line_2\^$line_3\^$line_4\^";
$corr_counter++;
$spacer = $spacer + 12 + int(rand($spacer_rand));
}
}
if ($vars{'output_paper'}) {
ONO::Lib::PDF::Draw->font("",12);
}
}
$pdf_y = $pdf_y + 23.75;
if ($pdf_y > 180) {
$pdf_x = $pdf_x + 85;
$pdf_y = 0;
}
if ($vars{'output_web'}) {
$HTML_LINES = ONO::Lib::Image::Canvas::Draw->canvas_render($HTML_LINES,900,300);
# if (ONO::IO->devstation) {
# $HTML_INPUT =~ s~="hidden"~="text"~g;
# }
my $BUTTON = qq~<div class="inline" style="padding-left:2px">
<input type="submit" name="submit_check" value="$BLK{'do_correct'}" class="button_green button_big">
</div>
~;
if ($nums_correct == $nums_total) {
$BUTTON = qq~<table class="default_table ml10 mr10">
<tr>
<td><img class="block32 mr5" src="/ono/osr/images/loading/wheel_32.gif" alt="please wait"></td>
<td><div class="large bold green">$BLK{'please_wait'}...</div></td>
</tr>
</table>
<input type="hidden" name="output_web_next_question" value="1">
<script>onojs_submit();</script>
~;
# <input type="hidden" name="output_web" value="1">
}
$WEB .= ONO::FW::Apps::Core->input_vars(\%vars);
my $HTML_STATS = ONO::FW::Apps::Core->stats("",$BLK_ref,"cmWT");
$WEB .= qq~$HTML_INPUT
<div class="abs" style="top:40px;left:10px;width:900px">
<div class="inline auto">$HTML_STATS</div>
</div>
<div class="abs" style="top:150px;left:10px">
<div class="rel" style="width:900px;height:320px;overflow:hidden">
<div class="abs" style="top:170px">$HTML_RULER</div>
<div class="abs" style="top:-54px;left:-40px">$HTML_LINES</div>
<div class="abs" style="top:50px;left:-45px">$HTML_BOXES</div>
<div class="abs" style="top:248px;width:900px">
<div class="inline auto">
<div class="bg_paper p10 radius32">$BUTTON</div>
</div>
</div>
</div>
</div>
~;
}
}
}
if ($vars{'output_web'}) {
$WEB .= qq~</form>~;
}
}
if (ONO::FW::Apps::Core->print_corrections("$BASE/pdf/pdf-$pdfkey-corr.pdf","",$format,$vars_ref)) {
ONO::FW::Apps::Core->headers(\%vars,$format,"c");
ONO::FW::Apps::PDF->title($BLK{'Corrections'},$PDF_OPTS,$vars{'app_input_print_options_code'},$format);
ONO::FW::Apps::Core->unique_copies_info($canvas,$copy,$vars_ref);
ONO::FW::Apps::Core::Graphics->pdf_draw_item_numbers($canvas,-2,0,1,4,"HV",$vars_ref);
# ONO::Lib::PDF::ToolBox->canvas_test($canvas);
for (my $c = 0; $c < $questions_per_page; $c++) {
my ($ruler_x,$ruler_y,$ruler_w,$ruler_h,$start,$step,$ruler_switches) = split(/\^/,$pdf_cache[$c]);
if ($ruler_x && $ruler_y) {
$ruler_switches =~ s~L~~g;
my $ruler_setup_ref = $pdf_cache_ruler_setup[$c];
ONO::Lib::PDF::Elements::Ruler->ruler($canvas,$ruler_x,$ruler_y,$ruler_w,$ruler_h,$start,$step,"","B$ruler_switches",$ruler_setup_ref);
}
}
foreach my $corr (@corr_cache) {
my (
$box_x,$box_y,$box_w,$box_h,$box_radius,$font,$font_x,$font_y,$font_num,
$circ_x1,$circ_y1,$circ_x2,$circ_y2,$line_1,$line_2,$line_3,$line_4,
) = split(/\^/,$corr);
if ($box_x && $box_y) {
my $COLOR = "0:22:22:22";
ONO::Lib::PDF::Draw->rect($canvas,$box_x,$box_y,$box_w,$box_h,1,$COLOR,"0:244:244:244",$box_radius);
ONO::Lib::PDF::Draw->font("",$font);
ONO::Lib::PDF::Draw->text($canvas,$font_x,$font_y,$font_num,"c");
ONO::Lib::PDF::Draw->circle($canvas,$circ_x1,$circ_y1,0.5,0,$COLOR,$COLOR);
ONO::Lib::PDF::Draw->circle($canvas,$circ_x2,$circ_y2,0.5,0,$COLOR,$COLOR);
ONO::Lib::PDF::Draw->line($canvas,$circ_x1,$circ_y1,$circ_x1,$line_1,1,$COLOR);
ONO::Lib::PDF::Draw->line($canvas,$circ_x1,$line_2,$circ_x2,$line_3,1,$COLOR);
ONO::Lib::PDF::Draw->line($canvas,$circ_x2,$line_4,$circ_x2,$circ_y2,1,$COLOR);
}
}
}
}
if ($vars{'output_web'}) {
$stat_correct = $question_number - 1;
$WEB = ONO::FW::Apps::Core->stats_replace($WEB,$stat_correct,$stat_wrong,$stat_todo_total,$vars{'output_web_mistakes'},$page,$pages,$vars{'output_web_completed'});
}
if ($vars{'output_paper'}) {
ONO::FW::Apps::PDF->end;
$WEB .= ONO::FW::Apps::PDF->please_wait($pdfkey,\%BLK,\%vars,"",$HTTP,$BASE);
}
}
} else {
#############################################################
# EXERCISE SETUP
#############################################################
if (!$vars{'app_input_number_of_questions'}) {
$vars{'app_input_number_of_questions'} = 20;
}
$WEB .= ONO::FW::Apps::Core->infopics(
"screen:320:50:40::number_line_screenshot_1.jpg",
"sheet:168:190:140:15:number_line_sheet_1.jpg",
"sheet:168:40:150:-10:number_line_sheet_2.jpg",
);
my %sel;
if (!$vars{'app_input_num_of_items_status'}) {
$vars{'app_input_num_of_items'} = 9;
$vars{'app_input_num_of_items_status'} = 9;
}
if (!$vars{'app_input_exercise_write'} && !$vars{'app_input_exercise_draw'}) {
$vars{'app_input_exercise_write'} = 1;
$vars{'app_input_exercise_draw'} = 1;
}
if ($vars{'output_web'}) {
$vars{'app_input_exercise_write'} = 1;
$vars{'app_input_exercise_draw'} = 0;
}
if ($vars{'app_input_steps'} eq "") {
$vars{'app_input_steps'} = "int";
}
if ($vars{'app_input_ruler_labels'} eq "") {
$vars{'app_input_ruler_labels'} = "all";
}
my (%setup,$hide);
my @tabs = ("8:green:4","6:green:6","7:green:7","9:green:9","11:green:11","12:green:12","14:green:14","16:green:16");
my $CUSTOM = ONO::Lib::UI::Select->buttons(
"app_input_num_of_items",
$vars{'app_input_num_of_items_status'},
\@tabs,
"",
"f",
$BLK_ref,
\%setup,
);
$sel{"app_input_steps_$vars{'app_input_steps'}"} = " selected";
$sel{"app_input_ruler_labels_$vars{'app_input_ruler_labels'}"} = " selected";
my $STEP = qq~<option value="int"$sel{"app_input_steps_int"}>$txt[7] (0, 1, 2, ...)</option>
<option value="int_mm"$sel{"app_input_steps_int_mm"}>$txt[7] (0, 1, 2, ...) & $txt[9]</option>
<option value="ten_mm"$sel{"app_input_steps_ten_mm"}>$txt[8] (0, 10, 20, ...) & $txt[9]</option>
~;
my $NUM = qq~<option value="all"$sel{"app_input_ruler_labels_all"}>$BLK{'all'}</option>
<option value="first"$sel{"app_input_ruler_labels_first"}>$BLK{'first'}</option>
<option value="none"$sel{"app_input_ruler_labels_none"}>$BLK{'none'}</option>
<option value="random"$sel{"app_input_ruler_labels_random"}>$BLK{'random'} (0, 1, 2 $BLK{'or'} 3)</option>
<option value="random_1"$sel{"app_input_ruler_labels_random_1"}>$BLK{'random'}: 1</option>
<option value="random_2"$sel{"app_input_ruler_labels_random_2"}>$BLK{'random'}: 2</option>
<option value="random_3"$sel{"app_input_ruler_labels_random_3"}>$BLK{'random'}: 3</option>
~;
my $CONF .= ONO::FW::Apps::ToolBox->conf_input("range", $BLK_ref,\%vars,"",0,20,9999);
$CONF .= ONO::FW::Apps::ToolBox->conf_input("negativemix", $BLK_ref,\%vars,"");
$CONF .= ONO::FW::Apps::ToolBox->conf_input("comma", $BLK_ref,\%vars,"",3);
$CONF .= ONO::FW::Apps::ToolBox->conf_input("spacer", $BLK_ref,\%vars);
$CONF .= ONO::FW::Apps::ToolBox->conf_input("custom", $BLK_ref,\%vars,"","",qq~<div class="bold">$BLK{'Exercise'}:</div>~);
if (!$vars{'output_web'}) {
$CONF .= ONO::FW::Apps::ToolBox->conf_input("check", $BLK_ref,\%vars,"S","","exercise_draw",$vars{'app_input_exercise_draw'},$txt[3]);
}
$CONF .= ONO::FW::Apps::ToolBox->conf_input("check", $BLK_ref,\%vars,"S","","exercise_write",$vars{'app_input_exercise_write'},$txt[2]);
if ($vars{'output_paper'}) {
$CONF .= ONO::FW::Apps::ToolBox->conf_input("custom", $BLK_ref,\%vars,"",$BLK{'questions'},$CUSTOM);
} else {
$CONF .= qq~<input type="hidden" name="app_input_num_of_items_status" value="$vars{"app_input_num_of_items_status"}">~;
}
$CONF .= ONO::FW::Apps::ToolBox->conf_input("spacer", $BLK_ref,\%vars);
$CONF .= ONO::FW::Apps::ToolBox->conf_input("custom", $BLK_ref,\%vars,"","",qq~<div class="bold">$BLK{'Options'}:</div>~);
$CONF .= ONO::FW::Apps::ToolBox->conf_input("custom", $BLK_ref,\%vars,"",qq~<div class="select select_small"><select name="app_input_ruler_labels">$NUM</select></div>~,$txt[1]);
$CONF .= ONO::FW::Apps::ToolBox->conf_input("custom", $BLK_ref,\%vars,"",$txt[6],qq~<div class="select select_small"><select name="app_input_steps">$STEP</select></div>~);
$CONF .= ONO::FW::Apps::ToolBox->conf_input("checkinv", $BLK_ref,\%vars,"MS","","line_colors_disabled",$vars{'app_input_line_colors_disabled'},$txt[5]);
$CONF .= ONO::FW::Apps::ToolBox->conf_input("checkinv", $BLK_ref,\%vars,"MS","","random_number_order_disable",$vars{'app_input_random_number_order_disable'},$txt[4]);
$WEB .= ONO::FW::Apps::Core->conf_box(
$db,
$community,
$app,
$form,
"",
$action_url,
$CONF,
$lang,
$BLK_ref,
\%vars,
"op-ncdi-CDI-lsu-N",
);
if (!$vars{'exercise'}) {
$WEB .= ONO::FW::Apps::Core->info_display(
ONO::FW::Apps::Core->info("info_online_print",$vars{'app_lang'}),
ONO::FW::Apps::Core->info("info_indiv_diff", $vars{'app_lang'}),
);
}
}
my ($status,$WEB) = ONO::Lib::Parser->parse($WEB,$vars_ref);
$WEB .= ONO::FW::Apps::Core->vardump($vars_ref);
$WEB = ONO::FW::Edu::Apps::ToolBox->apps_gate($WEB,$vars_ref);
return $WEB;
}
###################################################################
# SUBS
###################################################################
sub type_generator {
my $type = "write";
if ($_[2] == 1) {
$type = "draw";
if ($_[1] == 1 && int(rand(100)) > 50) {
$type = "write";
}
}
return $type;
}
sub number_generator {
my (
$self,
$dim,
$pdf_items_use,
$vars_ref,
$num_comma,
) = @_;
my %vars = %$vars_ref;
my ($DEBUG,@nums,$nums_negative,%used,$ruler_switches,$ruler_force_hint,%ruler_setup);
# set min / max
if ($vars{'app_input_range_to'} < $vars{'app_input_range_from'} + $dim) {
$vars{'app_input_range_to'} = $vars{'app_input_range_from'} + $dim;
}
my $min_number = $vars{'app_input_range_from'};
my $max_number = $vars{'app_input_range_to'} - $dim;
# start and step (case 1: step = 1)
my $start = $min_number + int(rand($max_number));
my $step = 1;
# start and step (case 2: step IS NOT 1)
# still to come: different steppings...
# negative mode
if ($vars{'app_input_posneg'} ne "" && $vars{'app_input_posneg'} ne "pos") {
$nums_negative = 1;
if ($vars{'app_input_posneg'} eq "mix" && int(rand(100)) > 50) {
$nums_negative = 0;
}
if ($nums_negative) {
$ruler_setup{"label_calc_sub"} = $start*2;
}
}
# generate numbers
my $nums_total = 7 + int(rand(3));
if ($pdf_items_use > 1) {
$nums_total = 2 + int(rand(4));
}
if ($pdf_items_use == 4) {
$nums_total = 2 + int(rand(3));
}
if ($vars{'output_web'}) {
$nums_total = 3 + int(rand(3));
}
for (my $n = 0; $n < $nums_total; $n++) {
my $whilecounter;
while ($whilecounter < 4096 && ($nums[$n] eq "" || $used{$nums[$n]})) {
$whilecounter++;
$nums[$n] = $start + int(rand($dim));
if ($vars{'app_input_comma_status'} > 0) {
$nums[$n] .= ".".int(rand(10));
$nums[$n] =~ s~\.0$~~;
}
}
$used{$nums[$n]}++;
}
if ($vars{'app_input_random_number_order_disable'} == 1 || $pdf_items_use == 1) {
@nums = sort {$a <=> $b} @nums;
}
if ($vars{'app_input_ruler_labels'} eq "first") {
$ruler_switches .= "F";
}
if ($vars{'app_input_ruler_labels'} eq "random") {
my @opts = ("none","random_1","random_2","random_3");
$vars{'app_input_ruler_labels'} = $opts[int(rand(3))];
}
if ($vars{'app_input_ruler_labels'} eq "none") {
$ruler_switches .= "L";
$ruler_force_hint++;
}
if ($vars{'app_input_ruler_labels'} =~ /^random_(.*?)$/) {
my $labels = $1;
my $pos = int(rand($dim));
$ruler_setup{"force_display_label_pos_$pos"}++;
my ($whilecounter,%used);
$used{$pos}++;
for (my $l = 0; $l < $labels-1; $l++) {
my $pos = int(rand($dim));
while ($whilecounter < 4096 && $used{$pos}) {
$whilecounter++;
$pos = int(rand($dim));
}
$ruler_setup{"force_display_label_pos_$pos"}++;
$used{$pos}++;
}
$ruler_switches .= "L";
}
if ($vars{'app_input_steps'} =~ /ten/) {
$ruler_switches .= "z";
}
if ($vars{'app_input_steps'} =~ /mm/ || $vars{'app_input_comma_status'} > 0) {
$ruler_switches .= "m";
}
if ($vars{'app_input_comma_status'} > 1) {
$ruler_setup{"label_divider"} = 10;
if ($vars{'app_input_comma_status'} == 3) {
$ruler_setup{"label_divider"} = 100;
}
}
if ($start != 0) {
$ruler_switches .= "p";
}
if ($num_comma ne "" && $num_comma ne ".") {
$ruler_switches .= "c";
}
return (
$start,
$step,
$nums_total,
\@nums,
$nums_negative,
$ruler_switches,
$ruler_force_hint,
\%ruler_setup,
$DEBUG,
);
}
###################################################################
#### THAT'S IT :-D
###################################################################
1;
__END__