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