+my $query = { 'table' => 'cdr',
+ 'hashref' => $hashref,
+ 'extra_sql' => $qsearch,
+ 'order_by' => 'ORDER BY calldate',
+ };
+
+if ( $cgi->param('longest') =~ /^(\d+)$/ && $cgi->param('longest') > 0 ) {
+ $cgi->param('maxrecords',$1);
+ $count_query = "SELECT $1";
+ $query->{'order_by'} = 'ORDER BY billsec desc';
+ $nototalminutes = 1;
+}
+
+
+###
+# display fields
+###
+
+my %header = %{ FS::cdr->table_info->{'fields'} };
+
+my @first = qw( acctid calldate clid charged_party src dst dcontext );
+my %first = map { $_=>1 } @first;
+
+my @fields = ( @first, grep !$first{$_}, fields('cdr') );
+
+if ( $cgi->param('show') ) {
+ @fields = grep $cgi->param("show_$_"), @fields;
+}
+
+my @header = map {
+ if ( exists($header{$_}) ) {
+ $header{$_};
+ } else {
+ my $header = $_;
+ $header =~ s/\_/ /g; #//wtf
+ ucfirst($header);
+ }
+ } @fields;
+unshift @header, ' ';
+
+my $date_sub_factory = sub {
+ my $column = shift;
+ sub {
+ #my $cdr = shift;
+ my $date = shift->$column();
+ $date ? time2str( '%Y-%m-%d %T', $date ) : ''; #config time2str format?
+ };
+};
+
+my %fields = (
+ #any other formatters?
+ map { $_ => &{ $date_sub_factory }($_) } qw( startdate answerdate enddate )
+);
+
+my %links = (
+ 'svcnum' =>
+ sub { $_[0]->svcnum ? [ $p.'view/svc_phone.cgi?', 'svcnum' ] : ''; },
+);
+
+@fields = map { exists($fields{$_}) ? $fields{$_} : $_ } @fields;
+unshift @fields, sub {
+ return '' unless $edit_data;
+ my $cdr = shift;
+ my $acctid = $cdr->acctid;
+ qq!<INPUT NAME="acctid$acctid" TYPE="checkbox" VALUE="1">!;
+ };
+
+my @links = ( map { exists($links{$_}) ? $links{$_} : '' } @fields );
+
+
+###
+# top dst / top src
+###
+
+my $topmode = 0;
+
+if ( $cgi->param('top_dst') =~ /^(\d+)$/ && $cgi->param('top_dst') > 0 ) {
+ $topmode = $1;
+ @fields = ('dst');
+ @header = ('Destination');
+}
+elsif ( $cgi->param('top_src') =~ /^(\d+)$/ && $cgi->param('top_src') > 0 ) {
+ $topmode = $1;
+ @fields = ('src');
+ @header = ('Source');
+}
+
+if ( $topmode ) {
+ my $whichfield = $fields[0];
+ $query = { 'select' => "$whichfield, count(1) as cnt",
+ 'table' => 'cdr',
+ 'hashref' => {},
+ 'extra_sql' => "$search
+ group by $whichfield
+ order by cnt desc",
+ };
+ $count_query = "SELECT $topmode";
+
+ # this is weird, maybe we should change search.html
+ $cgi->param('maxrecords',$topmode);
+
+ # kind of hacked
+ my $link = "${p}search/cdr.html?".$cgi->query_string;
+ $link =~ s/;top_(dst|src)=(\d+|)//g;
+ $link =~ s/;maxrecords=(\d+|)//;
+ $link =~ s/;(src|dst)=(\d+|)//g;
+ $link = [ "$link;$whichfield=", sub { shift->$whichfield } ];
+ @links = ($link);
+
+ push @fields, 'cnt';
+ push @header, '# Calls';
+
+ $nototalminutes = 1;
+}
+
+my $html_foot = include('/search/elements/checkbox-foot.html',
+ actions => [
+ { submit => "reprocess selected",
+ name => "action",
+ confirm => "Are you sure you want to reprocess the selected CDRs?" },
+ { submit => "delete selected",
+ name => "action",
+ confirm => "Are you sure you want to delete the selected CDRs?" },
+ ]
+);