package ONO::FW::Edu::Apps::Modules::Multiply;
################################################################################
# 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::Edu::Apps::Modules::MathCount;
use ONO::FW::Edu::Apps::Variation;
use ONO::FW::Apps::ToolBox;
use ONO::FW::Apps::Info;
use ONO::Lib::PDF::Draw;
use ONO::Lib::PDF::ToolBox;
use ONO::Lib::Web::Domain;
use ONO::FW::Apps::Core;
use ONO::FW::Apps::Core::Graphics;
use ONO::Lib::Parser;
use ONO::FW::Apps::PDF;
use ONO::IO;
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 = "multiply";
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 = (
"Download multiplication table sheets",
"tables",
"Multiplication",
"The 'Math Rods' app also allows to practice multiplication tables visually!",
"go to 'Math Rods' app",
"",
"just multiply & write results",
"calculate with",
"dots",
);
if ($vars{'app_lang'} eq "de") {
@txt = (
"Einmaleins Vorlagen herunterladen",
"Reihen",
"Einmaleins",
"Mit der 'Rechenstäbchen' App kannst du das Einmaleins auch visuell üben!",
"'Rechenstäbchen' App öffnen",
"",
"einfach multiplizieren & Resultate schreiben",
"rechnen mit",
"Punkten",
);
}
if ($vars{'app_lang'} eq "fr") {
@txt = (
"Télécharger les fiches de multiplication",
"tables",
"Multiplication",
"L'application 'Réglettes' permet de pratiquer visuellement les tables de multiplication!",
"ouvrir ''",
"",
"multiplier & écrire résultats",
"calcul avec",
"points",
);
}
if ($vars{'app_lang'} eq "lu") {
@txt = (
"Einmaleins Virlagen eroflueden",
"Reien",
"Einmaleins",
"Mat der 'Rechestäbercher' App kanns de d'Einmaleins och visuell üben!",
"'Rechestäbercher' App opmaachen",
"",
"einfach multiplizéieren & Resultater schreiwen",
"rechne mat",
"Punkten",
);
}
$vars{'app_input_print_options_title_default'} = $txt[2];
my @IDS = (
"X8BR4VsD7s",
"SPxtujBMsk",
"n5yLyZsnoz",
"ZnG2RZ3fnt",
"qEXY5MqhVo",
"sWwLipViAr",
);
if ($community eq "school") {
@IDS = (
"hkF7uiZCPM",
"SVDrn4X2nX",
"jUWBsprN9C",
"Mnahb7SegX",
"GHRAnFgUgs",
"fUXGC3BJu2",
);
}
my @IDS2;
for (my $i = 0; $i < 6; $i++) {
$IDS2[$i] = substr($IDS[$i],0,1)."/".substr($IDS[$i],0,2)."/".substr($IDS[$i],0,3);
}
$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{'table_generator'}) {
$WEB .= ONO::FW::Apps::Core->blockbackbutton($BASE,$vars_ref);
if ($vars{'app_input_extype_images'} > 0 && $vars{'app_input_range_to'} > 100) {
$vars{'app_input_range_to'} = 100;
}
(
$vars{'app_input_range_from'},
$vars{'app_input_range_to'},
) = ONO::FW::Apps::Core->range_check(
900,
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'}) {
if (!$vars{'app_input_extype_calculate'} || $vars{'app_input_extype_images'} > 0) {
$vars{'app_input_multiple_questions_per_page'} = 0;
}
my $question_number = ONO::FW::Apps::Core->question_number($vars{'output_web_question_number'});
my (
$op_symbol_opts,$focus_on,
$page,$pages,%cache,
$whilecounter,$stats_switches,
$PDF_OPTS,
$qfield_single,
$stat_correct,$stat_wrong,$stat_todo,$stat_todo_total,
);
my $questions_per_page = 1;
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'}++;
$questions_per_page = 60;
$op_symbol_opts = "p";
}
my @defs = ONO::FW::Apps::Core::Graphics->image_ids();
my $defs_num = @defs;
my $defs_ref = \@defs;
foreach my $copy (ONO::FW::Apps::Core->unique_copies($vars{'app_input_print_options_unique_copies'})) {
my (@op,@op_symbol,@num1,@num2,@res,@hres);
my ($pdf_x,$pdf_y) = (5,8);
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,4,"HV",$vars_ref);
# ONO::Lib::PDF::ToolBox->canvas_test($canvas);
}
if ($vars{'output_web'}) {
$WEB .= qq~<$form>~;
$op_symbol_opts = "c";
if ($vars{'app_input_multiple_questions_per_page'}) {
($stats_switches,$questions_per_page,$page,$pages) = ONO::FW::Apps::Core->multi_page_logic($page,\%vars);
$WEB .= ONO::FW::Apps::Core->stats("",$BLK_ref,"ctm$stats_switches");
$WEB .= ONO::FW::Apps::Core->multi_frame_start($vars{'output_web_finish'});
} else {
$WEB .= ONO::FW::Apps::Core->question_progress($vars{'app_input_number_of_questions'},$question_number);
$WEB .= ONO::FW::Apps::Core->stats("",$BLK_ref,"ctmW$stats_switches");
}
}
my (@extype_pdf,$extype_pdf_counter,%used);
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_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 @extypes = ('calculate');
if ($vars{'app_input_extype_images'} > 0) {
@extypes = ('images');
if ($vars{'app_input_extype_calculate'} > 0) {
@extypes = ('images','calculate');
if ($used{'last_extype'} eq "images") {
@extypes = ('calculate');
}
if ($used{'last_extype'} eq "calculate") {
@extypes = ('images');
}
}
}
my $extypes_num = @extypes;
my $extype = $extypes[int(rand($extypes_num))];
if ($i%5 == 0) {
if ($i < 19) {
$extype_pdf[$extype_pdf_counter] = $extype;
$used{'last_extype'} = $extype;
}
$extype_pdf_counter++;
}
if ($vars{'output_web'}) {
$stat_todo++;
$vars{"output_web_answer_$i"} = ONO::FW::Apps::Core->clean_answer_math($vars{"output_web_answer_$i"});
if ($vars{'app_input_multiple_questions_per_page'}) {
if ($vars{'output_web_next_page'}) {
$vars{"output_web_answer_$i"} = "";
} else {
$op[$i] = $vars{"output_web_cache_op_$i"};
$num1[$i] = $vars{"output_web_cache_num1_$i"};
$num2[$i] = $vars{"output_web_cache_num2_$i"};
$res[$i] = $vars{"output_web_cache_res_$i"};
}
} else {
my $expected_result = $vars{"output_web_cache_res_$i"};
if ($vars{"output_web_cache_qfield_$i"} == 1) {
$expected_result = $vars{"output_web_cache_num1_$i"};
}
if ($vars{"output_web_cache_qfield_$i"} == 2) {
$expected_result = $vars{"output_web_cache_num2_$i"};
}
my $special_correct;
# special case: ? * 0 = 0 must allow any number as answer
if (
$vars{'app_input_extype_status'} eq "var" && $expected_result != 0 &&
$vars{"output_web_cache_res_$i"} == 0 && ($vars{"output_web_cache_num1_$i"} == 0 || $vars{"output_web_cache_num2_$i"} == 0)
) {
$special_correct++;
}
if (!$special_correct && ($vars{"output_web_answer"} eq "" || ($vars{"output_web_answer"} != $expected_result))) {
$vars{'output_web_answer_status'} = 2;
$op[$i] = $vars{"output_web_cache_op_$i"};
$num1[$i] = $vars{"output_web_cache_num1_$i"};
$num2[$i] = $vars{"output_web_cache_num2_$i"};
$res[$i] = $vars{"output_web_cache_res_$i"};
$qfield_single = $vars{"output_web_cache_qfield_$i"};
if ($vars{"output_web_answer"} ne "") {
$vars{'output_web_mistakes'}++;
}
} else {
$question_number++;
$vars{'output_web_answer_status'} = 1;
$vars{'output_web_answer'} = "";
$vars{"output_web_cache_qfield_$i"} = "";
}
}
}
if (!$op[$i]) {
$op[$i] = ONO::FW::Apps::Core->random_operation(ONO::FW::Apps::Core->get_operations($vars_ref));
}
if ($vars{'output_worksheet_maker'}) {
$op[$i] = "mul";
if (!$vars{'app_input_op_mul'} && $vars{'app_input_op_div'}) {
$op[$i] = "div";
}
if ($vars{'app_input_op_mul'} && $vars{'app_input_op_div'} && int(rand(100)) > 50) {
$op[$i] = "div";
}
for (my $r = 1; $r < 11; $r++) {
$vars{"app_input_mulrow_$r"} = 1;
}
}
$op_symbol[$i] = ONO::FW::Apps::Core->operation_symbol($op[$i],$op_symbol_opts);
# custom number generation
if (!$num1[$i] || !$num2[$i] || !$res[$i]) {
my @rows;
for (my $r = 1; $r < 21; $r++) {
if ($vars{"app_input_mulrow_$r"}) {
@rows = (@rows,$r);
if ($r > 1) {
@rows = (@rows,$r);
}
}
}
my $rows_num = @rows;
my $row_sel = $rows[int(rand($rows_num))];
my $whilecounter;
while ($whilecounter < 255 && ($res[$i] eq "" || $res[$i] < $vars{'app_input_range_from'} || $res[$i] > $vars{'app_input_range_to'})) {
$whilecounter++;
my @mains = (1,2,3,4,5,6,7,8,9,10);
if ($vars{'app_input_mulrow_main'} =~ /^(.*?)-(.*?)$/) {
@mains = ();
for (my $m = $1; $m < $2+1; $m++) {
@mains = (@mains,$m);
if ($m > 1) {
@mains = (@mains,$m);
}
}
}
if ($vars{'app_input_mulrow_main'} =~ /\:/) {
@mains = split(/\:/,$vars{'app_input_mulrow_main'})
}
my $mains_num = @mains;
$num1[$i] = $mains[int(rand($mains_num))];
$num2[$i] = $row_sel;
while ($num1[$i] * $num2[$i] > $vars{'app_input_range_to'} && $whilecounter < 100) {
$whilecounter++;
$num1[$i] = int($num1[$i]/2);
}
while ($num1[$i] * $num2[$i] < $vars{'app_input_range_from'} && $whilecounter < 100) {
$whilecounter++;
$num1[$i] = $num1[$i]*2;
}
# avoid more zeroes...
if (!$num1[$i] && int(rand(100)) > 33) {
$num1[$i] = 1;
}
if (!$num2[$i] && int(rand(100)) > 33) {
$num2[$i] = 1;
}
# reverse in mix / var mode
if ($vars{'app_input_extype_status'} =~ /^(mix|var)$/ && int(rand(10)) > 4) {
my $cache = $num1[$i];
$num1[$i] = $num2[$i];
$num2[$i] = $cache;
}
# zeroes will cause problems in VAR modes, as there will be more than 1 possible result
if ($vars{'app_input_extype_status'} eq "var") {
if ($num1[$i] == 0) {
$num1[$i] = 1;
}
if ($num2[$i] == 0) {
$num2[$i] = 1;
}
}
# calc result
$res[$i] = $num1[$i] * $num2[$i];
if ($op[$i] eq "div") {
my $cache = $num1[$i];
$num1[$i] = $res[$i];
$res[$i] = $cache;
}
}
# avoid division by zero
if ($op[$i] eq "div" && $num2[$i] == 0) {
$num2[$i] = 1;
$res[$i] = $num1[$i];
}
$cache{'num1'} = $num1[$i];
$cache{'num2'} = $num2[$i];
}
# special mode vars
my $class = "tar";
my $width = 75;
my $qfield = 3;
my $qanswer = $res[$i];
# special mode: var
if ($vars{'app_input_extype_status'} eq "var") {
if ($vars{"output_web_cache_qfield_$i"}) {
$qfield = $vars{"output_web_cache_qfield_$i"};
} else {
$qfield = 1+int(rand(3));
}
if ($qfield) {
$width = 50;
$class = "center";
if ($qfield == 1) {
$qanswer = $num1[$i];
}
if ($qfield == 2) {
$qanswer = $num2[$i];
}
}
}
# hints
$hres[$i] = $qanswer;
# ...
if (!$qfield_single) {
$qfield_single = $qfield;
}
# output paper
if ($vars{'output_paper'}) {
my $max_number_length = ONO::FW::Apps::Core->number_length($vars{'app_input_range_to'},$vars{'app_input_comma_status'});
my @pos = (14,17,26,28,12, 15,26);
if ($max_number_length > 3) {
@pos = (12,15,27,28,12, 13,26,"...");
}
$num1[$i] = ONO::FW::Apps::Core->make_human_readable($num1[$i],$num_comma,$num_delimiter);
$num2[$i] = ONO::FW::Apps::Core->make_human_readable($num2[$i],$num_comma,$num_delimiter);
$res[$i] = ONO::FW::Apps::Core->make_human_readable($res[$i],$num_comma,$num_delimiter);
if ($i == 20 || $i == 40) {
$extype_pdf_counter = 1;
}
if ($extype_pdf[$extype_pdf_counter-1] eq "images") {
if ($i < 40 && $i%5 == 0) {
my ($img_x1,$img_x2) = (0,78);
my ($img_y1,$img_y2) = (0,30);
if ($i > 19) {
($img_x1,$img_x2) = ($img_x1+29,$img_x2+29);
}
my ($c1,$c2,$c3) = (220+int(rand(33)),220+int(rand(33)),220+int(rand(33)));
ONO::Lib::PDF::Draw->rect($canvas,$pdf_x+$img_x1, $pdf_y+$img_y1,$pdf_x+$img_x2,$pdf_y+$img_y2,1,"0:22:22:22","0:$c1:$c2:$c3",2);
my @opts = ('dots');
if ($vars{'app_input_extype_images_opts'} =~ /i/) {
@opts = ('images');
if ($vars{'app_input_extype_images_opts'} =~ /d/) {
@opts = ('dots','images');
}
}
my $opts_num = @opts;
my $extype_opt = $opts[int(rand($opts_num))];
my $img = ONO::FW::Edu::Apps::Modules::MathCount->random_img($defs_ref,$defs_num);
# mul
my ($num_big,$num_sma) = ($num1[$i],$num2[$i]);
if ($num2[$i] > $num1[$i]) {
($num_big,$num_sma) = ($num2[$i],$num1[$i]);
}
# div
if ($op[$i] eq "div") {
($num_big,$num_sma) = ($num2[$i],$res[$i]);
if ($res[$i] > $num2[$i]) {
($num_big,$num_sma) = ($res[$i],$num2[$i]);
}
}
my ($step_x,$step_y);
if ($num_big && $num_sma) {
$step_x = 74/$num_big;
$step_y = 26/$num_sma;
}
my $csize = $step_x/4;
my $isize = $step_x/1.2;
if ($step_x > $step_y) {
$csize = $step_y/4;
$isize = $step_y/1.2;
}
my ($c1,$c2,$c3) = (50+int(rand(100)),50+int(rand(100)),50+int(rand(100)));
my @BGC;
for (my $r = 0; $r < $num_sma; $r++) {
my $use_dot_y = $pdf_y+($r+0.5)*$step_y+2;
my $use_img_y = $pdf_y+($r+0.5)*$step_y-$isize/2+2;
if (($op[$i] eq "mul" && $num2[$i] > $num1[$i]) || ($op[$i] eq "div" && $res[$i] > $num2[$i]-1)) {
($c1,$c2,$c3) = (50+int(rand(50)),50+int(rand(50)),50+int(rand(50)));
if ($r%2 == 0) {
($c1,$c2,$c3) = (100+int(rand(100)),100+int(rand(100)),100+int(rand(100)));
}
if ($extype_opt eq "images") {
ONO::Lib::PDF::Draw->rect($canvas,$pdf_x+$img_x1+2,$use_img_y,$pdf_x+$img_x1+76,$use_img_y+$isize,1,"0:$c1:$c2:$c3","0:$c1:$c2:$c3",1);
}
}
for (my $c = 0; $c < $num_big; $c++) {
my $use_dot_x = $pdf_x+$img_x1+($c+0.5)*$step_x+2;
my $use_img_x = $pdf_x+$img_x1+($c+0.5)*$step_x-$isize/2+2;
my $BG = "0:$c1:$c2:$c3";
if (($op[$i] eq "mul" && $num1[$i] > $num2[$i]-1) || ($op[$i] eq "div" && $res[$i] < $num2[$i]+1)) {
if (!$BGC[$c]) {
($c1,$c2,$c3) = (50+int(rand(50)),50+int(rand(50)),50+int(rand(50)));
if ($c%2 == 0) {
($c1,$c2,$c3) = (100+int(rand(100)),100+int(rand(100)),100+int(rand(100)));
}
$BGC[$c] = "0:$c1:$c2:$c3";
}
$BG = $BGC[$c];
if (!$r && $extype_opt eq "images") {
ONO::Lib::PDF::Draw->rect($canvas,$use_img_x,$pdf_y+2,$use_img_x+$isize,$pdf_y+28,1,"0:$c1:$c2:$c3","0:$c1:$c2:$c3",1);
}
}
if ($extype_opt eq "dots") {
ONO::Lib::PDF::Draw->circle($canvas,$use_dot_x,$use_dot_y,$csize,1,$BG,$BG);
}
if ($extype_opt eq "images") {
ONO::Lib::PDF::Draw->image($canvas,$use_img_x,$use_img_y,$isize,$isize,"images/pix/preview/rgb_low_quality/$img.jpg",0.5,1);
}
}
}
ONO::Lib::PDF::Draw->rect($canvas,$pdf_x+$img_x1+ 9, $pdf_y+29, $pdf_x+$img_x1+25, $pdf_y+35,1,"0:22:22:22","0:244:244:244",2);
ONO::Lib::PDF::Draw->rect($canvas,$pdf_x+$img_x1+31, $pdf_y+29, $pdf_x+$img_x1+47, $pdf_y+35,1,"0:22:22:22","0:244:244:244",2);
ONO::Lib::PDF::Draw->rect($canvas,$pdf_x+$img_x1+53, $pdf_y+29, $pdf_x+$img_x1+69, $pdf_y+35,1,"0:22:22:22","0:244:244:244",2);
my $mix_mode;
if ($vars{'app_input_extype_status'} eq "var") {
$mix_mode = int(rand(3));
}
if ($mix_mode != 1) {
ONO::Lib::PDF::Draw->text($canvas,$pdf_x+$img_x1+17, $pdf_y+33.5, $num1[$i],"c");
}
ONO::Lib::PDF::Draw->text_math_symbol($canvas,$pdf_x+$img_x1+28, $pdf_y+32.5, 2.5,$op_symbol[$i]);
if ($mix_mode != 2) {
ONO::Lib::PDF::Draw->text($canvas,$pdf_x+$img_x1+39, $pdf_y+33.5, $num2[$i],"c");
}
ONO::Lib::PDF::Draw->text($canvas,$pdf_x+$img_x1+50, $pdf_y+33.5, "=","c");
if ($mix_mode) {
ONO::Lib::PDF::Draw->text($canvas,$pdf_x+$img_x1+61, $pdf_y+33.5, $res[$i],"c");
}
$corr_cache[$i] = "$extype_pdf[$extype_pdf_counter-1]\^$op[$i]\^$op_symbol[$i]\^$num1[$i]\^$num2[$i]\^$res[$i]\^$pdf_x\^$pdf_y\^";
}
} else {
$corr_cache[$i] = "$extype_pdf[$extype_pdf_counter-1]\^$op[$i]\^$op_symbol[$i]\^$num1[$i]\^$num2[$i]\^$res[$i]\^$pdf_x\^$pdf_y\^";
$corr_cache[$i] .= "$pos[0]\^$pos[1]\^$pos[2]\^$pos[3]\^$pos[4]\^$pos[5]\^$pos[6]\^$pos[7]\^";
if (!$vars{'app_input_result_hints'} || $i < 20 || $i > 39) {
ONO::Lib::PDF::Draw->text_math_symbol($canvas,$pdf_x+$pos[1], $pdf_y-1, 2.5,$op_symbol[$i]);
ONO::Lib::PDF::Draw->text($canvas,$pdf_x+$pos[3], $pdf_y, "=");
if ($qfield == 2 || $qfield == 3) {
ONO::Lib::PDF::Draw->text($canvas,$pdf_x+$pos[0], $pdf_y, $num1[$i],"r");
}
if ($qfield == 1 || $qfield == 3) {
ONO::Lib::PDF::Draw->text($canvas,$pdf_x+$pos[2], $pdf_y, $num2[$i],"r");
}
if ($qfield == 3) {
ONO::Lib::PDF::Draw->font('',9);
ONO::Lib::PDF::Draw->text($canvas,$pdf_x+33, $pdf_y, "...................");
ONO::Lib::PDF::Draw->font('',$pos[4]);
} else {
ONO::Lib::PDF::Draw->text($canvas,$pdf_x+33, $pdf_y, $res[$i]);
}
if ($qfield == 1 || $qfield == 2) {
ONO::Lib::PDF::Draw->font('',9);
if ($qfield == 1) {
ONO::Lib::PDF::Draw->text($canvas,$pdf_x+$pos[5], $pdf_y, ".........$pos[7]","r");
}
if ($qfield == 2) {
ONO::Lib::PDF::Draw->text($canvas,$pdf_x+$pos[6], $pdf_y, ".......$pos[7]","r");
}
ONO::Lib::PDF::Draw->font('',$pos[4]);
}
}
}
$pdf_y = $pdf_y + 8;
if (($i+1)%5 == 0) {
$pdf_y = $pdf_y + 7.5;
}
if ($pdf_y > 190) {
$pdf_x = $pdf_x + 57.5;
$pdf_y = 8;
}
}
if ($vars{'output_web'}) {
$WEB .= qq~<input type="hidden" name="output_web_cache_op_$i" value="$op[$i]">
<input type="hidden" name="output_web_cache_num1_$i" value="$num1[$i]">
<input type="hidden" name="output_web_cache_num2_$i" value="$num2[$i]">
<input type="hidden" name="output_web_cache_res_$i" value="$res[$i]">
<input type="hidden" name="output_web_cache_qfield_$i" value="$qfield">
~;
if ($vars{'app_input_multiple_questions_per_page'}) {
my ($BG,$is_correct);
my $PLA = "?";
if (ONO::IO->devstation) {
$PLA = $qanswer;
}
my $FIELD = qq~<input type="text" id="output_web_answer_${i}_id" name="output_web_answer_$i" value="$vars{"output_web_answer_$i"}"
maxlength="7" min="-1000" max="1000" class="$class" style="width:${width}px" placeholder="$PLA">~;
if ($vars{"output_web_answer_$i"} =~ /[A-Z0-9\.]/) {
$BG = " bg_red";
$stat_todo--;
if ($vars{"output_web_answer_$i"} eq $qanswer) {
$BG = " bg_green";
$qanswer = ONO::FW::Apps::Core->make_human_readable($qanswer,$num_comma,$num_delimiter);
$FIELD = qq~<div class="bold green">$qanswer</div><input type="hidden" name="output_web_answer_$i" value="$vars{"output_web_answer_$i"}">~;
$stat_correct++;
$is_correct++;
} else {
$stat_wrong++;
$vars{'output_web_mistakes'}++;
}
}
if (!$is_correct && !$focus_on) {
$FIELD .= qq~<script>document.getElementById('output_web_answer_${i}_id').focus();</script>~;
$focus_on++;
}
$num1[$i] = ONO::FW::Apps::Core->make_human_readable($num1[$i],$num_comma,$num_delimiter);
$num2[$i] = ONO::FW::Apps::Core->make_human_readable($num2[$i],$num_comma,$num_delimiter);
my @PAR;
my @QFIELD = (
qq~<td class="pad5_2 nowrap $class">$num1[$i]</td>~,
qq~<td class="pad5_2 nowrap $class">$num2[$i]</td>~,
qq~<td class="pad5_2 nowrap w20">$FIELD</td>~,
);
if ($qfield == 1) {
@QFIELD = (
qq~<td class="pad5_2 nowrap $class">$FIELD</td>~,
qq~<td class="pad5_2 nowrap $class">$num2[$i]</td>~,
qq~<td class="pad5_2 nowrap w20">$res[$i]</td>~,
);
}
if ($qfield == 2) {
@QFIELD = (
qq~<td class="pad5_2 nowrap $class">$num1[$i]</td>~,
qq~<td class="pad5_2 nowrap $class">$FIELD</td>~,
qq~<td class="pad5_2 nowrap w20">$res[$i]</td>~,
);
}
$WEB .= qq~<tr class="bt bb$BG">
<td class="w80"></td>
$QFIELD[0]
<td class="center">$op_symbol[$i]</td>
$QFIELD[1]
<td>=</td>
$QFIELD[2]
<td><div class="block32"></div></td>
</tr>
~;
}
if ($i == 9) {
$WEB .= ONO::FW::Apps::Core->multi_frame_split;
}
}
}
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);
if ($questions_per_page == 1) {
if ($vars{'app_input_extype_images'}) {
$WEB .= qq~<div class="inline auto">
<div class="p10">
<div class="box_fabric">
<div class="box_paper">
<table class="default_table">
~;
my ($num_big,$num_sma) = ($num1[0],$num2[0]);
if ($num1[0] < $num2[0]) {
($num_big,$num_sma) = ($num2[0],$num1[0]);
}
if ($op[0] eq "div") {
($num_big,$num_sma) = ($num2[0],$res[0]);
if ($res[0] > $num2[0]) {
($num_big,$num_sma) = ($res[0],$num2[0]);
}
}
my ($s1,$s2) = (32,16);
if ($num_sma > 5) {
($s1,$s2) = (24,12);
if ($num_sma > 7) {
($s1,$s2) = (20,10);
if ($num_sma > 8) {
($s1,$s2) = (16,8);
if ($num_sma > 9) {
($s1,$s2) = (12,6);
}
}
}
}
my $COL = $vars{'output_web_cache_color'};
if (!$COL) {
my ($c1,$c2,$c3) = (10+int(rand(90)),10+int(rand(90)),10+int(rand(90)));
$vars{'output_web_cache_color'} = "$c1$c2$c3";
}
my $IMG = qq~<div class="p2"><div class="block$s1 radius$s2" style="background-color:#$vars{'output_web_cache_color'}"></div></div>~;
if (!$vars{'output_web_cache_img_mode'}) {
$vars{'output_web_cache_img_mode'} = "d";
if ($vars{'app_input_extype_images_opts'} =~ /i/) {
$vars{'output_web_cache_img_mode'} = "i";
if ($vars{'app_input_extype_images_opts'} =~ /d/ && int(rand(100)) > 50) {
$vars{'output_web_cache_img_mode'} = "d";
}
}
}
if ($vars{'output_web_cache_img_mode'} eq "i") {
if (!$vars{'output_web_cache_img'}) {
$vars{'output_web_cache_img'} = ONO::FW::Edu::Apps::Modules::MathCount->random_img($defs_ref,$defs_num);
}
$IMG = qq~<img class="block$s1" src="/images/pix/preview/rgb_low_quality/$vars{'output_web_cache_img'}.jpg" alt="image">~;
}
for (my $r = 0; $r < $num_sma; $r++) {
$WEB .= qq~ <tr>~;
for (my $c = 0; $c < $num_big; $c++) {
$WEB .= qq~ <td>$IMG</td>~;
}
$WEB .= qq~ </tr>~;
}
$WEB .= qq~ </table>
</div>
</div>
</div>
</div>
<input type="hidden" name="output_web_cache_color" value="$vars{'output_web_cache_color'}">
<input type="hidden" name="output_web_cache_img_mode" value="$vars{'output_web_cache_img_mode'}">
<input type="hidden" name="output_web_cache_img" value="$vars{'output_web_cache_img'}">
~;
} else {
$WEB .= qq~<div class="block100"></div>~;
}
my @TDS = (
qq~<td class="pad10_2 bold">$num1[0]</td>
<td class="pad10_2 bold">$op_symbol[0]</td>
<td class="pad10_2 bold">$num2[0]</td>
<td class="pad10_2 bold">=</td>
~,
"",
);
if ($qfield_single == 1) {
@TDS = (
qq~~,
qq~<td class="pad10_2 bold">$op_symbol[0]</td>
<td class="pad10_2 bold">$num2[0]</td>
<td class="pad10_2 bold">=</td>
<td class="pad10_2 bold">$res[0]</td>
~,
);
}
if ($qfield_single == 2) {
@TDS = (
qq~<td class="pad10_2 bold">$num1[0]</td>
<td class="pad10_2 bold">$op_symbol[0]</td>
~,
qq~<td class="pad10_2 bold">=</td>
<td class="pad10_2 bold">$res[0]</td>
~,
);
}
$WEB .= ONO::FW::Apps::Core->check_single(
$TDS[0],
$TDS[1],
50,
3,
$BLK_ref,
\%vars,
"nM",
);
} else {
$WEB .= ONO::FW::Apps::Core->check_multi($BLK_ref,$stat_todo+$stat_wrong,$page,$pages,"",\%vars);
}
$WEB .= qq~</form>~;
}
}
if ($vars{'output_paper'} && $vars{'app_input_result_hints'}) {
for (my $y = 0; $y < 4; $y++) {
if ($extype_pdf[$y] ne "images") {
my @block = ONO::FW::Apps::Core::Graphics->pdf_draw_result_hints_resblock(\@hres,$y,$y+8);
ONO::FW::Apps::Core::Graphics->pdf_draw_result_hints($canvas,60,$y*47.5+2,55,40,2,5,\@block,"",$num_comma);
}
}
}
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,"CHV",$vars_ref);
# ONO::Lib::PDF::ToolBox->canvas_test($canvas);
for (my $c = 0; $c < $questions_per_page; $c++) {
my ($extype,$op,$op_symbol,$num1,$num2,$res,$pdf_x,$pdf_y,@pos) = split(/\^/,$corr_cache[$c]);
if ($extype eq "images") {
ONO::Lib::PDF::Draw->font('',24);
ONO::Lib::PDF::Draw->text($canvas,$pdf_x+40, $pdf_y+20, "$num1 $op_symbol $num2 = $res","c");
ONO::Lib::PDF::Draw->font('',12);
}
if ($extype eq "calculate") {
if ($c == 0) {
ONO::Lib::PDF::Draw->font('',$pos[4]);
}
if (!$vars{'app_input_result_hints'} || $c < 20 || $c > 39) {
ONO::Lib::PDF::Draw->text_math_symbol($canvas,$pdf_x+$pos[1], $pdf_y-1.5, 2.5,$op_symbol);
ONO::Lib::PDF::Draw->text($canvas,$pdf_x+$pos[0], $pdf_y,$num1,"r");
ONO::Lib::PDF::Draw->text($canvas,$pdf_x+$pos[2], $pdf_y,$num2,"r");
ONO::Lib::PDF::Draw->text($canvas,$pdf_x+$pos[3], $pdf_y,"=");
ONO::Lib::PDF::Draw->font('HO');
ONO::Lib::PDF::Draw->text($canvas,$pdf_x+50, $pdf_y,$res,"r");
ONO::Lib::PDF::Draw->font('H',12);
}
}
}
}
}
if ($vars{'output_web'}) {
($stat_correct,$stat_todo_total) = ONO::FW::Apps::Core->stats_multi_pages($vars{'app_input_number_of_questions'},$stat_correct,$stat_wrong,$page,$pages);
if ($questions_per_page == 1) {
$stat_correct = $question_number-1;
$WEB = ONO::FW::Apps::Core->stats_replace($WEB,$stat_correct,$stat_wrong,$stat_todo_total-$stat_correct,$vars{'output_web_mistakes'}-1);
} else {
$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::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 {
if ($vars{'mode'} eq "worksheet_download") {
#############################################################
# WORKSHEET DOWNLOAD
#############################################################
if ($vars{'table_generator'} && $vars{'app_input_print_options_unique_copies'}) {
my $PDF_OPTS = ONO::FW::Apps::Core->headers_options($BLK_ref,$vars_ref);
ONO::FW::Apps::PDF->new("$BASE/pdf/pdf-$pdfkey.pdf","",$format);
my @tables;
for (my $i = 1; $i < 11; $i++) {
if ($vars{"app_input_mulrow_$i"}) {
@tables = (@tables,$i);
}
}
foreach my $copy (ONO::FW::Apps::Core->unique_copies($vars{'app_input_print_options_unique_copies'})) {
my ($pdf_x,$pdf_y) = (0,0);
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::Lib::PDF::ToolBox->canvas_test($canvas);
for (my $i = 0; $i < 10; $i++) {
if ($tables[$i]) {
ONO::Lib::PDF::Draw->rect($canvas,$pdf_x,$pdf_y,$pdf_x+31,$pdf_y+90,1,"","0:250:250:220",2);
ONO::Lib::PDF::Draw->rect($canvas,$pdf_x,$pdf_y,$pdf_x+31,$pdf_y+12,1,"","0:220:220:200",2);
ONO::Lib::PDF::Draw->font("HB",24);
ONO::Lib::PDF::Draw->text($canvas,$pdf_x+15,$pdf_y+9,$tables[$i],"c");
ONO::Lib::PDF::Draw->font("H",12);
for (my $c = 1; $c < 11; $c++) {
my $r = $tables[$i] * $c;
my $off_y = $c*7.3;
ONO::Lib::PDF::Draw->text($canvas, $pdf_x+ 8, 12+$pdf_y+$off_y,$c,"r");
if ($tables[$i] == 10) {
ONO::Lib::PDF::Draw->circle($canvas,$pdf_x+9.50,10.5+$pdf_y+$off_y,0.5,1,1);
} else {
ONO::Lib::PDF::Draw->circle($canvas,$pdf_x+9.75,10.5+$pdf_y+$off_y,0.5,1,1);
}
ONO::Lib::PDF::Draw->text($canvas, $pdf_x+15.5,12+$pdf_y+$off_y,$tables[$i],"r");
if ($r > 99) {
ONO::Lib::PDF::Draw->text($canvas, $pdf_x+16.5, 12+$pdf_y+$off_y,"=");
} else {
ONO::Lib::PDF::Draw->text($canvas, $pdf_x+18, 12+$pdf_y+$off_y,"=");
}
if ($vars{'app_input_fill_status'} eq "filled") {
ONO::Lib::PDF::Draw->font("HB");
ONO::Lib::PDF::Draw->text($canvas, $pdf_x+27, 12+$pdf_y+$off_y,$r,"r");
ONO::Lib::PDF::Draw->font("H");
}
if ($vars{'app_input_fill_status'} eq "empty") {
ONO::Lib::PDF::Draw->line($canvas,$pdf_x+22,12+$pdf_y+$off_y,$pdf_x+29,12+$pdf_y+$off_y,0,5);
}
}
$pdf_x = $pdf_x + 34;
if ($i == 4) {
$pdf_x = 0;
$pdf_y = 95;
}
}
}
}
ONO::FW::Apps::PDF->end;
$WEB .= ONO::FW::Apps::Core->output_paper($pdfkey,\%BLK,\%vars,$HTTP,$BASE);
} else {
my ($CONF,$CUSTOM,$CUSTOM2,$sel,$sel_num);
for (my $i = 1; $i < 11; $i++) {
if ($vars{"app_input_mulrow_$i"}) {
$sel_num++;
}
}
if ($sel_num < 1) {
$sel++;
}
for (my $i = 1; $i < 11; $i++) {
my $SWITCH = ONO::Lib::UI::Check->switch("app_input_mulrow_$i",qq~$vars{"app_input_mulrow_$i"}$sel~,"m");
$CUSTOM .= qq~<tr><td>$SWITCH</td><td class="pad5_2">$i</td></tr>~;
}
$CUSTOM = qq~<table class="default_table">$CUSTOM</table>~;
if (!$vars{'app_input_print_options_title'}) {
$vars{'app_input_print_options_title'} = ucfirst $txt[1];
}
$CONF .= ONO::FW::Apps::ToolBox->conf_input("codetitle", $BLK_ref,\%vars,"", "", $vars{'app_input_print_options_code'},$vars{'app_input_print_options_title'});
$CONF .= ONO::FW::Apps::ToolBox->conf_input("custom", $BLK_ref,\%vars,"T", "$txt[1]", $CUSTOM);
$CONF .= ONO::FW::Apps::ToolBox->conf_input("tabs", $BLK_ref,\%vars,"", "", "fill","filled:dark:1 x 1 = 1;empty:dark:1 x 1 = ...");
$vars{'conf_box_title'} = $txt[0];
$vars{'conf_box_icon'} = "devices/print_printer";
$vars{'output_paper_custom_text'} = $BLK{'print'};
$CONF .= qq~<input type="hidden" name="mode" value="worksheet_download"><input type="hidden" name="table_generator" value="enabled">~;
$WEB .= ONO::FW::Apps::Core->conf_box(
$db,
$community,
$app,
$form,
"",
$action_url,
$CONF,
$lang,
$BLK_ref,
\%vars,
"p-nd-D-u-Qt",
);
}
} else {
#############################################################
# EXERCISE SETUP
#############################################################
if (!$vars{'app_input_number_of_questions'}) {
$vars{'app_input_number_of_questions'} = 20;
if (ONO::IO->device eq "phone") {
$vars{'app_input_number_of_questions'} = 10;
}
}
my ($CONF,$CUSTOM,$CUSTOM2,%setup,$rows_selected);
my @tabs = ("std:green:x • Y = ?","mix:green:Y • x = ?","var:green:x • ? = z");
$CUSTOM2 = ONO::Lib::UI::Select->buttons(
"app_input_extype",
$vars{'app_input_extype_status'},
\@tabs,
"",
"f",
$BLK_ref,
\%setup,
);
$vars{'app_input_range_defaults'} = "0:10;0:25;0:50;0:100;0:200";
if ($vars{'app_input_extype_calculate'} < 1 && $vars{'app_input_extype_images'} < 1) {
$vars{'app_input_extype_calculate'} = 1;
}
my %sel;
$sel{$vars{'app_input_extype_images_opts'}} = " selected";
my $IMG = qq~<table class="default_table">
<tr>
<td class="p0">$txt[7]</td>
<td></td>
<td class="p0">
<div class="select_small"><select name="app_input_extype_images_opts">
<option value="di"$sel{'di'}>$txt[8] & $BLK{'images'}</option>
<option value="i"$sel{'i'}>$BLK{'images'}</option>
<option value="d"$sel{'d'}>$txt[8]</option>
</select></div>
</td>
</tr>
</table>
~;
my $CONF .= ONO::FW::Apps::ToolBox->conf_input("range", $BLK_ref,\%vars,"",0,100,1000);
$CONF .= ONO::FW::Apps::ToolBox->conf_input("spacer", $BLK_ref,\%vars);
$CONF .= ONO::FW::Apps::ToolBox->conf_input("ops", $BLK_ref,\%vars,"","md-M");
$CONF .= ONO::FW::Apps::ToolBox->conf_input("spacer", $BLK_ref,\%vars);
$CONF .= ONO::FW::Apps::ToolBox->conf_input("mulrows", $BLK_ref,\%vars,"","",1,20,10,"bms");
$CONF .= ONO::FW::Apps::ToolBox->conf_input("spacer", $BLK_ref,\%vars);
$CONF .= ONO::FW::Apps::ToolBox->conf_input("custom", $BLK_ref,\%vars,"","",$CUSTOM2);
$CONF .= ONO::FW::Apps::ToolBox->conf_input("spacer", $BLK_ref,\%vars);
$CONF .= ONO::FW::Apps::ToolBox->conf_input("check", $BLK_ref,\%vars,"ST","","extype_calculate",$vars{'app_input_extype_calculate'},qq~<div class="lh125">$txt[6], $BLK{'and'}/$BLK{'or'}...</div>~);
$CONF .= ONO::FW::Apps::ToolBox->conf_input("check", $BLK_ref,\%vars,"S","","extype_images",$vars{'app_input_extype_images'},$IMG);
$CONF .= ONO::FW::Apps::ToolBox->conf_input("spacer", $BLK_ref,\%vars);
$CONF .= ONO::FW::Apps::ToolBox->conf_input("resulthints", $BLK_ref,\%vars,"","S");
my $SWITCHES;
if (!$vars{'app_input_extype_images'}) {
$SWITCHES .= "O";
}
$WEB .= ONO::FW::Apps::Core->conf_box(
$db,
$community,
$app,
$form,
"",
$action_url,
$CONF,
$lang,
$BLK_ref,
\%vars,
"op-ncdi-CDI-lsu-N$SWITCHES",
);
my $PDF = ONO::FW::Apps::Info->display_pdf("edu","multiply","/images/morzino/apps/multiplication_tables.jpg",180,"f");
my $APPS_BASE = ONO::FW::Apps::ToolBox->apps_base();
$WEB .= qq~<div class="abs hide800" style="top:10px;right:20px;width:380px;height:340px">
<a href="${action_url}mode=worksheet_download">
<div class="auto" style="width:180px;height:252px">
$PDF
</div>
</a>
<div class="abs" style="top:260px;width:380px">
<div class="pad10_2 center italic col9 mb5 lh125">$txt[0]</div>
<div class="bb"><div class="inline auto"><a href="${action_url}mode=worksheet_download" class="button_green mb20">$BLK{'download'}</a></div></div>
<div class="p2"></div>
<table class="default_table mt10">
<tr class="vtop">
<td>
<table class="default_table mt2">
<tr style="background-color:#8cbe3f">
<td style="padding:3px 2px 3px 3px"><div class="bg_paper block10 radius5 trans80"></div></td>
<td style="padding:3px 2px 3px 2px"><div class="bg_paper block10 radius5 trans80"></div></td>
<td style="padding:3px 2px 3px 2px"><div class="bg_paper block10 radius5 trans80"></div></td>
<td style="padding:3px 2px 3px 2px"><div class="bg_paper block10 radius5 trans80"></div></td>
<td style="padding:3px 3px 3px 2px"><div class="bg_paper block10 radius5 trans80"></div></td>
</tr>
<tr>
<td style="padding:1px 0px 0px 0px"></td>
</tr>
<tr style="background-color:#8cbe3f">
<td style="padding:3px 2px 3px 3px"><div class="bg_paper block10 radius5 trans80"></div></td>
<td style="padding:3px 2px 3px 2px"><div class="bg_paper block10 radius5 trans80"></div></td>
<td style="padding:3px 2px 3px 2px"><div class="bg_paper block10 radius5 trans80"></div></td>
<td style="padding:3px 2px 3px 2px"><div class="bg_paper block10 radius5 trans80"></div></td>
<td style="padding:3px 3px 3px 2px"><div class="bg_paper block10 radius5 trans80"></div></td>
</tr>
<tr>
<td style="padding:1px 0px 0px 0px"></td>
</tr>
<tr style="background-color:#8cbe3f">
<td style="padding:3px 2px 3px 3px"><div class="bg_paper block10 radius5 trans80"></div></td>
<td style="padding:3px 2px 3px 2px"><div class="bg_paper block10 radius5 trans80"></div></td>
<td style="padding:3px 2px 3px 2px"><div class="bg_paper block10 radius5 trans80"></div></td>
<td style="padding:3px 2px 3px 2px"><div class="bg_paper block10 radius5 trans80"></div></td>
<td style="padding:3px 3px 3px 2px"><div class="bg_paper block10 radius5 trans80"></div></td>
</tr>
</table>
<div class="center col9 small">3 • 5 = 15</div>
</td>
<td class="p5"></td>
<td>
<div class="lh125 col6">$txt[3]</div>
<div class="inline"><a href="$BASE/$APPS_BASE/math_rods/" class="button_green button_small mt10" target="_parent">$txt[4]</a></div>
</td>
</tr>
</table>
</div>
</div>
~;
}
}
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__