2 function isXUL() { return IAMXUL; }
5 /* - Request ------------------------------------------------------------- */
6 function Request(type) {
7 var s = type.split(":");
8 if(s[2] == "1" && isXUL()) s[1] += ".staff";
9 this.request = new RemoteRequest(s[0], s[1]);
10 for( var x = 1; x!= arguments.length; x++ )
11 this.request.addParam(arguments[x]);
14 Request.prototype.callback = function(cal) { this.request.setCompleteCallback(cal); }
15 Request.prototype.send = function(block){this.request.send(block);}
16 Request.prototype.result = function(){return this.request.getResultObject();}
17 /* ----------------------------------------------------------------------- */
20 /* ----------------------------------------------------------------------- */
21 /* Functions for showing the canvas (and hiding any other shown stuff) */
22 /* ----------------------------------------------------------------------- */
23 function showCanvas() { setTimeout(_showCanvas, 200); }
24 function _showCanvas() {
25 for( var x in G.ui.altcanvas ) {
26 hideMe(G.ui.altcanvas[x]);
28 hideMe(G.ui.common.loading);
29 unHideMe(G.ui.common.canvas_main);
30 G.ui.searchbar.text.focus(); /* focus the searchbar */
35 function swapCanvas(newNode) { newCanvasNode = newNode; setTimeout(_swapCanvas, 200); }
36 function _swapCanvas() {
37 for( var x in G.ui.altcanvas )
38 hideMe(G.ui.altcanvas[x]);
40 hideMe(G.ui.common.loading);
41 hideMe(G.ui.common.canvas_main);
42 unHideMe(newCanvasNode);
44 /* ----------------------------------------------------------------------- */
47 /* finds the name of the current page */
48 function findCurrentPage() {
49 for( var p in config.page ) {
50 var path = location.pathname;
52 if(!path.match(/.*\.xml$/))
53 path += "index.xml"; /* in case they go to / */
55 if( config.page[p] == path)
62 /* builds an opac URL. If no page is defined, the current page is used
63 if slim, then only everything after the ? is returned (no host portion)
65 function buildOPACLink(args, slim) {
70 var string = location.protocol + "//" + location.host;
71 if(args.page) string += config.page[args.page];
72 else string += config.page[findCurrentPage()];
77 for( var x in args ) {
78 if(x == "page" || args[x] == null) continue;
79 string += "&" + x + "=" + encodeURIComponent(args[x]);
82 string += _appendParam(TERM, PARAM_TERM, args, getTerm, string);
83 string += _appendParam(STYPE, PARAM_STYPE, args, getStype, string);
84 string += _appendParam(LOCATION, PARAM_LOCATION, args, getLocation, string);
85 string += _appendParam(DEPTH, PARAM_DEPTH, args, getDepth, string);
86 string += _appendParam(FORM, PARAM_FORM, args, getForm, string);
87 string += _appendParam(OFFSET, PARAM_OFFSET, args, getOffset, string);
88 string += _appendParam(COUNT, PARAM_COUNT, args, getDisplayCount, string);
89 string += _appendParam(HITCOUNT, PARAM_HITCOUNT, args, getHitCount, string);
90 string += _appendParam(MRID, PARAM_MRID, args, getMrid, string);
91 string += _appendParam(RID, PARAM_RID, args, getRid, string);
92 return string.replace(/\&$/,'').replace(/\?\&/,"?");
95 function _appendParam( fieldVar, fieldName, overrideArgs, getFunc, string ) {
97 if( fieldVar != null && overrideArgs[fieldName] == null )
98 ret = "&" + fieldName + "=" + encodeURIComponent(getFunc());
106 /* ----------------------------------------------------------------------- */
107 /* some useful exceptions */
108 function EX(message) { this.init(message); }
110 EX.prototype.init = function(message) {
111 this.message = message;
114 EX.prototype.toString = function() {
115 return "\n *** Exception Occured \n" + this.message;
118 EXCommunication.prototype = new EX();
119 EXCommunication.prototype.constructor = EXCommunication;
120 EXCommunication.baseClass = EX.prototype.constructor;
122 function EXCommunication(message) {
123 this.init("EXCommunication: " + message);
125 /* ----------------------------------------------------------------------- */
127 function cleanISBN(isbn) {
129 isbn = isbn.toString().replace(/^\s+/,"");
130 var idx = isbn.indexOf(" ");
131 if(idx > -1) { isbn = isbn.substring(0, idx); }
139 /* ----------------------------------------------------------------------- */
140 /* builds a link that goes to the title listings for a metarecord */
141 function buildTitleLink(rec, link) {
144 t = normalize(truncate(t, 65));
145 link.appendChild(text(t));
149 args[PARAM_OFFSET] = 0;
150 args[PARAM_MRID] = rec.doc_id();
151 link.setAttribute("href", buildOPACLink(args));
154 function buildTitleDetailLink(rec, link) {
157 t = normalize(truncate(t, 65));
158 link.appendChild(text(t));
162 args[PARAM_OFFSET] = 0;
163 args[PARAM_RID] = rec.doc_id();
164 link.setAttribute("href", buildOPACLink(args));
167 /* builds an author search link */
168 function buildAuthorLink(rec, link) {
170 var a = rec.author();
171 a = normalize(truncate(a, 65));
172 link.appendChild(text(a));
176 args[PARAM_OFFSET] = 0;
177 args[PARAM_STYPE] = STYPE_AUTHOR;
178 args[PARAM_TERM] = rec.author();
179 link.setAttribute("href", buildOPACLink(args));
182 /* ----------------------------------------------------------------------- */
186 /* ----------------------------------------------------------------------- */
187 /* user session handling */
188 /* ----------------------------------------------------------------------- */
190 /* session is the login session. If no session is provided, we attempt
191 to find one in the cookies.
192 If 'force' is true we retrieve the
193 user from the server even if there is already a global user present.
194 if ses != G.user.session, we also force a grab */
195 var cookie = new cookieObject("ses", 1, "/", COOKIE_SES);
196 function grabUser(ses, force) {
198 if(!ses) ses = cookie.get(COOKIE_SES);
199 if(!ses) return false;
202 if(G.user && G.user.session == ses)
206 /* first make sure the session is valid */
207 var request = new Request(FETCH_SESSION, ses );
209 var user = request.result();
210 if( !(typeof user == 'object' && user._isfieldmapper) ) {
215 var req = new Request(FETCH_FLESHED_USER, ses);
218 G.user = req.result();
220 if(!G.user || G.user.length == 0) {
221 G.user = null; return false;
222 cookie.remove(COOKIE_SES);
225 G.user.session = ses;
226 cookie.put(COOKIE_SES, ses);
234 /* returns a fleshed G.user on success, false on failure */
237 var uname = G.ui.login.username.value;
238 var passwd = G.ui.login.password.value;
240 var init_request = new Request( LOGIN_INIT, uname );
241 init_request.send(true);
242 var seed = init_request.result();
244 if( ! seed || seed == '0') {
245 alert( "Error Communicating with Authentication Server" );
249 var auth_request = new Request( LOGIN_COMPLETE,
250 uname, hex_md5(seed + hex_md5(passwd)), "opac");
252 auth_request.send(true);
253 var auth_result = auth_request.result();
255 if(auth_result == '0' || auth_result == null || auth_result.length == 0) { return false; }
257 var u = grabUser(auth_result, true);
258 if(u) updateLoc(u.home_ou(), findOrgDepth(u.home_ou()));
263 function doLogout() {
265 /* be nice and delete the session from the server */
266 if(G.user && G.user.session) {
267 var req = new Request(LOGIN_DELETE, G.user.session);
269 try { req.result(); } catch(E){}
273 cookie.remove(COOKIE_SES);
275 hideMe(G.ui.sidebar.logoutbox);
276 unHideMe(G.ui.sidebar.loginbox);
277 hideMe(G.ui.sidebar.logged_in_as);
282 function hideMe(obj) { addCSSClass(obj, config.css.hide_me); }
283 function unHideMe(obj) { removeCSSClass(obj, config.css.hide_me); }
286 /* ----------------------------------------------------------------------- */
287 /* build the org tree */
288 /* ----------------------------------------------------------------------- */
291 function buildOrgSelector() {
292 var tree = new dTree("orgTreeSelector");
293 for( var i in orgArraySearcher ) {
294 var node = orgArraySearcher[i];
295 if( node == null ) continue;
296 if(node.parent_ou() == null)
297 tree.add(node.id(), -1, node.name(),
298 "javascript:orgSelect(" + node.id() + ");", node.name());
300 tree.add(node.id(), node.parent_ou().id(), node.name(),
301 "javascript:orgSelect(" + node.id() + ");", node.name());
304 orgTreeSelector = tree;
308 function orgSelect(id) {
314 /* ------------------------------------------------------------------------------------------------------ */
315 /* org tree utilities */
316 /* ------------------------------------------------------------------------------------------------------ */
318 /* takes an org unit or id and return the numeric depth */
319 function findOrgDepth(org_id_or_node) {
320 return findOrgType(findOrgUnit(org_id_or_node).ou_type()).depth();
323 /* takes the org type id from orgunit.ou_type() field and returns
324 the org type object */
325 function findOrgType(type_id) {
326 if(typeof type_id == 'object') return type_id;
327 for(var type in globalOrgTypes) {
328 var t =globalOrgTypes[type];
329 if( t.id() == type_id || t.id() == parseInt(type_id) )
336 /* returns an org unit by id. if an object is passed in as the id,
337 then the object is assumed to be an org unit and is returned */
338 function findOrgUnit(org_id) {
339 return (typeof org_id == 'object') ? org_id : orgArraySearcher[org_id];
343 /* builds a trail from the top of the org tree to the node provide.
344 basically fleshes out 'my orgs'
345 Returns an array of [org0, org1, ..., myorg] */
346 function orgNodeTrail(node) {
347 var na = new Array();
350 node = findOrgUnit(node.parent_ou());
356 /* returns an array of sibling org units */
357 function findSiblingOrgs(node) { return findOrgUnit(node.parent_ou()).children(); }
358 /* ------------------------------------------------------------------------------------------------------ */