From: ivan Date: Tue, 12 Mar 2002 14:51:45 +0000 (+0000) Subject: initial import X-Git-Tag: BEGIN X-Git-Url: http://git.freeside.biz/gitweb/?p=HTML-Widgets-SelectLayers.git;a=commitdiff_plain;h=25743a94d01bed5db01be7eebfdbd543a63e6a3e initial import --- 25743a94d01bed5db01be7eebfdbd543a63e6a3e 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. +