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