]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/src/javascript/lib/js/opac/opac_utils.js
2fdbde16a4571574fd0a62ca2d456155a4fc4f8a
[working/Evergreen.git] / Open-ILS / src / javascript / lib / js / opac / opac_utils.js
1 var IAMXUL = false;
2 function isXUL() { return IAMXUL; }
3
4
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]);
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
19
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]);
27         }
28         hideMe(G.ui.common.loading);
29         unHideMe(G.ui.common.canvas_main);
30         G.ui.searchbar.text.focus(); /* focus the searchbar */
31 }
32
33
34 var newCanvasNode;
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]);
39
40         hideMe(G.ui.common.loading);
41         hideMe(G.ui.common.canvas_main);
42         unHideMe(newCanvasNode);
43 }
44 /* ----------------------------------------------------------------------- */
45
46
47 /* finds the name of the current page */
48 function findCurrentPage() {
49         for( var p in config.page ) {
50                 var path = location.pathname;
51
52                 if(!path.match(/.*\.xml$/))
53                         path += "index.xml"; /* in case they go to  / */
54
55                 if( config.page[p] == path)
56                         return p;
57         }
58         return null;
59 }
60
61
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)
64  */
65 function  buildOPACLink(args, slim) {
66
67         if(!args) args = {};
68
69         if(!slim) {
70                 var string = location.protocol + "//" + location.host;
71                 if(args.page) string += config.page[args.page];
72                 else string += config.page[findCurrentPage()];
73         }
74
75         string += "?";
76
77         for( var x in args ) {
78                 if(x == "page" || args[x] == null) continue;
79                 string += "&" + x + "=" + encodeURIComponent(args[x]);
80         }
81
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(/\?\&/,"?");    
93 }
94
95 function _appendParam( fieldVar, fieldName, overrideArgs, getFunc, string ) {
96         var ret = "";
97         if( fieldVar != null && overrideArgs[fieldName] == null ) 
98                 ret = "&" + fieldName + "=" + encodeURIComponent(getFunc());
99         return ret;
100 }
101
102
103
104
105
106 /* ----------------------------------------------------------------------- */
107 /* some useful exceptions */
108 function EX(message) { this.init(message); }
109
110 EX.prototype.init = function(message) {
111    this.message = message;
112 }
113
114 EX.prototype.toString = function() {
115    return "\n *** Exception Occured \n" + this.message;
116 }  
117
118 EXCommunication.prototype              = new EX();
119 EXCommunication.prototype.constructor  = EXCommunication;
120 EXCommunication.baseClass              = EX.prototype.constructor;
121
122 function EXCommunication(message) {
123    this.init("EXCommunication: " + message);
124 }                          
125 /* ----------------------------------------------------------------------- */
126
127 function cleanISBN(isbn) {
128    if(isbn) {
129       isbn = isbn.toString().replace(/^\s+/,"");
130       var idx = isbn.indexOf(" ");
131       if(idx > -1) { isbn = isbn.substring(0, idx); }
132    } else isbn = "";
133    return isbn;
134 }       
135
136
137
138
139 /* ----------------------------------------------------------------------- */
140 /* builds a link that goes to the title listings for a metarecord */
141 function buildTitleLink(rec, link) {
142
143         var t = rec.title(); 
144         t = normalize(truncate(t, 65));
145         link.appendChild(text(t));
146
147         var args = {};
148         args.page = RRESULT;
149         args[PARAM_OFFSET] = 0;
150         args[PARAM_MRID] = rec.doc_id();
151         link.setAttribute("href", buildOPACLink(args));
152 }
153
154 function buildTitleDetailLink(rec, link) {
155
156         var t = rec.title(); 
157         t = normalize(truncate(t, 65));
158         link.appendChild(text(t));
159
160         var args = {};
161         args.page = RDETAIL;
162         args[PARAM_OFFSET] = 0;
163         args[PARAM_RID] = rec.doc_id();
164         link.setAttribute("href", buildOPACLink(args));
165 }
166
167 /* builds an author search link */
168 function buildAuthorLink(rec, link) {
169
170         var a = rec.author(); 
171         a = normalize(truncate(a, 65));
172         link.appendChild(text(a));
173
174         var args = {};
175         args.page = MRESULT;
176         args[PARAM_OFFSET] = 0;
177         args[PARAM_STYPE] = STYPE_AUTHOR;
178         args[PARAM_TERM] = rec.author();
179         link.setAttribute("href", buildOPACLink(args));
180
181 }
182 /* ----------------------------------------------------------------------- */
183
184
185
186 /* ----------------------------------------------------------------------- */
187 /* user session handling */
188 /* ----------------------------------------------------------------------- */
189
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) {
197
198         if(!ses) ses = cookie.get(COOKIE_SES);
199         if(!ses) return false;
200
201         if(!force) 
202                 if(G.user && G.user.session == ses)
203                         return G.user;
204
205
206         /* first make sure the session is valid */
207         var request = new Request(FETCH_SESSION, ses );
208         request.send(true);
209         var user = request.result();
210         if( !(typeof user == 'object' && user._isfieldmapper) ) {
211                 return false;
212         }
213
214                 
215    var req = new Request(FETCH_FLESHED_USER, ses);
216         req.send(true);
217
218         G.user = req.result();
219
220         if(!G.user || G.user.length == 0) { 
221                 G.user = null; return false; 
222                 cookie.remove(COOKIE_SES);
223         }
224
225         G.user.session = ses;
226         cookie.put(COOKIE_SES, ses);
227         cookie.write();
228
229         return G.user;
230
231 }
232
233
234 /* returns a fleshed G.user on success, false on failure */
235 function doLogin() {
236
237         var uname = G.ui.login.username.value;
238         var passwd = G.ui.login.password.value; 
239
240         var init_request = new Request( LOGIN_INIT, uname );
241    init_request.send(true);
242    var seed = init_request.result();
243
244    if( ! seed || seed == '0') {
245       alert( "Error Communicating with Authentication Server" );
246       return null;
247    }
248
249    var auth_request = new Request( LOGIN_COMPLETE, 
250                 uname, hex_md5(seed + hex_md5(passwd)), "opac");
251
252    auth_request.send(true);
253    var auth_result = auth_request.result();
254
255    if(auth_result == '0' || auth_result == null || auth_result.length == 0) { return false; }
256
257         var u = grabUser(auth_result, true);
258         if(u) updateLoc(u.home_ou(), findOrgDepth(u.home_ou()));
259
260         return u;
261 }
262
263 function doLogout() {
264
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);
268       req.send(true);
269                 try { req.result(); } catch(E){}
270     }
271
272         G.user = null;
273         cookie.remove(COOKIE_SES);
274
275         hideMe(G.ui.sidebar.logoutbox);
276         unHideMe(G.ui.sidebar.loginbox);
277         hideMe(G.ui.sidebar.logged_in_as);
278
279 }
280
281
282 function hideMe(obj) { addCSSClass(obj, config.css.hide_me); } 
283 function unHideMe(obj) { removeCSSClass(obj, config.css.hide_me); }
284
285
286 /* ----------------------------------------------------------------------- */
287 /* build the org tree */
288 /* ----------------------------------------------------------------------- */
289         
290 var orgTreeSelector;
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());
299                 else {
300                         tree.add(node.id(), node.parent_ou().id(), node.name(), 
301                                 "javascript:orgSelect(" + node.id() + ");", node.name());
302                 }
303         }
304         orgTreeSelector = tree;
305         return tree;
306 }
307
308 function orgSelect(id) {
309         showCanvas();
310         updateLoc(id);
311 }
312
313
314 /* ------------------------------------------------------------------------------------------------------ */
315 /* org tree utilities */
316 /* ------------------------------------------------------------------------------------------------------ */
317
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();
321 }
322
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) ) 
330                         return t;
331         }
332         return null;
333 }
334
335
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];
340 }
341
342
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();
348         while( node ) {
349                 na.push(node);
350                 node = findOrgUnit(node.parent_ou());
351         }
352         return na.reverse();
353 }
354
355
356 /* returns an array of sibling org units */
357 function findSiblingOrgs(node) { return findOrgUnit(node.parent_ou()).children(); }
358 /* ------------------------------------------------------------------------------------------------------ */
359
360
361
362
363
364
365