]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/web/opac/common/js/opac_utils.js
4faf5ef73d5ca65b4b28227c5e7de33db9fb65ec
[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         /* this may seem unnecessary.. safety precaution for now */
284         /*
285         if( args[PARAM_DEPTH] == null )
286                 args[PARAM_DEPTH] = getDepth();
287                 */
288
289         string += "?";
290
291         for( var x in args ) {
292                 var v = args[x];
293                 if(x == "page" || v == null || v == undefined || v+'' == 'NaN' ) continue;
294                 if(x == PARAM_OFFSET && v == 0) continue;
295                 if(x == PARAM_COUNT && v == 10) continue;
296                 if(x == PARAM_FORM && v == 'all' ) continue;
297                 if( instanceOf(v, Array) && v.length ) {
298                         for( var i = 0; i < v.length; i++ ) {
299                                 string += "&" + x + "=" + encodeURIComponent(v[i]);
300                         }
301                 } else {
302                         string += "&" + x + "=" + encodeURIComponent(v);
303                 }
304         }
305
306         if(getDebug())
307                 string += _appendParam(DEBUG,           PARAM_DEBUG, args, getDebug, string);
308         if(getOrigLocation() != 1) 
309                 string += _appendParam(ORIGLOC, PARAM_ORIGLOC, args, getOrigLocation, string);
310         if(getTerm()) 
311                 string += _appendParam(TERM,            PARAM_TERM, args, getTerm, string);
312         if(getStype()) 
313                 string += _appendParam(STYPE,           PARAM_STYPE, args, getStype, string);
314         if(getLocation() != 1) 
315                 string += _appendParam(LOCATION, PARAM_LOCATION, args, getLocation, string);
316         if(getDepth() != null) 
317                 string += _appendParam(DEPTH,           PARAM_DEPTH, args, getDepth, string);
318         if(getForm() && (getForm() != 'all') ) 
319                 string += _appendParam(FORM,            PARAM_FORM, args, getForm, string);
320         if(getTform() && (getTform() != 'all') ) 
321                 string += _appendParam(TFORM,           PARAM_TFORM, args, getTform, string);
322         if(getOffset() != 0) 
323                 string += _appendParam(OFFSET,  PARAM_OFFSET, args, getOffset, string);
324         if(getDisplayCount() != 10) 
325                 string += _appendParam(COUNT,           PARAM_COUNT, args, getDisplayCount, string);
326         if(getHitCount()) 
327                 string += _appendParam(HITCOUNT, PARAM_HITCOUNT, args, getHitCount, string);
328         if(getMrid())
329                 string += _appendParam(MRID,            PARAM_MRID, args, getMrid, string);
330         if(getRid())
331                 string += _appendParam(RID,             PARAM_RID, args, getRid, string);
332         if(getAuthtime())
333                 string += _appendParam(AUTHTIME,        PARAM_AUTHTIME, args, getAuthtime, string);
334         if(getAdvTerm())
335                 string += _appendParam(ADVTERM, PARAM_ADVTERM, args, getAdvTerm, string);
336         if(getAdvType())
337                 string += _appendParam(ADVTYPE, PARAM_ADVTYPE, args, getAdvType, string);
338         if(getRtype())
339                 string += _appendParam(RTYPE,           PARAM_RTYPE, args, getRtype, string);
340         if(getItemForm())
341                 string += _appendParam(ITEMFORM,        PARAM_ITEMFORM, args, getItemForm, string);
342         if(getItemType())
343                 string += _appendParam(ITEMTYPE,        PARAM_ITEMTYPE, args, getItemType, string);
344         if(getLitForm())
345                 string += _appendParam(LITFORM, PARAM_LITFORM, args, getLitForm, string);
346         if(getAudience())
347                 string += _appendParam(AUDIENCE,        PARAM_AUDIENCE, args, getAudience, string);
348         if(getSearches())
349                 string += _appendParam(SEARCHES,        PARAM_SEARCHES, args, getSearches, string);
350         if(getLanguage())
351                 string += _appendParam(LANGUAGE,        PARAM_LANGUAGE, args, getLanguage, string);
352         if(getRdepth() != null)
353                 string += _appendParam(RDEPTH,  PARAM_RDEPTH, args, getRdepth, string);
354         if(getSort() != null)
355                 string += _appendParam(SORT,    PARAM_SORT, args, getSort, string);
356         if(getSortDir() != null)
357                 string += _appendParam(SORT_DIR,        PARAM_SORT_DIR, args, getSortDir, string);
358
359         return string.replace(/\&$/,'').replace(/\?\&/,"?");    
360 }
361
362 var xx = 1;
363 function _appendParam( fieldVar, fieldName, overrideArgs, getFunc, string ) {
364
365         var ret = "";
366
367         if(     fieldVar != null && 
368                         (fieldVar +'' != 'NaN') && 
369                         overrideArgs[fieldName] == null &&
370                         getFunc() != null &&
371                         getFunc()+'' != '' ) {
372
373                 ret = "&" + fieldName + "=" + encodeURIComponent(getFunc());
374         }
375
376         return ret;
377 }
378
379 /* ----------------------------------------------------------------------- */
380 function cleanISBN(isbn) {
381    if(isbn) {
382       isbn = isbn.toString().replace(/^\s+/,"");
383       var idx = isbn.indexOf(" ");
384       if(idx > -1) { isbn = isbn.substring(0, idx); }
385    } else isbn = "";
386    return isbn;
387 }       
388
389
390 /* builds a link that goes to the title listings for a metarecord */
391 function buildTitleLink(rec, link) {
392         if(!rec) return;
393         link.appendChild(text(normalize(truncate(rec.title(), 65))));
394         var args = {};
395         args.page = RRESULT;
396         args[PARAM_OFFSET] = 0;
397         args[PARAM_MRID] = rec.doc_id();
398         args[PARAM_RTYPE] = RTYPE_MRID;
399         link.setAttribute("href", buildOPACLink(args));
400 }
401
402 function buildTitleDetailLink(rec, link) {
403         if(!rec) return;
404         link.appendChild(text(normalize(truncate(rec.title(), 65))));
405         var args = {};
406         args.page = RDETAIL;
407         //args[PARAM_OFFSET] = 0;
408         args[PARAM_RID] = rec.doc_id();
409         link.setAttribute("href", buildOPACLink(args));
410 }
411
412 /* 'type' is one of STYPE_AUTHOR, STYPE_SUBJECT, ... found in config.js 
413         'trunc' is the number of characters to show in the string, defaults to 65 */
414 function buildSearchLink(type, string, linknode, trunc) {
415         if(!trunc) trunc = 65;
416         var args = {};
417         args.page = MRESULT;
418         args[PARAM_OFFSET] = 0;
419         args[PARAM_TERM] = string;
420         args[PARAM_STYPE] = type;
421         linknode.appendChild(text(normalize(truncate(string, trunc))));
422         linknode.setAttribute("href", buildOPACLink(args));
423 }
424
425
426 /* ----------------------------------------------------------------------- */
427 /* user session handling */
428 /* ----------------------------------------------------------------------- */
429 /* session is the login session.  If no session is provided, we attempt
430         to find one in the cookies.  If 'force' is true we retrieve the 
431         user from the server even if there is already a global user present.
432         if ses != G.user.session, we also force a grab */
433 function grabUser(ses, force) {
434
435         if(!ses && isXUL()) ses = xulG['authtoken'];
436
437         if(!ses) {
438                 ses = cookieManager.read(COOKIE_SES);
439                 /* https cookies don't show up in http servers.. */
440         }
441
442         if(!ses) return false;
443
444         if(!force) 
445                 if(G.user && G.user.session == ses)
446                         return G.user;
447
448         /* first make sure the session is valid */
449         var request = new Request(FETCH_SESSION, ses, 1 );
450         request.request.alertEvent = false;
451         request.send(true);
452         var user = request.result();
453
454         if(!user) {
455                 doLogout();
456                 return false; /* unable to grab the session */
457         }
458
459         if( !(typeof user == 'object' && user._isfieldmapper) ) {
460                 doLogout();
461                 return false;
462         }
463
464         G.user = user;
465         G.user.fleshed = false;
466         G.user.session = ses;
467         cookieManager.write(COOKIE_SES, ses, '+1d');
468
469
470         grabUserPrefs();
471         if(G.user.prefs['opac.hits_per_page'])
472                 COUNT = parseInt(G.user.prefs['opac.hits_per_page']);
473
474         if(G.user.prefs[PREF_DEF_FONT]) 
475                 setFontSize(G.user.prefs[PREF_DEF_FONT]);
476
477         var at = getAuthtime();
478         //if(isXUL()) at = xulG['authtime'];
479
480         if(at && !isXUL()) new AuthTimer(at).run(); 
481         return G.user;
482 }
483
484
485 /* sets the 'prefs' field of the user object to their preferences 
486         and returns the preferences */
487 function grabUserPrefs(user, force) {
488         if(user == null) user = G.user;
489         if(!force && user.prefs) return user.prefs;     
490         var req = new Request(FETCH_USER_PREFS, user.session, user.id());
491         req.send(true);
492         user.prefs = req.result();
493         return user.prefs;
494 }
495
496 function grabFleshedUser() {
497
498         if(!G.user || !G.user.session) {
499                 grabUser();     
500                 if(!G.user || !G.user.session) return null;
501         }
502
503         if(G.user.fleshed) return G.user;
504
505    var req = new Request(FETCH_FLESHED_USER, G.user.session);
506         req.send(true);
507
508         G.user = req.result();
509
510         if(!G.user || G.user.length == 0) { 
511                 G.user = null; return false; 
512                 cookieManager.write(COOKIE_SES,"");
513         }
514
515         G.user.session = ses;
516         G.user.fleshed = true;
517
518         cookieManager.write(COOKIE_SES, ses, '+1y'); /*  update the cookie */
519         return G.user;
520 }
521
522 function checkUserSkin(new_skin) {
523
524         return; /* XXX do some debugging with this... */
525
526         var user_skin = getSkin();
527         var cur_skin = grabSkinFromURL();
528
529         if(new_skin) user_skin = new_skin;
530
531         if(!user_skin) {
532
533                 if(grabUser()) {
534                         if(grabUserPrefs()) {
535                                 user_skin = G.user.prefs["opac.skin"];
536                                 cookieManager.write( COOKIE_SKIN, user_skin, '+1y' );
537                         }
538                 }
539         }
540
541         if(!user_skin) return;
542
543         if( cur_skin != user_skin ) {
544                 var url = buildOPACLink();
545                 goTo(url.replace(cur_skin, user_skin));
546         }
547 }
548
549 function updateUserSetting(setting, value, user) {
550         if(user == null) user = G.user;
551         var a = {};
552         a[setting] = value;
553         var req = new Request( UPDATE_USER_PREFS, user.session, a );
554         req.send(true);
555         return req.result();
556 }
557
558 function commitUserPrefs() {
559         var req = new Request( 
560                 UPDATE_USER_PREFS, G.user.session, null, G.user.prefs );
561         req.send(true);
562         return req.result();
563 }
564
565 function grabSkinFromURL() {
566         var path = findBasePath();
567         path = path.replace("/xml/", "");
568         var skin = "";
569         for( var i = path.length - 1; i >= 0; i-- ) {
570                 var ch = path.charAt(i);
571                 if(ch == "/") break;
572                 skin += ch;
573         }
574
575         var skin2 = "";
576         for( i = skin.length - 1; i >= 0; i--)
577                 skin2 += skin.charAt(i);
578
579         return skin2;
580 }
581
582
583 /* returns a fleshed G.user on success, false on failure */
584 function doLogin(suppressEvents) {
585
586         abortAllRequests();
587
588         var uname = G.ui.login.username.value;
589         var passwd = G.ui.login.password.value; 
590
591         var init_request = new Request( LOGIN_INIT, uname );
592    init_request.send(true);
593    var seed = init_request.result();
594
595    if( ! seed || seed == '0') {
596       alert( "Error Communicating with Authentication Server" );
597       return null;
598    }
599
600         var args = {
601                 password : hex_md5(seed + hex_md5(passwd)), 
602                 type            : "opac", 
603                 org             : getOrigLocation()
604         };
605
606         if( uname.match(REGEX_BARCODE) ) args.barcode = uname; /* make this better */
607         else args.username = uname;
608
609    var auth_request = new Request( LOGIN_COMPLETE, args );
610
611         auth_request.request.alertEvent = false;
612    auth_request.send(true);
613    var auth_result = auth_request.result();
614
615         if(!auth_result) {
616                 alertId('patron_login_failed');
617                 return null;
618         }
619
620         if( checkILSEvent(auth_result) ) {
621
622                 if( auth_result.textcode == 'PATRON_INACTIVE' ) {
623                         alertId('patron_inactive_alert');
624                         return;
625                 }
626
627                 if( auth_result.textcode == 'PATRON_CARD_INACTIVE' ) {
628                         alertId('patron_card_inactive_alert');
629                         return;
630                 }
631
632                 if( auth_result.textcode == 'LOGIN_FAILED' || 
633                                 auth_result.textcode == 'PERM_FAILURE' ) {
634                         alertId('patron_login_failed');
635                         return;
636                 }
637         }
638
639
640         AUTHTIME = parseInt(auth_result.payload.authtime);
641         var u = grabUser(auth_result.payload.authtoken, true);
642         if(u && ! suppressEvents) 
643                 runEvt( "common", "locationChanged", u.ws_ou(), findOrgDepth(u.ws_ou()) );
644
645         checkUserSkin();
646
647         return u;
648 }
649
650 function doLogout(noredirect) {
651
652         /* cancel everything else */
653         abortAllRequests();
654
655         /* be nice and delete the session from the server */
656         if(G.user && G.user.session) { 
657                 var req = new Request(LOGIN_DELETE, G.user.session);
658       req.send(true);
659                 try { req.result(); } catch(E){}
660     }
661
662         G.user = null;
663
664         /* remove any cached data */
665         //cookieManager.remove(COOKIE_IDS);
666         //cookieManager.remove(COOKIE_SRIDS);
667         cookieManager.remove(COOKIE_RIDS);
668         cookieManager.remove(COOKIE_SES);
669         cookieManager.remove(COOKIE_SKIN);
670
671         checkUserSkin("default");
672         COUNT = 10;
673
674
675         var args = {};
676         args[PARAM_TERM] = "";
677         args[PARAM_LOCATION] = getOrigLocation();
678         args[PARAM_DEPTH] = findOrgDepth(getOrigLocation());
679         args.page = "home";
680
681         
682         var nored = false;
683         try{ if(isFrontPage) nored = true; } catch(e){nored = false;}
684         if(!nored) goTo(buildOPACLink(args));
685 }
686
687
688 function hideMe(obj) { addCSSClass(obj, config.css.hide_me); } 
689 function unHideMe(obj) { removeCSSClass(obj, config.css.hide_me); }
690
691
692 /* ----------------------------------------------------------------------- */
693 /* build the org tree */
694 /* ----------------------------------------------------------------------- */
695 function drawOrgTree() {
696         //setTimeout( 'buildOrgSelector(G.ui.common.org_tree, orgTreeSelector);', 10 );
697         setTimeout( 'buildOrgSelector(G.ui.common.org_tree, orgTreeSelector);', 1 );
698 }
699         
700 var orgTreeSelector;
701 function buildOrgSelector(node) {
702         var tree = new SlimTree(node,'orgTreeSelector');
703         orgTreeSelector = tree;
704         for( var i in orgArraySearcher ) { 
705                 var node = orgArraySearcher[i];
706                 if( node == null ) continue;
707                 if(node.parent_ou() == null)
708                         tree.addNode(node.id(), -1, node.name(), 
709                                 "javascript:orgSelect(" + node.id() + ");", node.name());
710                 else {
711                         tree.addNode(node.id(), findOrgUnit(node.parent_ou()).id(), node.name(), 
712                                 "javascript:orgSelect(" + node.id() + ");", node.name());
713                 }
714         }
715         hideMe($('org_loading_div'));
716         unHideMe($('org_selector_tip'));
717         return tree;
718 }
719
720 function orgSelect(id) {
721         showCanvas();
722         runEvt("common", "locationChanged", id, findOrgDepth(id) );
723
724         removeChildren(G.ui.common.now_searching);
725         G.ui.common.now_searching.appendChild(text(findOrgUnit(id).name()));
726 }
727
728 function setFontSize(size) {
729         scaleFonts(size);
730         cookieManager.write(COOKIE_FONT, size, '+1y');
731 }
732
733
734 var resourceFormats = [
735    "text",
736    "moving image",
737    "sound recording", "software, multimedia",
738    "still images",
739    "cartographic",
740    "mixed material",
741    "notated music",
742    "three dimensional object" ];
743
744
745 function modsFormatToMARC(format) {
746    switch(format) {
747       case "text":
748          return "at";
749       case "moving image":
750          return "g";
751       case "sound recording":
752          return "ij";
753       case "sound recording-nonmusical":
754          return "i";
755       case "sound recording-musical":
756          return "j";
757       case "software, multimedia":
758          return "m";
759       case "still images":
760          return "k";
761       case "cartographic":
762          return "ef";
763       case "mixed material":
764          return "op";
765       case "notated music":
766          return "cd";
767       case "three dimensional object":
768          return "r";
769    }
770    return "at";
771 }
772
773
774 function MARCFormatToMods(format) {
775    switch(format) {
776       case "a":
777       case "t":
778          return "text";
779       case "g":
780          return "moving image";
781       case "i":
782          return "sound recording-nonmusical";
783       case "j":
784          return "sound recording-musical";
785       case "m":
786          return "software, multimedia";
787       case "k":
788          return "still images";
789       case "e":
790       case "f":
791          return "cartographic";
792       case "o":
793       case "p":
794          return "mixed material";
795       case "c":
796       case "d":
797          return "notated music";
798       case "r":
799          return "three dimensional object";
800    }
801    return "text";
802 }
803
804 function MARCTypeToFriendly(format) {
805         var words = $('format_words');
806         switch(format) {
807                 case 'a' :
808                 case 't' : return $n(words, 'at').innerHTML;
809                 default:
810                         var node = $n(words,format);
811                         if( node ) return node.innerHTML;
812         }
813         return "";
814 }
815
816 function setResourcePic( img, resource ) {
817         img.setAttribute( "src", "../../../../images/tor/" + resource + ".jpg");
818         img.title = resource;
819 }
820
821
822
823 function msg( text ) {
824         try { alert( text ); } catch(e) {}
825 }
826
827 function findRecord(id,type) {
828         try {
829                 for( var i = 0; i != recordsCache.length; i++ ) {
830                         var rec = recordsCache[i];
831                         if( rec && rec.doc_id() == id ) return rec;
832                 }
833         } catch(E){}
834         var meth = FETCH_RMODS
835         if(type == 'M') meth = FETCH_MRMODS;
836         var req = new Request(meth, id);
837         req.request.alertEvent = false;
838         req.send(true);
839         var res = req.result();
840         if( checkILSEvent(res) ) return null; 
841 }
842
843 function Timer(name, node){
844         this.name = name;
845         this.count = 1;
846         this.node = node;
847 }
848 Timer.prototype.start = 
849         function(){_timerRun(this.name);}
850 Timer.prototype.stop = 
851         function(){this.done = true;}
852 function _timerRun(tname) {
853         var _t;
854         eval('_t='+tname);
855         if(_t.done) return;
856         if(_t.count > 100) return;
857         var str = ' . ';
858         if( (_t.count % 5) == 0 ) 
859                 str = _t.count / 5;
860         _t.node.appendChild(text(str));
861         setTimeout("_timerRun('"+tname+"');", 200);
862         _t.count++;
863 }
864
865 function checkILSEvent(obj) {
866         if( obj && obj.ilsevent != null && obj.ilsevent != 0 )
867                 return parseInt(obj.ilsevent);
868         return null;
869 }
870
871
872 function alertILSEvent(evt, msg) {
873    if(!msg) msg = "";
874         if(msg)
875                 alert(msg +'\n' + evt.textcode + '\n' + evt.desc );
876         else 
877                 alert(evt.textcode + '\n' + evt.desc );
878 }
879
880
881 var __authTimer;
882 function AuthTimer(time) { 
883         this.time = (time - LOGOUT_WARNING_TIME) * 1000; 
884         __authTimer = this;
885 }
886
887 AuthTimer.prototype.run = function() {
888         setTimeout('_authTimerAlert()', this.time);
889 }
890
891 function _authTimerAlert() {
892         alert( $('auth_session_expiring').innerHTML );
893         if(!grabUser(null, true)) doLogout();
894 }
895
896
897 function grabUserByBarcode( authtoken, barcode ) {
898         var req = new Request( FETCH_USER_BYBARCODE, authtoken, barcode );
899         req.send(true);
900         return req.result();
901 }
902
903
904 function goHome() {
905         goTo(buildOPACLink({page:HOME}));
906 }
907
908
909 function buildOrgSel(selector, org, offset) {
910         insertSelectorVal( selector, -1, 
911                 org.name(), org.id(), null, findOrgDepth(org) - offset );
912         for( var c in org.children() )
913                 buildOrgSel( selector, org.children()[c], offset);
914 }
915
916
917 function parseForm(form) {
918         if(!form) return {};
919
920         var it = form.replace(/-\w+$/,"");
921         var itf = null;
922         var item_form;
923         var item_type;
924
925         if(form.match(/-/)) itf = form.replace(/^\w+-/,"");
926
927         if(it) {
928                 item_type = [];
929                 for( var i = 0; i < it.length; i++ ) 
930                         item_type.push( it.charAt(i) );
931         }
932
933         if(itf) {
934                 item_form = [];
935                 for( var i = 0; i < itf.length; i++ ) 
936                         item_form.push( itf.charAt(i) );
937         }
938
939         return {item_type: item_type, item_form:item_form};
940 }
941
942
943 function isTrue(x) { return ( x && x != "0" && !(x+'').match(/^f$/i) ); }
944
945 function fetchPermOrgs() {
946         var a = []; /* why does arguments come accross as an object and not an array? */
947         for( var i = 0; i < arguments.length; i++ ) 
948                 a.push(arguments[i])
949
950         var preq = new Request(FETCH_HIGHEST_PERM_ORG, 
951                 G.user.session, G.user.id(), a );
952         preq.send(true);
953         return preq.result();
954 }
955