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