Author: richter
Date: Mon Dec 8 23:45:11 2008
New Revision: 724632
URL: http://svn.apache.org/viewvc?rev=724632&view=rev
Log:
Embperl::Form example
Added:
perl/embperl/trunk/eg/forms/
perl/embperl/trunk/eg/forms/Embperl/
perl/embperl/trunk/eg/forms/Embperl/MyForm/
perl/embperl/trunk/eg/forms/Embperl/MyForm.pm
perl/embperl/trunk/eg/forms/Embperl/MyForm/Control/
perl/embperl/trunk/eg/forms/Embperl/MyForm/DataSource/
perl/embperl/trunk/eg/forms/Embperl/MyForm/DataSource/languages.pm
perl/embperl/trunk/eg/forms/Embperl/MyForm/DataSource/netmask.pm
perl/embperl/trunk/eg/forms/README.txt
perl/embperl/trunk/eg/forms/css/
perl/embperl/trunk/eg/forms/css/EmbperlForm.css
perl/embperl/trunk/eg/forms/js/
perl/embperl/trunk/eg/forms/js/EmbperlForm.js
perl/embperl/trunk/eg/forms/js/prototype.js
perl/embperl/trunk/eg/forms/lib/
perl/embperl/trunk/eg/forms/lib/footer.epl
perl/embperl/trunk/eg/forms/lib/header.epl
perl/embperl/trunk/eg/forms/lib/wizard.epl
perl/embperl/trunk/eg/forms/lib/wizard.pl
perl/embperl/trunk/eg/forms/pages/
perl/embperl/trunk/eg/forms/pages/loop.htm
perl/embperl/trunk/eg/forms/wizard/
perl/embperl/trunk/eg/forms/wizard/action.epl
perl/embperl/trunk/eg/forms/wizard/base.epl
perl/embperl/trunk/eg/forms/wizard/do.epl
perl/embperl/trunk/eg/forms/wizard/dsl.epl
perl/embperl/trunk/eg/forms/wizard/exportslave.epl
perl/embperl/trunk/eg/forms/wizard/finish.epl
perl/embperl/trunk/eg/forms/wizard/gateway.epl
perl/embperl/trunk/eg/forms/wizard/importslave.epl
perl/embperl/trunk/eg/forms/wizard/inetconnect.epl
perl/embperl/trunk/eg/forms/wizard/isdn.epl
perl/embperl/trunk/eg/forms/wizard/name.epl
perl/embperl/trunk/eg/forms/wizard/network.epl
perl/embperl/trunk/eg/forms/wizard/organisation.epl
perl/embperl/trunk/eg/forms/wizard/wizconfig.pl
Modified:
perl/embperl/trunk/README
Modified: perl/embperl/trunk/README
URL:
http://svn.apache.org/viewvc/perl/embperl/trunk/README?rev=724632&r1=724631&r2=724632&view=diff
==============================================================================
--- perl/embperl/trunk/README (original)
+++ perl/embperl/trunk/README Mon Dec 8 23:45:11 2008
@@ -1,6 +1,6 @@
Embperl - Building dynamic Websites with Perl
-Copyright (c) 1997-2005 Gerald Richter / ecos gmbh www.ecos.de
+Copyright (c) 1997-2009 Gerald Richter / ecos gmbh www.ecos.de
You may distribute under the terms of either the GNU General Public
License or the Artistic License, as specified in the Perl README file.
@@ -9,7 +9,6 @@
WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
-$Id$
@@ -57,6 +56,9 @@
Changes: perldoc Changes.pod
Examples: eg/README
Sourcecode encryption: crypto/README
+Documentation and example for
+Embperl::Form can be found at: eg/forms
+
All the above and further information can be found at the Embperl website
@@ -127,6 +129,8 @@
* Embperl::Inline allows to embedd Embperl code in normal Perl code
+* Embperl::Form is a sophisticated library for building HTML forms
+
COMPATIBILITY
@@ -140,7 +144,7 @@
perl5.005_01/02/03
perl5.6.1
perl5.8.x
-apache_1.3.x, apache 2.0.x
+apache_1.3.x, apache 2.0.x, apache 2.2.x
apache + mod_ssl
apache_ssl (Ben SSL)
Stronghold 2.2
Added: perl/embperl/trunk/eg/forms/Embperl/MyForm.pm
URL:
http://svn.apache.org/viewvc/perl/embperl/trunk/eg/forms/Embperl/MyForm.pm?rev=724632&view=auto
==============================================================================
--- perl/embperl/trunk/eg/forms/Embperl/MyForm.pm (added)
+++ perl/embperl/trunk/eg/forms/Embperl/MyForm.pm Mon Dec 8 23:45:11 2008
@@ -0,0 +1,194 @@
+
+package Embperl::MyForm ;
+
+use Embperl::Form ;
+
+use Embperl::Inline ;
+use base 'Embperl::Form' ;
+
+
+# ---------------------------------------------------------------------------
+
+sub form_id { 'topdiv' }
+
+
+# ---------------------------------------------------------------------------
+
+sub setup_form_obj
+ {
+ my ($self, $options, $fields) = @_ ;
+
+ my $key = ref $self ;
+
+ return if (ref $self && $self -> {id}) ;
+ return $epreq->{forms}{$key} if (exists $epreq->{forms}{$key}) ;
+
+ $options ||= {} ;
+
+
+ $self = $self -> new ($fields,
+ { formname => 'myform',
+ valign => 'top',
+ jsnamespace => 'top',
+ language => 'de',
+ %$options},
+ $self -> form_id) ;
+
+ $self -> layout ;
+ $key = ref $self ;
+
+ return $epreq->{forms}{$key} = $self ;
+ }
+
+# ---------------------------------------------------------------------------
+
+
+sub on_prepare_fdat
+
+ {
+ my ($self, $epreq) = @_ ;
+
+ $self = $self -> setup_form_obj ;
+
+ $self -> prepare_fdat ($Embperl::req);
+ }
+
+# ---------------------------------------------------------------------------
+
+sub showfields
+
+ {
+ my ($self, $fields, $options) = @_ ;
+
+ $self = $self -> setup_form_obj($options, $fields) ;
+
+ $self -> init_data ($Embperl::req) ;
+ $self -> show_controls ($Embperl::req);
+ }
+
+# ---------------------------------------------------------------------------
+#
+# get_control_packages
+#
+# returns an array ref with packges where to search for controls
+#
+
+sub get_control_packages
+ {
+ my ($self) = @_ ;
+
+ my $packages = $self ->SUPER::get_control_packages ;
+
+ unshift @$packages, 'Embperl::MyForm::Control' ;
+ return $packages ;
+ }
+
+# ---------------------------------------------------------------------------
+#
+# get_datasrc_packages
+#
+# returns an array ref with packges where to search for data source classes
+#
+
+sub get_datasrc_packages
+ {
+ my ($self) = @_ ;
+
+ my $packages = $self ->SUPER::get_datasrc_packages ;
+
+ unshift @$packages, 'Embperl::MyForm::DataSource' ;
+ return $packages ;
+ }
+
+1 ;
+
+__END__
+
+##--> the following can be used to translate form content...
+
+#------------------------------------------------------------------------------------------
+#
+# convert_label
+#
+# converts the label of a control to the text that should be outputed.
+# By default does return the text or name paramter of the control.
+# Can be overwritten to allow for example internationalization.
+#
+# in $ctrl Embperl::Form::Control object
+# $name optional: name to translate, if not given take $ctrl ->
{name}
+#
+
+sub convert_label
+ {
+ my ($self, $ctrl, $name, $text) = @_ ;
+
+ my $prefix = $ctrl -> {nameprefix} ;
+
+ return _t ($prefix . ($name || $ctrl->{basename})) if ($prefix =~ /:/) ;
+ return _t ('attr:' . $prefix . ($name || $ctrl->{basename})) ;
+ }
+
+#------------------------------------------------------------------------------------------
+#
+# convert_text
+#
+# converts the text of a control to the text that should be outputed.
+# By default does return the text or name paramter of the control.
+# Can be overwritten to allow for example internationalization.
+#
+# in $ctrl Embperl::Form::Control object
+#
+
+sub convert_text
+ {
+ my ($self, $ctrl, $value, $text) = @_ ;
+
+ my $prefix = $ctrl -> {nameprefix} ;
+ $value ||= $ctrl->{basename} ;
+
+ return _t ($value) if ($value =~ /:/) ;
+ return _t ($prefix . $value) if ($prefix =~ /:/) ;
+ return _t ('info:' . $prefix . $value) ;
+ }
+
+#------------------------------------------------------------------------------------------
+#
+# convert_options
+#
+# converts the values of a control to the text that should be outputed.
+# By default does nothing.
+# Can be overwritten to allow for example internationalization.
+#
+# in $ctrl Embperl::Form::Control object
+# $values values of the control i.e. values that are submitted
+# $options options of the control i.e. text that should be displayed
+#
+
+sub convert_options
+ {
+ my ($self, $ctrl, $values, $options) = @_ ;
+
+ my @options ;
+ my $prefix = $ctrl -> {nameprefix} ;
+ my $prefix1 = "val:$ctrl->{nameprefix}$ctrl->{basename}:" ;
+ my $prefix2 = $prefix =~ /:/?$prefix:"val:" ;
+
+ foreach my $val (@$values)
+ {
+ my $value = ref $val?$val -> [0]:$val ;
+ my $val1 = $prefix1 . $value ;
+ my $val2 = $prefix2 . $value ;
+
+ my $opt = _t ($val1) ;
+ $opt = _t ($val2) if ($opt eq $val1) ;
+
+ push @options, $opt eq $val2?"$val1 | $val2":$opt ;
+ }
+
+ return [EMAIL PROTECTED] ;
+ }
+
+
+
+1;
+
Added: perl/embperl/trunk/eg/forms/Embperl/MyForm/DataSource/languages.pm
URL:
http://svn.apache.org/viewvc/perl/embperl/trunk/eg/forms/Embperl/MyForm/DataSource/languages.pm?rev=724632&view=auto
==============================================================================
--- perl/embperl/trunk/eg/forms/Embperl/MyForm/DataSource/languages.pm (added)
+++ perl/embperl/trunk/eg/forms/Embperl/MyForm/DataSource/languages.pm Mon Dec
8 23:45:11 2008
@@ -0,0 +1,39 @@
+
+package Embperl::MyForm::DataSource::languages ;
+
+use strict ;
+
+use base 'Embperl::Form::DataSource' ;
+
+
+# ---------------------------------------------------------------------------
+#
+# get_values - returns the values and options
+#
+
+sub get_values
+
+ {
+ my ($self, $req, $ctrl) = @_ ;
+
+ my @options ;
+ my @values ;
+
+ if (!$ctrl -> {noblank})
+ {
+ push @options, '---' ;
+ push @values, '' ;
+ }
+
+ push @options, 'Deutsch','English' ;
+ push @values, 'de_DE','en_US' ;
+
+
+ return ([EMAIL PROTECTED], [EMAIL PROTECTED]) ;
+ }
+
+
+1 ;
+
+__END__
+
Added: perl/embperl/trunk/eg/forms/Embperl/MyForm/DataSource/netmask.pm
URL:
http://svn.apache.org/viewvc/perl/embperl/trunk/eg/forms/Embperl/MyForm/DataSource/netmask.pm?rev=724632&view=auto
==============================================================================
--- perl/embperl/trunk/eg/forms/Embperl/MyForm/DataSource/netmask.pm (added)
+++ perl/embperl/trunk/eg/forms/Embperl/MyForm/DataSource/netmask.pm Mon Dec 8
23:45:11 2008
@@ -0,0 +1,57 @@
+
+package Embperl::MyForm::DataSource::netmask ;
+
+use strict ;
+
+use base 'Embperl::Form::DataSource' ;
+
+
+# ---------------------------------------------------------------------------
+#
+# get_values - returns the values and options
+#
+
+sub get_values
+
+ {
+ my ($self, $req, $ctrl) = @_ ;
+
+ my $i = 33 ;
+ my @netmaskvalues;
+
+ my @netmaskoptions = map { $i-- ; push @netmaskvalues, $i ; "/$i ($_)" } (
+ '255.255.255.255',
+ '255.255.255.254',
+ '255.255.255.252',
+ '255.255.255.248',
+ '255.255.255.240',
+ '255.255.255.224',
+ '255.255.255.192',
+ '255.255.255.128',
+ '255.255.255.0',
+ '255.255.254.0',
+ '255.255.252.0',
+ '255.255.248.0',
+ '255.255.240.0',
+ '255.255.224.0',
+ '255.255.192.0',
+ '255.255.128.0',
+ '255.255.0.0',
+ '255.254.0.0',
+ '255.252.0.0',
+ '255.248.0.0',
+ '255.240.0.0',
+ '255.224.0.0',
+ '255.192.0.0',
+ '255.128.0.0',
+ '255.0.0.0',
+ ) ;
+
+ return ([EMAIL PROTECTED], [EMAIL PROTECTED]) ;
+ }
+
+
+1 ;
+
+__END__
+
Added: perl/embperl/trunk/eg/forms/README.txt
URL:
http://svn.apache.org/viewvc/perl/embperl/trunk/eg/forms/README.txt?rev=724632&view=auto
==============================================================================
--- perl/embperl/trunk/eg/forms/README.txt (added)
+++ perl/embperl/trunk/eg/forms/README.txt Mon Dec 8 23:45:11 2008
@@ -0,0 +1,274 @@
+
+Example Code for using Embperl::Forms and the wizard.pl application
+===================================================================
+
+This example assumes that Embperl is extracted under
+
+ C:\perl\msrc\embperl
+
+and Apache is installed at
+
+ C:\Programme\Apache Software Foundation\Apache2.2
+
+In this example Embperl is installed on Windows and uses Apache as CGI script.
+
+The same should also work with mod_perl and Unix. You only have to modify
+the httpd.conf accordingly.
+
+The example assumes the Perl is already install and available in your PATH.
+
+
+1.) First of all install Embperl
+
+cd C:\perl\msrc\embperl
+perl Makefile.PL
+
+-> Answer all question with 'N' (because we don't use mod_perl in this example)
+
+nmake
+nmake install
+
+
+2.) Copy CGI Script to Apache directory
+
+
+copy epocgi.pl "C:\Programme\Apache Software Foundation\Apache2.2\cgi-bin"
+copy embpcgi.pl "C:\Programme\Apache Software Foundation\Apache2.2\cgi-bin"
+
+
+
+3.) Modify the configuration file
+
+It is located at
+
+
+C:\Programme\Apache Software Foundation\Apache2.2\conf\httpd.conf
+
+At the end add the following directives:
+
+# ----------------------------
+
+AddType text/html .epl
+AddType text/html .ehtml
+
+
+Alias /forms c:/perl/msrc/embperl/eg/forms
+
+SetEnv PERL5LIB c:/perl/msrc/embperl/eg/forms
+
+SetEnv EMBPERL_OBJECT_ADDPATH c:/perl/msrc/embperl/eg/forms/lib
+SetEnv EMBPERL_SESSION_HANDLER_CLASS no
+# optAllFormData + optRawInput
+SetEnv EMBPERL_OPTIONS 0x2010
+
+
+<Location /forms/pages>
+ Order allow,deny
+ Allow from all
+
+ Action text/html /cgi-bin/embpcgi.pl
+ Options ExecCGI
+</Location>
+
+
+<Location /forms/wizard>
+ Order allow,deny
+ Allow from all
+
+ Action text/html /cgi-bin/epocgi.pl
+
+ Options ExecCGI
+ SetEnv Embperl_Appname setupwizard
+ SetEnv Embperl_Object_Base base.epl
+ SetEnv Embperl_Object_App wizard.pl
+
+</Location>
+
+# ----------------------------
+
+
+
+4.) Start Apache on the command line
+
+cd C:\Programme\Apache Software Foundation\Apache2.2
+
+bin\httpd
+
+
+-> Apache will write it's logfiles in C:\Programme\Apache Software
Foundation\Apache2.2\logs
+
+5.) Call a simple page
+
+Per default Apache listens on Port 8080 on Windows, in case you have installed
+it on a different port please change the followings URLs accordingly.
+Open the following URL in a browser:
+
+ http://localhost:8080/forms/pages/loop.htm
+
+
+This shows the environemnt of the CGI script. This is a very simple Embperl
page.
+
+
+6.) Calls the wizard
+
+Open
+
+ http://localhost:8080/forms/wizard/action.epl
+
+This will show you a wizard where you can enter setup informations. The wizard
will
+ask page by page what is necssary. It will ask different things depending on
your input.
+
+For example you can choose different ways to get to the internet and it will
ask the
+access data (can call different pages internaly) depending on your choise.
+
+If you choose "import" on the first page, you get an form that modifies itself
dynamicly
+depending on what type you chosse at the top of the page.
+
+
+
+7.) The files
+
+Here is an overview of all files underneath the eg/forms directory:
+
+
+
+- eg\forms/Embperl:
+
+Directory for modules of the Embperl::MyForm namespace which are used to
customize
+the forms and add addtional controls
+
+* MyForm.pm
+
+This defines the Embperl::MyForm Object which overwrites some methods to tell
+Embperl::Form where to located additional objects.
+
+
+- eg\forms/Embperl/MyForm/Control:
+
+Directory for Custom controls
+
+- eg\forms/Embperl/MyForm/DataSource:
+
+Directory for custom datasource objects. Datasource object are used to fill
+select or radio controls, as far as they don't have static data in the form
+definition itself. Use the datasrc => attribute to specify a datasource object.
+
+The example comes with two datasource
+objects. These two only return static data, but datasource objects can return
+any data for example from a database.
+
+* languages.pm
+* netmask.pm
+
+- eg\forms/css:
+* EmbperlForm.css
+
+Stylesheets
+
+- eg\forms/js:
+* EmbperlForm.js
+* prototype.js
+
+Necessary JavaScript code
+
+- eg\forms/lib:
+
+Generaly code
+
+* footer.epl
+
+This file is included in every page at the bottom. It is called from base.epl
+
+* header.epl
+
+This file is included in every page at the top. It is called from base.epl
+
+* wizard.epl
+
+This file contains the HTML layout for the wizard. It contains several methods
+which can be overwritten in the page objects to customize the layout.
+
+* wizard.pl
+
+Thie is the controller object of the wizard. It controls the workflow.
+
+- eg\forms/pages:
+* loop.htm
+
+Simpley Embperl page as example
+
+- eg\forms/wizard:
+
+This directory contains the actual pages of the wizard and it's configuration
+
+* base.epl
+
+This file defines the HTML layout of the page in which ths wizard is embedded.
+
+* wizconfig.pl
+
+This file contains the configuration of the wizard.
+
+The method "getpages" must return an array ref of all page files that are
+used by the wizard.
+
+The method "init" is called on every request and can be used for initialization
+purposes.
+
+Every of the remaining files in the directory define a page for the wizard:
+
+action.epl
+do.epl
+dsl.epl
+exportslave.epl
+finish.epl
+gateway.epl
+importslave.epl
+inetconnect.epl
+isdn.epl
+name.epl
+network.epl
+organisation.epl
+
+Every page contains four methods:
+
+- title:
+
+Is used to specify the title of the page
+
+- condition:
+
+The page is only displayed if the method return true, otherwise it is skipped
+
+- show:
+
+This method contains the code and HTML which is actually shown for the page,
+including the form elements.
+
+- verify:
+
+This method is called after the user has pressed Next. If it is used to verify
+the user input. If the input is ok, it should return true, othwise it should
+return 0 and set $fdat{-msg} to the error message.
+
+
+
+8.) Inclunding forms
+
+A form is defined by a fields definition which is passed to the showfields
method.
+
+A fields definition consists of a set of controls. Each control has a set of
+attributes.
+
+Available controls can be found at embperl/Embperl/Form/Control
+
+Each control contains a description of the possible attributes.
+
+Some controls (like select, selectdyn, radio, checkboxes) can get it's input
+from a datasource control (see above). In the example code most of the datasrc
+attributes are renamed to xdatasrc because the datasource object are not
+included in the example code.
+
+Each control definition can also contain a validation rule. See
Embperl::Form::Validate
+for more informaion on validation rules.
+
Added: perl/embperl/trunk/eg/forms/css/EmbperlForm.css
URL:
http://svn.apache.org/viewvc/perl/embperl/trunk/eg/forms/css/EmbperlForm.css?rev=724632&view=auto
==============================================================================
--- perl/embperl/trunk/eg/forms/css/EmbperlForm.css (added)
+++ perl/embperl/trunk/eg/forms/css/EmbperlForm.css Mon Dec 8 23:45:11 2008
@@ -0,0 +1,446 @@
+table {
+ font-family: Geneva,Arial,Helvetica;
+ font-size: 11px;
+ empty-cells:show;
+ }
+
+.cBody {
+ background: #ffffff;
+ font-family: Geneva,Arial,Helvetica;
+ font-size: 11px;
+ margin: 0px 0px 0px 0px;
+ height: 100%;
+ border-left:solid 1px;
+ /* overflow: scroll; */
+ }
+
+.cStd {background: #ffffff; color: #000000; font-family:
Geneva,Arial,Helvetica; font-size: 11px; margin: 0px 0px 0px 0px; }
+.cStdInput {background: #d4d4d4; color: #000000; font-family:
Geneva,Arial,Helvetica; font-size: 11px; margin: 0px 0px 0px 0px; }
+.cStdNoFrame {background: #ffffff; color: #000000; font-family:
Geneva,Arial,Helvetica; font-size: 11px; }
+.cStdText {background: #ffffff; color: #000000; font-family:
Geneva,Arial,Helvetica; font-size: 13px; }
+.cCenter { text-align: center ;}
+.cFooterText, .cFooterTextCenter
+ {background: #ffffff; font-family: Geneva,Arial,Helvetica;
font-size: 10px; color: #444444;}
+.cFooterTextCenter {text-align: center;}
+.cFooterTextBold {font-weight: bold; color: #000000; }
+.cObjectDN {font-size: 11px; color: #bbbbbb; }
+.cObjectInfo {font-size: 11px; color: #ff0000; font-weight: bold ;}
+.cObjectText {font-size: 11px; color: #000000; margin-right: 17px }
+.cError {font-size: 11px; color: #ff0000;}
+.cWarn {font-size: 11px; color: #ff6600;}
+.cOK {font-size: 11px; color: black;}
+
+.cHeadH1 {color: #fdd11a; font-size: 27px; font-weight: bold;
margin: 10px; padding: 0px;}
+.cHeadH2 {color: #ffffff; font-size: 17px; font-weight: bold;
margin: 10px; padding: 0px;}
+
+.cWizardDiv {margin-left: auto; width: 850px ;margin-right: auto ; margin-top:
20px ;}
+.cSetupWizardDiv {margin-left: auto; width: 730px ;margin-right: auto ;
margin-top: 20px ;}
+.cPopupDiv {margin-left: 20px; ;margin-right: 20px ; margin-top: 20px ;}
+
+
+/* --- Embperl::Form --- */
+
+.cBase {font-family: Geneva,Arial,Helvetica; font-size: 11px; }
+.cTableDiv {background: #ffffff; border: black 1px solid;
+ padding: 2px; padding-left: 4px ; width: 100% ;
+ margin: 0px }
+.cTableDivU {background: #ffffff; border: black 1px solid; border-top: 0px
;
+ padding: 2px; padding-left: 4px ; width: 100% ;
+ margin: 0px }
+.cTable {background: #ffffff; border-collapse: collapse; width: 100% ;
+ margin: 0px; padding: 0px ;}
+.cTableInput {table-layout: fixed ; }
+.cLabelGroup { width: 150px }
+.cControlGroup { width: 208px ; }
+.cTableRow1 {background: #ffffff; }
+.cTableRow {background: #ffffff; }
+.cControlBox {background: #d4d4d4; color: #000000; margin: 0px 0px 0px 0px;
+ padding: 2px 3px 2px 3px; border: 2px white solid;
vertical-align: middle ; text-align: left ; }
+.xcControlBoxWidth1 { width: 570px ; /*80% ; */}
+.xcControlBoxWidth2 { width: 214px ; /*30% ; */ }
+.cControlBoxWidth4 { width: 40px ; /* 5% ; */ }
+.cControlBoxWidth5 { width: 40px ; /* 5% ; */ }
+.cControlBoxWidth6 { width: 40px ; /* 5% ; */ }
+.cControlBoxWidth7 { width: 40px ; /* 5% ; */ }
+.cControlButtonBox { text-align: center ; border: 2px white solid; padding:
6px;}
+.cControlAddRemoveBox { text-align: center ; border: 0px ; margin-left: auto;
margin-right: auto}
+.cTransparentBox {margin: 0px 0px 0px 0px;
+ padding: 2px 3px 2px 3px; }
+.cControl {border: 1px black solid; padding-left: 2px ;
+ font-family: Geneva,Arial,Helvetica; font-size: 11px;}
+.cGridCell .cControl { border: 0px; padding: 0px ;}
+.cControlWidthInput {margin-left: 0px ; width: 98%; }
+.cControlWidthSelect {margin-left: 0px ; width: 85%; }
+.cControlWidthNumber {margin-left: 0px ; width: 50%; text-align:
right ; padding-right: 2px}
+.cControlButton {background-image: url(/images/button_bg_off.gif);
+ background-position: 0px -4px ;
+ padding: 3px; padding-left: 25px ;
+ height: 20px ;
+ font-size: 11px; white-space: nowrap ;
+ margin: 0px ;
+ cursor:pointer; width: 150px ;
+ }
+.cControlButton:hover {background-image: url(/images/button_bg_on.gif);}
+.cControlButtonDiv {background-image: url(/images/button_bg_off.gif);
+ background-position: -22px -2px ;
+ padding: 2px; padding-left: 5px ;
+
+ border: 1px black solid;
+ font-size: 11px; white-space: nowrap ;
+ margin: 0px ;
+ cursor:pointer; width: 150px ;
+ text-align: left ;
+ }
+.cControlButtonDiv img { margin-bottom: -3px ; margin-right: 3px ;}
+.cControlButtonDiv:hover {background-image:
url(/images/button_bg_on.gif);background-position: -22px -2px ;}
+.xcControlLine { border: 1px; color: black ; }
+
+.cControlAddonImg { border: 0px ; vertical-align: middle; position: relative;
top: -3px ;}
+.cControlAddonA { border: 0px ; }
+.cLabelBox {background: #fdd11a; color: #000000; text-align: right;
margin: 0px 0px 0px 0px;
+ padding: 2px 3px 2px 3px; border: 2px white solid;
vertical-align: middle ;}
+.xcLabelBoxWidth1 { width: 20% ; }
+.xcLabelBoxWidth2 { width: 20% ; }
+.xcLabelBoxWidth4 { width: 20% ; }
+
+.cTabTable {background: #ffffff; padding: 0px; margin: 0px;
+ border-collapse: collapse;
+ }
+.cTabRow {background: #ffffff; padding: 0px; margin: 0px; width: 100%;
+ border-collapse: collapse;
+ vertical-align: bottom; }
+.cTabTD {padding: 0px; margin: 0px; }
+.cTabCellOn {background: white ; padding: 0px ; margin: 0px; border: 0px ;
+ vertical-align: bottom; }
+.cTabCellOff {background: white ; padding: 0px ; margin: 0px; border: 0px ;
+ vertical-align: bottom;
+ }
+.cTabCellBlank {background: white ; padding: 0px ; margin: 0px; border: 0px ;
+ border-bottom: 1px black solid; vertical-align: bottom;
+ width: 95%;}
+
+.cTabDivOn {background-image: url(/images/bg_tab_on.gif) ;
background-repeat: repeat-x ;
+ border: black 1px solid;
+ border-bottom: none ;
+ border-left: #FFFFFF 1px solid;
+ padding: 4px;
+ font-weight: bold ;
+ font-size: 16px; white-space: nowrap ;
+ }
+
+.cTabDivOff {background-image: url(/images/bg_tab_off.gif);
background-repeat: repeat-x ;
+ border: black 1px solid; padding: 4px;
+ border-left: #FFFFFF 1px solid;
+ font-size: 11px; white-space: nowrap ;
+ }
+
+
+.cAutoCompDiv {position:relative;margin:0px;width:99%;}
+.cAutoCompInput {position:relative;}
+.cAutoCompContainer {width:300px;border:1px solid
#404040;overflow:auto;height:200px;background-color:white;z-index:9999;}
+.cAutoCompContainer ul {list-style-type:none; margin:0px;
padding:0px;width:300px;}
+.cAutoCompContainer li {list-style-type:none;
+ display:block;
+ margin:0;
+ padding:2px;
+ white-space:nowrap;
+ cursor:pointer;}
+.cAutoCompContainer li.selected {background:highlight;color: white;}
+.cAutoCompArrow {cursor:default; display: inline ; background-image:
url(/images/todown.gif) ; width: 18px; height: 18px; background-position:
center; }
+
+.cControlWidthSelectDyn {margin-left: 0px ; width: 99%; }
+
+.cGridTable {background: #ffffff; border-collapse: collapse; width:
100%;
+ border: 1px solid black; position: relative; }
+
+.cGridTable td {background: #ffffff; padding: 0px; margin: 0px;
+ border: 1px solid black; }
+
+.cGridTitle {background: #ffffff; padding: 0px; margin: 0px;
+ border-collapse: collapse; width: 100% ; }
+.cGridControlBox {background: #fdd11a; text-align: right ; margin: 0px 0px
0px 0px;
+ padding: 2px 3px 2px 3px; border: 0px; }
+.cGridLabelBox {background: #fdd11a; text-align: left; margin: 0px 0px 0px
0px;
+ padding: 2px 3px 2px 3px; border: 0px; }
+
+.cGridHeader td {background: #d4d4d4; padding: 2px; margin: 0px;
+ height: 16px ; border: 1px solid black;}
+
+.cGridTable input, .cGridTable select { font-size: 11px; border: 0px; padding:
1px; margin: 0px; width: 98%;}
+
+.cGridRowSelected, .cGridRowSelected input, .cGridRowSelected select,
.cGridRowSelected td { background-color: lightblue}
+
+
+
+
+/* ---------- The main calendar widget. DIV containing a table. -------------
*/
+
+.calendar {
+ position: relative;
+ display: none;
+ border-top: 2px solid #fff;
+ border-right: 2px solid #000;
+ border-bottom: 2px solid #000;
+ border-left: 2px solid #fff;
+ font-size: 11px;
+ color: #000;
+ cursor: default;
+ background: #c8d4d0;
+ font-family: tahoma,verdana,sans-serif;
+}
+
+.calendar table {
+ border-top: 1px solid #000;
+ border-right: 1px solid #fff;
+ border-bottom: 1px solid #fff;
+ border-left: 1px solid #000;
+ font-size: 11px;
+ color: #000;
+ cursor: default;
+ background: #c8d4d0;
+ font-family: tahoma,verdana,sans-serif;
+}
+
+/* Header part -- contains navigation buttons and day names. */
+
+.calendar .button { /* "<<", "<", ">", ">>" buttons have this class */
+ text-align: center;
+ padding: 1px;
+ border-top: 1px solid #fff;
+ border-right: 1px solid #000;
+ border-bottom: 1px solid #000;
+ border-left: 1px solid #fff;
+}
+
+.calendar .nav {
+ background: transparent url(menuarrow.gif) no-repeat 100% 100%;
+}
+
+.calendar thead .title { /* This holds the current "month, year" */
+ font-weight: bold;
+ padding: 1px;
+ border: 1px solid #000;
+ background: #788480;
+ color: #fff;
+ text-align: center;
+}
+
+.calendar thead .headrow { /* Row <TR> containing navigation buttons */
+}
+
+.calendar thead .daynames { /* Row <TR> containing the day names */
+}
+
+.calendar thead .name { /* Cells <TD> containing the day names */
+ border-bottom: 1px solid #000;
+ padding: 2px;
+ text-align: center;
+ background: #e8f4f0;
+}
+
+.calendar thead .weekend { /* How a weekend day name shows in header */
+ color: #f00;
+}
+
+.calendar thead .hilite { /* How do the buttons in header appear when hover */
+ border-top: 2px solid #fff;
+ border-right: 2px solid #000;
+ border-bottom: 2px solid #000;
+ border-left: 2px solid #fff;
+ padding: 0px;
+ background-color: #d8e4e0;
+}
+
+.calendar thead .active { /* Active (pressed) buttons in header */
+ padding: 2px 0px 0px 2px;
+ border-top: 1px solid #000;
+ border-right: 1px solid #fff;
+ border-bottom: 1px solid #fff;
+ border-left: 1px solid #000;
+ background-color: #b8c4c0;
+}
+
+/* The body part -- contains all the days in month. */
+
+.calendar tbody .day { /* Cells <TD> containing month days dates */
+ width: 2em;
+ text-align: right;
+ padding: 2px 4px 2px 2px;
+}
+.calendar tbody .day.othermonth {
+ font-size: 80%;
+ color: #aaa;
+}
+.calendar tbody .day.othermonth.oweekend {
+ color: #faa;
+}
+
+.calendar table .wn {
+ padding: 2px 3px 2px 2px;
+ border-right: 1px solid #000;
+ background: #e8f4f0;
+}
+
+.calendar tbody .rowhilite td {
+ background: #d8e4e0;
+}
+
+.calendar tbody .rowhilite td.wn {
+ background: #c8d4d0;
+}
+
+.calendar tbody td.hilite { /* Hovered cells <TD> */
+ padding: 1px 3px 1px 1px;
+ border-top: 1px solid #fff;
+ border-right: 1px solid #000;
+ border-bottom: 1px solid #000;
+ border-left: 1px solid #fff;
+}
+
+.calendar tbody td.active { /* Active (pressed) cells <TD> */
+ padding: 2px 2px 0px 2px;
+ border-top: 1px solid #000;
+ border-right: 1px solid #fff;
+ border-bottom: 1px solid #fff;
+ border-left: 1px solid #000;
+}
+
+.calendar tbody td.selected { /* Cell showing selected date */
+ font-weight: bold;
+ border-top: 1px solid #000;
+ border-right: 1px solid #fff;
+ border-bottom: 1px solid #fff;
+ border-left: 1px solid #000;
+ padding: 2px 2px 0px 2px;
+ background: #d8e4e0;
+}
+
+.calendar tbody td.weekend { /* Cells showing weekend days */
+ color: #f00;
+}
+
+.calendar tbody td.today { /* Cell showing today date */
+ font-weight: bold;
+ color: #00f;
+}
+
+.calendar tbody .disabled { color: #999; }
+
+.calendar tbody .emptycell { /* Empty cells (the best is to hide them) */
+ visibility: hidden;
+}
+
+.calendar tbody .emptyrow { /* Empty row (some months need less than 6 rows) */
+ display: none;
+}
+
+/* The footer part -- status bar and "Close" button */
+
+.calendar tfoot .footrow { /* The <TR> in footer (only one right now) */
+}
+
+.calendar tfoot .ttip { /* Tooltip (status bar) cell <TD> */
+ background: #e8f4f0;
+ padding: 1px;
+ border: 1px solid #000;
+ background: #788480;
+ color: #fff;
+ text-align: center;
+}
+
+.calendar tfoot .hilite { /* Hover style for buttons in footer */
+ border-top: 1px solid #fff;
+ border-right: 1px solid #000;
+ border-bottom: 1px solid #000;
+ border-left: 1px solid #fff;
+ padding: 1px;
+ background: #d8e4e0;
+}
+
+.calendar tfoot .active { /* Active (pressed) style for buttons in footer */
+ padding: 2px 0px 0px 2px;
+ border-top: 1px solid #000;
+ border-right: 1px solid #fff;
+ border-bottom: 1px solid #fff;
+ border-left: 1px solid #000;
+}
+
+/* Combo boxes (menus that display months/years for direct selection) */
+
+.calendar .combo {
+ position: absolute;
+ display: none;
+ width: 4em;
+ top: 0px;
+ left: 0px;
+ cursor: default;
+ border-top: 1px solid #fff;
+ border-right: 1px solid #000;
+ border-bottom: 1px solid #000;
+ border-left: 1px solid #fff;
+ background: #d8e4e0;
+ font-size: 90%;
+ padding: 1px;
+ z-index: 100;
+}
+
+.calendar .combo .label,
+.calendar .combo .label-IEfix {
+ text-align: center;
+ padding: 1px;
+}
+
+.calendar .combo .label-IEfix {
+ width: 4em;
+}
+
+.calendar .combo .active {
+ background: #c8d4d0;
+ padding: 0px;
+ border-top: 1px solid #000;
+ border-right: 1px solid #fff;
+ border-bottom: 1px solid #fff;
+ border-left: 1px solid #000;
+}
+
+.calendar .combo .hilite {
+ background: #048;
+ color: #aef;
+}
+
+.calendar td.time {
+ border-top: 1px solid #000;
+ padding: 1px 0px;
+ text-align: center;
+ background-color: #e8f0f4;
+}
+
+.calendar td.time .hour,
+.calendar td.time .minute,
+.calendar td.time .ampm {
+ padding: 0px 3px 0px 4px;
+ border: 1px solid #889;
+ font-weight: bold;
+ background-color: #fff;
+}
+
+.calendar td.time .ampm {
+ text-align: center;
+}
+
+.calendar td.time .colon {
+ padding: 0px 2px 0px 3px;
+ font-weight: bold;
+}
+
+.calendar td.time span.hilite {
+ border-color: #000;
+ background-color: #667;
+ color: #fff;
+}
+
+.calendar td.time span.active {
+ border-color: #f00;
+ background-color: #000;
+ color: #0f0;
+}
Added: perl/embperl/trunk/eg/forms/js/EmbperlForm.js
URL:
http://svn.apache.org/viewvc/perl/embperl/trunk/eg/forms/js/EmbperlForm.js?rev=724632&view=auto
==============================================================================
--- perl/embperl/trunk/eg/forms/js/EmbperlForm.js (added)
+++ perl/embperl/trunk/eg/forms/js/EmbperlForm.js Mon Dec 8 23:45:11 2008
@@ -0,0 +1,454 @@
+function set_grid_display(doc, elm, display)
+ {
+ var elements = elm.getElementsByTagName('table');
+ for (var i = 0; i < elements.length ; i++)
+ {
+ if(elements[i].className.search('cGridTable') != -1)
+ {
+ elements[i].style.display = display;
+ }
+ }
+ }
+
+function set_display(doc, value,display)
+ {
+ var elm ;
+ if (elm = doc.getElementById(value))
+ {
+ elm.style.display = display ;
+ set_grid_display(doc, elm,display);
+ }
+ j = 10 ;
+ dummy= value + j;
+ while (elm = doc.getElementById(dummy) )
+ {
+ elm.style.display = display ;
+ j++ ;
+ dummy= value + j;
+ }
+ }
+
+function set_class(doc, name, classval)
+ {
+ var obj = doc.getElementById(name) ;
+ if (obj)
+ obj.className = classval ;
+ }
+
+function show_id_setobj(doc, value, name)
+ {
+ var obj = doc.getElementById(name) ;
+ if (obj)
+ obj.value = value ;
+
+ set_display(doc, value, "") ;
+ }
+
+
+function tab_selected(doc, value, name)
+ {
+ var obj = doc.getElementById(name) ;
+
+ if (obj && obj.value)
+ {
+ set_display(doc, obj.value, "none") ;
+ set_class(doc, '__tabs_' + obj.value, 'cTabDivOff') ;
+ }
+
+ set_class(doc, '__tabs_' + value, 'cTabDivOn') ;
+ show_id_setobj(doc, value, name) ;
+ }
+
+function show_selected(doc, obj)
+ {
+ var i ;
+ var x = obj.selectedIndex ;
+ var name = obj.name ;
+ var elm ;
+ var baseid = name + '-' ;
+ for (i=0;i<obj.options.length;i++)
+ {
+ if (obj.options[i].value != '')
+ {
+ elm = doc.getElementById(baseid + (i + 1)) ;
+ if (elm)
+ {
+ if (i == x)
+ {
+ elm.style.display = "" ;
+ }
+ else
+ {
+ elm.style.display = "none" ;
+ }
+ }
+ j = 10 ;
+ dummy = baseid + i + '-' + j;
+ while (elm = doc.getElementById(dummy) )
+ {
+ if (i == x)
+ {
+ elm.style.display = "" ;
+ }
+ else
+ {
+ elm.style.display = "none" ;
+ }
+ j++ ;
+ dummy = baseid + i + '-' + j;
+ }
+ }
+ }
+ }
+
+
+function show_checked(doc, obj)
+ {
+ var i ;
+ var x = obj.checked?0:1 ;
+ var name = obj.name ;
+ var elm ;
+ var baseid = name + '-' ;
+ for (i=0;i<2;i++)
+ {
+ elm = doc.getElementById(baseid + i) ;
+ if (elm)
+ {
+ if (i == x)
+ {
+ elm.style.display = "" ;
+ }
+ else
+ {
+ elm.style.display = "none" ;
+ }
+ }
+ j = 10 ;
+ dummy = baseid + i + '-' + j;
+ while (elm = doc.getElementById(dummy) )
+ {
+ if (i == x)
+ {
+ elm.style.display = "" ;
+ }
+ else
+ {
+ elm.style.display = "none" ;
+ }
+ j++ ;
+ dummy = baseid + i + '-' + j;
+ }
+ }
+ }
+
+function show_radio_checked(doc, obj,x,max)
+ {
+ var i ;
+ var name = obj.name ;
+ var elm ;
+ var baseid = name + '-' ;
+
+ for (i=0;i<=max;i++)
+ {
+ elm = doc.getElementById(baseid + i) ;
+ if (elm)
+ {
+ if (i == x)
+ {
+ elm.style.display = "" ;
+ }
+ else
+ {
+ elm.style.display = "none" ;
+ }
+ }
+ j = 10 ;
+ dummy = baseid + i + '-' + j;
+ while (elm = doc.getElementById(dummy) )
+ {
+ if (i == x)
+ {
+ elm.style.display = "" ;
+ }
+ else
+ {
+ elm.style.display = "none" ;
+ }
+ j++ ;
+ dummy = baseid + i + '-' + j;
+ }
+ }
+ }
+function submitvalue (form, name, value)
+ {
+ var e=form.ownerDocument.createElement('input');
+ e.type='hidden';
+ e.name=name;
+ e.value=value;
+ form.appendChild(e);
+ form.submit()
+ }
+
+function addremoveInitOptions (doc, src, dest, send, removesource)
+ {
+ var i ;
+ var j ;
+ var found = 0 ;
+ var val ;
+ var vals = send.value.split("\t") ;
+ for (i = 0; i < vals.length; i++)
+ {
+ val = vals[i] ;
+ found = 0 ;
+ for (j = 0; j < src.length; j++)
+ {
+ if (src.options[j].value == val)
+ {
+ found = 1 ;
+ break ;
+ }
+ }
+ if (found)
+ {
+ var newopt = doc.createElement('OPTION') ;
+ var oldopt = src.options[j] ;
+ newopt.text = oldopt.text ;
+ newopt.value = oldopt.value ;
+ dest.options.add(newopt) ;
+ }
+ }
+ if (removesource)
+ {
+ for (i = 0; i < src.length; i++)
+ {
+ val = src.options[i].value ;
+ for (j = 0; j < vals.length; j++)
+ {
+ if (vals[j] == val)
+ {
+ src.options[i] = null ;
+ i-- ;
+ break ;
+ }
+ }
+ }
+ }
+ }
+
+function addremoveBuildOptions (dest, send)
+ {
+ var i ;
+ var val = '' ;
+ for (i = 0; i < dest.length; i++)
+ {
+ val += dest.options[i].value ;
+ if (i < dest.length - 1)
+ val += "\t" ;
+ }
+ send.value=val ;
+ }
+
+function addremoveAddOption (doc, src, dest, send, removesource)
+ {
+ if (src.selectedIndex >= 0)
+ {
+ var newopt = doc.createElement('OPTION') ;
+ var oldopt = src.options[src.selectedIndex] ;
+ newopt.text = oldopt.text ;
+ newopt.value = oldopt.value ;
+ dest.options.add(newopt) ;
+ if (removesource)
+ src.options[src.selectedIndex] = null ;
+ addremoveBuildOptions (dest, send) ;
+ }
+ else
+ alert ("Bitte einen Eintrag zum Hinzufügen auswählen") ;
+
+ }
+
+function addremoveRemoveOption (doc, src, dest, send, removesource)
+ {
+ if (dest.selectedIndex >= 0)
+ {
+ if (removesource)
+ {
+ var newopt = doc.createElement('OPTION') ;
+ var oldopt = dest.options[dest.selectedIndex] ;
+ newopt.text = oldopt.text ;
+ newopt.value = oldopt.value ;
+ src.options.add(newopt) ;
+ }
+ //dest.options.remove(dest.selectedIndex) ;
+ dest.options[dest.selectedIndex] = null ;
+ addremoveBuildOptions (dest, send) ;
+ }
+ else
+ alert ("Bitte einen Eintrag zum Entfernen auswählen") ;
+
+ }
+
+//
-----------------------------------------------------------------------------
+
+
+
+var Grid = Class.create() ;
+
+Grid.prototype = {
+
+initialize: function (tableelement, rowelement, maxelement)
+ {
+ this.rowelement = rowelement ;
+ this.maxelement = maxelement ;
+ this.tableelement = tableelement ;
+ Event.observe(this.tableelement, "click",
this.onClick.bindAsEventListener(this));
+ Event.observe(this.tableelement, "focus",
this.onClick.bindAsEventListener(this));
+ Event.observe(this.tableelement, "keyup",
this.onClick.bindAsEventListener(this));
+
+ rows = this.tableelement.getElementsByTagName('tr');
+ lastrow = rows[rows.length - 1] ;
+ newid = this.tableelement.id ;
+ newid = newid + '-row-' ;
+ lastid = lastrow.id ;
+ idlength = newid.length ;
+ this.lastnum = parseInt (lastid.substr(idlength)) ;
+ if (isNaN(this.lastnum))
+ this.lastnum = -1 ;
+ },
+
+
+addRow: function ()
+ {
+ var rows = this.tableelement.getElementsByTagName('tr');
+ var lastrow = rows[rows.length - 1] ;
+
+ this.lastnum = this.lastnum + 1 ;
+ var inserttext = this.rowelement.innerHTML ;
+ var newtext = inserttext.replace (/%row%/gi, this.lastnum) ;
+ newtext = newtext.replace (/<tbody>/gi, '') ;
+ newtext = newtext.replace (/<\/tbody>/gi, '') ;
+ newtext = newtext.replace (/<x-script/gi, '<script') ;
+ newtext = newtext.replace (/<\/x-script/gi, '</script') ;
+ new Insertion.After (lastrow, newtext) ;
+ this.maxelement.value = this.lastnum + 1 ;
+ },
+
+focusRow: function ()
+ {
+ var next = this.currRow ;
+ if (next && next.className == 'cGridRow')
+ {
+ next.className='cGridRowSelected' ;
+ while (next && (next.tagName != 'INPUT' || next.tagName != 'SELECT'))
+ {
+ next = next.firstChild ;
+ }
+ if (next)
+ next.focus() ;
+ }
+ },
+
+delRow: function (row)
+ {
+ if (row != undefined)
+ this.currRow = row ;
+ if (this.currRow)
+ {
+ var next = this.currRow.nextSibling ;
+ var p = this.currRow.parentNode ;
+ p.removeChild(this.currRow) ;
+ this.currRow = next ;
+ this.focusRow () ;
+ }
+ },
+
+upRow: function (row)
+ {
+ if (row != undefined)
+ this.currRow = row ;
+ if (this.currRow)
+ {
+ var prev = $(this.currRow).previous () ;
+ if (prev && prev.className == 'cGridRow')
+ {
+ var currorder = this.currRow.getElementsByTagName('input');
+ var prevorder = prev.getElementsByTagName('input');
+ var n = currorder[0].value ;
+ currorder[0].value = prevorder[0].value ;
+ prevorder[0].value = n ;
+
+ var p = this.currRow.parentNode ;
+ var currdata = p.removeChild(this.currRow) ;
+ this.currRow = p.insertBefore(currdata, prev) ;
+
+ this.focusRow () ;
+ }
+ }
+ },
+
+downRow: function (row)
+ {
+ if (row != undefined)
+ this.currRow = row ;
+ if (this.currRow)
+ {
+ var next = $(this.currRow).next () ;
+ if (next && next.className == 'cGridRow')
+ {
+ var currorder = this.currRow.getElementsByTagName('input');
+ var nextorder = next.getElementsByTagName('input');
+ var n = currorder[0].value ;
+ currorder[0].value = nextorder[0].value ;
+ nextorder[0].value = n ;
+
+ var next2 = next.next () ;
+ var p = this.currRow.parentNode ;
+ var currdata = p.removeChild(this.currRow) ;
+ this.currRow = p.insertBefore(currdata, next2) ;
+
+ this.focusRow () ;
+ }
+ }
+ },
+
+
+onClick: function (e)
+ {
+ var elem = e.target?e.target:e.srcElement ;
+ if (e.type == 'keyup' && ((e.which && e.which == e.DOM_VK_ADD) ||
e.keyCode == 107) && e.altKey)
+ {
+ this.addRow () ;
+ e.cancelBubble = true ;
+ return false ;
+ }
+
+ var p = elem ;
+ while (p && p.tagName != 'TR')
+ {
+ p = p.parentNode ;
+ }
+ if (p)
+ {
+ if (this.currRow)
+ this.currRow.className='cGridRow' ;
+
+ if (p.className == 'cGridRow')
+ {
+ p.className='cGridRowSelected' ;
+ this.currRow=p ;
+ }
+ else
+ {
+ this.currRow=null ;
+ }
+ if (this.currRow && e.type == 'keyup' && ((e.which && e.which ==
e.DOM_VK_SUBTRACT) || e.keyCode == 109) && e.altKey)
+ {
+ this.delRow (this.currRow) ;
+ e.cancelBubble = true ;
+ return false ;
+ }
+ }
+ //alert ('t='+elem.tagName +' p='+ p.id+' c='+p.className) ;
+ }
+
+ }
+
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]