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