a:8:{s:4:"name";s:7:"ako_nav";s:7:"version";s:5:"0.9.1";s:6:"author";s:17:"Adrian Kostrubiak";s:10:"author_uri";s:21:"http://www.ako-k.com/";s:11:"description";s:82:"This plugin produces a dynamic navigation bar based on a few specified attributes.";s:4:"help";s:4589:"
	<h2>ako_nav Help File</h2>

	<h3>A dynamic portable navigation creator.</h3>

	<h4>What does it do?</h4>

	<ul>
		<li>Creates a primary <code>div</code></li>
		<li>Inside the <code>div</code>, a heading is added for the Nav bar.</li>
		<li>Creates a <code>ul</code> to hold the nav bar.</li>
		<li>Goes through given urls and names of pages and dynmically adds them as <code>li</code>&#8217;s</li>
		<li><code>class="active"</code> is automatically added to the current page&#8217;s <code>a</code> tag (or optionally, <code>li</code> tag).</li>
	</ul>

	<h4>Examples</h4>

	<p>The simplest form is this:</p>

	<blockquote>
		<p><code>&lt;txp:ako_nav name="home,about,contact" url="/,/about,/contact" /&gt;</code></p>
	</blockquote>

	<p>it will produce something like this:</p>

	<p>bq. <pre><code>&lt;div&gt;
&lt;h2&gt;Navigation&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/"&gt;home&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/about"&gt;about&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/contact"&gt;contact&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;</code></pre></p>

	<p>Add some of the tags below to get a lot more creative.</p>

	<h4>Please note:</h4>

	<p>If you are running your site out of a subdirectory, you do <strong>not</strong> need to include the subdirectory in the url attribute.  (In fact, don&#8217;t include it.  Things sort of fall apart if you do.)<br />
For example, if you are running your site at http://www.ako-k.com/wow/, and you wanted to use ako_nav to make a navigation bar to the about and links page, the code would be</p>

	<blockquote>
		<p><code>&lt;txp:ako_nav name="home,about,contact" url="/,/about,/links" /&gt;</code><br />
and not<br />
<del><code>&lt;txp:ako_nav name="home,about,contact" url="/wow/,/wow/about,/wow/links" /&gt;</code></del></p>
	</blockquote>

	<h4>Tags</h4>

	<ul>
		<li><em>Required</em>
	<ul>
		<li><strong>name</strong> &#8211; This is a list of page names, delimited by commas (and no spaces).</li>
		<li><strong>url</strong> &#8211; This is a list of page url&#8217;s, following the same order as the page names, and also delimited by commas (and no spaces).</li>
	</ul></li>
		<li><em>Optional</em>
	<ul>
		<li><strong>title</strong> &#8211; This is the <code>title</code> attribute for the <code>a</code> tag.</li>
		<li><strong>ulid</strong> &#8211; This is an id for the <code>ul<code> tag.</li>
		<li>&lt;strong&gt;ulclass&lt;/strong&gt; - This is a class for the <code>ul</code>tag.</li>
		<li><strong>liids</strong> &#8211; This is an id for the <code>li<code> tag.</li>
		<li>&lt;strong&gt;liclass&lt;/strong&gt; - This is a class for the <code>li</code>tag.</li>
		<li><strong>aids</strong> &#8211; This is an id for the <code>a<code> tag.</li>
		<li>&lt;strong&gt;aclass&lt;/strong&gt; - This is a class for the <code>a</code>tag.</li>
		<li><strong>spanwrap</strong> &#8211; This is for whether or not the text is wraped in <code>span</code> tags.  0 = not wrapped, 1 = wrapped. By default, it is not wrapped (0).</li>
		<li><strong>spanclass</strong> &#8211; This is a class for the <code>span</code>tag.</li>
		<li><strong>divid</strong> &#8211; This is an id for the <code>div</code> container.</li>
		<li><strong>divclass</strong> &#8211; This is a class for the <code>div</code> container.</li>
		<li><strong>divon</strong> &#8211; This is for whether or not the <code>div</code> is displayed.  0 = not displayed, 1 = displayed. By default, it is displayed (1).</li>
		<li><strong>headid</strong> &#8211; This is an id for the header tag.</li>
		<li><strong>headclass</strong> &#8211; This is a class for the header tag.</li>
		<li><strong>headon</strong> &#8211; This is for whether or not the header text is displayed.  0 = not displayed, 1 = displayed. By default, it is displayed (1).</li>
		<li><strong>headtxt</strong> &#8211; This is the text inside the header its self.  By default, this is &#8220;Navigation&#8221;.</li>
		<li><strong>headlvl</strong> &#8211; This is the level that the <code>h</code> tag is, between 1 and 6.  By default, this is 2.</li>
		<li><strong>curlink</strong> &#8211; This is an option as to whether or not the current section is linked.  0 = not linked, 1 = linked.  By default, it is linked (1).</li>
		<li><strong>classtag</strong> &#8211; This is an option which allows you to add the <code>class="active"</code> to either the <code>a</code> or the <code>li</code> tag.  0 = it is added to the <code>a</code> tag, 1 = it is added to the <code>li</code> tag.  By default, it is added to the <code>a</code> tag (0).</li>
	</ul></li>
	</ul>

	<p>Have Fun!</p>



 ";s:4:"code";s:13500:"// ------------------------
// ako_nav plugin
// Dynamic Navigation Bars
// by Adrian Kostrubiak
// http://www.ako-k.com/
// http://www.wereallafraid.com/
// ------------------------
// ------------------------
//
// Version History:
// Version 0.1 - 02-13-2005 - Initial release
// Version 0.2 - 02-13-2005 - Added ability to turn off header text.
// Version 0.3 - 04-12-2005 - Actually added ability to turn off header text.
//                            (Something was wrong last time, and it took me
//                            a while to pick up on it).
// Version 0.4 - 05-21-2005 - Removed dependance on URLs.  Now we go by the
//                            section variable in $pretext ($pretext['s']).
// Version 0.5 - 06-24-2005 - Fixed an issue in which the class="active" was
//                            not being added when the site was being run out of a
//                            subdirectory.
// Version 0.6 - 06-24-2005 - Added the curlink attribute.  Allows the ability to
//                            have the current section not be linked.
// Version 0.7 - 07-06-2005 - Added ability to have extra names that, if there are
//                            not corresponding links, will not link.  They will
//                            just reside in the list as plain text.
// Version 0.8 - 09-06-2005 - Added ability to set class="active" to li tag
//                            instead of a tag
// Version 0.9 - 10-09-2005 - Dubbed "super-mega-cool instead-of-comp-sci-paper
//                            release."  Added the following attributes: aids,
//                            aclass, liids, liclass, divon, spanwrap, spanclass.
// Version 0.9.1 -10-10-2005- Dubbed "ok so the last one wasn't so super-mega-cool
//                            but this one is" release.  Fixed an issue where
//                            class="active" wasn't being added when aclass was not
//                            specified.
//
// Planned:
// Version 1.0 - XX-XX-2005 - Addition of accesskey and spanids attributes.  Maybe
//                            more goodies.  Who knows... We'll See...

function ako_nav($atts) {

	// get some attributes
    global $pretext;
    global $siteurl;
    $section = $pretext['s'];
    $messy = ($pretext['permlink_mode'] == "messy") ? true : false;             // working on this one...

    // main important attributes
    $page_name  = (empty($atts['name']) ? '' : $atts['name']);					// name
    $page_url   = (empty($atts['url']) ? '' : $atts['url']); 					// url
    $page_title = (empty($atts['title']) ? '' : $atts['title']);				// title

    // ul attributes
    $ul_id    = (empty($atts['ulid']) ? '' : $atts['ulid']);					// ulid
    $ul_class = (empty($atts['ulclass']) ? '' : $atts['ulclass']);				// ulclass

    // li attributes
    $li_id    = (empty($atts['liids']) ? '' : $atts['liids']);					// liids
    $li_class = (empty($atts['liclass']) ? '' : $atts['liclass']);				// liclass

    // a attributes
    $a_id   = (empty($atts['aids']) ? '' : $atts['aids']);                      // aids
    $a_class = (empty($atts['aclass']) ? '' : $atts['aclass']);                 // aclass

    // span attributes
    $span_wrap  = (!isset($atts['spanwrap']) ? '0' : $atts['spanwrap']);        // spanwrap
    $span_class = (empty($atts['spanclass']) ? '' : $atts['spanclass']);        // spanclass
    // planned for the future
    // $span_id = (empty($atts['spanid']) ? '' : $atts['spanid']);                 // spanid

    // div attributes
    $div_id    = (empty($atts['divid']) ? 'nav' : $atts['divid']);				// divid
    $div_class = (empty($atts['divclass']) ? '' : $atts['divclass']);			// divclass
    $div_on    = (!isset($atts['divon']) ? '1' : $atts['divon']);			    // divon

    // heading attributes
    $head_id     = (empty($atts['headid']) ? '' : $atts['headid']);				// headid
    $head_class  = (empty($atts['headclass']) ? '' : $atts['headclass']);		// headclass
    $head_status = (!isset($atts['headon']) ? '1' : $atts['headon']);			// headon
    $head_text   = (empty($atts['headtxt']) ? 'Navigation' : $atts['headtxt']);	// headtxt
    $head_level  = (empty($atts['headlvl']) ? '2' : $atts['headlvl']);			// headlvl

    // random
    $cur_link  = (!isset($atts['curlink'])  ? '1' : $atts['curlink']);			// curlink
    $class_tag = (!isset($atts['classtag']) ? '0' : $atts['classtag']);         // classtag
    $wrap_tag  = (!isset($atts['wraptag'])  ? 'li' : $atts['wraptag']);         // wraptag
    // planned for the future
    // $accesskey = (empty($atts['acskey']) ? '' : $atts['acskey']);			// accesskey
	// end attributes

	// make sure we're doing _something_ here..
    $help_link = "Please see the <a href=\"http://www.ako-k.com/archive/108\" title=\"helpfile for ako_nav\">help file</a> for more information.";
    if (!$page_name) return("<strong>Warning:</strong> No page name&#8217;s specified in attributes for ako_nav.  $help_link".n);
    if (!$page_url)  return("<strong>Warning:</strong> No page URL&#8217;s specified in attributes for ako_nav.  $help_link".n);

	$ako_out = "";

	// parse the uri's, title's, and name's of pages..
	$pages[] = explode(",", $page_name);
	$pages[] = explode(",", $page_url);
	if (!empty($page_title)) { $pages[] = explode(",", $page_title); } else { $pages[] = array_fill(0, count($pages[0]), ""); }
	if (!empty($a_id))       { $pages[] = explode(",", $a_id);       } else { $pages[] = array_fill(0, count($pages[0]), ""); }
	if (!empty($li_id))      { $pages[] = explode(",", $li_id);      } else { $pages[] = array_fill(0, count($pages[0]), ""); }
	$pages[] = $a_class;
	$pages[] = $li_class;
	/* if (!empty($accesskey)) { $pages[] = explode(",", $accesskey) }
	else {
	   for ($i=0; i < count($pages[0]); $i++) {
	       $pages[7] = array_fill($i, 1, ($i+1));
        }
    } */


	// start putting together a navbar...
	if ($div_on == 1) {
        // if <div> is desired
        $ako_out .= "<div". parse_id($div_id) . parse_class($div_class, false) .">".n;
    }
	if ($head_status == 1) {
		// if the header is desired...
		$ako_out .= "<h$head_level". parse_id($head_id) . parse_class($head_class, false) .">$head_text</h$head_level>".n;
	}
	$ako_out .= "<ul". parse_id($ul_id) . parse_class($ul_class, false) .">".n;

    // check spanwrap..
    if ($span_wrap == 1) {
        $i = 0;
        foreach ($pages[0] as $value) {
            $pages[0][$i] = "<span". parse_class($span_class, false) .">$value</span>";
            $i++;
        }
    }

	// heres the trickery to go through the ul's, and add the class="active" dynamically
	for ($i = 0; $i < count($pages[0]); $i++) {
		$navbar[] = array("name"      => $pages[0][$i],
		                  "url"       => $pages[1][$i],
		                  "title"     => $pages[2][$i],
		                  "aid"       => $pages[3][$i],
		                  "liid"      => $pages[4][$i],
		                  "aclass"    => $pages[5],
		                  "liclass"   => $pages[6]/*,
		                  "accesskey" => $pages[7][$i]*/);
	}

    // all the magique goes on here. check it further below.
	if (($cur_link == 1) && ($class_tag == 0)) {
        $ako_out .= parse_li_1($navbar, $section, $siteurl);
	} elseif (($cur_link == 1) && ($class_tag == 1)) {
        $ako_out .= parse_li_2($navbar, $section, $siteurl);
	} elseif (($cur_link == 0) && ($class_tag == 0)) {
        $ako_out .= parse_li_3($navbar, $section, $siteurl);
    } elseif (($cur_link == 0) && ($class_tag == 1)) {
        $ako_out .= parse_li_4($navbar, $section, $siteurl);
    }

	// finish off the navbar...
	$ako_out .= "</ul>".n;
	if ($div_on == 1) {
	   $ako_out .= "</div>".n;
    }

	return($ako_out);
}

/* =========================================================================
    parse_li key:
    1: link to current selection, add class="active" to anchor tags
    2: link to current selection, add class="active" to list items
    3: no link to current selection, add class="active" to anchor tags
    4: no link to current selection, add class="active" to list items
========================================================================= */

function parse_li_1($navbar, $section, $siteurl) {
	// link to current selection, add class="active" to anchor tags
	if ($section == "default") $section = "";
	$p_out = "";
    for ($i = 0; $i < count($navbar); $i++) {
        if (!empty($navbar[$i]["url"])) {
            // there is a link
            $p_out .= "<li". parse_id($navbar[$i]["liid"]) . parse_class($navbar[$i]["liclass"], false) .">";
            $p_out .= "<a href=\"http://$siteurl". $navbar[$i]["url"] ."\"". parse_title($navbar[$i]["title"]) ." accesskey=\"". ($i+1) ."\"";
            $p_out .= parse_class($navbar[$i]["aclass"], classActiveize($section, $navbar[$i]["url"]));
            $p_out .= parse_id($navbar[$i]["aid"]) .">". $navbar[$i]["name"] ."</a>";
            $p_out .= "</li>".n;
        } else {
            // no link, just text
            $p_out .= "<li". parse_id($navbar[$i]["liid"]) . parse_class($navbar[$i]["liclass"], false) .">". $navbar[$i]["name"] ."</li>".n;
        }
    }
    return($p_out);
}


function parse_li_2($navbar, $section, $siteurl) {
	// link to current selection, add class="active" to list items
	if ($section == "default") $section = "";
	$p_out = "";
    for ($i = 0; $i < count($navbar); $i++) {
        if (!empty($navbar[$i]["url"])) {
            // there is a link
            $p_out .= "<li". parse_id($navbar[$i]["liid"]) . parse_class($navbar[$i]["liclass"], classActiveize($section, $navbar[$i]["url"])) .">";
            $p_out .= "<a href=\"http://$siteurl". $navbar[$i]["url"] ."\"". parse_title($navbar[$i]["title"]) ." accesskey=\"". ($i+1) ."\"";
            $p_out .= parse_id($navbar[$i]["aid"]) . parse_class($navbar[$i]["aclass"], false) .">". $navbar[$i]["name"] ."</a>";
            $p_out .= "</li>".n;
        } else {
            // no link, just text
            $p_out .= "<li". parse_id($navbar[$i]["liid"]) . parse_class($navbar[$i]["liclass"], classActiveize($section, $navbar[$i]["url"])) .">";
            $p_out .= $navbar[$i]["name"] ."</li>".n;
        }
    }
    return($p_out);
}


function parse_li_3($navbar, $section, $siteurl) {
	// no link to current selection, add class="active" to anchor tags
	// this doesn't make sense...
	if ($section == "default") $section = "";
	$p_out = "";
    for ($i = 0; $i < count($navbar); $i++) {
        if (!empty($navbar[$i]["url"])) {
        // there is a link
            if (classActiveize($section, $navbar[$i]["url"])) {
                $p_out .= "<li". parse_id($navbar[$i]["liid"]) . parse_class($navbar[$i]["liclass"], false) .">". $navbar[$i]["name"] ."</li>".n;
            } else {
                $p_out .= "<li". parse_id($navbar[$i]["liid"]) . parse_class($navbar[$i]["liclass"], false) .">";
                $p_out .= "<a href=\"http://$siteurl". $navbar[$i]["url"] ."\"". parse_title($navbar[$i]["title"]) ." accesskey=\"". ($i+1) ."\"";
                $p_out .= parse_id($navbar[$i]["aid"]) . parse_class($navbar[$i]["aclass"], false) .">". $navbar[$i]["name"] ."</a>";
                $p_out .= "</li>".n;
            }
        } else {
            // no link, just text
            $p_out .= "<li". parse_id($navbar[$i]["liid"]) . parse_class($navbar[$i]["liclass"], false) .">". $navbar[$i]["name"] ."</li>".n;
        }
    }
    return($p_out);
}


function parse_li_4($navbar, $section, $siteurl) {
	// no link to current selection, add class="active" to list items
	if ($section == "default") $section = "";
	$p_out = "";
    for ($i = 0; $i < count($navbar); $i++) {
        if (!empty($navbar[$i]["url"])) {
            // there is a link
            if (classActiveize($section, $navbar[$i]["url"])) {
                // we're in current section, no link to it
                $p_out .= "<li". parse_id($navbar[$i]["liid"]) . parse_class($navbar[$i]["liclass"], true) .">". $navbar[$i]["name"] . "</li>".n;
            } else {
                // not in current section, link to those.
                $p_out .= "<li". parse_id($navbar[$i]["liid"]) . parse_class($navbar[$i]["liclass"], false) .">";
                $p_out .= "<a href=\"http://$siteurl". $navbar[$i]["url"] ."\"". parse_title($navbar[$i]["title"]) ." accesskey=\"". ($i+1) ."\"";
                $p_out .= parse_id($navbar[$i]["aid"]) . parse_class($navbar[$i]["aclass"], false) .">". $navbar[$i]["name"] ."</a>";
                $p_out .= "</li>".n;
            }
        } else {
            // no link, just text
            $p_out .= "<li". parse_id($navbar[$i]["liid"]) . parse_class($navbar[$i]["liclass"], classActiveize($section, $navbar[$i]["url"])) .">";
            $p_out .= $navbar[$i]["name"] ."</li>".n;
        }
    }
    return($p_out);
}


function classActiveize($sx, $niUrl) { // section, navbar[i][url]
    return ((strpos($sx, substr($niUrl, 1)) !== false) || (!$sx && (!substr($niUrl, 1))));
}
function parse_title($title) {
	return((empty($title)) ? "" : " title=\"$title\"");
}
function parse_id($id) {
	return((empty($id)) ? "" : " id=\"$id\"");
}
function parse_class($class, $a) { // a = bool, true=its active
	if ($a) {
        $p_out = (empty($class)) ? " class=\"active\"" : " class=\"$class active\"";
    } else {
        $p_out = (empty($class)) ? "" : " class=\"$class\"";
    }
	return($p_out);
}
// Congratulations!
// You've made it to the end of my code.  Your special prize is the ability to now tell me how to make it bettre.";s:3:"md5";s:32:"1f8d99cf3c81907c469f5942c7a4cde2";}