<?php
################################################################################
### Plugin::Ordnerbild                                                       ###
### Version: 1.3                                                             ###
### geschrieben (C) 2009/09/25 BdM / endzeit21.de                            ###
### geändert 2010/03/10 BdM / endzeit21.de												 					 ###
###                                                                          ###
### Dieses Script darf nur in Zusammenhang mit dem PHP Framework Pixlie      ###
### ( www.pixlie.de ) verwendet werden.                                      ###
### DIE AUTOREN ODER COPYRIGHTINHABER SIND FÜR JEGLICHEN SCHADEN NICHT       ###
### VERANTWORTLICH, OB IN EINEM VERTRAG, DELIKT ODER ANDERS, WELCHER DURCH   ###
### DIE BENUTZUNG DER SOFTWARE ENTSTEHT.                                     ###
################################################################################

// ### Konfiguration ###########################################################
$folderpic_config = array(
  'picsize' => 'f',																			// Größe des Ordnerbildes - Pixlie-kompatibel
  'random' => false,																		// true = Zufallsbild, false = erstes gefundenes Bild
	'dir_upload' => $pixlie_config['dir_upload'],					// Uploadpfad zu den Pixlie-Bildern
	'show_folder_name' => true,														// Ordnername anzeigen [true|false]
	'default_image_name' => 'nopic.png',							// Name des Defaultbildes, welches angezeigt werden soll, wenn keine Bilder in Unterordner (Std: folderpic.png)
	'use_default_image_only' => false,										// Nur das Defaultbild verwenden [true|false]
	'allowed_file_extensions' => 'jpg, jpeg',							// Dateierweiterungen, nach denen gesucht werden soll. Case insensitiv/Groß-, Kleinschreibung egal. Kommasepariert.
	'exclude_folders' => '',															// Kommasepariert Liste der auszuschließenden Ordner. Diese Ordner werden nicht angezeigt. Teile des Ordnernamens sind möglich. Groß-/Kleinschreibung egal. Kann auch leer gelassen werden.
	'use_unique_css_classes' => false											// damit ist es möglich, jedem Ordnervorschaubild einen eigenen Stil zu geben. [ true | false ]
);
// ### Konfiguration Ende ######################################################

$folderpic_config['relpath'] = get_folderpic_relpath();
$folderpic_config['exclude_folders'] = make_array_from_list($folderpic_config['exclude_folders']);
$folderpic_config['allowed_file_extensions'] = make_array_from_list($folderpic_config['allowed_file_extensions']);

// Datei(en) aus einem Verzeichnis einlesen
function getFilesFromDir( $outerDir ){
  GLOBAL $folderpic_config;

  $outerDir = preg_replace('/([\w|\d|\s|\+]*)\/\.\.\//', '', (utf8_decode(urldecode($outerDir)))); // URL dekodieren und Pfad "säubern"
	if( is_dir($outerDir) ) {
    // '.' und '..' aus dem Verzeichnisarray herausfiltern
    $dirs = array_diff( scandir( $outerDir ), Array( ".", ".." ) );
    foreach( $dirs as $d ){
      $e = explode('.', $d);
      $ext = $e[ count( $e ) - 1 ];
      if( is_file($outerDir."/".$d) && in_array(strtolower($ext), $folderpic_config['allowed_file_extensions']) ) {
				if ( !$folderpic_config['random'] )
				  return $e;
        $data[] = $e;
      }
    }
  }
	return ( isset( $data ) ? $data : false );
}

// liefert den relativen Pfad zum Plugin
function get_folderpic_relpath() {
	$fullpath = str_replace('\\', '/', dirname(__FILE__));
	$relpath = substr($fullpath, strlen(str_replace('\\', '/', $_SERVER["DOCUMENT_ROOT"])));
	$relpath = ((substr($relpath, 0, 1) != '/') ? '/' : '') . $relpath;
	$relpath .= (substr($relpath, -1) != '/') ? '/' : '';
	return $relpath;
}

// Liste auseinandernehmen, Leerzeichen entfernen und doppelte Einträge entfernen
function make_array_from_list($theList){
	if ($theList != '') {
		$aList = explode(',', $theList);
		if (count($aList) > 0) {
			array_walk($aList, create_function('&$v,$k','$v = (trim( $v ) != "") ? strtolower( trim( $v ) ) : false;')); // Leerzeichen im auszuschließende-Ordner-Array entfernen
			$aList = array_unique( $aList ); // doppelte Einträge entfernen
			return array_filter($aList);
		}
	}
	return array();
}

//create_function('$value','return (trim( $value ) != "") ? strtolower( trim( $value ) ) : false;')

if( !function_exists( 'canonical' ) ) {
	// Ändert die Backslashes auf Windowssystemen in Slashes
	function canonical( $path ) {
		return urldecode(preg_replace('/%2F/','/',urlencode(utf8_encode(str_replace( '\\', '/', $path )))));
	}
}

if( !function_exists( 'scandir' ) ) { // in case this script gets ported to PHP5, let's not break it
	// scandir Alternative < PHP5
	// http://www.phpbuilder.com/board/showpost.php?p=10776281&postcount=11
  function scandir( $dir ) {
    $files = array(); // added to initialize variable
    $dh = opendir( $dir ); // added some error-checking
    while( false !== ( $filename = readdir( $dh ) ) ) {
      if ( $filename == '.' || $filename == '..' )
        continue; // no need to get the . or .. references, right?
      else
        $files[] = $filename;
    }
    asort( $files );
		return $files;
  }
}

if( !function_exists( 'substr_not_in_array' ) ) { // in case this script isn´t existing
// Exkludierte Verzeichnisse ausschließen
	function substr_not_in_array($needle, $haystack) {
	  $needle = (array) utf8_encode($needle);
		$needle = array_map('preg_quote', $needle, array("/"));
	  $haystack = array_map('preg_quote', $haystack, array("/"));
	  foreach ($haystack as $pattern) {
	    if (count(preg_grep("/$pattern/i", $needle)) > 0) return false;
	  }
	  return true;
	}
}

function folderpic() {
	GLOBAL $pixlie_table_env, $pixlie_table_dir, $pixlie_image_sizes, $pixlie_config, $folderpic_config;

	// Standardgröße setzen, wenn nicht in Pixlie definiert
	if (!isset($pixlie_image_sizes[$folderpic_config['picsize']]))
		$folderpic_config['picsize'] = 'x';
	$imgsize = explode( ',', $pixlie_image_sizes[$folderpic_config['picsize']]['size'] );

	if ( is_array( $pixlie_table_dir ) && count( $pixlie_table_dir ) > 0 ) {
		foreach ($pixlie_table_dir as $folder) {
			if( count( $folderpic_config['exclude_folders'] ) == 0 || ( count( $folderpic_config['exclude_folders'] ) > 0 && substr_not_in_array(strtolower(utf8_decode($folder['name'])), $folderpic_config['exclude_folders']) ) ) { // wenn Ordner nicht in auszuschließende Ordner
				$folderfile = getFilesFromDir(canonical($folderpic_config['dir_upload'].$folder['link_pathinfo']));
		    if ( !$folderpic_config['use_default_image_only'] && $folderfile && is_array( $folderfile )) {
					if ( $folderpic_config['random'] ) // wenn Zufallsbild angezeigt werden soll
		        $folderfile = $folderfile[mt_rand( 0, count( $folderfile )-1 )];
					$ext = array_pop($folderfile);
		      $filename = implode(".", $folderfile);
		      $filename = preg_replace('/%2F/','/',urlencode(utf8_encode($filename)));
		      $aFolderpic[$folder['link_pathinfo']]['name'] = $filename;
		      $aFolderpic[$folder['link_pathinfo']]['extension'] = '.'.$ext;
		    } else {
					$folderfile = canonical($folderpic_config['dir_upload'].$folder['link_pathinfo']).'/'.$folderpic_config['default_image_name'];
					$folderfile = preg_replace('/([\w|\d|\s|\+]*)\/\.\.\//', '', (utf8_decode(urldecode($folderfile)))); // URL dekodieren und Pfad "säubern"
		    	if ( file_exists( $folderfile ) ) {
			      $folderfile = explode('.', $folderpic_config['default_image_name']);
						$ext = array_pop($folderfile);
			      $filename = implode(".", $folderfile);
			      $filename = preg_replace('/%2F/','/',urlencode(utf8_encode($filename)));
			      $aFolderpic[$folder['link_pathinfo']]['name'] = $filename;
			      $aFolderpic[$folder['link_pathinfo']]['extension'] = '.'.$ext;
			      $aFolderpic[$folder['link_pathinfo']]['rel_path'] = dirname( $_SERVER["PHP_SELF"] );
		    	}
				}
				$aFolderpic[$folder['link_pathinfo']]['link'] = utf8_decode($folder['link_pathinfo']);
		    $tmp = explode( '/', $folder['link_pathinfo'] );
		    $aFolderpic[$folder['link_pathinfo']]['folder_name'] = urldecode( $tmp[ count( $tmp )-1 ] );
		    $aFolderpic[$folder['link_pathinfo']]['pixliesize'] = $folderpic_config['picsize'];
		    $aFolderpic[$folder['link_pathinfo']]['imgsize'] = $imgsize;
		  }
    }
	}

	if ( isset( $aFolderpic ) ) {
		?>
		<script type="text/javascript" src="<?php echo $folderpic_config['relpath'];?>folderpic.js"></script>
		<link rel="stylesheet" type="text/css" href="<?php echo $folderpic_config['relpath'];?>folderpic.css" />
		<div id="folderpic-container">
		<?php
		$iFolderCounter = 0;
		foreach ($aFolderpic as $folderpic) {
		?>
		<div class="folderpic<?php if ($folderpic_config['use_unique_css_classes']) { echo '_'.$iFolderCounter;} ?>">
		<a class="folderpic-link" href="?<?php echo $pixlie_config['http_var_name'];?>=<?php echo $folderpic['link'];?>"
			title="<?php echo $folderpic['folder_name'];?>"><?php if ( isset( $folderpic['name'] ) && $folderpic['name'] != '' ) {;?><img
				src="<?php if($folderpic['extension']=='.png') { echo $folderpic['rel_path'].'/../_upload'.urldecode(utf8_decode($folderpic['link'])).'/'.$folderpic['name']; }else{?><?php echo $pixlie_table_env['path_pixlie'];?>?<?php echo $pixlie_config['http_var_name'];?>=<?php echo $folderpic['link'];?>/<?php echo $folderpic['name'];?>_<?php echo $folderpic['pixliesize']?><?php } ?><?php echo $folderpic['extension'];?>"
			  alt="" style="width:<?php echo $folderpic['imgsize'][0];?>px;height:<?php echo $folderpic['imgsize'][1];?>px;" /><?php if ($folderpic_config['show_folder_name']) {?><div class="folderpic-name"><?php echo $folderpic['folder_name'];?></div><?php }} else { ?><div
		    class="emptyfolder" style="width:<?php echo $folderpic['imgsize'][0];?>px;height:<?php echo $folderpic['imgsize'][1];?>px;">Ordner <?php echo urldecode($folderpic['folder_name']);?></div><?php }?></a>
		</div>
		<?php
		$iFolderCounter++;
		}
		?></div><div class="folderpic-clear"></div><?php
	}
}
?>