package ONO::FW::Edu::Apps::Modules::Angles;
################################################################################
# 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::PDF::Draw;
use ONO::Lib::PDF::ToolBox;
use ONO::FW::Apps::Core;
use ONO::FW::Apps::Core::Graphics;
use ONO::Lib::Parser;
use ONO::IO;
use ONO::FW::Apps::PDF;
use ONO::FW::Apps::ToolBox;
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 = "angles";
my @txt = (
"measure",
"draw",
"Chose your angles",
"precision",
"grid",
"align on grid",
"angles",
"show where to start",
"extend lines",
"start at 0° (up)",
);
my @txang = (
"0",
"90",
"180",
"270",
"360",
"0-90",
"90-180",
"180-360",
);
my @txtypes = (
"zero",
"acute",
"right",
"obtuse",
"straight",
"reflex",
"full",
);
if ($vars{'app_lang'} eq "de") {
@txt = (
"messen",
"zeichnen",
"Wähle deine Winkel",
"Präzision",
"Raster",
"am Raster ausrichten",
"Winkel",
"Anfang anzeigen",
"Linien verlängern",
"bei 0° beginnen",
);
@txtypes = (
"null",
"spitz",
"recht",
"stumpf",
"gestreckt",
"überstumpf",
"voll",
);
}
if ($vars{'app_lang'} eq "lu") {
@txt = (
"moossen",
"zeechnen",
"Wiel deng Wénkelen",
"Präzisioun",
"Raster",
"um Raster ausriichten",
"Wénkel",
"Ufank uweisen",
"Linne verlängeren",
"bei 0° ufänken",
);
@txtypes = (
"null",
"spatz",
"recht",
"stomp",
"gestreckt",
"iwwerstomp",
"voll",
);
}
if ($vars{'app_lang'} eq "fr") {
@txt = (
"mesurer",
"dessiner",
"Choisis tes angles",
"précision",
"grille",
"aligner sur la grille",
"angles",
"afficher début",
"prolonger lignes",
"commencer à 0°",
);
@txtypes = (
"zéro",
"aigu",
"droit",
"obtus",
"droit",
"réflexe",
"plein",
);
}
if (!$vars{'app_input_print_options_title'}) {
$vars{'app_input_print_options_title'} = ucfirst $txt[0]." & ".ucfirst $txt[1];
if ($vars{'app_input_learn_measure'} || $vars{'app_input_learn_draw'}) {
if ($vars{'app_input_learn_measure'} < 1) {
$vars{'app_input_print_options_title'} = ucfirst $txt[1];
}
if ($vars{'app_input_learn_draw'} < 1) {
$vars{'app_input_print_options_title'} = ucfirst $txt[0];
}
}
$vars{'app_input_print_options_title'} = ucfirst "$txt[6]: $vars{'app_input_print_options_title'}";
}
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_web'} || $vars{'output_paper'}) {
# first we'll build the list of valid angles...
my (@angles_used_360,@angles_used,$angles_used_num);
if ($vars{'app_input_angle_0'} > 0) {
$angles_used_360[0] = 1;
}
if ($vars{'app_input_angle_90'} > 0) {
$angles_used_360[90] = 1;
}
if ($vars{'app_input_angle_180'} > 0) {
$angles_used_360[180] = 1;
}
if ($vars{'app_input_angle_360'} > 0) {
$angles_used_360[360] = 1;
}
if ($vars{'app_input_angle_0_90'} > 0) {
for (my $i = 0; $i < 91; $i++) {
$angles_used_360[$i] = 1;
}
}
if ($vars{'app_input_angle_90_180'} > 0) {
for (my $i = 90; $i < 181; $i++) {
$angles_used_360[$i] = 1;
}
}
if ($vars{'app_input_angle_180_360'} > 0) {
for (my $i = 180; $i < 361; $i++) {
$angles_used_360[$i] = 1;
}
}
for (my $i = 0; $i < 361; $i++) {
if ($angles_used_360[$i] == 1) {
if (!$vars{'app_input_select_precision'} || ($vars{'app_input_select_precision'} > 0 && $i%$vars{'app_input_select_precision'} == 0)) {
@angles_used = (@angles_used,$i);
$angles_used_num++;
}
}
}
my $PDF_OPTS;
my $questions_per_page = 12;
if ($vars{'app_input_select_number'}) {
$questions_per_page = $vars{'app_input_select_number'};
}
my ($num_comma,$num_delimiter) = ONO::FW::Apps::Core->local_comma_delimiter(ONO::FW::Apps::Core->detect_local($vars{'app_lang'}),$vars_ref);
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);
}
foreach my $copy (ONO::FW::Apps::Core->unique_copies($vars{'app_input_print_options_unique_copies'})) {
my ($pdf_x,$pdf_y) = (5,3);
my @corr_cache;
if ($vars{'output_paper'}) {
if ($copy > 1) {
ONO::FW::Apps::PDF->page("",$format);
}
ONO::FW::Apps::Core->headers(\%vars,$format);
ONO::FW::Apps::PDF->title($vars{'app_input_print_options_title'},$PDF_OPTS,$vars{'app_input_print_options_code'},$format);
ONO::FW::Apps::Core::Graphics->pdf_draw_item_numbers($canvas,-2,0,1,4,"V",$vars_ref);
# ONO::Lib::PDF::ToolBox->canvas_test($canvas);
}
my ($last_cache,%all_cache);
for (my $i = 0; $i < $questions_per_page; $i++) {
# output paper
if ($vars{'output_paper'}) {
my $type = "measure";
if ($vars{'app_input_learn_draw'}) {
$type = "draw";
if ($vars{'app_input_learn_measure'} && int(rand(100)) > 50) {
$type = "measure";
}
}
my $start = int(rand(360));
if ($vars{'app_input_select_precision'} > 1) {
$start = int(rand(360/$vars{'app_input_select_precision'}))*$vars{'app_input_select_precision'};
}
if (($type eq "draw" && $vars{'app_input_learn_draw_start_zero'} || $type eq "measure" && $vars{'app_input_learn_measure_start_zero'})) {
$start = 0;
}
my $arc = $angles_used[int(rand($angles_used_num))];
my $whilecounter;
while ($whilecounter < 256 && ($arc == $last_cache || $all_cache{"$type.$arc"})) {
$whilecounter++;
$arc = $angles_used[int(rand($angles_used_num))];
}
$last_cache = $arc;
$all_cache{"$type.$arc"}++;
# rect dimensions, length and center:
my ($rx,$ry) = (50,40);
my ($cx,$cy) = (25,20);
my $length = 23;
if ($questions_per_page == 6) {
($rx,$ry) = (80,60);
($cx,$cy) = (40,30);
$length = 33;
}
my $display = 1;
if ($vars{'output_worksheet_maker'}) {
$pdf_y = $pdf_y+1;
if ($pdf_y > 45) {
$display = 0;
}
}
if ($display) {
$corr_cache[$i] = "$pdf_x\^$pdf_y\^$rx\^$ry\^$cx\^$cy\^$start\^$arc\^$length\^";
if ($type eq "measure" || $vars{'app_input_learn_draw_start'}) {
ONO::Lib::PDF::Draw->circle($canvas,$pdf_x+$cx,$pdf_y+$cy,10,2,"","0:250:230:175");
}
if ($vars{'app_input_opt_grid'}) {
ONO::Lib::PDF::Draw->grid($canvas,$pdf_x,$pdf_y,$pdf_x+$rx,$pdf_y+$ry,5,0.1);
} else {
ONO::Lib::PDF::Draw->rect($canvas,$pdf_x,$pdf_y,$pdf_x+$rx,$pdf_y+$ry,0.1);
}
if ($type eq "measure") {
if ($vars{'app_input_learn_measure_extend'}) {
if ($start == 0 || $start%90 == 0) {
ONO::Lib::PDF::Draw->linerot($canvas,$pdf_x+$cx,$pdf_y+$cy,$length*1.5,$start,1,"0:200:200:200",1);
} else {
ONO::Lib::PDF::Draw->linerot($canvas,$pdf_x+$cx,$pdf_y+$cy,$length*2.5,$start,1,"0:200:200:200",1);
}
if ($start+$arc == 0 || ($start+$arc)%90 == 0) {
ONO::Lib::PDF::Draw->linerot($canvas,$pdf_x+$cx,$pdf_y+$cy,$length*1.5,$start+$arc,1,"0:200:200:200",1);
} else {
ONO::Lib::PDF::Draw->linerot($canvas,$pdf_x+$cx,$pdf_y+$cy,$length*2.5,$start+$arc,1,"0:200:200:200",1);
}
}
ONO::Lib::PDF::Draw->curve($canvas,$pdf_x+$cx,$pdf_y+$cy,10,$start,$start+$arc,4,"0:225:140:50");
ONO::Lib::PDF::Draw->linerot($canvas,$pdf_x+$cx,$pdf_y+$cy,$length,$start,1);
ONO::Lib::PDF::Draw->linerot($canvas,$pdf_x+$cx,$pdf_y+$cy,$length,$start+$arc,1);
}
ONO::Lib::PDF::Draw->rect($canvas,$pdf_x-1,$pdf_y-2.5,$pdf_x+13.5,$pdf_y+2.5,1,"0:25:25:25","0:240:240:240","1.5");
if ($type eq "draw") {
if ($vars{'app_input_learn_draw_start'}) {
ONO::Lib::PDF::Draw->circle($canvas,$pdf_x+$cx,$pdf_y+$cy,0.2,2);
ONO::Lib::PDF::Draw->linerot($canvas,$pdf_x+$cx,$pdf_y+$cy,$length,$start,1,"0:200:200:200",1);
ONO::Lib::PDF::Draw->linerot($canvas,$pdf_x+$cx,$pdf_y+$cy,$length/5,$start,1);
}
ONO::Lib::PDF::Draw->text($canvas,$pdf_x+6,$pdf_y+1.5,"$arc°","c");
}
}
if ($questions_per_page == 6) {
$pdf_y = $pdf_y + 63;
if ($pdf_y > 180) {
$pdf_x = $pdf_x+85;
$pdf_y = 3;
}
} else {
$pdf_y = $pdf_y + 47.5;
if ($pdf_y > 180) {
$pdf_x = $pdf_x+57;
$pdf_y = 3;
}
}
}
}
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::Graphics->pdf_draw_item_numbers($canvas,-2,0,1,4,"CV",$vars_ref);
# ONO::Lib::PDF::ToolBox->canvas_test($canvas);
for (my $c = 0; $c < $questions_per_page; $c++) {
my ($pdf_x,$pdf_y,$rx,$ry,$cx,$cy,$start,$arc,$length) = split(/\^/,$corr_cache[$c]);
my $display = 1;
if ($vars{'output_worksheet_maker'} && ($pdf_y < 1 || $pdf_y > 45)) {
$display = 0;
}
if ($display) {
ONO::Lib::PDF::Draw->circle($canvas,$pdf_x+$cx,$pdf_y+$cy,10,2,"","0:200:200:200");
if ($vars{'app_input_opt_grid'}) {
ONO::Lib::PDF::Draw->grid($canvas,$pdf_x,$pdf_y,$pdf_x+$rx,$pdf_y+$ry,5,0.1);
} else {
ONO::Lib::PDF::Draw->rect($canvas,$pdf_x,$pdf_y,$pdf_x+$rx,$pdf_y+$ry,0.1);
}
if ($vars{'app_input_learn_measure_extend'}) {
ONO::Lib::PDF::Draw->linerot($canvas,$pdf_x+$cx,$pdf_y+$cy,$length*2.5,$start,1,"0:200:200:200",1);
ONO::Lib::PDF::Draw->linerot($canvas,$pdf_x+$cx,$pdf_y+$cy,$length*2.5,$start+$arc,1,"0:200:200:200",1);
}
ONO::Lib::PDF::Draw->curve($canvas,$pdf_x+$cx,$pdf_y+$cy,10,$start,$start+$arc,4,"0:150:150:150");
ONO::Lib::PDF::Draw->linerot($canvas,$pdf_x+$cx,$pdf_y+$cy,$length,$start,1);
ONO::Lib::PDF::Draw->linerot($canvas,$pdf_x+$cx,$pdf_y+$cy,$length,$start+$arc,1);
ONO::Lib::PDF::Draw->rect($canvas,$pdf_x-1,$pdf_y-3,$pdf_x+13,$pdf_y+2,1,"0:25:25:25","0:240:240:240","1.5");
ONO::Lib::PDF::Draw->text($canvas,$pdf_x+6,$pdf_y+1,"$arc°","c");
}
}
}
}
if ($vars{'output_paper'}) {
ONO::FW::Apps::PDF->end;
my $wait_switches;
if ($vars{'app_input_opt_grid'}) {
$wait_switches .= "S";
}
$WEB .= ONO::FW::Apps::PDF->please_wait($pdfkey,\%BLK,\%vars,"",$HTTP,$BASE,$wait_switches);
}
}
} else {
#############################################################
# EXERCISE SETUP
#############################################################
if (!$vars{'app_input_number_of_questions'}) {
$vars{'app_input_number_of_questions'} = 20;
if (ONO::IO->device eq "phone") {
$vars{'app_input_number_of_questions'} = 10;
}
}
# "screen:320:50:50::arithmetic_screenshot_1.jpg",
$WEB .= ONO::FW::Apps::Core->infopics(
"sheet:168:180:50:15:angles_sheet_1.jpg",
"sheet:168:40:80:-10:angles_sheet_2.jpg",
);
if (
!$vars{'app_input_angle_0'} && !$vars{'app_input_angle_90'} && !$vars{'app_input_angle_180'} && !$vars{'app_input_angle_360'} &&
!$vars{'app_input_angle_0_90'} && !$vars{'app_input_angle_90_180'} && !$vars{'app_input_angle_180_360'}
) {
$vars{'app_input_angle_0'} = 1;
$vars{'app_input_angle_90'} = 1;
$vars{'app_input_angle_0_90'} = 1;
}
if (!$vars{'app_input_learn_measure'} && !$vars{'app_input_learn_draw'}) {
$vars{'app_input_learn_measure'}++;
$vars{'app_input_learn_measure_extend'}++;
$vars{'app_input_learn_draw'}++;
$vars{'app_input_learn_draw_start'}++;
$vars{'app_input_learn_draw_start_zero'}++;
}
if (!$vars{'app_input_select_precision'}) {
$vars{'app_input_select_precision'} = 5;
}
my @txang2;
for (my $i = 0; $i < 8; $i++) {
$txang2[$i] = qq~<span class="small col9">($txang[$i]°)</span>~;
}
# app_input_angle_90_id
my $SELECT_ALL_JS = qq~onojs_ui_switch_on('app_input_angle_0','1');onojs_ui_switch_on('app_input_angle_90','1');onojs_ui_switch_on('app_input_angle_180','1');onojs_ui_switch_on('app_input_angle_360','1');
onojs_ui_switch_on('app_input_angle_0_90','1');onojs_ui_switch_on('app_input_angle_90_180','1');onojs_ui_switch_on('app_input_angle_180_360','1');~;
my $SELECT_ALL = qq~<a href="javascript:void(0);" onclick="$SELECT_ALL_JS" class="button_green button_mini">$BLK{'select_all'}</a>~;
my $PRECISION;
foreach my $pre (1,5,10,45,90) {
$PRECISION .= "$pre=$txt[3]: $pre°;";
}
my $CONF;
# $CONF .= ONO::FW::Apps::ToolBox->conf_input("txt", $BLK_ref,\%vars,"","$txt[2]:");
$CONF .= ONO::FW::Apps::ToolBox->conf_input_splitrow_open("w40");
$CONF .= ONO::FW::Apps::ToolBox->conf_input("check", $BLK_ref,\%vars,"","","angle_0",$vars{'app_input_angle_0'},"$txtypes[0] $txang2[0]");
$CONF .= ONO::FW::Apps::ToolBox->conf_input_splitrow_col("w60");
$CONF .= ONO::FW::Apps::ToolBox->conf_input("check", $BLK_ref,\%vars,"","","angle_0_90",$vars{'app_input_angle_0_90'},"$txtypes[1] $txang2[5]");
$CONF .= ONO::FW::Apps::ToolBox->conf_input_splitrow_close();
$CONF .= ONO::FW::Apps::ToolBox->conf_input_splitrow_open("w40");
$CONF .= ONO::FW::Apps::ToolBox->conf_input("check", $BLK_ref,\%vars,"","","angle_90",$vars{'app_input_angle_90'},"$txtypes[2] $txang2[1]");
$CONF .= ONO::FW::Apps::ToolBox->conf_input_splitrow_col("w60");
$CONF .= ONO::FW::Apps::ToolBox->conf_input("check", $BLK_ref,\%vars,"","","angle_90_180",$vars{'app_input_angle_90_180'},"$txtypes[3] $txang2[6]");
$CONF .= ONO::FW::Apps::ToolBox->conf_input_splitrow_close();
$CONF .= ONO::FW::Apps::ToolBox->conf_input_splitrow_open("w40");
$CONF .= ONO::FW::Apps::ToolBox->conf_input("check", $BLK_ref,\%vars,"","","angle_180",$vars{'app_input_angle_180'},"$txtypes[4] $txang2[2]");
$CONF .= ONO::FW::Apps::ToolBox->conf_input_splitrow_col("w60");
$CONF .= ONO::FW::Apps::ToolBox->conf_input("check", $BLK_ref,\%vars,"","","angle_180_360",$vars{'app_input_angle_180_360'},"$txtypes[5] $txang2[7]");
$CONF .= ONO::FW::Apps::ToolBox->conf_input_splitrow_close();
$CONF .= ONO::FW::Apps::ToolBox->conf_input_splitrow_open("w40");
$CONF .= ONO::FW::Apps::ToolBox->conf_input("check", $BLK_ref,\%vars,"","","angle_360",$vars{'app_input_angle_360'},"$txtypes[6] $txang2[4]");
$CONF .= ONO::FW::Apps::ToolBox->conf_input_splitrow_col("w60");
$CONF .= ONO::FW::Apps::ToolBox->conf_input("html", $BLK_ref,\%vars,"",$SELECT_ALL);
$CONF .= ONO::FW::Apps::ToolBox->conf_input_splitrow_close();
$CONF .= ONO::FW::Apps::ToolBox->conf_input("select", $BLK_ref,\%vars,"",$PRECISION,"",$vars{'app_input_select_precision'},"","precision");
$CONF .= ONO::FW::Apps::ToolBox->conf_input("spacer", $BLK_ref,\%vars);
$CONF .= ONO::FW::Apps::ToolBox->conf_input("select", $BLK_ref,\%vars,"","12=12 $txt[6] ( 4 x 3 );6=6 $txt[6] ( 3 x 2 );","",$vars{'app_input_select_number'},"","number");
$CONF .= ONO::FW::Apps::ToolBox->conf_input("check", $BLK_ref,\%vars,"L","","opt_grid",$vars{'app_input_opt_grid'},"$txt[4] (5 mm)");
$CONF .= ONO::FW::Apps::ToolBox->conf_input("spacer", $BLK_ref,\%vars);
$CONF .= ONO::FW::Apps::ToolBox->conf_input_splitrow_open("w40");
$CONF .= ONO::FW::Apps::ToolBox->conf_input("check", $BLK_ref,\%vars,"","","learn_measure",$vars{'app_input_learn_measure'},$txt[0]);
$CONF .= ONO::FW::Apps::ToolBox->conf_input_splitrow_col("w60");
$CONF .= ONO::FW::Apps::ToolBox->conf_input("check", $BLK_ref,\%vars,"M","","learn_measure_extend",$vars{'app_input_learn_measure_extend'},$txt[8]);
$CONF .= ONO::FW::Apps::ToolBox->conf_input("check", $BLK_ref,\%vars,"M","","learn_measure_start_zero",$vars{'app_input_learn_measure_start_zero'},$txt[9]);
$CONF .= ONO::FW::Apps::ToolBox->conf_input_splitrow_row("w40");
$CONF .= ONO::FW::Apps::ToolBox->conf_input("check", $BLK_ref,\%vars,"","","learn_draw",$vars{'app_input_learn_draw'},$txt[1]);
$CONF .= ONO::FW::Apps::ToolBox->conf_input_splitrow_col("w60");
$CONF .= ONO::FW::Apps::ToolBox->conf_input("check", $BLK_ref,\%vars,"M","","learn_draw_start",$vars{'app_input_learn_draw_start'},$txt[7]);
$CONF .= ONO::FW::Apps::ToolBox->conf_input("check", $BLK_ref,\%vars,"M","","learn_draw_start_zero",$vars{'app_input_learn_draw_start_zero'},$txt[9]);
$CONF .= ONO::FW::Apps::ToolBox->conf_input_splitrow_close();
$WEB .= ONO::FW::Apps::Core->conf_box(
$db,
$community,
$app,
$form,
"",
$action_url,
$CONF,
$lang,
$BLK_ref,
\%vars,
"p-ncdi-CDI-u",
);
if (!$vars{'exercise'}) {
$WEB .= ONO::FW::Apps::Core->info_display(
ONO::FW::Apps::Core->info("info_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__