From a5033cb4fe572f05150faa865180dee219e86098 Mon Sep 17 00:00:00 2001 From: erickson Date: Fri, 19 Aug 2005 19:27:32 +0000 Subject: [PATCH] adding git-svn-id: svn://svn.open-ils.org/ILS/trunk@1681 dcc99617-32d9-48b4-a31d-7c20da2025e4 --- Open-ILS/web/opac/common/css/dtree.css | 34 ++ Open-ILS/web/opac/common/css/largefont.css | 13 + Open-ILS/web/opac/common/css/mediumfont.css | 13 + Open-ILS/web/opac/common/css/smallfont.css | 13 + Open-ILS/web/opac/common/js/CGI.js | 74 +++ Open-ILS/web/opac/common/js/Cookie.js | 173 +++++++ Open-ILS/web/opac/common/js/JSON.js | 135 ++++++ Open-ILS/web/opac/common/js/OrgTree.js | 37 ++ Open-ILS/web/opac/common/js/RemoteRequest.js | 204 +++++++++ Open-ILS/web/opac/common/js/config.js | 199 ++++++++ Open-ILS/web/opac/common/js/dtree.js | 324 +++++++++++++ Open-ILS/web/opac/common/js/fmcore.js | 8 + Open-ILS/web/opac/common/js/fmgen.js | 64 +++ Open-ILS/web/opac/common/js/init.js | 21 + Open-ILS/web/opac/common/js/md5.js | 256 +++++++++++ Open-ILS/web/opac/common/js/opac_utils.js | 431 ++++++++++++++++++ Open-ILS/web/opac/common/js/utils.js | 272 +++++++++++ Open-ILS/web/opac/images/main_logo.jpg | Bin 0 -> 18309 bytes Open-ILS/web/opac/images/orgtree/base.gif | Bin 0 -> 1040 bytes Open-ILS/web/opac/images/orgtree/cd.gif | Bin 0 -> 239 bytes Open-ILS/web/opac/images/orgtree/empty.gif | Bin 0 -> 62 bytes Open-ILS/web/opac/images/orgtree/folder.gif | Bin 0 -> 372 bytes .../web/opac/images/orgtree/folderopen.gif | Bin 0 -> 376 bytes Open-ILS/web/opac/images/orgtree/globe.gif | Bin 0 -> 1095 bytes .../web/opac/images/orgtree/imgfolder.gif | Bin 0 -> 622 bytes Open-ILS/web/opac/images/orgtree/join.gif | Bin 0 -> 69 bytes .../web/opac/images/orgtree/joinbottom.gif | Bin 0 -> 66 bytes Open-ILS/web/opac/images/orgtree/line.gif | Bin 0 -> 66 bytes Open-ILS/web/opac/images/orgtree/minus.gif | Bin 0 -> 86 bytes .../web/opac/images/orgtree/minusbottom.gif | Bin 0 -> 85 bytes .../web/opac/images/orgtree/musicfolder.gif | Bin 0 -> 633 bytes .../web/opac/images/orgtree/nolines_minus.gif | Bin 0 -> 861 bytes .../web/opac/images/orgtree/nolines_plus.gif | Bin 0 -> 870 bytes Open-ILS/web/opac/images/orgtree/page.gif | Bin 0 -> 582 bytes Open-ILS/web/opac/images/orgtree/plus.gif | Bin 0 -> 89 bytes .../web/opac/images/orgtree/plusbottom.gif | Bin 0 -> 88 bytes Open-ILS/web/opac/images/orgtree/question.gif | Bin 0 -> 1044 bytes Open-ILS/web/opac/images/orgtree/trash.gif | Bin 0 -> 1051 bytes Open-ILS/web/opac/images/small_logo.jpg | Bin 0 -> 2385 bytes Open-ILS/web/opac/images/tor/cartographic.jpg | Bin 0 -> 690 bytes .../web/opac/images/tor/mixed material.jpg | Bin 0 -> 525 bytes Open-ILS/web/opac/images/tor/moving image.jpg | Bin 0 -> 540 bytes .../web/opac/images/tor/notated music.jpg | Bin 0 -> 1826 bytes .../opac/images/tor/software, multimedia.jpg | Bin 0 -> 442 bytes .../images/tor/sound recording-musical.jpg | Bin 0 -> 168 bytes .../images/tor/sound recording-nonmusical.jpg | Bin 0 -> 168 bytes .../web/opac/images/tor/sound recording.jpg | Bin 0 -> 168 bytes Open-ILS/web/opac/images/tor/still images.jpg | Bin 0 -> 287 bytes .../images/tor/three dimensional object.jpg | Bin 0 -> 1964 bytes Open-ILS/web/opac/locale/en-US/lang.dtd | 26 ++ 50 files changed, 2297 insertions(+) create mode 100644 Open-ILS/web/opac/common/css/dtree.css create mode 100644 Open-ILS/web/opac/common/css/largefont.css create mode 100644 Open-ILS/web/opac/common/css/mediumfont.css create mode 100644 Open-ILS/web/opac/common/css/smallfont.css create mode 100644 Open-ILS/web/opac/common/js/CGI.js create mode 100644 Open-ILS/web/opac/common/js/Cookie.js create mode 100644 Open-ILS/web/opac/common/js/JSON.js create mode 100644 Open-ILS/web/opac/common/js/OrgTree.js create mode 100644 Open-ILS/web/opac/common/js/RemoteRequest.js create mode 100644 Open-ILS/web/opac/common/js/config.js create mode 100644 Open-ILS/web/opac/common/js/dtree.js create mode 100644 Open-ILS/web/opac/common/js/fmcore.js create mode 100644 Open-ILS/web/opac/common/js/fmgen.js create mode 100644 Open-ILS/web/opac/common/js/init.js create mode 100644 Open-ILS/web/opac/common/js/md5.js create mode 100644 Open-ILS/web/opac/common/js/opac_utils.js create mode 100644 Open-ILS/web/opac/common/js/utils.js create mode 100644 Open-ILS/web/opac/images/main_logo.jpg create mode 100644 Open-ILS/web/opac/images/orgtree/base.gif create mode 100644 Open-ILS/web/opac/images/orgtree/cd.gif create mode 100644 Open-ILS/web/opac/images/orgtree/empty.gif create mode 100644 Open-ILS/web/opac/images/orgtree/folder.gif create mode 100644 Open-ILS/web/opac/images/orgtree/folderopen.gif create mode 100644 Open-ILS/web/opac/images/orgtree/globe.gif create mode 100644 Open-ILS/web/opac/images/orgtree/imgfolder.gif create mode 100644 Open-ILS/web/opac/images/orgtree/join.gif create mode 100644 Open-ILS/web/opac/images/orgtree/joinbottom.gif create mode 100644 Open-ILS/web/opac/images/orgtree/line.gif create mode 100644 Open-ILS/web/opac/images/orgtree/minus.gif create mode 100644 Open-ILS/web/opac/images/orgtree/minusbottom.gif create mode 100644 Open-ILS/web/opac/images/orgtree/musicfolder.gif create mode 100644 Open-ILS/web/opac/images/orgtree/nolines_minus.gif create mode 100644 Open-ILS/web/opac/images/orgtree/nolines_plus.gif create mode 100644 Open-ILS/web/opac/images/orgtree/page.gif create mode 100644 Open-ILS/web/opac/images/orgtree/plus.gif create mode 100644 Open-ILS/web/opac/images/orgtree/plusbottom.gif create mode 100644 Open-ILS/web/opac/images/orgtree/question.gif create mode 100644 Open-ILS/web/opac/images/orgtree/trash.gif create mode 100644 Open-ILS/web/opac/images/small_logo.jpg create mode 100644 Open-ILS/web/opac/images/tor/cartographic.jpg create mode 100644 Open-ILS/web/opac/images/tor/mixed material.jpg create mode 100644 Open-ILS/web/opac/images/tor/moving image.jpg create mode 100644 Open-ILS/web/opac/images/tor/notated music.jpg create mode 100644 Open-ILS/web/opac/images/tor/software, multimedia.jpg create mode 100644 Open-ILS/web/opac/images/tor/sound recording-musical.jpg create mode 100644 Open-ILS/web/opac/images/tor/sound recording-nonmusical.jpg create mode 100644 Open-ILS/web/opac/images/tor/sound recording.jpg create mode 100644 Open-ILS/web/opac/images/tor/still images.jpg create mode 100644 Open-ILS/web/opac/images/tor/three dimensional object.jpg create mode 100644 Open-ILS/web/opac/locale/en-US/lang.dtd diff --git a/Open-ILS/web/opac/common/css/dtree.css b/Open-ILS/web/opac/common/css/dtree.css new file mode 100644 index 0000000000..b201c2fd60 --- /dev/null +++ b/Open-ILS/web/opac/common/css/dtree.css @@ -0,0 +1,34 @@ +/*--------------------------------------------------| +| dTree 2.05 | www.destroydrop.com/javascript/tree/ | +|---------------------------------------------------| +| Copyright (c) 2002-2003 Geir Landrö | +|--------------------------------------------------*/ + +.dtree { + font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; + font-size: 11px; + color: #666; + white-space: nowrap; +} +.dtree img { + border: 0px; + vertical-align: middle; +} +.dtree a { + color: #333; + text-decoration: none; +} +.dtree a.node, .dtree a.nodeSel { + white-space: nowrap; + padding: 1px 2px 1px 2px; +} +.dtree a.node:hover, .dtree a.nodeSel:hover { + color: #333; + text-decoration: underline; +} +.dtree a.nodeSel { + background-color: #c0d2ec; +} +.dtree .clip { + overflow: hidden; +} \ No newline at end of file diff --git a/Open-ILS/web/opac/common/css/largefont.css b/Open-ILS/web/opac/common/css/largefont.css new file mode 100644 index 0000000000..18c86dde48 --- /dev/null +++ b/Open-ILS/web/opac/common/css/largefont.css @@ -0,0 +1,13 @@ +body { font-family: Helvetica, Arial, Tahoma, sans-serif; font-size: 1.5em; } +body table { font-size: inherit; } + +.org_link { font-size: 92%; } +.sidebar_extra_item { font-size: 95%; } +.searchbar_tag { font-size: 90%; } +#offset_start { font-weight: 600; } +#offset_end { font-weight: 600; } +#result_count { font-weight: 600; } +.nav_link_active { font-weight: 600;} +.copy_count_cell { font-size: 80%; } + + diff --git a/Open-ILS/web/opac/common/css/mediumfont.css b/Open-ILS/web/opac/common/css/mediumfont.css new file mode 100644 index 0000000000..576273849c --- /dev/null +++ b/Open-ILS/web/opac/common/css/mediumfont.css @@ -0,0 +1,13 @@ +body { font-family: Helvetica, Arial, Tahoma, sans-serif; font-size: 75%;} +body table { font-size: inherit; } + +.org_link { font-size: 92%; } +.sidebar_extra_item { font-size: 95%; } +.searchbar_tag { font-size: 90%; } +#offset_start { font-weight: 600; } +#offset_end { font-weight: 600; } +#result_count { font-weight: 600; } +.nav_link_active { font-weight: 600;} +.copy_count_cell { font-size: 80%; } + + diff --git a/Open-ILS/web/opac/common/css/smallfont.css b/Open-ILS/web/opac/common/css/smallfont.css new file mode 100644 index 0000000000..594aac12de --- /dev/null +++ b/Open-ILS/web/opac/common/css/smallfont.css @@ -0,0 +1,13 @@ +body { font-family: Helvetica, Arial, Tahoma, sans-serif; font-size: 50%; } +body table { font-size: inherit; } + +.org_link { font-size: 92%; } +.sidebar_extra_item { font-size: 95%; } +.searchbar_tag { font-size: 90%; } +#offset_start { font-weight: 600; } +#offset_end { font-weight: 600; } +#result_count { font-weight: 600; } +.nav_link_active { font-weight: 600;} +.copy_count_cell { font-size: 80%; } + + diff --git a/Open-ILS/web/opac/common/js/CGI.js b/Open-ILS/web/opac/common/js/CGI.js new file mode 100644 index 0000000000..7d11096f48 --- /dev/null +++ b/Open-ILS/web/opac/common/js/CGI.js @@ -0,0 +1,74 @@ +function CGI() { + /* load up the url parameters */ + + this._keys = new Array(); + this.data = new Object(); + + var string = location.search.replace(/^\?/,""); + + var key = ""; + var value = ""; + var inkey = true; + var invalue = false; + + for( var idx = 0; idx!= string.length; idx++ ) { + + var c = string.charAt(idx); + + if( c == "=" ) { + invalue = true; + inkey = false; + continue; + } + + if(c == "&" || c == ";") { + inkey = 1; + invalue = 0; + this.data[key] = decodeURIComponent(value); + this._keys.push(key); + key = ""; value = ""; + continue; + } + + if(inkey) key += c; + else if(invalue) value += c; + } + + this.data[key] = decodeURIComponent(value); + this._keys.push(key); +} + +/* returns the value for the given param. If there is only one value for the + given param, it returns that value. Otherwise it returns an array of values + */ +CGI.prototype.param = function(p) { + if(this.data[p] == null) return null; + + if(this.data[p].length == 1) + return this.data[p][0]; + return this.data[p]; +} + +/* returns an array of param names */ +CGI.prototype.keys = function() { + return this._keys; +} + +/* debuggin method */ +CGI.prototype.toString = function() { + var string = ""; + var keys = this.keys(); + + for( var k in keys ) { + string += keys[k] + " : "; + var params = this.param(keys[k]); + + for( var p in params ) { + string += params[p] + " "; + } + string += "\n"; + } + return string; +} + + diff --git a/Open-ILS/web/opac/common/js/Cookie.js b/Open-ILS/web/opac/common/js/Cookie.js new file mode 100644 index 0000000000..8d4e6e30c8 --- /dev/null +++ b/Open-ILS/web/opac/common/js/Cookie.js @@ -0,0 +1,173 @@ +/* + +DISCLAIMER: THESE JAVASCRIPT FUNCTIONS ARE SUPPLIED 'AS IS', WITH +NO WARRANTY EXPRESSED OR IMPLIED. YOU USE THEM AT YOUR OWN RISK. +PAUL STEPHENS DOES NOT ACCEPT ANY LIABILITY FOR +ANY LOSS OR DAMAGE RESULTING FROM THEIR USE, HOWEVER CAUSED. + +Paul Stephens' cookie-handling object library + +Version 2.1 +2.0 - Introduces field names +2.1 - Fixes bug where undefined embedded fields[] elements weren't written to disk + +www.paulspages.co.uk + +TO USE THIS LIBRARY, INSERT ITS CONTENTS IN THE SECTION +OF YOUR WEB PAGE SOURCE, BEFORE ANY OTHER JAVASCRIPT ROUTINES. + +(C) Paul Stephens, 2001-2003. Feel free to use this code, but please leave this comment block in. This code must not be sold, either alone or as part of an application, without the consent of the author. +*/ + +function cookieObject(name, expires, accessPath) { +var i, j +this.name = name +this.fieldSeparator = "#" +this.found = false +this.expires = expires +this.accessPath = accessPath +this.rawValue = "" +this.fields = new Array() +this.fieldnames = new Array() +if (arguments.length > 3) { // field name(s) specified + j = 0 + for (i = 3; i < arguments.length; i++) { + this.fieldnames[j] = arguments[i] + j++ + } + this.fields.length = this.fieldnames.length +} +this.read = ucRead + +this.write = ucWrite + +this.remove = ucDelete +this.get = ucFieldGet +this.put = ucFieldPut +this.namepos = ucNamePos +this.read() +} + + +function ucFieldGet(fieldname) { +var i = this.namepos(fieldname) +if (i >=0) { + return this.fields[i] +} else { + return "BadFieldName!" +} +} + +function ucFieldPut (fieldname, fieldval) { +var i = this.namepos(fieldname) + +if(i < 0) { + i = this.fieldnames.length; + this.fieldnames[i] = fieldname; +} + +this.fields[i] = fieldval +return true +} + +function ucNamePos(fieldname) { +var i +for (i = 0; i < this.fieldnames.length; i++) { + if (fieldname == this.fieldnames[i]) { + return i + } +} +return -1 +} + + +function ucWrite() { + var cookietext = this.name + "=" + +// concatenate array elements into cookie string +// Special case - single-field cookie, so write without # terminator +if (this.fields.length == 1) { + cookietext += escape(this.fields[0]) + } else { // multi-field cookie + for (i= 0; i < this.fields.length; i++) { + cookietext += escape(this.fields[i]) + this.fieldSeparator } + } + + +// Set expiry parameter, if specified + if (this.expires != null) { + if (typeof(this.expires) == "number") { // Expiry period in days specified + var today=new Date() + var expiredate = new Date() + expiredate.setTime(today.getTime() + 1000*60*60*24*this.expires) + cookietext += "; expires=" + expiredate.toGMTString() + } else { // assume it's a date object + cookietext += "; expires=" + this.expires.toGMTString() + } // end of typeof(this.expires) if + } // end of this.expires != null if + +// add path, if specified + if (this.accessPath != null) { + cookietext += "; PATH="+this.accessPath } + +// write cookie + // alert("writing "+cookietext) + document.cookie = cookietext + return null +} + + +function ucRead() { + var search = this.name + "=" + var CookieString = document.cookie + if(CookieString == null) CookieString = ""; + this.rawValue = null + this.found = false + if (CookieString.length > 0) { + offset = CookieString.indexOf(search) + if (offset != -1) { + offset += search.length + end = CookieString.indexOf(";", offset) + if (end == -1) { // cookie is last item in the string, so no terminator + end = CookieString.length } + this.rawValue = CookieString.substring(offset, end) + this.found = true + } + } + +if (this.rawValue != null) { // unpack into fields + + var sl = this.rawValue.length + var startidx = 0 + var endidx = 0 + var i = 0 + +// Special case - single-field cookies written by other functions, +// so without a '#' terminator + +if (this.rawValue.substr(sl-1, 1) != this.fieldSeparator) { + this.fields[0] = unescape(this.rawValue) + } else { // separate fields + + do + { + endidx = this.rawValue.indexOf(this.fieldSeparator, startidx) + if (endidx !=-1) { + this.fields[i] = unescape(this.rawValue.substring(startidx, endidx)) + i++ + startidx = endidx + 1} + } + while (endidx !=-1 & endidx != (this.rawValue.length -1)); +} +} // end of unpack into fields if block + return this.found +} // end of function + + +function ucDelete() { + this.expires = -10 + this.write() + return this.read() +} + + diff --git a/Open-ILS/web/opac/common/js/JSON.js b/Open-ILS/web/opac/common/js/JSON.js new file mode 100644 index 0000000000..e52a43999d --- /dev/null +++ b/Open-ILS/web/opac/common/js/JSON.js @@ -0,0 +1,135 @@ +// in case we run on an implimentation that doesn't have "undefined"; +var undefined; + +function Cast (obj, class_constructor) { + try { + if (eval(class_constructor + '["_isfieldmapper"]')) { + obj = eval("new " + class_constructor + "(obj)"); + } + } catch( E ) { + alert( E + "\n"); + } finally { + return obj; + } +} + +function JSON2js (json) { + + json = String(json).replace( /\/\*--\s*S\w*?\s*?\s+\w+\s*--\*\//g, 'Cast('); + json = String(json).replace( /\/\*--\s*E\w*?\s*?\s+(\w+)\s*--\*\//g, ', "$1")'); + + var obj; + if (json != '') { + try { + eval( 'obj = ' + json ); + } catch(E) { + debug("Error building JSON object with string " + E + "\nString:\n" + json ); + return null; + } + } + return obj; +} + + +function object2Array(obj) { + if( obj == null ) return null; + + var arr = new Array(); + for( var i = 0; i < obj.length; i++ ) { + arr[i] = obj[i]; + } + return arr; +} + + +function js2JSON(arg) { + return _js2JSON(arg); +} + +function _js2JSON(arg) { + var i, o, u, v; + + switch (typeof arg) { + case 'object': + + if(arg) { + + if (arg._isfieldmapper) { /* magi-c-ast for fieldmapper objects */ + + if( arg.a.constructor != Array ) { + var arr = new Array(); + for( var i = 0; i < arg.a.length; i++ ) { + if( arg.a[i] == null ) { + arr[i] = null; continue; + } + + if( typeof arg.a[i] != 'object' ) { + arr[i] = arg.a[i]; + + } else if( typeof arg.a[i] == 'object' + && arg.a[i]._isfieldmapper) { + + arr[i] = arg.a[i]; + + } else { + arr[i] = object2Array(arg.a[i]); + } + } + arg.a = arr; + } + + return "/*--S " + arg.classname + " --*/" + js2JSON(arg.a) + "/*--E " + arg.classname + " --*/"; + + } else { + + if (arg.constructor == Array) { + o = ''; + for (i = 0; i < arg.length; ++i) { + v = js2JSON(arg[i]); + if (o) { + o += ','; + } + if (v !== u) { + o += v; + } else { + o += 'null'; + } + } + return '[' + o + ']'; + + } else if (typeof arg.toString != 'undefined') { + o = ''; + for (i in arg) { + v = js2JSON(arg[i]); + if (v !== u) { + if (o) { + o += ','; + } + o += js2JSON(i) + ':' + v; + } + } + + o = '{' + o + '}'; + return o; + + } else { + return; + } + } + } + return 'null'; + + case 'unknown': + case 'number': + return arg; + + case 'undefined': + case 'function': + return u; + + case 'string': + default: + return '"' + String(arg).replace(/(["\\])/g, '\\$1') + '"'; + } + +} diff --git a/Open-ILS/web/opac/common/js/OrgTree.js b/Open-ILS/web/opac/common/js/OrgTree.js new file mode 100644 index 0000000000..0a51e0055f --- /dev/null +++ b/Open-ILS/web/opac/common/js/OrgTree.js @@ -0,0 +1,37 @@ +var _l = [[1,1,,"Pines"],[146,3,143,"Alexander Public Library"],[64,3,62,"Alma-Bacon County Public Library"],[135,3,134,"Ambrose Public Library"],[278,3,277,"Appleby Branch Library"],[63,3,62,"Appling County Public Library"],[262,3,261,"Arlington Branch Library"],[9,2,1,"Athens Regional Library"],[10,3,9,"Athens-Clarke County Library"],[189,3,188,"Auburn Public Library"],[279,3,277,"Audio/Visual Center/TBC Library"],[288,3,277,"Augusta-Richmond County Public Library"],[255,3,254,"Baker County Library"],[193,3,188,"Banks County Public Library"],[114,3,113,"Barnesville-Lamar County Library"],[218,2,1,"Bartram Trail Regional Library"],[3,3,2,"Berlin Community Library"],[4,3,2,"Berlin Community Library"],[174,3,166,"Betty C. Hagler Public Library"],[66,3,62,"Blackshear Memorial Library"],[161,3,160,"Blackshear Place Library"],[12,3,9,"Bogart Branch Library"],[136,3,134,"Bookmbile--see Douglas-Coffee Co. Library"],[205,3,204,"Bookmbile--see Vidalia-Toombs County Library"],[219,3,218,"Bookmobile"],[272,3,269,"Bookmobile"],[280,3,277,"Bookmobile"],[167,3,166,"Bookmobile"],[65,3,62,"Bookmobile"],[71,3,70,"Bookmobile"],[11,3,9,"Bookmobile"],[24,3,23,"Bookmobile"],[149,3,148,"Bookmobile--See Clarkesville-Habersham Co."],[229,3,228,"Bookmobile--See Louisville Public Library"],[243,3,235,"Bookmobile--See Washington Memorial Library"],[181,3,180,"Bookmobile--see Gilbert H. Gragg Mem. Lib."],[5,3,2,"Bookmobile-See Moultrie-Colquitt County Lib."],[101,3,100,"Bookmobile-See Mountain Regional Lib. Sys."],[85,3,84,"Bookmoible-see Screvens County Library"],[25,3,23,"Bowman Library"],[72,3,70,"Brantley County Library"],[191,3,188,"Braselton Library"],[213,2,1,"Brooks County Library"],[214,3,213,"Brooks County Library"],[137,3,134,"Broxton Public Library"],[169,3,166,"Buchanan - Haralson County Public Library"],[281,3,277,"Burke County Library"],[93,3,92,"Butler Public Library"],[107,3,106,"Byron Public Library"],[263,3,261,"Calhoun County Library"],[73,3,70,"Camden County Public Library"],[271,3,269,"Carrie Dorsey Perry Memorial Library"],[30,3,27,"Cave Spring Branch"],[29,3,27,"Cedartown Branch"],[157,3,156,"Centerville Branch Library"],[36,3,35,"Central Library"],[74,3,70,"Charlton Public Library"],[122,2,1,"Chattooga County Library"],[123,3,122,"Chattooga County Library"],[223,2,1,"Cherokee Regional Library"],[215,2,1,"Chestatee Regional Library"],[224,3,223,"Chickamauga Public Library"],[150,3,148,"Clarkesville-Habersham County Library"],[264,3,261,"Clay County Library"],[127,2,1,"Clayton County Library System"],[129,3,127,"Clayton County Library System"],[162,3,160,"Clermont Branch Library"],[67,3,62,"Clinch County Public Library"],[269,2,1,"Coastal Plain Regional Library"],[275,3,269,"Coastal Plain Regional Library"],[147,3,143,"Cochran Public Library"],[296,3,295,"Cochran-Bleckley/Tessie W. Norris"],[284,3,277,"Columbia County Libraries/Gibbs Memorial"],[192,3,188,"Commerce Public Library"],[125,2,1,"Conyers-Rockdale Library System"],[273,3,269,"Cook County Library"],[152,3,148,"Cornelia-Habersham Library"],[248,3,235,"Crawford County Public Library"],[225,3,223,"Dade County Public Library"],[216,3,215,"Dawson County Library"],[254,2,1,"DeSoto Trail Regional Library"],[35,2,1,"Dougherty County Public Library"],[171,3,166,"Douglas County Public Library"],[138,3,134,"Douglas-Coffee County Library"],[14,3,9,"East Athens Community Center"],[277,2,1,"East Central Georgia Regional Library"],[163,3,160,"East Hall and Special Needs Library"],[236,3,235,"East Wilkinson County Library"],[48,3,41,"Eatonton-Putnam County Library"],[26,3,23,"Elbert County Library"],[23,2,1,"Elbert County Public Library"],[282,3,277,"Euchee Creek Library"],[54,3,53,"Evans County Library"],[94,3,92,"Extension Services"],[102,3,100,"Fannin County Public Library"],[115,3,113,"Fayette County Public Library"],[34,3,33,"Fitzerald-Ben Hill County Library"],[33,2,1,"Fitzgerald-Ben Hill Library"],[113,2,1,"Flint River Regional Library"],[128,3,127,"Forest Park Branch Library"],[144,3,143,"Fortson Public Library"],[59,3,53,"Franklin Memorial Library"],[283,3,277,"Friedman Branch Library"],[237,3,235,"Genealogical and Historical Department"],[182,3,180,"Gilbert H. Gragg Memorial Library"],[285,3,277,"Glascock County Library"],[210,3,204,"Glennville Public Library"],[238,3,235,"Gordon Public Library"],[42,3,41,"Greene County Library"],[95,3,92,"Greenville Area Public Library"],[117,3,113,"Griffin-Spalding County Library"],[164,3,160,"Hall County Library"],[160,2,1,"Hall County Library System"],[43,3,41,"Hancock County Library"],[286,3,277,"Harlem Branch Library"],[196,3,188,"Harold S. Swindle Public Library"],[186,2,1,"Hart County Library"],[187,3,186,"Hart County Library"],[139,3,134,"Hazlehurst-Jeff Davis Public Library"],[257,3,254,"Hdqtrs Library/Camilla"],[172,3,166,"Heard County Public Library"],[143,2,1,"Henry County Library"],[96,3,92,"Hightower Memorial Library"],[156,2,1,"Houston County Public Library"],[77,3,70,"Ida Hilton Public Library"],[239,3,235,"Ideal Public Library"],[274,3,269,"Irwin County Library"],[121,3,113,"J. Joel Edwards Public Library"],[118,3,113,"Jackson-Butts County Public Library"],[258,3,254,"Jakin Public Library"],[183,3,180,"James W. Merritt Memorial Library"],[44,3,41,"Jasper County Library"],[228,2,1,"Jefferson County Library"],[194,3,188,"Jefferson Public Library"],[86,3,84,"Jenkins County Elementary School"],[87,3,84,"Jenkins County High School"],[88,3,84,"Jenkins County Memorial Library"],[203,3,199,"Johnson County Library"],[240,3,235,"Jones County Public Library"],[130,3,127,"Jonesboro Branch Library"],[261,2,1,"Kinchafoonee Regional Library"],[265,3,261,"Kinchafoonee Regional Library"],[55,3,53,"L.C. Anderson Library"],[226,3,223,"LaFayette-Walker County Library"],[206,3,204,"Ladson Genealogical Library"],[207,3,204,"Ladson Genealogical Library"],[51,3,50,"Lake Sinclair Library"],[16,3,9,"Lavonia-Carnegie Library"],[17,3,9,"Lay Park Community Resource Ctr."],[110,2,1,"Lee County Public Library"],[111,3,110,"Lee County Public Library"],[241,3,235,"Library for the Blind & Physically Handicapped"],[287,3,277,"Lincoln County Library"],[145,3,143,"Locust Grove Public Library"],[76,3,70,"Long County Library"],[230,3,228,"Louisville Public Library"],[131,3,127,"Lovejoy Branch Library (projected)"],[256,3,254,"Lucy Maddox Memorial Library"],[217,3,215,"Lumpkin County Library"],[19,3,9,"Lyndon House Arts Ctr"],[299,3,295,"M.E. Roden Public Library"],[13,3,9,"Madison County Library"],[97,3,92,"Manchester Public Library"],[260,3,254,"Margaret Jones Public Library"],[68,3,62,"Marian Anderson Public Library"],[242,3,235,"Marshallville Public Library"],[52,3,50,"Mary Vinson Memorial Library"],[221,3,218,"Mary Willis Library"],[175,3,166,"Maude P. Ragsdale Public Library"],[290,3,277,"Maxwell Branch Library"],[195,3,188,"Maysville Public Library"],[232,3,228,"McCollum Public Library"],[235,2,1,"Middle Georgia Regional Library"],[289,3,277,"Midville Branch Library"],[184,3,180,"Miller County Public Library"],[116,3,113,"Monroe County Library"],[6,3,2,"Monroe Memorial Library"],[7,3,2,"Monroe Memorial Library"],[46,3,41,"Monroe-Walton County Library"],[244,3,235,"Montezuma Carnegie Public Library"],[209,3,204,"Montgomery County Library"],[45,3,41,"Morgan County Library"],[132,3,127,"Morrow Branch Library"],[2,2,1,"Moultrie-Colquitt County Library"],[8,3,2,"Moultrie-Colquitt County Library"],[100,2,1,"Mountain Regional Library"],[103,3,100,"Mountain Regional Library System"],[165,3,160,"Murrayville Branch Library"],[298,3,295,"Murrell Memorial Library"],[126,3,125,"Nancy Guinn Memorial Library"],[208,3,204,"Nelle Brown Memorial Library"],[173,3,166,"Neva Lomason Memorial Library"],[176,3,166,"New Georgia Public Library"],[234,3,233,"Newton County Library Headqtrs."],[233,2,1,"Newton County Library System"],[140,3,134,"Nicholls Public Library"],[159,3,156,"Nola Brantley Memorial Library"],[148,2,1,"Northeast Georgia Regional Library"],[37,3,35,"Northwest Library"],[47,3,41,"O'Kelly Memorial Library"],[295,2,1,"Ocmulgee Regional Library"],[21,3,9,"Oconee County Library"],[199,2,1,"Oconee Regional Library"],[200,3,199,"Oconee Regional Library"],[80,2,1,"Office of Public Library Services"],[18,3,9,"Oglethorpe County Library"],[245,3,235,"Oglethorpe Public Library"],[204,2,1,"Ohoopee Regional Library"],[62,2,1,"Okefenokee Regional Library System"],[28,3,27,"Outreach Collection"],[177,3,166,"Paulding County Public Library"],[108,3,106,"Peach County Law Enforcement Center"],[106,2,1,"Peach Public Libraries"],[119,3,113,"Peachtree City Library"],[141,3,134,"Pearson Public Library"],[259,3,254,"Pelham-Carnegie Library"],[56,3,53,"Pembroke Public Library"],[158,3,156,"Perry Public Library"],[188,2,1,"Piedmont Regional Library System"],[198,3,188,"Piedmont Regional Library-Headquarters"],[190,3,188,"Piedmont-Bookmobile"],[92,2,1,"Pine Mountain Regional Library"],[60,2,1,"Pine Mountain Regional Library System"],[297,3,295,"Public Service Annex"],[154,3,148,"Rabun County Library"],[266,3,261,"Randolph County Public LIbrary"],[247,3,235,"Regional Library"],[98,3,92,"Reynolds Community Library"],[57,3,53,"Richmond Hill Public Library"],[133,3,127,"Riverdale Branch Library"],[249,3,235,"Riverside Branch Library"],[31,3,27,"Rockmart Branch"],[246,3,235,"Rocky Creek Branch Library"],[90,2,1,"Roddenbery Memorial Library"],[91,3,90,"Roddenbery Memorial Library"],[32,3,27,"Rome-Floyd County Library"],[201,3,199,"Rosa M. Tarbutton Memorial Library/Washington Co."],[227,3,223,"Rossville Public Library"],[20,3,9,"Royston Branch Library"],[15,3,9,"Sandy Creek Nature Ctr"],[27,2,1,"Sara Hightower Regional Library"],[292,3,277,"Sardis Branch Library"],[134,2,1,"Satilla Regional Library"],[89,3,84,"Screven County Library"],[84,2,1,"Screven-Jenkins Regional Library"],[185,3,180,"Seminole Public Library"],[250,3,235,"Shurling Branch Library"],[112,3,110,"Smithville Library"],[291,3,277,"South Augusta Branch Library/ Diamond Lakes Branch Library"],[38,3,35,"Southside Library"],[180,2,1,"Southwest Georgia Regional Library"],[78,3,70,"St. Mary's Library"],[81,3,80,"State Library of Georgia Admin. Offices"],[83,3,80,"State Library of Georgia Collection"],[82,3,80,"State Library of Georgia Library for the Blind"],[53,2,1,"Statesboro Regional Library"],[58,3,53,"Statesboro Regional Library"],[197,3,188,"Statham Public Library"],[99,3,92,"Talbot County Library"],[222,3,218,"Taliaferro County Library"],[178,3,166,"Tallapoosa Public Library"],[39,3,35,"Tallulah Massey Library"],[211,3,204,"Tattnall County Library"],[300,3,295,"Telfair County Library"],[267,3,261,"Terrell County Public Library"],[109,3,106,"Thomas Public Library"],[220,3,218,"Thomson-McDuffie County Library"],[70,2,1,"Three Rivers Regional Library"],[75,3,70,"Three Rivers Regional Library"],[276,3,269,"Tifton-Tift County Public Library"],[155,3,148,"Toccoa-Stephens County Library"],[104,3,100,"Towns County Public Library"],[202,3,199,"Treutlen County Library"],[124,3,122,"Trion Public Library"],[251,3,235,"Twiggs County Public Library"],[50,2,1,"Twin Lakes Library"],[120,3,113,"Tyrone Public Library"],[41,2,1,"Uncle Remus Regional Library"],[105,3,100,"Union County Public Library"],[270,3,269,"Victoria Evans Memorial Library"],[212,3,204,"Vidalia-Toombs County Library"],[179,3,166,"Villa Rica Public Library"],[49,3,41,"W. H. Stanton Memorial Library"],[231,3,228,"Wadley Public Library"],[293,3,277,"Wallace Branch Library"],[294,3,277,"Warren County Library"],[168,3,166,"Warren P. Sewell Memorial Library of Bowdon"],[170,3,166,"Warren P. Sewell Memorial Library of Bremen"],[252,3,235,"Washington Memorial Library"],[69,3,62,"Waycross-Ware County Public Library"],[79,3,70,"Wayne County Library"],[268,3,261,"Webster County Public Library"],[253,3,235,"West Bibb Branch Library"],[166,2,1,"West Georgia Regional Library"],[40,3,35,"Westtown Library"],[301,3,295,"Wheeler County Library"],[302,3,295,"Wheeler County Library"],[151,3,148,"White County Library, Cleveland Branch"],[153,3,148,"White County Library, Helen Branch"],[303,3,295,"Wilcox County Public Library"],[142,3,134,"Willacoochee Public Library"],[22,3,9,"Winterville Branch Library"],[61,3,60,"Yatesville Public Library"]]; +var orgArraySearcher = {}; +var globalOrgTree; +for (var i in _l) { + var x = new aou(); + x.id(_l[i][0]); + x.ou_type(_l[i][1]); + x.parent_ou(_l[i][2]); + x.name(_l[i][3]); + orgArraySearcher[x.id()] = x; +} +for (var i in orgArraySearcher) { + var x = orgArraySearcher[i]; + if (x.parent_ou() == null || x.parent_ou() == '') { + globalOrgTree = x; + continue; + } else { + x.parent_ou(orgArraySearcher[x.parent_ou()]); + } + if (!x.parent_ou().children()) + x.parent_ou().children(new Array()); + + x.parent_ou().children().push(x.id()); +} +function _tree_killer () { + for (var i in orgArraySearcher) { + x=orgArraySearcher[i]; + x.children(null); + x.parent_ou(null); + orgArraySearcher[i]=null; + } + globalOrgTree = null; + orgArraySearcher = null; + globalOrgTypes = null; +} + +var globalOrgTypes = JSON2js("[/*--S aout--*/[null,null,null,null,0,0,0,1,\"Consortium\",\"Everywhere in PINES\"]/*--E aout--*/,/*--S aout--*/[null,null,null,null,0,0,1,2,\"System\",\"Local Library System\",1]/*--E aout--*/,/*--S aout--*/[null,null,null,null,1,1,2,3,\"Branch\",\"This Branch\",2]/*--E aout--*/,/*--S aout--*/[null,null,null,null,1,1,3,5,\"Bookmobile\",\"Your Bookmobile\",3]/*--E aout--*/,/*--S aout--*/[null,null,null,null,1,1,3,4,\"Sub-lib\",\"This Specialized Library\",3]/*--E aout--*/]"); diff --git a/Open-ILS/web/opac/common/js/RemoteRequest.js b/Open-ILS/web/opac/common/js/RemoteRequest.js new file mode 100644 index 0000000000..e7fff24c9b --- /dev/null +++ b/Open-ILS/web/opac/common/js/RemoteRequest.js @@ -0,0 +1,204 @@ +var XML_HTTP_GATEWAY = "gateway"; +var XML_HTTP_SERVER = "gapines.org"; +var XML_HTTP_MAX_TRIES = 3; + +var _allrequests = {}; + +function cleanRemoteRequests() { + for( var i in _allrequests ) + destroyRequest(_allrequests[i]); +} + +function destroyRequest(r) { + if(r == null) return; + r.xmlhttp.onreadystatechange = function(){}; + r.xmlhttp = null; + r.callback = null; + r.userdata = null; + _allrequests[r.id] = null; +} + +/* ----------------------------------------------------------------------- */ +/* Request object */ +function RemoteRequest( service, method ) { + + + this.service = service; + this.method = method; + this.xmlhttp = false; + this.name = null; + this.sendCount = 0; + + this.type = "POST"; /* default */ + this.id = service + method + Math.random(); + this.cancelled = false; + + _allrequests[this.id] = this; + + var i = 2; + this.params = ""; + + while(i < arguments.length) { + var object = js2JSON(arguments[i++]); + this.params += "¶m=" + encodeURIComponent(object); + } + + if(!this.params) { this.params = ""; } + this.param_string = "service=" + service + "&method=" + method + this.params; + if( this.buildXMLRequest() == null ) alert("Browser is not supported!"); +} + +/* constructs our XMLHTTPRequest object */ +RemoteRequest.prototype.buildXMLRequest = function() { + + var x; + try { + x = new ActiveXObject("Msxml2.XMLHTTP"); + } catch (e) { + try { + x = new ActiveXObject("Microsoft.XMLHTTP"); + } catch (E) { + x = false; + } + } + + if (!x && typeof XMLHttpRequest!='undefined') x = new XMLHttpRequest(); + + if(!x) { + alert("NEEDS NEWER JAVASCRIPT for XMLHTTPRequest()"); + return null; + } + + this.xmlhttp = x; + return true; +} + + +function _remoteRequestCallback(id) { + + var object = _allrequests[id]; + if(object.cancelled) return; + + if( object.xmlhttp.readyState == 4 ) { + try { + object.callback(object); + } catch(E) { + + /* if we receive a communication error, retry the request up + to XML_HTTP_MAX_TRIES attempts */ + if( instanceOf(E, EXCommunication) ) { + + if(object.sendCount >= XML_HTTP_MAX_TRIES ) { + if(isXUL()) throw object; + else alert("Arrrgghh, Matey! Error communicating:\n" + E + "\n" + object.param_string); + } else { + object.buildXMLRequest(); + object.send(); + return; + } + } else { throw E; } + + } finally { + destroyRequest(object); + object = null; + } + } +} + + +/* define the callback we use when this request has received + all of its data */ +RemoteRequest.prototype.setCompleteCallback = function(callback) { + if(this.cancelled) return; + this.callback = callback; + var id = this.id; + this.xmlhttp.onreadystatechange = function() { _remoteRequestCallback(id); } +} + + +/* http by default. This makes it https. *ONLY works when + embedded in a XUL app. */ +RemoteRequest.prototype.setSecure = function(bool) { + this.secure = bool; +} + +RemoteRequest.prototype.send = function(blocking) { + + if(this.cancelled) return; + + /* determine the xmlhttp server dynamically */ + var url = location.protocol + "//" + location.host + "/" + XML_HTTP_GATEWAY; + + if(isXUL()) { + if(this.secure) + url = "https://" + XML_HTTP_SERVER + "/" + XML_HTTP_GATEWAY; + else + url = "http://" + XML_HTTP_SERVER + "/" + XML_HTTP_GATEWAY; + } + + var data = null; + + if( this.type == 'GET' ) { + url += "?" + this.param_string; + } + + if(blocking) { + this.xmlhttp.open(this.type, url, false); + } else { + this.xmlhttp.open(this.type, url, true); + } + + + if( this.type == 'POST' ) { + data = this.param_string; + this.xmlhttp.setRequestHeader('Content-Type', + 'application/x-www-form-urlencoded'); + } + + this.xmlhttp.send( data ); + this.sendCount += 1; + return this; +} + +/* returns the actual response text from the request */ +RemoteRequest.prototype.getText = function() { + return this.xmlhttp.responseText; +} + +RemoteRequest.prototype.isReady = function() { + return this.xmlhttp.readyState == 4; +} + + +/* returns the JSON->js result object */ +RemoteRequest.prototype.getResultObject = function() { + if(this.cancelled) return null; + + var text = this.xmlhttp.responseText; + var obj = JSON2js(text); + + if(obj == null) return null; + if(obj.is_err) throw new EXCommunication(obj.err_msg); + if( obj[0] != null && obj[1] == null ) obj = obj[0]; + + /* these are user level exceptions from the server code */ + if(instanceOf(obj, ex)) { + if(!isXUL()) alert(obj.err_msg()); + throw obj; + } + + if(instanceOf(obj, perm_ex)) { + /* the opac will go ahead and spit out the error msg */ + if(!isXUL()) alert(obj.err_msg()); + throw obj; + } + + return obj; +} + +/* adds a new parameter to the request */ +RemoteRequest.prototype.addParam = function(param) { + var string = encodeURIComponent(js2JSON(param)); + this.param_string += "¶m=" + string; +} + diff --git a/Open-ILS/web/opac/common/js/config.js b/Open-ILS/web/opac/common/js/config.js new file mode 100644 index 0000000000..34593eaa81 --- /dev/null +++ b/Open-ILS/web/opac/common/js/config.js @@ -0,0 +1,199 @@ +/* Export some constants ----------------------------------------------------- */ + +/* URL params */ +var PARAM_TERM = "term"; /* search term */ +var PARAM_STYPE = "stype"; /* search type */ +var PARAM_LOCATION = "location" /* current location */; +var PARAM_DEPTH = "depth"; /* search depth */ +var PARAM_FORM = "format"; /* search format */ +var PARAM_OFFSET = "offset"; /* search offset */ +var PARAM_COUNT = "count"; /* hits per page */ +var PARAM_HITCOUNT = "hitcount"; /* hits per page */ +var PARAM_MRID = "mrid"; /* metarecord id */ +var PARAM_RID = "rid"; /* record id */ + +/* cookies */ +var COOKIE_SB = "sbe"; +var COOKIE_SES = "ses"; +var COOKIE_IDS = "ids"; + +/* these are the actual param values - set on page load */ + +/* pages */ +var MRESULT = "mresult"; +var RRESULT = "rresult"; +var RDETAIL = "rdetail"; +var MYOPAC = "myopac"; +var ADVANCED = "advanced"; +var HOME = "home"; + +/* search type (STYPE) options */ +STYPE_AUTHOR = "author"; +STYPE_TITLE = "title"; +STYPE_SUBJECT = "subject"; +STYPE_SERIES = "series"; +STYPE_KEYWORD = "keyword"; + + +/* container for global variables shared accross pages */ +var G = {}; +G.user = null; /* global user object */ +G.ui = {} /* cache of UI components */ + + +/* call me after page init and I will load references + to all of the ui object id's defined below + They will be stored in G.ui.. + */ +function loadUIObjects() { + for( var p in config.ids ) { + G.ui[p] = {}; + for( var o in config.ids[p] ) + G.ui[p][o] = getId(config.ids[p][o]); + } +} + +/* try our best to free memory */ +function clearUIObjects() { + for( var p in config.ids ) { + for( var o in config.ids[p] ) { + if(G.ui[p][o]) { + G.ui[p][o].onclick = null; + G.ui[p][o].onkeydown = null; + G.ui[p][o] = null; + } + } + G.ui[p] = null; + } +} + +/* ---------------------------------------------------------------------------- + Set up ID's and CSS classes + Any new ids, css, etc. may be added by giving the unique names and putting + them into the correct scope +/* ---------------------------------------------------------------------------- */ + +var config = {}; + +/* Set up the page names */ +config.page = {}; +config.page[HOME] = "index.xml"; +config.page[ADVANCED] = "advanced.xml"; +config.page[MRESULT] = "mresult.xml"; +config.page[RRESULT] = "rresult.xml"; +config.page[MYOPAC] = "myopac.xml"; +config.page[RDETAIL] = "rdetail.xml"; + + +/* set up images */ +config.images = {}; +config.images.logo = "main_logo.jpg"; + + +/* set up ID's, CSS, and node names */ +config.ids = {}; +config.ids.result = {}; +config.ids.mresult = {}; +config.ids.advanced = {}; +config.ids.rresult = {}; +config.ids.myopac = {}; +config.ids.rdetail = {}; + +config.css = {}; +config.css.result = {}; +config.css.mresult = {}; +config.css.advanced = {}; +config.css.rresult = {}; +config.css.myopac = {}; +config.css.rdetail = {}; + +config.names = {}; +config.names.result = {}; +config.names.mresult = {}; +config.names.advanced = {}; +config.names.rresult = {}; +config.names.myopac = {}; +config.names.rdetail = {}; + + +/* id's shared accross skins. These *must* be defined */ +config.ids.common = {}; +config.ids.common.loading = "loading_div"; +config.ids.common.canvas = "canvas"; +config.ids.common.canvas_main = "canvas_main"; +config.ids.common.org_tree = "org_tree"; +config.ids.common.org_container = "org_container"; + + +/* shared CSS */ +config.css.hide_me = "hide_me"; + + +/* ---------------------------------------------------------------------------- */ +/* These are pages that may replace the canvas */ +/* ---------------------------------------------------------------------------- */ +config.ids.altcanvas = {}; + + + +/* ---------------------------------------------------------------------------- */ +/* Methods are defined as service:method + An optional 3rd component is when a method is followed by a :1, such methods + have a staff counterpart and should have ".staff" appended to the method + before the method is called when in XUL mode */ + +var FETCH_MRCOUNT = "open-ils.search:open-ils.search.biblio.class.count:1"; +var FETCH_MRIDS = "open-ils.search:open-ils.search.biblio.class:1"; +var FETCH_MRIDS_FULL = "open-ils.search:open-ils.search.biblio.class.full:1"; +var FETCH_MRMODS = "open-ils.search:open-ils.search.biblio.metarecord.mods_slim.retrieve"; +var FETCH_MR_COPY_COUNTS = "open-ils.search:open-ils.search.biblio.metarecord.copy_count:1"; +var FETCH_RIDS = "open-ils.search:open-ils.search.biblio.metarecord_to_records:1"; +var FETCH_RMODS = "open-ils.search:open-ils.search.biblio.record.mods_slim.retrieve"; +var FETCH_R_COPY_COUNTS = "open-ils.search:open-ils.search.biblio.record.copy_count"; +var FETCH_FLESHED_USER = "open-ils.actor:open-ils.actor.user.fleshed.retrieve"; +var FETCH_SESSION = "open-ils.auth:open-ils.auth.session.retrieve"; +var LOGIN_INIT = "open-ils.auth:open-ils.auth.authenticate.init"; +var LOGIN_COMPLETE = "open-ils.auth:open-ils.auth.authenticate.complete"; +var LOGIN_DELETE = "open-ils.auth:open-ils.auth.session.delete"; +/* ---------------------------------------------------------------------------- */ + + + +/* ---------------------------------------------------------------------------- */ +/* event callback functions. Other functions may be appended to these vars to + for added functionality. */ + +G.evt = {}; /* events container */ + +function runEvt(scope, name, a, b, c, d, e, f, g) { + var evt = G.evt[scope][name]; + for( var i in evt ) evt[i](a, b, c, d, e, f, g); +} + +/* creates a new event if it doesn't already exist */ +function createEvt(scope, name) { + if(!G.evt[scope]) G.evt[scope] = {}; + if(G.evt[scope][name] == null) + G.evt[scope][name] = []; +} + +function attachEvt(scope, name, action) { + createEvt(scope, name); + G.evt[scope][name].push(action); +} + +createEvt("common", "init"); /* f() : what happens on page init */ +createEvt("common", "unload"); /* f() : what happens on window unload (clean memory, etc.)*/ +createEvt("mresult", "run"); /* f() : kick of the page*/ +createEvt("mresult", "idsReceived"); /* f(ids) */ +createEvt("rresult", "run"); /* f() : kick of the page*/ +createEvt("rresult", "idsReceived"); /* f(ids) */ + +createEvt("result", "hitCountReceived"); /* f() : display hit info, pagination, etc. */ +createEvt("result", "recordReceived"); /* f(mvr, pagePosition, isMr) : display the record*/ +createEvt("result", "copyCountsReceived"); /* f(mvr, pagePosition, copyCountInfo) : display copy counts*/ +createEvt("result", "allRecordsReceived"); /* f(mvrsArray) : add other page stuff, sidebars, etc.*/ + + + + diff --git a/Open-ILS/web/opac/common/js/dtree.js b/Open-ILS/web/opac/common/js/dtree.js new file mode 100644 index 0000000000..8f95cb030f --- /dev/null +++ b/Open-ILS/web/opac/common/js/dtree.js @@ -0,0 +1,324 @@ +/*--------------------------------------------------| +| dTree 2.05 | www.destroydrop.com/javascript/tree/ | +|---------------------------------------------------| +| Copyright (c) 2002-2003 Geir Landrö | +| | +| This script can be used freely as long as all | +| copyright messages are intact. | +| | +| Updated: 17.04.2003 | +|--------------------------------------------------*/ + +function Node(id, pid, name, url, title, target, icon, iconOpen, open) { + this.id = id; + this.pid = pid; + this.name = name; + this.url = url; + this.title = title; + this.target = target; + this.icon = icon; + this.iconOpen = iconOpen; + this._io = open || false; + this._is = false; + this._ls = false; + this._hc = false; + this._ai = 0; + this._p; +}; + +function dTree(objName) { + this.config = { + target : null, + folderLinks : true, + useSelection : true, + useCookies : true, + useLines : true, + useIcons : true, + useStatusText : false, + closeSameLevel : false, + inOrder : false + } + this.icon = { + root : '../../../images/orgtree/base.gif', + folder : '../../../images/orgtree/folder.gif', + folderOpen : '../../../images/orgtree/folderopen.gif', + node : '../../../images/orgtree/page.gif', + empty : '../../../images/orgtree/empty.gif', + line : '../../../images/orgtree/line.gif', + join : '../../../images/orgtree/join.gif', + joinBottom : '../../../images/orgtree/joinbottom.gif', + plus : '../../../images/orgtree/plus.gif', + plusBottom : '../../../images/orgtree/plusbottom.gif', + minus : '../../../images/orgtree/minus.gif', + minusBottom : '../../../images/orgtree/minusbottom.gif', + nlPlus : '../../../images/orgtree/nolines_plus.gif', + nlMinus : '../../../images/orgtree/nolines_minus.gif' + }; + this.obj = objName; + this.aNodes = []; + this.aIndent = []; + this.root = new Node(-1); + this.selectedNode = null; + this.selectedFound = false; + this.completed = false; +}; + +dTree.prototype.add = function(id, pid, name, url, title, target, icon, iconOpen, open) { + this.aNodes[this.aNodes.length] = new Node(id, pid, name, url, title, target, icon, iconOpen, open); +}; + +dTree.prototype.openAll = function() { + this.oAll(true); +}; +dTree.prototype.closeAll = function() { + this.oAll(false); +}; + +dTree.prototype.toString = function() { + var str = '
\n'; + if (document.getElementById) { + if (this.config.useCookies) this.selectedNode = this.getSelected(); + str += this.addNode(this.root); + } else str += 'Browser not supported.'; + str += '
'; + if (!this.selectedFound) this.selectedNode = null; + this.completed = true; + return str; +}; + +dTree.prototype.addNode = function(pNode) { + var str = ''; + var n=0; + if (this.config.inOrder) n = pNode._ai; + for (n; n'; + } + if (node.url) { + str += ''; + str += node.name; + if (node.url || ((!this.config.folderLinks || !node.url) && node._hc)) str += ''; + str += ''; + if (node._hc) { + str += '
'; + str += this.addNode(node); + str += '
'; + } + this.aIndent.pop(); + return str; +}; + +dTree.prototype.indent = function(node, nodeId) { + var str = ''; + if (this.root.id != node.pid) { + for (var n=0; n'; + (node._ls) ? this.aIndent.push(0) : this.aIndent.push(1); + if (node._hc) { + str += ''; + } else str += ''; + } + return str; +}; + +dTree.prototype.setCS = function(node) { + var lastId; + for (var n=0; n> 5] |= 0x80 << ((len) % 32); + x[(((len + 64) >>> 9) << 4) + 14] = len; + + var a = 1732584193; + var b = -271733879; + var c = -1732584194; + var d = 271733878; + + for(var i = 0; i < x.length; i += 16) + { + var olda = a; + var oldb = b; + var oldc = c; + var oldd = d; + + a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936); + d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586); + c = md5_ff(c, d, a, b, x[i+ 2], 17, 606105819); + b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330); + a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897); + d = md5_ff(d, a, b, c, x[i+ 5], 12, 1200080426); + c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341); + b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983); + a = md5_ff(a, b, c, d, x[i+ 8], 7 , 1770035416); + d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417); + c = md5_ff(c, d, a, b, x[i+10], 17, -42063); + b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162); + a = md5_ff(a, b, c, d, x[i+12], 7 , 1804603682); + d = md5_ff(d, a, b, c, x[i+13], 12, -40341101); + c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290); + b = md5_ff(b, c, d, a, x[i+15], 22, 1236535329); + + a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510); + d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632); + c = md5_gg(c, d, a, b, x[i+11], 14, 643717713); + b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302); + a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691); + d = md5_gg(d, a, b, c, x[i+10], 9 , 38016083); + c = md5_gg(c, d, a, b, x[i+15], 14, -660478335); + b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848); + a = md5_gg(a, b, c, d, x[i+ 9], 5 , 568446438); + d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690); + c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961); + b = md5_gg(b, c, d, a, x[i+ 8], 20, 1163531501); + a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467); + d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784); + c = md5_gg(c, d, a, b, x[i+ 7], 14, 1735328473); + b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734); + + a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558); + d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463); + c = md5_hh(c, d, a, b, x[i+11], 16, 1839030562); + b = md5_hh(b, c, d, a, x[i+14], 23, -35309556); + a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060); + d = md5_hh(d, a, b, c, x[i+ 4], 11, 1272893353); + c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632); + b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640); + a = md5_hh(a, b, c, d, x[i+13], 4 , 681279174); + d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222); + c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979); + b = md5_hh(b, c, d, a, x[i+ 6], 23, 76029189); + a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487); + d = md5_hh(d, a, b, c, x[i+12], 11, -421815835); + c = md5_hh(c, d, a, b, x[i+15], 16, 530742520); + b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651); + + a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844); + d = md5_ii(d, a, b, c, x[i+ 7], 10, 1126891415); + c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905); + b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055); + a = md5_ii(a, b, c, d, x[i+12], 6 , 1700485571); + d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606); + c = md5_ii(c, d, a, b, x[i+10], 15, -1051523); + b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799); + a = md5_ii(a, b, c, d, x[i+ 8], 6 , 1873313359); + d = md5_ii(d, a, b, c, x[i+15], 10, -30611744); + c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380); + b = md5_ii(b, c, d, a, x[i+13], 21, 1309151649); + a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070); + d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379); + c = md5_ii(c, d, a, b, x[i+ 2], 15, 718787259); + b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551); + + a = safe_add(a, olda); + b = safe_add(b, oldb); + c = safe_add(c, oldc); + d = safe_add(d, oldd); + } + return Array(a, b, c, d); + +} + +/* + * These functions implement the four basic operations the algorithm uses. + */ +function md5_cmn(q, a, b, x, s, t) +{ + return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b); +} +function md5_ff(a, b, c, d, x, s, t) +{ + return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t); +} +function md5_gg(a, b, c, d, x, s, t) +{ + return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t); +} +function md5_hh(a, b, c, d, x, s, t) +{ + return md5_cmn(b ^ c ^ d, a, b, x, s, t); +} +function md5_ii(a, b, c, d, x, s, t) +{ + return md5_cmn(c ^ (b | (~d)), a, b, x, s, t); +} + +/* + * Calculate the HMAC-MD5, of a key and some data + */ +function core_hmac_md5(key, data) +{ + var bkey = str2binl(key); + if(bkey.length > 16) bkey = core_md5(bkey, key.length * chrsz); + + var ipad = Array(16), opad = Array(16); + for(var i = 0; i < 16; i++) + { + ipad[i] = bkey[i] ^ 0x36363636; + opad[i] = bkey[i] ^ 0x5C5C5C5C; + } + + var hash = core_md5(ipad.concat(str2binl(data)), 512 + data.length * chrsz); + return core_md5(opad.concat(hash), 512 + 128); +} + +/* + * Add integers, wrapping at 2^32. This uses 16-bit operations internally + * to work around bugs in some JS interpreters. + */ +function safe_add(x, y) +{ + var lsw = (x & 0xFFFF) + (y & 0xFFFF); + var msw = (x >> 16) + (y >> 16) + (lsw >> 16); + return (msw << 16) | (lsw & 0xFFFF); +} + +/* + * Bitwise rotate a 32-bit number to the left. + */ +function bit_rol(num, cnt) +{ + return (num << cnt) | (num >>> (32 - cnt)); +} + +/* + * Convert a string to an array of little-endian words + * If chrsz is ASCII, characters >255 have their hi-byte silently ignored. + */ +function str2binl(str) +{ + var bin = Array(); + var mask = (1 << chrsz) - 1; + for(var i = 0; i < str.length * chrsz; i += chrsz) + bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (i%32); + return bin; +} + +/* + * Convert an array of little-endian words to a string + */ +function binl2str(bin) +{ + var str = ""; + var mask = (1 << chrsz) - 1; + for(var i = 0; i < bin.length * 32; i += chrsz) + str += String.fromCharCode((bin[i>>5] >>> (i % 32)) & mask); + return str; +} + +/* + * Convert an array of little-endian words to a hex string. + */ +function binl2hex(binarray) +{ + var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef"; + var str = ""; + for(var i = 0; i < binarray.length * 4; i++) + { + str += hex_tab.charAt((binarray[i>>2] >> ((i%4)*8+4)) & 0xF) + + hex_tab.charAt((binarray[i>>2] >> ((i%4)*8 )) & 0xF); + } + return str; +} + +/* + * Convert an array of little-endian words to a base-64 string + */ +function binl2b64(binarray) +{ + var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + var str = ""; + for(var i = 0; i < binarray.length * 4; i += 3) + { + var triplet = (((binarray[i >> 2] >> 8 * ( i %4)) & 0xFF) << 16) + | (((binarray[i+1 >> 2] >> 8 * ((i+1)%4)) & 0xFF) << 8 ) + | ((binarray[i+2 >> 2] >> 8 * ((i+2)%4)) & 0xFF); + for(var j = 0; j < 4; j++) + { + if(i * 8 + j * 6 > binarray.length * 32) str += b64pad; + else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F); + } + } + return str; +} diff --git a/Open-ILS/web/opac/common/js/opac_utils.js b/Open-ILS/web/opac/common/js/opac_utils.js new file mode 100644 index 0000000000..30dfe7713f --- /dev/null +++ b/Open-ILS/web/opac/common/js/opac_utils.js @@ -0,0 +1,431 @@ +var IAMXUL = false; +function isXUL() { return IAMXUL; } + + +/* - Request ------------------------------------------------------------- */ +function Request(type) { + var s = type.split(":"); + if(s[2] == "1" && isXUL()) s[1] += ".staff"; + this.request = new RemoteRequest(s[0], s[1]); + for( var x = 1; x!= arguments.length; x++ ) + this.request.addParam(arguments[x]); +} + +Request.prototype.callback = function(cal) { this.request.setCompleteCallback(cal); } +Request.prototype.send = function(block){this.request.send(block);} +Request.prototype.result = function(){return this.request.getResultObject();} +/* ----------------------------------------------------------------------- */ + +function showCanvas() { setTimeout(_showCanvas, 200); } +function _showCanvas() { + for( var x in G.ui.altcanvas ) { + hideMe(G.ui.altcanvas[x]); + } + hideMe(G.ui.common.loading); + unHideMe(G.ui.common.canvas_main); + G.ui.searchbar.text.focus(); +} + +var newCanvasNode; +function swapCanvas(newNode) { newCanvasNode = newNode; setTimeout(_swapCanvas, 200); } +function _swapCanvas() { + for( var x in G.ui.altcanvas ) + hideMe(G.ui.altcanvas[x]); + + hideMe(G.ui.common.loading); + hideMe(G.ui.common.canvas_main); + unHideMe(newCanvasNode); +} + +/* finds the name of the current page */ +var currentPage = null; +function findCurrentPage() { + if(currentPage) return currentPage; + + var pages = []; + for( var p in config.page ) pages.push(config.page[p]); + pages = pages.sort( function(a,b){ return - (a.length - b.length); } ); + + var path = location.pathname; + if(!path.match(/.*\.xml$/)) + path += "index.xml"; /* in case they go to / */ + + var page = null; + for( var p in pages ) { + if( path.indexOf(pages[p]) != -1) + page = pages[p]; + } + + for( var p in config.page ) { + if(config.page[p] == page) { + currentPage = p; + return p; + } + } + + return null; +} + + +/* sets all of the params values ----------------------------- */ +var TERM, STYPE, LOCATION, DEPTH, FORM, OFFSET, COUNT, + HITCOUNT, RANKS, SEARCHBAR_EXTRAS; + +function initParams() { + var cgi = new CGI(); + + TERM = cgi.param(PARAM_TERM); + STYPE = cgi.param(PARAM_STYPE); + FORM = cgi.param(PARAM_FORM); + + LOCATION = parseInt(cgi.param(PARAM_LOCATION)); + DEPTH = parseInt(cgi.param(PARAM_DEPTH)); + OFFSET = parseInt(cgi.param(PARAM_OFFSET)); + COUNT = parseInt(cgi.param(PARAM_COUNT)); + HITCOUNT = parseInt(cgi.param(PARAM_HITCOUNT)); + MRID = parseInt(cgi.param(PARAM_MRID)); + RID = parseInt(cgi.param(PARAM_RID)); + + /* set up some sane defaults */ + if(isNaN(LOCATION)) LOCATION = 1; + if(isNaN(DEPTH)) DEPTH = 0; + if(isNaN(OFFSET)) OFFSET = 0; + if(isNaN(COUNT)) COUNT = 10; + if(isNaN(HITCOUNT)) HITCOUNT = 0; + if(isNaN(SEARCHBAR_EXTRAS)) SEARCHBAR_EXTRAS = 0; + if(isNaN(MRID)) MRID = 0; + if(isNaN(RID)) RID = 0; +} + +/* URL param accessors */ +function getTerm(){return TERM;} +function getStype(){return STYPE;} +function getLocation(){return LOCATION;} +function getDepth(){return DEPTH;} +function getForm(){return FORM;} +function getOffset(){return OFFSET;} +function getDisplayCount(){return COUNT;} +function getHitCount(){return HITCOUNT;} +function getSearchBarExtras(){return SEARCHBAR_EXTRAS;} +function getMrid(){return MRID;}; +function getRid(){return RID;}; + + + +/* builds an opac URL. If no page is defined, the current page is used + if slim, then only everything after the ? is returned (no host portion) */ +function findBasePath() { + var path = location.pathname; + if(!path.match(/.*\.xml$/)) path += "index.xml"; + var idx = path.indexOf(config.page[findCurrentPage()]); + return path.substring(0, idx); +} + +function findBaseURL(ssl) { + var path = findBasePath(); + var proto = location.protocol; + if(ssl) proto = "https"; + return location.protocol + "//" + location.host + path; +} + +function buildImageLink(name, ssl) { + return findBaseURL(ssl) + "../../../images/" + name; +} + +function buildOPACLink(args, slim, ssl) { + + if(!args) args = {}; + var string = ""; + + if(!slim) { + string = findBaseURL(ssl); + if(args.page) string += config.page[args.page]; + else string += config.page[findCurrentPage()]; + } + + string += "?"; + + for( var x in args ) { + if(x == "page" || args[x] == null) continue; + string += "&" + x + "=" + encodeURIComponent(args[x]); + } + + string += _appendParam(TERM, PARAM_TERM, args, getTerm, string); + string += _appendParam(STYPE, PARAM_STYPE, args, getStype, string); + string += _appendParam(LOCATION, PARAM_LOCATION, args, getLocation, string); + string += _appendParam(DEPTH, PARAM_DEPTH, args, getDepth, string); + string += _appendParam(FORM, PARAM_FORM, args, getForm, string); + string += _appendParam(OFFSET, PARAM_OFFSET, args, getOffset, string); + string += _appendParam(COUNT, PARAM_COUNT, args, getDisplayCount, string); + string += _appendParam(HITCOUNT, PARAM_HITCOUNT, args, getHitCount, string); + string += _appendParam(MRID, PARAM_MRID, args, getMrid, string); + string += _appendParam(RID, PARAM_RID, args, getRid, string); + return string.replace(/\&$/,'').replace(/\?\&/,"?"); +} + +function _appendParam( fieldVar, fieldName, overrideArgs, getFunc, string ) { + var ret = ""; + if( fieldVar != null && overrideArgs[fieldName] == null ) + ret = "&" + fieldName + "=" + encodeURIComponent(getFunc()); + return ret; +} + + +function EX(message) { this.init(message); } +EX.prototype.init = function(message) { this.message = message; } +EX.prototype.toString = function() { return "\n *** Exception Occured \n" + this.message; } +EXCommunication.prototype = new EX(); +EXCommunication.prototype.constructor = EXCommunication; +EXCommunication.baseClass = EX.prototype.constructor; +function EXCommunication(message) { this.init("EXCommunication: " + message); } + +/* ----------------------------------------------------------------------- */ +function cleanISBN(isbn) { + if(isbn) { + isbn = isbn.toString().replace(/^\s+/,""); + var idx = isbn.indexOf(" "); + if(idx > -1) { isbn = isbn.substring(0, idx); } + } else isbn = ""; + return isbn; +} + + + + +/* builds a link that goes to the title listings for a metarecord */ +function buildTitleLink(rec, link) { + if(!rec) return; + link.appendChild(text(normalize(truncate(rec.title(), 65)))); + var args = {}; + args.page = RRESULT; + args[PARAM_OFFSET] = 0; + args[PARAM_MRID] = rec.doc_id(); + link.setAttribute("href", buildOPACLink(args)); +} + +function buildTitleDetailLink(rec, link) { + if(!rec) return; + link.appendChild(text(normalize(truncate(rec.title(), 65)))); + var args = {}; + args.page = RDETAIL; + args[PARAM_OFFSET] = 0; + args[PARAM_RID] = rec.doc_id(); + link.setAttribute("href", buildOPACLink(args)); +} + +/* 'type' is one of STYPE_AUTHOR, STYPE_SUBJECT, ... found in config.js + 'trunc' is the number of characters to show in the string, defaults to 65 */ +function buildSearchLink(type, string, linknode, trunc) { + if(!trunc) trunc = 65; + var args = {}; + args.page = MRESULT; + args[PARAM_OFFSET] = 0; + args[PARAM_TERM] = string; + args[PARAM_STYPE] = type; + linknode.appendChild(text(normalize(truncate(string, trunc)))); + linknode.setAttribute("href", buildOPACLink(args)); +} + + +/* ----------------------------------------------------------------------- */ +/* user session handling */ +/* ----------------------------------------------------------------------- */ + +/* session is the login session. If no session is provided, we attempt + to find one in the cookies. If 'force' is true we retrieve the + user from the server even if there is already a global user present. + if ses != G.user.session, we also force a grab */ +var cookie = new cookieObject("ses", 1, "/", COOKIE_SES); +function grabUser(ses, force) { + + if(!ses) ses = cookie.get(COOKIE_SES); + if(!ses) return false; + + if(!force) + if(G.user && G.user.session == ses) + return G.user; + + /* first make sure the session is valid */ + var request = new Request(FETCH_SESSION, ses ); + request.send(true); + var user = request.result(); + if( !(typeof user == 'object' && user._isfieldmapper) ) { + return false; + } + + G.user = user; + G.user.fleshed = false; + G.user.session = ses; + cookie.put(COOKIE_SES, ses); + cookie.write(); + + return G.user; + +} + +function grabFleshedUser() { + + if(!G.user || !G.user.session) { + grabUser(); + if(!G.user || !G.user.session) return null; + } + + if(G.user.fleshed) return G.user; + + var req = new Request(FETCH_FLESHED_USER, G.user.session); + req.send(true); + + G.user = req.result(); + + if(!G.user || G.user.length == 0) { + G.user = null; return false; + cookie.remove(COOKIE_SES); + } + + G.user.session = ses; + G.user.fleshed = true; + + cookie.put(COOKIE_SES, ses); /* update the cookie */ + cookie.write(); + + return G.user; +} + + +/* returns a fleshed G.user on success, false on failure */ +function doLogin() { + + var uname = G.ui.login.username.value; + var passwd = G.ui.login.password.value; + + var init_request = new Request( LOGIN_INIT, uname ); + init_request.send(true); + var seed = init_request.result(); + + if( ! seed || seed == '0') { + alert( "Error Communicating with Authentication Server" ); + return null; + } + + var auth_request = new Request( LOGIN_COMPLETE, + uname, hex_md5(seed + hex_md5(passwd)), "opac"); + + auth_request.send(true); + var auth_result = auth_request.result(); + + if(auth_result == '0' || auth_result == null || auth_result.length == 0) { return false; } + + var u = grabUser(auth_result, true); + if(u) updateLoc(u.home_ou(), findOrgDepth(u.home_ou())); + + return u; +} + +function doLogout() { + + /* be nice and delete the session from the server */ + if(G.user && G.user.session) { + var req = new Request(LOGIN_DELETE, G.user.session); + req.send(true); + try { req.result(); } catch(E){} + } + + G.user = null; + cookie.remove(COOKIE_SES); + + hideMe(G.ui.sidebar.logoutbox); + unHideMe(G.ui.sidebar.loginbox); + hideMe(G.ui.sidebar.logged_in_as); + +} + + +function hideMe(obj) { addCSSClass(obj, config.css.hide_me); } +function unHideMe(obj) { removeCSSClass(obj, config.css.hide_me); } + + +/* ----------------------------------------------------------------------- */ +/* build the org tree */ +/* ----------------------------------------------------------------------- */ + + +function drawOrgTree() { + G.ui.common.org_tree.innerHTML = buildOrgSelector().toString(); +} + +var orgTreeSelector; +function buildOrgSelector() { + var tree = new dTree("orgTreeSelector"); + for( var i in orgArraySearcher ) { + var node = orgArraySearcher[i]; + if( node == null ) continue; + if(node.parent_ou() == null) + tree.add(node.id(), -1, node.name(), + "javascript:orgSelect(" + node.id() + ");", node.name()); + else { + tree.add(node.id(), node.parent_ou().id(), node.name(), + "javascript:orgSelect(" + node.id() + ");", node.name()); + } + } + orgTreeSelector = tree; + return tree; +} + +function orgSelect(id) { + showCanvas(); + updateLoc(id, findOrgDepth(id)); +} + + +/* ------------------------------------------------------------------------------------------------------ */ +/* org tree utilities */ +/* ------------------------------------------------------------------------------------------------------ */ + +/* takes an org unit or id and return the numeric depth */ +function findOrgDepth(org_id_or_node) { + return findOrgType(findOrgUnit(org_id_or_node).ou_type()).depth(); +} + +/* takes the org type id from orgunit.ou_type() field and returns + the org type object */ +function findOrgType(type_id) { + if(typeof type_id == 'object') return type_id; + for(var type in globalOrgTypes) { + var t =globalOrgTypes[type]; + if( t.id() == type_id || t.id() == parseInt(type_id) ) + return t; + } + return null; +} + + +/* returns an org unit by id. if an object is passed in as the id, + then the object is assumed to be an org unit and is returned */ +function findOrgUnit(org_id) { + return (typeof org_id == 'object') ? org_id : orgArraySearcher[org_id]; +} + + +/* builds a trail from the top of the org tree to the node provide. + basically fleshes out 'my orgs' + Returns an array of [org0, org1, ..., myorg] */ +function orgNodeTrail(node) { + var na = new Array(); + while( node ) { + na.push(node); + node = findOrgUnit(node.parent_ou()); + } + return na.reverse(); +} + + +/* returns an array of sibling org units */ +function findSiblingOrgs(node) { return findOrgUnit(node.parent_ou()).children(); } +/* ------------------------------------------------------------------------------------------------------ */ + + + + + + + diff --git a/Open-ILS/web/opac/common/js/utils.js b/Open-ILS/web/opac/common/js/utils.js new file mode 100644 index 0000000000..499694bbe2 --- /dev/null +++ b/Open-ILS/web/opac/common/js/utils.js @@ -0,0 +1,272 @@ +function getId(id) { + return document.getElementById(id); +} + + +function addCSSClass(e,c) { + if(!e || !c) return; + + var css_class_string = e.className; + var css_class_array; + + if(css_class_string) + css_class_array = css_class_string.split(/\s+/); + + var string_ip = ""; /*strip out nulls*/ + for (var css_class in css_class_array) { + if (css_class_array[css_class] == c) { return; } + if(css_class_array[css_class] !=null) + string_ip += css_class_array[css_class] + " "; + } + string_ip = string_ip + c; + e.className = string_ip; +} + +function removeCSSClass(e, c) { + if(!e || !c) return; + + var css_class_string = ''; + + var css_class_array = e.className; + if( css_class_array ) + css_class_array = css_class_array.split(/\s+/); + + var first = 1; + for (var css_class in css_class_array) { + if (css_class_array[css_class] != c) { + if (first == 1) { + css_class_string = css_class_array[css_class]; + first = 0; + } else { + css_class_string = css_class_string + ' ' + + css_class_array[css_class]; + } + } + } + e.className = css_class_string; +} + + +/*returns the character code pressed that caused the event */ +function grabCharCode(evt) { + evt = (evt) ? evt : ((window.event) ? event : null); + if( evt ) { + return (evt.charCode ? evt.charCode : + ((evt.which) ? evt.which : evt.keyCode )); + } else { return -1; } +} + + +/* returns true if the user pressed enter */ +function userPressedEnter(evt) { + var code = grabCharCode(evt); + if(code==13||code==3) return true; + return false; +} + + +function goTo(url) {location.href = url;} + + +function removeChildren(dom) { + if(!dom) return; + while(dom.childNodes[0]) + dom.removeChild(dom.childNodes[0]); +} + + +function instanceOf(object, constructorFunction) { + + if(!IE) { + while (object != null) { + if (object == constructorFunction.prototype) + return true; + object = object.__proto__; + } + } else { + while(object != null) { + if( object instanceof constructorFunction ) + return true; + object = object.__proto__; + } + } + return false; +} + + +/* ------------------------------------------------------------------------------------------- */ +/* detect my browser */ +var isMac, NS, NS4, NS6, IE, IE4, IE4mac, IE4plus, IE5, IE5plus, IE6, IEMajor, ver4; +function detect_browser() { + + isMac = (navigator.appVersion.indexOf("Mac")!=-1) ? true : false; + NS = (navigator.appName == "Netscape") ? true : false; + NS4 = (document.layers) ? true : false; + IE = (navigator.appName == "Microsoft Internet Explorer") ? true : false; + IEmac = ((document.all)&&(isMac)) ? true : false; + IE4plus = (document.all) ? true : false; + IE4 = ((document.all)&&(navigator.appVersion.indexOf("MSIE 4.")!=-1)) ? true : false; + IE5 = ((document.all)&&(navigator.appVersion.indexOf("MSIE 5.")!=-1)) ? true : false; + IE6 = ((document.all)&&(navigator.appVersion.indexOf("MSIE 6.")!=-1)) ? true : false; + ver4 = (NS4 || IE4plus) ? true : false; + NS6 = (!document.layers) && (navigator.userAgent.indexOf('Netscape')!=-1)?true:false; + + IE5plus = IE5 || IE6; + IEMajor = 0; + + if (IE4plus) { + var start = navigator.appVersion.indexOf("MSIE"); + var end = navigator.appVersion.indexOf(".",start); + IEMajor = parseInt(navigator.appVersion.substring(start+5,end)); + IE5plus = (IEMajor>=5) ? true : false; + } +} +detect_browser(); +/* ------------------------------------------------------------------------------------------- */ + + +function text(t) { + if(t == null) t = ""; + return document.createTextNode(t); +} + +function elem(name, attrs, text) { + var e = createAppElement(name); + if (attrs) { + for (key in attrs) { + if( key == 'id') e.id = attrs[key]; + else e.setAttribute(key, attrs[key]); + } + } + if (text) e.appendChild(text(text)); + return e; +} + + +/* sel is the selector object, sets selected on the + option with the given value. case does not matter...*/ +function setSelector( sel, value ) { + if(sel && value != null) { + for( var i = 0; i!= sel.options.length; i++ ) { + if( sel.options[i] ) { + var val = sel.options[i].value; + value += ""; /* in case of number */ + if( val && val.toLowerCase() == value.toLowerCase() ) { + sel.selectedIndex = i; + sel.options[i].selected = true; + } + } + } + } +} + + +/* split on spaces. capitalize the first /\w/ character in + each substring */ +function normalize(val) { + + if(!val) return ""; + + var newVal = ''; + try {val = val.split(' ');} catch(E) {return val;} + var reg = /\w/; + + for( var c = 0; c < val.length; c++) { + + var string = val[c]; + var cap = false; + for(var x = 0; x != string.length; x++) { + + if(!cap) { + var ch = string.charAt(x); + if(reg.exec(ch + "")) { + newVal += string.charAt(x).toUpperCase(); + cap = true; + continue; + } + } + + newVal += string.charAt(x).toLowerCase(); + } + if(c < (val.length-1)) newVal += " "; + } + + newVal = newVal.replace(/\s*\.\s*$/,''); + newVal = newVal.replace(/\s*\/\s*\/\s*$/,' / '); + newVal = newVal.replace(/\s*\/\s*$/,''); + + return newVal; +} + + +/* returns true if n is null or stringifies to 'undefined' */ +function isNull(n) { + if( n == null || n.toString().toLowerCase() == "undefined" + || n.toString().toLowerCase() == "null" ) + return true; + return false; +} + + +/* find nodes with an attribute of 'name' that equals nodeName */ + +function findNodeByName(root, nodeName) { + if( !root || !nodeName) return null; + + if(root.nodeType != 1) return null; + + if(root.getAttribute("name") == nodeName || + root.name == nodeName ) { + return root; + } + + var children = root.childNodes; + + for( var i = 0; i != children.length; i++ ) { + var n = findNodeByName(children[i], nodeName); + if(n) return n; + } + + return null; + +} + + +/* truncates the string at 'size' characters and appends a '...' to the end */ +function truncate(string, size) { + if(string && size != null && + size > -1 && string.length > size) + return string.substr(0, size) + "..."; + return string; +} + + +/* style sheets must have a 'name' attribute for these functions to work */ +function setActiveStyleSheet(name) { + var i, a, main; + for (i = 0; (a = document.getElementsByTagName ("link")[i]); i++) { + if (a.getAttribute ("rel").indexOf ("style") != -1 && a.getAttribute ("name")) { + if (a.getAttribute ("name").indexOf(name) != -1) + a.disabled = false; + } + } +} + +function swapStyleSheet(newname, oldname) { + var i, a, main; + for (i = 0; (a = document.getElementsByTagName ("link")[i]); i++) { + if (a.getAttribute ("rel").indexOf ("style") != -1 && a.getAttribute ("name")) { + if (a.getAttribute ("name").indexOf(newsheet) != -1) + a.disabled = false; + if (a.getAttribute ("name").indexOf(oldsheet) != -1) + a.disabled = true; + } + } +} + + + + + + + diff --git a/Open-ILS/web/opac/images/main_logo.jpg b/Open-ILS/web/opac/images/main_logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7b77a0abb44b407d5aa7298b5e6fa8aadb6ab5ad GIT binary patch literal 18309 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 literal 0 HcmV?d00001 diff --git a/Open-ILS/web/opac/images/orgtree/cd.gif b/Open-ILS/web/opac/images/orgtree/cd.gif new file mode 100644 index 0000000000000000000000000000000000000000..7503819404024526e6181901806c55f0d80c5933 GIT binary patch literal 239 zcmVrJ``g+7o}HwDfriP+%H`z#&d&S!*Z=kE z|K{fCzP{+0nauzH|NsC0A^8LW000jFEC2ui022Ta000D>@X2QgDb|R|oC=38x?@%aA z3XHC|001ZuX$Aq%mYc?Kr_IsGe7zvW*%XUnbb L&G+VrGgt!vQpOa` literal 0 HcmV?d00001 diff --git a/Open-ILS/web/opac/images/orgtree/folder.gif b/Open-ILS/web/opac/images/orgtree/folder.gif new file mode 100644 index 0000000000000000000000000000000000000000..eb129763dcea0dc1916b7e934fdce2fd8770c380 GIT binary patch literal 372 zcmZ?wbhEHb6k-r!xXQrr`}gnn@893v9&~1=$&)8f4jw$XxRCo$zt;Bc+vnx5?P^z= zlf`m!n&I9q)y<94Gt(JwZ!g^1B)cGw zMSgXq@QJAg2YNM*9XqzJMr>9F(~2^IHB}=2ujK##G5PiD*Z=>|`G33g|C9Rv?>o0` z+x8y>W-^ck6o0ZXGBD^d=zw&C{KUXE(P4UlhmKVLi6xgzC4402GB{W!L~2f9POOq~ zU`a4ovhaqB%+vz~Nx8dkFFrrvqSej!Kd!MF9@+A*p|PG#+gVIkwX>^RSE$vAT~}-J zl&QL${d#h`nsevP*X5qctE;hW`3hadnOwRm>o;uF<*#vKOczy ZVbwl)>NG2h3j?FtrOQ`>yuBP5tO0@?i&Ovr literal 0 HcmV?d00001 diff --git a/Open-ILS/web/opac/images/orgtree/folderopen.gif b/Open-ILS/web/opac/images/orgtree/folderopen.gif new file mode 100644 index 0000000000000000000000000000000000000000..c5c31102d525076f68a946b1c942687b3ce0da4c GIT binary patch literal 376 zcmZ?wbhEHb6k-r!xXQrr{{8!<#k{|N|2{L*q6oUN3z&7>3 ztO5@mss0m7f-EEygfto)EEhyd@^~j!tvR(XKI+JllL;CPicM^J(Q8*-F>q|Y`M%=j z62+dM{~PKQW!3d-jdOF2Weio>+e{5RD$0%I4VAejFig^&H-8?Vk|_5Crb$NHt5$3C zNei(}Fr8zpvu*n}0e-m}r{#G~uV;mw0cLrC^)_Z0DGV33b1Po(Sa(>zf!o}J1>$0ZL+5}+6JHr`< zs59<2ADD$k0dv7VSPBs!85|83W2YWrU{mu%Hi8cua%jT}X0VKs8iV_@s~cN|4IQK7 zlgwVZniU_ug+va|$vdW0wiwXo*|ykB@De?HwLlJxC0N(!S8i(2E~|v9(_+$dE1QD4 z(6NQB0}P|~wBw2sEI5NRJ4=uuOa5tsBHg+7q6Hu5dC6C#RV~P$5g9p@LhLx0zT1=#$;61Slp z{b$G3Cq5tj+aRnLm}j%g>meJip=3z4fBc6cC?X}jzdC>`>6~1Hyp7=2MId*?rsV_o z0IrGVmN!ePo4-uR0e|!Ywb#GtFWpGfTw^6849G2ChCzJ@XGmPPTIixuZ>)mYL-;TxSo$E#hk&Ui;z3lE682RvPTxRDt7BWAb0m{VSvJ=cgb~yz@9V5_O(cZFI)`$`ISCTU`DjBw zyS8egLnhurnWUI?_PR)I7%9~+D!e_EXKRJ1r3zig4{K%xOvx2|%18b>$me4+u^7Xq I@p#1QKgm$!SpWb4 literal 0 HcmV?d00001 diff --git a/Open-ILS/web/opac/images/orgtree/imgfolder.gif b/Open-ILS/web/opac/images/orgtree/imgfolder.gif new file mode 100644 index 0000000000000000000000000000000000000000..e6d880347f518bbd1239f2af3e3059ccb1e674e3 GIT binary patch literal 622 zcmZ?wbhEHb6k-r!c*el+{{8!<#k_3u{{L^wI(YEl_U+q$|Ni~|@MghDua+)ZG%JH? z-TL((7IrU~Kj+DlCo5O3lwA7%*s)`qHgDa!eb@j0OBdvEG*;)$$zqw8!`56^^k}p5 z_Ya-7_UFu)+TYb$+uz;v|9Z=kBA(5S(&rbc{eRsuGoA72{gy`u15VE{KDj_~ajDeg z37uzVnk*{dIyud7L!HE&S<`mx+V>;JX-$>L)2C0b?{GLaORBB0{O{F*<)!?K3%Nf$ zsam#d+5aDt|39h!f4lVm`_9*|U#E2~`~QE=wr$&f|N3)mmgIjBn8`2{fZ|UUMg|5? z1|5)NL2<&se!9W4skx=K)lgW7o1c@{KvtWf%~RNQ+VpAif|G?@nV2{@=DW(VPUdzM za9Zso;A-yDro->*#N*D+IV1gO z@j_>Lk*uD81ih2?D)vTMXLcNRa$tCI39M1!eiVTiL RukLUjIIv`XD-$DwH2~IF)06-J literal 0 HcmV?d00001 diff --git a/Open-ILS/web/opac/images/orgtree/join.gif b/Open-ILS/web/opac/images/orgtree/join.gif new file mode 100644 index 0000000000000000000000000000000000000000..34dd47610a5d7c3580dedc342683559bf77abce2 GIT binary patch literal 69 zcmZ?wbhEHb6k-r!XkcV$XlVHV|G(l-7DfgJMg|=QAOOiQFv;}DH=KUEdfpt3ORshA Wx&LIzk};W<vKC_i literal 0 HcmV?d00001 diff --git a/Open-ILS/web/opac/images/orgtree/joinbottom.gif b/Open-ILS/web/opac/images/orgtree/joinbottom.gif new file mode 100644 index 0000000000000000000000000000000000000000..48b81c80a9e25f6f29e2614aaa33bdf4a4d2881b GIT binary patch literal 66 zcmZ?wbhEHb6k-r!XkcV$XlVHV|G(l-7DfgJMg|=QAOOiQFiG~vH=KUEdfpt3ORshA Tx&LIzy5lkJS?4l0Mh0sDgH;v` literal 0 HcmV?d00001 diff --git a/Open-ILS/web/opac/images/orgtree/line.gif b/Open-ILS/web/opac/images/orgtree/line.gif new file mode 100644 index 0000000000000000000000000000000000000000..1a259eea00c330eee85fb18aa64e2e232d5410b1 GIT binary patch literal 66 zcmZ?wbhEHb6k-r!XkcV$XlVHV|G(l-7DfgJMg|=QAOOiQFiG~vH=KUEdfpt3ORshA Txqp6J8?ND(@^elGBZD;ng_;%{ literal 0 HcmV?d00001 diff --git a/Open-ILS/web/opac/images/orgtree/minus.gif b/Open-ILS/web/opac/images/orgtree/minus.gif new file mode 100644 index 0000000000000000000000000000000000000000..3d212a97ae0d8f83aa39836c5a85d442f8602553 GIT binary patch literal 86 zcmZ?wbhEHb6k-r!n8?h~)YR0_(7?dJ@c;jR#h)yU3=GT+IzTQ^R)~RtNqvreafzu-gC3m_gnAtsyGG)YXIxA8@>Pl literal 0 HcmV?d00001 diff --git a/Open-ILS/web/opac/images/orgtree/musicfolder.gif b/Open-ILS/web/opac/images/orgtree/musicfolder.gif new file mode 100644 index 0000000000000000000000000000000000000000..f620789feb3c4b1222909d255f51aeaa81faefb6 GIT binary patch literal 633 zcmZ?wbhEHb6k-r!c;?CQ|HtI_d&1|;T=V|@`}l;_ON)8`KdAow`}didCU@_DGciej z^5n_Eg9rbA>8q=`<>xo+u1K?DiJW3#)C#D)aIvB91 zfNOew_W$>t|Ni|e&CM||NI81&?f=`QuV26Z|9{T0S(4kfZTk-bGZ}^gQ2fcl$iU#q zpaXI&C{7sIuQhl!HMg)hmVUg|Ta9<%L zB*!hNW#eGnvfRbP!^OqjoL^Um#e}(8(%psk*bWzm73wnj%>wQWm-x821i3D`7>P8w z-n-|h>B!0H=xU{*=yrFzi#XF`MLGYlFIxARNO@hDtWaBUIiPTOMfV7_}lvsu=hh(Z;&NfL@qDJM29Jw4q( Jn2m+O8UP#&8=e3F literal 0 HcmV?d00001 diff --git a/Open-ILS/web/opac/images/orgtree/nolines_plus.gif b/Open-ILS/web/opac/images/orgtree/nolines_plus.gif new file mode 100644 index 0000000000000000000000000000000000000000..f258ce211a0a19c2ecbcb11170b9a8b35ae2436c GIT binary patch literal 870 zcmZ?wbhEHb6k-r!_|DAG)YR0_(7-SXMnhmkhJfNv7DfgJW(FOQ??HKjfy0@BokPZB z!-9j&9Ku>LGYlFIxARNO@hAj7*xx83m?l#Y_`t1M|Ba{La?4kwX3c6}c&WZ`PygnpJ?rkDyZry# zum9<}^Zxw(U)#BD%KlHsjvf2=@89j`-!lsq`N~Rn2+cXw3F)`cNXo|{M zwn^yh*lA;L&u+56RaJ{?r=8t#bK_Gj;^%BG95Yu?zS_*U>z2K_g$4ipCbgRvpFHC> zdg-Vu`PTd?H;48ok#7ReIGiR-xW0J7!Dc}Y2`z_&_QUOboFWD+3JrbT68dFMM=k~^ HFjxZso}Jb2 literal 0 HcmV?d00001 diff --git a/Open-ILS/web/opac/images/orgtree/plus.gif b/Open-ILS/web/opac/images/orgtree/plus.gif new file mode 100644 index 0000000000000000000000000000000000000000..b2c997233b3f7b0fd56c4637c2c20aaf0d47bae7 GIT binary patch literal 89 zcmZ?wbhEHb6k-r!n8?J?(9poZ!0`Y7e;}#&lZBCifr&u}$Og&^0ohtp^czmUT|IBk qf~en0XVhiRX3S&EJ6Nfhb5kY1Re>f2&SBJ{1ibDv2XRV|Dor_^WyXB*=Ku>91RN!zTl3yBbIVx z(geQ%ggTf9umTL|phE>VfGW0dOs3%S#nN%*vE*Enb)jBp9@2x>3JQh1R%p`NKy3y_ zU3YW4U}Q`#nViy?7fYC*mTrH-X7dccKo2mX(s=~L^<(g+r59TS6iqRkj2so5zx+t0 zo0(kzz6vnCo~H$RBRBH)J1GX_SNvfE*Z~wa*h)-iiw*S>Xcn2f6(IYmN~W^Xa^K5L zAex2;PwPjN7>)J4^$VxEb>L;|NOI2mP7BNcjAM&;D`d1LQE7F1uO6=7d%+o2q9~a& z^=HF5f%;G1kxWBiba`M*MXx~Y7eUYLsomU#>SdCrPUj>1OFJ?by71aqM(w;SNCnf+=v){(2QoAPYLn^Co4umpI zZBr+TQf2|-$OSB}T&RT}4J2kXT)9=qY~~&gO+?Wfm<{S%x+=cSPXj28urVYrD5gv> z1x&7r!xs%3p=C(_v_;&ng?=lfkaLrYG$*dMwTX12GNmWsd~wr2�PO#XTOK|5d)& z!4vms05e%S6&9cUdCfvAM{4}`Ll&Au0|4ZI{x#q|zXU~)a%9_I{Pz zF8K#`U8CUK$V+kftzmD{56XRA*JOAEn0*=T9qYDGam8&jKK%R;2frNVs?fakAt(1x zVoBrOZf<9tZI{^DPQFJAYw$bp-YzSMPP;$X(ujj4M^>&|RhjNU%J*O1o>2EXGlIU? f&E;Ccsie~d>oCoZ literal 0 HcmV?d00001 diff --git a/Open-ILS/web/opac/images/orgtree/trash.gif b/Open-ILS/web/opac/images/orgtree/trash.gif new file mode 100644 index 0000000000000000000000000000000000000000..cfa0f000e1ed3b61c8737fcfbef4b78035a6abe7 GIT binary patch literal 1051 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 M9F6!tzzB!`20xEi761SM literal 0 HcmV?d00001 diff --git a/Open-ILS/web/opac/images/tor/cartographic.jpg b/Open-ILS/web/opac/images/tor/cartographic.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5bbeacca947ada005bb7e92d638e1a66746e97f1 GIT binary patch literal 690 zcmex=SNlY@&#gqMe#n@3Vem|sLzN?uM@N=8OOMNeHpNk>^mM#EfF$H36U#6(`*($>Pr zM$g#92xJH&CnqNlH;)7_uY{4JjG__A;Qs*zK@J891_@?HB?cxzMrJ|A|3`p)pzDF| zM*{3@OdLQNEdd5bW+oO^7G{_%BNH#!>Y7B zS5{dVJowaesV`~T_s6N$H|9-OJDzvfKOxn?V(!eR{!x#w-kWjRE9kCQ=Gjk&Jf(t| z-1eQ`zJ9~6<2DXG>L1fm&DMPG?E55D#WruH%>v%3Z@;Rh-E%+p!^+nyEPnl}nZ8rb zw8>1ko$8gbMCaAU`_<**2j4!ne8!qtu&}{E%-nVn&%9mNj`upB+&l5?jup2V1e91R z&q)6I-u2~P&{^GQ5mM7G&75(|v2?4#vIloq8OoU+ys4_`7CQ2up{?k8z$4qp7wZ%Q zW;UNJcXzcs<2T8F$D0Ro?Dr%>nF}=QmN0+b`|DrhrIm@X)jM8%XFIWWS;dKf&r`}| z`B#YsXD&hP${~2a)I9#^r z{mpl`G@H77j)rc^^Ie{@N~4iIxKHa;ozwBPPb=*h-dNX8^5!uRODl@(nRO-n|4jfl Cj_6GQ literal 0 HcmV?d00001 diff --git a/Open-ILS/web/opac/images/tor/mixed material.jpg b/Open-ILS/web/opac/images/tor/mixed material.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bac8c57ac9ea1d5134039f66aceae8413a966f7a GIT binary patch literal 525 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<QGdmM*F7SK$@1R^EK!QK<5*@(EY&{?I)=Q72KOW9hP4-=|%9y=335 zP7W>=2I>2?->Up}FX!BOT=eL-{3W+Tww1ozkSuZ1K=EeCwL8ass=agv=4-_35A08bV92_7dE+-%&EF&BoC^soAFflYVG#@89JvcHvE;BST|G)qX2ml=b z9svOn0RO}Q82|tR0|5X40000000000000FB0|y8M|HJ?<5C8!K1OWp82MGWG00000 z009C61ONpF5g`W>F$fbEB0^!2GB-h1adUx`vj5ru2mt{A06ze;dWF;&m=(G+i;Cpg z($-NLD{9eM8rdgDLy`C$lS6P`sx_3{X4)>+r)<|~jhB|g$|MvICy)puVCatqmR|IM zK%DG|*u=-N=3Wf0;uJ?G!Pjnw9Dr57(ylmD7`VWXHYP&La)WhGA!h)Td%N{I=UnhEA5*Dg(JcFw7+Ds zF>jM|m2!2i?aGv`xV@5jKP~I{uDS3cT_C#(bav#$bZN$&PjXZ@zC{4`Z-stWwSQSP eEL;Z?gDt61aocM$8CY9xA%uk`L%{}^>;Ktqm&yGA literal 0 HcmV?d00001 diff --git a/Open-ILS/web/opac/images/tor/notated music.jpg b/Open-ILS/web/opac/images/tor/notated music.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4110c68830a328aaa01ff2a3fe7c74582fa18654 GIT binary patch literal 1826 zcmb7@SyYqP7RSHv0SS_jq@YGfLLk`0q6{GnLIy(7fHY+m5Oq<50)YrJlp!FRxS)6i zLX=92BBLN}k%mDeU~yuoAcKHRL53_qKq;+d5~KmWFTGFqch1Y+`>eh8@IRXan_~d# z$YJNh00aU7oRkOH90tAwVCw2nbu}0i3f0hn?SShb;F_B7J)dbKb#S`+c$_X4OE5Aa z5e)Yeu~@S8zWrwAR4P@UbdYXCp_y1vDO*V(8X6jKO*jUDz)%dZ29*Ds%_aa111COV6M$_ z{|07AId?HjXD893;Gva+$0=b|xAm8iQPDAyU!}?fI?6fxi!Cquf4xHhTv>+-8bkw3 z;I}T6k~m6mi7C3Z<$L^Y^*X%vSmF*ORrM3tMi-B@1IBSbWw0Gr$Y-*o)<3!Ue$AG_ zC=c3axd9^y%;K-6UL3b@F*i}TG)ki0k2kFUj)=SP36ZFRX>Y0j{)FqFH$=#qrx{uy z22Bc7yimmDpS+jp9|Aj*JvsM<{eZDv-sz^uJ{C`9 zi5-v$D%-#^W@r{+F=!Gvb5@_>L~b;$ebXcmQC#$$}8j@$tmBbh>mjnV~Jj>Rskhk(sK>33A25{?w0$qd&~#D&CVBhfZruX zVre%}N4D07LOI;yKa_cwX=XqJpdD{u#1EP2&4bh6&FIoUc$(hoo}+RQf35ec`@;qB znvt{!Zo(l`A8H)fo5+sT>MXilB)RVPGUWAXCi~~_dL15j9cd53pKeTULWO*k!Op3b zufG`ztppcvApI5Z@hV}pc9%&fZ$|z&qo*(^sO2S*nK~wHXQ4+rsB-W8v(YLH+nh;D zol(Q1@GF95|8*zIgW=;Rcq8ddFI(M#iC9{K6c4W0W>x}i?x_U-N!6!&e=wZTZXj z^#~yZl4?0Acy>9(LSd7s5LV0i zU4}oFQ}tG+;}pRmQis(wSQtEFi3{ete+M)quh{!VnN>W z?t?9RpD3*n(@t! ztNzp&qf0OBBlX=U*lBdldMy!&Y-*SEK+?xTAk=8l?<%Pjn<7l81F{4HQT0E!;H@hN zH}$dg`QGag6dsN{HeF|ip0bgObR^Dg2lp!9JPWH1Tzlc`(X({iOJ^ah?=GYDihdBo zWQIYyub$t)|NE{xFW6-HPEbYZ?EpT#-h+{@CzC&-7bb23g&JJUz(Buw!7ss0!5DzB zVQ+8GYVF%au3_ZV4W5YwdE@4(lQgZ_mx(awm}t)|M?a~@yT@bnz+bFK^Hu>pr^InJ z8?g1n2vItm((6P_A+;II^iw70A!_NxR-Rt7ev^{g?4`@_wZFV8YaN*1TD0Ff5B(8g zUR<42bZ9V_U;XGYVRj#X28g+ literal 0 HcmV?d00001 diff --git a/Open-ILS/web/opac/images/tor/software, multimedia.jpg b/Open-ILS/web/opac/images/tor/software, multimedia.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7e34ec66bd28f82d13affca8def91f475ff55857 GIT binary patch literal 442 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<@H|MiwR}W=5D4 zBNHMD1eC>C@dw&0Mv&p&M3qnDC}7H{}uxe&^#tVW>kX-!_iD`UrnEoN x4p_Eo)Aj0Ar*sNtdCqPrIInc_sDiUFdx&+I^$VdA8y~Gz&VpshXZ`=*1OTSYZms|T literal 0 HcmV?d00001 diff --git a/Open-ILS/web/opac/images/tor/sound recording-musical.jpg b/Open-ILS/web/opac/images/tor/sound recording-musical.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fd2232c876f3ef3c5b05d175caef8c60d04ab678 GIT binary patch literal 168 zcmZ?wbhEHb6lM@+*v!E2@87?_fB*jZ^XK>P-`~G~-@SXcfPlc6Gyl`l&di+opMinl z|9=n(2Z}#gz-%252{MC$CA8qA=jy!{{!7fYXE0MMXdk; literal 0 HcmV?d00001 diff --git a/Open-ILS/web/opac/images/tor/sound recording-nonmusical.jpg b/Open-ILS/web/opac/images/tor/sound recording-nonmusical.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fd2232c876f3ef3c5b05d175caef8c60d04ab678 GIT binary patch literal 168 zcmZ?wbhEHb6lM@+*v!E2@87?_fB*jZ^XK>P-`~G~-@SXcfPlc6Gyl`l&di+opMinl z|9=n(2Z}#gz-%252{MC$CA8qA=jy!{{!7fYXE0MMXdk; literal 0 HcmV?d00001 diff --git a/Open-ILS/web/opac/images/tor/sound recording.jpg b/Open-ILS/web/opac/images/tor/sound recording.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fd2232c876f3ef3c5b05d175caef8c60d04ab678 GIT binary patch literal 168 zcmZ?wbhEHb6lM@+*v!E2@87?_fB*jZ^XK>P-`~G~-@SXcfPlc6Gyl`l&di+opMinl z|9=n(2Z}#gz-%252{MC$CA8qA=jy!{{!7fYXE0MMXdk; literal 0 HcmV?d00001 diff --git a/Open-ILS/web/opac/images/tor/still images.jpg b/Open-ILS/web/opac/images/tor/still images.jpg new file mode 100644 index 0000000000000000000000000000000000000000..77f617168e0440a5e9fadac312983613061046c6 GIT binary patch literal 287 zcmZ?wbhEHb6k-r!IKsdnAtBM++?^SuI_$^L=M<6DRvm7~fCddK1+hsE4jvYKjO>pCR_L)U zVmg%I;h@6O;TWK6A*SS{pupiF*4yInXoZo~BDVzv0v)UjyiR4DN}N1AtlR>;h9Y%k z72>=dtWF{f3`N|bc}i^6tUSp=LLBX#9E_1Eq0s_KrC||DtETd}W^;IRsfcn~E)`NY~0IB7zp z5HXW3NNz{0qQ)X>l}nr~m(Edn*Llw$=im2v{`)?k=lgu0=kt8Ni>k$8UB zKmbRVz~V;$<1X4Kj0Zq~9smHLI!Fy{2J~StI1H)}hr+uDW+!D<~SU61I^lIJ%hn8q1ZcZq&u#)Wzc_+fDj0Tp@HEl6lxWnh$GVf z?^tXEF#5nwU>5|00l*j#1Or-Z0dN2ShUgXm>E!+$a41Y441(zCs+*PoAP5Ac2ZO^Q z(7(zcFhmc4!Z7fq#P!Qq+e40C)W@2+ohqnWZf?6bDx+z$&$Sg~di7IXGxndP|Kt9F zV*WAeZ*%}Kgn)FKAQ->}IH|;9V!KlMq)q(aidqZl`L+3!Mv;;n70jtA5QgLHVv-__ zI(i|)7u&{M6^coTo#Iwz><)zU1nP8Je#r+G)=rWGJ#w-%e4^svIo7%eH6bEmmy7UN zCtIVTdYZ#ajYFm9ybMDqW@`@;^Q`Adz^1?SKTO`TG@n zy_qT~WG$iTvsX61XVjcN-m2Z}I5kle`$H;6t-#nbS~c$kcB6@d zJ{O!Ey|mNfjlJISBJxcY4=qQZY7suRkO)-kwnrI|{EL|XzC*lyoBgv0Z2N4bY2wb- z*XP||??#LbZr~CvM?0?VmEbx{VK}POhuQB;48-8hE)w-Ux z3hQcES+tByn>OcBt$K~wAq(__uc5z|eQM;tY@M;lzS_i^pZWf_Pvt1U_u@7_KVn+Y zOBOgjD=1}P^S-x7c1hw74{TpPd(wCHsPz6_H2e*9dEFwwMs)q&5YkXfbbLh5R8+oV z!rOUPl`6uv3(J2h&h_3x$?Nc3IH@>D#W_naTmHIV?4X?;eef-58!291Q+1?FaQ*Q&%*PtPN>CvClx$q` zm`WydO#vopmdB&xQd~UDPV|GB6&uatu57rs=?N_1i8wE^{Z)X~u^ePClM_MlxVwqZ zem=qaBKI4(G7xs2a%QYU%PqCA8wuZ8DbNNFKD|+1tjS*lzFgE2VsIbRoP&tz*R4xj z)E3s{C-HU_tROsl_*g0P<~rh>&%{BbTZ-%~QuFn`JkWprKAOFE+;1d4t`vp;T|`v{n|OXT~?-KilN~>rWb^0&*CO0Co|WgzoiK zY5S4nx@&Ft3pPgIYGsO$g*|61UCQ2Bdasi+-HYVhfGJZnTywnCs$uH@w2mwx^c~nN zwRv99$MNIFrs@Idabs;2r@~x$LZ`DK6RnXm9a%$~{tv~Gn8&nvc1~9=%)7kceU|!+ z?y{!|Rjf;P^>--K-i3Ak(UyVN+&ZPBU!lv|=f&}2o>lYNtv5)7aU<$q4uphFwTbu4 zv5xLv5QTB%HZpm7&3A|YnE%P{mhgx)H?R+bV+>FoWM4mrcq&?=tmV83G^v=gt9OaO zw)N!gc;29RA^ZpY!FQJg*-glQk* + + + + + + + + + + + + + + + + + + + + + + + + + -- 2.43.2