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);
326 if(getSort() != null)
327 string += _appendParam(SORT, PARAM_SORT, args, getSort, string);
328 if(getSortDir() != null)
329 string += _appendParam(SORT_DIR, PARAM_SORT_DIR, args, getSortDir, string);
331 return string.replace(/\&$/,'').replace(/\?\&/,"?");
335 function _appendParam( fieldVar, fieldName, overrideArgs, getFunc, string ) {
340 if( fieldVar != null &&
341 (fieldVar +'' != 'NaN') &&
342 overrideArgs[fieldName] == null &&
346 ret = "&" + fieldName + "=" + encodeURIComponent(getFunc());
352 /* ----------------------------------------------------------------------- */
353 function cleanISBN(isbn) {
355 isbn = isbn.toString().replace(/^\s+/,"");
356 var idx = isbn.indexOf(" ");
357 if(idx > -1) { isbn = isbn.substring(0, idx); }
363 /* builds a link that goes to the title listings for a metarecord */
364 function buildTitleLink(rec, link) {
366 link.appendChild(text(normalize(truncate(rec.title(), 65))));
369 args[PARAM_OFFSET] = 0;
370 args[PARAM_MRID] = rec.doc_id();
371 args[PARAM_RTYPE] = RTYPE_MRID;
372 link.setAttribute("href", buildOPACLink(args));
375 function buildTitleDetailLink(rec, link) {
377 link.appendChild(text(normalize(truncate(rec.title(), 65))));
380 //args[PARAM_OFFSET] = 0;
381 args[PARAM_RID] = rec.doc_id();
382 link.setAttribute("href", buildOPACLink(args));
385 /* 'type' is one of STYPE_AUTHOR, STYPE_SUBJECT, ... found in config.js
386 'trunc' is the number of characters to show in the string, defaults to 65 */
387 function buildSearchLink(type, string, linknode, trunc) {
388 if(!trunc) trunc = 65;
391 args[PARAM_OFFSET] = 0;
392 args[PARAM_TERM] = string;
393 args[PARAM_STYPE] = type;
394 linknode.appendChild(text(normalize(truncate(string, trunc))));
395 linknode.setAttribute("href", buildOPACLink(args));
399 /* ----------------------------------------------------------------------- */
400 /* user session handling */
401 /* ----------------------------------------------------------------------- */
402 /* session is the login session. If no session is provided, we attempt
403 to find one in the cookies. If 'force' is true we retrieve the
404 user from the server even if there is already a global user present.
405 if ses != G.user.session, we also force a grab */
406 function grabUser(ses, force) {
408 if(!ses && isXUL()) ses = xulG['authtoken'];
411 ses = cookieManager.read(COOKIE_SES);
412 /* https cookies don't show up in http servers.. */
415 if(!ses) return false;
418 if(G.user && G.user.session == ses)
421 /* first make sure the session is valid */
422 var request = new Request(FETCH_SESSION, ses, 1 );
423 request.request.alertEvent = false;
425 var user = request.result();
429 return false; /* unable to grab the session */
432 if( !(typeof user == 'object' && user._isfieldmapper) ) {
438 G.user.fleshed = false;
439 G.user.session = ses;
440 cookieManager.write(COOKIE_SES, ses, '+1d');
444 if(G.user.prefs['opac.hits_per_page'])
445 COUNT = parseInt(G.user.prefs['opac.hits_per_page']);
447 if(G.user.prefs[PREF_DEF_FONT])
448 setFontSize(G.user.prefs[PREF_DEF_FONT]);
450 var at = getAuthtime();
451 //if(isXUL()) at = xulG['authtime'];
453 if(at && !isXUL()) new AuthTimer(at).run();
458 /* sets the 'prefs' field of the user object to their preferences
459 and returns the preferences */
460 function grabUserPrefs(user, force) {
461 if(user == null) user = G.user;
462 if(!force && user.prefs) return user.prefs;
463 var req = new Request(FETCH_USER_PREFS, user.session, user.id());
465 user.prefs = req.result();
469 function grabFleshedUser() {
471 if(!G.user || !G.user.session) {
473 if(!G.user || !G.user.session) return null;
476 if(G.user.fleshed) return G.user;
478 var req = new Request(FETCH_FLESHED_USER, G.user.session);
481 G.user = req.result();
483 if(!G.user || G.user.length == 0) {
484 G.user = null; return false;
485 cookieManager.write(COOKIE_SES,"");
488 G.user.session = ses;
489 G.user.fleshed = true;
491 cookieManager.write(COOKIE_SES, ses, '+1y'); /* update the cookie */
495 function checkUserSkin(new_skin) {
497 return; /* XXX do some debugging with this... */
499 var user_skin = getSkin();
500 var cur_skin = grabSkinFromURL();
502 if(new_skin) user_skin = new_skin;
507 if(grabUserPrefs()) {
508 user_skin = G.user.prefs["opac.skin"];
509 cookieManager.write( COOKIE_SKIN, user_skin, '+1y' );
514 if(!user_skin) return;
516 if( cur_skin != user_skin ) {
517 var url = buildOPACLink();
518 goTo(url.replace(cur_skin, user_skin));
522 function updateUserSetting(setting, value, user) {
523 if(user == null) user = G.user;
526 var req = new Request( UPDATE_USER_PREFS, user.session, a );
531 function commitUserPrefs() {
532 var req = new Request(
533 UPDATE_USER_PREFS, G.user.session, null, G.user.prefs );
538 function grabSkinFromURL() {
539 var path = findBasePath();
540 path = path.replace("/xml/", "");
542 for( var i = path.length - 1; i >= 0; i-- ) {
543 var ch = path.charAt(i);
549 for( i = skin.length - 1; i >= 0; i--)
550 skin2 += skin.charAt(i);
556 /* returns a fleshed G.user on success, false on failure */
557 function doLogin(suppressEvents) {
561 var uname = G.ui.login.username.value;
562 var passwd = G.ui.login.password.value;
564 var init_request = new Request( LOGIN_INIT, uname );
565 init_request.send(true);
566 var seed = init_request.result();
568 if( ! seed || seed == '0') {
569 alert( "Error Communicating with Authentication Server" );
574 password : hex_md5(seed + hex_md5(passwd)),
576 org : getOrigLocation()
579 if( uname.match(REGEX_BARCODE) ) args.barcode = uname; /* make this better */
580 else args.username = uname;
582 var auth_request = new Request( LOGIN_COMPLETE, args );
584 auth_request.send(true);
585 var auth_result = auth_request.result();
586 if(!auth_result) return null;
588 AUTHTIME = parseInt(auth_result.payload.authtime);
589 var u = grabUser(auth_result.payload.authtoken, true);
590 if(u && ! suppressEvents)
591 runEvt( "common", "locationChanged", u.ws_ou(), findOrgDepth(u.ws_ou()) );
598 function doLogout(noredirect) {
600 /* cancel everything else */
603 /* be nice and delete the session from the server */
604 if(G.user && G.user.session) {
605 var req = new Request(LOGIN_DELETE, G.user.session);
607 try { req.result(); } catch(E){}
612 /* remove any cached data */
613 //cookieManager.remove(COOKIE_IDS);
614 //cookieManager.remove(COOKIE_SRIDS);
615 cookieManager.remove(COOKIE_RIDS);
616 cookieManager.remove(COOKIE_SES);
617 cookieManager.remove(COOKIE_SKIN);
619 checkUserSkin("default");
624 args[PARAM_TERM] = "";
625 args[PARAM_LOCATION] = globalOrgTree.id();
626 args[PARAM_DEPTH] = findOrgDepth(globalOrgTree);
631 try{ if(isFrontPage) nored = true; } catch(e){nored = false;}
632 if(!nored) goTo(buildOPACLink(args));
636 function hideMe(obj) { addCSSClass(obj, config.css.hide_me); }
637 function unHideMe(obj) { removeCSSClass(obj, config.css.hide_me); }
640 /* ----------------------------------------------------------------------- */
641 /* build the org tree */
642 /* ----------------------------------------------------------------------- */
643 function drawOrgTree() {
644 //setTimeout( 'buildOrgSelector(G.ui.common.org_tree, orgTreeSelector);', 10 );
645 setTimeout( 'buildOrgSelector(G.ui.common.org_tree, orgTreeSelector);', 1 );
649 function buildOrgSelector(node) {
650 var tree = new SlimTree(node,'orgTreeSelector');
651 orgTreeSelector = tree;
652 for( var i in orgArraySearcher ) {
653 var node = orgArraySearcher[i];
654 if( node == null ) continue;
655 if(node.parent_ou() == null)
656 tree.addNode(node.id(), -1, node.name(),
657 "javascript:orgSelect(" + node.id() + ");", node.name());
659 tree.addNode(node.id(), findOrgUnit(node.parent_ou()).id(), node.name(),
660 "javascript:orgSelect(" + node.id() + ");", node.name());
663 hideMe($('org_loading_div'));
664 unHideMe($('org_selector_tip'));
668 function orgSelect(id) {
670 runEvt("common", "locationChanged", id, findOrgDepth(id) );
672 removeChildren(G.ui.common.now_searching);
673 G.ui.common.now_searching.appendChild(text(findOrgUnit(id).name()));
676 function setFontSize(size) {
678 cookieManager.write(COOKIE_FONT, size, '+1y');
682 var resourceFormats = [
685 "sound recording", "software, multimedia",
690 "three dimensional object" ];
693 function modsFormatToMARC(format) {
699 case "sound recording":
701 case "sound recording-nonmusical":
703 case "sound recording-musical":
705 case "software, multimedia":
711 case "mixed material":
713 case "notated music":
715 case "three dimensional object":
722 function MARCFormatToMods(format) {
728 return "moving image";
730 return "sound recording-nonmusical";
732 return "sound recording-musical";
734 return "software, multimedia";
736 return "still images";
739 return "cartographic";
742 return "mixed material";
745 return "notated music";
747 return "three dimensional object";
752 function MARCTypeToFriendly(format) {
753 var words = $('format_words');
756 case 't' : return $n(words, 'at').innerHTML;
758 var node = $n(words,format);
759 if( node ) return node.innerHTML;
764 function setResourcePic( img, resource ) {
765 img.setAttribute( "src", "../../../../images/tor/" + resource + ".jpg");
766 img.title = resource;
771 function msg( text ) {
772 try { alert( text ); } catch(e) {}
775 function findRecord(id,type) {
777 for( var i = 0; i != recordsCache.length; i++ ) {
778 var rec = recordsCache[i];
779 if( rec && rec.doc_id() == id ) return rec;
782 var meth = FETCH_RMODS
783 if(type == 'M') meth = FETCH_MRMODS;
784 var req = new Request(meth, id);
789 function Timer(name, node){
794 Timer.prototype.start =
795 function(){_timerRun(this.name);}
796 Timer.prototype.stop =
797 function(){this.done = true;}
798 function _timerRun(tname) {
802 if(_t.count > 100) return;
804 if( (_t.count % 5) == 0 )
806 _t.node.appendChild(text(str));
807 setTimeout("_timerRun('"+tname+"');", 200);
811 function checkILSEvent(obj) {
812 if( obj && obj.ilsevent != null && obj.ilsevent != 0 )
813 return parseInt(obj.ilsevent);
818 function alertILSEvent(code, msg) {
820 alert( msg + '\n' + $('ilsevent.' + code).innerHTML );
824 function alertILSEvent(evt, msg) {
826 alert(evt.textcode + '\n' + evt.desc );
831 function AuthTimer(time) {
832 this.time = (time - LOGOUT_WARNING_TIME) * 1000;
836 AuthTimer.prototype.run = function() {
837 setTimeout('_authTimerAlert()', this.time);
840 function _authTimerAlert() {
841 alert( $('auth_session_expiring').innerHTML );
842 if(!grabUser(null, true)) doLogout();
846 function grabUserByBarcode( authtoken, barcode ) {
847 var req = new Request( FETCH_USER_BYBARCODE, authtoken, barcode );
854 goTo(buildOPACLink({page:HOME}));
858 function buildOrgSel(selector, org, offset) {
859 insertSelectorVal( selector, -1,
860 org.name(), org.id(), null, findOrgDepth(org) - offset );
861 for( var c in org.children() )
862 buildOrgSel( selector, org.children()[c], offset);
866 function parseForm(form) {
869 var it = form.replace(/-\w+$/,"");
874 if(form.match(/-/)) itf = form.replace(/^\w+-/,"");
878 for( var i = 0; i < it.length; i++ )
879 item_type.push( it.charAt(i) );
884 for( var i = 0; i < itf.length; i++ )
885 item_form.push( itf.charAt(i) );
888 return {item_type: item_type, item_form:item_form};