a:8:{s:4:"name";s:15:"sgb_url_handler";s:6:"author";s:3:"sgb";s:10:"author_uri";s:23:"http://mighthitgold.net";s:7:"version";s:5:"0.1.2";s:11:"description";s:43:"support all url variations at the same time";s:4:"help";s:2341:"

	<h3>sgb_url_handler</h3>
	<p>TxP 1.0 RC3 introduced a number of (long-awaited) URL options, however there were no options to preserver backwards compatibility with existing links (e.g. off-site links, forums, search engines, etc.). This plugin evolved to filled that gap, allowing authors the option of selecting, newer, cleaner schemes while still supporting existing links. This plugin also introduces the option to add additional link formats. Although manual edits will need to be made to several files for complete support.</p>

	<p>This plugin runs on top of the existing TxP URL parsing code. It parses URLs and adds the values to the super globals <code>$_GET</code>, <code>$_POST</code> and <code>$_REQUEST</code>. Typically TxP will see these requests values and runs as if it were in "messy" mode. If for some reason the plugin is unable to parse the URL it is designed to no alter anything and allow TxP to handle the URL normally.</p>

	<h3>What it Handles</h3>
	<p>As of this version (1.1.2) it handles the following URLs.</p>

	<ul>
		<li>example.com/section/id/title</li>
		<li>example.com/section/title</li>
		<li>example.com/section/category/title</li>
		<li>example.com/section/category</li>
		<li>example.com/section</li>
		<li>example.com/title</li>
		<li>example.com/id/title</li>
		<li>example.com/year/month/day/title</li>
	</ul>

	<p>Additionally, this plugin supports the following trigger words:</p>

	<ul>
		<li>example.com/{section}/Section</li>
		<li>example.com/{category}/Category</li>
		<li>example.com/{author}/Author</li>
		<li>example.com/atom</li>
		<li>example.com/rss</li>
	</ul>

	<p>The plugin supports all these modes with or without a trailing slash. In the event of collisions, the plugin will check the more general term first, e.g. /Section will be checked before /Title.</p>

	<p>Please note, as of TxP 1.0 RC3 (2005-03-05) there appears to be issues with correctly retrieving /Year/Month/Day/Title URLs.</p>

	<p>Also note that this plugin is designed to work with clean URLs on servers without mod_rewrite. You'll need to modify your links and append index.php/ to the beginning, e.g. example.com/index.php/section/id/title.</p>

	<h3>Configuration</h3>
	<p>There are no configuration options for this plugin. Activate and you're ready to go.</p>
	
";s:4:"code";s:4026:"
function sgb_url_set($key = null, $value = null) // void
{
	$_GET[$key]     = $value;
	$_POST[$key]    = $value;
	$_REQUEST[$key] = $value;
}

function sgb_url_doTrigger($trigger = 'none', $parts = array()) // void
{
	switch ($trigger)
	{
		case 'atom':
			include txpath.'/publish/atom.php'; exit(atom());

		case 'rss':
			include txpath.'/publish/rss.php'; exit(rss());
		
		case 'section':
			sgb_url_set('s', ((ckEx('section', $parts[1])) ? $parts[1] : 'default'));
		break;
		
		case 'category':
			sgb_url_set('c', ((ckEx('category', $parts[1])) ? $parts[1] : ''));
		break;
		
		case 'author': // right now this can't handle authors so don't do anything and let the regular stuff handle it
		break;
		
		case 'p':
			sgb_url_set('p', ((is_numeric($parts[1])) ? $parts[1] : ''));
		break;
	}
}

function sgb_url_checkPath() // void
{
	global $timeoffset;

	if ($_SERVER['PATH_INFO']) {
		$request = trim($_SERVER['PATH_INFO'], '/');
	} else {
		$raw_uri     = trim(array_shift(explode('?', $_SERVER['REQUEST_URI'])), '/');
		$script_path = trim(dirname($_SERVER['SCRIPT_NAME']), '/');
		$request     = trim(substr($raw_uri, strlen($script_path)), '/');
	}

	$parts = explode('/', $request);
	$partsCount = count($parts);

	$triggers = array(
		strtolower(gTxt('section'))  => 'section', 
		strtolower(gTxt('category')) => 'category', 
		strtolower(gTxt('author'))   => 'author', 
		'atom' => 'atom', 
		'rss' => 'rss'
	);

	if (!empty($parts[0])) {
		/*
		** Run against know triggers
		*/
		foreach ($triggers as $trigger) {
			if ($parts[0] == $trigger) {
				sgb_url_doTrigger($trigger, $parts);
				return;
			}
		}

		/*
		** Nothing "tripped" our trigger, so we'll try against one of the URL 
		** cases
		*/

		// Could be /Title or /Section
		if ($partsCount < 2) {
			// Treat as /Section
			$s = (ckEx('section', $parts[0])) ? $parts[0] : null;

			// Must be /Title
			if (empty($s)) {
				$rs = lookupByTitle($parts[0]);
				$id = (!empty($rs['ID'])) ? $rs['ID'] : null;
				$s  = (!empty($rs['Section'])) ? $rs['Section'] : null;
			}
		
		// Could be /ID/Title, /Section/Title or /Section/Category
		} else if ($partsCount < 3) {

			// Treat as /ID/Title
			if (is_numeric($parts[0])) {
				$rs = lookupByID($parts[0]);
				$id = (!empty($rs['ID'])) ? $rs['ID'] : '';
				$s  = (!empty($rs['Section'])) ? $rs['Section'] : '';
			
			// Treat as /Section/Title or /Section/Category
			} else {
				// Might be /Section/Category
				$s  = (ckEx('section', $parts[0])) ? $parts[0] : null;
				$c  = (ckEx('category', $parts[1])) ? $parts[1] : null;

				// Must be /Section/Title
				if (!isset($c)) {
					$rs = lookupByTitle($parts[1]);
					$id = $rs['ID'];
					$s  = (!isset($s)) ? $rs['Section'] : $s;
				}
			}
		
		// Could be /Section/ID/Title (Classic URL) or /Section/Category/Title
		} else if ($partsCount < 4) {
			$s  = (ckEx('section', $parts[0])) ? $parts[0] : null;

			// Must be /Section/ID/Title (Classic URL)
			if (is_numeric($parts[1])) {
				$id = (ckExID($parts[1])) ? $parts[1] : '';

			// Must be /Section/Category/Title
			} else {
				$rs = lookupByID($parts[0]);
				$c  = (ckEx('category',$parts[1])) ? $parts[1] : null;
				$id = (!empty($rs['ID'])) ? $rs['ID'] : '';
			}
		
		// Could be /Year/Month/Day/Title
		} else if ($partsCount > 4) {
			$when = date("Y-m-d",strtotime("$parts[0]-$parts[1]-$parts[2]") + $timeoffset);
			$rs = lookupByDateTitle($when, $parts[3]);
			$id = (!empty($rs['ID'])) ? $rs['ID'] : '';
			$s  = (!empty($rs['Section'])) ? $rs['Section'] : '';
		}
	}

	$id = (empty($id)) ? null : $id;
	$s  = (empty($s)) ? null : $s;

	if (empty($_GET['id']) && empty($_POST['id'])) {
		sgb_url_set('id', $id);
	}

	if (empty($_GET['s']) && empty($_POST['s'])) {
		sgb_url_set('s',  $s);
	}

	if (empty($_GET['c']) && empty($_POST['c'])) {
		sgb_url_set('c',  $c);
	}

	return;
}

sgb_url_checkPath();
";s:3:"md5";s:32:"d1e4c6fa07110c6faa1e7ae06b7f717a";}