1 /* - Request ------------------------------------------------------------- */
3 /* define it again here for pages that don't load RemoteRequest */
4 function isXUL() { try { if(IAMXUL) return true;}catch(e){return false;}; }
7 var cookieManager = new HTTP.Cookies();
9 var __ilsEvent; /* the last event the occurred */
12 function Request(type) {
14 var s = type.split(":");
15 if(s[2] == "1" && isXUL()) s[1] += ".staff";
16 this.request = new RemoteRequest(s[0], s[1]);
20 if(!location.href.match(/^https:/))
21 this.request.setSecure(false);
25 if( G.user && G.user.session ) {
26 /* if the user is logged in, all activity resets the timeout
27 This is not entirely accurate in the sense that not all
28 requests will reset the server timeout - this should
29 get close enough, however.
31 var at = getAuthtime();
32 if(at) new AuthTimer(at).run();
36 for( var x = 1; x!= arguments.length; x++ ) {
38 this.request.addParam(arguments[x]);
43 for( var i = 0; i != p.length; i++ ) {
44 if( i > 0 ) str += ", "
47 _debug('request ' + s[0] + ' ' + s[1] + ' ' + str );
49 } else if( DEBUGSLIM ) {
50 _debug('request ' + s[1]);
54 Request.prototype.callback = function(cal) {this.request.setCompleteCallback(cal);}
55 Request.prototype.send = function(block){this.request.send(block);}
56 Request.prototype.result = function(){return this.request.getResultObject();}
58 function showCanvas() {
59 for( var x in G.ui.altcanvas ) {
60 hideMe(G.ui.altcanvas[x]);
62 hideMe(G.ui.common.loading);
63 unHideMe(G.ui.common.canvas_main);
64 try{G.ui.searchbar.text.focus();}catch(e){}
67 function swapCanvas(newNode) {
68 for( var x in G.ui.altcanvas )
69 hideMe(G.ui.altcanvas[x]);
71 hideMe(G.ui.common.loading);
72 hideMe(G.ui.common.canvas_main);
76 /* finds the name of the current page */
77 var currentPage = null;
78 function findCurrentPage() {
79 if(currentPage) return currentPage;
82 for( var p in config.page ) pages.push(config.page[p]);
83 pages = pages.sort( function(a,b){ return - (a.length - b.length); } );
85 var path = location.pathname;
86 if(!path.match(/.*\.xml$/))
87 path += "index.xml"; /* in case they go to / */
90 for( var p in pages ) {
91 if( path.indexOf(pages[p]) != -1)
95 for( var p in config.page ) {
96 if(config.page[p] == page) {
105 /* sets all of the params values ----------------------------- */
106 function initParams() {
109 /* handle the location var */
111 var loc = cgi.param(PARAM_LOCATION);
112 var lasso = cgi.param(PARAM_LASSO);
115 lasso = findOrgLasso( lasso );
116 LASSO = lasso ? lasso.id() : null;
120 org = findOrgUnit(loc);
121 LOCATION = org ? org.id() : null;
124 org = findOrgUnit(loc);
125 LOCATION = org ? org.id() : null;
130 loc = cgi.param(PARAM_ORIGLOC);
132 org = findOrgUnit(loc);
133 if(!org) org = findOrgUnitSN(loc);
135 ORIGLOC = (org) ? org.id() : null;
138 DEPTH = parseInt(cgi.param(PARAM_DEPTH));
139 if(isNaN(DEPTH)) DEPTH = null;
142 TERM = cgi.param(PARAM_TERM);
143 STYPE = cgi.param(PARAM_STYPE);
144 FORM = cgi.param(PARAM_FORM);
145 //DEPTH = parseInt(cgi.param(PARAM_DEPTH));
146 OFFSET = parseInt(cgi.param(PARAM_OFFSET));
147 COUNT = parseInt(cgi.param(PARAM_COUNT));
148 HITCOUNT = parseInt(cgi.param(PARAM_HITCOUNT));
149 MRID = parseInt(cgi.param(PARAM_MRID));
150 RID = parseInt(cgi.param(PARAM_RID));
151 AUTHTIME = parseInt(cgi.param(PARAM_AUTHTIME));
152 ADVTERM = cgi.param(PARAM_ADVTERM);
153 ADVTYPE = cgi.param(PARAM_ADVTYPE);
154 RTYPE = cgi.param(PARAM_RTYPE);
155 SORT = cgi.param(PARAM_SORT);
156 SORT_DIR = cgi.param(PARAM_SORT_DIR);
157 DEBUG = cgi.param(PARAM_DEBUG);
158 CALLNUM = cgi.param(PARAM_CN);
159 LITFORM = cgi.param(PARAM_LITFORM);
160 ITEMFORM = cgi.param(PARAM_ITEMFORM);
161 ITEMTYPE = cgi.param(PARAM_ITEMTYPE);
162 BIBLEVEL = cgi.param(PARAM_BIBLEVEL);
163 AUDIENCE = cgi.param(PARAM_AUDIENCE);
164 SEARCHES = cgi.param(PARAM_SEARCHES);
165 LANGUAGE = cgi.param(PARAM_LANGUAGE);
166 TFORM = cgi.param(PARAM_TFORM);
167 RDEPTH = cgi.param(PARAM_RDEPTH);
168 AVAIL = cgi.param(PARAM_AVAIL);
170 /* set up some sane defaults */
171 //if(isNaN(DEPTH)) DEPTH = 0;
172 if(isNaN(RDEPTH)) RDEPTH = 0;
173 if(isNaN(OFFSET)) OFFSET = 0;
174 if(isNaN(COUNT)) COUNT = 10;
175 if(isNaN(HITCOUNT)) HITCOUNT = 0;
176 if(isNaN(MRID)) MRID = 0;
177 if(isNaN(RID)) RID = 0;
178 if(isNaN(ORIGLOC)) ORIGLOC = 0; /* so we know it hasn't been set */
179 if(isNaN(AUTHTIME)) AUTHTIME = 0;
180 if(ADVTERM==null) ADVTERM = "";
181 if(isNaN(AVAIL)) AVAIL = 0;
184 function clearSearchParams() {
211 function initCookies() {
212 FONTSIZE = "regular";
213 var font = cookieManager.read(COOKIE_FONT);
215 if(font) FONTSIZE = font;
216 SKIN = cookieManager.read(COOKIE_SKIN);
217 if(findCurrentPage() == HOME)
218 cookieManager.remove(COOKIE_SEARCH);
223 /* URL param accessors */
224 function getTerm(){return TERM;}
225 function getStype(){return STYPE;}
226 function getLocation(){return LOCATION;}
227 function getLasso(){return LASSO;}
228 function getDepth(){return DEPTH;}
229 function getForm(){return FORM;}
230 function getTform(){return TFORM;}
231 function getOffset(){return OFFSET;}
232 function getDisplayCount(){return COUNT;}
233 function getHitCount(){return HITCOUNT;}
234 function getMrid(){return MRID;};
235 function getRid(){return RID;};
236 function getOrigLocation(){return ORIGLOC;}
237 function getAuthtime() { return AUTHTIME; }
238 function getSearchBarExtras(){return SBEXTRAS;}
239 function getFontSize(){return FONTSIZE;};
240 function getSkin(){return SKIN;};
241 function getAdvTerm(){return ADVTERM;}
242 function getAdvType(){return ADVTYPE;}
243 function getRtype(){return RTYPE;}
244 function getSort(){return SORT;}
245 function getSortDir(){return SORT_DIR;}
246 function getDebug(){return DEBUG;}
247 function getCallnumber() { return CALLNUM; }
248 function getLitForm() { return LITFORM; }
249 function getItemForm() { return ITEMFORM; }
250 function getItemType() { return ITEMTYPE; }
251 function getBibLevel() { return BIBLEVEL; }
252 function getAudience() { return AUDIENCE; }
253 function getSearches() { return SEARCHES; }
254 function getLanguage() { return LANGUAGE; }
255 function getRdepth() { return RDEPTH; }
256 function getAvail() { return AVAIL; }
259 function findBasePath() {
260 var path = location.pathname;
261 if(!path.match(/.*\.xml$/)) path += "index.xml";
262 var idx = path.indexOf(config.page[findCurrentPage()]);
263 return path.substring(0, idx);
266 function findBaseURL(ssl) {
267 var path = findBasePath();
268 var proto = (ssl) ? "https:" : "http:";
270 /* strip port numbers. This is necessary for browsers that
271 send an explicit <host>:80, 443 - explicit ports
272 break links that need to change ports (e.g. http -> https) */
273 var h = location.host.replace(/:.*/,'');
275 return proto + "//" + h + path;
279 function buildISBNSrc(isbn) {
280 return "http://" + location.host + "/jackets/" + isbn;
284 function buildImageLink(name, ssl) {
285 return findBaseURL(ssl) + "../../../../images/" + name;
288 function buildExtrasLink(name, ssl) {
289 return findBaseURL(ssl) + "../../../../extras/" + name;
293 function _debug(str) {
294 try { dump('dbg: ' + str + '\n'); } catch(e) {}
296 /* potentially useful, but usually just annoying */
299 if(!consoleService) {
301 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
302 this.consoleService = Components.classes['@mozilla.org/consoleservice;1']
303 .getService(Components.interfaces.nsIConsoleService);
309 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
310 consoleService.logStringMessage(str + '\n');
317 function buildOPACLink(args, slim, ssl) {
323 string = findBaseURL(ssl);
324 if(args.page) string += config.page[args.page];
325 else string += config.page[findCurrentPage()];
328 /* this may seem unnecessary.. safety precaution for now */
330 if( args[PARAM_DEPTH] == null )
331 args[PARAM_DEPTH] = getDepth();
336 for( var x in args ) {
338 if(x == "page" || v == null || v == undefined || v+'' == 'NaN' ) continue;
339 if(x == PARAM_OFFSET && v == 0) continue;
340 if(x == PARAM_COUNT && v == 10) continue;
341 if(x == PARAM_FORM && v == 'all' ) continue;
342 if( instanceOf(v, Array) && v.length ) {
343 for( var i = 0; i < v.length; i++ ) {
344 string += "&" + x + "=" + encodeURIComponent(v[i]);
347 string += "&" + x + "=" + encodeURIComponent(v);
352 string += _appendParam(DEBUG, PARAM_DEBUG, args, getDebug, string);
353 if(getOrigLocation() != 1)
354 string += _appendParam(ORIGLOC, PARAM_ORIGLOC, args, getOrigLocation, string);
356 string += _appendParam(TERM, PARAM_TERM, args, getTerm, string);
358 string += _appendParam(STYPE, PARAM_STYPE, args, getStype, string);
359 if(getLocation() != 1)
360 string += _appendParam(LOCATION, PARAM_LOCATION, args, getLocation, string);
361 if(getLasso() != null)
362 string += _appendParam(LASSO, PARAM_LASSO, args, getLasso, string);
363 if(getDepth() != null)
364 string += _appendParam(DEPTH, PARAM_DEPTH, args, getDepth, string);
365 if(getForm() && (getForm() != 'all') )
366 string += _appendParam(FORM, PARAM_FORM, args, getForm, string);
367 if(getTform() && (getTform() != 'all') )
368 string += _appendParam(TFORM, PARAM_TFORM, args, getTform, string);
370 string += _appendParam(OFFSET, PARAM_OFFSET, args, getOffset, string);
371 if(getDisplayCount() != 10)
372 string += _appendParam(COUNT, PARAM_COUNT, args, getDisplayCount, string);
374 string += _appendParam(HITCOUNT, PARAM_HITCOUNT, args, getHitCount, string);
376 string += _appendParam(MRID, PARAM_MRID, args, getMrid, string);
378 string += _appendParam(RID, PARAM_RID, args, getRid, string);
380 string += _appendParam(AUTHTIME, PARAM_AUTHTIME, args, getAuthtime, string);
382 string += _appendParam(ADVTERM, PARAM_ADVTERM, args, getAdvTerm, string);
384 string += _appendParam(ADVTYPE, PARAM_ADVTYPE, args, getAdvType, string);
386 string += _appendParam(RTYPE, PARAM_RTYPE, args, getRtype, string);
388 string += _appendParam(ITEMFORM, PARAM_ITEMFORM, args, getItemForm, string);
390 string += _appendParam(ITEMTYPE, PARAM_ITEMTYPE, args, getItemType, string);
392 string += _appendParam(BIBLEVEL, PARAM_BIBLEVEL, args, getBibLevel, string);
394 string += _appendParam(LITFORM, PARAM_LITFORM, args, getLitForm, string);
396 string += _appendParam(AUDIENCE, PARAM_AUDIENCE, args, getAudience, string);
398 string += _appendParam(SEARCHES, PARAM_SEARCHES, args, getSearches, string);
400 string += _appendParam(LANGUAGE, PARAM_LANGUAGE, args, getLanguage, string);
401 if(getRdepth() != null)
402 string += _appendParam(RDEPTH, PARAM_RDEPTH, args, getRdepth, string);
403 if(getSort() != null)
404 string += _appendParam(SORT, PARAM_SORT, args, getSort, string);
405 if(getSortDir() != null)
406 string += _appendParam(SORT_DIR, PARAM_SORT_DIR, args, getSortDir, string);
408 string += _appendParam(AVAIL, PARAM_AVAIL, args, getAvail, string);
410 return string.replace(/\&$/,'').replace(/\?\&/,"?");
414 function _appendParam( fieldVar, fieldName, overrideArgs, getFunc, string ) {
418 if( fieldVar != null &&
419 (fieldVar +'' != 'NaN') &&
420 overrideArgs[fieldName] == null &&
422 getFunc()+'' != '' ) {
424 ret = "&" + fieldName + "=" + encodeURIComponent(getFunc());
430 /* ----------------------------------------------------------------------- */
431 function cleanISBN(isbn) {
433 isbn = isbn.toString().replace(/^\s+/,"");
434 var idx = isbn.indexOf(" ");
435 if(idx > -1) { isbn = isbn.substring(0, idx); }
441 /* builds a link that goes to the title listings for a metarecord */
442 function buildTitleLink(rec, link) {
444 link.appendChild(text(normalize(truncate(rec.title(), 65))));
447 args[PARAM_OFFSET] = 0;
448 args[PARAM_MRID] = rec.doc_id();
449 args[PARAM_RTYPE] = RTYPE_MRID;
450 link.setAttribute("href", buildOPACLink(args));
453 function buildTitleDetailLink(rec, link) {
455 link.appendChild(text(normalize(truncate(rec.title(), 65))));
458 //args[PARAM_OFFSET] = 0;
459 args[PARAM_RID] = rec.doc_id();
460 link.setAttribute("href", buildOPACLink(args));
463 /* 'type' is one of STYPE_AUTHOR, STYPE_SUBJECT, ... found in config.js
464 'trunc' is the number of characters to show in the string, defaults to 65 */
465 function buildSearchLink(type, string, linknode, trunc) {
466 if(!trunc) trunc = 65;
468 if( SHOW_MR_DEFAULT) {
472 args[PARAM_RTYPE] = type;
474 args[PARAM_OFFSET] = 0;
475 args[PARAM_TERM] = string;
476 args[PARAM_STYPE] = type;
477 linknode.appendChild(text(normalize(truncate(string, trunc))));
478 linknode.setAttribute("href", buildOPACLink(args));
481 function setSessionCookie(ses) {
482 cookieManager.write(COOKIE_SES, ses, -1);
487 /* ----------------------------------------------------------------------- */
488 /* user session handling */
489 /* ----------------------------------------------------------------------- */
490 /* session is the login session. If no session is provided, we attempt
491 to find one in the cookies. If 'force' is true we retrieve the
492 user from the server even if there is already a global user present.
493 if ses != G.user.session, we also force a grab */
494 function grabUser(ses, force) {
496 if(!ses && isXUL()) {
497 stash = fetchXULStash();
498 ses = stash.session.key
499 _debug("stash auth token = " + ses);
503 ses = cookieManager.read(COOKIE_SES);
504 /* https cookies don't show up in http servers.. */
507 if(!ses) return false;
510 if(G.user && G.user.session == ses)
513 /* first make sure the session is valid */
514 var request = new Request(FETCH_SESSION, ses, 1 );
515 request.request.alertEvent = false;
517 var user = request.result();
521 return false; /* unable to grab the session */
524 if( !(typeof user == 'object' && user._isfieldmapper) ) {
530 G.user.fleshed = false;
531 G.user.session = ses;
532 setSessionCookie(ses);
535 if(G.user.prefs['opac.hits_per_page'])
536 COUNT = parseInt(G.user.prefs['opac.hits_per_page']);
538 if(G.user.prefs[PREF_DEF_FONT])
539 setFontSize(G.user.prefs[PREF_DEF_FONT]);
541 var at = getAuthtime();
542 //if(isXUL()) at = xulG['authtime'];
544 if(at && !isXUL()) new AuthTimer(at).run();
549 /* sets the 'prefs' field of the user object to their preferences
550 and returns the preferences */
551 function grabUserPrefs(user, force) {
552 if(user == null) user = G.user;
553 if(!force && user.prefs) return user.prefs;
554 var req = new Request(FETCH_USER_PREFS, user.session, user.id());
556 user.prefs = req.result();
560 function grabFleshedUser() {
562 if(!G.user || !G.user.session) {
564 if(!G.user || !G.user.session) return null;
567 if(G.user.fleshed) return G.user;
569 var req = new Request(FETCH_FLESHED_USER, G.user.session);
572 G.user = req.result();
574 if(!G.user || G.user.length == 0) {
575 G.user = null; return false;
576 cookieManager.write(COOKIE_SES,"");
579 G.user.session = ses;
580 G.user.fleshed = true;
582 setSessionCookie(ses);
586 function checkUserSkin(new_skin) {
588 return; /* XXX do some debugging with this... */
590 var user_skin = getSkin();
591 var cur_skin = grabSkinFromURL();
593 if(new_skin) user_skin = new_skin;
598 if(grabUserPrefs()) {
599 user_skin = G.user.prefs["opac.skin"];
600 cookieManager.write( COOKIE_SKIN, user_skin, '+1y' );
605 if(!user_skin) return;
607 if( cur_skin != user_skin ) {
608 var url = buildOPACLink();
609 goTo(url.replace(cur_skin, user_skin));
613 function updateUserSetting(setting, value, user) {
614 if(user == null) user = G.user;
617 var req = new Request( UPDATE_USER_PREFS, user.session, a );
622 function commitUserPrefs() {
623 var req = new Request(
624 UPDATE_USER_PREFS, G.user.session, null, G.user.prefs );
629 function grabSkinFromURL() {
630 var path = findBasePath();
631 path = path.replace("/xml/", "");
633 for( var i = path.length - 1; i >= 0; i-- ) {
634 var ch = path.charAt(i);
640 for( i = skin.length - 1; i >= 0; i--)
641 skin2 += skin.charAt(i);
647 /* returns a fleshed G.user on success, false on failure */
648 function doLogin(suppressEvents) {
652 var uname = G.ui.login.username.value;
653 var passwd = G.ui.login.password.value;
655 var init_request = new Request( LOGIN_INIT, uname );
656 init_request.send(true);
657 var seed = init_request.result();
659 if( ! seed || seed == '0') {
660 alert( "Error Communicating with Authentication Server" );
665 password : hex_md5(seed + hex_md5(passwd)),
667 org : getOrigLocation()
670 r = fetchOrgSettingDefault(globalOrgTree.id(), 'opac.barcode_regex');
671 if(r) REGEX_BARCODE = new RegExp(r);
673 if( uname.match(REGEX_BARCODE) ) args.barcode = uname;
674 else args.username = uname;
676 var auth_request = new Request( LOGIN_COMPLETE, args );
678 auth_request.request.alertEvent = false;
679 auth_request.send(true);
680 var auth_result = auth_request.result();
683 alertId('patron_login_failed');
687 if( checkILSEvent(auth_result) ) {
689 if( auth_result.textcode == 'PATRON_INACTIVE' ) {
690 alertId('patron_inactive_alert');
694 if( auth_result.textcode == 'PATRON_CARD_INACTIVE' ) {
695 alertId('patron_card_inactive_alert');
699 if( auth_result.textcode == 'LOGIN_FAILED' ||
700 auth_result.textcode == 'PERM_FAILURE' ) {
701 alertId('patron_login_failed');
707 AUTHTIME = parseInt(auth_result.payload.authtime);
708 var u = grabUser(auth_result.payload.authtoken, true);
709 if(u && ! suppressEvents)
710 runEvt( "common", "locationChanged", u.ws_ou(), findOrgDepth(u.ws_ou()) );
717 function doLogout(noredirect) {
719 /* cancel everything else */
722 /* be nice and delete the session from the server */
723 if(G.user && G.user.session) {
724 var req = new Request(LOGIN_DELETE, G.user.session);
726 try { req.result(); } catch(E){}
731 /* remove any cached data */
732 //cookieManager.remove(COOKIE_IDS);
733 //cookieManager.remove(COOKIE_SRIDS);
734 cookieManager.remove(COOKIE_RIDS);
735 cookieManager.remove(COOKIE_SES);
736 cookieManager.remove(COOKIE_SKIN);
737 cookieManager.remove(COOKIE_SEARCH);
739 checkUserSkin("default");
744 args[PARAM_TERM] = "";
745 args[PARAM_LOCATION] = getOrigLocation();
746 args[PARAM_DEPTH] = findOrgDepth(getOrigLocation());
751 try{ if(isFrontPage) nored = true; } catch(e){nored = false;}
752 if(!nored) goTo(buildOPACLink(args));
756 function hideMe(obj) { addCSSClass(obj, config.css.hide_me); }
757 function unHideMe(obj) { removeCSSClass(obj, config.css.hide_me); }
760 /* ----------------------------------------------------------------------- */
761 /* build the org tree */
762 /* ----------------------------------------------------------------------- */
763 function drawOrgTree() {
764 //setTimeout( 'buildOrgSelector(G.ui.common.org_tree, orgTreeSelector);', 10 );
765 setTimeout( 'buildOrgSelector(G.ui.common.org_tree, orgTreeSelector);', 1 );
769 function buildOrgSelector(node) {
770 var tree = new SlimTree(node,'orgTreeSelector');
771 orgTreeSelector = tree;
772 for( var i in orgArraySearcher ) {
773 var node = orgArraySearcher[i];
774 if( node == null ) continue;
775 if(!isXUL() && !isTrue(node.opac_visible())) continue;
776 if(node.parent_ou() == null)
777 tree.addNode(node.id(), -1, node.name(),
778 "javascript:orgSelect(" + node.id() + ");", node.name());
780 tree.addNode(node.id(), node.parent_ou(), node.name(),
781 "javascript:orgSelect(" + node.id() + ");", node.name());
784 hideMe($('org_loading_div'));
785 unHideMe($('org_selector_tip'));
789 function orgSelect(id) {
791 runEvt("common", "locationChanged", id, findOrgDepth(id) );
794 var loc = findOrgLasso(getLasso());
795 if (!loc) loc = findOrgUnit(id);
797 removeChildren(G.ui.common.now_searching);
798 G.ui.common.now_searching.appendChild(text(loc.name()));
801 function setFontSize(size) {
803 cookieManager.write(COOKIE_FONT, size, '+1y');
806 var resourceFormats = [
809 "sound recording", "software, multimedia",
814 "three dimensional object" ];
817 function modsFormatToMARC(format) {
823 case "sound recording":
825 case "sound recording-nonmusical":
827 case "sound recording-musical":
829 case "software, multimedia":
835 case "mixed material":
837 case "notated music":
839 case "three dimensional object":
846 function MARCFormatToMods(format) {
852 return "moving image";
854 return "sound recording-nonmusical";
856 return "sound recording-musical";
858 return "software, multimedia";
860 return "still image";
863 return "cartographic";
866 return "mixed material";
869 return "notated music";
871 return "three dimensional object";
876 function MARCTypeToFriendly(format) {
877 var words = $('format_words');
880 case 't' : return $n(words, 'at').innerHTML;
882 var node = $n(words,format);
883 if( node ) return node.innerHTML;
888 function setResourcePic( img, resource ) {
889 img.setAttribute( "src", "../../../../images/tor/" + resource + ".jpg");
890 img.title = resource;
895 function msg( text ) {
896 try { alert( text ); } catch(e) {}
899 function findRecord(id,type) {
901 for( var i = 0; i != recordsCache.length; i++ ) {
902 var rec = recordsCache[i];
903 if( rec && rec.doc_id() == id ) return rec;
906 var meth = FETCH_RMODS
907 if(type == 'M') meth = FETCH_MRMODS;
908 var req = new Request(meth, id);
909 req.request.alertEvent = false;
911 var res = req.result();
912 if( checkILSEvent(res) ) return null;
916 function Timer(name, node){
921 Timer.prototype.start =
922 function(){_timerRun(this.name);}
923 Timer.prototype.stop =
924 function(){this.done = true;}
925 function _timerRun(tname) {
929 if(_t.count > 100) return;
931 if( (_t.count % 5) == 0 )
933 _t.node.appendChild(text(str));
934 setTimeout("_timerRun('"+tname+"');", 200);
938 function checkILSEvent(obj) {
939 if( obj && obj.ilsevent != null && obj.ilsevent != 0 )
940 return parseInt(obj.ilsevent);
945 function alertILSEvent(evt, msg) {
948 alert(msg +'\n' + evt.textcode + '\n' + evt.desc );
950 alert(evt.textcode + '\n' + evt.desc );
955 function AuthTimer(time) {
956 this.time = (time - LOGOUT_WARNING_TIME) * 1000;
958 try {clearTimeout(__authTimer.id)} catch(e){}
962 AuthTimer.prototype.run = function() {
963 this.id = setTimeout('_authTimerAlert()', this.time);
966 function _authTimerAlert() {
967 alert( $('auth_session_expiring').innerHTML );
968 if(!grabUser(null, true)) doLogout();
972 function grabUserByBarcode( authtoken, barcode ) {
973 var req = new Request( FETCH_USER_BYBARCODE, authtoken, barcode );
980 goTo(buildOPACLink({page:HOME}));
984 function buildOrgSel(selector, org, offset) {
985 insertSelectorVal( selector, -1,
986 org.name(), org.id(), null, findOrgDepth(org) - offset );
987 for( var c in org.children() )
988 buildOrgSel( selector, org.children()[c], offset);
992 function parseForm(form) {
995 var it = form.replace(/-\w+$/,"");
1000 if(form.match(/-/)) itf = form.replace(/^\w+-/,"");
1004 for( var i = 0; i < it.length; i++ )
1005 item_type.push( it.charAt(i) );
1010 for( var i = 0; i < itf.length; i++ )
1011 item_form.push( itf.charAt(i) );
1014 return {item_type: item_type, item_form:item_form};
1018 function isTrue(x) { return ( x && x != "0" && !(x+'').match(/^f$/i) ); }
1020 function fetchPermOrgs() {
1021 var a = []; /* why does arguments come accross as an object and not an array? */
1022 for( var i = 0; i < arguments.length; i++ )
1023 a.push(arguments[i])
1025 var preq = new Request(FETCH_HIGHEST_PERM_ORG,
1026 G.user.session, G.user.id(), a );
1028 return preq.result();
1032 function print_tabs(t) {
1034 for (var j = 0; j < t; j++ ) { r = r + " "; }
1037 function formatJSON(s) {
1038 var r = ''; var t = 0;
1040 if (s[i] == '{' || s[i] == '[' ) {
1041 r = r + s[i] + "\n" + print_tabs(++t);
1042 } else if (s[i] == '}' || s[i] == ']') {
1043 t--; r = r + "\n" + print_tabs(t) + s[i];
1044 } else if (s[i] == ',') {
1045 r = r + s[i] + "\n" + print_tabs(t);