ONO::FW::Edu::Apps::Modules::MathHouses

package ONO::FW::Edu::Apps::Modules::MathHouses;
################################################################################
# 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::Lib::Basic;

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::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 = "math_houses";

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 = (
"houses",
);

if ($vars{'app_lang'} eq "de") {
@txt = (
"Häuser",
);
}

if ($vars{'app_lang'} eq "fr") {
@txt = (
"maisons",
);
}

if ($vars{'app_lang'} eq "lu") {
@txt = (
"Haiser",
);
}

$vars{'app_input_print_options_title_default'} = ucfirst $txt[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_digits_status'} = 0;

(
$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_symbol_opts,$focus_on,
$page,$pages,%cache,
$whilecounter,$stats_switches,
$PDF_OPTS,
$stat_correct,$stat_wrong,$stat_todo,$stat_todo_total,
);

my $questions_per_page = 8;

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'}++;
$questions_per_page = 60;
$op_symbol_opts = "p";

}

foreach my $copy (ONO::FW::Apps::Core->unique_copies($vars{'app_input_print_options_unique_copies'})) {

my (
@op,@op_symbol,
@num1,@num2,@num3,@res,
);

my ($pdf_x,$pdf_y) = (1,22);
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::Lib::PDF::ToolBox->canvas_test($canvas);

}

# we'll need to build the main results for all houses first

my (@results,@ops,$currenthouse);

my $num_of_houses = 6;
if ($vars{'app_input_num_of_houses_status'}) {
$num_of_houses = $vars{'app_input_num_of_houses_status'};
}

for (my $i = 0; $i < $num_of_houses; $i++) {

$results[$i] = 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,
);
if ($results[$i] < 1) {
$results[$i] = $results[$i] + 1;
}

if ($vars{'app_input_range_mode'} eq "list") {
$results[$i] = ONO::FW::Apps::Core::Math->range_list($i,$vars_ref,$num_of_houses);
}

$ops[$i] = "add";
}

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";

if ($vars{'output_web_completed'}) {
$stats_switches .= "c";
$stat_correct = 8;
} else {
$stats_switches .= "aLPvV";
}

if (!$vars{'output_web_finish'}) {

$WEB .= ONO::FW::Apps::Core->stats("",$BLK_ref,"tmpx$stats_switches");

}


if ($vars{'output_web_cache_res'}) {

$results[0] = $vars{'output_web_cache_res'};

}
}

my @off_x = (15,37.5);
my $cols = 2;
my $table_colw = "w50";
if ($vars{'app_input_extype_status'} eq "tri") {
@off_x = (11.5,26.5,41.5);
$cols = 3;
$table_colw = "w33";
}

my $used_numbers = ":";

if ($vars{'output_web_finish'}) {

$vars{'output_progress_done'}++;

$WEB .= ONO::FW::Apps::Core->question_progress_done_msg($app,$db,$community,$form,$action_url,8+$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'});

my $table_width = $cols * 160;
my $table_colspan = $cols + 2;

if (ONO::IO->device("phone") && $cols == 3) {
$table_width = 320;
}

for (my $i = 0; $i < $questions_per_page; $i++) {

if ($vars{'output_web'}) {

$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"};
$num3[$i] = $vars{"output_web_cache_num3_$i"};
$res[$i] = $vars{"output_web_cache_res_$i"};

}

$res[$i] = $results[$currenthouse];
$op[$i] = $ops[$currenthouse];
$op_symbol[$i] = ONO::FW::Apps::Core->operation_symbol($op[$i],$op_symbol_opts);

if ($op[$i] eq "add") {

my $whilecounter;
if ($whilecounter < 100 && !$vars{'output_web_cache_running'} && ($num1[$i] eq "" || $used_numbers =~ /:$num1[$i]:/)) {
$whilecounter++;

$num1[$i] = ONO::FW::Apps::Core->random_number(0,$res[$i],0,$res[$i],\%vars);
$num2[$i] = $res[$i] - $num1[$i];

if ($num1[$i] == $cache{'last_num1'}) {
if ($num1[$i] > 0) {
$num1[$i]--;
} else {
$num1[$i]++;
}
$num2[$i] = $res[$i] - $num1[$i];
}

if ($num2[$i] < 0) {
$num2[$i] = 0;
$num1[$i] = $res[$i];
}

if ($num1[$i] < 0) {
$num1[$i] = 0;
$num2[$i] = $res[$i];
}

$cache{'last_num1'} = $num1[$i];

if ($vars{'app_input_extype_status'} eq "tri") {

$num2[$i] = ONO::FW::Apps::Core->random_number(0,$res[$i]-$num1[$i],0,$res[$i]-$num1[$i],$vars_ref);
$num3[$i] = $res[$i] - $num1[$i] - $num2[$i];

if ($num2[$i] < 0) {
$num1[$i] = $res[$i];
$num2[$i] = 0;
$num3[$i] = 0;
}

if ($num3[$i] < 0) {
$num1[$i] = 0;
$num2[$i] = $res[$i];
$num3[$i] = 0;
}

}

}

$num1[$i] = ONO::FW::Apps::Core->fix_fp_rounding($num1[$i]);
$num2[$i] = ONO::FW::Apps::Core->fix_fp_rounding($num2[$i]);
$num3[$i] = ONO::FW::Apps::Core->fix_fp_rounding($num3[$i]);

$used_numbers .= "$num1[$i]:";

}

if (($i-7)%8 == 0) {
$used_numbers = ":";
}

($num1[$i],$num2[$i],$num3[$i]) = ONO::FW::Apps::Core->numsys($num1[$i],$num2[$i],$num3[$i],$vars{'app_input_numsys_status'});

# output paper

if ($vars{'output_paper'}) {

my $rows = 10;
my $mul_y = 100;
my $off_y = 0;
my $houses_y = 2;
my $nex_y = 30;

if ($vars{'output_worksheet_maker'}) {
$rows = 3;
$off_y = 3;
$houses_y = 1;
}

if ($num_of_houses == 9) {
$rows = 6;
$mul_y = 65;
$houses_y = 3;
$nex_y = 23;
}

if ($num_of_houses == 12) {
$rows = 3;
$mul_y = 47.5;
$houses_y = 4;
$nex_y = 26.5;
}

if (($i-($rows-1))%$rows == 0) {
$currenthouse++;
}

if ($i == 0) {
my $housecount;
for (my $x = 0; $x < 3; $x++) {
for (my $y = 0; $y < $houses_y; $y++) {
my ($res) = ONO::FW::Apps::Core->numsys($results[$housecount],0,0,$vars{'app_input_numsys_status'});
ONO::FW::Apps::Core::Graphics->pdf_draw_house($canvas,$x*60+4,$y*$mul_y+$off_y,"$cols:$rows",ONO::FW::Apps::Core->make_human_readable($res,$num_comma,$num_delimiter),$op_symbol[$i],1);
$housecount++;
}
}
}

$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);
$num3[$i] = ONO::FW::Apps::Core->make_human_readable($num3[$i],$num_comma,$num_delimiter);

my $display_nums = 1;

if ($display_nums) {

my $qpos = int(rand($cols));

my $small_text;

if (length $num1[$i] > 4 || length $num2[$i] > 4 || length $num3[$i] > 4) {
$small_text = 10;
if (length $num1[$i] > 5 || length $num2[$i] > 5 || length $num3[$i] > 5) {
$small_text = 9;
}
ONO::Lib::PDF::Draw->font('',$small_text);
}

if ($qpos != 0) {
ONO::Lib::PDF::Draw->text($canvas,$pdf_x+$off_x[0],$pdf_y+$off_y, $num1[$i],"c");
}
if ($qpos != 1) {
ONO::Lib::PDF::Draw->text($canvas,$pdf_x+$off_x[1],$pdf_y+$off_y, $num2[$i],"c");
}
if ($qpos != 2 && $num3[$i] ne "" && $off_x[2]) {
ONO::Lib::PDF::Draw->text($canvas,$pdf_x+$off_x[2],$pdf_y+$off_y, $num3[$i],"c");
}

if ($small_text) {
ONO::Lib::PDF::Draw->font('',12);
}

$corr_cache[$i] = "$op[$i]\^$op_symbol[$i]\^$num1[$i]\^$num2[$i]\^$num3[$i]\^$pdf_x\^$pdf_y\^$qpos\^$small_text\^";

}

$pdf_y = $pdf_y + 7;
if (($i-($rows-1))%$rows == 0) {
$pdf_y = $pdf_y + $nex_y;
}
if ($pdf_y > 200 || ($vars{'output_worksheet_maker'} && $pdf_y > 40)) {
$pdf_x = $pdf_x + 60;
$pdf_y = 22;
}

}

if ($vars{'output_web'} && $i < 8) {

$WEB .= qq~<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]">
~;

}

if ($vars{'output_web'} && $i == 7) {

my ($RES) = ONO::FW::Apps::Core->numsys($results[0],0,0,$vars{'app_input_numsys_status'});
$RES = ONO::FW::Apps::Core->make_human_readable($RES,$num_comma,$num_delimiter);

$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 style="padding-top:15px">
<table class="default_table auto" style="width:${table_width}px">
<tr style="height:100px;background-image:url('/images/app_backgrounds/math_houses_roof_$table_width.png')">
<td class="bold center" style="color:#333333;font-size:x-large;padding-top:45px" colspan="$table_colspan">
<div class="box_paper auto trans90 center radius5" style="width:80px">$RES</div>
</td>
</tr>
<tr class="bg_dark">
<td colspan="$table_colspan">
</td>
</tr>
~;

$stat_todo_total = 8;
my $first_question;

for (my $q = 0; $q < 8; $q++) {

my $BG = "fabric";
my $qpos = int(rand($cols));
if ($vars{"output_web_cache_qpos_$q"} ne "") {
$qpos = $vars{"output_web_cache_qpos_$q"};
}
my @QUES = (
ONO::FW::Apps::Core->make_human_readable($num1[$q],$num_comma,$num_delimiter),
ONO::FW::Apps::Core->make_human_readable($num2[$q],$num_comma,$num_delimiter),
ONO::FW::Apps::Core->make_human_readable($num3[$q],$num_comma,$num_delimiter),
);
my $question = $num1[$q];
if ($qpos == 1) {
$question = $num2[$q];
}
if ($qpos == 2) {
$question = $num3[$q];
}
my $PLA = "?";
if (ONO::IO->devstation) {
$PLA = $question;
}

$vars{"output_web_answer_$q"} = ONO::FW::Apps::Core->clean_answer_math($vars{"output_web_answer_$q"},"r");

my $is_field = 1;

$QUES[$qpos] = qq~<input type="text" id="output_web_answer_id_$q" name="output_web_answer_$q" value="$vars{"output_web_answer_$q"}" class="center w90" placeholder="$PLA">
<input type="hidden" name="output_web_cache_qpos_$q" value="$qpos">
~;

if ($vars{"output_web_answer_$q"} ne "") {
$stat_todo_total--;
$BG = "red";

if ($question =~ /^0/) {
$question = ONO::Lib::Basic->remove_leading_zeroes_comma($question);
}

if ($vars{"output_web_answer_$q"} eq $question || ($vars{"output_web_answer_$q"} eq "0" && $question eq "/")) {
$stat_correct++;
$is_field = 0;
$BG = "green";
my $NUM = ONO::FW::Apps::Core->make_human_readable($question,$num_comma,$num_delimiter);
$QUES[$qpos] = qq~<div class="bold green">$NUM</div>
<input type="hidden" id="output_web_answer_id_$q" name="output_web_answer_$q" value="$vars{"output_web_answer_$q"}">
<input type="hidden" name="output_web_cache_qpos_$q" value="$qpos">
~;
} else {
$stat_wrong++;
$vars{'output_web_mistakes'}++;
}
}

my $QUE2;
if ($vars{'app_input_extype_status'} eq "tri") {
$QUE2 = qq~<td class="$table_colw pad10_2 center bl">$QUES[2]</td>~;
}

$WEB .= qq~ <tr class="bg_$BG bt bb">
<td class="bg_dark"><div style="height:30px"></div></td>
<td class="$table_colw pad10_2 center">$QUES[0]</td>
<td class="$table_colw pad10_2 center bl">$QUES[1]</td>
$QUE2
<td class="bg_dark"><div style="height:30px"></div></td>
</tr>
~;

if ($is_field && !$first_question) {
$WEB .= qq~<script>document.getElementById('output_web_answer_id_$q').focus();</script>~;
$first_question++;
}

}

$WEB .= qq~ </table>
</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);

$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_total+$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_total) {
# $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::Lib::PDF::ToolBox->canvas_test($canvas);

my $rows = 10;
my $off_y = 0;
my $mul_y = 100;
my $houses_y = 2;

if ($vars{'output_worksheet_maker'}) {
$rows = 3;
$off_y = 3;
$houses_y = 1;
}
if ($num_of_houses == 9) {
$rows = 6;
$mul_y = 65;
$houses_y = 3;

}
if ($num_of_houses == 12) {
$rows = 3;
$mul_y = 47.5;
$houses_y = 4;
}

my $housecount;
for (my $x = 0; $x < 3; $x++) {
for (my $y = 0; $y < $houses_y; $y++) {
my ($res) = ONO::FW::Apps::Core->numsys($results[$housecount],0,0,$vars{'app_input_numsys_status'});
ONO::FW::Apps::Core::Graphics->pdf_draw_house($canvas,$x*60+4,$y*$mul_y+$off_y,"$cols:$rows",$res,"+",1,1);
$housecount++;
}
}

for (my $c = 0; $c < $questions_per_page; $c++) {

my ($op,$op_symbol,$num1,$num2,$num3,$pdf_x,$pdf_y,$qpos,$small_text) = split(/\^/,$corr_cache[$c]);

if ($small_text) {
ONO::Lib::PDF::Draw->font('',$small_text);
}

if ($qpos == 0) {
ONO::Lib::PDF::Draw->font('HB');
ONO::Lib::PDF::Draw->text($canvas,$pdf_x+$off_x[0],$pdf_y+$off_y,$num1,"c");
ONO::Lib::PDF::Draw->font('H');
} else {
ONO::Lib::PDF::Draw->text($canvas,$pdf_x+$off_x[0],$pdf_y+$off_y,$num1,"c");
}
if ($qpos == 1) {
ONO::Lib::PDF::Draw->font('HB');
ONO::Lib::PDF::Draw->text($canvas,$pdf_x+$off_x[1],$pdf_y+$off_y,$num2,"c");
ONO::Lib::PDF::Draw->font('H');
} else {
ONO::Lib::PDF::Draw->text($canvas,$pdf_x+$off_x[1],$pdf_y+$off_y,$num2,"c");
}
if ($vars{'app_input_extype_status'} eq "tri") {
if ($qpos == 2) {
ONO::Lib::PDF::Draw->font('HB');
ONO::Lib::PDF::Draw->text($canvas,$pdf_x+$off_x[2],$pdf_y+$off_y,$num3,"c");
ONO::Lib::PDF::Draw->font('H');
} else {
ONO::Lib::PDF::Draw->text($canvas,$pdf_x+$off_x[2],$pdf_y+$off_y,$num3,"c");
}
}

if ($small_text) {
ONO::Lib::PDF::Draw->font('',12);
}

}
}

}

if ($vars{'output_web'}) {

$WEB = ONO::FW::Apps::Core->stats_replace(
$WEB,
$stat_correct+$vars{'output_web_past_correct'},,
$stat_wrong,
$stat_todo_total,
$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_houses_sheet_1.jpg",
"screen:320:50:30::math_houses_screenshot_1.jpg",
"sheet:168:40:140:-10:math_houses_sheet_2.jpg",
);

my (%setup);

if (!$vars{'app_input_num_of_houses'}) {
$vars{'app_input_num_of_houses'} = 9;
}

my @tabs = ("12:green:12 (4 x 3)","9:green:9 (3 x 3)","6:green:6 (2 x 3)");
my $CUSTOM1 = ONO::Lib::UI::Select->buttons(
"app_input_num_of_houses",
$vars{'app_input_num_of_houses'},
\@tabs,
"",
"f",
$BLK_ref,
\%setup,
);

my @tabs = ("std:green:2 $BLK{'columns'}","tri:green:3 $BLK{'columns'}");
my $CUSTOM2 = 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,"F");
$CONF .= ONO::FW::Apps::ToolBox->conf_input("spacer", $BLK_ref,\%vars);
if ($vars{'output_paper'}) {
$CONF .= ONO::FW::Apps::ToolBox->conf_input("custom", $BLK_ref,\%vars,"",$txt[0],$CUSTOM1);
$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,"","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-ncd-CD-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__