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);
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 = "";
127 function clearSearchParams() {
151 function initCookies() {
152 FONTSIZE = "regular";
153 var font = cookieManager.read(COOKIE_FONT);
155 if(font) FONTSIZE = font;
156 SKIN = cookieManager.read(COOKIE_SKIN);
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; }
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);
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 );
205 function buildISBNSrc(isbn) {
206 return "http://" + location.host + "/jackets/" + isbn;
210 function buildImageLink(name, ssl) {
211 return findBaseURL(ssl) + "../../../../images/" + name;
214 function buildExtrasLink(name, ssl) {
215 return findBaseURL(ssl) + "../../../../extras/" + name;
219 function _debug(str) {
220 try { dump('dbg: ' + str + '\n'); } catch(e) {}
222 /* potentially useful, but usually just annoying */
225 if(!consoleService) {
227 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
228 this.consoleService = Components.classes['@mozilla.org/consoleservice;1']
229 .getService(Components.interfaces.nsIConsoleService);
235 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
236 consoleService.logStringMessage(str + '\n');
243 function buildOPACLink(args, slim, ssl) {
249 string = findBaseURL(ssl);
250 if(args.page) string += config.page[args.page];
251 else string += config.page[findCurrentPage()];
256 for( var x in args ) {
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]);
269 string += "&" + x + "=" + encodeURIComponent(v);
274 string += _appendParam(DEBUG, PARAM_DEBUG, args, getDebug, string);
275 if(getOrigLocation() != 1)
276 string += _appendParam(ORIGLOC, PARAM_ORIGLOC, args, getOrigLocation, string);
278 string += _appendParam(TERM, PARAM_TERM, args, getTerm, string);
280 string += _appendParam(STYPE, PARAM_STYPE, args, getStype, string);
281 if(getLocation() != 1)
282 string += _appendParam(LOCATION, PARAM_LOCATION, args, getLocation, string);
284 string += _appendParam(DEPTH, PARAM_DEPTH, args, getDepth, string);
285 if(getForm() && (getForm() != 'all') )
286 string += _appendParam(FORM, PARAM_FORM, args, getForm, string);
288 string += _appendParam(OFFSET, PARAM_OFFSET, args, getOffset, string);
289 if(getDisplayCount() != 10)
290 string += _appendParam(COUNT, PARAM_COUNT, args, getDisplayCount, string);
292 string += _appendParam(HITCOUNT, PARAM_HITCOUNT, args, getHitCount, string);
294 string += _appendParam(MRID, PARAM_MRID, args, getMrid, string);
296 string += _appendParam(RID, PARAM_RID, args, getRid, string);
298 string += _appendParam(AUTHTIME, PARAM_AUTHTIME, args, getAuthtime, string);
300 string += _appendParam(ADVTERM, PARAM_ADVTERM, args, getAdvTerm, string);
302 string += _appendParam(ADVTYPE, PARAM_ADVTYPE, args, getAdvType, string);
304 string += _appendParam(RTYPE, PARAM_RTYPE, args, getRtype, string);
306 string += _appendParam(ITEMFORM, PARAM_ITEMFORM, args, getItemForm, string);
308 string += _appendParam(ITEMTYPE, PARAM_ITEMTYPE, args, getItemType, string);
310 string += _appendParam(LITFORM, PARAM_LITFORM, args, getLitForm, string);
312 string += _appendParam(AUDIENCE, PARAM_AUDIENCE, args, getAudience, string);
314 string += _appendParam(SEARCHES, PARAM_SEARCHES, args, getSearches, string);
316 string += _appendParam(LANGUAGE, PARAM_LANGUAGE, args, getLanguage, string);
318 return string.replace(/\&$/,'').replace(/\?\&/,"?");
321 function _appendParam( fieldVar, fieldName, overrideArgs, getFunc, string ) {
323 if( fieldVar != null && (fieldVar +'' != 'NaN') && overrideArgs[fieldName] == null )
324 ret = "&" + fieldName + "=" + encodeURIComponent(getFunc());
328 /* ----------------------------------------------------------------------- */
329 function cleanISBN(isbn) {
331 isbn = isbn.toString().replace(/^\s+/,"");
332 var idx = isbn.indexOf(" ");
333 if(idx > -1) { isbn = isbn.substring(0, idx); }
339 /* builds a link that goes to the title listings for a metarecord */
340 function buildTitleLink(rec, link) {
342 link.appendChild(text(normalize(truncate(rec.title(), 65))));
345 args[PARAM_OFFSET] = 0;
346 args[PARAM_MRID] = rec.doc_id();
347 args[PARAM_RTYPE] = RTYPE_MRID;
348 link.setAttribute("href", buildOPACLink(args));
351 function buildTitleDetailLink(rec, link) {
353 link.appendChild(text(normalize(truncate(rec.title(), 65))));
356 args[PARAM_OFFSET] = 0;
357 args[PARAM_RID] = rec.doc_id();
358 link.setAttribute("href", buildOPACLink(args));
361 /* 'type' is one of STYPE_AUTHOR, STYPE_SUBJECT, ... found in config.js
362 'trunc' is the number of characters to show in the string, defaults to 65 */
363 function buildSearchLink(type, string, linknode, trunc) {
364 if(!trunc) trunc = 65;
367 args[PARAM_OFFSET] = 0;
368 args[PARAM_TERM] = string;
369 args[PARAM_STYPE] = type;
370 linknode.appendChild(text(normalize(truncate(string, trunc))));
371 linknode.setAttribute("href", buildOPACLink(args));
375 /* ----------------------------------------------------------------------- */
376 /* user session handling */
377 /* ----------------------------------------------------------------------- */
378 /* session is the login session. If no session is provided, we attempt
379 to find one in the cookies. If 'force' is true we retrieve the
380 user from the server even if there is already a global user present.
381 if ses != G.user.session, we also force a grab */
382 function grabUser(ses, force) {
384 if(!ses && isXUL()) ses = xulG['authtoken'];
387 ses = cookieManager.read(COOKIE_SES);
388 /* https cookies don't show up in http servers.. */
391 if(!ses) return false;
394 if(G.user && G.user.session == ses)
397 /* first make sure the session is valid */
398 var request = new Request(FETCH_SESSION, ses, 1 );
400 var user = request.result();
402 if(checkILSEvent(user)) {
405 return false; /* unable to grab the session */
408 if( !(typeof user == 'object' && user._isfieldmapper) ) {
414 G.user.fleshed = false;
415 G.user.session = ses;
416 cookieManager.write(COOKIE_SES, ses, '+1d');
419 if(G.user.prefs['opac.hits_per_page'])
420 COUNT = parseInt(G.user.prefs['opac.hits_per_page']);
422 if(G.user.prefs[PREF_DEF_FONT])
423 setFontSize(G.user.prefs[PREF_DEF_FONT]);
425 var at = getAuthtime();
426 //if(isXUL()) at = xulG['authtime'];
428 if(at && !isXUL()) new AuthTimer(at).run();
433 /* sets the 'prefs' field of the user object to their preferences
434 and returns the preferences */
435 function grabUserPrefs(user, force) {
436 if(user == null) user = G.user;
437 if(!force && user.prefs) return user.prefs;
438 var req = new Request(FETCH_USER_PREFS, user.session, user.id());
440 user.prefs = req.result();
444 function grabFleshedUser() {
446 if(!G.user || !G.user.session) {
448 if(!G.user || !G.user.session) return null;
451 if(G.user.fleshed) return G.user;
453 var req = new Request(FETCH_FLESHED_USER, G.user.session);
456 G.user = req.result();
458 if(!G.user || G.user.length == 0) {
459 G.user = null; return false;
460 cookieManager.write(COOKIE_SES,"");
463 G.user.session = ses;
464 G.user.fleshed = true;
466 cookieManager.write(COOKIE_SES, ses, '+1y'); /* update the cookie */
470 function checkUserSkin(new_skin) {
472 return; /* XXX do some debugging with this... */
474 var user_skin = getSkin();
475 var cur_skin = grabSkinFromURL();
477 if(new_skin) user_skin = new_skin;
482 if(grabUserPrefs()) {
483 user_skin = G.user.prefs["opac.skin"];
484 cookieManager.write( COOKIE_SKIN, user_skin, '+1y' );
489 if(!user_skin) return;
491 if( cur_skin != user_skin ) {
492 var url = buildOPACLink();
493 goTo(url.replace(cur_skin, user_skin));
497 function updateUserSetting(setting, value, user) {
498 if(user == null) user = G.user;
501 var req = new Request( UPDATE_USER_PREFS, user.session, a );
506 function commitUserPrefs() {
507 var req = new Request(
508 UPDATE_USER_PREFS, G.user.session, null, G.user.prefs );
513 function grabSkinFromURL() {
514 var path = findBasePath();
515 path = path.replace("/xml/", "");
517 for( var i = path.length - 1; i >= 0; i-- ) {
518 var ch = path.charAt(i);
524 for( i = skin.length - 1; i >= 0; i--)
525 skin2 += skin.charAt(i);
531 /* returns a fleshed G.user on success, false on failure */
536 var uname = G.ui.login.username.value;
537 var passwd = G.ui.login.password.value;
539 var init_request = new Request( LOGIN_INIT, uname );
540 init_request.send(true);
541 var seed = init_request.result();
543 if( ! seed || seed == '0') {
544 alert( "Error Communicating with Authentication Server" );
549 password : hex_md5(seed + hex_md5(passwd)),
551 org : getOrigLocation()
554 if( uname.match(REGEX_BARCODE) ) args.barcode = uname; /* make this better */
555 else args.username = uname;
557 var auth_request = new Request( LOGIN_COMPLETE, args );
559 auth_request.send(true);
560 var auth_result = auth_request.result();
562 var code = checkILSEvent(auth_result);
563 if(code) { alertILSEvent(auth_result); return null; }
565 AUTHTIME = parseInt(auth_result.payload.authtime);
566 var u = grabUser(auth_result.payload.authtoken, true);
567 if(u) runEvt( "common", "locationChanged", u.home_ou(), findOrgDepth(u.home_ou()) );
574 function doLogout(noredirect) {
576 /* cancel everything else */
579 /* be nice and delete the session from the server */
580 if(G.user && G.user.session) {
581 var req = new Request(LOGIN_DELETE, G.user.session);
583 try { req.result(); } catch(E){}
587 cookieManager.write(COOKIE_SES, "");
588 cookieManager.write(COOKIE_SKIN, "");
589 checkUserSkin("default");
593 args[PARAM_TERM] = "";
594 args[PARAM_LOCATION] = globalOrgTree.id();
595 args[PARAM_DEPTH] = findOrgDepth(globalOrgTree);
599 try{ if(isFrontPage) nored = true; } catch(e){nored = false;}
600 if(!nored) goTo(buildOPACLink(args));
604 function hideMe(obj) { addCSSClass(obj, config.css.hide_me); }
605 function unHideMe(obj) { removeCSSClass(obj, config.css.hide_me); }
608 /* ----------------------------------------------------------------------- */
609 /* build the org tree */
610 /* ----------------------------------------------------------------------- */
611 function drawOrgTree() {
612 //setTimeout( 'buildOrgSelector(G.ui.common.org_tree, orgTreeSelector);', 10 );
613 setTimeout( 'buildOrgSelector(G.ui.common.org_tree, orgTreeSelector);', 1 );
617 function buildOrgSelector(node) {
618 var tree = new SlimTree(node,'orgTreeSelector');
619 orgTreeSelector = tree;
620 for( var i in orgArraySearcher ) {
621 var node = orgArraySearcher[i];
622 if( node == null ) continue;
623 if(node.parent_ou() == null)
624 tree.addNode(node.id(), -1, node.name(),
625 "javascript:orgSelect(" + node.id() + ");", node.name());
627 tree.addNode(node.id(), findOrgUnit(node.parent_ou()).id(), node.name(),
628 "javascript:orgSelect(" + node.id() + ");", node.name());
631 hideMe($('org_loading_div'));
632 unHideMe($('org_selector_tip'));
636 function orgSelect(id) {
638 runEvt("common", "locationChanged", id, findOrgDepth(id) );
640 removeChildren(G.ui.common.now_searching);
641 G.ui.common.now_searching.appendChild(text(findOrgUnit(id).name()));
644 //var fontCookie = new HTTP.Cookies();
646 function setFontSize(size) {
648 cookieManager.write(COOKIE_FONT, size, '+1y');
652 var resourceFormats = [
655 "sound recording", "software, multimedia",
660 "three dimensional object" ];
663 function modsFormatToMARC(format) {
669 case "sound recording":
671 case "sound recording-nonmusical":
673 case "sound recording-musical":
675 case "software, multimedia":
681 case "mixed material":
683 case "notated music":
685 case "three dimensional object":
692 function MARCFormatToMods(format) {
698 return "moving image";
700 return "sound recording-nonmusical";
702 return "sound recording-musical";
704 return "software, multimedia";
706 return "still images";
709 return "cartographic";
712 return "mixed material";
715 return "notated music";
717 return "three dimensional object";
722 function setResourcePic( img, resource ) {
723 img.setAttribute( "src", "../../../../images/tor/" + resource + ".jpg");
724 img.title = resource;
729 function msg( text ) {
730 try { alert( text ); } catch(e) {}
733 function findRecord(id,type) {
735 for( var i = 0; i != recordsCache.length; i++ ) {
736 var rec = recordsCache[i];
737 if( rec && rec.doc_id() == id ) return rec;
740 var meth = FETCH_RMODS
741 if(type == 'M') meth = FETCH_MRMODS;
742 var req = new Request(meth, id);
747 function Timer(name, node){
752 Timer.prototype.start =
753 function(){_timerRun(this.name);}
754 Timer.prototype.stop =
755 function(){this.done = true;}
756 function _timerRun(tname) {
760 if(_t.count > 100) return;
762 if( (_t.count % 5) == 0 )
764 _t.node.appendChild(text(str));
765 setTimeout("_timerRun('"+tname+"');", 200);
769 function checkILSEvent(obj) {
770 if( obj.ilsevent != null && obj.ilsevent != 0 )
771 return parseInt(obj.ilsevent);
776 function alertILSEvent(code, msg) {
778 alert( msg + '\n' + $('ilsevent.' + code).innerHTML );
782 function alertILSEvent(evt, msg) {
784 alert( msg + '\n' + evt.desc );
789 function AuthTimer(time) {
790 this.time = (time - LOGOUT_WARNING_TIME) * 1000;
794 AuthTimer.prototype.run = function() {
795 setTimeout('_authTimerAlert()', this.time);
798 function _authTimerAlert() {
799 alert( $('auth_session_expiring').innerHTML );
800 if(!grabUser(null, true)) doLogout();
804 function grabUserByBarcode( authtoken, barcode ) {
805 var req = new Request( FETCH_USER_BYBARCODE, authtoken, barcode );
812 goTo(buildOPACLink({page:HOME}));
816 function buildOrgSel(selector, org, offset) {
817 insertSelectorVal( selector, -1,
818 org.name(), org.id(), null, findOrgDepth(org) - offset );
819 for( var c in org.children() )
820 buildOrgSel( selector, org.children()[c], offset);
824 function parseForm(form) {
827 var it = form.replace(/-\w+$/,"");
832 if(form.match(/-/)) itf = form.replace(/^\w+-/,"");
836 for( var i = 0; i < it.length; i++ )
837 item_type.push( it.charAt(i) );
842 for( var i = 0; i < itf.length; i++ )
843 item_form.push( itf.charAt(i) );
846 return {item_type: item_type, item_form:item_form};