<?php

	function dirList_fm($dir,$filemask,$subdir=false,$onlynames=false,$inc_dirs=false) {
		if (is_dir($dir)) {
		    // create a handler for the directory
		    $handler = opendir($dir);

		    // keep going until all files in directory have been read
		    while (false !== ($leaf = readdir($handler))) {

		        // if $leaf isn't this directory or its parent, 
		        // add it to the results array
				if ($leaf != '.' && $leaf != '..') {
					if (is_dir($dir.'/'.$leaf)) {
						if ($inc_dirs) {
							if ($onlynames) $results[] = array($leaf,true);
							else $results[] = array($dir.'/'.$leaf,true);
						}
						if ($subdir) {
							$temp = dirList_fm($dir.'/'.$leaf,$filemask,$subdir,$onlynames);
							if ($temp != '' && !isset($results)) $results = $temp;
							else if ($temp != '' && isset($results)) $results = array_merge($temp,$results);
						}
							//echo 'dir '.count($results).'<br>';
					}
					else {
						//echo 'file '.count($results).'<br>';
						if (mask_find_fm($leaf,$filemask) !== false) {
							if ($onlynames) $results[] = array($leaf,false);
							else $results[] = array($dir.'/'.$leaf,false);
						}
						else $excluded[] = $leaf;
					}
				}
		    }

		    // tidy up: close the handler
		    closedir($handler);
		}
	    // done!
		if (isset($results)) if ($results != '') {
			sort($results);
			return $results;
		}
	    return null;
		
	}

	function mask_find_fm($example,$mask) {
		$mask = str_replace('**','*',$mask);
		$mask_array = explode('*',$mask);
		$mc =count($mask_array);
		//echo '<br>mask els:<br>';
		//foreach ($mask_array as $key => $value) ////echo $key.' => "'.$value.'"<br>';
		$borders = array();
		if ($mask_array[0] != '') $borders[0] = $mask_array[0];
		else $borders[0] = 'nothere';
		if ($mask_array[$mc-1] != '') $borders[1] = $mask_array[$mc-1];
		else $borders[1] = 'nothere';
		//echo '<br>mask borders:<br>left = "'.count($borders[0]).'"<br>right = "'.count($borders[1]).'"';
		//echo '<br>mask borders:<br>left = "'.$borders[0].'"<br>right = "'.$borders[1].'"';
		$i = substr($example,-1*strlen($borders[1]));		
		if ($borders[0] != 'nothere') $left_pos = strpos($example,$borders[0]);
		else $left_pos = -1;
		if ($borders[1] != 'nothere') $right_pos = strpos($i,$borders[1]);
		else $right_pos = -1;
		
		//$e_len = strlen($example);
		//echo '<br>search right in right chunk lenght = "'.strlen($borders[1]).'"  = "'.$i.'"<br>';
		
		//echo '<br>matching borders: <br>left = "'.$left_pos.'" must be 0 or -1 if no border, <br>right = "'.$right_pos.'" must be 0 or -1 if no border';
		$example1 = $example;
		$pp = 0;
		if ($left_pos < 1 && $right_pos < 1 && is_numeric($left_pos) && is_numeric($right_pos)) {
			$pos_prev = -1;
			for ($i=0;$i < $mc; $i++) {
				//echo '<br>left = "'.$example.'"<br>';
				if ($i == 0) {
					if ($mask_array[$i] != '') $pos = strpos($example,$mask_array[$i]);
					else $pos = -1;
				}else if ($i+1 == $mc) {
					if ($mask_array[$i] != '') $pos = strpos($example,$mask_array[$i])+strlen($mask_array[$i]);
					else $pos = -1;				
				}else {
					if ($mask_array[$i] != '') $pos = strpos($example,$mask_array[$i]);
					else $pos = -1;
				}
					//echo '<br>matching: symb ="'.$mask_array[$i].'" point = "'.($pos+$pp).'"<br>';
				if ($pos !== false && (($pos+$pp) > $pos_prev || $pos == -1)) {
					if ($pos > -1) { 
						$pos_prev = $pos;
						$plus = $pos+strlen($mask_array[$i]);
						$example = substr($example,$plus);
						$pp += $plus;
					//	echo '<br>pp='.$pp.'<br>';
						}
				}else {
					//echo '<br>'.$example.' not match to mask "'.$mask.'"<br>';
					return false;
				}
			}
			//echo '<br>'.$example.' match to mask "'.$mask.'"<br>';			
			return true;
			
		}else {
			//echo '<br>'.$example.' not match to mask "'.$mask.'"<br>';
			return false;
		}
	}

	function in_root($name,$rel=false) {
		if ($rel !== false) $name = str_replace($rel,'',$name);
		if (count(explode('/',$name)) > 2) return false;
		return true;
	}

	function dir_less($dir) {
		$a = explode('/',$dir);
		if (count($a) > 1) {
			array_pop($a);
			return implode('/',$a);
		}
		return $a[0];
	}

	function filename_safe($name) {
	    $except = array('\\', '/', ':', '*', '?', '"', '<', '>', '|');
	    return str_replace($except, '', $name);
	} 
	
	
	//MAIN BODY
	$chdir = '.';
	if (isset($_GET['chdir'])) {
		$chdir = $_GET['chdir'];
		//while (strpos($chdir,'..') !== false) $chdir = str_replace('..','.',$chdir);
		//while (strpos($chdir,'././') !== false) $chdir = str_replace('././','./',$chdir);
		//while (strpos($chdir,'//') !== false) $chdir = str_replace('//','/',$chdir);
		//while (strpos($chdir,':') !== false) $chdir = str_replace(':','',$chdir);
		
		//if ($chdir == './') $chdir = '.';
		//if ($chdir == './.') $chdir = '.';
		//if ($chdir == '/') $chdir = '.';
		//if (strpos($chdir,'/') === 0) $chdir = '.'.$chdir;
	}
	$fdir = $chdir.'/';
	
	
	$form2 = '<div><a href="?chdir=%dirhr%">%dir%</a></div>';

	$echo_file = '';
	
	if (isset($_POST['overwrite'])) {
		$temp_name = $_POST['overwrite'];
		$target_original = $_POST['original'];
		unlink($target_original);
		if (file_exists($temp_name)) rename($temp_name,$target_original);
		else $uploaded = '<div>Cannot overwrite "'.$temp_name.'"(not exists) with "'.$target_original.'"</div>';
	}	
	
	if (isset($_GET['file'])) if (file_exists($_GET['file']) && !is_dir(basename($_GET['file'])) != '') $file = $_GET['file'];
	
	if (isset($_POST['delete'])) {
		unlink($file);
		unset($file);
	}	

	
	if (isset($file)) {
	
		$echo_file .= str_replace(array('%dirhr%','%dir%'),array($chdir,'Close file'),$form2);
		
		if (isset($_POST['action'])) {
			switch ($_POST['action']) {
				case 'open_in_editor':
					$ext_arr = array('jpg','jpeg','gif','png','bmp');
					$pinf = pathinfo($file);
					if (in_array($pinf['extension'],$ext_arr)) {
						$echo_file .= '<div><img src="'.$file.'"></div>';
					} else {
						$text = htmlspecialchars(file_get_contents($file,FILE_TEXT));
						$echo_file .= '							
							<form action="'.$_SERVER['REQUEST_URI'].'" method="POST">
							<input type="hidden" name="action" value="save">
							<textarea name="originaltext" rows="100%" cols="220">'.$text.'</textarea>
							<input type="submit" value="Save?">
							</form></div>
						';
					}
					break;
				case 'download':
					header("Content-type: application/octet-stream");
					header("Content-Disposition: attachment; filename=\"".basename($file)."\"");
					echo file_get_contents($file);
					exit;
					break;
				case 'delete':
					$echo_file .= '
					<form action="'.$_SERVER['REQUEST_URI'].'" method="POST">
					<input type="hidden" name="delete" value="delete">
					<input type="submit" value="DELETE?">
					</form>';
					break;
				case 'save':
					if ($fh = fopen($file,'w+')) {
						fwrite($fh,$_POST['originaltext']);
						fclose($fh);
						$echo_file .= '<div> File "'.$file.'" saved sucessfully</div>';
					} else $echo_file .= '<div> File "'.$file.'" failed to open & save</div>';
					
					break;
				case 'rename':
					$original = $_POST['original'];
					$rename = $fdir.$_POST['next'];
					if (file_exists($rename)) {
						$echo_file .= '<div>File "'.$rename.'" exists 
							<form action="'.$_SERVER['REQUEST_URI'].'" method="POST">
							<input type="hidden" name="overwrite" value="'.addslashes($original).'">
							<input type="hidden" name="original" value="'.addslashes($rename).'">
							<input type="submit" value="Overwrite?">
							</form></div>';
							
					} else {
						rename($original,$rename);
						$echo_file .= '<div>File "'.$original.'" renamed to "'.$rename.'"</div>';
					}
					
					break;
				default:
					$echo_file .= '<div>Action not implemented yet.</div>';
					break;
			}
		} else {
			$echo_file .= '
				<form action="'.$_SERVER['REQUEST_URI'].'" method="POST">
				<input type="hidden" name="action" value="open_in_editor">
				<input type="submit" value="Open in Editor">
				</form>
				';
			$echo_file .= '
				<form action="'.$_SERVER['REQUEST_URI'].'" method="POST">
				<input type="hidden" name="action" value="download">
				<input type="submit" value="Download">
				</form>
				';
			$echo_file .= '
				<form action="'.$_SERVER['REQUEST_URI'].'" method="POST">
				<input type="hidden" name="action" value="delete">
				<input type="submit" value="Delete">
				</form>
				';
			$echo_file .= '
				<form action="'.$_SERVER['REQUEST_URI'].'" method="POST">
				<input type="hidden" name="action" value="rename">
				<input type="hidden" name="original" value="'.$file.'">
				Rename to:<input type="text" size="60" name="next" value="'.basename($file).'"><br>
				<input type="submit" value="rename">
				</form>
				';
		}		
			
	} else {
		if (isset($_POST['new_dir'])) {
		//	if (!file_exists($fdir.'/'.$_POST['new_dir'])
			$ndir = explode('/',$_POST['new_dir']);
			for ($i=0;$i<count($ndir);$i++) {
				$ndir[$i] = filename_safe($ndir[$i]);
				if ($ndir[$i] != '') $nprodir[$i] = $ndir[$i];
				$echo_file .= $i.' <br>';
			}
			if (isset($nprodir)) {
				$ndir = $fdir.'/'.implode('/'.$nprodir);
				$echo_file .= '<div>Dir "'.$ndir.'"</div>';
				mkdir($ndir,0777);
			} else {
				$echo_file .= '<div>Failed to make dir "'.$ndir.'"</div>';
			}
			
		}

		/*$echo_file .= '
			<form action="'.$_SERVER['REQUEST_URI'].'" method="POST">
			Dir name:<input type="text" name="new_dir">
			<input type="submit" value="Create new dir">
			</form>
			';*/

		if (isset($_POST['new_file'])) {
			$new_file = basename($_POST['new_file']);
			
			if (!file_exists($fdir.$new_file)) {
				$fh = fopen($fdir.$new_file,'w+');
				$echo_file .= '<div>Created "'.$new_file.'"</div>';
			} else $echo_file .= '<div>File exists "'.$new_file.'"</div>';
		}
		$echo_file .= '
			<form action="'.$_SERVER['REQUEST_URI'].'" method="POST">
			File name:<input type="text" name="new_file">
			<input type="submit" value="Create new file">
			</form>
			';
			


			
		if (isset($_FILES['upload_file']['name'])) {
		$upload_file = iconv('CP1251','UTF-8',html_entity_decode($_FILES['upload_file']['name']));
		$target = $fdir.$upload_file;
		if (file_exists($target)) {
			$target_original = $target;
			$target = $target.'_tmp_'.time();
			if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $target)) 
			$uploaded = '<div>File "'.$target_original.'" exists 
				<form action="'.$_SERVER['REQUEST_URI'].'" method="POST">
				<input type="hidden" name="overwrite" value="'.addslashes($target).'">
				<input type="hidden" name="original" value="'.addslashes($target_original).'">
				<imput type="submit" value="Overwrite">
				</form></div>';
				
		} else if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $target)) $uploaded = '<div>Uploaded "'.$target.'"</div>';
	}
		
		if (isset($uploaded)) $echo_file .= $uploaded;
			
		$echo_file .= '
			<form action="'.$_SERVER['REQUEST_URI'].'" method="POST" enctype="multipart/form-data">
			File name:<input type="file" name="upload_file">
			<input type="submit" value="Upload">
			</form>
			';	
		
	}
	
	header ('Content-type: text/html; charset=utf-8');
	


	
	
	
	echo '<table border="1" width="100%" height="100%"><tr height="100%">';
	
	
	echo '<td width="50%" valign="top">';
	
	$form = '<div><a href="?chdir=%dirhr%">%dir%</a></div>';
	
	

	echo '<table border="1" width="100%" height="100%"><tr><td colspan="2" align="center" valign="top">Current dir: "<font size="5">'.$chdir.'</font>"</td></tr><tr height="100%"><td width="50%" valign="top">';

	
	
	$t = dirList_fm($chdir,'*',false,false,true);
	if ($chdir != '.') {
		$chd = './'.$chdir;
		if (in_root($chd)) echo str_replace(array('%dirhr%','%dir%'),array('.','../'),$form2);
		else echo str_replace(array('%dirhr%','%dir%'),array(dir_less($chdir),'./'.dir_less($chdir)),$form2);
	}
	$files = array();
	$cdirs = 0;
	for ($i=0;$i<count($t);$i++) {
		if (in_root($t[$i][0],$chdir)) {
			$echo_d = str_replace($chdir.'/','/',$t[$i][0]);
			if ($t[$i][1]) {
				echo str_replace(array('%dirhr%','%dir%'),array(str_replace('./','',$t[$i][0]),$echo_d),$form);
				$cdirs++;
			} else $files[] = $echo_d;
		}
	}
	if ($cdirs == 0) echo '<div>No dirs found</div>';
	echo '</td><td width="50%" valign="top">';
	$file_form = '<div><a href="?chdir=%dirhr%&file=%filehr%">%file%</a></div>';
	for ($i=0;$i<count($files);$i++) echo str_replace(array('%dirhr%','%dir%','%filehr%','%file%'),array($chdir,$chdir,$chdir.$files[$i],$files[$i]),$file_form);
	
	echo '</td></tr></table>';
	echo '</td><td width="50%" valign="top">';

	echo $echo_file;
	
	
	
	echo '</td></tr></table>';

?>