<?php
/* CONFIGURATION */

$iconDir = 'icons';
$iconByExt = array(
	'img.png' => '.gif .jpg .jpeg .png .svg',
	'php.png' => '.php .inc .class',
	'htm.png' => '.html .htm .tpl',
	'pdf.png' => '.pdf',
	'odt.png' => '.odt',
	'txt.png' => '.txt README .htaccess',
);
$iconSpecial = array(
	'up' => 'back.png',
	'dir' => 'folder.png',
	'other' => 'bin.png',
	'empty' => 'empty.png',
);
$typeByExt = array(
	'image/gif' => '.gif',
	'image/jpeg' => '.jpg .jpeg',
	'image/png' => '.png',
	'text/html' => '.html .htm',
	'text/svg+xml' => '.svg',
	'application/pdf' => '.pdf',
	'text/plain' => '.txt README',
);
$viewable = ':IMG .gif .png .jpg .jpeg :COLOR .html .htm .tpl .php .phps .inc .class .css .js .sql :NONE .txt README .htaccess CHANGELOG HEADER INSTALL VERSION';

$dirSize = '4 kB';

/* END OF CONFIGURATION */

setlocale(LC_ALL, 'pl_PL.UTF8');

function processConfig() {
	global $iconByExt, $typeByExt, $viewable;
	
	$temp = array();
	foreach($iconByExt as $img => $ext) {
		$ext = explode(' ', $ext);
		foreach($ext as $ex) {
			if(!$ex) continue;
			$temp[$ex] = $img;
		}
	}
	$iconByExt = $temp;
	
	$temp = array();
	foreach($typeByExt as $type => $ext) {
		$ext = explode(' ', $ext);
		foreach($ext as $ex) {
			if(!$ex) continue;
			$temp[$ex] = $type;
		}
	}
	$typeByExt = $temp;
	
	$temp = array(); $temp2 = '';
	$viewable = explode(' ', $viewable);
	foreach($viewable as $element) {
		if(substr($element, 0, 1)==':') {
			$temp2 = substr($element, 1);
		}
		else
		{
			$temp[$element] = $temp2;
		}
	}
	$viewable = $temp;
}

function unit($bytes) {
	$jedn = array('B', 'kB', 'MB', 'GB', 'TB', 'PB');
	$i=0;
	while(($byte = bcdiv($bytes, 1024, 1))>1) {
		$bytes = $byte;
		$i++;
	}

	return str_replace('.', ',', $bytes).' '.$jedn[$i];
}

function explodeDir($dir) {
	$ret = '';
	
	$begin = PHP_SELF.'/';
	
	echo '<a href="'.$begin.'"> / </a>';
	
	if($dir == '') return '';
	
	$dir = explode('/', $dir);
	foreach($dir as $element) {
		$d = is_dir('./'.substr($begin, strlen(PHP_SELF)).$element);
		$begin = $begin.$element.($d ? '/' : '');
		
		echo '<a href="'.($d ? $begin : PHP_SELF.'/?download='.urlencode(substr($begin, strlen(PHP_SELF)))).'">'.$element.($d ? ' /' : '').'</a> ';
	}
}

function formatTime($time) {
	return strftime('%x %X %Z', $time);
}

function findFileType($file, &$array) {
	$file = basename($file);
	
	if(isset($array[$file])) {
		return $array[$file];
	}
	elseif(($pos=strrpos($file, '.'))!==FALSE AND isset($array[substr($file, $pos)])) {
		return $array[substr($file, $pos)];
	}
	else
	{
		return FALSE;
	}
}

function fileIcon($file) {
	global $iconByExt, $iconSpecial, $iconDir;
	
	if($file == '/') {
		$icon = $iconSpecial['dir'];
	}
	elseif($file == '..') {
		$icon = $iconSpecial['up'];
	}
	else
	{
		$icon = findFileType($file, $iconByExt);
	}
	
	if(!$icon) {
		$icon = $iconSpecial['other'];
	}
	
	return PHP_SELF.'/'.$iconDir.'/'.$icon;
}

function isViewable($file) {
	global $viewable;
	
	return (bool)findFileType($file, $viewable);
}

function makelink($element) {
	global $dirSize;
	$belement = basename($element);
	
	if(is_dir($element)) {
		echo '<tr> <td  style="background-image:url(\''.fileIcon('/').'\')"><a href="'.$belement.'/">'.$belement.'/</a></td> <td>'.$dirSize.'</td> <td></td> <td></td> </tr>';
	}
	elseif(isViewable($belement)) {
		echo '<tr> <td style="background-image:url(\''.fileIcon($belement).'\')"><a href="'.PHP_SELF.'/?view='.substr($element, strlen(dirname(__FILE__))).'">'.$belement.'</a></td> <td>'.unit(filesize($element)).'</td> <td>'.formatTime(filemtime($element)).'</td> <td><a href="'.PHP_SELF.'/?view='.substr($element, strlen(dirname(__FILE__))).'">(podgląd)</a> <a href="'.PHP_SELF.'/?download='.substr($element, strlen(dirname(__FILE__))).'">(pobierz)</a></td> </tr>';
	}
	else
	{
		echo '<tr> <td style="background-image:url(\''.fileIcon($belement).'\')">'.$belement.'</td> <td>'.unit(filesize($element)).'</td> <td>'.formatTime(filemtime($element)).'</td> <td><a href="'.PHP_SELF.'/?download='.substr($element, strlen(dirname(__FILE__))).'">(pobierz)</a></td> </tr>';
	}
	
	echo "\n";
}

define('PHP_SELF', dirname($_SERVER['PHP_SELF']));

if(isset($_GET['view'])) {
	$_SERVER['REQUEST_URI'] = PHP_SELF.$_GET['view'];
}
elseif(isset($_GET['download'])) {
	$_SERVER['REQUEST_URI'] = PHP_SELF.$_GET['download'];
}

$DIR = dirname(__FILE__);
$SDIR = substr($_SERVER['REQUEST_URI'], strlen(PHP_SELF));
$RDIR = realpath($DIR.$SDIR);
$error = FALSE;

if(!$RDIR || substr($RDIR, 0, strlen($DIR))!=$DIR) {
	$error = TRUE;
	$RDIR = $DIR;
	$SDIR = '/';
}

if(isset($_GET['download']) && $error == FALSE) {
	header('Content-Type: application/octet-stream');
	header('Content-Disposition: attachment; filename="'.urlencode(basename($RDIR)).'"');
	
	readfile($RDIR);
	die();
}

if($RDIR)
	$SDIR = substr($RDIR, strlen($DIR)+1);

header('Content-Type: text/html; charset=utf-8');
?>
<!DOCTYPE html>
<html>
<head>
<title>Browse Code - /<?php echo $SDIR; ?> - dev.Jacekk.net</title>
<link rel="stylesheet" type="text/css" href="<?php echo PHP_SELF; ?>/style.css" />
</head>
<body>
<div id="head"><img src="<?php echo PHP_SELF; ?>/logo.png" alt="Browse Code" /></div>

<div id="body">
<?php
if($error) {
	echo '<p class="error">404: File not found!</p>';
}

if(is_dir($RDIR)) {
	echo '<p class="dir">Katalog: ';
	explodeDir($SDIR);
	echo '</p>'."\n\n";
	
	/* BEGIN - DIRECTORY */
	processConfig();
?>
<table>
<tr> <th>Nazwa pliku</th> <th>Rozmiar</th> <th>Data modyfikacji</th> <th>Opcje</th> </tr>
<tr> <td style="background-image:url('<?php echo fileIcon('..'); ?>')"><a href="..">../</a></td> <td><?php echo $dirSize; ?></td> <td></td> <td></td> </tr>
<?php
$glob = glob($RDIR.'/*');
foreach($glob as $element) {
	makelink($element);
}
?>
</table>
<?php
	/* END - DIRECTORY */
}
elseif(is_file($RDIR) && isset($_GET['view']))
{
	/* BEGIN - VIEW */
	echo '<p class="dir">Podgląd pliku: ';
	explodeDir($SDIR);
	echo '</p>'."\n\n";
	
	processConfig();
	
	$type = findFileType($SDIR, $viewable);
	switch($type) {
		case 'IMG':
			echo '<p class="view"> <img src="'.PHP_SELF.'/'.$SDIR.'" alt="" /> </p>';
		break;
		case 'COLOR':
		case 'NONE':
			echo '<pre class="view">';
			if($type=='COLOR') {
				highlight_file($RDIR);
			}
			else
			{
				ob_start(create_function('$string', 'return htmlspecialchars($string);'));
				readfile($RDIR);
				ob_end_flush();
			}
			echo '</pre>';
		break;
		default:
			echo '<p class="error">Pliku nie można podejrzeć!</p>';
		break;
	}
	
	/* END - VIEW */
}
?>

<p>Browse Code &copy; 2010 by <a href="http://jacekk.info">Jacek Kowalski</a></p>
</div>

<script type="text/javascript" src="/panel/_.js"></script>
</body>
</html>
