| <?php
/**
 * @name SYN Directory Listing (Simple Yet Nifty)
 * @desc Directory Listing Class
 * 
 *  With this file and the original index.php that came with the package you can make
 *  a nice simple listing of what is in that directory.
 *  
 *  You can also sort by name, filesize and filetype (both ascending and descending)
 *  by clicking on the Topmost icon, "Filename" or "Size"
 *   
 * @author Olafur Waage, [email protected]  
 * @date 14.June 2007 
 * @credits, Icons made by Mark James ( http://www.famfamfam.com/lab/icons/silk/ ) 
 * 
 * Copyright © 2007 Ólafur Waage
 * Distributed under the terms of the GNU General Public License 
 */ 
/**
 * Includes the language file, since its in the same directory as this file
 */
include("lang.php");
class synDirectory
{	
	/**
	 * Outputs the main directory table, this can be customized if you know php a little.
	 * 
	 * This function needs the array that the function synDir makes if you are going to call it.
	 * Look at index.php for an example on how its done.
	 *
	 * @param array $array
	 * @return HTML table
	 */
	function mainTable($array)
	{
		global $dSize, $fCount, $dCount, $lang, $config;
		
		/**
		 * Prints out the directory name, i.e. "Index of /downloads/sources/"
		 * So this would be the header
		 */
		
		if($config["show_header"] == true)
		{
			echo "<b class='synHeader'>",$lang[$config["lang"]]["index_of"]," ",$this->getDirName(),"</b>";
			echo "<br /><br />";
		}
			
		/**
		 * This section of code is the first two lines of the table, the header and the "Parent Directory" line.
		 */
		?>
		<table class="synTable" cellspacing="5">
		  <tr class="synTopTr">
		    <td class="synTopTd"><a href="?sort=filetype&in=<?php if($_GET["sort"] == "filetype" && $_GET["in"] == "asc" || !$_GET){ echo "desc"; }else{ echo "asc"; } ?>"><b>T</b></a></td>
		    <td class="synTopTd"><a href="?sort=filename&in=<?php if($_GET["sort"] == "filename" && $_GET["in"] == "asc" || !$_GET){ echo "desc"; }else{ echo "asc"; } ?>"><b><?php echo $lang[$config["lang"]]["filename"]; ?></b></a></td>
		    <td class="synTopTd" align="right"><a href="?sort=modified&in=<?php if($_GET["sort"] == "modified" && $_GET["in"] == "asc" || !$_GET){ echo "desc"; }else{ echo "asc"; } ?>"><b><?=$lang[$config["lang"]]["last_modified"]?></b></a></td>
		    <td class="synTopTd" width="10"></td>
		    <td class="synTopTd" align="right"><a href="?sort=size&in=<?php if($_GET["sort"] == "size" && $_GET["in"] == "asc" || !$_GET){ echo "desc"; }else{ echo "asc"; } ?>"><b><?=$lang[$config["lang"]]["size"]?></b></a></td>
		  </tr>
		  <?php
		  	if($config["show_parent_dir"] == true)
		  	{
		  ?>
		  <tr class="synParentTr">
		      <td class="synParentTd">
		      <?php
						if($config["show_icons"] == true)
						{
					?>
		        <img src="<?=$config["class_root"]?>folder_go.png" />
		      <?php
						}
					?>
		      </td>
		      <td class="synParentTd">
		        <a href=".."><?=$lang[$config["lang"]]["parent_dir"]?></a>
		      </td>
		      <td class="synParentTd" align="right">
		        -
		      </td>
		      <td class="synParentTd" width="10"></td>
		      <td class="synParentTd" align="right">
		        -
		      </td>
		    </tr>
		<?php
		  	}
		
		/**
		 * This section of code loops through all the directories that are found within this one.
		 */
		if( is_array($array[0]) && $config["show_dir"] == true )
		{
			  foreach($array[0] as $dirData)
			  {
			    ?>
			    <tr class="synFolderTr">
			      <td class="synFolderTd">
				      <?php
								if($config["show_icons"] == true)
								{
							?>			      
			        <img src="<?=$config["class_root"]."folder.png"?>" />
			        <?php
								}
							?>
			      </td>
			      <td class="synFolderTd">
			        <a href="<?php echo $dirData; ?>"><?php echo $dirData; ?></a>
			      </td>
			      <td class="synFolderTd" align="right">
			        <?php echo date("d-M-Y H:i.s", filemtime($dirData)); ?>
			      </td>
			      <td class="synFolderTd" width="10"></td>
			      <td class="synFolderTd" align="right">
			        -
			      </td>
			    </tr>
			    <?php
			    
			    $dCount = $dCount + 1;
			  }		  	
		}
		
		/**
		 * This section of code loops through all the files that are found within this directory.
		 */
		if( is_array($array[1]) && $config["show_files"] == true )
		{  
		    foreach($array[1] as $fileKey => $fileData)
		    {
		        ?>
		        <tr class="synFileTr">
		          <td class="synFileTd">
					      <?php
									if($config["show_icons"] == true)
									{
								?>		          
		            <img src="<?php echo $this->iconImage($fileData); ?>" />
		            <?php
									}
								?>
		          </td>
		         <td class="synFileTd">
		            <a href="<?php echo $fileData; ?>"><?php echo $this->showFileExtension($fileData); ?></a>
		          </td>
		          <td class="synFileTd" align="right">
		            <?php echo date("d-M-Y H:i.s", filemtime($fileData)); ?>
		          </td>
		          <td class="synFileTd" width="10"></td>
		          <td class="synFileTd" align="right">
		            <?php echo $this->fileSizeCalc($fileData); ?>
		          </td>
		        </tr>
		        <?php
		        
		        $dSize += filesize($fileData);
		        $fCount = $fCount + 1;
		    }  
		}
		
		/**
		 * Misc statistics about the directory
		 */
		?>
		<tr class="synFooterTr">
			<td class="synFooterTd" colspan="2"><?=($dCount + 0)." ".$lang[$config["lang"]]["directories"].", ".($fCount + 0)." ".$lang[$config["lang"]]["files"]?></td>
			<td class="synFooterTd" colspan="3" align="right"><?=($fCount > 0 ? $this->byteConvert($dSize) : "")?></td>
		</tr>
		</table>	
		<?php
		
		/**
		 * Prints out misc server info, i.e. "Apache/1.3.33 Server at server.com Port 80"
		 */
		if($config["show_server_info"])
		{
			echo '<br /><small>'.$_SERVER['SERVER_SIGNATURE'].'</small>';
		}
	}
	
/* ################################################# */
/**
 * Edit only the functions below if you are knowledgeable in php
 */
/* ################################################# */
/**
 * Converts bytes into human readable form
 *
 * @param int $bytes
 * @return parsed string
 */
  function byteConvert($bytes)
  {
    $s = array('B', 'Kb', 'MB', 'GB', 'TB', 'PB');
    $e = floor(log($bytes)/log(1024));
	
    if($bytes == 0)
    {
    	return "0 B";
    } else {
    	return sprintf('%.2f '.$s[$e], ($bytes/pow(1024, floor($e))));  	
    }
  }
/**
 * @desc File size calculator and parser
 * 
 * @return string, Returns the filesize in a human readable form
 */ 
  function fileSizeCalc($filename)
  {
  	$filesize = filesize($filename);
    return $this->byteConvert($filesize);
  }
  function getDirName()
  {
    $self = substr(strrchr($_SERVER['SCRIPT_NAME'],'/'), 1);
    $strpos = strrpos($_SERVER['SCRIPT_NAME'], $self);
    
    $cuttofmark = strlen($_SERVER['SCRIPT_NAME']) - $strpos;
    $cuttofminus = '-'.$cuttofmark;
    
    return substr($_SERVER['SCRIPT_NAME'], 0, intval($cuttofminus));  
  }
  
/**
 * If the config file is set for this, it will
 * display the filename without the extension. Else it will
 * display the full name
 */	 	 	   
  function showFileExtension($filename)
  {
  	global $config;
  	
		/* modifies the $entry so only the filename appears */
		if($config["show_file_extensions"] == true)
		{
			return $filename;
		}
		else
		{
			return substr($filename, 0, strpos($filename, "."));
		}
	}
/**
 * @desc Directory Array Generator 
 * 
 * @return array, Based on what is selected with $_GET or if $_GET is selected at all  
 * The array returned includes the files that are in the directory 
 */ 
  function synDir()
  {
  	global $config;
  	
    $dir = dir(getcwd());
    // Reads the directory and outputs into a simple array what we have in it.
    // Excluding the items in the first if sentance.
    $i = 0;
    while (false !== ($entry = $dir->read())) {
      if($entry == ".." || $entry == "." || $entry == "index.php" || $entry == "config.php" || $entry == "syn_class.php" || $entry == "lang.php"
				|| $entry == "avi.png" || $entry == "control_repeat.png" || $entry == "doc.png" || $entry == "exe.png" || $entry == "folder.png" || $entry == "folder_go.png"
				|| $entry == "gpl.txt" || $entry == "html.png" || $entry == "jpg.png" || $entry == "mp3.png" || $entry == "page_white.png" || $entry == "pdf.png" || $entry == "php.png"
				|| $entry == "ppt.png" || $entry == "txt.png" || $entry == "xls.png" || $entry == "zip.png")
      {
        echo "";
      }
      else
      {
        if( is_dir($entry) )
        {
        	if($_GET["sort"] == "modified")
        	{
        		$dirs[filemtime($entry).".0".$i] = $entry;
        	} else {
          		$dirs[] .= $entry;
        	}
        }
        else
        {	
        	/* goes through all files and only displays the ones*/
        	/* selected in the $config show only array */
        	if(is_array($config["show_only"]))
        	{
        		$check = substr(strrchr($entry, "."), 1);
				
        		if(in_array($check,$config["show_only"]))
						{
		        	if($_GET["sort"] == "size")
		        	{
		        		$files[filesize($entry).".0".$i] .= $entry;
		        	} elseif($_GET["sort"] == "filetype") {
		          		$fileExtension = substr(strrchr($entry, "."), 1);
		          		$fileExtension = strtolower($fileExtension);
		          		
		        		$files[$fileExtension.$entry] .= $entry;
		        	} elseif($_GET["sort"] == "modified") {
				    	$files[filemtime($entry).".0".$i] = $entry;
		        	} else {
		        		$files[] .= $entry;
		        	}
						}        		
        	} else {      	    	
	        	if($_GET["sort"] == "size")
	        	{
	        		$files[filesize($entry).".0".$i] .= $entry;
	        	} elseif($_GET["sort"] == "filetype") {
	          		$fileExtension = substr(strrchr($entry, "."), 1);
	          		$fileExtension = strtolower($fileExtension);
	          		
	        		$files[$fileExtension.$entry] .= $entry;
	        	} elseif($_GET["sort"] == "modified") {
			    	$files[filemtime($entry).".0".$i] = $entry;
	        	} else {
	        		$files[] .= $entry;
	        	}
        	}
        }
      }
      $i++;
    }
    $dir->close();
    if( !is_array($dirs) && !is_array($files))
      return FALSE;
    
    // Returns an array with filenames and directory names and file sizes
    // Sorted by filename
    if($_GET["sort"] == "filename" || !$_GET)
    { 
      if($_GET["in"] == "asc" || !$_GET)
      {
        if( is_array($files) )
          asort($files, SORT_STRING);
        if( is_array($dirs) )
          asort($dirs, SORT_STRING);     
      }
      
      if($_GET["in"] == "desc")
      {
        if( is_array($files) )
          arsort($files, SORT_STRING);       
        if( is_array($dirs) )
          arsort($dirs, SORT_STRING);   
      }
      
    return array($dirs, $files);
    }
    
    // Returns an array with filenames and directory names and file sizes
    // Sorted by filesize
    if($_GET["sort"] == "size")
    {
      if($_GET["sort"] == "size" && $_GET["in"] == "asc")
      {
        if( is_array($files) )  
          ksort($files, SORT_NUMERIC);
        if( is_array($dirs) )
          asort($dirs, SORT_STRING);
      }
      
      if($_GET["sort"] == "size" && $_GET["in"] == "desc")
      {
        if( is_array($files) )  
          krsort($files, SORT_NUMERIC);
        if( is_array($dirs) )
          asort($dirs, SORT_STRING);
      }   
    
    return array($dirs, $files); 
    }
    
    // Returns an array with filenames and directory names and file sizes
    // Sorted by filetype
    if($_GET["sort"] == "filetype")
    {
	    if($_GET["sort"] == "filetype" && $_GET["in"] == "asc")
	    {
	      if( is_array($files) )  
	        ksort($files, SORT_STRING);
	      if( is_array($dirs) )  
	        asort($dirs, SORT_STRING);
	    }
	    
	    if($_GET["sort"] == "filetype" && $_GET["in"] == "desc")
	    {
	      if( is_array($files) )  
	        krsort($files, SORT_STRING);
	      if( is_array($dirs) )  
	        asort($dirs, SORT_STRING);
	    }
	      
	    return array($dirs, $files);   
    }
    // Returns an array with filenames and directory names and file sizes
    // Sorted by file last modified unixtime
    if($_GET["sort"] == "modified")
    {
	    if($_GET["sort"] == "modified" && $_GET["in"] == "asc")
	    {
	      if( is_array($files) )
	        ksort($files, SORT_NUMERIC);
	      if( is_array($dirs) )  
	        ksort($dirs, SORT_NUMERIC);
	    }
	    
	    if($_GET["sort"] == "modified" && $_GET["in"] == "desc")
	    {
	      if( is_array($files) )  
	        krsort($files, SORT_NUMERIC);
	      if( is_array($dirs) )  
	        krsort($dirs, SORT_NUMERIC);
	    }
	      
	    return array($dirs, $files);   
    }
  }
  
/**
 * @desc Image File extension
 * @param $filename, string. The filename to be checked out what image to use based on its extension 
 * 
 * @return string, Returns the image filename corresponding to the filename parameter
 */ 
  function iconImage($filename)
  {
  	global $config;
  	
    $fileExtension = substr($filename, -4, 4);
    $fileExtension = strtolower($fileExtension);
    
    switch($fileExtension) {
    case ".mp3":
    case ".wav":
      $fileImage = "mp3.png";
      break;
    case ".jpg":
    case "jpeg":
    case ".gif":
    case ".png":
    case ".bmp":
      $fileImage = "jpg.png";
      break;
    case ".zip":
    case ".rar":
      $fileImage = "zip.png";
      break;
    case ".avi":
    case ".mpg":
    case "mpeg":
    case ".wmv":
    case "divx":
    case ".mov":
    case ".swf":
      $fileImage = "avi.png";
      break;
    case ".exe":
    case ".bat":
      $fileImage = "exe.png";
      break;
    case ".pdf":
      $fileImage = "pdf.png";
      break;
    case ".htm":
    case "html":
      $fileImage = "html.png";
      break;
    case ".txt":
      $fileImage = "txt.png";
      break;
    case ".php":
      $fileImage = "php.png";
      break;
    case ".doc":
      $fileImage = "doc.png";
      break;
    case ".xls":
      $fileImage = "xls.png";
      break;
    case ".ppt":
      $fileImage = "ppt.png";
      break;
    default:
      $fileImage = "page_white.png";
    }
    
    return $config["class_root"].$fileImage;
  }
}
?>
 |