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