package TTXDesk;
use strict;
use TTXCommon;
use TTXUser;
use TTXTickets;

my @brcols = ('id', 'name', 'email', 'subject', 'oper', 'status', 'open', 'updated');
my %c2t = (
  id => 'id',
  name => 'name',
  email => 'email',
  subject => 'subject',
  oper => 'operator',
  status => 'status',
  updated => 'updated',
  open => 'created'
);
my %c2T = (
  id => 'Ticket #',
  tid => 'Ticket #',
  name => 'Name',
  email => 'Email',
  fltrsubj => 'Subject',
  oper => 'Operator',
  status => 'Status',
  lname => 'Name'
);

my @rclr = ('#333333', '#666666');
my @rcls = ('orow', 'erow');
# ================================================================== buildfilter

sub buildfilter {
  my ($cfg, $query, $data) = @_;
  my $width = $cfg->get('HTMLBASEWIDTH') || 700;
  my $buff = "<table cellspacing=0 collspacing=0 width=$width>\n";
  if ($cfg->get('fltrcols') eq undef) {
    $cfg->set('fltrcols', 'oper|status|id');
    $cfg->save();
  }
  foreach my $var ($cfg->vars()) {
    next if $var !~ /^x/;
    my $pos = $cfg->get($var);
    next if $pos < 0 || $pos > 9;
    $var =~ s/^x//;
    $var =~ /^(.{1,15})(.*)/;
    $var = $1;
#          $val .= '...' if $2 ne undef;
    $c2T{"c$pos"} = $var;
  }
  my $colcnt = 0;
  foreach my $fld (split(/\|/, $cfg->get('fltrcols'))) {
    $fld = 'fltrsubj' if $fld eq 'subject';
    $fld = 'tid' if $fld eq 'id';
    if ($colcnt > 2) { $buff .= "</tr>\n"; $colcnt = 0; }
    if (!$colcnt) { $buff .= "<tr>\n"; }
    ++$colcnt;
    $buff .= "<td align=right class=lbl>$c2T{$fld}</td>\n<td align=left>&nbsp;";
    if ($fld eq 'oper') {
      $buff .= $data->{OPERSELBOX};
    } elsif ($fld eq 'status') {
      $buff .= $data->{STATUSSELBOX};
    } else {
      my $val = $query->param($fld);
      $fld =~ /^c(\d)$/;
      if ($1 ne undef && $cfg->get("dropdown$1") ne undef) {
        my @options = split(/;/, $cfg->get("dropdown$1"));
        $buff .= "<select name=$fld>\n";
        if ($val eq undef) {
          $buff .= "<option value=\"\"></option>\n";
        }
        foreach my $option (@options) {
          my $selected = " selected" if $option eq $val;
          my $v = $option;
          $v =~ s/"/&quot;/g;
          my $h = $option;
          $h =~ s/</&lt/g;
          my $dots = '...';
          $h =~ /^(.{1,15})(.*)/;
          $h = $1;
          $h .= '...' if $2 ne undef;

          $buff .= "<option value=\"$v\"$selected>$h</option>\n";
        }
        if ($val ne undef) {
          $buff .= "<option value=\"\">-- Any --</option>\n";
        }
        $buff .= "</select>\n";
      } else {
        $val =~ s/&/&amp;/g;
        $val =~ s/</&lt/g;
        $buff .= "<input type=text name=$fld size=12 value=\"$val\"";
      }
    }
    $buff .= "</td>\n";
  }
  if ($colcnt) {
    while ($colcnt < 3) { $buff .= "<td>&nbsp;</td>\n"; ++$colcnt; }
    $buff .= "</tr>\n";
  }
  $buff .= "</table>";
  $data->{TICKETFILTER} = $buff;
}
# ===================================================================== helpdesk

sub helpdesk {
  my ($cfg, $query, $data) = @_;
  $data->{PAGEHEADING} = 'Help Desk';
  if ($query->param('tk') ne undef) {
    $query->param(-name => 'key', -value => $query->param('tk'));
    return 'ticket';
  }
  if ($query->param('do') eq undef && $query->param('status') eq undef) {
    $query->param(-name => 'status', -value => $cfg->get('defaultstatus'));
  }
#  if ($query->param('do') eq undef && $query->param('status') eq undef) {
#    $query->param(-name => 'status', -value => '(PND|OPN|WFR)');
#  }
  if ($query->param('reset') ne undef) {
    foreach my $fld ('oper', 'tid', 'status', 'lname', 'name', 'email', 'fltrsubj') {
      $query->param(-name => $fld, -value => '');
    }
    for (my $i = 0; $i < 10; ++$i) {
      $query->param(-name => "c$i", -value => '');
    }
  }
  if ($cfg->get('brcols') eq undef) {
    $cfg->set('brcols', 'id|name|email|subject|oper|status|open|updated');
    $cfg->save();
  }
  if ($cfg->get('brcols') ne undef) {
    @brcols = split(/\|/, $cfg->get('brcols'));
    my @cfgvars = $cfg->vars();
    foreach my $var (@cfgvars) {
      next if $var !~ /^x/;
      my $cidx = int ($cfg->get($var));
      next if ($cidx < 0 || $cidx > 9);
      $var =~ s/^x//;
      $c2t{"c$cidx"} = $var;
    }
  }
  my @operlist = TTXUser::list();
  $data->{OPERSELBOX} = "<select name=oper>\n";
  if ($query->param('oper') eq undef) {
    $data->{OPERSELBOX} .= "<option></option>\n";
  }
  foreach my $oper (@operlist) {
    $data->{OPERSELBOX} .= "<option value=$oper";
    if ($query->param('oper') eq $oper) {
      $data->{OPERSELBOX} .= " selected";
    }
    $data->{OPERSELBOX} .= ">$oper</option>\n";
  }
  if ($query->param('oper') ne undef) {
    $data->{OPERSELBOX} .= "<option value=\"\">-- any --</option>\n";
  }
  $data->{OPERSELBOX} .= "<option value=\"-\"";
  if ($query->param('oper') eq '-') {
    $data->{OPERSELBOX} .= " selected";
  }
  $data->{OPERSELBOX} .= ">-- none --</option>\n</select>\n";
  $data->{STATUSSELBOX} = "<select name=status>\n";
  if ($query->param('status') eq undef) {
    $data->{STATUSSELBOX} .= "<option></option>\n";
  }
  foreach my $status ('(OPN|PND)', 'PND', 'OPN', 'WFR', '(OPN|WFR)', 'CLS', '(PND|OPN|WFR)') {
    $data->{STATUSSELBOX} .= "<option value=$status";
    if ($query->param('status') eq $status) {
      $data->{STATUSSELBOX} .= " selected";
    }
    $data->{STATUSSELBOX} .= ">".TTXCommon::status($status)."</option>\n";
  }
  if ($query->param('status') ne undef) {
    $data->{STATUSSELBOX} .= "<option value=\"\">-- any --</option>\n";
  }
  $data->{STATUSSELBOX} .= "</select>\n";
  buildfilter($cfg, $query, $data);
  my $tickets = TTXCommon::dbtik();
  if ($tickets eq undef || $tickets->error() ne undef) {
    $data->{ERROR_MESSAGE} = $tickets->errortext();
    return undef;
  }
  my @filter;
  if ($query->param('oper') ne undef) {
    my $f;
    $f->{col} = 'oper';
    if ($query->param('oper') ne '-') {
      $f->{expr} = "^".$query->param('oper')."\$";
    } else {
      $f->{expr} = "^\$";
    }
    push @filter, $f;
  }
  if ($cfg->get('accessctrl') && $cfg->get('routex') ne undef) {
    my $n = $cfg->get('routex');
    if ($n =~ /^\d$/) {
      eval "use TTXCustomRoute";
      if ($@ eq undef) {
        my @list = TTXCustomRoute::grouplist($cfg);
        if (@list > 0) {
          my $f;
          $f->{col} = "c$n";
          $f->{expr} = '^('.join('|', @list).')$';
          push @filter, $f;
        }
      }
    }
  }
  if ($query->param('status') ne undef) {
    my $f;
    $f->{col} = 'status';
    $f->{expr} = "^".$query->param('status')."\$";
    push @filter, $f;
  }
  if ($query->param('cmd') eq 'mytickets') {
    my $f;
    $f->{col} = 'email';
    my $emailkey = $query->param('emailkey');
    $emailkey =~ s/\*//g;
    $f->{expr} = "^$emailkey\$";
    push @filter, $f;
  }
  if ($query->param('tid') ne undef) {
    my $f;
    $f->{col} = 'id';
    $f->{expr} = "^".$query->param('tid')."\$";
    $f->{expr} =~ s/\*/.*/g;
    push @filter, $f;
  }
  my @fields = ('name', 'lname', 'fltrsubj', 'email');
  for (my $i = 0; $i < 10; ++$i) { push @fields, "c$i"; }
  foreach my $fld (@fields) {
    if ($query->param($fld) ne undef) {
      my $f;
      if ($fld eq 'fltrsubj') { $f->{col} = 'subject'; }
      else                    { $f->{col} = $fld; }
      $f->{expr} = "^".$query->param($fld)."\$";
      $f->{expr} =~ s/\*/.*/g;
      push @filter, $f;
    }
  }
  if ($query->param('qoffset') eq undef) {
    $query->param(-name => 'qoffset', -value => 0);
  }
  if ($query->param('qwindow') eq undef) {
    $query->param(-name => 'qwindow', -value => 20);
  }
  if ($query->param('qsort') eq undef) {
    $query->param(-name => 'qsort', -value => 'updated');
  }
  if ($query->param('qsortorder') eq undef) {
    $query->param(-name => 'qsortorder', -value => 'D');
  }
  my $browser = $tickets->list($query->param('qoffset'), $query->param('qwindow'),
                            $query->param('qsort'), $query->param('qsortorder'), \@filter);
  my $list = $browser->{list};
  if (@{$list} < 1) {
    $data->{TICKETLIST} = "<tr><td align=center><b>There are no tickets matching your query</b></td></tr>";
  } else {
    my $ccnt = scalar @brcols;
    my $lspan = int($ccnt / 2);
    my $rspan = $ccnt - $lspan;
    $data->{TICKETLIST} .= "<tr><td colspan=$lspan align=left><b><span class=sm>Tickets ".
                            ($browser->{first} + 1)." - ".$browser->{last}." out of ".
                            $browser->{total}."</b></span></td>".
                            "<td align=right colspan=$rspan><span class=sm><b>";
    if ($browser->{first} > 0) {
      $data->{TICKETLIST} .= "<a href=# onClick=\"return scroll('0','".$query->param('qwindow')."')\">first</a> ";
    } else {
      $data->{TICKETLIST} .= "<font color=\"#BBBBBB\">first</font> ";
    }
    if ($browser->{first} > 0) {
      my $back = $browser->{first} - $query->param('qwindow');
      $back = 0 if $back < 0;
      $data->{TICKETLIST} .= "<a href=# onClick=\"return scroll('$back','".$query->param('qwindow')."')\">prev</a> ";
    } else {
      $data->{TICKETLIST} .= "<font color=\"#BBBBBB\">prev</font> ";
    }
    if ($browser->{last} < $browser->{total}) {
      my $frw = $browser->{first} + $query->param('qwindow');
      $data->{TICKETLIST} .= "<a href=# onClick=\"return scroll('$frw','".$query->param('qwindow')."')\">next</a> ";
    } else {
      $data->{TICKETLIST} .= "<font color=\"#BBBBBB\">next</font> ";
    }
    if ($browser->{last} < $browser->{total}) {
      my $frw = $browser->{total} - $query->param('qwindow');
      $data->{TICKETLIST} .= "<a href=# onClick=\"return scroll('$frw','".$query->param('qwindow')."')\">last</a> ";
    } else {
      $data->{TICKETLIST} .= "<font color=\"#BBBBBB\">last</font> ";
    }
    $data->{TICKETLIST} .=  "</b></span></tr>\n";
    $data->{TICKETLIST} .= "<tr>\n";
    $data->{TICKETLIST} .= "<tr><td colspan=8><img src=\"".TTXData::get('CONFIG')->get('imgurl')."/dot.gif\" height=2></td></tr>";
    foreach my $col (@brcols) {
      my $order = 'A';
      if ($query->param('qsort') eq $col) {
        if ($query->param('qsortorder') eq 'A') {
          $order = 'D';
        }
      } else {
        $order = $query->param('qsortorder');
      }
      $data->{TICKETLIST} .= "<td class=trow align=center><a href=# onClick=\"return setsort('$col', '$order')\">$c2t{$col}</a></td>\n";
    }
    $data->{TICKETLIST} .= "</tr>\n";
    my $i = 0;
    my $j = 0;
    my %colormatrix = (PND => 'green', WFR => 'blue', OPN => 'orange', CLS => 'red', LATE => 'red');
    my $now = time();
    foreach my $id (@{$list}) {
      my ($fcopen, $fcclose);
      my $clr = $rclr[$i];
      my $cl = $rcls[$i];
      ++$i;
      ++$j;
      $i = 0 if $i > 1;
      my $t = $tickets->ticket($id);
      if ($cfg->get('colortickets')) {
        $fcopen = "<font color=".$colormatrix{$t->{status}}.">";
        $fcclose = "</font>";
      }
      if ($cfg->get('claimtime') &&
           (($t->{status} eq 'PND' && ($now - $t->{open} > 24*60*60) && !$cfg->get('ignorepending') ) ||
             $t->{status} ne 'PND' && $t->{'c'.$cfg->get('claimtime')} > 23)) {
        $fcopen = "<font color=".$colormatrix{LATE}.">";
        $fcclose = "</font>";
      }
      $data->{TICKETLIST} .= "<tr bgcolor=\"$clr\" onmouseover=\"rowhl($j, 1);\" onmouseout=\"rowhl($j, 0);\" id=\"tr$j\">\n";
      foreach my $col (@brcols) {
        my $val = $t->{$col};
        my $align = 'right';
        if (grep(/^$col$/, ('open', 'updated', 'closed'))) {
          $val = "<nobr>$fcopen".TTXCommon::tmtxt($val)."$fcclose</nobr>";
        } elsif ($col eq 'status') {
          $val = $fcopen.TTXCommon::status($val).$fcclose;
        } elsif ($col eq 'subject') {
          $align = 'left';
          my $dots = '...';
          $val =~ s/\b([^\s]{15,15})([^\s])*/$1.$dots/ge;
          $val =~ /^(.{1,30})(.*)/;
          $val = $1;
          $val .= '...' if $2 ne undef;
          $val =~ s/</&lt;/g;
          my $emailkey;
          if ($query->param('cmd') eq 'mytickets') {
            $emailkey = "&emailkey=".$query->param('emailkey');
          }
          $val = "<a href=\"$ENV{SCRIPT_NAME}?cmd=ticket&sid=".$query->param('sid')."&key=".$t->{key}.$emailkey.
                 "&qsort=".$query->param('qsort')."&qsortorder=".$query->param('qsortorder').
                 "&qoffset=".$query->param('qoffset')."&qwindow=".$query->param('qwindow').
                 "&oper=".$query->param('oper')."&status=".$query->param('status').
                 "&lname=".$query->param('lname')."&c0=".$query->param('c0')."&fltrsubj=".$query->param('fltrsubj').
                 "\">$fcopen$val$fcclose</a>";
        } elsif ($col eq 'name') {
          $align = 'left';
          $val = $fcopen.$val.$fcclose;
        } elsif ($col eq 'email') {
          my $dots = '...';
          my $adr = $val;
          $val =~ s/\b([^\s]{15,15})([^\s])*/$1.$dots/ge;
          $val = "<a href=\"mailto:$adr\">$fcopen$val$fcclose</a>";
        } else {
          $val = "-" if $val eq undef;
          $val =~ s/</&lt;/g;
          $val =~ s/>/&gt;/g;
          $val = $fcopen.$val.$fcclose;
        }
#        $val = "-" if $val eq undef;
        if ($query->param('qsort') eq $col) { $val = "<b>$val</b>"; }
        $data->{TICKETLIST} .= "<td align=$align valign=top class=$cl>$val</td>\n";
      }
      $data->{TICKETLIST} .= "</tr>\n";
    }
    $data->{TICKETLIST} .= "<tr><td colspan=8><img src=\"".TTXData::get('CONFIG')->get('imgurl')."/dot.gif\" height=2></td></tr>";
    $data->{TICKETLIST} .= "<tr><td align=right colspan=$ccnt><span class=sm><b>";
    if ($browser->{first} > 0) {
      $data->{TICKETLIST} .= "<a href=# onClick=\"return scroll('0','".$query->param('qwindow')."')\">first</a> ";
    } else {
      $data->{TICKETLIST} .= "<font color=\"#BBBBBB\">first</font> ";
    }
    if ($browser->{first} > 0) {
      my $back = $browser->{first} - $query->param('qwindow');
      $back = 0 if $back < 0;
      $data->{TICKETLIST} .= "<a href=# onClick=\"return scroll('$back','".$query->param('qwindow')."')\">prev</a> ";
    } else {
      $data->{TICKETLIST} .= "<font color=\"#BBBBBB\">prev</font> ";
    }
    if ($browser->{last} < $browser->{total}) {
      my $frw = $browser->{first} + $query->param('qwindow');
      $data->{TICKETLIST} .= "<a href=# onClick=\"return scroll('$frw','".$query->param('qwindow')."')\">next</a> ";
    } else {
      $data->{TICKETLIST} .= "<font color=\"#BBBBBB\">next</font> ";
    }
    if ($browser->{last} < $browser->{total}) {
      my $frw = $browser->{total} - $query->param('qwindow');
      $data->{TICKETLIST} .= "<a href=# onClick=\"return scroll('$frw','".$query->param('qwindow')."')\">last</a> ";
    } else {
      $data->{TICKETLIST} .= "<font color=\"#BBBBBB\">last</font> ";
    }
    $data->{TICKETLIST} .=  "</b></span></tr>\n";
    $data->{TICKETLIST} .= "<tr>\n";
  }
  return undef;
}


1;
