# =============================================================================================================
# directory listing related functions
# =============================================================================================================

use strict;
use warnings;

#--------------------------------------------------------------------------------------------------------------
# List Directory
#--------------------------------------------------------------------------------------------------------------

sub ls_dir 
{
	print "\$main::filter_use_re = $main::filter_use_re\n\$main::filter_string = $main::filter_string\n";
        my @file_list = "";
        my @dirlist = &ci_sort(&readdir($main::dir));

	$main::LISTING = 1;
	$main::hl_counter = 0;
	$main::hlist2->delete("all");
	chdir $main::dir;	# shift directory, not just list ;)
   #     $main::dir = cwd;	# avoid having ../ in dir string :)

        if($main::filter_use_re == 0) 
        {
        	$main::filter_string_escaped = &escape_string($main::filter_string);
        }
        else 
        {
        	$main::filter_string_escaped = $main::filter_string;
        }
        if($main::recr) 
        {
        	$_ = "..";
                &ls_dir_print;

	        find(\&ls_dir_print, "$main::dir");
                $main::LISTING = 0;
                $main::FIRST_DIR_LISTED = 0;
	        return;
        }
        else 
        {
        	for(@dirlist) 
        	{
                	if(-d $_) 
                	{
	                	&ls_dir_print;	# print directorys 1st
                        }
                        else 
                        {
                        	push @file_list, $_;	# push files to array
                        }
                }
                for(@file_list) 
                {
                	&ls_dir_print;		# then print the file array after all dirs have been printed
                }
                $main::LISTING = 0;
                $main::FIRST_DIR_LISTED = 0;
                return;
        }
}

#--------------------------------------------------------------------------------------------------------------
# ls_dir_print
#--------------------------------------------------------------------------------------------------------------

# this function is only called from ls_dir

sub ls_dir_print 
{
	# no vars are passed, instead we use $_
	
	$main::hlist_cwd = cwd;
	
        my $tag = "";
        my $art = "";
        my $tit = "";
        my $tra = "";
        my $alb = "";
        my $com = "";
        my $gen = "";
        my $year = "";

        if(!$_ || $_ eq "" || $_ eq ".") 
        {
        	return;
        }

# FIXME, this causes listing problem
        if($main::filter_string && &match_filter($_) == 0) 
        {
        	return;
        }

	if(-d $_) 
	{	# atm directorys are always printed
 		if($main::recr && $main::FIRST_DIR_LISTED) 
 		{
                	&nf_print("", "");
                }
                elsif($main::recr) 
                {
                     $main::FIRST_DIR_LISTED = 1;
                }
		&nf_print($_, $_);
		return;
	}


	if($_ =~ /.*\.mp3$/i && $main::id3_mode == 1) 
	{
		($tag, $art, $tit, $tra, $alb, $gen, $year, $com) = &get_tags($_);

       		if ($tag eq "id3v1") 
       		{
			&nf_print($_, $_, $art, $tit, $tra, $alb, $com, $gen, $year);
			return;
		}
	}
	&nf_print($_, $_);
}


#--------------------------------------------------------------------------------------------------------------
# Dir Dialog
#--------------------------------------------------------------------------------------------------------------

sub dir_dialog 
{
	my $old_dir = $main::dir;

	my $dd_dir = $main::mw->chooseDirectory
	(
		-initialdir=>$main::dir,
		-title=>"Choose a directory"
	);

	if($dd_dir) 
	{
		$main::dir = $dd_dir;
                chdir $main::dir;
		&ls_dir;
	}
	else 
	{
		$main::dir = $old_dir;
	}
}

1;

syntax highlighted by Code2HTML, v. 0.9.1