]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/web/opac/skin/default/js/adv_global.js
After investigation by Dan Scott, Michael Peters and Mike Rylander (a little), apos...
[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}});
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         setEnterFunc(input, advSubmitGlobal);
27
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;
33     }
34
35     if(getAvail())
36         $('opac.result.limit2avail').checked = true;
37
38     // not sure we want to propogate the pubdate filter, 
39     // since other filters are not propogated
40     //advInitPubFilter();
41
42     if(!new CGI().param(PARAM_NOPERSIST_SEARCH))
43         initSearchBoxes();
44     advSyncCopyLocLink(getLocation());
45 }
46
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');
51     if(getPubdBefore()) {
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(','); 
59         i1.value = values[0]
60         if(values[0] == values[1]) {
61             setSelector(sel, 'equals');
62         } else {
63             setSelector(sel, 'between');
64             i2.value = values[1];
65         }
66     }
67 }
68
69 function advSyncCopyLocLink(org) {
70     // display the option to filter by copy location
71     advLocationsLoaded = false;
72     advSelectedOrg = org;
73     removeChildren($('adv_copy_location_filter_select'));
74
75     if(isTrue(findOrgType(findOrgUnit(org).ou_type()).can_have_vols())) {
76         unHideMe($('adv_copy_location_filter_row'));
77         advLoadCopyLocations(org); 
78     } else {
79         hideMe($('adv_copy_location_filter_row'));
80     }
81
82 }
83
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');
91         }
92     }
93     $n(rows[0], 'term').focus();
94 }
95
96
97 function initSearchBoxes() {
98     /* loads the compiled search from the search cookie 
99         and sets the widgets accordingly */
100
101     search = dojo.cookie(COOKIE_SEARCH);
102     if(!search) return;
103     _debug("loaded compiled search cookie: " + search);
104
105     search = JSON2js(search);
106     if(!search) return;
107
108     var types = getObjectKeys(search.searches);
109
110     // if we have browser cached data, clear it before populating from cookie
111     if (search.searches[types[0]].term)
112         clearSearchBoxes();
113
114     /* pre-add the needed rows */
115     while($('adv_global_tbody').getElementsByTagName('tr').length - 1 < types.length)
116         advAddGblRow();
117
118     var rows = $('adv_global_tbody').getElementsByTagName('tr');
119
120     for(var t = 0; t < types.length; t++) {
121         var row = rows[t];
122         setSelector($n(row, 'type'), types[t]);
123         var term = search.searches[types[t]].term;
124
125         /* if this is a single -<term> search, set the selector to nocontains */
126         if(match = term.match(/^-(\w+)$/)) {
127             term = match[1];
128             setSelector($n(row, 'contains'), 'nocontains');
129         }
130         $n(row, 'term').value = term;
131     }
132 }
133
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");
139         input.value = "";
140         setEnterFunc(input, advSubmitGlobal);
141         $n(newrow, 'type').focus();
142 }
143
144 function advDrawBibExtras(r) {
145         var data = r.getResultObject();
146     var ctypes = r.ctypes
147     dojo.forEach(ctypes,
148         function(ctype) {
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;
154                 }
155             );
156             dojo.forEach(ctypeData,
157                 function(thing) {
158                     var opt = insertSelectorVal(sel, -1, thing.value, thing.code);
159                     opt.setAttribute('title', thing.value);
160                 }
161             );
162         }
163     );
164 }
165
166 function advSelToStringList(sel) {
167         var list = getSelectedList(sel);
168         var vals = [];
169         for( var i = 0; i < list.length; i++ ) {
170                 var str = list[i];
171                 for( var j = 0; j < str.length; j++ ) {
172                         //if(str.charAt(j) == ' ') continue;
173                         vals.push(str.charAt(j));
174                 }
175         }
176         return vals.toString();
177 }
178
179 function advGetVisSelectorVals(id) {
180         var basic = id + '_basic';
181         if(! $(id).className.match(/hide_me/)) 
182                 return advSelToStringList($(id));
183         return advSelToStringList($(basic));
184 }
185
186 function advSubmitGlobal() {
187         
188         var sortdir = getSelectorVal($('adv_global_sort_dir'));
189         var sortby  = getSelectorVal($('adv_global_sort_by'));
190
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 : ''
199
200         var searches = advBuildSearchBlob();
201         if(!searches) return;
202
203         clearSearchParams();
204
205         var args = {};
206         args.page = MRESULT;
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;
223
224     // publicate year filtering
225     var pub1;
226     if( (pub1 = $('adv_global_pub_date_1').value) && (''+pub1).match(/\d{4}/)) {
227         switch(getSelectorVal($('adv_global_pub_date_type'))) {
228             case 'equals':
229                     args[PARAM_PUBD_BETWEEN] = pub1+','+pub1;
230                 break;
231             case 'before':
232                     args[PARAM_PUBD_BEFORE] = pub1;
233                 break;
234             case 'after':
235                     args[PARAM_PUBD_AFTER] = pub1;
236                 break;
237             case 'between':
238                 var pub2 = $('adv_global_pub_date_2').value;
239                 if((''+pub2).match(/\d{4}/))
240                         args[PARAM_PUBD_BETWEEN] = pub1+','+pub2;
241                 break;
242         }
243     }
244
245         /* pubdate sorting causes a record (not metarecord) search */
246         if( sortby == SORT_TYPE_PUBDATE || !$('adv_group_titles').checked ) {
247                 args.page = RRESULT;
248                 args[PARAM_RTYPE] = RTYPE_MULTI;
249         }
250
251         if($('adv_group_titles').checked ) 
252                 dojo.cookie(COOKIE_NOGROUP_RECORDS,'1');
253         else
254                 dojo.cookie(COOKIE_NOGROUP_RECORDS,null,{'expires':-1});
255
256
257         goTo(buildOPACLink(args));
258 }
259
260
261 function advBuildSearchBlob() {
262
263         var searches = '';
264         var tbody    = $('adv_global_tbody');
265         var rows     = tbody.getElementsByTagName('tr');
266
267         for( var i = 0; i < rows.length; i++ ) {
268
269                 var row = rows[i];
270                 if(!(row && typeof row == 'object')) continue;
271                 if(!row.getAttribute('type')) continue;
272                 
273                 var stype        = getSelectorVal($n(row, 'type'));
274                 var contains = getSelectorVal($n(row, 'contains'));
275                 var term                 = $n(row, 'term').value;
276                 if(!term) continue;
277
278                 var string = "";
279                 switch(contains) {
280                         case 'contains' : 
281                                 string += " " + term; 
282                                 break;
283
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];
289                                 }
290                                 break;
291
292                         case 'exact' : 
293                                 if(term.indexOf('"') > -1) string += " " + term;
294                                 else string += " \"" + term + "\"";
295                                 break;
296                 }
297                 if(string) {
298                         string = string.replace(/\\/g,' ');
299             string = string.replace(/^\s*/,'');
300             string = string.replace(/\s*$/,'');
301                         //searches[stype].term = string;
302             if(searches) searches += ' ';
303             searches += stype + ': '+ string;
304                 }
305         }
306
307     _debug("created search query " + searches);
308         return searches;
309 }
310
311
312 // retrieves the shelving locations
313 var advLocationsLoaded = false;
314 function advLoadCopyLocations(org) {
315     if(org == null) 
316         org = advSelectedOrg;
317     var req = new Request(FETCH_COPY_LOCATIONS, org);
318     req.callback(advShowCopyLocations);
319     req.send();
320     advLocationsLoaded = true;
321 }
322
323 // inserts the shelving locations into the multi-select
324 function advShowCopyLocations(r) {
325     var locations = r.getResultObject();
326     var sel = $('adv_copy_location_filter_select');
327     for(var i = 0; i < locations.length; i++) 
328         insertSelectorVal(sel, -1, locations[i].name(), locations[i].id());
329 }
330
331