package HTML::Widgets::SelectLayers;
use strict;
use vars qw($VERSION);
$VERSION = '0.07';
=head1 NAME
HTML::Widgets::SelectLayers - Perl extension for selectable HTML layers
=head1 SYNOPSIS
use HTML::Widgets::SelectLayers;
use Tie::IxHash;
tie my %options, 'Tie::IxHash',
'value' => 'Select One',
'value2' => 'Select Two',
;
$widget = new HTML::Widgets::SelectLayers(
'options' => \%options,
'form_name' => 'dummy',
'form_action' => 'process.cgi',
#new code auto-detects form types (radio not yet supported)
#'form_elements' => [ qw( textfield1 textfield2 checkbox1 radio1 select1 ) ],
'form_elements' => [ qw( textfield1 textfield2 checkbox1 radio1 select1 ) ],
#deprecated style still works for now
#'form_text' => [ qw( textfield1 textfield2 ) ],
#'form_checkbox' => [ qw( checkbox1 ) ],
#'form_radio' => [ qw( radio1 ) ],
#'form_select' => [ qw( select1 ) ],
'layer_callback' => sub {
my $layer = shift;
my $html = qq!!;
$html .= $other_stuff;
$html;
},
);
print '
'.
"";
#foreach my $layer ( 'konq_kludge', keys %$options ) {
foreach my $layer ( keys %$options ) {
#start layer
$html .= <
END
#form fields
$html .= <
END
foreach my $f ( @$form_elements, @$form_text, @$form_checkbox, @$form_radio, @$form_select )
{
$html .= <
END
}
#layer
$html .= &{$self->{layer_callback}}($layer);
#end form & layer
$html .= <
END
}
if ( $under_position eq 'absolute' ) {
$html .= <
//var max = ${key}maxHeight;
document.write("");
END
}
$html;
}
sub _fixup {
my $self = shift;
my $key = exists($self->{unique_key}) ? $self->{unique_key} : '';
my $form_name = $self->{form_name} or return '';
my $form_elements =
exists($self->{form_elements}) ? $self->{form_elements} : [];
my $form_text =
exists($self->{form_text}) ? $self->{form_text} : [];
my $form_checkbox =
exists($self->{form_checkbox}) ? $self->{form_checkbox} : [];
my $form_radio =
exists($self->{form_radio}) ? $self->{form_radio} : [];
my $form_select =
exists($self->{form_select}) ? $self->{form_select} : [];
my $html = <
function copyelement(from, to) {
if ( from.type == undefined ) {
to.value = '';
} else if ( from.type == 'select-one' ) {
to.value = from.options[from.selectedIndex].value;
//alert(from + " (" + from.type + "): " + to.name + " => (" + from.selectedIndex + ") " + to.value);
} else if ( from.type == 'select-multiple' ) {
var i = 0;
var count = 0;
var values = new Array();
for (i=0;i 0) {
to.value = values[values.length-1];
}else{
to.value = '';
}
} else if ( from.type == 'checkbox' ) {
if ( from.checked ) {
to.value = from.value;
} else {
to.value = '';
}
// } else if ( from.type == 'radio' ) {
} else {
if ( from.value == undefined ) {
to.value = '';
} else {
to.value = from.value;
}
}
//alert(from + " (" + from.type + "): " + to.name + " => " + to.value);
}
END
$html .= "
//function ${key}fchanged(what) {
// ${key}fixup(what.form);
//}
function ${key}fixup(what) {\n";
foreach my $f ( @$form_elements ) {
$html .= "copyelement( document.$form_name.elements['$f'],
what.elements['$f']
)\n";
}
foreach my $f ( @$form_text ) {
$html .= "what.$f.value = document.$form_name.$f.value;\n";
}
foreach my $f ( @$form_checkbox ) {
$html .= "if (document.$form_name.$f.checked)
what.$f.value = document.$form_name.$f.value;
else
what.$f.value = '';\n"
}
foreach my $f ( @$form_radio ) {
$html .= "what.$f.value = '';
for ( i=0; i< document.$form_name.$f.length; i++ )
if ( document.$form_name.$f\[i].checked )
what.$f.value = document.$form_name.$f\[i].value;\n";
}
foreach my $f ( @$form_select ) {
$html .= "what.$f.value = document.$form_name.$f.options[document.$form_name.$f.selectedIndex].value;\n";
}
$html .= &{$self->{fixup_callback}}() if exists($self->{fixup_callback});
$html .= "}\n";
$html;
}
sub _select {
my $self = shift;
my $key = exists($self->{unique_key}) ? $self->{unique_key} : '';
my $options = $self->{options};
my $selected = exists($self->{selected_layer}) ? $self->{selected_layer} : '';
my $size = exists($self->{size}) ? $self->{size} : 1;
my $html = "
';
}
sub _changed {
my $self = shift;
my $key = exists($self->{unique_key}) ? $self->{unique_key} : '';
my $options = $self->{options};
my $under_position =
exists($self->{under_position}) ? $self->{under_position} : 'static';
my $html = "
";
$html;
}
sub _visualize {
my $self = shift;
my $key = exists($self->{unique_key}) ? $self->{unique_key} : '';
return '' unless exists($self->{selected_layer});
my $selected = $self->{selected_layer};
my $under_position =
exists($self->{under_position}) ? $self->{under_position} : 'static';
my $display = ( $under_position eq 'absolute' )
? 'visibility = "visible"'
: 'display = ""';
<
function ${key}visualize() {
document.getElementById('${key}d$selected').style.$display;
document.getElementById('${key}d$selected').style.zIndex = 1;
}
END
}
sub _safeonload {
<
var gSafeOnload = new Array();
function SafeAddOnLoad(f) {
if (window.onload) {
if (window.onload != SafeOnload) {
gSafeOnload[0] = window.onload;
window.onload = SafeOnload;
}
gSafeOnload[gSafeOnload.length] = f;
} else {
window.onload = f;
}
}
function SafeOnload()
{
for (var i=0;i
END
}
=back
=head1 AUTHOR
Ivan Kohler Eivan-selectlayers@420.amE
=head1 COPYRIGHT
Copyright (c) 2002-2005 Ivan Kohler
All rights reserved.
This program is free software; you can redistribute it and/or modify it under
the same terms as Perl itself.
=head1 BUGS
JavaScript
All the different form_* options are unnecessary, could use .type to auto-sense
Could give you a function or something for copying variables out of the
layered forms.
=head1 SEE ALSO
L. L, http://www.xs4all.nl/~ppk/js/dom.html,
http://javascript.about.com/library/scripts/blsafeonload.htm
=cut