ONO::FW::Edu::Apps::Modules::Geometry

package ONO::FW::Edu::Apps::Modules::Geometry;
################################################################################
# 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::IO;

use ONO::FW::Apps::ToolBox;

use ONO::Lib::Image::Canvas;
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 = "geometry";

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'}));

my $WEB;

my $AppName = "Geometry";

my $UNIT = "cm";

my @txts = (
"types",
"perimeter",
"area",
"square",
"squares",
"rectangle",

"rectangles",
"triangle",
"triangles",
"circle",
"circles",

"also for triangles",
"formulas",
"Use the Pythagoras Theorem to calculate triangle side lengths",
"Value of π (for circles only)",
"exercises on one worksheet",

"Name figures",
"Calculate the perimeter of each figure",
"except for triangles",
"Calculate the area of each figure",
"measure",

"draw",
"side",
"length",
"height",
"radius",

"width",
"half cm (0.5)",

);

if ($vars{'app_lang'} eq "de") {

@txts = (
"Typen",
"Umfang",
"Flächeninhalt",
"Quadrat",
"Quadrate",
"Rechteck",

"Rechtecke",
"Dreieck",
"Dreiecke",
"Kreis",
"Kreise",

"auch für Dreiecke",
"Formeln",
"Benutze den Satz des Pythagoras um die Längen der Seiten des Dreiecks zu berechnen",
"Wert von π (nur für Kreise)",
"Aufgaben pro Arbeitsblatt",

"Benenne die Figuren",
"Berechne den Umfang jeder Figur",
"nicht bei Kreisen",
"Berechne den Flächeninhalt jeder Figur",
"messen",

"zeichnen",
"Seite",
"Länge",
"Höhe",
"Radius",

"Breite",
"halbe cm (0.5)",

);

}

if ($vars{'app_lang'} eq "lu") {

@txts = (
"Typen",
"Ëmfang",
"Flächeninhalt",
"Quadrat",
"Quadrater",
"Rechteck",

"Rechtecker",
"Dräieck",
"Dräiecker",
"Kreess",
"Kreesser",

"och fir Dräiecker",
"Formelen",
"Benotz de Satz vum Pythagore fir d'Längte vun de Säite vum Dräieck ze berechnen",
"Wert vu π (nëmme fir Kreesser)",
"Aufgabe pro Aarbechtsblat",

"Benenn d'Figuren",
"Berechen den Emfang vun all Figur",
"net bei Kreesser",
"Berechen de Flächeninhalt vun all Figur",
"moossen",

"zeechnen",
"Säit",
"Längt",
"Héicht",
"Radius",

"Breet",
"hallef cm (0.5)",

);

}

if ($vars{'app_lang'} eq "fr") {

@txts = (
"Types",
"perimètre",
"surface",
"carré",
"carrés",
"rectangle",

"rectangles",
"triangle",
"triangles",
"cercle",
"cercles",

"aussi pour triangles",
"formules",
"Utilisez le théorème de Pythagore pour calculer les côtés du triangle",
"Valeur de π (pour les cercles)",
"exercices par page",

"Nommez les figures",
"Calculez le périmètre de chaque figure",
"excepté triangles",
"Calculez la surface de chaque figure",
"mesurer",

"dessiner",
"coté",
"longueur",
"hauteur",
"radius",

"largeur",
"demis cm (0.5)",

);

}

$vars{'app_input_print_options_title_default'} = $AppName;

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

}

#############################################################
# WORKSHEET MAKER MODE
#############################################################

my $worksheet_maker_mode;
if ($vars{'output_worksheet_maker'}) { # || ONO::IO->devstation) {
$worksheet_maker_mode = 1;
}

#############################################################
# ONLINE TRAINING
#############################################################

if ($vars{'output_web'} || $vars{'output_paper'}) {

if ($vars{'output_web'} && $vars{'output_web_rescramble'}) {

$vars{'output_web_question_number'}++;

foreach my $key ('name','peri','area') {
$vars{"output_web_answer_$key"} = "";
$vars{"output_web_hints_$key"} = "";
}

}

my $question_number = ONO::FW::Apps::Core->question_number($vars{'output_web_question_number'});

my (
$page,$pages,%cache,
$whilecounter,$stats_switches,
$PDF_OPTS,
$stat_correct,$stat_wrong,$stat_todo,
);

my $questions_per_page = 1;

if ($vars{'output_paper'}) {

$questions_per_page = $vars{"app_input_num_status"};

$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'}++;

}

if (!$vars{'app_input_exercise_peri_tri'}) {
$txts[17] = "$txts[17] ($txts[18])";
}

if (!$vars{'app_input_precision_status'}) {
$vars{'app_input_precision_status'} = 10;
}

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

if ($worksheet_maker_mode) {

$questions_per_page = 2;

} else {

ONO::Lib::PDF::Draw->font('HO');

my $off_y;
foreach my $opt ('name:16','peri:17','area:19') {
my @op = split(/:/,$opt);
if ($vars{"app_input_exercise_$op[0]"}) {
ONO::Lib::PDF::Draw->text($canvas,0,$off_y,"$txts[$op[1]]!");
$off_y = $off_y + 5;
}
}

ONO::Lib::PDF::Draw->font('H');

}

# ONO::Lib::PDF::ToolBox->canvas_test($canvas);

}

if ($vars{'output_web'}) {

$WEB .= qq~<$form>~;

}

my (%used,@corr_peri,@corr_area,@corr_grid,$name,$peri,$area);

if ($vars{'output_web_completed'}) {

$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);

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

} else {

$WEB .= ONO::FW::Apps::Core->timer($vars{'output_web'},$vars{'output_web_timer_start'});

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

if ($vars{'app_input_precision_status'} < 10 && ($vars{'rand_half_x'} eq "" || $vars{'rand_half_y'} eq "")) {
$vars{'rand_half_x'} = 0;
$vars{'rand_half_y'} = 0;
if (int(rand(100)) > 33) {
$vars{'rand_half_x'} = 0.5;
}
if (int(rand(100)) > 33) {
$vars{'rand_half_y'} = 0.5;
}
if ($vars{'app_input_precision_status'} < 5) {
if (int(rand(100)) > 33) {
$vars{'rand_half_x'} = (1+int(rand(9)))/10;
}
if (int(rand(100)) > 33) {
$vars{'rand_half_y'} = (1+int(rand(9)))/10;
}
}
}

my @figure_max = (14,17);
my @grid = (0,20,170,190);

if ($vars{'app_input_num_status'} == 2) {
@figure_max = (14,7);
if ($i == 0) {@grid = (0,20,170,100)}
if ($i == 1) {@grid = (0,110,170,190)}
}

if ($vars{'app_input_num_status'} == 3) {
@figure_max = (14,4);
if ($i == 0) {@grid = (0,20,170,70)}
if ($i == 1) {@grid = (0,80,170,130)}
if ($i == 2) {@grid = (0,140,170,190)}
}

if ($vars{'app_input_num_status'} == 4) {
@figure_max = (6,7);
if ($i == 0) {@grid = (0,20,80,100)}
if ($i == 1) {@grid = (90,20,170,100)}
if ($i == 2) {@grid = (0,110,80,190)}
if ($i == 3) {@grid = (90,110,170,190)}
}

if ($worksheet_maker_mode) {
$vars{'app_input_num_status'} = 2;
@figure_max = (7,3);
if ($i == 0) {@grid = (5,5,85,45)}
if ($i == 1) {@grid = (90,5,170,45)}
}

if ($vars{'output_paper'}) {

if ($vars{'app_input_precision_status'} < 5) {
ONO::Lib::PDF::Draw->grid($canvas,$grid[0],$grid[1],$grid[2],$grid[3],1,0.1,"","","","lL");
ONO::Lib::PDF::Draw->grid($canvas,$grid[0],$grid[1],$grid[2],$grid[3],5,0.1,"","","","l");
} else {
ONO::Lib::PDF::Draw->grid($canvas,$grid[0],$grid[1],$grid[2],$grid[3],5,0.1,"","","","L");
}

$corr_grid[$i] = "$grid[0]:$grid[1]:$grid[2]:$grid[3]";

$vars{'variation'} = "draw";
if ($vars{'app_input_mode_measure'}) {
$vars{'variation'} = "measure";
if ($vars{'app_input_mode_draw'} && int(rand(100)) > 50) {
$vars{'variation'} = "draw";
}
}

}

my $lincolor = "dddddd";

my @commands;
for (my $x = 16; $x < 544; $x=$x+16) {
@commands = (@commands,"lin:$x,0,$x,416,1 :$lincolor:$lincolor:");
}
for (my $y = 16; $y < 416; $y=$y+16) {
@commands = (@commands,"lin:0,$y,544,$y,1 :$lincolor:$lincolor:");
}

# our canvas is 17 cm * 13 cm

my $shape_selected = $vars{'rand_shape'};

if (!$shape_selected || $vars{'output_paper'}) {

my @opts;
if ($vars{'app_input_shape_use_square'} || (!$vars{'app_input_shape_use_rectangle'} && !$vars{'app_input_shape_use_triangle'} && !$vars{'app_input_shape_use_circle'})) {
@opts = (@opts,"square");
}
if ($vars{'app_input_shape_use_rectangle'}) {
@opts = (@opts,"rectangle");
}
if ($vars{'app_input_shape_use_triangle'}) {
@opts = (@opts,"triangle");
}
if ($vars{'app_input_shape_use_circle'}) {
@opts = (@opts,"circle");
}
my $num = @opts;
$shape_selected = $opts[int(rand($num))];
$vars{'rand_shape'} = $shape_selected;

}

my $fig = $txts[3];
if ($shape_selected eq "rectangle") {
$fig = $txts[5];
}
if ($shape_selected eq "triangle") {
$fig = $txts[7];
}
if ($shape_selected eq "circle") {
$fig = $txts[9];
}

if ($shape_selected eq "square") {

if (!$vars{'rand_width'}) {
$vars{'rand_width'} = 1+int(rand(10));
}

my $width = $vars{'rand_width'};

if ($vars{'output_paper'}) {

$width = 1+int(rand($figure_max[0]));
if ($figure_max[1] < $figure_max[0]) {
$width = 1+int(rand($figure_max[1]));
}

while ($used{"square_$width"} && $whilecounter < 256) {
$whilecounter++;
$width = 1+int(rand($figure_max[0]));
if ($figure_max[1] < $figure_max[0]) {
$width = 1+int(rand($figure_max[1]));
}
}

$width = $width-$vars{'rand_half_x'};

$used{"square_$width"}++;

my ($offset_x,$offset_y) = &offset("",$width,$width,$figure_max[0],$figure_max[1],$vars{'app_input_num_status'},$i);
my @draw = ($grid[0]+$offset_x,$grid[1]+$offset_y,$grid[0]+$offset_x+($width*10),$grid[1]+$offset_y+($width*10),1);

ONO::Lib::PDF::Draw->rect($canvas,$grid[0],$grid[1]-4,$grid[2],$grid[1]+2,1,"0:0:0:0","0:244:244:244",1);
ONO::Lib::PDF::Draw->font('H',10);

if ($vars{'variation'} eq "draw") {

if ($num_comma =~ /\,/) {
$width =~ s~\.~$num_comma~g;
}

my $T1 = uc substr($txts[22],0,1);

ONO::Lib::PDF::Draw->text($canvas,$grid[0]+2,$grid[1],ucfirst "$txts[3] ($T1 = $width cm)");

} else {

ONO::Lib::PDF::Draw->text($canvas,$grid[0]+2,$grid[1],"?");
ONO::Lib::PDF::Draw->rect($canvas,@draw);

}

ONO::Lib::PDF::Draw->font('H',12);

my $peri = 4 * $width;
my $area = $width * $width;

$corr_peri[$i] = "$txts[1]: 4 x $width = $peri cm";
$corr_area[$i] = "$txts[2]: $width x $width = $area cm2";
$corr_cache[$i] = "$shape_selected:$draw[0]:$draw[1]:$draw[2]:$draw[3]:$draw[4]:";

}

$width = $width-$vars{'rand_half_x'};
my $px_width = $width * 32;

my $x = (544 - $px_width ) / 2 - $vars{'rand_half_x'}*16;
my $y = (416 - $px_width ) / 2 - $vars{'rand_half_x'}*16;

my $tx1 = $x + ($px_width/2);
my $ty1 = $y - 8;

my $tx2 = $x + $px_width + 8;
my $ty2 = $y + ($px_width/2);

@commands = (
@commands,
"txt:$tx1,$ty1:000000:bold 12pt Arial center:$width $UNIT:",
"txt:$tx2,$ty2:000000:bold 12pt Arial left:$width $UNIT:",
"rec:$x,$y,$px_width,$px_width,1:200,255,200,0.5:336633",
);

$name = $txts[3];
$peri = 4*$width;
$area = $width * $width;

}

if ($shape_selected eq "rectangle") {

if (!$vars{'rand_width'} || !$vars{'rand_height'}) {
$vars{'rand_width'} = 1+int(rand(14));
$vars{'rand_height'} = 1+int(rand(10));
}

my $width = $vars{'rand_width'};
my $height = $vars{'rand_height'};

if ($width == $height) {
$width = 10;
$height = 6;
}

if ($vars{'output_paper'}) {
$width = 1+int(rand($figure_max[0]));
$height = 1+int(rand($figure_max[1]));

while (($used{"rectangle_${width}_${height}"} || $width == $height) && $whilecounter < 256) {
$whilecounter++;
$width = 1+int(rand($figure_max[0]));
$height = 1+int(rand($figure_max[1]));
}

$width = $width-$vars{'rand_half_x'};
$height = $height-$vars{'rand_half_y'};

$used{"rectangle_${width}_${height}"}++;

my ($offset_x,$offset_y) = &offset("",$width,$height,$figure_max[0],$figure_max[1],$vars{'app_input_num_status'},$i);
my @draw = ($grid[0]+$offset_x,$grid[1]+$offset_y,$grid[0]+$offset_x+($width*10),$grid[1]+$offset_y+($height*10),1);

ONO::Lib::PDF::Draw->rect($canvas,$grid[0],$grid[1]-4,$grid[2],$grid[1]+2,1,"0:0:0:0","0:244:244:244",1);
ONO::Lib::PDF::Draw->font('H',10);

if ($vars{'variation'} eq "draw") {

if ($num_comma =~ /\,/) {
$width =~ s~\.~$num_comma~g;
$height =~ s~\.~$num_comma~g;
}

my ($T1,$T2) = (uc substr($txts[23],0,1),uc substr($txts[26],0,1));

ONO::Lib::PDF::Draw->text($canvas,$grid[0]+2,$grid[1],ucfirst "$txts[5] ($T1 = $width cm, $T2 = $height cm)");

} else {

ONO::Lib::PDF::Draw->text($canvas,$grid[0]+2,$grid[1],"?");
ONO::Lib::PDF::Draw->rect($canvas,@draw);

}

ONO::Lib::PDF::Draw->font('H',12);

my $peri = 2 * $width + 2 * $height;
my $area = $width * $height;

$corr_peri[$i] = "$txts[1]: 2 x $width + 2 x $height = $peri cm";
$corr_area[$i] = "$txts[2]: $width x $height = $area cm2";
$corr_cache[$i] = "$shape_selected:$draw[0]:$draw[1]:$draw[2]:$draw[3]:$draw[4]:";

}

$width = $width-$vars{'rand_half_x'};
$height = $height-$vars{'rand_half_y'};
my $px_width = $width * 32;
my $px_height = $height * 32;

my $x = (544 - $px_width ) / 2 - $vars{'rand_half_x'}*16;
my $y = (416 - $px_height ) / 2 - $vars{'rand_half_y'}*16;

my $tx1 = $x + ($px_width/2);
my $ty1 = $y - 8;

my $tx2 = $x + $px_width + 8;
my $ty2 = $y + ($px_height/2);

@commands = (
@commands,
"txt:$tx1,$ty1:000000:bold 12pt Arial center:$width $UNIT:",
"txt:$tx2,$ty2:000000:bold 12pt Arial left:$height $UNIT:",
"rec:$x,$y,$px_width,$px_height,1:200,255,200,0.5:336633",
);

$name = $txts[5];
$peri = (2*$width) + (2*$height);
$area = $width * $height;

}

if ($shape_selected eq "triangle") {

if (!$vars{'rand_width'} || !$vars{'rand_height'} || !$vars{'rand_top'}) {
$vars{'rand_width'} = 1+int(rand(14));
$vars{'rand_height'} = 1+int(rand(10));
$vars{'rand_top'} = 2 + int(rand(13));
}

my $width = $vars{'rand_width'};
my $height = $vars{'rand_height'};
my $top = $vars{'rand_top'};

if ($vars{'output_paper'}) {

$width = 1+int(rand($figure_max[0]));
$height = 1+int(rand($figure_max[1]));
$top = int(rand($width));

while ($used{"triangle_${width}_${height}_${top}"} && $whilecounter < 256) {
$whilecounter++;
$width = 1+int(rand($figure_max[0]));
$height = 1+int(rand($figure_max[1]));
$top = int(rand($width));
}

$width = $width-$vars{'rand_half_x'};
$height = $height-$vars{'rand_half_y'};

$used{"triangle_${width}_${height}_${top}"}++;

my ($offset_x,$offset_y) = &offset("",$width,$height,$figure_max[0],$figure_max[1],$vars{'app_input_num_status'},$i);
my @draw = ($grid[0]+$offset_x,$grid[1]+$offset_y+($height*10),$grid[0]+$offset_x+($width*10),$grid[0]+$offset_x+($top*10),$grid[1]+$offset_y,1);

ONO::Lib::PDF::Draw->rect($canvas,$grid[0],$grid[1]-4,$grid[2],$grid[1]+2,1,"0:0:0:0","0:244:244:244",1);
ONO::Lib::PDF::Draw->font('H',10);

if ($vars{'variation'} eq "draw") {

if ($num_comma =~ /\,/) {
$width =~ s~\.~$num_comma~g;
}

my ($T1,$T2) = (uc substr($txts[23],0,1),uc substr($txts[24],0,1));

ONO::Lib::PDF::Draw->text($canvas,$grid[0]+2,$grid[1],ucfirst "$txts[7] ($T1 = $width cm, $T2 = $width cm)");

} else {

ONO::Lib::PDF::Draw->text($canvas,$grid[0]+2,$grid[1],"?");
ONO::Lib::PDF::Draw->line($canvas,$draw[0],$draw[1],$draw[2],$draw[1],$draw[5]);
ONO::Lib::PDF::Draw->line($canvas,$draw[0],$draw[1],$draw[3],$draw[4],$draw[5]);
ONO::Lib::PDF::Draw->line($canvas,$draw[2],$draw[1],$draw[3],$draw[4],$draw[5]);

}

ONO::Lib::PDF::Draw->font('H',12);

my $s2 = int(10*sqrt($top*$top + $height*$height))/10;
my $s3 = int(10*sqrt(($width-$top)*($width-$top) + $height*$height))/10;

my $peri = $width + $s2 + $s3;
my $area = ($width * $height) / 2;

$corr_peri[$i] = "$txts[1]: $width + $s2 + $s3 = $peri cm";
$corr_area[$i] = "$txts[2]: $width x $height / 2 = $area cm2";
$corr_cache[$i] = "$shape_selected:$draw[0]:$draw[1]:$draw[2]:$draw[3]:$draw[4]:$draw[5]:";

}

$width = $width-$vars{'rand_half_x'};
$height = $height-$vars{'rand_half_y'};

my $px_top = $top * 32;
my $px_width = $width * 32;
my $px_height = $height * 32;

my $x = (544 - $px_width ) / 2 - $vars{'rand_half_x'}*16;
my $y = (416 - $px_height ) / 2 - $vars{'rand_half_y'}*16;

my $x1 = $x + $px_width;
my $y1 = $y + $px_height;

my $tx1 = $x + ($px_width/2);
my $ty1 = $y + $px_height + 24;

my $tx2 = $px_top + 10;
my $ty2 = $y + ($px_height / 2);

my $TXT2 = "txt:$tx2,$ty2:000000:bold 12pt Arial left:$height $UNIT:";
if ($px_top < 272) {
$tx2 = $tx2 - 20;
$TXT2 = "txt:$tx2,$ty2:000000:bold 12pt Arial right:$height $UNIT:";
}

@commands = (
@commands,
"txt:$tx1,$ty1:000000:bold 12pt Arial center:$width $UNIT:",
$TXT2,
"pol:$px_top,$y, $x,$y1, $x1,$y1, 1:200,255,200,0.5:336633",
"cir:$px_top,$y1,2,1:336633:336633",
"lin:$px_top,$y,$px_top,$y1,1:336633:336633",
);

$name = $txts[7];

my $base_right = $width - $top + (17-$width)/2;
my $base_left = $width - $base_right;

my $side_right = sqrt(($base_right*$base_right) + ($height*$height));
my $side_left = sqrt(($base_left*$base_left) + ($height*$height));

$peri = (int(100*($width + $side_left + $side_right)))/100;
$area = $width * $height / 2;

}

if ($shape_selected eq "circle") {

my $pi = 3.14;

if ($vars{'format_pi'} eq "31415") {
$pi = 3.1415;
}
if ($vars{'format_pi'} eq "3141592") {
$pi = 3.141592;
}

if ($vars{'output_paper'}) {

my $width = 1+int(rand($figure_max[0]));
if ($figure_max[1] < $figure_max[0]) {
$width = 1+int(rand($figure_max[1]));
}

while ($used{"circle_$width"} && $whilecounter < 256) {
$whilecounter++;
$width = 1+int(rand($figure_max[0]));
if ($figure_max[1] < $figure_max[0]) {
$width = 1+int(rand($figure_max[1]));
}
}

# half_x not required with circles, as we'll divide by 2 anyway...

$used{"circle_$width"}++;

my ($offset_x,$offset_y) = &offset("",$width,$width,$figure_max[0],$figure_max[1],$vars{'app_input_num_status'},$i);
my @draw = ($grid[0]+$offset_x+int($width*5),$grid[1]+$offset_y+($width*5),$width*5,1);

ONO::Lib::PDF::Draw->rect($canvas,$grid[0],$grid[1]-4,$grid[2],$grid[1]+2,1,"0:0:0:0","0:244:244:244",1);
ONO::Lib::PDF::Draw->font('H',10);

if ($vars{'variation'} eq "draw") {

my $width2 = $width/2;

if ($num_comma =~ /\,/) {
$width2 =~ s~\.~$num_comma~g;
}

my $T1 = uc substr($txts[25],0,1);

ONO::Lib::PDF::Draw->text($canvas,$grid[0]+2,$grid[1],ucfirst "$txts[9] ($T1 = $width2 cm)");

} else {

ONO::Lib::PDF::Draw->text($canvas,$grid[0]+2,$grid[1],"?");
ONO::Lib::PDF::Draw->circle($canvas,@draw);

}

ONO::Lib::PDF::Draw->font('H',12);

my $r = $width/2;

my $peri = int(10 * 2 * $pi * $r)/10;
my $area = int(10 * $pi * $r * $r)/10;

$corr_peri[$i] = "$txts[1]: 2 * $pi * $r = $peri cm";
$corr_area[$i] = "$txts[2]: $pi * $r * $r = $area cm2";
$corr_cache[$i] = "$shape_selected:$draw[0]:$draw[1]:$draw[2]:$draw[3]:";

}

my $PI = $pi;
$PI =~ s~\.~$num_comma~;

if (!$vars{'rand_radius'}) {
$vars{'rand_radius'} = 1+int(rand(6));
}

my $radius = $vars{'rand_radius'} - $vars{'rand_half_x'};

my $px_width = $radius * 32;

my $ty1 = 208 - ($px_width/2) + 10 - $vars{'rand_half_x'}*16;
my $lin = 208 - $px_width;

@commands = (
@commands,

"txt:425,32:000000:bold 12pt Arial:= $PI:",
"txt:280,$ty1:000000:bold 12pt Arial:$radius $UNIT:",

"lin:410,20,410,32,2:000000:000000",
"lin:415,20,415,32,2:000000:000000",
"lin:405,20,420,20,2:000000:000000",
"cir:272,208,$px_width,1:200,255,200,0.5:336633",
"cir:272,208,2,1:336633:336633",
"lin:272,$lin,272,208,1:336633:336633",
);

$name = $txts[9];
$peri = 2 * $pi * $radius;
$area = $pi * $radius * $radius;

}

my $HTML;
my ($PLA_NAME,$PLA_PERI,$PLA_AREA) = ('?','?','?');
if (ONO::IO->devstation) {
($PLA_NAME,$PLA_PERI,$PLA_AREA) = ($name,$peri,$area);
}

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

my ($NAME,$PERI,$AREA,$VARS,$focus);

my $CANVAS_ID = "geometry_canvas";
my $CANVAS = ONO::Lib::Image::Canvas->new($CANVAS_ID,544,416,"b");
$CANVAS .= ONO::Lib::Image::Canvas->script($CANVAS_ID,ONO::Lib::Image::Canvas->exec($CANVAS_ID,\@commands));
$CANVAS .= qq~<script>function_geometry_canvas();</script>~;

if (!$vars{'app_input_exercise_peri'} && !$vars{'app_input_exercise_area'}) {
$vars{'app_input_exercise_name'}++;
}

my $completed;

my %HINT;
if ($vars{'app_input_allow_hints'}) {
foreach my $h ('name','peri','area') {
my $ans = $name;
if ($h eq "peri") {
$ans = $peri;
}
if ($h eq "area") {
$ans = $area;
}
$HINT{$h} = qq~<td>
<a href="javascript:void(0);" onclick="hint('$h');" class="col3">
<div class="rel" style="right:5px">
<div class="block20 bg_dark radius20 rel" style="top:0px;left:0px">
<img class="block16 abs" src="/ono/osr/images/icons/crystal/16x16/apps/ktip.png" style="top:2px;left:2px" alt="">
</div>
<div id="output_web_hints_counter_$h" class="small mr5 abs" style="top:-6px;left:21px">$vars{"output_web_hints_$h"}</div>
</div>
</a>
<input type="hidden" id="output_web_hints_$h" name="output_web_hints_$h" value="$vars{"output_web_hints_$h"}">
<input type="hidden" id="output_web_correct_${h}" name="output_web_correct_${h}" value="$ans">
</td>
~;
}
$WEB .= ONO::FW::Apps::Core->hint_script_v2("length/2","(length/3*2)+1",$vars{'output_web_hints'});
}

if ($vars{'app_input_exercise_name'}) {

$completed--;

my $ANSWER = qq~<input type="text" id="output_web_answer_name_id" name="output_web_answer_name" value="$vars{'output_web_answer_name'}" class="w95" placeholder="$PLA_NAME">
<script>document.getElementById('output_web_answer_name_id').focus();</script>
~;
$focus++;
my $BG;
if ($vars{'output_web_answer_name'}) {
$vars{'output_web_mistakes'}++;
$BG = "bg_red";
}
if (uc $vars{'output_web_answer_name'} eq uc $name) {
$vars{'output_web_mistakes'}--;
$ANSWER = qq~<div class="bold green pad10_2">$name</div>
<input type="hidden" name="output_web_answer_name" value="$vars{'output_web_answer_name'}">
~;
$BG = "bg_green";
$completed++;
$focus--;
}

$NAME .= qq~<tr>
<td>$BLK{'name'}:</td>
</tr>
<tr class="$BG">
<td style="padding:2px 10px 2px 10px">$ANSWER</td>
$HINT{'name'}
</tr>
~;

}

if ($vars{'app_input_exercise_peri'} && ($shape_selected ne "triangle" || $vars{'app_input_exercise_peri_tri'})) {

$completed--;

my $ANSWER = qq~<input type="text" id="output_web_answer_peri_id" name="output_web_answer_peri" value="$vars{'output_web_answer_peri'}" class="w95" placeholder="$PLA_PERI">~;

if (!$focus) {
$ANSWER .= qq~<script>document.getElementById('output_web_answer_peri_id').focus();</script>~;
$focus++;
}

my $BG;
if ($vars{'output_web_answer_peri'}) {
$vars{'output_web_mistakes'}++;
$BG = "bg_red";
}
my $answer = $vars{'output_web_answer_peri'};
$answer =~ s~\,~\.~;
if ($answer > $peri-0.02 && $answer < $peri+0.02) {
$vars{'output_web_mistakes'}--;
$ANSWER = qq~<div class="bold green pad10_2">$vars{'output_web_answer_peri'}</div>
<input type="hidden" name="output_web_answer_peri" value="$vars{'output_web_answer_peri'}">
~;
$BG = "bg_green";
$completed++;
$focus--;
}

$PERI .= qq~<tr>
<td>$txts[1]:</td>
</tr>
<tr class="$BG">
<td style="padding:0px">
<table class="wide_table">
<tr>
<td class="w100" style="padding-left:10px">$ANSWER</td>
<td style="padding-right:10px">$UNIT</td>
$HINT{'peri'}
</tr>
</table>
</td>
</tr>
~;

}

if ($vars{'app_input_exercise_area'}) {

$completed--;

my $ANSWER = qq~<input type="text" id="output_web_answer_area_id" name="output_web_answer_area" value="$vars{'output_web_answer_area'}" class="w95" placeholder="$PLA_AREA">~;

if (!$focus) {
$ANSWER .= qq~<script>document.getElementById('output_web_answer_area_id').focus();</script>~;
$focus++;
}

my $BG;
if ($vars{'output_web_answer_area'}) {
$vars{'output_web_mistakes'}++;
$BG = "bg_red";
}
my $answer = $vars{'output_web_answer_area'};
$answer =~ s~\,~\.~;
if ($answer > $area-0.02 && $answer < $area+0.02) {
$vars{'output_web_mistakes'}--;
$ANSWER = qq~<div class="bold green pad10_2">$vars{'output_web_answer_area'}</div>
<input type="hidden" name="output_web_answer_area" value="$vars{'output_web_answer_area'}">
~;
$BG = "bg_green";
$completed++;
}

$AREA .= qq~<tr>
<td>$txts[2]:</td>
</tr>
<tr class="$BG">
<td style="padding:0px">
<table class="wide_table">
<tr>
<td class="w100" style="padding-left:10px">$ANSWER</td>
<td style="padding-right:10px">$UNIT<sup>2</sup></td>
$HINT{'area'}
</tr>
</table>
</td>
</tr>
~;

}

my $PROG = ONO::FW::Apps::Core->question_progress($vars{'app_input_number_of_questions'},$question_number);

if ($vars{'app_input_allow_hints'}) {
$stats_switches .= "H";
}

my $STATS = ONO::FW::Apps::Core->stats("",$BLK_ref,"acMWq$stats_switches");

my $BUTTON = qq~<input type="submit" name="output_web_check" value="$BLK{'check'}" class="button_green">~;

if ($completed == 0) {
$BUTTON = qq~<input type="submit" name="output_web_rescramble" value="$BLK{'continue'}..." class="button_green">
<div class="abs" style="width:1px;height:1px;overflow:hidden">
<input type="text" id="output_web_answer_id" name="output_web_continue_key" value="1" style="width:1px">
</div>
<script>document.getElementById('output_web_answer_id').focus();</script>
~;
} else {
foreach my $key ('shape','width','height','radius','top','half_x','half_y') {
if ($vars{"rand_$key"} ne "") {
$VARS .= qq~<input type="hidden" name="rand_$key" value="$vars{"rand_$key"}">~;
}
}
}

$WEB .= qq~<onload="function_$CANVAS_ID();">
<div class="box_black auto" style="width:880px;margin-top:5px">
<table class="default_table">
<tr class="vtop">
<td style="width:564px">
<div class="box_paper">
$CANVAS
</div>
</td>
<td style="width:296px;padding-left:10px">
<div class="box_paper mb10">
$VARS
<table class="wide_table mb10">
$NAME
$PERI
$AREA
<tr><td class="pad10_2"><div class="mt10">$BUTTON</div></td></tr>
</table>
</div>
<div class="box_paper">
<div class="inline w100 mb5">$PROG</div>
<div class="inline ml20 w100" style="height:75px">$STATS</div>
</div>
</td>
</tr>
</table>
</div>
~;

}

}

if ($vars{'output_web'}) {

$WEB .= ONO::FW::Apps::Core->input_vars(\%vars);

if ($vars{'app_input_number_of_questions'}-$question_number < 1) {
$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);

for (my $i = 0; $i < $vars{'app_input_num_status'}; $i++) {

my @grid = split(/:/,$corr_grid[$i]);

if ($vars{'app_input_precision_status'} < 5) {
ONO::Lib::PDF::Draw->grid($canvas,$grid[0],$grid[1],$grid[2],$grid[3],1,0.1,"","","","lL");
ONO::Lib::PDF::Draw->grid($canvas,$grid[0],$grid[1],$grid[2],$grid[3],5,0.1,"","","","l");
} else {
ONO::Lib::PDF::Draw->grid($canvas,$grid[0],$grid[1],$grid[2],$grid[3],5,0.1,"","","","L");
}

# ONO::Lib::PDF::Draw->grid($canvas,$grid[0],$grid[1],$grid[2],$grid[3],5);

my @cp = split(/:/,$corr_cache[$i]);
my $name = $txts[3];

if ($cp[0] eq "square") {
ONO::Lib::PDF::Draw->rect($canvas,$cp[1],$cp[2],$cp[3],$cp[4],$cp[5]);
}
if ($cp[0] eq "rectangle") {
ONO::Lib::PDF::Draw->rect($canvas,$cp[1],$cp[2],$cp[3],$cp[4],$cp[5]);
$name = $txts[5];
}
if ($cp[0] eq "triangle") {
ONO::Lib::PDF::Draw->line($canvas,$cp[1],$cp[2],$cp[3],$cp[2],$cp[6]);
ONO::Lib::PDF::Draw->line($canvas,$cp[1],$cp[2],$cp[4],$cp[5],$cp[6]);
ONO::Lib::PDF::Draw->line($canvas,$cp[3],$cp[2],$cp[4],$cp[5],$cp[6]);
$name = $txts[7];
}
if ($cp[0] eq "circle") {
ONO::Lib::PDF::Draw->circle($canvas,$cp[1],$cp[2],$cp[3],$cp[4],$cp[5]);
$name = $txts[9];
}

my $off_y;
foreach my $opt ('name','peri','area') {
if ($vars{"app_input_exercise_$opt"}) {
$off_y = $off_y + 5;
if ($opt eq "name") {
ONO::Lib::PDF::Draw->text($canvas,$grid[0]+6,$grid[1]+$off_y+4,"$BLK{'name'}: $name");
}
if ($opt eq "peri") {
ONO::Lib::PDF::Draw->text($canvas,$grid[0]+6,$grid[1]+$off_y+4,$corr_peri[$i],"","","n");
}
if ($opt eq "area") {
ONO::Lib::PDF::Draw->text($canvas,$grid[0]+6,$grid[1]+$off_y+4,$corr_area[$i],"","","n");
}
}
}


}

}

}

if ($vars{'output_web'}) {

$WEB = ONO::FW::Apps::Core->stats_replace(
$WEB,
$question_number-1,
$stat_wrong,
$vars{'app_input_number_of_questions'}-$question_number+1,
$vars{'output_web_mistakes'},
$page,
$pages,
$vars{'output_web_completed'},
$vars{'output_web_hints'},
);

}

if ($vars{'output_paper'}) {

ONO::FW::Apps::PDF->end;

$WEB .= ONO::FW::Apps::Core->output_paper($pdfkey,\%BLK,\%vars,$HTTP,$BASE,"S");

}

}

if ($vars{'output_web'}) {
ONO::FW::Apps::Core->varstore($vars{'username'},$vars{'virclass'},$vars{'anonymous'},\%vars);
}

} else {

#############################################################
# EXERCISE SETUP
#############################################################

my ($CUSTOM,@sel,%sel2,$hide_pi);

my @shapes = (
"line:$BLK{'line'}",
"square:$txts[3]",
"rectangle:$txts[5]",
"triangle:$txts[7]",
"circle:$txts[9]",
);

if (!"$vars{'app_input_shape_use_square'}$vars{'app_input_shape_use_rectangle'}$vars{'app_input_shape_use_circle'}$vars{'app_input_shape_use_triangle'}") {
$sel2{"shape_square"} = "_dark";
$sel2{"shape_rectangle"} = "_dark";
$sel2{"shape_use_square"} = 1;
$sel2{"shape_use_rectangle"} = 1;

}

if (!$vars{'app_input_shape_use_circle'}) {
$hide_pi = "hide";
}

foreach my $shape (@shapes) {

my @sp = split(/:/,$shape);

if ($vars{"app_input_shape_use_$sp[0]"}) {
$sel2{"shape_$sp[0]"} = "_dark";
$sel2{"shape_use_$sp[0]"} = 1;
}

$CUSTOM .= qq~<div class="fl rel" onmouseover="onojs_block('shape_info_$sp[0]')" onmouseout="onojs_hide('shape_info_$sp[0]')">
<a id="shape_button_$sp[0]" href="javascript:void(0);" onclick="shape_toggle('$sp[0]');" class="button$sel2{"shape_$sp[0]"}" style="height:18px">
<img class="block32" src="/ono/osr/images/geometry/shapes/64/$sp[0].png" alt="">
</a>
<a href="javascript:void(0);" onclick="shape_toggle('$sp[0]');">
<div id="shape_info_$sp[0]" class="box_paper pad10_2 radius5 abs hide" style="top:24px;left:5px;z-index:99">$sp[1]</div>
</div>
<input type="hidden" id="shape_use_$sp[0]_id" name="app_input_shape_use_$sp[0]" value="$sel2{"shape_use_$sp[0]"}">
</div>
~;

}

my $SCRIPT .= qq~<script>
function shape_toggle(shape) {
if (onojs_getvalue('shape_use_'+shape+'_id') == 1) {
onojs_setvalue('shape_use_'+shape+'_id','0');
onojs_class('shape_button_'+shape,'button');
if (shape == 'circle') {onojs_hide('select_pi')}
} else {
onojs_setvalue('shape_use_'+shape+'_id','1');
onojs_class('shape_button_'+shape,'button_green');
if (shape == 'circle') {onojs_block('select_pi')}
}
}
</script>
~;

if (!"$vars{'app_input_exercise_peri'}$vars{'app_input_exercise_area'}$vars{'app_input_exercise_name'}") {
$sel[0]++;
$sel[2]++;
}
if ($vars{'app_input_exercise_peri'}) {
$sel[0]++;
if ($vars{'app_input_exercise_peri_tri'}) {
$sel[1]++;
}
}
if ($vars{'app_input_exercise_area'}) {
$sel[2]++;
}
if ($vars{'app_input_exercise_name'}) {
$sel[3]++;
}

my @exercises = (
"name:$sel[3]:$BLK{'name'}",
"peri:$sel[0]:$txts[1]",
"peri_tri:$sel[1]:$txts[11]:gims",
"area:$sel[2]:$txts[2]",
);

if (!$vars{'app_input_pi_status'}) {
$vars{'app_input_pi_status'} = "31415";
}

my %setup;
my @tabs = ("314:dark:3.14","31415:dark:3.1415","3141592:dark:3.141592");
my $PI = qq~<div id="select_pi" class="$hide_pi"><table class="default_table"><tr><td>π</td><td>=</td><td></td><td class="p0">~;
$PI .= ONO::Lib::UI::Select->buttons(
"app_input_pi",
$vars{'app_input_pi_status'},
\@tabs,
"",
"f",
$BLK_ref,
\%setup,
);
$PI .= qq~</td></tr></table></div>~;

my @tabs2 = ("10:dark:cm (1)","05:dark:$txts[27]","01:dark:mm (0.1)");
my $PRE = ONO::Lib::UI::Select->buttons(
"app_input_precision",
$vars{'app_input_precision_status'},
\@tabs2,
"",
"f",
$BLK_ref,
\%setup,
);

if (!$vars{'app_input_number_of_questions'}) {
$vars{'app_input_number_of_questions'} = 20;
}

my $CONF;

$CONF .= ONO::FW::Apps::ToolBox->conf_input("custom", $BLK_ref,\%vars,"",$txts[0],$CUSTOM);
$CONF .= ONO::FW::Apps::ToolBox->conf_input("custom", $BLK_ref,\%vars,"","",$PI);
$CONF .= ONO::FW::Apps::ToolBox->conf_input("spacer", $BLK_ref,\%vars);

if (!$vars{'output_web'} && !$vars{'output_paper'}) {
my $HELP = qq~<a href="javascript:void(0);" onclick="onojs_block('help_box');" class="button_yellow button_mini">$BLK{'help'} / $txts[12]</a>~;
$CONF .= ONO::FW::Apps::ToolBox->conf_input("custom", $BLK_ref,\%vars,"","",$HELP);
$CONF .= ONO::FW::Apps::ToolBox->conf_input("spacer", $BLK_ref,\%vars);
}

$CONF .= ONO::FW::Apps::ToolBox->conf_input("custom", $BLK_ref,\%vars,"",$BLK{'unit'},$PRE);
$CONF .= ONO::FW::Apps::ToolBox->conf_input("spacer", $BLK_ref,\%vars);

$CONF .= ONO::FW::Apps::ToolBox->conf_input("checks", $BLK_ref,\%vars,"",$BLK{'exercise'},"exercise",@exercises);
$CONF .= ONO::FW::Apps::ToolBox->conf_input("spacer", $BLK_ref,\%vars);

if ($vars{'output_paper'}) {

if (!"$vars{'app_input_mode_measure'}$vars{'app_input_mode_draw'}") {
$sel[10] = 1;
$sel[11] = 1;
}

my @modes = (
"measure:$sel[10]:$txts[20]",
"draw:$sel[11]:$txts[21]",
);
$CONF .= ONO::FW::Apps::ToolBox->conf_input("checks", $BLK_ref,\%vars,"",$BLK{'type'},"mode",@modes);

if ($vars{'app_input_num_status'} < 1) {
$vars{'app_input_num_status'} = 4;
}

my @tabs = ("1:green:1","2:green:2","3:green:3","4:green:4");
my $NUM = qq~<table class="default_table"><tr><td class="p0">~;
$NUM .= ONO::Lib::UI::Select->buttons(
"app_input_num",
$vars{'app_input_num_status'},
\@tabs,
"",
"f",
$BLK_ref,
\%setup,
);
$NUM .= qq~</td><td></td><td class="small">$txts[15]</td></tr></table>~;
$CONF .= ONO::FW::Apps::ToolBox->conf_input("custom", $BLK_ref,\%vars,"","",$NUM);

$CONF .= ONO::FW::Apps::ToolBox->conf_input("spacer", $BLK_ref,\%vars);
}

$WEB .= ONO::FW::Apps::Core->conf_box(
$db,
$community,
$app,
$form,
"",
$action_url,
$CONF,
$lang,
$BLK_ref,
\%vars,
"op-ncd-CD-lsu-N-H",
);

$WEB .= $SCRIPT;

$WEB .= ONO::FW::Apps::Core->infopics(
"screen:320:50:50::geometry_screenshot_1.jpg",
"sheet:168:180:110:15:geometry_sheet_1.jpg",
);

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 $S = "S";
my $W = "W";
my $H = "H";
my $R = "R";

if ($vars{'app_lang'} =~ /^(de|lu)$/) {
$W = "L";
$H = "B";
}

$WEB .= qq~<div id="help_box" class="box_black abs w90 hide" style="margin:20px 0px 0px 20px;z-index:99">
<a href="javascript:void(0);" onclick="onojs_hide('help_box');">
<img class="close" src="/ono/osr/images/icons/crystal/32x32/ono/close.png" alt="close button" alt="">
</a>
<h2>$txts[12]</h2>
<div class="box_paper">
<table class="wide_table mb10">
<tr class="bb">
<td class="w20"></td>
<td class="w20 p10 bl center"><h3>$txts[3]</h3></td>
<td class="w20 p10 bl center"><h3>$txts[5]</h3></td>
<td class="w20 p10 bl center"><h3>$txts[7]</h3></td>
<td class="w20 p10 bl center"><h3>$txts[9]</h3></td>
</tr>
<tr class="bb">
<td class="p10">$txts[1]</td>
<td class="p10 bl center">$S + $S + $S + $S<div class="p5 col9">$BLK{'or'}</div>4 • $S</td>
<td class="p10 bl center">$W + $H + $W + $H<div class="p5 col9">$BLK{'or'}</div>2 • $W + 2 • $H</td>
<td class="p10 bl center">$S<sub>1</sub> + $S<sub>2</sub>* + $S<sub>3</sub>*</td>
<td class="p10 bl center">2 • π • $R</td>
</tr>
<tr>
<td class="p10">$txts[2]</td>
<td class="p10 bl center">$S • $S<div class="p5 col9">$BLK{'or'}</div>$S<sup>2</sup></td>
<td class="p10 bl center">$W • $H</td>
<td class="p10 bl center">($W • $H) / 2</td>
<td class="p10 bl center">π • $R<sup>2</sup></td>
</tr>
</table>
<div class="inline auto"><a href="javascript:void(0);" onclick="onojs_hide('help_box');" class="button_green">$BLK{'done'}</a></div>
<div class="mt20 italic small col9">
*) $txts[13] (a<sup>2</sup> + b<sup>2</sup> = c<sup>2</sup>).
</div>
</div>
</div>
~;

}

my ($status,$WEB) = ONO::Lib::Parser->parse($WEB,$vars_ref);

$WEB .= ONO::FW::Apps::Core->vardump(\%vars);

$WEB = ONO::FW::Edu::Apps::ToolBox->apps_gate($WEB,$vars_ref);

return $WEB;

}

###################################################################
# SUBS
###################################################################

sub offset {

my (
$self,
$width,
$height,
$max_x,
$max_y,
$number,
$i,
) = @_;

return (10*int(($max_x-$width)/2)+5,10*int(($max_y-$height)/2)+5);

}

###################################################################
#### THAT'S IT :-D
###################################################################

1;

__END__