-<!-- $Id: part_pkg.cgi,v 1.5 2001-10-15 11:39:29 ivan Exp $ -->
-
-<%
-
-if ( $cgi->param('clone') && $cgi->param('clone') =~ /^(\d+)$/ ) {
- $cgi->param('clone', $1);
-} else {
- $cgi->param('clone', '');
-}
-if ( $cgi->param('pkgnum') && $cgi->param('pkgnum') =~ /^(\d+)$/ ) {
- $cgi->param('pkgnum', $1);
-} else {
- $cgi->param('pkgnum', '');
-}
-
-my ($query) = $cgi->keywords;
-my $action = '';
-my $part_pkg = '';
-if ( $cgi->param('error') ) {
- $part_pkg = new FS::part_pkg ( {
- map { $_, scalar($cgi->param($_)) } fields('part_pkg')
- } );
-}
-if ( $cgi->param('clone') ) {
- $action='Custom Pricing';
- my $old_part_pkg =
- qsearchs('part_pkg', { 'pkgpart' => $cgi->param('clone') } );
- $part_pkg ||= $old_part_pkg->clone;
-} elsif ( $query && $query =~ /^(\d+)$/ ) {
- $part_pkg ||= qsearchs('part_pkg',{'pkgpart'=>$1});
-} else {
- $part_pkg ||= new FS::part_pkg {};
- $part_pkg->plan('flat');
-}
-unless ( $part_pkg->plan ) { #backwards-compat
- $part_pkg->plan('flat');
- $part_pkg->plandata("setup=". $part_pkg->setup. "\n".
- "recur=". $part_pkg->recur. "\n");
-}
-$action ||= $part_pkg->pkgpart ? 'Edit' : 'Add';
-my $hashref = $part_pkg->hashref;
+<% include( 'elements/edit.html',
+ 'post_url' => popurl(1).'process/part_pkg.cgi',
+ 'name' => "Package definition",
+ 'table' => 'part_pkg',
+ #'viewall_dir' => 'browse',
+ 'viewall_url' => $p.'browse/part_pkg.cgi',
+ 'html_init' => include('/elements/init_overlib.html').
+ $freq_changed,
+ 'html_bottom' => $html_bottom,
+ 'new_hashref_callback' => $new_hashref_callback,
+ 'new_object_callback' => $new_object_callback,
+ 'new_callback' => $new_callback,
+ 'edit_callback' => $edit_callback,
+ 'error_callback' => $error_callback,
+
+ 'labels' => {
+ 'pkgpart' => 'Package Definition',
+ 'pkg' => 'Package (customer-visible)',
+ 'comment' => 'Comment (customer-hidden)',
+ 'classnum' => 'Package class',
+ 'promo_code' => 'Promotional code',
+ 'freq' => 'Recurring fee frequency',
+ 'setuptax' => 'Setup fee tax exempt',
+ 'recurtax' => 'Recurring fee tax exempt',
+ 'taxclass' => 'Tax class',
+ 'plan' => 'Price plan',
+ 'disabled' => 'Disable new orders',
+ 'pay_weight' => 'Payment weight',
+ 'credit_weight' => 'Credit weight',
+ 'agentnum' => '',
+ 'setup_fee' => 'Setup fee',
+ 'recur_fee' => 'Recurring fee',
+ 'bill_dst_pkgpart' => 'Include line item(s) from package',
+ 'svc_dst_pkgpart' => 'Include services of package',
+ },
+
+ 'fields' => [
+ { field=>'clone', type=>'hidden',
+ curr_value_callback =>
+ sub { shift->param('clone') },
+ },
+ { field=>'pkgnum', type=>'hidden',
+ curr_value_callback =>
+ sub { shift->param('pkgnum') },
+ },
+
+ { type => 'columnstart' },
+
+ {field=>'pkg', type=>'text', size=>40 }, #32
+ {field=>'comment', type=>'text', size=>40 }, #32
+ {field=>'classnum', type=>'select-pkg_class' },
+ {field=>'disabled', type=>'checkbox', value=>'Y'},
+
+ { type => 'tablebreak-tr-title',
+ value => 'Pricing', #better name?
+ },
+ { field => 'plan',
+ type => 'selectlayers-select',
+ options => [ keys %plan_labels ],
+ labels => \%plan_labels,
+ },
+ { field => 'setup_fee',
+ type => 'money',
+ },
+ { field => 'freq',
+ type => 'part_pkg_freq',
+ onchange => 'freq_changed',
+ },
+ { field => 'recur_fee',
+ type => 'money',
+ disabled => sub { $recur_disabled },
+ },
+
+ #price plan
+ #setup fee
+ #recurring frequency
+ #recurring fee (auto-disable)
+
+ { type => 'columnnext' },
+
+ {type=>'justtitle', value=>'Taxation' },
+ {field=>'setuptax', type=>'checkbox', value=>'Y'},
+ {field=>'recurtax', type=>'checkbox', value=>'Y'},
+ {field=>'taxclass', type=>'select-taxclass' },
+ {field=>'taxproductnum', type=>'select-taxproduct' },
+
+ { type => 'tablebreak-tr-title',
+ value => 'Promotions', #better name?
+ },
+ { field=>'promo_code', type=>'text', size=>15 },
+
+ { type => 'tablebreak-tr-title',
+ value => 'Line-item revenue recogition', #better name?
+ },
+ { field=>'pay_weight', type=>'text', size=>6 },
+ { field=>'credit_weight', type=>'text', size=>6 },
+
+ { type => 'columnnext' },
+
+ { field=>'agent_type',
+ type => 'select-agent_types',
+ curr_value_callback => sub {
+ my($cgi, $object, $field) = @_;
+ #in the other callbacks..? hmm.
+ \@agent_type;
+ },
+ },
+
+ { type => 'columnend' },
+
+ { 'type' => 'tablebreak-tr-title',
+ 'value' => 'Pricing add-ons',
+ },
+ { 'field' => 'bill_dst_pkgpart',
+ 'type' => 'select-part_pkg',
+ 'm2_label' => 'Include line item(s) from package',
+ 'm2m_method' => 'bill_part_pkg_link',
+ 'm2m_dstcol' => 'dst_pkgpart',
+ 'm2_error_callback' =>
+ &{$m2_error_callback_maker}('bill'),
+ },
+
+ { type => 'tablebreak-tr-title',
+ value => 'Services',
+ },
+ { type => 'pkg_svc', },
+
+ { 'field' => 'svc_dst_pkgpart',
+ 'label' => 'Also include services from package: ',
+ 'type' => 'select-part_pkg',
+ 'm2_label' => 'Include services of package: ',
+ 'm2m_method' => 'svc_part_pkg_link',
+ 'm2m_dstcol' => 'dst_pkgpart',
+ 'm2_error_callback' =>
+ &{$m2_error_callback_maker}('svc'),
+ },
+
+ { type => 'tablebreak-tr-title',
+ value => 'Price plan options',
+ },
+ ],
+
+ )
%>
+<%init>
+
+my $curuser = $FS::CurrentUser::CurrentUser;
+
+die "access denied"
+ unless $curuser->access_right('Edit package definitions')
+ || $curuser->access_right('Edit global package definitions')
+ || ( $cgi->param('pkgnum') && $curuser->access_right('Customize customer package') );
-<SCRIPT>
-function visualize(what) {
- if (document.getElementById) {
- document.getElementById('d<%= $part_pkg->plan %>').style.visibility = "visible";
+#XXX
+# - tr-part_pkg_freq: month_increments_only (from price plans)
+# - test cloning
+# - test errors cloning
+# - test custom pricing
+# - move the selectlayer divs away from lame layer_callback
+
+#my ($query) = $cgi->keywords;
+#
+#my $part_pkg = '';
+
+my @agent_type = ();
+my $tax_override;
+
+my $clone_part_pkg = '';
+
+my %options = ();
+my $recur_disabled = 1;
+my $error_callback = sub {
+ my($cgi, $object, $fields, $opt ) = @_;
+ (@agent_type) = $cgi->param('agent_type');
+ $tax_override = $cgi->param('tax_override');
+ $opt->{action} = 'Custom' if $cgi->param('clone');
+ $clone_part_pkg= qsearchs('part_pkg', { 'pkgpart' => $cgi->param('clone') } );
+
+ $recur_disabled = $cgi->param('freq') ? 0 : 1;
+
+ #some false laziness w/process
+ $cgi->param('plan') =~ /^(\w+)$/ or die 'unparsable plan';
+ my $plan = $1;
+ my $options = $cgi->param($plan."__OPTIONS");
+ my @options = split(',', $options);
+ %options =
+ map { my $optionname = $_;
+ my $param = $plan."__$optionname";
+ my $value = join(', ', $cgi->param($param));
+ ( $optionname => $value );
+ }
+ @options;
+
+ #$cgi->param($_, $options{$_}) foreach (qw( setup_fee recur_fee ));
+ $object->set($_ => scalar($cgi->param($_)) )
+ foreach (qw( setup_fee recur_fee ));
+
+};
+
+my $new_hashref_callback = sub { { 'plan' => 'flat' }; };
+
+my $new_object_callback = sub {
+ my( $cgi, $hashref, $fields, $opt ) = @_;
+
+ my $part_pkg = '';
+ if ( $cgi->param('clone') ) {
+ $opt->{action} = 'Custom';
+ $clone_part_pkg = qsearchs('part_pkg', { pkgpart=>$cgi->param('clone') } );
+ $part_pkg = $clone_part_pkg->clone;
+ $part_pkg->disabled('Y');
+ %options = $clone_part_pkg->options;
} else {
- document.l<%= $part_pkg->plan %>.visibility = "visible";
+ $part_pkg = FS::part_pkg->new( $hashref );
}
-}
-</SCRIPT>
-<%
+ $part_pkg->set($_ => '0')
+ foreach (qw( setup_fee recur_fee ));
-print header("$action Package Definition", menubar(
- 'Main Menu' => popurl(2),
- 'View all packages' => popurl(2). 'browse/part_pkg.cgi',
-), ' onLoad="visualize()"');
+ $part_pkg;
-print qq!<FONT SIZE="+1" COLOR="#ff0000">Error: !, $cgi->param('error'),
- "</FONT>"
- if $cgi->param('error');
+};
-#print '<FORM ACTION="', popurl(1), 'process/part_pkg.cgi" METHOD=POST>';
-print '<FORM NAME="dummy">';
+my $edit_callback = sub {
+ my( $cgi, $object, $fields ) = @_;
-#if ( $cgi->param('clone') ) {
-# print qq!<INPUT TYPE="hidden" NAME="clone" VALUE="!, $cgi->param('clone'), qq!">!;
-#}
-#if ( $cgi->param('pkgnum') ) {
-# print qq!<INPUT TYPE="hidden" NAME="pkgnum" VALUE="!, $cgi->param('pkgnum'), qq!">!;
-#}
-#
-#print qq!<INPUT TYPE="hidden" NAME="pkgpart" VALUE="$hashref->{pkgpart}">!,
-print "Package Part #", $hashref->{pkgpart} ? $hashref->{pkgpart} : "(NEW)";
+ $recur_disabled = $object->freq ? 0 : 1;
-print <<END;
-<PRE>
-Package (customer-visable) <INPUT TYPE="text" NAME="pkg" SIZE=32 VALUE="$hashref->{pkg}">
-Comment (customer-hidden) <INPUT TYPE="text" NAME="comment" SIZE=32 VALUE="$hashref->{comment}">
+ (@agent_type) = map {$_->typenum} qsearch('type_pkgs',{'pkgpart'=>$1});
+ $tax_override =
+ join (",", map {$_->taxclassnum}
+ qsearch( 'part_pkg_taxoverride', {'pkgpart' => $1} )
+ );
-Frequency (months) of recurring fee <INPUT TYPE="text" NAME="freq" VALUE="$hashref->{freq}">
+# join (",", map {$_->taxclassnum}
+# $part_pkg->part_pkg_taxrate( 'cch', $conf->config('defaultloc')
+# );
+# unless $tax_override;
-</PRE>
+ %options = $object->options;
-END
+ $object->set($_ => $object->option($_))
+ foreach (qw( setup_fee recur_fee ));
-unless ( $cgi->param('clone') ) {
- print <<END;
-Enter the quantity of each service this package includes.<BR><BR>
-<TABLE BORDER><TR><TH><FONT SIZE=-1>Quan.</FONT></TH><TH>Service</TH>
- <TH><FONT SIZE=-1>Quan.</FONT></TH><TH>Service</TH></TR>
-END
-}
-
-my $count = 0;
-my @fixups = ();
-foreach my $part_svc ( ( qsearch( 'part_svc', {} ) ) ) {
- my $svcpart = $part_svc->svcpart;
- my $pkg_svc = qsearchs( 'pkg_svc', {
- 'pkgpart' => $cgi->param('clone') || $part_pkg->pkgpart,
- 'svcpart' => $svcpart,
- } ) || new FS::pkg_svc ( {
- 'pkgpart' => $cgi->param('clone') || $part_pkg->pkgpart,
- 'svcpart' => $svcpart,
- 'quantity' => 0,
- });
- #? #next unless $pkg_svc;
-
- push @fixups, "pkg_svc$svcpart";
-
- unless ( defined ($cgi->param('clone')) && $cgi->param('clone') ) {
- print '<TR>' if $count == 0 ;
- print qq!<TD><INPUT TYPE="text" NAME="pkg_svc$svcpart" SIZE=3 VALUE="!,
- $cgi->param("pkg_svc$svcpart") || $pkg_svc->quantity || 0,
- qq!"></TD><TD><A HREF="part_svc.cgi?!,$part_svc->svcpart,
- qq!">!, $part_svc->getfield('svc'), "</A></TD>";
- $count++;
- if ($count == 2)
- {
- print '</TR>';
- $count = 0;
- }
- } else {
- print qq!<INPUT TYPE="hidden" NAME="pkg_svc$svcpart" VALUE="!,
- $cgi->param("pkg_svc$svcpart") || $pkg_svc->quantity || 0, qq!">\n!;
- }
-}
-
-unless ( $cgi->param('clone') ) {
- print qq!</TR>! if ($count != 0) ;
- print "</TABLE>";
-}
-
-# prolly should be in database
-my %plans = (
-
- 'flat' => {
- 'name' => 'Flat rate',
- 'fields' => {
- 'setup_fee' => { 'name' => 'Setup fee for this package',
- 'default' => 0,
- },
- 'recur_fee' => { 'name' => 'Recurring fee for this package',
- 'default' => 0,
- },
- },
- 'setup' => 'what.setup_fee.value',
- 'recur' => 'what.recur_fee.value',
- },
-
- 'flat_comission' => {
- 'name' => 'Flat rate with recurring referral comission as credit',
- 'fields' => {
- 'setup_fee' => { 'name' => 'Setup fee for this package',
- 'default' => 0,
- },
- 'recur_fee' => { 'name' => 'Recurring fee for this package',
- 'default' => 0,
- },
- 'comission_amount' => { 'name' => 'Comission amount',
- 'default' => 0,
- },
- 'comission_depth' => { 'name' => 'Number of layers',
- 'default' => 1,
- },
- },
- 'setup' => 'what.setup_fee.value',
- 'recur' => '\'my $error = $cust_pkg->cust_main->credit( \' + what.comission_amount.value + \' * scalar($cust_pkg->cust_main->referral_cust_pkg(\' + what.comission_depth.value+ \')), "commission" ); die $error if $error; \' + what.recur_fee.value + \';\'',
- },
+};
-);
+my $new_callback = sub {
+ my( $cgi, $object, $fields ) = @_;
-%>
-
-<SCRIPT>
-var layer = null;
+ my $conf = new FS::Conf;
+ if ( $conf->exists('agent_defaultpkg') ) {
+ #my @all_agent_types = map {$_->typenum} qsearch('agent_type',{});
+ @agent_type = map {$_->typenum} qsearch('agent_type',{});
+ }
-function changed(what) {
- layer = what.options[what.selectedIndex].value;
-<% foreach my $layer ( keys %plans ) { %>
- if (layer == "<%= $layer %>" ) {
- <% foreach my $not ( grep { $_ ne $layer } keys %plans ) { %>
- if (document.getElementById) {
- document.getElementById('d<%= $not %>').style.visibility = "hidden";
+};
+
+my $m2_error_callback_maker = sub {
+ my $link_type = shift; #yay closures
+ return sub {
+ my( $cgi, $object ) = @_;
+ map {
+ new FS::part_pkg_link {
+ 'link_type' => $link_type,
+ 'src_pkgpart' => $object->pkgpart,
+ 'dst_pkgpart' => $_,
+ };
+ }
+ grep $_,
+ map $cgi->param($_),
+ grep /^${link_type}_dst_pkgpart(\d+)$/, $cgi->param;
+ };
+};
+
+my $freq_changed = <<'END';
+ <SCRIPT TYPE="text/javascript">
+
+ function freq_changed(what) {
+ var freq = what.options[what.selectedIndex].value;
+
+ if ( freq == '0' ) {
+ what.form.recur_fee.disabled = true;
+ what.form.recur_fee.style.backgroundColor = '#dddddd';
} else {
- document.l<%= $not %>.visibility = "hidden";
+ what.form.recur_fee.disabled = false;
+ what.form.recur_fee.style.backgroundColor = '#ffffff';
}
- <% } %>
- if (document.getElementById) {
- document.getElementById('d<%= $layer %>').style.visibility = "visible";
- } else {
- document.l<%= $layer %>.visibility = "visible";
- }
- }
-<% } %>
-}
-
-</SCRIPT>
-<BR>
-Price plan <SELECT NAME="plan" SIZE=1 onChange="changed(this);">
-<OPTION>
-<% foreach my $layer (keys %plans ) { %>
-<OPTION VALUE="<%= $layer %>"<%= ' SELECTED'x($layer eq $part_pkg->plan) %>><%= $plans{$layer}->{'name'} %>
-<% } %>
-</SELECT></FORM>
-
-<SCRIPT>
-function fchanged(what) {
- fixup(what.form);
-}
-
-function fixup(what) {
-<% foreach my $f ( qw( pkg comment freq ), @fixups ) { %>
- what.<%= $f %>.value = document.dummy.<%= $f %>.value;
-<% } %>
- what.plan.value = document.dummy.plan.options[document.dummy.plan.selectedIndex].value;
-<% foreach my $p ( keys %plans ) { %>
- if ( what.plan.value == "<%= $p %>" ) {
- what.setup.value = <%= $plans{$p}->{setup} %>;
- what.recur.value = <%= $plans{$p}->{recur} %>;
- }
-<% } %>
-}
-</SCRIPT>
-
-<% my %plandata = map { /^(\w+)=(.*)$/; ( $1 => $2 ); }
- split("\n", $part_pkg->plandata );
- #foreach my $layer ( 'konq_kludge', keys %plans ) {
- foreach my $layer ( 'konq_kludge', keys %plans ) {
- my $visibility = "hidden";
-%>
-<SCRIPT>
-if (document.getElementById) {
- document.write("<DIV ID=\"d<%= $layer %>\" STYLE=\"visibility: <%= $visibility %>; position: absolute\">");
-} else {
-<% $visibility="show" if $visibility eq "visible"; %>
- document.write("<LAYER ID=\"l<%= $layer %>\" VISIBILITY=\"<%= $visibility %>\">");
-}
-</SCRIPT>
-
-<FORM NAME="<%= $layer %>" ACTION="process/part_pkg.cgi" METHOD=POST onSubmit="fixup(this)">
-<INPUT TYPE="hidden" NAME="plan" VALUE="<%= $part_pkg->plan %>">
-<INPUT TYPE="hidden" NAME="pkg" VALUE="<%= $hashref->{pkg} %>">
-<INPUT TYPE="hidden" NAME="comment" VALUE="$<%= $hashref->{comment} %>">
-<INPUT TYPE="hidden" NAME="freq" VALUE="<%= $hashref->{freq} %>">
-<% foreach my $f ( @fixups ) { %>
-<INPUT TYPE="hidden" NAME="<%= $f %>" VALUE="">
-<% } %>
-
-<%
-if ( $cgi->param('clone') ) {
- print qq!<INPUT TYPE="hidden" NAME="clone" VALUE="!, $cgi->param('clone'), qq!">!;
-}
-if ( $cgi->param('pkgnum') ) {
- print qq!<INPUT TYPE="hidden" NAME="pkgnum" VALUE="!, $cgi->param('pkgnum'), qq!">!;
-}
-print qq!<INPUT TYPE="hidden" NAME="pkgpart" VALUE="$hashref->{pkgpart}">!,
-%>
-
-<% my $href = $plans{$layer}->{'fields'};
- foreach my $field ( keys %{ $href } ) { %>
-<%= $href->{$field}{'name'} %>:
-<INPUT TYPE="text" NAME="<%= $field %>" VALUE="<%= exists($plandata{$field}) ? $plandata{$field} : $href->{$field}{'default'} %>" onChange="fchanged(this)"><BR>
-<% } %>
-<INPUT TYPE="hidden" NAME="plandata" VALUE="<%= join(',', keys %{ $href } ) %>">
-
-<FONT SIZE="1">
-Setup expression<BR><INPUT TYPE="text" NAME="setup" SIZE="160" VALUE="<%= $hashref->{setup} %>" onLoad="fchanged(this)"><BR>
-Recurring espression<BR><INPUT TYPE="text" NAME="recur" SIZE="160" VALUE="<%= $hashref->{recur} %>" onLoad="fchanged(this)"><BR>
-</FONT>
-
-<%
-print qq!<BR><INPUT TYPE="submit" VALUE="!,
- $hashref->{pkgpart} ? "Apply changes" : "Add package",
- qq!" onClick="fchanged(this)">!;
-%>
-</FORM>
-
-<SCRIPT>
-if (document.getElementById) {
- document.write("</DIV>");
-} else {
- document.write("</LAYER>");
-}
-</SCRIPT>
+ }
-<% } %>
+ </SCRIPT>
+END
-<TAG onLoad="
- if (document.getElementById) {
- document.getElementById('d<%= $part_pkg->plan %>').style.visibility = 'visible';
- } else {
- document.l<%= $part_pkg->plan %>.visibility = 'visible';
+tie my %plans, 'Tie::IxHash', %{ FS::part_pkg::plan_info() };
+
+tie my %plan_labels, 'Tie::IxHash',
+ map { $_ => ( $plans{$_}->{'shortname'} || $plans{$_}->{'name'} ) }
+ keys %plans;
+
+my $html_bottom = sub {
+ my( $object ) = @_;
+
+ #warn join("\n", map { "$_: $options{$_}" } keys %options ). "\n";
+
+ my $layer_callback = sub {
+
+ my $layer = shift;
+ my $html = ntable("#cccccc",2);
+
+ #$html .= '
+ # <TR>
+ # <TD ALIGN="right">Recurring fee frequency </TD>
+ # <TD><SELECT NAME="freq">
+ #';
+ #
+ #my @freq = keys %freq;
+ #@freq = grep { /^\d+$/ } @freq
+ #XXX this bit# # if exists($plans{$layer}->{'freq'}) && $plans{$layer}->{'freq'} eq 'm';
+ #foreach my $freq ( @freq ) {
+ # $html .= qq(<OPTION VALUE="$freq");
+ # $html .= ' SELECTED' if $freq eq $part_pkg->freq;
+ # $html .= ">$freq{$freq}";
+ #}
+ #$html .= '</SELECT></TD></TR>';
+
+ my $href = $plans{$layer}->{'fields'};
+ my @fields = exists($plans{$layer}->{'fieldorder'})
+ ? @{$plans{$layer}->{'fieldorder'}}
+ : keys %{ $href };
+
+ foreach my $field ( grep $_ !~ /^(setup|recur)_fee$/, @fields ) {
+
+ $html .= '<TR><TD ALIGN="right">'. $href->{$field}{'name'}. '</TD><TD>';
+
+ my $format = sub { shift };
+ $format = $href->{$field}{'format'} if exists($href->{$field}{'format'});
+
+ #XXX these should use elements/ fields... (or this whole thing should
+ #just use layer_fields instead of layer_callback)
+
+ if ( ! exists($href->{$field}{'type'}) ) {
+
+ $html .= qq!<INPUT TYPE="text" NAME="${layer}__$field" VALUE="!.
+ ( exists($options{$field})
+ ? &$format($options{$field})
+ : $href->{$field}{'default'} ).
+ qq!">!;
+
+ } elsif ( $href->{$field}{'type'} eq 'checkbox' ) {
+
+ $html .= qq!<INPUT TYPE="checkbox" NAME="${layer}__$field" VALUE=1 !.
+ ( exists($options{$field}) && $options{$field}
+ ? ' CHECKED'
+ : ''
+ ). '>';
+
+ } elsif ( $href->{$field}{'type'} =~ /^select/ ) {
+
+ $html .= '<SELECT';
+ $html .= ' MULTIPLE'
+ if $href->{$field}{'type'} eq 'select_multiple';
+ $html .= qq! NAME="${layer}__$field">!;
+
+ if ( $href->{$field}{'select_table'} ) {
+ foreach my $record (
+ qsearch( $href->{$field}{'select_table'},
+ $href->{$field}{'select_hash'} )
+ ) {
+ my $value = $record->getfield($href->{$field}{'select_key'});
+ $html .= qq!<OPTION VALUE="$value"!.
+ ( $options{$field} =~ /(^|, *)$value *(,|$)/ #?
+ ? ' SELECTED'
+ : ''
+ ).
+ '>'. $record->getfield($href->{$field}{'select_label'});
+ }
+ } elsif ( $href->{$field}{'select_options'} ) {
+ foreach my $key ( keys %{ $href->{$field}{'select_options'} } ) {
+ my $label = $href->{$field}{'select_options'}{$key};
+ $html .= qq!<OPTION VALUE="$key"!.
+ ( $options{$field} =~ /(^|, *)$key *(,|$)/ #?
+ ? ' SELECTED'
+ : ''
+ ).
+ '>'. $label;
+ }
+
+ } else {
+ $html .= '<font color="#ff0000">warning: '.
+ "don't know how to retreive options for $field select field".
+ '</font>';
+ }
+ $html .= '</SELECT>';
+
+ } elsif ( $href->{$field}{'type'} eq 'radio' ) {
+
+ my $radio =
+ qq!<INPUT TYPE="radio" NAME="${layer}__$field"!;
+
+ foreach my $key ( keys %{ $href->{$field}{'options'} } ) {
+ my $label = $href->{$field}{'options'}{$key};
+ $html .= qq!$radio VALUE="$key"!.
+ ( $options{$field} =~ /(^|, *)$key *(,|$)/ #?
+ ? ' CHECKED'
+ : ''
+ ).
+ "> $label<BR>";
+ }
+
+ }
+
+ $html .= '</TD></TR>';
}
-">
- </BODY>
-</HTML>
+ $html .= '</TABLE>';
+
+ $html .= qq(<INPUT TYPE="hidden" NAME="${layer}__OPTIONS" VALUE=").
+ join(',', keys %{ $href } ). '">';
+
+ $html;
+
+ };
+
+ my %selectlayers = (
+ field => 'plan',
+ options => [ keys %plan_labels ],
+ labels => \%plan_labels,
+ curr_value => $object->plan,
+ layer_callback => $layer_callback,
+ );
+
+ include('/elements/selectlayers.html', %selectlayers, 'layers_only'=>1 ).
+ '<SCRIPT TYPE="text/javascript">'.
+ include('/elements/selectlayers.html', %selectlayers, 'js_only'=>1 ).
+ '</SCRIPT>';
+
+};
+
+</%init>