5 function opac_init() {
\r
6 var advLink = getId("home_adv_search_link");
\r
7 if(advLink) advLink.setAttribute("href", buildOPACLink({page:ADVANCED}));
\r
8 getId("home_myopac_link").setAttribute("href", buildOPACLink({page:MYOPAC}, false, true));
\r
13 //alert(fetchOrgSettingDefault(G.user.home_ou(), 'auth.persistent_login_interval'));
\r
14 var stats = fieldmapper.standardRequest(['open-ils.actor', 'open-ils.actor.user.opac.vital_stats'], {async:false, params:[u.session]});
\r
15 userVitalStats = stats;
\r
16 unHideMe($('quick-links-wrapper'));
\r
18 var str = '<div id="myopac_link_div">Hi, '+u.first_given_name()+' - <a id="myopac_link" href="javascript:;">My Account</a> | <a href="javascript:;" id="theLogoutLink" style="color:red;" onclick="doLogout()"><strong>Logout</strong></a></div>\n';
\r
19 str += '<a href="javascript:;" id="dash_acct_checked">('+(stats.checkouts.out+stats.checkouts.overdue)+') Item'+((stats.checkouts.out+stats.checkouts.overdue)!=1?'s':'')+' Checked Out</a><br />\n';
\r
20 str += '<a href="javascript:;" id="dash_acct_holds">('+stats.holds.total+') Item'+( stats.holds.total!=1?'s':'' )+' on Hold (25 max.)</a><br />\n';
\r
21 str += '<a href="javascript:;" id="dash_acct_holds_ready">'+stats.holds.ready+' item'+( stats.holds.ready!=1?'s':'' )+' ready for pick up</a> | <a href="javascript:;" id="showMyBills">FINES: $'+parseFloat(stats.fines.balance_owed).toFixed(2)+'</a>\n';
\r
22 $('quick-links').innerHTML = str;
\r
23 $('myopac_link').setAttribute("href", buildOPACLink({page:MYOPAC}, false, true));
\r
24 $('dash_acct_checked').setAttribute("href", buildOPACLink({page:MYOPAC,acctpage:2}, false, true));
\r
25 $('dash_acct_holds').setAttribute("href", buildOPACLink({page:MYOPAC,acctpage:3}, false, true));
\r
26 $('dash_acct_holds_ready').setAttribute("href", buildOPACLink({page:MYOPAC,acctpage:3}, false, true));
\r
27 $('showMyBills').setAttribute("href", buildOPACLink({page:MYOPAC,acctpage:1}, false, true));
\r
31 function mySuperInitFunction() {
\r
32 G.ui.common.now_searching = elem('div');
\r
33 webCacheKey = cookieManager.read('sessionID');
\r
34 var list = getCacheValue('anonListCache');
\r
35 anonListCache = isTrue(list)?list:[];
\r
36 if(anonListCache.length) try { unHideMe($('cacheListLink')); } catch(e){}
\r
38 if(G.user && G.user.prefs[PREF_DEF_LOCATION]!="1") {
\r
39 G.user.prefs[PREF_DEF_LOCATION]="1";
\r
42 setSelector($('depth_selector'), getLocation());
\r
43 _newlocation = getLocation();
\r
47 function setCacheValue(field, value, timeout) {
\r
48 if(!timeout) timeout = '30m';
\r
49 var key = fieldmapper.standardRequest(['open-ils.actor','open-ils.actor.anon_cache.set_value'],{async:false, params:[webCacheKey, field, value]});
\r
50 if(!isTrue(webCacheKey)) {
\r
52 cookieManager.write('sessionID', webCacheKey, timeout);
\r
57 function getCacheValue(field) {
\r
58 if(!isTrue(webCacheKey)) return null;
\r
59 var val = fieldmapper.standardRequest(['open-ils.actor','open-ils.actor.anon_cache.get_value'], {async:false, params:[webCacheKey, field]});
\r
63 function isInAnonList(id) {
\r
64 for(var i in anonListCache) {
\r
65 if(anonListCache[i] == id) return true;
\r
70 var isCacheListDrawn = false;
\r
73 function showCachedList() {
\r
74 if(grabUser()) goTo(buildOPACLink({page:MYOPAC, 'acctpage':6}, false, true));
\r
75 if(!anonListCache.length) {try { hideResultsPage(); } catch(e) {} hideMe($('anonListTable')); hideMe($('cacheListLink')); return;}
\r
76 try { hideResultsPage(true); } catch(e) {}
\r
77 unHideMe($('anonListTable'));
\r
78 if(!isCacheListDrawn) fieldmapper.standardRequest(["open-ils.search","open-ils.search.biblio.record.mods_slim.retrieve"],{async:true, params:[anonListCache], oncomplete:drawCacheList});
\r
81 function drawCacheList(r) {
\r
82 isCacheListDrawn = true;
\r
83 var bibs = r.recv().content();
\r
84 if(!anonListParent) anonListParent = $('anonListParent');
\r
85 if(!anonListTemp) anonListTemp = anonListParent.removeChild($('anonListTemp'));
\r
86 removeChildren(anonListParent);
\r
87 $('anon_selector').checked = false;
\r
90 unHideMe($('holdsCacheSel'));
\r
91 setSelector($('holdsCacheSel'), grabUser().home_ou());
\r
94 for(var i in bibs) {
\r
95 var row = anonListTemp.cloneNode(true);
\r
96 $n(row, 'anon_selector').doc_id = bibs[i].doc_id();
\r
97 $n(row, 'curr_row').innerHTML = parseInt(i)+1;
\r
98 $n(row, 'title').innerHTML = bibs[i].title();
\r
99 anonListParent.appendChild(row);
\r
103 function createBibHoldObject(org) {
\r
104 if(!G.user) return null;
\r
105 if(!org) org = G.user.home_ou();
\r
107 var node = findOrgUnit(org);
\r
108 var ntype = findOrgType(node.ou_type());
\r
109 if(!ntype.can_have_users()) return null;
\r
111 var hold = new ahr();
\r
112 var interval = fetchOrgSettingDefault(G.user.home_ou(), 'circ.hold_expire_interval');
\r
113 if(!interval) interval = 0;
\r
114 var secs = interval_to_seconds(interval);
\r
115 var expire = new Date();
\r
116 expire.setTime(expire.getTime() + Number(secs + '000'));
\r
117 var expireDate = holdsVerifyThawDate(dojo.date.stamp.toISOString(expire));
\r
119 if(expireDate) hold.expire_time(expireDate);
\r
120 hold.phone_notify("");
\r
121 hold.email_notify(0);
\r
122 hold.pickup_lib(org);
\r
123 hold.usr(G.user.id());
\r
124 hold.hold_type("T");
\r
126 hold.thaw_date(null);
\r
131 function batchHoldMyList(org, parent) {
\r
132 if(!grabUser()) return;
\r
133 if(!org) G.user.home_ou();
\r
134 if(!parent) parent = $('myopac_bookbag_div');
\r
136 var nodes = dojo.query('input[name=list_action_chbx]', parent).filter(function(node, index){ return node.checked; });
\r
137 if(!nodes.length) return;
\r
139 nodes.forEach(function(node, index){ arr.push(node.getAttribute("recordid")); });
\r
140 var error = {err:""};
\r
141 var resp = placeBatchHold(arr, org, error);
\r
142 if(resp == -1) alert("Unable to place holds"); else alert(resp+" hold"+(resp==1?"":"s")+" placed successfully\n\n"+error.err);
\r
146 function placeBatchHold(ids, org, error) { // array of bib IDs, pickup lib (optional), error msgs from holds (optional)
\r
147 if(!grabUser() || !ids.length) return -1;
\r
148 if(!org) org = G.user.home_ou();
\r
152 for(var i=0; i<ids.length; i++) {
\r
153 holds[i] = createBibHoldObject(org);
\r
154 holds[i].target(ids[i]);
\r
155 chkArr.push({titleid: ids[i], volume_id: undefined, copy_id: undefined, hold_type: "T", patronid: G.user.id(), depth: 0, pickup_lib: org});
\r
158 var resp = fieldmapper.standardRequest(['open-ils.circ','open-ils.circ.title_hold.is_possible.batch.atomic'], {async:false, params:[grabUser().session, chkArr]});
\r
159 //if(resp.last_event) alert(resp.last_event.payload.fail_part); else alert('Mulit-hold successful\n'+resp.local_avail);
\r
164 for(var n in resp) {
\r
165 if(!resp[n].success) {
\r
167 str+=ids[n]+": "+(resp[n].last_event.desc==""?resp[n].last_event.textcode:resp[n].last_event.desc)+"\n";
\r
172 if(str != "") error.err+=errCount+" hold"+(errCount==1?"":"s")+" not placed successfully\n"+str;
\r
175 var resp2 = fieldmapper.standardRequest(['open-ils.circ','open-ils.circ.holds.create.batch.atomic'], {async:false, params:[grabUser().session, holds]});
\r
177 for(var t in resp2) {
\r
178 if(typeof(resp2[t]) != "object") count++; else {
\r
179 str+=ids[t]+": "+resp2[t][0].desc+"\n";
\r
183 if(str != "") error.err+=errCount+" holds not placed successfully\n"+str;
\r
187 function placeHoldOnCache() {
\r
188 //holdsDrawWindow(true);
\r
190 dojo.query('input[name=anon_selector]',$('anonListParent')).filter(function(node, index){
\r
191 if(node.checked) holdsArr.push(node.doc_id+'');
\r
194 if(!holdsArr.length) return;
\r
195 setCacheValue('saveAnonCache', holdsArr);
\r
196 goTo(buildOPACLink({page:MYOPAC}, false, true));
\r
199 function delSelCache(parent, name) {
\r
200 if(!parent) parent = $('anonListParent');
\r
201 if(!name) name = 'anon_selector';
\r
202 anonListCache = [];
\r
204 var nodes = dojo.query('input[name='+name+']',parent);
\r
205 if(!nodes.length) nodes = dojo.query('.'+name,parent);
\r
206 nodes.forEach(function(node, index){
\r
207 if(!node.checked) anonListCache.push(node.doc_id); else {
\r
209 var holdsLink = $n($('result_table_template_'+node.doc_id), 'result_my_list_link');
\r
211 removeChildren(holdsLink);
\r
212 holdsLink.innerHTML = '';
\r
213 holdsLink.appendChild(elem('img', {src:'/opac/skin/kcls/graphics/add_mylist.gif'}, null));
\r
214 holdsLink.title = "Add to my list";
\r
220 isCacheListDrawn = false;
\r
221 setCacheValue('anonListCache', anonListCache);
\r
222 if(name=='anon_selector') showCachedList();
\r
226 String.prototype.trim = function() {
\r
227 return this.replace(/^\s+|\s+$/g,"");
\r
229 String.prototype.ltrim = function() {
\r
230 return this.replace(/^\s+/,"");
\r
232 String.prototype.rtrim = function() {
\r
233 return this.replace(/\s+$/,"");
\r
237 //////////////////////
\r
239 document.getElementsByClassName = function(cl) {
\r
241 var myclass = new RegExp('\\b'+cl+'\\b');
\r
242 var elems = document.getElementsByTagName('*');
\r
243 for (var i = 0; i < elems.length; i++) {
\r
244 var classes = elems[i].className;
\r
245 if (myclass.test(classes)) retnode.push(elems[i]);
\r
250 $c = document.getElementsByClassName;
\r
251 ////////////////////////////////////////////////////////////////////////
\r
253 function getOrgs() {
\r
254 var tree = $('depth_selector');
\r
255 buildOrgSel(tree, globalOrgTree, 0);
\r
256 setSelector(tree, getLocation());
\r
257 //setSelector(tree, "1");
\r
260 function swapTabs(el) {
\r
262 var tabs = dojo.query("a",el.parentNode.id);
\r
263 for(var n=0; n< tabs.length;n++) {
\r
266 unHideMe($(i.rel));
\r
267 i.style.background="url('/opac/skin/kcls/graphics/"+i.id+"_on.gif') no-repeat bottom";
\r
270 i.style.background="url('/opac/skin/kcls/graphics/"+i.id+"_off.gif') no-repeat bottom";
\r
275 // walk the marc record dom - returns a contactenated string of the requested marc subfields
\r
276 // depth-first recursive function
\r
277 function walkXML(xml,field,subfield) {
\r
278 if(!xml || !field || !subfield) return "";
\r
279 var nodes = (xml.childNodes)?xml.childNodes:null;
\r
280 if(!nodes) return "";
\r
283 for(var i=0; i<nodes.length; i++) {
\r
284 var obj = nodes[i];
\r
285 if(obj.hasChildNodes()) {
\r
286 var tag = (obj.nodeName=="datafield")?obj.getAttribute("tag"):"";
\r
288 for(var n=0; n<obj.childNodes.length; n++){
\r
289 var child = obj.childNodes[n];
\r
290 var code = (child.nodeName=="subfield")?child.getAttribute("code"):"";
\r
291 if(code==subfield) str += (child.textContent)?child.textContent:child.text; // IE check
\r
294 str += walkXML(obj,field,subfield);
\r
300 // returns the requested marc data or passes it to callback if present
\r
301 // callback arg is optional
\r
302 function getMarcData(docid, field, subfield, callback) {
\r
303 if(!docid || !field || !subfield) return "";
\r
304 var cgi = new CGI();
\r
305 var xhr = buildXMLRequest();
\r
306 var proto = (location.href.match(/^[Hh][Tt][Tt][Pp][Ss]:/))?"https://":"http://";
\r
308 if(typeof(callback)=="function") {
\r
309 xhr.onreadystatechange = function() {
\r
310 if(xhr.readyState==4 && xhr.status == 200) callback(walkXML(xhr.responseXML.documentElement,field.toLowerCase(),subfield.toLowerCase()), docid);
\r
314 xhr.open("GET",proto+cgi.server_name+"/opac/extras/supercat/retrieve/marcxml/record/"+docid,((callback)?true:false));
\r
317 if(typeof(callback)!="function" && xhr.status == 200) {
\r
318 return walkXML(xhr.responseXML.documentElement,field.toLowerCase(),subfield.toLowerCase());
\r
322 function setFormatIcon(imgEl, type) {
\r
323 if(!imgEl) return false;
\r
324 if(!type) { hideMe(imgEl); return false; }
\r
328 case "a": img="media_book.jpg"; break;
\r
329 case "b": img="media_magazines.jpg"; break;
\r
330 case "c": img="media_printedmusic.jpg"; break;
\r
331 case "d": img="media_microform.jpg"; break;
\r
332 case "e": img="media_equipment.jpg"; break;
\r
333 case "f": img="media_films.jpg"; break;
\r
334 case "g": img=""; break;
\r
335 case "h": img="media_dvd.jpg"; break;
\r
336 case "i": img="media_bookoncassette.jpg"; break;
\r
337 case "j": img="media_musiccd.jpg"; break;
\r
338 case "k": img="media_musiccassette.jpg"; break;
\r
339 case "l": img="media_musicrecord.jpg"; break;
\r
340 case "m": img="media_software.jpg"; break;
\r
341 case "n": img="media_bookoncd.jpg"; break;
\r
342 case "o": img="media_kit.jpg"; break;
\r
343 case "p": img="media_newspaper.jpg"; break;
\r
344 case "q": img="media_largeprint.jpg"; break;
\r
345 case "r": img="media_3dobject.jpg"; break;
\r
346 case "s": img="media_slide.jpg"; break;
\r
347 case "t": img="media_online.jpg"; break;
\r
348 case "u": img="media_eaudio.jpg"; break;
\r
349 case "v": img="media_ebooktext.jpg"; break;
\r
350 case "w": img="media_eaudio.jpg"; break;
\r
351 case "x": img="media_downloadmusic.jpg"; break;
\r
352 case "y": img="media_downloadvideo.jpg"; break;
\r
353 case "z": img="media_map.jpg"; break;
\r
354 case "2": img="media_cassettewithbook.jpg"; break;
\r
355 case "5": img="media_cdwithbook.jpg"; break;
\r
360 dojo.attr(imgEl, "src","/opac/skin/kcls/graphics/"+img);
\r
361 } else { hideMe(imgEl); return false; }
\r
367 function get998dValue(code) {
\r
368 if(!code) code = "";
\r
369 code = code.toLowerCase();
\r
373 case "a": Label = "Book"; break;
\r
374 case "i": Label = "Book on cassette"; break;
\r
375 case "n": Label = "Book on CD"; break;
\r
376 case "x": Label = "Download music"; break;
\r
377 case "y": Label = "Download video"; break;
\r
378 case "h": Label = "DVD"; break;
\r
379 case "w": Label = "eBook - Audio"; break;
\r
380 case "v": Label = "eBook - Text"; break;
\r
381 case "e": Label = "Equipment"; break;
\r
382 case "f": Label = "Films"; break;
\r
383 case "o": Label = "Kit"; break;
\r
384 case "q": Label = "Large print"; break;
\r
385 case "b": Label = "Magazine"; break;
\r
386 case "d": Label = "Microform"; break;
\r
387 case "k": Label = "Music cassette"; break;
\r
388 case "j": Label = "Music CD"; break;
\r
389 case "l": Label = "Music LP"; break;
\r
390 case "p": Label = "Newspaper"; break;
\r
391 case "t": Label = "Online"; break;
\r
392 case "u": Label = "Player"; break;
\r
393 case "c": Label = "Printed music"; break;
\r
394 case "2": Label = "Read along with cassette"; break;
\r
395 case "5": Label = "Read along with CD"; break;
\r
396 case "c": Label = "Scores"; break;
\r
397 case "m": Label = "Software"; break;
\r
398 case "g": Label = "Video"; break;
\r
399 case "r": Label = "3-D Object"; break;
\r
400 case "z": Label = "Map"; break;
\r
401 case "s": Label = "Slide set"; break;
\r
406 function mapLibUrl(lib) {
\r
409 case "1489": url = "http://www.kcls.org/algonapacific/"; break;
\r
410 case "1490": url = "http://www.kcls.org/auburn/"; break;
\r
411 case "1492": url = "http://www.kcls.org/bellevue/"; break;
\r
412 case "1491": url = "http://www.kcls.org/blackdiamond/"; break;
\r
413 case "1493": url = "http://www.kcls.org/bothell/"; break;
\r
414 case "1494": url = "http://www.kcls.org/boulevardpark/"; break;
\r
415 case "1495": url = "http://www.kcls.org/burien/"; break;
\r
416 case "1496": url = "http://www.kcls.org/carnation/"; break;
\r
417 case "1497": url = "http://www.kcls.org/covington/"; break;
\r
418 case "1502": url = "http://www.kcls.org/desmoines/"; break;
\r
419 case "1503": url = "http://www.kcls.org/duvall/"; break;
\r
420 case "1508": url = "http://www.kcls.org/fairwood/"; break;
\r
421 case "1506": url = "http://www.kcls.org/fallcity/"; break;
\r
422 case "1509": url = "http://www.kcls.org/federalway/"; break;
\r
423 case "1505": url = "http://www.kcls.org/320th/"; break;
\r
424 case "1507": url = "http://www.kcls.org/foster/"; break;
\r
425 case "1513": url = "http://www.kcls.org/issaquah/"; break;
\r
426 case "1519": url = "http://www.kcls.org/kenmore/"; break;
\r
427 case "1520": url = "http://www.kcls.org/kent/"; break;
\r
428 case "1517": url = "http://www.kcls.org/kingsgate/"; break;
\r
429 case "1518": url = "http://www.kcls.org/kirkland/"; break;
\r
430 case "1521": url = "http://www.kcls.org/lakeforestpark/"; break;
\r
431 case "1522": url = "http://www.kcls.org/lakehills/"; break;
\r
432 case "1499": url = "http://www.kcls.org/crossroads/"; break;
\r
433 case "1538": url = "http://www.kcls.org/southcenter/"; break;
\r
434 case "1527": url = "http://www.kcls.org/maplevalley/"; break;
\r
435 case "1525": url = "http://www.kcls.org/mercerisland/"; break;
\r
436 case "1526": url = "http://www.kcls.org/muckleshoot/"; break;
\r
437 case "1529": url = "http://www.kcls.org/newportway/"; break;
\r
438 case "1528": url = "http://www.kcls.org/northbend/"; break;
\r
439 case "1533": url = "http://www.kcls.org/redmond/"; break;
\r
440 case "1532": url = "http://www.kcls.org/richmondbeach/"; break;
\r
441 case "1534": url = "http://www.kcls.org/sammamish/"; break;
\r
442 case "1536": url = "http://www.kcls.org/skykomish/"; break;
\r
443 case "1541": url = "http://www.kcls.org/skyway/"; break;
\r
444 case "1537": url = "http://www.kcls.org/snoqualmie/"; break;
\r
445 case "1546": url = "http://www.kcls.org/valleyview/"; break;
\r
446 case "1545": url = "http://www.kcls.org/vashon/"; break;
\r
447 case "1547": url = "http://www.kcls.org/whitecenter/"; break;
\r
448 case "1548": url = "http://www.kcls.org/woodinville/"; break;
\r
449 case "1549": url = "http://www.kcls.org/woodmont/"; break;
\r
450 case "1535": url = "http://www.kcls.org/shoreline/"; break;
\r
451 case "1540": url = "http://www.kcls.org/servicecenter/"; break;
\r
452 case "1510": url = "http://www.kcls.org/greenbridge/"; break;
\r
453 //case "": url = "http://www.kcls.org/federalway/#closure"; break;
\r
454 case "1559": url = "http://www.kcls.org/libraryexpress/"; break;
\r
455 case "1556": url = "http://www.kcls.org/renton/"; break;
\r
456 case "1557": url = "http://www.kcls.org/rentonhighlands/"; break;
\r
462 function checkAll(parent, id, name) {//Object, string
\r
463 var obj = typeof(id)=="object"?id:$(id);
\r
464 if(!parent || !obj) return;
\r
465 if(!name) name = id.toString();
\r
466 var nodes = dojo.query('input[name='+name+']', parent);
\r
467 if(!nodes.length) nodes = dojo.query('.'+name, parent);
\r
468 nodes.forEach(function(node, index){
\r
469 node.checked = obj.checked;
\r
473 var blinkMeArr = [];
\r
474 function blinkMe(str,bool) {
\r
479 clearInterval(blinkMeArr[str]);
\r
481 } else blinkMeArr[str] = setInterval(function(){
\r
482 obj.blinker?hideMe(obj):unHideMe(obj);
\r
483 obj.blinker=!obj.blinker;}, 500);
\r
486 // null out all children of parent obj
\r
489 function destroyObj(obj) {
\r
493 for(var i in obj) {
\r
494 if(typeof(obj[i])=="function" && i=="destroyObj") continue;
\r
495 if(typeof(obj[i])=="object" && obj[i]!=null && typeof(obj[i].tagName)=="undefined") destroyObj(obj[i]);
\r
496 try { obj[i]=null; } catch(e){}
\r
501 attachEvt("common","init",mySuperInitFunction);
\r