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