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