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