# +-------------------------------------------------------------------------+
# | ─цхэЄы№ьхэёъшщ эрсюЁ Web-ЁрчЁрсюЄўшър                                   |
# | ┬хЁёш : ─хэтхЁ-2 2006-10-04                                             |
# +-------------------------------------------------------------------------+
# | Copyright (C) 2001-2004 ─ьшЄЁшщ ╩юЄхЁют.                                |
# +-------------------------------------------------------------------------+
# | ─рээ√щ Їрщы  ты хЄё  ўрёЄ№■ ъюьяыхъёр яЁюуЁрьь "─хэтхЁ-2". ┬√ эх ьюцхЄх |
# | шёяюы№чютрЄ№  хую т ъюььхЁўхёъшї  Ўхы ї.  ═шъръшх фЁєушх юуЁрэшўхэш  эх |
# | эръырф√тр■Єё .  ┼ёыш т√ їюЄшЄх тэхёЄш шчьхэхэш  т шёїюфэ√щ ъюф,  ртЄюЁ√ |
# | сєфєЄ Ёрф√ яюыєўшЄ№ юЄ трё ъюььхэЄрЁшш ш чрьхўрэш . ╧Ёш Єэющ ЁрсюЄ√!    |
# +-------------------------------------------------------------------------+
# | ─юьр°э   ёЄЁрэшЎр: http://denwer.ru                                     |
# | ╩юэЄръЄ√: http://forum.dklab.ru/denwer                                  |
# +-------------------------------------------------------------------------+

package Interface;
$VERSION = 2.11;
use Tools;

# Экспортирует все функции в вызвавший пакет. Вызывается автоматически.
sub import {
	while(my ($k,$v)=each(%{__PACKAGE__."::"})) { 
		next if substr($k,-1) eq ":" || grep { $k eq $_ } qw(BEGIN import);
		*{caller()."::".$k}=$v;
	}
}

# string rectangle($text, $style=2, $width=auto, $lspace=0, $pad=1)
# |         +---------------+
# | $lspace |$pad $text $pad|
# |         +---------------+
#            \_____________/ 
#                $width
my $prevStyle = "";
sub rectangle
{	my ($text, $style, $width, $lspace, $pad) = @_;
	$text = clean($text);
	$style=2 if !defined $style;
	$width||=0;
	$lspace||=0;
	$pad=1 if !defined $pad;
	
	# Detect max line length.
	my $w = 0;
	foreach (split /\n/, $text) {
		$w = length($_) if length($_)>$w;
	}
	$w += $pad*2 + 2;
	$width=$w if $w>$width;

	# Line styles.
	my %styles= ( #01234567
		"0"   => [split //, "        "],
		"1"   => [split //, "│┌─┐│└─┘"],
		"2"   => [split //, "║╔═╗║╚═╝"],
		"msg" => [split //, "█......."],
		"try" => [split //, "▓......."],
		"fnd" => [split //, "*......."],
	);
	my @style = map { $_ eq "."? "" : $_ } @{$styles{$style}||$style{2}};
	my $out = "";

	# Draw.
	$lspace = " " x $lspace;

	$out.=$lspace . $style[1] . $style[2] x ($width-2) . $style[3] . "\n" if $style[1] ne "";
	foreach my $l (split /\n/, $text) {
		$l .= " " x ($width-2-$pad*2-length($l));
		$out .= $lspace . $style[0] . " " x $pad . $l . " " x $pad . $style[4] . "\n";
	}	
	$out.=$lspace . $style[5] . $style[6] x ($width-2) . $style[7] . "\n" if $style[5] ne "";

	$prevStyle = $style;
	return $out;
}

# void message($st)
# Prints a MESSAGE..
sub message($)
{	my ($txt)=@_;
	print "\n" if $prevStyle ne "";
	print rectangle($txt,"msg");
}

# void found($st)
# Prints a FOUND message.
sub found($)
{	my ($txt)=@_;
	print "\n" if $prevStyle ne "fnd" && $prevStyle ne "try";
	print rectangle($txt,"fnd");
}

# void try($st)
# Prints a TRY-FOUND message.
sub try($)
{	my ($txt)=@_;
	print "\n" if $prevStyle ne "try" && $prevStyle ne "";
	print rectangle($txt,"try",undef,undef,1);
}


# void error($st)
# Prints an ERROR message.
sub error($)
{	my ($txt)=@_;
	print "\n";
	print rectangle($txt,2);
}

# string ask($msg, $callback)
sub ask($&) 
{	my ($msg,$func) = @_;
	print "\n";
	print "> ".$msg." ";
	$prevStyle = "ask";
	return $func->($msg);
}

# Выводит строку. Если ее длина >$l символов, выводит только ее хвост.
# Курсор переводится на начало строки.
sub printLong
{	my ($s,$l)=@_;
	$l=70 if !defined $l;
	$s="...".substr($s,-($l-3)) if length($s)>$l;
	$s.=" "x($l-length $s);
	print $s;
	print "\b"x(length $s);
}

# bool readYesNo()
# Запрашивает у пользователя ответ "да" или "нет". Возвращает
# истину, если пользователь ввел "да".
sub readYesNo {
	my $yn;
	while(1) {
		$yn=lc trim(scalar <STDIN>);
		if($yn ne "y" && $yn ne "n" && $yn ne "да" && $yn ne "нет") {
			print "Введите \"y\" (Да) или \"n\" (Нет): ";
			next;
		}
		return $yn eq "y" || $yn eq "да" || 0;
	}
}


sub readChoise
{	my ($prom, $def,@ch)=@_;
	my $ch;
	while(1) {
		$ch = ask "$prom [$def]:", sub { lc trim(scalar <STDIN>) };
		$ch=$def if $ch eq ""; 
		if(!grep { $_ eq $ch } @ch) {
			print "Неверный выбор. ";
			next;
		}
		return $ch;
	}
	
}

# void waitEnter()
# Ждет нажатия на Enter.
sub waitEnter {
	print rectangle(qq{
		Для продолжения нажмите Enter.
	}, 1);
	$prevStyle = "";
	<STDIN>;
}

# Выводит строку. Если ее длина >$l символов, выводит только ее хвост.
# Курсор переводится на начало строкиm, как будто ничего не выводилось.
sub progress
{	my ($s,$l)=@_;
	$l=70 if !defined $l;
	$s="...".substr($s,-($l-3)) if length($s)>$l;
	$s.=" "x($l-length $s);
	print $s;
	print "\b"x(length $s);
}

return 1;