#!/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;
