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