]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/web/opac/skin/default/js/adv_global.js
Coded Value Maps Opac Visible/Search Labels
[working/Evergreen.git] / Open-ILS / web / opac / skin / default / js / adv_global.js
1
2 attachEvt("common", "run", advgInit);
3 attachEvt("common", "locationChanged", advSyncCopyLocLink );
4
5 var COOKIE_NOGROUP_RECORDS = 'grpt';
6 var advSelectedOrg = null;
7
8 function advgInit() {
9
10         /* XXX */
11     dojo.require('dojo.cookie');
12         if( dojo.cookie(COOKIE_NOGROUP_RECORDS) || SHOW_MR_DEFAULT )
13                 $('adv_group_titles').checked = true;
14
15         $n($('adv_global_tbody'), 'term').focus();
16
17     var ctypes = ["bib_level", "item_form", "item_type", "audience", "lit_form"];
18
19     var req = new Request('open-ils.fielder:open-ils.fielder.ccvm.atomic', {"cache":1,"query":{"ctype":ctypes, "opac_visible":"t"}});
20     req.callback(advDrawBibExtras);
21     req.request.ctypes = ctypes;
22     req.send();
23
24         var input = $n($('adv_global_trow'), 'term');
25         input.focus();
26
27     var rows = $('adv_global_tbody').getElementsByTagName('tr');
28     for(var t = 0; t < rows.length; t++) {
29         if($n(rows[t], 'term')) {
30             setEnterFunc($n(rows[t], 'term'), advSubmitGlobal);
31         }
32     }
33
34     if(getSort() && getSortDir()) {
35             setSelector($('adv_global_sort_by'), getSort());
36             setSelector($('adv_global_sort_dir'), getSortDir());
37         if(getSort() != 'rel')
38             $('adv_global_sort_dir').disabled = false;
39     }
40
41     if(getAvail())
42         $('opac.result.limit2avail').checked = true;
43
44     // not sure we want to propogate the pubdate filter, 
45     // since other filters are not propogated
46     //advInitPubFilter();
47
48     if(!new CGI().param(PARAM_NOPERSIST_SEARCH))
49         initSearchBoxes();
50     advSyncCopyLocLink(getLocation());
51 }
52
53 function advInitPubFilter() {
54     var i1 = $('adv_global_pub_date_1');
55     var i2 = $('adv_global_pub_date_2');
56     var sel = $('adv_global_pub_date_type');
57     if(getPubdBefore()) {
58         i1.value = getPubdBefore();
59         setSelector(sel, 'before');
60     } else if(getPubdAfter()) {
61         i1.value = getPubdAfter();
62         setSelector(sel, 'after');
63     } else if(getPubdBetween()) {
64         var values = getPubdBetween().split(','); 
65         i1.value = values[0]
66         if(values[0] == values[1]) {
67             setSelector(sel, 'equals');
68         } else {
69             setSelector(sel, 'between');
70             i2.value = values[1];
71         }
72     }
73 }
74
75 function advSyncCopyLocLink(org) {
76     // display the option to filter by copy location
77     advLocationsLoaded = false;
78     advSelectedOrg = org;
79     removeChildren($('adv_copy_location_filter_select'));
80
81     if(isTrue(findOrgType(findOrgUnit(org).ou_type()).can_have_vols())) {
82         unHideMe($('adv_copy_location_filter_row'));
83         advLoadCopyLocations(org); 
84     } else {
85         hideMe($('adv_copy_location_filter_row'));
86     }
87
88 }
89
90 function clearSearchBoxes() {
91     var rows = $('adv_global_tbody').getElementsByTagName('tr');
92     for(var t = 0; t < rows.length; t++) {
93         if($n(rows[t], 'term')) {
94             $n(rows[t], 'term').value = '';
95             setSelector($n(rows[t], 'contains'), 'contains');
96             setSelector($n(rows[t], 'type'), 'keyword');
97         }
98     }
99     $n(rows[0], 'term').focus();
100 }
101
102
103 function initSearchBoxes() {
104     /* loads the compiled search from the search cookie 
105         and sets the widgets accordingly */
106
107     search = dojo.cookie(COOKIE_SEARCH);
108     if(!search) return;
109     _debug("loaded compiled search cookie: " + search);
110
111     search = JSON2js(search);
112     if(!search) return;
113
114     var types = getObjectKeys(search.searches);
115
116     // if we have browser cached data, clear it before populating from cookie
117     if (search.searches[types[0]].term)
118         clearSearchBoxes();
119
120     /* pre-add the needed rows */
121     while($('adv_global_tbody').getElementsByTagName('tr').length - 1 < types.length)
122         advAddGblRow();
123
124     var rows = $('adv_global_tbody').getElementsByTagName('tr');
125
126     for(var t = 0; t < types.length; t++) {
127         var row = rows[t];
128         setSelector($n(row, 'type'), types[t]);
129         var term = search.searches[types[t]].term;
130
131         /* if this is a single -<term> search, set the selector to nocontains */
132         if(match = term.match(/^-(\w+)$/)) {
133             term = match[1];
134             setSelector($n(row, 'contains'), 'nocontains');
135         }
136         $n(row, 'term').value = term;
137     }
138 }
139
140 function advAddGblRow() {
141         var tbody = $("adv_global_tbody");
142         var newrow = $("adv_global_trow").cloneNode(true);
143         tbody.insertBefore(newrow, $("adv_global_addrow"));
144         var input = $n(newrow, "term");
145         input.value = "";
146         setEnterFunc(input, advSubmitGlobal);
147         $n(newrow, 'type').focus();
148 }
149
150 function advDrawBibExtras(r) {
151         var data = r.getResultObject();
152     var ctypes = r.ctypes
153     dojo.forEach(ctypes,
154         function(ctype) {
155                 var sel = $('adv_global_' + ctype);
156             var ctypeData = dojo.filter(data, function(item) { return item.ctype == ctype } );
157             ctypeData = ctypeData.sort(
158                 function(a,b) { /* sort alphabetically */
159                     return ((a.search_label ? a.search_label : a.value) < (b.search_label ? b.search_label : b.value)) ? -1 : 1;
160                 }
161             );
162             dojo.forEach(ctypeData,
163                 function(thing) {
164                     var opt = insertSelectorVal(sel, -1, (thing.search_label ? thing.search_label : thing.value), thing.code);
165                     opt.setAttribute('title', (thing.search_label ? thing.search_label : thing.value));
166                 }
167             );
168         }
169     );
170 }
171
172 function advSelToStringList(sel) {
173         var list = getSelectedList(sel);
174         var vals = [];
175         for( var i = 0; i < list.length; i++ ) {
176                 var str = list[i];
177                 for( var j = 0; j < str.length; j++ ) {
178                         //if(str.charAt(j) == ' ') continue;
179                         vals.push(str.charAt(j));
180                 }
181         }
182         return vals.toString();
183 }
184
185 function advGetVisSelectorVals(id) {
186         var basic = id + '_basic';
187         if(! $(id).className.match(/hide_me/)) 
188                 return advSelToStringList($(id));
189         return advSelToStringList($(basic));
190 }
191
192 function advSubmitGlobal() {
193         
194         var sortdir = getSelectorVal($('adv_global_sort_dir'));
195         var sortby  = getSelectorVal($('adv_global_sort_by'));
196
197         var litforms  = advGetVisSelectorVals('adv_global_lit_form');
198         var itemforms = advGetVisSelectorVals('adv_global_item_form');
199         var itemtypes = advGetVisSelectorVals('adv_global_item_type');
200         var audiences = advGetVisSelectorVals('adv_global_audience');
201         var biblevels = advGetVisSelectorVals('adv_global_bib_level');
202     var locations = getSelectedList($('adv_copy_location_filter_select')) + '';
203         var languages = getSelectedList($('adv_global_lang')) + '';     
204     var limit2avail = $('opac.result.limit2avail').checked ? 1 : ''
205
206         var searches = advBuildSearchBlob();
207         if(!searches) return;
208
209         clearSearchParams();
210
211         var args = {};
212         args.page = MRESULT;
213         args[PARAM_ITEMFORM] = itemforms;
214         args[PARAM_ITEMTYPE] = itemtypes;
215         args[PARAM_BIBLEVEL] = biblevels;
216         args[PARAM_LITFORM]     = litforms;
217         args[PARAM_AUDIENCE]    = audiences;
218         args[PARAM_LANGUAGE] = languages;
219         args[PARAM_COPYLOCS] = locations;
220         //args[PARAM_SEARCHES]  = js2JSON(searches); /* break these out */
221         args[PARAM_DEPTH]               = depthSelGetDepth();
222         args[PARAM_LOCATION]    = depthSelGetNewLoc();
223         args[PARAM_SORT]                = sortby;
224         args[PARAM_SORT_DIR]    = sortdir;
225         args[PARAM_ADVTYPE]     = ADVTYPE_MULTI;
226         args[PARAM_STYPE]               = "";
227         args[PARAM_TERM]                = searches;
228         args[PARAM_AVAIL]               = limit2avail;
229
230     // publicate year filtering
231     var pub1;
232     if( (pub1 = $('adv_global_pub_date_1').value) && (''+pub1).match(/\d{4}/)) {
233         switch(getSelectorVal($('adv_global_pub_date_type'))) {
234             case 'equals':
235                     args[PARAM_PUBD_BETWEEN] = pub1+','+pub1;
236                 break;
237             case 'before':
238                     args[PARAM_PUBD_BEFORE] = pub1;
239                 break;
240             case 'after':
241                     args[PARAM_PUBD_AFTER] = pub1;
242                 break;
243             case 'between':
244                 var pub2 = $('adv_global_pub_date_2').value;
245                 if((''+pub2).match(/\d{4}/))
246                         args[PARAM_PUBD_BETWEEN] = pub1+','+pub2;
247                 break;
248         }
249     }
250
251         /* pubdate sorting causes a record (not metarecord) search */
252         if( sortby == SORT_TYPE_PUBDATE || !$('adv_group_titles').checked ) {
253                 args.page = RRESULT;
254                 args[PARAM_RTYPE] = RTYPE_MULTI;
255         }
256
257         if($('adv_group_titles').checked ) 
258                 dojo.cookie(COOKIE_NOGROUP_RECORDS,'1');
259         else
260                 dojo.cookie(COOKIE_NOGROUP_RECORDS,null,{'expires':-1});
261
262
263         goTo(buildOPACLink(args));
264 }
265
266
267 function advBuildSearchBlob() {
268
269         var searches = '';
270         var tbody    = $('adv_global_tbody');
271         var rows     = tbody.getElementsByTagName('tr');
272
273         for( var i = 0; i < rows.length; i++ ) {
274
275                 var row = rows[i];
276                 if(!(row && typeof row == 'object')) continue;
277                 if(!row.getAttribute('type')) continue;
278                 
279                 var stype        = getSelectorVal($n(row, 'type'));
280                 var contains = getSelectorVal($n(row, 'contains'));
281                 var term                 = $n(row, 'term').value;
282                 if(!term) continue;
283
284                 var string = "";
285                 switch(contains) {
286                         case 'contains' : 
287                                 string += " " + term; 
288                                 break;
289
290                         case 'nocontains' : {
291                                 // Normalize spaces so we don't get "- " embedded in the query
292                                 var words = term.replace(/\s+/g,' ').replace(/^\s*/,'').replace(/\s*$/,'').split(" ");
293                                         for( var j in words ) 
294                                                 string += " -" + words[j];
295                                 }
296                                 break;
297
298                         case 'exact' : 
299                                 if(term.indexOf('"') > -1) string += " " + term;
300                                 else string += " \"" + term + "\"";
301                                 break;
302                 }
303                 if(string) {
304                         string = string.replace(/\\/g,' ');
305             string = string.replace(/^\s*/,'');
306             string = string.replace(/\s*$/,'');
307                         //searches[stype].term = string;
308             if(searches) searches += ' ';
309             searches += stype + ': '+ string;
310                 }
311         }
312
313     _debug("created search query " + searches);
314         return searches;
315 }
316
317
318 // retrieves the shelving locations
319 var advLocationsLoaded = false;
320 function advLoadCopyLocations(org) {
321     if(org == null) 
322         org = advSelectedOrg;
323     var req = new Request(FETCH_COPY_LOCATIONS, org);
324     req.callback(advShowCopyLocations);
325     req.send();
326     advLocationsLoaded = true;
327 }
328
329 // inserts the shelving locations into the multi-select
330 function advShowCopyLocations(r) {
331     var locations = r.getResultObject();
332     var sel = $('adv_copy_location_filter_select');
333     for(var i = 0; i < locations.length; i++) 
334         insertSelectorVal(sel, -1, locations[i].name(), locations[i].id());
335 }
336
337