#!/usr/bin/perl -X

$conf="$ENV{'HOME'}/.mplay/config";
$lastPlayPos="$ENV{'HOME'}/.mplay/playpos";
open(PPL,"$lastPlayPos");
@tmp=<PPL>;
$plnr=$tmp[2];chomp $plnr;close PPL;
if($plnr eq '')
{
	$plnr="00";
}
$playlist="$ENV{'HOME'}/.mplay/playlist$plnr";
#print $playlist;exit;
$pid="$ENV{'HOME'}/.mplay/pid";
$remote="$ENV{'HOME'}/.mplay/.remote";
$version='mplay-0.57';
use Term::ReadKey;
if(-f $pid)
{
	open(PID,$pid);
	$tmp=<PID>;
	close PID;
	$in=kill 0,$tmp;
	unless($in)
	{
		unlink "$pid";
		exec($0);
		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\e[34\m|\e[32\murl>\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\e[32\m\t-n --next\e[0\m\t\tplay next track\n\e[32\m\t-b --back\e[0\m\t\tplay previous track\n\t \e[34\msecs\e[0\m\t\t\tseek xx seconds forward\n\e[32\m\t-\e[34msecs\e[0\m\t\t\tseek xx seconds backward\n\nexamples:\e[31\m mplay \e[32\m=\e[34\m/root/.xmms/xmms.m3u\e[0;37\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;37\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\t\e[31\m  mplay  \e[34\m33 \e[0;37\mseek 33 seconds forward\n\t\e[31\m  mplay \e[32\m-\e[34\m11 \e[0;37\mseek 11 seconds backward\n\n\e[1;34\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;
	}
	elsif($ARGV[0] eq '-q' || $ARGV[0] eq '--quit' || $ARGV[0] eq '-quit')
	{
		kill "TERM",$tmp;
#		open(R,">$remote");
#		print R 'q';
#		close R;
		print "\e[32\mmplay closed\e[0m\n";exit;
	}
	elsif($ARGV[0] eq '-n' || $ARGV[0] eq '--next')
	{
		open(R,">$remote");
		print R 'n';
		close R;
		print "\e[32\mnext track\e[0m\n";exit;
	}
	elsif($ARGV[0] eq '-b' || $ARGV[0] eq '--back')
	{
		open(R,">$remote");
		print R 'b';
		close R;
		print "\e[32\mprevious track\e[0m\n";exit;
	}
	elsif($ARGV[0] =~ /^-?[0-9]+/)
	{
		open(R,">$remote");
		print R $ARGV[0];
		close R;
		print "\e[32\mseek $ARGV[0] seconds\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 0,$tmp;
		if($in)
		{
			open(R,">$remote");
			print R 'a';
			close R;
		}
		else
		{
			unlink "$pid";
			exec($0);
		}

	}
	else
	{
		$in=kill 0,$tmp;
		if($in)
		{
			#exit;
			open(R,">$remote");
			print R 'r';
			close R;
		}
		else
		{
			unlink "$pid";
			exec($0);
		}
	}

	ReadMode 1;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\e[34\m|\e[32\murl>\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\e[32\m\t-n --next\e[0\m\t\tplay next track\n\e[32\m\t-b --back\e[0\m\t\tplay previous track\n\t \e[34\msecs\e[0\m\t\t\tseek xx seconds forward\n\e[32\m\t-\e[34msecs\e[0\m\t\t\tseek xx seconds backward\n\nexamples:\e[31\m mplay \e[32\m=\e[34\m/root/.xmms/xmms.m3u\e[0;37\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;37\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\t\e[31\m  mplay  \e[34\m33 \e[0;37\mseek 33 seconds forward\n\t\e[31\m  mplay \e[32\m-\e[34\m11 \e[0;37\mseek 11 seconds backward\n\n\e[1;34\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;
	}
	elsif($ARGV[0] =~ /^\-/)
	{
		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 plainfiles($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 MP3::Info;
use Audio::Mixer;
use File::Find;
use File::PathConvert qw(rel2abs);
use POSIX ":sys_wait_h";
$SIG{PIPE} = \&child_handler;
$SIG{TERM} = \&parent_handler;
$SIG{HUP} = \&parent_handler;
$SIG{CHLD} = 'IGNORE';
$|=1;
if($ENV{'TERM'} eq linux)
{
	$xterm=0;
}
else
{
	$xterm=1;
}

@colorChange=("progressbar","mp3 tag","info","track info","volume", "playbar","browser","playlist","clock");
if(-f $conf)
{
	open(C,"$conf") or die $!;
	$tmp=<C>;
	close(C);
	@tmp=split(/:/,$tmp);
	$pbarColor=$tmp[0];
	$mp3TagColor=$tmp[1];
	$infoColor=$tmp[2];
	$trackInfoColor=$tmp[3];
	$volumeColor=$tmp[4];
	$playBarColor=$tmp[5];
	$browserColor=$tmp[6];
	$playListColor=$tmp[7];
	$clockColor=$tmp[8];
	$shortView=$tmp[9];
	if($shortView)
	{
		$cLine=2;
		$plbLine=4;
	}
	else
	{
		$cLine=10;
		$plbLine=12;
	}

}
else
{
	$pbbart=sprintf "%0.$termsize[0]\s",$pbbar;
	$pbarColor=34;
	$mp3TagColor=32;
	$infoColor=33;
	$trackInfoColor=31;
	$playBarColor=47;
	$volumeColor=35;
	$browserColor=34;
	$playListColor=34;
	$clockColor=37;
}
if(-d "$ENV{'HOME'}/.mplay/")
{
	;
}
else
{
	mkdir "$ENV{'HOME'}/.mplay/" or die $!;
}
print  "\e[2J\e[$plbLine\H";
@termsize=GetTerminalSize();
@termsize2=@termsize;
ReadMode 4;
if($files[0] eq '')
{
	addfile();
}
&open;
sub open
{
	$mpid=open3($W, $R, $E, 'mplayer','-quiet','-slave','-playlist', "$playlist");
}
$tmp=ReadLine -1, $R;
$tmp3=$files[0];
$tmp3 =~ s/[\(\)\-\[\]\<\>\{\}\.\|\^\$\*\+\?\&\\]/\\$&/g;
chomp $tmp3;
chop $tmp3;
chomp $tmp;
#print "$mpid\n";
while(1)
{
	if($tmp=~ /$tmp3/)
	{
		
		last;
	}
	else
	{
		$tmp=ReadLine -1, $R;
		$tmp2++;
		#print "$tmp\r";
		if($tmp2>2000)
		{last;}
		sleep (0.001);
	}
}
#print "$tmp3\n$tmp\n\r";quit();
@tmp=split(/\ /,$tmp);
if ($tmp=~ /\.$/)
{
	$chop=1;
}
$playText=$tmp[0];

$ik=0;
$playing=$plbLine;
@fpos=<PPL>;
$i=$fpos[0];
$ii=$i;
$in=$fpos[1];
$change=40;
$look=1;
$check=5;
$pbbar="--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------";
$volbar="";
$progressbar="====";
close(PPL);
@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]-$plbLine)
{
	$playing=$ii+$plbLine;
	refresh();
	$ii-=$playing-$plbLine;
}
else
{
	refresh();
}
system("setterm -cursor off");
if($actuallist)
{
	$actuallist=0;
}
else
{
	getFileTime();
}
#printlist($in,$max,$ii);
#resetList();
$ii=$i;
print getPB();
clearbuffer();
print getVolume(pcm,9).getMP3info();
$iib=$ii;
			$ib=$i;$ikb=$ik;$iib=$ii;$playingb=$playing;
			$browse=1;

while(1)
{
	if($test)
	{
		if(waitpid(-1,WNOHANG) > 0)
		{
			&test;
			$test=0;
			$SIG{CHLD}= 'IGNORE';
		}
	}
	@termsize=GetTerminalSize();
	if($termsize[1]+$termsize[0] != $termsize2[1]+$termsize2[0])
	{
		refresh();
	}
	if($key eq "")
	{
		$key='?';
	}
	elsif($key eq "Right")
	{
		syswrite $W, "seek 5\n";
		$timestat-=5;
		$check=5;
	}
	elsif($key eq "Left")
	{
		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,3);
		print getVolume(pcm,9)."\e[$cLine\H\e[0;31m\t\traise volume\r\e[0;0m \r";
		$key=readKey(0.2);
		print "\e[$cLine\H\t\t            \r";

	}
	elsif($key eq ",")
	{
		@vol = Audio::Mixer::get_cval('pcm');
		$volume = ($vol[0] + $vol[1]) / 2;
		setVolume(pcm,-3);
		print getVolume(pcm,9)."\e[$cLine\H\e[0;31m\t\treduce volume\r\e[0;0m \r";
		$key=readKey(0.2);
		print "\e[$cLine\H\t\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'||$key eq 'k1')
	{
		help();
	}
	elsif($key eq "Down")
	{
#		if(!$browse)
#		{
#			$ib=$i;$ikb=$ik;$iib=$ii;$playingb=$playing;
#			$browse=1;
#		}
		browse(1);
	}
	elsif($key eq "Up")
	{
#		if(!$browse)
#		{
#			$ib=$i;$ikb=$ik;$iib=$ii;$playingb=$playing;
#			$browse=1;
#		}
		browse(-1);
	}
	elsif($key eq "\n")
	{
	
		if($actuallist==1)
		{
			syswrite $W, "loadlist $playlist\npt_step $iib \n";
			$change=10;
			print "\e[$playing\H".plainfiles($files[$ii],0,$playListColor)."\e[$cLine\H";
			$i=$ib;$ik=$ikb;$ii=$iib;$playing=$playingb;
			$actuallist=0;
			clearbuffer();
		}
		elsif(!$changb)
		{
			print "\e[$playing\H".plainfiles($files[$ii],0,$playListColor)."\e[$cLine\H";
		}
		$changb=0;
		$tmp=$ib-$i;
		if($tmp != 0)
		{
			syswrite $W, "pt_step $tmp \nseek -1\n";
			$timestat=gettimeofday;
			$i=$ib;$ik=$ikb;$ii=$iib;$playing=$playingb;
			$check=5;
			$change=10;
		}
		print "\e[$playingb\H\e[1\m".plainfiles($files[$iib],$playBarColor,$browserColor)."\e[0m\e[$cLine\H";
		print getMP3info();
	}
	elsif($key eq "p")
	{
		syswrite $W, "pause\n";
		print "\e[$cLine\H\e[05;31m\t .. Pause ..\r";
		readKey();
		$pausetime=gettimeofday;
		$timestat+=$pausetime-$timenow;
		print "\e[0m\t            \r";
		syswrite $W, "pause\n";
		$keyp = "";
	}
	elsif($key eq "m")
	{
		syswrite $W, "mute\n";
		if($muted == 0)
		{
			print "\e[$cLine\H\e[05;31m\t .. Mute ..\e[0m\r";
			$muted=1;
		}
		else
		{
			print "\e[$cLine\H\e[0m\t           \r";
			$muted=0;
		}
	}
	elsif($key eq "k2"||$key eq "\x14")
	{
		switchPlayList();
	}
	elsif($key eq "\x0E")
	{
		createNewPlayList();
	}
	elsif($key eq "\t")
	{
		addfile();
	}
	elsif($key eq "c")
	{
		color();
	}
	elsif($key eq "x")
	{
		mixer();
	}
	elsif($key eq "Del")
	{
		del();
	}
	elsif($key eq 's')
	{
		sort_playlist();
	}
	elsif($key eq "\x12")
	{
		$name='';
		refresh();
	}
	elsif($key eq "e")
	{
		fileInfo();
	}
	elsif($key eq "\x04")
	{
		del(1);
	}
	elsif($key eq "\x13")
	{
		saveList();
	}
	elsif($key eq "Pos1")
	{
		browse(-$ib);
	}
	elsif($key eq "z")
	{
		if($shortView)
		{
			$cLine=10;
			$plbLine=12;
			$shortView=0;
			resetList();
		}
		else
		{
			$cLine=2;
			$plbLine=4;
			$shortView=1;
			resetList();
		}
		refresh();
	}
#	elsif($key eq "End")
#	{
#		$i=$max-1;$ib=$max-1;$ik=0;$ikb=0;$ikb=0;$ii=$max-1;$iib=$max-1;$playingb=12;$playing=12;
#		browse($max-$ib-1);
#	}
	elsif($key eq "\x01")
	{
		$actuallist=1;
		print cleanlist();
		unlink "$playlist";
		@files=();@filesa=();@filesc=();
		$i=0;$ib=0;$ik=0;$ikb=0;$ii=0;$iib=0;$playingb=$plbLine;$playing=$plbLine;$max=0;
		unless($plnr eq "00")
		{
			if($plnr eq "01")
			{
				$plnr="00";
			}
			else
			{
				$plnr--;
				$plnr=sprintf "%02d",$plnr;
			}
			$playlist="$ENV{'HOME'}/.mplay/playlist$plnr";
			open(RPL,"$playlist");
			@filesc=();
			@filesc=<RPL>;
			@files=@filesc;@filesa=@filesc;
			$max=scalar(@filesc);
			refresh();
		}
	}
	elsif($key eq 'q' || $key eq "\x03"|| $key eq "Esc")
	{
		quit();
	}
	grep_output();
	if($output ne '')
	{
		if($output=~ /$playText|XMMS/)
		{
			if(!$change)
			{
				fchange(1);
				syswrite $W, "seek -1\n";
				$check=5;
			}
			clearbuffer();
			correct(1);
		}
		$key = "?";
	}
	else
	{
		$key='';$key=readKey("0.25");
		#$screen->flush_input();
	}
	if($change>0)
	{
		$change--;
	}
	if($check>4)
	{
		$check=0;
		get_percent_pos();
		get_time_length();
		getmaxtime();
		($_,$tmp2,$tmp3)=localtime(time);
		$time=sprintf "%.2d:%.2d",$tmp3,$tmp2;
#		print clean(9).getVolume(pcm,9);
	}
	else
	{
		$check++;
	}
	checkRemote();
	$timenow=gettimeofday;
	$timeelapsed=($timenow-$timestat);
	$tehour=$timeelapsed/3600;$tehour=sprintf<%2d>,$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;
	$in=$i+1;chomp $in;
	print getINF().getVolume(pcm,9);
}
sub checkRemote
{
	if(-f "$remote")
	{
		remote();
	}
}
sub getINF
{
	$tmp6=$termsize[0]-8;
	if($shortView)
	{
		$_=$i+1;
		$progressb=($termsize[0]-20)/100*$gpp+10;
		$progressb=int($progressb);
		$tmp5=$tmp6-23;
		return "\e[$termsize[1]\H\e[0;$pbarColor\m\e[10\G$pbbart\e[1m\e[$progressb\G$gpp%\r\e[1;$infoColor\m$tehour$temin$tesec\e[$tmp6\G$gthour$gtmin$gtsec\e[0;$trackInfoColor\m\e[2H\e[$tmp5\G $_/$max in $plnr \e[1;$infoColor\m\e[$tmp6\G$totalTime\e[3\H\e[0;$clockColor\m$dis $time \e[$cLine\H\e[0;0m \r\e[0;0m";
	}
	else
	{
		$progressb=($termsize[0]-3)/100*$gpp+1; 
		$progressb=int($progressb);
		$_=$i+1;
		return clean($termsize[1])."\e[0;$pbarColor\m\e[$termsize[1]\H$pbbart\e[1m\e[$progressb\G$progressbar\e[0;$infoColor\m\e[6\H pos.   elapsed   remain   length     total\n\r\e[1m $gpp \e[5G%\e[8\G$tehour$temin$tesec \e[19\G$timeremain\e[27\G$gthour$gtmin$gtsec\e[38\G$totalTime\n\e[0;$trackInfoColor\m\r Track $_ of $max in Playlist $plnr  \e[0;$clockColor\m\e[11\H$dis\e[6\H\e[$tmp6\G   $time\e[$cLine\H\e[0;0m \r\e[0;0m";
	}
}
sub getPB
{
	return "\r\e[$playing\H".plainfiles($files[$ii],$playBarColor,1)."\e[0m\e[$cLine\H";
}
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\[$cLine\H\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]-$plbLine||$changb)
			{
				$playing=$plbLine;$playingb=$plbLine;
				$ib=$i;$ikb=$ik;$iib=$ii;$playingb=$playing;
				print cleanlist();
				printlist($ik,$max,$ii);

				$ii=$i;
				$ik=0;$ikb=0;
				print "\e[$plbLine\H".plainfiles($files[$i],$playBarColor,1)."\e[0m\e[$cLine\H";
				syswrite $W, "pt_step $_[1] \nseek 0 2\n";
				$change=4;
				$changb=0;
				$timestat=gettimeofday;
			}
			elsif($ik<0)
			{
				$ik=$termsize[1]-($plbLine+1);
				$ii-=$termsize[1]-($plbLine+1);
				$playing=$playing-($plbLine+1)+$termsize[1];
				if ($ii<0)
				{
					$ii=0;
					$playing=$plbLine+$i;
					$ik=$i;
					
				}
				#print cleanlist();
				#printlist($in,$max,$ii);
				resetList();refresh(1);
				#$ii=$i;
				#$termsize[1]--;
				#print plainfiles($files[$i])."\e[0m\e[$cLine\H";$termsize[1]++;
				syswrite $W, "pt_step $_[1] \nseek 0 2\n";
				$change=4;
				
			}
			else
			{
				print "\e[$playing\H".plainfiles($files[$ii-$_[0]],0,$playListColor)."\e[0;0m";
				$playing+=$_[0];
				if($files[$iib+$_[0]] eq $files[$ii])
				{
					$tmp6=$playing-$_[0];
					print "\e[$tmp6\H".plainfiles($files[$ii-$_[0]],$browserColor,1)."$name\e[0;0m\e[$cLine\H \r"."\e[$playing\H".plainfiles($files[$ii],$playBarColor,1)."$name\e[0;0m\e[$cLine\H \r";
				}
				elsif($iib == $ii)
				{
					print "\e[$playing\H\e[1m".plainfiles($files[$ii],$browserColor,$playBarColor)."$name\e[0;0m\e[$cLine\H \r";
				}
				else
				{
					print "\e[$playing\H".plainfiles($files[$ii],$playBarColor,1)."$name\e[0;0m\e[$cLine\H \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]-$plbLine)
			{
				$changb=1;
				print cleanlist();
				for($ikb=0;$ikb<$termsize[1]-$plbLine && $iib<$max;$ikb++)
				{
						if($i==$iib)
						{
							print "\e[2K\e[$playing\H".plainfiles($files[$i],$playBarColor,1)."\e[0m";
							$changb=0;
						}
						else
						{
							$files[$iib]=$filesc[$iib];
							print plainfiles($files[$iib],0,$playListColor);
							
						}
						$iib++;
				}
					$iib=$ib;
					$ikb=0;
					$playingb=$playingb+($plbLine+1)-$termsize[1];
					$in=$ib+1;
				printf "\e[$playingb\H".plainfiles($files[$ib],$browserColor,1)."\e[0m\e[$cLine\H  \e[1;0m %.d$in\e[0;0m\e[$cLine\H\r \r";
			}
			elsif($ikb<0)
			{
				$iib-=$termsize[1]-($plbLine+1);
				$ikb=$termsize[1]-($plbLine+1);
				$playingb=$playingb-($plbLine+1)+$termsize[1];
				if ($iib<0)
				{
					$iib=0;
					$playingb=$plbLine+$ib;
					$playing=$plbLine+$ib+1;
					$ikb=$ib;
					
				}
				print cleanlist();
				$changb=1;
				for($in=0;$in<$termsize[1]-$plbLine && $iib<$max;$in++)
				{
						if($i==$iib)
						{
							print "\e[2K\e[$playing\H".plainfiles($files[$i],$playBarColor,1)."\e[0m";
							$changb=0;
						}
						else
						{
							$files[$iib]=$filesc[$iib];
							print plainfiles($files[$iib],0,$playListColor);
							
						}
						$iib++;
				}
				
				$termsize[1]--;
				$iib=$ib;
				$in=$iib+1;
				printf "\e[$playingb\H".plainfiles($files[$ib],$browserColor,1)."\e[0m\e[$cLine\H  \e[1;0m %.d$in\e[0;0m\e[$cLine\H\r \r";
				$termsize[1]++;
			}
			else
			{
				
				if($files[$iib-$_[0]] eq $files[$ii])
				{
					print "\e[$playingb\H".plainfiles($files[$iib-$_[0]],1,$playBarColor)."\e[0m\e[$cLine\H";
				}
				else
				{							
					print "\e[$playingb\H".plainfiles($files[$iib-$_[0]],0,$playListColor)."\e[$cLine\H";
				}
				$playingb+=$_[0];
				$files[$iib]=$filesc[$iib];
				#plainfiles($files[$iib],1);
				$in=$iib+1;
				if($files[$iib] eq $files[$ii])
				{
#					print "\e[$playingb\H".plainfiles($files[$iib],1,$playBarColor)."\e[0m\e[$cLine\H";
					$tmp6=
					printf "\e\H\e[$playingb\H\e[1\m".plainfiles($files[$iib],$browserColor,$playBarColor)."\e[$cLine\H\e[0;0m\e[1;0m %.d $in \e[0;0m\r \r";
				}
				else
				{
					printf "\e[$playingb\H".plainfiles($files[$iib],$browserColor,1)."\e[$cLine\H\e[0;0m\e[1;0m %.d  $in \e[0;0m\r \r";
				}
				
			}
		}

}
sub getMP3info
{
	$filec = $filesc[$ii];
	chomp $filec;
	if($filec =~ /^http\:\/\//)
	{
		print getINF().getVolume(pcm,9);
#		$name=1;
		if($name eq '')
		{
			@tmp=();
			@tmp=split (/http\:\/\//,$filec);
			if($tmp[1] =~ /\:/)
			{
				@tmp=split(/:/,$tmp[1]);
				$port=$tmp[1];
				$port=~ /([0-9]*)(.*)/;
				$port=$1;
				$path=$2;
				if($path =~ /(.*) \#/)
				{
					$path=$1;
				}
				if($path eq '')
				{
					$path='/';
				}
				$ip=$tmp[0];
			}
			else
			{
				$ip=$tmp[1];
				$port=80;
			}
			#print "\e[$cLine\H\e[2K\e[31;1\m $ip:$port$path";
			$socket = IO::Socket::INET->new(PeerAddr=> $ip,PeerPort=> $port,Type=> SOCK_STREAM,Proto=> 'tcp',);
			if($socket eq undef)
			{
				print "\e[$cLine\H\e[0;31m\e  Could not connect .... \e[0;0m\r \r";
				$key=readKey(2);
				print "\e[$cLine\H\e[2\K\e[11\H\e[2\K\e[$cLine\H\e[0;0\m \r";
				return;
			}
			else
			{
				print $socket "GET $path HTTP/1.0\r\n" . "Icy-MetaData:1\r\n" . "User-Agent:\r\n\r\n" or last;

				$buf='';$in=0;$tmp='';
				while(1) 
				{
					$socket->recv($tmp, 1024);
					$buf.=$tmp;
					if($buf =~ /icy\-br\:(.*)/) 
					{
						$br=sprintf "%4d",$1;
						$bitrate="kbps\e[11\G$1";
					}
					if($buf =~ /ice\-audio\-info:(.*)/) 
					{
						$bitrate="audio:\e[11\G$1";
					}
					if($buf =~ /ic.\-name\:(.*)/) 
					{
						$name=$1;
					}
					if($buf =~ /ic.\-genre\:(.*)/) 
					{
						$genre=$1;
					}
					if($buf =~ /.*StreamTitle='(.*?)';/)
					{
						$title="\e[11\G$1";
						last;
					}
					if($buf =~ /.*TITLE\=([\x27-\x79\s]*)/i)
					{
						$title="\e[12\G$1";
						last;
					}
					$key = readKey(-1);
					if($key eq "Esc")
					{
						last;
					}
					last if $in > 109;
					$in++;
				}
			}
			close($socket);
		}
		$tmp2="$ip$\:$port$path # $name";
		if($shortView)
		{
			$tmp=$termsize[0]-4;
			$title=~/[A-Za-z].*/;
			$title=$&;
			$tmp1=sprintf clean(1)."\r\e[0;$mp3TagColor\m\r\e[1H %0.$tmp\s\r\e[$tmp\G%s\e[$cLine\H\e[0;0m \r", "$title - $genre", $br;
		}
		else
		{
			$tmp=$termsize[0]-11;
			$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 %s\e[$playing\H\e[01;$playListColor;$playBarColor\m%0.$termsize[0]\s\e[$cLine\H\e[0;0m \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;
		if($shortView)
		{
			$tmp1=sprintf clean(1)."\r\e[0;$mp3TagColor\m\r\e[1H %0.$tmp\s - %0.$tmp\s - %0.$tmp\s \e[$tmp\G %3d kbps\e[0;0m \r", $tag->{ARTIST}, $tag->{TITLE}, $tag->{ALBUM},$info->{BITRATE};
		}
		else
		{
			$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[$cLine\H\e[0;0m \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;
	$volume=sprintf "%3d",$volume;
	if($shortView)
	{
		$tmp6=$termsize[0]-4;
		$tmp5=$tmp6-10;
		$tmp2=sprintf "\e[$volumeColor\m\e[2\H\e[$tmp5\G$volume% \e[0;0m\e[$cLine\H \r";
	}
	else
	{
		$tmp2=(28)/100*$volume;
		$tmp1=substr $volbar,0,$tmp2;
		$tmp2=sprintf "\e[$volumeColor\m\e[$_[1]\H\e[0\K $_[0]\e[8G| \e[10\G$tmp1 \e[39G| $volume % \e[0;0m\e[$cLine\H \r";
		return $tmp2;
	}
}
sub setVolume
{
	Audio::Mixer::set_cval($_[0],$volume+$_[1],$volume+$_[1]);
}
sub mixer
{
	$tmp6=$shortView;
	$shortView=0;
	@tmp=("vol","pcm","bass","treble");
	$toChange=0;
	print cleaninfo().getVolume(vol,2).getVolume(pcm,3).getVolume(bass,4).getVolume(treble,5)."\e[1\m".getVolume("$tmp[$toChange]",$toChange+2);
	while(1)
	{
		$key=readKey(120);
		if($key eq '' || $key eq 'x' || $key eq 'q' || $key eq "Esc")
		{
			$shortView=$tmp6;
			print "\e[2\H\e[2\K".getINF();refresh(1);
			$key='';
			last;
		}
		elsif($key eq 'Down')
		{
			$toChange++;
			if($toChange>3)
			{
				$toChange=0;
			}
			print cleaninfo().getVolume(vol,2).getVolume(pcm,3).getVolume(bass,4).getVolume(treble,5)."\e[1m".getVolume("$tmp[$toChange]",$toChange+2);
		}
		elsif($key eq 'Up')
		{
			$toChange--;
			if($toChange<0)
			{
				$toChange=3;
			}
			print cleaninfo().getVolume(vol,2).getVolume(pcm,3).getVolume(bass,4).getVolume(treble,5)."\e[1m".getVolume("$tmp[$toChange]",$toChange+2);
		}		
		if($key eq 'Right')
		{
			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 'Left')
		{
			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;
	if($tmp1 =~ /^$playText.*/)
	{
		@tmp=split(/$playText\ /,$tmp1);
		$tmp1=$tmp[1];
	}
	
	chomp $tmp1;
	if ($chop)
	{
		chop $tmp1;
	}
	$tmp2=$filesc[$ii];
#	$tmp1 =~ s/[\(\)\-\[\]\<\>\{\}\.\|\^\$\*\+\?\&\\]/\\$&/g;
#	$tmp2 =~ s/[\(\)\-\[\]\<\>\{\}\.\|\^\$\*\+\?\&\\]/\\$&/g;
	chomp $tmp2;
	if($_[0])
	{
		$tmp3=$filesc[0];
		chomp $tmp3;
	}
	else
	{$tmp3='??';}
	unless($tmp1 eq $tmp3)
	{
		if("$tmp1" ne "$tmp2")
		{
			#print "\e[31m\tmp1=$tmp1\n\r\tmp2=$tmp2\n\r";quit();
			unless($tmp1=~ /.so/)
			{
				$in=-1;
				while($in<$max-1)
				{
					$in++;
					$tmp=$files[$in];
					chomp $tmp;
					if("$tmp1" eq "$tmp")
					{
						$ii=$in;
						$in=$max;
						$docor=1;
					}
				}
				if($docor)
				{
#					print "\e[$playing\H".plainfiles($files[$i],0,$playListColor);
#					$playing=($ii%($termsize[1]-$plbLine))+$plbLine;
#					$ik=$playing-$plbLine;
#					print "\e[$playing\H".plainfiles($files[$ii],$playBarColor,1);
#					$i=$ii;$ib=$i;$iib=$ii;$ikb=$ik;$playingb=$playing;
					$docor=0;
					resetList();
					refresh(1);
				}
			}
		}
	}
	print getMenuTitle();$output='';
}
sub refresh
{
	$tmp6=$termsize[0];
	if($shortView)
	{
		$tmp6-=18;
		$pbbart=sprintf "%0.$tmp6\s",$pbbar;
		$tmp6+=11;
		$dis=sprintf "%0.$tmp6\s",$pbbar;
	}
	else
	{
		$pbbart=sprintf "%0.$termsize[0]\s",$pbbar;
		$dis=sprintf "%0.$tmp6\s",$pbbar;
	}
	if($_[0] eq '')
	{
		print clearscreen()."\e[$plbLine\H";
	}
	else
	{
		print cleanlist()."\e[$plbLine\H";
	}
	$iia=$ii-($playing-$plbLine);
	printlist($in,$max,$iia);
	$ik=$playing-$plbLine;
	
	if ($changb)
	{
		$ikb=$ik;$ib=$i;$iib=$ii;
		$playingb=$playing;
		$changb=0;
	}
	@termsize2=@termsize;
	#plainfiles($files[$iib],1);
	if($ii == $iib)
	{
		print "\e[$cLine\H".getINF().getMP3info().getPB().getVolume(pcm,9).getMenuTitle()."\e[$playingb\H\e[1\m".plainfiles($files[$iib],$browserColor,$playBarColor);
	}
	else
	{
		print "\e[$playingb\H".plainfiles($files[$iib],$browserColor,1)."\e[$cLine\H".getINF().getMP3info().getPB().getVolume(pcm,9).getMenuTitle();
	}

}
sub resetList
{
	$playing=($ii%($termsize[1]-$plbLine))+$plbLine;
	$ik=$playing-$plbLine;
	$i=$ii;$ib=$i;$iib=$i;$ikb=$ik;$playingb=$playing;
}
sub test
{
	$tmp1=0;$tmp2=0;@tmp=();
	for($in=0;$in<$max;$in++)
	{
		unless($filesc[$in] =~ /^http\:\/\//)
		{
			if($time{$filesc[$in]} eq "")
			{
				sysread OUT, ($tmp),10;
				$time{$filesc[$in]}="$tmp\r";
				chomp $time{$filesc[$in]};
				chop $time{$filesc[$in]} if substr $time{$filesc[$in]},length($time{$filesc[$in]}),1 eq ' ';
			}
			$time{$filesc[$in]} =~ /[0-9]{2,3}\:[0-9]{2}/;
			@tmp=split /:/,$&;
			$tmp1+=$tmp[0];
			$tmp2+=$tmp[1];
		}
	}
	if($tmp1 == 0 && $tmp2 == 0)
	{
		$totalTime="";
	}
	else
	{
		$tmp3=($tmp1*60+$tmp2)/3600;$tmp3=sprintf<%2d>,$tmp3;
		$tmp4=(($tmp1*60+$tmp2)-($tmp3*3600))/60;$tmp4=sprintf<:%.2d>,$tmp4;
		$tmp5=($tmp1*60+$tmp2)%60;$tmp5 = sprintf<:%.2d>,$tmp5;
		$totalTime="$tmp3$tmp4$tmp5";
	}
	print clean($cLine);refresh(1);#print "\e[7H\e[38\G$totalTime\e[0;0m\e[$cLine\H \r";

}
sub getFileTime
{
	$SIG{CHLD}= '';
	pipe OUT, IN;
	$tmp=fork();
	if($tmp==0)
	{
		open(PID,$pid);
		$tmp2=<PID>;
		close PID;
		for($in=0;$in<$max;$in++)
		{
			$tmp4=kill 0,$tmp2;
			if($tmp4 == 0)
			{
				exit;
			}
			else
			{
				unless($filesc[$in] =~ /^http\:\/\//)
				{
					if($time{$filesc[$in]} eq "")
					{
						$tmp=($in/$max*100);
						$tmp1=$tmp/100*($termsize[0]-1);
						$tmp1=int($tmp1);
						$_=int($termsize[0]/2-1);
						$tmp6=$cLine+1;
						$tmp5=$termsize[0]-58;
						$tmp4=substr $pbbar,0,$tmp1;
						printf "\e[$tmp6\H\e[0;$clockColor\m$tmp4\e[0;41\m-\e[0;31\m\e[$_\G%d%\e[$cLine\H\e[$tmp5\Gscanning time of MP3's\e[0;0m\e[$cLine\H \r",$tmp;
						$tmp3=$filesc[$in];
						chomp $tmp3;
						$tmp = get_mp3info($tmp3);
						$tmp1 = sprintf "%s",$tmp->{TIME};
						$tmp1 .="\e[0\m";
						while(length($tmp1)<10)
						{
							$tmp1=" ".$tmp1;
						}
						$time{$filesc[$in]}="$tmp1";
						syswrite IN, $time{$filesc[$in]};
					}

				}
			}
		}
		exit;
	}
	else
	{
		$test=1;
	}
}
sub plainfiles
{
	$tmp=$_[0];
#	$tmp4='';
	chomp $tmp;
	$tmp =~ s/\\//g;
	if($tmp =~ /^http\:\/\//)
	{
		
		$tmp =~ /http\:\/\/(.*)/;
		$tmp3="$1";
		$tmp=substr($tmp3,0,$termsize[0]);
	}
	else
	{
		@splitfile=split (/\//,$tmp);
		$tmp3=scalar(@splitfile);
		$tmp5=$termsize[0]-7;
		$tmp=sprintf "%0.$tmp5\s",$splitfile[$tmp3-1];
	}
	if ($_[1] eq "nocolor")
	{
		$tmp6='';
		for($ib=0;$ib<scalar(@splitfile)-1;$ib++)
		{	
			$tmp6.="$splitfile[$ib]/"
		}
		if($_[0] =~ /^http\:\/\//)
		{
			return $_[0];
		}
		else
		{
			return "$tmp#split#$tmp6";
		}
	}
	$tmp4=$termsize[0]-6;
	$tmp5=sprintf "\e[$playListColor;$_[1];$_[2]\m\e[2K$tmp\e[$tmp4\G%7s\n\r",$time{$_[0]};
	return $tmp5;
}
sub printlist
{
	print "\e[$plbLine\H";
#	@filesa=();
#	@files=@filesc;
	if (@files == 0)
	{
		print "\e[31\mPlaylist is empty!\n\r\e[0;0m";
	}
#		print @files;exit;
	for($_[0]=0;$_[0]<$termsize[1]-$plbLine && $_[2]<$_[1];$_[0]++)
	{
		$tmp6=$filesc[$_[2]];
		print plainfiles($tmp6,0,$playListColor);
		$_[2]++;
	}
	print "\e[$cLine\H\e[0;0m";

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

}
sub cleanmp3info
{
	return "\e[6\H\e[1J";
}
sub cleaninfo
{
	return "\e[10\H\e[1J";
}
sub clearscreen
{
	return "\e[2J\b\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();
			$tmp3=$termsize[0]-2;
			$tmp1.=sprintf "\n %0.$tmp3\s$slash\r",$f[$index];
			$index++;
		}
	}
	$index=$tmp;
	print $tmp1;

}
sub down
{
	if($p>$termsize[1]-1)
	{
		$tmp1='';
		print clearscreen()."\e[0H";
		dirlength();
		#$p=1;
	}
	$tmp3=$termsize[0]-2;
	printf "\e[$p\H\e[0m %0.$tmp3\s$slash\e[0m\r",$f[$index];
	yn(-1);
}
sub up
{
	if($p<3)
	{
		$index-=$termsize[1]-1;
		$tmp1='';
		print clearscreen()."\e[0H";
		dirlength();
		$index+=$termsize[1]-1;
		$p=$termsize[1];
	}
	$tmp3=$termsize[0]-2;
	printf "\e[$p\H\e[0m %0.$tmp3\s$slash\e[0m\r",$f[$index];
	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();
	unless($index>$n-2)
	{
		down();
		$p++;
		$index++;
		$tmp3=$termsize[0]-2;
		printf "\e[$p\H\e[34;1m %0.$tmp3\s$slash\r\e[0;0m \r\e[0m",$f[$index];
	}
	while(1)
	{
		$key=readKey();
		if($key eq 'h')
		{
			help();
		}
		if($key eq 'Up')
		{
			if($index>0)
			{
				up();
				$p--;
				$index--;
				$tmp3=$termsize[0]-2;
				printf "\e[$p\H\e[34;1m %0.$tmp3\s$slash\r\e[0;0m \r\e[0m",$f[$index];
			}
		}
		elsif($key eq 'Down')
		{
			unless($index>$n-2)
			{
				down();
				$p++;
				$index++;
				$tmp3=$termsize[0]-2;
				printf "\e[$p\H\e[34;1m %0.$tmp3\s$slash\r\e[0;0m \r\e[0m",$f[$index];
			}

		}
		elsif($key eq 'a')
		{
			@tmp=@filesc;
			if($filesc[0] =~ /^http\:\/\//)
			{
				open(PL,">$playlist");
			}
			else
			{
				@tmp=();
				open(PL,">>$playlist");
			}
			if(-d "$dirname/$f[$index]/")
			{
				opendir(DIR,"$dirname/$f[$index]/")or die $!;
				@files=();
				@files=readdir (DIR);
				@files=sort @files;
				@files=grep (/\.mp3$/|/\.ogg$/|/\.wav$/,@files);
				for($in=0;$in<scalar(@files);$in++)
				{
					$out.=sprintf "$dirname$f[$index]/$files[$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')
		{
			if($filesc[0] =~ /^http\:\/\//)
			{
				@tmp=@filesc;
				open(PL,">$playlist");
			}
			else
			{	
				@tmp=();
				open(PL,">>$playlist");
			}
			#print PL @filesa;
			print "\e[$termsize[1]\H\e[31\m scaning .... please wait\e[0;0\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;0\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;0\m\r \r";
		}
		elsif($key eq 'u')
		{
			$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 "\n")
			{
				$key=readKey();
				if($key eq "Esc")
				{
					refresh();
					$actuallist=0;
					return;
				}
				elsif($key eq "Backspace")
				{
					chop $tmp3;
				}
				else
				{
					$tmp3.=$key;
				}
				print "\e[33\G\e[0\K$tmp3";
			}
			chop $tmp3;
			if($tmp3 eq '')
			{
				refresh();
				$actuallist=0;
				return;
			}
			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;
		}
		elsif($key eq "\t" || $key eq 'q' || $key eq "Esc")
		{
			print "\e[0;0;0\m";
			refresh();
			$key='';
			last;

		}			
		if($key eq "\n")
		{
			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";
			}
		}
	}
	if($actuallist)
	{
		getFileTime();
		resetList();
		refresh();
	}
}
sub saveList
{
		print "\e[$cLine\H\e[1;32\m Enter a filename to save playlist (e.g. /tmp/mplay.m3u): ";
		$tmp3='';
		while($key ne "\n")
		{
			$key=readKey();
			if($key eq "Esc")
			{
				$tmp3=$cLine+1;
				print "\e[$cLine\H\e[2\K\e[$tmp3\H\e[2\K\e[$cLine\H\e[0;0\m \r";
				return;
			}
			elsif($key eq "Backspace")
			{
				chop $tmp3;
			}
			else
			{
				$tmp3.=$key;
			}
			print "\e[59\G\e[0\K$tmp3";
		}
		open(F,">$tmp3");
		print F "#EXTM3U\n";
		for($in=0;$in<scalar(@filesc);$in++)
		{
			print F $filesc[$in];
		}
		close F;
		print "\e[$cLine\H\e[2\K\e[11\H\e[2\K\e[$cLine\H\e[0;0\m \r";
}
sub del
{
	$actuallist=1;
	open(RPL,"$playlist");
	@files=<RPL>;
	close(RPL);
	open(PL,">$playlist");
	for($in=0;$in<$max;$in++)
	{
		if($in == $iib)
		{
			if($_[0])
			{
				print "\e[$cLine\H".plainfiles($files[$in],41,1)."\e[0;31\m Press <ENTER> if you really want to delete this file from your Harddisk!!\e[0;0m\b ";
				$key=readKey(20);
				if($key eq "\n")
				{
					chomp $files[$in];
					unlink "$files[$in]" or ${print clean($cLine+1).clean($cline)."\e[$cLine\H\e[00;31\m failed!: \e[1\m$!\e[0;0m\r \r";$key=readKey(5);}
										
				}
				else
				{
					print PL "$files[$in]";	
					$actuallist=0;
				}
				print clean($cLine+1).clean($cLine);
			}
		}
		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);
	$tmp3=$iib+1;
	unless($_[0])
	{
		print "\e[1;31\m\e[$cLine\H Track $tmp3 deleted from playlist\e[0;0\m\r \r";
		$key=readKey(0.1);
		print "\e[11\H\e[2K\e[$cLine\H\e[2K\e[0;0\m\r \r";
	}
}
sub sort_playlist
{
	@tmp=("by Date - ascending","by Date - descending","by Path + Filename ascending","by Path + Filename descending","by Filename ascending","by Filename descending");
	$toChange=0;
#	print cleaninfo()."\e[2\K\e[32\m\e[2\H $tmp[0]\n\r $tmp[1]\n\r $tmp[2]\n\r $tmp[3]\n\r";
	while(1)
	{
		$tmp3=$toChange+3;
		print cleaninfo()."\e[1\H\e[32\m Choose and then press \e[31\mEnter \e[32\mto sort \e[32\m\e[3\H $tmp[0]\n\r $tmp[1]\n\r $tmp[2]\n\r $tmp[3]\n\r $tmp[4]\n\r $tmp[5]\n\r\e[$tmp3\H\e[7\m $tmp[$toChange]\e[0;0m\e[$cLine\H\e[0;0\m \r";
		$key=readKey(120);
		if($key eq '' || $key eq 's' || $key eq 'q' || $key eq "Esc")
		{
			refresh();
			$key='';
			last;
		}
		elsif($key eq "\n")
		{
			print "\e[0;0;0\m";
			$tmp4="$filesc[$ii]";
			if($toChange == 0)
			{
				sortSub(1,1);
			}
			elsif($toChange == 1)
			{
				sortSub(1,0);
			}
			elsif($toChange == 2)
			{
				sortSub(0,1);
			}
			elsif($toChange == 3)
			{
				sortSub(0,0);
			}
			elsif($toChange == 4)
			{
				sortSub(2,1);
			}
			else
			{
				sortSub(2,0);
			}
			for($in=0;$in<scalar(@filesc);$in++)
			{
				#print "\e[31m$filesc[$in]\n\r";
				$tmp5=$filesc[$in];
				chomp $tmp5;
				chomp $tmp4;
				if("$tmp5" eq "$tmp4")
				{
					#print "\e[31\mtmp5=$tmp5\n\rtmp4=$tmp4\n\rii=$in\n\r";quit();
					$ii=$in;
					#$in=
					resetList();
					refresh();
					last;
				}
				
			}
			#print "\e[31m$tmp4\n\rHallo";
			last;
		}
		elsif($key eq 'Down')
		{
			$toChange++;
			if($toChange>5)
			{
				$toChange=0;
			}
		}
		elsif($key eq 'Up')
		{
			$toChange--;
			if($toChange<0)
			{
				$toChange=5;
			}
		}
		$key='';
	}
}
sub sortSub
{
	$output=$filesc[$ii];
	if($_[0] == 1)
	{
		@tmp=@filesc;
		@files=();
		for($in=0;$in<scalar(@tmp);$in++)
		{
			chomp $tmp[$in];
			$tmp1=(stat("$tmp[$in]"))[9];
			$tmp2 = POSIX::strftime("%Y%m%d%H%M", localtime($tmp1));
			$files[$in]="$tmp2 $tmp[$in]";
		}
	}
	elsif($_[0] == 2)
	{
		@tmp=@filesc;
		@files=();
		for($in=0;$in<scalar(@tmp);$in++)
		{
			$files[$in]=plainfiles($filesc[$in],"nocolor");
		}
	}
	@tmp=();
	if($_[1])
	{
		sortInc();
	}
	else
	{
		sortDec();
	}
	if($_[0] == 2)
	{
		@files=@tmp;
		@tmp=();
		for($in=0;$in<scalar(@files);$in++)
		{
			if($files[$in] =~ /http\:\/\//)
			{
				$files[$in] =~ /http\:\/\/(.*)/;
				$tmp[$in]="http://$1";
			}
			else
			{
				@splitfile=split(/\#split\#/,$files[$in]);
				$tmp[$in]="$splitfile[1]$splitfile[0]";
			}
		}
	}
	for($in=0;$in<scalar(@tmp);$in++)
	{
			$tmp[$in] =~ s/^[0-9]* //g;
			chomp $tmp[$in];

	}
 	while($tmp[0] =~ /^http\:\/\//)
	{
		$tmp6=shift @tmp;
		push @tmp,$tmp6;
	}
	open(PL,">$playlist");
	for($in=0;$in<scalar(@tmp);$in++)
	{
			print PL "$tmp[$in]\n";

	}
	close PL;
	open(RPL,"$playlist");
	@tmp=<RPL>;
	close RPL;
	@filesc=@tmp;
	@files=@filesc;
	@filesa=@filesc;
	correct();
	refresh();
	$actuallist=1;
}
sub sortInc
{
	@tmp=sort {$a cmp $b} @files;
}
sub sortDec
{
	@tmp=sort {$b cmp $a} @files;
}
sub fileInfo
{
	$filec = $filesc[$iib];
	if($filec =~ /\.mp.$/)
	{
		@tmp=("TITLE", "ARTIST", "ALBUM", "YEAR", "COMMENT", "GENRE", "SAVE", "CANCEL");
		chomp $filec;
		$info = get_mp3info($filec);
		$tag=get_mp3tag($filec);
		$tmp=$termsize[0]-9;
		$toChange=0;
		$tmp3=31;
		@tmp1=($tag->{TITLE}, $tag->{ARTIST}, $tag->{ALBUM}, $tag->{YEAR}, $tag->{COMMENT}, $tag->{GENRE});
		$tmp5=$info->{MODE};
		if($tmp5 == 0)
		{
			$tmp5="stereo";
		}
		elsif($tmp5 == 1)
		{
			$tmp5="joint stereo";
		}
		elsif($tmp5 == 2)
		{
			$tmp5="dual channel";
		}
		elsif($tmp5 == 3)
		{
			$tmp5="single channel";
		}
		else{$tmp5="Unknow";}
		printf "\e[2J\e[10\HPress \e[32\m[CTRL+S]\e[0;0m to save or \e[31\m[ESC]\e[0;0m to abort\e[9\H\e[55\G\e[1;4\mID3-Info\e[0;0\m\n\n\e[47\GMPEG audio version : %s\n\e[55\GMPEG layer : %s\n\e[53\Gchannel mode : $tmp5\n\e[50\Gboolean for VBR : %s\n\e[58\Gbitrate : %s\n\e[49\Gfrequency in kHz : %s\n\e[52\Gtime in MM:SS : %s\n\e[33\Gboolean for audio is copyrighted : %s\n\e[32\Gboolean for MP3 frames are padded : %s\n\e[37\Gapproximate number of frames : %s\n\e[36\Gapproximate length of a frame : %s\n\e[40\GVBR scale from VBR header : %s\n\e[44\Gbytes in audio stream : %s",$info->{VERSION},$info->{LAYER},$info->{VBR},$info->{BITRATE},$info->{FREQUENCY},$info->{TIME},$info->{COPYRIGHT},$info->{PADDING},$info->{FRAMES},$info->{FRAME_LENGTH},$info->{VBR_SCALE},$info->{SIZE};
		while(1)
		{
			printf "\r\e[0;0\m\r\e[1\H   FILE : $filec\e[3\H  title : %0.$tmp\s\n artist : %0.$tmp\s\n  album : %0.$tmp\s\n   year : %0.$tmp\s\ncomment : %0.$tmp\s\n  genre : %0.$tmp\s\r",$tmp1[0],$tmp1[1],$tmp1[2],$tmp1[3],$tmp1[4],$tmp1[5];
			$tmp2=$toChange+3;
			printf "\e[$tmp2\H\e[32\m%7s : \e[0;$tmp3\m%s\e[0\K\e[$mp3TagColor;0\m",$tmp[$toChange],$tmp1[$toChange];
			$key=readKey(120);
			if($key eq '' || $key eq 'e' || $key eq 'q' || $key eq "Esc")
			{
				refresh();
				$key='';
				last;
			}
			if($key eq 'Down')
			{
				$toChange++;
				if($toChange>5)
				{
					$toChange=0;
				}
			}
			elsif($key eq 'Up')
			{
				$toChange--;
				if($toChange<0)
				{
					$toChange=5;
				}
			}
			elsif($key eq "Del")
			{
				$tmp1[$toChange]='';
			}
			elsif($key eq "\x13")
			{
				set_mp3tag("$filec", $tmp1[0], $tmp1[1], $tmp1[2], $tmp1[3], $tmp1[4], $tmp1[5], ) or ${print "\e[11\H\e[31\m ERROR: $!";sleep 2;last};
				print "\e[11\H\e[32\m Saved succesfully";sleep 1;last;

			}
			else
			{
				if($key eq "End")
				{
					$tmp4=$tmp1[$toChange];
					$key='';
				}
				else{$tmp4=''};
				while(1)
				{
					if($key eq "Esc"||$key eq "\n"||$key eq "Up"||$key eq "Down")
					{
						$tmp1[$toChange]=$tmp4 unless $tmp4 eq '' || $key eq "Esc";
						last;
					}
					elsif($key eq "Backspace")
					{
						chop $tmp4;
					}
					elsif($key eq "\x13")
					{
						$tmp1[$toChange]=$tmp4 unless $tmp4 eq '';
						set_mp3tag("$filec", $tmp1[0], $tmp1[1], $tmp1[2], $tmp1[3], $tmp1[4], $tmp1[5], ) or ${print "\e[11\H\e[31\m ERROR: $!";sleep 2;last};
						print "\e[11\H\e[32\m Saved succesfully";sleep 1;refresh();return '';
					}
					else
					{
						$tmp4.=$key;
					}
					printf "\e[$tmp2\H%7s : \e[41\m%s\e[0\K\e[$mp3TagColor;0\m",$tmp[$toChange],$tmp4;
					$key=readKey(120);
				}
			}
			$key='';
		}
		refresh();
	}
}
sub createNewPlayList
{
	while(-f "$ENV{'HOME'}/.mplay/playlist$plnr")
	{
		$plnr++;
	}
	$playlist="$ENV{'HOME'}/.mplay/playlist$plnr";
	print cleanlist();
}
sub switchPlayList
{
	$playingInPlaylist{"$plnr"}="$i,$ii,$ik,$playing,$ib,$iib,$ikb,$playingb";
	$plnr++;
	unless(-f "$ENV{'HOME'}/.mplay/playlist$plnr")
	{
		$plnr="00";
		$playlist="$ENV{'HOME'}/.mplay/playlist$plnr";
		refresh(1);
	}
	if(!$playingInPlaylist{"$plnr"})
	{
		$playingInPlaylist{"$plnr"}="0,0,0,$plbLine,0,0,0,$plbLine";
	}
#	else
#	{
		split(/,/,$playingInPlaylist{"$plnr"});
		($i,$ii,$ik,$playing,$ib,$iib,$ikb,$playingb)=@_;
#	}
	$playlist="$ENV{'HOME'}/.mplay/playlist$plnr";
	open(RPL,"$playlist");
	@filesc=();
	@filesc=<RPL>;
	@files=@filesc;@filesa=@filesc;
	$max=@filesc;
	$actuallist=1;
	save();
	getFileTime();
	refresh(1);
}
sub grep_output
{
	$output=ReadLine -1, $R;
}
sub readKey
{
        $x2 = ReadKey $_[0];
	$x=ord($x2) ;
	if($x == 27)
	{
		$x =ReadKey -1;
		if($x eq undef)
		{
			ReadKey -1;
			ReadKey -1;
			$x="Esc";
			return $x;
		}
		$x=ord($x);
		$x2=ReadKey -1;
		$x2=ord($x2);
		if($x == 91)
		{
			if($x2 == 51)
			{
				$x="Del";
			}
			elsif($x2 == 65)
			{
				$x="Up";
			}
			elsif($x2 == 66)
			{
				$x="Down";
			}
			elsif($x2 == 67)
			{
				$x="Right";
			}
			elsif($x2 == 68)
			{
				$x="Left";
			}
			elsif($x2 == 70)
			{
				$x="End";
			}
			elsif($x2 == 72)
			{
				$x="Pos1";
			}
			elsif($x2 == 50)
			{
				$x="Ins";
			}
			else{$x='';}
			ReadKey -1;
			ReadKey -1;
		}
		elsif($x == 79)
		{
			if($x2 == 80)
			{
				$x="k1";
			}
			elsif($x2 == 81)
			{
				$x="k2";
			}
			else{$x='';}
			ReadKey -1;
			ReadKey -1;
		}

	}
	elsif($x == 127)
	{
		$x="Backspace";
	}
	else
	{
		$x=$x2;
	}
	return $x;
}
sub color
{
	if($playingb == 0)
	{
		$ib=$i;$iib=$ii;$ikb=$ik;$playingb=$playing;
	}
	$toChange=0;
	if($shortView)
	{
		$cLine++;
	}
	while(1)
	{
		print clean($cLine)."\e[$cLine\H\e[01;31m Press left/rigth to change $colorChange[$toChange] color\e[0;0m\r \r";
		if($shortView)
		{
			print "\e[3\H\e[$clockColor\m\e[$termsize[0]\G\b\b\b\b\b$time\e[0;0m\r \r";
		}
		$key=readKey(7);
		if($key eq '' || $key eq 'c' || $key eq 'q'|| $key eq 'Esc')
		{
			print "\e[$cLine\H\e[2K \r";
			last;
		}
		elsif($key eq 'r')
		{
			$pbarColor=34;
			$mp3TagColor=31;
			$infoColor=29;
			$trackInfoColor=34;
			$playBarColor=44;
			$browserColor=30;
			$playListColor=0;
			refresh();
			last;
		}
		elsif($key eq 'Down')
		{
			$toChange++;
			if($toChange>8)
			{
				$toChange=0;
			}
		}
		elsif($key eq 'Up')
		{
			$toChange--;
			if($toChange<0)
			{
				$toChange=8;
			}
			
		}
		elsif($key eq 'Right')
		{
			if($toChange == 0)
			{
				$pbarColor++;
				if($pbarColor>48)
				{
					$pbarColor=30;
				}
				print getINF();
			}
			elsif($toChange == 1)
			{
				$mp3TagColor++;
				if($mp3TagColor>48)
				{
					$mp3TagColor=30;
				}
				print getMP3info;
			}
			elsif($toChange == 2)
			{
				$infoColor++;
				if($infoColor>48)
				{
					$infoColor=30;
				}
				print getINF();
			}
			elsif($toChange == 3)
			{
				$trackInfoColor++;
				if($trackInfoColor>48)
				{
					$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[$playing\H".plainfiles($files[$ii],$playBarColor,1)."\e[0m\e[$cLine\H";

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

			}
			elsif($toChange == 7)
			{
				$playListColor++;
				if($playListColor>48)
				{
					$playListColor=29;
				}
				print "\e[$plbLine\H";
				$iia=$ii-($playing-$plbLine);
				printlist($in,$max,$iia);
				print "\e[$playingb\H".plainfiles($files[$iib],1,$browserColor)."\e[0;0m\e[$playing\H".plainfiles($files[$ii],1,$playBarColor)."\e[0m\e[$cLine\H";
			}
			else
			{
				$clockColor++;
				if($clockColor>48)
				{
					$clockColor=30;
				}
				print getINF();

			}
		}
		elsif($key eq 'Left')
		{
			if($toChange == 0)
			{
				$pbarColor--;
				if($pbarColor<30)
				{
					$pbarColor=48;
				}
				print getINF();
			}
			elsif($toChange == 1)
			{
				$mp3TagColor--;
				if($mp3TagColor<30)
				{
					$mp3TagColor=48;
				}
				print getMP3info;
			}
			elsif($toChange == 2)
			{
				$infoColor--;
				if($infoColor<30)
				{
					$infoColor=48;
				}
				print getINF();
			}
			elsif($toChange == 3)
			{
				$trackInfoColor--;
				if($trackInfoColor<30)
				{
					$trackInfoColor=48;
				}
				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[$playing\H".plainfiles($files[$ii],$playBarColor,1)."\e[0m\e[$cLine\H";

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

			}
			elsif($toChange == 7)
			{
				$playListColor--;
				if($playListColor<29)
				{
					$playListColor=48;
				}
				print "\e[$plbLine\H";
				$iia=$ii-($playing-$plbLine);
				printlist($in,$max,$iia);
				print "\e[$playingb\H".plainfiles($files[$iib],$browserColor,1)."\e[0;0m\e[$playing\H".plainfiles($files[$ii],$playBarColor,1)."\e[0m\e[$cLine\H";

			}
			else
			{
				$clockColor--;
				if($clockColor<30)
				{
					$clockColor=48;
				}
				print getINF();

			}
		}
	}
	if($shortView)
	{
		$cLine--;
	}
	getMenuTitle()
}
sub remote
{
	open(R,"$remote");
	$tmp=<R>;
	close R;
	unlink "$remote";
	chomp $tmp;
	if($tmp eq 'q')
	{
		quit();
	}
	elsif($tmp eq 'a')
	{
		add_list();
	}
	elsif($tmp eq 'r')
	{
		replace_handler();
	}
	elsif($tmp eq 'n')
	{
		fchange(1,1);
		$check=5;
		$look=1;
	}
	elsif($tmp eq 'b')
	{
		fchange(-1,-1);
		$check=5;
		$look=1;
	}
	elsif($tmp =~ /[0-9]?/)
	{
		syswrite $W, "seek $tmp\n";
		$timestat=$timestat-$tmp;
		$check=5;
		if($timestat>$timenow)
		{
			$timestat=$timenow;
		}
	}
	
}
sub save
{
	open(PPL,">$lastPlayPos");
	open(C,">$conf");
	$telapsed=int($timeelapsed);
	chomp $ii;
	print PPL "$ii\n$telapsed\n$plnr";
	print C "$pbarColor:$mp3TagColor:$infoColor:$trackInfoColor:$volumeColor:$playBarColor:$browserColor:$playListColor:$clockColor:$shortView";
	close C;close PPL;
}
sub quit
{
	system("setterm -cursor on");
	unlink "$pid";
	save();	
	$key='';
	$i=30;
	$termsize[1]--;
	print "\e[0;0m\e[$termsize[1]\H\n";
#	for($in=0;$in<$termsize[0]-7;$in+=1)
#	{
#		print "\e[31\m\e[2K\e[$in\G".' :( '."\e[0\m\r \r";
#		$key=readKey(0.02);
#		if($key eq 'q')
#		{
#			qn();
#		}
#	}
#	for($in=$termsize[0]-7;$in>0;$in-=1)
#	{
#		print "\e[32\m\e[2K\e[$in\G".' :) '."\e[0\m\r \r";
#		sleep 0.01;
#
#	}
	print "\e[0;39\m\n\rbye\n\r";syswrite $W, "quit\n";
	if($xterm)
	{
		print chr(27).']0;'."mplay".chr(7);
	}
	ReadMode 1;
	exit;
}
sub parent_handler
{
	unlink "$pid";
	save();
	print "\e[$termsize[1]\H\e[1;31m\n aua \e[0m\n";sleep 0.3;
	print "\e[0;0m\e[$termsize[1]\H\n";syswrite $W, "quit\n"; ReadMode 1;
	system("setterm -cursor on");
	exit;
}
sub help
{
	$tmp2='';
	print clearscreen()."\e[1H\e[0;0m";
	if($ENV{'LANG'} =~ /de/)
	{
		open(HELP,"/usr/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.";readKey();last;}
	}
	else
	{
		open(HELP,"/usr/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.";readKey();last;}
	}
	@help=<HELP>;
	$tmp3=scalar(@help);
	for($in=0;$in<$termsize[1]-1;$in++)
	{
		$tmp2.=sprintf "$help[$in]\r";
	}
	print "$tmp2\e[0;0m \r";
	$tmp1=$termsize[1]-1;
	while(1)
	{
		@termsize=GetTerminalSize();
		$key=readKey();
		if($key eq 'Up'&& $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;0m \r";
		}
		if($key eq 'Down')
		{
			print "\e[1;0\m$help[$tmp1]\r\e[0;0m \r";
			$tmp1++ if $tmp1<$tmp3;
		}
		if($key eq 'h'||$key eq 'q' || $key eq "Esc")
		{
			last;
		}

	}
	close(HELP);
	refresh();
}
sub add_list
{
	$actuallist=1;
	open(RPL,$playlist);
	@filesa = <RPL>;
	@files=@filesa;@filesc=@filesa;
	close RPL;
	$max=scalar(@files);
	getFileTime();
	refresh();
}
sub replace_handler
{
	#$i=$iib;
	$ii=0;
	$timeelapsed=0;
	$actuallist=0;
	save();
#	$SIG{CHLD} =sub{waitpid(-1,WNOHANG)};
	syswrite $W, "quit\n";
	unlink "$pid";
	wait;
	exec($0);
	ReadMode 1;exit;
}
sub child_handler
{
	#unlink "$pid";
	#$SIG{PIPE} = \&child_handler;
	$SIG{PIPE} = 'INGORE';
	save();
	
	if($ii<$max-1)
	{
		unlink "$pid";
		print "\e[0;31mMplayer died\ntry to restart..\e[0m\n";
		$key=readKey(0.1);
		if($key eq 'q' || $key eq "\x03")
		{
			quit();
		}
		exec($0);
		wait;
		exit;
	}
	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++)
		{
			checkRemote();
			print "\e[32\m\e[2K\e[$in\G".' <End of playlist> '."\e[0\m\r \r";
			$key=readKey($tmp);
			unless ($key eq ''){last;}
			$tmp=$tmp-$tmp1;
		}
		for($in=$termsize[0]-18;$in>0;$in--)
		{
			checkRemote();
			print "\e[34\m\e[2K\e[$in\G".' <End of playlist> '."\e[0\m\r \r";
			$key=readKey($tmp);
			unless ($key eq ''){last;}
			$tmp=$tmp*1.03;
		}
		while(1)
		{
			checkRemote();
			$key=readKey(6);
			if($key eq 'q' || $key eq "\x03")
			{
				quit();
			}
			else
			{
				&open;
				$i=0;$ib=0;$ii=0;$iib=0;$ik=0;$ikb=0;$playing=$plbLine;$playingb=$plbLine;$telapsed=0;
				refresh();
				return;
			}
		}
	}
}
