]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/web/opac/common/js/opac_utils.js
hiding non-opac_visible orgs in public opac
[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 var DEBUGSLIM;
12 function Request(type) {
13
14         var s = type.split(":");
15         if(s[2] == "1" && isXUL()) s[1] += ".staff";
16         this.request = new RemoteRequest(s[0], s[1]);
17         var p = [];
18
19         if(isXUL()) {
20                 if(!location.href.match(/^https:/))
21                         this.request.setSecure(false);
22
23         } else {
24
25                 if( G.user && G.user.session ) {
26                         /* if the user is logged in, all activity resets the timeout 
27                                 This is not entirely accurate in the sense that not all 
28                                 requests will reset the server timeout - this should
29                                 get close enough, however.
30                         */
31                         var at = getAuthtime();
32                         if(at) new AuthTimer(at).run(); 
33                 }
34         }
35
36         for( var x = 1; x!= arguments.length; x++ ) {
37                 p.push(arguments[x]);
38                 this.request.addParam(arguments[x]);
39         }
40
41         if( getDebug() ) {
42                 var str = "";
43                 for( var i = 0; i != p.length; i++ ) {
44                         if( i > 0 ) str += ", "
45                         str += js2JSON(p[i]);
46                 }
47                 _debug('request ' + s[0] + ' ' + s[1] + ' ' + str );
48
49         } else if( DEBUGSLIM ) {
50                 _debug('request ' + s[1]);
51         }
52 }
53
54 Request.prototype.callback = function(cal) {this.request.setCompleteCallback(cal);}
55 Request.prototype.send          = function(block){this.request.send(block);}
56 Request.prototype.result        = function(){return this.request.getResultObject();}
57
58 function showCanvas() {
59         for( var x in G.ui.altcanvas ) {
60                 hideMe(G.ui.altcanvas[x]);
61         }
62         hideMe(G.ui.common.loading);
63         unHideMe(G.ui.common.canvas_main);
64         try{G.ui.searchbar.text.focus();}catch(e){}
65 }
66
67 function swapCanvas(newNode) {
68         for( var x in G.ui.altcanvas ) 
69                 hideMe(G.ui.altcanvas[x]);
70
71         hideMe(G.ui.common.loading);
72         hideMe(G.ui.common.canvas_main);
73         unHideMe(newNode);
74 }
75
76 /* finds the name of the current page */
77 var currentPage = null;
78 function findCurrentPage() {
79         if(currentPage) return currentPage;
80
81         var pages = [];
82         for( var p in config.page ) pages.push(config.page[p]);
83         pages = pages.sort( function(a,b){ return - (a.length - b.length); } );
84
85         var path = location.pathname;
86         if(!path.match(/.*\.xml$/))
87                 path += "index.xml"; /* in case they go to  / */
88
89         var page = null;
90         for( var p in pages ) {
91                 if( path.indexOf(pages[p]) != -1)
92                         page = pages[p];
93         }
94
95         for( var p in config.page ) {
96                 if(config.page[p] == page) {
97                         currentPage = p;
98                         return p;
99                 }
100         }
101         return null;
102 }
103
104
105 /* sets all of the params values  ----------------------------- */
106 function initParams() {
107         var cgi = new CGI();    
108
109         /* handle the location var */
110         var org;
111         var loc = cgi.param(PARAM_LOCATION);
112         if( loc ) {
113                 org = findOrgUnit(loc);
114                 if(!org) org = findOrgUnitSN(loc);
115         } 
116         LOCATION        = (org) ? org.id() : null;
117
118         org = null;
119         loc = cgi.param(PARAM_ORIGLOC);
120         if( loc ) {
121                 org = findOrgUnit(loc);
122                 if(!org) org = findOrgUnitSN(loc);
123         }
124         ORIGLOC = (org) ? org.id() : null;
125
126
127         DEPTH = parseInt(cgi.param(PARAM_DEPTH));
128         if(isNaN(DEPTH)) DEPTH = null;
129
130
131         TERM            = cgi.param(PARAM_TERM);
132         STYPE           = cgi.param(PARAM_STYPE);
133         FORM            = cgi.param(PARAM_FORM);
134         //DEPTH         = parseInt(cgi.param(PARAM_DEPTH));
135         OFFSET  = parseInt(cgi.param(PARAM_OFFSET));
136         COUNT           = parseInt(cgi.param(PARAM_COUNT));
137         HITCOUNT        = parseInt(cgi.param(PARAM_HITCOUNT));
138         MRID            = parseInt(cgi.param(PARAM_MRID));
139         RID             = parseInt(cgi.param(PARAM_RID));
140         AUTHTIME        = parseInt(cgi.param(PARAM_AUTHTIME));
141         ADVTERM = cgi.param(PARAM_ADVTERM);
142         ADVTYPE = cgi.param(PARAM_ADVTYPE);
143         RTYPE           = cgi.param(PARAM_RTYPE);
144         SORT            = cgi.param(PARAM_SORT);
145         SORT_DIR        = cgi.param(PARAM_SORT_DIR);
146         DEBUG           = cgi.param(PARAM_DEBUG);
147         CALLNUM = cgi.param(PARAM_CN);
148         LITFORM = cgi.param(PARAM_LITFORM);
149         ITEMFORM        = cgi.param(PARAM_ITEMFORM);
150         ITEMTYPE        = cgi.param(PARAM_ITEMTYPE);
151         AUDIENCE        = cgi.param(PARAM_AUDIENCE);
152         SEARCHES = cgi.param(PARAM_SEARCHES);
153         LANGUAGE        = cgi.param(PARAM_LANGUAGE);
154         TFORM           = cgi.param(PARAM_TFORM);
155         RDEPTH  = cgi.param(PARAM_RDEPTH);
156
157         /* set up some sane defaults */
158         //if(isNaN(DEPTH))              DEPTH           = 0;
159         if(isNaN(RDEPTH))               RDEPTH  = 0;
160         if(isNaN(OFFSET))               OFFSET  = 0;
161         if(isNaN(COUNT))                COUNT           = 10;
162         if(isNaN(HITCOUNT))     HITCOUNT        = 0;
163         if(isNaN(MRID))         MRID            = 0;
164         if(isNaN(RID))                  RID             = 0;
165         if(isNaN(ORIGLOC))      ORIGLOC = 0; /* so we know it hasn't been set */
166         if(isNaN(AUTHTIME))     AUTHTIME        = 0;
167         if(ADVTERM==null)               ADVTERM = "";
168 }
169
170 function clearSearchParams() {
171         TERM            = null;
172         STYPE           = null;
173         FORM            = null;
174         OFFSET  = 0;
175         HITCOUNT = 0;  
176         ADVTERM  = null;
177         ADVTYPE  = null;
178         MRID            = null;
179         RID             = null;
180         RTYPE           = null;
181         SORT            = null;
182         SORT_DIR = null;
183         RLIST           = null;
184         CALLNUM = null;
185         LITFORM = null;
186         ITEMFORM = null;
187         ITEMTYPE = null;
188         AUDIENCE = null;
189         SEARCHES = null;
190         LANGUAGE = null;
191         RDEPTH  = null;
192 }
193
194
195 function initCookies() {
196         FONTSIZE = "regular";
197         var font = cookieManager.read(COOKIE_FONT);
198         scaleFonts(font);
199         if(font) FONTSIZE = font;
200         SKIN = cookieManager.read(COOKIE_SKIN);
201 }
202
203 /* URL param accessors */
204 function getTerm(){return TERM;}
205 function getStype(){return STYPE;}
206 function getLocation(){return LOCATION;}
207 function getDepth(){return DEPTH;}
208 function getForm(){return FORM;}
209 function getTform(){return TFORM;}
210 function getOffset(){return OFFSET;}
211 function getDisplayCount(){return COUNT;}
212 function getHitCount(){return HITCOUNT;}
213 function getMrid(){return MRID;};
214 function getRid(){return RID;};
215 function getOrigLocation(){return ORIGLOC;}
216 function getAuthtime() { return AUTHTIME; }
217 function getSearchBarExtras(){return SBEXTRAS;}
218 function getFontSize(){return FONTSIZE;};
219 function getSkin(){return SKIN;};
220 function getAdvTerm(){return ADVTERM;}
221 function getAdvType(){return ADVTYPE;}
222 function getRtype(){return RTYPE;}
223 function getSort(){return SORT;}
224 function getSortDir(){return SORT_DIR;}
225 function getDebug(){return DEBUG;}
226 function getCallnumber() { return CALLNUM; }
227 function getLitForm() { return LITFORM; }
228 function getItemForm() { return ITEMFORM; }
229 function getItemType() { return ITEMTYPE; }
230 function getAudience() { return AUDIENCE; }
231 function getSearches() { return SEARCHES; }
232 function getLanguage() { return LANGUAGE; }
233 function getRdepth() { return RDEPTH; }
234
235
236 function findBasePath() {
237         var path = location.pathname;
238         if(!path.match(/.*\.xml$/)) path += "index.xml"; 
239         var idx = path.indexOf(config.page[findCurrentPage()]);
240         return path.substring(0, idx);
241 }
242
243 function findBaseURL(ssl) {
244         var path = findBasePath();
245         var proto = (ssl) ? "https:" : "http:";
246
247         /* strip port numbers.  This is necessary for browsers that
248         send an explicit  <host>:80, 443 - explicit ports
249         break links that need to change ports (e.g. http -> https) */
250         var h = location.host.replace(/:.*/,''); 
251
252         return proto + "//" + h + path;
253 }
254
255 /*
256 function buildISBNSrc(isbn) {
257         return "http://" + location.host + "/jackets/" + isbn;
258 }
259 */
260
261 function buildImageLink(name, ssl) {
262         return findBaseURL(ssl) + "../../../../images/" + name;
263 }
264
265 function buildExtrasLink(name, ssl) {
266         return findBaseURL(ssl) + "../../../../extras/" + name;
267 }
268
269 var consoleService;
270 function _debug(str) { 
271         try { dump('dbg: ' + str + '\n'); } catch(e) {} 
272
273         /* potentially useful, but usually just annoying */
274         /*
275         if(!IE) {
276                 if(!consoleService) {
277                         try {
278                                 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
279                                 this.consoleService = Components.classes['@mozilla.org/consoleservice;1']
280                                         .getService(Components.interfaces.nsIConsoleService);
281                         } catch(e) {}
282                 }
283         
284                 try {
285                         if(consoleService) {
286                                 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
287                                 consoleService.logStringMessage(str + '\n');
288                         }
289                 } catch(e){}
290         }
291         */
292 }
293
294 function  buildOPACLink(args, slim, ssl) {
295
296         if(!args) args = {};
297         var string = "";
298
299         if(!slim) {
300                 string = findBaseURL(ssl);
301                 if(args.page) string += config.page[args.page];
302                 else string += config.page[findCurrentPage()];
303         }
304
305         /* this may seem unnecessary.. safety precaution for now */
306         /*
307         if( args[PARAM_DEPTH] == null )
308                 args[PARAM_DEPTH] = getDepth();
309                 */
310
311         string += "?";
312
313         for( var x in args ) {
314                 var v = args[x];
315                 if(x == "page" || v == null || v == undefined || v+'' == 'NaN' ) continue;
316                 if(x == PARAM_OFFSET && v == 0) continue;
317                 if(x == PARAM_COUNT && v == 10) continue;
318                 if(x == PARAM_FORM && v == 'all' ) continue;
319                 if( instanceOf(v, Array) && v.length ) {
320                         for( var i = 0; i < v.length; i++ ) {
321                                 string += "&" + x + "=" + encodeURIComponent(v[i]);
322                         }
323                 } else {
324                         string += "&" + x + "=" + encodeURIComponent(v);
325                 }
326         }
327
328         if(getDebug())
329                 string += _appendParam(DEBUG,           PARAM_DEBUG, args, getDebug, string);
330         if(getOrigLocation() != 1) 
331                 string += _appendParam(ORIGLOC, PARAM_ORIGLOC, args, getOrigLocation, string);
332         if(getTerm()) 
333                 string += _appendParam(TERM,            PARAM_TERM, args, getTerm, string);
334         if(getStype()) 
335                 string += _appendParam(STYPE,           PARAM_STYPE, args, getStype, string);
336         if(getLocation() != 1) 
337                 string += _appendParam(LOCATION, PARAM_LOCATION, args, getLocation, string);
338         if(getDepth() != null) 
339                 string += _appendParam(DEPTH,           PARAM_DEPTH, args, getDepth, string);
340         if(getForm() && (getForm() != 'all') ) 
341                 string += _appendParam(FORM,            PARAM_FORM, args, getForm, string);
342         if(getTform() && (getTform() != 'all') ) 
343                 string += _appendParam(TFORM,           PARAM_TFORM, args, getTform, string);
344         if(getOffset() != 0) 
345                 string += _appendParam(OFFSET,  PARAM_OFFSET, args, getOffset, string);
346         if(getDisplayCount() != 10) 
347                 string += _appendParam(COUNT,           PARAM_COUNT, args, getDisplayCount, string);
348         if(getHitCount()) 
349                 string += _appendParam(HITCOUNT, PARAM_HITCOUNT, args, getHitCount, string);
350         if(getMrid())
351                 string += _appendParam(MRID,            PARAM_MRID, args, getMrid, string);
352         if(getRid())
353                 string += _appendParam(RID,             PARAM_RID, args, getRid, string);
354         if(getAuthtime())
355                 string += _appendParam(AUTHTIME,        PARAM_AUTHTIME, args, getAuthtime, string);
356         if(getAdvTerm())
357                 string += _appendParam(ADVTERM, PARAM_ADVTERM, args, getAdvTerm, string);
358         if(getAdvType())
359                 string += _appendParam(ADVTYPE, PARAM_ADVTYPE, args, getAdvType, string);
360         if(getRtype())
361                 string += _appendParam(RTYPE,           PARAM_RTYPE, args, getRtype, string);
362         if(getItemForm())
363                 string += _appendParam(ITEMFORM,        PARAM_ITEMFORM, args, getItemForm, string);
364         if(getItemType())
365                 string += _appendParam(ITEMTYPE,        PARAM_ITEMTYPE, args, getItemType, string);
366         if(getLitForm())
367                 string += _appendParam(LITFORM, PARAM_LITFORM, args, getLitForm, string);
368         if(getAudience())
369                 string += _appendParam(AUDIENCE,        PARAM_AUDIENCE, args, getAudience, string);
370         if(getSearches())
371                 string += _appendParam(SEARCHES,        PARAM_SEARCHES, args, getSearches, string);
372         if(getLanguage())
373                 string += _appendParam(LANGUAGE,        PARAM_LANGUAGE, args, getLanguage, string);
374         if(getRdepth() != null)
375                 string += _appendParam(RDEPTH,  PARAM_RDEPTH, args, getRdepth, string);
376         if(getSort() != null)
377                 string += _appendParam(SORT,    PARAM_SORT, args, getSort, string);
378         if(getSortDir() != null)
379                 string += _appendParam(SORT_DIR,        PARAM_SORT_DIR, args, getSortDir, string);
380
381         return string.replace(/\&$/,'').replace(/\?\&/,"?");    
382 }
383
384 var xx = 1;
385 function _appendParam( fieldVar, fieldName, overrideArgs, getFunc, string ) {
386
387         var ret = "";
388
389         if(     fieldVar != null && 
390                         (fieldVar +'' != 'NaN') && 
391                         overrideArgs[fieldName] == null &&
392                         getFunc() != null &&
393                         getFunc()+'' != '' ) {
394
395                 ret = "&" + fieldName + "=" + encodeURIComponent(getFunc());
396         }
397
398         return ret;
399 }
400
401 /* ----------------------------------------------------------------------- */
402 function cleanISBN(isbn) {
403    if(isbn) {
404       isbn = isbn.toString().replace(/^\s+/,"");
405       var idx = isbn.indexOf(" ");
406       if(idx > -1) { isbn = isbn.substring(0, idx); }
407    } else isbn = "";
408    return isbn;
409 }       
410
411
412 /* builds a link that goes to the title listings for a metarecord */
413 function buildTitleLink(rec, link) {
414         if(!rec) return;
415         link.appendChild(text(normalize(truncate(rec.title(), 65))));
416         var args = {};
417         args.page = RRESULT;
418         args[PARAM_OFFSET] = 0;
419         args[PARAM_MRID] = rec.doc_id();
420         args[PARAM_RTYPE] = RTYPE_MRID;
421         link.setAttribute("href", buildOPACLink(args));
422 }
423
424 function buildTitleDetailLink(rec, link) {
425         if(!rec) return;
426         link.appendChild(text(normalize(truncate(rec.title(), 65))));
427         var args = {};
428         args.page = RDETAIL;
429         //args[PARAM_OFFSET] = 0;
430         args[PARAM_RID] = rec.doc_id();
431         link.setAttribute("href", buildOPACLink(args));
432 }
433
434 /* 'type' is one of STYPE_AUTHOR, STYPE_SUBJECT, ... found in config.js 
435         'trunc' is the number of characters to show in the string, defaults to 65 */
436 function buildSearchLink(type, string, linknode, trunc) {
437         if(!trunc) trunc = 65;
438         var args = {};
439         if( SHOW_MR_DEFAULT) {
440                 args.page = MRESULT;
441         } else {
442                 args.page = RRESULT;
443                 args[PARAM_RTYPE] = type;
444         }
445         args[PARAM_OFFSET] = 0;
446         args[PARAM_TERM] = string;
447         args[PARAM_STYPE] = type;
448         linknode.appendChild(text(normalize(truncate(string, trunc))));
449         linknode.setAttribute("href", buildOPACLink(args));
450 }
451
452 function setSessionCookie(ses) {
453         cookieManager.write(COOKIE_SES, ses, -1);
454 }
455
456
457
458 /* ----------------------------------------------------------------------- */
459 /* user session handling */
460 /* ----------------------------------------------------------------------- */
461 /* session is the login session.  If no session is provided, we attempt
462         to find one in the cookies.  If 'force' is true we retrieve the 
463         user from the server even if there is already a global user present.
464         if ses != G.user.session, we also force a grab */
465 function grabUser(ses, force) {
466
467         if(!ses && isXUL()) {
468                 stash = fetchXULStash();
469                 ses = stash.session.key
470                 _debug("stash auth token = " + ses);
471         }
472
473         if(!ses) {
474                 ses = cookieManager.read(COOKIE_SES);
475                 /* https cookies don't show up in http servers.. */
476         }
477
478         if(!ses) return false;
479
480         if(!force) 
481                 if(G.user && G.user.session == ses)
482                         return G.user;
483
484         /* first make sure the session is valid */
485         var request = new Request(FETCH_SESSION, ses, 1 );
486         request.request.alertEvent = false;
487         request.send(true);
488         var user = request.result();
489
490         if(!user) {
491                 doLogout();
492                 return false; /* unable to grab the session */
493         }
494
495         if( !(typeof user == 'object' && user._isfieldmapper) ) {
496                 doLogout();
497                 return false;
498         }
499
500         G.user = user;
501         G.user.fleshed = false;
502         G.user.session = ses;
503         setSessionCookie(ses);
504
505         grabUserPrefs();
506         if(G.user.prefs['opac.hits_per_page'])
507                 COUNT = parseInt(G.user.prefs['opac.hits_per_page']);
508
509         if(G.user.prefs[PREF_DEF_FONT]) 
510                 setFontSize(G.user.prefs[PREF_DEF_FONT]);
511
512         var at = getAuthtime();
513         //if(isXUL()) at = xulG['authtime'];
514
515         if(at && !isXUL()) new AuthTimer(at).run(); 
516         return G.user;
517 }
518
519
520 /* sets the 'prefs' field of the user object to their preferences 
521         and returns the preferences */
522 function grabUserPrefs(user, force) {
523         if(user == null) user = G.user;
524         if(!force && user.prefs) return user.prefs;     
525         var req = new Request(FETCH_USER_PREFS, user.session, user.id());
526         req.send(true);
527         user.prefs = req.result();
528         return user.prefs;
529 }
530
531 function grabFleshedUser() {
532
533         if(!G.user || !G.user.session) {
534                 grabUser();     
535                 if(!G.user || !G.user.session) return null;
536         }
537
538         if(G.user.fleshed) return G.user;
539
540    var req = new Request(FETCH_FLESHED_USER, G.user.session);
541         req.send(true);
542
543         G.user = req.result();
544
545         if(!G.user || G.user.length == 0) { 
546                 G.user = null; return false; 
547                 cookieManager.write(COOKIE_SES,"");
548         }
549
550         G.user.session = ses;
551         G.user.fleshed = true;
552
553         setSessionCookie(ses);
554         return G.user;
555 }
556
557 function checkUserSkin(new_skin) {
558
559         return; /* XXX do some debugging with this... */
560
561         var user_skin = getSkin();
562         var cur_skin = grabSkinFromURL();
563
564         if(new_skin) user_skin = new_skin;
565
566         if(!user_skin) {
567
568                 if(grabUser()) {
569                         if(grabUserPrefs()) {
570                                 user_skin = G.user.prefs["opac.skin"];
571                                 cookieManager.write( COOKIE_SKIN, user_skin, '+1y' );
572                         }
573                 }
574         }
575
576         if(!user_skin) return;
577
578         if( cur_skin != user_skin ) {
579                 var url = buildOPACLink();
580                 goTo(url.replace(cur_skin, user_skin));
581         }
582 }
583
584 function updateUserSetting(setting, value, user) {
585         if(user == null) user = G.user;
586         var a = {};
587         a[setting] = value;
588         var req = new Request( UPDATE_USER_PREFS, user.session, a );
589         req.send(true);
590         return req.result();
591 }
592
593 function commitUserPrefs() {
594         var req = new Request( 
595                 UPDATE_USER_PREFS, G.user.session, null, G.user.prefs );
596         req.send(true);
597         return req.result();
598 }
599
600 function grabSkinFromURL() {
601         var path = findBasePath();
602         path = path.replace("/xml/", "");
603         var skin = "";
604         for( var i = path.length - 1; i >= 0; i-- ) {
605                 var ch = path.charAt(i);
606                 if(ch == "/") break;
607                 skin += ch;
608         }
609
610         var skin2 = "";
611         for( i = skin.length - 1; i >= 0; i--)
612                 skin2 += skin.charAt(i);
613
614         return skin2;
615 }
616
617
618 /* returns a fleshed G.user on success, false on failure */
619 function doLogin(suppressEvents) {
620
621         abortAllRequests();
622
623         var uname = G.ui.login.username.value;
624         var passwd = G.ui.login.password.value; 
625
626         var init_request = new Request( LOGIN_INIT, uname );
627    init_request.send(true);
628    var seed = init_request.result();
629
630    if( ! seed || seed == '0') {
631       alert( "Error Communicating with Authentication Server" );
632       return null;
633    }
634
635         var args = {
636                 password : hex_md5(seed + hex_md5(passwd)), 
637                 type            : "opac", 
638                 org             : getOrigLocation()
639         };
640
641         if( uname.match(REGEX_BARCODE) ) args.barcode = uname; /* make this better */
642         else args.username = uname;
643
644    var auth_request = new Request( LOGIN_COMPLETE, args );
645
646         auth_request.request.alertEvent = false;
647    auth_request.send(true);
648    var auth_result = auth_request.result();
649
650         if(!auth_result) {
651                 alertId('patron_login_failed');
652                 return null;
653         }
654
655         if( checkILSEvent(auth_result) ) {
656
657                 if( auth_result.textcode == 'PATRON_INACTIVE' ) {
658                         alertId('patron_inactive_alert');
659                         return;
660                 }
661
662                 if( auth_result.textcode == 'PATRON_CARD_INACTIVE' ) {
663                         alertId('patron_card_inactive_alert');
664                         return;
665                 }
666
667                 if( auth_result.textcode == 'LOGIN_FAILED' || 
668                                 auth_result.textcode == 'PERM_FAILURE' ) {
669                         alertId('patron_login_failed');
670                         return;
671                 }
672         }
673
674
675         AUTHTIME = parseInt(auth_result.payload.authtime);
676         var u = grabUser(auth_result.payload.authtoken, true);
677         if(u && ! suppressEvents) 
678                 runEvt( "common", "locationChanged", u.ws_ou(), findOrgDepth(u.ws_ou()) );
679
680         checkUserSkin();
681
682         return u;
683 }
684
685 function doLogout(noredirect) {
686
687         /* cancel everything else */
688         abortAllRequests();
689
690         /* be nice and delete the session from the server */
691         if(G.user && G.user.session) { 
692                 var req = new Request(LOGIN_DELETE, G.user.session);
693       req.send(true);
694                 try { req.result(); } catch(E){}
695     }
696
697         G.user = null;
698
699         /* remove any cached data */
700         //cookieManager.remove(COOKIE_IDS);
701         //cookieManager.remove(COOKIE_SRIDS);
702         cookieManager.remove(COOKIE_RIDS);
703         cookieManager.remove(COOKIE_SES);
704         cookieManager.remove(COOKIE_SKIN);
705
706         checkUserSkin("default");
707         COUNT = 10;
708
709
710         var args = {};
711         args[PARAM_TERM] = "";
712         args[PARAM_LOCATION] = getOrigLocation();
713         args[PARAM_DEPTH] = findOrgDepth(getOrigLocation());
714         args.page = "home";
715
716         
717         var nored = false;
718         try{ if(isFrontPage) nored = true; } catch(e){nored = false;}
719         if(!nored) goTo(buildOPACLink(args));
720 }
721
722
723 function hideMe(obj) { addCSSClass(obj, config.css.hide_me); } 
724 function unHideMe(obj) { removeCSSClass(obj, config.css.hide_me); }
725
726
727 /* ----------------------------------------------------------------------- */
728 /* build the org tree */
729 /* ----------------------------------------------------------------------- */
730 function drawOrgTree() {
731         //setTimeout( 'buildOrgSelector(G.ui.common.org_tree, orgTreeSelector);', 10 );
732         setTimeout( 'buildOrgSelector(G.ui.common.org_tree, orgTreeSelector);', 1 );
733 }
734         
735 var orgTreeSelector;
736 function buildOrgSelector(node) {
737         var tree = new SlimTree(node,'orgTreeSelector');
738         orgTreeSelector = tree;
739         for( var i in orgArraySearcher ) { 
740                 var node = orgArraySearcher[i];
741                 if( node == null ) continue;
742         if(!isXUL() && !isTrue(node.opac_visible())) continue; 
743                 if(node.parent_ou() == null)
744                         tree.addNode(node.id(), -1, node.name(), 
745                                 "javascript:orgSelect(" + node.id() + ");", node.name());
746                 else {
747                         tree.addNode(node.id(), node.parent_ou(), node.name(), 
748                                 "javascript:orgSelect(" + node.id() + ");", node.name());
749                 }
750         }
751         hideMe($('org_loading_div'));
752         unHideMe($('org_selector_tip'));
753         return tree;
754 }
755
756 function orgSelect(id) {
757         showCanvas();
758         runEvt("common", "locationChanged", id, findOrgDepth(id) );
759
760         removeChildren(G.ui.common.now_searching);
761         G.ui.common.now_searching.appendChild(text(findOrgUnit(id).name()));
762 }
763
764 function setFontSize(size) {
765         scaleFonts(size);
766         cookieManager.write(COOKIE_FONT, size, '+1y');
767 }
768
769 var resourceFormats = [
770    "text",
771    "moving image",
772    "sound recording", "software, multimedia",
773    "still images",
774    "cartographic",
775    "mixed material",
776    "notated music",
777    "three dimensional object" ];
778
779
780 function modsFormatToMARC(format) {
781    switch(format) {
782       case "text":
783          return "at";
784       case "moving image":
785          return "g";
786       case "sound recording":
787          return "ij";
788       case "sound recording-nonmusical":
789          return "i";
790       case "sound recording-musical":
791          return "j";
792       case "software, multimedia":
793          return "m";
794       case "still images":
795          return "k";
796       case "cartographic":
797          return "ef";
798       case "mixed material":
799          return "op";
800       case "notated music":
801          return "cd";
802       case "three dimensional object":
803          return "r";
804    }
805    return "at";
806 }
807
808
809 function MARCFormatToMods(format) {
810    switch(format) {
811       case "a":
812       case "t":
813          return "text";
814       case "g":
815          return "moving image";
816       case "i":
817          return "sound recording-nonmusical";
818       case "j":
819          return "sound recording-musical";
820       case "m":
821          return "software, multimedia";
822       case "k":
823          return "still images";
824       case "e":
825       case "f":
826          return "cartographic";
827       case "o":
828       case "p":
829          return "mixed material";
830       case "c":
831       case "d":
832          return "notated music";
833       case "r":
834          return "three dimensional object";
835    }
836    return "text";
837 }
838
839 function MARCTypeToFriendly(format) {
840         var words = $('format_words');
841         switch(format) {
842                 case 'a' :
843                 case 't' : return $n(words, 'at').innerHTML;
844                 default:
845                         var node = $n(words,format);
846                         if( node ) return node.innerHTML;
847         }
848         return "";
849 }
850
851 function setResourcePic( img, resource ) {
852         img.setAttribute( "src", "../../../../images/tor/" + resource + ".jpg");
853         img.title = resource;
854 }
855
856
857
858 function msg( text ) {
859         try { alert( text ); } catch(e) {}
860 }
861
862 function findRecord(id,type) {
863         try {
864                 for( var i = 0; i != recordsCache.length; i++ ) {
865                         var rec = recordsCache[i];
866                         if( rec && rec.doc_id() == id ) return rec;
867                 }
868         } catch(E){}
869         var meth = FETCH_RMODS
870         if(type == 'M') meth = FETCH_MRMODS;
871         var req = new Request(meth, id);
872         req.request.alertEvent = false;
873         req.send(true);
874         var res = req.result();
875         if( checkILSEvent(res) ) return null; 
876         return res;
877 }
878
879 function Timer(name, node){
880         this.name = name;
881         this.count = 1;
882         this.node = node;
883 }
884 Timer.prototype.start = 
885         function(){_timerRun(this.name);}
886 Timer.prototype.stop = 
887         function(){this.done = true;}
888 function _timerRun(tname) {
889         var _t;
890         eval('_t='+tname);
891         if(_t.done) return;
892         if(_t.count > 100) return;
893         var str = ' . ';
894         if( (_t.count % 5) == 0 ) 
895                 str = _t.count / 5;
896         _t.node.appendChild(text(str));
897         setTimeout("_timerRun('"+tname+"');", 200);
898         _t.count++;
899 }
900
901 function checkILSEvent(obj) {
902         if( obj && obj.ilsevent != null && obj.ilsevent != 0 )
903                 return parseInt(obj.ilsevent);
904         return null;
905 }
906
907
908 function alertILSEvent(evt, msg) {
909    if(!msg) msg = "";
910         if(msg)
911                 alert(msg +'\n' + evt.textcode + '\n' + evt.desc );
912         else 
913                 alert(evt.textcode + '\n' + evt.desc );
914 }
915
916
917 var __authTimer;
918 function AuthTimer(time) { 
919         this.time = (time - LOGOUT_WARNING_TIME) * 1000; 
920         if(__authTimer) 
921                 try {clearTimeout(__authTimer.id)} catch(e){}
922         __authTimer = this;
923 }
924
925 AuthTimer.prototype.run = function() {
926         this.id = setTimeout('_authTimerAlert()', this.time);
927 }
928
929 function _authTimerAlert() {
930         alert( $('auth_session_expiring').innerHTML );
931         if(!grabUser(null, true)) doLogout();
932 }
933
934
935 function grabUserByBarcode( authtoken, barcode ) {
936         var req = new Request( FETCH_USER_BYBARCODE, authtoken, barcode );
937         req.send(true);
938         return req.result();
939 }
940
941
942 function goHome() {
943         goTo(buildOPACLink({page:HOME}));
944 }
945
946
947 function buildOrgSel(selector, org, offset) {
948         insertSelectorVal( selector, -1, 
949                 org.name(), org.id(), null, findOrgDepth(org) - offset );
950         for( var c in org.children() )
951                 buildOrgSel( selector, org.children()[c], offset);
952 }
953
954
955 function parseForm(form) {
956         if(!form) return {};
957
958         var it = form.replace(/-\w+$/,"");
959         var itf = null;
960         var item_form;
961         var item_type;
962
963         if(form.match(/-/)) itf = form.replace(/^\w+-/,"");
964
965         if(it) {
966                 item_type = [];
967                 for( var i = 0; i < it.length; i++ ) 
968                         item_type.push( it.charAt(i) );
969         }
970
971         if(itf) {
972                 item_form = [];
973                 for( var i = 0; i < itf.length; i++ ) 
974                         item_form.push( itf.charAt(i) );
975         }
976
977         return {item_type: item_type, item_form:item_form};
978 }
979
980
981 function isTrue(x) { return ( x && x != "0" && !(x+'').match(/^f$/i) ); }
982
983 function fetchPermOrgs() {
984         var a = []; /* why does arguments come accross as an object and not an array? */
985         for( var i = 0; i < arguments.length; i++ ) 
986                 a.push(arguments[i])
987
988         var preq = new Request(FETCH_HIGHEST_PERM_ORG, 
989                 G.user.session, G.user.id(), a );
990         preq.send(true);
991         return preq.result();
992 }
993
994
995 function print_tabs(t) {
996         var r = '';
997         for (var j = 0; j < t; j++ ) { r = r + "  "; }
998         return r;
999 }
1000 function formatJSON(s) {
1001         var r = ''; var t = 0;
1002         for (var i in s) {
1003                 if (s[i] == '{' || s[i] == '[' ) {
1004                         r = r + s[i] + "\n" + print_tabs(++t);
1005                 } else if (s[i] == '}' || s[i] == ']') {
1006                         t--; r = r + "\n" + print_tabs(t) + s[i];
1007                 } else if (s[i] == ',') {
1008                         r = r + s[i] + "\n" + print_tabs(t);
1009                 } else {
1010                         r = r + s[i];
1011                 }
1012         }
1013         return r;
1014 }