<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);

/*
* WARNING: DO NOT EDIT THIS FILE.
* If you edit this file, you will not be able to update to new versions of
* Daux.io without overwritting your changes. Instead use the config.json file
* in the /docs folder to customize your documentation.
*
* Want to add a new feature? Send me a pull request or open an issue - https://github.com/justinwalsh/daux.io
*
* Learn more about what you can customize here: http://daux.io
*/

require_once('libs/markdown_extended.php');

// Check for homepage
$path = url_path();
if ($path === '/' || $path === '') {
	$homepage = true;
} else {
	$homepage = false;
}

// Daux.io Functions
function get_options() {
	$options = array(
		'title' => "Documentation",
		'tagline' => false,
		'image' => false,
		'theme' => 'blue',
		'float' => true,
		'repo' => false,
		'twitter' => array(),
		'links' => array(),
		'colors' => false,
		'google_analytics' => false
	);

	// Load User Config
	$config_file = './docs/config.json';
	if (file_exists($config_file)) {
		$config = json_decode(file_get_contents($config_file), true);
		$options = array_merge($options, $config);
	}

	if ($options['theme'] !== 'custom') {
		// Load Theme
		if (!in_array($options['theme'], array("blue","navy","green","red"))) {
			echo "<strong>Daux.io Config Error:</strong><br>The theme you set is not not a valid option. Please use one of the following options: " . join(array_keys($themes), ', ') . ' or <a href="http://daux.io">learn more</a> about how to customize the colors.';
			exit;
		}
	} else {
		if (empty($options['colors'])) {
			echo '<strong>Daux.io Config Error:</strong><br>You are trying to use a custom theme, but did not setup your color options in the config. <a href="http://daux.io">Learn more</a> about how to customize the colors.';
			exit;
		}
	}

	return $options;
}

function homepage_url($tree) {
	// Check for homepage
	if (isset($tree['index'])) {
		return '/';
	} else {
		return docs_url($tree);
	}
}

function docs_url($tree, $branch = false) {
	// Get next branch
	if (!$branch) {
		$branch = current($tree);
	}

	if ($branch['type'] === 'file') {
		return $branch['url'];
	} else if (!empty($branch['tree'])) {
		return docs_url($branch['tree']);
	} else {
		// Try next folder...
		$branch = next($tree);
		if ($branch) {
			return docs_url($tree, $branch);
		} else {
			echo '<strong>Daux.io Config Error:</strong><br>Unable to find the first page in the /docs folder. Double check you have at least one file in the root of of the /docs folder. Also make sure you do not have any empty folders. Visit the docs to <a href="http://daux.io">learn more</a> about how the default routing works.';
			exit;
		}
	}
}

function load_page($tree) {
	$branch = find_branch($tree);

	if (isset($branch['type']) && $branch['type'] == 'file') {
		$html = '';
		if ($branch['name'] !== 'index') {
			$html .= '<div class="page-header"><h1>'. $branch['title'] . '</h1></div>';
		}
		$html .= MarkdownExtended(file_get_contents($branch['path']));
		return $html;
	} else {
		return "Oh No. That page dosn't exist";
	}
}

function find_branch($tree) {
	$path = url_params();
	foreach($path as $peice) {
		// Check for homepage
		if (empty($peice)) {
			$peice = 'index';
		}

		if (isset($tree[$peice])) {
			if ($tree[$peice]['type'] == 'folder') {
				$tree = $tree[$peice]['tree'];
			} else {
				$tree = $tree[$peice];
			}
		} else {
			return false;
		}
	}

	return $tree;
}

function url_path() {
	$url = parse_url($_SERVER['REQUEST_URI']);
	$url = $url['path'];
	return $url;
}

function url_params() {
	$url = url_path();
	$params = explode('/', trim($url, '/'));
	return $params;
}

function clean_sort($text) {
	// Remove .md file extension
	$text = str_replace('.md', '', $text);

	// Remove sort placeholder
	$parts = explode('_', $text);
	if (isset($parts[0]) && is_numeric($parts[0])) {
		unset($parts[0]);
	}
	$text = implode('_', $parts);

	return $text;
}

function clean_name($text) {
	$text = str_replace('_', ' ', $text);
	return $text;
}

function build_nav($tree, $url_params = false) {
	// Remove Index
	unset($tree['index']);

	if (!is_array($url_params)) {
		$url_params = url_params();
	}
	$url_path = url_path();
	$html = '<ul class="nav nav-list">';
	foreach($tree as $key => $val) {
		// Active Tree Node
		if (isset($url_params[0]) && $url_params[0] == $val['clean']) {
			array_shift($url_params);

			// Final Node
			if ($url_path == $val['url']) {
				$html .= '<li class="active">';
			} else {
				$html .= '<li class="open">';
			}
		} else {
			$html .= '<li>';
		}

		if ($val['type'] == 'folder') {
			$html .= '<a href="#" class="aj-nav folder">'.$val['name'].'</a>';
			$html .= build_nav($val['tree'], $url_params);
		} else {
			$html .= '<a href="'.$val['url'].'">'.$val['name'].'</a>';
		}

		$html .= '</li>';
	}
	$html .= '</ul>';
	return $html;
}

function get_tree($path = '.', $clean_path = '', $title = ''){
	$tree = array();
    $ignore = array('config.json', 'cgi-bin', '.', '..');
    $dh = @opendir($path);
    $index = 0;

    // Build array of paths
    $paths = array();
    while(false !== ($file = readdir($dh))){
		$paths[$file] = $file;
	}

	// Close the directory handle
	closedir($dh);

	// Sort paths
	sort($paths);

    // Loop through the paths
    // while(false !== ($file = readdir($dh))){
	foreach($paths as $file) {

     	// Check that this file is not to be ignored
        if(!in_array($file, $ignore)) {
        	$full_path = "$path/$file";
        	$clean_sort = clean_sort($file);
        	$url = $clean_path . '/' . $clean_sort;
        	$clean_name = clean_name($clean_sort);

        	// Title
        	if (empty($title)) {
        		$full_title = $clean_name;
        	} else {
        		$full_title = $title . ': ' . $clean_name;
        	}

            if(is_dir("$path/$file")) {
            	// Directory
            	$tree[$clean_sort] = array(
            		'type' => 'folder',
            		'name' => $clean_name,
            		'title' => $full_title,
            		'path' => $full_path,
            		'clean' => $clean_sort,
            		'url' => $url,
            		'tree'=> get_tree($full_path, $url, $full_title)
            	);
            } else {
            	// File
            	$tree[$clean_sort] = array(
            		'type' => 'file',
            		'name' => $clean_name,
            		'title' => $full_title,
            		'path' => $full_path,
            		'clean' => $clean_sort,
            		'url' => $url,
            	);
            }
        }
     	$index++;
    }

    return $tree;
}
?>