#!/usr/bin/perl -w
use CGI;
use strict;
use HTML::Menu::TreeView;
my $q         = new CGI;
my $TreeView  = new HTML::Menu::TreeView();
my $subfolder = defined $q->param('subfolder') ? $q->param('subfolder') : $TreeView->documentRoot() . "/";
my $style     = $q->param('style') ? $q->param('style') : 'Crystal';
my $size      = defined $q->param('size') ? $q->param('size') : 16;
my @tree      = recursiveReadDir($subfolder);
$TreeView->Style($style);
$TreeView->columns(
                   $q->a(
                         {
                          href  => "./columns.pl?style=$style&amp;size=$size&amp;sort=1",
                          class => "treeviewLink$size"
                         },
                         'Name'
                     )
                     . '&#160;',
                   $q->a(
                         {
                          href  => "./columns.pl?style=$style&amp;size=$size&amp;byColumn=0",
                          class => "treeviewLink$size"
                         },
                         'Size'
                     )
                     . '&#160;',
                   $q->a(
                         {
                          href  => "./columns.pl?style=$style&amp;size=$size&amp;byColumn=1",
                          class => "treeviewLink$size"
                         },
                         'Permission'
                     )
                     . '&#160;',
                   $q->a(
                         {
                          href  => "./columns.pl?style=$style&amp;size=$size&amp;byColumn=2",
                          class => "treeviewLink$size"
                         },
                         'Last Modified'
                     )
                     . '&#160;'
);
if    (defined $q->param('byColumn')) {$TreeView->orderByColumn($q->param('byColumn'));}
elsif ($q->param('sort'))             {$TreeView->sortTree(1);}
$TreeView->size($size);
$TreeView->border(1);
$TreeView->clasic(1) if (defined $q->param('clasic'));
my $zoom = $q->div(
                   {style => "font-size:$size px;"},
                   $q->a(
                         {
                          href  => './columns.pl?style=Crystal&amp;size=16',
                          class => "treeviewLink$size"
                         },
                         '16'
                     )
                     . '&#160;|&#160;'
                     . $q->a(
                             {
                              href  => './columns.pl?style=Crystal&amp;size=22',
                              class => "treeviewLink$size"
                             },
                             '22'
                     )
                     . '&#160;|&#160;'
                     . $q->a(
                             {
                              href  => './columns.pl?style=Crystal&amp;size=32',
                              class => "treeviewLink$size"
                             },
                             '32'
                     )
                     . '&#160;|&#160;'
                     . $q->a(
                             {
                              href  => './columns.pl?style=Crystal&amp;size=48',
                              class => "treeviewLink$size"
                             },
                             '48'
                     )
                     . '&#160;|&#160;'
                     . $q->a(
                             {
                              href  => './columns.pl?style=Crystal&amp;size=64',
                              class => "treeviewLink$size"
                             },
                             '64'
                     )
                     . '&#160;|&#160;'
                     . $q->a(
                             {
                              href  => './columns.pl?style=Crystal&amp;size=64',
                              class => "treeviewLink$size"
                             },
                             '128'
                     )
                     . '&#160;|&#160;'
                     . $q->a(
                             {
                              -href  => './columns.pl?style=simple&amp;size=16',
                              -class => "treeviewLink$size"
                             },
                             'simple'
                     )
);
print($q->header,
      $q->start_html(
                     -title  => 'Columns',
                     -script => $TreeView->jscript() . $TreeView->preload(),
                     -style  => {-code => $TreeView->css()},
      ),
      $q->div({align => 'center'}, $zoom . $q->br() . $TreeView->Tree(\@tree)),
      $q->end_html
);

sub recursiveReadDir
{
    my $dir = shift;
    chomp($dir);
    opendir(DIR, "$dir") or die ":$dir $!";
    my @files = readdir(DIR);
    closedir(DIR);
    my @t;
    for (my $i = 0; $i <= $#files; $i++) {
        unless ($files[$i] =~ /^\./) {
            use File::stat;
            my $sb = stat($dir . $files[$i]);
            unless (-d $dir . $files[$i]) {
                push @t,
                  {
                    text    => $files[$i],
                    columns => [sprintf("%s", $sb->size), sprintf("%04o", $sb->mode & 07777), sprintf("%s", scalar localtime $sb->mtime)],
                  };
            } else {
                my @st = recursiveReadDir("$dir$files[$i]/");
                push @t,
                  {
                    text    => "$files[$i]",
                    subtree => [@st],
                    href    => "./columns.pl?style=$style&amp;size=$size&amp;subfolder=$dir$files[$i]/",
                    columns => [sprintf("%s", $sb->size), sprintf("%04o", $sb->mode & 07777), sprintf("%s", scalar localtime $sb->mtime)]
                  };
            }
        }
    }
    return @t;
}
1;
