5 [% INCLUDE 'doc-head-open.inc' %]
6 <title>Advanced search › [% IF ( LibraryNameTitle ) %][% LibraryNameTitle | html %][% ELSE %]Koha online[% END %] catalog</title>
7 [% INCLUDE 'doc-head-close.inc' %]
8 [% BLOCK cssinclude %][% END %]
10 [% INCLUDE 'bodytag.inc' bodyid='advsearch' bodyclass='scrollto' %]
11 [% INCLUDE 'masthead.inc' %]
12 <form id="advsearch_form" action="/cgi-bin/koha/opac-search.pl" method="get">
13 <input type="hidden" name="advsearch" value="1"/>
15 <nav id="breadcrumbs" aria-label="Breadcrumb" class="breadcrumbs">
16 <ol class="breadcrumb">
17 <li class="breadcrumb-item">
18 <a href="/cgi-bin/koha/opac-main.pl">Home</a>
20 <li class="breadcrumb-item active">
21 <a href="#" aria-current="page">Advanced search</a>
24 </nav> <!-- /#breadcrumbs -->
26 <div class="container-fluid">
28 <div class="col order-first order-md-first order-lg-2">
29 <!-- BOOLEAN SEARCH OPTIONS -->
30 <div id="booleansearch" class="maincontent">
31 <h1>Advanced search</h1>
33 <legend>Search for:</legend>
34 [% IF ( expanded_options ) %]
35 <div class="advanced-search-terms extended">
37 <div class="advanced-search-terms">
38 [% END # /IF ( expanded_options ) %]
39 [% FOREACH search_box IN [ 1, 2, 3] %]
40 <div class="search-term-row">
41 <div class="search-term-input">
42 [% IF ( expanded_options ) %]
43 <select name="op" class="form-control">
44 <option value="AND" selected="selected">and</option>
45 <option value="OR">or</option>
46 <option value="NOT">not</option>
49 <label for="search-field_[% loop.index | html %]">
50 [% IF loop.index == 0 %]
51
56 [% END # /IF ( expanded_options ) %]
57 </div> <!-- .search-term-input -->
59 <div class="search-term-input">
60 <select class="form-control" name="idx" id="search-field_[% loop.index | html %]">
61 <option value="kw">Keyword</option>
62 [% IF ( expanded_options ) %]
63 <option value="kw,phr"> Keyword phrase</option>
65 <option value="su,wrdl">Subject</option>
66 [% IF ( expanded_options ) %]
67 <option value="su,phr"> Subject phrase</option>
68 <option value="su-br"> Subject and broader terms</option>
69 <option value="su-na"> Subject and narrower terms</option>
70 <option value="su-rl"> Subject and related terms</option>
72 <option value="ti">Title</option>
73 [% IF ( expanded_options ) %]
74 <option value="ti,phr"> Title phrase</option>
75 <option value="se,wrdl">Series title</option>
76 [% IF ( Koha.Preference('OPACNumbersPreferPhrase') ) %]
77 <option value="callnum,phr">Call number</option>
79 <option value="callnum">Call number</option>
83 <option value="au,wrdl">Author</option>
84 [% IF ( expanded_options ) %]
85 <option value="au,phr"> Author phrase</option>
86 <option value="cpn,wrdl"> Corporate name</option>
87 <option value="cfn,wrdl"> Conference name</option>
88 <option value="cfn,phr"> Conference name phrase</option>
89 <option value="pn,wrdl"> Personal name</option>
90 <option value="pn,phr"> Personal name phrase</option>
92 [% IF ( expanded_options ) %]
93 <option value="nt">Notes/Comments</option>
94 [% IF (marcflavour != 'UNIMARC') %]
95 <option value="curriculum">Curriculum</option>
98 <option value="pb,wrdl">Publisher</option>
99 <option value="pl,wrdl">Publisher location</option>
100 [% IF ( expanded_options ) %]
101 [% IF ( Koha.Preference('OPACNumbersPreferPhrase') ) %]
102 <option value="ident,phr">Standard number</option>
104 <option value="ident">Standard number</option>
106 <option value="nb"> ISBN</option>
107 <option value="ns"> ISSN</option>
109 <option value="nb">ISBN</option>
111 <option value="bc">Barcode</option>
112 </select> <!-- /#search-field_[% loop.index | html %] -->
113 </div> <!-- .search-term-input -->
114 <div class="search-term-input">
115 <input class="form-control" type="text" size="" name="q" title="Enter search terms" value="" />
116 </div> <!-- .search-term-input -->
117 [% IF ( expanded_options ) %]
118 <div class="search-term-input">
119 <a class="ButtonPlus" title="Add another field" href="#">
120 <i class="fa fa-plus-square" aria-hidden="true"></i>
122 <a class="ButtonLess" title="Remove field" href="#">
123 <i class="fa fa-minus-square" aria-hidden="true"></i>
125 </div> <!-- .search-term-input -->
127 </div> <!-- /.search-term-row -->
128 [% END # FOREACH search_box %]
129 [% IF ( expanded_options ) %]
130 [% IF Koha.Preference('SearchEngine') == 'Elasticsearch' %]
131 <div id="weight_search">
133 <input type="checkbox" name="weight_search" checked="checked">
134 Apply field weights to search
139 <input type="hidden" name="weight_search" value="1" />
141 [% IF Koha.Preference('IncludeSeeFromInSearches') %]
142 <div class="hint included-see-from-headings-info">
143 <i class="fa fa-info-circle" aria-hidden="true"></i>
144 See from (non-preferred form) headings are included
147 </div> <!-- /.search-terms -->
149 </div> <!-- /#booleansearch -->
150 </div> <!-- / .col -->
151 </div> <!-- / .row -->
153 <div class="text-center">
154 <!-- SEARCH BUTTONS -->
155 <fieldset class="action">
156 [% PROCESS searchbuttons %]
158 <!-- /SEARCH BUTTONS -->
162 [%# Following on one line for translatability %]
163 [% IF ( ( OpacAdvSearchOptions and OpacAdvSearchOptions.grep('itemtype').size > 0 and not expanded_options ) or ( OpacAdvSearchMoreOptions and OpacAdvSearchMoreOptions.grep('itemtype').size > 0 and expanded_options ) ) %]
164 <div class="col order-first order-md-first order-lg-2">
165 <div id="advsearches" class="toptabs">
166 <ul class="nav nav-tabs" role="tablist">
167 [% FOREACH advsearchloo IN advancedsearchesloop %]
168 <li class="nav-item" role="presentation" id="advsearch-tab-[% advsearchloo.advanced_search_type | html %]">
169 <a href="#advsearch-[% advsearchloo.advanced_search_type | uri %]" class="nav-link" aria-controls="advsearch-[% advsearchloo.advanced_search_type | html %]" aria-selected="false" role="tab" data-toggle="tab">
170 [% IF ( advsearchloo.advanced_search_type == 'itemtypes' ) %]<span>Item type</span>
171 [% ELSIF ( advsearchloo.advanced_search_type == 'ccode' ) %]<span>Collection</span>
172 [% ELSIF ( advsearchloo.advanced_search_type == 'loc' ) %]<span>Shelving location</span>
173 [% ELSE %]<span>Something else</span>
179 <div class="tab-content">
180 [% FOREACH advsearchloo IN advancedsearchesloop %]
181 <div role="tabpanel" class="tab-pane" id="advsearch-[% advsearchloo.advanced_search_type | html %]" class="advsearch" aria-labelledby="advsearch-tab-[% advsearchloo.advanced_search_type | html %]">
183 <legend>Limit to any of the following:</legend>
185 [% FOREACH itemtypeloo IN advsearchloo.code_loop %]
186 [% IF (advsearchloo.advanced_search_type != 'itemtypes') OR (((!itemtypeloo.searchcategory) AND (itemtypeloo.cat == 0)) OR (itemtypeloo.cat == 1)) %]
187 <div class="col-sm-6 col-lg-3">
188 <input type="checkbox"
189 id="[% itemtypeloo.ccl FILTER remove(',') | html %]-[% itemtypeloo.number | html %]"
190 name="[% IF ( itemtypeloo.cat == 1 ) %]searchcat[% ELSE %]limit[% END %]"
191 value="[% IF ( itemtypeloo.cat == 1 ) %][% itemtypeloo.code | html %][% ELSE %]mc-[% itemtypeloo.ccl | html %]:[% itemtypeloo.code | html %][% END %]"
193 <label for="[% itemtypeloo.ccl FILTER remove(',') | html %]-[% itemtypeloo.number | html %]">
194 [% UNLESS ( Koha.Preference('OpacNoItemTypeImages')) %]
195 [% IF ( itemtypeloo.imageurl ) %]
196 <img src="[% itemtypeloo.imageurl | html %]" alt="[% itemtypeloo.description | html %]" />
200 <span class="itypetext">[% itemtypeloo.description | html %]</span>
203 [% IF ( loop.last ) %]</div>[% ELSE %][% UNLESS ( loop.count % 4 ) %]</div><div class="row">[% END %][% END %]
207 </div> <!-- / #advsearch-[% advsearchloo.advanced_search_type | html %] -->
208 [% END # / FOREACH advancedsearchesloop %]
209 </div> <!-- /.tab-content -->
210 </div> <!-- / #advsearches -->
211 </div> <!-- / .col -->
212 [% END # /IF OpacAdvSearchOptions %]
215 <div id="advsearch_limits" class="row">
217 [%# Following on one line for translatability %]
218 [% IF ( ( OpacAdvSearchOptions and OpacAdvSearchOptions.grep('location').size > 0 and not expanded_options ) or ( OpacAdvSearchMoreOptions and OpacAdvSearchMoreOptions.grep('location').size > 0 and expanded_options ) ) %]
219 [% IF ( singleBranchMode ) %]
220 <div class="col-sm-6 col-lg-3">
221 <!-- AVAILABILITY LIMITS -->
222 <div id="location" class="advsearch_limit">
224 <legend>Availability: </legend>
225 <div style="margin-top:.4em">
226 <label for="available-items"><input type="checkbox" id="available-items" name="limit" value="available" /> Only items currently available for loan or reference</label>
229 </div> <!-- / #location -->
230 <!-- /AVAILABILITY LIMITS -->
231 </div> <!-- / .col -->
233 <div class="col-sm-6 col-lg-3">
234 <!-- AVAILABILITY LIMITS -->
235 <div id="location" class="advsearch_limit">
237 <label for="branchloop">Location and availability:</label>
238 <select name="limit" id="branchloop">
239 <option value="">All libraries</option>
240 [% FOREACH BranchesLoo IN Branches.all( selected => opac_name ) %]
241 [% NEXT UNLESS BranchesLoo.public %]
242 [% IF BranchesLoo.selected %]
243 <option value="branch:[% BranchesLoo.branchcode | html %]" selected="selected">[% BranchesLoo.branchname | html %]</option>
245 <option value="branch:[% BranchesLoo.branchcode | html %]">[% BranchesLoo.branchname | html %]</option>
249 [% IF search_groups %]
251 <label for="categoryloop">Groups of libraries</label>
252 <select name="limit" id="categoryloop">
253 <option value=""> -- none -- </option>
254 [% FOREACH sg IN search_groups %]
255 <option value="multibranchlimit:[% sg.id | html %]">[% sg.title | html %]</option>
259 <div style="margin-top:.4em">
260 <label for="available-items"><input type="checkbox" id="available-items" name="limit" value="available" /> Only items currently available for loan or reference</label>
263 </div> <!-- / #location -->
264 <!-- /AVAILABILITY LIMITS -->
265 </div> <!-- / .col -->
266 [% END # / IF singleBranchMode %]
269 [%# Following on one line for translatability %]
270 [% IF ( ( OpacAdvSearchOptions and OpacAdvSearchOptions.grep('sorting').size > 0 and not expanded_options ) or ( OpacAdvSearchMoreOptions and OpacAdvSearchMoreOptions.grep('sorting').size > 0 and expanded_options ) ) %]
271 <div class="col-sm-6 col-lg-3">
273 <div id="sortby" class="advsearch_limit">
275 <label for="sort_by">Sort by:</label>
276 <select id="sort_by" name="sort_by">
277 [% INCLUDE 'resort_form.inc' %]
282 </div> <!-- / .col -->
285 [%# Following on one line for translatability %]
286 [% IF ( ( OpacAdvSearchOptions and OpacAdvSearchOptions.grep('pubdate').size > 0 and not expanded_options ) or ( OpacAdvSearchMoreOptions and OpacAdvSearchMoreOptions.grep('pubdate').size > 0 and expanded_options ) ) %]
287 <div class="col-sm-6 col-lg-3">
288 <div id="pubrange" class="advsearch_limit">
289 <!-- PUB RANGE OPTION -->
291 <label for="limit-yr">Publication date range</label>
292 <input type="text" size="30" id="limit-yr" name="limit-yr" title="Enter search terms" value="" />
293 <div class="hint">For example: 1999-2001. You could also use "-1987" for everything published in and before 1987 or "2008-" for everything published in 2008 and after.</div>
295 <!-- /PUB RANGE OPTION -->
300 [%# Following on one line for translatability %]
301 [% IF ( ( OpacAdvSearchOptions and OpacAdvSearchOptions.grep('language').size > 0 and not expanded_options ) or ( OpacAdvSearchMoreOptions and OpacAdvSearchMoreOptions.grep('language').size > 0 and expanded_options ) ) %]
302 <div class="col-sm-6 col-lg-3">
303 <div id="langfilter" class="advsearch_limit">
305 <!-- LANGUAGE LIMIT -->
306 <label for="language-limit">Language</label>
307 <select id="language-limit" name="limit">
308 <option value="">No limit</option>
309 [% FOREACH search_languages_loo IN search_languages_loop %]
310 [% IF ( search_languages_loo.selected ) %]
311 <option value="ln,rtrn:[% search_languages_loo.iso639_2_code | html %]" selected="selected">[% search_languages_loo.language_description | html %]</option>
313 <option value="ln,rtrn:[% search_languages_loo.iso639_2_code | html %]">[% search_languages_loo.language_description | html %]</option>
317 <!-- /LANGUAGE LIMIT -->
319 </div> <!-- / #langfilter -->
320 </div> <!-- / .col -->
322 </div> <!-- / .row -->
324 [%# Following on one line for translatability %]
325 [% IF ( ( OpacAdvSearchOptions and OpacAdvSearchOptions.grep('subtype').size > 0 and not expanded_options ) or ( OpacAdvSearchMoreOptions and OpacAdvSearchMoreOptions.grep('subtype').size > 0 and expanded_options ) ) %]
327 <div id="subtypes" class="row">
328 <!-- SUBTYPE LIMITS -->
329 <div class="col-sm-6 col-lg-3">
330 <div class="advsearch_limit">
332 <label for="subtype_audience">Audience</label>
333 <select id="subtype_audience" name="limit" class="subtype">
334 <option value="" selected="selected" class="menuheader">Any audience</option>
335 <option value="aud:a">Preschool</option>
336 <option value="aud:b">Primary</option>
337 <option value="aud:c">Pre-adolescent</option>
338 <option value="aud:d">Adolescent</option>
339 <option value="aud:e">Adult</option>
340 <option value="aud:f">Specialized</option>
341 <option value="aud:g">General</option>
342 <option value="aud:j">Juvenile</option>
345 </div> <!-- /.advsearch_limit -->
346 </div> <!-- / .col-sm-6 col-lg-3 -->
348 <div class="col-sm-6 col-lg-3">
349 <div class="advsearch_limit">
351 <label for="subtype_content">Content</label>
352 <select id="subtype_content" name="limit" class="subtype">
353 <option value="" selected="selected" class="menuheader">Any content</option>
354 <option value="fic:1">Fiction</option>
355 <option value="fic:0">Non-fiction</option>
356 <option value="bio:b">Biography</option>
357 <option value="mus:j">Musical recording</option>
358 <option value="mus:i">Non-musical recording</option>
361 </div> <!-- /.advsearch_limit -->
364 <div class="col-sm-6 col-lg-3">
365 <div class="advsearch_limit">
367 <label for="subtype_format">Format</label>
368 <select id="subtype_format" name="limit" class="subtype">
369 <option value="" selected="selected" class="menuheader">Any format</option>
370 <option value="l-format:ta">Regular print</option>
371 <option value="l-format:tb">Large print</option>
372 <option value="l-format:tc or l-format:fb">Braille</option>
373 <option value="">-----------</option>
374 <option value="l-format:sd">CD audio</option>
375 <option value="l-format:ss">Cassette recording</option>
376 <option value="l-format:vf">VHS tape / Videocassette</option>
377 <option value="l-format:vd">DVD video / Videodisc</option>
378 <option value="l-format:co">CD software</option>
379 <option value="l-format:cr">Website</option>
382 </div> <!-- /.advsearch_limit -->
383 </div> <!-- / .col-sm-6 col-lg-3 -->
385 <div class="col-sm-6 col-lg-3">
386 <div class="advsearch_limit">
388 <label for="subtype_additional">Additional content types for books/printed materials</label>
389 <select id="subtype_additional" name="limit" class="subtype">
390 <option value="">Any</option>
391 <option value="ctype:a">Abstracts/summaries</option>
392 <option value="ctype:b">Bibliographies</option>
393 <option value="ctype:c">Catalogs</option>
394 <option value="ctype:d">Dictionaries</option>
395 <option value="ctype:e">Encyclopedias </option>
396 <option value="ctype:f">Handbooks</option>
397 <option value="ctype:g">Legal articles</option>
398 <option value="ctype:i">Indexes</option>
399 <option value="ctype:j">Patent document</option>
400 <option value="ctype:k">Discographies</option>
401 <option value="ctype:l">Legislation</option>
402 <option value="ctype:m">Theses</option>
403 <option value="ctype:n">Surveys</option>
404 <option value="ctype:o">Reviews</option>
405 <option value="ctype:p">Programmed texts</option>
406 <option value="ctype:q">Filmographies</option>
407 <option value="ctype:r">Directories</option>
408 <option value="ctype:s">Statistics</option>
409 <option value="ctype:t">Technical reports</option>
410 <option value="ctype:v">Legal cases and case notes</option>
411 <option value="ctype:w">Law reports and digests</option>
412 <option value="ctype:z">Treaties </option>
415 </div> <!-- /.advsearch_limit -->
416 </div> <!-- / .col-sm-6 col-lg-3 -->
417 </div> <!-- / #subtypes.row -->
418 <!-- SUBTYPE LIMITS -->
419 [% END # / IF usmarc %]
422 <div id="subtypes_unimarc" class="row">
423 <!-- SUBTYPE LIMITS -->
424 [% INCLUDE 'subtypes_unimarc.inc' %]
427 [% END # / IF expanded_options %]
429 [% IF ( OpacAdvSearchMoreOptions and OpacAdvSearchMoreOptions.size > 0 and expanded_options ) or ( OpacAdvSearchOptions and OpacAdvSearchOptions.size > 0 and not expanded_options ) %]
430 <div class="text-center">
431 <fieldset class="action">
432 <!-- SEARCH BUTTONS -->
433 [% PROCESS searchbuttons %]
434 <!-- /SEARCH BUTTONS -->
438 </div> <!-- / .container-fluid -->
439 </div> <!-- / .main -->
442 [% INCLUDE 'opac-bottom.inc' %]
443 [% BLOCK searchbuttons %]
445 <input class="btn btn-primary" type="submit" accesskey="s" name="do" title="Search" value="Search" />
447 [% IF ( OpacAdvSearchMoreOptions and OpacAdvSearchMoreOptions.size > 0 ) %]
448 [% IF expanded_options %]
449 <a href="/cgi-bin/koha/opac-search.pl?expanded_options=0" class="btn btn-default more-less-options">Fewer options</a>
450 [% ELSIF not expanded_options %]
451 <a href="/cgi-bin/koha/opac-search.pl?expanded_options=1" class="btn btn-default more-less-options">More options</a>
455 <a href="/cgi-bin/koha/opac-search.pl?do=Clear" class="btn btn-default new-search">New search</a>
459 [% BLOCK jsinclude %]
460 [% Asset.js("lib/jquery/plugins/jquery.deserialize.min.js") | $raw %]
462 $(document).ready(function() {
463 [% IF search_groups %]
464 function branch_limit() {
465 if( $("#branchloop").val() != "" ){
466 $("#categoryloop").val("").prop('disabled',true);
468 $("#categoryloop").prop('disabled',false);
470 if ( $("#categoryloop").val() != "" ){
471 $("#branchloop").val("").prop('disabled',true);
473 $("#branchloop").prop('disabled',false);
477 $("#branchloop,#categoryloop").on("change",function(){
482 if( $("#advsearches .tab-pane.active").length < 1 ){
483 $("#advsearches a:first").tab("show");
486 $('.search-term-row .search-term-input select[name="op"]').first().prop("disabled",true).hide();
488 [% IF ( ReturnToSearch ) %]
489 if (form_serialized = JSON.parse( Cookies.get("form_serialized") ) ) {
490 // Add missing term inputs if there were more than 3
491 var count = (form_serialized.match(/&q=/g) || []).length;
492 for(var i = 3 ; i < count ; i++) {
493 $("a.ButtonPlus:last").click();
495 $('#advsearch form').deserialize(form_serialized);
497 if (form_serialized_limits = JSON.parse( Cookies.get("form_serialized_limits") ) ) {
498 $('#language-limit') .val(form_serialized_limits[0]);
499 $('#branchloop') .val(form_serialized_limits[1]);
500 $('#subtype_audience') .val(form_serialized_limits[2]);
501 $('#subtype_content') .val(form_serialized_limits[3]);
502 $('#subtype_format') .val(form_serialized_limits[4]);
503 $('#subtype_additional') .val(form_serialized_limits[5]);
504 $('#locloop') .val(form_serialized_limits[6]);
507 //Clear all form cookies
508 Cookies.remove("form_serialized", { path: '/'});
509 Cookies.remove("form_serialized_limits", { path: '/'});
510 Cookies.remove("search_path_code", { path: '/'});
512 $('#advsearch_form').submit(function() {
513 $('[name^="limit"]').each(function(){
514 if( $(this).val() == '' ){
515 $(this).prop("disabled","disabled");
518 $(".search-term-row").each(function(){
519 if( $(this).find('input[name="q"]').val() == "" ){
520 $(this).find('input[name="q"]').prop("disabled","disabled");
521 $(this).find('select[name="op"]').prop("disabled","disabled");
522 $(this).find('select[name="idx"]').prop("disabled","disabled");
525 form_serialized = $(this).serialize();
526 Cookies.set("form_serialized", JSON.stringify( form_serialized ), { path: '/', sameSite: 'Lax' });
527 form_serialized_limits = [
528 $('#language-limit').val(), $('#branchloop').val(),
529 $('#subtype_audience').val(), $('#subtype_content').val(),
530 $('#subtype_format').val(), $('#subtype_additional').val(),
533 Cookies.set("form_serialized_limits", JSON.stringify( form_serialized_limits ),{ path: '/', sameSite: 'Lax' });
534 [% IF ( expanded_options ) %]
535 Cookies.set("search_path_code", 'exs', { path: '/', sameSite: 'Lax' });
537 Cookies.set("search_path_code", 'ads', { path: '/', sameSite: 'Lax' });
542 /* This function allows to display a new field to search.
544 $(document).on("click", '.ButtonPlus', function(e) {
546 $('.ButtonLess').show();
547 var thisLine = $(this).parent().parent();
548 var newLine = thisLine.clone();
549 $(newLine).find('.search-term-input select[name="op"]').first().prop("disabled",false).show();
550 newLine.find('input').val('');
551 thisLine.after(newLine);
554 $(document).on("click", '.ButtonLess', function(e) {
556 if( $("a.ButtonLess").length <= 2 ) {
557 $('.ButtonLess').hide();
559 $(this).parent().parent().remove();
560 $('.search-term-row .search-term-input select[name="op"]').first().prop("disabled",true).hide();