a:8:{s:4:"name";s:8:"ran_tags";s:6:"author";s:11:"Ran Aroussi";s:10:"author_uri";s:27:"http://aroussi.com/projects";s:7:"version";s:3:"0.2";s:11:"description";s:41:"Enables tagging in your TXP-powered blog.";s:4:"help";s:1898:"
	<h2>TXP Tags - Help</h2>
	<p>
		The installation process is pretty simple.
		To install TXP_Tags on your blog, follow these simple steps:
	</p>
	<ol>
		<li>
			In your Textpatten admin, go to <b>admin -> preferences -> advanced preferences</b> and scroll down to <b>custom fields</b> section. 
			Create a custom field named <b>Tags</b> and save your changes.
		</li>
		<li>
			Edit the plugin to let it know which custom field you're using. In the third line, you will see this line.<br />
				<code>$tags_field = 'custom_1'; // <--- YOUR CUSTOM FIELD!</code><br />
				Change the <b><code>$tags_field</code></b> variable's value to custom_1, custom_2, and so on...
		</li>
		<li>
			Create a new section named &lsquo;<b>tag</b>&rsquo;. I that section's page put the following tag:<br />
			<code>&lt;txp:ran_tags_list_tag /&gt;</code>.<br />
			This will automatically display either all tags or a list articles tagged with a specific tag, depending on the request.
		</li>
		<li>
			In your forms that displays your articles, put this code:<br />
			<code>&lt;txp:ran_tags_if_exists&gt;<br />&nbsp; &nbsp; &lt;txp:ran_tags_list_single /&gt;<br />&lt;/txp:ran_tags_if_exists&gt;</code>.<br />
			This will list the article's tags.
		</li>
		<li>
			Last but not least, wherever you want your list of tags to be displays, put this tag:<br />
			<code>&lt;txp:ran_tags_list_all /&gt;</code>. <br />
			NOTE: Place this code inside a <code>&lt;DIV&gt;</code>, and specify assign this DIV a the <b>minimum</b> font-size using CSS.
			The plugin will use this value to calculate the font-size of each tag depending of its weight.
		</li>
	</ol>
	<p>
		That's it!. You're done! From now on, whenever you add or edit an article you will see a <b>Tags</b> textbox under 'adcanced options' on the left-hand side.
	</p>
	<p>
		<img src="http://aroussi.com/assets/downloads/tags_shot.png" alt="" />
	</p>
";s:4:"code";s:4938:"
// ---------------------------------------------------------------------
// CHANGE THIS TO REFLECT YOUR CUSTOM FIELD FOR TAGS
// ---------------------------------------------------------------------
function ran_tags_field($atts) {
	$tags_field = 'custom_1'; // <--- YOUR CUSTOM FIELD!
	return $tags_field;
}

// ---------------------------------------------------------------------
function ran_tags_compact($atts) {
	$i=0;
	$tags = array(); 
	foreach (array_unique($atts) as $tag) {
    $tags[$i] = $tag;
    $i++;
  }
	return $tags;
}

// ---------------------------------------------------------------------
function ran_tags_tag($atts) {
	global $url_mode;
	//extract($atts);
	extract($_GET);

	//extract($_SERVER);
	//$tag =  ($url_mode==1) ? array_pop(explode('tag/', trim($REQUEST_URI, '/'))) : trim($t);
	$tag = $t;
	
	if ($capitalize) { $tag = ucfirst($tag); }
	return $tag;
}

// ---------------------------------------------------------------------
function ran_tags_list_tag($atts) {

	extract($_GET);	
	$tag = isset($t) ? trim($t) : false;
	
	if (!$tag) {
		return '<p>' . ran_tags_list_all(0) . '</p>';
	}

	global $path_from_root, $siteurl, $c, $s, $url_mode, $pretext;
	//extract($atts);
	extract($pretext);
	
	$section = isset($section) ? $section : "article";
	$dateformat = isset($dateformat) ? $dateformat : "F j, Y";
	$subdateformat = isset($sbdateformat) ? $subdateformat : "d";

	$tags_field = ran_tags_field(0);

	$rs = safe_rows_start("id, title, authorid, unix_timestamp(posted) as posted, section, category1, category2, url_title, $tags_field", "textpattern","$tags_field LIKE '% $tag %' OR $tags_field LIKE '$tag %' OR $tags_field LIKE '% $tag' OR $tags_field = '$tag' ORDER BY posted DESC");

	$return_str = '<p>Listed below are articles tagged with &ldquo;<big>' . ucfirst($tag) . '</big>&rdquo;</p>' . "
<dl>";

	if ($rs) {
		$prev_month = '';
		while ($a = nextRow($rs)) {
			extract($a);
			if ($prev_month != date('Ym',$posted)) {
				$return_str .= '<dt>' . date('F Y',$posted) . '</dt>' . "
";
			}
			$prev_month = date('Ym',$posted);
			$permalink = formatPermLink($id,$section);
			$return_str .= "<dd><span class=\"tagDate\">" . date($subdateformat,$posted) . ": </span><a href=\"$permalink\">$title</a></dd>
";
		}
	}

	return $return_str . "
</dl>";
}

// ---------------------------------------------------------------------
function ran_tags_if_exists($atts, $thing) {
	global $thisarticle;
	extract($thisarticle);

	$tags_field = ran_tags_field(0);
	$id = $thisid;

	$rs = safe_row($tags_field, "textpattern", "ID='$id' AND $tags_field <> ''");
	$output = "";
	if ($rs) {
		$output = parse($thing);
	}
	return $output;
}

// ---------------------------------------------------------------------
function ran_tags_list_single($atts) {

	global $url_mode, $thisarticle, $pfr, $siteurl, $path_from_root;

	//extract($atts);
	extract($_SERVER);
	extract($thisarticle);

	$tags_field = ran_tags_field(0);
	$id = $thisid;

	$all_tags = array();
	$rs = safe_row($tags_field, "textpattern", "ID='$id' AND $tags_field <> ''");
	$all_tags = explode(" ", trim(strtolower($rs[$tags_field])));
	sort($all_tags);
	$all_tags = ran_tags_compact($all_tags);

	$tags_html = '';
	$url = 'http://' . $siteurl . $path_from_root . 'tag';
	//$url .= ($url_mode==1) ? '/' : '?t=';
	$url .= '?t=';

	for($i=0; $i<count($all_tags); $i++) {
		$tag_name = ($capitalize) ? ucfirst($all_tags[$i]) : $all_tags[$i];
		$tags_html .= '<a href="' . $url . $all_tags[$i] . '">' . $tag_name .'</a>';
		if($i<count($all_tags)-1) $tags_html .= ", ";
	}
	return $tags_html;
}

// ---------------------------------------------------------------------
function ran_tags_list_all($atts) {
	global $url_mode, $prf, $siteurl, $path_from_root;
	//extract($atts);
	extract($_SERVER);
	
	$tags_field = ran_tags_field(0);

	$all_tags = array();
	$rs = safe_rows("$tags_field", "textpattern", "$tags_field <> ''");
	foreach ($rs as $row) {
		$all_tags = array_merge($all_tags, explode(" ", trim(strtolower($row[$tags_field]))));
	}
	sort($all_tags);

	$tags_weight = array_count_values($all_tags);
	$tags_unique = ran_tags_compact($all_tags);
	
	//get weight tags
	$max = max($tags_weight);
	$min = min($tags_weight);
	$x = 200; $y = 100; // 200%, 100%
	$stepvalue = ($max - $min) / ($x - $y);
	
	$tags_html = '';
	$url = 'http://' . $siteurl . $path_from_root . 'tag';
	//$url .= ($url_mode==1) ? '/' : '?t=';
	$url .= '?t=';

	for($i=0; $i<count($tags_unique); $i++) {
		$no = $tags_unique[$i];
		$tag_weight = $y + round(($tags_weight[$no]-$min) / $stepvalue);
		if ($tag_weight > $y) {
			$tag_weight = ' style="font-size:'. $tag_weight . '%;"';
		} else {
			$tag_weight = '';
		}

		$tag_name = ($capitalize) ? ucfirst($tags_unique[$i]) : $tags_unique[$i];
		$tags_html .= '<a href="' . $url . $tags_unique[$i] . '"' . $tag_weight . '>' . $tag_name .'</a>';
		if($i<count($tags_unique)-1) $tags_html .= ", ";
	}

	return $tags_html;
}
";s:3:"md5";s:32:"bad5ed90b985b94ed8030049eb3b4039";}