From 25743a94d01bed5db01be7eebfdbd543a63e6a3e Mon Sep 17 00:00:00 2001 From: ivan Date: Tue, 12 Mar 2002 14:51:45 +0000 Subject: [PATCH 1/1] initial import --- Changes | 6 + MANIFEST | 8 ++ MANIFEST.SKIP | 1 + Makefile.PL | 11 ++ README | 28 +++++ SelectLayers.pm | 336 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ homepage.pl | 189 +++++++++++++++++++++++++++++++ test.pl | 17 +++ 8 files changed, 596 insertions(+) create mode 100644 Changes create mode 100644 MANIFEST create mode 100644 MANIFEST.SKIP create mode 100644 Makefile.PL create mode 100644 README create mode 100644 SelectLayers.pm create mode 100755 homepage.pl create mode 100644 test.pl diff --git a/Changes b/Changes new file mode 100644 index 0000000..6bda248 --- /dev/null +++ b/Changes @@ -0,0 +1,6 @@ +Revision history for Perl extension HTML::Widgets::SelectLayers. + +0.01 Thu Mar 7 04:36:46 2002 + - original version; created by h2xs 1.21 with options + -A -X -n HTML::Widgets::SelectLayers + diff --git a/MANIFEST b/MANIFEST new file mode 100644 index 0000000..a7fc9d8 --- /dev/null +++ b/MANIFEST @@ -0,0 +1,8 @@ +Changes +Makefile.PL +MANIFEST +MANIFEST.SKIP +README +SelectLayers.pm +test.pl +homepage.pl diff --git a/MANIFEST.SKIP b/MANIFEST.SKIP new file mode 100644 index 0000000..ae335e7 --- /dev/null +++ b/MANIFEST.SKIP @@ -0,0 +1 @@ +CVS/ diff --git a/Makefile.PL b/Makefile.PL new file mode 100644 index 0000000..9bc7d50 --- /dev/null +++ b/Makefile.PL @@ -0,0 +1,11 @@ +use ExtUtils::MakeMaker; +# See lib/ExtUtils/MakeMaker.pm for details of how to influence +# the contents of the Makefile that is written. +WriteMakefile( + 'NAME' => 'HTML::Widgets::SelectLayers', + 'VERSION_FROM' => 'SelectLayers.pm', # finds $VERSION + 'PREREQ_PM' => {}, # e.g., Module::Name => 1.1 + ($] >= 5.005 ? ## Add these new keywords supported since 5.005 + (ABSTRACT_FROM => 'SelectLayers.pm', # retrieve abstract from module + AUTHOR => 'Ivan Kohler ') : ()), +); diff --git a/README b/README new file mode 100644 index 0000000..e2fed72 --- /dev/null +++ b/README @@ -0,0 +1,28 @@ +HTML::Widgets::SelectLayers version 0.01 +======================================== + +This module implements an HTML widget with multiple layers. Only one layer +is visible at any given time, controlled by a !; + $html .= $other_stuff; + $html; + }, + ); + + print '
'. + ''. + ''. + ''. + $widget->html; + +=head1 DESCRIPTION + +This module implements an HTML widget with multiple layers. Only one layer +is visible at any given time, controlled by a ESELECTE box. For an +example see http://www.420.am/selectlayers/ + +This HTML generated by this module uses JavaScript, but nevertheless attempts +to be as cross-browser as possible, testing for features via DOM support rather +than specific browsers or versions. It has been tested under Mozilla 0.9.8, +Netscape 4.77, IE 5.5, Konqueror 2.2.2, and Opera 5.0. + +=head1 FORMS + +Not all browsers seem happy with forms that span layers. The generated HTML +will have a E/FORME tag before the layers and will generate +EFORME and E/FORME tags for each layer. To facilitate +ESUBMITE buttons located within the layers, you can pass a form name +and element names, and the relevant values will be copied to the layer's form. +See the B options below. + +=head1 METHODS + +=over 4 + +=item new KEY, VALUE, KEY, VALUE... + +Options are passed as name/value pairs: + +options - Hash reference of layers and labels for the ESELECTE. See + L to control ordering. + In HTML: EOPTION VALUE="$layer"E$labelE/OPTIONE + +layer_callback - subroutine reference to create each layer. The layer name + is passed as an option in I<@_> + +selected_layer - (optional) initially selected layer + +form_name - (optional) Form name to copy values from. If not supplied, no + values will be copied. + +form_action - Form action + +form_text - (optional) Array reference of text (or hidden) form fields to copy + from the B form. + +form_checkbox - (optional) Array reference of checkbox form fields to copy from + the B form. + +fixup_callback - (optional) subroutine reference, returns supplimentary + JavaScript for the function described above under FORMS. + +#form_select + +size - (optional) size of the ESELECTE, default 1. + +unique_key - (optional) prepended to all JavaScript function/variable/object + names to avoid namespace collisions. + +html_beween - (optional) HTML between the ESELECTE and the layers. + +=cut + +sub new { + my($proto, %options) = @_; + my $class = ref($proto) || $proto; + my $self = \%options; + bless($self, $class); +} + +=cut + +=item html + +Returns HTML for the widget. + +=cut + +sub html { + my $self = shift; + my $key = exists($self->{unique_key}) ? $self->{unique_key} : ''; + my $between = exists($self->{html_between}) ? $self->{html_between} : ''; + my $options = $self->{options}; + my $form_action = exists($self->{form_action}) ? $self->{form_action} : ''; + my $form_text = + exists($self->{form_text}) ? $self->{form_text} : []; + my $form_checkbox = + exists($self->{form_checkbox}) ? $self->{form_checkbox} : []; + + my $html = $self->_safeonload. + $self->_visualize. + "". + $self->_changed. + $self->_fixup. + $self->_select. $between. ''; + + #foreach my $layer ( 'konq_kludge', keys %$options ) { + foreach my $layer ( keys %$options ) { + + #start layer + my $visibility = "hidden"; + $html .= < + if (document.getElementById) { + document.write("
"); + } else { +END + $visibility="show" if $visibility eq "visible"; + $html .= <"); + } + +END + + #form fields + $html .= < +END + foreach my $f ( @$form_text, @$form_checkbox ) { + $html .= < +END + } + + #layer + $html .= &{$self->{layer_callback}}($layer); + + #end form & layer + $html .= < + + +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_text = + exists($self->{form_text}) ? $self->{form_text} : []; + my $form_checkbox = + exists($self->{form_checkbox}) ? $self->{form_checkbox} : []; + my $html = " + "; + + $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 $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}; + < +function ${key}visualize() { + if (document.getElementById) { + document.getElementById('${key}d$selected').style.visibility = "visible"; + } else { + document.${key}l$selected.visibility = "visible"; + } +} + +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 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 + +=head1 SEE ALSO + +L. L, http://www.xs4all.nl/~ppk/js/dom.html, +http://javascript.about.com/library/scripts/blsafeonload.htm + +=cut diff --git a/homepage.pl b/homepage.pl new file mode 100755 index 0000000..7e112d2 --- /dev/null +++ b/homepage.pl @@ -0,0 +1,189 @@ +#!/usr/bin/perl -w + +use strict; +use Tie::IxHash; +use HTML::Widgets::SelectLayers; + +tie my %o, 'Tie::IxHash', + 'download' => 'Download', + 'installation' => 'Installation', + 'compatibility' => 'Compatibility', + 'documentation' => 'Documentation', + 'cvs' => 'Anonymous CVS access', +; + +my %html = ( + + 'download' => 'Download HTML-Widgets-SelectLayers-0.01.tar.gz', + + 'installation' => '
+  perl Makefile.PL
+  make
+  make test
+  make install
+
', + +'cvs' => '
+Anonymous CVS access is available:
+  $ export CVSROOT=":pserver:anonymous@cleanwhisker.420.am:/home/cvs/cvsroot"
+  $ cvs login
+  (Logging in to anonymous@cleanwhisker.420.am
+  CVS password: anonymous
+  $ cvs checkout DBIx-DBSchema
+as well as browsable via cvsweb.
+
', + +'documentation' => join('',), + +'compatibility' => '
+This HTML generated by this module uses JavaScript, but nevertheless attempts
+to be as cross-browser as possible, testing for features via DOM support rather
+than specific browsers or versions.  It has been tested under Mozilla 0.9.8,
+Netscape 4.77, IE 5.5, Konqueror 2.2.2, and Opera 5.0.
+
', + +); +close DATA; + +my $w = new HTML::Widgets::SelectLayers( + 'options' => \%o, + 'selected_layer' => 'download', + 'layer_callback' => sub { + my $layer = shift; + "
". $html{$layer}; + }, + #'form_action' => '', + #'form_text' => [], + #'form_checkbox' => [], +); + +print <html, "\n"; + + +HTML::Widgets::SelectLayers - selectable HTML layers + + +
+HTML::Widgets::SelectLayers
+
+Copyright (c) 2002 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.
+
+This module implements an HTML widget with multiple layers.  Only one layer
+is visible at any given time, controlled by a <SELECT> box.  For an example
+see below.
+
+
+
+END + +__DATA__ +
+

+

NAME

+

HTML::Widgets::SelectLayers - Perl extension for selectable HTML layers

+

+


+

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_actoin'   => 'process.cgi',
+    'form_text'     => [ qw( textfield1 textfield2 ) ],
+    'form_checkbox' => [ qw( checkbox1 ) ],
+    'layer_callback' => sub {
+      my $layer = shift;
+      my $html = qq!<INPUT TYPE="hidden" NAME="layer" VALUE="$layer">!;
+      $html .= $other_stuff;
+      $html;
+    },
+  );
+
+  print '<FORM NAME=dummy>'.
+        '<INPUT TYPE="text" NAME="textfield1">'.
+        '<INPUT TYPE="text" NAME="textfield2">'.
+        '<INPUT TYPE="checkbox" NAME="checkbox1" VALUE="Y">'.
+        $widget->html;
+

+


+

DESCRIPTION

+

This module implements an HTML widget with multiple layers. Only one layer +is visible at any given time, controlled by a <SELECT> box. For an +example see http://www.420.am/selectlayers/

+

This HTML generated by this module uses JavaScript, but nevertheless attempts +to be as cross-browser as possible, testing for features via DOM support rather +than specific browsers or versions. It has been tested under Mozilla 0.9.8, +Netscape 4.77, IE 5.5, Konqueror 2.2.2, and Opera 5.0.

+

+


+

FORMS

+

Not all browsers seem happy with forms that span layers. The generated HTML +will have a </FORM> tag before the layers and will generate +<FORM> and </FORM> tags for each layer. To facilitate +<SUBMIT> buttons located within the layers, you can pass a form name +and element names, and the relevant values will be copied to the layer's form. +See the form_ options below.

+

+


+

METHODS

+
+
new KEY, VALUE, KEY, VALUE...
+
+Options are passed as name/value pairs: +

options - Hash reference of layers and labels for the <SELECT>. See + the Tie::IxHash manpage to control ordering. + In HTML: <OPTION VALUE=``$layer''>$label</OPTION>

+

layer_callback - subroutine reference to create each layer. The layer name + is passed as an option in @_

+

selected_layer - (optional) initially selected layer

+

form_name - (optional) Form name to copy values from. If not supplied, no + values will be copied.

+

form_action - Form action

+

form_text - (optional) Array reference of text (or hidden) form fields to copy + from the form_name form.

+

form_checkbox - (optional) Array reference of checkbox form fields to copy from + the form_name form.

+

fixup_callback - (optional) subroutine reference, returns supplimentary + JavaScript for the function described above under FORMS.

+

#form_select

+

size - (optional) size of the <SELECT>, default 1.

+

unique_key - (optional) prepended to all JavaScript function/variable/object + names to avoid namespace collisions.

+

html_beween - (optional) HTML between the <SELECT> and the layers.

+

+
html
+
+Returns HTML for the widget. +

+

+


+

AUTHOR

+

Ivan Kohler <ivan-selectlayers@420.am>

+

+


+

COPYRIGHT

+

Copyright (c) 2002 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.

+

+


+

BUGS

+

JavaScript

+

+


+

SEE ALSO

+

perl. the Tie::IxHash manpage, http://www.xs4all.nl/~ppk/js/dom.html, +http://javascript.about.com/library/scripts/blsafeonload.htm

+ diff --git a/test.pl b/test.pl new file mode 100644 index 0000000..9d970e0 --- /dev/null +++ b/test.pl @@ -0,0 +1,17 @@ +# Before `make install' is performed this script should be runnable with +# `make test'. After `make install' it should work as `perl test.pl' + +######################### + +# change 'tests => 1' to 'tests => last_test_to_print'; + +use Test; +BEGIN { plan tests => 1 }; +use HTML::Widgets::SelectLayers; +ok(1); # If we made it this far, we're ok. + +######################### + +# Insert your test code below, the Test module is use()ed here so read +# its man page ( perldoc Test ) for help writing this test script. + -- 2.11.0