#!/usr/bin/perl -X

$conf="$ENV{'HOME'}/.mplay/config";
$playlist="$ENV{'HOME'}/.mplay/playlist";
$lastPlayPos="$ENV{'HOME'}/.mplay/playpos";
$pid="$ENV{'HOME'}/.mplay/pid";
$version='mplay-0.42';
if(-f $pid)
{
	open(PID,$pid);
	$tmp=<PID>;
	close PID;
	$in=kill 0,$tmp;
	unless($in)
	{
		unlink "$pid";
		exec($0 @ARGV);
		exit;
	}
	if($ARGV[0] eq '')
	{
		if($in)
		{
			print "mplay: \e[1;34\mmplay\e[0;32\m is already running.\e[0;0m\n";
		}
		exit;

	}
	if($ARGV[0] eq '-h' || $ARGV[0] eq '--help' || $ARGV[0] eq '-help')
	{
		print "\n Usage:\t\e[31\mmplay \e[32\m<options> <path> <url>\n\n\e[32\m options \e[0\mfor mplay:\n\n\e[32\m\t-h --help \e[0\m\t\tshow this help\e[34\m\n\e[32\m\t-v --version \e[0\m\t\tshow actual version\e[34\m\n\e[32\m\t=\e[34\mplaylist-file\e[0\m\t\ttells mplay that following file is a playlist\n\e[32\m\t-e \e[34\m<path>\e[0\m\t\tto add files to current playlist\n\e[32\m\t-q --quit\e[0\m\t\tto close \e[1\mmplay\e[0\m from outside\n\nexamples:\e[31\m mplay \e[32\m=\e[34\m/root/.xmms/xmms.m3u\e[0\m to play the xmms-playlist\n\t  \e[31\mmplay \e[34\m/path/to/some/music/*.mp3\e[0\m \n\t  \e[31\mmplay \e[34\mhttp://ip:port \e[0\mlisten to a stream\n\t  \e[31\mmplay \e[32\m-e =\e[34\mmusic.m3u /music/*.mp3 http://11.11.111.1:8000\n\n\e[1\mmplay\e[0;34\m saves the position within the track last played before quitting. \nJust start without options to continue playing.\n\nWhen \e[1\mmplay\e[0;34\m is runnig press \e[31\m'h'\e[0;34\m to see the internal help \e[0;0\m\n\nEnjoy ...\n\n";exit;
	}
	elsif($ARGV[0] eq '-v' || $ARGV[0] eq '--version' || $ARGV[0] eq '-version')
	{
		print "\e[32\m$version\e[0m\n";exit;
	}
	if($ARGV[0] eq '-q' || $ARGV[0] eq '--quit' || $ARGV[0] eq '-quit')
	{
		kill QUIT,$tmp;
		print "\e[32\mmplay closed \e[31\m:'( \e[36\m*sniff* \e[34\m:-P\e[0m\n";exit;
	}
	
	@tmp=@ARGV;
	if($ARGV[0] eq '-e')
	{
		print "\e[1;34\mmplay: \e[0;32\mfiles added to playlist\e[0;0m\n";
		shift @tmp;
		open(PL,">>$playlist");
	}
	else
	{
		unlink $playlist;

		print "\e[1;34\mmplay: \e[0;32\mplaylist replaced\e[0;0m\n";
		open(PL,">$playlist");
	}
	open(PID,$pid);
	$tmp=<PID>;
	close PID;
	$max=scalar(@tmp);
	for($in=0;$in<$max;$in++)
	{
		if($tmp[$in] =~ /^\=/)
		{
			@files=split(/=/,$tmp[$in]);
			open(M,"$files[1]");
			@filesa=<M>;
			$tmp3=scalar(@filesa);
			for($i=0;$i<$tmp3;$i++)
			{
				unless($filesa[$i] =~ /^\#/)
				{
					chomp $filesa[$i];
					print PL "$filesa[$i]\n";
				}
			}
		}
		else
		{
			if($tmp[$in]=~ /^http\:\/\//)
			{
				print PL "$tmp[$in]\n";
			}
			else
			{
				find( sub {unless (-d $_ ){$abs=rel2abs("$_")} ;print PL "$abs\n"}, "$tmp[$in]" );
			}
		}
	}
	close PL;
	open(RPL,"$playlist");
	@tmp=<RPL>;
	@filesa=();
	@filesc=();
	close RPL;
	if($tmp[0] =~ /^http\:\/\// && scalar(@tmp)>1)
	{
		$in=0;$ii=0;
		for($i=0;$i<scalar(@tmp);$i++)
		{
			if($tmp[$i] =~ /^http\:\/\//)
			{
				$filesc[$in]=$tmp[$i];
				$in++;
			}
			else
			{
				$filesa[$ii]=$tmp[$i];
				$ii++;
			}
		}
		open(PL,">$playlist");
		print PL @filesa;
		print PL @filesc;
		close PL;
	}
	if($ARGV[0] eq '-e')
	{
		$in=kill USR1,$tmp;
		unless($in)
		{
			unlink "$pid";
			exec(0);
		}
	}
	else
	{
		$in=kill USR2,$tmp;
		unless($in)
		{
			unlink "$pid";
			exec(0);
		}
	}

	exit;
}
if($ARGV[0] eq '')
{
	open(RPL,"$playlist");
	open(PPL,"$lastPlayPos");
	@files = <RPL>;
	$max=scalar(@files);
	$goBack=1;
}
else
{
	if($ARGV[0] eq '-h' || $ARGV[0] eq '--help' || $ARGV[0] eq '-help')
	{
		print "\n Usage:\t\e[31\mmplay \e[32\m<options> <path> <url>\n\n\e[32\m options \e[0\mfor mplay:\n\n\e[32\m\t-h --help \e[0\m\t\tshow this help\e[34\m\n\e[32\m\t-v --version \e[0\m\t\tshow actual version\e[34\m\n\e[32\m\t=\e[34\mplaylist-file\e[0\m\t\ttells mplay that following file is a playlist\n\e[32\m\t-e \e[34\m<path>\e[0\m\t\tto add files to current playlist\n\e[32\m\t-q --quit\e[0\m\t\tto close \e[1\mmplay\e[0\m from outside\n\nexamples:\e[31\m mplay \e[32\m=\e[34\m/root/.xmms/xmms.m3u\e[0\m to play the xmms-playlist\n\t  \e[31\mmplay \e[34\m/path/to/some/music/*.mp3\e[0\m \n\t  \e[31\mmplay \e[34\mhttp://ip:port \e[0\mlisten to a stream\n\t  \e[31\mmplay \e[32\m-e =\e[34\mmusic.m3u /music/*.mp3 http://11.11.111.1:8000\n\n\e[1\mmplay\e[0;34\m saves the position within the track last played before quitting. \nJust start without options to continue playing.\n\nWhen \e[1\mmplay\e[0;34\m is runnig press \e[31\m'h'\e[0;34\m to see the internal help \e[0;0\m\n\nEnjoy ...\n\n";exit;
	}
	if($ARGV[0] eq '-v' || $ARGV[0] eq '--version' || $ARGV[0] eq '-version')
	{
		print "\e[32\m$version\e[0m\n";exit;
	}
	if($ARGV[0] eq '-q' || $ARGV[0] eq '--quit' || $ARGV[0] eq '-quit')
	{
		print "\e[32\mmplay isn't running\e[0m\n";exit;
	}
	open(PL,">$playlist");

	$max=scalar(@ARGV);
	for($i=0;$i<$max;$i++)
	{
		if ($ARGV[$i] =~ /^\=/)
		{
			@tmp=split( /=/,$ARGV[$i]);
			$files[$i]=$tmp[1];
			print "$files[$i]\n";
			open(TMP,"$files[$i]") or die $!;
			@tmp=<TMP>;
			$max=@tmp;
			for($in=0;$in<$max;$in++)
			{
				unless($tmp[$in] =~ /^\#/)
				{
					print PL "$tmp[$in]";
				}
			}
			
		}
		elsif($ARGV[$i]=~ /^http\:\/\//)
		{
			print PL "$ARGV[$i]\n";
		}
		else
		{
			find( sub {unless (-d $_ ){$abs=rel2abs("$_")} ;print PL "$abs\n"}, "$ARGV[$i]" );
		}
	}
}
close PL;
open(PID,">$pid");
print PID $$;
close PID;
open(RPL,"$playlist");
@files = <RPL>;
$max=scalar(@files);
use IO::Handle;
use IO::Socket;
use IPC::Open3 'open3';
use Time::HiRes qw(gettimeofday);
use Time::HiRes qw(sleep);
use Term::ReadKey qw(ReadLine);
use Term::ReadKey qw(GetControlChars);
use Term::ReadKey qw(GetTerminalSize);
use Term::Screen;
use MP3::Info;
use Audio::Mixer;
use File::Find;
use File::PathConvert qw(rel2abs);
#use POSIX;
$screen = Term::Screen->new();
$screen->noecho();
$SIG{'PIPE'} = \&child_handler;
$SIG{TERM} = \&parent_handler;
$SIG{HUP} = \&parent_handler;
$SIG{USR1} = \&usr1_handler;
$SIG{USR2} = \&usr2_handler;
$SIG{QUIT} = \&quit;
$SIG{CHLD} = 'IGNORE';
$|=1;
if($ENV{'TERM'} eq linux)
{
	$xterm=0;
}
else
{
	$xterm=1;
}
%keys = GetControlChars;
@colorChange=("progressbar","mp3 tag","info","track info","volume", "playbar","browser","playlist","background");
if(-f $conf)
{
	open(C,"$conf") or die $!;
	$configp=<C>;
	@config=split(/:/,$configp);
	$pbarColor=$config[0];
	$mp3TagColor=$config[1];
	$infoColor=$config[2];
	$trackInfoColor=$config[3];
	$volumeColor=$config[4];
	$playBarColor=$config[5];
	$browserColor=$config[6];
	$playListColor=$config[7];
}
else
{
	$pbarColor=34;
	$mp3TagColor=32;
	$infoColor=33;
	$trackInfoColor=31;
	$playBarColor=47;
	$volumeColor=35;
	$browserColor=34;
	$playListColor=34;
}
$bgColor=48;
if(-d "$ENV{'HOME'}/.mplay/")
{
	;
}
else
{
	mkdir "$ENV{'HOME'}/.mplay/" or die $!;
}
print  "\e[2J\e[12H";
@termsize=GetTerminalSize();
@termsize2=@termsize;

if($files[0] eq '')
{
	addfile();
}
$mpid=open3($W, $R, $E, 'mplayer','-quiet','-slave','-playlist', "$playlist");
$tmp=ReadLine -1, $R;
$tmp3=$files[0];
plainfiles($tmp3,1);
$tmp3=~ s/[\W]/\\$&/g;
while(1)
{
	if($tmp=~ /$tmp3/)
	{
		
		last;
	}
	else
	{
		$tmp=ReadLine -1, $R;
		sleep (0.001);
	}
}
@tmp=split(/\ /,$tmp);
if ($tmp=~ /\.$/)
{
	$chop=1;
}
$playText=$tmp[0];
$ik=0;
$playing=12;
@fpos=<PPL>;
$i=$fpos[0];
$ii=$i;
$in=$fpos[1];
$change=40;
$look=1;
$check=5;
$pbbar="";
$pbbart=sprintf "%0.$termsize[0]\s",$pbbar;
$volbar="";
$progressbar="====";
close(PPL);
close(C);
@filesa=@files;
@filesc=@files;
$timestat=gettimeofday;
if($goBack)
{
	if($ii>0)
	{
		syswrite $W, "pt_step $ii\n";
	}
	syswrite $W, "seek $in\n";
	$timestat=$timestat-$in;
	$check=4;
}
#$ii-=3;
if($ii<$termsize[1]-12)
{
	$playing=$ii+12;
	$ii-=$playing-12;
	refresh();print cleanlist();
}
printlist($in,$max,$ii);
$ii=$i;
print getPB();
clearbuffer();
print getVolume(pcm,9).getMP3info();
$iib=$ii;
while(1)
{
	@termsize=GetTerminalSize();
	if($termsize[1]+$termsize[0] != $termsize2[1]+$termsize2[0])
	{
		refresh();
	}
	if($key eq "")
	{
		$key='?';
	}
	elsif($key eq "kr")
	{
		syswrite $W, "seek 5 \n";
		$timestat-=5;
		$check=5;
	}
	elsif($key eq "kl")
	{
		syswrite $W, "seek -5\n";
		if($timeelapsed>=5)
		{
			$timestat+=5;
			$check=5;
		}
		else
		{
			$timestat+=$timeelapsed;
		}
	}
	elsif($key eq "n")
	{
		fchange(1,1);
		$check=5;
		$look=1;

	}
	elsif($key eq "b")
	{
		fchange(-1,-1);
		$check=5;
		$look=1;

	}
	elsif($key eq ">")
	{
		fchange(10,10);
		$check=3;
		$look=1;

	}
	elsif($key eq "<")
	{
		$check=3;
		$look=1;
		fchange(-10,-10);
	}
	elsif($key eq ".")
	{
		getVolume(pcm);
		setVolume(pcm,2);
		print clean(9).getVolume(pcm,9)."\e[10H\e[0;31m\traise volume\r\e[0;30m \r";
		if ($screen->key_pressed(0.2)){$key = $screen->getch();}
		print "\e[10H\t                \r";

	}
	elsif($key eq ",")
	{
		@vol = Audio::Mixer::get_cval('pcm');
		$volume = ($vol[0] + $vol[1]) / 2;
		setVolume(pcm,-2);
		print clean(9).getVolume(pcm,9)."\e[10H\e[0;31m\traise volume\r\e[0;30m \r";
		if ($screen->key_pressed(0.2)){$key = $screen->getch();}
		print "\e[10H\t                \r";

	}
	elsif($key eq 'k')
	{
		syswrite $W, "seek 60 \n";
		$timestat-=60;
	}
	elsif($key eq "j")
	{
		syswrite $W, "seek -60\n";
		if($timeelapsed>=60)
		{
			$timestat+=60;
		}
		else
		{
			$timestat+=$timeelapsed;
		}
	}
	elsif($key=~ /[0-9]/)
	{
		$seekpp=$key*10;
		syswrite $W, "seek $seekpp 1\n";
		$timestat=gettimeofday;$timestat-=$gt*($key*10/100);
		$check=5;
	}
	elsif($key eq 'h')
	{
		help();
	}
	elsif($key eq "kd")
	{
		if(!$browse)
		{
			$ib=$i;$ikb=$ik;$iib=$ii;$playingb=$playing;
			$browse=1;
		}
		browse(1);
	}
	elsif($key eq "ku")
	{
		if(!$browse)
		{
			$ib=$i;$ikb=$ik;$iib=$ii;$playingb=$playing;
			$browse=1;
		}
		browse(-1);
	}
	elsif($key eq "\x0D")
	{
	
		if($actuallist==1)
		{
			syswrite $W, "loadlist $playlist\npt_step $ii \n";
			$change=1;
			$check=10;
			$actuallist=0;
		}
		if(!$changb)
		{
			print "\e[0;$playListColor\m\e[$playing\H$files[$ii]\e[10H";
		}
		$changb=0;
		$tmp=$ib-$i;
		if($tmp != 0)
		{
			syswrite $W, "pt_step $tmp \nseek 0 2\n";
			$timestat=gettimeofday;
			$i=$ib;$ik=$ikb;$ii=$iib;$playing=$playingb;
			$check=5;
			$change=10;
		}
		print "\e[$playingb\H\e[01;$playListColor\m$files[$iib]\r\e[01;$playBarColor\m$files[$iib]\e[0m\e[10H";
		print getMP3info();
	}
	elsif($key eq "p")
	{
		syswrite $W, "pause\n";
		print "\33[10H\33[05;31m\t.. Pause ..\r";
		$screen->getch();
		$pausetime=gettimeofday;
		$timestat+=$pausetime-$timenow;
		print "\33[0m\t               \r";
		syswrite $W, "pause\n";
		$keyp = "";
	}
	elsif($key eq "m")
	{
		syswrite $W, "mute\n";
		if($muted == 0)
		{
			print "\33[10H\33[05;31m\t.. Mute ..\33[0m\r";
			$muted=1;
		}
		else
		{
			print "\33[10H\33[0m\t            \r";
			$muted=0;
		}
	}
	elsif($key eq "\t")
	{
		addfile();
	}
	elsif($key eq "c")
	{
		color();
	}
	elsif($key eq "x")
	{
		mixer();
	}
	elsif($key eq "del")
	{
		del();
	}
	elsif($key eq 'r')
	{
		refresh();
	}
	elsif($key eq "D")
	{
		del(1);
	}
	elsif($key eq "A")
	{
		$actuallist=1;
		open(PL,">$playlist");
		close(PL);
		@files=();@filesa=();@filesc=();
		$i=0;$ib=0;$ik=0;$ikb=0;$ii=0;$iib=0;$playingb=12;$playing=12;$max=0;
		print cleanlist();
	}
	elsif($key eq 'q' || $key eq $keys{INTERRUPT} || $key eq "\xE1")
	{
		quit();
	}
	grep_output();
	if($output ne '')
	{
		if($output=~ /$playText|XMMS/)
		{
			if(!$change)
			{
				#fchange(1);
				syswrite $W, "seek -1\n";
				$check=5;
			}
			clearbuffer();
			correct();
		}
		$key = "?";
	}
	else
	{
		$key='';if ($screen->key_pressed(0.25)){$key = $screen->getch();}
	}
	if($change>0)
	{
		$change--;
	}
	if($check>4)
	{
		$check=0;
			get_percent_pos();
			get_time_length();
			getmaxtime();
	}
	else
	{
		$check++;
	}
	$timenow=gettimeofday;
	$timeelapsed=($timenow-$timestat);
	$tehour=$timeelapsed/3600;$tehour=sprintf<%3d>,$tehour;
	$temin=($timeelapsed-$tehour*3600)/60;$temin = sprintf<:%.2d>,$temin;
	$timenow=gettimeofday;
	$tesec=$timeelapsed%60;$tesec = sprintf<:%.2d>,$tesec;
	$timeremain=$gt-($gt/100*$gpp);$timeremain /= 60;
	$timeremain = sprintf<%3dm>,$timeremain;
	$progressb=($termsize[0]-3)/100*$gpp+1; 
	$progressb=int($progressb);
	$in=$i+1;chomp $in;
	print getINF();

}
sub getINF
{
	return clean($termsize[1],$bgColor)."\e[0;$pbarColor;$bgColor\m\e[$termsize[1]\H$pbbart\e[1m\e[$progressb\G$progressbar\e[0;$infoColor\m\e[6H pos.   elapsed   remain   max length\n\r $gpp % \t\b\b$tehour$temin$tesec \e[7\H\t\t  $timeremain\e[7\H\t\t\t   $gthour$gtmin$gtsec\n\e[$trackInfoColor\m\r Track $in of $max in Playlist \e[10H\e[0;30m \r\e[0;0m";
}
sub getPB
{
	return "\e[$bgColor\m\r\e[$playing\H\e[01;$playListColor;$playBarColor\m$files[$ii]\e[0m\e[10H";
}
sub getMenuTitle
{
	if($xterm)
	{
			$tmp=$files[$ii];
			$tmp =~ s/[^a-zA-Z0-9\.\:\&\ -\(\)]/ /g;
			return chr(27).']0;'."$tmp".chr(7);
	}
}
sub getmaxtime
{
	$gthour=$gt/3600;$gthour=sprintf<%2d>,$gthour;
	$gtmin=($gt-$gthour*3600)/60;
	$gtsec=$gt%60;
	$gtsec = sprintf<:%02d>,$gtsec;
	$gtmin = sprintf<:%.2d>,$gtmin;
}
sub fchange
{
		$i+=$_[0];$ik+=$_[0];$ii+=$_[0];
		$check=0;
		$name='';
		if($actuallist==1)
		{
			$tmp=$_[0];
			if($_[0]<0)
			{
				$i-=$_[0];$ik-=$_[0];$ii-=$_[0];
				$tmp=$_[0]*(-1);
				$i+=$tmp;$ik+=$tmp;$ii+=$tmp;
			}
			syswrite $W, "loadlist $playlist\npt_step $ii \n";
			$change=1;
			$ii-=$tmp;
			$playing+=$tmp;
			$playing--;
			$actuallist=0;
			$ik=$ik+$ii-$i;
			$i=$ii;
		}
		elsif($i>=$max)
		{
			print "\33\[10H\33[31m end of playlist\33[0m\r";
			sleep(0.05);
			print "                                         \r";
			$i-=$_[0];$ik-=$_[0];$ii-=$_[0];
		}
		elsif($i<0)
		{
			$i=0;$ik=0;$ii=0;
		}
		else
		{
			
			if($ik>=$termsize[1]-12||$changb)
			{
				$playing=12;$playingb=12;
				$ib=$i;$ikb=$ik;$iib=$ii;$playingb=$playing;
				print cleanlist();
				printlist($ik,$max,$ii);

				$ii=$i;
				$ik=0;$ikb=0;
				print "\33[12\H\33[01;$playListColor;$playBarColor\m$files[$i]\33[0m\e[10H";
				syswrite $W, "pt_step $_[1] \nseek 0 2\n";
				$change=4;
				$changb=0;
				plainfiles($files[$iib],1);
				$timestat=gettimeofday;
			}
			elsif($ik<0)
			{
				$ik=$termsize[1]-13;
				$ii-=$termsize[1]-13;
				$playing=$playing-13+$termsize[1];
				if ($ii<0)
				{
					$ii=0;
					$playing=12+$i;
					$ik=$i;
					
				}
				print cleanlist();
				printlist($in,$max,$ii);
				$ii=$i;
				$termsize[1]--;
				print "\e[$playing\H\e[01;$playListColor;$playBarColor\m$files[$i]\e[0m\e[10H";$termsize[1]++;
				syswrite $W, "pt_step $_[1] \nseek 0 2\n";
				$change=4;
				
			}
			else
			{
				print clean($playing,$bgColor)."\e[$playListColor\m\e[$playing\H$files[$ii-$_[0]]\e[0;30m";
				$playing+=$_[0];
				print "\e[$playing\H\e[01;$playListColor;$playBarColor\m$files[$ii]$name\e[0;30m\e[10H \r";
				
				if($_[1] ne '')
				{
					syswrite $W, "pt_step $_[1]\nseek 0 2\n";
				}
				$change=4;
				$timestat=gettimeofday;
				sleep(0.08);
			}
		}
		print getMP3info().getMenuTitle();
}
sub browse
{
		$ib+=$_[0];$ikb+=$_[0];$iib+=$_[0];
		$check=0;
		if($ib>=$max)
		{
			$ib-=$_[0];$ikb-=$_[0];$iib-=$_[0];
		}
		elsif($ib<0)
		{
			$ib=0;$ikb=0;$iib=0;
		}
		else
		{
			
			if($ikb>=$termsize[1]-12)
			{
				$changb=1;
				print cleanlist();
				for($ikb=0;$ikb<$termsize[1]-12 && $iib<$max;$ikb++)
				{
						if($i==$iib)
						{
							print "\e[$bgColor\m\e[2K\e[$playing\H\e[$playListColor\m$files[$i]\r\e[01;$playBarColor\m$files[$i]\n\r\e[0m";
							$changb=0;
						}
						else
						{
							$files[$iib]=$filesc[$iib];
							plainfiles($files[$iib]);
							
						}
						$iib++;
				}
					$iib=$ib;
					$ikb=0;
					$playingb=$playingb+13-$termsize[1];
				print "\33[12\H\33[01;$browserColor\m$files[$ib]\33[0;30m\e[10H \r";
			}
			elsif($ikb<0)
			{
				$iib-=$termsize[1]-13;
				$ikb=$termsize[1]-13;
				$playingb=$playingb-13+$termsize[1];
				if ($iib<0)
				{
					$iib=0;
					$playingb=12+$ib;
					$playing=12+$ib+1;
					$ikb=$ib;
					
				}
				print cleanlist();
				$changb=1;
				for($in=0;$in<$termsize[1]-12 && $iib<$max;$in++)
				{
						if($i==$iib)
						{
							print "\e[$playing\H\e[$playListColor\m$files[$i]\r\e[01;$playBarColor\m$files[$i]\n\r\e[0m";
							$changb=0;
						}
						else
						{
							$files[$iib]=$filesc[$iib];
							plainfiles($files[$iib]);
							
						}
						$iib++;
				}
				
				$termsize[1]--;
				$iib=$ib;
				$in=$iib+1;
				printf "\e[$playingb\H\e[01;$browserColor\m$files[$ib]\e[0m\e[10H  \e[1;30m %.d$in\e[0;30m\e[10H\r \r";
				$termsize[1]++;
			}
			else
			{
				
				if($files[$iib-$_[0]] eq $files[$ii])
				{
					print clean($playingb,48)."\e[$playingb\H\e[01;$playListColor\m$files[$iib-$_[0]]\e[$playingb\H\e[01;$playBarColor\m$files[$iib-$_[0]]\e[0m\e[10H";
				}
				else
				{							
					print clean($playingb,48)."\e[$playListColor\m\e[$playingb\H$files[$iib-$_[0]]\e[10H";
				}
				$playingb+=$_[0];
				$files[$iib]=$filesc[$iib];
				plainfiles($files[$iib],1);
				$in=$iib+1;
				printf clean($playingb,$bgColor)."\e[$playingb\H\e[01;$browserColor\m$files[$iib]\e[10H\e[0;0m\e[1;30m %.d  $in \e[0;30m\r \r";
				
			}
		}

}
sub getMP3info
{
	$|=1;
	$filec = $filesc[$ii];
	chomp $filec;
	if($filec =~ /^http\:\/\//)
	{
		print getINF().getVolume(pcm,9);;
		#$name=1;
		if($name eq '')
		{
			@tmp=split (/http\:\/\//,$filec);
			if($tmp[1] =~ /\:/)
			{
				@tmp=split(/:/,$tmp[1]);
				$tmp[1] =~ /[0-9]+/;
				$port=$&;
				#print $port;exit;
				$ip=$tmp[0];
			}
			else
			{
				$ip=$tmp[1];
				$port=80;
			}
			$socket = IO::Socket::INET->new(PeerAddr=> $ip,PeerPort=> $port,Type=> SOCK_STREAM,Proto=> 'tcp',);
			print $socket "GET / HTTP/1.0\r\n" . "Icy-MetaData:1\r\n" . "User-Agent:\r\n\r\n" or last;
			while(1) 
			{

				$socket->recv($buf, 4096);
				if($buf =~ /icy\-br\:(.*)/) 
				{
					$bitrate=$1;
				}
				if($buf =~ /icy\-name\:(.*)/) 
				{
					$name=$1;
				}
				if($buf =~ /icy\-genre\:(.*)/) 
				{
					$genre=$1;
				}
				if($buf =~ /.*StreamTitle='(.*?)';.*/gi) 
				{
					$title=$1;
					last;
				}
				last if $in > 9;
				$in++;
			}
		}
		close($socket);
		$tmp=$termsize[0]-11;
		$tmp2="$ip$\:$port $name";
		$tmp1=sprintf cleanmp3info()."\r\e[0;$mp3TagColor\m\r\e[1H Title:   %0.$tmp\s\n\r Station: %0.$tmp\s \n\r Genre    %0.$tmp\s \n\r %d kbps          \e[$playing\H\e[01;$playListColor;$playBarColor\m%0.$termsize[0]\s\e[10H\e[0;30m \r", $title, $name, $genre, $bitrate, $tmp2;
		unless($filesc[$ii] =~ /#/)
		{
			$tmp=$name;
			chomp $filesc[$ii];
			$tmp =~ s/[\(\)\-\[\]\<\>\{\}\.\|\^\$\*\+\?\&\\]/\\$&/g;
			$filesc[$ii]="$filesc[$ii] # $tmp\n";
			open(PL,">$playlist");
			for($in=0;$in<scalar(@filesc);$in++)
			{
				print PL $filesc[$in];
			}
			@filesa=@filesc;@files=@filesc;
			close PL;
		}
	}
	else
	{
		$info = get_mp3info($filec);
		$tag=get_mp3tag($filec);
		$tmp=$termsize[0]-9;
		$tmp1=sprintf cleanmp3info()."\r\e[0;$mp3TagColor\m\r\e[1H Title:  %0.$tmp\s\n\r Artist: %0.$tmp\s \n\r Album:  %0.$tmp\s\n\r %d kbps     %d KHz\e[10H\e[0;30m \r", $tag->{TITLE}, $tag->{ARTIST}, $tag->{ALBUM}, $info->{BITRATE}, $info->{FREQUENCY};
	}
	return $tmp1;
}
sub getVolume
{
	@vol = Audio::Mixer::get_cval($_[0]);
	$volume = ($vol[0] + $vol[1]) / 2;
	$tmp2=(28)/100*$volume;
	$tmp1=substr $volbar,0,$tmp2;
	$tmp2=sprintf "\e[$volumeColor\m\e[$_[1]\H $_[0]\e[8G| \e[10\G$tmp1 \e[39G| $volume % \e[0;30m\e[10H \r";
	return $tmp2;
}
sub setVolume
{
	Audio::Mixer::set_cval($_[0],$volume+$_[1],$volume+$_[1]);
}
sub mixer
{
	@tmp=("vol","pcm","bass","treble");
	$toChange=0;
	print cleaninfo().getVolume(vol,2).getVolume(pcm,3).getVolume(bass,4).getVolume(treble,5)."\e[1m".getVolume("$tmp[$toChange]",$toChange+2);
	while(1)
	{
		if ($screen->key_pressed(120)){$key = $screen->getch();}
		if($key eq '' || $key eq 'x' || $key eq 'q')
		{
			print getMP3info().getVolume(pcm,9)."\e[0;$infoColor\m\e[6H pos.   elapsed   remain   max length\n\r $gpp % \t\b\b$tehour$temin$tesec \e[7\H\t\t  $timeremain\e[7\H\t\t\t   $gthour$gtmin$gtsec\n\r\e[$trackInfoColor\m Track $in of $max in Playlist \e[10H\e[0;30m \r";
			$key='';
			last;
		}
		elsif($key eq 'kd')
		{
			$toChange++;
			if($toChange>3)
			{
				$toChange=3;
			}
			print cleaninfo().getVolume(vol,2).getVolume(pcm,3).getVolume(bass,4).getVolume(treble,5)."\e[1m".getVolume("$tmp[$toChange]",$toChange+2);
		}
		elsif($key eq 'ku')
		{
			$toChange--;
			if($toChange<0)
			{
				$toChange=0;
			}
			print cleaninfo().getVolume(vol,2).getVolume(pcm,3).getVolume(bass,4).getVolume(treble,5)."\e[1m".getVolume("$tmp[$toChange]",$toChange+2);
		}		
		if($key eq 'kr')
		{
			if($toChange == 0)
			{
				getVolume(vol);
				setVolume(vol,2);
				print "\e[1m".getVolume(vol,2)."\e[0m";	
			}
			elsif($toChange == 1)
			{
				getVolume(pcm);
				setVolume(pcm,2);
				print "\e[1m".getVolume(pcm,3)."\e[0m";	
			}
			elsif($toChange == 2)
			{
				getVolume(bass);
				setVolume(bass,2);
				print "\e[1m".getVolume(bass,4)."\e[0m";
			}
			elsif($toChange == 3)
			{
				getVolume(treble);
				setVolume(treble,2);
				print "\e[1m".getVolume(treble,5)."\e[0m";
			}
		
		}
		if($key eq 'kl')
		{
			if($toChange == 0)
			{
				getVolume(vol);
				setVolume(vol,-2);
				print "\e[1m".getVolume(vol,2)."\e[0m";	
			}
			elsif($toChange == 1)
			{
				getVolume(pcm);
				setVolume(pcm,-2);
				print "\e[1m".getVolume(pcm,3)."\e[0m";	
			}
			elsif($toChange == 2)
			{
				getVolume(bass);
				setVolume(bass,-2);
				print "\e[1m".getVolume(bass,4)."\e[0m";
			}
			elsif($toChange == 3)
			{
				getVolume(treble);
				setVolume(treble,-2);
				print "\e[1m".getVolume(treble,5)."\e[0m";
			}
		}
	}
	print getMenuTitle();
	
}
sub correct
{
	$tmp1=$output;
	plainfiles($tmp1,1);
	if ($chop)
	{
		chop $tmp1;
	}
	$tmp2=$files[$ii];
#	$tmp1 =~ s/[\(\)\-\[\]\<\>\{\}\.\|\^\$\*\+\?\&\\]/\\$&/g;
#	$tmp2 =~ s/[\(\)\-\[\]\<\>\{\}\.\|\^\$\*\+\?\&\\]/\\$&/g;
	unless($tmp1 eq $filesc_[0])
	{
		if("$tmp1" ne "$tmp2")
		{
			if($tmp1=~ /.so/)
			{
				;
			}
			else
			{
				$in=-1;
				while($in<$max)
				{
					$in++;
					if("$tmp1" eq "$files[$in]")
					{
						$ii=$in;
						$in=$max;
						$docor=1;
					}
				}
				if($docor)
				{
					print "\e[$playListColor\m\e[$playing\H$files[$i]\e[10H";
					$playing=$playing+$ii-$i;
					$ik=$ik+$ii-$i;
					print "\e[$playing\H\33[01;$playBarColor\m$files[$ii]\e[0m\e[10H";
					$i=$ii;$ib=$i;$iib=$ii;$ikb=$ik;$playingb=$playing;
					plainfiles($files[$iib],1);
					$docor=0;
				}
			}
		}
	}
	print getMenuTitle();
}
sub refresh
{
	$pbbart=sprintf "%0.$termsize[0]\s",$pbbar;
	if($_[0] eq '')
	{
		print clearscreen()."\e[12H";
	}
	else
	{
		print cleanlist()."\e[12H";
	}
	$iia=$ii-($playing-12);
	printlist($in,$max,$iia);
	$ik=$playing-12;
	
	if ($changb)
	{
		$ikb=$ik;$ib=$i;$iib=$ii;
		$playingb=$playing;
		$changb=0;
	}
	@termsize2=@termsize;
	plainfiles($files[$iib],1);
	print "\e[1;$browserColor\m\e[$playingb\H$files[$iib]\e[10H";
	print getINF().getMP3info().getPB().getVolume(pcm,9).getMenuTitle();

}
sub plainfiles
{
	if($_[0] =~ /^http\:\/\//)
	{
		
		$_[0] =~ /http\:\/\/(.*)/;
		$tmp="$1";
		$_[0]=substr($tmp,0,$termsize[0]);
	}
	else
	{
		@splitfile=split (/\//,$_[0]);
		$tmp=scalar(@splitfile);
		$_[0]=substr($splitfile[$tmp-1],0,$termsize[0]);
	}
	chomp $_[0];
	print "\e[2K\e[$bgColor\m\e[$playListColor\m$_[0]\n\r" if ($_[1] != 1);
}
sub printlist
{
	print "\e[12H";
#	@filesa=();
#	@files=@filesc;
	if (@files == 0)
	{
		print "\e[31\mPlaylist is empty!\n\r\e[0;0m";
	}
	for($_[0]=0;$_[0]<$termsize[1]-12 && $_[2]<$_[1];$_[0]++)
	{
		$files[$_[2]]=$filesc[$_[2]];
		plainfiles($files[$_[2]]);
		$_[2]++;
	}
	print "\e[10H\e[0;30m";

}
sub clean
{
	return "\e[$_[1]\m\e[$_[0]\H\e[2K\e[12H";
}
sub cleanlist
{
		$tmp1='';
	for($in=12;$in<$termsize[1];$in++)
	{
		$tmp1.=sprintf clean($in);
	}
	return $tmp1;

}
sub cleanmp3info
{
	return "\e[6\H\e[1J";
}
sub cleaninfo
{
	return "\e[11\H\e[1J";
}
sub clearscreen
{
	return "\e[2J\e[0;0m";
}
sub get_percent_pos
{
	syswrite $W, "get_percent_pos\n";
	$gpp=ReadLine 0, $R;
	chomp $gpp;chomp $gpp;
	$gpp = substr $gpp,21,2;
	
}

sub get_time_length
{
	syswrite $W, "get_time_length\n";
	sysread $R,$gttmp, 16;@agt=split (/=/,"$gttmp");
	chomp $agt[1];
	if($agt[1]=~/[0-9]/)
	{
		$gt=$agt[1];
	}
}
sub clearbuffer {
	my $line=ReadLine -1 , $R ;

	while ($line) {
		$line=ReadLine -1 , $R  ;
	}
	$R->autoflush() ;
}
sub dirlength
{
	if($index < 0)
	{
		$index=0;
	}
	$tmp=$index;
	if($n>$termsize[1])
	{
		if($index+$termsize[1] > $n)
		{
			$p=2;
		}
		else
		{
			$p=1;
		}
	}
	else
	{
		$p=2;
	}
	for($in=0;$in<$termsize[1];$in++)
	{
	
		if($index<$n)
		{
			yn();
			$tmp1.=sprintf "\n $f[$index]$slash\r";
			$index++;
		}
	}
	$index=$tmp;
	print $tmp1;

}
sub down
{
	if($p>$termsize[1]-1)
	{
		$tmp1='';
		print clearscreen()."\e[0H";
		dirlength();
		#$p=1;
	}
	print "\e[$p\H\e[0m $f[$index]$slash\e[0m\r";
	yn(-1);
}
sub up
{
	if($p<3)
	{
		$index-=$termsize[1]-1;
		$tmp1='';
		print clearscreen()."\e[0H";
		dirlength();
		$index+=$termsize[1]-1;
		$p=$termsize[1];
	}
	print "\e[$p\H\e[0m $f[$index]$slash\e[0m\r";
	yn(1);
}
sub yn
{
	$k=$_[0];
	if(-d "$dirname$f[$index-$k]"){$slash='/'}else{$slash=''}
}
sub dir
{
	@termsize=GetTerminalSize();
	
	print clearscreen()."\e[0H";
	@f=readdir(DIR);
	@f=sort @f;
	$n=scalar(@f);
	$tmp1='';
	$index=0;$p=1;
	dirlength();
	
}
sub addfile
{
	print chr(27)."]0;Add a file/directory with 'a' or a directory recursiv with 'r' or a playlist with 'p' or an url with 'u'".chr(7);
	$dirname='/' unless defined $dirname;
	opendir(DIR,$dirname)or die $!;
	$p=1;
	dir();
	while(1)
	{


		$key=$screen->getch();
		if($key eq 'h')
		{
			help();
		}
		if($key eq 'ku')
		{
			if($index>0)
			{
				up();
				$p--;
				$index--;
				print "\e[$p\H\e[34;1m $f[$index]$slash\r\e[0;30m \r\e[0m";
			}
		}
		elsif($key eq 'kd')
		{
			unless($index>$n-2)
			{
				down();
				$p++;
				$index++;
				print "\e[$p\H\e[34;1m $f[$index]$slash\r\e[0;30m \r\e[0m";
			}

		}
		elsif($key eq 'a')
		{
			@tmp=@filesc;
			if($filesc[0] =~ /^http\:\/\//)
			{
				open(PL,">$playlist");
			}
			else
			{
				open(PL,">>$playlist");
			}
			if(-d "$dirname/$f[$index]/")
			{
				opendir(DIR,"$dirname/$f[$index]/")or die $!;
				@fi=readdir (DIR);
				@fi=sort @fi;
				@fi=grep (/\.mp3$/|/\.ogg$/|/\.wav$/,@fi);
				$m=scalar(@fi);
				for($in=0;$in<$m;$in++)
				{
					$out.=sprintf "$dirname$f[$index]/$fi[$in]\n";
				}
				print PL $out;
				$changb=1;
			}
			else
			{
				print PL "$dirname$f[$index]";
			}
			print "\e[$termsize[1]\H\e[31\m $dirname$f[$index] \e[33\madded ...\e[0\m";
			$out='';
			print PL @tmp;
			close PL;
			

			$actuallist=1;
			open(RPL,$playlist);
			@filesa = <RPL>;
			@files=@filesa;
			@filesc=@filesa;
			close RPL;
			$max=scalar(@files);
			$iia=0;
		}
		elsif($key eq 'r')
		{
			#print $filesc[0];exit;
			@tmp=@filesc;
			if($filesc[0] =~ /^http\:\/\//)
			{
				open(PL,">$playlist");
			}
			else
			{
				open(PL,">>$playlist");
			}
			#print PL @filesa;
			print "\e[$termsize[1]\H\e[31\m scaning .... please wait\e[0;30\m\r \r";
			find( sub {unless (-d $_ ){$abs=rel2abs("$_")} ;print PL "$abs\n" if (($_=~ /mp3$/) || ($_=~ /ogg$/) || ($_=~ /wav$/))}, "$dirname$f[$index]" );
			print PL @tmp;
			close PL;
			$actuallist=1;
			open(RPL,$playlist);
			@filesa = <RPL>;
			@files=@filesa;
			@filesc=@filesa;
			close RPL;
			$max=scalar(@files);
			$iia=0;
			print "\e[$termsize[1]\H\e[2\K\e[32\m done ...\e[0;30\m\r \r";
		}
		elsif($key eq 'p')
		{
			$actuallist=1;
			open(PL,">>$playlist");
			open(TMP,"$dirname$f[$index]");
			@tmp=<TMP>;
			$tmp3=@tmp;
			for($in=0;$in<$tmp3;$in++)
			{
				unless($tmp[$in] =~ /^\#/)
				{
					print PL "$tmp[$in]";
				}
			}
			close PL;
			close TMP;
			open(RPL,$playlist);
			@filesa = <RPL>;
			@files=@filesa;
			@filesc=@filesa;
			close RPL;
			$max=scalar(@files);
			print "\e[$termsize[1]\H\e[2\K\e[32\m playlist $dirname$f[$index] added ...\e[0;30\m\r \r";
		}
		elsif($key eq 'u')
		{
			$screen->echo();
			$actuallist=1;
			open(PL,">>$playlist");
			print "\e[$termsize[1]\H\e[2\K\e[32\m enter 'url' and press <ENTER>:\e[0;31\m";
			$tmp3='';
			while($key ne "\x0D")
			{
				$key=$screen->getch();
				$tmp3.=$key;
			}
#			print "\n$tmp3\n";exit;
			if($tmp3 eq '')
			{
				$actuallist=0;
			}
			else
			{
				print PL "$tmp3\n";
				close PL;
				open(RPL,$playlist);
				@filesa = <RPL>;
				@files=@filesa;
				@filesc=@filesa;
				close RPL;
				$max=scalar(@files);
				refresh();
				last;
			}
			close PL;
			#print "\e[$termsize[1]\H\e[2\K\e[32\m playlist $dirname$f[$index] added ...\e[0;30\m\r \r";

		}
		elsif($key eq "\t" || $key eq 'q')
		{
			refresh();
			last;

		}			
		if($key eq "\x0D")
		{
			if(-d "$dirname/$f[$index]/")
			{
				closedir(DIR);
				$dirname="$dirname$f[$index]/";
				opendir(DIR,$dirname)or die $!;
				$index=0;
				dir();down();
				
				print "\33[$p\H\33[34;1m $f[$index]$slash                                \33[0m\r";
			}
		}
	}


}
sub del
{
	$actuallist=1;
	open(RPL,"$playlist");
	$tmp3=$iib+1;
	@files=<RPL>;
	close(RPL);
	open(PL,">$playlist");
	for($in=0;$in<$max;$in++)
	{
		if($in == $iib)
		{
			if($_[0])
			{
				$tmp3=$files[$in];
				plainfiles($tmp3,1);
				print clean(10)."\e[10H\e[01;41\m$tmp3\e[0;31\m Press <ENTER> if you really want to delete this file from your Harddisk!!\e[0;30m\b ";
				if ($screen->key_pressed(20)){$key = $screen->getch();}
				if($key eq "\x0D")
				{
					chomp $files[$in];
					unlink "$files[$in]" or ${print clean(11).clean(10)."\e[10H\e[00;31\m you have not enough rights: \e[1\m$!\e[0;30m\r \r";if ($screen->key_pressed(5)){$key = $screen->getch();}}
										
				}
				else
				{
					print PL "$files[$in]";	
					$actuallist=0;
				}
				print clean(11).clean(10);
			}
		}
		else
		{
			print PL "$files[$in]";
		}
	}
	if($iib<$ii)
	{
		$ii--;$playing--;$i=$ii;
	}
	close(PL);
	open(RPL,$playlist);
	@filesa = <RPL>;
	@files=@filesa;
	@filesc=@filesa;
	close RPL;
	$max=scalar(@files);
	$iia=0;
	refresh(1);
	unless($_[0])
	{
		print "\e[1;31\m\e[10\H Track $tmp3 deleted from playlist\e[0;30\m\r \r";
		if ($screen->key_pressed(2)){$key = $screen->getch();}
		print "\e[11\H\e[2K\e[10\H\e[2K\e[0;30\m\r \r";
	}
}
sub grep_output
{
	$output=ReadLine -1, $R;
}
sub color
{
	if($playingb == 0)
	{
		$ib=$i;$iib=$ii;$ikb=$ik;$playingb=$playing;
	}
	$toChange=0;
	while(1)
	{
		print clean(10)."\e[10H\e[01;31m Press left/rigth to change $colorChange[$toChange] color\e[0;30m\r \r";
		if ($screen->key_pressed(7)){$key = $screen->getch();}
		if($key eq '' || $key eq 'c' || $key eq 'q')
		{
			print clean(10)."\e[30\H \r";
			last;
		}
		elsif($key eq 'r')
		{
			$pbarColor=34;
			$mp3TagColor=31;
			$infoColor=29;
			$trackInfoColor=34;
			$playBarColor=44;
			$browserColor=30;
			$playListColor=0;
			print "\e[12H";
			$iia=$ii-($playing-12);
			printlist($in,$max,$iia);
			$file=sprintf clean(2)."\33[2\H\33[0;$mp3TagColor\m$files[$ii]\e[$trackInfoColor\m\e[8H Track $i of $max in Playlist  \e[10H\e[0;30\m \r\e[0m";
			print "\33[1;$playBarColor\m\33[$playing\H$files[$ii]\e[0m$file\e[10H";
			print "\33[10H\33[0m\t                \r";
			last;
		}
		elsif($key eq 'kd')
		{
			$toChange++;
			if($toChange>7)
			{
				$toChange=0;
			}
		}
		elsif($key eq 'ku')
		{
			$toChange--;
			if($toChange<0)
			{
				$toChange=7;
			}
			
		}
		elsif($key eq 'kr')
		{
			if($toChange == 0)
			{
				$pbarColor++;
				if($pbarColor>48)
				{
					$pbarColor=30;
				}
				print getINF();
			}
			elsif($toChange == 1)
			{
				$mp3TagColor++;
				if($mp3TagColor>38)
				{
					$mp3TagColor=30;
				}
				print getMP3info;
			}
			elsif($toChange == 2)
			{
				$infoColor++;
				if($infoColor>38)
				{
					$infoColor=30;
				}
				print getINF();
			}
			elsif($toChange == 3)
			{
				$trackInfoColor++;
				if($trackInfoColor>38)
				{
					$trackInfoColor=30;
				}
				print getINF();
			}
			elsif($toChange == 4)
			{
				$volumeColor++;
				if($volumeColor>48)
				{
					$volumeColor=30;
				}
				print clean(9).getVolume(pcm,9);

			}
			elsif($toChange == 5)
			{
				$playBarColor++;
				if($playBarColor>48)
				{
					$playBarColor=30;
				}
				print "\e[0;$playListColor\m\e[$playing\H$files[$ii]\e[1;$playBarColor\m\e[$playing\H$files[$ii]\e[0m\e[10H";

			}
			elsif($toChange == 6)
			{
				$browserColor++;
				if($browserColor>48)
				{
					$browserColor=30;
				}
				print "\e[1;$browserColor\m\e[$playingb\H$files[$iib]\e[0m\e[10H";

			}
			
			else
			{
				$playListColor++;
				if($playListColor>48)
				{
					$playListColor=29;
				}
				print "\e[12H";
				$iia=$ii-($playing-12);
				printlist($in,$max,$iia);
				print "\33[1;$playBarColor\m\33[$playing\H$files[$ii]\e[0m\e[10H";

			}
		}
	elsif($key eq 'kl')
		{
			if($toChange == 0)
			{
				$pbarColor--;
				if($pbarColor<30)
				{
					$pbarColor=48;
				}
				print getINF();
			}
			elsif($toChange == 1)
			{
				$mp3TagColor--;
				if($mp3TagColor<30)
				{
					$mp3TagColor=38;
				}
				print getMP3info;
			}
			elsif($toChange == 2)
			{
				$infoColor--;
				if($infoColor<30)
				{
					$infoColor=38;
				}
				print getINF();
			}
			elsif($toChange == 3)
			{
				$trackInfoColor--;
				if($trackInfoColor<30)
				{
					$trackInfoColor=38;
				}
				print getINF();

			}
			elsif($toChange == 4)
			{
				$volumeColor--;
				if($volumeColor<30)
				{
					$volumeColor=48;
				}
				print clean(9).getVolume(pcm,9);

			}
			elsif($toChange == 5)
			{
				$playBarColor--;
				if($playBarColor<30)
				{
					$playBarColor=48;
				}
				print "\e[0;$playListColor\m\e[$playing\H$files[$ii]\e[1;$playBarColor\m\e[$playing\H$files[$ii]\e[0m\e[10H";

			}
			elsif($toChange == 6)
			{
				$browserColor--;
				if($browserColor<30)
				{
					$browserColor=48;
				}
				print "\e[1;$browserColor\m\e[$playingb\H$files[$iib]\e[0m\e[10H";

			}
			else
			{
				$playListColor--;
				if($playListColor<29)
				{
					$playListColor=48;
				}
				print "\e[12H";
				$iia=$ii-($playing-12);
				printlist($in,$max,$iia);
				print "\e[1;$playBarColor\m\e[$playing\H$files[$ii]\e[0m\e[10H";

			}
		}
	}
	getMenuTitle()
}
sub quit
{
	unlink "$pid";
	open(PPL,">$lastPlayPos");
	open(C,">$conf");
	$telapsed=int($timeelapsed);
	chomp $ii;
	print PPL "$ii\n$telapsed";
	print C "$pbarColor:$mp3TagColor:$infoColor:$trackInfoColor:$volumeColor:$playBarColor:$browserColor:$playListColor";
	close C;close PPL;
	
	$termsize[1]--;
	print "\e[0;0m\e[$termsize[1]\H\n";
	for($in=0;$in<$termsize[0]-10;$in+=2)
	{
		print "\e[34\m\e[2K\e[$in\G".' < p w m > '."\e[30\m\r \r";
		sleep 0.005;
	}
	for($in=$termsize[0]-10;$in>0;$in-=2)
	{
		print "\e[34\m\e[2K\e[$in\G".' < p w m > '."\e[30\m\r \r";
		sleep 0.005;
	}
	print "\e[0;38\m\n\n";syswrite $W, "quit\n"; exit;
}
sub parent_handler
{
	unlink "$pid";
	open(PPL,">$lastPlayPos");
	open(C,">$conf");
	$telapsed=int($timeelapsed);
	chomp $ii;
	print PPL "$ii\n$telapsed";
	print C "$pbarColor:$mp3TagColor:$infoColor:$trackInfoColor:$volumeColor:$playBarColor:$browserColor:$playListColor";
	print "\e[$termsize[1]\H\e[1;31m Aaau! Please don't hurt me .. \e[0m\n";sleep 0.3;
	print "\e[0;0m\e[$termsize[1]\H\n";syswrite $W, "quit\n"; exit;
}
sub help
{
	$tmp2='';
	print clearscreen()."\e[1H\e[0;0m";
	if($ENV{'LANG'} =~ /de/)
	{
		open(HELP,"/usr/local/share/mplay/help_de") or ${print "\e[31\mKonnte die Hilfedateien nicht finden!\nDu musst \e[32\m./install\e[31\m ausfhren um die Hilfedateien zu kopieren.";$screen->getch();last;}
	}
	else
	{
		open(HELP,"/usr/local/share/mplay/help_en") or ${print "\e[31\mCould not open help file!\nYou have to run \e[32\m./install\e[31\m to copy the help file.";$screen->getch();last;}
	}
	@help=<HELP>;
	$tmp3=scalar(@help);
	for($in=0;$in<$termsize[1]-1;$in++)
	{
		$tmp2.=sprintf "$help[$in]\r";
	}
	print "$tmp2\e[0;30m \r";
	$tmp1=$termsize[1]-1;
	while(1)
	{
		$key=$screen->getch();
		if($key eq 'ku'&& $tmp1-$termsize[1]>0)
		{
			$tmp1--;
			print "\e[1;0\m\e[1H\eM$help[$tmp1-($termsize[1]-1)]\e[$termsize[1]\H\r\e[0;30m \r";
		}
		if($key eq 'kd')
		{
			print "\e[1;0\m$help[$tmp1]\r\e[0;30m \r";
			$tmp1++ if $tmp1<$tmp3;
		}
		if($key eq 'h'||$key eq 'q')
		{
			last;
		}

	}
	close(HELP);
	refresh();
}
sub usr1_handler
{
	$actuallist=1;
	open(RPL,$playlist);
	@filesa = <RPL>;
	@files=@filesa;@filesc=@filesa;
	close RPL;
	$max=scalar(@files);
	refresh();
}
sub usr2_handler
{
	$ii=$iib;$i=$iib;
	$actuallist=0;
	open(PPL,">$lastPlayPos");
	open(C,">$conf");
	print PPL "0\n0";
	print C "$pbarColor:$mp3TagColor:$infoColor:$trackInfoColor:$volumeColor:$playBarColor:$browserColor:$playListColor";
	close C;close PPL;
	syswrite $W, "quit\n";
	unlink "$pid";
	wait;
	exec($0);
	exit;
}
sub child_handler
{
	#unlink "$pid";
	open(PPL,">$lastPlayPos");
	open(C,">$conf");
	$telapsed=int($timeelapsed);
	chomp $ii;
	print PPL "$ii\n$telapsed";
	print C "$pbarColor:$mp3TagColor:$infoColor:$trackInfoColor:$volumeColor:$playBarColor:$browserColor:$playListColor";
	close(C);
	close(PPL);
	
	if($ii<$max-1)
	{
		unlink "$pid";
		print "\e[0;31mMplayer died\ntry to restart..\e[0m\n";
		exec("$0");
		exit(-1);
	}
	else
	{
		open(PPL,">$lastPlayPos");
		print PPL "0\n0";
		close(PPL);
		$SIG{'PIPE'} = 'INGORE';
		$termsize[1]--;
		print "\e[0;0m\e[$termsize[1]\H\n";
		$tmp=0.5;
		$tmp1=($tmp-0.005)/($termsize[0]-18);
		for($in=0;$in<$termsize[0]-18;$in++)
		{
			print "\e[32\m\e[2K\e[$in\G".' <End of playlist> '."\e[30\m\r \r";
			if ($screen->key_pressed($tmp)){last;}
			$tmp=$tmp-$tmp1;
		}
		for($in=$termsize[0]-18;$in>0;$in--)
		{
			print "\e[34\m\e[2K\e[$in\G".' <End of playlist> '."\e[30\m\r \r";
			if ($screen->key_pressed($tmp)){last;}
			$tmp=$tmp*1.03;
		}
		while(1)
		{
			if ($screen->key_pressed(600)){$key = $screen->getch();}
			if($key eq 'q' || $key eq $keys{INTERRUPT})
			{
				quit();
			}
		}
	}
	
}
sub stop_handler
{
	exit;
}
