<?xml version="1.0"?>
<!DOCTYPE modification SYSTEM "http://www.simplemachines.org/xml/modification">
<modification xmlns="http://www.simplemachines.org/xml/modification" xmlns:smf="http://www.simplemachines.org/">
	<id>yodaofdarkness:tagging</id>
	<version>1.0.2</version>

<file name="$boarddir/index.php">
	<operation>
		<search position="after"><![CDATA[
		'theme' => array('Themes.php', 'ThemesMain'),]]></search>
		<add><![CDATA[
		'tags' => array('Tagging.php', 'TagsMain'),]]></add>
	</operation>
</file>

<file name="$sourcedir/Admin.php">
	<operation>
		<search position="before"><![CDATA[
				'theme' => array(
					'label' => $txt['theme_admin'],
					'file' => 'Themes.php',
					'function' => 'ThemesMain',
					'custom_url' => $scripturl . '?action=admin;area=theme;sa=admin',
					'icon' => 'themes.gif',
					'subsections' => array(
						'admin' => array($txt['themeadmin_admin_title']),
						'list' => array($txt['themeadmin_list_title']),
						'reset' => array($txt['themeadmin_reset_title']),
						'edit' => array($txt['themeadmin_edit_title']),
					),
				),]]></search>
		<add><![CDATA[
				'tagging' => array(
					'label' => $txt['tags_admin'],
					'file' => 'Tagging.php',
					'function' => 'TagsMain',
					'custom_url' => $scripturl . '?action=admin;area=tagging;sa=view',
					'icon' => 'modifications.gif',
					'subsections' => array(
						'settings' => array($txt['tagsadmin_settings_title']),
						'view' => array($txt['tagsadmin_view_title']),
					),
				),]]></add>
	</operation>
</file>

<file name="$sourcedir/Display.php">
	<operation>
		<search position="before"><![CDATA[
	$context['topic_first_message'] = $topicinfo['id_first_msg'];]]></search>
		<add><![CDATA[

	$context['tags'] = array();

	$result = $smcFunc['db_query']('', '
		SELECT t.tag_name
		FROM {db_prefix}tag_topics AS tt
			INNER JOIN {db_prefix}tags AS t ON (t.id_tag = tt.id_tag)
		WHERE tt.id_topic = {int:topic}',
		array(
			'topic' => $topic
		)
	);

	while($row = $smcFunc['db_fetch_assoc']($result)){
		$context['tags'][] = $row['tag_name'];
	}

	$smcFunc['db_free_result']($result);]]></add>
	</operation>
</file>

<file name="$sourcedir/Post.php">
	<operation>
		<search position="before"><![CDATA[
	$context['robot_no_index'] = true;]]></search>
		<add><![CDATA[
	$context['tags'] = array();]]></add>
	</operation>

	<operation>
		<search position="before"><![CDATA[
		$context['icon'] = isset($_REQUEST['icon']) ? preg_replace('~[\./\\\\*\':"<>]~', '', $_REQUEST['icon']) : 'xx';]]></search>
		<add><![CDATA[

		$ids = 0;
		$raw_tags = array();

		// Was it by ajax?
		if(isset($_POST['ajax_tags']))
			foreach($_POST['ajax_tags'] as $tag)
				$raw_tags[] = $tag;
		else if(isset($_POST['tags']))
			$raw_tags = explode(',', $_REQUEST['tags']);

		if (!empty($raw_tags)){
			foreach($raw_tags as $tag){
				$tag = preg_replace("([?!\"':;./\\|&%$#<>*\)\(\[\]{}+=@~`_]+)", "", strtolower($tag));

				$context['tags'][] = array(
					'name' => $tag,
					'last' => false
				);
			}

			if(!empty($context['tags']))
				$context['tags'][count($context['tags'])-1]['last'] = true;
		}]]></add>
	</operation>

	<operation>
		<search position="before"><![CDATA[

		// Check the boxes that should be checked.]]></search>
		<add><![CDATA[

		$context['tags'] = array();

		$result = $smcFunc['db_query']('', '
			SELECT t.tag_name
			FROM {db_prefix}tag_topics AS tt
				INNER JOIN {db_prefix}tags AS t ON (t.id_tag = tt.id_tag)
			WHERE tt.id_topic = {int:topic}',
			array(
				'topic' => $topic
			)
		);

		while($tag_row = $smcFunc['db_fetch_assoc']($result)){
			$context['tags'][] = array(
				'name' => $tag_row['tag_name'],
				'last' => false,
			);
		}

		if(!empty($context['tags']))
			$context['tags'][count($context['tags'])-1]['last'] = true;

		$smcFunc['db_free_result']($result);]]></add>
	</operation>

	<operation>
		<search position="after"><![CDATA[

	// Editing or posting an event?]]></search>
		<add><![CDATA[

	if(isset($_REQUEST['tags']) || isset($_POST['ajax_tags'])){

		// Was it by ajax?
		if(isset($_POST['ajax_tags']))
			foreach($_POST['ajax_tags'] as $tag)
				$raw_tags[] = $tag;
		else
			$raw_tags = explode(',', $_REQUEST['tags']);

		// Remove all punctuation and nonsense characters, while leaving anything useful.
		foreach($raw_tags as $tag)
			$tags[] = trim(preg_replace("([?!\"':;./\\|&%$#<>*\)\(\[\]{}+=@~`_]+)", "", strtolower($tag)));

		$count = 0;

		// Wipe it clean, so we don't keep any old tags
		$smcFunc['db_query']('', '
			DELETE FROM {db_prefix}tag_topics
			WHERE id_topic = {int:topic}',
			array(
				'topic' => $topic
			)
		);

		foreach($tags as $tag){
			// Make sure it's not an empty string, they're not over the limit, and it's inside the length range
			if(empty($tag) || $count >= $modSettings['max_tags'] || strlen($tag) < $modSettings['min_tag_length'] || strlen($tag) > $modSettings['max_tag_length'])
				continue;

			// Add this tag to the tags table if it doesn't exist
			$result = $smcFunc['db_query']('', '
				SELECT id_tag
				FROM {db_prefix}tags
				WHERE tag_name = {string:tag_name}
				LIMIT 1',
				array(
					'tag_name' => $tag
				)
			);

			if($smcFunc['db_num_rows']($result) == 0){
				// Let's add it!
				$smcFunc['db_insert']('',
					'{db_prefix}tags',
					array(
						'tag_name' => 'string', 'id_member' => 'int', 'date_added' => 'int'
					),
					array(
						$tag, $user_info['id'], time()
					),
					array('id_tag')
				);

				$tag_id = $smcFunc['db_insert_id']('{db_prefix}tags', 'id_tag');
			} else {
				//Since we have it, just grab the tag number!
				list ($tag_id) = $smcFunc['db_fetch_row']($result);
			}

			$smcFunc['db_free_result']($result);

			// And now let's add it to tag_topics so we can find it later
			$smcFunc['db_insert']('replace',
				'{db_prefix}tag_topics',
				array(
					'id_tag' => 'int', 'id_topic' => 'int'
				),
				array(
					$tag_id, $topic
				),
				array('id_tag', 'id_topic')
			);

			$count++;
		}
	}]]></add>
	</operation>
</file>

<file name="$sourcedir/Subs.php">
	<operation>
		<search position="after"><![CDATA[
			'login' => array(]]></search>
		<add><![CDATA[
			'tags' => array(
				'title' => $txt['tags'],
				'href' => $scripturl . '?action=tags',
				'show' => !$user_info['is_guest'],
				'sub_buttons' => array(
				),
			),]]></add>
	</operation>
</file>

<file name="$sourcedir/Subs-Editor.php">
	<operation>
		<search position="before"><![CDATA[
		'member' => 'Member',]]></search>
		<add><![CDATA[
		'tag' => 'Tag',]]></add>
	</operation>

	<operation>
		<search position="end" />
		<add><![CDATA[

// I heard you like tags, so I put some tags in your tags!
function AutoSuggest_Search_Tag()
{
	global $user_info, $txt, $smcFunc;

	$original = $_REQUEST['search'];
	$ids = isset($_REQUEST['ids']) ? $_REQUEST['ids'] : 0;
	$_REQUEST['search'] = trim($smcFunc['strtolower']($_REQUEST['search'])) . '*';
	$_REQUEST['search'] = strtr($_REQUEST['search'], array('%' => '\%', '_' => '\_', '*' => '%', '?' => '_', '&#038;' => '&amp;'));

	// Find the tag.
	$request = $smcFunc['db_query']('', '
		SELECT tag_name
		FROM {db_prefix}tags
		WHERE tag_name LIKE {string:search}
		LIMIT ' . (strlen($_REQUEST['search']) <= 2 ? '100' : '800'),
		array(
			'search' => $_REQUEST['search'],
		)
	);
	$xml_data = array(
		'items' => array(
			'identifier' => 'item',
			'children' => array(),
		),
	);
	while ($row = $smcFunc['db_fetch_assoc']($request))
	{
		$row['tag_name'] = strtr($row['tag_name'], array('&amp;' => '&#038;', '&lt;' => '&#060;', '&gt;' => '&#062;', '&quot;' => '&#034;'));

		$listed[$row['tag_name']] = true;

		$xml_data['items']['children'][] = array(
			'attributes' => array(
				'id' => $ids++,
			),
			'value' => $row['tag_name'],
		);
	}
	$smcFunc['db_free_result']($request);

	// Always show their original request first, if it's not already there... they need to be able to add new ones!
	if(!isset($listed[$original]))
		array_unshift($xml_data['items']['children'],
			array(
				'attributes' => array(
					'id' => $ids++,
				),
				'value' => $original,
			)
		);

	return $xml_data;
}]]></add>
	</operation>
</file>

<file name="$themedir/Post.template.php">
	<operation>
		<search position="after"><![CDATA[
							<tr>
								<td align="right">
									<b>', $txt['message_icon'], ':</b>
								</td>]]></search>
		<add><![CDATA[';

	// Only show this when it's the first post.
	if($context['is_first_post']){
		echo '
							<tr>
								<td align="right" style="font-weight: bold;">
									', $txt['tags'], ':
								</td>
								<td>
									<input type="text" name="tags" id="tags" tabindex="', $context['tabindex']++, '" size="80" /><br />
									<div id="tag_list_container"></div>
									<span id="tags_instructions" class="smalltext">', $txt['tags_instructions'], '</span>
									<script language="JavaScript" type="text/javascript" src="', $settings['default_theme_url'], '/scripts/tagging.js?rc1"></script>
									<script language="JavaScript" type="text/javascript"><!-- // -->
										var oTagSend = new smf_TagSend({
											sSelf: \'oTagSend\',
											sSessionId: \'', $context['session_id'], '\',
											sTextDeleteItem: \'', $txt['autosuggest_delete_item'], '\',
											sToControlId: \'tags\',
											aPresetTags: [';
		$tc = 0;
		foreach ($context['tags'] as $tag)
			echo '
												{
													sItemId: ', $tc++, ',
													sItemName: ', JavaScriptEscape($tag['name']), '
												}', $tag['last'] ? '' : ',';

	echo '
											],
										});
									// </script>
								</td>
							</tr>';
	}

	echo ']]></add>
	</operation>
</file>

</modification>
