package ONO::FW::Edu::Apps::Modules::MathWalls;
################################################################################
# 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::FW::Edu::Apps::ToolBox;
use ONO::FW::Edu::Apps::Modules::WorksheetMaker::Input;
use ONO::FW::Apps::ToolBox;
use ONO::Lib::PDF::Draw;
use ONO::Lib::PDF::ToolBox;
use ONO::FW::Apps::Core;
use ONO::FW::Apps::Core::Graphics;
use ONO::Lib::Parser;
use ONO::FW::Apps::PDF;
use ONO::Lib::UI::Check;
use ONO::Lib::UI::Select;
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 = "math_walls";
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;
my @txt = (
"Walls",
);
if ($vars{'app_lang'} eq "de") {
@txt = (
"Mauern",
);
}
if ($vars{'app_lang'} eq "fr") {
@txt = (
"Murs",
);
}
if ($vars{'app_lang'} eq "lu") {
@txt = (
"Maueren",
);
}
$vars{'app_input_print_options_title_default'} = $txt[0];
$vars{'app_input_op_mul'} = 0;
$vars{'app_input_op_div'} = 0;
$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)) {
$WEB .= ONO::FW::Apps::Core->blockbackbutton($BASE,$vars_ref);
(
$vars{'app_input_range_from'},
$vars{'app_input_range_to'},
) = ONO::FW::Apps::Core->range_check(
100,
1000,
$vars{'app_input_range_from'},
$vars{'app_input_range_to'},
$vars{'app_input_negative'},
$vars{'app_input_numsys_status'},
);
#############################################################
# 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'}) {
my $question_number = ONO::FW::Apps::Core->question_number($vars{'output_web_question_number'});
my (
@op,@op_symbol,
@num1,@num2,@num3,@res,
$op_symbol_opts,$focus_on,
$page,$pages,%cache,
$whilecounter,$stats_switches,
$PDF_OPTS,
$stat_correct,$stat_wrong,$stat_todo,
);
my $questions_per_page = 1;
if ($vars{'output_web_page_2'}) {
$page = $vars{'output_web_page_2'};
}
if ($page < 1) {
$page = 1;
}
if ($vars{'app_input_number_of_questions'}) {
$pages = $vars{'app_input_number_of_questions'};
}
if ($vars{'output_web_continue'}) {
$page++;
$vars{'output_web_mistakes'} = 0;
$vars{'output_web_past_correct'} = $vars{'output_web_past_correct'} + $vars{'output_web_transmit_correct'};
$vars{'output_web_past_mistakes'} = $vars{'output_web_past_mistakes'} + $vars{'output_web_transmit_mistakes'};
foreach my $key (keys %vars) {
if ($key =~ /^output_web_(answer|cache)/) {
$vars{$key} = "";
}
}
}
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);
$vars{'app_input_multiple_questions_per_page'}++;
$op_symbol_opts = "p";
}
if (!$vars{'app_input_extype_status'}) {
$vars{'app_input_extype_status'} = 3;
}
# layout: (x,y,pdf_x,pdf_y)
my @layout = (3,6,60,31.5,6);
my $qs = 3;
if ($vars{'app_input_extype_status'} == 4) {
@layout = (2,5,105,38,5);
$qs = 6;
}
if ($vars{'app_input_extype_status'} == 5) {
@layout = (2,4,90,47.5,4);
$qs = 10;
}
if ($vars{'output_web'}) {
@layout = (1,1,0,0);
}
if ($vars{'output_worksheet_maker'}) {
$layout[1] = 1;
}
foreach my $copy (ONO::FW::Apps::Core->unique_copies($vars{'app_input_print_options_unique_copies'})) {
my @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,$layout[4],"HV",$vars_ref);
# ONO::Lib::PDF::ToolBox->canvas_test($canvas);
}
if ($vars{'output_web'}) {
$WEB .= qq~<$form>
<input type="hidden" name="output_web_page_2" value="$page">
<input type="hidden" name="output_web_past_correct" value="$vars{'output_web_past_correct'}">
<input type="hidden" name="output_web_past_mistakes" value="$vars{'output_web_past_mistakes'}">
~;
$op_symbol_opts = "c";
$WEB .= ONO::FW::Apps::Core->stats("",$BLK_ref,"ctmpx$stats_switches");
}
# if ($vars{'output_web_finish'} && $vars{'output_web_completed'}) {
if ($vars{'output_web_finish'}) {
$vars{'output_progress_done'}++;
$WEB .= ONO::FW::Apps::Core->question_progress_done_msg($app,$db,$community,$form,$action_url,$qs+$vars{'output_web_past_correct'},$vars{'output_web_mistakes'},$lang,$BLK_ref,$vars_ref);
} else {
$WEB .= ONO::FW::Apps::Core->timer($vars{'output_web'},$vars{'output_web_timer_start'});
for (my $i = 0; $i < $questions_per_page; $i++) {
my $HTML;
# output paper + web
if ($vars{'output_paper'} || $vars{'output_web'}) {
if ($i == 0) {
my $mode = "pdf";
if ($vars{'output_web'}) {
$mode = "web";
}
my $wallcounter;
for (my $x = 0; $x < $layout[0]; $x++) {
for (my $y = 0; $y < $layout[1]; $y++) {
my (@nums,$whilecounter,$error);
if ($vars{"output_web_cache_num0"}) {
for (my $i = 0; $i < 15; $i++) {
$nums[$i] = $vars{"output_web_cache_num$i"};
}
}
$vars{'output_web_answer_status'} = 2;
while ($whilecounter < 4096 && !$vars{"output_web_cache_num0"} && (!$nums[0] || $error)) {
$whilecounter++;
@nums = ();
$error = 0;
$nums[0] = ONO::FW::Apps::Core->random_number(
$vars{'app_input_range_from'},$vars{'app_input_range_to'},
$vars{'app_input_range_from'},$vars{'app_input_range_to'},
$vars_ref,
);
# generate numbers for all stones
my $prev_first = $nums[0];
my $prev_row = "$nums[0]:";
my $brick = 1;
for (my $l = 2; $l < $vars{'app_input_extype_status'}+1; $l++) {
$nums[$brick] = ONO::FW::Apps::Core->random_number(
int($prev_first/4),int($prev_first/1.25),
int($prev_first/4),int($prev_first/1.25),
$vars_ref,
);
$prev_first = $nums[$brick];
my @prev_bricks = split(/:/,$prev_row);
$prev_row = "$nums[$brick]:";
for (my $b = 0; $b < $l; $b++) {
$brick++;
$nums[$brick] = $prev_bricks[$b]-$nums[$brick-1];
if ($b < $l-1) {
if ($nums[$brick] < 0) {
$error++;
}
$prev_row .= "$nums[$brick]:";
}
}
}
}
my $op;
if ($vars{'output_web_cache_op'}) {
$op = $vars{'output_web_cache_op'};
} else {
$op = ONO::FW::Apps::Core->random_operation(ONO::FW::Apps::Core->get_operations($vars_ref));
}
if ($mode eq "web") {
$WEB .= qq~<input type="hidden" name="output_web_cache_op" value="$op">~;
for (my $i = 0; $i < 15; $i++) {
$WEB .= qq~<input type="hidden" name="output_web_cache_num$i" value="$nums[$i]">~;
}
}
# $stat_mistakes,
my $display_wall = 1;
my ($off_x,$off_y);
if ($vars{'output_worksheet_maker'} && $y > 0) {
$display_wall = 0;
$off_y = 5;
}
if ($display_wall) {
if ($vars{'app_input_extype_status'} == 4) {
$off_x = 10;
if ($x%2 != 0) {
$off_x = -10;
}
$off_y = -1;
}
if ($vars{'output_worksheet_maker'}) {
if ($vars{'app_input_extype_status'} == 3) {
$off_y = 12;
}
if ($vars{'app_input_extype_status'} == 4) {
$off_y = 8;
}
}
(
$HTML,
$stat_correct,
$stat_wrong,
$stat_todo,
$vars{'output_web_mistakes'},
) = ONO::FW::Apps::Core->pdf_draw_wall(
$canvas,$x*$layout[2]+5+$off_x,$y*$layout[3]+5+$off_y,
$vars{'app_input_extype_status'},\@nums,$op,$vars{'app_input_numsys_status'},
$mode,\%vars,$num_comma,
);
}
$corr_cache[$wallcounter] = \@nums;
$wallcounter++;
}
}
}
}
if ($vars{'output_web'}) {
$WEB .= qq~<input type="hidden" name="output_web_cache_running" value="1">
<input type="hidden" name="output_web_cache_res" value="$res[$i]">
<bgimage="/images/app_backgrounds/math_walls_back.jpg" alt="">
<div class="mt20">
$HTML
</div>
~;
}
}
if ($vars{'output_web'}) {
$WEB .= ONO::FW::Apps::Core->multi_frame_end($vars{'output_web_finish'},$vars{'app_input_multiple_questions_per_page'});
$WEB .= ONO::FW::Apps::Core->input_vars(\%vars);
my $table_width = ($vars{'app_input_extype_status'}) * 142;
$WEB .= qq~<div class="bg_dark auto" style="width:${table_width}px">
<div class="p5">
~;
$WEB .= ONO::FW::Apps::Core->check_multi($BLK_ref,$stat_todo+$stat_wrong,$page,$pages,"N",\%vars);
$WEB .= qq~ </div>
</div>
<input type="hidden" name="output_web_transmit_correct" value="$stat_correct">
<input type="hidden" name="output_web_transmit_mistakes" value="$vars{'output_web_mistakes'}">
~;
# if (!$stat_todo) {
# $WEB .= qq~<input type="hidden" name="output_web_completed" value="1">~;
# }
$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,$layout[4],"CHV",$vars_ref);
# ONO::Lib::PDF::ToolBox->canvas_test($canvas);
my $wallcounter;
for (my $x = 0; $x < $layout[0]; $x++) {
for (my $y = 0; $y < $layout[1]; $y++) {
my ($off_x,$off_y);
if ($vars{'app_input_extype_status'} == 3) {
if ($vars{'output_worksheet_maker'}) {
$off_y = 12;
}
}
ONO::FW::Apps::Core->pdf_draw_wall($canvas,$x*$layout[2]+5+$off_x,$y*$layout[3]+5+$off_y,$vars{'app_input_extype_status'},$corr_cache[$wallcounter],"corr",$vars{'app_input_numsys_status'},"pdf",\%vars,$num_comma);
$wallcounter++;
}
}
}
}
if ($vars{'output_web'}) {
$WEB = ONO::FW::Apps::Core->stats_replace(
$WEB,
$stat_correct+$vars{'output_web_past_correct'},
$stat_wrong,
$stat_todo,
$vars{'output_web_mistakes'}+$vars{'output_web_past_mistakes'},
$page,
$pages,
$vars{'output_web_completed'},
);
}
if ($vars{'output_paper'}) {
ONO::FW::Apps::PDF->end;
$WEB .= ONO::FW::Apps::Core->output_paper($pdfkey,\%BLK,\%vars,$HTTP,$BASE);
}
}
if ($vars{'output_web'}) {
ONO::FW::Apps::Core->varstore($vars{'username'},$vars{'virclass'},$vars{'anonymous'},\%vars);
}
} else {
#############################################################
# EXERCISE SETUP
#############################################################
$WEB .= ONO::FW::Apps::Core->infopics(
"sheet:168:190:110:15:math_walls_sheet_1.jpg",
"screen:320:50:30::math_walls_screenshot_1.jpg",
"sheet:168:40:140:-10:math_walls_sheet_2.jpg",
);
my (%setup);
my @tabs = ("3:green:3 $BLK{'rows'}","4:green:4 $BLK{'rows'}","5:green:5 $BLK{'rows'}");
my $CUSTOM = ONO::Lib::UI::Select->buttons(
"app_input_extype",
$vars{'app_input_extype_status'},
\@tabs,
"",
"f",
$BLK_ref,
\%setup,
);
my $CONF .= ONO::FW::Apps::ToolBox->conf_input("range", $BLK_ref,\%vars,"",10,50,1000);
$CONF .= ONO::FW::Apps::ToolBox->conf_input("spacer", $BLK_ref,\%vars);
$CONF .= ONO::FW::Apps::ToolBox->conf_input("ops", $BLK_ref,\%vars,"","as-A");
$CONF .= ONO::FW::Apps::ToolBox->conf_input("spacer", $BLK_ref,\%vars);
$CONF .= ONO::FW::Apps::ToolBox->conf_input("custom", $BLK_ref,\%vars,"","",$CUSTOM);
$CONF .= ONO::FW::Apps::ToolBox->conf_input("spacer", $BLK_ref,\%vars,"","s");
$CONF .= ONO::FW::Apps::ToolBox->conf_input("moreopts", $BLK_ref,\%vars,"","bm");
$CONF .= ONO::FW::Apps::ToolBox->conf_input("numsys", $BLK_ref,\%vars,"h");
$CONF .= ONO::FW::Apps::ToolBox->conf_input("digits", $BLK_ref,\%vars,"h",3);
$CONF .= ONO::FW::Apps::ToolBox->conf_input("comma", $BLK_ref,\%vars,"hC",3);
$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
###################################################################
###################################################################
#### THAT'S IT :-D
###################################################################
1;
__END__