search.naml

<macro name="search_page" requires="servlet">
	<n.search_page_html/>
</macro>

<macro name="search_page_html" requires="servlet">
	<n.define_search_query_field/>
	<n.node_page.search_namespace.>
		<n.set_var name='didSearch' value="false" />
		<n.catch_exception. id="search-block">
			<n.do_search_using_params />
			<n.set_var name='didSearch' value="true" />
		</n.catch_exception.>
		<n.html>
			<head>
				<meta name="robots" content="noindex,nofollow"/>
				<n.search_page_title/>
				<n.set_cookies did_search="[n.var name='didSearch'/]" />
				<n.search_page_style/>
			</head>
			<body>
				<n.show_search_form/>
				<n.show_search_error/>
				<n.search_results_header/>

				<n.results.loop.current_node.>
					<n.search_result_row/>
				</n.results.loop.current_node.>

				<n.search_pagination/>

				<n.if.not.lucene_is_ready>
					<then.index_rebuilt_notice/>
				</n.if.not.lucene_is_ready>

				<n.if.has_results>
					<then.show_search_form/>
				</n.if.has_results>
			</body>
		</n.html>
	</n.node_page.search_namespace.>
</macro>

<macro name="search_page_title" requires="search">
	<n.title.>
		<n.case_all.>Search for '<n.search_query_field.value/>'</n.case_all.>
		<n.case_author_search.>Messages of <n.user.name/></n.case_author_search.>
	</n.title.>
</macro>

<macro name="search_page_style" requires="search">
	<style type="text/css">
		.nabble td.verbose-search-box {
			text-align: left;
			padding-top: .33em;
			padding-bottom: .33em;
			padding-left: .17em;
		}
		div.search-results-header {
	        margin:2em 0 1em;
	        font-size:90%;
		}
	</style>
</macro>

<macro name="search_results_header" requires="search">
	<div class="search-results-header">
		<n.if.has_resort>
			<then>
				<n.sort_controls/>
			</then>
		</n.if.has_resort>

		<img src="/images/search.png" class="image16"/>
		Found <n.total_posts/> <n.search_description/>
	</div>
</macro>

<macro name="search_result_row" requires="node,search">
	<div style="margin-bottom:1.5em">
		<div style="margin-bottom:.2em" class="adbayes-content">
			<n.search_result_topic_subject/>
			<n.search_result_post_subject/>
		</div>

		<div style="margin-bottom:.2em" class="adbayes-content">
			<n.search_result_message_fragment/>
		</div>

		<div class="weak-color" style="font-size:80%">
			<n.search_result_in_app/>
			<n.search_result_on_date/>
			<n.if.not.is_author_search>
				<then>
					by <n.owner.user_link/>
				</then>
			</n.if.not.is_author_search>
			&mdash; <n.topic_node.replies/> replies in thread
		</div>
	</div>
</macro>

<macro name="search_result_topic_subject" requires="node,search">
	<span class="second-font big-title">
		<n.node_link text="[n.highlight.topic_node.subject/]" />
	</span>
</macro>

<macro name="search_result_post_subject" requires="node,search">
	<n.if.not.regex_matches pattern=".*[n.regex_quote.topic_node.subject/]" text="[n.subject/]">
		<then>&nbsp; (<n.highlight.subject/>)</then>
	</n.if.not.regex_matches>
</macro>

<macro name="search_result_message_fragment" requires="node,search">
	<n.highlight.hide_emails.fragment. size="300">
		<n.message.as_text/>
	</n.highlight.hide_emails.fragment.>
</macro>

<macro name="search_result_in_app" requires="node,search">
	<n.if.is_in_app>
		<then>
			in <n.get_app_node.><n.node_link text="[n.highlight.subject/]" /></n.get_app_node.>
		</then>
	</n.if.is_in_app>
</macro>

<macro name="search_result_on_date" requires="node,search">
	<script type="text/javascript">
		Nabble.postDate = new Date(<n.when_created.raw_time/>);
		document.write(Nabble.isToday(Nabble.postDate) ? " at " : " on ");
		document.write(Nabble.formatDateShort(Nabble.postDate));
	</script>
</macro>


<macro name="search_pagination" requires="search">
	<n.search_paging.>
		<n.if.has_paging>
			<then>
				<div style="font-size:90%;text-align:right;margin-bottom:1em">
					<n.if.has_previous_page>
						<then>
							<a href="[n.previous_page_path/]">&laquo; Prev <n.rows_per_page/></a>
							<n.if.has_next_page>
								<then> - </then>
							</n.if.has_next_page>
						</then>
					</n.if.has_previous_page>
					<n.if.has_next_page>
						<then>
							<a href="[n.next_page_path/]">Next <n.rows_per_page/> &raquo;</a>
						</then>
					</n.if.has_next_page>
				</div>
			</then>
		</n.if.has_paging>
	</n.search_paging.>
</macro>

<macro name="index_rebuilt_notice" requires="search">
	<div class="info-message rounded" style="text-align:center;padding:.5em;margin:.5em 0">
		<t><b>Warning:</b> The search index is currently being rebuilt. Search results may be incomplete.</t>
	</div>
</macro>

<macro name="sort_controls" requires="search">
	<div style="float:right;margin:0 1em">
		<n.if.sorted_by_date>
			<then>
				<a href="[n.sort_by_relevance_path/]"><t>Sort by relevance</t></a> | <t>Sorted by date</t>
			</then>
			<else>
				<t>Sorted by relevance</t> | <a href="[n.sort_by_date_path/]"><t>Sort by date</t></a>
			</else>
		</n.if.sorted_by_date>
	</div>
</macro>

<macro name="search_description" requires="search">
	<n.if.has_query>
		<then>matching posts for <b><n.search_query_field.value/></b></then>
		<else>posts</else>
	</n.if.has_query>
	in <n.page_node.node_link/>
	<n.case_author_search.>
		by <n.user.user_link/>
	</n.case_author_search.>
	<n.if.has_days>
		<then>within <n.days/> days</then>
	</n.if.has_days>
	<n.search_paging.>
		<n.if.has_paging>
			<then>Showing posts <n.current_page.page_row.plus.one/> to <n.current_page.page_row.plus.rows_per_page/>.</then>
		</n.if.has_paging>
	</n.search_paging.>
</macro>

<macro name="show_search_error" requires="search">
	<n.format_error.handle_exception. for="search-block">
		<n.exception. name="search_query_parse_error">
			This query is invalid.
			<br/>For more information, read about <a href="http://lucene.apache.org/java/2_4_1/queryparsersyntax.html">Lucene query parser syntax</a>
		</n.exception.>
		<n.exception. name="too_many_search_clauses">
			Your search will give too many matches.
		</n.exception.>
	</n.format_error.handle_exception.>
</macro>

<macro name="show_search_form" requires="search">
	<div class="shaded-bg-color rounded">
		<n.page_node.search_form.>
			<table>
				<tr>
					<td class="verbose-search-box">
						<style type="text/css">
							div.field-title { margin-top: 0; }
						</style>
						<div class="second-font field-title">Search</div>
						<n.case_author_search.>
							<select name="author">
								<option value="[n.author_param/]" selected="true">posts by '<n.user.name/>'</option>
								<option value="">all posts</option>
							</select>
						</n.case_author_search.>
						<n.search_query_field.input size="40" />
						<select name="days">
							<n.if.not.contains_substring string="-0-1-7-30-90-180-365-" substring="-[n.days/]-">
								<then>
									<n.days_option. value="[n.days/]">past <n.days/> days</n.days_option.>
								</then>
							</n.if.not.contains_substring>
							<n.days_option. value="0">all dates</n.days_option.>
							<n.days_option. value="1">past 24 hours</n.days_option.>
							<n.days_option. value="7">past week</n.days_option.>
							<n.days_option. value="30">past month</n.days_option.>
							<n.days_option. value="90">past 3 months</n.days_option.>
							<n.days_option. value="180">past 6 months</n.days_option.>
							<n.days_option. value="365">past year</n.days_option.>
						</select>
						&nbsp;<input type="submit" value="Go &raquo;" />
					</td>
					<td style="font-size:90%;padding:0 0 .3em 1em;vertical-align:bottom">
						<div style="margin-bottom:.4em">
							<a href="[n.advanced_search_path_using_params/]">Advanced Search</a>
						</div>
						<a href="[n.help.search.url/]">Show Tips</a>
					</td>
				</tr>
			</table>
		</n.page_node.search_form.>
	</div>
</macro>

<macro name="case_all" requires="search" dot_parameter="do">
	<n.if.is_all>
		<then><n.do/></then>
	</n.if.is_all>
</macro>

<macro name="case_author_search" requires="search" dot_parameter="do">
	<n.if.is_author_search>
		<then><n.do/></then>
	</n.if.is_author_search>
</macro>

<macro name="days_option" requires="search" parameters="value" dot_parameter="text">
	<n.option. value="[n.value/]" selected="[n.days/]"><n.text/></n.option.>
</macro>

<macro name="option" parameters="value,selected" dot_parameter="text">
	<n.if.equal value1="[n.value/]" value2="[n.selected/]">
		<then>
			<option value="[n.value/]" selected="true"><n.text/></option>
		</then>
		<else>
			<option value="[n.value/]"><n.text/></option>
		</else>
	</n.if.equal>
</macro>

<macro name="define_search_query_field">
	<n.if.not.is_null.search_query_field.value>
		<then>
			<n.search_query_field.set_value.>
				<n.regex_replace_all. pattern="\band\b" replacement="AND">
					<n.regex_replace_all. pattern="\bor\b" replacement="OR">
						<n.trim.search_query_field.value/>
					</n.regex_replace_all.>
				</n.regex_replace_all.>
			</n.search_query_field.set_value.>
		</then>
	</n.if.not.is_null.search_query_field.value>
</macro>

<macro name="search_query_field" dot_parameter="do">
	<n.field. name="query"><n.do/></n.field.>
</macro>

<macro name="do_search_using_params" requires="search">
	<n.if.not.is_empty.author_param>
		<then.query_author.author_param/>
	</n.if.not.is_empty.author_param>
	<n.do_search length="[n.search_page_length/]"
		query="[n.query_param/]"
		days="[n.get_parameter name='days'/]"
		start="[n.search_page_index_record/]"
		sort="[n.get_parameter name='sort'/]"
	/>
</macro>

<macro name="author_param">
	<n.get_parameter name='author'/>
</macro>

<macro name="query_param">
	<n.get_parameter name='query'/>
</macro>



<macro name="previous_page_path" requires="paging,search">
	<n.search_path_using_params index_record="[n.previous_page.page_row/]" />
</macro>

<macro name="next_page_path" requires="paging,search">
	<n.search_path_using_params index_record="[n.next_page.page_row/]" />
</macro>

<macro name="sort_by_relevance_path">
	<n.search_path_using_params sort="relevance" index_record="0" />
</macro>

<macro name="sort_by_date_path">
	<n.search_path_using_params sort="date" index_record="0" />
</macro>

<macro name="search_path_using_params" parameters="query,author,days,index_record,sort" requires="node_page,servlet">
	<n.page_node.>
		<n.search_path>
			<query><n.default_to_param name="query" value="[n.query/]" /></query>
			<author><n.default_to_param name="author" value="[n.author/]" /></author>
			<days><n.default_to_param name="days" value="[n.days/]" /></days>
			<index_record><n.default_to_param name="index_record" value="[n.index_record/]" /></index_record>
			<sort><n.default_to_param name="sort" value="[n.sort/]" /></sort>
		</n.search_path>
	</n.page_node.>
</macro>

<macro name="default_to_param" parameters="name" dot_parameter="value">
	<n.default>
		<text><n.value/></text>
		<to><n.get_parameter name="[n.name/]"/></to>
	</n.default>
</macro>

<macro name="search_path" parameters="query,author,days,index_record,sort" requires="node">
	<n.encode_url.remove_spaces.>
		/template/NamlServlet.jtp?macro=search_page&node=<n.id/>
		<n.add_to_path name="query" value="[n.query/]" />
		<n.add_to_path name="author" value="[n.author/]" />
		<n.add_to_path name="days" value="[n.days/]" />
		<n.add_to_path name="i" value="[n.index_record/]" default_value="0" />
		<n.add_to_path name="sort" value="[n.sort/]" default_value="relevance" />
	</n.encode_url.remove_spaces.>
</macro>

<macro name="page_search_box" parameters="author" requires="node,servlet">
	<n.search_form.
		style="display: inline; margin: 0;"
		author="[n.author/]"
	>
		<input id="nabble.searchQuery" type="text" class="medium-border-color" name="query" size="20" />
	</n.search_form.>
</macro>

<macro name="search_form" dot_parameter="do" parameters="style,query,author,days" requires="node">
	<form style="[n.style/]" action="/template/NamlServlet.jtp">
		<input type="hidden" name="macro" value="search_page" />
		<input type="hidden" name="node" value="[n.id/]" />
		<n.hidden_field name="query" value="[n.query/]" />
		<n.hidden_field name="author" value="[n.author/]" />
		<n.hidden_field name="days" value="[n.days/]" />
		<n.do/>
	</form>
</macro>

<macro name="hidden_field" parameters="name,default_value" dot_parameter="value">
	<n.if.not.is_null.value>
		<then>
			<n.if.not.equal value1="[n.value/]" value2="[n.default_value/]">
				<then>
					<input type='hidden' name="[n.name/]" value="[n.value/]"/>
				</then>
			</n.if.not.equal>
		</then>
	</n.if.not.is_null.value>
</macro>

<macro name="advanced_search_path_using_params" parameters="days" requires="node">
	<n.advanced_search_path>
		<days><n.default_to_param name="days" value="[n.days/]" /></days>
	</n.advanced_search_path>
</macro>

<macro name="advanced_search_path" parameters="days" requires="node">
	<n.encode_url.remove_spaces.>
		/template/NamlServlet.jtp?macro=adv_search_page&node=<n.id/>
		<n.add_to_path name="days" value="[n.days/]" />
	</n.encode_url.remove_spaces.>
</macro>


<macro name="search_page_index_record">
	<n.get_parameter name="i"/>
</macro>

<macro name="search_page_length">
	12
</macro>

<macro name="search_paging" dot_parameter="do">
	<n.paging
		total_rows = "[n.total_posts/]"
		current_row="[n.search_page_index_record/]"
		rows_per_page="[n.search_page_length/]"
		do = "[n.do/]"
	/>
</macro>


<macro name="is_all">
	<n.not.is_author_search/>
</macro>

<macro name="is_author_search">
	<n.not.is_empty.author_param />
</macro>

<macro name="set_cookies" parameters="did_search">
	<script type="text/javascript">
		<n.if.both condition1="[n.not.is_empty.query_param/]" condition2="[n.did_search/]">
			<then>
				Nabble.setCookie("query", "<n.javascript_string_encode.query_param/>");
				Nabble.setCookie("searchterms", "<n.search_terms/>");
			</then>
			<else>
				Nabble.deleteCookie("query");
				Nabble.deleteCookie("searchterms");
			</else>
		</n.if.both>
		<n.if.is_author_search>
			<then>
				Nabble.setCookie("searchuser", "<n.user.search_id/>");
			</then>
			<else>
				Nabble.deleteCookie("searchuser");
			</else>
		</n.if.is_author_search>
	</script>
</macro>