#!/usr/bin/perl -w


$|++;

$ROOT_DIR = "./";
#$www_DIR = "http://www.deadboots.com/muzic/music/Jerrys_stuff/";
$PATH_SEP = is_mswin_platf() ? "\\" : "/";


main();


sub main {
        html_header();
        
	local( $dir ) = $ENV{ QUERY_STRING };

        if( $dir eq "" ) {
                chdir "$ROOT_DIR";
        } else {
                chdir "$ROOT_DIR$PATH_SEP$dir";
        }

        visit_dir( "." );

        html_footer();
}


sub visit_dir {
        opendir D, $_[ 0 ];

        my( @files ) = sort readdir D;
        closedir D;

        my( @subdirs ) = ();

        my( $turn_red ) = '<font color="#000000">';
        my( $turn_blk ) = '<font color="#000000">';

        my( $drilldown ) = "";

        my( $num_dirs  ) = 0;
        my( $num_files ) = 0;

        print   "<tr><td><br>$turn_red$_[ 0 ]:$turn_blk<br></td></tr>\n";

        foreach $file( @files ) {
                local( $path ) = $_[ 0 ] eq "." ? $file
                                                : "$_[ 0 ]$PATH_SEP$file";

                ( $junk, $junk,
                        $mode, $nlink, $uid, $gid,
                  $junk,
                        $size,
                  $junk        ) = stat $path;

                if( -d _ ) {
                        if( $file ne "." and $file ne ".." ) {
                                push @subdirs, $path;

                                $num_dirs++;
                        }
                } else {
                        $num_files++;
                }
                next unless $file =~ m/.mp3$/;
                # for now, just show filename
                #
                $mode_string = get_mode_string( $mode );
                $path =~ s/ /%20/g;
                $drilldown .=   "<tr>"
                #               .       "<td>$mode_string</td>"
                #              . "    <td>$nlink</td>"
                #              . "    <td>$uid</td>"
                #               . "    <td>$gid</td>"
                #              . "    <td>$size</td>"
                              . "    <td><a href=http://www.deadboots.com/muzic/music/Jerrys_stuff/$path>$file</a></td></tr>\n";
        }

        $dir_plural  = ( $num_dirs == 1  ) ? "" : "s";
        $file_plural = ( $num_files == 1 ) ? "": "s";

        print   "<tr><td>$turn_red($num_dirs subdir$dir_plural, "
              . "$num_files file$file_plural)$turn_blk</td></tr>\n";

        print   "<tr>"
#       . "<td>MODE</td>"
           #  . "    <td>NLINK</td>"
           #   . "    <td>UID</td>"
           #    . "    <td>GID</td>"
           #   . "    <td>SIZE</td>"
              . "    <td>SONG LIST</td></tr>\n";
        #       ."@import "[URL]" ([media] ("," [media])+ )? ";" "
        print $drilldown;

        foreach $sd( @subdirs ) {
                visit_dir( $sd );
        }
}


sub get_mode_string {
        local( $mode ) = $_[ 0 ];

        # generate mode string a la "ls -l" but
        # ignore S_ISUID, S_ISGID, and S_ISVTX
        #
        local( $string ) = "";

        local( %types ) = ( 0100000 => '-',
                            0040000 => 'd',
                            0020000 => 'c',
                            0060000 => 'b',
                            0010000 => 'l'
                          );

        foreach $t( keys %types ) {
                if( $t == ( $mode & 0170000 ) ) {
                        $string .= $types{ $t };

                        last;
                }
        }

        $mode &= 0777;

        for( $num_shift = 0; $num_shift <= 2; $mode <<= 3, $num_shift++ ) {
                $string .= ( $mode & 0400 ) ? 'r' : '-';
                $string .= ( $mode & 0200 ) ? 'w' : '-';
                $string .= ( $mode & 0100 ) ? 'x' : '-';
        }

        $string;
}


sub html_header {
        print "Content-type: text/html\n\n";
        print "<html><body>\n";
#	<body bgcolor="#000000" text="#FFFF00" link="#FFFF00" vlink="#FFFF00" alink="#FFFF00">
        print "<table border=\"1\">\n";
}


sub html_footer {
        print "</table>\n";

        print "</body></html>\n";

}


sub is_mswin_platf {
        # platform is Windows if C:\ directory is present
        #
        -d "C:\\";
}


#
