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 */
11 function Request(type) {
13 var s = type.split(":");
14 if(s[2] == "1" && isXUL()) s[1] += ".staff";
15 this.request = new RemoteRequest(s[0], s[1]);
18 for( var x = 1; x!= arguments.length; x++ ) {
20 this.request.addParam(arguments[x]);
25 for( var i = 0; i != p.length; i++ ) {
26 if( i > 0 ) str += ", "
29 _debug('request ' + s[0] + ' ' + s[1] + ' ' + str );
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();}
37 function showCanvas() {
38 for( var x in G.ui.altcanvas ) {
39 hideMe(G.ui.altcanvas[x]);
41 hideMe(G.ui.common.loading);
42 unHideMe(G.ui.common.canvas_main);
43 try{G.ui.searchbar.text.focus();}catch(e){}
46 function swapCanvas(newNode) {
47 for( var x in G.ui.altcanvas )
48 hideMe(G.ui.altcanvas[x]);
50 hideMe(G.ui.common.loading);
51 hideMe(G.ui.common.canvas_main);
55 /* finds the name of the current page */
56 var currentPage = null;
57 function findCurrentPage() {
58 if(currentPage) return currentPage;
61 for( var p in config.page ) pages.push(config.page[p]);
62 pages = pages.sort( function(a,b){ return - (a.length - b.length); } );
64 var path = location.pathname;
65 if(!path.match(/.*\.xml$/))
66 path += "index.xml"; /* in case they go to / */
69 for( var p in pages ) {
70 if( path.indexOf(pages[p]) != -1)
74 for( var p in config.page ) {
75 if(config.page[p] == page) {
84 /* sets all of the params values ----------------------------- */
85 function initParams() {
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);
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 = "";
130 function clearSearchParams() {
155 function initCookies() {
156 FONTSIZE = "regular";
157 var font = cookieManager.read(COOKIE_FONT);
159 if(font) FONTSIZE = font;
160 SKIN = cookieManager.read(COOKIE_SKIN);
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; }
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);
203 function findBaseURL(ssl) {
204 var path = findBasePath();
205 var proto = (ssl) ? "https:" : "http:";
206 return proto + "//" + location.host + path;
210 function buildISBNSrc(isbn) {
211 return "http://" + location.host + "/jackets/" + isbn;
215 function buildImageLink(name, ssl) {
216 return findBaseURL(ssl) + "../../../../images/" + name;
219 function buildExtrasLink(name, ssl) {
220 return findBaseURL(ssl) + "../../../../extras/" + name;
224 function _debug(str) {
225 try { dump('dbg: ' + str + '\n'); } catch(e) {}
227 /* potentially useful, but usually just annoying */
230 if(!consoleService) {
232 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
233 this.consoleService = Components.classes['@mozilla.org/consoleservice;1']
234 .getService(Components.interfaces.nsIConsoleService);
240 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
241 consoleService.logStringMessage(str + '\n');
248 function buildOPACLink(args, slim, ssl) {
254 string = findBaseURL(ssl);
255 if(args.page) string += config.page[args.page];
256 else string += config.page[findCurrentPage()];
261 for( var x in args ) {
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]);
274 string += "&" + x + "=" + encodeURIComponent(v);
279 string += _appendParam(DEBUG, PARAM_DEBUG, args, getDebug, string);
280 if(getOrigLocation() != 1)
281 string += _appendParam(ORIGLOC, PARAM_ORIGLOC, args, getOrigLocation, string);
283 string += _appendParam(TERM, PARAM_TERM, args, getTerm, string);
285 string += _appendParam(STYPE, PARAM_STYPE, args, getStype, string);
286 if(getLocation() != 1)
287 string += _appendParam(LOCATION, PARAM_LOCATION, args, getLocation, string);
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);
295 string += _appendParam(OFFSET, PARAM_OFFSET, args, getOffset, string);
296 if(getDisplayCount() != 10)
297 string += _appendParam(COUNT, PARAM_COUNT, args, getDisplayCount, string);
299 string += _appendParam(HITCOUNT, PARAM_HITCOUNT, args, getHitCount, string);
301 string += _appendParam(MRID, PARAM_MRID, args, getMrid, string);
303 string += _appendParam(RID, PARAM_RID, args, getRid, string);
305 string += _appendParam(AUTHTIME, PARAM_AUTHTIME, args, getAuthtime, string);
307 string += _appendParam(ADVTERM, PARAM_ADVTERM, args, getAdvTerm, string);
309 string += _appendParam(ADVTYPE, PARAM_ADVTYPE, args, getAdvType, string);
311 string += _appendParam(RTYPE, PARAM_RTYPE, args, getRtype, string);
313 string += _appendParam(ITEMFORM, PARAM_ITEMFORM, args, getItemForm, string);
315 string += _appendParam(ITEMTYPE, PARAM_ITEMTYPE, args, getItemType, string);
317 string += _appendParam(LITFORM, PARAM_LITFORM, args, getLitForm, string);
319 string += _appendParam(AUDIENCE, PARAM_AUDIENCE, args, getAudience, string);
321 string += _appendParam(SEARCHES, PARAM_SEARCHES, args, getSearches, string);
323 string += _appendParam(LANGUAGE, PARAM_LANGUAGE, args, getLanguage, string);
324 if(getRdepth() != null)
325 string += _appendParam(RDEPTH, PARAM_RDEPTH, args, getRdepth, string);
327 return string.replace(/\&$/,'').replace(/\?\&/,"?");
331 function _appendParam( fieldVar, fieldName, overrideArgs, getFunc, string ) {
336 if( fieldVar != null &&
337 (fieldVar +'' != 'NaN') &&
338 overrideArgs[fieldName] == null &&
342 ret = "&" + fieldName + "=" + encodeURIComponent(getFunc());
348 /* ----------------------------------------------------------------------- */
349 function cleanISBN(isbn) {
351 isbn = isbn.toString().replace(/^\s+/,"");
352 var idx = isbn.indexOf(" ");
353 if(idx > -1) { isbn = isbn.substring(0, idx); }
359 /* builds a link that goes to the title listings for a metarecord */
360 function buildTitleLink(rec, link) {
362 link.appendChild(text(normalize(truncate(rec.title(), 65))));
365 args[PARAM_OFFSET] = 0;
366 args[PARAM_MRID] = rec.doc_id();
367 args[PARAM_RTYPE] = RTYPE_MRID;
368 link.setAttribute("href", buildOPACLink(args));
371 function buildTitleDetailLink(rec, link) {
373 link.appendChild(text(normalize(truncate(rec.title(), 65))));
376 args[PARAM_OFFSET] = 0;
377 args[PARAM_RID] = rec.doc_id();
378 link.setAttribute("href", buildOPACLink(args));
381 /* 'type' is one of STYPE_AUTHOR, STYPE_SUBJECT, ... found in config.js
382 'trunc' is the number of characters to show in the string, defaults to 65 */
383 function buildSearchLink(type, string, linknode, trunc) {
384 if(!trunc) trunc = 65;
387 args[PARAM_OFFSET] = 0;
388 args[PARAM_TERM] = string;
389 args[PARAM_STYPE] = type;
390 linknode.appendChild(text(normalize(truncate(string, trunc))));
391 linknode.setAttribute("href", buildOPACLink(args));
395 /* ----------------------------------------------------------------------- */
396 /* user session handling */
397 /* ----------------------------------------------------------------------- */
398 /* session is the login session. If no session is provided, we attempt
399 to find one in the cookies. If 'force' is true we retrieve the
400 user from the server even if there is already a global user present.
401 if ses != G.user.session, we also force a grab */
402 function grabUser(ses, force) {
404 if(!ses && isXUL()) ses = xulG['authtoken'];
407 ses = cookieManager.read(COOKIE_SES);
408 /* https cookies don't show up in http servers.. */
411 if(!ses) return false;
414 if(G.user && G.user.session == ses)
417 /* first make sure the session is valid */
418 var request = new Request(FETCH_SESSION, ses, 1 );
419 request.request.alertEvent = false;
421 var user = request.result();
425 return false; /* unable to grab the session */
428 if( !(typeof user == 'object' && user._isfieldmapper) ) {
434 G.user.fleshed = false;
435 G.user.session = ses;
436 cookieManager.write(COOKIE_SES, ses, '+1d');
440 if(G.user.prefs['opac.hits_per_page'])
441 COUNT = parseInt(G.user.prefs['opac.hits_per_page']);
443 if(G.user.prefs[PREF_DEF_FONT])
444 setFontSize(G.user.prefs[PREF_DEF_FONT]);
446 var at = getAuthtime();
447 //if(isXUL()) at = xulG['authtime'];
449 if(at && !isXUL()) new AuthTimer(at).run();
454 /* sets the 'prefs' field of the user object to their preferences
455 and returns the preferences */
456 function grabUserPrefs(user, force) {
457 if(user == null) user = G.user;
458 if(!force && user.prefs) return user.prefs;
459 var req = new Request(FETCH_USER_PREFS, user.session, user.id());
461 user.prefs = req.result();
465 function grabFleshedUser() {
467 if(!G.user || !G.user.session) {
469 if(!G.user || !G.user.session) return null;
472 if(G.user.fleshed) return G.user;
474 var req = new Request(FETCH_FLESHED_USER, G.user.session);
477 G.user = req.result();
479 if(!G.user || G.user.length == 0) {
480 G.user = null; return false;
481 cookieManager.write(COOKIE_SES,"");
484 G.user.session = ses;
485 G.user.fleshed = true;
487 cookieManager.write(COOKIE_SES, ses, '+1y'); /* update the cookie */
491 function checkUserSkin(new_skin) {
493 return; /* XXX do some debugging with this... */
495 var user_skin = getSkin();
496 var cur_skin = grabSkinFromURL();
498 if(new_skin) user_skin = new_skin;
503 if(grabUserPrefs()) {
504 user_skin = G.user.prefs["opac.skin"];
505 cookieManager.write( COOKIE_SKIN, user_skin, '+1y' );
510 if(!user_skin) return;
512 if( cur_skin != user_skin ) {
513 var url = buildOPACLink();
514 goTo(url.replace(cur_skin, user_skin));
518 function updateUserSetting(setting, value, user) {
519 if(user == null) user = G.user;
522 var req = new Request( UPDATE_USER_PREFS, user.session, a );
527 function commitUserPrefs() {
528 var req = new Request(
529 UPDATE_USER_PREFS, G.user.session, null, G.user.prefs );
534 function grabSkinFromURL() {
535 var path = findBasePath();
536 path = path.replace("/xml/", "");
538 for( var i = path.length - 1; i >= 0; i-- ) {
539 var ch = path.charAt(i);
545 for( i = skin.length - 1; i >= 0; i--)
546 skin2 += skin.charAt(i);
552 /* returns a fleshed G.user on success, false on failure */
553 function doLogin(suppressEvents) {
557 var uname = G.ui.login.username.value;
558 var passwd = G.ui.login.password.value;
560 var init_request = new Request( LOGIN_INIT, uname );
561 init_request.send(true);
562 var seed = init_request.result();
564 if( ! seed || seed == '0') {
565 alert( "Error Communicating with Authentication Server" );
570 password : hex_md5(seed + hex_md5(passwd)),
572 org : getOrigLocation()
575 if( uname.match(REGEX_BARCODE) ) args.barcode = uname; /* make this better */
576 else args.username = uname;
578 var auth_request = new Request( LOGIN_COMPLETE, args );
580 auth_request.send(true);
581 var auth_result = auth_request.result();
582 if(!auth_result) return null;
584 AUTHTIME = parseInt(auth_result.payload.authtime);
585 var u = grabUser(auth_result.payload.authtoken, true);
586 if(u && ! suppressEvents)
587 runEvt( "common", "locationChanged", u.ws_ou(), findOrgDepth(u.ws_ou()) );
594 function doLogout(noredirect) {
596 /* cancel everything else */
599 /* be nice and delete the session from the server */
600 if(G.user && G.user.session) {
601 var req = new Request(LOGIN_DELETE, G.user.session);
603 try { req.result(); } catch(E){}
608 /* remove any cached data */
609 cookieManager.remove(COOKIE_IDS);
610 cookieManager.remove(COOKIE_SRIDS);
611 cookieManager.remove(COOKIE_RIDS);
612 cookieManager.remove(COOKIE_SES);
613 cookieManager.remove(COOKIE_SKIN);
615 checkUserSkin("default");
620 args[PARAM_TERM] = "";
621 args[PARAM_LOCATION] = globalOrgTree.id();
622 args[PARAM_DEPTH] = findOrgDepth(globalOrgTree);
627 try{ if(isFrontPage) nored = true; } catch(e){nored = false;}
628 if(!nored) goTo(buildOPACLink(args));
632 function hideMe(obj) { addCSSClass(obj, config.css.hide_me); }
633 function unHideMe(obj) { removeCSSClass(obj, config.css.hide_me); }
636 /* ----------------------------------------------------------------------- */
637 /* build the org tree */
638 /* ----------------------------------------------------------------------- */
639 function drawOrgTree() {
640 //setTimeout( 'buildOrgSelector(G.ui.common.org_tree, orgTreeSelector);', 10 );
641 setTimeout( 'buildOrgSelector(G.ui.common.org_tree, orgTreeSelector);', 1 );
645 function buildOrgSelector(node) {
646 var tree = new SlimTree(node,'orgTreeSelector');
647 orgTreeSelector = tree;
648 for( var i in orgArraySearcher ) {
649 var node = orgArraySearcher[i];
650 if( node == null ) continue;
651 if(node.parent_ou() == null)
652 tree.addNode(node.id(), -1, node.name(),
653 "javascript:orgSelect(" + node.id() + ");", node.name());
655 tree.addNode(node.id(), findOrgUnit(node.parent_ou()).id(), node.name(),
656 "javascript:orgSelect(" + node.id() + ");", node.name());
659 hideMe($('org_loading_div'));
660 unHideMe($('org_selector_tip'));
664 function orgSelect(id) {
666 runEvt("common", "locationChanged", id, findOrgDepth(id) );
668 removeChildren(G.ui.common.now_searching);
669 G.ui.common.now_searching.appendChild(text(findOrgUnit(id).name()));
672 function setFontSize(size) {
674 cookieManager.write(COOKIE_FONT, size, '+1y');
678 var resourceFormats = [
681 "sound recording", "software, multimedia",
686 "three dimensional object" ];
689 function modsFormatToMARC(format) {
695 case "sound recording":
697 case "sound recording-nonmusical":
699 case "sound recording-musical":
701 case "software, multimedia":
707 case "mixed material":
709 case "notated music":
711 case "three dimensional object":
718 function MARCFormatToMods(format) {
724 return "moving image";
726 return "sound recording-nonmusical";
728 return "sound recording-musical";
730 return "software, multimedia";
732 return "still images";
735 return "cartographic";
738 return "mixed material";
741 return "notated music";
743 return "three dimensional object";
748 function setResourcePic( img, resource ) {
749 img.setAttribute( "src", "../../../../images/tor/" + resource + ".jpg");
750 img.title = resource;
755 function msg( text ) {
756 try { alert( text ); } catch(e) {}
759 function findRecord(id,type) {
761 for( var i = 0; i != recordsCache.length; i++ ) {
762 var rec = recordsCache[i];
763 if( rec && rec.doc_id() == id ) return rec;
766 var meth = FETCH_RMODS
767 if(type == 'M') meth = FETCH_MRMODS;
768 var req = new Request(meth, id);
773 function Timer(name, node){
778 Timer.prototype.start =
779 function(){_timerRun(this.name);}
780 Timer.prototype.stop =
781 function(){this.done = true;}
782 function _timerRun(tname) {
786 if(_t.count > 100) return;
788 if( (_t.count % 5) == 0 )
790 _t.node.appendChild(text(str));
791 setTimeout("_timerRun('"+tname+"');", 200);
795 function checkILSEvent(obj) {
796 if( obj && obj.ilsevent != null && obj.ilsevent != 0 )
797 return parseInt(obj.ilsevent);
802 function alertILSEvent(code, msg) {
804 alert( msg + '\n' + $('ilsevent.' + code).innerHTML );
808 function alertILSEvent(evt, msg) {
810 alert(evt.textcode + '\n' + evt.desc );
815 function AuthTimer(time) {
816 this.time = (time - LOGOUT_WARNING_TIME) * 1000;
820 AuthTimer.prototype.run = function() {
821 setTimeout('_authTimerAlert()', this.time);
824 function _authTimerAlert() {
825 alert( $('auth_session_expiring').innerHTML );
826 if(!grabUser(null, true)) doLogout();
830 function grabUserByBarcode( authtoken, barcode ) {
831 var req = new Request( FETCH_USER_BYBARCODE, authtoken, barcode );
838 goTo(buildOPACLink({page:HOME}));
842 function buildOrgSel(selector, org, offset) {
843 insertSelectorVal( selector, -1,
844 org.name(), org.id(), null, findOrgDepth(org) - offset );
845 for( var c in org.children() )
846 buildOrgSel( selector, org.children()[c], offset);
850 function parseForm(form) {
853 var it = form.replace(/-\w+$/,"");
858 if(form.match(/-/)) itf = form.replace(/^\w+-/,"");
862 for( var i = 0; i < it.length; i++ )
863 item_type.push( it.charAt(i) );
868 for( var i = 0; i < itf.length; i++ )
869 item_form.push( itf.charAt(i) );
872 return {item_type: item_type, item_form:item_form};