package ONO::FW::Edu::Apps::Modules::Compare;
################################################################################
# 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::PDF;
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::FW::Apps::Core::Math;
use ONO::FW::Apps::Core::Check;
use ONO::Lib::Parser;
use ONO::IO;
use ONO::Lib::Basic;
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 = "compare";
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 @txt = (
"number ordering",
);
if ($vars{'app_lang'} eq "de") {
@txt = (
"Zahlen ordnen",
);
}
if ($vars{'app_lang'} eq "lu") {
@txt = (
"Zuelen uerdnen",
);
}
if ($vars{'app_lang'} eq "fr") {
@txt = (
"numbres en ordre",
);
}
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)) {
$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'}) {
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) = (0,0,0,0);
if ($vars{'output_web_count_cor'}) {
$stat_correct = $vars{'output_web_count_cor'};
}
if ($vars{'output_web_count_mis'}) {
$vars{'output_web_mistakes'} = $vars{'output_web_count_mis'};
}
if ($vars{'output_web_count_wro'}) {
$stat_wrong = $vars{'output_web_count_wro'};
}
my (@op,@op_symbol,@op2,@op_symbol2,$op_symbol_opts,@num1,@num2,@num3,@num4,@res1,@res2);
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";
if ($vars{'app_input_nums_3'} || $vars{'app_input_nums_4'} || $vars{'app_input_nums_5'}) {
$questions_per_page = 40;
}
}
$stat_todo = $vars{'app_input_number_of_questions'};
foreach my $copy (ONO::FW::Apps::Core->unique_copies($vars{'app_input_print_options_unique_copies'})) {
my ($pdf_x,$pdf_y) = (0,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::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'},$stat_correct);
$WEB .= ONO::FW::Apps::Core->stats("",$BLK_ref,"ctmW");
}
}
if ($vars{'output_web'} && $vars{'output_web_count_cor'} > $vars{'app_input_number_of_questions'}-1) {
$vars{'output_web_finish'}++;
}
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++) {
if ($vars{'output_web'}) {
$vars{"output_web_answer_$i"} =~ s~\,~\.~g;
$vars{"output_web_answer_$i"} = uc $vars{"output_web_answer_$i"};
$vars{"output_web_answer_$i"} =~ s~[^0-9\.\I\V\X\L\C\D\M\-]~~gi;
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"};
}
} else {
if (!$vars{"output_web_answer"} || ($vars{"output_web_answer"})) {
$vars{'output_web_answer_status'} = 2;
# $op[$i] = $vars{"output_web_cache_op_$i"};
} else {
$question_number++;
$vars{'output_web_answer_status'} = 1;
$vars{'output_web_answer'} = "";
}
}
}
if (!$op[$i]) {
$op[$i] = ONO::FW::Apps::Core->random_operation(ONO::FW::Apps::Core->get_operations($vars_ref));
}
my $SYM = "=";
my ($dual1,$dual2,@subnum);
if ($vars{"question_${i}_num_1"} ne "" && $vars{"question_${i}_num_2"} ne "") {
$num1[$i] = $vars{"question_${i}_num_1"};
$num2[$i] = $vars{"question_${i}_num_2"};
$num1[$i] =~ s~##_OPEN_##~\<~g;
$num1[$i] =~ s~##_CLOSE_##~\>~g;
$num1[$i] =~ s~##_QUOT_##~\"~g;
$num2[$i] =~ s~##_OPEN_##~\<~g;
$num2[$i] =~ s~##_CLOSE_##~\>~g;
$num2[$i] =~ s~##_QUOT_##~\"~g;
$SYM = $vars{"question_${i}_sym"};
$SYM =~ s~SM~\<~;
$SYM =~ s~GR~\>~;
$SYM =~ s~EQ~\=~;
} else {
$num1[$i] = ONO::FW::Apps::Core::Math->random_number($vars{'app_input_range_from'},$vars{'app_input_range_to'},$vars{'app_input_range_from'},$vars{'app_input_range_to'},\%vars);
$num2[$i] = $num1[$i]-int(rand($num1[$i]/3));
if (int(rand(100)) > 50) {
my $cache = $num1[$i];
$num1[$i] = $num2[$i];
$num2[$i] = $cache;
}
if ($num1[$i] > $num2[$i]) {
$SYM = ">";
}
if ($num1[$i] < $num2[$i]) {
$SYM = "<";
}
if ($vars{'app_input_nums_3'} || $vars{'app_input_nums_4'}) {
if (int(rand(100)) > 25) {
if (int(rand(100)) > 50) {
$dual1++;
} else {
$dual2++;
}
if ($vars{'app_input_nums_4'} && int(rand(100)) > 33) {
$dual1++;
$dual2++;
}
}
if ($dual1) {
$op[$i] = ONO::FW::Apps::Core->random_operation(ONO::FW::Apps::Core->get_operations($vars_ref));
$op_symbol[$i] = ONO::FW::Apps::Core->operation_symbol($op[$i],$op_symbol_opts);
($subnum[0],$subnum[1]) = &subnums("",$num1[$i],$op[$i],$vars{'app_input_range_to'},$vars{'app_input_comma_status'},$vars{'app_input_negative'},$vars{'app_input_numsys_status'});
($subnum[0],$subnum[1]) = ONO::FW::Apps::Core->numsys($subnum[0],$subnum[1],0,$vars{'app_input_numsys_status'});
if (($op[$i] eq "mul" || $op[$i] eq "div") && $vars{'app_input_op_muldiv_bigger_10'} < 10) {
$subnum[0] = 1+int(rand(10));
$subnum[1] = 1+int(rand(10));
if ($op[$i] eq "div") {
$subnum[0] = $subnum[0] * $subnum[1];
}
}
$res1[$i] = ONO::FW::Apps::Core::Math->calc($subnum[0],$op[$i],$subnum[1]);
$SYM = "=";
if ($res1[$i] > $num2[$i]) {
$SYM = ">";
}
if ($res1[$i] < $num2[$i]) {
$SYM = "<";
}
}
if ($dual2) {
$op2[$i] = ONO::FW::Apps::Core->random_operation(ONO::FW::Apps::Core->get_operations($vars_ref));
$op_symbol2[$i] = ONO::FW::Apps::Core->operation_symbol($op2[$i],$op_symbol_opts);
($subnum[2],$subnum[3]) = &subnums("",$num2[$i],$op2[$i],$vars{'app_input_range_to'},$vars{'app_input_comma_status'},$vars{'app_input_negative'},$vars{'app_input_numsys_status'});
($subnum[2],$subnum[3]) = ONO::FW::Apps::Core->numsys($subnum[2],$subnum[3],0,$vars{'app_input_numsys_status'});
if (($op2[$i] eq "mul" || $op2[$i] eq "div") && $vars{'app_input_op_muldiv_bigger_10'} < 10) {
$subnum[2] = 1+int(rand(10));
$subnum[3] = 1+int(rand(10));
if ($op2[$i] eq "div") {
$subnum[2] = $subnum[2] * $subnum[3];
}
}
$res2[$i] = ONO::FW::Apps::Core::Math->calc($subnum[2],$op2[$i],$subnum[3]);
$SYM = "=";
if ($num1[$i] > $res2[$i]) {
$SYM = ">";
}
if ($num1[$i] < $res2[$i]) {
$SYM = "<";
}
if ($dual1) {
$SYM = "=";
if ($res1[$i] > $res2[$i]) {
$SYM = ">";
}
if ($res1[$i] < $res2[$i]) {
$SYM = "<";
}
}
}
}
($num1[$i],$num2[$i]) = ONO::FW::Apps::Core->numsys($num1[$i],$num2[$i],0,$vars{'app_input_numsys_status'});
$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);
for (my $s = 0; $s < 4; $s++) {
$subnum[$s] = ONO::FW::Apps::Core->make_human_readable($subnum[$s],$num_comma,$num_delimiter);
}
}
# 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 = (23,10,23,0,0);
if ($vars{'app_input_nums_3'} || $vars{'app_input_nums_4'} || $vars{'app_input_nums_5'}) {
@pos = (40,20,40,8,8);
}
my ($fontsize,$fontreset,$maxlength);
foreach my $opt ($num1[$i],$num2[$i],$subnum[0],$subnum[1],$subnum[2],$subnum[3]) {
if (length $opt > $maxlength) {
$maxlength = length $opt;
}
}
if ($maxlength > 5) {
$fontsize = 17-$maxlength;
$fontreset = 12;
}
my @order_nums;
if ($vars{'app_input_nums_5'} && $i%5 == 0) {
my $alts;
foreach my $alt (2,3,4) {
if ($vars{"app_input_nums_$alt"}) {
$alts++;
}
}
if (!$alts || int(rand(100)) > $alts*25) {
$vars{'order_mode'} = 1+int(rand(4));
my %used;
for (my $n = 0; $n < 10; $n++) {
my ($whilecounter,$num);
while ($whilecounter < 4096 && ($num eq "" || $used{$num})) {
$whilecounter++;
$num = ONO::FW::Apps::Core::Math->random_number($vars{'app_input_range_from'},$vars{'app_input_range_to'},$vars{'app_input_range_from'},$vars{'app_input_range_to'},\%vars);
}
$used{$num}++;
$order_nums[$n] = $num;
}
foreach my $key (keys %used) {
if ($used{$key} > 1) {
@order_nums = (0,1,2,3,4,5,6,7,8,9);
}
}
}
}
$corr_cache[$i] = "$op[$i]\^$op_symbol[$i]\^$op2[$i]\^$op_symbol2[$i]\^$SYM\^$num1[$i]\^$num2[$i]\^$dual1\^$dual2\^$subnum[0]\^$subnum[1]\^$subnum[2]\^$subnum[3]\^";
$corr_cache[$i] .= "$pdf_x\^$pdf_y\^$fontsize\^$fontreset\^$vars{'order_mode'}\^$pos[0]\^$pos[1]\^$pos[2]\^$pos[3]\^";
$corr_cache[$i] .= "$order_nums[0]\^$order_nums[1]\^$order_nums[2]\^$order_nums[3]\^$order_nums[4]\^";
$corr_cache[$i] .= "$order_nums[5]\^$order_nums[6]\^$order_nums[7]\^$order_nums[8]\^$order_nums[9]\^";
&draw_pdf_page(
"",
0,
$i,
$canvas,
$pdf_x,
$pdf_y,
$vars{'order_mode'},
"",
$op[$i],
$op2[$i],
$op_symbol[$i],
$op_symbol2[$i],
$num1[$i],
$num2[$i],
$dual1,
$dual2,
$subnum[0],
$subnum[1],
$subnum[2],
$subnum[3],
$fontsize,
$fontreset,
\@pos,
\@order_nums,
$num_comma,
$num_delimiter,
);
if (($i-4)%5 == 0) {
$vars{'order_mode'} = 0;
}
$pdf_y = $pdf_y + 8;
if (($i+1)%5 == 0) {
$pdf_y = $pdf_y + 7.5;
}
if ($pdf_y > 190) {
$pdf_x = $pdf_x + 60;
if ($vars{'app_input_nums_3'} || $vars{'app_input_nums_4'} || $vars{'app_input_nums_5'}) {
$pdf_x = $pdf_x + 28;
}
$pdf_y = 8;
}
}
if ($vars{'output_web'}) {
if ($dual1) {
$num1[$i] = qq~$subnum[0] $op_symbol[$i] $subnum[1]~;
}
if ($dual2) {
$num2[$i] = qq~$subnum[2] $op_symbol2[$i] $subnum[3]~;
}
# $WEB .= qq~<input type="hidden" name="output_web_cache_op_$i" value="$op[$i]">
# <input type="hidden" name="output_web_cache_op2_$i" value="$op2[$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_num3_$i" value="$num3[$i]">
# <input type="hidden" name="output_web_cache_res1_$i" value="$res1[$i]">
# ~;
my $HINT;
if (ONO::IO->devstation) {
$HINT = $SYM;
}
my $CORR = 1;
my $SOL = "=";
if ($SYM eq "<") {
$CORR = 0;
$SOL = "<";
}
if ($SYM eq ">") {
$CORR = 2;
$SOL = ">";
}
my @BUTS = ONO::FW::Apps::Core::Math->compare_buttons($i,$CORR,$SOL,$SYM,$stat_wrong,$questions_per_page,\%vars);
if ($i == 0) {
$WEB .= ONO::FW::Apps::Core::Math->compare_input($stat_correct,$vars{'output_web_mistakes'},$stat_wrong,$stat_todo);
$WEB .= ONO::FW::Apps::Core::Math->compare_script();
}
if ($vars{'app_input_multiple_questions_per_page'}) {
my ($BG,$is_correct);
if ($vars{"output_web_answer_$i"} =~ /[A-Z0-9\.]/) {
$BG = " bg_red";
$stat_todo--;
}
my $trans1 = $num1[$i];
my $trans2 = $num2[$i];
$trans1 =~ s~\<~##_OPEN_##~g;
$trans1 =~ s~\>~##_CLOSE_##~g;
$trans1 =~ s~\"~##_QUOT_##~g;
$trans2 =~ s~\<~##_OPEN_##~g;
$trans2 =~ s~\>~##_CLOSE_##~g;
$trans2 =~ s~\"~##_QUOT_##~g;
my $SYMDAT = $SYM;
$SYMDAT =~ s~\<~SM~g;
$SYMDAT =~ s~\>~GR~g;
$SYMDAT =~ s~\=~EQ~g;
$WEB .= qq~<tr class="bt bb$BG">
<td class="w50 tar">$num1[$i]</td>
<td class="p0">
<table class="default_table auto">
<tr>
<td class="p0">$BUTS[0]</td>
<td class="p0">$BUTS[1]</td>
<td class="p0">$BUTS[2]</td>
</tr>
</table>
</td>
<td class="w50">$num2[$i]</td>
<td>
<div class="block32">$HINT</div>
<input type="hidden" name="question_${i}_num_1" value="$trans1">
<input type="hidden" name="question_${i}_num_2" value="$trans2">
<input type="hidden" name="question_${i}_sym" value="$SYMDAT">
<input type="hidden" id="answered_id_$i" name="answered_$i" value="$vars{"answered_$i"}">
<input type="hidden" id="answered_id_${i}_err_1" name="answered_${i}_err_1" value="$vars{"answered_${i}_err_1"}">
<input type="hidden" id="answered_id_${i}_err_2" name="answered_${i}_err_2" value="$vars{"answered_${i}_err_2"}">
<input type="hidden" id="answered_id_${i}_err_3" name="answered_${i}_err_3" value="$vars{"answered_${i}_err_3"}">
</td>
</tr>
~;
} else {
if ($questions_per_page == 1 && $i == 0) {
$WEB .= ONO::FW::Apps::Core::Check->check_custom(
qq~<td class="pad10_2 bold">$num1[0]</td>
<td class="p0">$BUTS[0]</td>
<td class="p0">$BUTS[1]</td>
<td class="p0">$BUTS[2]</td>
<td class="pad10_2 bold">$num2[0]</td>
<td class="p0"><img id="loading_img" class="hide" src="/ono/osr/images/spacer/trans.gif" alt=""></td>
~,
);
}
}
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) {
# code is above...
} else {
$WEB .= ONO::FW::Apps::Core->check_multi($BLK_ref,$stat_todo+$stat_wrong,$page,$pages,"",\%vars);
}
$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::Lib::PDF::ToolBox->canvas_test($canvas);
for (my $c = 0; $c < $questions_per_page; $c++) {
my (
$op,$op_symbol,$op2,$op_symbol2,$SYM,$num1,$num2,$dual1,$dual2,$subnum0,$subnum1,$subnum2,$subnum3,
$pdf_x,$pdf_y,$fontsize,$fontreset,$order_mode,
$pos0,$pos1,$pos2,$pos3,
$order_nums0,$order_nums1,$order_nums2,$order_nums3,$order_nums4,
$order_nums5,$order_nums6,$order_nums7,$order_nums8,$order_nums9,
) = split(/\^/,$corr_cache[$c]);
my @pos = ($pos0,$pos1,$pos2,$pos3);
my @order_nums = ($order_nums0,$order_nums1,$order_nums2,$order_nums3,$order_nums4,$order_nums5,$order_nums6,$order_nums7,$order_nums8,$order_nums9);
&draw_pdf_page(
"",
1,
$c,
$canvas,
$pdf_x,
$pdf_y,
$order_mode,
$SYM,
$op,
$op2,
$op_symbol,
$op_symbol2,
$num1,
$num2,
$dual1,
$dual2,
$subnum0,
$subnum1,
$subnum2,
$subnum3,
$fontsize,
$fontreset,
\@pos,
\@order_nums,
$num_comma,
$num_delimiter,
);
}
}
}
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);
$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;
if (ONO::IO->device eq "phone") {
$vars{'app_input_number_of_questions'} = 10;
}
}
if (!$vars{'app_input_nums_2'} && !$vars{'app_input_nums_3'} && !$vars{'app_input_nums_4'} && !$vars{'app_input_nums_5'}) {
$vars{'app_input_nums_2'}++;
}
$WEB .= ONO::FW::Apps::Core->infopics(
"screen:320:50:50::compare_screenshot_1.jpg",
"sheet:168:180:120:15:compare_sheet_1.jpg",
"sheet:168:40:150:-10:compare_sheet_2.jpg",
);
my $HIDE = "H";
if ($vars{'app_input_nums_3'} || $vars{'app_input_nums_4'}) {
$HIDE = "";
}
my $ORDER = "A < B < C < D ($txt[0])";
my $CONF .= ONO::FW::Apps::ToolBox->conf_input("range", $BLK_ref,\%vars,"",1,100,9999999);
$CONF .= ONO::FW::Apps::ToolBox->conf_input("moreopts", $BLK_ref,\%vars,"","bm");
$CONF .= ONO::FW::Apps::ToolBox->conf_input("negative", $BLK_ref,\%vars,"h");
$CONF .= ONO::FW::Apps::ToolBox->conf_input("numsys", $BLK_ref,\%vars,"h");
$CONF .= ONO::FW::Apps::ToolBox->conf_input("comma", $BLK_ref,\%vars,"h",3);
$CONF .= ONO::FW::Apps::ToolBox->conf_input("spacer", $BLK_ref,\%vars);
$CONF .= ONO::FW::Apps::ToolBox->conf_input("check", $BLK_ref,\%vars,"","","nums_2",$vars{'app_input_nums_2'},"A <=> B");
$CONF .= ONO::FW::Apps::ToolBox->conf_input("check", $BLK_ref,\%vars,"o","","nums_3",$vars{'app_input_nums_3'},"A + B <=> C");
$CONF .= ONO::FW::Apps::ToolBox->conf_input("check", $BLK_ref,\%vars,"o","","nums_4",$vars{'app_input_nums_4'},"A + B <=> C + D");
if (!$vars{'output_web'}) {
$CONF .= ONO::FW::Apps::ToolBox->conf_input("check", $BLK_ref,\%vars,"o","","nums_5",$vars{'app_input_nums_5'},$ORDER);
}
$CONF .= ONO::FW::Apps::ToolBox->conf_input("spacer", $BLK_ref,\%vars,"","");
$CONF .= ONO::FW::Apps::ToolBox->conf_input("ops", $BLK_ref,\%vars,"","asmd-AS-i$HIDE-t");
$CONF .= ONO::FW::Apps::ToolBox->conf_input("spacer", $BLK_ref,\%vars,"","s");
$WEB .= ONO::FW::Apps::Core->conf_box(
$db,
$community,
$app,
$form,
"",
$action_url,
$CONF,
$lang,
$BLK_ref,
\%vars,
"op-ncdi-CDI-lsu-NO",
);
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 draw_pdf_page {
my (
$self,
$corr_mode,
$i,
$canvas,
$pdf_x,
$pdf_y,
$order_mode,
$SYM,
$op,
$op2,
$op_symbol,
$op_symbol2,
$num1,
$num2,
$dual1,
$dual2,
$subnum0,
$subnum1,
$subnum2,
$subnum3,
$fontsize,
$fontreset,
$pos_ref,
$order_nums_ref,
$num_comma,
$num_delimiter,
) = @_;
my @pos = @$pos_ref;
my @order_nums = @$order_nums_ref;
if ($order_mode) {
if ($i%5 == 0) {
my @SYMS = ("<","<");
if ($order_mode == 2) {
@SYMS = (">",">");
}
if ($order_mode == 3) {
@SYMS = ("<",">");
}
if ($order_mode == 4) {
@SYMS = (">","<");
}
for (my $a = 0; $a < 2; $a++) {
my @nums = ($order_nums[0],$order_nums[1],$order_nums[2],$order_nums[3],$order_nums[4]);
if ($a == 1) {
@nums = ($order_nums[5],$order_nums[6],$order_nums[7],$order_nums[8],$order_nums[9]);
}
@nums = ONO::Lib::Basic->array_sortbynumber(@nums);
my $SYM = $SYMS[$a];
if ($SYM eq ">") {
@nums = reverse @nums;
}
my $font_size = 10;
my $font_y = 0;
if (length "$nums[0]$nums[1]$nums[2]$nums[3]$nums[4]" > 10) {
$font_size = 9;
if (length "$nums[0]$nums[1]$nums[2]$nums[3]$nums[4]" > 15) {
$font_size = 8;
$font_y = 0.25;
if (length "$nums[0]$nums[1]$nums[2]$nums[3]$nums[4]" > 20) {
$font_size = 7;
$font_y = 0.33;
}
}
}
ONO::Lib::PDF::Draw->font('',$font_size);
if (!$corr_mode) {
my ($c1,$c2,$c3) = (200+int(rand(45)),200+int(rand(45)),200+int(rand(45)));
my $ncount;
foreach my $num (ONO::Lib::Basic->randomize_array(@nums)) {
my $txt_x = $pdf_x+$pos[0]-21+$ncount*12;
my $txt_y = $pdf_y+$a*20+5;
if ($num_comma ne ".") {
$num =~ s~\.~$num_comma~;
}
ONO::Lib::PDF::Draw->rect($canvas,$txt_x-5,$txt_y-4,$txt_x+5,$txt_y+1.5,1,"0:22:22:22","0:$c1:$c2:$c3",1);
ONO::Lib::PDF::Draw->text($canvas,$txt_x,$txt_y-$font_y,$num,"c");
$ncount++;
}
ONO::Lib::PDF::Draw->font('',12);
}
for (my $n = 0; $n < 5; $n++) {
ONO::Lib::PDF::Draw->line($canvas,$pdf_x+$pos[0]+($n*16)-35,$pdf_y+15+$a*20,$pdf_x+$pos[0]+(($n+1)*16)-40,$pdf_y+15+$a*20);
if ($corr_mode) {
if ($num_comma ne ".") {
$nums[$i] =~ s~\.~$num_comma~;
}
ONO::Lib::PDF::Draw->text($canvas,$pdf_x+$pos[0]+($n*16)-29.5,$pdf_y+13+$a*20, $nums[$n],"c");
}
if ($n) {
ONO::Lib::PDF::Draw->circle($canvas,$pdf_x+$pos[0]+($n*16)-37.5,$pdf_y+12+$a*20,2.5,0.5,"0:244:244:244","0:111:111:111");
ONO::Lib::PDF::Draw->text_math_symbol($canvas,$pdf_x+$pos[0]+($n*16)-37.5,$pdf_y+12+$a*20, 3, $SYM);
}
}
}
}
} else {
ONO::Lib::PDF::Draw->circle($canvas,$pdf_x+$pos[2], $pdf_y-1,3.5);
ONO::Lib::PDF::Draw->text($canvas,$pdf_x+$pos[0], $pdf_y, $SYM,"c");
ONO::Lib::PDF::Draw->font('',$fontsize);
if ($dual1) {
ONO::Lib::PDF::Draw->text_math_symbol($canvas,$pdf_x+$pos[2]-$pos[1], $pdf_y-1.5, 2.5, $op_symbol);
ONO::Lib::PDF::Draw->text($canvas,$pdf_x+$pos[2]-$pos[1]-$pos[3], $pdf_y, $subnum0,"c");
ONO::Lib::PDF::Draw->text($canvas,$pdf_x+$pos[2]-$pos[1]+$pos[3], $pdf_y, $subnum1,"c");
} else {
ONO::Lib::PDF::Draw->text($canvas,$pdf_x+$pos[0]-$pos[1]+$pos[4], $pdf_y, $num1,"c");
}
if ($dual2) {
ONO::Lib::PDF::Draw->text_math_symbol($canvas,$pdf_x+$pos[2]+$pos[1], $pdf_y-1.5, 2.5, $op_symbol2);
ONO::Lib::PDF::Draw->text($canvas,$pdf_x+$pos[2]+$pos[1]-$pos[3], $pdf_y, $subnum2,"c");
ONO::Lib::PDF::Draw->text($canvas,$pdf_x+$pos[2]+$pos[1]+$pos[3], $pdf_y, $subnum3,"c");
} else {
ONO::Lib::PDF::Draw->text($canvas,$pdf_x+$pos[0]+$pos[1]-$pos[4], $pdf_y, $num2,"c");
}
ONO::Lib::PDF::Draw->font('',$fontreset);
}
ONO::Lib::PDF::Draw->font('',12);
}
sub subnums {
my (
$self,
$num,
$op,
$max,
$comma,
$neg,
$numsys,
) = @_;
my ($num1,$num2) = (0,0);
my ($comma_num1,$comma_num2);
if ($comma > 0 && int(rand(100)) > 20 && $numsys ne "roman" && $numsys ne "hex") {
$comma_num1 = int(rand(10))/10;
$comma_num2 = int(rand(10))/10;
if ($comma > 1 && int(rand(100)) > 20) {
$comma_num1 = int(rand(100))/100;
$comma_num2 = int(rand(100))/100;
if ($comma > 2 && int(rand(100)) > 20) {
$comma_num1 = int(rand(1000))/1000;
$comma_num2 = int(rand(1000))/1000;
}
}
}
if ($op eq "add") {
$num1 = int(rand($num))+$comma_num1;
$num2 = $num-$num1+$comma_num2;
}
if ($op eq "sub") {
$num2 = int(rand($num))+$comma_num1;
$num1 = $num+$num1+$comma_num2;
if ($num1 > $max) {
$num1 = $max-int(rand($max/3));
$num2 = int(rand($num1));
}
if ($num2 > $num1) {
my $cache = $num1;
$num1 = $num2;
$num2 = $cache;
}
}
if ($op eq "mul" || $op eq "div") {
($num1,$num2) = (1,1);
my ($res,$pre) = (1,1);
my $whilecounter;
while ($whilecounter < 255 && $res < $num) {
$whilecounter++;
$pre = $res;
if ($num1 < $num2) {
$num1 = $num1*(int(rand(5))+1);
} else {
$num2 = $num2*(int(rand(5))+1);
}
$res = $num1 * $num2;
}
# use pre if res is too big
if ($num1 * $num2 > $max) {
$res = $pre;
}
# use dirty trick if res is still too big
if ($num1 * $num2 > $max) {
$num1 = int(sqrt($num));
$num2 = int(sqrt($num));
if (int(rand(100)) > 33) {
if (int(rand(50)) > 50) {
$num1++;
} else {
$num1--;
}
}
if (int(rand(100)) > 33) {
if (int(rand(50)) > 50) {
$num2++;
} else {
$num2--;
}
}
if ($num1 * $num2 > $max) {
$num1--;
$num2--;
}
}
if ($comma) {
$num1 = $num1 + $comma_num1;
$num2 = $num2 + $comma_num2;
}
# div specials
if ($op eq "div") {
$num1 = $num1 * $num2;
if (!$num2) {
$num1 = $num;
$num2 = 1;
}
}
}
if ($neg) {
if (int(rand(100)) > 50) {
$num1 =~ s~[^0-9\.\,]~~g;
}
if (int(rand(100)) > 50) {
$num2 =~ s~[^0-9\.\,]~~g;
}
}
$num1 = ONO::FW::Apps::Core::Math->fix_fp_rounding($num1);
$num2 = ONO::FW::Apps::Core::Math->fix_fp_rounding($num2);
return ($num1,$num2);
}
###################################################################
#### THAT'S IT :-D
###################################################################
1;
__END__