]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/web/opac/common/js/opac_utils.js
added debug option which just shows method called
[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
453 /* ----------------------------------------------------------------------- */
454 /* user session handling */
455 /* ----------------------------------------------------------------------- */
456 /* session is the login session.  If no session is provided, we attempt
457         to find one in the cookies.  If 'force' is true we retrieve the 
458         user from the server even if there is already a global user present.
459         if ses != G.user.session, we also force a grab */
460 function grabUser(ses, force) {
461
462         if(!ses && isXUL()) ses = xulG['authtoken'];
463
464         if(!ses) {
465                 ses = cookieManager.read(COOKIE_SES);
466                 /* https cookies don't show up in http servers.. */
467         }
468
469         if(!ses) return false;
470
471         if(!force) 
472                 if(G.user && G.user.session == ses)
473                         return G.user;
474
475         /* first make sure the session is valid */
476         var request = new Request(FETCH_SESSION, ses, 1 );
477         request.request.alertEvent = false;
478         request.send(true);
479         var user = request.result();
480
481         if(!user) {
482                 doLogout();
483                 return false; /* unable to grab the session */
484         }
485
486         if( !(typeof user == 'object' && user._isfieldmapper) ) {
487                 doLogout();
488                 return false;
489         }
490
491         G.user = user;
492         G.user.fleshed = false;
493         G.user.session = ses;
494         cookieManager.write(COOKIE_SES, ses, -1);
495
496         grabUserPrefs();
497         if(G.user.prefs['opac.hits_per_page'])
498                 COUNT = parseInt(G.user.prefs['opac.hits_per_page']);
499
500         if(G.user.prefs[PREF_DEF_FONT]) 
501                 setFontSize(G.user.prefs[PREF_DEF_FONT]);
502
503         var at = getAuthtime();
504         //if(isXUL()) at = xulG['authtime'];
505
506         if(at && !isXUL()) new AuthTimer(at).run(); 
507         return G.user;
508 }
509
510
511 /* sets the 'prefs' field of the user object to their preferences 
512         and returns the preferences */
513 function grabUserPrefs(user, force) {
514         if(user == null) user = G.user;
515         if(!force && user.prefs) return user.prefs;     
516         var req = new Request(FETCH_USER_PREFS, user.session, user.id());
517         req.send(true);
518         user.prefs = req.result();
519         return user.prefs;
520 }
521
522 function grabFleshedUser() {
523
524         if(!G.user || !G.user.session) {
525                 grabUser();     
526                 if(!G.user || !G.user.session) return null;
527         }
528
529         if(G.user.fleshed) return G.user;
530
531    var req = new Request(FETCH_FLESHED_USER, G.user.session);
532         req.send(true);
533
534         G.user = req.result();
535
536         if(!G.user || G.user.length == 0) { 
537                 G.user = null; return false; 
538                 cookieManager.write(COOKIE_SES,"");
539         }
540
541         G.user.session = ses;
542         G.user.fleshed = true;
543
544         cookieManager.write(COOKIE_SES, ses, '+1y'); /*  update the cookie */
545         return G.user;
546 }
547
548 function checkUserSkin(new_skin) {
549
550         return; /* XXX do some debugging with this... */
551
552         var user_skin = getSkin();
553         var cur_skin = grabSkinFromURL();
554
555         if(new_skin) user_skin = new_skin;
556
557         if(!user_skin) {
558
559                 if(grabUser()) {
560                         if(grabUserPrefs()) {
561                                 user_skin = G.user.prefs["opac.skin"];
562                                 cookieManager.write( COOKIE_SKIN, user_skin, '+1y' );
563                         }
564                 }
565         }
566
567         if(!user_skin) return;
568
569         if( cur_skin != user_skin ) {
570                 var url = buildOPACLink();
571                 goTo(url.replace(cur_skin, user_skin));
572         }
573 }
574
575 function updateUserSetting(setting, value, user) {
576         if(user == null) user = G.user;
577         var a = {};
578         a[setting] = value;
579         var req = new Request( UPDATE_USER_PREFS, user.session, a );
580         req.send(true);
581         return req.result();
582 }
583
584 function commitUserPrefs() {
585         var req = new Request( 
586                 UPDATE_USER_PREFS, G.user.session, null, G.user.prefs );
587         req.send(true);
588         return req.result();
589 }
590
591 function grabSkinFromURL() {
592         var path = findBasePath();
593         path = path.replace("/xml/", "");
594         var skin = "";
595         for( var i = path.length - 1; i >= 0; i-- ) {
596                 var ch = path.charAt(i);
597                 if(ch == "/") break;
598                 skin += ch;
599         }
600
601         var skin2 = "";
602         for( i = skin.length - 1; i >= 0; i--)
603                 skin2 += skin.charAt(i);
604
605         return skin2;
606 }
607
608
609 /* returns a fleshed G.user on success, false on failure */
610 function doLogin(suppressEvents) {
611
612         abortAllRequests();
613
614         var uname = G.ui.login.username.value;
615         var passwd = G.ui.login.password.value; 
616
617         var init_request = new Request( LOGIN_INIT, uname );
618    init_request.send(true);
619    var seed = init_request.result();
620
621    if( ! seed || seed == '0') {
622       alert( "Error Communicating with Authentication Server" );
623       return null;
624    }
625
626         var args = {
627                 password : hex_md5(seed + hex_md5(passwd)), 
628                 type            : "opac", 
629                 org             : getOrigLocation()
630         };
631
632         if( uname.match(REGEX_BARCODE) ) args.barcode = uname; /* make this better */
633         else args.username = uname;
634
635    var auth_request = new Request( LOGIN_COMPLETE, args );
636
637         auth_request.request.alertEvent = false;
638    auth_request.send(true);
639    var auth_result = auth_request.result();
640
641         if(!auth_result) {
642                 alertId('patron_login_failed');
643                 return null;
644         }
645
646         if( checkILSEvent(auth_result) ) {
647
648                 if( auth_result.textcode == 'PATRON_INACTIVE' ) {
649                         alertId('patron_inactive_alert');
650                         return;
651                 }
652
653                 if( auth_result.textcode == 'PATRON_CARD_INACTIVE' ) {
654                         alertId('patron_card_inactive_alert');
655                         return;
656                 }
657
658                 if( auth_result.textcode == 'LOGIN_FAILED' || 
659                                 auth_result.textcode == 'PERM_FAILURE' ) {
660                         alertId('patron_login_failed');
661                         return;
662                 }
663         }
664
665
666         AUTHTIME = parseInt(auth_result.payload.authtime);
667         var u = grabUser(auth_result.payload.authtoken, true);
668         if(u && ! suppressEvents) 
669                 runEvt( "common", "locationChanged", u.ws_ou(), findOrgDepth(u.ws_ou()) );
670
671         checkUserSkin();
672
673         return u;
674 }
675
676 function doLogout(noredirect) {
677
678         /* cancel everything else */
679         abortAllRequests();
680
681         /* be nice and delete the session from the server */
682         if(G.user && G.user.session) { 
683                 var req = new Request(LOGIN_DELETE, G.user.session);
684       req.send(true);
685                 try { req.result(); } catch(E){}
686     }
687
688         G.user = null;
689
690         /* remove any cached data */
691         //cookieManager.remove(COOKIE_IDS);
692         //cookieManager.remove(COOKIE_SRIDS);
693         cookieManager.remove(COOKIE_RIDS);
694         cookieManager.remove(COOKIE_SES);
695         cookieManager.remove(COOKIE_SKIN);
696
697         checkUserSkin("default");
698         COUNT = 10;
699
700
701         var args = {};
702         args[PARAM_TERM] = "";
703         args[PARAM_LOCATION] = getOrigLocation();
704         args[PARAM_DEPTH] = findOrgDepth(getOrigLocation());
705         args.page = "home";
706
707         
708         var nored = false;
709         try{ if(isFrontPage) nored = true; } catch(e){nored = false;}
710         if(!nored) goTo(buildOPACLink(args));
711 }
712
713
714 function hideMe(obj) { addCSSClass(obj, config.css.hide_me); } 
715 function unHideMe(obj) { removeCSSClass(obj, config.css.hide_me); }
716
717
718 /* ----------------------------------------------------------------------- */
719 /* build the org tree */
720 /* ----------------------------------------------------------------------- */
721 function drawOrgTree() {
722         //setTimeout( 'buildOrgSelector(G.ui.common.org_tree, orgTreeSelector);', 10 );
723         setTimeout( 'buildOrgSelector(G.ui.common.org_tree, orgTreeSelector);', 1 );
724 }
725         
726 var orgTreeSelector;
727 function buildOrgSelector(node) {
728         var tree = new SlimTree(node,'orgTreeSelector');
729         orgTreeSelector = tree;
730         for( var i in orgArraySearcher ) { 
731                 var node = orgArraySearcher[i];
732                 if( node == null ) continue;
733                 if(node.parent_ou() == null)
734                         tree.addNode(node.id(), -1, node.name(), 
735                                 "javascript:orgSelect(" + node.id() + ");", node.name());
736                 else {
737                         tree.addNode(node.id(), node.parent_ou(), node.name(), 
738                                 "javascript:orgSelect(" + node.id() + ");", node.name());
739                 }
740         }
741         hideMe($('org_loading_div'));
742         unHideMe($('org_selector_tip'));
743         return tree;
744 }
745
746 function orgSelect(id) {
747         showCanvas();
748         runEvt("common", "locationChanged", id, findOrgDepth(id) );
749
750         removeChildren(G.ui.common.now_searching);
751         G.ui.common.now_searching.appendChild(text(findOrgUnit(id).name()));
752 }
753
754 function setFontSize(size) {
755         scaleFonts(size);
756         cookieManager.write(COOKIE_FONT, size, '+1y');
757 }
758
759
760 var resourceFormats = [
761    "text",
762    "moving image",
763    "sound recording", "software, multimedia",
764    "still images",
765    "cartographic",
766    "mixed material",
767    "notated music",
768    "three dimensional object" ];
769
770
771 function modsFormatToMARC(format) {
772    switch(format) {
773       case "text":
774          return "at";
775       case "moving image":
776          return "g";
777       case "sound recording":
778          return "ij";
779       case "sound recording-nonmusical":
780          return "i";
781       case "sound recording-musical":
782          return "j";
783       case "software, multimedia":
784          return "m";
785       case "still images":
786          return "k";
787       case "cartographic":
788          return "ef";
789       case "mixed material":
790          return "op";
791       case "notated music":
792          return "cd";
793       case "three dimensional object":
794          return "r";
795    }
796    return "at";
797 }
798
799
800 function MARCFormatToMods(format) {
801    switch(format) {
802       case "a":
803       case "t":
804          return "text";
805       case "g":
806          return "moving image";
807       case "i":
808          return "sound recording-nonmusical";
809       case "j":
810          return "sound recording-musical";
811       case "m":
812          return "software, multimedia";
813       case "k":
814          return "still images";
815       case "e":
816       case "f":
817          return "cartographic";
818       case "o":
819       case "p":
820          return "mixed material";
821       case "c":
822       case "d":
823          return "notated music";
824       case "r":
825          return "three dimensional object";
826    }
827    return "text";
828 }
829
830 function MARCTypeToFriendly(format) {
831         var words = $('format_words');
832         switch(format) {
833                 case 'a' :
834                 case 't' : return $n(words, 'at').innerHTML;
835                 default:
836                         var node = $n(words,format);
837                         if( node ) return node.innerHTML;
838         }
839         return "";
840 }
841
842 function setResourcePic( img, resource ) {
843         img.setAttribute( "src", "../../../../images/tor/" + resource + ".jpg");
844         img.title = resource;
845 }
846
847
848
849 function msg( text ) {
850         try { alert( text ); } catch(e) {}
851 }
852
853 function findRecord(id,type) {
854         try {
855                 for( var i = 0; i != recordsCache.length; i++ ) {
856                         var rec = recordsCache[i];
857                         if( rec && rec.doc_id() == id ) return rec;
858                 }
859         } catch(E){}
860         var meth = FETCH_RMODS
861         if(type == 'M') meth = FETCH_MRMODS;
862         var req = new Request(meth, id);
863         req.request.alertEvent = false;
864         req.send(true);
865         var res = req.result();
866         if( checkILSEvent(res) ) return null; 
867         return res;
868 }
869
870 function Timer(name, node){
871         this.name = name;
872         this.count = 1;
873         this.node = node;
874 }
875 Timer.prototype.start = 
876         function(){_timerRun(this.name);}
877 Timer.prototype.stop = 
878         function(){this.done = true;}
879 function _timerRun(tname) {
880         var _t;
881         eval('_t='+tname);
882         if(_t.done) return;
883         if(_t.count > 100) return;
884         var str = ' . ';
885         if( (_t.count % 5) == 0 ) 
886                 str = _t.count / 5;
887         _t.node.appendChild(text(str));
888         setTimeout("_timerRun('"+tname+"');", 200);
889         _t.count++;
890 }
891
892 function checkILSEvent(obj) {
893         if( obj && obj.ilsevent != null && obj.ilsevent != 0 )
894                 return parseInt(obj.ilsevent);
895         return null;
896 }
897
898
899 function alertILSEvent(evt, msg) {
900    if(!msg) msg = "";
901         if(msg)
902                 alert(msg +'\n' + evt.textcode + '\n' + evt.desc );
903         else 
904                 alert(evt.textcode + '\n' + evt.desc );
905 }
906
907
908 var __authTimer;
909 function AuthTimer(time) { 
910         this.time = (time - LOGOUT_WARNING_TIME) * 1000; 
911         if(__authTimer) 
912                 try {clearTimeout(__authTimer.id)} catch(e){}
913         __authTimer = this;
914 }
915
916 AuthTimer.prototype.run = function() {
917         this.id = setTimeout('_authTimerAlert()', this.time);
918 }
919
920 function _authTimerAlert() {
921         alert( $('auth_session_expiring').innerHTML );
922         if(!grabUser(null, true)) doLogout();
923 }
924
925
926 function grabUserByBarcode( authtoken, barcode ) {
927         var req = new Request( FETCH_USER_BYBARCODE, authtoken, barcode );
928         req.send(true);
929         return req.result();
930 }
931
932
933 function goHome() {
934         goTo(buildOPACLink({page:HOME}));
935 }
936
937
938 function buildOrgSel(selector, org, offset) {
939         insertSelectorVal( selector, -1, 
940                 org.name(), org.id(), null, findOrgDepth(org) - offset );
941         for( var c in org.children() )
942                 buildOrgSel( selector, org.children()[c], offset);
943 }
944
945
946 function parseForm(form) {
947         if(!form) return {};
948
949         var it = form.replace(/-\w+$/,"");
950         var itf = null;
951         var item_form;
952         var item_type;
953
954         if(form.match(/-/)) itf = form.replace(/^\w+-/,"");
955
956         if(it) {
957                 item_type = [];
958                 for( var i = 0; i < it.length; i++ ) 
959                         item_type.push( it.charAt(i) );
960         }
961
962         if(itf) {
963                 item_form = [];
964                 for( var i = 0; i < itf.length; i++ ) 
965                         item_form.push( itf.charAt(i) );
966         }
967
968         return {item_type: item_type, item_form:item_form};
969 }
970
971
972 function isTrue(x) { return ( x && x != "0" && !(x+'').match(/^f$/i) ); }
973
974 function fetchPermOrgs() {
975         var a = []; /* why does arguments come accross as an object and not an array? */
976         for( var i = 0; i < arguments.length; i++ ) 
977                 a.push(arguments[i])
978
979         var preq = new Request(FETCH_HIGHEST_PERM_ORG, 
980                 G.user.session, G.user.id(), a );
981         preq.send(true);
982         return preq.result();
983 }
984
985
986 function print_tabs(t) {
987         var r = '';
988         for (var j = 0; j < t; j++ ) { r = r + "  "; }
989         return r;
990 }
991 function formatJSON(s) {
992         var r = ''; var t = 0;
993         for (var i in s) {
994                 if (s[i] == '{' || s[i] == '[' ) {
995                         r = r + s[i] + "\n" + print_tabs(++t);
996                 } else if (s[i] == '}' || s[i] == ']') {
997                         t--; r = r + "\n" + print_tabs(t) + s[i];
998                 } else if (s[i] == ',') {
999                         r = r + s[i] + "\n" + print_tabs(t);
1000                 } else {
1001                         r = r + s[i];
1002                 }
1003         }
1004         return r;
1005 }