]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/web/opac/common/js/opac_utils.js
more metarecord hold goodness
[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 MARCTypeToFriendly(format) {
753         var words = $('format_words');
754         switch(format) {
755                 case 'a' :
756                 case 't' : return $n(words, 'at').innerHTML;
757                 default:
758                         var node = $n(words,format);
759                         if( node ) return node.innerHTML;
760         }
761         return "";
762 }
763
764 function setResourcePic( img, resource ) {
765         img.setAttribute( "src", "../../../../images/tor/" + resource + ".jpg");
766         img.title = resource;
767 }
768
769
770
771 function msg( text ) {
772         try { alert( text ); } catch(e) {}
773 }
774
775 function findRecord(id,type) {
776         try {
777                 for( var i = 0; i != recordsCache.length; i++ ) {
778                         var rec = recordsCache[i];
779                         if( rec && rec.doc_id() == id ) return rec;
780                 }
781         } catch(E){}
782         var meth = FETCH_RMODS
783         if(type == 'M') meth = FETCH_MRMODS;
784         var req = new Request(meth, id);
785         req.send(true);
786         return req.result();
787 }
788
789 function Timer(name, node){
790         this.name = name;
791         this.count = 1;
792         this.node = node;
793 }
794 Timer.prototype.start = 
795         function(){_timerRun(this.name);}
796 Timer.prototype.stop = 
797         function(){this.done = true;}
798 function _timerRun(tname) {
799         var _t;
800         eval('_t='+tname);
801         if(_t.done) return;
802         if(_t.count > 100) return;
803         var str = ' . ';
804         if( (_t.count % 5) == 0 ) 
805                 str = _t.count / 5;
806         _t.node.appendChild(text(str));
807         setTimeout("_timerRun('"+tname+"');", 200);
808         _t.count++;
809 }
810
811 function checkILSEvent(obj) {
812         if( obj && obj.ilsevent != null && obj.ilsevent != 0 )
813                 return parseInt(obj.ilsevent);
814         return null;
815 }
816
817 /*
818 function alertILSEvent(code, msg) {
819    if(!msg) msg = "";
820         alert( msg + '\n' + $('ilsevent.' + code).innerHTML );
821 }
822 */
823
824 function alertILSEvent(evt, msg) {
825    if(!msg) msg = "";
826         alert(evt.textcode + '\n' + evt.desc );
827 }
828
829
830 var __authTimer;
831 function AuthTimer(time) { 
832         this.time = (time - LOGOUT_WARNING_TIME) * 1000; 
833         __authTimer = this;
834 }
835
836 AuthTimer.prototype.run = function() {
837         setTimeout('_authTimerAlert()', this.time);
838 }
839
840 function _authTimerAlert() {
841         alert( $('auth_session_expiring').innerHTML );
842         if(!grabUser(null, true)) doLogout();
843 }
844
845
846 function grabUserByBarcode( authtoken, barcode ) {
847         var req = new Request( FETCH_USER_BYBARCODE, authtoken, barcode );
848         req.send(true);
849         return req.result();
850 }
851
852
853 function goHome() {
854         goTo(buildOPACLink({page:HOME}));
855 }
856
857
858 function buildOrgSel(selector, org, offset) {
859         insertSelectorVal( selector, -1, 
860                 org.name(), org.id(), null, findOrgDepth(org) - offset );
861         for( var c in org.children() )
862                 buildOrgSel( selector, org.children()[c], offset);
863 }
864
865
866 function parseForm(form) {
867         if(!form) return {};
868
869         var it = form.replace(/-\w+$/,"");
870         var itf = null;
871         var item_form;
872         var item_type;
873
874         if(form.match(/-/)) itf = form.replace(/^\w+-/,"");
875
876         if(it) {
877                 item_type = [];
878                 for( var i = 0; i < it.length; i++ ) 
879                         item_type.push( it.charAt(i) );
880         }
881
882         if(itf) {
883                 item_form = [];
884                 for( var i = 0; i < itf.length; i++ ) 
885                         item_form.push( itf.charAt(i) );
886         }
887
888         return {item_type: item_type, item_form:item_form};
889 }
890
891