]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/web/opac/common/js/opac_utils.js
added much control over holds during placement and after the fact
[Evergreen.git] / Open-ILS / web / opac / common / js / opac_utils.js
1 /* - Request ------------------------------------------------------------- */
2
3 /* define it again here for pages that don't load RemoteRequest */
4 function isXUL() { try { if(IAMXUL) return true;}catch(e){return false;}; }
5
6
7 var cookieManager = new HTTP.Cookies();
8
9 var __ilsEvent; /* the last event the occurred */
10
11 function Request(type) {
12
13         var s = type.split(":");
14         if(s[2] == "1" && isXUL()) s[1] += ".staff";
15         this.request = new RemoteRequest(s[0], s[1]);
16         var p = [];
17
18         for( var x = 1; x!= arguments.length; x++ ) {
19                 p.push(arguments[x]);
20                 this.request.addParam(arguments[x]);
21         }
22
23         if( getDebug() ) {
24                 var str = "";
25                 for( var i = 0; i != p.length; i++ ) {
26                         if( i > 0 ) str += ", "
27                         str += js2JSON(p[i]);
28                 }
29                 _debug('request ' + s[0] + ' ' + s[1] + ' ' + str );
30         }
31 }
32
33 Request.prototype.callback = function(cal) {this.request.setCompleteCallback(cal);}
34 Request.prototype.send          = function(block){this.request.send(block);}
35 Request.prototype.result        = function(){return this.request.getResultObject();}
36
37 function showCanvas() {
38         for( var x in G.ui.altcanvas ) {
39                 hideMe(G.ui.altcanvas[x]);
40         }
41         hideMe(G.ui.common.loading);
42         unHideMe(G.ui.common.canvas_main);
43         try{G.ui.searchbar.text.focus();}catch(e){}
44 }
45
46 function swapCanvas(newNode) {
47         for( var x in G.ui.altcanvas ) 
48                 hideMe(G.ui.altcanvas[x]);
49
50         hideMe(G.ui.common.loading);
51         hideMe(G.ui.common.canvas_main);
52         unHideMe(newNode);
53 }
54
55 /* finds the name of the current page */
56 var currentPage = null;
57 function findCurrentPage() {
58         if(currentPage) return currentPage;
59
60         var pages = [];
61         for( var p in config.page ) pages.push(config.page[p]);
62         pages = pages.sort( function(a,b){ return - (a.length - b.length); } );
63
64         var path = location.pathname;
65         if(!path.match(/.*\.xml$/))
66                 path += "index.xml"; /* in case they go to  / */
67
68         var page = null;
69         for( var p in pages ) {
70                 if( path.indexOf(pages[p]) != -1)
71                         page = pages[p];
72         }
73
74         for( var p in config.page ) {
75                 if(config.page[p] == page) {
76                         currentPage = p;
77                         return p;
78                 }
79         }
80         return null;
81 }
82
83
84 /* sets all of the params values  ----------------------------- */
85 function initParams() {
86         var cgi = new CGI();    
87
88         TERM            = cgi.param(PARAM_TERM);
89         STYPE           = cgi.param(PARAM_STYPE);
90         FORM            = cgi.param(PARAM_FORM);
91         LOCATION        = parseInt(cgi.param(PARAM_LOCATION));
92         ORIGLOC = parseInt(cgi.param(PARAM_ORIGLOC));
93         DEPTH           = parseInt(cgi.param(PARAM_DEPTH));
94         OFFSET  = parseInt(cgi.param(PARAM_OFFSET));
95         COUNT           = parseInt(cgi.param(PARAM_COUNT));
96         HITCOUNT        = parseInt(cgi.param(PARAM_HITCOUNT));
97         MRID            = parseInt(cgi.param(PARAM_MRID));
98         RID             = parseInt(cgi.param(PARAM_RID));
99         AUTHTIME        = parseInt(cgi.param(PARAM_AUTHTIME));
100         ADVTERM = cgi.param(PARAM_ADVTERM);
101         ADVTYPE = cgi.param(PARAM_ADVTYPE);
102         RTYPE           = cgi.param(PARAM_RTYPE);
103         SORT            = cgi.param(PARAM_SORT);
104         SORT_DIR        = cgi.param(PARAM_SORT_DIR);
105         DEBUG           = cgi.param(PARAM_DEBUG);
106         CALLNUM = cgi.param(PARAM_CN);
107
108         /* set up some sane defaults */
109         if(isNaN(LOCATION))     LOCATION        = 1;
110         if(isNaN(DEPTH))                DEPTH           = 0;
111         if(isNaN(OFFSET))               OFFSET  = 0;
112         if(isNaN(COUNT))                COUNT           = 10;
113         if(isNaN(HITCOUNT))     HITCOUNT        = 0;
114         if(isNaN(MRID))         MRID            = 0;
115         if(isNaN(RID))                  RID             = 0;
116         if(isNaN(ORIGLOC))      ORIGLOC = 1;
117         if(isNaN(AUTHTIME))     AUTHTIME        = 0;
118         if(ADVTERM==null)               ADVTERM = "";
119 }
120
121 function initCookies() {
122         FONTSIZE = "regular";
123         var font = cookieManager.read(COOKIE_FONT);
124         scaleFonts(font);
125         if(font) FONTSIZE = font;
126         SKIN = cookieManager.read(COOKIE_SKIN);
127 }
128
129 /* URL param accessors */
130 function getTerm(){return TERM;}
131 function getStype(){return STYPE;}
132 function getLocation(){return LOCATION;}
133 function getDepth(){return DEPTH;}
134 function getForm(){return FORM;}
135 function getOffset(){return OFFSET;}
136 function getDisplayCount(){return COUNT;}
137 function getHitCount(){return HITCOUNT;}
138 function getMrid(){return MRID;};
139 function getRid(){return RID;};
140 function getOrigLocation(){return ORIGLOC;}
141 function getAuthtime() { return AUTHTIME; }
142 function getSearchBarExtras(){return SBEXTRAS;}
143 function getFontSize(){return FONTSIZE;};
144 function getSkin(){return SKIN;};
145 function getAdvTerm(){return ADVTERM;}
146 function getAdvType(){return ADVTYPE;}
147 function getRtype(){return RTYPE;}
148 function getSort(){return SORT;}
149 function getSortDir(){return SORT_DIR;}
150 function getDebug(){return DEBUG;}
151 function getCallnumber() { return CALLNUM; }
152
153
154 function findBasePath() {
155         var path = location.pathname;
156         if(!path.match(/.*\.xml$/)) path += "index.xml"; 
157         var idx = path.indexOf(config.page[findCurrentPage()]);
158         return path.substring(0, idx);
159 }
160
161 function findBaseURL(ssl) {
162         var path = findBasePath();
163         var proto = (ssl) ? "https:" : "http:";
164         return proto + "//" + location.host + path;
165         dump( 'ssl: ' + ssl + 'proto ' + proto );
166 }
167
168 /*
169 function buildISBNSrc(isbn) {
170         return "http://" + location.host + "/jackets/" + isbn;
171 }
172 */
173
174 function buildImageLink(name, ssl) {
175         return findBaseURL(ssl) + "../../../../images/" + name;
176 }
177
178 function buildExtrasLink(name, ssl) {
179         return findBaseURL(ssl) + "../../../../extras/" + name;
180 }
181
182 var consoleService;
183 function _debug(str) { 
184         try { dump(str + '\n'); } catch(e) {} 
185
186         if(!IE) {
187                 if(!consoleService) {
188                         try {
189                                 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
190                                 this.consoleService = Components.classes['@mozilla.org/consoleservice;1']
191                                         .getService(Components.interfaces.nsIConsoleService);
192                         } catch(e) {}
193                 }
194         
195                 try {
196                         if(consoleService) {
197                                 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
198                                 consoleService.logStringMessage(str + '\n');
199                         }
200                 } catch(e){}
201         }
202 }
203
204 function  buildOPACLink(args, slim, ssl) {
205
206         if(!args) args = {};
207         var string = "";
208
209         if(!slim) {
210                 string = findBaseURL(ssl);
211                 if(args.page) string += config.page[args.page];
212                 else string += config.page[findCurrentPage()];
213         }
214
215         string += "?";
216
217         for( var x in args ) {
218                 var v = args[x];
219                 if(x == "page" || v == null || v == undefined || v+'' == 'NaN' ) continue;
220                 if(x == PARAM_OFFSET && v == 0) continue;
221                 if(x == PARAM_LOCATION && v == 1) continue;
222                 if(x == PARAM_DEPTH && v == 0) continue;
223                 if(x == PARAM_COUNT && v == 10) continue;
224                 if(x == PARAM_FORM && v == 'all' ) continue;
225                 if( instanceOf(v, Array) && v.length ) {
226                         for( var i = 0; i < v.length; i++ ) {
227                                 string += "&" + x + "=" + encodeURIComponent(v[i]);
228                         }
229                 } else {
230                         string += "&" + x + "=" + encodeURIComponent(v);
231                 }
232         }
233
234         if(getDebug())
235                 string += _appendParam(DEBUG,   PARAM_DEBUG, args, getDebug, string);
236         if(getOrigLocation() != 1) 
237                 string += _appendParam(ORIGLOC, PARAM_ORIGLOC, args, getOrigLocation, string);
238         if(getTerm()) 
239                 string += _appendParam(TERM,            PARAM_TERM, args, getTerm, string);
240         if(getStype()) 
241                 string += _appendParam(STYPE,           PARAM_STYPE, args, getStype, string);
242         if(getLocation() != 1) 
243                 string += _appendParam(LOCATION, PARAM_LOCATION, args, getLocation, string);
244         if(getDepth() != 0) 
245                 string += _appendParam(DEPTH,           PARAM_DEPTH, args, getDepth, string);
246         if(getForm() && (getForm() != 'all') ) 
247                 string += _appendParam(FORM,            PARAM_FORM, args, getForm, string);
248         if(getOffset() != 0) 
249                 string += _appendParam(OFFSET,  PARAM_OFFSET, args, getOffset, string);
250         if(getDisplayCount() != 10) 
251                 string += _appendParam(COUNT,           PARAM_COUNT, args, getDisplayCount, string);
252         if(getHitCount()) 
253                 string += _appendParam(HITCOUNT, PARAM_HITCOUNT, args, getHitCount, string);
254         if(getMrid())
255                 string += _appendParam(MRID,            PARAM_MRID, args, getMrid, string);
256         if(getRid())
257                 string += _appendParam(RID,             PARAM_RID, args, getRid, string);
258         if(getAuthtime())
259                 string += _appendParam(AUTHTIME,        PARAM_AUTHTIME, args, getAuthtime, string);
260         if(getAdvTerm())
261                 string += _appendParam(ADVTERM, PARAM_ADVTERM, args, getAdvTerm, string);
262         if(getAdvType())
263                 string += _appendParam(ADVTYPE, PARAM_ADVTYPE, args, getAdvType, string);
264         if(getRtype())
265                 string += _appendParam(RTYPE,           PARAM_RTYPE, args, getRtype, string);
266
267         return string.replace(/\&$/,'').replace(/\?\&/,"?");    
268 }
269
270 function _appendParam( fieldVar, fieldName, overrideArgs, getFunc, string ) {
271         var ret = "";
272         if( fieldVar != null && (fieldVar +'' != 'NaN') && overrideArgs[fieldName] == null ) 
273                 ret = "&" + fieldName + "=" + encodeURIComponent(getFunc());
274         return ret;
275 }
276
277 /* ----------------------------------------------------------------------- */
278 function cleanISBN(isbn) {
279    if(isbn) {
280       isbn = isbn.toString().replace(/^\s+/,"");
281       var idx = isbn.indexOf(" ");
282       if(idx > -1) { isbn = isbn.substring(0, idx); }
283    } else isbn = "";
284    return isbn;
285 }       
286
287
288 /* builds a link that goes to the title listings for a metarecord */
289 function buildTitleLink(rec, link) {
290         if(!rec) return;
291         link.appendChild(text(normalize(truncate(rec.title(), 65))));
292         var args = {};
293         args.page = RRESULT;
294         args[PARAM_OFFSET] = 0;
295         args[PARAM_MRID] = rec.doc_id();
296         args[PARAM_RTYPE] = RTYPE_MRID;
297         link.setAttribute("href", buildOPACLink(args));
298 }
299
300 function buildTitleDetailLink(rec, link) {
301         if(!rec) return;
302         link.appendChild(text(normalize(truncate(rec.title(), 65))));
303         var args = {};
304         args.page = RDETAIL;
305         args[PARAM_OFFSET] = 0;
306         args[PARAM_RID] = rec.doc_id();
307         link.setAttribute("href", buildOPACLink(args));
308 }
309
310 /* 'type' is one of STYPE_AUTHOR, STYPE_SUBJECT, ... found in config.js 
311         'trunc' is the number of characters to show in the string, defaults to 65 */
312 function buildSearchLink(type, string, linknode, trunc) {
313         if(!trunc) trunc = 65;
314         var args = {};
315         args.page = MRESULT;
316         args[PARAM_OFFSET] = 0;
317         args[PARAM_TERM] = string;
318         args[PARAM_STYPE] = type;
319         linknode.appendChild(text(normalize(truncate(string, trunc))));
320         linknode.setAttribute("href", buildOPACLink(args));
321 }
322
323
324 /* ----------------------------------------------------------------------- */
325 /* user session handling */
326 /* ----------------------------------------------------------------------- */
327 /* session is the login session.  If no session is provided, we attempt
328         to find one in the cookies.  If 'force' is true we retrieve the 
329         user from the server even if there is already a global user present.
330         if ses != G.user.session, we also force a grab */
331 function grabUser(ses, force) {
332
333         if(!ses && isXUL()) ses = xulG['authtoken'];
334         if(!ses) ses = cookieManager.read(COOKIE_SES);
335         if(!ses) return false;
336
337         if(!force) 
338                 if(G.user && G.user.session == ses)
339                         return G.user;
340
341         /* first make sure the session is valid */
342         var request = new Request(FETCH_SESSION, ses, 1 );
343         request.send(true);
344         var user = request.result();
345
346         if(checkILSEvent(user)) {
347                 __ilsEvent = user;
348                 doLogout();
349                 return false; /* unable to grab the session */
350         }
351
352         if( !(typeof user == 'object' && user._isfieldmapper) ) {
353                 doLogout();
354                 return false;
355         }
356
357         G.user = user;
358         G.user.fleshed = false;
359         G.user.session = ses;
360         cookieManager.write(COOKIE_SES, ses, '+1y');
361
362         grabUserPrefs();
363         if(G.user.prefs['opac.hits_per_page'])
364                 COUNT = parseInt(G.user.prefs['opac.hits_per_page']);
365
366         if(G.user.prefs[PREF_DEF_FONT]) 
367                 setFontSize(G.user.prefs[PREF_DEF_FONT]);
368
369         var at = getAuthtime();
370         if(isXUL()) at = xulG['authtime'];
371
372         if(at) new AuthTimer(at).run(); 
373         return G.user;
374 }
375
376
377 /* sets the 'prefs' field of the user object to their preferences 
378         and returns the preferences */
379 function grabUserPrefs(user, force) {
380         if(user == null) user = G.user;
381         if(!force && user.prefs) return user.prefs;     
382         var req = new Request(FETCH_USER_PREFS, user.session, user.id());
383         req.send(true);
384         user.prefs = req.result();
385         return user.prefs;
386 }
387
388 function grabFleshedUser() {
389
390         if(!G.user || !G.user.session) {
391                 grabUser();     
392                 if(!G.user || !G.user.session) return null;
393         }
394
395         if(G.user.fleshed) return G.user;
396
397    var req = new Request(FETCH_FLESHED_USER, G.user.session);
398         req.send(true);
399
400         G.user = req.result();
401
402         if(!G.user || G.user.length == 0) { 
403                 G.user = null; return false; 
404                 cookieManager.remove(COOKIE_SES);
405         }
406
407         G.user.session = ses;
408         G.user.fleshed = true;
409
410         cookieManager.write(COOKIE_SES, ses, '+1y'); /*  update the cookie */
411         return G.user;
412 }
413
414 function checkUserSkin(new_skin) {
415
416         return; /* XXX do some debugging with this... */
417
418         var user_skin = getSkin();
419         var cur_skin = grabSkinFromURL();
420
421         if(new_skin) user_skin = new_skin;
422
423         if(!user_skin) {
424
425                 if(grabUser()) {
426                         if(grabUserPrefs()) {
427                                 user_skin = G.user.prefs["opac.skin"];
428                                 cookieManager.write( COOKIE_SKIN, user_skin, '+1y' );
429                         }
430                 }
431         }
432
433         if(!user_skin) return;
434
435         if( cur_skin != user_skin ) {
436                 var url = buildOPACLink();
437                 goTo(url.replace(cur_skin, user_skin));
438         }
439 }
440
441 function updateUserSetting(setting, value, user) {
442         if(user == null) user = G.user;
443         var a = {};
444         a[setting] = value;
445         var req = new Request( UPDATE_USER_PREFS, user.session, a );
446         req.send(true);
447         return req.result();
448 }
449
450 function commitUserPrefs() {
451         var req = new Request( 
452                 UPDATE_USER_PREFS, G.user.session, null, G.user.prefs );
453         req.send(true);
454         return req.result();
455 }
456
457 function grabSkinFromURL() {
458         var path = findBasePath();
459         path = path.replace("/xml/", "");
460         var skin = "";
461         for( var i = path.length - 1; i >= 0; i-- ) {
462                 var ch = path.charAt(i);
463                 if(ch == "/") break;
464                 skin += ch;
465         }
466
467         var skin2 = "";
468         for( i = skin.length - 1; i >= 0; i--)
469                 skin2 += skin.charAt(i);
470
471         return skin2;
472 }
473
474
475 /* returns a fleshed G.user on success, false on failure */
476 function doLogin() {
477
478         abortAllRequests();
479
480         var uname = G.ui.login.username.value;
481         var passwd = G.ui.login.password.value; 
482
483         var init_request = new Request( LOGIN_INIT, uname );
484    init_request.send(true);
485    var seed = init_request.result();
486
487    if( ! seed || seed == '0') {
488       alert( "Error Communicating with Authentication Server" );
489       return null;
490    }
491
492         var args = {
493                 password : hex_md5(seed + hex_md5(passwd)), 
494                 type            : "opac", 
495                 org             : getOrigLocation()
496         };
497
498         if( uname.match(REGEX_BARCODE) ) args.barcode = uname; /* make this better */
499         else args.username = uname;
500
501    var auth_request = new Request( LOGIN_COMPLETE, args );
502
503    auth_request.send(true);
504    var auth_result = auth_request.result();
505
506         var code = checkILSEvent(auth_result);
507         if(code) { alertILSEvent(code); return null; }
508
509         AUTHTIME = parseInt(auth_result.payload.authtime);
510         var u = grabUser(auth_result.payload.authtoken, true);
511         if(u) runEvt( "common", "locationChanged", u.home_ou(), findOrgDepth(u.home_ou()) );
512
513         checkUserSkin();
514
515         return u;
516 }
517
518 function doLogout(noredirect) {
519
520         /* cancel everything else */
521         abortAllRequests();
522
523         /* be nice and delete the session from the server */
524         if(G.user && G.user.session) { 
525                 var req = new Request(LOGIN_DELETE, G.user.session);
526       req.send(true);
527                 try { req.result(); } catch(E){}
528     }
529
530         G.user = null;
531         cookieManager.remove(COOKIE_SES);
532         cookieManager.remove(COOKIE_SKIN);
533         checkUserSkin("default");
534         COUNT = 10;
535
536         var args = {};
537         args[PARAM_TERM] = "";
538         args[PARAM_LOCATION] = globalOrgTree.id();
539         args[PARAM_DEPTH] = findOrgDepth(globalOrgTree);
540         args.page = "home";
541
542         var nored = false;
543         try{ if(isFrontPage) nored = true; } catch(e){nored = false;}
544         if(!nored) goTo(buildOPACLink(args));
545 }
546
547
548 function hideMe(obj) { addCSSClass(obj, config.css.hide_me); } 
549 function unHideMe(obj) { removeCSSClass(obj, config.css.hide_me); }
550
551
552 /* ----------------------------------------------------------------------- */
553 /* build the org tree */
554 /* ----------------------------------------------------------------------- */
555 function drawOrgTree() {
556         //setTimeout( 'buildOrgSelector(G.ui.common.org_tree, orgTreeSelector);', 10 );
557         setTimeout( 'buildOrgSelector(G.ui.common.org_tree, orgTreeSelector);', 1 );
558 }
559         
560 var orgTreeSelector;
561 function buildOrgSelector(node) {
562         var tree = new SlimTree(node,'orgTreeSelector');
563         orgTreeSelector = tree;
564         for( var i in orgArraySearcher ) { 
565                 var node = orgArraySearcher[i];
566                 if( node == null ) continue;
567                 if(node.parent_ou() == null)
568                         tree.addNode(node.id(), -1, node.name(), 
569                                 "javascript:orgSelect(" + node.id() + ");", node.name());
570                 else {
571                         tree.addNode(node.id(), findOrgUnit(node.parent_ou()).id(), node.name(), 
572                                 "javascript:orgSelect(" + node.id() + ");", node.name());
573                 }
574         }
575         hideMe($('org_loading_div'));
576         unHideMe($('org_selector_tip'));
577         return tree;
578 }
579
580 function orgSelect(id) {
581         showCanvas();
582         runEvt("common", "locationChanged", id, findOrgDepth(id) );
583
584         removeChildren(G.ui.common.now_searching);
585         G.ui.common.now_searching.appendChild(text(findOrgUnit(id).name()));
586 }
587
588 //var fontCookie = new HTTP.Cookies();
589
590 function setFontSize(size) {
591         scaleFonts(size);
592         cookieManager.write(COOKIE_FONT, size, '+1y');
593 }
594
595
596 var resourceFormats = [
597    "text",
598    "moving image",
599    "sound recording", "software, multimedia",
600    "still images",
601    "cartographic",
602    "mixed material",
603    "notated music",
604    "three dimensional object" ];
605
606
607 function modsFormatToMARC(format) {
608    switch(format) {
609       case "text":
610          return "at";
611       case "moving image":
612          return "g";
613       case "sound recording":
614          return "ij";
615       case "sound recording-nonmusical":
616          return "i";
617       case "sound recording-musical":
618          return "j";
619       case "software, multimedia":
620          return "m";
621       case "still images":
622          return "k";
623       case "cartographic":
624          return "ef";
625       case "mixed material":
626          return "op";
627       case "notated music":
628          return "cd";
629       case "three dimensional object":
630          return "r";
631    }
632    return "at";
633 }
634
635
636 function MARCFormatToMods(format) {
637    switch(format) {
638       case "a":
639       case "t":
640          return "text";
641       case "g":
642          return "moving image";
643       case "i":
644          return "sound recording-nonmusical";
645       case "j":
646          return "sound recording-musical";
647       case "m":
648          return "software, multimedia";
649       case "k":
650          return "still images";
651       case "e":
652       case "f":
653          return "cartographic";
654       case "o":
655       case "p":
656          return "mixed material";
657       case "c":
658       case "d":
659          return "notated music";
660       case "r":
661          return "three dimensional object";
662    }
663    return "text";
664 }
665
666 function setResourcePic( img, resource ) {
667         img.setAttribute( "src", "../../../../images/tor/" + resource + ".jpg");
668         img.title = resource;
669 }
670
671
672
673 function msg( text ) {
674         try { alert( text ); } catch(e) {}
675 }
676
677 function findRecord(id,type) {
678         try {
679                 for( var i = 0; i != recordsCache.length; i++ ) {
680                         var rec = recordsCache[i];
681                         if( rec && rec.doc_id() == id ) return rec;
682                 }
683         } catch(E){}
684         var meth = FETCH_RMODS
685         if(type == 'M') meth = FETCH_MRMODS;
686         var req = new Request(meth, id);
687         req.send(true);
688         return req.result();
689 }
690
691 function Timer(name, node){
692         this.name = name;
693         this.count = 1;
694         this.node = node;
695 }
696 Timer.prototype.start = 
697         function(){_timerRun(this.name);}
698 Timer.prototype.stop = 
699         function(){this.done = true;}
700 function _timerRun(tname) {
701         var _t;
702         eval('_t='+tname);
703         if(_t.done) return;
704         if(_t.count > 100) return;
705         var str = ' . ';
706         if( (_t.count % 5) == 0 ) 
707                 str = _t.count / 5;
708         _t.node.appendChild(text(str));
709         setTimeout("_timerRun('"+tname+"');", 200);
710         _t.count++;
711 }
712
713 function checkILSEvent(obj) {
714         if( obj.ilsevent != null && obj.ilsevent != 0 )
715                 return parseInt(obj.ilsevent);
716         return null;
717 }
718 function alertILSEvent(code, msg) {
719    if(!msg) msg = "";
720         alert( msg + '\n' + $('ilsevent.' + code).innerHTML );
721 }
722
723
724 var __authTimer;
725 function AuthTimer(time) { 
726         this.time = (time - LOGOUT_WARNING_TIME) * 1000; 
727         __authTimer = this;
728 }
729
730 AuthTimer.prototype.run = function() {
731         setTimeout('_authTimerAlert()', this.time);
732 }
733
734 function _authTimerAlert() {
735         alert( $('auth_session_expiring').innerHTML );
736         if(!grabUser(null, true)) doLogout();
737 }
738
739
740 function grabUserByBarcode( authtoken, barcode ) {
741         var req = new Request( FETCH_USER_BYBARCODE, authtoken, barcode );
742         req.send(true);
743         return req.result();
744 }
745
746
747 function goHome() {
748         goTo(buildOPACLink({page:HOME}));
749 }
750
751
752 function buildOrgSel(selector, org, offset) {
753         insertSelectorVal( selector, -1, 
754                 org.name(), org.id(), null, findOrgDepth(org) - offset );
755         for( var c in org.children() )
756                 buildOrgSel( selector, org.children()[c], offset);
757 }
758
759