+%}
+<%init>
+
+my( %opt ) = @_;
+
+warn "elements/select-table.html: \n". Dumper(\%opt)
+ if exists $opt{debug} && $opt{debug};
+
+$opt{'extra_option_attributes'} ||= [];
+
+my $onchange = '';
+if ( $opt{'onchange'} ) {
+ $onchange = $opt{'onchange'};
+ $onchange .= '(this)' unless $onchange =~ /\(\w*\);?$/;
+ $onchange =~ s/\(what\);/\(this\);/g; #ugh, terrible hack. all onchange
+ #callbacks should act the same
+ $onchange = 'onChange="'. $onchange. '"';
+}
+
+my $dbdef_table = dbdef->table($opt{'table'})
+ or die "can't find dbdef for ". $opt{'table'}. " table\n";
+
+my $key = $opt{'value_col'} || $dbdef_table->primary_key;
+
+my $name_col = $opt{'name_col'};
+
+my $value = exists($opt{'curr_value'}) ? $opt{'curr_value'} : $opt{'value'};
+$value = [ split(/\s*,\s*/, $value) ] if $opt{'multiple'} && $value =~ /,/;
+
+#my $addl_from = $opt{'addl_from'} || '';
+my $extra_sql = $opt{'extra_sql'} || '';
+my $hashref = $opt{'hashref'} || {};
+
+if ( $opt{'agent_virt'} ) {
+ $extra_sql .=
+ ( $extra_sql =~ /WHERE/i || scalar(keys %$hashref ) ? ' AND ' : ' WHERE ' ).
+ $FS::CurrentUser::CurrentUser->agentnums_sql(
+ 'null' => $opt{'agent_null'},
+ 'null_right' => $opt{'agent_null_right'},
+ );
+}
+
+my @records = ();
+if ( $opt{'records'} ) {
+ @records = @{ $opt{'records'} };
+ @records = sort { $a->get($name_col) cmp $b->get($name_col) } @records
+ unless $opt{'presorted'};
+} else {
+ @records = qsearch( {
+ 'select' => $opt{'select'} || '*',
+ 'table' => $opt{'table'},
+ 'addl_from' => $opt{'addl_from'},
+ 'hashref' => $hashref,
+ 'extra_sql' => $extra_sql,
+ 'order_by' => ( $opt{'order_by'} || "ORDER BY $name_col" ),
+ });
+}
+
+if ( ref( $value ) eq 'ARRAY' ) {
+ $value = { map { $_ => 1 } @$value };
+}
+
+
+if (
+ (ref $value && $value)
+ or (ref $opt{hashref} && exists $opt{hashref}->{disabled})
+ or $opt{also_show_option}
+) {
+
+ delete $opt{hashref}->{disabled};
+
+ # also_show_option: (hack for change_pkg form):
+ # Include an absent select option, without selecting it
+ # as the curr_value
+ my @also_show = ref($value) ? keys %$value : ($value);
+ push @also_show, $opt{also_show_option} if $opt{also_show_option};
+
+ foreach my $v ( @also_show ) {
+ next if grep { $v == $_->$key() } @records;
+
+ $opt{hashref}->{$key} = $v;
+ my $record = qsearchs( {
+ 'table' => $opt{table},
+ 'addl_from' => $opt{'addl_from'},
+ 'hashref' => $hashref,
+ 'extra_sql' => $extra_sql,
+ });
+ push @records, $record if $record;
+
+ }
+}
+
+my @pre_options = $opt{pre_options} ? @{ $opt{pre_options} } : ();
+my @post_options = $opt{post_options} ? @{ $opt{post_options} } : ();
+
+my $size = $opt{'size'} ? 'SIZE=' . $opt{'size'} : '';
+
+</%init>