--- /dev/null
+/* - Request ------------------------------------------------------------- */
+
+
+/* define it again here for pages that don't load RemoteRequest */
+function isXUL() { try { if(IAMXUL) return true;}catch(e){return false;}; }
+
+
+var __ilsEvent; /* the last event the occurred */
+
+var DEBUGSLIM;
+function Request(type) {
+
+ var s = type.split(":");
+ if(s[2] == "1" && isXUL()) s[1] += ".staff";
+ this.request = new RemoteRequest(s[0], s[1]);
+ var p = [];
+
+ if(isXUL()) {
+ if(!location.href.match(/^https:/))
+ this.request.setSecure(false);
+
+ } else {
+
+ if( G.user && G.user.session ) {
+ /* if the user is logged in, all activity resets the timeout
+ This is not entirely accurate in the sense that not all
+ requests will reset the server timeout - this should
+ get close enough, however.
+ */
+ var at = getAuthtime();
+ if(at) new AuthTimer(at).run();
+ }
+ }
+
+ for( var x = 1; x!= arguments.length; x++ ) {
+ p.push(arguments[x]);
+ this.request.addParam(arguments[x]);
+ }
+
+ if( getDebug() ) {
+ var str = "";
+ for( var i = 0; i != p.length; i++ ) {
+ if( i > 0 ) str += ", "
+ str += js2JSON(p[i]);
+ }
+ _debug('request ' + s[0] + ' ' + s[1] + ' ' + str );
+
+ } else if( DEBUGSLIM ) {
+ _debug('request ' + s[1]);
+ }
+}
+
+Request.prototype.callback = function(cal) {this.request.setCompleteCallback(cal);}
+Request.prototype.send = function(block){this.request.send(block);}
+Request.prototype.result = function(){return this.request.getResultObject();}
+
+function showCanvas() {
+ for( var x in G.ui.altcanvas ) {
+ hideMe(G.ui.altcanvas[x]);
+ }
+ hideMe(G.ui.common.loading);
+ unHideMe(G.ui.common.canvas_main);
+ try{G.ui.searchbar.text.focus();}catch(e){}
+}
+
+function swapCanvas(newNode) {
+ for( var x in G.ui.altcanvas )
+ hideMe(G.ui.altcanvas[x]);
+
+ hideMe(G.ui.common.loading);
+ hideMe(G.ui.common.canvas_main);
+ unHideMe(newNode);
+}
+
+/* finds the name of the current page */
+var currentPage = null;
+function findCurrentPage() {
+ if(currentPage) return currentPage;
+
+ var pages = [];
+ for( var p in config.page ) pages.push(config.page[p]);
+ pages = pages.sort( function(a,b){ return - (a.length - b.length); } );
+
+ var path = location.pathname;
+ if(!path.match(/.*\.xml$/))
+ path += "index.xml"; /* in case they go to / */
+
+ var page = null;
+ for( var p = 0; p < pages.length; p++ ) {
+ if( path.indexOf(pages[p]) != -1)
+ page = pages[p];
+ }
+
+ for( var p in config.page ) {
+ if(config.page[p] == page) {
+ currentPage = p;
+ return p;
+ }
+ }
+ return null;
+}
+
+
+/* sets all of the params values ----------------------------- */
+function initParams() {
+ var cgi = new CGI();
+
+ /* handle the location var */
+ var org;
+ var loc = cgi.param(PARAM_LOCATION);
+ var lasso = cgi.param(PARAM_LASSO);
+
+ if ( lasso ) {
+ lasso = findOrgLasso( lasso );
+ LASSO = lasso ? lasso.id() : null;
+ }
+
+ if (loc) {
+ org = findOrgUnit(loc);
+ LOCATION = org ? org.id() : null;
+
+ if ( !LOCATION ){
+ org = findOrgUnit(loc);
+ LOCATION = org ? org.id() : null;
+ }
+ }
+
+ org = null;
+ loc = cgi.param(PARAM_ORIGLOC);
+ if( loc ) {
+ org = findOrgUnit(loc);
+ if(!org) org = findOrgUnitSN(loc);
+ }
+ ORIGLOC = (org) ? org.id() : null;
+
+
+ DEPTH = parseInt(cgi.param(PARAM_DEPTH));
+ if(isNaN(DEPTH)) DEPTH = null;
+
+
+ FACET = cgi.param(PARAM_FACET);
+ TERM = cgi.param(PARAM_TERM);
+ STYPE = cgi.param(PARAM_STYPE);
+ FORM = cgi.param(PARAM_FORM);
+ //DEPTH = parseInt(cgi.param(PARAM_DEPTH));
+ OFFSET = parseInt(cgi.param(PARAM_OFFSET));
+ COUNT = parseInt(cgi.param(PARAM_COUNT));
+ HITCOUNT = parseInt(cgi.param(PARAM_HITCOUNT));
+ MRID = parseInt(cgi.param(PARAM_MRID));
+ RID = parseInt(cgi.param(PARAM_RID));
+ AUTHTIME = parseInt(cgi.param(PARAM_AUTHTIME));
+ ADVTERM = cgi.param(PARAM_ADVTERM);
+ ADVTYPE = cgi.param(PARAM_ADVTYPE);
+ RTYPE = cgi.param(PARAM_RTYPE);
+ SORT = cgi.param(PARAM_SORT);
+ SORT_DIR = cgi.param(PARAM_SORT_DIR);
+ DEBUG = cgi.param(PARAM_DEBUG);
+ CALLNUM = cgi.param(PARAM_CN);
+ LITFORM = cgi.param(PARAM_LITFORM);
+ ITEMFORM = cgi.param(PARAM_ITEMFORM);
+ ITEMTYPE = cgi.param(PARAM_ITEMTYPE);
+ BIBLEVEL = cgi.param(PARAM_BIBLEVEL);
+ AUDIENCE = cgi.param(PARAM_AUDIENCE);
+ SEARCHES = cgi.param(PARAM_SEARCHES);
+ LANGUAGE = cgi.param(PARAM_LANGUAGE);
+ TFORM = cgi.param(PARAM_TFORM);
+ RDEPTH = cgi.param(PARAM_RDEPTH);
+ AVAIL = cgi.param(PARAM_AVAIL);
+ COPYLOCS = cgi.param(PARAM_COPYLOCS);
+ PUBD_BEFORE = cgi.param(PARAM_PUBD_BEFORE);
+ PUBD_AFTER = cgi.param(PARAM_PUBD_AFTER);
+ PUBD_BETWEEN = cgi.param(PARAM_PUBD_BETWEEN);
+ PUBD_DURING = cgi.param(PARAM_PUBD_DURING);
+
+
+ /* set up some sane defaults */
+ //if(isNaN(DEPTH)) DEPTH = 0;
+ if(isNaN(RDEPTH)) RDEPTH = 0;
+ if(isNaN(OFFSET)) OFFSET = 0;
+ if(isNaN(COUNT)) COUNT = 10;
+ if(isNaN(HITCOUNT)) HITCOUNT = 0;
+ if(isNaN(MRID)) MRID = 0;
+ if(isNaN(RID)) RID = 0;
+ if(isNaN(ORIGLOC)) ORIGLOC = 0; /* so we know it hasn't been set */
+ if(isNaN(AUTHTIME)) AUTHTIME = 0;
+ if(ADVTERM==null) ADVTERM = "";
+ if(isNaN(AVAIL)) AVAIL = 0;
+}
+
+function clearSearchParams() {
+ TERM = null;
+ STYPE = null;
+ FORM = null;
+ OFFSET = 0;
+ HITCOUNT = 0;
+ ADVTERM = null;
+ ADVTYPE = null;
+ MRID = null;
+ RID = null;
+ RTYPE = null;
+ SORT = null;
+ SORT_DIR = null;
+ RLIST = null;
+ CALLNUM = null;
+ LITFORM = null;
+ ITEMFORM = null;
+ ITEMTYPE = null;
+ BIBLEVEL = null;
+ AUDIENCE = null;
+ SEARCHES = null;
+ LANGUAGE = null;
+ RDEPTH = null;
+ AVAIL = null;
+ COPYLOCS = null;
+ PUBD_BEFORE = null;
+ PUBD_AFTER = null;
+ PUBD_BETWEEN = null;
+ PUBD_DURING = null;
+}
+
+
+function initCookies() {
+ dojo.require('dojo.cookie');
+ FONTSIZE = "regular";
+ var font = dojo.cookie(COOKIE_FONT);
+ scaleFonts(font);
+ if(font) FONTSIZE = font;
+ SKIN = dojo.cookie(COOKIE_SKIN);
+ if(findCurrentPage() == HOME)
+ dojo.cookie(COOKIE_SEARCH,null,{'expires':-1});
+}
+
+/* URL param accessors */
+function getTerm(){return TERM;}
+function getFacet(){return FACET;}
+function getStype(){return STYPE;}
+function getLocation(){return LOCATION;}
+function getLasso(){return LASSO;}
+function getDepth(){return DEPTH;}
+function getForm(){return FORM;}
+function getTform(){return TFORM;}
+function getOffset(){return OFFSET;}
+function getDisplayCount(){return COUNT;}
+function getHitCount(){return HITCOUNT;}
+function getMrid(){return MRID;};
+function getRid(){return RID;};
+function getOrigLocation(){return ORIGLOC;}
+function getAuthtime() { return AUTHTIME; }
+function getSearchBarExtras(){return SBEXTRAS;}
+function getFontSize(){return FONTSIZE;};
+function getSkin(){return SKIN;};
+function getAdvTerm(){return ADVTERM;}
+function getAdvType(){return ADVTYPE;}
+function getRtype(){return RTYPE;}
+function getSort(){return SORT;}
+function getSortDir(){return SORT_DIR;}
+function getDebug(){return DEBUG;}
+function getCallnumber() { return CALLNUM; }
+function getLitForm() { return LITFORM; }
+function getItemForm() { return ITEMFORM; }
+function getItemType() { return ITEMTYPE; }
+function getBibLevel() { return BIBLEVEL; }
+function getAudience() { return AUDIENCE; }
+function getSearches() { return SEARCHES; }
+function getLanguage() { return LANGUAGE; }
+function getRdepth() { return RDEPTH; }
+function getAvail() { return AVAIL; }
+function getCopyLocs() { return COPYLOCS; }
+function getPubdBefore() { return PUBD_BEFORE; }
+function getPubdAfter() { return PUBD_AFTER; }
+function getPubdBetween() { return PUBD_BETWEEN; }
+function getPubdDuring() { return PUBD_DURING; }
+
+
+function findBasePath() {
+ var path = location.pathname;
+ if(!path.match(/.*\.xml$/)) path += "index.xml";
+ var idx = path.indexOf(config.page[findCurrentPage()]);
+ return path.substring(0, idx);
+}
+
+function findBaseURL(ssl) {
+ var path = findBasePath();
+ var proto = (ssl) ? "https:" : "http:";
+
+ /* strip port numbers. This is necessary for browsers that
+ send an explicit <host>:80, 443 - explicit ports
+ break links that need to change ports (e.g. http -> https) */
+ var h = location.host.replace(/:.*/,'');
+
+ return proto + "//" + h + path;
+}
+
+/*
+function buildISBNSrc(isbn) {
+ return "http://" + location.host + "/jackets/" + isbn;
+}
+*/
+
+function buildImageLink(name, ssl) {
+ return findBaseURL(ssl) + "../../../../images/" + name;
+}
+
+function buildExtrasLink(name, ssl) {
+ return findBaseURL(ssl) + "../../../../extras/" + name;
+}
+
+var consoleService;
+function _debug(str) {
+ try { dump('dbg: ' + str + '\n'); } catch(e) {}
+
+ /* potentially useful, but usually just annoying */
+ /*
+ if(!IE) {
+ if(!consoleService) {
+ try {
+ netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
+ this.consoleService = Components.classes['@mozilla.org/consoleservice;1']
+ .getService(Components.interfaces.nsIConsoleService);
+ } catch(e) {}
+ }
+
+ try {
+ if(consoleService) {
+ netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
+ consoleService.logStringMessage(str + '\n');
+ }
+ } catch(e){}
+ }
+ */
+}
+
+var forceLoginSSL; // set via Apache env variable
+function buildOPACLink(args, slim, ssl) {
+
+ if(!args) args = {};
+ var string = "";
+
+ if( ssl == undefined && (
+ location.protocol == 'https:' ||
+ (forceLoginSSL && G.user && G.user.session))) {
+ ssl = true;
+ }
+
+ if(!slim) {
+ string = findBaseURL(ssl);
+ if(args.page) string += config.page[args.page];
+ else string += config.page[findCurrentPage()];
+ }
+
+ /* this may seem unnecessary.. safety precaution for now */
+ /*
+ if( args[PARAM_DEPTH] == null )
+ args[PARAM_DEPTH] = getDepth();
+ */
+
+ string += "?";
+
+ for( var x in args ) {
+ var v = args[x];
+ if(x == "page" || v == null || v == undefined || v+'' == 'NaN' ) continue;
+ if(x == PARAM_OFFSET && v == 0) continue;
+ if(x == PARAM_COUNT && v == 10) continue;
+ if(x == PARAM_FORM && v == 'all' ) continue;
+ if( instanceOf(v, Array) && v.length ) {
+ for( var i = 0; i < v.length; i++ ) {
+ string += "&" + x + "=" + encodeURIComponent(v[i]);
+ }
+ } else {
+ string += "&" + x + "=" + encodeURIComponent(v);
+ }
+ }
+
+ if(getDebug())
+ string += _appendParam(DEBUG, PARAM_DEBUG, args, getDebug, string);
+ if(getOrigLocation() != 1)
+ string += _appendParam(ORIGLOC, PARAM_ORIGLOC, args, getOrigLocation, string);
+ if(getTerm())
+ string += _appendParam(TERM, PARAM_TERM, args, getTerm, string);
+ if(getFacet())
+ string += _appendParam(FACET, PARAM_FACET, args, getFacet, string);
+ if(getStype())
+ string += _appendParam(STYPE, PARAM_STYPE, args, getStype, string);
+ if(getLocation() != 1)
+ string += _appendParam(LOCATION, PARAM_LOCATION, args, getLocation, string);
+ if(getLasso() != null)
+ string += _appendParam(LASSO, PARAM_LASSO, args, getLasso, string);
+ if(getDepth() != null)
+ string += _appendParam(DEPTH, PARAM_DEPTH, args, getDepth, string);
+ if(getForm() && (getForm() != 'all') )
+ string += _appendParam(FORM, PARAM_FORM, args, getForm, string);
+ if(getTform() && (getTform() != 'all') )
+ string += _appendParam(TFORM, PARAM_TFORM, args, getTform, string);
+ if(getOffset() != 0)
+ string += _appendParam(OFFSET, PARAM_OFFSET, args, getOffset, string);
+ if(getDisplayCount() != 10)
+ string += _appendParam(COUNT, PARAM_COUNT, args, getDisplayCount, string);
+ if(getHitCount())
+ string += _appendParam(HITCOUNT, PARAM_HITCOUNT, args, getHitCount, string);
+ if(getMrid())
+ string += _appendParam(MRID, PARAM_MRID, args, getMrid, string);
+ if(getRid())
+ string += _appendParam(RID, PARAM_RID, args, getRid, string);
+ if(getAuthtime())
+ string += _appendParam(AUTHTIME, PARAM_AUTHTIME, args, getAuthtime, string);
+ if(getAdvTerm())
+ string += _appendParam(ADVTERM, PARAM_ADVTERM, args, getAdvTerm, string);
+ if(getAdvType())
+ string += _appendParam(ADVTYPE, PARAM_ADVTYPE, args, getAdvType, string);
+ if(getRtype())
+ string += _appendParam(RTYPE, PARAM_RTYPE, args, getRtype, string);
+ if(getItemForm())
+ string += _appendParam(ITEMFORM, PARAM_ITEMFORM, args, getItemForm, string);
+ if(getItemType())
+ string += _appendParam(ITEMTYPE, PARAM_ITEMTYPE, args, getItemType, string);
+ if(getBibLevel())
+ string += _appendParam(BIBLEVEL, PARAM_BIBLEVEL, args, getBibLevel, string);
+ if(getLitForm())
+ string += _appendParam(LITFORM, PARAM_LITFORM, args, getLitForm, string);
+ if(getAudience())
+ string += _appendParam(AUDIENCE, PARAM_AUDIENCE, args, getAudience, string);
+ if(getSearches())
+ string += _appendParam(SEARCHES, PARAM_SEARCHES, args, getSearches, string);
+ if(getLanguage())
+ string += _appendParam(LANGUAGE, PARAM_LANGUAGE, args, getLanguage, string);
+ if(getRdepth() != null)
+ string += _appendParam(RDEPTH, PARAM_RDEPTH, args, getRdepth, string);
+ if(getSort() != null)
+ string += _appendParam(SORT, PARAM_SORT, args, getSort, string);
+ if(getSortDir() != null)
+ string += _appendParam(SORT_DIR, PARAM_SORT_DIR, args, getSortDir, string);
+ if(getAvail())
+ string += _appendParam(AVAIL, PARAM_AVAIL, args, getAvail, string);
+ if(getCopyLocs())
+ string += _appendParam(COPYLOCS, PARAM_COPYLOCS, args, getCopyLocs, string);
+ if(getPubdBefore())
+ string += _appendParam(PUBD_BEFORE, PARAM_PUBD_BEFORE, args, getPubdBefore, string);
+ if(getPubdAfter())
+ string += _appendParam(PUBD_AFTER, PARAM_PUBD_AFTER, args, getPubdAfter, string);
+ if(getPubdBetween())
+ string += _appendParam(PUBD_BETWEEN, PARAM_PUBD_BETWEEN, args, getPubdBetween, string);
+ if(getPubdDuring())
+ string += _appendParam(PUBD_DURING, PARAM_PUBD_DURING, args, getPubdDuring, string);
+
+
+ return string.replace(/\&$/,'').replace(/\?\&/,"?");
+}
+
+var xx = 1;
+function _appendParam( fieldVar, fieldName, overrideArgs, getFunc, string ) {
+
+ var ret = "";
+
+ if( fieldVar != null &&
+ (fieldVar +'' != 'NaN') &&
+ overrideArgs[fieldName] == null &&
+ getFunc() != null &&
+ getFunc()+'' != '' ) {
+
+ ret = "&" + fieldName + "=" + encodeURIComponent(getFunc());
+ }
+
+ return ret;
+}
+
+/* ----------------------------------------------------------------------- */
+function cleanISBN(isbn) {
+ if(isbn) {
+ isbn = isbn.toString().replace(/^\s+/,"");
+ var idx = isbn.indexOf(" ");
+ if(idx > -1) { isbn = isbn.substring(0, idx); }
+ } else isbn = "";
+ return isbn;
+}
+
+
+/* builds a link that goes to the title listings for a metarecord */
+function buildTitleLink(rec, link) {
+ if(!rec) return;
+ link.appendChild(text(normalize(truncate(rec.title(), 65))));
+ var args = {};
+ args.page = RRESULT;
+ args[PARAM_OFFSET] = 0;
+ args[PARAM_MRID] = rec.doc_id();
+ args[PARAM_RTYPE] = RTYPE_MRID;
+ var linkText = link.innerHTML; // IE
+ link.setAttribute("href", buildOPACLink(args));
+ link.innerHTML = linkText; // IE
+}
+
+function buildTitleDetailLink(rec, link) {
+ if(!rec) return;
+ link.appendChild(text(normalize(truncate(rec.title(), 65))));
+ var args = {};
+ args.page = RDETAIL;
+ args[PARAM_RID] = rec.doc_id();
+ // in IE, if the link text contains a '@', it replaces the innerHTML text
+ // with the value of the href attribute. Wait, what? Yes. Capture the
+ // innerHTML and put it back into place after the href is set
+ var linkText = link.innerHTML; // IE
+ link.setAttribute("href", buildOPACLink(args));
+ link.innerHTML = linkText; // IE
+}
+
+/* 'type' is one of STYPE_AUTHOR, STYPE_SUBJECT, ... found in config.js
+ 'trunc' is the number of characters to show in the string, defaults to 65 */
+function buildSearchLink(type, string, linknode, trunc) {
+ if(!trunc) trunc = 65;
+ var args = {};
+ if( SHOW_MR_DEFAULT || findCurrentPage() == MRESULT ) {
+ args.page = MRESULT;
+ } else {
+ args.page = RRESULT;
+ args[PARAM_RTYPE] = type;
+ }
+ args[PARAM_OFFSET] = 0;
+ args[PARAM_TERM] = string;
+ args[PARAM_STYPE] = type;
+ linknode.appendChild(text(normalize(truncate(string, trunc))));
+ linknode.setAttribute("href", buildOPACLink(args));
+}
+
+function setSessionCookie(ses) {
+ dojo.cookie(COOKIE_SES, ses);
+}
+
+
+
+/* ----------------------------------------------------------------------- */
+/* user session handling */
+/* ----------------------------------------------------------------------- */
+/* session is the login session. If no session is provided, we attempt
+ to find one in the cookies. If 'force' is true we retrieve the
+ user from the server even if there is already a global user present.
+ if ses != G.user.session, we also force a grab */
+function grabUser(ses, force) {
+
+ _debug("grabUser auth token = " + ses);
+ if(!ses && isXUL()) {
+ stash = fetchXULStash();
+ ses = stash.session.key
+ _debug("stash auth token = " + ses);
+ }
+
+ if(!ses) {
+ ses = dojo.cookie(COOKIE_SES);
+ /* https cookies don't show up in http servers.. */
+ _debug("cookie auth token = " + ses);
+ }
+
+ if(!ses) return false;
+
+ if(!force)
+ if(G.user && G.user.session == ses)
+ return G.user;
+
+ /* first make sure the session is valid */
+ var request = new Request(FETCH_SESSION, ses, 1 );
+ request.request.alertEvent = false;
+ request.send(true);
+ var user = request.result();
+
+ if(!user || user.textcode == 'NO_SESSION') {
+
+ if(isXUL()) {
+ dojo.require('openils.XUL');
+ dump('getNewSession in opac_utils.js\n');
+ openils.XUL.getNewSession(
+ function(success, authtoken) {
+ if(success) {
+ ses = authtoken;
+ var request = new Request(FETCH_SESSION, ses, 1);
+ request.request.alertEvent = false;
+ request.send(true);
+ user = request.result();
+ }
+ }
+ );
+ }
+
+ if(!user || user.textcode == 'NO_SESSION') {
+ doLogout();
+ return false; /* unable to grab the session */
+ }
+ }
+
+ if( !(typeof user == 'object' && user._isfieldmapper) ) {
+ doLogout();
+ return false;
+ }
+
+ G.user = user;
+ G.user.fleshed = false;
+ G.user.session = ses;
+ setSessionCookie(ses);
+
+ grabUserPrefs();
+ if(G.user.prefs['opac.hits_per_page'])
+ COUNT = parseInt(G.user.prefs['opac.hits_per_page']);
+
+ if(G.user.prefs[PREF_DEF_FONT])
+ setFontSize(G.user.prefs[PREF_DEF_FONT]);
+
+ var at = getAuthtime();
+ //if(isXUL()) at = xulG['authtime'];
+
+ if(at && !isXUL()) new AuthTimer(at).run();
+ return G.user;
+}
+
+
+/* sets the 'prefs' field of the user object to their preferences
+ and returns the preferences */
+function grabUserPrefs(user, force) {
+ if(user == null) user = G.user;
+ if(!force && user.prefs) return user.prefs;
+ var req = new Request(FETCH_USER_PREFS, G.user.session, user.id());
+ req.send(true);
+ user.prefs = req.result();
+ return user.prefs;
+}
+
+function grabFleshedUser() {
+
+ if(!G.user || !G.user.session) {
+ grabUser();
+ if(!G.user || !G.user.session) return null;
+ }
+
+ if(G.user.fleshed) return G.user;
+
+ var req = new Request(FETCH_FLESHED_USER, G.user.session);
+ req.send(true);
+
+ G.user = req.result();
+
+ if(!G.user || G.user.length == 0) {
+ dojo.cookie(COOKIE_SES,null,{'expires':-1});
+ G.user = null; return false;
+ }
+
+ G.user.session = ses;
+ G.user.fleshed = true;
+
+ setSessionCookie(ses);
+ return G.user;
+}
+
+function checkUserSkin(new_skin) {
+
+ return; /* XXX do some debugging with this... */
+
+ var user_skin = getSkin();
+ var cur_skin = grabSkinFromURL();
+
+ if(new_skin) user_skin = new_skin;
+
+ if(!user_skin) {
+
+ if(grabUser()) {
+ if(grabUserPrefs()) {
+ user_skin = G.user.prefs["opac.skin"];
+ dojo.cookie( COOKIE_SKIN, user_skin, { 'expires' : 365 } );
+ }
+ }
+ }
+
+ if(!user_skin) return;
+
+ if( cur_skin != user_skin ) {
+ var url = buildOPACLink();
+ goTo(url.replace(cur_skin, user_skin));
+ }
+}
+
+function updateUserSetting(setting, value, user) {
+ if(user == null) user = G.user;
+ var a = {};
+ a[setting] = value;
+ var req = new Request( UPDATE_USER_PREFS, user.session, a );
+ req.send(true);
+ return req.result();
+}
+
+function commitUserPrefs() {
+ var req = new Request(
+ UPDATE_USER_PREFS, G.user.session, null, G.user.prefs );
+ req.send(true);
+ return req.result();
+}
+
+function grabSkinFromURL() {
+ var path = findBasePath();
+ path = path.replace("/xml/", "");
+ var skin = "";
+ for( var i = path.length - 1; i >= 0; i-- ) {
+ var ch = path.charAt(i);
+ if(ch == "/") break;
+ skin += ch;
+ }
+
+ var skin2 = "";
+ for( i = skin.length - 1; i >= 0; i--)
+ skin2 += skin.charAt(i);
+
+ return skin2;
+}
+
+
+/* returns a fleshed G.user on success, false on failure */
+function doLogin(suppressEvents) {
+
+ abortAllRequests();
+
+ var uname = G.ui.login.username.value;
+ var passwd = G.ui.login.password.value;
+
+ var init_request = new Request( LOGIN_INIT, uname );
+ init_request.send(true);
+ var seed = init_request.result();
+
+ if( ! seed || seed == '0') {
+ alert( "Error Communicating with Authentication Server" );
+ return null;
+ }
+
+ var args = {
+ password : hex_md5(seed + hex_md5(passwd)),
+ type : "opac",
+ org : getOrigLocation()
+ };
+
+ r = fetchOrgSettingDefault(globalOrgTree.id(), 'opac.barcode_regex');
+ if(r) REGEX_BARCODE = new RegExp(r);
+
+ if( uname.match(REGEX_BARCODE) ) args.barcode = uname;
+ else args.username = uname;
+
+ var auth_request = new Request( LOGIN_COMPLETE, args );
+
+ auth_request.request.alertEvent = false;
+ auth_request.send(true);
+ var auth_result = auth_request.result();
+
+ if(!auth_result) {
+ alertId('patron_login_failed');
+ return null;
+ }
+
+ if( checkILSEvent(auth_result) ) {
+
+ if( auth_result.textcode == 'PATRON_INACTIVE' ) {
+ alertId('patron_inactive_alert');
+ return;
+ }
+
+ if( auth_result.textcode == 'PATRON_CARD_INACTIVE' ) {
+ alertId('patron_card_inactive_alert');
+ return;
+ }
+
+ if( auth_result.textcode == 'LOGIN_FAILED' ||
+ auth_result.textcode == 'PERM_FAILURE' ) {
+ alertId('patron_login_failed');
+ return;
+ }
+ }
+
+
+ AUTHTIME = parseInt(auth_result.payload.authtime);
+ var u = grabUser(auth_result.payload.authtoken, true);
+ if(u && ! suppressEvents)
+ runEvt( "common", "locationChanged", u.ws_ou(), findOrgDepth(u.ws_ou()) );
+
+ checkUserSkin();
+
+ return u;
+}
+
+function doLogout() {
+
+ /* cancel everything else */
+ abortAllRequests();
+
+ /* be nice and delete the session from the server */
+ if(G.user && G.user.session) {
+ var req = new Request(LOGIN_DELETE, G.user.session);
+ req.send(true);
+ try { req.result(); } catch(E){}
+ }
+
+ G.user = null;
+
+ /* remove any cached data */
+ dojo.require('dojo.cookie');
+ dojo.cookie(COOKIE_SES, null, {expires:-1});
+ dojo.cookie(COOKIE_RIDS, null, {expires:-1});
+ dojo.cookie(COOKIE_SKIN, null, {expires:-1});
+ dojo.cookie(COOKIE_SEARCH, null, {expires:-1});
+
+
+ checkUserSkin("default");
+ COUNT = 10;
+
+
+ var args = {};
+ args[PARAM_TERM] = "";
+ args[PARAM_LOCATION] = getOrigLocation();
+ args[PARAM_DEPTH] = findOrgDepth(getOrigLocation() || globalOrgTree);
+ args.page = "home";
+
+
+ var nored = false;
+ try{ if(isFrontPage) nored = true; } catch(e){nored = false;}
+ if(!nored) goTo(buildOPACLink(args, false, false));
+}
+
+
+function hideMe(obj) { addCSSClass(obj, config.css.hide_me); }
+function unHideMe(obj) { removeCSSClass(obj, config.css.hide_me); }
+
+
+/* ----------------------------------------------------------------------- */
+/* build the org tree */
+/* ----------------------------------------------------------------------- */
+function drawOrgTree() {
+ //setTimeout( 'buildOrgSelector(G.ui.common.org_tree, orgTreeSelector);', 10 );
+ setTimeout( 'buildOrgSelector(G.ui.common.org_tree, orgTreeSelector);', 1 );
+}
+
+var checkOrgHiding_cached = false;
+var checkOrgHiding_cached_context_org;
+var checkOrgHiding_cached_depth;
+function checkOrgHiding() {
+ if (isXUL()) {
+ return false; // disable org hiding for staff client
+ }
+ var context_org = getOrigLocation() || globalOrgTree.id();
+ var depth;
+ if (checkOrgHiding_cached) {
+ if (checkOrgHiding_cached_context_org != context_org) {
+ checkOrgHiding_cached_context_org = context_org;
+ checkOrgHiding_cached_depth = undefined;
+ checkOrgHiding_cached = false;
+ } else {
+ depth = checkOrgHiding_cached_depth;
+ }
+ } else {
+ depth = fetchOrgSettingDefault( context_org, 'opac.org_unit_hiding.depth');
+ checkOrgHiding_cached_depth = depth;
+ checkOrgHiding_cached_context_org = context_org;
+ checkOrgHiding_cached = true;
+ }
+ if ( findOrgDepth( context_org ) < depth ) {
+ return false; // disable org hiding if Original Location doesn't make sense with setting depth (avoids disjointed org selectors)
+ }
+ return { 'org' : findOrgUnit(context_org), 'depth' : depth };
+}
+
+var orgTreeSelector;
+function buildOrgSelector(node) {
+ var tree = new SlimTree(node,'orgTreeSelector');
+ orgTreeSelector = tree;
+ var orgHiding = checkOrgHiding();
+ for( var i in orgArraySearcher ) {
+ var node = orgArraySearcher[i];
+ if( node == null ) continue;
+ if(!isXUL() && !isTrue(node.opac_visible())) continue;
+ if (orgHiding) {
+ if ( ! orgIsMine( orgHiding.org, node, orgHiding.depth ) ) {
+ continue;
+ }
+ }
+ if(node.parent_ou() == null) {
+ tree.addNode(node.id(), -1, node.name(),
+ "javascript:orgSelect(" + node.id() + ");", node.name());
+ } else {
+ if (orgHiding && orgHiding.depth == findOrgDepth(node)) {
+ tree.addNode(node.id(), -1, node.name(),
+ "javascript:orgSelect(" + node.id() + ");", node.name());
+ } else {
+ tree.addNode(node.id(), node.parent_ou(), node.name(),
+ "javascript:orgSelect(" + node.id() + ");", node.name());
+ }
+ }
+ }
+ hideMe($('org_loading_div'));
+ unHideMe($('org_selector_tip'));
+ return tree;
+}
+
+function orgSelect(id) {
+ showCanvas();
+ runEvt("common", "locationChanged", id, findOrgDepth(id) );
+
+
+ var loc = findOrgLasso(getLasso());
+ if (!loc) loc = findOrgUnit(id);
+
+ removeChildren(G.ui.common.now_searching);
+ G.ui.common.now_searching.appendChild(text(loc.name()));
+}
+
+function setFontSize(size) {
+ scaleFonts(size);
+ dojo.cookie(COOKIE_FONT, size, { 'expires' : 365});
+}
+
+var resourceFormats = [
+ "text",
+ "moving image",
+ "sound recording", "software, multimedia",
+ "still image",
+ "cartographic",
+ "mixed material",
+ "notated music",
+ "three dimensional object" ];
+
+
+function modsFormatToMARC(format) {
+ switch(format) {
+ case "text":
+ return "at";
+ case "moving image":
+ return "g";
+ case "sound recording":
+ return "ij";
+ case "sound recording-nonmusical":
+ return "i";
+ case "sound recording-musical":
+ return "j";
+ case "software, multimedia":
+ return "m";
+ case "still image":
+ return "k";
+ case "cartographic":
+ return "ef";
+ case "mixed material":
+ return "op";
+ case "notated music":
+ return "cd";
+ case "three dimensional object":
+ return "r";
+ }
+ return "at";
+}
+
+
+function MARCFormatToMods(format) {
+ switch(format) {
+ case "a":
+ case "t":
+ return "text";
+ case "g":
+ return "moving image";
+ case "i":
+ return "sound recording-nonmusical";
+ case "j":
+ return "sound recording-musical";
+ case "m":
+ return "software, multimedia";
+ case "k":
+ return "still image";
+ case "e":
+ case "f":
+ return "cartographic";
+ case "o":
+ case "p":
+ return "mixed material";
+ case "c":
+ case "d":
+ return "notated music";
+ case "r":
+ return "three dimensional object";
+ }
+ return "text";
+}
+
+function MARCTypeToFriendly(format) {
+ var words = $('format_words');
+ switch(format) {
+ case 'a' :
+ case 't' : return $n(words, 'at').innerHTML;
+ default:
+ var node = $n(words,format);
+ if( node ) return node.innerHTML;
+ }
+ return "";
+}
+
+function setResourcePic( img, resource ) {
+ img.setAttribute( "src", "../../../../images/tor/" + resource + ".jpg");
+ img.title = resource;
+}
+
+
+
+function msg( text ) {
+ try { alert( text ); } catch(e) {}
+}
+
+function findRecord(id,type) {
+ try {
+ for( var i = 0; i != recordsCache.length; i++ ) {
+ var rec = recordsCache[i];
+ if( rec && rec.doc_id() == id ) return rec;
+ }
+ } catch(E){}
+ var meth = FETCH_RMODS
+ if(type == 'M') meth = FETCH_MRMODS;
+ var req = new Request(meth, id);
+ req.request.alertEvent = false;
+ req.send(true);
+ var res = req.result();
+ if( checkILSEvent(res) ) return null;
+ return res;
+}
+
+function Timer(name, node){
+ this.name = name;
+ this.count = 1;
+ this.node = node;
+}
+Timer.prototype.start =
+ function(){_timerRun(this.name);}
+Timer.prototype.stop =
+ function(){this.done = true;}
+function _timerRun(tname) {
+ var _t;
+ eval('_t='+tname);
+ if(_t.done) return;
+ if(_t.count > 100) return;
+ var str = ' . ';
+ if( (_t.count % 5) == 0 )
+ str = _t.count / 5;
+ _t.node.appendChild(text(str));
+ setTimeout("_timerRun('"+tname+"');", 200);
+ _t.count++;
+}
+
+function checkILSEvent(obj) {
+ if( obj && obj.ilsevent != null && obj.ilsevent != 0 )
+ return parseInt(obj.ilsevent);
+ return null;
+}
+
+
+function alertILSEvent(evt, msg) {
+ if(!msg) msg = "";
+ if(msg)
+ alert(msg +'\n' + evt.textcode + '\n' + evt.desc );
+ else
+ alert(evt.textcode + '\n' + evt.desc );
+}
+
+
+var __authTimer;
+function AuthTimer(time) {
+ this.time = (time - LOGOUT_WARNING_TIME) * 1000;
+ if(__authTimer)
+ try {clearTimeout(__authTimer.id)} catch(e){}
+ __authTimer = this;
+}
+
+AuthTimer.prototype.run = function() {
+ this.id = setTimeout('_authTimerAlert()', this.time);
+}
+
+function _authTimerAlert() {
+ alert( $('auth_session_expiring').innerHTML );
+ if(!grabUser(null, true)) doLogout();
+}
+
+
+function grabUserByBarcode( authtoken, barcode ) {
+ var req = new Request( FETCH_USER_BYBARCODE, authtoken, barcode );
+ req.send(true);
+ return req.result();
+}
+
+
+function goHome() {
+ goTo(buildOPACLink({page:HOME}));
+}
+
+
+function buildOrgSel(selector, org, offset, namecol) {
+ if(!namecol) namecol = 'name';
+ if(!isXUL() && !isTrue(org.opac_visible())) return;
+ insertSelectorVal( selector, -1,
+ org[namecol](), org.id(), null, findOrgDepth(org) - offset );
+ var kids = org.children();
+ if (kids) {
+ for( var c = 0; c < kids.length; c++ )
+ buildOrgSel( selector, kids[c], offset, namecol);
+ }
+}
+
+function buildMergedOrgSel(selector, org_list, offset, namecol) {
+ if(!namecol) namecol = 'name';
+ for(var i = 0; i < org_list.length; i++) {
+ var org = findOrgUnit(org_list[i]);
+ insertSelectorVal( selector, -1,
+ org[namecol](), org.id(), null, findOrgDepth(org) - offset );
+ var kids = org.children();
+ if (kids) {
+ for( var c = 0; c < kids.length; c++ )
+ buildOrgSel( selector, kids[c], offset, namecol);
+ }
+ }
+}
+
+
+function parseForm(form) {
+ if(!form) return {};
+
+ var it = form.replace(/-\w+$/,"");
+ var itf = null;
+ var item_form;
+ var item_type;
+
+ if(form.match(/-/)) itf = form.replace(/^\w+-/,"");
+
+ if(it) {
+ item_type = [];
+ for( var i = 0; i < it.length; i++ )
+ item_type.push( it.charAt(i) );
+ }
+
+ if(itf) {
+ item_form = [];
+ for( var i = 0; i < itf.length; i++ )
+ item_form.push( itf.charAt(i) );
+ }
+
+ return {item_type: item_type, item_form:item_form};
+}
+
+
+function isTrue(x) { return ( x && x != "0" && !(x+'').match(/^f$/i) ); }
+
+function fetchPermOrgs() {
+ var a = []; /* Q: why does arguments come accross as an object and not an array? A: because arguments is a special object, a collection */
+
+ for( var i = 0; i < arguments.length; i++ )
+ a.push(arguments[i])
+
+ var preq = new Request(FETCH_HIGHEST_PERM_ORG,
+ G.user.session, G.user.id(), a );
+ preq.send(true);
+ return preq.result();
+}
+
+
+function print_tabs(t) {
+ var r = '';
+ for (var j = 0; j < t; j++ ) { r = r + " "; }
+ return r;
+}
+function formatJSON(s) {
+ var r = ''; var t = 0;
+ for (var i in s) {
+ if (s[i] == '{' || s[i] == '[' ) {
+ r = r + s[i] + "\n" + print_tabs(++t);
+ } else if (s[i] == '}' || s[i] == ']') {
+ t--; r = r + "\n" + print_tabs(t) + s[i];
+ } else if (s[i] == ',') {
+ r = r + s[i] + "\n" + print_tabs(t);
+ } else {
+ r = r + s[i];
+ }
+ }
+ return r;
+}