]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/web/opac/common/js/opac_utils.js
994e38e3170229b13e0a89d1112a8d6d72d1e877
[Evergreen.git] / Open-ILS / web / opac / common / js / opac_utils.js
1 /* - Request ------------------------------------------------------------- */
2 function Request(type) {
3         var s = type.split(":");
4         if(s[2] == "1" && isXUL()) s[1] += ".staff";
5         this.request = new RemoteRequest(s[0], s[1]);
6         for( var x = 1; x!= arguments.length; x++ ) 
7                 this.request.addParam(arguments[x]);
8 }
9
10 Request.prototype.callback = function(cal) { this.request.setCompleteCallback(cal); }
11 Request.prototype.send          = function(block){this.request.send(block);}
12 Request.prototype.result        = function(){return this.request.getResultObject();}
13
14 function showCanvas() {
15         for( var x in G.ui.altcanvas ) {
16                 hideMe(G.ui.altcanvas[x]);
17         }
18         hideMe(G.ui.common.loading);
19         unHideMe(G.ui.common.canvas_main);
20         G.ui.searchbar.text.focus(); 
21 }
22
23 function swapCanvas(newNode) {
24         for( var x in G.ui.altcanvas ) 
25                 hideMe(G.ui.altcanvas[x]);
26
27         hideMe(G.ui.common.loading);
28         hideMe(G.ui.common.canvas_main);
29         unHideMe(newNode);
30 }
31
32 /* finds the name of the current page */
33 var currentPage = null;
34 function findCurrentPage() {
35         if(currentPage) return currentPage;
36
37         var pages = [];
38         for( var p in config.page ) pages.push(config.page[p]);
39         pages = pages.sort( function(a,b){ return - (a.length - b.length); } );
40
41         var path = location.pathname;
42         if(!path.match(/.*\.xml$/))
43                 path += "index.xml"; /* in case they go to  / */
44
45         var page = null;
46         for( var p in pages ) {
47                 if( path.indexOf(pages[p]) != -1)
48                         page = pages[p];
49         }
50
51         for( var p in config.page ) {
52                 if(config.page[p] == page) {
53                         currentPage = p;
54                         return p;
55                 }
56         }
57         return null;
58 }
59
60
61 /* sets all of the params values  ----------------------------- */
62 function initParams() {
63         var cgi = new CGI();    
64
65         TERM    = cgi.param(PARAM_TERM);
66         STYPE   = cgi.param(PARAM_STYPE);
67         FORM    = cgi.param(PARAM_FORM);
68
69         LOCATION        = parseInt(cgi.param(PARAM_LOCATION));
70         ORIGLOC = parseInt(cgi.param(PARAM_ORIGLOC));
71         DEPTH           = parseInt(cgi.param(PARAM_DEPTH));
72         OFFSET  = parseInt(cgi.param(PARAM_OFFSET));
73         COUNT           = parseInt(cgi.param(PARAM_COUNT));
74         HITCOUNT        = parseInt(cgi.param(PARAM_HITCOUNT));
75         MRID            = parseInt(cgi.param(PARAM_MRID));
76         RID             = parseInt(cgi.param(PARAM_RID));
77         TOPRANK  = parseFloat(cgi.param(PARAM_TOPRANK));
78         AUTHTIME        = parseInt(cgi.param(PARAM_AUTHTIME));
79
80         /* set up some sane defaults */
81         if(isNaN(LOCATION))     LOCATION        = 1;
82         if(isNaN(DEPTH))                DEPTH           = 0;
83         if(isNaN(OFFSET))               OFFSET  = 0;
84         if(isNaN(COUNT))                COUNT           = 10;
85         if(isNaN(HITCOUNT))     HITCOUNT        = 0;
86         if(isNaN(MRID))         MRID            = 0;
87         if(isNaN(RID))                  RID             = 0;
88         if(isNaN(ORIGLOC))      ORIGLOC = 0;
89         if(isNaN(TOPRANK))      TOPRANK = 1;
90         if(isNaN(AUTHTIME))     AUTHTIME        = 1;
91 }
92
93 function initCookies() {
94         FONTSIZE = "medium";
95         var font = fontCookie.get(COOKIE_FONT);
96         if(font) FONTSIZE = font;
97         SKIN = skinCookie.get(COOKIE_SKIN);
98 }
99
100 /* URL param accessors */
101 function getTerm(){return TERM;}
102 function getStype(){return STYPE;}
103 function getLocation(){return LOCATION;}
104 function getDepth(){return DEPTH;}
105 function getForm(){return FORM;}
106 function getOffset(){return OFFSET;}
107 function getDisplayCount(){return COUNT;}
108 function getHitCount(){return HITCOUNT;}
109 function getMrid(){return MRID;};
110 function getRid(){return RID;};
111 function getOrigLocation(){return ORIGLOC;}
112 function getTopRank(){return TOPRANK;}
113 function getAuthtime() { return AUTHTIME; }
114
115 function getSearchBarExtras(){return SBEXTRAS;}
116 function getFontSize(){return FONTSIZE;};
117 function getSkin(){return SKIN;};
118
119
120 function findBasePath() {
121         var path = location.pathname;
122         if(!path.match(/.*\.xml$/)) path += "index.xml"; 
123         var idx = path.indexOf(config.page[findCurrentPage()]);
124         return path.substring(0, idx);
125 }
126
127 function findBaseURL(ssl) {
128         var path = findBasePath();
129         var proto = (ssl) ? "https:" : "http:";
130         return proto + "//" + location.host + path;
131         dump( 'ssl: ' + ssl + 'proto ' + proto );
132 }
133
134 /*
135 function buildISBNSrc(isbn) {
136         return "http://" + location.host + "/jackets/" + isbn;
137 }
138 */
139
140 function buildImageLink(name, ssl) {
141         return findBaseURL(ssl) + "../../../images/" + name;
142 }
143
144 function  buildOPACLink(args, slim, ssl) {
145
146         if(!args) args = {};
147         var string = "";
148
149         if(!slim) {
150                 string = findBaseURL(ssl);
151                 if(args.page) string += config.page[args.page];
152                 else string += config.page[findCurrentPage()];
153         }
154
155         string += "?";
156
157         for( var x in args ) {
158                 if(x == "page" || args[x] == null) continue;
159                 string += "&" + x + "=" + encodeURIComponent(args[x]);
160         }
161
162         string += _appendParam(ORIGLOC, PARAM_ORIGLOC, args, getOrigLocation, string);
163         string += _appendParam(TERM,            PARAM_TERM, args, getTerm, string);
164         string += _appendParam(STYPE,           PARAM_STYPE, args, getStype, string);
165         string += _appendParam(LOCATION, PARAM_LOCATION, args, getLocation, string);
166         string += _appendParam(DEPTH,           PARAM_DEPTH, args, getDepth, string);
167         string += _appendParam(FORM,            PARAM_FORM, args, getForm, string);
168         string += _appendParam(OFFSET,  PARAM_OFFSET, args, getOffset, string);
169         string += _appendParam(COUNT,           PARAM_COUNT, args, getDisplayCount, string);
170         string += _appendParam(HITCOUNT, PARAM_HITCOUNT, args, getHitCount, string);
171         string += _appendParam(MRID,            PARAM_MRID, args, getMrid, string);
172         string += _appendParam(RID,             PARAM_RID, args, getRid, string);
173         string += _appendParam(TOPRANK, PARAM_TOPRANK, args, getTopRank, string);
174         string += _appendParam(AUTHTIME,        PARAM_AUTHTIME, args, getAuthtime, string);
175
176         return string.replace(/\&$/,'').replace(/\?\&/,"?");    
177 }
178
179 function _appendParam( fieldVar, fieldName, overrideArgs, getFunc, string ) {
180         var ret = "";
181         if( fieldVar != null && overrideArgs[fieldName] == null ) 
182                 ret = "&" + fieldName + "=" + encodeURIComponent(getFunc());
183         return ret;
184 }
185
186 /* ----------------------------------------------------------------------- */
187 function cleanISBN(isbn) {
188    if(isbn) {
189       isbn = isbn.toString().replace(/^\s+/,"");
190       var idx = isbn.indexOf(" ");
191       if(idx > -1) { isbn = isbn.substring(0, idx); }
192    } else isbn = "";
193    return isbn;
194 }       
195
196
197 /* builds a link that goes to the title listings for a metarecord */
198 function buildTitleLink(rec, link) {
199         if(!rec) return;
200         link.appendChild(text(normalize(truncate(rec.title(), 65))));
201         var args = {};
202         args.page = RRESULT;
203         args[PARAM_OFFSET] = 0;
204         args[PARAM_MRID] = rec.doc_id();
205         link.setAttribute("href", buildOPACLink(args));
206 }
207
208 function buildTitleDetailLink(rec, link) {
209         if(!rec) return;
210         link.appendChild(text(normalize(truncate(rec.title(), 65))));
211         var args = {};
212         args.page = RDETAIL;
213         args[PARAM_OFFSET] = 0;
214         args[PARAM_RID] = rec.doc_id();
215         link.setAttribute("href", buildOPACLink(args));
216 }
217
218 /* 'type' is one of STYPE_AUTHOR, STYPE_SUBJECT, ... found in config.js 
219         'trunc' is the number of characters to show in the string, defaults to 65 */
220 function buildSearchLink(type, string, linknode, trunc) {
221         if(!trunc) trunc = 65;
222         var args = {};
223         args.page = MRESULT;
224         args[PARAM_OFFSET] = 0;
225         args[PARAM_TERM] = string;
226         args[PARAM_STYPE] = type;
227         linknode.appendChild(text(normalize(truncate(string, trunc))));
228         linknode.setAttribute("href", buildOPACLink(args));
229 }
230
231
232 /* ----------------------------------------------------------------------- */
233 /* user session handling */
234 /* ----------------------------------------------------------------------- */
235 /* session is the login session.  If no session is provided, we attempt
236         to find one in the cookies.  If 'force' is true we retrieve the 
237         user from the server even if there is already a global user present.
238         if ses != G.user.session, we also force a grab */
239 var cookie = new cookieObject("ses", 1, "/", COOKIE_SES);
240 function grabUser(ses, force) {
241
242         if(!ses) ses = cookie.get(COOKIE_SES);
243         try{if(!ses && isXUL()) ses = xulG['auth_ses'][0];}catch(e){}
244         if(!ses) return false;
245
246         //alert(ses);
247
248         if(!force) 
249                 if(G.user && G.user.session == ses)
250                         return G.user;
251
252         /* first make sure the session is valid */
253         var request = new Request(FETCH_SESSION, ses );
254         request.send(true);
255         var user = request.result();
256         if( !(typeof user == 'object' && user._isfieldmapper) ) {
257                 return false;
258         }
259
260         G.user = user;
261         G.user.fleshed = false;
262         G.user.session = ses;
263         cookie.put(COOKIE_SES, ses);
264         cookie.write();
265
266         grabUserPrefs();
267         if(G.user.prefs['opac.hits_per_page'])
268                 COUNT = parseInt(G.user.prefs['opac.hits_per_page']);
269
270         return G.user;
271
272 }
273
274
275 /* sets the 'prefs' field of the user object to their preferences 
276         and returns the preferences */
277 function grabUserPrefs(user, force) {
278         if(user == null) user = G.user;
279         if(!force && user.prefs) return user.prefs;     
280         var req = new Request(FETCH_USER_PREFS, user.session, user.id());
281         req.send(true);
282         user.prefs = req.result();
283         return user.prefs;
284 }
285
286 function grabFleshedUser() {
287
288         if(!G.user || !G.user.session) {
289                 grabUser();     
290                 if(!G.user || !G.user.session) return null;
291         }
292
293         if(G.user.fleshed) return G.user;
294
295    var req = new Request(FETCH_FLESHED_USER, G.user.session);
296         req.send(true);
297
298         G.user = req.result();
299
300         if(!G.user || G.user.length == 0) { 
301                 G.user = null; return false; 
302                 cookie.remove(COOKIE_SES);
303         }
304
305         G.user.session = ses;
306         G.user.fleshed = true;
307
308         cookie.put(COOKIE_SES, ses); /*  update the cookie */
309         cookie.write();
310
311         return G.user;
312 }
313
314 var skinCookie = new cookieObject("skin", 1, "/", COOKIE_SKIN);
315 function checkUserSkin(new_skin) {
316
317         return; /* XXX do some debugging with this... */
318
319         var user_skin = getSkin();
320         var cur_skin = grabSkinFromURL();
321
322         if(new_skin) user_skin = new_skin;
323
324         if(!user_skin) {
325
326                 if(grabUser()) {
327                         if(grabUserPrefs()) {
328                                 user_skin = G.user.prefs["opac.skin"];
329                                 skinCookie.put( COOKIE_SKIN, user_skin );
330                                 skinCookie.write();
331                         }
332                 }
333         }
334
335         if(!user_skin) return;
336
337         if( cur_skin != user_skin ) {
338                 var url = buildOPACLink();
339                 goTo(url.replace(cur_skin, user_skin));
340         }
341 }
342
343 function updateUserSetting(setting, value, user) {
344         if(user == null) user = G.user;
345         var a = {};
346         a[setting] = value;
347         var req = new Request( UPDATE_USER_PREFS, user.session, a );
348         req.send(true);
349         return req.result();
350 }
351
352 function commitUserPrefs() {
353         var req = new Request( 
354                 UPDATE_USER_PREFS, G.user.session, G.user.prefs );
355         req.send(true);
356         return req.result();
357 }
358
359 function grabSkinFromURL() {
360         var path = findBasePath();
361         path = path.replace("/xml/", "");
362         var skin = "";
363         for( var i = path.length - 1; i >= 0; i-- ) {
364                 var ch = path.charAt(i);
365                 if(ch == "/") break;
366                 skin += ch;
367         }
368
369         var skin2 = "";
370         for( i = skin.length - 1; i >= 0; i--)
371                 skin2 += skin.charAt(i);
372
373         return skin2;
374 }
375
376
377 /* returns a fleshed G.user on success, false on failure */
378 function doLogin() {
379
380         var uname = G.ui.login.username.value;
381         var passwd = G.ui.login.password.value; 
382
383         var init_request = new Request( LOGIN_INIT, uname );
384    init_request.send(true);
385    var seed = init_request.result();
386
387    if( ! seed || seed == '0') {
388       alert( "Error Communicating with Authentication Server" );
389       return null;
390    }
391
392    var auth_request = new Request( LOGIN_COMPLETE, 
393                 uname, hex_md5(seed + hex_md5(passwd)), "opac", getOrigLocation());
394
395
396    auth_request.send(true);
397    var auth_result = auth_request.result();
398
399         var code = checkILSEvent(auth_result);
400         if(code) { alertILSEvent(code); return null; }
401
402         var u = grabUser(auth_result.payload.authtoken, true);
403         AUTHTIME = parseInt(auth_result.payload.authtime);
404         if(u) runEvt( "common", "locationChanged", u.home_ou(), findOrgDepth(u.home_ou()) );
405
406         checkUserSkin();
407
408         return u;
409 }
410
411 function doLogout() {
412
413         /* be nice and delete the session from the server */
414         if(G.user && G.user.session) { 
415                 var req = new Request(LOGIN_DELETE, G.user.session);
416       req.send(true);
417                 try { req.result(); } catch(E){}
418     }
419
420         G.user = null;
421         cookie.remove(COOKIE_SES);
422         skinCookie.remove(COOKIE_SKIN);
423         checkUserSkin("default");
424         COUNT = 10;
425
426         var args = {};
427         args[PARAM_TERM] = "";
428         args[PARAM_LOCATION] = globalOrgTree.id();
429         args[PARAM_DEPTH] = findOrgDepth(globalOrgTree);
430         args.page = "home";
431
432         goTo(buildOPACLink(args));
433 }
434
435
436 function hideMe(obj) { addCSSClass(obj, config.css.hide_me); } 
437 function unHideMe(obj) { removeCSSClass(obj, config.css.hide_me); }
438
439
440 /* ----------------------------------------------------------------------- */
441 /* build the org tree */
442 /* ----------------------------------------------------------------------- */
443 function drawOrgTree() {
444         //G.ui.common.org_tree.innerHTML = buildOrgSelector().toString();
445         //buildOrgSelector(G.ui.common.org_tree, orgTreeSelector);
446         setTimeout( 'buildOrgSelector(G.ui.common.org_tree, orgTreeSelector);', 10 );
447 }
448         
449 var orgTreeSelector;
450 function buildOrgSelector(node) {
451         //var tree = new dTree("orgTreeSelector"); 
452         var tree = new SlimTree(node,'orgTreeSelector');
453         orgTreeSelector = tree;
454         for( var i in orgArraySearcher ) { 
455                 var node = orgArraySearcher[i];
456                 if( node == null ) continue;
457                 if(node.parent_ou() == null)
458                         tree.addNode(node.id(), -1, node.name(), 
459                                 "javascript:orgSelect(" + node.id() + ");", node.name());
460                 else {
461                         tree.addNode(node.id(), findOrgUnit(node.parent_ou()).id(), node.name(), 
462                                 "javascript:orgSelect(" + node.id() + ");", node.name());
463                 }
464         }
465         hideMe($('org_loading_div'));
466         unHideMe($('org_selector_tip'));
467         return tree;
468 }
469
470 function orgSelect(id) {
471         showCanvas();
472         runEvt("common", "locationChanged", id, findOrgDepth(id) );
473
474         removeChildren(G.ui.common.now_searching);
475         G.ui.common.now_searching.appendChild(text(findOrgUnit(id).name()));
476 }
477
478 var fontCookie = new cookieObject("fonts", 1, "/", COOKIE_FONT);
479 function setFontSize(size) {
480         scaleFonts(size);
481         fontCookie.put(COOKIE_FONT, size);
482         fontCookie.write();
483 }
484
485
486 var resourceFormats = [
487    "text",
488    "moving image",
489    "sound recording", "software, multimedia",
490    "still images",
491    "cartographic",
492    "mixed material",
493    "notated music",
494    "three dimensional object" ];
495
496
497 function modsFormatToMARC(format) {
498    switch(format) {
499       case "text":
500          return "at";
501       case "moving image":
502          return "g";
503       case "sound recording":
504          return "ij";
505       case "sound recording-nonmusical":
506          return "i";
507       case "sound recording-musical":
508          return "j";
509       case "software, multimedia":
510          return "m";
511       case "still images":
512          return "k";
513       case "cartographic":
514          return "ef";
515       case "mixed material":
516          return "op";
517       case "notated music":
518          return "cd";
519       case "three dimensional object":
520          return "r";
521    }
522    return "at";
523 }
524
525
526 function MARCFormatToMods(format) {
527    switch(format) {
528       case "a":
529       case "t":
530          return "text";
531       case "g":
532          return "moving image";
533       case "i":
534          return "sound recording-nonmusical";
535       case "j":
536          return "sound recording-musical";
537       case "m":
538          return "software, multimedia";
539       case "k":
540          return "still images";
541       case "e":
542       case "f":
543          return "cartographic";
544       case "o":
545       case "p":
546          return "mixed material";
547       case "c":
548       case "d":
549          return "notated music";
550       case "r":
551          return "three dimensional object";
552    }
553    return "text";
554 }
555
556 function setResourcePic( img, resource ) {
557         img.setAttribute( "src", "../../../images/tor/" + resource + ".jpg");
558         img.title = resource;
559 }
560
561
562
563 function msg( text ) {
564         try {
565                 alert( text );
566         } catch(e) {}
567 }
568
569 function findRecord(id,type) {
570         try {
571                 for( var i = 0; i != recordsCache.length; i++ ) {
572                         var rec = recordsCache[i];
573                         if( rec && rec.doc_id() == id ) return rec;
574                 }
575         } catch(E){}
576         var meth = FETCH_RMODS
577         if(type == 'M') meth = FETCH_MRMODS;
578         var req = new Request(meth, id);
579         req.send(true);
580         return req.result();
581 }
582
583 function Timer(name, node){
584         this.name = name;
585         this.count = 1;
586         this.node = node;
587 }
588 Timer.prototype.start = 
589         function(){_timerRun(this.name);}
590 Timer.prototype.stop = 
591         function(){this.done = true;}
592 function _timerRun(tname) {
593         var _t;
594         eval('_t='+tname);
595         if(_t.done) return;
596         var str = ' . ';
597         if( (_t.count % 5) == 0 ) 
598                 str = _t.count / 5;
599         _t.node.appendChild(text(str));
600         setTimeout("_timerRun('"+tname+"');", 200);
601         _t.count++;
602 }
603
604
605
606 function checkILSEvent(obj) {
607         if( obj.ilsevent != null && obj.ilsevent != 0 )
608                 return parseInt(obj.ilsevent);
609         return null;
610 }
611 function alertILSEvent(code) {
612         /*alert(code);*/
613         alert( $('ilsevent.' + code).innerHTML );
614 }
615
616