ONO::FW::Edu::Apps::Modules::WriteDraw

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

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::Data::Color;
use ONO::Lib::Data::Letters;

use ONO::Lib::PDF::Draw;
use ONO::Lib::PDF::ToolBox;
use ONO::Lib::PDF::Elements::Brick;
use ONO::Lib::PDF::Elements::Dice;
use ONO::Lib::PDF::Elements::EduLine;
use ONO::Lib::PDF::Elements::Grid;

use ONO::Lib::UI::Check;

use ONO::FW::Apps::Core;
use ONO::FW::Apps::Core::Graphics;

use ONO::FW::Edu::Apps::Modules::ReGroup;

use ONO::Lib::Parser;

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

my @txt = (
"Write",
"number(s)",
"letter(s)",
"symbol(s)",
"per page",
"boxes",

"lines with guides",
"lines",
"chars",
"display",
"random size & position",

"upper & lower case",
"upper case",
"lower case",
"search & find",
"group dots",

"progressive",
"words from picture dictionary",
);

if ($vars{'app_lang'} eq "de") {
@txt = (
"Schreibe",
"Zahl(en)",
"Buchstabe(n)",
"Symbol(e)",
"pro Seite",
"Kästchen",

"Zeilen mit Hilfslinien",
"Zeilen",
"Zeichen",
"anzeigen",
"zufällige Größe & Position",

"Groß- & Kleinbuchstaben",
"Großbuchstaben",
"Kleinbuchstaben",
"suchen & finden",
"Punkte gruppieren",

"progressiv",
"Wörter aus dem Bildwörterbuch",
);
}

if ($vars{'app_lang'} eq "lu") {
@txt = (
"Schreif",
"Zuel(en)",
"Buschstaw(en)",
"Symbol(er)",
"pro Säit",
"Këschten",

"Zeile mat Hëllefslinnen",
"Zeilen",
"Zeechen",
"uweisen",
"zoufälleg Gréisst & Positioun",

"Grouss- & Klengbuschstawen",
"Groussbuschstawen",
"Klengbuschstawen",
"sichen & fannen",
"Punkte gruppéieren",

"progressiv",
"Wierder aus dem Bildwierderbuch",
);
}

if ($vars{'app_lang'} eq "fr") {
@txt = (
"Ecris",
"nombre(s)",
"lettre(s)",
"symbole(s)",
"par page",
"boîtes",

"lignes avec aides",
"lignes",
"charactères",
"afficher",
"grandeur & position aléatoire",

"majuscules & minuscules",
"majuscules",
"minuscules",
"chercher & trouver",
"relier points",

"progressif",
"mots du dictionnaire illustré",
);
}


ONO::FW::Apps::Core->now("",$app,$vars{'app_lang'});

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_paper'}) {

my (@chars,$pages_total,$PDF_OPTS,%used);

my $questions_per_page = 4;

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

}

my $type = $vars{'app_input_type'};

# this will only be correct for layout == 1:

for (my $i = 0; $i < 4; $i++) {
if ($vars{"app_input_${type}_$i"} ne "") {
@chars = (@chars,$vars{"app_input_${type}_$i"});
$pages_total++;
}
}

# devstation options

if (ONO::IO->devstation) {
# @chars = (0,1,2,3,4,5,6,7,8,9);
# @chars = (1,2,3,4,5,6,7,8,9);
# @chars = (2,3,4,5,6,7,8,9);
# @chars = (3,4,5,6,7,8,9);
# @chars = (4,5,6,7,8,9);
# @chars = (5,6,7,8,9);
$pages_total = @chars;
}

# default stuff

if (!$pages_total) {
$pages_total = 1;
@chars = ('1');
if ($type eq "abc") {
@chars = ('A');
}
if ($type eq "sym") {
@chars = ('A');
}
}

if ($vars{'app_input_layout'} == 2) {
$pages_total = int($pages_total/2);
}
if ($vars{'app_input_layout'} == 4) {
$pages_total = int($pages_total/4);
}

if ($vars{'app_input_type'} eq "") {
$vars{'app_input_type'} = "num";
$vars{'app_input_num_0'} = int(rand(10));
}
if ($vars{'app_input_abc_0'} eq "") {
$vars{'app_input_abc_0'} = "a";
}
if ($vars{'app_input_num_0'} eq "") {
$vars{'app_input_num_0'} = int(rand(10));
}
if ($vars{'app_input_layout_row_0'} eq "") {
$vars{'app_input_layout_row_0'} = "grid-prg";
}

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

my ($page_num,$char_num);

for (my $page = 0; $page < $pages_total; $page++) {

$page_num++;
$char_num++;

# let's go...

my ($pdf_x,$pdf_y) = (0,0);

if ($copy > 1 || $page_num > 1) {
ONO::FW::Apps::PDF->page("",$format);
}

my $numbers_switches;
if ($vars{'app_input_layout_row_0'} eq "exa") {
$numbers_switches .= "S";
}

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$numbers_switches",$vars_ref);

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

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

# select char

if ($vars{'app_input_layout'} == 2 && $i == 2) {
$char_num++;
}

my $char = $chars[$char_num-1];

if ($vars{'app_input_layout'} == 4) {
$char_num++;
}

# upper / lower case

if ($vars{'app_input_type'} eq "abc") {
if ($vars{'app_input_upper_lower'} eq "upperlower") {
$char = uc $char;
$char .= lc $char;
}
if ($vars{'app_input_upper_lower'} eq "upper") {
$char = uc $char;
}
if ($vars{'app_input_upper_lower'} eq "lower") {
$char = lc $char;
}
}

# randomly select char / para type

my ($mix_mode,@mix_chars);

if ($vars{"app_input_num_$i"} eq "random" || $vars{"app_input_num_$i"} eq "mix") {

if ($vars{"app_input_num_$i"} eq "mix" && !$vars{"app_input_layout_char_$i"}) {
$mix_mode = 1;
}

if ($vars{'app_input_type'} eq "num") {

$vars{"app_input_num_$i"} = int(rand(10));
$char = $vars{"app_input_num_$i"};

if ($used{"char_$char"}) {
$vars{"app_input_num_$i"} = int(rand(10));
$char = $vars{"app_input_num_$i"};
}
$used{"char_$char"}++;

@mix_chars = (0,1,2,3,4,5,6,7,8,9);

}

if ($vars{'app_input_type'} eq "abc") {

my @letters = (ONO::Lib::Data::Letters->get_lc,ONO::Lib::Data::Letters->get_uc);
my $letter_nums = @letters;

$vars{"app_input_num_$i"} = $letters[int(rand($letter_nums))];
$char = $vars{"app_input_num_$i"};

if ($used{"char_$char"}) {
$vars{"app_input_num_$i"} = $letters[int(rand($letter_nums))];
$char = $vars{"app_input_num_$i"};
}
$used{"char_$char"}++;

@mix_chars = @letters;

}

}

if ($vars{"app_input_layout_row_$i"} eq "random") {

my @opts = &opts_ids("",\@txt,$vars_ref,$BLK_ref);
my $opts_num = @opts;

$vars{"app_input_layout_row_$i"} = $opts[int(rand($opts_num))];

}

# start building the PDF

my ($off_x,$off_y) = (5,4);

my $size_x = 165;
my $wider_x;

# display the char:

if ($vars{"app_input_layout_char_$i"} == 1) {

if (&longchar("",$char)) {
$wider_x = 16;
}

my $font_size = 80;
my $font_y = 0;
if (&lowchar("",$char)) {
if (&longchar("",$char)) {
$font_size = 50;
$font_y = -10;
} else {
$font_size = 60;
$font_y = -14;
}
}

# background color:
ONO::Lib::PDF::Draw->rect($canvas,$pdf_x+$off_x,$pdf_y+$off_y,$pdf_x+$off_x+38+$wider_x,$pdf_y+$off_y+38,0,"","0:244:222:177",2);
# background color - lower shadow:
ONO::Lib::PDF::Draw->rect($canvas,$pdf_x+$off_x,$pdf_y+$off_y+31+$font_y,$pdf_x+$off_x+38+$wider_x,$pdf_y+$off_y+38,0,"0:224:202:157","0:224:202:157",2);
# background color - lower shadow, fix round edges on top:
ONO::Lib::PDF::Draw->rect($canvas,$pdf_x+$off_x,$pdf_y+$off_y+31+$font_y,$pdf_x+$off_x+38+$wider_x,$pdf_y+$off_y+34,0,"0:224:202:157","0:224:202:157");
# border:
ONO::Lib::PDF::Draw->rect($canvas,$pdf_x+$off_x,$pdf_y+$off_y,$pdf_x+$off_x+38+$wider_x,$pdf_y+$off_y+38,1,"","",2);

ONO::Lib::PDF::Draw->font("MZ",$font_size);

&border_char("",$canvas,$char,$pdf_x+$off_x+19+$wider_x/2,$pdf_y+$off_y+34+$font_y);

$off_x = 50;
$size_x = 120;

if (&longchar("",$char)) {
$off_x = 66;
$size_x = 104;
}

}

# test rectangle:

# if (ONO::IO->devstation) {
# $WEB .= qq~X:char = $char, module = $vars{"app_input_layout_row_$i"}<br>~;
# }

# modules: set basic dimensions:

my @dim = (1,38,0);

if ($vars{"app_input_layout_row_$i"} =~ /-med/) {
@dim = (2,16,6);
if ($vars{"app_input_layout_row_$i"} =~ /box-/) {
@dim = (2,17,4);
}
}
if ($vars{"app_input_layout_row_$i"} =~ /-sma/) {
@dim = (3,11,2.5);
}
if ($vars{"app_input_layout_row_$i"} =~ /-prg/) {
@dim = (3,13,2);
}

# module - math examples:

if ($vars{"app_input_layout_row_$i"} eq "exa" && ($char < 1 || $char > 9)) {
$char = 1+int(rand(9));
}

# if (ONO::IO->devstation && $i == 0) {
# $WEB .= qq~X:$vars{"app_input_layout_char_$i"},$vars{"app_input_layout_row_$i"}<br>~;
# ONO::IO->append("___test.txt",qq~$i:$vars{"app_input_layout_row_$i"}\n~);
# }

if ($vars{"app_input_layout_char_$i"} && $vars{"app_input_layout_row_$i"} =~ /exa/) {

my ($bri_1x,$bri_1y) = (0,0);
my ($bri_2x,$bri_2y) = (0,0);
my $resize;

if ($char == 4) {
($bri_1x,$bri_1y) = (2,2);
$resize = 3;
}

if ($char == 6) {
($bri_1x,$bri_1y) = (2,3);
($bri_2x,$bri_2y) = (3,2);
}

if ($char == 8) {
($bri_1x,$bri_1y) = (2,4);
($bri_2x,$bri_2y) = (4,2);
$resize = -1;
}

if ($char == 9) {
($bri_1x,$bri_1y) = (3,3);
}

# bricks

my @colors = ONO::Lib::Data::Color->rainbow("10");

if ($char) {
ONO::Lib::PDF::Elements::Brick->brick($canvas,$pdf_x+50,$pdf_y+4,$char,1,8,0.5,$colors[$char-1]);

if ($char > 5) {
ONO::Lib::PDF::Elements::Brick->brick($canvas,$pdf_x+50,$pdf_y+14,5,1,8,0.5,$colors[4]);
ONO::Lib::PDF::Elements::Brick->brick($canvas,$pdf_x+90,$pdf_y+14,$char-5,1,8,0.5,$colors[$char-6]);
}

}

for (my $b = 0; $b < 2; $b++) {

my $add_x;

if ($b == 1) {
$add_x = $bri_1x*6;
if ($char == 8) {
$add_x = $bri_1x*5;
}
($bri_1x,$bri_1y) = ($bri_2x,$bri_2y);
}

if ($bri_1x && $bri_1y) {
for (my $y = 0; $y < $bri_1y; $y++) {
ONO::Lib::PDF::Elements::Brick->brick($canvas,$pdf_x+50+$add_x,$pdf_y-$y*(5+$resize)+37-$resize,$bri_1x,1,5+$resize,0.5,$colors[$bri_1x-1]);
}
}

}

# dots

my $COLOR = &rand_color();
my $dots;

for (my $y = 0; $y < 3; $y++) {
for (my $x = 0; $x < 3; $x++) {

if ($dots < $char) {

$dots++;
my ($rand_x,$rand_y) = (1.5-int(rand(3)),1.5-int(rand(3)));
if ($char == 4) {
$rand_x++;
}
ONO::Lib::PDF::Draw->circle($canvas,$pdf_x+135+$x*12+$rand_x,$pdf_y+10+$y*12+$rand_y,3,1,$COLOR,$COLOR);

}

}
}

# dices

if ($char) {

my ($adj_x,$adj_y);

if ($char == 9) {
$adj_x = -5;
}

if ($char < 7) {
ONO::Lib::PDF::Elements::Dice->dice($canvas, $pdf_x+105+$adj_x, $pdf_y+20+$adj_y, $char, 20);
}
if ($char > 6) {
ONO::Lib::PDF::Elements::Dice->dice($canvas, $pdf_x+96+$adj_x, $pdf_y+26+$adj_y, 6, 14);
ONO::Lib::PDF::Elements::Dice->dice($canvas, $pdf_x+109+$adj_x, $pdf_y+28+$adj_y, $char-6, 14);
}
}

# cards

if ($char) {

my (@cards,$counter,$adj_x,$adj_y);

my $size = 16-$char;
my $spacer = 0.95;

if ($char == 1) {
@cards = ("1:h");
}
if ($char == 2) {
@cards = ("1:h::2","1:s", "2:d:70:1.5:1");
}
if ($char == 3) {
@cards = ("1:h::2","1:s","1:d::3", "3:c:60:3:2");
}
if ($char == 4) {
@cards = ("1:h","1:s::2.5","1:d::5","1:c::7.5", "4:h:65:3:2");
$size++;
$adj_x = -18;
$spacer = 0.3;
}
if ($char == 5) {
@cards = ("3:h::2","2:s", "5:d:70:1.5:1");
$size = 14;
}
if ($char == 6) {
@cards = ("2:h::2","2:s","2:d::2", "6:d:-83:6:4");
$size = 7;
$adj_x = 99;
$spacer = 1.1;
}
if ($char == 7) {
@cards = ("7:h","4:s:10:-4:-2","3:d:10:-1:-2");
$size = 11;
$adj_x = -6;
$spacer = 0.7;
}
if ($char == 8) {
@cards = ("8:h");
$size = 10;
$adj_x = 29;
}
if ($char == 9) {
@cards = ("9:h");
$size = 10;
$adj_x = 21;
}

my $cards_num = @cards;

foreach my $card (reverse @cards) {

my @cp = split(/:/,$card);

ONO::Lib::PDF::Draw->image(
$canvas,
$pdf_x+42+($cards_num*$size)-($counter*$size*$spacer)+$adj_x+$cp[2],
$pdf_y+42-$cp[3]-$size*1.5+$adj_y,
($size+$cp[4]),
($size+$cp[4])*1.5,
"images/cards/$cp[0]$cp[1].jpg",
0.5,
1,
);

$counter++;

}

}

# images

if ($char) {

if ($char == 1) {
ONO::Lib::PDF::Draw->image($canvas,$pdf_x+80,$pdf_y+10,20,20,"images/pix/preview/rgb_low_quality/0099.jpg");
ONO::Lib::PDF::Draw->image($canvas,$pdf_x+140,$pdf_y+15,25,25,"images/pix/preview/rgb_low_quality/0428.jpg");
}

if ($char == 2) {
ONO::Lib::PDF::Draw->image($canvas,$pdf_x+87,$pdf_y+8,12,12,"images/pix/preview/rgb_low_quality/0099.jpg");
ONO::Lib::PDF::Draw->image($canvas,$pdf_x+90,$pdf_y+20,12,12,"images/pix/preview/rgb_low_quality/0099.jpg");

ONO::Lib::PDF::Draw->image($canvas,$pdf_x+134,$pdf_y+26,15,15,"images/pix/preview/rgb_low_quality/0428.jpg");
ONO::Lib::PDF::Draw->image($canvas,$pdf_x+130,$pdf_y+16,15,15,"images/pix/preview/rgb_low_quality/0428.jpg");
}

if ($char == 3 || $char == 4) {
for (my $p = 0; $p < $char; $p++) {
my ($rand_x,$rand_y) = (1-int(rand(3)),1-int(rand(3)));
ONO::Lib::PDF::Draw->image($canvas,$pdf_x+86+$p*(18-$char*2)+(($char-3)*5)+$rand_x,$pdf_y+4+$rand_y,13-$char,13-$char,"images/pix/preview/rgb_low_quality/0099.jpg");
}
}

if ($char == 3) {
ONO::Lib::PDF::Draw->image($canvas,$pdf_x+129,$pdf_y+16,11,11,"images/pix/preview/rgb_low_quality/0428.jpg");
ONO::Lib::PDF::Draw->image($canvas,$pdf_x+140,$pdf_y+17,11,11,"images/pix/preview/rgb_low_quality/0428.jpg");
ONO::Lib::PDF::Draw->image($canvas,$pdf_x+133,$pdf_y+28,11,11,"images/pix/preview/rgb_low_quality/0428.jpg");
}

if ($char == 5) {
ONO::Lib::PDF::Draw->image($canvas,$pdf_x+98,$pdf_y+4,9,9,"images/pix/preview/rgb_low_quality/0099.jpg");
ONO::Lib::PDF::Draw->image($canvas,$pdf_x+109,$pdf_y+3,9,9,"images/pix/preview/rgb_low_quality/0099.jpg");

ONO::Lib::PDF::Draw->image($canvas,$pdf_x+93,$pdf_y+13,9,9,"images/pix/preview/rgb_low_quality/0099.jpg");
ONO::Lib::PDF::Draw->image($canvas,$pdf_x+90,$pdf_y+23,9,9,"images/pix/preview/rgb_low_quality/0099.jpg");
ONO::Lib::PDF::Draw->image($canvas,$pdf_x+91,$pdf_y+33,9,9,"images/pix/preview/rgb_low_quality/0099.jpg");

}

}

}

# module - boxes:

if ($vars{"app_input_layout_row_$i"} =~ /box-/) {

my $font_mul = 1.2;
my $rect_num = 4;
if ($vars{"app_input_layout_row_$i"} =~ /-big/) {
$font_mul = 1.5;
}
if ($vars{"app_input_layout_row_$i"} =~ /-med/) {
$rect_num = 9;
}
if ($vars{"app_input_layout_row_$i"} =~ /-sma/) {
$rect_num = 12;
}
if ($vars{"app_input_layout_row_$i"} =~ /-prg/) {
$rect_num = 11;
}

if ($vars{"app_input_layout_char_$i"} == 1) {
$rect_num = int($rect_num/4*3);
if ($vars{"app_input_layout_row_$i"} =~ /-big/) {
if (&longchar("",$char)) {
$rect_num--;
$font_mul = 1.2;
} else {
$rect_num++;
$font_mul = 2;
}
}
}

my $rect_size = $size_x/$rect_num;

my $font_y;

if (&lowchar("",$char) && &longchar("",$char)) {
$font_mul = $font_mul*0.8;
$font_y = -int($rect_size)*$font_mul/10;
}

ONO::Lib::PDF::Draw->font("MZ",int($rect_size)*$font_mul);

for (my $e = 0; $e < $dim[0]; $e++) {

if ($vars{"app_input_layout_row_$i"} =~ /-prg/) {
if ($e == 1) {
$rect_num = 12;
}
if ($e == 2) {
$rect_num = 14;
}
if ($vars{"app_input_layout_char_$i"} == 1) {
$rect_num = int($rect_num/4*3);
}

if (&longchar("",$char)) {
if ($vars{"app_input_layout_row_$i"} =~ /-(med|sma|prg)/) {
$rect_num = $rect_num - 3;
$font_mul = $font_mul * 0.8;
}
}
$rect_size = $size_x/$rect_num;
ONO::Lib::PDF::Draw->font("MZ",int($rect_size)*$font_mul);
}

if ($mix_mode) {
$char = &mix_mode("",\@mix_chars,\%used);
$used{"char_$char"}++;
$used{"last_char"} = $char;
}

my ($text,$add_y,$dim1) = &text_add_y_dim1("",$e,$char,$dim[1],$dim[2],$vars{"app_input_layout_row_$i"},$mix_mode);

if (&lowchar("",$char) && !&longchar("",$char)) {
$font_y = -int($rect_size)*$font_mul/5;
}

for (my $r = 0; $r < $rect_num; $r++) {

ONO::Lib::PDF::Draw->rect($canvas,$pdf_x+$off_x+$r*$rect_size+1,$pdf_y+$off_y+$e*$dim1+$add_y,$pdf_x+$off_x+($r+1)*$rect_size-1,$pdf_y+$off_y+($e+1)*$dim1+$add_y,1,"0:111:111:111","0:250:250:250",2);

}

my $lin_y = $pdf_y+$off_y+($e+1)*$dim1+$add_y-4+$dim[0]-$rect_size/10+$font_y;

ONO::Lib::PDF::Draw->color("0:222:222:222");
ONO::Lib::PDF::Draw->text($canvas,$pdf_x+$off_x+$rect_size/2+$rect_size,$lin_y,$char,"c");
ONO::Lib::PDF::Draw->color("0:111:111:111");
ONO::Lib::PDF::Draw->text($canvas,$pdf_x+$off_x+$rect_size/2,$lin_y,$char,"c");
ONO::Lib::PDF::Draw->color();

}

}

# module - edu lines:

if ($vars{"app_input_layout_row_$i"} =~ /edu-/) {

if ($dim[0] == 1) {
$dim[1] = $dim[1] - 10;
}

for (my $e = 0; $e < $dim[0]; $e++) {

if ($mix_mode) {
$char = &mix_mode("",\@mix_chars,\%used);
$used{"char_$char"}++;
$used{"last_char"} = $char;
}

my ($text,$add_y,$dim1) = &text_add_y_dim1("",$e,$char,$dim[1],$dim[2],$vars{"app_input_layout_row_$i"},$mix_mode);

ONO::Lib::PDF::Draw->font("MZ",$dim1*1.8);

ONO::Lib::PDF::Elements::EduLine->eduline($canvas,$pdf_x+$off_x,$pdf_y+$off_y+$e*$dim1+$add_y,$pdf_x+$off_x+$size_x,$dim1);
ONO::Lib::PDF::Draw->color("0:222:222:222");
ONO::Lib::PDF::Draw->text($canvas,$pdf_x+$off_x+3,$pdf_y+$off_y+$e*$dim1+$add_y+($dim1/3*2),"$text $char");
ONO::Lib::PDF::Draw->color("0:111:111:111");
ONO::Lib::PDF::Draw->text($canvas,$pdf_x+$off_x+3,$pdf_y+$off_y+$e*$dim1+$add_y+($dim1/3*2),$text);
ONO::Lib::PDF::Draw->color();

}

}

# module - simple lines:

if ($vars{"app_input_layout_row_$i"} =~ /lin-/) {

for (my $e = 0; $e < $dim[0]; $e++) {

if ($mix_mode) {
$char = &mix_mode("",\@mix_chars,\%used);
$used{"char_$char"}++;
$used{"last_char"} = $char;
}

my ($text,$add_y,$dim1) = &text_add_y_dim1("",$e,$char,$dim[1],$dim[2],$vars{"app_input_layout_row_$i"},$mix_mode);

my $font_size = $dim1*1.8;
my $font_y;

if (&lowchar("",$char)) {

if (&longchar("",$char)) {

$font_size = $dim1*1.4;
$font_y = -($font_size/5.5);

} else {

$font_size = $dim1*1.6;
$font_y = -($font_size/5.5);

}

}

ONO::Lib::PDF::Draw->font("MZ",$font_size);

ONO::Lib::PDF::Draw->rect($canvas,$pdf_x+$off_x,$pdf_y+$off_y+$e*$dim1+$add_y,$pdf_x+$off_x+$size_x,$pdf_y+$off_y+($e+1)*$dim1+$add_y,1,"0:111:111:111","0:250:250:250",2);

my $lin_y = $pdf_y+$off_y+($e+1)*$dim1+$add_y-4+$dim[0]+$font_y;

ONO::Lib::PDF::Draw->line($canvas,$pdf_x+$off_x+5,$lin_y,$pdf_x+$off_x+$size_x-5,$lin_y,2/$dim[0],"0:100:150:200");

ONO::Lib::PDF::Draw->color("0:222:222:222");
ONO::Lib::PDF::Draw->text($canvas,$pdf_x+$off_x+6,$lin_y,"$text $char");
ONO::Lib::PDF::Draw->color("0:111:111:111");
ONO::Lib::PDF::Draw->text($canvas,$pdf_x+$off_x+6,$lin_y,$text);
ONO::Lib::PDF::Draw->color();

}

}

# module - grid:

if ($vars{"app_input_layout_row_$i"} =~ /^grid-(.*?)$/) {

my $spacing = $1;
$spacing =~ s~[^a-z0-9]~~g;

my ($char_x1,$char_x2);

if ($vars{"app_input_layout_char_$i"}) {
$char_x1 = 45;
}

if ($spacing eq "prg") {

my $off_y = 4;

foreach my $opt (10,8,5) {

my $fix_x2;
my $opt2 = $opt;
if ($opt == 5) {
$opt2 = 15;
}

if ($opt == 5 || $opt == 8) {
$char_x2 = 5;
}

if (!$vars{"app_input_layout_char_$i"}) {
if ($opt == 5 || $opt == 8) {
$fix_x2 = -5;
}
}

if ($vars{'app_input_type'} eq "abc" && $vars{'app_input_upper_lower'} eq "upperlower" && $vars{"app_input_layout_char_$i"} > 0) {
if ($opt == 10) {
$char_x1 = $char_x1 + 15;
}
if ($opt == 8) {
$char_x2 = $char_x2 - 8;
}
}

ONO::Lib::PDF::Elements::Grid->grid($canvas,$pdf_x+5+$char_x1,$pdf_y+$off_y,$pdf_x+5+160+$char_x2+$fix_x2,$pdf_y+$off_y+$opt2,$opt);

$off_y = $off_y + $opt + 3;

my $off_x = $opt*1.3;
my $lin_y = $pdf_y+$off_y-3;

if ($opt == 5) {
$lin_y = $lin_y + 5;
}

if ($mix_mode) {
$char = &mix_mode("",\@mix_chars,\%used);
$used{"char_$char"}++;
$used{"last_char"} = $char;
}

ONO::Lib::PDF::Draw->font("MZ",$opt*2.6);

ONO::Lib::PDF::Draw->color("0:222:222:222");
ONO::Lib::PDF::Draw->text($canvas,$pdf_x+$off_x+5+$char_x1,$lin_y,"$char $char $char $char");
ONO::Lib::PDF::Draw->color("0:111:111:111");
ONO::Lib::PDF::Draw->text($canvas,$pdf_x+$off_x+5+$char_x1,$lin_y,"$char $char $char");
ONO::Lib::PDF::Draw->color();

}

} else {

if ($spacing == 5 || $spacing == 8) {
$char_x2 = 5;
}
if (!$vars{"app_input_layout_char_$i"}) {
$char_x2 = 0;
}

if ($vars{'app_input_type'} eq "abc" && $vars{'app_input_upper_lower'} eq "upperlower" && $vars{"app_input_layout_char_$i"} > 0) {
$char_x1 = $char_x1 + 15;
if ($spacing == 8) {
$char_x2 = $char_x2 - 8;
}
}

ONO::Lib::PDF::Elements::Grid->grid($canvas,$pdf_x+5+$char_x1,$pdf_y+4,$pdf_x+5+160+$char_x2,$pdf_y+4+40,$spacing);

my $off_x = $spacing*1.3;
my $lin_y = $pdf_y+4+$spacing*2;

ONO::Lib::PDF::Draw->font("MZ",$spacing*2.6);

my $repeat = 1;
if ($mix_mode && $spacing < 10) {
$repeat = 2;
if ($spacing == 5) {
$repeat = 3;
}

}

for (my $r = 0; $r < $repeat; $r++) {

if ($mix_mode) {
$char = &mix_mode("",\@mix_chars,\%used);
$used{"char_$char"}++;
$used{"last_char"} = $char;
}

ONO::Lib::PDF::Draw->color("0:222:222:222");
ONO::Lib::PDF::Draw->text($canvas,$pdf_x+$off_x+5+$char_x1,$lin_y+$r*$spacing*2,"$char $char $char $char");
ONO::Lib::PDF::Draw->color("0:111:111:111");
ONO::Lib::PDF::Draw->text($canvas,$pdf_x+$off_x+5+$char_x1,$lin_y+$r*$spacing*2,"$char $char $char");
ONO::Lib::PDF::Draw->color();

}

}

}

# module - random positions

if ($vars{"app_input_layout_row_$i"} =~ /rand-(pos|find|words)/) {

my ($max_x,$max_y) = (8,2);
my $font_mul = 1;
my $pos_x_max = 165;
my @wordlist;

if ($vars{"app_input_layout_row_$i"} =~ /rand-find/) {
($max_x,$max_y) = (12,3);
$font_mul = 0.5;
}

if ($vars{"app_input_layout_row_$i"} =~ /rand-words-(.*?)$/) {

my $dict_lang = $1;
$dict_lang =~ s~[^a-z]~~g;

($max_x,$max_y) = (6,2);
$pos_x_max = 155;

my $dict_lang_id = 6;
if ($dict_lang eq "de") {
$dict_lang_id = 7;
}
if ($dict_lang eq "fr") {
$dict_lang_id = 9;
}

my $dict_char = lc substr($char,0,1);
my %dict_used;

foreach my $line (
ONO::DB->select(
$db,
"school_school_db_vocabulary_pix",
"voc_$dict_lang LIKE '%$dict_char%' AND voc_$dict_lang LIKE '%der%'",
"RAND()",
"LIMIT 250",
)
) {
my @word = ONO::DB->readcols($line);
my $use_word = $word[$dict_lang_id];
$use_word =~ s~^(the|der|die|das|le|la|les) ~~;

my $exclude;
if ($dict_lang eq "de" && !&longchar("",$char)) {
if ($use_word !~ /$char/) {
$exclude++;
}
}

if (length $use_word < 9 && !$dict_used{$use_word} && !$exclude) {
@wordlist = (@wordlist,$use_word);
$dict_used{$use_word}++;
}
}

}

my $rand_counter;

for (my $x = 0; $x < $max_x; $x++) {
for (my $y = 0; $y < $max_y; $y++) {

$rand_counter++;

my $rand_x = 2-int(rand(4));
my $rand_y = 2-int(rand(4));
my $rand_s = 1+int(rand(100))/100;
if ($y == 1) {
$rand_x = $rand_x + 10;
}

my $pos_x = $pdf_x+$off_x+80/$max_x+$x*160/$max_x+$rand_x;
my $pos_y = $pdf_y+$off_y+40/$max_y+$y*32/$max_y+$rand_y;

my $font_size = 20*$rand_s*$font_mul;

my $use_char = $char;
if (&longchar("",$char)) {
$use_char = substr($char,0,1);
if (int(rand(100)) > 50) {
$use_char = substr($char,1,1);
}
}

if ($vars{"app_input_layout_row_$i"} =~ /rand-words/) {
$font_size = 12;
$pos_x = $pos_x + 2;
$pos_y = $pos_y - 5;
$use_char = $wordlist[$rand_counter-1];
$font_size = 22-(length $use_char);
}

ONO::Lib::PDF::Draw->font("MZ",$font_size);

if ($pos_x < $pos_x_max) {

if ($vars{"app_input_layout_row_$i"} =~ /rand-pos/) {

&border_char("",$canvas,$use_char,$pos_x,$pos_y,"trans");

}

if ($vars{"app_input_layout_row_$i"} =~ /rand-find/) {

if ($x == 0 && $y == 0) {

ONO::Lib::PDF::Draw->circle($canvas,$pos_x,$pos_y-$font_size/6,$font_size/3,3,"","0:222:22:22");

} else {

if (int(rand(100)) > 25) {
$use_char = int(rand(10));

if ($vars{'app_input_type'} eq "abc") {
my @letters = ONO::Lib::Data::Letters->get_lc;
if ($char =~ /[A-Z]/) {
@letters = ONO::Lib::Data::Letters->get_uc;
}
if (&longchar("",$char)) {
@letters = (@letters,ONO::Lib::Data::Letters->get_lc);
}
my $letter_nums = @letters;
$use_char = $letters[int(rand($letter_nums))];
}

}

}

ONO::Lib::PDF::Draw->text($canvas,$pos_x,$pos_y,$use_char,"c");

}

if ($vars{"app_input_layout_row_$i"} =~ /rand-words/) {

ONO::Lib::PDF::Draw->text($canvas,$pos_x,$pos_y,$use_char,"c");

}

}

}
}

}

# module - circle dots

if ($vars{"app_input_layout_row_$i"} =~ /grp-dot/) {

my $char_x;

if ($vars{"app_input_layout_char_$i"} > 0) {
$char_x = 40;
}

ONO::FW::Edu::Apps::Modules::ReGroup->display_dots($canvas,$pdf_x+7+$char_x,$pdf_y,160-$char_x,40,64,16,4,$char,1);

}

# modules: done, reset the font, and go to next row...

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

$pdf_y = $pdf_y + 47.5;

}

}

}

if ($vars{'output_paper'}) {

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

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

}

}

} else {

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

my $MODE = "num";
if ($ENV{'SCRIPT_NAME'} =~ /write_letters/) {
$MODE = "abc";
}

$WEB .= ONO::FW::Apps::Core->infopics(
"sheet:168:180:10:15:write_draw_${MODE}_sheet_1.jpg",
"sheet:168:40:40:-10:write_draw_${MODE}_sheet_2.jpg",
);

if ($vars{'app_input_type'} eq "") {
$vars{'app_input_type'} = $MODE;
}

if (!$vars{'app_input_layout'}) {
$vars{'app_input_layout'} = 1;
}

my ($CONF,$SEL1,$SEL2,$LINES,$OPTS);

my $TYPE = $BLK{'number'};
my $TYPE2 = $txt[1];

if ($vars{'app_input_type'} eq "abc") {
$TYPE = $BLK{'letter'};
$TYPE2 = $txt[2];
}

if ($vars{'app_input_type'} eq "sym") {
$TYPE = $BLK{'symbol'};
$TYPE2 = $txt[3];
}

foreach my $opt (
"num:numbers",
"abc:letters",
) {

my @op = split(/:/,$opt);

my $sel;
if ($op[0] eq $vars{'app_input_type'}) {
$sel = " selected";
}

$SEL1 .= qq~<option value="$op[0]"$sel>$txt[0] $BLK{$op[1]}:</option>~;

my $SEL3;

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

my $SEL4 = qq~<option value=""></option>~;

if ($op[0] eq "num") {

for (my $n = 0; $n < 10; $n++) {
my $sel;

if ($vars{"app_input_num_$i"} eq $n) {
$sel = " selected";
} else {
if ($i == 0 && $n == 1) {
$sel = " selected";
}
}
$SEL4 .= qq~<option value="$n"$sel>$n</option>~;
}

}

if ($op[0] eq "abc") {

foreach my $l (ONO::Lib::Data::Letters->get_lc) {
my $sel;

if ($vars{"app_input_abc_$i"} eq $l) {
$sel = " selected";
} else {
if ($i == 0 && $l eq "a") {
$sel = " selected";
}
}
my $L = uc $l;
$SEL4 .= qq~<option value="$l"$sel>$L$l</option>~;
}

}

my ($sel_rand,$sel_mix);
if ($vars{"app_input_$op[0]_$i"} eq "random") {
$sel_rand = "selected";
}
if ($vars{"app_input_$op[0]_$i"} eq "mix") {
$sel_mix = "selected";
}

$SEL4 .= qq~<option value="">----</option><option value="random"$sel_rand>$BLK{'random'}</option><option value="mix"$sel_mix>$BLK{'mix'}</option>~;

$SEL3 .= qq~<td class="p0"><div class="select"><select name="app_input_$op[0]_$i">$SEL4</select></div></td><td class="p2"></td>~;

}

$SEL2 .= qq~<div id="conf_type_item_select_$op[0]" class="hide">
<table class="wide_table"><tr>$SEL3</tr></table>
</div>
~;

}

$SEL1 = qq~<div class="select"><select id="app_input_type_id" name="app_input_type" onchange="conf_type_item_change();">$SEL1</select></div>~;


for (my $l1 = 0; $l1 < 4; $l1++) {
for (my $l2 = 0; $l2 < 4; $l2++) {

my $top = 7 + ($l1 * 29) + ($l2 * 6);

$LINES .= qq~<div class="abs" style="top:${top}px;left:5px;width:75px;border-bottom:1px solid #cccccc"></div>~;

}
}

my @sel = ('cc0000','cc0000','cccccc','ffffff','cccccc','ffffff');
if ($vars{'app_input_layout'} == 2) {
@sel = ('cccccc','ffffff','cc0000','cc0000','cccccc','ffffff');
}
if ($vars{'app_input_layout'} == 4) {
@sel = ('cccccc','ffffff','cccccc','ffffff','cc0000','cc0000');
}

my $LAY = qq~<div class="box_fabric">
<div class="mb5"><span class="bold">$BLK{'Layout'}:</span> <span id="app_input_layout_info_id">1</span> $txt[8] $txt[4]</div>
<div class="inline w100">
<div class="fl mr10 center">
<div id="conf_layout_div_1a" class="bg_paper bg_yellow_hover cursorlink" style="width:90px;height:128px;border:1px solid #$sel[0]">
<div id="conf_layout_div_1b" class="rel p2" style="border:4px solid #$sel[1];height:116px" onclick="conf_layout_select('1');">
$LINES
<div class="bg_fabric radius5 block20 bo abs small bold" style="top:6px;left:4px">?</div>
</div>
</div>
</div>
<div class="fl mr10 center">
<div id="conf_layout_div_2a" class="bg_paper bg_yellow_hover cursorlink" style="width:90px;height:128px;border:1px solid #$sel[2]">
<div id="conf_layout_div_2b" class="rel p2" style="border:4px solid #$sel[3];height:116px" onclick="conf_layout_select('2');">
$LINES
<div class="bg_fabric radius5 block20 bo abs small bold" style="top:6px;left:4px">?</div>
<div class="bg_fabric radius5 block20 bo abs small bold" style="top:62px;left:4px">?</div>
</div>
</div>
</div>
<div class="fl mr10 center">
<div id="conf_layout_div_4a" class="bg_paper bg_yellow_hover cursorlink" style="width:90px;height:128px;border:1px solid #$sel[4]">
<div id="conf_layout_div_4b" class="rel p2" style="border:4px solid #$sel[5];height:116px" onclick="conf_layout_select('4');">
$LINES
<div class="bg_fabric radius5 block20 bo abs small bold" style="top:5px;left:4px">?</div>
<div class="bg_fabric radius5 block20 bo abs small bold" style="top:34px;left:4px">?</div>
<div class="bg_fabric radius5 block20 bo abs small bold" style="top:63px;left:4px">?</div>
<div class="bg_fabric radius5 block20 bo abs small bold" style="top:92px;left:4px">?</div>
</div>
</div>
</div>
</div>
</div>
<input type="hidden" id="app_input_layout_id" name="app_input_layout" value="$vars{'app_input_layout'}">
<input type="hidden" name="app_input_layout_row_0" value="$vars{'app_input_layout_row_0'}">
<input type="hidden" name="app_input_layout_row_1" value="$vars{'app_input_layout_row_1'}">
<input type="hidden" name="app_input_layout_row_2" value="$vars{'app_input_layout_row_2'}">
<input type="hidden" name="app_input_layout_row_3" value="$vars{'app_input_layout_row_3'}">


~;

my ($TYPE3,$LAY2);

if ($vars{'output_paper'}) {

$TYPE3 = $TYPE2;
$LAY2 = $BLK{'layout'};

my $EXA = "?";
# if ($vars{'app_input_type'} eq "abc") {
# $EXA = "Aa";
# }

my $LAYOPTS;

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

if (!$vars{"app_input_layout_char_$i"}) {
$vars{"app_input_layout_char_$i"} = 0;
}
if ($i == 0 && !$vars{"app_input_layout_char_$i"}) {
$vars{"app_input_layout_char_$i"} = 1;
}

my $BG;
if ($vars{"app_input_layout_char_$i"} == 1) {
$BG = " bg_yellow";
}

$LAYOPTS .= qq~<tr>
<td>
<div class="rel">
<div id="app_input_layout_char_${i}_div" class="block32$BG bo radius5 cursorlink noselect" onclick="app_input_layout_char_toggle('$i');"
onmouseover="onojs_block('app_input_layout_char_${i}_info');" onmouseout="onojs_hide('app_input_layout_char_${i}_info');">
<div class="center bold mt5 noselect">$EXA</div>
</div>
<div id="app_input_layout_char_${i}_info" class="abs box_yellow pad10_0 nowrap small hide" style="top:-24px;left:5px;z-index:999">$txt[9]: $TYPE</div>
</div>
<input type="hidden" id="app_input_layout_char_${i}_id" name="app_input_layout_char_${i}" value="$vars{"app_input_layout_char_${i}"}">
</td>
<td class="p5">
<div class="select mt5 mb5"><select name="app_input_layout_row_$i">
~;

foreach my $opt (&opts("",$vars{'app_input_type'},\@txt,$BLK_ref)) {

if ($opt eq "-") {

$LAYOPTS .= qq~<option value="">----</option>~;

} else {

my @op = split(/\^/,$opt);
my ($row,$sel);
if ($vars{'app_input_layout'} == 1) {
$row = $i
}
if ($vars{'app_input_layout'} == 2) {
$row = $i;
if ($i > 1) {
$row = $row-2;
}
}
if ($vars{'app_input_layout'} == 4) {
$row = 0;
}

if ($vars{"app_input_layout_row_$row"} eq $op[0]) {
$sel = " selected";
}
if ($vars{"app_input_layout_row_$row"} eq "") {
if ($row == 0 && $op[0] eq "char-exa") {
$sel = " selected";
}
if ($row == 1 && $op[0] eq "box-prg") {
$sel = " selected";
}
if ($row == 2 && $op[0] eq "rand-pos") {
$sel = " selected";
}
if ($row == 3 && $op[0] eq "grp-dot") {
$sel = " selected";
}
}

$LAYOPTS .= qq~<option value="$op[0]"$sel>$op[1]</option>~;

}
}

$LAYOPTS .= qq~ </select></div>
</td>
</tr>
~;

if ($vars{'app_input_layout'} == 2 && $i == 1) {
$LAYOPTS .= qq~<tr><td class="p2" style="background-color:#cc0000"></td><td class="p2" style="background-color:#cc0000"></td></tr>~;
}
if ($vars{'app_input_layout'} == 4 && $i < 3) {
$LAYOPTS .= qq~<tr><td class="p2" style="background-color:#cc0000"></td><td class="p2" style="background-color:#cc0000"></td></tr>~;
}

}

$LAY = qq~<div class="box_fabric fl">
<div class="bg_paper bo p10" style="width:220px">
<table class="wide_table">
$LAYOPTS
</table>
</div>
</div>
</div>
<input type="hidden" name="app_input_type" value="$vars{'app_input_type'}">
<input type="hidden" id="app_input_layout_id" name="app_input_layout" value="$vars{'app_input_layout'}">
~;

} else {

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

}

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

foreach my $opt (
"upperlower:11",
"upper:12",
"lower:13",
) {
my @op = split(/:/,$opt);
my $sel;
if ($op[0] eq $vars{'app_input_upper_lower'}) {
$sel = " selected";
}
$OPTS .= qq~<option value="$op[0]"$sel>$txt[$op[1]]</option>~;
}

$OPTS = qq~<div class="select"><select name="app_input_upper_lower">$OPTS</select></div>~;

if ($vars{'output_paper'} && $vars{'app_input_type'} eq "abc") {
$CONF .= ONO::FW::Apps::ToolBox->conf_input("custom", $BLK_ref,\%vars,"",$BLK{'options'},$OPTS);
$CONF .= ONO::FW::Apps::ToolBox->conf_input("spacer", $BLK_ref,\%vars,"","s");
} else {
$CONF .= qq~<input type="hidden" name="app_input_upper_lower" value="$vars{'app_input_upper_lower'}">~;
}

$CONF .= ONO::FW::Apps::ToolBox->conf_input("custom", $BLK_ref,\%vars,"T",$LAY2,$LAY);

$WEB .= ONO::FW::Apps::Core->conf_box(
$db,
$community,
$app,
$form,
"",
$action_url,
$CONF,
$lang,
$BLK_ref,
\%vars,
"p-ndi-DI-u-N-H",
);

$WEB .= qq~<script>
onojs_block("conf_type_item_select_$vars{'app_input_type'}");
function conf_type_item_change() {
onojs_hide("conf_type_item_select_num");
onojs_hide("conf_type_item_select_abc");
var type_value = onojs_getvalue("app_input_type_id");
if (type_value == "num") {onojs_block("conf_type_item_select_num")}
if (type_value == "abc") {onojs_block("conf_type_item_select_abc")}
}
function conf_layout_select(layout) {
onojs_setborder('conf_layout_div_1a','1px solid #cccccc');
onojs_setborder('conf_layout_div_1b','4px solid #ffffff');
onojs_setborder('conf_layout_div_2a','1px solid #cccccc');
onojs_setborder('conf_layout_div_2b','4px solid #ffffff');
onojs_setborder('conf_layout_div_4a','1px solid #cccccc');
onojs_setborder('conf_layout_div_4b','4px solid #ffffff');
onojs_setborder('conf_layout_div_'+layout+'a','1px solid #cc0000');
onojs_setborder('conf_layout_div_'+layout+'b','4px solid #cc0000');
onojs_setvalue('app_input_layout_id',layout);
onojs_sethtml('app_input_layout_info_id',layout);
}
function app_input_layout_char_toggle(id) {
var exa_value = onojs_getvalue('app_input_layout_char_'+id+'_id');
if (exa_value == "1") {
onojs_setvalue('app_input_layout_char_'+id+'_id','2');
onojs_class('app_input_layout_char_'+id+'_div','block32 bo radius5 cursorlink noselect');
} else {
onojs_setvalue('app_input_layout_char_'+id+'_id','1');
onojs_class('app_input_layout_char_'+id+'_div','block32 bg_yellow bo radius5 cursorlink noselect');
}
}
</script>
~;

}

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 border_char {

my (
$self,
$canvas,
$char,
$pdf_x,
$pdf_y,
$color,
) = @_;

if ($color eq "") {
$color = "0:25:25:25";
}
if ($color eq "rand") {
$color = &rand_color();
}
if ($color eq "trans") {
$color = &trans_color();
}

ONO::Lib::PDF::Draw->color($color);

for (my $r = 0; $r < 100; $r++) {

my $rand1 = -0.25 + int(rand(100))/200;
my $rand2 = -0.25 + int(rand(100))/200;

ONO::Lib::PDF::Draw->text($canvas,$pdf_x+$rand1,$pdf_y+$rand2,$char,"c");

}

ONO::Lib::PDF::Draw->color("0:255:255:255");

ONO::Lib::PDF::Draw->text($canvas,$pdf_x,$pdf_y,$char,"c");

ONO::Lib::PDF::Draw->color();

}

sub text_add_y_dim1 {

my (
$self,
$e,
$char,
$dim1,
$dim2,
$row_data,
$mix_mode,
) = @_;

my $text = "$char $char $char";
if ($row_data =~ /(edu|lin)-big/) {
$text = "$char $char";
if (&longchar("",$char)) {
$text = $char;
}
}
my $add_y;
if ($e) {
$text = $char;
$add_y = $e*$dim2;
if ($e > 1 && !$mix_mode) {
$text = "";
}
}

if ($row_data =~ /-prg/) {
if ($e) {
if (!$mix_mode) {
$text = "";
}
$dim1 = 11;
$add_y = 4.5;
if ($e == 2) {
$dim1 = 9;
$add_y = 11;
}
}
}

if ($row_data =~ /edu-big/) {
$add_y = $add_y + 5;
}

return ($text,$add_y,$dim1);

}

sub rand_color {
my $c1 = 50+int(rand(150));
my $c2 = 50+int(rand(150));
my $c3 = 50+int(rand(150));
my $COLOR = "0:$c1:$c2:$c3";
}

sub trans_color {
my $c1 = 150+int(rand(75));
my $c2 = 150+int(rand(75));
my $c3 = 150+int(rand(75));
my $COLOR = "0:$c1:$c2:$c3";
}

sub longchar {
if (length $_[1] > 1) {
return 1;
} else {
return 0;
}
}

sub lowchar {
if ($_[1] =~ /(g|j|p|q|y)/) {
return 1;
} else {
return 0;
}
}

sub opts_ids {

my (
$self,
$txt_ref,
$vars_ref,
$BLK_ref,
) = @_;

my %vars = %$vars_ref;

my @opts;

foreach my $opt (&opts("",$vars{'app_input_type'},$txt_ref,$BLK_ref)) {
if ($opt =~ /^(.*?)\^(.*)$/) {
my $id = $1;
my $exclude;
if ($vars{'output_worksheet_maker'}) {
if ($id =~ /^(exa|grp)/) {
$exclude++;
}
if ($vars{'app_input_class_level'} < 22 && $id =~ /^grid/) {
$exclude++;
}
}
if ($id ne "random" && !$exclude) {
@opts = (@opts,$id);
}
}
}

return @opts;

}

sub opts {

my (
$self,
$type,
$txt_ref,
$BLK_ref,
) = @_;

my @txt = @$txt_ref;
my %BLK = %$BLK_ref;

my (@num_ex,@num_dots,@let_words);

if ($type eq "num") {
@num_ex = (
"exa\^$BLK{'number'} & $BLK{'examples'}",
"-",
);
@num_dots = (
"-",
"grp-dot\^$txt[15]",
);
}

if ($type eq "abc") {
@let_words = (
"-",
"rand-words-en\^$txt[17] ($BLK{'en'})",
"rand-words-de\^$txt[17] ($BLK{'de'})",
"rand-words-fr\^$txt[17] ($BLK{'fr'})",
);
}

return (
@num_ex,
"box-big\^$txt[5], $BLK{'large'} (1 $BLK{'row'})",
"box-med\^$txt[5], $BLK{'medium'} (2 $BLK{'rows'})",
"box-sma\^$txt[5], $BLK{'small'} (3 $BLK{'rows'})",
"box-prg\^$txt[5], $txt[16] ($BLK{'large'}, $BLK{'medium'}, $BLK{'small'})",
"-",
"edu-big\^$txt[6], $BLK{'large'} (1 $BLK{'row'})",
"edu-med\^$txt[6], $BLK{'medium'} (2 $BLK{'rows'})",
"edu-sma\^$txt[6], $BLK{'small'} (3 $BLK{'rows'})",
"edu-prg\^$txt[6], $txt[16] ($BLK{'large'}, $BLK{'medium'}, $BLK{'small'})",
"-",
"lin-big\^$txt[7], $BLK{'large'} (1 $BLK{'row'})",
"lin-med\^$txt[7], $BLK{'medium'} (2 $BLK{'rows'})",
"lin-sma\^$txt[7], $BLK{'small'} (3 $BLK{'rows'})",
"lin-prg\^$txt[7], $txt[16] ($BLK{'large'}, $BLK{'medium'}, $BLK{'small'})",
"-",
"grid-10^$BLK{'grid'}, 10 mm",
"grid-8^$BLK{'grid'}, 8 mm",
"grid-5^$BLK{'grid'}, 5 mm",
"grid-prg^$BLK{'grid'}, $txt[16] (10, 8 & 5 mm)",
"-",
"rand-pos\^$txt[10]",
"rand-find\^$txt[14]",
@let_words,
@num_dots,
"-",
"random\^$BLK{'random'}",
);

}

sub mix_mode {

my (
$self,
$mix_chars_ref,
$used_ref,
) = @_;

my @mix_chars = @$mix_chars_ref;
my $mix_num = @mix_chars;

my %used = %$used_ref;

my $char = $mix_chars[int(rand($mix_num))];

if ($used{"char_$char"}) {
$char = $mix_chars[int(rand($mix_num))];
}
if ($used{"last_char"} eq $char) {
$char = $mix_chars[int(rand($mix_num))];
}

return $char;

}

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

1;

__END__