package Template::_thread;

################################################################################
#                                                                              #
# File:        shared/Template/_thread.pm                                      #
#                                                                              #
# Authors:     Andre Malo <nd@o3media.de>, 2001-06-16                          #
#                                                                              #
# Description: convert parsed thread to HTML                                   #
#                                                                              #
################################################################################

use strict;
use vars qw(
  @EXPORT
  $VERSION
);

use Encode::Plain; $Encode::Plain::utf8 = 1;
use Posting::_lib qw(short_hr_time);
use Template;
use Template::_query;

################################################################################
#
# Version check
#
$VERSION = do { my @r =(q$Revision$ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r };

################################################################################
#
# Export
#
use base qw(Exporter);
@EXPORT = qw(html_thread);

### html_thread () #############################################################
#
# create HTML string
#
# Params: $msg      - Reference of Message-Array
#                     (Output of parse_single_thread in Posting::_lib)
#         $template - Template object
#         $par      - Hash Reference (see doc for details)
#
# Return: Reference of HTML String
#
sub html_thread ($$$) {
  my ($msg, $template, $par) = @_;

  return \'' unless @$msg;

  my $temp = $par -> {template};
  my $i = $par -> {cgi} -> {user};
  my $t = $par -> {cgi} -> {thread};
  my $p = $par -> {cgi} -> {posting};
  my $c = $par -> {cgi} -> {command};
  my $tid = $par -> {thread};
  my $html='';
  my $startlevel=0;
  my $oldlevel=0;
  my @indexes;

  # whole thread
  if ($par -> {start} == -1) {
    $_ = $msg -> [0];
    @indexes = (1..$_ -> {answers});

    if ($_ -> {answers}) {
      $html =
        '<dd><dl><dt>'.

        ${$template -> scrap (
           $temp -> {
             length $_ -> {cat}
               ? 'start'
               : 'startNC'
           },
           { $temp -> {name}    => $_ -> {name},
             $temp -> {subject} => $_ -> {subject},
             $temp -> {cat}     => $_ -> {cat},
             $temp -> {time}    => plain(short_hr_time ($_ -> {time})),
             $temp -> {link}    => query_string({$t => $tid, $p => $_ -> {mid}}),
             $temp -> {tid}     => $tid,
             $temp -> {mid}     => $_ -> {mid},
           },
           $par -> {addParam}
          )} .
        '</dt>';
    }

    else {
      $html =
        '<dd>'.
        ${$template -> scrap (
           $temp -> {
             length $_ -> {cat}
             ? 'start'
             : 'startNC'
           },
           { $temp -> {name}    => $_ -> {name},
             $temp -> {subject} => $_ -> {subject},
             $temp -> {cat}     => $_ -> {cat},
             $temp -> {time}    => plain(short_hr_time ($_ -> {time})),
             $temp -> {link}    => query_string({$t => $tid, $p => $_ -> {mid}}),
             $temp -> {tid}     => $tid,
             $temp -> {mid}     => $_ -> {mid},
           },
           $par -> {addParam}
          )}.
        '</dd>';

      return \$html;
    }
  }

  # only subthread
  #
  else {
    my $start=-1;
    for (@$msg) {$start++; last if ($_ -> {mid} == $par -> {start});}
    my $end   = $start + $msg -> [$start] -> {answers};
    $start++;
    @indexes = ($start..$end);
    $oldlevel = $startlevel = $msg -> [$start] -> {level}
      if (defined $msg -> [$start] -> {level});
  }

  # create HTML
  #
  for (@$msg[@indexes]) {

    if ($_ -> {level} < $oldlevel) {
      $html.='</dl></dd>' x ($oldlevel - $_ -> {level});}

    $oldlevel = $_ -> {level};

    if ($_ -> {answers}) {
      $html.=
        '<dd><dl><dt>'.
        ${$template -> scrap (
           $temp -> {
             length $_ -> {cat}
             ? 'line'
             : 'lineNC'
           },
           { $temp -> {name}    => $_ -> {name},
             $temp -> {subject} => $_ -> {subject},
             $temp -> {cat}     => $_ -> {cat},
             $temp -> {time}    => plain(short_hr_time ($_ -> {time})),
             $temp -> {link}    => query_string({$t => $tid, $p => $_ -> {mid}}),
             $temp -> {tid}     => $tid,
             $temp -> {mid}     => $_ -> {mid},
           },
           $par -> {addParam}
          )}.
        '</dt>';
    }
    else {
      $html.=
        '<dd>'.
        ${$template -> scrap (
           $temp -> {
             length $_ -> {cat}
             ? 'line'
             : 'lineNC'
           },
           { $temp -> {name}    => $_ -> {name},
             $temp -> {subject} => $_ -> {subject},
             $temp -> {cat}     => $_ -> {cat},
             $temp -> {time}    => plain(short_hr_time ($_ -> {time})),
             $temp -> {link}    => query_string({$t => $tid, $p => $_ -> {mid}}),
             $temp -> {tid}     => $tid,
             $temp -> {mid}     => $_ -> {mid},
           },
           $par -> {addParam}
          )}.
        '</dd>';
    }
  }
  $html.='</dl></dd>' x ($oldlevel - $startlevel);

  \$html;
}

# keep 'require' happy
1;

#
#
### end of Template::_thread ###################################################