File: //usr/share/usermin/mailbox/address_chooser.cgi
#!/usr/bin/perl
# address_chooser.cgi
# Display a list of entries from the address book
use strict;
use warnings;
no warnings 'redefine';
no warnings 'uninitialized';
our (%text, %in, %uconfig);
our $trust_unknown_referers = 1;
require './mailbox-lib.pl';
&ReadParse();
&popup_header($text{'address_choose'}, undef,
"onLoad='document.forms[0].search.focus()'");
print <<EOF;
<script>
function makeaddress(a, n)
{
if (n == "") {
// An address without a name
return "<"+a+">";
}
else if (n.indexOf(",") != -1) {
// A name with a comma in it
return "\\""+n+"\\" <"+a+">";
}
else {
// A name without a comma
return n+" <"+a+">";
}
}
// Add an address to the list
function newaddress(a, n)
{
av = makeaddress(a, n);
if (top.opener.ifield.value == "") {
top.opener.ifield.value = av;
}
else {
top.opener.ifield.value += ","+av;
}
}
// Remove an address from the list
function oldaddress(a, n)
{
av = makeaddress(a, n);
curr = top.opener.ifield.value;
idx1 = curr.indexOf(av+",");
idx2 = curr.indexOf(","+av);
if (curr == av) {
// Address only!
curr = "";
}
else if (idx1 != -1) {
// Found the address, in string
curr = curr.substring(0, idx1)+curr.substring(idx1+av.length+1);
}
else if (idx2 != -1) {
// Found the ,address in string
curr = curr.substring(0, idx2)+curr.substring(idx2+av.length+1);
}
else {
// Look for address only
sp = curr.split(",");
curr = "";
for(j=0; j<sp.length; j++) {
if (sp[j].indexOf(a) == -1) {
if (curr == "") {
curr = sp[j];
}
else {
curr += ","+sp[j];
}
}
}
}
top.opener.ifield.value = curr;
}
// Called when an address has been clicked on
function clickaddress(a, n, f)
{
if (f.checked) {
newaddress(a, n);
}
else {
oldaddress(a, n);
}
}
function select(a, n)
{
if ($in{'mode'} == 2) {
// Strip off domain
at = a.indexOf("@");
if (at > 0)
a = a.substr(0, at);
}
if (top.opener.rfield != null) {
// Put real name in separate field
top.opener.ifield.value = a;
top.opener.rfield.value = n;
}
else {
// Combine to single field
if (n == "") {
av = "<"+a+">";
}
else {
av = n+" <"+a+">";
}
top.opener.ifield.value = av;
}
window.close();
}
</script>
EOF
# Find addresses and groups
my @addrs = &list_addresses();
my $addrs_count;
my @agroups;
my %mems;
if ($in{'search'}) {
my $s = $in{'search'};
@addrs = grep { $_->[0] =~ /\Q$s\E/i || $_->[1] =~ /\Q$s\E/i } @addrs;
}
if ($in{'mode'}) {
@addrs = grep { $_->[3] } @addrs;
$addrs_count = scalar(@addrs);
}
else {
if (!$uconfig{'from_in_to'}) {
@addrs = grep { !$_->[3] } @addrs;
}
$addrs_count = scalar(@addrs);
@agroups = &list_address_groups();
if ($in{'search'}) {
my $s = $in{'search'};
@agroups = grep { $_->[0] =~ /\Q$s\E/i ||
$_->[1] =~ /\Q$s\E/i } @agroups;
}
foreach my $a (@agroups) {
push(@addrs, [ $a->[0] ]);
$mems{$a->[0]} = [ &split_addresses($a->[1]) ];
}
}
# Show search form
if (@addrs || $in{'search'}) {
print &ui_form_start("address_chooser.cgi", "post");
print "<b>$text{'address_search'}</b>\n";
print &ui_textbox("search", $in{'search'}, 20);
print &ui_hidden("mode", $in{'mode'});
print &ui_hidden("addr", $in{'addr'});
print &ui_submit($text{'address_ok'});
print &ui_form_end();
}
# Show list of addresses
my %infield;
my $href;
if (@addrs) {
my @sp = &split_addresses(&decode_mimewords($in{'addr'}));
for(my $i=0; $i<@sp; $i++) {
$infield{$sp[$i]->[0]} = $i;
}
print "<form><table width=100%>\n";
print "<tr>\n";
print "<td><br></td>\n" if (!$in{'mode'});
print "<td><b>$text{'address_addr'}</b></td>\n";
print "<td><b>$text{'address_name'}</b></td>\n";
if ($in{'mode'} == 0) {
print "<td></td>\n";
}
print "</tr>\n";
my $i = 0;
foreach my $a (@addrs) {
if ($i == $addrs_count && $i) {
print "<tr> <td><br></td>\n";
print "<td><b>$text{'address_group'}</b></td>\n";
print "<td><b>$text{'address_members'}</b></td></tr>\n";
}
print "<tr>\n";
if ($in{'mode'} == 0) {
printf "<td><input type=checkbox name=addr_$i value='%s' onClick='clickaddress(\"%s\", \"%s\", this)' %s>", &html_escape($a->[1]), &html_escape($a->[0]), &html_escape($a->[1]), defined($infield{$a->[0]}) ? "checked" : "";
$href = "<a href='' onClick='cb = document.forms[1].addr_$i; cb.checked = !cb.checked; clickaddress(\"".&html_escape($a->[0])."\", \"".&html_escape($a->[1])."\", cb); return false'>";
}
else {
$href = "<a href='' onClick='select(\"".&html_escape($a->[0])."\", \"".&html_escape($a->[1])."\"); return false'>";
}
if ($i >= $addrs_count) {
print "<td>$href",$a->[0],"</a></td>\n";
my $m = @{$mems{$a->[0]}};
print "<td>$href",&text('address_m', $m),"</a></td>\n";
}
else {
print "<td>$href$a->[0]</a></td>\n";
print "<td>$href",($a->[1] ? $a->[1] : "<br>"),"</a></td>\n";
}
if ($in{'mode'} == 0) {
# Show button to select just this one
print "<td><a href='' onClick='select(\"".&html_escape($a->[0])."\", \"".&html_escape($a->[1])."\"); return false'><img src=images/ok.gif border=0></a></td>\n";
}
print "</tr>\n";
$i++;
}
print "</table></form>\n";
}
elsif ($in{'search'}) {
print "<b>$text{'address_none2'}</b> <p>\n";
}
else {
print "<b>$text{'address_none'}</b> <p>\n";
}
&popup_footer();