<?php /* 2013-07 johnpfeiffer index pages Search Engine Optimized = title, etc. will be the current dir
"bread crumb" listing for site navigation at the top, button for sort by name/date/size (and reverse sort), find (grep) form
*/
/* ############ FUNCTION DEFINITIONS ########################################### */
class SortingOption
{
const SORTASCENDINGNAME = 'SORTASCENDINGNAME';
const SORTDESCENDINGNAME = 'SORTDESCENDINGNAME';
const SORTASCENDINGSIZE = 'SORTASCENDINGSIZE';
const SORTDESCENDINGSIZE = 'SORTDESCENDINGSIZE';
const SORTASCENDINGLASTMODIFIEDTIMESTAMP = 'SORTASCENDINGLASTMODIFIEDTIMESTAMP';
const SORTDESCENDINGLASTMODIFIEDTIMESTAMP = 'SORTDESCENDINGLASTMODIFIEDTIMESTAMP';
}
class FileSystemObjectType
{
const OBJECTISDIRECTORY = 0;
const OBJECTISFILE = 1;
}
function displayFindForm()
{
print "<form style='display:inline' action=\"" . $_SERVER['PHP_SELF'] . "\"" . " method=\"post\"> \n" ;
print '<input type="submit" value="find text"> ' ;
print '<input type="text" name="keyword">';
print '</form>';
}
function displayBreadcrumbLinks( $servername , $directories )
{
$path = 'http://' . $servername;
print '<a href="' . $path . '/">' . $servername . "</a>";
print "\n";
$directory_array = explode( "/" , $directories );
for( $i = 1 ; $i < count( $directory_array ) ; $i++ )
{
$path .= '/';
$path .= $directory_array[ $i ];
print " / ";
print '<a href="' . $path . '/">' . $directory_array[$i] . "</a>" ;
print "\n";
}
}
function displayInfoAsTableRow( $name , $size , $lastmodifiedtimestamp )
{
if( !is_null( $name ) && !is_null( $size ) && !is_null( $lastmodifiedtimestamp ) )
{
print "<tr>";
print "<td><a href='$name'>$name</a></td>";
print "<td>" . number_format( $size ) . " bytes</td>";
print "<td>" . date( "Y-m-d H:i T", $lastmodifiedtimestamp ) . "</td>";
print "</tr>\n";
}
}
function displayListingAsTable( $sortingoption , $arraylist )
{
print "<form action=\"" . $_SERVER['PHP_SELF'] . "\"" . " method=\"post\"> \n" ;
print "<table>\n";
print "<tr>";
//buttons allow the next sorting choices, should be refactored
switch( $sortingoption )
{
case SortingOption::SORTASCENDINGNAME:
print '<td><input type="submit" name="' . SortingOption::SORTDESCENDINGNAME . '" value="SORT BY NAME" /> </td>' ;
print '<td><input type="submit" name="' . SortingOption::SORTASCENDINGSIZE . '" value="SORT BY SIZE" /> </td>' ;
print '<td><input type="submit" name="' . SortingOption::SORTDESCENDINGLASTMODIFIEDTIMESTAMP . '" value="SORT BY MODIFIED" /> </td>' ;
break;
case SortingOption::SORTDESCENDINGNAME:
print '<td><input type="submit" name="' . SortingOption::SORTASCENDINGNAME . '" value="SORT BY NAME" /> </td>' ;
print '<td><input type="submit" name="' . SortingOption::SORTASCENDINGSIZE . '" value="SORT BY SIZE" /> </td>' ;
print '<td><input type="submit" name="' . SortingOption::SORTDESCENDINGLASTMODIFIEDTIMESTAMP . '" value="SORT BY MODIFIED" /> </td>' ;
break;
case SortingOption::SORTASCENDINGSIZE:
print '<td><input type="submit" name="' . SortingOption::SORTASCENDINGNAME . '" value="SORT BY NAME" /> </td>' ;
print '<td><input type="submit" name="' . SortingOption::SORTDESCENDINGSIZE . '" value="SORT BY SIZE" /> </td>' ;
print '<td><input type="submit" name="' . SortingOption::SORTDESCENDINGLASTMODIFIEDTIMESTAMP . '" value="SORT BY MODIFIED" /> </td>' ;
break;
case SortingOption::SORTDESCENDINGSIZE:
print '<td><input type="submit" name="' . SortingOption::SORTASCENDINGNAME . '" value="SORT BY NAME" /> </td>' ;
print '<td><input type="submit" name="' . SortingOption::SORTASCENDINGSIZE . '" value="SORT BY SIZE" /> </td>' ;
print '<td><input type="submit" name="' . SortingOption::SORTDESCENDINGLASTMODIFIEDTIMESTAMP . '" value="SORT BY MODIFIED" /> </td>' ;
break;
case SortingOption::SORTDESCENDINGLASTMODIFIEDTIMESTAMP:
print '<td><input type="submit" name="' . SortingOption::SORTASCENDINGNAME . '" value="SORT BY NAME" /> </td>' ;
print '<td><input type="submit" name="' . SortingOption::SORTASCENDINGSIZE . '" value="SORT BY SIZE" /> </td>' ;
print '<td><input type="submit" name="' . SortingOption::SORTASCENDINGLASTMODIFIEDTIMESTAMP . '" value="SORT BY MODIFIED" /> </td>' ;
break;
case SortingOption::SORTASCENDINGLASTMODIFIEDTIMESTAMP:
print '<td><input type="submit" name="' . SortingOption::SORTASCENDINGNAME . '" value="SORT BY NAME" /> </td>' ;
print '<td><input type="submit" name="' . SortingOption::SORTASCENDINGSIZE . '" value="SORT BY SIZE" /> </td>' ;
print '<td><input type="submit" name="' . SortingOption::SORTDESCENDINGLASTMODIFIEDTIMESTAMP . '" value="SORT BY MODIFIED" /> </td>' ;
break;
default:
break;
}
print "</tr> \n";
if( !empty( $arraylist ) )
{
foreach( $arraylist as $key => $value )
{
displayInfoAsTableRow( $arraylist[ $key ]['name'] , $arraylist[ $key ]['size'] , $arraylist[ $key ]['lastmodifiedtimestamp'] );
}
}
print "</table>";
print "\n</form> \n" ;
} // end displayListingAsTable()
function getFileListing( $directorylist )
{
clearstatcache();
$mycurrentdirectory = getcwd();
$mycurrentdirectoryhandle = opendir( $mycurrentdirectory );
$name = readdir( $mycurrentdirectoryhandle );
while( $name !== false )
{
if( $name != "." && $name != ".." )
{
$lastmodifiedtimestamp = filemtime( $name );
if( is_file( $name ) )
{
$filesystemobjecttype = FileSystemObjectType::OBJECTISFILE;
$size = filesize( $name ) ;
}
else if( is_dir( $name ) )
{
$filesystemobjecttype = FileSystemObjectType::OBJECTISDIRECTORY;
$name = $name . "/";
$size = 0;
}
else
{ } //object is probably a sym link
$directorylist[] = array( "filesystemobjecttype" => $filesystemobjecttype , "name" => $name , "size" => $size , "lastmodifiedtimestamp" => $lastmodifiedtimestamp );
}
$name = readdir( $mycurrentdirectoryhandle );
}
closedir( $mycurrentdirectoryhandle );
return $directorylist;
} //end getFileListing()
function countDirectories( $directorylist )
{
$counter = 0 ;
foreach( $directorylist as $key => $value )
{
if( ($directorylist[ $key ][ "filesystemobjecttype" ] == FileSystemObjectType::OBJECTISDIRECTORY ) )
{ $counter++ ;
}
}
return $counter ;
}
function countFiles( $directorylist )
{
$counter = 0 ;
foreach( $directorylist as $key => $value )
{
if( ($directorylist[ $key ][ "filesystemobjecttype" ] == FileSystemObjectType::OBJECTISFILE ) )
{ $counter++ ;
}
}
return $counter ;
}
function findInDir( $targetDirectory, $pattern, $result )
{
$files = scandir( $targetDirectory );
foreach( $files as $f )
{
$contents = file_get_contents( $f );
$pos = strpos( $contents, $pattern );
if( $pos !== false )
{ $result[] = $f;
}
}
return $result;
}
function getFindQuery()
{
$result = '';
if( isset( $_REQUEST[ "keyword" ] ) && !empty( $_REQUEST[ "keyword" ]) )
{ $result = $_REQUEST[ "keyword" ];
}
return $result;
}
function getSortingOption( )
{
$result = SortingOption::SORTASCENDINGNAME ;
if( isset( $_REQUEST[ SortingOption::SORTDESCENDINGNAME ] ) && !empty( $_REQUEST[ SortingOption::SORTDESCENDINGNAME ]) )
{ $result = SortingOption::SORTDESCENDINGNAME ;
}
else if( isset( $_REQUEST[ SortingOption::SORTASCENDINGSIZE ] ) && !empty( $_REQUEST[ SortingOption::SORTASCENDINGSIZE ]) )
{ $result = SortingOption::SORTASCENDINGSIZE ;
}
else if( isset( $_REQUEST[ SortingOption::SORTDESCENDINGSIZE ] ) && !empty( $_REQUEST[ SortingOption::SORTDESCENDINGSIZE ]) )
{ $result = SortingOption::SORTDESCENDINGSIZE ;
}
else if( isset( $_REQUEST[ SortingOption::SORTASCENDINGLASTMODIFIEDTIMESTAMP ] ) && !empty( $_REQUEST[ SortingOption::SORTASCENDINGLASTMODIFIEDTIMESTAMP ]) )
{ $result = SortingOption::SORTASCENDINGLASTMODIFIEDTIMESTAMP ;
}
else if( isset( $_REQUEST[ SortingOption::SORTDESCENDINGLASTMODIFIEDTIMESTAMP ] ) && !empty( $_REQUEST[ SortingOption::SORTDESCENDINGLASTMODIFIEDTIMESTAMP ]) )
{ $result = SortingOption::SORTDESCENDINGLASTMODIFIEDTIMESTAMP ;
}
return $result ;
}
// this function depends a lot on the data model implementation http://us3.php.net/strnatcmp
function sortFileListing( $sortingoption , $arraylist )
{
if( !empty( $arraylist ) )
{
foreach ( $arraylist as $key => $row )
{
$objecttypecolumn[ $key ] = $row[ "filesystemobjecttype" ];
$filenamecolumn[ $key ] = $row[ "name" ];
$filesizecolumn[ $key ] = $row[ "size" ];
$filelastmodifiedtimestampcolumn[ $key ] = $row[ "lastmodifiedtimestamp" ];
}
switch( $sortingoption )
{
case SortingOption::SORTASCENDINGNAME:
array_multisort( $objecttypecolumn , SORT_ASC , $filenamecolumn , SORT_ASC , $filesizecolumn , SORT_ASC , $arraylist );
break;
case SortingOption::SORTDESCENDINGNAME:
array_multisort( $objecttypecolumn , SORT_ASC , $filenamecolumn , SORT_DESC , $filesizecolumn , SORT_ASC , $arraylist );
break;
case SortingOption::SORTASCENDINGSIZE:
array_multisort( $objecttypecolumn , SORT_ASC , $filesizecolumn , SORT_ASC , $filenamecolumn , SORT_ASC , $arraylist );
break;
case SortingOption::SORTDESCENDINGSIZE:
array_multisort( $objecttypecolumn , SORT_ASC , $filesizecolumn , SORT_DESC , $filenamecolumn , SORT_ASC , $arraylist );
break;
case SortingOption::SORTASCENDINGLASTMODIFIEDTIMESTAMP:
array_multisort( $objecttypecolumn , SORT_ASC , $filelastmodifiedtimestampcolumn , SORT_ASC , $filenamecolumn , SORT_ASC , $arraylist );
break;
case SortingOption::SORTDESCENDINGLASTMODIFIEDTIMESTAMP:
array_multisort( $objecttypecolumn , SORT_ASC , $filelastmodifiedtimestampcolumn , SORT_DESC , $filenamecolumn , SORT_ASC , $arraylist );
break;
default:
break;
}
}
return $arraylist ;
} //end sortFileListing()
/* ############ BUILD PAGE ########################################### */
$servername = $_SERVER['SERVER_NAME'];
$page = $_SERVER['PHP_SELF']; //get the url of the resource (webpage)
$dirs = dirname( $page ); //get the dirs that lead to the urls
$querystring = $_SERVER['QUERY_STRING'];
//HEAD SETUP
$title = explode( "/" , $page ); //break the url into pieces
$currentfile = end( $title ); //the name of the current file (last piece)
$currentdirectory = prev( $title ); //find the current directory
$currentdirectory = explode( "-" , $currentdirectory ); //the directory name into array of words
$seocontent = implode( " " , $currentdirectory ); //create a string from words (with spaces)
date_default_timezone_set( 'UTC' );
include( $_SERVER["DOCUMENT_ROOT"] . "/head-doctype-xhtml-transitional.txt");
include( $_SERVER["DOCUMENT_ROOT"] . "/head-favicon.txt");
print "<title> $seocontent </title>" .
"\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/>" .
"\n<meta name=\"description\" content=\"$seocontent\"/>" .
"\n<meta name=\"keywords\" content=\"$seocontent\"/>";
print "\n";
include( $_SERVER["DOCUMENT_ROOT"] . "/john-css.txt");
print "\n</head><body>\n" ;
displayBreadcrumbLinks( $servername , $dirs );
$directorylisting = array();
$directorylisting = getFileListing( $directorylisting );
$directorycount = countDirectories( $directorylisting );
$filecount = countFiles( $directorylisting );
print " \n" ;
if( $directorycount != 0 )
{ print $directorycount . " directories \n" ;
}
if( $filecount !=0 )
{ print $filecount . " files \n" ;
}
print " \n" ;
displayFindForm();
$keyword = getFindQuery();
$result = array();
$result = findInDir( getcwd() , $keyword, $result );
if( $keyword != '' )
{ print " Searched for: " . htmlspecialchars( $keyword );
}
if( count( $result ) > 0 )
{ print " Found in: ";
foreach( $result as $name )
{ print "$name, ";
}
}
print "<br /> \n" ;
print "<br /> \n" ;
if( !empty( $directorylisting ) )
{
$currentsort = getSortingOption() ;
$directorylisting = sortFileListing( $currentsort , $directorylisting ) ;
displayListingAsTable( $currentsort , $directorylisting ) ;
}
print '<br />';
include( $_SERVER["DOCUMENT_ROOT"] . "/foot.txt");
include( $_SERVER["DOCUMENT_ROOT"] . "/google-code.htm");
print "<br />\n";
print "</body>";
print "</html>";
?>