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