2 attachEvt("common", "run", advgInit);
3 attachEvt("common", "locationChanged", advSyncCopyLocLink );
5 var COOKIE_NOGROUP_RECORDS = 'grpt';
6 var advSelectedOrg = null;
11 dojo.require('dojo.cookie');
12 if( dojo.cookie(COOKIE_NOGROUP_RECORDS) || SHOW_MR_DEFAULT )
13 $('adv_group_titles').checked = true;
15 $n($('adv_global_tbody'), 'term').focus();
17 var ctypes = ["bib_level", "item_form", "item_type", "audience", "lit_form"];
19 var req = new Request('open-ils.fielder:open-ils.fielder.ccvm.atomic', {"cache":1,"query":{"ctype":ctypes}});
20 req.callback(advDrawBibExtras);
21 req.request.ctypes = ctypes;
24 var input = $n($('adv_global_trow'), 'term');
26 setEnterFunc(input, advSubmitGlobal);
28 if(getSort() && getSortDir()) {
29 setSelector($('adv_global_sort_by'), getSort());
30 setSelector($('adv_global_sort_dir'), getSortDir());
31 if(getSort() != 'rel')
32 $('adv_global_sort_dir').disabled = false;
36 $('opac.result.limit2avail').checked = true;
38 // not sure we want to propogate the pubdate filter,
39 // since other filters are not propogated
42 if(!new CGI().param(PARAM_NOPERSIST_SEARCH))
44 advSyncCopyLocLink(getLocation());
47 function advInitPubFilter() {
48 var i1 = $('adv_global_pub_date_1');
49 var i2 = $('adv_global_pub_date_2');
50 var sel = $('adv_global_pub_date_type');
52 i1.value = getPubdBefore();
53 setSelector(sel, 'before');
54 } else if(getPubdAfter()) {
55 i1.value = getPubdAfter();
56 setSelector(sel, 'after');
57 } else if(getPubdBetween()) {
58 var values = getPubdBetween().split(',');
60 if(values[0] == values[1]) {
61 setSelector(sel, 'equals');
63 setSelector(sel, 'between');
69 function advSyncCopyLocLink(org) {
70 // display the option to filter by copy location
71 advLocationsLoaded = false;
73 removeChildren($('adv_copy_location_filter_select'));
75 if(isTrue(findOrgType(findOrgUnit(org).ou_type()).can_have_vols())) {
76 unHideMe($('adv_copy_location_filter_row'));
77 advLoadCopyLocations(org);
79 hideMe($('adv_copy_location_filter_row'));
84 function clearSearchBoxes() {
85 var rows = $('adv_global_tbody').getElementsByTagName('tr');
86 for(var t = 0; t < rows.length; t++) {
87 if($n(rows[t], 'term')) {
88 $n(rows[t], 'term').value = '';
89 setSelector($n(rows[t], 'contains'), 'contains');
90 setSelector($n(rows[t], 'type'), 'keyword');
93 $n(rows[0], 'term').focus();
97 function initSearchBoxes() {
98 /* loads the compiled search from the search cookie
99 and sets the widgets accordingly */
101 search = dojo.cookie(COOKIE_SEARCH);
103 _debug("loaded compiled search cookie: " + search);
105 search = JSON2js(search);
108 var types = getObjectKeys(search.searches);
110 // if we have browser cached data, clear it before populating from cookie
111 if (search.searches[types[0]].term)
114 /* pre-add the needed rows */
115 while($('adv_global_tbody').getElementsByTagName('tr').length - 1 < types.length)
118 var rows = $('adv_global_tbody').getElementsByTagName('tr');
120 for(var t = 0; t < types.length; t++) {
122 setSelector($n(row, 'type'), types[t]);
123 var term = search.searches[types[t]].term;
125 /* if this is a single -<term> search, set the selector to nocontains */
126 if(match = term.match(/^-(\w+)$/)) {
128 setSelector($n(row, 'contains'), 'nocontains');
130 $n(row, 'term').value = term;
134 function advAddGblRow() {
135 var tbody = $("adv_global_tbody");
136 var newrow = $("adv_global_trow").cloneNode(true);
137 tbody.insertBefore(newrow, $("adv_global_addrow"));
138 var input = $n(newrow, "term");
140 setEnterFunc(input, advSubmitGlobal);
141 $n(newrow, 'type').focus();
144 function advDrawBibExtras(r) {
145 var data = r.getResultObject();
146 var ctypes = r.ctypes
149 var sel = $('adv_global_' + ctype);
150 var ctypeData = dojo.filter(data, function(item) { return item.ctype == ctype } );
151 ctypeData = ctypeData.sort(
152 function(a,b) { /* sort alphabetically */
153 return (a.value < b.value) ? -1 : 1;
156 dojo.forEach(ctypeData,
158 var opt = insertSelectorVal(sel, -1, thing.value, thing.code);
159 opt.setAttribute('title', thing.value);
166 function advSelToStringList(sel) {
167 var list = getSelectedList(sel);
169 for( var i = 0; i < list.length; i++ ) {
171 for( var j = 0; j < str.length; j++ ) {
172 //if(str.charAt(j) == ' ') continue;
173 vals.push(str.charAt(j));
176 return vals.toString();
179 function advGetVisSelectorVals(id) {
180 var basic = id + '_basic';
181 if(! $(id).className.match(/hide_me/))
182 return advSelToStringList($(id));
183 return advSelToStringList($(basic));
186 function advSubmitGlobal() {
188 var sortdir = getSelectorVal($('adv_global_sort_dir'));
189 var sortby = getSelectorVal($('adv_global_sort_by'));
191 var litforms = advGetVisSelectorVals('adv_global_lit_form');
192 var itemforms = advGetVisSelectorVals('adv_global_item_form');
193 var itemtypes = advGetVisSelectorVals('adv_global_item_type');
194 var audiences = advGetVisSelectorVals('adv_global_audience');
195 var biblevels = advGetVisSelectorVals('adv_global_bib_level');
196 var locations = getSelectedList($('adv_copy_location_filter_select')) + '';
197 var languages = getSelectedList($('adv_global_lang')) + '';
198 var limit2avail = $('opac.result.limit2avail').checked ? 1 : ''
200 var searches = advBuildSearchBlob();
201 if(!searches) return;
207 args[PARAM_ITEMFORM] = itemforms;
208 args[PARAM_ITEMTYPE] = itemtypes;
209 args[PARAM_BIBLEVEL] = biblevels;
210 args[PARAM_LITFORM] = litforms;
211 args[PARAM_AUDIENCE] = audiences;
212 args[PARAM_LANGUAGE] = languages;
213 args[PARAM_COPYLOCS] = locations;
214 //args[PARAM_SEARCHES] = js2JSON(searches); /* break these out */
215 args[PARAM_DEPTH] = depthSelGetDepth();
216 args[PARAM_LOCATION] = depthSelGetNewLoc();
217 args[PARAM_SORT] = sortby;
218 args[PARAM_SORT_DIR] = sortdir;
219 args[PARAM_ADVTYPE] = ADVTYPE_MULTI;
220 args[PARAM_STYPE] = "";
221 args[PARAM_TERM] = searches;
222 args[PARAM_AVAIL] = limit2avail;
224 // publicate year filtering
226 if( (pub1 = $('adv_global_pub_date_1').value) && (''+pub1).match(/\d{4}/)) {
227 switch(getSelectorVal($('adv_global_pub_date_type'))) {
229 args[PARAM_PUBD_BETWEEN] = pub1+','+pub1;
232 args[PARAM_PUBD_BEFORE] = pub1;
235 args[PARAM_PUBD_AFTER] = pub1;
238 var pub2 = $('adv_global_pub_date_2').value;
239 if((''+pub2).match(/\d{4}/))
240 args[PARAM_PUBD_BETWEEN] = pub1+','+pub2;
245 /* pubdate sorting causes a record (not metarecord) search */
246 if( sortby == SORT_TYPE_PUBDATE || !$('adv_group_titles').checked ) {
248 args[PARAM_RTYPE] = RTYPE_MULTI;
251 if($('adv_group_titles').checked )
252 dojo.cookie(COOKIE_NOGROUP_RECORDS,'1');
254 dojo.cookie(COOKIE_NOGROUP_RECORDS,null,{'expires':-1});
257 goTo(buildOPACLink(args));
261 function advBuildSearchBlob() {
264 var tbody = $('adv_global_tbody');
265 var rows = tbody.getElementsByTagName('tr');
267 for( var i = 0; i < rows.length; i++ ) {
270 if(!(row && typeof row == 'object')) continue;
271 if(!row.getAttribute('type')) continue;
273 var stype = getSelectorVal($n(row, 'type'));
274 var contains = getSelectorVal($n(row, 'contains'));
275 var term = $n(row, 'term').value;
281 string += " " + term;
284 case 'nocontains' : {
285 // Normalize spaces so we don't get "- " embedded in the query
286 var words = term.replace(/\s+/g,' ').replace(/^\s*/,'').replace(/\s*$/,'').split(" ");
287 for( var j in words )
288 string += " -" + words[j];
293 if(term.indexOf('"') > -1) string += " " + term;
294 else string += " \"" + term + "\"";
298 string = string.replace(/'/g,' ');
299 string = string.replace(/\\/g,' ');
300 string = string.replace(/^\s*/,'');
301 string = string.replace(/\s*$/,'');
302 //searches[stype].term = string;
303 if(searches) searches += ' ';
304 searches += stype + ': '+ string;
308 _debug("created search query " + searches);
313 // retrieves the shelving locations
314 var advLocationsLoaded = false;
315 function advLoadCopyLocations(org) {
317 org = advSelectedOrg;
318 var req = new Request(FETCH_COPY_LOCATIONS, org);
319 req.callback(advShowCopyLocations);
321 advLocationsLoaded = true;
324 // inserts the shelving locations into the multi-select
325 function advShowCopyLocations(r) {
326 var locations = r.getResultObject();
327 var sel = $('adv_copy_location_filter_select');
328 for(var i = 0; i < locations.length; i++)
329 insertSelectorVal(sel, -1, locations[i].name(), locations[i].id());