Merged revisions 12025,12028,12035,12037-12050,12053-12057,12060-12065,12067-12072...
authorphasefx <phasefx@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Thu, 19 Feb 2009 05:39:53 +0000 (05:39 +0000)
committerphasefx <phasefx@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Thu, 19 Feb 2009 05:39:53 +0000 (05:39 +0000)
svn://svn.open-ils.org/ILS/trunk

........
  r12025 | miker | 2009-01-31 17:04:33 -0500 (Sat, 31 Jan 2009) | 1 line

  non-grouped event firing, event locating and grouping
........
  r12028 | miker | 2009-01-31 23:42:59 -0500 (Sat, 31 Jan 2009) | 1 line

  adding event group support
........
  r12035 | scottmk | 2009-02-01 14:03:30 -0500 (Sun, 01 Feb 2009) | 8 lines

  Rearranged a bit for clarity.

  1. In doRetrieve: don't declare obj until we're ready to build it.

  2. In doFieldmapperSearch(): reversed an "if" test to clarify what's
  an early return and what's mainline logic.  Also: don't declare or
  create res_list until we know we're going to return it.
........
  r12037 | scottmk | 2009-02-01 16:26:36 -0500 (Sun, 01 Feb 2009) | 3 lines

  Replaced all occurrences of the macro OSRF_METHOD_VERIFY_CONTEXT
  with equivalent calls to the function osrfMethodVerifyContext().
........
  r12038 | miker | 2009-02-01 16:34:34 -0500 (Sun, 01 Feb 2009) | 1 line

  need the full hook, not just idlist
........
  r12039 | miker | 2009-02-01 16:35:44 -0500 (Sun, 01 Feb 2009) | 1 line

  keys is more efficient than map, since we already have the id list as the hash keys
........
  r12040 | dbs | 2009-02-02 01:53:55 -0500 (Mon, 02 Feb 2009) | 7 lines

  Add 98 Nepali MARC records to the test datasets

  On a stock OpenSRF 1.0.3 / Evergreen 1.4.0.1 machine, only 20 of these
  records are successfully added using the standard marc2bre / direct_ingest /
  pg_loader toolchain. Looks like errors decoding JSON containing exotic
  characters; also some strange fingerprints.
........
  r12041 | dbs | 2009-02-02 02:02:04 -0500 (Mon, 02 Feb 2009) | 2 lines

  It's important to mark this as application/octet-stream
........
  r12042 | dbs | 2009-02-02 15:12:10 -0500 (Mon, 02 Feb 2009) | 2 lines

  This kind of typo might cause headaches
........
  r12043 | erickson | 2009-02-03 11:26:58 -0500 (Tue, 03 Feb 2009) | 1 line

  added a cascading survey delete operation.
........
  r12044 | dbs | 2009-02-03 11:42:14 -0500 (Tue, 03 Feb 2009) | 1 line

  Initial attempt to add acquisitions to default configuration
........
  r12045 | erickson | 2009-02-03 12:33:51 -0500 (Tue, 03 Feb 2009) | 1 line

  fixed streaming vs. non-streaming logic error in currency_type retrieve.   took opportunity to port to pcrud
........
  r12046 | scottmk | 2009-02-03 12:53:48 -0500 (Tue, 03 Feb 2009) | 5 lines

  Added a couple of sanity checks to SELECT().  Return NULL if
  (1) the input jsonObject for the join tree is neither a hash,
  nor an array, nor a string; or (2) it's a hash with more than
  one element.
........
  r12047 | dbs | 2009-02-03 13:12:43 -0500 (Tue, 03 Feb 2009) | 1 line

  Make pcrud a publicly available service, just like permacrud
........
  r12048 | erickson | 2009-02-03 14:24:16 -0500 (Tue, 03 Feb 2009) | 1 line

  added pcrud entries for exchange_rate
........
  r12049 | dbs | 2009-02-03 15:49:54 -0500 (Tue, 03 Feb 2009) | 3 lines

  Dojo wants locales passed to it in xx-yy format, not xx-YY.
  Closes #39.
........
  r12050 | dbs | 2009-02-03 15:54:03 -0500 (Tue, 03 Feb 2009) | 3 lines

  Dojo wants locales in xx-yy format, not xx-YY.
  Avoids #39 + 1.
........
  r12053 | scottmk | 2009-02-03 17:44:48 -0500 (Tue, 03 Feb 2009) | 13 lines

  Minor tweaks to the SELECT function:

  1. Narrowed the scope of the idlClass variable.

  2. Made cname const,

  3. In the loop for building the column list: eliminated an IDL lookup
  for the class name, because we already have it.  The IDL stores it
  redundantly in two different places, and we don't need to find both.

  4. Renamed __column and __alias to _column and _alias.  Identifiers
  beginning with two underscores are reserved.
........
  r12054 | scottmk | 2009-02-03 20:43:25 -0500 (Tue, 03 Feb 2009) | 7 lines

  This update tweaks the SELECT function, at the point commented
  "make sure the target relation is in the join tree".

  The new logic should be equivalent to the old, except that
  the old code potentially invokes undefined behavior by
  reading through a null pointer.
........
  r12055 | dbs | 2009-02-03 23:37:46 -0500 (Tue, 03 Feb 2009) | 2 lines

  And now make old-school gateway requests behave in the OPAC.
........
  r12056 | erickson | 2009-02-03 23:46:55 -0500 (Tue, 03 Feb 2009) | 1 line

  allow caller to pass additional onpostapply and oncancel handlers
........
  r12057 | erickson | 2009-02-03 23:47:38 -0500 (Tue, 03 Feb 2009) | 1 line

  better handle case where grid structure may exist but just have no columns yet defined
........
  r12060 | erickson | 2009-02-03 23:49:23 -0500 (Tue, 03 Feb 2009) | 1 line

  added some rough exchange rate editing code using auto widgets.  essentially functions, but more later
........
  r12061 | erickson | 2009-02-04 10:41:15 -0500 (Wed, 04 Feb 2009) | 1 line

  added pending column to represent pending approval from staff.
........
  r12062 | erickson | 2009-02-04 11:12:52 -0500 (Wed, 04 Feb 2009) | 1 line

  added pcrud as controller for asva
........
  r12063 | erickson | 2009-02-04 11:43:03 -0500 (Wed, 04 Feb 2009) | 1 line

  auto-grid now has the ability to pop up an edit dialog for the given fieldmapper object
........
  r12064 | scottmk | 2009-02-04 11:48:49 -0500 (Wed, 04 Feb 2009) | 4 lines

  In SELECT(): simplify and clarify the logic for building a default
  select list.  Also, for a minor performance boost: don't look up the
  core fields unless we're actually going to use them.
........
  r12065 | erickson | 2009-02-04 13:41:44 -0500 (Wed, 04 Feb 2009) | 1 line

  use built-in edit dialog
........
  r12067 | erickson | 2009-02-04 16:27:44 -0500 (Wed, 04 Feb 2009) | 1 line

  rely on the stored grid data to reconstitute a fm object for building the edit dialog
........
  r12068 | erickson | 2009-02-04 16:28:53 -0500 (Wed, 04 Feb 2009) | 1 line

  fixed bug where subsequent dialogs were appending to the the class-level fieldList array.  can now hit Enter to save instead of having to click Save
........
  r12069 | scottmk | 2009-02-04 16:49:06 -0500 (Wed, 04 Feb 2009) | 7 lines

  In SELECT(): further rewrote, and festooned with comments, the code
  that verifies that every column in the SELECT clause comes from a
  class in the FROM clause.

  Also, for readability: reversed an "if" test that treats functions
  differently from classes.
........
  r12070 | erickson | 2009-02-04 17:50:23 -0500 (Wed, 04 Feb 2009) | 1 line

  when using the popup dialog, overide the default focus handling.  this is still experimental
........
  r12071 | erickson | 2009-02-04 17:51:11 -0500 (Wed, 04 Feb 2009) | 1 line

  no need to import 2 grid css's, nor the private _grid css
........
  r12072 | erickson | 2009-02-04 23:36:08 -0500 (Wed, 04 Feb 2009) | 1 line

  selected-ness follow mouse and key navigation in a uniform fashion.
........
  r12074 | erickson | 2009-02-04 23:48:35 -0500 (Wed, 04 Feb 2009) | 1 line

  cleaned up to match latest autogrid
........
  r12077 | erickson | 2009-02-05 09:36:42 -0500 (Thu, 05 Feb 2009) | 1 line

  added option to launch creation dialog from auto grid.  passing final pcrud response to onPostSubmit handler
........
  r12078 | erickson | 2009-02-05 11:03:25 -0500 (Thu, 05 Feb 2009) | 1 line

  give dojo a td and it will replace it with the dijit node, so give dojo a sub-node to clobber instead
........
  r12079 | erickson | 2009-02-05 11:04:36 -0500 (Thu, 05 Feb 2009) | 1 line

  start of single label + action bar to sit above the grid
........
  r12080 | erickson | 2009-02-05 11:21:43 -0500 (Thu, 05 Feb 2009) | 1 line

  allow for definition of default cell width.  (can still be overridden by defining cell widths in the grid)
........
  r12081 | scottmk | 2009-02-05 11:35:44 -0500 (Thu, 05 Feb 2009) | 18 lines

  Various tweaks, mainly to the SELECT function.

  1. Moved some IDL lookups out of a loop where their results were loop invariants.

  2. Narrowed the scope of _alias.

  3. Eliminated some calls to jsonObjectToSimpleString() and strdup(), along with
  the associated mallocs and frees.

  4. Eliminated a couple of needlessly repeated calls to jsonObjectGetKey() by
  caching the results of the first ones.

  5. Uncommented a couple of commented-out calls to jsonIteratorFree(), because
  I don't see anything wrong with them.

  6. Moved another commented-out call back into a scope where it would compile
  if uncommented (but left it commented out for now).
........
  r12082 | erickson | 2009-02-05 12:52:24 -0500 (Thu, 05 Feb 2009) | 1 line

  more style tidying
........
  r12083 | erickson | 2009-02-05 12:53:05 -0500 (Thu, 05 Feb 2009) | 1 line

  consistent focus handling after user clicks cancel/save in edit dialog.  still funky when same actions are done from the create dialog
........
  r12084 | phasefx | 2009-02-05 13:25:39 -0500 (Thu, 05 Feb 2009) | 1 line

  output the deleted flag from the bre
........
  r12085 | erickson | 2009-02-05 17:00:41 -0500 (Thu, 05 Feb 2009) | 1 line

  added selector attr to currency type
........
  r12086 | erickson | 2009-02-05 18:10:29 -0500 (Thu, 05 Feb 2009) | 1 line

  repaired old pylons-ism with TT context locale.  note, the locale will need some cleaning-up in EGWeb.pm to be wholly functional
........
  r12087 | erickson | 2009-02-05 19:08:37 -0500 (Thu, 05 Feb 2009) | 1 line

  added support for auto-building select options from has_a links, using the selector attribute when defined.  mostly functional, needs some tweaking
........
  r12088 | miker | 2009-02-05 21:07:42 -0500 (Thu, 05 Feb 2009) | 1 line

  adding hold-cancel cause and note table and fields; teaching hold targeter how to use the cancel_cause field
........
  r12089 | scottmk | 2009-02-06 04:32:44 -0500 (Fri, 06 Feb 2009) | 11 lines

  Miscellaneous tweaks:

  1. In searchFieldTransform(): simplified the way we append subcolumns, to
  reduce the churning of memory.

  2. I found it confusing that we were using _column for two different
  (though similar) things.  So I split it into two separate variables in two
  separate scopes: col_name and _column.

  3. Don't bother looking up "i18n" if it's disabled anyway.
........
  r12090 | miker | 2009-02-06 09:28:30 -0500 (Fri, 06 Feb 2009) | 1 line

  add patron-opac cause, and comments about IDs
........
  r12091 | miker | 2009-02-06 10:05:41 -0500 (Fri, 06 Feb 2009) | 1 line

  teaching everyone how to note the pkey delete restriction policy for specific classes
........
  r12092 | miker | 2009-02-06 10:24:02 -0500 (Fri, 06 Feb 2009) | 1 line

  /actually/ pin the ids, and set the sequence appropriately
........
  r12093 | erickson | 2009-02-06 10:42:12 -0500 (Fri, 06 Feb 2009) | 1 line

  fixed problem with async widget building and saving (by using my own code as it was meant to be used)
........
  r12094 | erickson | 2009-02-06 10:52:21 -0500 (Fri, 06 Feb 2009) | 1 line

  added support for passing in cancellation cause and note
........
  r12095 | erickson | 2009-02-06 10:55:06 -0500 (Fri, 06 Feb 2009) | 1 line

  passing hold cancellation reason from opac-cancelled holds
........
  r12096 | erickson | 2009-02-06 11:15:14 -0500 (Fri, 06 Feb 2009) | 1 line

  added support for displaying the last X cancelled holds, most recently cancelled holds first
........
  r12097 | erickson | 2009-02-06 12:52:57 -0500 (Fri, 06 Feb 2009) | 1 line

  new method for un-canceling holds.  request_time and expire_time are reset if appropriate org-unit-setting is enabled
........
  r12098 | miker | 2009-02-06 12:58:04 -0500 (Fri, 06 Feb 2009) | 1 line

  use method_lookup instead of direct call ($self is not what you think...)
........
  r12099 | erickson | 2009-02-06 17:11:32 -0500 (Fri, 06 Feb 2009) | 1 line

  don't attempt to retrieve the linked selector objects if the data is not retrievable via pcrud
........
  r12100 | dbs | 2009-02-07 14:01:44 -0500 (Sat, 07 Feb 2009) | 1 line

  Make all FKs deferrable again
........
  r12103 | scottmk | 2009-02-07 19:28:13 -0500 (Sat, 07 Feb 2009) | 16 lines

  More tweaks, mostly to SELECT():

  1. When building the select list, insert a separator comma in one
  place instead of duplicating the code.

  2. Narrowed the scope of fname.

  3. Created a new transform_str variable instead of reusing _column
  for a different purpose.

  4. Juggled _column and _alias a bit so as to eliminate a strdup()
  and a free().

  5.In searchFieldTransform(): plugged a memory leak in the event of
  an error return.
........
  r12104 | miker | 2009-02-07 21:12:31 -0500 (Sat, 07 Feb 2009) | 1 line

  adding note tables for all bucket and item tables; adding pos field for optional ordering of items within a bucket
........
  r12105 | miker | 2009-02-07 21:33:03 -0500 (Sat, 07 Feb 2009) | 1 line

  adding IDL for note tables for all bucket and item tables; adding IDL for pos field for optional ordering of items within a bucket
........
  r12106 | miker | 2009-02-07 21:37:56 -0500 (Sat, 07 Feb 2009) | 1 line

  add a record bucket type for reading lists
........
  r12107 | erickson | 2009-02-08 09:43:43 -0500 (Sun, 08 Feb 2009) | 1 line

  more provider data.  address, contact, and contact address
........
  r12108 | erickson | 2009-02-08 09:59:49 -0500 (Sun, 08 Feb 2009) | 1 line

  no need to publish provider contacts in reporter-store
........
  r12109 | erickson | 2009-02-08 11:05:20 -0500 (Sun, 08 Feb 2009) | 1 line

  autogrid can now fetch and load all data of a given class
........
  r12110 | erickson | 2009-02-08 11:06:36 -0500 (Sun, 08 Feb 2009) | 1 line

  use new built-in autogrid fetch & load
........
  r12111 | erickson | 2009-02-08 20:05:05 -0500 (Sun, 08 Feb 2009) | 1 line

  init datalist at startup so each successive instance isn't appending to the same array
........
  r12112 | miker | 2009-02-08 22:34:12 -0500 (Sun, 08 Feb 2009) | 1 line

  IE does not yet support Array.forEach ... so we fake it with dojo
........
  r12113 | miker | 2009-02-08 22:34:48 -0500 (Sun, 08 Feb 2009) | 1 line

  replace the (very slow) view with the materialized version
........
  r12114 | erickson | 2009-02-09 09:12:41 -0500 (Mon, 09 Feb 2009) | 1 line

  function to wrap up a xact-base storage request in 1 call
........
  r12117 | erickson | 2009-02-09 12:56:19 -0500 (Mon, 09 Feb 2009) | 1 line

  teach the IDL about the existence of pkey sequences
........
  r12118 | erickson | 2009-02-09 12:56:49 -0500 (Mon, 09 Feb 2009) | 1 line

  not sure why views[1] was working before, but it's not now
........
  r12119 | erickson | 2009-02-09 13:09:43 -0500 (Mon, 09 Feb 2009) | 1 line

  removed some unnecessary console logs
........
  r12120 | erickson | 2009-02-09 13:47:25 -0500 (Mon, 09 Feb 2009) | 1 line

  can now specify post update and create handlers.  wrap re-focus in try
........
  r12121 | erickson | 2009-02-09 13:51:24 -0500 (Mon, 09 Feb 2009) | 1 line

  moved currency type config into conify, using autogrid
........
  r12122 | erickson | 2009-02-09 16:53:48 -0500 (Mon, 09 Feb 2009) | 1 line

  created read-only version of a single widget and edit pane
........
  r12123 | erickson | 2009-02-09 16:54:27 -0500 (Mon, 09 Feb 2009) | 1 line

  by default, don't show sequence columns, which will usually be 'id' columns.  configurable
........
  r12124 | djfiander | 2009-02-09 21:52:54 -0500 (Mon, 09 Feb 2009) | 1 line

  A bunch of untested code to support serials predictions
........
  r12125 | scottmk | 2009-02-09 22:46:33 -0500 (Mon, 09 Feb 2009) | 15 lines

  Miscellaneous tweaks:

  1. Simplified the logic in searchValueTransform().

  2. In a debug message: changed format specification to %p for pointer
  values, instead of %d.  Using %d will garble the output if ints and
  pointers don't have the same size (and they don't on my laptop).

  3. Corrected a typo in another message. The word "non-existant"
  is non-existent.

  4. For clarity: in several places, reversed the logic of some
  if/elses so that we test for a positive condition instead of
  a negative condition.
........
  r12127 | erickson | 2009-02-10 12:05:53 -0500 (Tue, 10 Feb 2009) | 1 line

  sort bucket items by 'pos' field
........
  r12131 | erickson | 2009-02-10 13:17:32 -0500 (Tue, 10 Feb 2009) | 1 line

  forward port craftsman skin : svn merge -r12127:12130 svn://svn.open-ils.org/ILS/branches/rel_1_4
........
  r12132 | erickson | 2009-02-10 14:06:53 -0500 (Tue, 10 Feb 2009) | 1 line

  flesh item notes on retrieval.  refactor retrieval to use cstoreditor
........
  r12133 | erickson | 2009-02-10 14:08:51 -0500 (Tue, 10 Feb 2009) | 1 line

  added bucket item notes virtual fields
........
  r12134 | dbs | 2009-02-10 14:16:33 -0500 (Tue, 10 Feb 2009) | 2 lines

  Get the real org_unit_type depth from aout
........
  r12137 | erickson | 2009-02-10 14:41:10 -0500 (Tue, 10 Feb 2009) | 1 line

  handle item notes on cascade delete.  created item note CUD method.  more cstoreditor-ification
........
  r12138 | erickson | 2009-02-10 15:46:08 -0500 (Tue, 10 Feb 2009) | 1 line

  handle case where an address is pending but replaces no other address
........
  r12139 | erickson | 2009-02-10 15:46:31 -0500 (Tue, 10 Feb 2009) | 1 line

  entry for usr address pending flag
........
  r12140 | erickson | 2009-02-10 15:46:58 -0500 (Tue, 10 Feb 2009) | 1 line

  set pending true on altered addresses
........
  r12141 | erickson | 2009-02-10 15:49:11 -0500 (Tue, 10 Feb 2009) | 1 line

  return addr id for consistency
........
  r12142 | erickson | 2009-02-10 15:51:55 -0500 (Tue, 10 Feb 2009) | 1 line

  allow approval of pending address, even if it does not replace any other address
........
  r12143 | erickson | 2009-02-10 16:24:39 -0500 (Tue, 10 Feb 2009) | 1 line

  take advantage of the new billable_transaction_summary table.  also, force caller to make_mbts to pass an editor in
........
  r12144 | erickson | 2009-02-10 17:44:51 -0500 (Tue, 10 Feb 2009) | 1 line

  initial support for adding entries to a patron's items-checked-out list
........
  r12145 | scottmk | 2009-02-10 23:12:08 -0500 (Tue, 10 Feb 2009) | 9 lines

  1. Applied a uniform standard to determine whether a string represents
  true or false.  A few remaining spots are unchanged for now because
  they are dubious on other grounds.

  2. In one spot: replaced jsonParseString("true") with jsonNewBoolObject( 1 ).

  3. In oilsMakeFieldmapperFromResult(): broke up a confusing "if" test
  into two simpler ones.
........
  r12146 | dbs | 2009-02-10 23:15:19 -0500 (Tue, 10 Feb 2009) | 2 lines

  Doh! slight HTML problem
........
  r12147 | erickson | 2009-02-10 23:33:16 -0500 (Tue, 10 Feb 2009) | 1 line

  plugged in checkout history bucket population to checkout process
........
  r12149 | miker | 2009-02-11 12:02:19 -0500 (Wed, 11 Feb 2009) | 1 line

  fix off-by-one on function literal construction (for function-in-from and literal value transforms); use the function name as the from clause alias, avoiding "(null)" as the alias
........
  r12150 | scottmk | 2009-02-11 13:55:11 -0500 (Wed, 11 Feb 2009) | 7 lines

  1. Corrected the enforcement of the readonly attribute for classes.
  It was backwards, but harmlessly so because the enforcement is
  redundant.

  2. Reversed the default for the "virtual" attribute of a field.
  Formerly it defaulted to true; now it defaults to false.
........
  r12151 | erickson | 2009-02-11 15:43:00 -0500 (Wed, 11 Feb 2009) | 1 line

  use copy buckets instead (for precats) and verify the copy bucket mechanism is globally configured
........
  r12152 | erickson | 2009-02-11 16:18:28 -0500 (Wed, 11 Feb 2009) | 1 line

  fixed broken array ref handling
........
  r12153 | miker | 2009-02-11 16:31:05 -0500 (Wed, 11 Feb 2009) | 1 line

  add idl field documenation table and accompanying IDL entry ... crazy recursive docs
........
  r12154 | miker | 2009-02-11 16:33:10 -0500 (Wed, 11 Feb 2009) | 1 line

  no, we want that, really
........
  r12156 | miker | 2009-02-12 01:31:32 -0500 (Thu, 12 Feb 2009) | 1 line

  adding IN subquery support
........
  r12157 | erickson | 2009-02-12 11:33:20 -0500 (Thu, 12 Feb 2009) | 1 line

  fixed wiget value accessor/mutator which resulted in values with embedded wiget objects (resulting in infinite recursion in js2JSON)
........
  r12158 | erickson | 2009-02-12 12:01:20 -0500 (Thu, 12 Feb 2009) | 1 line

  new provider ui, based on autogrid and moved into conify (editing static data).  leaving other in place until all functionality is ported over
........
  r12159 | erickson | 2009-02-12 12:01:53 -0500 (Thu, 12 Feb 2009) | 1 line

  slight reformatting for readability
........
  r12160 | erickson | 2009-02-12 12:25:40 -0500 (Thu, 12 Feb 2009) | 1 line

  added pcrud entries for trigger event def and hook
........
  r12161 | dbs | 2009-02-12 12:27:04 -0500 (Thu, 12 Feb 2009) | 2 lines

  Revert r12071 until we port jubgrid.js over to the Dojo 1.2 DataGrid
........
  r12162 | scottmk | 2009-02-12 14:25:37 -0500 (Thu, 12 Feb 2009) | 2 lines

  Pass down an osrfMethodContext* where we need one.
........
  r12164 | dbs | 2009-02-12 15:15:35 -0500 (Thu, 12 Feb 2009) | 2 lines

  Further testing suggests that dojox/resources/Grid.css is not needed, and in fact causes problems
........
  r12165 | erickson | 2009-02-12 17:12:54 -0500 (Thu, 12 Feb 2009) | 1 line

  pcrud entries for action_trigger validator and reactor
........
  r12166 | erickson | 2009-02-12 17:22:22 -0500 (Thu, 12 Feb 2009) | 1 line

  repaired fkey column names
........
  r12167 | erickson | 2009-02-12 17:37:01 -0500 (Thu, 12 Feb 2009) | 1 line

  no need for a store if there is no tree data (don't attempt to access dataList[0])
........
  r12168 | dbs | 2009-02-13 00:15:26 -0500 (Fri, 13 Feb 2009) | 2 lines

  Add VIEW_BILLING_TYPE permission to Staff
........
  r12169 | erickson | 2009-02-13 09:19:03 -0500 (Fri, 13 Feb 2009) | 1 line

  pcrud for action_trigger.cleanup
........
  r12170 | erickson | 2009-02-13 11:14:40 -0500 (Fri, 13 Feb 2009) | 1 line

  func comments, treat "" as null
........
  r12171 | erickson | 2009-02-13 11:15:14 -0500 (Fri, 13 Feb 2009) | 1 line

  don't display auto-generated fields in create dialog
........
  r12172 | erickson | 2009-02-13 11:15:58 -0500 (Fri, 13 Feb 2009) | 1 line

  when no field order is defined but fields existin in the markup, start there with the order
........
  r12173 | erickson | 2009-02-13 11:17:21 -0500 (Fri, 13 Feb 2009) | 1 line

  UI for managing trigger event_defs, hooks, reactors, and validators -- all auto-generated at this point, but will need some additions
........
  r12174 | dbs | 2009-02-13 12:03:05 -0500 (Fri, 13 Feb 2009) | 3 lines

  Give the Administrator user an explicit work_ou of 1 (Consortium)
  Fixes calls to open-ils.actor.user.work_perm.highest_org_set.batch and friends that returned NULL for Administrator user
........
  r12177 | erickson | 2009-02-13 14:58:24 -0500 (Fri, 13 Feb 2009) | 1 line

  fixed fkey col name
........
  r12178 | erickson | 2009-02-13 15:08:30 -0500 (Fri, 13 Feb 2009) | 1 line

  fixed org unit data type
........
  r12179 | erickson | 2009-02-13 17:10:08 -0500 (Fri, 13 Feb 2009) | 1 line

  can now override any given auto-widget with a locally defined widget
........
  r12180 | erickson | 2009-02-13 17:21:34 -0500 (Fri, 13 Feb 2009) | 1 line

  UI for manging idl_field_doc entries
........
  r12181 | miker | 2009-02-13 20:11:31 -0500 (Fri, 13 Feb 2009) | 1 line

  cannot use "classname", we have reserved that in the js, and perl uses class_name. so, we will use fm_class
........
  r12182 | erickson | 2009-02-14 12:28:50 -0500 (Sat, 14 Feb 2009) | 1 line

  updated to match new fm_class field name
........
  r12183 | scottmk | 2009-02-14 21:40:40 -0500 (Sat, 14 Feb 2009) | 6 lines

  1. in searchJOIN(): fixed a bug in a couple of loops that search for
  links in the IDL.  We were incrementing the index twice in each
  iteration, and thereby examining only ever other entry.

  2. Constified a couple of character pointers.
........
  r12184 | erickson | 2009-02-15 11:39:19 -0500 (Sun, 15 Feb 2009) | 1 line

  don't apply on-enter-equals-submit handler, cuz enter is conventiently used in various widgets to select values
........
  r12185 | erickson | 2009-02-15 11:41:22 -0500 (Sun, 15 Feb 2009) | 1 line

  added store reset func
........
  r12186 | erickson | 2009-02-15 11:58:57 -0500 (Sun, 15 Feb 2009) | 1 line

  linked in some more UI's
........
  r12187 | dbs | 2009-02-15 13:53:56 -0500 (Sun, 15 Feb 2009) | 2 lines

  Cast LOWER arguments explicitly to text to deal with LOWER(id) - throws an exception on PostgreSQL 8.3
........
  r12189 | phasefx | 2009-02-15 17:30:44 -0500 (Sun, 15 Feb 2009) | 1 line

  grammar-o.  Thanks Trinculo!
........
  r12190 | dbs | 2009-02-15 21:14:28 -0500 (Sun, 15 Feb 2009) | 1 line

  Enable local administrators to run / view / share reports by default
........
  r12191 | erickson | 2009-02-16 13:55:09 -0500 (Mon, 16 Feb 2009) | 1 line

  in addition to the field list, provide a name-based hash for faster/simpler runtime lookup
........
  r12192 | erickson | 2009-02-16 16:55:52 -0500 (Mon, 16 Feb 2009) | 1 line

  plugged in perm group tree builder
........
  r12193 | erickson | 2009-02-16 17:00:06 -0500 (Mon, 16 Feb 2009) | 1 line

  experimental flattened/idl-aware user editor that takes advantage of auto-widgets and field-docs (i.e. context help)
........
  r12194 | erickson | 2009-02-16 21:30:46 -0500 (Mon, 16 Feb 2009) | 1 line

  initial plugin of staff-cats
........
  r12195 | erickson | 2009-02-16 22:34:13 -0500 (Mon, 16 Feb 2009) | 1 line

  stat cat entries plugged in
........
  r12196 | erickson | 2009-02-16 23:10:06 -0500 (Mon, 16 Feb 2009) | 1 line

  plugged in surveys
........
  r12197 | dbs | 2009-02-16 23:59:13 -0500 (Mon, 16 Feb 2009) | 1 line

  en-US is better than no MARC editor tooltips at all; but we really need to HEAD the requested locale
........
  r12200 | scottmk | 2009-02-17 09:03:35 -0500 (Tue, 17 Feb 2009) | 10 lines

  Opened a window into the innards of oils_cstore.c.

  1. Gave external linkage to the SELECT function.

  2. Added a new test_json_query.c, which calls the newly extern
  SELECT() to translate a JSON query into SQL.  To be used for
  testing, debugging, and troubleshooting.  Note that this
  utility calls SELECT() by normal linkage, not by dynamic
  loading.
........
  r12201 | erickson | 2009-02-17 09:20:07 -0500 (Tue, 17 Feb 2009) | 1 line

  use colspan 0 to span the table length
........
  r12202 | erickson | 2009-02-17 10:40:53 -0500 (Tue, 17 Feb 2009) | 1 line

  pcrud entries for ident_type
........
  r12203 | erickson | 2009-02-17 11:12:46 -0500 (Tue, 17 Feb 2009) | 1 line

  plugged in saving of new users
........
  r12204 | dbs | 2009-02-17 11:42:10 -0500 (Tue, 17 Feb 2009) | 2 lines

  Let's build test_json_query as part of autotools
........
  r12205 | erickson | 2009-02-17 13:06:13 -0500 (Tue, 17 Feb 2009) | 1 line

  repaired org setting calls.  added static version so no org-unit reference is required
........
  r12206 | erickson | 2009-02-17 13:06:36 -0500 (Tue, 17 Feb 2009) | 1 line

  added batch org setting method
........
  r12207 | erickson | 2009-02-17 13:06:57 -0500 (Tue, 17 Feb 2009) | 1 line

  explicitly load Util
........
  r12208 | erickson | 2009-02-17 17:49:37 -0500 (Tue, 17 Feb 2009) | 1 line

  added int/float widgets
........
  r12209 | erickson | 2009-02-17 17:50:41 -0500 (Tue, 17 Feb 2009) | 1 line

  plugged in new/delete addr handling
........
  r12210 | erickson | 2009-02-17 17:57:37 -0500 (Tue, 17 Feb 2009) | 1 line

  allow for the setting of the page title from the sub-template
........
  r12211 | scottmk | 2009-02-17 18:19:16 -0500 (Tue, 17 Feb 2009) | 3 lines

  In searchJOIN(): added a bit of sanity checking, to prevent
  segfaults induced by certain kinds of malformed JSOn queries.
........
  r12213 | erickson | 2009-02-17 23:48:34 -0500 (Tue, 17 Feb 2009) | 1 line

  dojo-based interval2seconds
........
  r12214 | erickson | 2009-02-17 23:49:20 -0500 (Tue, 17 Feb 2009) | 1 line

  added onchange to set expire date based on profile group selected
........
  r12215 | erickson | 2009-02-17 23:52:25 -0500 (Tue, 17 Feb 2009) | 1 line

  initial dojo-ified xul glue
........
  r12216 | dbs | 2009-02-17 23:55:26 -0500 (Tue, 17 Feb 2009) | 3 lines

  Avoid syntax errors due to mix of multi-valued INSERT clauses and single-valued INSERT clauses
  Avoid duplicate key error in that pesky permissions list
........
  r12217 | scottmk | 2009-02-18 02:51:39 -0500 (Wed, 18 Feb 2009) | 4 lines

  searchJOIN() was segfaulting when the FROM clause was of
  the form "from": { "xxx":"yyy" }.  Reason: we were
  freeing freeable_hash prematurely.  Fixed.
........
  r12218 | erickson | 2009-02-18 12:15:13 -0500 (Wed, 18 Feb 2009) | 1 line

  added onchange to copy new barcodes into usrname field
........
  r12223 | scottmk | 2009-02-18 16:25:48 -0500 (Wed, 18 Feb 2009) | 3 lines

  Correct an error in the link specification for class asv.
  (Class aou doesn't have a "survey" field.)
........
  r12227 | scottmk | 2009-02-18 21:12:46 -0500 (Wed, 18 Feb 2009) | 14 lines

  In searchJOIN: substantially rewrote the code for the condition where
  the JSON query specifies neither of the join columns.

  1. Corrected an apparent bug whereby we could join in only one
  direction, even when a join in the opposite direction was
  valid and equivalent.

  2. Rewrote the search loops for better performance.

  3. When testing for the success of the searches for join columns,
  success should mean that we have identified both columns.  Identifying
  just one isn't enough.
........

git-svn-id: svn://svn.open-ils.org/ILS/branches/staff-client-experiment@12228 dcc99617-32d9-48b4-a31d-7c20da2025e4

269 files changed:
Open-ILS/examples/fm_IDL.xml
Open-ILS/examples/opensrf.xml.example
Open-ILS/examples/opensrf_core.xml.example
Open-ILS/src/Makefile.am
Open-ILS/src/c-apps/Makefile.am
Open-ILS/src/c-apps/dump_idl.c
Open-ILS/src/c-apps/oils_cstore.c
Open-ILS/src/c-apps/oils_idl-core.c
Open-ILS/src/c-apps/test_json_query.c [new file with mode: 0644]
Open-ILS/src/extras/fast-extract
Open-ILS/src/extras/ils_events.xml
Open-ILS/src/extras/org_tree_html_options.pl
Open-ILS/src/perlmods/OpenILS/Application/Actor.pm
Open-ILS/src/perlmods/OpenILS/Application/Actor/Container.pm
Open-ILS/src/perlmods/OpenILS/Application/AppUtils.pm
Open-ILS/src/perlmods/OpenILS/Application/Circ/Circulate.pm
Open-ILS/src/perlmods/OpenILS/Application/Circ/Holds.pm
Open-ILS/src/perlmods/OpenILS/Application/Circ/Survey.pm
Open-ILS/src/perlmods/OpenILS/Application/Storage/CDBI/action.pm
Open-ILS/src/perlmods/OpenILS/Application/Storage/Driver/Pg/storage.pm
Open-ILS/src/perlmods/OpenILS/Application/Storage/Publisher/action.pm
Open-ILS/src/perlmods/OpenILS/Application/Storage/Publisher/actor.pm
Open-ILS/src/perlmods/OpenILS/Application/Trigger.pm
Open-ILS/src/perlmods/OpenILS/Application/Trigger/Event.pm
Open-ILS/src/perlmods/OpenILS/Application/Trigger/EventGroup.pm [new file with mode: 0644]
Open-ILS/src/perlmods/OpenILS/Utils/Fieldmapper.pm
Open-ILS/src/perlmods/OpenILS/Utils/MFHD/Caption.pm
Open-ILS/src/perlmods/OpenILS/Utils/MFHD/Holding.pm
Open-ILS/src/sql/Pg/002.schema.config.sql
Open-ILS/src/sql/Pg/005.schema.actors.sql
Open-ILS/src/sql/Pg/012.schema.vandelay.sql
Open-ILS/src/sql/Pg/040.schema.asset.sql
Open-ILS/src/sql/Pg/070.schema.container.sql
Open-ILS/src/sql/Pg/080.schema.money.sql
Open-ILS/src/sql/Pg/090.schema.action.sql
Open-ILS/src/sql/Pg/1.2.2.1-1.2.2.2-upgrade-db.sql
Open-ILS/src/sql/Pg/1.2.2.2-1.2.2.3-upgrade-db.sql
Open-ILS/src/sql/Pg/200.schema.acq.sql
Open-ILS/src/sql/Pg/210.schema.serials.sql
Open-ILS/src/sql/Pg/400.schema.action_trigger.sql
Open-ILS/src/sql/Pg/500.view.cross-schema.sql
Open-ILS/src/sql/Pg/950.data.seed-values.sql
Open-ILS/src/sql/Pg/999.functions.global.sql
Open-ILS/src/sql/Pg/extend-reporter.sql
Open-ILS/tests/datasets/README
Open-ILS/tests/datasets/nepali.marc [new file with mode: 0644]
Open-ILS/web/conify/global/admin.js
Open-ILS/web/css/skin/default.css
Open-ILS/web/js/dojo/fieldmapper/Fieldmapper.js
Open-ILS/web/js/dojo/fieldmapper/IDL.js
Open-ILS/web/js/dojo/fieldmapper/OrgUtils.js
Open-ILS/web/js/dojo/openils/User.js
Open-ILS/web/js/dojo/openils/Util.js
Open-ILS/web/js/dojo/openils/XUL.js [new file with mode: 0644]
Open-ILS/web/js/dojo/openils/acq/CurrencyType.js
Open-ILS/web/js/dojo/openils/editors.js
Open-ILS/web/js/dojo/openils/widget/AutoFieldWidget.js
Open-ILS/web/js/dojo/openils/widget/AutoGrid.js
Open-ILS/web/js/dojo/openils/widget/EditDialog.js
Open-ILS/web/js/dojo/openils/widget/EditPane.js
Open-ILS/web/js/dojo/openils/widget/FilteringTreeSelect.js
Open-ILS/web/js/ui/default/acq/financial/list_currency_types.js [deleted file]
Open-ILS/web/js/ui/default/actor/user/register.js [new file with mode: 0644]
Open-ILS/web/js/ui/default/conify/global/acq/provider.js [new file with mode: 0644]
Open-ILS/web/js/ui/default/conify/global/config/idl_field_doc.js [new file with mode: 0644]
Open-ILS/web/opac/common/js/RemoteRequest.js
Open-ILS/web/opac/images/Thumbs.db [new file with mode: 0644]
Open-ILS/web/opac/images/advancedsearch-icon.gif [new file with mode: 0644]
Open-ILS/web/opac/images/advancedsearch-icon.png [new file with mode: 0644]
Open-ILS/web/opac/images/bg.gif [new file with mode: 0644]
Open-ILS/web/opac/images/blank.gif [new file with mode: 0644]
Open-ILS/web/opac/images/book-icon.png [new file with mode: 0644]
Open-ILS/web/opac/images/cancel-icon-u.gif [new file with mode: 0644]
Open-ILS/web/opac/images/cancel-icon-u.png [new file with mode: 0644]
Open-ILS/web/opac/images/cancel-icon.gif [new file with mode: 0644]
Open-ILS/web/opac/images/cancel-icon.png [new file with mode: 0644]
Open-ILS/web/opac/images/cartographic.jpg [new file with mode: 0644]
Open-ILS/web/opac/images/chooselibrary-icon.gif [new file with mode: 0644]
Open-ILS/web/opac/images/chooselibrary-icon.png [new file with mode: 0644]
Open-ILS/web/opac/images/closeall-icon-u.gif [new file with mode: 0644]
Open-ILS/web/opac/images/closeall-icon-u.png [new file with mode: 0644]
Open-ILS/web/opac/images/closeall-icon.gif [new file with mode: 0644]
Open-ILS/web/opac/images/closeall-icon.png [new file with mode: 0644]
Open-ILS/web/opac/images/content-bg.gif [new file with mode: 0644]
Open-ILS/web/opac/images/content-bg.jpg [new file with mode: 0644]
Open-ILS/web/opac/images/details-f-bg-u.gif [new file with mode: 0644]
Open-ILS/web/opac/images/details-f-bg.gif [new file with mode: 0644]
Open-ILS/web/opac/images/details-headers-bg.gif [new file with mode: 0644]
Open-ILS/web/opac/images/earth-icon.png [new file with mode: 0644]
Open-ILS/web/opac/images/eg_tiny_logo.gif [new file with mode: 0644]
Open-ILS/web/opac/images/expandall-icon-u.gif [new file with mode: 0644]
Open-ILS/web/opac/images/expandall-icon-u.png [new file with mode: 0644]
Open-ILS/web/opac/images/expandall-icon.gif [new file with mode: 0644]
Open-ILS/web/opac/images/expandall-icon.png [new file with mode: 0644]
Open-ILS/web/opac/images/footer-bg.gif [new file with mode: 0644]
Open-ILS/web/opac/images/footer-bl.gif [new file with mode: 0644]
Open-ILS/web/opac/images/footer-bottom.gif [new file with mode: 0644]
Open-ILS/web/opac/images/footer-br.gif [new file with mode: 0644]
Open-ILS/web/opac/images/footer-corners.gif [new file with mode: 0644]
Open-ILS/web/opac/images/footer-left.gif [new file with mode: 0644]
Open-ILS/web/opac/images/footer-right.gif [new file with mode: 0644]
Open-ILS/web/opac/images/footer-tl.gif [new file with mode: 0644]
Open-ILS/web/opac/images/footer-top.gif [new file with mode: 0644]
Open-ILS/web/opac/images/footer-tr.gif [new file with mode: 0644]
Open-ILS/web/opac/images/header-bg.gif [new file with mode: 0644]
Open-ILS/web/opac/images/header-shadow.gif [new file with mode: 0644]
Open-ILS/web/opac/images/home-bottom-tag-bg.gif [new file with mode: 0644]
Open-ILS/web/opac/images/home-icon-u.gif [new file with mode: 0644]
Open-ILS/web/opac/images/home-icon-u.png [new file with mode: 0644]
Open-ILS/web/opac/images/home-icon.gif [new file with mode: 0644]
Open-ILS/web/opac/images/home-icon.png [new file with mode: 0644]
Open-ILS/web/opac/images/inner-account-icon-u.gif [new file with mode: 0644]
Open-ILS/web/opac/images/inner-account-icon-u.png [new file with mode: 0644]
Open-ILS/web/opac/images/inner-account-icon.gif [new file with mode: 0644]
Open-ILS/web/opac/images/inner-account-icon.png [new file with mode: 0644]
Open-ILS/web/opac/images/inner-advanced-icon-u.gif [new file with mode: 0644]
Open-ILS/web/opac/images/inner-advanced-icon-u.png [new file with mode: 0644]
Open-ILS/web/opac/images/inner-advanced-icon.gif [new file with mode: 0644]
Open-ILS/web/opac/images/inner-advanced-icon.png [new file with mode: 0644]
Open-ILS/web/opac/images/lg-txt.gif [new file with mode: 0644]
Open-ILS/web/opac/images/libselect-btn.gif [new file with mode: 0644]
Open-ILS/web/opac/images/list-icon.gif [new file with mode: 0644]
Open-ILS/web/opac/images/list-icon.png [new file with mode: 0644]
Open-ILS/web/opac/images/login-icon-u.gif [new file with mode: 0644]
Open-ILS/web/opac/images/login-icon-u.png [new file with mode: 0644]
Open-ILS/web/opac/images/login-icon.gif [new file with mode: 0644]
Open-ILS/web/opac/images/login-icon.png [new file with mode: 0644]
Open-ILS/web/opac/images/loginas-icon.gif [new file with mode: 0644]
Open-ILS/web/opac/images/loginas-icon.png [new file with mode: 0644]
Open-ILS/web/opac/images/logo.gif [new file with mode: 0644]
Open-ILS/web/opac/images/logo.png [new file with mode: 0644]
Open-ILS/web/opac/images/logout-icon-u.gif [new file with mode: 0644]
Open-ILS/web/opac/images/logout-icon-u.png [new file with mode: 0644]
Open-ILS/web/opac/images/logout-icon.gif [new file with mode: 0644]
Open-ILS/web/opac/images/logout-icon.png [new file with mode: 0644]
Open-ILS/web/opac/images/mix-icon.png [new file with mode: 0644]
Open-ILS/web/opac/images/mixed material.jpg [new file with mode: 0644]
Open-ILS/web/opac/images/mov-icon.png [new file with mode: 0644]
Open-ILS/web/opac/images/moving image.jpg [new file with mode: 0644]
Open-ILS/web/opac/images/mussymbol-icon.png [new file with mode: 0644]
Open-ILS/web/opac/images/myaccount-icon.gif [new file with mode: 0644]
Open-ILS/web/opac/images/myaccount-icon.png [new file with mode: 0644]
Open-ILS/web/opac/images/noimg.gif [new file with mode: 0644]
Open-ILS/web/opac/images/nonmusic-icon.png [new file with mode: 0644]
Open-ILS/web/opac/images/notated music.jpg [new file with mode: 0644]
Open-ILS/web/opac/images/pic-icon.png [new file with mode: 0644]
Open-ILS/web/opac/images/placeholder-icon.png [new file with mode: 0644]
Open-ILS/web/opac/images/progressbar_green-old.gif [new file with mode: 0644]
Open-ILS/web/opac/images/progressbar_green.gif
Open-ILS/web/opac/images/recsound-icon.png [new file with mode: 0644]
Open-ILS/web/opac/images/reg-txt.gif [new file with mode: 0644]
Open-ILS/web/opac/images/relevant-icon-u.gif [new file with mode: 0644]
Open-ILS/web/opac/images/relevant-icon-u.png [new file with mode: 0644]
Open-ILS/web/opac/images/relevant-icon.gif [new file with mode: 0644]
Open-ILS/web/opac/images/relevant-icon.png [new file with mode: 0644]
Open-ILS/web/opac/images/search-btn.gif [new file with mode: 0644]
Open-ILS/web/opac/images/searchbar-bg.gif [new file with mode: 0644]
Open-ILS/web/opac/images/searchbox-bg.gif [new file with mode: 0644]
Open-ILS/web/opac/images/series-icon-u.gif [new file with mode: 0644]
Open-ILS/web/opac/images/series-icon-u.png [new file with mode: 0644]
Open-ILS/web/opac/images/series-icon.gif [new file with mode: 0644]
Open-ILS/web/opac/images/series-icon.png [new file with mode: 0644]
Open-ILS/web/opac/images/sidebar-bg.gif [new file with mode: 0644]
Open-ILS/web/opac/images/slimtree/folder2.gif
Open-ILS/web/opac/images/slimtree/folderopen2.gif
Open-ILS/web/opac/images/small-rss.gif [new file with mode: 0644]
Open-ILS/web/opac/images/software, multimedia.jpg [new file with mode: 0644]
Open-ILS/web/opac/images/software-icon.png [new file with mode: 0644]
Open-ILS/web/opac/images/sound recording-musical.jpg [new file with mode: 0644]
Open-ILS/web/opac/images/sound recording-nonmusical.jpg [new file with mode: 0644]
Open-ILS/web/opac/images/sound recording.jpg [new file with mode: 0644]
Open-ILS/web/opac/images/sound-icon.png [new file with mode: 0644]
Open-ILS/web/opac/images/still images.jpg [new file with mode: 0644]
Open-ILS/web/opac/images/subject-icon-u.gif [new file with mode: 0644]
Open-ILS/web/opac/images/subject-icon-u.png [new file with mode: 0644]
Open-ILS/web/opac/images/text.jpg [new file with mode: 0644]
Open-ILS/web/opac/images/three dimensional object.jpg [new file with mode: 0644]
Open-ILS/web/opac/images/threed-icon.png [new file with mode: 0644]
Open-ILS/web/opac/images/title-icon-u.gif [new file with mode: 0644]
Open-ILS/web/opac/images/title-icon-u.png [new file with mode: 0644]
Open-ILS/web/opac/images/title-icon.gif [new file with mode: 0644]
Open-ILS/web/opac/images/title-icon.png [new file with mode: 0644]
Open-ILS/web/opac/images/titledetails-icon-u.gif [new file with mode: 0644]
Open-ILS/web/opac/images/titledetails-icon-u.png [new file with mode: 0644]
Open-ILS/web/opac/images/titledetails-icon.gif [new file with mode: 0644]
Open-ILS/web/opac/images/titledetails-icon.png [new file with mode: 0644]
Open-ILS/web/opac/images/tor/book-icon.gif [new file with mode: 0644]
Open-ILS/web/opac/images/tor/book-icon.png [new file with mode: 0644]
Open-ILS/web/opac/images/tor/cartographic.jpg
Open-ILS/web/opac/images/tor/earth-icon.gif [new file with mode: 0644]
Open-ILS/web/opac/images/tor/earth-icon.png [new file with mode: 0644]
Open-ILS/web/opac/images/tor/mix-icon.gif [new file with mode: 0644]
Open-ILS/web/opac/images/tor/mix-icon.png [new file with mode: 0644]
Open-ILS/web/opac/images/tor/mixed material.jpg
Open-ILS/web/opac/images/tor/mov-icon.gif [new file with mode: 0644]
Open-ILS/web/opac/images/tor/mov-icon.png [new file with mode: 0644]
Open-ILS/web/opac/images/tor/moving image.jpg
Open-ILS/web/opac/images/tor/mussymbol-icon.gif [new file with mode: 0644]
Open-ILS/web/opac/images/tor/mussymbol-icon.png [new file with mode: 0644]
Open-ILS/web/opac/images/tor/nonmusic-icon.gif [new file with mode: 0644]
Open-ILS/web/opac/images/tor/nonmusic-icon.png [new file with mode: 0644]
Open-ILS/web/opac/images/tor/notated music.jpg
Open-ILS/web/opac/images/tor/pic-icon.gif [new file with mode: 0644]
Open-ILS/web/opac/images/tor/pic-icon.png [new file with mode: 0644]
Open-ILS/web/opac/images/tor/placeholder-icon.gif [new file with mode: 0644]
Open-ILS/web/opac/images/tor/placeholder-icon.png [new file with mode: 0644]
Open-ILS/web/opac/images/tor/recsound-icon.gif [new file with mode: 0644]
Open-ILS/web/opac/images/tor/recsound-icon.png [new file with mode: 0644]
Open-ILS/web/opac/images/tor/software, multimedia.jpg
Open-ILS/web/opac/images/tor/software-icon.gif [new file with mode: 0644]
Open-ILS/web/opac/images/tor/software-icon.png [new file with mode: 0644]
Open-ILS/web/opac/images/tor/sound recording-musical.jpg
Open-ILS/web/opac/images/tor/sound recording-nonmusical.jpg
Open-ILS/web/opac/images/tor/sound recording.jpg
Open-ILS/web/opac/images/tor/sound-icon.gif [new file with mode: 0644]
Open-ILS/web/opac/images/tor/sound-icon.png [new file with mode: 0644]
Open-ILS/web/opac/images/tor/still images.jpg
Open-ILS/web/opac/images/tor/text.jpg
Open-ILS/web/opac/images/tor/three dimensional object.jpg
Open-ILS/web/opac/images/tor/threed-icon.gif [new file with mode: 0644]
Open-ILS/web/opac/images/tor/threed-icon.png [new file with mode: 0644]
Open-ILS/web/opac/skin/craftsman/css/default.css [new file with mode: 0644]
Open-ILS/web/opac/skin/craftsman/css/layout.css [new file with mode: 0644]
Open-ILS/web/opac/skin/craftsman/xml/advanced/adv_global_row.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/craftsman/xml/advanced/advanced_global.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/craftsman/xml/body.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/craftsman/xml/common/altcanvas.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/craftsman/xml/common/cn_browse.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/craftsman/xml/common/css_common.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/craftsman/xml/common/fonts.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/craftsman/xml/common/holds.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/craftsman/xml/common/libselect.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/craftsman/xml/common/login.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/craftsman/xml/common/logo.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/craftsman/xml/common/orgtree.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/craftsman/xml/common/searchbar.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/craftsman/xml/common/sidebar.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/craftsman/xml/common/statusbar.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/craftsman/xml/common/tips.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/craftsman/xml/footer.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/craftsman/xml/home/homesearch.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/craftsman/xml/home/index_body.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/craftsman/xml/page_cnbrowse.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/craftsman/xml/page_myopac.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/craftsman/xml/page_rdetail.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/craftsman/xml/rdetail/rdetail_cn_details.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/craftsman/xml/rdetail/rdetail_copyinfo.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/craftsman/xml/rdetail/rdetail_extras.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/craftsman/xml/rdetail/rdetail_summary.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/craftsman/xml/result/filtersort.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/craftsman/xml/result/result_info.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/craftsman/xml/result/result_lowhits.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/craftsman/xml/result/result_table.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/default/js/holds.js
Open-ILS/web/opac/skin/default/js/myopac.js
Open-ILS/web/opac/skin/default/xml/common/js_common.xml
Open-ILS/web/opac/theme/craftsman/css/colors.css [new file with mode: 0644]
Open-ILS/web/templates/base.tt2
Open-ILS/web/templates/default/acq/financial/list_currency_types.tt2 [deleted file]
Open-ILS/web/templates/default/actor/user/register.tt2 [new file with mode: 0644]
Open-ILS/web/templates/default/conify/global/acq/currency_type.tt2 [new file with mode: 0644]
Open-ILS/web/templates/default/conify/global/acq/exchange_rate.tt2 [new file with mode: 0644]
Open-ILS/web/templates/default/conify/global/acq/provider.tt2 [new file with mode: 0644]
Open-ILS/web/templates/default/conify/global/action_trigger/event_definition.tt2 [new file with mode: 0644]
Open-ILS/web/templates/default/conify/global/config/idl_field_doc.tt2 [new file with mode: 0644]
Open-ILS/web/templates/default/menu.tt2
Open-ILS/xul/staff_client/chrome/content/main/about.html
Open-ILS/xul/staff_client/server/cat/marcedit.js
Open-ILS/xul/staff_client/server/patron/ue_config.js

index e90a6c1..37285eb 100644 (file)
@@ -580,7 +580,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
         </links>
     </class>
 
-       <class id="ath" controller="open-ils.cstore" oils_obj:fieldmapper="action_trigger::hook" oils_persist:tablename="action_trigger.hook" reporter:label="Trigger hook point">
+       <class id="ath" controller="open-ils.cstore open-ils.pcrud" oils_obj:fieldmapper="action_trigger::hook" oils_persist:tablename="action_trigger.hook" reporter:label="Trigger hook point">
                <fields oils_persist:primary="key">
                        <field name="isnew" oils_obj:array_position="0" oils_persist:virtual="true" />
                        <field name="ischanged" oils_obj:array_position="1" oils_persist:virtual="true" />
@@ -591,6 +591,14 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
                        <field reporter:label="Passive" name="passive" oils_obj:array_position="6" oils_persist:virtual="false"  reporter:datatype="bool"/>
                </fields>
                <links/>
+               <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+                       <actions>
+                               <create permission="ADMIN_TRIGGER_HOOK" global_required="true"/>
+                               <retrieve/>
+                               <update permission="ADMIN_TRIGGER_HOOK" global_required="true"/>
+                               <delete permission="ADMIN_TRIGGER_HOOK" global_required="true"/>
+                       </actions>
+               </permacrud>
        </class>
 
        <class id="atcol" controller="open-ils.cstore" oils_obj:fieldmapper="action_trigger::collector" oils_persist:tablename="action_trigger.collector" reporter:label="Trigger Evironment Collector">
@@ -604,7 +612,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
                <links/>
        </class>
 
-       <class id="atval" controller="open-ils.cstore" oils_obj:fieldmapper="action_trigger::validator" oils_persist:tablename="action_trigger.validator" reporter:label="Trigger Condition Validator">
+       <class id="atval" controller="open-ils.cstore open-ils.pcrud" oils_obj:fieldmapper="action_trigger::validator" oils_persist:tablename="action_trigger.validator" reporter:label="Trigger Condition Validator">
                <fields oils_persist:primary="module">
                        <field name="isnew" oils_obj:array_position="0" oils_persist:virtual="true" />
                        <field name="ischanged" oils_obj:array_position="1" oils_persist:virtual="true" />
@@ -613,9 +621,17 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
                        <field reporter:label="Description" name="description" oils_obj:array_position="4" oils_persist:virtual="false" reporter:datatype="text" oils_persist:i18n="true"/>
                </fields>
                <links/>
+               <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+                       <actions>
+                               <create permission="ADMIN_TRIGGER_VALIDATOR" global_required="true"/>
+                               <retrieve/>
+                               <update permission="ADMIN_TRIGGER_VALIDATOR" global_required="true"/>
+                               <delete permission="ADMIN_TRIGGER_VALIDATOR" global_required="true"/>
+                       </actions>
+               </permacrud>
        </class>
 
-       <class id="atreact" controller="open-ils.cstore" oils_obj:fieldmapper="action_trigger::reactor" oils_persist:tablename="action_trigger.reactor" reporter:label="Trigger Event Reactor">
+       <class id="atreact" controller="open-ils.cstore open-ils.pcrud" oils_obj:fieldmapper="action_trigger::reactor" oils_persist:tablename="action_trigger.reactor" reporter:label="Trigger Event Reactor">
                <fields oils_persist:primary="module">
                        <field name="isnew" oils_obj:array_position="0" oils_persist:virtual="true" />
                        <field name="ischanged" oils_obj:array_position="1" oils_persist:virtual="true" />
@@ -624,9 +640,17 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
                        <field reporter:label="Description" name="description" oils_obj:array_position="4" oils_persist:virtual="false" reporter:datatype="text" oils_persist:i18n="true"/>
                </fields>
                <links/>
+               <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+                       <actions>
+                               <create permission="ADMIN_TRIGGER_REACTOR" global_required="true"/>
+                               <retrieve/>
+                               <update permission="ADMIN_TRIGGER_REACTOR" global_required="true"/>
+                               <delete permission="ADMIN_TRIGGER_REACTOR" global_required="true"/>
+                       </actions>
+               </permacrud>
        </class>
 
-       <class id="atclean" controller="open-ils.cstore" oils_obj:fieldmapper="action_trigger::cleanup" oils_persist:tablename="action_trigger.cleanup" reporter:label="Trigger Event Cleanup">
+       <class id="atclean" controller="open-ils.cstore open-ils.pcrud" oils_obj:fieldmapper="action_trigger::cleanup" oils_persist:tablename="action_trigger.cleanup" reporter:label="Trigger Event Cleanup">
                <fields oils_persist:primary="module">
                        <field name="isnew" oils_obj:array_position="0" oils_persist:virtual="true" />
                        <field name="ischanged" oils_obj:array_position="1" oils_persist:virtual="true" />
@@ -635,6 +659,14 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
                        <field reporter:label="Description" name="description" oils_obj:array_position="4" oils_persist:virtual="false" reporter:datatype="text" oils_persist:i18n="true"/>
                </fields>
                <links/>
+               <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+                       <actions>
+                               <create permission="ADMIN_TRIGGER_CLEANUP" global_required="true"/>
+                               <retrieve/>
+                               <update permission="ADMIN_TRIGGER_CLEANUP" global_required="true"/>
+                               <delete permission="ADMIN_TRIGGER_CLEANUP" global_required="true"/>
+                       </actions>
+               </permacrud>
        </class>
 
        <class id="atenv" controller="open-ils.cstore" oils_obj:fieldmapper="action_trigger::environment" oils_persist:tablename="action_trigger.environment" reporter:label="Trigger Event Environment Entry">
@@ -654,7 +686,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
                </links>
        </class>
 
-       <class id="atevdef" controller="open-ils.cstore" oils_obj:fieldmapper="action_trigger::event_definition" oils_persist:tablename="action_trigger.event_definition" reporter:label="Trigger Event Definition">
+       <class id="atevdef" controller="open-ils.cstore open-ils.pcrud" oils_obj:fieldmapper="action_trigger::event_definition" oils_persist:tablename="action_trigger.event_definition" reporter:label="Trigger Event Definition">
                <fields oils_persist:primary="id" oils_persist:sequence="action_trigger.event_definition_id_seq">
                        <field name="isnew" oils_obj:array_position="0" oils_persist:virtual="true" />
                        <field name="ischanged" oils_obj:array_position="1" oils_persist:virtual="true" />
@@ -676,14 +708,22 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
                </fields>
                <links>
                        <link field="owner" reltype="has_a" key="id" map="" class="aou"/>
-                       <link field="hook" reltype="has_a" key="id" map="" class="ath"/>
-                       <link field="validator" reltype="has_a" key="id" map="" class="atval"/>
-                       <link field="reactor" reltype="has_a" key="id" map="" class="atreact"/>
-                       <link field="cleanup_success" reltype="has_a" key="id" map="" class="atclean"/>
-                       <link field="cleanup_failure" reltype="has_a" key="id" map="" class="atclean"/>
+                       <link field="hook" reltype="has_a" key="key" map="" class="ath"/>
+                       <link field="validator" reltype="has_a" key="module" map="" class="atval"/>
+                       <link field="reactor" reltype="has_a" key="module" map="" class="atreact"/>
+                       <link field="cleanup_success" reltype="has_a" key="module" map="" class="atclean"/>
+                       <link field="cleanup_failure" reltype="has_a" key="module" map="" class="atclean"/>
                        <link field="env" reltype="has_many" key="id" map="" class="atenv"/>
                        <link field="params" reltype="has_many" key="id" map="" class="atevparam"/>
                </links>
+               <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+                       <actions>
+                               <create permission="ADMIN_TRIGGER_EVENT_DEF" context_field="owner"/>
+                               <retrieve permission="ADMIN_TRIGGER_EVENT_DEF" context_field="owner"/>
+                               <update permission="ADMIN_TRIGGER_EVENT_DEF" context_field="owner"/>
+                               <delete permission="ADMIN_TRIGGER_EVENT_DEF" context_field="owner"/>
+                       </actions>
+               </permacrud>
        </class>
 
        <class id="atev" controller="open-ils.cstore" oils_obj:fieldmapper="action_trigger::event" oils_persist:tablename="action_trigger.event" reporter:label="Trigger Event Entry">
@@ -956,7 +996,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
                </links>
        </class>
 
-       <class id="cit" controller="open-ils.cstore" oils_obj:fieldmapper="config::identification_type" oils_persist:tablename="config.identification_type" reporter:label="Identification Type">
+       <class id="cit" controller="open-ils.cstore open-ils.pcrud" oils_obj:fieldmapper="config::identification_type" oils_persist:tablename="config.identification_type" reporter:label="Identification Type">
                <fields oils_persist:primary="id" oils_persist:sequence="config.identification_type_id_seq">
                        <field name="isnew" oils_obj:array_position="0" oils_persist:virtual="true" />
                        <field name="ischanged" oils_obj:array_position="1" oils_persist:virtual="true" />
@@ -965,6 +1005,14 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
                        <field reporter:label="Identification Name" name="name" oils_obj:array_position="4" oils_persist:virtual="false" reporter:datatype="text" oils_persist:i18n="true"/>
                </fields>
                <links/>
+        <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+            <actions>
+                <create permission="ADMIN_IDENT_TYPE" global_required="true"/>
+                <retrieve/>
+                <update permission="ADMIN_IDENT_TYPE" global_required="true"/>
+                <delete permission="ADMIN_IDENT_TYPE" global_required="true"/>
+            </actions>
+        </permacrud>
        </class>
 
        <class id="asvq" controller="open-ils.cstore open-ils.pcrud" oils_obj:fieldmapper="action::survey_question" oils_persist:tablename="action.survey_question" reporter:label="User Survey Question">
@@ -998,7 +1046,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
             </actions>
         </permacrud>
        </class>
-       <class id="mbts" controller="open-ils.cstore" oils_obj:fieldmapper="money::billable_transaction_summary" oils_persist:tablename="money.billable_xact_summary" reporter:label="Billable Transaction Summary">
+       <class id="mbts" controller="open-ils.cstore" oils_obj:fieldmapper="money::billable_transaction_summary" oils_persist:tablename="money.materialized_billable_xact_summary" reporter:label="Billable Transaction Summary" oils_persist:readonly="true">
                <fields oils_persist:primary="id" oils_persist:sequence="">
                        <field name="isnew" oils_obj:array_position="0" oils_persist:virtual="true" />
                        <field name="ischanged" oils_obj:array_position="1" oils_persist:virtual="true" />
@@ -1181,10 +1229,26 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
                        <field name="id" oils_obj:array_position="4" oils_persist:virtual="false" reporter:datatype="id" />
                        <field name="target_copy" oils_obj:array_position="5" oils_persist:virtual="false" reporter:datatype="link"/>
                        <field name="create_time" oils_obj:array_position="6" oils_persist:virtual="false" reporter:datatype="timestamp" />
+                       <field name="pos" oils_obj:array_position="7" oils_persist:virtual="false" reporter:datatype="int" />
+                       <field name="notes" oils_obj:array_position="8" oils_persist:virtual="true" reporter:datatype="link" />
                </fields>
                <links>
                        <link field="target_copy" reltype="has_a" key="id" map="" class="acp"/>
                        <link field="bucket" reltype="has_a" key="id" map="" class="ccb"/>
+            <link field="notes" reltype="has_many" map="" key="item" class="ccbin"/>
+               </links>
+       </class>
+       <class id="ccbin" controller="open-ils.cstore" oils_obj:fieldmapper="container::copy_bucket_item_note" oils_persist:tablename="container.copy_bucket_item_note">
+               <fields oils_persist:primary="id" oils_persist:sequence="container.copy_bucket_item_note_id_seq">
+                       <field name="isnew" oils_obj:array_position="0" oils_persist:virtual="true" />
+                       <field name="ischanged" oils_obj:array_position="1" oils_persist:virtual="true" />
+                       <field name="isdeleted" oils_obj:array_position="2" oils_persist:virtual="true" />
+                       <field name="id" oils_obj:array_position="3" oils_persist:virtual="false" reporter:datatype="id" />
+                       <field name="item" oils_obj:array_position="4" oils_persist:virtual="false" reporter:datatype="link"/>
+                       <field name="note" oils_obj:array_position="5" oils_persist:virtual="false" reporter:datatype="text" />
+               </fields>
+               <links>
+                       <link field="item" reltype="has_a" key="id" map="" class="ccbi"/>
                </links>
        </class>
        <class id="are" controller="open-ils.cstore" oils_obj:fieldmapper="authority::record_entry" oils_persist:tablename="authority.record_entry">
@@ -1964,7 +2028,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
             </actions>
         </permacrud>
        </class>
-       <class id="ccs" controller="open-ils.cstore open-ils.pcrud" oils_obj:fieldmapper="config::copy_status" oils_persist:tablename="config.copy_status">
+       <class id="ccs" controller="open-ils.cstore open-ils.pcrud" oils_obj:fieldmapper="config::copy_status" oils_persist:tablename="config.copy_status" oils_persist:restrict_primary="100">
                <fields oils_persist:primary="id" oils_persist:sequence="config.copy_status_id_seq">
                        <field name="isnew" oils_obj:array_position="0" oils_persist:virtual="true" />
                        <field name="ischanged" oils_obj:array_position="1" oils_persist:virtual="true" />
@@ -1984,7 +2048,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
             </actions>
         </permacrud>
        </class>
-       <class id="ausp" controller="open-ils.cstore open-ils.pcrud" oils_obj:fieldmapper="actor::user_standing_penalty" oils_persist:tablename="actor.usr_standing_penalty">
+       <class id="ausp" controller="open-ils.cstore open-ils.pcrud" oils_obj:fieldmapper="actor::user_standing_penalty" oils_persist:tablename="actor.usr_standing_penalty" oils_persist:restrict_primary="100">
                <fields oils_persist:primary="id" oils_persist:sequence="actor.usr_standing_penalty_id_seq">
                        <field name="isnew" oils_obj:array_position="0" oils_persist:virtual="true" />
                        <field name="ischanged" oils_obj:array_position="1" oils_persist:virtual="true" />
@@ -2030,6 +2094,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
                        <field reporter:label="Valid Address?" name="valid" oils_obj:array_position="13" oils_persist:virtual="false" reporter:datatype="bool"/>
                        <field reporter:label="Within City Limits?" name="within_city_limits" oils_obj:array_position="14" oils_persist:virtual="false" reporter:datatype="bool"/>
                        <field reporter:label="Replaces" name="replaces" oils_obj:array_position="15" oils_persist:virtual="false" reporter:datatype="link"/>
+                       <field reporter:label="Pending" name="pending" oils_obj:array_position="16" oils_persist:virtual="false" reporter:datatype="bool"/>
                </fields>
                <links>
                        <link field="usr" reltype="has_a" key="id" map="" class="au"/>
@@ -2292,10 +2357,26 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
                        <field name="id" oils_obj:array_position="4" oils_persist:virtual="false" reporter:datatype="id" />
                        <field name="target_call_number" oils_obj:array_position="5" oils_persist:virtual="false" reporter:datatype="link" />
                        <field name="create_time" oils_obj:array_position="6" oils_persist:virtual="false" reporter:datatype="timestamp" />
+                       <field name="pos" oils_obj:array_position="7" oils_persist:virtual="false" reporter:datatype="int" />
+                       <field name="notes" oils_obj:array_position="8" oils_persist:virtual="true" reporter:datatype="link" />
                </fields>
                <links>
                        <link field="target_call_number" reltype="has_a" key="id" map="" class="acn"/>
                        <link field="bucket" reltype="has_a" key="id" map="" class="ccnb"/>
+            <link field="notes" reltype="has_many" map="" key="item" class="ccnbin"/>
+               </links>
+       </class>
+       <class id="ccnbin" controller="open-ils.cstore" oils_obj:fieldmapper="container::call_number_bucket_item_note" oils_persist:tablename="container.call_number_bucket_item_note">
+               <fields oils_persist:primary="id" oils_persist:sequence="container.call_number_bucket_item_note_id_seq">
+                       <field name="isnew" oils_obj:array_position="0" oils_persist:virtual="true" />
+                       <field name="ischanged" oils_obj:array_position="1" oils_persist:virtual="true" />
+                       <field name="isdeleted" oils_obj:array_position="2" oils_persist:virtual="true" />
+                       <field name="id" oils_obj:array_position="3" oils_persist:virtual="false" reporter:datatype="id" />
+                       <field name="item" oils_obj:array_position="4" oils_persist:virtual="false" reporter:datatype="link"/>
+                       <field name="note" oils_obj:array_position="5" oils_persist:virtual="false" reporter:datatype="text" />
+               </fields>
+               <links>
+                       <link field="item" reltype="has_a" key="id" map="" class="ccnbi"/>
                </links>
        </class>
        <class id="cbreb" controller="open-ils.cstore" oils_obj:fieldmapper="container::biblio_record_entry_bucket" oils_persist:tablename="container.biblio_record_entry_bucket">
@@ -2316,6 +2397,19 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
                        <link field="items" reltype="has_many" key="bucket" map="" class="cbrebi"/>
                </links>
        </class>
+       <class id="cbrebn" controller="open-ils.cstore" oils_obj:fieldmapper="container::biblio_record_entry_bucket_note" oils_persist:tablename="container.biblio_record_entry_bucket_note">
+               <fields oils_persist:primary="id" oils_persist:sequence="container.biblio_record_entry_bucket_note_id_seq">
+                       <field name="isnew" oils_obj:array_position="0" oils_persist:virtual="true" />
+                       <field name="ischanged" oils_obj:array_position="1" oils_persist:virtual="true" />
+                       <field name="isdeleted" oils_obj:array_position="2" oils_persist:virtual="true" />
+                       <field name="id" oils_obj:array_position="3" oils_persist:virtual="false" reporter:datatype="id" />
+                       <field name="bucket" oils_obj:array_position="4" oils_persist:virtual="false" reporter:datatype="link"/>
+                       <field name="note" oils_obj:array_position="5" oils_persist:virtual="false" reporter:datatype="text" />
+               </fields>
+               <links>
+                       <link field="bucket" reltype="has_a" key="id" map="" class="cbreb"/>
+               </links>
+       </class>
        <class id="ahcm" controller="open-ils.cstore" oils_obj:fieldmapper="action::hold_copy_map" oils_persist:tablename="action.hold_copy_map">
                <fields oils_persist:primary="id" oils_persist:sequence="action.hold_copy_map_id_seq">
                        <field name="isnew" oils_obj:array_position="0" oils_persist:virtual="true" />
@@ -2537,7 +2631,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
                        <field reporter:label="Display in User Summary" name="usr_summary" oils_obj:array_position="14" oils_persist:virtual="false" reporter:datatype="bool"/>
                </fields>
                <links>
-                       <link field="owner" reltype="has_a" key="survey" map="" class="aou"/>
+                       <link field="owner" reltype="has_a" key="id" map="" class="aou"/>
                        <link field="responses" reltype="has_many" key="survey" map="" class="asvr"/>
                        <link field="questions" reltype="has_many" key="survey" map="" class="asvq"/>
                </links>
@@ -2614,6 +2708,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
                        <field reporter:label="Eligible Copies" name="eligible_copies" oils_obj:array_position="30" oils_persist:virtual="true" reporter:datatype="link"/>
                        <field reporter:label="Currently Frozen" name="frozen" oils_obj:array_position="31" oils_persist:virtual="false" reporter:datatype="bool"/>
                        <field reporter:label="Thaw Date (if frozen)" name="thaw_date" oils_obj:array_position="32" oils_persist:virtual="false" reporter:datatype="timestamp"/>
+                       <field reporter:label="Cancelation cause" name="cancel_cause" oils_obj:array_position="33" oils_persist:virtual="false" reporter:datatype="link" />
+                       <field reporter:label="Cancelation note" name="cancel_note" oils_obj:array_position="34" oils_persist:virtual="false" reporter:datatype="text" />
                </fields>
                <links>
                        <link field="fulfillment_lib" reltype="has_a" key="id" map="" class="aou"/>
@@ -2628,6 +2724,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
                        <link field="notifications" reltype="has_many" key="hold" map="" class="ahn"/>
                        <link field="eligible_copies" reltype="has_many" key="hold" map="target_copy" class="ahcm"/>
                        <link field="bib_rec" reltype="might_have" key="id" map="" class="rhrr"/>
+                       <link field="cancel_cause" reltype="might_have" key="id" map="" class="ahrcc"/>
                </links>
        </class>
        <class id="aou" controller="open-ils.cstore open-ils.pcrud" oils_obj:fieldmapper="actor::org_unit" oils_persist:tablename="actor.org_unit" reporter:label="Organizational Unit" oils_persist:field_safe="true">
@@ -2702,6 +2799,19 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
                        <link field="items" reltype="has_many" key="bucket" map="" class="ccnbi"/>
                </links>
        </class>
+       <class id="ccnbn" controller="open-ils.cstore" oils_obj:fieldmapper="container::call_number_bucket_note" oils_persist:tablename="container.call_number_bucket_note">
+               <fields oils_persist:primary="id" oils_persist:sequence="container.call_number_bucket_note_id_seq">
+                       <field name="isnew" oils_obj:array_position="0" oils_persist:virtual="true" />
+                       <field name="ischanged" oils_obj:array_position="1" oils_persist:virtual="true" />
+                       <field name="isdeleted" oils_obj:array_position="2" oils_persist:virtual="true" />
+                       <field name="id" oils_obj:array_position="3" oils_persist:virtual="false" reporter:datatype="id" />
+                       <field name="bucket" oils_obj:array_position="4" oils_persist:virtual="false" reporter:datatype="link"/>
+                       <field name="note" oils_obj:array_position="5" oils_persist:virtual="false" reporter:datatype="text" />
+               </fields>
+               <links>
+                       <link field="bucket" reltype="has_a" key="id" map="" class="ccnb"/>
+               </links>
+       </class>
        <class id="asc" controller="open-ils.cstore" oils_obj:fieldmapper="asset::stat_cat" oils_persist:tablename="asset.stat_cat" reporter:label="Asset Statistical Category">
                <fields oils_persist:primary="id" oils_persist:sequence="asset.stat_cat_id_seq">
                        <field name="isnew" oils_obj:array_position="0" oils_persist:virtual="true" />
@@ -2781,6 +2891,19 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
                        <link field="items" reltype="has_many" key="bucket" map="" class="cubi"/>
                </links>
        </class>
+       <class id="cubn" controller="open-ils.cstore" oils_obj:fieldmapper="container::user_bucket_note" oils_persist:tablename="container.user_bucket_note">
+               <fields oils_persist:primary="id" oils_persist:sequence="container.user_bucket_note_id_seq">
+                       <field name="isnew" oils_obj:array_position="0" oils_persist:virtual="true" />
+                       <field name="ischanged" oils_obj:array_position="1" oils_persist:virtual="true" />
+                       <field name="isdeleted" oils_obj:array_position="2" oils_persist:virtual="true" />
+                       <field name="id" oils_obj:array_position="3" oils_persist:virtual="false" reporter:datatype="id" />
+                       <field name="bucket" oils_obj:array_position="4" oils_persist:virtual="false" reporter:datatype="link"/>
+                       <field name="note" oils_obj:array_position="5" oils_persist:virtual="false" reporter:datatype="text" />
+               </fields>
+               <links>
+                       <link field="bucket" reltype="has_a" key="id" map="" class="cub"/>
+               </links>
+       </class>
        <class id="mcrp" controller="open-ils.cstore" oils_obj:fieldmapper="money::credit_payment" oils_persist:tablename="money.credit_payment" reporter:label="House Credit Payment">
                <fields oils_persist:primary="id" oils_persist:sequence="money.payment_id_seq">
                        <field name="isnew" oils_obj:array_position="0" oils_persist:virtual="true" />
@@ -2995,10 +3118,26 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
                        <field name="id" oils_obj:array_position="4" oils_persist:virtual="false" reporter:datatype="id" />
                        <field name="target_user" oils_obj:array_position="5" oils_persist:virtual="false" reporter:datatype="link"/>
                        <field name="create_time" oils_obj:array_position="6" oils_persist:virtual="false" reporter:datatype="timestamp" />
+                       <field name="pos" oils_obj:array_position="7" oils_persist:virtual="false" reporter:datatype="int" />
+                       <field name="notes" oils_obj:array_position="8" oils_persist:virtual="true" reporter:datatype="link" />
                </fields>
                <links>
                        <link field="target_user" reltype="has_a" key="id" map="" class="au"/>
                        <link field="bucket" reltype="has_a" key="id" map="" class="cub"/>
+            <link field="notes" reltype="has_many" map="" key="item" class="cubin"/>
+               </links>
+       </class>
+       <class id="cubin" controller="open-ils.cstore" oils_obj:fieldmapper="container::user_bucket_item_note" oils_persist:tablename="container.user_bucket_item_note">
+               <fields oils_persist:primary="id" oils_persist:sequence="container.user_bucket_item_note_id_seq">
+                       <field name="isnew" oils_obj:array_position="0" oils_persist:virtual="true" />
+                       <field name="ischanged" oils_obj:array_position="1" oils_persist:virtual="true" />
+                       <field name="isdeleted" oils_obj:array_position="2" oils_persist:virtual="true" />
+                       <field name="id" oils_obj:array_position="3" oils_persist:virtual="false" reporter:datatype="id" />
+                       <field name="item" oils_obj:array_position="4" oils_persist:virtual="false" reporter:datatype="link"/>
+                       <field name="note" oils_obj:array_position="5" oils_persist:virtual="false" reporter:datatype="text" />
+               </fields>
+               <links>
+                       <link field="item" reltype="has_a" key="id" map="" class="cubi"/>
                </links>
        </class>
        <class id="mus" controller="open-ils.cstore" oils_obj:fieldmapper="money::user_summary" oils_persist:tablename="money.usr_summary">
@@ -3295,7 +3434,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
             </actions>
         </permacrud>
        </class>
-       <class id="asva" controller="open-ils.cstore" oils_obj:fieldmapper="action::survey_answer" oils_persist:tablename="action.survey_answer" reporter:label="Survey Answer">
+       <class id="asva" controller="open-ils.cstore open-ils.pcrud" oils_obj:fieldmapper="action::survey_answer" oils_persist:tablename="action.survey_answer" reporter:label="Survey Answer">
                <fields oils_persist:primary="id" oils_persist:sequence="action.survey_answer_id_seq">
                        <field name="isnew" oils_obj:array_position="0" oils_persist:virtual="true" />
                        <field name="ischanged" oils_obj:array_position="1" oils_persist:virtual="true" />
@@ -3446,6 +3585,19 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
                        <link field="items" reltype="has_many" key="bucket" map="" class="ccbi"/>
                </links>
        </class>
+       <class id="ccbn" controller="open-ils.cstore" oils_obj:fieldmapper="container::copy_bucket_note" oils_persist:tablename="container.copy_bucket_note">
+               <fields oils_persist:primary="id" oils_persist:sequence="container.copy_bucket_note_id_seq">
+                       <field name="isnew" oils_obj:array_position="0" oils_persist:virtual="true" />
+                       <field name="ischanged" oils_obj:array_position="1" oils_persist:virtual="true" />
+                       <field name="isdeleted" oils_obj:array_position="2" oils_persist:virtual="true" />
+                       <field name="id" oils_obj:array_position="3" oils_persist:virtual="false" reporter:datatype="id" />
+                       <field name="bucket" oils_obj:array_position="4" oils_persist:virtual="false" reporter:datatype="link"/>
+                       <field name="note" oils_obj:array_position="5" oils_persist:virtual="false" reporter:datatype="text" />
+               </fields>
+               <links>
+                       <link field="bucket" reltype="has_a" key="id" map="" class="ccb"/>
+               </links>
+       </class>
        <class id="puwoum" controller="open-ils.cstore" oils_obj:fieldmapper="permission::usr_work_ou_map" oils_persist:tablename="permission.usr_work_ou_map">
                <fields oils_persist:primary="id" oils_persist:sequence="permission.usr_work_ou_map_id_seq">
                        <field name="isnew" oils_obj:array_position="0" oils_persist:virtual="true" />
@@ -3616,10 +3768,26 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
                        <field name="id" oils_obj:array_position="4" oils_persist:virtual="false" reporter:datatype="id" />
                        <field name="target_biblio_record_entry" oils_obj:array_position="5" oils_persist:virtual="false" reporter:datatype="link"/>
                        <field name="create_time" oils_obj:array_position="6" oils_persist:virtual="false" reporter:datatype="timestamp" />
+                       <field name="pos" oils_obj:array_position="7" oils_persist:virtual="false" reporter:datatype="int" />
+                       <field name="notes" oils_obj:array_position="8" oils_persist:virtual="true" reporter:datatype="link" />
                </fields>
                <links>
                        <link field="target_biblio_record_entry" reltype="has_a" key="id" map="" class="bre"/>
                        <link field="bucket" reltype="has_a" key="id" map="" class="cbreb"/>
+            <link field="notes" reltype="has_many" map="" key="item" class="cbrebin"/>
+               </links>
+       </class>
+       <class id="cbrebin" controller="open-ils.cstore" oils_obj:fieldmapper="container::biblio_record_entry_bucket_item_note" oils_persist:tablename="container.biblio_record_entry_bucket_item_note">
+               <fields oils_persist:primary="id" oils_persist:sequence="container.biblio_record_entry_bucket_item_note_id_seq">
+                       <field name="isnew" oils_obj:array_position="0" oils_persist:virtual="true" />
+                       <field name="ischanged" oils_obj:array_position="1" oils_persist:virtual="true" />
+                       <field name="isdeleted" oils_obj:array_position="2" oils_persist:virtual="true" />
+                       <field name="id" oils_obj:array_position="3" oils_persist:virtual="false" reporter:datatype="id" />
+                       <field name="item" oils_obj:array_position="4" oils_persist:virtual="false" reporter:datatype="link"/>
+                       <field name="note" oils_obj:array_position="5" oils_persist:virtual="false" reporter:datatype="text" />
+               </fields>
+               <links>
+                       <link field="item" reltype="has_a" key="id" map="" class="cbrebi"/>
                </links>
        </class>
        <class id="asce" controller="open-ils.cstore" oils_obj:fieldmapper="asset::stat_cat_entry" oils_persist:tablename="asset.stat_cat_entry" reporter:label="Item Stat Cat Entry">
@@ -3637,6 +3805,27 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
                        <link field="owner" reltype="has_a" key="id" map="" class="aou"/>
                </links>
        </class>
+
+       <class id="ahrcc" controller="open-ils.cstore open-ils.reporter-store open-ils.pcrud" oils_obj:fieldmapper="action::hold_request_cancel_cause" oils_persist:tablename="action.hold_request_cancel_cause" oils_persist:restrict_primary="100">
+               <fields oils_persist:primary="id" oils_persist:sequence="action.hold_request_cancel_cause_id_seq">
+                       <field name="isnew" oils_obj:array_position="0" oils_persist:virtual="true" />
+                       <field name="ischanged" oils_obj:array_position="1" oils_persist:virtual="true" />
+                       <field name="isdeleted" oils_obj:array_position="2" oils_persist:virtual="true" />
+                       <field reporter:label="Cause ID" name="id" oils_obj:array_position="3" oils_persist:virtual="false" reporter:datatype="id" />
+                       <field reporter:label="Cause Label" name="label" oils_obj:array_position="4" oils_persist:virtual="false" reporter:datatype="text" oils_persist:i18n="true" />
+               </fields>
+               <links/>
+        <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+            <actions>
+                <create permission="ADMIN_HOLD_CANCEL_CAUSE" global_required="true"/>
+                <retrieve/>
+                <update permission="ADMIN_HOLD_CANCEL_CAUSE" global_required="true"/>
+                <delete permission="ADMIN_HOLD_CANCEL_CAUSE" global_required="true"/>
+            </actions>
+        </permacrud>
+       </class>
+
+
        <class id="ahtc" controller="open-ils.cstore open-ils.pcrud" oils_obj:fieldmapper="action::hold_transit_copy" oils_persist:tablename="action.hold_transit_copy" reporter:core="true" reporter:label="Hold Transit">
                <fields oils_persist:primary="id" oils_persist:sequence="action.transit_copy_id_seq">
                        <field name="isnew" oils_obj:array_position="0" oils_persist:virtual="true" />
@@ -3732,6 +3921,29 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
             </actions>
         </permacrud>
        </class>
+       <class id="fdoc" controller="open-ils.cstore open-ils.pcrud" oils_obj:fieldmapper="config::idl_field_doc" oils_persist:tablename="config.idl_field_doc" oils_persist:field_safe="true">
+               <fields oils_persist:primary="id" oils_persist:sequence="config.idl_field_doc_id_seq">
+                       <field name="isnew" oils_obj:array_position="0" oils_persist:virtual="true" />
+                       <field name="ischanged" oils_obj:array_position="1" oils_persist:virtual="true" />
+                       <field name="isdeleted" oils_obj:array_position="2" oils_persist:virtual="true" />
+                       <field name="id" oils_obj:array_position="3" oils_persist:virtual="false" reporter:datatype="id" />
+                       <field name="fm_class" oils_obj:array_position="4" oils_persist:virtual="false" reporter:datatype="text"/>
+                       <field name="field" oils_obj:array_position="5" oils_persist:virtual="false" reporter:datatype="text"/>
+                       <field name="owner" oils_obj:array_position="6" oils_persist:virtual="false" reporter:datatype="org_unit"/>
+                       <field name="string" oils_obj:array_position="7" oils_persist:virtual="false" reporter:datatype="text" oils_persist:i18n="true"/>
+               </fields>
+               <links>
+                       <link field="owner" reltype="has_a" key="id" map="" class="aou"/>
+               </links>
+        <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+            <actions>
+                <create   permission="ADMIN_FIELD_DOC" context_field="owner"/>
+                <retrieve/>
+                <update   permission="ADMIN_FIELD_DOC" context_field="owner"/>
+                <delete   permission="ADMIN_FIELD_DOC" context_field="owner"/>
+            </actions>
+        </permacrud>
+       </class>
        <class id="i18n_l" controller="open-ils.cstore open-ils.pcrud" oils_obj:fieldmapper="config::i18n_locale" oils_persist:tablename="config.i18n_locale" oils_persist:field_safe="true">
                <fields oils_persist:primary="code">
                        <field name="isnew" oils_obj:array_position="0" oils_persist:virtual="true" />
@@ -3752,7 +3964,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
             </actions>
         </permacrud>
        </class>
-       <class id="cbt" controller="open-ils.cstore open-ils.pcrud" oils_obj:fieldmapper="config::billing_type" oils_persist:tablename="config.billing_type">
+       <class id="cbt" controller="open-ils.cstore open-ils.pcrud" oils_obj:fieldmapper="config::billing_type" oils_persist:tablename="config.billing_type" oils_persist:restrict_primary="100">
                <fields oils_persist:primary="id" oils_persist:sequence="config.billing_type_id_seq">
                        <field name="isnew" oils_obj:array_position="0" oils_persist:virtual="true" />
                        <field name="ischanged" oils_obj:array_position="1" oils_persist:virtual="true" />
@@ -3779,7 +3991,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
                        <field name="isnew" oils_obj:array_position="0" oils_persist:virtual="true" />
                        <field name="ischanged" oils_obj:array_position="1" oils_persist:virtual="true" />
                        <field name="isdeleted" oils_obj:array_position="2" oils_persist:virtual="true" />
-                       <field reporter:label="Currency Code" name="code" oils_obj:array_position="3" oils_persist:virtual="false" reporter:datatype="text" />
+                       <field reporter:label="Currency Code" name="code" oils_obj:array_position="3" oils_persist:virtual="false" reporter:datatype="text" reporter:selector='label'/>
                        <field reporter:label="Currency Label" name="label" oils_obj:array_position="4" oils_persist:virtual="false" reporter:datatype="text" oils_persist:i18n="true" />
                </fields>
                <links/>
@@ -3793,7 +4005,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
         </permacrud>
        </class>
 
-       <class id="acqexr" controller="open-ils.cstore open-ils.reporter-store" oils_obj:fieldmapper="acq::exchange_rate" oils_persist:tablename="acq.exchange_rate">
+       <class id="acqexr" controller="open-ils.cstore open-ils.pcrud open-ils.reporter-store" oils_obj:fieldmapper="acq::exchange_rate" oils_persist:tablename="acq.exchange_rate">
                <fields oils_persist:primary="id" oils_persist:sequence="acq.exchange_rate_id_seq">
                        <field name="isnew" oils_obj:array_position="0" oils_persist:virtual="true" />
                        <field name="ischanged" oils_obj:array_position="1" oils_persist:virtual="true" />
@@ -3807,9 +4019,17 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
                        <link field="from_currency" reltype="has_a" key="code" map="" class="acqct"/>
                        <link field="to_currency" reltype="has_a" key="code" map="" class="acqct"/>
                </links>
+               <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+                       <actions>
+                               <create permission="ADMIN_CURRENCY_TYPE" global_required="true"/>
+                               <retrieve/>
+                               <update permission="ADMIN_CURRENCY_TYPE" global_required="true"/>
+                               <delete permission="ADMIN_CURRENCY_TYPE" global_required="true"/>
+                       </actions>
+               </permacrud>
        </class>
 
-       <class id="acqpro" controller="open-ils.cstore open-ils.reporter-store" oils_obj:fieldmapper="acq::provider" oils_persist:tablename="acq.provider">
+       <class id="acqpro" controller="open-ils.cstore open-ils.pcrud" oils_obj:fieldmapper="acq::provider" oils_persist:tablename="acq.provider" reporter:label="Provider">
                <fields oils_persist:primary="id" oils_persist:sequence="acq.provider_id_seq">
                        <field name="isnew" oils_obj:array_position="0" oils_persist:virtual="true" />
                        <field name="ischanged" oils_obj:array_position="1" oils_persist:virtual="true" />
@@ -3824,6 +4044,122 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
                        <link field="currency_type" reltype="has_a" key="code" map="" class="acqct"/>
                        <link field="owner" reltype="has_a" key="id" map="" class="aou"/>
                </links>
+        <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+            <actions>
+                <create   permission="ADMIN_PROVIDER" context_field="owner"/>
+                <retrieve permission="ADMIN_PROVIDER" context_field="owner"/>
+                <update   permission="ADMIN_PROVIDER" context_field="owner"/>
+                <delete   permission="ADMIN_PROVIDER" context_field="owner"/>
+            </actions>
+        </permacrud>
+       </class>
+
+       <class id="acqpa" controller="open-ils.cstore open-ils.pcrud" oils_obj:fieldmapper="acq::provider_address" oils_persist:tablename="acq.provider_address" reporter:label="Provider Address">
+               <fields oils_persist:primary="id" oils_persist:sequence="acq.provider_address_id_seq">
+                       <field name="isnew" oils_obj:array_position="0" oils_persist:virtual="true" />
+                       <field name="ischanged" oils_obj:array_position="1" oils_persist:virtual="true" />
+                       <field name="isdeleted" oils_obj:array_position="2" oils_persist:virtual="true" />
+                       <field name="address_type" oils_obj:array_position="3" oils_persist:virtual="false"  reporter:datatype="text"/>
+                       <field name="city" oils_obj:array_position="4" oils_persist:virtual="false"  reporter:datatype="text"/>
+                       <field name="country" oils_obj:array_position="5" oils_persist:virtual="false"  reporter:datatype="text"/>
+                       <field name="county" oils_obj:array_position="6" oils_persist:virtual="false"  reporter:datatype="text"/>
+                       <field name="id" oils_obj:array_position="7" oils_persist:virtual="false" reporter:datatype="id"/>
+                       <field name="provider" oils_obj:array_position="8" oils_persist:virtual="false" reporter:datatype="link"/>
+                       <field name="post_code" oils_obj:array_position="9" oils_persist:virtual="false"  reporter:datatype="text"/>
+                       <field name="state" oils_obj:array_position="10" oils_persist:virtual="false"  reporter:datatype="text"/>
+                       <field name="street1" oils_obj:array_position="11" oils_persist:virtual="false"  reporter:datatype="text"/>
+                       <field name="street2" oils_obj:array_position="12" oils_persist:virtual="false"  reporter:datatype="text"/>
+                       <field name="valid" oils_obj:array_position="13" oils_persist:virtual="false" reporter:datatype="bool"/>
+               </fields>
+               <links>
+                       <link field="provider" reltype="has_a" key="id" map="" class="acqpro"/>
+               </links>
+        <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+            <actions>
+                <create permission="ADMIN_PROVIDER">
+                    <context link="provider" field="owner"/>
+                </create>
+                <retrieve permission="ADMIN_PROVIDER">
+                    <context link="provider" field="owner"/>
+                </retrieve>
+                <update permission="ADMIN_PROVIDER">
+                    <context link="provider" field="owner"/>
+                </update>
+                <delete permission="ADMIN_PROVIDER">
+                    <context link="provider" field="owner"/>
+                </delete>
+            </actions>
+        </permacrud>
+       </class>
+
+       <class id="acqpc" controller="open-ils.cstore open-ils.pcrud" oils_obj:fieldmapper="acq::provider_contact" oils_persist:tablename="acq.provider_contact" reporter:label="Provider Contact">
+               <fields oils_persist:primary="id" oils_persist:sequence="acq.provider_contact_id_seq">
+                       <field name="isnew" oils_obj:array_position="0" oils_persist:virtual="true" />
+                       <field name="ischanged" oils_obj:array_position="1" oils_persist:virtual="true" />
+                       <field name="isdeleted" oils_obj:array_position="2" oils_persist:virtual="true" />
+                       <field name="id" oils_obj:array_position="3" oils_persist:virtual="false" reporter:datatype="id"/>
+                       <field name="provider" oils_obj:array_position="8" oils_persist:virtual="false" reporter:datatype="link"/>
+                       <field name="name" oils_obj:array_position="3" oils_persist:virtual="false" reporter:datatype="text"/>
+                       <field name="role" oils_obj:array_position="3" oils_persist:virtual="false" reporter:datatype="text"/>
+                       <field name="email" oils_obj:array_position="3" oils_persist:virtual="false" reporter:datatype="text"/>
+                       <field name="phone" oils_obj:array_position="3" oils_persist:virtual="false" reporter:datatype="text"/>
+        </fields>
+               <links>
+                       <link field="provider" reltype="has_a" key="id" map="" class="acqpro"/>
+               </links>
+        <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+            <actions>
+                <create permission="ADMIN_PROVIDER">
+                    <context link="provider" field="owner"/>
+                </create>
+                <retrieve permission="ADMIN_PROVIDER">
+                    <context link="provider" field="owner"/>
+                </retrieve>
+                <update permission="ADMIN_PROVIDER">
+                    <context link="provider" field="owner"/>
+                </update>
+                <delete permission="ADMIN_PROVIDER">
+                    <context link="provider" field="owner"/>
+                </delete>
+            </actions>
+        </permacrud>
+    </class>
+       <class id="acqpca" controller="open-ils.cstore open-ils.pcrud" oils_obj:fieldmapper="acq::provider_contact_address" oils_persist:tablename="acq.provider_contact_address" reporter:label="Provider Contact Address">
+               <fields oils_persist:primary="id" oils_persist:sequence="acq.provider_contact_address_id_seq">
+                       <field name="isnew" oils_obj:array_position="0" oils_persist:virtual="true" />
+                       <field name="ischanged" oils_obj:array_position="1" oils_persist:virtual="true" />
+                       <field name="isdeleted" oils_obj:array_position="2" oils_persist:virtual="true" />
+                       <field reporter:label="Type" name="address_type" oils_obj:array_position="3" oils_persist:virtual="false"  reporter:datatype="text"/>
+                       <field reporter:label="City" name="city" oils_obj:array_position="4" oils_persist:virtual="false"  reporter:datatype="text"/>
+                       <field reporter:label="Country" name="country" oils_obj:array_position="5" oils_persist:virtual="false"  reporter:datatype="text"/>
+                       <field reporter:label="County" name="county" oils_obj:array_position="6" oils_persist:virtual="false"  reporter:datatype="text"/>
+                       <field reporter:label="Address ID" name="id" oils_obj:array_position="7" oils_persist:virtual="false" reporter:datatype="id" />
+                       <field reporter:label="Postal Code" name="post_code" oils_obj:array_position="8" oils_persist:virtual="false" reporter:datatype="text"/>
+                       <field reporter:label="State" name="state" oils_obj:array_position="9" oils_persist:virtual="false"  reporter:datatype="text"/>
+                       <field reporter:label="Street (1)" name="street1" oils_obj:array_position="10" oils_persist:virtual="false"  reporter:datatype="text"/>
+                       <field reporter:label="Street (2)" name="street2" oils_obj:array_position="11" oils_persist:virtual="false"  reporter:datatype="text"/>
+                       <field reporter:label="Contact" name="contact" oils_obj:array_position="12" oils_persist:virtual="false" reporter:datatype="link"/>
+                       <field reporter:label="Valid Address?" name="valid" oils_obj:array_position="13" oils_persist:virtual="false" reporter:datatype="bool"/>
+               </fields>
+               <links>
+                       <link field="contact" reltype="has_a" key="id" map="" class="acqpc"/>
+               </links>
+        <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+            <actions>
+                <create permission="ADMIN_PROVIDER">
+                    <context link="contact" jump='provider' field="owner"/>
+                </create>
+                <retrieve permission="ADMIN_PROVIDER">
+                    <context link="contact" jump='provider' field="owner"/>
+                </retrieve>
+                <update permission="ADMIN_PROVIDER">
+                    <context link="contact" jump='provider' field="owner"/>
+                </update>
+                <delete permission="ADMIN_PROVIDER">
+                    <context link="contact" jump='provider' field="owner"/>
+                </delete>
+            </actions>
+        </permacrud>
        </class>
 
        <class id="acqfs" controller="open-ils.cstore open-ils.reporter-store open-ils.pcrud" oils_obj:fieldmapper="acq::funding_source" oils_persist:tablename="acq.funding_source">
index 8600288..ea485d2 100644 (file)
@@ -252,6 +252,25 @@ vim:et:ts=4:sw=4:
         </cache>
 
         <apps>
+            <!-- Acquisitions server -->
+            <open-ils.acq>
+                <keepalive>5</keepalive>
+                <stateless>1</stateless>
+                <language>perl</language>
+                <implementation>OpenILS::Application::Acq</implementation>
+                <max_requests>100</max_requests>
+                <unix_config>
+                    <unix_sock>open-ils.acq_unix.sock</unix_sock>
+                    <unix_pid>open-ils.acq_unix.pid</unix_pid>
+                    <unix_log>open-ils.acq_unix.log</unix_log>
+                    <max_requests>100</max_requests>
+                    <min_children>1</min_children>
+                    <max_children>15</max_children>
+                    <min_spare_children>1</min_spare_children>
+                    <max_spare_children>5</max_spare_children>
+                </unix_config>
+            </open-ils.acq>
+
             <!-- Authentication server -->
             <open-ils.auth>
 
@@ -327,7 +346,7 @@ vim:et:ts=4:sw=4:
                 </unix_config>
                 <app_settings>
                     <marc_html_xsl>oilsMARC21slim2HTML.xsl</marc_html_xsl>
-                                       <marc_html_xsl_slim>oilsMARC21slim2HTMLslim.xsl</marc_html_xsl_slim>
+                    <marc_html_xsl_slim>oilsMARC21slim2HTMLslim.xsl</marc_html_xsl_slim>
 
                     <!-- Default to using staged search -->
                     <use_staged_search>true</use_staged_search>
@@ -832,7 +851,7 @@ vim:et:ts=4:sw=4:
                 <keepalive>5</keepalive>
                 <stateless>1</stateless>
                 <language>perl</language>
-                               <implementation>OpenILS::Application::Vandelay</implementation>
+                <implementation>OpenILS::Application::Vandelay</implementation>
                 <max_requests>100</max_requests>
                 <unix_config>
                     <unix_sock>vandelay_unix.sock</unix_sock>
@@ -875,6 +894,7 @@ vim:et:ts=4:sw=4:
                 <appname>opensrf.settings</appname> 
                 <appname>opensrf.math</appname> 
                 <appname>opensrf.dbmath</appname> 
+                <appname>open-ils.acq</appname> 
                 <appname>open-ils.cat</appname> 
                 <appname>open-ils.supercat</appname> 
                 <appname>open-ils.search</appname> 
index 889e525..bc7b929 100644 (file)
@@ -20,11 +20,13 @@ Example OpenSRF bootstrap configuration file for Evergreen
         <services>
           <service>opensrf.math</service>
           <service>open-ils.actor</service>
+          <service>open-ils.acq</service>
           <service>open-ils.auth</service>
           <service>open-ils.cat</service>
           <service>open-ils.circ</service>
           <service>open-ils.collections</service>
           <service>open-ils.fielder</service>
+          <service>open-ils.pcrud</service>
           <service>open-ils.permacrud</service>
           <service>open-ils.reporter</service>
           <service>open-ils.search</service>
index 556016a..4d53679 100644 (file)
@@ -243,12 +243,20 @@ webcore-install:
        cp -r @top_srcdir@/Open-ILS/web/. $(DESTDIR)$(WEBDIR)
        cp @top_srcdir@/Open-ILS/xsl/*.xsl $(opacextrasdir)
        cp @top_srcdir@/Open-ILS/xsl/*.xsl $(XSLDIR)
+       cp -r $(DESTDIR)$(WEBDIR)/opac/skin/default/* $(DESTDIR)$(WEBDIR)/opac/skin/craftsman/
+       cp -r @top_srcdir@/Open-ILS/web/opac/skin/craftsman/* $(DESTDIR)$(WEBDIR)/opac/skin/craftsman/
        ln -sf $(DESTDIR)$(WEBDIR)/opac/skin/default/xml/index.xml $(DESTDIR)$(WEBDIR)/opac/skin/default/xml/mresult.xml
        ln -sf $(DESTDIR)$(WEBDIR)/opac/skin/default/xml/index.xml $(DESTDIR)$(WEBDIR)/opac/skin/default/xml/rresult.xml
        ln -sf $(DESTDIR)$(WEBDIR)/opac/skin/default/xml/index.xml $(DESTDIR)$(WEBDIR)/opac/skin/default/xml/rdetail.xml
        ln -sf $(DESTDIR)$(WEBDIR)/opac/skin/default/xml/index.xml $(DESTDIR)$(WEBDIR)/opac/skin/default/xml/advanced.xml
        ln -sf $(DESTDIR)$(WEBDIR)/opac/skin/default/xml/index.xml $(DESTDIR)$(WEBDIR)/opac/skin/default/xml/myopac.xml
        ln -sf $(DESTDIR)$(WEBDIR)/opac/skin/default/xml/index.xml $(DESTDIR)$(WEBDIR)/opac/skin/default/xml/cnbrowse.xml
+       ln -sf $(DESTDIR)$(WEBDIR)/opac/skin/craftsman/xml/index.xml $(DESTDIR)$(WEBDIR)/opac/skin/craftsman/xml/mresult.xml
+       ln -sf $(DESTDIR)$(WEBDIR)/opac/skin/craftsman/xml/index.xml $(DESTDIR)$(WEBDIR)/opac/skin/craftsman/xml/rresult.xml
+       ln -sf $(DESTDIR)$(WEBDIR)/opac/skin/craftsman/xml/index.xml $(DESTDIR)$(WEBDIR)/opac/skin/craftsman/xml/rdetail.xml
+       ln -sf $(DESTDIR)$(WEBDIR)/opac/skin/craftsman/xml/index.xml $(DESTDIR)$(WEBDIR)/opac/skin/craftsman/xml/advanced.xml
+       ln -sf $(DESTDIR)$(WEBDIR)/opac/skin/craftsman/xml/index.xml $(DESTDIR)$(WEBDIR)/opac/skin/craftsman/xml/myopac.xml
+       ln -sf $(DESTDIR)$(WEBDIR)/opac/skin/craftsman/xml/index.xml $(DESTDIR)$(WEBDIR)/opac/skin/craftsman/xml/cnbrowse.xml
 
 
 offline-install:
index b8e6d1c..11f4197 100644 (file)
@@ -7,7 +7,7 @@
 AM_CFLAGS = $(DEF_CFLAGS) -DOSRF_LOG_PARAMS -I@top_srcdir@/include/
 AM_LDFLAGS = $(DEF_LDFLAGS) -L$(DBI_LIBS) -lopensrf 
 
-bin_PROGRAMS = oils_dataloader dump_idl
+bin_PROGRAMS = oils_dataloader dump_idl test_json_query
 oils_dataloader_SOURCES = oils_dataloader.c
 oils_dataloader_LDFLAGS = $(AM_LDFLAGS) -loils_idl
 oils_dataloader_DEPENDENCIES = liboils_idl.la liboils_utils.la
@@ -16,6 +16,11 @@ dump_idl_SOURCES = dump_idl.c
 dump_idl_LDFLAGS = $(AM_LDFLAGS) -loils_idl
 dump_idl_DEPENDENCIES = liboils_idl.la liboils_utils.la
 
+test_json_query_SOURCES = test_json_query.c
+test_json_query_LDFLAGS = $(AM_LDFLAGS) -loils_idl
+test_json_query_LDADD = oils_cstore.la
+test_json_query_DEPENDENCIES = liboils_idl.la liboils_utils.la
+
 lib_LTLIBRARIES = liboils_idl.la liboils_utils.la oils_cstore.la oils_rstore.la oils_pcrud.la oils_auth.la
 
 liboils_idl_la_SOURCES = oils_idl-core.c
index 3c8c360..efeee45 100644 (file)
@@ -141,6 +141,8 @@ static void dump_class( osrfHash* class_hash, const char* class_name )
                                printf( "%s%s: %s\n", indent, attr_name, (char*) class_attr );
                        else if( !strcmp( attr_name, "tablename" ) )
                                printf( "%s%s: %s\n", indent, attr_name, (char*) class_attr );
+                       else if( !strcmp( attr_name, "restrict_primary" ) )
+                               printf( "%s%s: %s\n", indent, attr_name, (char*) class_attr );
                        else if( !strcmp( attr_name, "virtual" ) )
                                printf( "%s%s: %s\n", indent, attr_name, (char*) class_attr );
                        else if( !strcmp( attr_name, "controller" ) )
index c93da14..59559fa 100644 (file)
@@ -61,17 +61,20 @@ static char* searchFunctionPredicate ( const char*, osrfHash*, const jsonObject*
 static char* searchFieldTransform ( const char*, osrfHash*, const jsonObject*);
 static char* searchFieldTransformPredicate ( const char*, osrfHash*, jsonObject*, const char* );
 static char* searchBETWEENPredicate ( const char*, osrfHash*, jsonObject* );
-static char* searchINPredicate ( const char*, osrfHash*, const jsonObject*, const char* );
-static char* searchPredicate ( const char*, osrfHash*, jsonObject* );
+static char* searchINPredicate ( const char*, osrfHash*,
+                                                                jsonObject*, const char*, osrfMethodContext* );
+static char* searchPredicate ( const char*, osrfHash*, jsonObject*, osrfMethodContext* );
 static char* searchJOIN ( const jsonObject*, osrfHash* );
 static char* searchWHERE ( const jsonObject*, osrfHash*, int, osrfMethodContext* );
 static char* buildSELECT ( jsonObject*, jsonObject*, osrfHash*, osrfMethodContext* );
 
-static char* SELECT ( osrfMethodContext*, jsonObject*, jsonObject*, jsonObject*, jsonObject*, jsonObject*, jsonObject*, jsonObject*, int );
+char* SELECT ( osrfMethodContext*, jsonObject*, jsonObject*, jsonObject*, jsonObject*, jsonObject*, jsonObject*, jsonObject*, int );
 
 void userDataFree( void* );
 static void sessionDataFree( char*, void* );
 static char* getSourceDefinition( osrfHash* );
+static int str_is_true( const char* str );
+static int obj_is_true( const jsonObject* obj );
 
 #ifdef PCRUD
 static jsonObject* verifyUserPCRUD( osrfMethodContext* );
@@ -186,11 +189,10 @@ int osrfAppInitialize() {
             continue;
         }
 
-        char* virt = osrfHashGet(idlClass, "virtual");
-        if (virt && !strcmp( virt, "true")) {
-            osrfLogDebug(OSRF_LOG_MARK, "Class %s is virtual, skipping", classname );
-            continue;
-        }
+               if ( str_is_true( osrfHashGet(idlClass, "virtual") ) ) {
+                       osrfLogDebug(OSRF_LOG_MARK, "Class %s is virtual, skipping", classname );
+                       continue;
+               }
 
         // Look up some other attributes of the current class
         const char* idlClass_fieldmapper = osrfHashGet(idlClass, "fieldmapper");
@@ -217,8 +219,7 @@ int osrfAppInitialize() {
             if (!osrfHashGet( idlClass_permacrud, tmp_method )) continue;
 #endif
 
-            if (    readonly &&
-                    !strncasecmp( "true", readonly, 4) &&
+            if (    str_is_true( readonly ) &&
                     ( *method_type == 'c' || *method_type == 'u' || *method_type == 'd')
                ) continue;
 
@@ -357,11 +358,10 @@ int osrfAppChildInit() {
         osrfHash* class = osrfHashGet( oilsIDL(), classname );
         osrfHash* fields = osrfHashGet( class, "fields" );
 
-        char* virt = osrfHashGet(class, "virtual");
-        if (virt && !strcmp( virt, "true")) {
-            osrfLogDebug(OSRF_LOG_MARK, "Class %s is virtual, skipping", classname );
-            continue;
-        }
+               if( str_is_true( osrfHashGet(class, "virtual") ) ) {
+                       osrfLogDebug(OSRF_LOG_MARK, "Class %s is virtual, skipping", classname );
+                       continue;
+               }
 
         char* tabledef = getSourceDefinition(class);
 
@@ -470,7 +470,10 @@ static void sessionDataFree( char* key, void* item ) {
 }
 
 int beginTransaction ( osrfMethodContext* ctx ) {
-    OSRF_METHOD_VERIFY_CONTEXT(ctx);
+       if(osrfMethodVerifyContext( ctx )) {
+               osrfLogError( OSRF_LOG_MARK,  "Invalid method context" );
+               return -1;
+       }
 
 #ifdef PCRUD
     jsonObject* user = verifyUserPCRUD( ctx );
@@ -501,7 +504,10 @@ int beginTransaction ( osrfMethodContext* ctx ) {
 }
 
 int setSavepoint ( osrfMethodContext* ctx ) {
-    OSRF_METHOD_VERIFY_CONTEXT(ctx);
+       if(osrfMethodVerifyContext( ctx )) {
+               osrfLogError( OSRF_LOG_MARK,  "Invalid method context" );
+               return -1;
+       }
 
     int spNamePos = 0;
 #ifdef PCRUD
@@ -546,9 +552,12 @@ int setSavepoint ( osrfMethodContext* ctx ) {
 }
 
 int releaseSavepoint ( osrfMethodContext* ctx ) {
-    OSRF_METHOD_VERIFY_CONTEXT(ctx);
+       if(osrfMethodVerifyContext( ctx )) {
+               osrfLogError( OSRF_LOG_MARK,  "Invalid method context" );
+               return -1;
+       }
 
-    int spNamePos = 0;
+       int spNamePos = 0;
 #ifdef PCRUD
     spNamePos = 1;
     jsonObject* user = verifyUserPCRUD( ctx );
@@ -591,9 +600,12 @@ int releaseSavepoint ( osrfMethodContext* ctx ) {
 }
 
 int rollbackSavepoint ( osrfMethodContext* ctx ) {
-    OSRF_METHOD_VERIFY_CONTEXT(ctx);
+       if(osrfMethodVerifyContext( ctx )) {
+               osrfLogError( OSRF_LOG_MARK,  "Invalid method context" );
+               return -1;
+       }
 
-    int spNamePos = 0;
+       int spNamePos = 0;
 #ifdef PCRUD
     spNamePos = 1;
     jsonObject* user = verifyUserPCRUD( ctx );
@@ -636,7 +648,10 @@ int rollbackSavepoint ( osrfMethodContext* ctx ) {
 }
 
 int commitTransaction ( osrfMethodContext* ctx ) {
-    OSRF_METHOD_VERIFY_CONTEXT(ctx);
+       if(osrfMethodVerifyContext( ctx )) {
+               osrfLogError( OSRF_LOG_MARK,  "Invalid method context" );
+               return -1;
+       }
 
 #ifdef PCRUD
     jsonObject* user = verifyUserPCRUD( ctx );
@@ -664,7 +679,10 @@ int commitTransaction ( osrfMethodContext* ctx ) {
 }
 
 int rollbackTransaction ( osrfMethodContext* ctx ) {
-    OSRF_METHOD_VERIFY_CONTEXT(ctx);
+       if(osrfMethodVerifyContext( ctx )) {
+               osrfLogError( OSRF_LOG_MARK,  "Invalid method context" );
+               return -1;
+       }
 
 #ifdef PCRUD
     jsonObject* user = verifyUserPCRUD( ctx );
@@ -692,9 +710,12 @@ int rollbackTransaction ( osrfMethodContext* ctx ) {
 }
 
 int dispatchCRUDMethod ( osrfMethodContext* ctx ) {
-    OSRF_METHOD_VERIFY_CONTEXT(ctx);
+       if(osrfMethodVerifyContext( ctx )) {
+               osrfLogError( OSRF_LOG_MARK,  "Invalid method context" );
+               return -1;
+       }
 
-    osrfHash* meta = (osrfHash*) ctx->method->userData;
+       osrfHash* meta = (osrfHash*) ctx->method->userData;
     osrfHash* class_obj = osrfHashGet( meta, "class" );
 
     int err = 0;
@@ -763,7 +784,7 @@ int dispatchCRUDMethod ( osrfMethodContext* ctx ) {
             jsonObjectSetIndex( _p, 1, jsonNewObjectType(JSON_HASH) );
         }
 
-        jsonObjectSetKey( jsonObjectGetIndex( _p, 1 ), "no_i18n", jsonParseString("true") );
+               jsonObjectSetKey( jsonObjectGetIndex( _p, 1 ), "no_i18n", jsonNewBoolObject( 1 ) );
 
         jsonObjectSetKey(
             jsonObjectGetIndex( _p, 1 ),
@@ -913,7 +934,6 @@ static int verifyObjectPCRUD (  osrfMethodContext* ctx, const jsonObject* obj )
     jsonObjectFree(user);
 
     osrfStringArray* permission = osrfHashGet(pcrud, "permission");
-    char* global_required = osrfHashGet(pcrud, "global_required");
     osrfStringArray* local_context = osrfHashGet(pcrud, "local_context");
     osrfHash* foreign_context = osrfHashGet(pcrud, "foreign_context");
 
@@ -921,7 +941,7 @@ static int verifyObjectPCRUD (  osrfMethodContext* ctx, const jsonObject* obj )
 
     int err = 0;
     char* pkey_value = NULL;
-    if (global_required && !strcmp( "true", global_required )) {
+       if ( str_is_true( osrfHashGet(pcrud, "global_required") ) ) {
            osrfLogDebug( OSRF_LOG_MARK, "global-level permissions required, fetching top of the org tree" );
 
         // check for perm at top of org tree
@@ -1290,7 +1310,9 @@ static jsonObject* doCreate(osrfMethodContext* ctx, int* err ) {
                return jsonNULL;
        }
 
-       if (osrfHashGet( meta, "readonly" ) && strncasecmp("true", osrfHashGet( meta, "readonly" ), 4)) {
+       // The following test is harmless but redundant.  If a class is
+       // readonly, we don't register a create method for it.
+       if( str_is_true( osrfHashGet( meta, "readonly" ) ) ) {
                osrfAppSessionStatus(
                        ctx->session,
                        OSRF_STATUS_BADREQUEST,
@@ -1338,7 +1360,8 @@ static jsonObject* doCreate(osrfMethodContext* ctx, int* err ) {
 
                osrfHash* field = osrfHashGet( fields, field_name );
 
-               if(!( strcmp( osrfHashGet(osrfHashGet(fields,field_name), "virtual"), "true" ) )) continue;
+               if( str_is_true( osrfHashGet( field, "virtual" ) ) )
+                       continue;
 
                const jsonObject* field_object = oilsFMGetObject( target, field_name );
 
@@ -1458,7 +1481,7 @@ static jsonObject* doCreate(osrfMethodContext* ctx, int* err ) {
                                quiet_str = jsonObjectToSimpleString( quiet_obj );
                }
 
-               if( quiet_str && !strcmp( quiet_str, "true" )) {  // if quietness is specified
+               if( str_is_true( quiet_str ) ) {  // if quietness is specified
                        obj = jsonNewObject(id);
                }
                else {
@@ -1508,8 +1531,6 @@ static jsonObject* doRetrieve(osrfMethodContext* ctx, int* err ) {
 
        osrfHash* meta = osrfHashGet( (osrfHash*) ctx->method->userData, "class" );
 
-       jsonObject* obj;
-
        char* id = jsonObjectToSimpleString(jsonObjectGetIndex(ctx->params, id_pos));
        jsonObject* order_hash = jsonObjectGetIndex(ctx->params, order_pos);
 
@@ -1541,7 +1562,7 @@ static jsonObject* doRetrieve(osrfMethodContext* ctx, int* err ) {
                return jsonNULL;
        }
 
-       obj = jsonObjectClone( jsonObjectGetIndex(list, 0) );
+       jsonObject* obj = jsonObjectClone( jsonObjectGetIndex(list, 0) );
 
        jsonObjectFree( list );
        jsonObjectFree( fake_params );
@@ -1591,7 +1612,7 @@ static char* jsonNumberToDBString ( osrfHash* field, const jsonObject* value ) {
 }
 
 static char* searchINPredicate (const char* class, osrfHash* field,
-               const jsonObject* node, const char* op) {
+               jsonObject* node, const char* op, osrfMethodContext* ctx ) {
        growing_buffer* sql_buf = buffer_init(32);
        
        buffer_fadd(
@@ -1609,76 +1630,100 @@ static char* searchINPredicate (const char* class, osrfHash* field,
                buffer_add(sql_buf, "IN (");
        }
 
-       int in_item_index = 0;
-       int in_item_first = 1;
-       jsonObject* in_item;
-       while ( (in_item = jsonObjectGetIndex(node, in_item_index++)) ) {
-
-               if (in_item_first)
-                       in_item_first = 0;
-               else
-                       buffer_add(sql_buf, ", ");
-
-               if ( !strcmp(osrfHashGet(field, "primitive"), "number") ) {
-                       char* val = jsonNumberToDBString( field, in_item );
-                       OSRF_BUFFER_ADD( sql_buf, val );
-                       free(val);
+    if (node->type == JSON_HASH) {
+        // subquery predicate
+        char* subpred = SELECT(
+            ctx,
+            jsonObjectGetKey( node, "select" ),
+            jsonObjectGetKey( node, "from" ),
+            jsonObjectGetKey( node, "where" ),
+            jsonObjectGetKey( node, "having" ),
+            jsonObjectGetKey( node, "order_by" ),
+            jsonObjectGetKey( node, "limit" ),
+            jsonObjectGetKey( node, "offset" ),
+            SUBSELECT
+        );
 
-               } else {
-                       char* key_string = jsonObjectToSimpleString(in_item);
-                       if ( dbi_conn_quote_string(dbhandle, &key_string) ) {
-                               OSRF_BUFFER_ADD( sql_buf, key_string );
-                               free(key_string);
-                       } else {
-                               osrfLogError(OSRF_LOG_MARK, "%s: Error quoting key string [%s]", MODULENAME, key_string);
-                               free(key_string);
-                               buffer_free(sql_buf);
-                               return NULL;
-                       }
-               }
-       }
+        buffer_add(sql_buf, subpred);
+        free(subpred);
 
+    } else if (node->type == JSON_ARRAY) {
+        // litteral value list
+       int in_item_index = 0;
+       int in_item_first = 1;
+       jsonObject* in_item;
+       while ( (in_item = jsonObjectGetIndex(node, in_item_index++)) ) {
+    
+               if (in_item_first)
+                       in_item_first = 0;
+               else
+                       buffer_add(sql_buf, ", ");
+    
+               if ( !strcmp(osrfHashGet(field, "primitive"), "number") ) {
+                       char* val = jsonNumberToDBString( field, in_item );
+                       OSRF_BUFFER_ADD( sql_buf, val );
+                       free(val);
+    
+               } else {
+                       char* key_string = jsonObjectToSimpleString(in_item);
+                       if ( dbi_conn_quote_string(dbhandle, &key_string) ) {
+                               OSRF_BUFFER_ADD( sql_buf, key_string );
+                               free(key_string);
+                       } else {
+                               osrfLogError(OSRF_LOG_MARK, "%s: Error quoting key string [%s]", MODULENAME, key_string);
+                               free(key_string);
+                               buffer_free(sql_buf);
+                               return NULL;
+                       }
+               }
+       }
+    }
+    
        OSRF_BUFFER_ADD_CHAR( sql_buf, ')' );
 
        return buffer_release(sql_buf);
 }
 
+// Receive a JSON_ARRAY representing a function call.  The first
+// entry in the array is the function name.  The rest are parameters.
 static char* searchValueTransform( const jsonObject* array ) {
        growing_buffer* sql_buf = buffer_init(32);
 
        char* val = NULL;
-       int func_item_index = 0;
-       int func_item_first = 2;
        jsonObject* func_item;
+       
+       // Get the function name
+       if( array->size > 0 ) {
+               func_item = jsonObjectGetIndex( array, 0 );
+               val = jsonObjectToSimpleString( func_item );
+               OSRF_BUFFER_ADD( sql_buf, val );
+               OSRF_BUFFER_ADD( sql_buf, "( " );
+               free(val);
+       }
+       
+       // Get the parameters
+       int func_item_index = 1;   // We already grabbed the zeroth entry
        while ( (func_item = jsonObjectGetIndex(array, func_item_index++)) ) {
 
-               val = jsonObjectToSimpleString(func_item);
-
-               if (func_item_first == 2) {
-                       OSRF_BUFFER_ADD(sql_buf, val);
-                       OSRF_BUFFER_ADD(sql_buf, "( ");
-                       free(val);
-                       func_item_first--;
-                       continue;
-               }
-
-               if (func_item_first)
-                       func_item_first--;
-               else
-                       buffer_add(sql_buf, ", ");
+               // Add a separator comma, if we need one
+               if( func_item_index > 2 )
+                       buffer_add( sql_buf, ", " );
 
+               // Add the current parameter
                if (func_item->type == JSON_NULL) {
                        buffer_add( sql_buf, "NULL" );
-               } else if ( dbi_conn_quote_string(dbhandle, &val) ) {
-                       OSRF_BUFFER_ADD( sql_buf, val );
                } else {
-                       osrfLogError(OSRF_LOG_MARK, "%s: Error quoting key string [%s]", MODULENAME, val);
-                       free(val);
-                       buffer_free(sql_buf);
-                       return NULL;
+                       val = jsonObjectToSimpleString(func_item);
+                       if ( dbi_conn_quote_string(dbhandle, &val) ) {
+                               OSRF_BUFFER_ADD( sql_buf, val );
+                               free(val);
+                       } else {
+                               osrfLogError(OSRF_LOG_MARK, "%s: Error quoting key string [%s]", MODULENAME, val);
+                               buffer_free(sql_buf);
+                               free(val);
+                               return NULL;
+                       }
                }
-
-               free(val);
        }
 
        buffer_add( sql_buf, " )" );
@@ -1706,12 +1751,18 @@ static char* searchFunctionPredicate (const char* class, osrfHash* field,
        return buffer_release(sql_buf);
 }
 
+// class is a class name
+// field is a field definition as stored in the IDL
+// node comes from the method parameter, and represents an entry in the SELECT list
 static char* searchFieldTransform (const char* class, osrfHash* field, const jsonObject* node) {
        growing_buffer* sql_buf = buffer_init(32);
        
        char* field_transform = jsonObjectToSimpleString( jsonObjectGetKeyConst( node, "transform" ) );
        char* transform_subcolumn = jsonObjectToSimpleString( jsonObjectGetKeyConst( node, "result_field" ) );
 
+       if(transform_subcolumn)
+               OSRF_BUFFER_ADD_CHAR( sql_buf, '(' );    // enclose transform in parentheses
+
        if (field_transform) {
                buffer_fadd( sql_buf, "%s(\"%s\".%s", field_transform, class, osrfHashGet(field, "name"));
            const jsonObject* array = jsonObjectGetKeyConst( node, "params" );
@@ -1730,36 +1781,24 @@ static char* searchFieldTransform (const char* class, osrfHash* field, const jso
                                        OSRF_BUFFER_ADD( sql_buf, val );
                        } else {
                                osrfLogError(OSRF_LOG_MARK, "%s: Error quoting key string [%s]", MODULENAME, val);
-                           free(field_transform);
+                                       free(transform_subcolumn);
+                                       free(field_transform);
                                        free(val);
                                buffer_free(sql_buf);
                                return NULL;
                }
                                free(val);
                        }
-
         }
 
-               buffer_add(
-               sql_buf,
-               " )"
-               );
+               buffer_add( sql_buf, " )" );
 
        } else {
                buffer_fadd( sql_buf, "\"%s\".%s", class, osrfHashGet(field, "name"));
        }
 
-    if (transform_subcolumn) {
-        char * tmp = buffer_release(sql_buf);
-        sql_buf = buffer_init(32);
-        buffer_fadd(
-            sql_buf,
-            "(%s).\"%s\"",
-            tmp,
-            transform_subcolumn
-        );
-        free(tmp);
-    }
+    if (transform_subcolumn)
+        buffer_fadd( sql_buf, ").\"%s\"", transform_subcolumn );
  
        if (field_transform) free(field_transform);
        if (transform_subcolumn) free(transform_subcolumn);
@@ -1890,11 +1929,12 @@ static char* searchBETWEENPredicate (const char* class, osrfHash* field, jsonObj
        return buffer_release(sql_buf);
 }
 
-static char* searchPredicate ( const char* class, osrfHash* field, jsonObject* node ) {
+static char* searchPredicate ( const char* class, osrfHash* field, 
+                                                          jsonObject* node, osrfMethodContext* ctx ) {
 
        char* pred = NULL;
        if (node->type == JSON_ARRAY) { // equality IN search
-               pred = searchINPredicate( class, field, node, NULL );
+               pred = searchINPredicate( class, field, node, NULL, ctx );
        } else if (node->type == JSON_HASH) { // non-equality search
                jsonObject* pred_node;
                jsonIterator* pred_itr = jsonNewIterator( node );
@@ -1902,7 +1942,7 @@ static char* searchPredicate ( const char* class, osrfHash* field, jsonObject* n
                        if ( !(strcasecmp( pred_itr->key,"between" )) )
                                pred = searchBETWEENPredicate( class, field, pred_node );
                        else if ( !(strcasecmp( pred_itr->key,"in" )) || !(strcasecmp( pred_itr->key,"not in" )) )
-                               pred = searchINPredicate( class, field, pred_node, pred_itr->key );
+                               pred = searchINPredicate( class, field, pred_node, pred_itr->key, ctx );
                        else if ( pred_node->type == JSON_ARRAY )
                                pred = searchFunctionPredicate( class, field, pred_node, pred_itr->key );
                        else if ( pred_node->type == JSON_HASH )
@@ -1971,21 +2011,28 @@ static char* searchJOIN ( const jsonObject* join_hash, osrfHash* leftmeta ) {
                free(_tmp);
                working_hash = freeable_hash;
        }
-       else
+       else {
+               if( join_hash->type != JSON_HASH ) {
+                       osrfLogError(
+                               OSRF_LOG_MARK,
+                               "%s: JOIN failed; expected JSON object type not found",
+                               MODULENAME
+                       );
+                       return NULL;
+               }
                working_hash = join_hash;
+       }
 
        growing_buffer* join_buf = buffer_init(128);
-       char* leftclass = osrfHashGet(leftmeta, "classname");
+       const char* leftclass = osrfHashGet(leftmeta, "classname");
 
        jsonObject* snode = NULL;
        jsonIterator* search_itr = jsonNewIterator( working_hash );
-       if(freeable_hash)
-               jsonObjectFree(freeable_hash);
        
        while ( (snode = jsonIteratorNext( search_itr )) ) {
                osrfHash* idlClass = osrfHashGet( oilsIDL(), search_itr->key );
 
-               char* class = osrfHashGet(idlClass, "classname");
+               const char* class = osrfHashGet(idlClass, "classname");
 
                char* fkey = jsonObjectToSimpleString( jsonObjectGetKeyConst( snode, "fkey" ) );
                char* field = jsonObjectToSimpleString( jsonObjectGetKeyConst( snode, "field" ) );
@@ -2002,6 +2049,8 @@ static char* searchJOIN ( const jsonObject* join_hash, osrfHash* leftmeta ) {
                                        leftclass
                                );
                                buffer_free(join_buf);
+                               if(freeable_hash)
+                                       jsonObjectFree(freeable_hash);
                                free(field);
                                jsonIteratorFree(search_itr);
                                return NULL;
@@ -2020,6 +2069,8 @@ static char* searchJOIN ( const jsonObject* join_hash, osrfHash* leftmeta ) {
                                        class
                                );
                                buffer_free(join_buf);
+                               if(freeable_hash)
+                                       jsonObjectFree(freeable_hash);
                                free(fkey);
                                jsonIteratorFree(search_itr);
                                return NULL;
@@ -2029,37 +2080,46 @@ static char* searchJOIN ( const jsonObject* join_hash, osrfHash* leftmeta ) {
                } else if (!field && !fkey) {
                        osrfHash* _links = oilsIDLFindPath("/%s/links", leftclass);
 
-                       int i = 0;
-                       osrfStringArray* keys = osrfHashKeys( _links );
-                       while ( (fkey = osrfStringArrayGetString(keys, i++)) ) {
-                               fkey = strdup(osrfStringArrayGetString(keys, i++));
-                               if ( !strcmp( (char*)oilsIDLFindPath("/%s/links/%s/class", leftclass, fkey), class) ) {
-                                       field = strdup( (char*)oilsIDLFindPath("/%s/links/%s/key", leftclass, fkey) );
+                       // For each link defined for the left class:
+                       // see if the link references the joined class
+                       osrfHashIterator* itr = osrfNewHashIterator( _links );
+                       osrfHash* curr_link = NULL;
+                       while( (curr_link = osrfHashIteratorNext( itr ) ) ) {
+                               const char* other_class = osrfHashGet( curr_link, "class" );
+                               if( other_class && !strcmp( other_class, class ) ) {
+
+                                       // Found a link between the classes
+                                       fkey = strdup( osrfHashIteratorKey( itr ) );
+                                       const char* other_key = osrfHashGet( curr_link, "key" );
+                                       field = other_key ? strdup( other_key ) : NULL;
                                        break;
-                               } else {
-                                       free(fkey);
                                }
                        }
-                       osrfStringArrayFree(keys);
-
-                       if (!field && !fkey) {
+                       osrfHashIteratorFree( itr );
+                       
+                       if (!field || !fkey) {
+                               // Do another such search, with the classes reversed
                                _links = oilsIDLFindPath("/%s/links", class);
 
-                               i = 0;
-                               keys = osrfHashKeys( _links );
-                               while ( (field = osrfStringArrayGetString(keys, i++)) ) {
-                                       field = strdup(osrfStringArrayGetString(keys, i++));
-                                       if ( !strcmp( (char*)oilsIDLFindPath("/%s/links/%s/class", class, field), class) ) {
-                                               fkey = strdup( (char*)oilsIDLFindPath("/%s/links/%s/key", class, field) );
+                               // For each link defined for the joined class:
+                               // see if the link references the left class
+                               osrfHashIterator* itr = osrfNewHashIterator( _links );
+                               osrfHash* curr_link = NULL;
+                               while( (curr_link = osrfHashIteratorNext( itr ) ) ) {
+                                       const char* other_class = osrfHashGet( curr_link, "class" );
+                                       if( other_class && !strcmp( other_class, leftclass ) ) {
+
+                                               // Found a link between the classes
+                                               fkey = strdup( osrfHashIteratorKey( itr ) );
+                                               const char* other_key = osrfHashGet( curr_link, "key" );
+                                               field = other_key ? strdup( other_key ) : NULL;
                                                break;
-                                       } else {
-                                               free(field);
                                        }
                                }
-                               osrfStringArrayFree(keys);
+                               osrfHashIteratorFree( itr );
                        }
 
-                       if (!field && !fkey) {
+                       if (!field || !fkey) {
                                osrfLogError(
                                        OSRF_LOG_MARK,
                                        "%s: JOIN failed.  No link defined between %s and %s",
@@ -2068,6 +2128,8 @@ static char* searchJOIN ( const jsonObject* join_hash, osrfHash* leftmeta ) {
                                        class
                                );
                                buffer_free(join_buf);
+                               if(freeable_hash)
+                                       jsonObjectFree(freeable_hash);
                                jsonIteratorFree(search_itr);
                                return NULL;
                        }
@@ -2091,7 +2153,8 @@ static char* searchJOIN ( const jsonObject* join_hash, osrfHash* leftmeta ) {
                free(type);
 
                char* table = getSourceDefinition(idlClass);
-               buffer_fadd(join_buf, " %s AS \"%s\" ON ( \"%s\".%s = \"%s\".%s", table, class, class, field, leftclass, fkey);
+               buffer_fadd(join_buf, " %s AS \"%s\" ON ( \"%s\".%s = \"%s\".%s",
+                                       table, class, class, field, leftclass, fkey);
                free(table);
 
                const jsonObject* filter = jsonObjectGetKeyConst( snode, "filter" );
@@ -2128,7 +2191,9 @@ static char* searchJOIN ( const jsonObject* join_hash, osrfHash* leftmeta ) {
                free(field);
        }
 
-    jsonIteratorFree(search_itr);
+       if(freeable_hash)
+               jsonObjectFree(freeable_hash);
+       jsonIteratorFree(search_itr);
 
        return buffer_release(join_buf);
 }
@@ -2145,7 +2210,7 @@ static char* searchWHERE ( const jsonObject* search_hash, osrfHash* meta, int op
 
        osrfLogDebug(
         OSRF_LOG_MARK,
-        "%s: Entering searchWHERE; search_hash addr = %d, meta addr = %d, opjoin_type = %d, ctx addr = %d",
+        "%s: Entering searchWHERE; search_hash addr = %p, meta addr = %p, opjoin_type = %d, ctx addr = %p",
         MODULENAME,
         search_hash,
         meta,
@@ -2246,7 +2311,7 @@ static char* searchWHERE ( const jsonObject* search_hash, osrfHash* meta, int op
                     char* table = getSourceDefinition(meta);
                     osrfLogError(
                         OSRF_LOG_MARK,
-                        "%s: Attempt to reference non-existant column %s on %s (%s)",
+                        "%s: Attempt to reference non-existent column %s on %s (%s)",
                         MODULENAME,
                         search_itr->key,
                         table,
@@ -2258,7 +2323,7 @@ static char* searchWHERE ( const jsonObject* search_hash, osrfHash* meta, int op
                                        return NULL;
                 }
 
-                char* subpred = searchPredicate( class, field, node );
+                char* subpred = searchPredicate( class, field, node, ctx );
                 buffer_add( sql_buf, subpred );
                 free(subpred);
             }
@@ -2283,7 +2348,7 @@ static char* searchWHERE ( const jsonObject* search_hash, osrfHash* meta, int op
        return buffer_release(sql_buf);
 }
 
-static char* SELECT (
+char* SELECT (
                /* method context */ osrfMethodContext* ctx,
                
                /* SELECT   */ jsonObject* selhash,
@@ -2302,12 +2367,10 @@ static char* SELECT (
 
        // general tmp objects
        const jsonObject* tmp_const;
-       jsonObject* _tmp = NULL;
        jsonObject* selclass = NULL;
        jsonObject* selfield = NULL;
        jsonObject* snode = NULL;
        jsonObject* onode = NULL;
-       jsonObject* found = NULL;
 
        char* string = NULL;
        int from_function = 0;
@@ -2320,8 +2383,6 @@ static char* SELECT (
 
        // metadata about the core search class
        osrfHash* core_meta = NULL;
-       osrfHash* core_fields = NULL;
-       osrfHash* idlClass = NULL;
 
        // punt if there's no core class
        if (!join_hash || ( join_hash->type == JSON_HASH && !join_hash->size ))
@@ -2334,18 +2395,27 @@ static char* SELECT (
                
                core_class = strdup( tmp_itr->key );
                join_hash = snode;
+               
+               jsonObject* extra = jsonIteratorNext( tmp_itr );
 
                jsonIteratorFree( tmp_itr );
                snode = NULL;
+               
+               // There shouldn't be more than one entry in join_hash
+               if( extra )
+                       return NULL;    // Malformed join_hash; extra entry
 
        } else if (join_hash->type == JSON_ARRAY) {
-        from_function = 1;
-        selhash = NULL;
+               from_function = 1;
+               core_class = jsonObjectToSimpleString( jsonObjectGetIndex(join_hash, 0) );
+               selhash = NULL;
 
        } else if (join_hash->type == JSON_STRING) {
                core_class = jsonObjectToSimpleString( join_hash );
                join_hash = NULL;
        }
+       else
+               return NULL;
 
        // punt if we don't know about the core class (and it's not a function)
        if (!from_function && !(core_meta = osrfHashGet( oilsIDL(), core_class ))) {
@@ -2376,153 +2446,175 @@ static char* SELECT (
        growing_buffer* group_buf = buffer_init(128);
        growing_buffer* having_buf = buffer_init(128);
 
-       if (!from_function) 
-        core_fields = osrfHashGet(core_meta, "fields");
+       // Build a select list
+       if(from_function)   // From a function we select everything
+               OSRF_BUFFER_ADD_CHAR( select_buf, '*' );
+       else {
 
-       // ... and if we /are/ building the default list, do that
-       if ( (_tmp = jsonObjectGetKey(selhash,core_class)) && !_tmp->size ) {
-               
-               int i = 0;
-               char* field;
+               // If we need to build a default list, do so
+               jsonObject* _tmp = jsonObjectGetKey( selhash, core_class );
+               if ( _tmp && !_tmp->size ) {
+
+                       int i = 0;
+                       char* field;
+                       osrfHash* core_fields = osrfHashGet( core_meta, "fields" );
 
-        if (!from_function) {
                osrfStringArray* keys = osrfHashKeys( core_fields );
-               while ( (field = osrfStringArrayGetString(keys, i++)) ) {
-                       if ( strncasecmp( "true", osrfHashGet( osrfHashGet( core_fields, field ), "virtual" ), 4 ) )
-                               jsonObjectPush( _tmp, jsonNewObject( field ) );
+                       while ( (field = osrfStringArrayGetString(keys, i++)) ) {
+                               if( ! str_is_true( osrfHashGet( osrfHashGet( core_fields, field ), "virtual" ) ) )
+                                       jsonObjectPush( _tmp, jsonNewObject( field ) );   // not virtual; use it
                }
-               osrfStringArrayFree(keys);
-        }
-       }
-
-       // Now we build the actual select list
-       if (!from_function) {
+                       osrfStringArrayFree(keys);
+               }
+       
+               // Now build the actual select list
            int sel_pos = 1;
            jsonObject* is_agg = jsonObjectFindPath(selhash, "//aggregate");
            first = 1;
            gfirst = 1;
            jsonIterator* selclass_itr = jsonNewIterator( selhash );
-           while ( (selclass = jsonIteratorNext( selclass_itr )) ) {
+           while ( (selclass = jsonIteratorNext( selclass_itr )) ) {    // For each class
 
                    // round trip through the idl, just to be safe
-                   idlClass = osrfHashGet( oilsIDL(), selclass_itr->key );
-                   if (!idlClass) continue;
-                   char* cname = osrfHashGet(idlClass, "classname");
+                       const char* cname = selclass_itr->key;
+                       osrfHash* idlClass = osrfHashGet( oilsIDL(), cname );
+                   if (!idlClass)
+                               // No such class.  Skip it.
+                               continue;
 
-                   // make sure the target relation is in the join tree
-                   if (strcmp(core_class,cname)) {
-                           if (!join_hash) continue;
+                   // Make sure the target relation is in the join tree.
+                       
+                       // At this point join_hash is a step down from the join_hash we
+                       // received as a parameter.  If the original was a JSON_STRING,
+                       // then json_hash is now NULL.  If the original was a JSON_HASH,
+                       // then json_hash is now the first (and only) entry in it,
+                       // denoting the core class.  We've already excluded the
+                       // possibility that the original was a JSON_ARRAY, because in
+                       // that case from_function would be non-NULL, and we wouldn't
+                       // be here.
+
+                   if ( strcmp( core_class, cname )) {
+                           if (!join_hash) 
+                                       // There's only one class in the FROM clause,
+                                       // and this isn't it.  Skip it.
+                                       continue;
 
-                           if (join_hash->type == JSON_STRING) {
+                               if (join_hash->type == JSON_STRING) {
                                    string = jsonObjectToSimpleString(join_hash);
-                                   found = strcmp(string,cname) ? NULL : jsonParseString("{\"1\":\"1\"}");
+                                       int different = strcmp( string, cname );
                                    free(string);
-                           } else {
-                                   found = jsonObjectFindPath(join_hash, "//%s", cname);
-                           }
-
-                           if (!found->size) {
-                                   jsonObjectFree(found);
-                                   continue;
-                           }
-
-                           jsonObjectFree(found);
+                                       if ( different )
+                                               // There's only one class in the FROM clause,
+                                               // and this isn't it.  Skip it.
+                                               continue;
+                               } else {
+                                   jsonObject* found = jsonObjectFindPath(join_hash, "//%s", cname);
+                                       unsigned long size = found->size;
+                                       jsonObjectFree( found );
+                                       if ( 0 == size )
+                                               // No such class anywhere in the join tree.  Skip it.
+                                               continue;
+                               }
                    }
 
+                       // Look up some attributes of the current class, so that we 
+                       // don't have to look them up again for each field
+                       osrfHash* class_field_set = osrfHashGet( idlClass, "fields" );
+                       char* class_pkey = osrfHashGet( idlClass, "primarykey" );
+                       char* class_tname = osrfHashGet( idlClass, "tablename" );
+                       
                    // stitch together the column list ...
                    jsonIterator* select_itr = jsonNewIterator( selclass );
-                   while ( (selfield = jsonIteratorNext( select_itr )) ) {
+                   while ( (selfield = jsonIteratorNext( select_itr )) ) {   // for each SELECT column
 
-                           char* __column = NULL;
-                           char* __alias = NULL;
+                               // If we need a separator comma, add one
+                               if (first) {
+                                       first = 0;
+                               } else {
+                                       OSRF_BUFFER_ADD_CHAR( select_buf, ',' );
+                               }
 
-                           // ... if it's a sstring, just toss it on the pile
+                           // ... if it's a string, just toss it on the pile
                            if (selfield->type == JSON_STRING) {
 
                                    // again, just to be safe
-                                   char* _requested_col = jsonObjectToSimpleString(selfield);
-                                   osrfHash* field = osrfHashGet( osrfHashGet( idlClass, "fields" ), _requested_col );
-                                   free(_requested_col);
-
-                                   if (!field) continue;
-                                   __column = strdup(osrfHashGet(field, "name"));
+                                       const char* _requested_col = selfield->value.s;
+                                   osrfHash* field = osrfHashGet( class_field_set, _requested_col );
+                                   if (!field) continue;               // No such field in current class; skip it
 
-                                   if (first) {
-                                           first = 0;
-                                   } else {
-                                               OSRF_BUFFER_ADD_CHAR( select_buf, ',' );
-                                   }
+                                       const char* col_name = osrfHashGet(field, "name");
 
                     if (locale) {
-                           char* i18n = osrfHashGet(field, "i18n");
+                           const char* i18n;
                                    if (flags & DISABLE_I18N)
                             i18n = NULL;
+                                               else
+                                                       i18n = osrfHashGet(field, "i18n");
 
-                           if ( i18n && !strncasecmp("true", i18n, 4)) {
-                               char* pkey = osrfHashGet(idlClass, "primarykey");
-                               char* tname = osrfHashGet(idlClass, "tablename");
-
-                            buffer_fadd(select_buf, " oils_i18n_xlate('%s', '%s', '%s', '%s', \"%s\".%s::TEXT, '%s') AS \"%s\"", tname, cname, __column, pkey, cname, pkey, locale, __column);
+                                               if( str_is_true( i18n ) ) {
+                            buffer_fadd( select_buf,
+                                                               " oils_i18n_xlate('%s', '%s', '%s', '%s', \"%s\".%s::TEXT, '%s') AS \"%s\"",
+                                                               class_tname, cname, col_name, class_pkey, cname, class_pkey, locale, col_name );
                         } else {
-                                           buffer_fadd(select_buf, " \"%s\".%s AS \"%s\"", cname, __column, __column);
+                                           buffer_fadd(select_buf, " \"%s\".%s AS \"%s\"", cname, col_name, col_name );
                         }
                     } else {
-                                       buffer_fadd(select_buf, " \"%s\".%s AS \"%s\"", cname, __column, __column);
+                                       buffer_fadd(select_buf, " \"%s\".%s AS \"%s\"", cname, col_name, col_name );
                     }
-
+                                       
                            // ... but it could be an object, in which case we check for a Field Transform
                            } else {
 
-                                   __column = jsonObjectToSimpleString( jsonObjectGetKeyConst( selfield, "column" ) );
+                                   char* _column = jsonObjectToSimpleString( jsonObjectGetKeyConst( selfield, "column" ) );
 
-                                   // again, just to be safe
-                                   osrfHash* field = osrfHashGet( osrfHashGet( idlClass, "fields" ), __column );
-                                   if (!field) continue;
-                                   const char* fname = osrfHashGet(field, "name");
+                                   // Get the field definition from the IDL
+                                   osrfHash* field = osrfHashGet( class_field_set, _column );
+                                   if (!field) continue;         // No such field defined in IDL.  Skip it.
 
-                                   if (first) {
-                                           first = 0;
-                                   } else {
-                                               OSRF_BUFFER_ADD_CHAR( select_buf, ',' );
+                                       // Decide what to use as a column alias
+                                       char* _alias;
+                                       if ((tmp_const = jsonObjectGetKeyConst( selfield, "alias" ))) {
+                                               _alias = jsonObjectToSimpleString( tmp_const );
+                                               free(_column);
+                                       } else {         // Use column name as its own alias
+                                               _alias = _column;
                                        }
+                                       _column = NULL;   // To emphasize that we're through with _column
 
-                                   if ((tmp_const = jsonObjectGetKeyConst( selfield, "alias" ))) {
-                                           __alias = jsonObjectToSimpleString( tmp_const );
-                                   } else {
-                                           __alias = strdup(__column);
-                                   }
+                                       if (jsonObjectGetKeyConst( selfield, "transform" )) {
+                                               char* transform_str = searchFieldTransform(cname, field, selfield);
+                                               buffer_fadd(select_buf, " %s AS \"%s\"", transform_str, _alias);
+                                               free(transform_str);
+                                       } else {
+
+                                               const char* fname = osrfHashGet(field, "name");
 
-                                   if (jsonObjectGetKeyConst( selfield, "transform" )) {
-                                           free(__column);
-                                           __column = searchFieldTransform(cname, field, selfield);
-                                           buffer_fadd(select_buf, " %s AS \"%s\"", __column, __alias);
-                                   } else {
                         if (locale) {
-                                   char* i18n = osrfHashGet(field, "i18n");
+                                   const char* i18n;
                                        if (flags & DISABLE_I18N)
                                 i18n = NULL;
-    
-                                   if ( i18n && !strncasecmp("true", i18n, 4)) {
-                                   char* pkey = osrfHashGet(idlClass, "primarykey");
-                                   char* tname = osrfHashGet(idlClass, "tablename");
+                                                       else
+                                                               i18n = osrfHashGet(field, "i18n");
 
-                                buffer_fadd(select_buf, " oils_i18n_xlate('%s', '%s', '%s', '%s', \"%s\".%s::TEXT, '%s') AS \"%s\"", tname, cname, fname, pkey, cname, pkey, locale, __alias);
+                                                       if( str_is_true( i18n ) ) {
+                                buffer_fadd( select_buf,
+                                                                       " oils_i18n_xlate('%s', '%s', '%s', '%s', \"%s\".%s::TEXT, '%s') AS \"%s\"",
+                                                                       class_tname, cname, fname, class_pkey, cname, class_pkey, locale, _alias);
                             } else {
-                                                   buffer_fadd(select_buf, " \"%s\".%s AS \"%s\"", cname, fname, __alias);
+                                                   buffer_fadd(select_buf, " \"%s\".%s AS \"%s\"", cname, fname, _alias);
                             }
                         } else {
-                                               buffer_fadd(select_buf, " \"%s\".%s AS \"%s\"", cname, fname, __alias);
+                                               buffer_fadd(select_buf, " \"%s\".%s AS \"%s\"", cname, fname, _alias);
                         }
                                    }
+
+                                   free(_alias);
                            }
 
                            if (is_agg->size || (flags & SELECT_DISTINCT)) {
 
-                                   if ( !(
-                            jsonBoolIsTrue( jsonObjectGetKey( selfield, "aggregate" ) ) ||
-                               ((int)jsonObjectGetNumber(jsonObjectGetKey( selfield, "aggregate" ))) == 1 // support 1/0 for perl's sake
-                         )
-                    ) {
+                                       const jsonObject* aggregate_obj = jsonObjectGetKey( selfield, "aggregate" );
+                                   if ( ! obj_is_true( aggregate_obj ) ) {
                                            if (gfirst) {
                                                    gfirst = 0;
                                            } else {
@@ -2538,35 +2630,30 @@ static char* SELECT (
                                                        OSRF_BUFFER_ADD_CHAR( group_buf, ',' );
                                            }
 
-                                           __column = searchFieldTransform(cname, field, selfield);
+                                           _column = searchFieldTransform(cname, field, selfield);
                                                OSRF_BUFFER_ADD_CHAR(group_buf, ' ');
-                                               OSRF_BUFFER_ADD(group_buf, __column);
-                                           __column = searchFieldTransform(cname, field, selfield);
+                                               OSRF_BUFFER_ADD(group_buf, _column);
+                                           _column = searchFieldTransform(cname, field, selfield);
                                        */
                                    }
                            }
 
-                           if (__column) free(__column);
-                           if (__alias) free(__alias);
-
                            sel_pos++;
-                   }
+                   } // end while -- iterating across SELECT columns
 
-            // jsonIteratorFree(select_itr);
-           }
+            jsonIteratorFree(select_itr);
+           } // end while -- iterating across classes
 
-        // jsonIteratorFree(selclass_itr);
+        jsonIteratorFree(selclass_itr);
 
            if (is_agg) jsonObjectFree(is_agg);
-    } else {
-               OSRF_BUFFER_ADD_CHAR( select_buf, '*' );
     }
 
 
        char* col_list = buffer_release(select_buf);
        char* table = NULL;
-    if (!from_function) table = getSourceDefinition(core_meta);
-    else table = searchValueTransform(join_hash);
+       if (from_function) table = searchValueTransform(join_hash);
+       else table = getSourceDefinition(core_meta);
 
        // Put it all together
        buffer_fadd(sql_buf, "SELECT %s FROM %s AS \"%s\" ", col_list, table, core_class );
@@ -2581,14 +2668,18 @@ static char* SELECT (
                    free(join_clause);
            }
 
+               // Build a WHERE clause, if there is one
            if ( search_hash ) {
                    buffer_add(sql_buf, " WHERE ");
 
-                   // and it's on the the WHERE clause
+                   // and it's on the WHERE clause
                    char* pred = searchWHERE( search_hash, core_meta, AND_OP_JOIN, ctx );
 
-                   if (!pred) {
-                           if (ctx) {
+                   if (pred) {
+                               buffer_add(sql_buf, pred);
+                               free(pred);
+                       } else {
+                               if (ctx) {
                                osrfAppSessionStatus(
                                        ctx->session,
                                        OSRF_STATUS_INTERNALSERVERERROR,
@@ -2604,20 +2695,21 @@ static char* SELECT (
                            buffer_free(sql_buf);
                            if (defaultselhash) jsonObjectFree(defaultselhash);
                            return NULL;
-                   } else {
-                           buffer_add(sql_buf, pred);
-                           free(pred);
                    }
         }
 
+               // Build a HAVING clause, if there is one
            if ( having_hash ) {
                    buffer_add(sql_buf, " HAVING ");
 
                    // and it's on the the WHERE clause
                    char* pred = searchWHERE( having_hash, core_meta, AND_OP_JOIN, ctx );
 
-                   if (!pred) {
-                           if (ctx) {
+                   if (pred) {
+                               buffer_add(sql_buf, pred);
+                               free(pred);
+                       } else {
+                               if (ctx) {
                                osrfAppSessionStatus(
                                        ctx->session,
                                        OSRF_STATUS_INTERNALSERVERERROR,
@@ -2633,12 +2725,10 @@ static char* SELECT (
                            buffer_free(sql_buf);
                            if (defaultselhash) jsonObjectFree(defaultselhash);
                            return NULL;
-                   } else {
-                           buffer_add(sql_buf, pred);
-                           free(pred);
                    }
            }
 
+               // Build an ORDER BY clause, if there is one
            first = 1;
            jsonIterator* class_itr = jsonNewIterator( order_hash );
            while ( (snode = jsonIteratorNext( class_itr )) ) {
@@ -2704,7 +2794,7 @@ static char* SELECT (
                                            buffer_add(order_buf, direction);
                                    }
 
-                           }
+                           } // end while
                 // jsonIteratorFree(order_itr);
 
                    } else if ( snode->type == JSON_ARRAY ) {
@@ -2726,7 +2816,7 @@ static char* SELECT (
                                    buffer_add(order_buf, _f);
                                    free(_f);
 
-                           }
+                           } // end while
                 // jsonIteratorFree(order_itr);
 
 
@@ -2753,10 +2843,10 @@ static char* SELECT (
                            return NULL;
                    }
 
-           }
-    }
+           } // end while
+               // jsonIteratorFree(class_itr);
+       }
 
-    // jsonIteratorFree(class_itr);
 
        string = buffer_release(group_buf);
 
@@ -2839,7 +2929,7 @@ static char* buildSELECT ( jsonObject* search_hash, jsonObject* order_hash, osrf
 
                osrfStringArray* keys = osrfHashKeys( fields );
                while ( (field = osrfStringArrayGetString(keys, i++)) ) {
-                       if ( strcasecmp( "true", osrfHashGet( osrfHashGet( fields, field ), "virtual" ) ) )
+                       if( ! str_is_true( osrfHashGet( osrfHashGet( fields, field ), "virtual" ) ) )
                                jsonObjectPush( flist, jsonNewObject( field ) );
                }
                osrfStringArrayFree(keys);
@@ -2881,13 +2971,14 @@ static char* buildSELECT ( jsonObject* search_hash, jsonObject* order_hash, osrf
                        }
 
             if (locale) {
-                       char* i18n = osrfHashGet(field, "i18n");
-                           if (
-                    jsonBoolIsTrue( jsonObjectGetKey( order_hash, "no_i18n" ) ) ||
-                    ((int)jsonObjectGetNumber(jsonObjectGetKey( order_hash, "no_i18n" ))) == 1 // support 1/0 for perl's sake
-                ) i18n = NULL;
-
-                       if ( i18n && !strncasecmp("true", i18n, 4)) {
+                       const char* i18n;
+                               const jsonObject* no_i18n_obj = jsonObjectGetKey( order_hash, "no_i18n" );
+                               if ( obj_is_true( no_i18n_obj ) )    // Suppress internationalization?
+                                       i18n = NULL;
+                               else
+                                       i18n = osrfHashGet(field, "i18n");
+
+                               if( str_is_true( i18n ) ) {
                        char* pkey = osrfHashGet(idlClass, "primarykey");
                        char* tname = osrfHashGet(idlClass, "tablename");
 
@@ -3066,7 +3157,11 @@ static char* buildSELECT ( jsonObject* search_hash, jsonObject* order_hash, osrf
 }
 
 int doJSONSearch ( osrfMethodContext* ctx ) {
-       OSRF_METHOD_VERIFY_CONTEXT(ctx);
+       if(osrfMethodVerifyContext( ctx )) {
+               osrfLogError( OSRF_LOG_MARK,  "Invalid method context" );
+               return -1;
+       }
+
        osrfLogDebug(OSRF_LOG_MARK, "Recieved query request");
 
        int err = 0;
@@ -3076,19 +3171,13 @@ int doJSONSearch ( osrfMethodContext* ctx ) {
 
        jsonObject* hash = jsonObjectGetIndex(ctx->params, 0);
 
-    int flags = 0;
-
-       if (jsonBoolIsTrue(jsonObjectGetKey( hash, "distinct" )))
-         flags |= SELECT_DISTINCT;
+       int flags = 0;
 
-       if ( ((int)jsonObjectGetNumber(jsonObjectGetKey( hash, "distinct" ))) == 1 ) // support 1/0 for perl's sake
-         flags |= SELECT_DISTINCT;
+       if ( obj_is_true( jsonObjectGetKey( hash, "distinct" ) ) )
+               flags |= SELECT_DISTINCT;
 
-       if (jsonBoolIsTrue(jsonObjectGetKey( hash, "no_i18n" )))
-         flags |= DISABLE_I18N;
-
-       if ( ((int)jsonObjectGetNumber(jsonObjectGetKey( hash, "no_i18n" ))) == 1 ) // support 1/0 for perl's sake
-         flags |= DISABLE_I18N;
+       if ( obj_is_true( jsonObjectGetKey( hash, "no_i18n" ) ) )
+               flags |= DISABLE_I18N;
 
        osrfLogDebug(OSRF_LOG_MARK, "Building SQL ...");
        char* sql = SELECT(
@@ -3173,38 +3262,11 @@ static jsonObject* doFieldmapperSearch ( osrfMethodContext* ctx, osrfHash* meta,
        }
        
        osrfLogDebug(OSRF_LOG_MARK, "%s SQL =  %s", MODULENAME, sql);
-       dbi_result result = dbi_conn_query(dbhandle, sql);
-
-       jsonObject* res_list = jsonNewObjectType(JSON_ARRAY);
-       if(result) {
-               osrfLogDebug(OSRF_LOG_MARK, "Query returned with no errors");
-               osrfHash* dedup = osrfNewHash();
-
-               if (dbi_result_first_row(result)) {
-                       /* JSONify the result */
-                       osrfLogDebug(OSRF_LOG_MARK, "Query returned at least one row");
-                       do {
-                               obj = oilsMakeFieldmapperFromResult( result, meta );
-                               char* pkey_val = oilsFMGetString( obj, pkey );
-                               if ( osrfHashGet( dedup, pkey_val ) ) {
-                                       jsonObjectFree(obj);
-                                       free(pkey_val);
-                               } else {
-                                       osrfHashSet( dedup, pkey_val, pkey_val );
-                                       jsonObjectPush(res_list, obj);
-                               }
-                       } while (dbi_result_next_row(result));
-               } else {
-                       osrfLogDebug(OSRF_LOG_MARK, "%s returned no results for query %s", MODULENAME, sql);
-               }
-
-               osrfHashFree(dedup);
 
-               /* clean up the query */
-               dbi_result_free(result); 
-
-       } else {
-               osrfLogError(OSRF_LOG_MARK, "%s: Error retrieving %s with query [%s]", MODULENAME, osrfHashGet(meta, "fieldmapper"), sql);
+       dbi_result result = dbi_conn_query(dbhandle, sql);
+       if( NULL == result ) {
+               osrfLogError(OSRF_LOG_MARK, "%s: Error retrieving %s with query [%s]",
+                       MODULENAME, osrfHashGet(meta, "fieldmapper"), sql);
                osrfAppSessionStatus(
                        ctx->session,
                        OSRF_STATUS_INTERNALSERVERERROR,
@@ -3214,11 +3276,37 @@ static jsonObject* doFieldmapperSearch ( osrfMethodContext* ctx, osrfHash* meta,
                );
                *err = -1;
                free(sql);
-               jsonObjectFree(res_list);
                return jsonNULL;
 
+       } else {
+               osrfLogDebug(OSRF_LOG_MARK, "Query returned with no errors");
        }
 
+       jsonObject* res_list = jsonNewObjectType(JSON_ARRAY);
+       osrfHash* dedup = osrfNewHash();
+
+       if (dbi_result_first_row(result)) {
+               /* JSONify the result */
+               osrfLogDebug(OSRF_LOG_MARK, "Query returned at least one row");
+               do {
+                       obj = oilsMakeFieldmapperFromResult( result, meta );
+                       char* pkey_val = oilsFMGetString( obj, pkey );
+                       if ( osrfHashGet( dedup, pkey_val ) ) {
+                               jsonObjectFree(obj);
+                               free(pkey_val);
+                       } else {
+                               osrfHashSet( dedup, pkey_val, pkey_val );
+                               jsonObjectPush(res_list, obj);
+                       }
+               } while (dbi_result_next_row(result));
+       } else {
+               osrfLogDebug(OSRF_LOG_MARK, "%s returned no results for query %s",
+                       MODULENAME, sql );
+       }
+
+       osrfHashFree(dedup);
+       /* clean up the query */
+       dbi_result_free(result);
        free(sql);
 
        if (res_list->size && order_hash) {
@@ -3477,7 +3565,9 @@ static jsonObject* doUpdate(osrfMethodContext* ctx, int* err ) {
                return jsonNULL;
        }
 
-       if (osrfHashGet( meta, "readonly" ) && strncasecmp("true", osrfHashGet( meta, "readonly" ), 4)) {
+       // The following test is harmless but redundant.  If a class is
+       // readonly, we don't register an update method for it.
+       if( str_is_true( osrfHashGet( meta, "readonly" ) ) ) {
                osrfAppSessionStatus(
                        ctx->session,
                        OSRF_STATUS_BADREQUEST,
@@ -3526,7 +3616,8 @@ static jsonObject* doUpdate(osrfMethodContext* ctx, int* err ) {
                osrfHash* field = osrfHashGet( fields, field_name );
 
                if(!( strcmp( field_name, pkey ) )) continue;
-               if(!( strcmp( osrfHashGet(osrfHashGet(fields,field_name), "virtual"), "true" ) )) continue;
+               if( str_is_true( osrfHashGet(osrfHashGet(fields,field_name), "virtual") ) )
+                       continue;
 
                const jsonObject* field_object = oilsFMGetObject( target, field_name );
 
@@ -3635,7 +3726,9 @@ static jsonObject* doDelete(osrfMethodContext* ctx, int* err ) {
                return jsonNULL;
        }
 
-       if (osrfHashGet( meta, "readonly" ) && strncasecmp("true", osrfHashGet( meta, "readonly" ), 4)) {
+       // The following test is harmless but redundant.  If a class is
+       // readonly, we don't register a delete method for it.
+       if( str_is_true( osrfHashGet( meta, "readonly" ) ) ) {
                osrfAppSessionStatus(
                        ctx->session,
                        OSRF_STATUS_BADREQUEST,
@@ -3746,10 +3839,12 @@ static jsonObject* oilsMakeFieldmapperFromResult( dbi_result result, osrfHash* m
 
                /* fetch the fieldmapper index */
                if( (_f = osrfHashGet(fields, (char*)columnName)) ) {
-                       char* virt = (char*)osrfHashGet(_f, "virtual");
-                       char* pos = (char*)osrfHashGet(_f, "array_position");
-
-                       if ( !virt || !pos || !(strcmp( virt, "true" )) ) continue;
+                       
+                       if ( str_is_true( osrfHashGet(_f, "virtual") ) )
+                               continue;
+                       
+                       const char* pos = (char*)osrfHashGet(_f, "array_position");
+                       if ( !pos ) continue;
 
                        fmIndex = atoi( pos );
                        osrfLogInternal(OSRF_LOG_MARK, "... Found column at position [%s]...", pos);
@@ -3903,3 +3998,36 @@ static jsonObject* oilsMakeJSONFromResult( dbi_result result ) {
        return object;
 }
 
+// Interpret a string as true or false
+static int str_is_true( const char* str ) {
+       if( NULL == str || strcasecmp( str, "true" ) )
+               return 0;
+       else
+               return 1;
+}
+
+// Interpret a jsonObject as true or false
+static int obj_is_true( const jsonObject* obj ) {
+       if( !obj )
+               return 0;
+       else switch( obj->type )
+       {
+               case JSON_BOOL :
+                       if( obj->value.b )
+                               return 1;
+                       else
+                               return 0;
+               case JSON_STRING :
+                       if( strcasecmp( obj->value.s, "true" ) )
+                               return 0;
+                       else
+                               return 1;
+               case JSON_NUMBER :          // Support 1/0 for perl's sake
+                       if( jsonObjectGetNumber( obj ) == 1.0 )
+                               return 1;
+                       else
+                               return 0;
+               default :
+                       return 0;
+       }
+}
index f1b8b42..6d511e5 100644 (file)
@@ -66,6 +66,15 @@ osrfHash* oilsIDLInit( const char* idl_filename ) {
                                );
                        }
 
+                       if ((prop_str = (char*)xmlGetNsProp(kid, BAD_CAST "restrict_primary", BAD_CAST PERSIST_NS))) {
+                               osrfLogDebug(OSRF_LOG_MARK, "Delete restriction policy set at '%s' for pkey of class %s", prop_str, current_class_name );
+                               osrfHashSet(
+                                       class_def_hash,
+                                       strdup( prop_str ),
+                                       "restrict_primary"
+                               );
+                       }
+
                        if ((prop_str = (char*)xmlGetNsProp(kid, BAD_CAST "virtual", BAD_CAST PERSIST_NS))) {
                                osrfHashSet(
                                        class_def_hash,
diff --git a/Open-ILS/src/c-apps/test_json_query.c b/Open-ILS/src/c-apps/test_json_query.c
new file mode 100644 (file)
index 0000000..dc37e4c
--- /dev/null
@@ -0,0 +1,261 @@
+/*
+Copyright (C) 2009  Georgia Public Library Service 
+Scott McKellar <scott@esilibrary.com>
+
+       This program is free software; you can redistribute it and/or
+       modify it under the terms of the GNU General Public License
+       as published by the Free Software Foundation; either version 2
+       of the License, or (at your option) any later version.
+
+       This program is distributed in the hope that it will be useful,
+       but WITHOUT ANY WARRANTY; without even the implied warranty of
+       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+       GNU General Public License for more details.
+
+       Description : Translates a JSON query into SQL and writes the
+       results to standard output.  Synopsis:
+
+       test_json_query [-i IDL_file] [-f file_name] [-v] query
+       
+       -i supplies the name of the IDL file.  If no IDL file is specified,
+          json_test_query uses the value of the environmental variable
+          OILS_IDL_FILENAME, if it is defined, or defaults to
+          "/openils/conf/fm_IDL.xml".
+
+       -f supplies the name of a text file containing the JSON query to
+          be translated.  A file name constisting of a single hyphen
+          denotes standard input.  If this option is present, all
+          non-option arguments are ignored.
+
+       -v verbose; outputs the name of the IDL file and the text of the
+          JSON query.
+
+       If there is no -f option supplied, json_query translates the 
+       first non-option parameter.  This parameter is subject to the
+       usual mangling by the shell.  In most cases it will be sufficient
+       to enclose it in single quotes, but of course any single quotes
+       embedded within the query will need to be escaped.
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <opensrf/utils.h>
+#include <opensrf/osrf_json.h>
+#include <opensrf/osrf_application.h>
+#include <opensrf/osrf_app_session.h>
+#include <openils/oils_idl.h>
+
+#define DISABLE_I18N   2
+#define SELECT_DISTINCT 1
+
+// Prototype for SELECT(), which is not in any header
+char* SELECT (
+               /* method context */ osrfMethodContext* ctx,
+               
+               /* SELECT   */ jsonObject* selhash,
+               /* FROM     */ jsonObject* join_hash,
+               /* WHERE    */ jsonObject* search_hash,
+               /* HAVING   */ jsonObject* having_hash,
+               /* ORDER BY */ jsonObject* order_hash,
+               /* LIMIT    */ jsonObject* limit,
+               /* OFFSET   */ jsonObject* offset,
+               /* flags    */ int flags
+);
+
+static int obj_is_true( const jsonObject* obj );
+static int test_json_query( const char* json_query );
+static char* load_query( const char* filename );
+
+int main( int argc, char* argv[] ) {
+
+       // Parse command line
+
+       const char* idl_file_name = NULL;
+       const char* query_file_name = NULL;
+       int verbose = 0;                        // boolean
+
+       int opt;
+       opterr = 0;
+       const char optstring[] = ":f:i:v";
+
+       while( ( opt = getopt( argc, argv, optstring ) ) != -1 ) {
+               switch( opt )
+               {
+                       case 'f' :  // get file name of query
+                               if( query_file_name ) {
+                                       fprintf( stderr, "Multiple input files not allowed\n" );
+                                       return EXIT_FAILURE;
+                               }
+                               else
+                                       query_file_name = optarg;
+                               break;
+                       case 'i' :  // get name of IDL file
+                               if( idl_file_name ) {
+                                       fprintf( stderr, "Multiple IDL file names not allowed\n" );
+                                       return EXIT_FAILURE;
+                               }
+                               else
+                                       idl_file_name = optarg;
+                               break;
+                       case 'v' :  // Verbose
+                               verbose = 1;
+                               break;
+                       case '?' :  // Invalid option
+                               fprintf( stderr, "Invalid option '-%c' on command line\n",
+                                                (char) optopt );
+                               return EXIT_FAILURE;
+                       default :  // Huh?
+                               fprintf( stderr, "Internal error: unexpected value '%c'"
+                                               "for optopt", (char) optopt );
+                               return EXIT_FAILURE;
+
+               }
+       }
+
+       // If the command line doesn't specify an IDL file, get it
+       // from an environmental variable, or apply a default
+       if( NULL == idl_file_name ) {
+               idl_file_name = getenv( "OILS_IDL_FILENAME" );
+               if( NULL == idl_file_name )
+                       idl_file_name = "/openils/conf/fm_IDL.xml";
+       }
+
+       if( verbose )
+               printf( "IDL file: %s\n", idl_file_name );
+
+       char* loaded_json = NULL;
+       const char* json_query = NULL;
+
+       // Get the JSON query into a string
+       if( query_file_name ) {   // Got a file?  Load it
+               if( optind < argc )
+                       fprintf( stderr, "Extra parameter(s) ignored\n" );
+               loaded_json = load_query( query_file_name );
+               if( !loaded_json ) 
+                       return EXIT_FAILURE;
+               json_query = loaded_json;
+       } else {                  // No file?  Use command line parameter
+               if ( optind == argc ) {
+                       fprintf( stderr, "No JSON query specified\n" );
+                       return EXIT_FAILURE;
+               } else
+                       json_query = argv[ optind ];
+       }
+
+       if( verbose )
+               printf( "JSON query: %s\n", json_query );
+
+       osrfLogSetLevel( OSRF_LOG_WARNING );    // Suppress informational messages
+       (void) oilsIDLInit( idl_file_name );    // Load IDL into memory
+
+       // Translate the JSON into SQL
+       int rc = test_json_query( json_query );
+
+       if( loaded_json )
+               free( loaded_json );
+
+       return rc ? EXIT_FAILURE : EXIT_SUCCESS;
+}
+
+static int test_json_query( const char* json_query ) {
+
+       jsonObject* hash = jsonParseString( json_query );
+       if( !hash ) {
+               fprintf( stderr, "Invalid JSON\n" );
+               return -1;
+       }
+       
+       int flags = 0;
+
+       if ( obj_is_true( jsonObjectGetKey( hash, "distinct" ) ) )
+               flags |= SELECT_DISTINCT;
+
+       if ( obj_is_true( jsonObjectGetKey( hash, "no_i18n" ) ) )
+               flags |= DISABLE_I18N;
+
+       char* sql_query = SELECT(
+               NULL,
+               jsonObjectGetKey( hash, "select" ),
+               jsonObjectGetKey( hash, "from" ),
+               jsonObjectGetKey( hash, "where" ),
+               jsonObjectGetKey( hash, "having" ),
+               jsonObjectGetKey( hash, "order_by" ),
+               jsonObjectGetKey( hash, "limit" ),
+               jsonObjectGetKey( hash, "offset" ),
+               flags
+       );
+
+       if ( !sql_query ) {
+               fprintf( stderr, "Invalid query\n" );
+               return -1;
+       }
+       else
+               printf( "%s\n", sql_query );
+
+       free( sql_query );
+       jsonObjectFree( hash );
+       return 0;
+}
+
+// Interpret a jsonObject as true or false
+static int obj_is_true( const jsonObject* obj ) {
+       if( !obj )
+               return 0;
+       else switch( obj->type )
+       {
+               case JSON_BOOL :
+                       if( obj->value.b )
+                               return 1;
+                       else
+                               return 0;
+               case JSON_STRING :
+                       if( strcasecmp( obj->value.s, "true" ) )
+                               return 0;
+                       else
+                               return 1;
+                       case JSON_NUMBER :          // Support 1/0 for perl's sake
+                               if( jsonObjectGetNumber( obj ) == 1.0 )
+                                       return 1;
+                               else
+                                       return 0;
+               default :
+                       return 0;
+       }
+}
+
+static char* load_query( const char* filename ) {
+       FILE* fp;
+
+       // Sanity check
+       if( ! filename || ! *filename ) {
+               fprintf( stderr, "Name of query file is empty or missing\n" );
+               return NULL;
+       }
+
+       // Open query file, or use standard input
+       if( ! strcmp( filename, "-" ) )
+               fp = stdin;
+       else {
+               fp = fopen( filename, "r" );
+               if( !fp ) {
+                       fprintf( stderr, "Unable to open query file \"%s\"\n", filename );
+                       return NULL;
+               }
+       }
+
+       // Load file into a growing_buffer
+       size_t num_read;
+       char buf[ BUFSIZ + 1 ];
+       growing_buffer* gb = buffer_init( sizeof( buf ) );
+
+    while( ( num_read = fread( buf, 1, sizeof( buf ) - 1, fp ) ) ) {
+               buf[ num_read ] = '\0';
+               buffer_add( gb, buf );
+       }
+
+       if( fp != stdin )
+               fclose( fp );
+
+       return buffer_release( gb );
+}
index 79bf8fb..3fcc297 100755 (executable)
@@ -58,6 +58,7 @@ $SQL = <<'SQL';
 SELECT  id,
         tcn_source,
         tcn_value,
+        deleted,
         REGEXP_REPLACE(marc, E'\\n','','g') AS marc
   FROM  biblio.record_entry
   WHERE id = ?
index 77deb2d..1d31af5 100644 (file)
        <event code='1712' textcode='AUTH_QUEUE_EXISTS'>
                <desc xml:lang="en-US">An authority record queue with the same name already exists</desc>
        </event>
+       <event code='1713' textcode='SURVEY_RESPONSES_EXIST'>
+               <desc xml:lang="en-US">Responses to this survey exist</desc>
+       </event>
 
 
        <event code='2000' textcode='BAD_PARAMS'>
index 475ead0..36c78c6 100644 (file)
@@ -6,6 +6,7 @@ use OpenSRF::System;
 use OpenILS::Utils::Fieldmapper;
 use OpenSRF::Utils::SettingsClient;
 use Unicode::Normalize;
+use Data::Dumper;
 
 die "usage: perl org_tree_html_options.pl <bootstrap_config> <output_file>" unless $ARGV[1];
 OpenSRF::System->bootstrap_client(config_file => $ARGV[0]);
@@ -17,6 +18,12 @@ Fieldmapper->import(IDL => OpenSRF::Utils::SettingsClient->new->config_value("ID
 my $ses = OpenSRF::AppSession->create("open-ils.actor");
 my $tree = $ses->request("open-ils.actor.org_tree.retrieve")->gather(1);
 
+my @types;
+my $aout = $ses->request("open-ils.actor.org_types.retrieve")->gather(1);
+foreach my $type (@$aout) {
+       $types[int($type->id)] = $type;
+}
+
 print_option($tree);
 
 $ses->disconnect();
@@ -28,7 +35,7 @@ sub print_option {
        my $node = shift;
        return unless ($node->opac_visible =~ /^[y1t]+/i);
 
-       my $depth = $node->ou_type - 1;
+       my $depth = $types[$node->ou_type]->depth;
        my $sname = entityize($node->shortname);
        my $name = entityize($node->name);
        my $kids = $node->children;
index 010f9c7..39c3fda 100644 (file)
@@ -2065,8 +2065,7 @@ sub user_transaction_history {
 
        $e->rollback;
 
-       #my @mbts = _make_mbts( @xacts );
-       my @mbts = $U->make_mbts( @xacts );
+       my @mbts = $U->make_mbts( $e, @xacts );
 
        if(defined($type)) {
                @mbts = grep { $_->xact_type eq $type } @mbts;
index 74ef512..9167617 100644 (file)
@@ -17,10 +17,15 @@ sub initialize { return 1; }
 my $svc = 'open-ils.cstore';
 my $meth = 'open-ils.cstore.direct.container';
 my %types;
+my %ctypes;
 $types{'biblio'} = "$meth.biblio_record_entry_bucket";
 $types{'callnumber'} = "$meth.call_number_bucket";
 $types{'copy'} = "$meth.copy_bucket";
 $types{'user'} = "$meth.user_bucket";
+$ctypes{'biblio'} = "container_biblio_record_entry_bucket";
+$ctypes{'callnumber'} = "container_call_number_bucket";
+$ctypes{'copy'} = "container_copy_bucket";
+$ctypes{'user'} = "container_user_bucket";
 my $event;
 
 sub _sort_buckets {
@@ -40,21 +45,19 @@ __PACKAGE__->register_method(
        NOTES
 
 sub bucket_retrieve_all {
-       my($self, $client, $authtoken, $userid) = @_;
-
-       my( $staff, $evt ) = $apputils->checkses($authtoken);
-       return $evt if $evt;
-
-       my( $user, $e ) = $apputils->checkrequestor( $staff, $userid, 'VIEW_CONTAINER');
-       return $e if $e;
-
-       $logger->debug("User " . $staff->id . 
-               " retrieving all buckets for user $userid");
-
+       my($self, $client, $auth, $user_id) = @_;
+    my $e = new_editor(authtoken => $auth);
+    return $e->event unless $e->checkauth;
+
+    if($e->requestor->id ne $user_id) {
+        return $e->event unless $e->allowed('VIEW_CONTAINER');
+    }
+    
        my %buckets;
-
-       $buckets{$_} = $apputils->simplereq( 
-               $svc, $types{$_} . ".search.atomic", { owner => $userid } ) for keys %types;
+    for my $type (keys %ctypes) {
+        my $meth = "search_" . $ctypes{$type};
+           $buckets{$type} = $e->$meth({owner => $user_id});
+    }
 
        return \%buckets;
 }
@@ -63,67 +66,88 @@ __PACKAGE__->register_method(
        method  => "bucket_flesh",
        api_name        => "open-ils.actor.container.flesh",
        argc            => 3, 
-       notes           => <<"  NOTES");
-               Fleshes a bucket by id
-               PARAMS(authtoken, bucketClass, bucketId)
-               bucketclasss include biblio, callnumber, copy, and user.  
-               bucketclass defaults to biblio.
-               If requestor ID is different than bucketOwnerId, requestor must have
-               VIEW_CONTAINER permissions.
-       NOTES
-
-sub bucket_flesh {
-
-       my($self, $client, $authtoken, $class, $bucket) = @_;
+);
 
-       my( $staff, $evt ) = $apputils->checkses($authtoken);
-       return $evt if $evt;
+__PACKAGE__->register_method(
+       method  => "bucket_flesh_pub",
+       api_name        => "open-ils.actor.container.public.flesh",
+       argc            => 3, 
+);
 
-       $logger->debug("User " . $staff->id . " retrieving bucket $bucket");
+sub bucket_flesh {
+       my($self, $conn, $auth, $class, $bucket_id) = @_;
+    my $e = new_editor(authtoken => $auth);
+    return $e->event unless $e->checkauth;
+    return _bucket_flesh($self, $conn, $e, $class, $bucket_id);
+}
 
-       my $meth = $types{$class};
+sub bucket_flesh_pub {
+    my($self, $conn, $class, $bucket_id) = @_;
+    my $e = new_editor();
+    return _bucket_flesh($self, $conn, $e, $class, $bucket_id);
+}
 
-       my $bkt = $apputils->simplereq( $svc, "$meth.retrieve", $bucket );
-       #if(!$bkt) {return undef};
-       return OpenILS::Event->new('CONTAINER_NOT_FOUND', payload=>$bucket) unless $bkt;
+sub _bucket_flesh {
+       my($self, $conn, $e, $class, $bucket_id) = @_;
+       my $meth = 'retrieve_' . $ctypes{$class};
+    my $bkt = $e->$meth($bucket_id) or return $e->event;
 
-       if(!$bkt->pub) {
-               my( $user, $e ) = $apputils->checkrequestor( $staff, $bkt->owner, 'VIEW_CONTAINER' );
-               return $e if $e;
+       unless($U->is_true($bkt->pub)) {
+        return undef if $self->api_name =~ /public/;
+        unless($bkt->owner eq $e->requestor->id) {
+            return $e->event unless $e->allowed('VIEW_CONTAINER', $bkt);
+        }
        }
 
-       $bkt->items( $apputils->simplereq( $svc,
-               "$meth"."_item.search.atomic", { bucket => $bucket } ) );
+    my $fmclass = $bkt->class_name . "i";
+    $meth = 'search_' . $ctypes{$class} . '_item';
+       $bkt->items(
+        $e->$meth(
+            {bucket => $bucket_id}, 
+            {   order_by => {$fmclass => "pos"},
+                flesh => 1, 
+                flesh_fields => {cbrebi => ['notes']}
+            }
+        )
+    );
 
        return $bkt;
 }
 
 
 __PACKAGE__->register_method(
-       method  => "bucket_flesh_public",
-       api_name        => "open-ils.actor.container.public.flesh",
-       argc            => 3, 
-       notes           => <<"  NOTES");
-               Fleshes a bucket by id
-               PARAMS(authtoken, bucketClass, bucketId)
-               bucketclasss include biblio, callnumber, copy, and user.  
-               bucketclass defaults to biblio.
-               If requestor ID is different than bucketOwnerId, requestor must have
-               VIEW_CONTAINER permissions.
-       NOTES
-
-sub bucket_flesh_public {
-
-       my($self, $client, $class, $bucket) = @_;
-
-       my $meth = $types{$class};
-       my $bkt = $apputils->simplereq( $svc, "$meth.retrieve", $bucket );
-       return undef unless ($bkt and $bkt->pub);
+       method  => "item_note_cud",
+       api_name        => "open-ils.actor.container.item_note.cud",
+);
 
-       $bkt->items( $apputils->simplereq( $svc,
-               "$meth"."_item.search.atomic", { bucket => $bucket } ) );
 
-       return $bkt;
+sub item_note_cud {
+    my($self, $conn, $auth, $class, $note) = @_;
+    my $e = new_editor(authtoken => $auth, xact => 1);
+    return $e->die_event unless $e->checkauth;
+
+    my $meth = 'retrieve_' . $ctypes{$class};
+    my $nclass = $note->class_name;
+    (my $iclass = $nclass) =~ s/n$//og;
+
+    my $db_note = $e->$meth($note->id, {
+        flesh => 2,
+        flesh_fields => {
+            $nclass => ['item'],
+            $iclass => ['bucket']
+        }
+    });
+
+    if($db_note->item->bucket->owner ne $e->requestor->id) {
+        return $e->die_event unless 
+            $e->allowed('UPDATE_CONTAINER', $db_note->item->bucket);
+    }
+
+    $meth = 'create_' . $ctypes{$class} if $note->isnew;
+    $meth = 'update_' . $ctypes{$class} if $note->ischanged;
+    $meth = 'delete_' . $ctypes{$class} if $note->isdeleted;
+    return $e->die_event unless $e->$meth($note);
+    $e->commit;
 }
 
 
@@ -318,21 +342,37 @@ sub __item_delete {
 
        my $stat;
        if( $class eq 'copy' ) {
+        for my $note (@{$e->search_container_copy_bucket_item_note({item => $item->id})}) {
+            return $e->event unless 
+                $e->delete_container_copy_bucket_item_note($note);
+        }
                return $e->event unless
                        $stat = $e->delete_container_copy_bucket_item($item);
        }
 
        if( $class eq 'callnumber' ) {
+        for my $note (@{$e->search_container_call_number_bucket_item_note({item => $item->id})}) {
+            return $e->event unless 
+                $e->delete_container_call_number_bucket_item_note($note);
+        }
                return $e->event unless
                        $stat = $e->delete_container_call_number_bucket_item($item);
        }
 
        if( $class eq 'biblio' ) {
+        for my $note (@{$e->search_container_biblio_record_entry_bucket_item_note({item => $item->id})}) {
+            return $e->event unless 
+                $e->delete_container_biblio_record_entry_bucket_item_note($note);
+        }
                return $e->event unless
                        $stat = $e->delete_container_biblio_record_entry_bucket_item($item);
        }
 
        if( $class eq 'user') {
+        for my $note (@{$e->search_container_user_bucket_item_note({item => $item->id})}) {
+            return $e->event unless 
+                $e->delete_container_user_bucket_item_note($note);
+        }
                return $e->event unless
                        $stat = $e->delete_container_user_bucket_item($item);
        }
index f500015..18db01d 100644 (file)
@@ -856,6 +856,14 @@ sub storagereq {
                'open-ils.storage', $method, @params );
 }
 
+sub storagereq_xact {
+       my($self, $method, @params) = @_;
+       my $ses = $self->start_db_session();
+       my $val = $ses->request($method, @params)->gather(1);
+       $self->rollback_db_session($ses);
+    return $val;
+}
+
 sub cstorereq {
        my( $self, $method, @params ) = @_;
        return $self->simplereq(
@@ -1149,20 +1157,13 @@ sub patron_total_items_out {
 sub fetch_mbts {
        my $self = shift;
        my $id  = shift;
-       my $editor = shift || OpenILS::Utils::CStoreEditor->new;
-
-       $id = $id->id if (ref($id));
-
-       my $xact = $editor->retrieve_money_billable_transaction(
-               [
-                       $id, {  
-                               flesh => 1, 
-                               flesh_fields => { mbt => [ qw/billings payments grocery circulation/ ] } 
-                       }
-               ]
-       ) or return (undef, $editor->event);
+       my $e = shift || OpenILS::Utils::CStoreEditor->new;
+       $id = $id->id if ref($id);
+    
+    my $xact = $e->retrieve_money_billable_transaction_summary($id)
+           or return (undef, $e->event);
 
-       return $self->make_mbts($xact);
+    return ($xact);
 }
 
 
@@ -1172,59 +1173,9 @@ sub fetch_mbts {
 #--------------------------------------------------------------------
 sub make_mbts {
        my $self = shift;
+    my $e = shift;
        my @xacts = @_;
-
-       my @mbts;
-       for my $x (@xacts) {
-
-               my $s = new Fieldmapper::money::billable_transaction_summary;
-
-               $s->id( $x->id );
-               $s->usr( $x->usr );
-               $s->xact_start( $x->xact_start );
-               $s->xact_finish( $x->xact_finish );
-               
-               my $to = 0;
-               my $lb = undef;
-               for my $b (@{ $x->billings }) {
-                       next if ($self->is_true($b->voided));
-                       $to += ($b->amount * 100);
-                       $lb ||= $b->billing_ts;
-                       if ($b->billing_ts ge $lb) {
-                               $lb = $b->billing_ts;
-                               $s->last_billing_note($b->note);
-                               $s->last_billing_ts($b->billing_ts);
-                               $s->last_billing_type($b->billing_type);
-                       }
-               }
-
-               $s->total_owed( sprintf('%0.2f', $to / 100 ) );
-               
-               my $tp = 0;
-               my $lp = undef;
-               for my $p (@{ $x->payments }) {
-                       next if ($self->is_true($p->voided));
-                       $tp += ($p->amount * 100);
-                       $lp ||= $p->payment_ts;
-                       if ($p->payment_ts ge $lp) {
-                               $lp = $p->payment_ts;
-                               $s->last_payment_note($p->note);
-                               $s->last_payment_ts($p->payment_ts);
-                               $s->last_payment_type($p->payment_type);
-                       }
-               }
-
-               $s->total_paid( sprintf('%0.2f', $tp / 100 ) );
-               $s->balance_owed( sprintf('%0.2f', ($to - $tp) / 100) );
-               $s->xact_type('grocery') if ($x->grocery);
-               $s->xact_type('circulation') if ($x->circulation);
-
-               $logger->debug("Created mbts with balance_owed = ". $s->balance_owed);
-               
-               push @mbts, $s;
-       }
-               
-       return @mbts;
+    return @{$e->search_money_billable_transaction_summary({id => [ map { $_->id } @xacts ]})};
 }
                
                
index 0fccc00..f0fb799 100644 (file)
@@ -197,6 +197,7 @@ sub run_method {
         # overrides have been performed.  Go ahead and re-override.
         $circulator->override(1) if $circulator->request_precat;
         $circulator->do_permit();
+        $circulator->is_checkout(1);
         unless( $circulator->bail_out ) {
             $circulator->events([]);
             $circulator->do_checkout();
@@ -208,6 +209,7 @@ sub run_method {
         return $data;
 
     } elsif( $api =~ /checkout/ ) {
+        $circulator->is_checkout(1);
         $circulator->do_checkout();
 
     } elsif( $api =~ /checkin/ ) {
@@ -244,6 +246,7 @@ sub run_method {
         $circulator->do_hold_notify($circulator->notify_hold)
             if $circulator->notify_hold;
         $circulator->retarget_holds if $circulator->retarget;
+        $circulator->append_reading_list;
     }
 }
 
@@ -339,6 +342,7 @@ my @AUTOLOAD_FIELDS = qw/
     volume
     title
     is_renewal
+    is_checkout
     is_noncat
     is_precat
     request_precat
@@ -1133,7 +1137,6 @@ sub do_checkout {
     }
 
     if( $self->is_precat ) {
-        #$self->script_runner->insert("environment.isPrecat", 1, 1)
         $self->make_precat_copy;
         return if $self->bail_out;
 
@@ -2257,7 +2260,6 @@ sub log_me {
 sub do_renew {
     my $self = shift;
     $self->log_me("do_renew()");
-    $self->is_renewal(1);
 
     # Make sure there is an open circ to renew that is not
     # marked as LOST, CLAIMSRETURNED, or LONGOVERDUE
@@ -2359,5 +2361,67 @@ sub run_renew_permit {
 }
 
 
+sub append_reading_list {
+    my $self = shift;
+
+    return undef unless 
+        $self->is_checkout and 
+        $self->patron and 
+        $self->copy and 
+        !$self->is_noncat;
+
+    my $e = new_editor(xact => 1, requestor => $self->editor->requestor);
+
+    # verify history is globally enabled and uses the bucket mechanism
+    my $htype = OpenSRF::Utils::SettingsClient->new->config_value(
+        apps => 'open-ils.circ' => app_settings => 'checkout_history_mechanism');
+
+    unless($htype eq 'bucket') {
+        $e->rollback;
+        return undef;
+    }
+
+    # verify the patron wants to retain the hisory
+       my $setting = $e->search_actor_user_setting(
+               {usr => $self->patron->id, name => 'circ.keep_checkout_history'})->[0];
+    
+    unless($setting and $setting->value) {
+        $e->rollback;
+        return undef;
+    }
+
+    my $bkt = $e->search_container_copy_bucket(
+        {owner => $self->patron->id, btype => 'circ_history'})->[0];
+
+    my $pos = 1;
+
+    if($bkt) {
+        # find the next item position
+        my $last_item = $e->search_container_copy_bucket_item(
+            {bucket => $bkt->id}, {order_by => {ccbi => 'pos desc'}, limit => 1})->[0];
+        $pos = $last_item->pos + 1 if $last_item;
+
+    } else {
+        # create the history bucket if necessary
+        $bkt = Fieldmapper::container::copy_bucket->new;
+        $bkt->owner($self->patron->id);
+        $bkt->name('');
+        $bkt->btype('reading_list');
+        $bkt->pub('f');
+        $e->create_container_copy_bucket($bkt) or return $e->die_event;
+    }
+
+    my $item = Fieldmapper::container::copy_bucket_item->new;
+
+    $item->bucket($bkt->id);
+    $item->target_copy($self->copy->id);
+    $item->pos($pos);
+
+    $e->create_container_copy_bucket_item($item) or return $e->die_event;
+    $e->commit;
+
+    return undef;
+}
+
 
 
index d12f82e..b777ec4 100644 (file)
@@ -323,11 +323,12 @@ different from the user, then the requestor must have VIEW_HOLD permissions.
 NOTE
 
 sub retrieve_holds {
-       my($self, $client, $auth, $user_id) = @_;
+       my($self, $client, $auth, $user_id, $options) = @_;
 
     my $e = new_editor(authtoken=>$auth);
     return $e->event unless $e->checkauth;
     $user_id = $e->requestor->id unless defined $user_id;
+    $options ||= {};
 
     unless($user_id == $e->requestor->id) {
         my $user = $e->retrieve_actor_user($user_id) or return $e->event;
@@ -345,6 +346,21 @@ sub retrieve_holds {
                }, 
                {order_by => {ahr => "request_time"}}
        ]);
+
+    if($$options{canceled}) {
+        my $count = $$options{cancel_count} || 
+            $U->ou_ancestor_setting_value($e->requestor->ws_ou, 
+                'circ.canceled_hold_display_count', $e) || 5;
+
+        my $canceled = $e->search_action_hold_request([
+                   {   usr =>  $user_id , 
+                           fulfillment_time => undef,
+                           cancel_time => {'!=' => undef},
+                   }, 
+                   {order_by => {ahr => "cancel_time desc"}, limit => $count}
+           ]);
+        push(@$holds, @$canceled);
+    }
        
        if( ! $self->api_name =~ /id_list/ ) {
                for my $hold ( @$holds ) {
@@ -438,6 +454,46 @@ sub retrieve_holds_by_pickup_lib {
        }
 }
 
+
+__PACKAGE__->register_method(
+       method  => "uncancel_hold",
+       api_name        => "open-ils.circ.hold.uncancel"
+);
+
+sub uncancel_hold {
+       my($self, $client, $auth, $hold_id) = @_;
+       my $e = new_editor(authtoken=>$auth, xact=>1);
+       return $e->event unless $e->checkauth;
+
+       my $hold = $e->retrieve_action_hold_request($hold_id)
+               or return $e->die_event;
+    return $e->die_event unless $e->allowed('CANCEL_HOLDS', $hold->request_lib);
+
+    return 0 if $hold->fulfillment_time;
+    return 1 unless $hold->cancel_time;
+
+    # if configured to reset the request time, also reset the expire time
+    if($U->ou_ancestor_setting_value(
+        $hold->request_lib, 'circ.hold_reset_request_time_on_uncancel', $e)) {
+
+        $hold->request_time('now');
+        my $interval = $U->ou_ancestor_setting_value($hold->request_lib, OILS_SETTING_HOLD_EXPIRE);
+        if($interval) {
+            my $date = DateTime->now->add(seconds => OpenSRF::Utils::interval_to_seconds($interval));
+            $hold->expire_time($U->epoch2ISO8601($date->epoch));
+        }
+    }
+
+    $hold->clear_cancel_time;
+    $e->update_action_hold_request($hold) or return $e->die_event;
+    $e->commit;
+
+    $U->storagereq('open-ils.storage.action.hold_request.copy_targeter', undef, $hold_id);
+
+    return 1;
+}
+
+
 __PACKAGE__->register_method(
        method  => "cancel_hold",
        api_name        => "open-ils.circ.hold.cancel",
@@ -449,7 +505,7 @@ __PACKAGE__->register_method(
        NOTE
 
 sub cancel_hold {
-       my($self, $client, $auth, $holdid) = @_;
+       my($self, $client, $auth, $holdid, $cause, $note) = @_;
 
        my $e = new_editor(authtoken=>$auth, xact=>1);
        return $e->event unless $e->checkauth;
@@ -496,6 +552,8 @@ sub cancel_hold {
        }
 
        $hold->cancel_time('now');
+    $hold->cancel_cause($cause);
+    $hold->cancel_note($note);
        $e->update_action_hold_request($hold)
                or return $e->event;
 
index 643d5e6..4631b8b 100644 (file)
@@ -19,6 +19,7 @@ use strict; use warnings;
 use OpenSRF::EX qw/:try/;
 use OpenILS::Application::AppUtils;
 use Data::Dumper;
+use OpenILS::Event;
 use Time::HiRes qw(time);
 use OpenILS::Utils::CStoreEditor qw/:funcs/;
 
@@ -395,17 +396,52 @@ sub get_random_survey_global {
 }
 
 
+__PACKAGE__->register_method (
+       method          => 'delete_survey',
+       api_name        => 'open-ils.circ.survey.delete.cascade'
+);
+__PACKAGE__->register_method (
+       method          => 'delete_survey',
+       api_name        => 'open-ils.circ.survey.delete.cascade.override'
+);
 
+sub delete_survey {
+    my($self, $conn, $auth, $survey_id) = @_;
+    my $e = new_editor(authtoken => $auth, xact => 1);
+    return $e->die_event unless $e->checkauth;
 
+    my $survey = $e->retrieve_action_survey($survey_id) 
+        or return $e->die_event;
+    return $e->die_event unless $e->allowed('ADMIN_SURVEY', $survey->owner);
 
+    my $questions = $e->search_action_survey_question({survey => $survey_id});
+    my @answers;
+    push(@answers, @{$e->search_action_survey_answer({question => $_->id})}) for @$questions;
+    my $responses = $e->search_action_survey_response({survey => $survey_id});
 
+    return OpenILS::Event->new('SURVEY_RESPONSES_EXIST')
+        if @$responses and $self->api_name =! /override/;
 
+    for my $resp (@$responses) {
+        $e->delete_action_survey_response($resp) or return $e->die_event;
+    }
 
+    for my $ans (@answers) {
+        $e->delete_action_survey_answer($ans) or return $e->die_event;
+    }
 
+    for my $quest (@$questions) {
+        $e->delete_action_survey_question($quest) or return $e->die_event;
+    }
 
-1;
+    $e->delete_action_survey($survey) or return $e->die_event;
+
+    $e->commit;
+    return 1;
+}
 
 
 
 
 
+1;
index 208d3a5..c8335b4 100644 (file)
@@ -93,9 +93,9 @@ use base qw/action/;
 __PACKAGE__->table('action_hold_request');
 __PACKAGE__->columns(Primary => 'id');
 __PACKAGE__->columns(Essential => qw/request_time capture_time fulfillment_time
-                                    prev_check_time expire_time requestor usr
+                                    prev_check_time expire_time requestor usr cancel_cause
                                     hold_type holdable_formats target cancel_time
-                                    phone_notify email_notify selection_depth
+                                    phone_notify email_notify selection_depth cancel_note
                                     pickup_lib current_copy request_lib frozen thaw_date
                                     fulfillment_staff fulfillment_lib selection_ou/);
 
index 226e73a..d7623d0 100644 (file)
                if (my $old_xact = $pg->current_xact_session) {
                        if ($pg->current_xact_is_auto) {
                                $log->debug("Commiting old autocommit transaction with Open-ILS XACT-ID [$old_xact]", INFO);
-                               $self->pg_commit_xaction($client);
+                               $self->method_lookup("open-ils.storage.transaction.commit")->run();
                        } else {
                                $log->debug("Rolling back old NON-autocommit transaction with Open-ILS XACT-ID [$old_xact]", INFO);
-                               $self->pg_rollback_xaction($client);
+                               $self->method_lookup("open-ils.storage.transaction.rollback")->run();
                                throw OpenSRF::DomainObject::oilsException->new(
                                                statusCode => 500,
                                                status => "Previous transaction rolled back!",
index 5e90be8..8a94957 100644 (file)
@@ -890,7 +890,7 @@ sub new_hold_copy_targeter {
 
                        if ($hold->expire_time) {
                                my $ex_time = $parser->parse_datetime( clense_ISO8601( $hold->expire_time ) );
-                               $hold->update( { cancel_time => 'now' } ) if ( DateTime->compare($ex_time, DateTime->now) < 0 );
+                               $hold->update( { cancel_cause => 1, cancel_time => 'now' } ) if ( DateTime->compare($ex_time, DateTime->now) < 0 );
                                $self->method_lookup('open-ils.storage.transaction.commit')->run;
                        }
 
index 4aa8539..1d28e18 100644 (file)
@@ -484,10 +484,10 @@ sub patron_search {
        # group 2 = phone, ident
        # group 3 = barcode
 
-       my $usr = join ' AND ', map { "LOWER($_) ~ ?" } grep { ''.$$search{$_}{group} eq '0' } keys %$search;
+       my $usr = join ' AND ', map { "LOWER(CAST($_ AS text)) ~ ?" } grep { ''.$$search{$_}{group} eq '0' } keys %$search;
        my @usrv = map { "^$$search{$_}{value}" } grep { ''.$$search{$_}{group} eq '0' } keys %$search;
 
-       my $addr = join ' AND ', map { "LOWER($_) ~ ?" } grep { ''.$$search{$_}{group} eq '1' } keys %$search;
+       my $addr = join ' AND ', map { "LOWER(CAST($_ AS text)) ~ ?" } grep { ''.$$search{$_}{group} eq '1' } keys %$search;
        my @addrv = map { "^$$search{$_}{value}" } grep { ''.$$search{$_}{group} eq '1' } keys %$search;
 
        my $pv = $$search{phone}{value};
@@ -563,8 +563,8 @@ sub patron_search {
 
        return undef if (!$select && !$card);
 
-       my $order_by = join ', ', map { 'LOWER(users.'. (split / /,$_)[0] . ') ' . (split / /,$_)[1] } @$sort;
-       my $distinct_list = join ', ', map { 'LOWER(users.'. (split / /,$_)[0] . ')' } @$sort;
+       my $order_by = join ', ', map { 'LOWER(CAST(users.'. (split / /,$_)[0] . ' AS text)) ' . (split / /,$_)[1] } @$sort;
+       my $distinct_list = join ', ', map { 'LOWER(CAST(users.'. (split / /,$_)[0] . ' AS text))' } @$sort;
 
        if ($inactive) {
                $inactive = '';
index b2f47d9..dc18147 100644 (file)
@@ -7,10 +7,15 @@ use OpenSRF::EX qw/:try/;
 use OpenSRF::AppSession;
 use OpenSRF::Utils::SettingsClient;
 use OpenSRF::Utils::Logger qw/:level/;
+use OpenSRF::Utils qw/:datetime/;
+
+use DateTime;
+use DateTime::Format::ISO8601;
 
 use OpenILS::Utils::Fieldmapper;
 use OpenILS::Utils::CStoreEditor q/:funcs/;
 use OpenILS::Application::Trigger::Event;
+use OpenILS::Application::Trigger::EventGroup;
 
 
 my $log = 'OpenSRF::Utils::Logger';
@@ -18,4 +23,219 @@ my $log = 'OpenSRF::Utils::Logger';
 sub initialize {}
 sub child_init {}
 
+sub create_events_for_object {
+    my $self = shift;
+    my $client = shift;
+    my $key = shift;
+    my $target = shift;
+    my $location = shift;
+
+    my $ident = $target->Identity;
+    my $ident_value = $target->$ident();
+
+    my $editor = new_editor(xact=>1);
+
+    my $hooks = $editor->search_action_trigger_hook(
+        { key       => $key,
+          core_type => $target->json_hint
+        }
+    );
+
+    my %hook_hash = map { ($_->id, $_) } @$hooks;
+
+    my $orgs = $editor->json_query({ from => [ 'actor.org_unit_ancestors' => $location ] });
+    my $defs = $editor->search_action_trigger_event_definition([
+        { hook   => [ keys %hook_hash ],
+          owner  => [ map { $_->{id} } @$orgs  ],
+          active => 't'
+        },
+        { idlist => 1 }
+    ]);
+
+    for my $def ( @$defs ) {
+
+        my $date = DateTime->now;
+
+        if ($hook_hash{$def->hook}->passive eq 'f') {
+
+            if (my $dfield = $def->delay_field) {
+                if ($target->$dfield()) {
+                    $date = DateTime::Format::ISO8601->new->parse_datetime( clense_ISO8601($target->$dfield) );
+                } else {
+                    next;
+                }
+            }
+
+            $date->add( seconds => interval_to_seconds($def->delay) );
+        }
+
+        my $event = Fieldmapper::action_trigger::event->new();
+        $event->target( $ident_value );
+        $event->event_def( $def->id );
+        $event->run_time( $date->strftime( '%G %T%z' ) );
+
+        $event = $editor->create_action_trigger_event( $event );
+
+        $client->respond( $event->id );
+    }
+
+    $editor->commit;
+
+    return undef;
+}
+__PACKAGE__->register_method(
+    api_name => 'open-ils.trigger.event.autocreate',
+    method   => 'create_events_for_object',
+    api_level=> 1,
+    stream   => 1,
+    argc     => 3
+);
+
+
+sub fire_single_event {
+    my $self = shift;
+    my $client = shift;
+    my $event_id = shift;
+
+    my $e = OpenILS::Application::Trigger::Event->new($event_id);
+
+    if ($e->validate->valid) {
+        $e->react->cleanup;
+    }
+
+    return {
+        valid     => $e->valid,
+        reacted   => $e->reacted,
+        cleanedup => $e->cleanedup,
+        event     => $e->event
+    };
+}
+__PACKAGE__->register_method(
+    api_name => 'open-ils.trigger.event.fire',
+    method   => 'fire_single_event',
+    api_level=> 1,
+    argc     => 1
+);
+
+sub fire_event_group {
+    my $self = shift;
+    my $client = shift;
+    my $events = shift;
+
+    my $e = OpenILS::Application::Trigger::EventGroup->new(@$events);
+
+    if ($e->validate->valid) {
+        $e->react->cleanup;
+    }
+
+    return {
+        valid     => $e->valid,
+        reacted   => $e->reacted,
+        cleanedup => $e->cleanedup,
+        events    => $e->events
+    };
+}
+__PACKAGE__->register_method(
+    api_name => 'open-ils.trigger.event_group.fire',
+    method   => 'fire_event_group',
+    api_level=> 1,
+    argc     => 1
+);
+
+sub pending_events {
+    my $self = shift;
+    my $client = shift;
+
+    my $editor = new_editor();
+
+    return $editor->search_action_trigger_event([
+        { state => 'pending', run_time => {'<' => 'now'} },
+        { idlist=> 1 }
+    ]);
+}
+__PACKAGE__->register_method(
+    api_name => 'open-ils.trigger.event.find_pending',
+    method   => 'pending_events',
+    api_level=> 1
+);
+
+
+sub grouped_events {
+    my $self = shift;
+    my $client = shift;
+
+    my ($events) = $self->method_lookup('open-ils.trigger.event.find_pending')->run();
+
+    my %groups = ( '*' => [] );
+
+    for my $e_id ( @$events ) {
+        my $e = OpenILS::Application::Trigger::Event->new($e_id);
+        if ($e->validate->valid) {
+            if (my $group = $event->event->event_def->group_field) {
+
+                # split the grouping link steps
+                my @steps = split '.', $group;
+
+                # find the grouping object
+                my $node = $event->target;
+                $node = $node->$_() for ( @steps );
+
+                # get the pkey value for the grouping object on this event
+                my $node_ident = $node->Identity;
+                my $ident_value = $node->$node_ident();
+
+                # push this event onto the event+grouping_pkey_value stack
+                $groups{$e->event->event_def->id}{$ident_value} ||= [];
+                push @{ $groups{$e->event->event_def->id}{$ident_value} }, $e;
+            } else {
+                # it's a non-grouped event
+                push @{ $groups{'*'} }, $e;
+            }
+        }
+    }
+
+    return \%groups;
+}
+__PACKAGE__->register_method(
+    api_name => 'open-ils.trigger.event.find_pending_by_group',
+    method   => 'grouped_events',
+    api_level=> 1
+);
+
+sub run_all_events {
+    my $self = shift;
+    my $client = shift;
+
+    my ($groups) = $self->method_lookup('open-ils.trigger.event.find_pending_by_group')->run();
+
+    for my $def ( %$groups ) {
+        if ($def eq '*') {
+            for my $event ( @{ $$groups{'*'} } ) {
+                $client->respond(
+                    $self
+                        ->method_lookup('open-ils.trigger.event.fire')
+                        ->run($event)
+                );
+            }
+        } else {
+            my $defgroup = $$groups{$def};
+            for my $ident ( keys %$defgroup ) {
+                $client->respond(
+                    $self
+                        ->method_lookup('open-ils.trigger.event_group.fire')
+                        ->run($$defgroup{$ident})
+                );
+            }
+        }
+    }
+                
+            
+}
+__PACKAGE__->register_method(
+    api_name => 'open-ils.trigger.event.run_all_pending',
+    method   => 'run_all_events',
+    api_level=> 1
+);
+
+
 1;
index c2df132..2dc28f9 100644 (file)
@@ -12,9 +12,15 @@ my $log = 'OpenSRF::Utils::Logger';
 sub new {
     my $class = shift;
     my $id = shift;
+    my $editor = shift;
     $class = ref($class) || $class;
 
-    my $self = bless { id => $id, editor => new_editor() } => $class;
+    return $id if (ref($id) && ref($id) == $class);
+
+    my $standalone = $editor ? 0 : 1;
+    $editor ||= new_editor();
+
+    my $self = bless { id => $id, editor => $editor, standalone => $standalone } => $class;
 
     return $self->init()
 }
@@ -35,16 +41,41 @@ sub init {
             $self->id, {
                 flesh => 2,
                 flesh_fields => {
-                    atev    => [ 'event_def' ],
-                    atevdef => [ 'hook' ]
+                    atev    => [ qw/event_def/ ],
+                    atevdef => [ qw/hook env params/ ]
                 }
             }
         ])
     );
 
+    if ($self->event->state eq 'valid') {
+        $self->valid(1);
+    } elsif ($self->event->state eq 'invalid') {
+        $self->valid(0);
+    } elsif ($self->event->state eq 'reacting') {
+        $self->valid(1);
+    } elsif ($self->event->state eq 'reacted') {
+        $self->valid(1);
+        $self->reacted(1);
+    } elsif ($self->event->state eq 'cleaning') {
+        $self->valid(1);
+        $self->reacted(1);
+    } elsif ($self->event->state eq 'complete') {
+        $self->valid(1);
+        $self->reacted(1);
+        $self->cleanedup(1);
+    } elsif ($self->event->state eq 'error') {
+        $self->valid(0);
+        $self->reacted(0);
+        $self->cleanedup(0);
+    }
+
+
+    $self->update_state('found') || die 'Unable to update event state';
+
     my $class = $self->_fm_class_by_hint( $self->event->event_def->hook->core_type );
     
-    my $meth = "retreive_" . $class;
+    my $meth = "retrieve_" . $class;
     $meth =~ s/Fieldmapper:://;
     $meth =~ s/::/_/;
     
@@ -55,6 +86,9 @@ sub init {
 
 sub cleanup {
     my $self = shift;
+    my $env = shift || $self->environment;
+
+    return $self if (defined $self->cleanedup);
 
     if (defined $self->reacted) {
         $self->update_state( 'cleaning') || die 'Unable to update event state';
@@ -62,7 +96,7 @@ sub cleanup {
             my $cleanup = $self->reacted ? $self->event->event_def->cleanup_success : $self->event->event_def->cleanup_failure;
             $self->cleanedup(
                 OpenILS::Application::Trigger::ModRunner::Cleanup
-                    ->new( $cleanup, $self->environment )
+                    ->new( $cleanup, $env)
                     ->run
                     ->final_result
             );
@@ -85,6 +119,9 @@ sub cleanup {
 
 sub react {
     my $self = shift;
+    my $env = shift || $self->environment;
+
+    return $self if (defined $self->reacted);
 
     if ($self->valid) {
         if ($self->event->event_def->group_field) { # can't react individually to a grouped definition
@@ -94,7 +131,7 @@ sub react {
             try {
                 $self->reacted(
                     OpenILS::Application::Trigger::ModRunner::Reactor
-                        ->new( $self->event->event_def->reactor, $self->environment )
+                        ->new( $self->event->event_def->reactor, $env )
                         ->run
                         ->final_result
                 );
@@ -213,6 +250,19 @@ sub editor {
     return $self->{editor};
 }
 
+sub unfind {
+    my $self = shift;
+    return undef unless (ref $self);
+
+    die 'Cannot unfind a reacted event' if (defined $self->reacted);
+
+    $self->update_state( 'pending' ) || die 'Unable to update event state';
+    $self->{id} = undef;
+    $self->{event} = undef;
+    $self->{environment} = undef;
+    return $self;
+}
+
 sub target {
     my $self = shift;
     return undef unless (ref $self);
@@ -222,6 +272,15 @@ sub target {
     return $self->{target};
 }
 
+sub standalone {
+    my $self = shift;
+    return undef unless (ref $self);
+
+    my $t = shift;
+    $self->{standalone} = $t if (defined $t);
+    return $self->{standalone};
+}
+
 sub update_state {
     my $self = shift;
     return undef unless ($self && ref $self);
@@ -229,15 +288,35 @@ sub update_state {
     my $state = shift;
     return undef unless ($state);
 
-    $self->editor->xact_begin || return undef;
+    if ($self->standalone) {
+        $self->editor->xact_begin || return undef;
+    }
 
     my $e = $self->editor->retrieve_action_trigger_event( $self->id );
+    $e->start_time( 'now' ) unless $e->start_time;
     $e->update_time( 'now' );
     $e->update_process( $$ );
     $e->state( $state );
-    $self->editor->update_action_trigger_event( $e );
 
-    return $self->editor->xact_commit || undef;
+    $e->clear_start_time() if ($e->state eq 'pending');
+
+    my $ok = $self->editor->update_action_trigger_event( $e );
+    if (!$ok) {
+        $self->editor->xact_rollback if ($self->standalone);
+        return undef;
+    } else {
+        $ok = $self->editor->xact_commit if ($self->standalone);
+    }
+
+    if ($ok) {
+        $e = $self->editor->data;
+        $self->event->start_time( $e->start_time );
+        $self->event->update_time( $e->update_time );
+        $self->event->update_process( $e->update_process );
+        $self->event->state( $e->state );
+    }
+
+    return $ok || undef;
 }
 
 sub build_environment {
@@ -251,19 +330,21 @@ sub build_environment {
         $self->environment->{target} = $self->target;
         $self->environment->{event} = $self->event;
         $self->environment->{template} = $self->event->event_def->template;
+
+        $self->environment->{params}{ $_->param } = eval $_->value for ( @{$self->event->event_def->params} );
     
-        my @env_list = $self->editor->search_action_trigger_environment( { event_def => $self->event->event_def } );
-        my @param_list = $self->editor->search_action_trigger_params( { event_def => $self->event->event_def } );
-    
-        $self->environment->{params}{ $_->param } = eval $_->value for ( @param_list );
-    
-        for my $e ( @env_list ) {
+        for my $e ( @{$self->event->event_def->env} ) {
             my (@label, @path);
             @path = split('.', $e->path) if ($e->path);
             @label = split('.', $e->label) if ($e->label);
     
             $self->_object_by_path( $self->event->target, $e->collector, \@label, \@path );
         }
+
+        if ($self->event->event_def->group_field) {
+            my @group_path = split('.', $self->event->event_def->group_field);
+            my $group_object = $self->_object_by_path( $self->event->target, undef, [], \@group_path );
+        }
     
         $self->environment->{complete} = 1;
     } otherwise {
diff --git a/Open-ILS/src/perlmods/OpenILS/Application/Trigger/EventGroup.pm b/Open-ILS/src/perlmods/OpenILS/Application/Trigger/EventGroup.pm
new file mode 100644 (file)
index 0000000..2c792e4
--- /dev/null
@@ -0,0 +1,242 @@
+package OpenILS::Application::Trigger::EventGroup;
+use OpenILS::Application::Trigger::Event;
+use base 'OpenILS::Application::Trigger::Event';
+use OpenSRF::EX qw/:try/;
+
+use OpenSRF::Utils::Logger qw/:level/;
+
+use OpenILS::Utils::Fieldmapper;
+use OpenILS::Utils::CStoreEditor q/:funcs/;
+use OpenILS::Application::Trigger::ModRunner;
+
+my $log = 'OpenSRF::Utils::Logger';
+
+sub new {
+    my $class = shift;
+    my @ids = @_;
+    $class = ref($class) || $class;
+
+    my $editor = new_editor(xact=>1);
+
+    my $self = bless {
+        environment => {},
+        events      => [
+            map {
+                ref($_) ?
+                    do { $_->standalone(0); $_->editor($editor); $_ } :
+                    OpenILS::Application::Trigger::Event->new($_, $editor)
+            } @ids
+        ],
+        ids         => \@ids,
+        editor      => $editor
+    } => $class;
+
+
+    $self->editor->xact_commit; # flush out those updates
+    $self->editor->xact_begin;
+
+    return $self;
+}
+
+sub react {
+    my $self = shift;
+
+    return $self if (defined $self->reacted);
+
+    if ($self->valid) {
+        $self->update_state( 'reacting') || die 'Unable to update event group state';
+        $self->build_environment;
+
+        try {
+            $self->reacted(
+                OpenILS::Application::Trigger::ModRunner::Reactor
+                    ->new( $self->event->event_def->reactor, $self->environment )
+                    ->run
+                    ->final_result
+            );
+        } otherwise {
+            $log->error( shift() );
+            $self->update_state( 'error' ) || die 'Unable to update event group state';
+        };
+
+        if (defined $self->reacted) {
+            $self->update_state( 'reacted' ) || die 'Unable to update event group state';
+        } else {
+            $self->update_state( 'error' ) || die 'Unable to update event group state';
+        }
+    } else {
+        $self->{reacted} = undef;
+    }
+    return $self;
+}
+
+sub validate {
+    my $self = shift;
+
+    return $self if (defined $self->valid);
+
+    $self->update_state( 'validating') || die 'Unable to update event group state';
+    $self->editor->xact_begin;
+
+    my @valid_events;
+    try {
+        for my $event ( @{ $self->events } ) {
+            $event->validate;
+            push @valid_events, $event if ($event->valid);
+        }
+        $self->valid(1) if (@valid_events);
+        $self->{events} = \@valid_events;
+        $self->editor->xact_commit;
+    } otherwise {
+        $log->error( shift() );
+        $self->editor->xact_rollback;
+        $self->update_state( 'error' ) || die 'Unable to update event group state';
+    };
+
+    return $self;
+}
+sub cleanedup {
+    my $self = shift;
+    return undef unless (ref $self);
+
+    my $c = shift;
+    $self->{cleanedup} = $c if (defined $c);
+    return $self->{cleanedup};
+}
+
+sub reacted {
+    my $self = shift;
+    return undef unless (ref $self);
+
+    my $r = shift;
+    $self->{reacted} = $r if (defined $r);
+    return $self->{reacted};
+}
+
+sub valid {
+    my $self = shift;
+    return undef unless (ref $self);
+
+    my $v = shift;
+    $self->{valid} = $v if (defined $v);
+    return $self->{valid};
+}
+
+sub event {
+    my $self = shift;
+    return undef unless (ref $self);
+
+    return $self->{events}[0];
+}
+
+sub events {
+    my $self = shift;
+    return undef unless (ref $self);
+
+    return $self->{events};
+}
+
+sub ids {
+    my $self = shift;
+    return undef unless (ref $self);
+
+    return $self->{ids};
+}
+
+sub environment {
+    my $self = shift;
+    return undef unless (ref $self);
+
+    my $e = shift;
+    $self->{environment} = $e if (defined $e);
+    return $self->{environment};
+}
+
+sub editor {
+    my $self = shift;
+    return undef unless (ref $self);
+
+    my $e = shift;
+    $self->{editor} = $e if (defined $e);
+    return $self->{editor};
+}
+
+sub unfind {
+    my $self = shift;
+    return undef unless (ref $self);
+
+    die 'Cannot unfind a reacted event group' if (defined $self->reacted);
+
+    $self->update_state( 'pending' ) || die 'Unable to update event group state';
+    $self->{events} = undef;
+    return $self;
+}
+
+sub update_state {
+    my $self = shift;
+    return undef unless ($self && ref $self);
+
+    my $state = shift;
+    return undef unless ($state);
+
+    $self->editor->xact_begin || return undef;
+
+    my @oks;
+    for my $event ( @{ $self->events } ) {
+        my $e = $self->editor->retrieve_action_trigger_event( $event->id );
+        $e->start_time( 'now' ) unless $e->start_time;
+        $e->update_time( 'now' );
+        $e->update_process( $$ );
+        $e->state( $state );
+    
+        $e->clear_start_time() if ($e->state eq 'pending');
+    
+        my $ok = $self->editor->update_action_trigger_event( $e );
+        if ($ok) {
+            push @oks, $ok;
+        }
+    }
+
+    if (scalar(@oks) < scalar(@{ $self->ids })) {
+        $self->editor->xact_rollback;
+        return undef;
+    } else {
+        $ok = $self->editor->xact_commit;
+    }
+
+    if ($ok) {
+        for my $event ( @{ $self->events } ) {
+            my $updated = $self->editor->data;
+            $event->start_time( $updated->start_time );
+            $event->update_time( $updated->update_time );
+            $event->update_process( $updated->update_process );
+            $event->state( $updated->state );
+        }
+    }
+
+    return $ok || undef;
+}
+
+sub build_environment {
+    my $self = shift;
+    my $env = $self->environment;
+
+    $$evn{target} = [];
+    $$evn{event} = [];
+    for my $e ( @{ $self->events } ) {
+        for my $evn_part ( keys %{ $e->environment } ) {
+            if ($env_part eq 'target') {
+                push @{ $$evn{target} }, $e->environment->{target};
+            } elsif ($env_part eq 'event') {
+                push @{ $$evn{event} }, $e->environment->{event};
+            } else {
+                $$evn{$evn_part} = $e->environment->{$evn_part};
+            }
+        }
+    }
+
+    return $self;
+}
+
+1;
index 3a6c58a..c744ca4 100644 (file)
@@ -59,6 +59,7 @@ sub import {
                $$fieldmap{$n}{hint} = $c;
                $$fieldmap{$n}{virtual} = ($idl->{$c}{'oils_persist:virtual'} && $idl->{$c}{'oils_persist:virtual'} eq 'true') ? 1 : 0;
                $$fieldmap{$n}{table} = $idl->{$c}{'oils_persist:tablename'};
+               $$fieldmap{$n}{restrict_primary} = $idl->{$c}{'oils_persist:restrict_primary'};
                $$fieldmap{$n}{sequence} = $idl->{$c}{fields}{'oils_persist:sequence'};
                $$fieldmap{$n}{identity} = $idl->{$c}{fields}{'oils_persist:primary'};
 
@@ -176,6 +177,11 @@ sub Identity {
        return $$fieldmap{$self->class_name}{identity};
 }
 
+sub RestrictPrimary {
+       my $self = shift;
+       return $$fieldmap{$self->class_name}{restrict_primary};
+}
+
 sub Sequence {
        my $self = shift;
        return $$fieldmap{$self->class_name}{sequence};
index b2f52bc..353e4e2 100755 (executable)
@@ -3,6 +3,7 @@ use strict;
 use integer;
 use Carp;
 
+use DateTime;
 use MARC::Record;
 
 sub new
@@ -97,6 +98,8 @@ sub new
 sub decode_pattern {
     my $self = shift;
     my $pattern = $self->{PATTERN}->{y};
+
+    # XXX WRITE ME (?)
 }
 
 sub compressible {
@@ -149,4 +152,215 @@ sub enumeration_is_chronology {
     return (exists $self->{PATTERN}->{w} && exists $self->{PATTERN}->{y});
 }
 
+my %daynames = (
+               'mo' => 1,
+               'tu' => 2,
+               'we' => 3,
+               'th' => 4,
+               'fr' => 5,
+               'sa' => 6,
+               'su' => 7,
+              );
+
+my $daypat = '(mo|tu|we|th|fr|sa|su)';
+my $weekpat = '(99|98|97|00|01|02|03|04|05)';
+my $weeknopat;
+my $monthpat = '(01|02|03|04|05|06|07|08|09|10|11|12)';
+my $seasonpat = '(21|22|23|24)';
+
+# Initialize $weeknopat to be '(01|02|03|...|51|52|53)'
+$weeknopat = '(';
+foreach my $weekno (1..52) {
+    $weeknopat .= sprintf("%02d|", $weekno);
+}
+$weeknopat .= '53)';
+
+sub match_day {
+    my $pat = shift;
+    my @date = @_;
+    # Translate daynames into day of week for DateTime
+    # also used to check if dayname is valid.
+
+    if (exists $daynames{$pat}) {
+       # dd
+       # figure out day of week for date and compare
+       my $dt = DateTime->new(year  => $date[0],
+                              month => $date[1],
+                              day   => $date[2]);
+       return ($dt->day_of_week == $daynames{$pat});
+    } elsif (length($pat) == 2) {
+       # MM
+       return $pat == $date[3];
+    } elsif (length($pat) == 4) {
+       # MMDD
+       my ($mon, $day);
+       $mon = substr($pat, 0, 2);
+       $day = substr($pat, 2, 2);
+
+       return (($mon == $date[1]) && ($day == $date[2]));
+    } else {
+       carp "Invalid day pattern '$pat'";
+       return 0;
+    }
+}
+
+# Calcuate date of "n"th last "dayname" of month: second last Tuesday
+sub last_week_of_month {
+    my $dt = shift;
+    my $week = shift;
+    my $day = shift;
+    my $end_dt = DateTime->last_day_of_month(year  => $dt->year,
+                                            month => $dt->month);
+
+    $day = $daynames{$day};
+    while ($end_dt->day_of_week != $day) {
+       $end_dt->subtract(days => 1);
+    }
+
+    # 99: last week of month, 98: second last, etc.
+    for (my $i = 99 - $week; $i > 0; $i--) {
+       $end_dt->subtract(weeks => 1);
+    }
+
+    return $end_dt;
+}
+
+sub check_date {
+    my $dt = shift;
+    my $month = shift;
+    my $weekno = shift;
+    my $day = shift;
+
+    if (!defined $day) {
+       # MMWW
+       return (($dt->month == $month)
+               && (($dt->week_of_month == $weekno)
+                   || ($dt->week_of_month == last_day_of_month($dt, $weekno, 'th')->week_of_month)));
+    }
+
+    # simple cases first
+    if ($daynames{$day} != $dt->day_of_week) {
+       # if it's the wrong day of the week, rest doesn't matter
+       return 0;
+    }
+
+    if (!defined $month) {
+       # WWdd
+       return (($dt->weekday_of_month == $weekno)
+               || ($dt->weekday_of_month == last_day_of_month($dt, $weekno, $day)->weekday_of_month));
+    }
+
+    # MMWWdd
+    if ($month != $dt->month) {
+       # If it's the wrong month, then we're done
+       return 0;
+    }
+
+    # It's the right day of the week
+    # It's the right month
+
+    if ($weekno == $dt->weekday_of_month) {
+       # If this matches, then we're counting from the beginning
+       # of the month and it matches and we're done.
+       return 1;
+    }
+
+    # only case left is that the week number is counting from
+    # the end of the month: eg, second last wednesday
+    return (last_week_of_month($weekno, $day)->weekday_of_month == $dt->weekday_of_month);
+}
+
+sub match_week {
+    my $pat = shift;
+    my @date = @_;
+    my $dt = DateTime->new(year  => $date[0],
+                          month => $date[1],
+                          day   => $date[2]);
+
+    if ($pat =~ m/^$weekpat$daypat$/) {
+       # WWdd: 03we = Third Wednesday
+       return check_date($dt, undef, $1, $2);
+    } elsif ($pat =~ m/^$monthpat$weekpat$daypat$/) {
+       # MMWWdd: 0599tu Last Tuesday in May XXX WRITE ME
+       return check_date($dt, $1, $2, $3);
+    } elsif ($pat =~ m/^$monthpat$weekpat$/) {
+       # MMWW: 1204: Fourth week in December XXX WRITE ME
+       return check_date($dt, $1, $2, undef);
+    } else {
+       carp "invalid week pattern '$pat'";
+       return 0;
+    }
+}
+
+sub match_month {
+    my $pat = shift;
+    my @date = @_;
+
+    return ($pat eq $date[1]);
+}
+
+sub match_season {
+    my $pat = shift;
+    my @date = @_;
+
+    return ($pat eq $date[1]);
+}
+
+sub match_year {
+    my $pat = shift;
+    my @date = @_;
+
+    # XXX WRITE ME
+}
+
+my %dispatch = (
+               'd' => \&match_day,
+               'w' => \&match_week,
+               'm' => \&match_month,
+               's' => \&match_season,
+               'y' => \&match_year,
+);
+sub regularity_match {
+    my $self = shift;
+    my $pubcode = shift;
+    my @date = @_;
+
+    foreach my $regularity ($self->{PATTERN}->{y}) {
+       next unless $regularity =~ m/^$pubcode/;
+
+       my $chroncode= substr($regularity, 1, 1);
+       my @pats = split(/,/, substr($regularity, 2));
+
+       # XXX WRITE ME
+       foreach my $pat (@pats) {
+           if ($dispatch{$chroncode}->($pat, @date)) {
+               return 1;
+           }
+       }
+    }
+
+    return 0;
+}
+
+sub is_omitted {
+    my $self = shift;
+    my @date = @_;
+
+    return $self->regularity_match('o', @date);
+}
+
+sub is_published {
+    my $self = shift;
+    my @date = @_;
+
+    return $self->regularity_match('p', @date);
+}
+
+sub is_combined {
+    my $self = shift;
+    my @date = @_;
+
+    return $self->regularity_match('c', @date);
+}
+
 1;
index 1d3405a..f5b3724 100755 (executable)
@@ -197,36 +197,20 @@ my %increments = {
                  # x => completely irregular
 };
 
-sub next_date {
-    my $self = shift;
-    my $next = shift;
-    my @keys = @_;
-    my @cur;
-    my @new;
-    my $incr;
-
-    my $caption = $self->{CAPTION};
-    my $pattern = $caption->{PATTERN};
-    my $frequency = $pattern->{w};
-
-    warn "I can't deal with publication patterns yet!" if exists $pattern->{y};
-
-#     print Dumper(@keys);
-#     print Dumper($self);
+sub is_combined {
+    my $str = shift;
 
-    foreach my $i (0..@keys) {
-       $new[$i] = $cur[$i] = $self->{SUBFIELDS}->{$keys[$i]}
-         if exists $self->{SUBFIELDS}->{$keys[$i]};
-    }
+    return $str =~ m;.+/.+;
+}
 
-    if (defined $frequency) {
-       $incr = $increments{$frequency};
-    }
+sub incr_date {
+    my $incr = shift;
+    my @new = @_;
 
-    if (scalar(@cur) == 1) {
+    if (scalar(@new) == 1) {
        # only a year is specified. Next date is easy
        $new[0] += $incr->{years} || 1;
-    } elsif (scalar(@cur) == 2) {
+    } elsif (scalar(@new) == 2) {
        # Year and month or season
        if ($new[1] > 20) {
            # season
@@ -245,7 +229,7 @@ sub next_date {
                $new[1] -= 12;
            }
        }
-    } elsif (scalar(@cur) == 3) {
+    } elsif (scalar(@new) == 3) {
        # Year, Month, Day: now it gets complicated.
 
        if ($new[2] =~ /^[0-9]+$/) {
@@ -257,20 +241,47 @@ sub next_date {
            $new[0] = $dt->year;
            $new[1] = $dt->month;
            $new[2] = $dt->day;
-       } elsif ($new[2] =~ /^([0-9]+)\/([0-9]+)/) {
-           my $sdt = DateTime->new(year => $new[0],
-                                   month=> $new[1],
-                                   day  => $1);
-           my $edt = DateTime->new(year => $new[0],
-                                   month=> $new[1],
-                                   day  => $2);
-           $sdt->add(%{$incr});
-           $edt->add(%{$incr});
-           $new[0] = $sdt->year;
-           $new[1] = $sdt->month;
-           $new[2] = $sdt->day . '/' . $edt->day;
-       } else {
-           warn "I don't know how to deal with '$new[2]'";
+       }
+    } else {
+       warn("Don't know how to cope with @new");
+    }
+
+    return @new;
+}
+
+sub next_date {
+    my $self = shift;
+    my $next = shift;
+    my @keys = @_;
+    my @cur;
+    my @new;
+    my $incr;
+
+    my $caption = $self->{CAPTION};
+    my $reg = $caption->{REGULARITY};
+    my $pattern = $caption->{PATTERN};
+    my $freq = $pattern->{w};
+
+    foreach my $i (0..@keys) {
+       $new[$i] = $cur[$i] = $self->{SUBFIELDS}->{$keys[$i]}
+         if exists $self->{SUBFIELDS}->{$keys[$i]};
+    }
+
+    if (is_combined($new[-1])) {
+       $new[-1] =~ s/^[^\/]+//;
+    }
+
+    # If $frequency is not one of the standard codes defined in %increments
+    # then there has to be a $yp publication regularity pattern that
+    # lists the dates of publication. Use that that list to find the next
+    # date following the current one.
+    # XXX: the code doesn't handle this case yet.
+
+    if (defined $freq && exists $increments{$freq}) {
+       @new = incr_date($increments{$freq}, @new);
+
+       while ($caption->is_omitted(@new)) {
+           @new = incr_date($increments{$freq}, @new);
        }
     }
 }
index 26ea81a..cac02de 100644 (file)
@@ -476,7 +476,7 @@ CREATE TABLE config.z3950_source (
 
 CREATE TABLE config.z3950_attr (
     id          SERIAL  PRIMARY KEY,
-    source      TEXT    NOT NULL REFERENCES config.z3950_source (name),
+    source      TEXT    NOT NULL REFERENCES config.z3950_source (name) DEFERRABLE INITIALLY DEFERRED,
     name        TEXT    NOT NULL,
     label       TEXT    NOT NULL,
     code        INT     NOT NULL,
index 6f01475..12e39d4 100644 (file)
@@ -456,6 +456,7 @@ CREATE TABLE actor.usr_address (
        state                   TEXT    NOT NULL,
        country                 TEXT    NOT NULL,
        post_code               TEXT    NOT NULL,
+    pending         BOOL    NOT NULL DEFAULT FALSE,
        replaces            INT REFERENCES actor.usr_address (id) DEFERRABLE INITIALLY DEFERRED
 );
 
index dbdd157..b9503e4 100644 (file)
@@ -99,8 +99,8 @@ CREATE TABLE vandelay.bib_match (
 -- DROP TABLE vandelay.import_item CASCADE;
 CREATE TABLE vandelay.import_item (
     id              BIGSERIAL   PRIMARY KEY,
-    record          BIGINT      NOT NULL REFERENCES vandelay.queued_bib_record (id) ON DELETE CASCADE,
-    definition      BIGINT      NOT NULL REFERENCES vandelay.import_item_attr_definition (id) ON DELETE CASCADE,
+    record          BIGINT      NOT NULL REFERENCES vandelay.queued_bib_record (id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
+    definition      BIGINT      NOT NULL REFERENCES vandelay.import_item_attr_definition (id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
     owning_lib      INT,
     circ_lib        INT,
     call_number     TEXT,
index 098792f..9b07813 100644 (file)
@@ -69,8 +69,8 @@ CREATE RULE protect_copy_delete AS ON DELETE TO asset.copy DO INSTEAD UPDATE ass
 CREATE TABLE asset.copy_transparency (
        id              SERIAL          PRIMARY KEY,
        deposit_amount  NUMERIC(6,2),
-       owner           INT             NOT NULL REFERENCES actor.org_unit (id),
-       circ_lib        INT             REFERENCES actor.org_unit (id),
+       owner           INT             NOT NULL REFERENCES actor.org_unit (id) DEFERRABLE INITIALLY DEFERRED,
+       circ_lib        INT             REFERENCES actor.org_unit (id) DEFERRABLE INITIALLY DEFERRED,
        loan_duration   INT             CHECK ( loan_duration IN (1,2,3) ),
        fine_level      INT             CHECK ( fine_level IN (1,2,3) ),
        holdable        BOOL,
@@ -86,8 +86,8 @@ CREATE TABLE asset.copy_transparency (
 
 CREATE TABLE asset.copy_tranparency_map (
        id              BIGSERIAL       PRIMARY KEY,
-       tansparency     INT     NOT NULL REFERENCES asset.copy_transparency (id),
-       target_copy     INT     NOT NULL UNIQUE REFERENCES asset.copy (id)
+       tansparency     INT     NOT NULL REFERENCES asset.copy_transparency (id) DEFERRABLE INITIALLY DEFERRED,
+       target_copy     INT     NOT NULL UNIQUE REFERENCES asset.copy (id) DEFERRABLE INITIALLY DEFERRED
 );
 CREATE INDEX cp_tr_cp_idx ON asset.copy_tranparency_map (tansparency);
 
index 910d123..f10545d 100644 (file)
@@ -34,12 +34,18 @@ CREATE TABLE container.copy_bucket (
                                                                DEFERRABLE
                                                                INITIALLY DEFERRED,
        name            TEXT                            NOT NULL,
-       btype           TEXT                            NOT NULL DEFAULT 'misc' REFERENCES container.copy_bucket_type (code),
+       btype           TEXT                            NOT NULL DEFAULT 'misc' REFERENCES container.copy_bucket_type (code) DEFERRABLE INITIALLY DEFERRED,
        pub             BOOL                            NOT NULL DEFAULT FALSE,
        create_time     TIMESTAMP WITH TIME ZONE        NOT NULL DEFAULT NOW(),
        CONSTRAINT cb_name_once_per_owner UNIQUE (owner,name,btype)
 );
 
+CREATE TABLE container.copy_bucket_note (
+    id      SERIAL      PRIMARY KEY,
+    bucket  INT         NOT NULL REFERENCES container.copy_bucket (id) ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE INITIALLY DEFERRED,
+    note    TEXT        NOT NULL
+);
+
 CREATE TABLE container.copy_bucket_item (
        id              SERIAL  PRIMARY KEY,
        bucket          INT     NOT NULL
@@ -54,9 +60,15 @@ CREATE TABLE container.copy_bucket_item (
                                        ON UPDATE CASCADE
                                        DEFERRABLE
                                        INITIALLY DEFERRED,
+    pos         INT,
        create_time     TIMESTAMP WITH TIME ZONE        NOT NULL DEFAULT NOW()
 );
 
+CREATE TABLE container.copy_bucket_item_note (
+    id      SERIAL      PRIMARY KEY,
+    item    INT         NOT NULL REFERENCES container.copy_bucket_item (id) ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE INITIALLY DEFERRED,
+    note    TEXT        NOT NULL
+);
 
 
 
@@ -74,12 +86,18 @@ CREATE TABLE container.call_number_bucket (
                                DEFERRABLE
                                INITIALLY DEFERRED,
        name    TEXT    NOT NULL,
-       btype   TEXT    NOT NULL DEFAULT 'misc' REFERENCES container.call_number_bucket_type (code),
+       btype   TEXT    NOT NULL DEFAULT 'misc' REFERENCES container.call_number_bucket_type (code) DEFERRABLE INITIALLY DEFERRED,
        pub     BOOL    NOT NULL DEFAULT FALSE,
        create_time     TIMESTAMP WITH TIME ZONE        NOT NULL DEFAULT NOW(),
        CONSTRAINT cnb_name_once_per_owner UNIQUE (owner,name,btype)
 );
 
+CREATE TABLE container.call_number_bucket_note (
+    id      SERIAL      PRIMARY KEY,
+    bucket  INT         NOT NULL REFERENCES container.call_number_bucket (id) ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE INITIALLY DEFERRED,
+    note    TEXT        NOT NULL
+);
+
 CREATE TABLE container.call_number_bucket_item (
        id              SERIAL  PRIMARY KEY,
        bucket          INT     NOT NULL
@@ -94,9 +112,17 @@ CREATE TABLE container.call_number_bucket_item (
                                        ON UPDATE CASCADE
                                        DEFERRABLE
                                        INITIALLY DEFERRED,
+    pos         INT,
        create_time     TIMESTAMP WITH TIME ZONE        NOT NULL DEFAULT NOW()
 );
 
+CREATE TABLE container.call_number_bucket_item_note (
+    id      SERIAL      PRIMARY KEY,
+    item    INT         NOT NULL REFERENCES container.call_number_bucket_item (id) ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE INITIALLY DEFERRED,
+    note    TEXT        NOT NULL
+);
+
+
 
 
 CREATE TABLE container.biblio_record_entry_bucket_type (
@@ -114,12 +140,18 @@ CREATE TABLE container.biblio_record_entry_bucket (
                                DEFERRABLE
                                INITIALLY DEFERRED,
        name    TEXT    NOT NULL,
-       btype   TEXT    NOT NULL DEFAULT 'misc' REFERENCES container.biblio_record_entry_bucket_type (code),
+       btype   TEXT    NOT NULL DEFAULT 'misc' REFERENCES container.biblio_record_entry_bucket_type (code) DEFERRABLE INITIALLY DEFERRED,
        pub     BOOL    NOT NULL DEFAULT FALSE,
        create_time     TIMESTAMP WITH TIME ZONE        NOT NULL DEFAULT NOW(),
        CONSTRAINT breb_name_once_per_owner UNIQUE (owner,name,btype)
 );
 
+CREATE TABLE container.biblio_record_entry_bucket_note (
+    id      SERIAL      PRIMARY KEY,
+    bucket  INT         NOT NULL REFERENCES container.biblio_record_entry_bucket (id) ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE INITIALLY DEFERRED,
+    note    TEXT        NOT NULL
+);
+
 CREATE TABLE container.biblio_record_entry_bucket_item (
        id                              SERIAL  PRIMARY KEY,
        bucket                          INT     NOT NULL
@@ -134,9 +166,16 @@ CREATE TABLE container.biblio_record_entry_bucket_item (
                                                        ON UPDATE CASCADE
                                                        DEFERRABLE
                                                        INITIALLY DEFERRED,
+    pos         INT,
        create_time     TIMESTAMP WITH TIME ZONE        NOT NULL DEFAULT NOW()
 );
 
+CREATE TABLE container.biblio_record_entry_bucket_item_note (
+    id      SERIAL      PRIMARY KEY,
+    item    INT         NOT NULL REFERENCES container.biblio_record_entry_bucket_item (id) ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE INITIALLY DEFERRED,
+    note    TEXT        NOT NULL
+);
+
 
 
 CREATE TABLE container.user_bucket_type (
@@ -153,12 +192,18 @@ CREATE TABLE container.user_bucket (
                                DEFERRABLE
                                INITIALLY DEFERRED,
        name    TEXT    NOT NULL,
-       btype   TEXT    NOT NULL DEFAULT 'misc' REFERENCES container.user_bucket_type (code),
+       btype   TEXT    NOT NULL DEFAULT 'misc' REFERENCES container.user_bucket_type (code) DEFERRABLE INITIALLY DEFERRED,
        pub     BOOL    NOT NULL DEFAULT FALSE,
        create_time     TIMESTAMP WITH TIME ZONE        NOT NULL DEFAULT NOW(),
        CONSTRAINT ub_name_once_per_owner UNIQUE (owner,name,btype)
 );
 
+CREATE TABLE container.user_bucket_note (
+    id      SERIAL      PRIMARY KEY,
+    bucket  INT         NOT NULL REFERENCES container.user_bucket (id) ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE INITIALLY DEFERRED,
+    note    TEXT        NOT NULL
+);
+
 CREATE TABLE container.user_bucket_item (
        id              SERIAL  PRIMARY KEY,
        bucket          INT     NOT NULL
@@ -173,7 +218,15 @@ CREATE TABLE container.user_bucket_item (
                                        ON UPDATE CASCADE
                                        DEFERRABLE
                                        INITIALLY DEFERRED,
+    pos         INT,
        create_time     TIMESTAMP WITH TIME ZONE        NOT NULL DEFAULT NOW()
 );
 
+CREATE TABLE container.user_bucket_item_note (
+    id      SERIAL      PRIMARY KEY,
+    item    INT         NOT NULL REFERENCES container.user_bucket_item (id) ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE INITIALLY DEFERRED,
+    note    TEXT        NOT NULL
+);
+
+
 COMMIT;
index f88a318..b0fc53f 100644 (file)
@@ -56,7 +56,7 @@ CREATE TABLE money.billing (
        void_time       TIMESTAMP WITH TIME ZONE,
        amount          NUMERIC(6,2)                    NOT NULL,
        billing_type    TEXT                            NOT NULL,
-       btype           INT                             NOT NULL REFERENCES config.billing_type (id) ON DELETE RESTRICT,
+       btype           INT                             NOT NULL REFERENCES config.billing_type (id) ON DELETE RESTRICT DEFERRABLE INITIALLY DEFERRED,
        note            TEXT
 );
 CREATE INDEX m_b_xact_idx ON money.billing (xact);
index 7acb64a..bc43428 100644 (file)
@@ -247,6 +247,17 @@ CREATE TRIGGER action_circulation_stop_fines_tgr
        FOR EACH ROW
        EXECUTE PROCEDURE action.circulation_claims_returned ();
 
+CREATE TABLE action.hold_request_cancel_cause (
+    id      SERIAL  PRIMARY KEY,
+    label   TEXT    UNIQUE
+);
+INSERT INTO action.hold_request_cancel_cause (id,label) VALUES (1,'Untargeted expiration');
+INSERT INTO action.hold_request_cancel_cause (id,label) VALUES (2,'Hold Shelf expiration');
+INSERT INTO action.hold_request_cancel_cause (id,label) VALUES (3,'Patron via phone');
+INSERT INTO action.hold_request_cancel_cause (id,label) VALUES (4,'Patron in person');
+INSERT INTO action.hold_request_cancel_cause (id,label) VALUES (5,'Staff forced');
+INSERT INTO action.hold_request_cancel_cause (id,label) VALUES (6,'Patron via OPAC');
+SELECT SETVAL('action.hold_request_cancel_cause_id_seq', 100);
 
 CREATE TABLE action.hold_request (
        id                      SERIAL                          PRIMARY KEY,
@@ -258,6 +269,8 @@ CREATE TABLE action.hold_request (
        prev_check_time         TIMESTAMP WITH TIME ZONE,
        expire_time             TIMESTAMP WITH TIME ZONE,
        cancel_time             TIMESTAMP WITH TIME ZONE,
+       cancel_cause    INT REFERENCES action.hold_request_cancel_cause (id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED,
+       cancel_note             TEXT,
        target                  BIGINT                          NOT NULL, -- see hold_type
        current_copy            BIGINT                          REFERENCES asset.copy (id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED,
        fulfillment_staff       INT                             REFERENCES actor.usr (id) DEFERRABLE INITIALLY DEFERRED,
index 6820a9a..49ec817 100644 (file)
@@ -19,7 +19,7 @@ BEGIN;
 CREATE SCHEMA extend_reporter;
 
 CREATE TABLE extend_reporter.legacy_circ_count (
-    id          BIGSERIAL   PRIMARY KEY REFERENCES asset.copy (id),
+    id          BIGSERIAL   PRIMARY KEY REFERENCES asset.copy (id) DEFERRABLE INITIALLY DEFERRED,
     circ_count  INT         NOT NULL DEFAULT 0
 );
 
index 062cf70..92066c6 100644 (file)
@@ -20,7 +20,7 @@
 CREATE SCHEMA extend_reporter;
 
 CREATE TABLE extend_reporter.legacy_circ_count (
-    id          BIGSERIAL   PRIMARY KEY REFERENCES asset.copy (id),
+    id          BIGSERIAL   PRIMARY KEY REFERENCES asset.copy (id) DEFERRABLE INITIALLY DEFERRED,
     circ_count  INT         NOT NULL DEFAULT 0
 );
 
index 5926f1e..773acab 100644 (file)
@@ -20,8 +20,8 @@ INSERT INTO acq.currency_type (code, label) VALUES ('EUR','Euros');
 
 CREATE TABLE acq.exchange_rate (
     id              SERIAL  PRIMARY KEY,
-    from_currency   TEXT    NOT NULL REFERENCES acq.currency_type (code),
-    to_currency     TEXT    NOT NULL REFERENCES acq.currency_type (code),
+    from_currency   TEXT    NOT NULL REFERENCES acq.currency_type (code) DEFERRABLE INITIALLY DEFERRED,
+    to_currency     TEXT    NOT NULL REFERENCES acq.currency_type (code) DEFERRABLE INITIALLY DEFERRED,
     ratio           NUMERIC NOT NULL,
     CONSTRAINT exchange_rate_from_to_once UNIQUE (from_currency,to_currency)
 );
@@ -32,56 +32,94 @@ INSERT INTO acq.exchange_rate (from_currency,to_currency,ratio) VALUES ('USD','E
 CREATE TABLE acq.provider (
        id              SERIAL  PRIMARY KEY,
        name            TEXT    NOT NULL,
-       owner           INT     NOT NULL REFERENCES actor.org_unit (id),
-       currency_type   TEXT    NOT NULL REFERENCES acq.currency_type (code),
+       owner           INT     NOT NULL REFERENCES actor.org_unit (id) DEFERRABLE INITIALLY DEFERRED,
+       currency_type   TEXT    NOT NULL REFERENCES acq.currency_type (code) DEFERRABLE INITIALLY DEFERRED,
        code            TEXT    UNIQUE,
        CONSTRAINT provider_name_once_per_owner UNIQUE (name,owner)
 );
 
+CREATE TABLE acq.provider_address (
+       id              SERIAL  PRIMARY KEY,
+       valid           BOOL    NOT NULL DEFAULT TRUE,
+       address_type    TEXT,
+    provider    INT     NOT NULL REFERENCES acq.provider (id) DEFERRABLE INITIALLY DEFERRED,
+       street1         TEXT    NOT NULL,
+       street2         TEXT,
+       city            TEXT    NOT NULL,
+       county          TEXT,
+       state           TEXT    NOT NULL,
+       country         TEXT    NOT NULL,
+       post_code       TEXT    NOT NULL
+);
+
+CREATE TABLE acq.provider_contact (
+       id              SERIAL  PRIMARY KEY,
+    provider    INT NOT NULL REFERENCES acq.provider (id) DEFERRABLE INITIALLY DEFERRED,
+    name    TEXT NULL NULL,
+    role    TEXT, -- free-form.. e.g. "our sales guy"
+    email   TEXT,
+    phone   TEXT
+);
+
+CREATE TABLE acq.provider_contact_address (
+       id                      SERIAL  PRIMARY KEY,
+       valid                   BOOL    NOT NULL DEFAULT TRUE,
+       address_type    TEXT,
+       contact                 INT         NOT NULL REFERENCES acq.provider_contact (id) DEFERRABLE INITIALLY DEFERRED,
+       street1                 TEXT    NOT NULL,
+       street2                 TEXT,
+       city                    TEXT    NOT NULL,
+       county                  TEXT,
+       state                   TEXT    NOT NULL,
+       country                 TEXT    NOT NULL,
+       post_code               TEXT    NOT NULL
+);
+
+
 CREATE TABLE acq.funding_source (
        id              SERIAL  PRIMARY KEY,
        name            TEXT    NOT NULL,
-       owner           INT     NOT NULL REFERENCES actor.org_unit (id),
-       currency_type   TEXT    NOT NULL REFERENCES acq.currency_type (code),
+       owner           INT     NOT NULL REFERENCES actor.org_unit (id) DEFERRABLE INITIALLY DEFERRED,
+       currency_type   TEXT    NOT NULL REFERENCES acq.currency_type (code) DEFERRABLE INITIALLY DEFERRED,
        code            TEXT    UNIQUE,
        CONSTRAINT funding_source_name_once_per_owner UNIQUE (name,owner)
 );
 
 CREATE TABLE acq.funding_source_credit (
        id      SERIAL  PRIMARY KEY,
-       funding_source    INT     NOT NULL REFERENCES acq.funding_source (id),
+       funding_source    INT     NOT NULL REFERENCES acq.funding_source (id) DEFERRABLE INITIALLY DEFERRED,
        amount  NUMERIC NOT NULL,
        note    TEXT
 );
 
 CREATE TABLE acq.fund (
     id              SERIAL  PRIMARY KEY,
-    org             INT     NOT NULL REFERENCES actor.org_unit (id) ON UPDATE CASCADE ON DELETE CASCADE,
+    org             INT     NOT NULL REFERENCES actor.org_unit (id) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
     name            TEXT    NOT NULL,
     year            INT     NOT NULL DEFAULT EXTRACT( YEAR FROM NOW() ),
-    currency_type   TEXT    NOT NULL REFERENCES acq.currency_type (code),
+    currency_type   TEXT    NOT NULL REFERENCES acq.currency_type (code) DEFERRABLE INITIALLY DEFERRED,
     code            TEXT    UNIQUE,
     CONSTRAINT name_once_per_org_year UNIQUE (org,name,year)
 );
 
 CREATE TABLE acq.fund_debit (
        id                      SERIAL  PRIMARY KEY,
-       fund                    INT     NOT NULL REFERENCES acq.fund (id),
+       fund                    INT     NOT NULL REFERENCES acq.fund (id) DEFERRABLE INITIALLY DEFERRED,
        origin_amount           NUMERIC NOT NULL,  -- pre-exchange-rate amount
-       origin_currency_type    TEXT    NOT NULL REFERENCES acq.currency_type (code),
+       origin_currency_type    TEXT    NOT NULL REFERENCES acq.currency_type (code) DEFERRABLE INITIALLY DEFERRED,
        amount                  NUMERIC NOT NULL,
        encumbrance             BOOL    NOT NULL DEFAULT TRUE,
        debit_type              TEXT    NOT NULL,
-       xfer_destination        INT     REFERENCES acq.fund (id)
+       xfer_destination        INT     REFERENCES acq.fund (id) DEFERRABLE INITIALLY DEFERRED
 );
 
 CREATE TABLE acq.fund_allocation (
     id          SERIAL  PRIMARY KEY,
-    funding_source        INT     NOT NULL REFERENCES acq.funding_source (id) ON UPDATE CASCADE ON DELETE CASCADE,
-    fund        INT     NOT NULL REFERENCES acq.fund (id) ON UPDATE CASCADE ON DELETE CASCADE,
+    funding_source        INT     NOT NULL REFERENCES acq.funding_source (id) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
+    fund        INT     NOT NULL REFERENCES acq.fund (id) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
     amount      NUMERIC,
     percent     NUMERIC CHECK (percent IS NULL OR percent BETWEEN 0.0 AND 100.0),
-    allocator   INT NOT NULL REFERENCES actor.usr (id),
+    allocator   INT NOT NULL REFERENCES actor.usr (id) DEFERRABLE INITIALLY DEFERRED,
     note        TEXT,
     CONSTRAINT allocation_amount_or_percent CHECK ((percent IS NULL AND amount IS NOT NULL) OR (percent IS NOT NULL AND amount IS NULL))
 );
@@ -89,8 +127,8 @@ CREATE TABLE acq.fund_allocation (
 
 CREATE TABLE acq.picklist (
        id              SERIAL                          PRIMARY KEY,
-       owner           INT                             NOT NULL REFERENCES actor.usr (id),
-       org_unit        INT                             NOT NULL REFERENCES actor.org_unit (id),
+       owner           INT                             NOT NULL REFERENCES actor.usr (id) DEFERRABLE INITIALLY DEFERRED,
+       org_unit        INT                             NOT NULL REFERENCES actor.org_unit (id) DEFERRABLE INITIALLY DEFERRED,
        name            TEXT                            NOT NULL,
        create_time     TIMESTAMP WITH TIME ZONE        NOT NULL DEFAULT NOW(),
        edit_time       TIMESTAMP WITH TIME ZONE        NOT NULL DEFAULT NOW(),
@@ -99,11 +137,11 @@ CREATE TABLE acq.picklist (
 
 CREATE TABLE acq.purchase_order (
        id              SERIAL                          PRIMARY KEY,
-       owner           INT                             NOT NULL REFERENCES actor.usr (id),
-       ordering_agency         INT                             NOT NULL REFERENCES actor.org_unit (id),
+       owner           INT                             NOT NULL REFERENCES actor.usr (id) DEFERRABLE INITIALLY DEFERRED,
+       ordering_agency         INT                             NOT NULL REFERENCES actor.org_unit (id) DEFERRABLE INITIALLY DEFERRED,
        create_time     TIMESTAMP WITH TIME ZONE        NOT NULL DEFAULT NOW(),
        edit_time       TIMESTAMP WITH TIME ZONE        NOT NULL DEFAULT NOW(),
-       provider        INT                             NOT NULL REFERENCES acq.provider (id),
+       provider        INT                             NOT NULL REFERENCES acq.provider (id) DEFERRABLE INITIALLY DEFERRED,
        state           TEXT                            NOT NULL DEFAULT 'new'
 );
 CREATE INDEX po_owner_idx ON acq.purchase_order (owner);
@@ -112,9 +150,9 @@ CREATE INDEX po_state_idx ON acq.purchase_order (state);
 
 CREATE TABLE acq.po_note (
        id              SERIAL                          PRIMARY KEY,
-       purchase_order  INT                             NOT NULL REFERENCES acq.purchase_order (id),
-       creator         INT                             NOT NULL REFERENCES actor.usr (id),
-       editor          INT                             NOT NULL REFERENCES actor.usr (id),
+       purchase_order  INT                             NOT NULL REFERENCES acq.purchase_order (id) DEFERRABLE INITIALLY DEFERRED,
+       creator         INT                             NOT NULL REFERENCES actor.usr (id) DEFERRABLE INITIALLY DEFERRED,
+       editor          INT                             NOT NULL REFERENCES actor.usr (id) DEFERRABLE INITIALLY DEFERRED,
        create_time     TIMESTAMP WITH TIME ZONE        NOT NULL DEFAULT NOW(),
        edit_time       TIMESTAMP WITH TIME ZONE        NOT NULL DEFAULT NOW(),
        value           TEXT                            NOT NULL
@@ -123,15 +161,15 @@ CREATE INDEX po_note_po_idx ON acq.po_note (purchase_order);
 
 CREATE TABLE acq.lineitem (
        id                  BIGSERIAL                   PRIMARY KEY,
-       selector            INT                         NOT NULL REFERENCES actor.org_unit (id),
-       provider            INT                         REFERENCES acq.provider (id),
-       purchase_order      INT                         REFERENCES acq.purchase_order (id),
-       picklist            INT                         REFERENCES acq.picklist (id),
+       selector            INT                         NOT NULL REFERENCES actor.org_unit (id) DEFERRABLE INITIALLY DEFERRED,
+       provider            INT                         REFERENCES acq.provider (id) DEFERRABLE INITIALLY DEFERRED,
+       purchase_order      INT                         REFERENCES acq.purchase_order (id) DEFERRABLE INITIALLY DEFERRED,
+       picklist            INT                         REFERENCES acq.picklist (id) DEFERRABLE INITIALLY DEFERRED,
        expected_recv_time  TIMESTAMP WITH TIME ZONE,
        create_time         TIMESTAMP WITH TIME ZONE    NOT NULL DEFAULT NOW(),
        edit_time           TIMESTAMP WITH TIME ZONE    NOT NULL DEFAULT NOW(),
        marc                TEXT                        NOT NULL,
-       eg_bib_id           INT                         REFERENCES biblio.record_entry (id),
+       eg_bib_id           INT                         REFERENCES biblio.record_entry (id) DEFERRABLE INITIALLY DEFERRED,
        source_label        TEXT,
        item_count          INT                         NOT NULL DEFAULT 0,
        state               TEXT                        NOT NULL DEFAULT 'new',
@@ -142,9 +180,9 @@ CREATE INDEX li_pl_idx ON acq.lineitem (picklist);
 
 CREATE TABLE acq.lineitem_note (
        id              SERIAL                          PRIMARY KEY,
-       lineitem        INT                             NOT NULL REFERENCES acq.lineitem (id),
-       creator         INT                             NOT NULL REFERENCES actor.usr (id),
-       editor          INT                             NOT NULL REFERENCES actor.usr (id),
+       lineitem        INT                             NOT NULL REFERENCES acq.lineitem (id) DEFERRABLE INITIALLY DEFERRED,
+       creator         INT                             NOT NULL REFERENCES actor.usr (id) DEFERRABLE INITIALLY DEFERRED,
+       editor          INT                             NOT NULL REFERENCES actor.usr (id) DEFERRABLE INITIALLY DEFERRED,
        create_time     TIMESTAMP WITH TIME ZONE        NOT NULL DEFAULT NOW(),
        edit_time       TIMESTAMP WITH TIME ZONE        NOT NULL DEFAULT NOW(),
        value           TEXT                            NOT NULL
@@ -153,14 +191,14 @@ CREATE INDEX li_note_li_idx ON acq.lineitem_note (lineitem);
 
 CREATE TABLE acq.lineitem_detail (
        id              BIGSERIAL                       PRIMARY KEY,
-       lineitem        INT                             NOT NULL REFERENCES acq.lineitem (id),
-       fund            INT                             REFERENCES acq.fund (id),
-       fund_debit      INT                             REFERENCES acq.fund_debit (id),
-       eg_copy_id      BIGINT                  REFERENCES asset.copy (id) ON DELETE SET NULL,
+       lineitem        INT                             NOT NULL REFERENCES acq.lineitem (id) DEFERRABLE INITIALLY DEFERRED,
+       fund            INT                             REFERENCES acq.fund (id) DEFERRABLE INITIALLY DEFERRED,
+       fund_debit      INT                             REFERENCES acq.fund_debit (id) DEFERRABLE INITIALLY DEFERRED,
+       eg_copy_id      BIGINT                  REFERENCES asset.copy (id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED,
        barcode         TEXT,
        cn_label        TEXT,
-    owning_lib  INT             REFERENCES actor.org_unit (id) ON DELETE SET NULL,
-    location    INT             REFERENCES asset.copy_location (id) ON DELETE SET NULL,
+    owning_lib  INT             REFERENCES actor.org_unit (id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED,
+    location    INT             REFERENCES asset.copy_location (id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED,
        recv_time       TIMESTAMP WITH TIME ZONE
 );
 
@@ -182,7 +220,7 @@ CREATE TABLE acq.lineitem_marc_attr_definition (
 CREATE TABLE acq.lineitem_provider_attr_definition (
        id              BIGINT  PRIMARY KEY DEFAULT NEXTVAL('acq.lineitem_attr_definition_id_seq'),
        xpath           TEXT            NOT NULL,
-       provider        INT     NOT NULL REFERENCES acq.provider (id)
+       provider        INT     NOT NULL REFERENCES acq.provider (id) DEFERRABLE INITIALLY DEFERRED
 ) INHERITS (acq.lineitem_attr_definition);
 
 CREATE TABLE acq.lineitem_generated_attr_definition (
@@ -192,7 +230,7 @@ CREATE TABLE acq.lineitem_generated_attr_definition (
 
 CREATE TABLE acq.lineitem_usr_attr_definition (
        id              BIGINT  PRIMARY KEY DEFAULT NEXTVAL('acq.lineitem_attr_definition_id_seq'),
-       usr             INT     NOT NULL REFERENCES actor.usr (id)
+       usr             INT     NOT NULL REFERENCES actor.usr (id) DEFERRABLE INITIALLY DEFERRED
 ) INHERITS (acq.lineitem_attr_definition);
 
 CREATE TABLE acq.lineitem_local_attr_definition (
@@ -202,7 +240,7 @@ CREATE TABLE acq.lineitem_local_attr_definition (
 CREATE TABLE acq.lineitem_attr (
        id              BIGSERIAL       PRIMARY KEY,
        definition      BIGINT          NOT NULL,
-       lineitem        BIGINT          NOT NULL REFERENCES acq.lineitem (id),
+       lineitem        BIGINT          NOT NULL REFERENCES acq.lineitem (id) DEFERRABLE INITIALLY DEFERRED,
        attr_type       TEXT            NOT NULL,
        attr_name       TEXT            NOT NULL,
        attr_value      TEXT            NOT NULL
index 56a4391..9637dad 100644 (file)
@@ -10,7 +10,7 @@ CREATE TABLE asset.uri (
        active  BOOL    NOT NULL DEFAULT TRUE
 );
 
-ALTER TABLE asset.call_number ADD COLUMN uri INT REFERENCES asset.uri (id);
+ALTER TABLE asset.call_number ADD COLUMN uri INT REFERENCES asset.uri (id) DEFERRABLE INITIALLY DEFERRED;
 
 BEGIN;
 
index 8911ed9..f86e975 100644 (file)
@@ -87,12 +87,12 @@ INSERT INTO action_trigger.cleanup (module,description) VALUES ('ClearAllPending
 CREATE TABLE action_trigger.event_definition (
     id              SERIAL      PRIMARY KEY,
     active          BOOL        NOT NULL DEFAULT TRUE,
-    owner           INT         NOT NULL REFERENCES actor.org_unit (id),
-    hook            TEXT        NOT NULL REFERENCES action_trigger.hook (key),
-    validator       TEXT        NOT NULL REFERENCES action_trigger.validator (module),
-    reactor         TEXT        NOT NULL REFERENCES action_trigger.reactor (module),
-    cleanup_success TEXT        REFERENCES action_trigger.cleanup (module),
-    cleanup_failure TEXT        REFERENCES action_trigger.cleanup (module),
+    owner           INT         NOT NULL REFERENCES actor.org_unit (id) DEFERRABLE INITIALLY DEFERRED,
+    hook            TEXT        NOT NULL REFERENCES action_trigger.hook (key) DEFERRABLE INITIALLY DEFERRED,
+    validator       TEXT        NOT NULL REFERENCES action_trigger.validator (module) DEFERRABLE INITIALLY DEFERRED,
+    reactor         TEXT        NOT NULL REFERENCES action_trigger.reactor (module) DEFERRABLE INITIALLY DEFERRED,
+    cleanup_success TEXT        REFERENCES action_trigger.cleanup (module) DEFERRABLE INITIALLY DEFERRED,
+    cleanup_failure TEXT        REFERENCES action_trigger.cleanup (module) DEFERRABLE INITIALLY DEFERRED,
     delay           INTERVAL    NOT NULL DEFAULT '5 minutes',
     delay_field     TEXT,                 -- for instance, xact_start on a circ hook ... look for fields on hook.core_type where datatype=timestamp? If not set, delay from now()
     group_field     TEXT,                 -- field from this.hook.core_type to batch event targets together on, fed into reactor a group at a time.
@@ -102,11 +102,11 @@ CREATE TABLE action_trigger.event_definition (
 
 CREATE TABLE action_trigger.environment (
     id          SERIAL  PRIMARY KEY,
-    event_def   INT     NOT NULL REFERENCES action_trigger.event_definition (id),
+    event_def   INT     NOT NULL REFERENCES action_trigger.event_definition (id) DEFERRABLE INITIALLY DEFERRED,
     path        TEXT,       -- fields to flesh. given a hook with a core_type of circ, imagine circ_lib.parent_ou expanding to
                             -- {flesh: 2, flesh_fields: {circ: ['circ_lib'], aou: ['parent_ou']}} ... default is to flesh all
                             -- at flesh depth 1
-    collector   TEXT    REFERENCES action_trigger.collector (module), -- if set, given the object at 'path', return some data
+    collector   TEXT    REFERENCES action_trigger.collector (module) DEFERRABLE INITIALLY DEFERRED, -- if set, given the object at 'path', return some data
                                                                       -- to be stashed at environment.<label>
     label       TEXT    CHECK (label NOT IN ('result','target','event')),
     CONSTRAINT env_event_label_once UNIQUE (event_def,label)
@@ -115,7 +115,7 @@ CREATE TABLE action_trigger.environment (
 CREATE TABLE action_trigger.event (
     id              BIGSERIAL   PRIMARY KEY,
     target          BIGINT      NOT NULL, -- points at the id from class defined by event_def.hook.core_type
-    event_def       INT         REFERENCES action_trigger.event_definition (id),
+    event_def       INT         REFERENCES action_trigger.event_definition (id) DEFERRABLE INITIALLY DEFERRED,
     add_time        TIMESTAMPTZ NOT NULL DEFAULT NOW(),
     run_time        TIMESTAMPTZ NOT NULL,
     start_time      TIMESTAMPTZ,
@@ -129,11 +129,11 @@ CREATE TABLE action_trigger.event (
 
 CREATE TABLE action_trigger.event_params (
     id          BIGSERIAL   PRIMARY KEY,
-    event_def   INT         NOT NULL REFERENCES action_trigger.event_definition (id),
+    event_def   INT         NOT NULL REFERENCES action_trigger.event_definition (id) DEFERRABLE INITIALLY DEFERRED,
     param       TEXT        NOT NULL, -- the key under environment.event.params to store the output of ...
-    value       TEXT        NOT NULL, -- ... the eval() output of this.  Has access to environmen (and, well, all of perl)
+    value       TEXT        NOT NULL, -- ... the eval() output of this.  Has access to environment (and, well, all of perl)
     CONSTRAINT event_params_event_def_param_once UNIQUE (event_def,param)
 );
 
---COMMIT;
+COMMIT;
 
index cfbcf48..fbc46ff 100644 (file)
@@ -81,5 +81,16 @@ CREATE OR REPLACE VIEW money.open_usr_circulation_summary AS
          WHERE xact_type = 'circulation'
          GROUP BY 1;
 
+-- Not a view, but it's cross-schema..
+CREATE TABLE config.idl_field_doc (
+    id              BIGSERIAL   PRIMARY KEY,
+    fm_class        TEXT        NOT NULL,
+    field           TEXT        NOT NULL,
+    owner           INT         NOT NULL    REFERENCES actor.org_unit (id) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
+    string          TEXT        NOT NULL
+);
+CREATE UNIQUE INDEX idl_field_doc_identity ON config.idl_field_doc (fm_class,field,owner);
+
+
 COMMIT;
 
index 2b077c2..bf1eb9e 100644 (file)
@@ -1139,6 +1139,8 @@ INSERT INTO permission.perm_list VALUES
 INSERT INTO permission.perm_list VALUES 
     (151, 'DELETE_CONTAINER_ITEM', oils_i18n_gettext(151, 'Allow a user to delete an item out of another user''s container', 'ppl', 'description'));
 INSERT INTO permission.perm_list VALUES 
+    (152, 'ASSIGN_WORK_ORG_UNIT', oils_i18n_gettext(152, 'Allow a staff member to define where another staff member has their permissions', 'ppl', 'description'));
+INSERT INTO permission.perm_list VALUES 
     (153, 'CREATE_FUNDING_SOURCE', oils_i18n_gettext(153, 'Allow a user to create a new funding source', 'ppl', 'description')),
     (154, 'DELETE_FUNDING_SOURCE', oils_i18n_gettext(154, 'Allow a user to delete a funding source', 'ppl', 'description')),
     (155, 'VIEW_FUNDING_SOURCE', oils_i18n_gettext(155, 'Allow a user to view a funding source', 'ppl', 'description')),
@@ -1164,13 +1166,10 @@ INSERT INTO permission.perm_list VALUES
     (175, 'ADMIN_PROVIDER', oils_i18n_gettext(175, 'Allow a user to create/view/update/delete a provider', 'ppl', 'description')),
     (176, 'MANAGE_PROVIDER', oils_i18n_gettext(176, 'Allow a user to view and purchase from a provider', 'ppl', 'description')),
     (177, 'VIEW_PICKLIST', oils_i18n_gettext(177, 'Allow a user to view another users picklist', 'ppl', 'description')),
-    (152, 'ASSIGN_WORK_ORG_UNIT', oils_i18n_gettext(152, 'Allow a staff member to define where another staff member has their permissions', 'ppl', 'description'));
-INSERT INTO permission.perm_list VALUES 
-    (178, 'DELETE_RECORD', oils_i18n_gettext(178, 'Allow a staff member to directly remove a bibliographic record', 'ppl', 'description'));
-INSERT INTO permission.perm_list VALUES 
-    (179, 'ADMIN_CURRENCY_TYPE', oils_i18n_gettext(179, 'Allow a user to create/view/update/delete a currency_type', 'ppl', 'description'));
-INSERT INTO permission.perm_list VALUES 
-    (180, 'MARK_BAD_DEBT', oils_i18n_gettext(180, 'Allow a user to mark a transaction as bad (unrecoverable) debt', 'ppl', 'description'));
+    (178, 'DELETE_RECORD', oils_i18n_gettext(178, 'Allow a staff member to directly remove a bibliographic record', 'ppl', 'description')),
+    (179, 'ADMIN_CURRENCY_TYPE', oils_i18n_gettext(179, 'Allow a user to create/view/update/delete a currency_type', 'ppl', 'description')),
+    (180, 'MARK_BAD_DEBT', oils_i18n_gettext(180, 'Allow a user to mark a transaction as bad (unrecoverable) debt', 'ppl', 'description')),
+    (181, 'VIEW_BILLING_TYPE', oils_i18n_gettext(181, 'Allow a user to view billing types', 'ppl', 'description'));
 
 SELECT SETVAL('permission.perm_list_id_seq'::TEXT, (SELECT MAX(id) FROM permission.perm_list));
 
@@ -1396,6 +1395,7 @@ INSERT INTO permission.grp_perm_map VALUES (112, 3, 96, 0, false);
 INSERT INTO permission.grp_perm_map VALUES (113, 3, 97, 0, false);
 INSERT INTO permission.grp_perm_map VALUES (130, 3, 99, 1, false);
 INSERT INTO permission.grp_perm_map VALUES (131, 3, 100, 1, false);
+INSERT INTO permission.grp_perm_map VALUES (139, 3, 181, 0, false);
 INSERT INTO permission.grp_perm_map VALUES (22, 4, 18, 0, false);
 INSERT INTO permission.grp_perm_map VALUES (24, 4, 20, 0, false);
 INSERT INTO permission.grp_perm_map VALUES (38, 4, 21, 2, false);
@@ -1422,6 +1422,9 @@ INSERT INTO permission.grp_perm_map VALUES (114, 10, 98, 1, false);
 INSERT INTO permission.grp_perm_map VALUES (132, 10, 101, 1, true);
 INSERT INTO permission.grp_perm_map VALUES (136, 10, 102, 1, false);
 INSERT INTO permission.grp_perm_map VALUES (137, 10, 103, 1, false);
+INSERT INTO permission.grp_perm_map VALUES (140, 10, 147, 1, false);
+INSERT INTO permission.grp_perm_map VALUES (141, 10, 148, 1, false);
+INSERT INTO permission.grp_perm_map VALUES (142, 10, 149, 1, false);
 INSERT INTO permission.grp_perm_map VALUES (97, 5, 41, 0, false);
 INSERT INTO permission.grp_perm_map VALUES (96, 5, 43, 0, false);
 INSERT INTO permission.grp_perm_map VALUES (93, 5, 48, 0, false);
@@ -1441,6 +1444,9 @@ UPDATE actor.usr SET card = (SELECT id FROM actor.card WHERE barcode = '10101010
 -- Admin user permissions
 INSERT INTO permission.usr_perm_map (usr,perm,depth) VALUES (1,-1,0);
 
+-- Set a work_ou for the Administrator user
+INSERT INTO permission.usr_work_ou_map (usr, work_ou) VALUES (1, 1);
+
 --010.schema.biblio.sql:
 INSERT INTO biblio.record_entry VALUES (-1,1,1,1,-1,NOW(),NOW(),FALSE,FALSE,'','AUTOGEN','-1','','FOO');
 
@@ -1573,6 +1579,7 @@ INSERT INTO container.call_number_bucket_type (code,label) VALUES ('misc', oils_
 INSERT INTO container.biblio_record_entry_bucket_type (code,label) VALUES ('misc', oils_i18n_gettext('misc', 'Miscellaneous', 'cbrebt', 'label'));
 INSERT INTO container.biblio_record_entry_bucket_type (code,label) VALUES ('staff_client', oils_i18n_gettext('staff_client', 'General Staff Client container', 'cbrebt', 'label'));
 INSERT INTO container.biblio_record_entry_bucket_type (code,label) VALUES ('bookbag', oils_i18n_gettext('bookbag', 'Book Bag', 'cbrebt', 'label'));
+INSERT INTO container.biblio_record_entry_bucket_type (code,label) VALUES ('reading_list', oils_i18n_gettext('reading_list', 'Reading List', 'cbrebt', 'label'));
 
 INSERT INTO container.user_bucket_type (code,label) VALUES ('misc', oils_i18n_gettext('misc', 'Miscellaneous', 'cubt', 'label'));
 INSERT INTO container.user_bucket_type (code,label) VALUES ('folks', oils_i18n_gettext('folks', 'Friends', 'cubt', 'label'));
index dd3514f..f728137 100644 (file)
@@ -189,8 +189,10 @@ DECLARE
 BEGIN
     SELECT INTO old_id replaces FROM actor.usr_address where id = pending_id;
     IF old_id IS NULL THEN
-        RETURN NULL;
+        UPDATE actor.usr_address SET pending = 'f' WHERE id = pending_id;
+        RETURN pending_id;
     END IF;
+    -- address replaces an existing address
     DELETE FROM actor.usr_address WHERE id = -old_id;
     UPDATE actor.usr_address SET id = -id WHERE id = old_id;
     UPDATE actor.usr_address SET replaces = NULL, id = old_id WHERE id = pending_id;
index ccc16de..12af541 100644 (file)
@@ -21,7 +21,7 @@ BEGIN;
 CREATE SCHEMA extend_reporter;
 
 CREATE TABLE extend_reporter.legacy_circ_count (
-    id          BIGINT   PRIMARY KEY REFERENCES asset.copy (id),
+    id          BIGINT   PRIMARY KEY REFERENCES asset.copy (id) DEFERRABLE INITIALLY DEFERRED,
     circ_count  INT         NOT NULL DEFAULT 0
 );
 
index dbc6ff7..3cc17b5 100644 (file)
@@ -9,3 +9,4 @@ The following table lists the data sets we have collected for testing purposes.
 | map_data.marc     | MARC21    | UTF8     | Voyager (LoC) | 3 records with some geospatial metadata  |
 | music_5k.marc     | MARC21    | MARC8    | Unicorn GL3.1 | 5000 records  |
 | hebrew.marc       | MARC21    | MARC8    | III           | Hebrew scripts, 25 records |
+| nepali.marc       | MARC21    | UTF8     |               | Nepali scripts, 98 records, dual 245 and 100 fields (one for Nepali, one for phoneticization |
diff --git a/Open-ILS/tests/datasets/nepali.marc b/Open-ILS/tests/datasets/nepali.marc
new file mode 100644 (file)
index 0000000..19c778c
--- /dev/null
@@ -0,0 +1 @@
+01168nam a2200241Ka 4500008004300000020001700043020001300060100006200073100003200135245010900167245006200276250004300338250002900381260016300410260009200573300002000665500002600685500003800711520004400749546001500793650003700808852008100845\1e090114s1964    np            000 m nep d  \1e  \1fcरु. 1.50\1e  \1fcRu. 1.50\1e\1faशाह, वीरेन्द्रविक्रम.\1e\1faŚāha, Vīrendravikram.\1e10\1faबिहानी टुसा /\1fcलेखक वीरेन्द्रविक्रम शाह.\1e10\1faBihānī Ṭusā /\1fcLekhaka Vīrendravikram Śāha.\1e  \1faप्रथम संस्करण.\1e  \1faPrathama saṃskaraṇa.\1e  \1faगुल्मी :\1fbवीरबहादुर घर्ती क्षेत्री,\1fc2021 [1964]\1fe(पाल्पा :\1ffतिलक प्रेस)\1e  \1faGulmī :\1fbVīrabahādur Ghartī Kshetrī,\1fc2021 [1964]\1fe(Pālpā :\1ffTilak Presa)\1e  \1fa57 p. ;\1fc18 cm.\1e  \1fa1,000 copies printed.\1e  \1faPrinted by Talakamān Maharajan.\1e  \1faCollection of a drama and five stories.\1e  \1faIn Nepali.\1e 0\1faNepali literature.\1fvMixed forms.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4900\1e\1d01406nam a2200217Ka 4500008004300000020011900043020009900162100005500261100003700316245016200353245009400515250002400609250001100633260017200644260012400816300002900940520008600969546001501055650003701070852008101107\1e090114s1967    np a          000 m nep d  \1e  \1fcरु. 2.40 (Vol. 4), रु. 2.40 (Vol. 5), रु. 2.70 (Vol. 6), रु. 3.40 (Vol. 7), रु. 3.75 (Vol. 8),\1e  \1fcRu. 2.40 (Vol. 4), Ru. 2.40 (Vol. 5), Ru. 2.70 (Vol. 6), Ru. 3.40 (Vol. 7), Ru. 3.75 (Vol. 8),\1e\1faपोखरेल, बालकृष्ण,\1feed.\1e\1faPokharel, Bālakṛshṇa,\1feed.\1e10\1faहिमाली साहित्य :\1fbभाग ४ देखि ८ सम्म /\1fcसम्पादक बालकृष्ण पोखरेल.\1e10\1faHimālī sāhitya :\1fbbhāga 4 dekhi 8 samma /\1fcSampādaka Bālakṛshṇa Pokharel.\1e  \1faतेस्रो.\1e  \1faTesro.\1e  \1faकाठमाडौं :\1fbएडुकेशन इण्टर प्राइज,\1fc2024 [1967]\1fe(काठमाडौं :\1ffजोरगणेश प्रेस)\1e  \1faKāṭhamāḍauṃ :\1fbEḍukeśan Iṇṭar Prāija,\1fc2024 [1967]\1fe(Kāṭhamāḍauṃ :\1ffJoragaṇeśa Presa)\1e  \1fa8 v p. :\1fbill. ;\1fc24 cm.\1e  \1faCollection of poetry, essays and stories of Nepali language from various authors.\1e  \1faIn Nepali.\1e 0\1faNepali literature.\1fvMixed forms.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4901\1e\1d01331nam a2200241Ka 4500008004300000020001700043020001300060100005000073100003000123245017100153245010000324250002100424250001200445260021200457260013900669300003300808500002600841500002800867520005900895546001500954650003900969852008101008\1e090114s1967    np a          000 m nep d  \1e  \1fcरु. 1.90\1e  \1fcRu. 1.90\1e\1faशास्त्री, उदयराज.\1e\1faŚāstrī, Udayarāj.\1e10\1faबाल साहित्य भाग ५ :\1fbकक्षा पाँचका निमित्त /\1fcलेखक उदयराज शास्त्री.\1e10\1faBāla sāhitya bhāga 5 :\1fbkakshā pā̃cakā nimitta /\1fcLekhaka Udayarāj Śāstrī.\1e  \1faपहिलो.\1e  \1faPahilo.\1e  \1faकाठमाडौं :\1fbदेवेन्द्रकुमार शर्मा सगरमाथा प्रकाशन,\1fc2024 [1967]\1fe(बनारस :\1ffकेशव मुद्रणालय)\1e  \1faKāṭhamāḍauṃ :\1fbDevendrakumār Śarmā Sagaramāthā Prakāśana,\1fc2024 [1967]\1fe(Banāras :\1ffKeśav Mudraṇālaya)\1e  \1fa[2], 46 p. :\1fbill. ;\1fc24 cm.\1e  \1fa3,100 copies printed.\1e  \1faPrinted by Mohanalāl.\1e  \1faCollection of stories, poetry and essays for children.\1e  \1faIn Nepali.\1e 0\1faChildren literature.\1fvMixed froms.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4902\1e\1d01717nam a2200241Ka 4500008004300000020000800043100009900051100006600150245035800216245021500574250002200789250001300811260014800824260010300972300003401075500003501109520005301144546001501197650002901212700009101241700006201332852008101394\1e090114s1964    np            000 m nep d  \1e  \1fcnil\1e\1faआचार्य, तीर्थप्रसाद ढुङ्गाना,\1fejoint author.\1e\1faĀcārya, Tīrthaprasād Ḍhuṅgānā,\1fejoint author.\1e10\1faबाल संस्कृत संग्रह :\1fbशब्द, धातु, सन्धी, अनुवाद र सरल संस्कृत समेत राखिएको /\1fcलेखक तीर्थप्रसाद ढुङ्गाना आचार्य, केशवराज अधिकारी शास्त्री.\1e10\1faBāla saṃskṛta saṅgraha :\1fbśabda, dhātu, sandhī, anuvāda ra sarala saṃskṛta sameta rākhieko /\1fcLekhaka Tīrthaprasād Ḍhuṅgānā Ācārya, Keśavarāj Adhikārī Śāstrī.\1e  \1fa[पहिलो]\1e  \1fa[Pahilo]\1e  \1faकाठमाडौं :\1fbविजय पुस्तक भण्डार,\1fc2021 [1964]\1fe(बनारस :\1ffदीपक प्रेस)\1e  \1faKāṭhamāḍauṃ :\1fbVijaya Pustaka Bhaṇḍāra,\1fc2021 [1964]\1fe(Banāras :\1ffDīpak Presa)\1e  \1fa2, iii, [1], 104 p. ;\1fc18 cm.\1e  \1faPrinted by Mahādevaprasād.\1e  \1faTextbook of Sanskrit for lower secondary school.\1e  \1faIn Nepali.\1e 0\1faTextbooks.\1fvMixed forms.\1e\1faकेशवराज अधिकारी,\1fcशास्त्री,\1fgjoint author.\1e\1faKeśavarāj Adhikārī,\1fcŚāstrī,\1fejoint author.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4903\1e\1d01009nam a2200217Ka 4500008004300000020001400043020001000057100005300067100003200120245009600152250002200248250001300270260016000283260010600443300002500549500003500574520004500609546002700654650002900681852008100710\1e090114s1964    np            000 m nep d  \1e  \1fcरु. 4\1e  \1fcRu. 4\1e\1faमिश्र, कृष्णानन्द.\1e\1faMiśra, Kṛshṇānanda.\1e10\1faSure Success in Elementary Civics :\1fbFor S.L.C. Examinination /\1fcKṛshṇānanda Miśra.\1e  \1fa[पहिलो]\1e  \1fa[pahilo]\1e  \1faकाठमाडौं :\1fbराष्ट्रिय पुस्तक मण्डल,\1fc2021 [1964]\1fe(बनारस :\1ffदीपक प्रेस)\1e  \1faKāṭhamāḍauṃ :\1fbRāshṭriya Pustak Maṇḍala,\1fc2021 [1964]\1fe(Banāras :\1ffDīpak Presa)\1e  \1favi, 239 p. ;\1fc18 cm.\1e  \1faPrinted by Mahādevaprasād.\1e  \1faGuide to civil studies for SLC students.\1e  \1faIn Nepali and English.\1e 0\1faEducation.\1fvMixed forms.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4904\1e\1d01247nam a2200229Ka 4500008004300000020003000043020002100073100004700094100003400141245016900175245010100344250002100445250001400466260020200480260011200682300002400794500002600818520005200844546001500896650002500911852008100936\1e090114s1967    np            000 0 nep d  \1e  \1fc1 रु. 65 पैसा\1e  \1fc1 ru. 65 paisā\1e\1faभट्टराई, गुणदेव.\1e\1faBhaṭṭarāī, Guṇadev.\1e10\1faसजिलो अङ्कगणित भाग ८ :\1fbकक्षा ८ को निमित्त /\1fcलेखक गुणदेव भट्टराई.\1e10\1faSajilo aṅkagaṇita bhāga 8 :\1fbkakshā 8 ko nimitta /\1fcLekhaka Guṇadev Bhaṭṭarāī.\1e  \1faप्रथम.\1e  \1faPrathama.\1e  \1faकाठमाडौं :\1fbगोपीनाथ उपाध्याय नयाँ नेपाल प्रकाशन,\1fc2024 [1967]\1fe(बनारस :\1ffजय भारत प्रेस)\1e  \1fbGopīnāth Upādhyāya Nayā̃ Nepāl Prakāśana,\1fc2024 [1967]\1fe(Banāras :\1ffJaya Bhārat Presa)\1e  \1fa2, 152 p. ;\1fc17 cm.\1e  \1fa3,100 copies printed.\1e  \1faTextbook of arithmetic for grade VIII students.\1e  \1faIn Nepali.\1e 0\1faTextbooks.\1fvUnknown.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4905\1e\1d01471nam a2200241Ka 4500008004300000020001700043020001300060100005300073100004100126245029500167245017600462250002700638250002000665260011600685260009300801300002600894520006300920546001500983650002500998700007501023700005001098852008101148\1e090114s1966    np            000 0 nep d  \1e  \1fcरु. 2.50\1e  \1fcRu. 2.50\1e\1faसिंह, जनकलाल,\1fejoint author.\1e\1faSiṃha, Janakalāl,\1fejoint author.\1e10\1faसरल अंग्रेजी ब्याकरण :\1fbश्री ५ सरकार शिक्षा विभागबाट तयारभएको सिलेबस बमोजिम /\1fcलेखक जनकलाल सिंह, चन्द्रलाल सिंह.\1e10\1faSarala Aṅgrejī byākaraṇa :\1fbŚrī 5 Sarakāra Śikshā Vibhāgabāṭa tayārabhaeko silebasa bamojima /\1fcLekhaka Janakalāl Siṃha, Candralāl Siṃha.\1e  \1faसंशोधित.\1e  \1faSaṃśodhita.\1e  \1faकाठमाडौं :\1fbP.L. Singh\1fc[2023] 1966\1fe(काठमाडौं :\1ffसुगत प्रेस)\1e  \1faKāṭhamāḍauṃ :\1fbP.L. Singh\1fc[2023] 1966\1fe(Kāṭhamāḍauṃ :\1ffSugat Presa)\1e  \1fa[2], 135 p. ;\1fc18 cm.\1e  \1faTextbook of English grammar for grade VI and VII students.\1e  \1faIn Nepali.\1e 0\1faTextbooks.\1fvUnknown.\1e\1faसिंह, चन्द्रलाल,\1fejoint author,\1fqबी.ए.\1e\1faSiṃha, Candralāl,\1fejoint author,\1fqBī.E.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4906\1e\1d01110nam a2200217Ka 4500008004300000020000800043100003900051100002500090245012100115245006100236250002200297250001300319260019100332260012200523300002900645500002800674520005700702546002700759650002500786852008100811\1e090114s1966    np            000 0 nep d  \1e  \1fcnil\1e\1faप्रधान, जी.एस.\1e\1faPradhān, Jī.Esa.\1e10\1faमोर इङ्ग्लिश थ्रू ट्रान्लेशन /\1fcजी.एस. प्रधान.\1e10\1faMore English Through Translation /\1fcJī.Esa. Pradhān.\1e  \1fa[पहिलो]\1e  \1fa[pahilo]\1e  \1faकाठमाडौं :\1fbरत्न पुस्तक भण्डार,\1fc2023 [1966]\1fe(बनारस :\1ffकमर्शियल प्रिण्टिङ वर्क्स)\1e  \1faKāṭhamāḍauṃ :\1fbRatna Pustak Bhaṇḍāra,\1fc2023 [1966]\1fe(Banāras :\1ffKamarśiyal Priṇṭiṅa Varksa)\1e  \1fa[1], ii, 68 p. ;\1fc17 cm.\1e  \1faPrinted by R.S. Dhawan.\1e  \1faBook of English translation for the Nepali students.\1e  \1faIn Nepali and English.\1e 0\1faEducation.\1fvUnknown.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4908\1e\1d01228nam a2200229Ka 4500008004300000020001700043020001300060100005600073100003100129245017700160245010300337250002200440250001300462260016300475260010500638300004200743500003700785520005600822546001500878650002400893852008100917\1e090114s1966    np a          000 e nep d  \1e  \1fcरु. 4.50\1e  \1fcRu. 4.50\1e\1faशर्मा, गोकुलप्रसाद.\1e\1faŚarmā, Gokulaprasād.\1e10\1faहाम्रो समाज भाग ३ :\1fbआठौं कक्षाको निमित्त /\1fcलेखक गोकुलप्रसाद शर्मा.\1e10\1faHāmro samāja bhāga 3 :\1fbāṭhauṃ kakshāko nimitta /\1fcLekhaka Gokulaprasād Śarmā.\1e  \1fa[पहिलो]\1e  \1fa[Pahilo]\1e  \1faविराटनगर :\1fbनेपाली साहित्य भण्डार,\1fc2023 [1966]\1fe(बनारस :\1ffकल्पना प्रेस)\1e  \1faVirāṭanagar :\1fbNepālī Sāhitya Bhaṇḍāra,\1fc2023 [1966]\1fe(Banāras :\1ffKalpanā Presa)\1e  \1fa[1], 2, [1], 219 p. :\1fbill. ;\1fc18 cm.\1e  \1faPrinted by Baijanāthaprasād.\1e  \1faTextbook of social studies for grade VIII students.\1e  \1faIn Nepali.\1e 0\1faTextbooks.\1fvEssays.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4909\1e\1d01431nam a2200229Ka 4500008004300000020007300043020006100116100007700177100004900254245020100303245011900504250004900623250003000672260014800702260010100850300002900951500003500980520006101015546001501076650002901091852008101120\1e090114s1967    np a          000 m nep d  \1e  \1fcरु. 1.50 (Vol. 1) , रु. 1.50 (Vol. 2), रु. 1.50 (Vol. 3)\1e  \1fcRu. 1.50 (Vol. 1) , Ru. 1.50 (Vol. 2), Ru. 1.50 (Vol. 3)\1e\1faशर्मा, यदुनाथ,\1fcदर्शनाचार्य.\1e\1faŚarmā, Yadunātha,\1fcDarśanācārya.\1e10\1faसंस्कृत दर्पण :\1fbअनुवाद व्याकरण सहितम् भाग १ देखि ३ सम्म /\1fcलेखक यदुनाथ शर्मा.\1e10\1faSaṃskṛta darpaṇa :\1fbanuvāda vyākaraṇa sahitam bhāga 1 dekhi 3 samma /\1fcLekhaka Yadunāth Śarmā.\1e  \1faद्वितीय संस्करण.\1e  \1faDvitīya saṃskaraṇa.\1e  \1faकाठमाडौं :\1fbरत्न पुस्तक भण्डार,\1fc2024 [1967]\1fe(बनारस :\1ffदीपक प्रेस)\1e  \1faKāṭhamāḍauṃ :\1fbRatna Pustak Bhaṇḍāra,\1fc2024 [1967]\1fe(Banāras :\1ffDīpak Presa)\1e  \1fa3 v p. :\1fbill. ;\1fc17 cm.\1e  \1faPrinted by Mahādevaprasād.\1e  \1faTextbook of Sanskrit for lower secondary level students.\1e  \1faIn Nepali.\1e 0\1faTextbooks.\1fvMixed forms.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4910\1e\1d01471nam a2200229Ka 4500008004300000020004700043020003900090100005500129100003900184245019100223245011300414250004300527250002700570260025100597260015900848300002901007500002601036520005401062546001501116650002901131852008101160\1e090114s1967    np a          000 m nep d  \1e  \1fcरु. 2 (Vol. 1), रु. 2.15 (Vol. 2),\1e  \1fcRu. 2 (Vol. 1), Ru. 2.15 (Vol. 2),\1e\1faउपाधयाय, गोपीनाथ,\1feed.\1e\1faUpādhayāya, Gopīnāth,\1feed.\1e10\1faहाम्रो भाषा भाग १ र २ :\1fbकक्षा ६ र ७ का निमित्त /\1fcसम्पादक गोपीनाथ उपाध्याय.\1e10\1faHāmro bhāshā bhāga 1 ra 2 :\1fbkakshā 6 ra 7 kā nimitta /\1fcSampādaka Gopīnāth Upādhyāya.\1e  \1faपहिलो संस्करण.\1e  \1faPahilo saṃskaraṇa.\1e  \1faकाठमाण्डू :\1fbनयाँ नेपाल प्रकाशन, गोपीनाथ उपाध्याय,\1fc2024 [1967]\1fe(बनारस :\1ffअरुणोदय प्रेस, न्यू किरण प्रेस)\1e  \1faKāṭhamāṇḍū :\1fbNayā̃ Nepāl Prakāśana, Gopīnātha Upādhyāya,\1fc2024 [1967]\1fe(Banāras :\1ffAruṇoday Presa, Nyū Kiraṇa Presa)\1e  \1fa2 v p. :\1fbill. ;\1fc17 cm.\1e  \1fa3,100 copies printed.\1e  \1faTextbook of Nepali for grade VI and VII students.\1e  \1faIn Nepali.\1e 0\1faTextbooks.\1fvMixed forms.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4911\1e\1d01431nam a2200229Ka 4500008004300000020004600043020003800089100007200127100005100199245023500250245014400485250004300629250002700672260016000699260010300859300002700962500004000989520005201029546001501081650002401096852008101120\1e090114s1967    np a          000 0 nep d  \1e  \1fcरु. 2 (Vol. 3), रु. 2.40 (Vol. 5)\1e  \1fcRu. 2 (Vol. 3), Ru. 2.40 (Vol. 5)\1e\1faपाध्या, नीलकण्ठराव,\1fgएम.एड.\1e\1faPādhyā, Nīlakaṇṭharāv,\1fgEma.Eḍa.\1e10\1faनवीन सरल विज्ञान शिक्षा भाग ३ देखि ५ सम्म :\1fbकक्षा ३, ४ र ५ को लागि /\1fcलेखक नीलकण्ठराव पाध्या.\1e10\1faNavīna sarala vijñāna śikshā bhāga 3 dekhi 5 samma :\1fbkakshā 3, 4 ra 5 ko lāgi /\1fcLekhaka Nīlakaṇṭharāv Pādhyā.\1e  \1faपहिलो संस्करण.\1e  \1faPahilo saṃskaraṇa.\1e  \1faविराटनगर :\1fbनेपाली साहित्य भण्डार,\1fc2024 [1967]\1fe(बनारस :\1ffमनोहर प्रेस)\1e  \1faVirāṭanagar :\1fbNepālī Sāhitya Bhaṇḍāra,\1fc2024 [1967]\1fe(Banāras :\1ffManohar Presa)\1e  \1fa3 v. :\1fbill. ;\1fc24 cm.\1e  \1faPrinted by Viśvanāth Bhārgav.\1e  \1faTextbook of science for primary level students.\1e  \1faIn Nepali.\1e 0\1faTextbook.\1fvUnknown.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4912\1e\1d01280nam a2200217Ka 4500008004300000020004900043020004100092100002400133100001500157245014900172245009100321250002200412250001300434260024800447260015400695300002700849520006600876546001500942650002400957852008100981\1e090114s1967    np a          000 e nep d  \1e  \1fcरु. 2.40 (Vol. 1), रु. 2.25 (Vol. 2)\1e  \1fcRu. 2.40 (Vol. 1), Ru. 2.25 (Vol. 2)\1e\1faसुवर्ण.\1e\1faSuvarṇa.\1e10\1faव्यवसायी शिक्षा  १ र २ :\1fbकक्षा चौथो र पाँचौ /\1fcलेखक सुवर्ण.\1e10\1faVyavasāyī śikshā  1 ra 2 :\1fbkakshā cautho ra pā̃cau /\1fcLekhaka Suvarṇa.\1e  \1fa[पहिलो]\1e  \1fa[Pahilo]\1e  \1faकाठमाडौं :\1fbनेपाल प्रकाशन मन्दिर,\1fc2024 [1967]\1fe(इलाहवाद :\1ffप्रकाश प्रिटिंग वर्क्स, विश्वमभर मुद्रणालय)\1e  \1faKāṭhamāḍauṃ :\1fbNepāl Prakāśan Mandira,\1fc2024 [1967]\1fe(Ilāhavāda :\1ffPrakāśa Priṭiṃg Varksa, Viśvamabhar Mudraṇālaya)\1e  \1fa2 v. :\1fbill. ;\1fc24 cm.\1e  \1faTextbook of voccational education for primary level students.\1e  \1faIn Nepali.\1e 0\1faTextbooks.\1fvEssays.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4913\1e\1d01339nam a2200241Ka 4500008004300000020001400043020001000057100005200067100003400119245022000153245012700373250004300500250002900543260017200572260011800744300003400862500001100896500002600907520004800933546001500981650002000996852008101016\1e090114s1963    np            000 p nep d  \1e  \1fcरु. 2\1e  \1fcRu. 2\1e\1faविश्वनाथ,\1fcविमल,\1feComp.\1e\1faViśvanāth,\1fcVimal,\1feComp.\1e10\1faजीवन संगीत दोस्रो अँजुली :\1fbलोकप्रिय नेपाली गीतहरूको संग्रह /\1fcसंकलन विश्वनाथ विमल.\1e10\1faJīvana saṅgīta dosro ãjulī :\1fblokapriya Nepālī gītaharūko saṅgraha /\1fcSaṃkalana Viśvanāth Vimal.\1e  \1faप्रथम संस्करण.\1e  \1faPrathama saṃskaraṇa.\1e  \1faकाठमाडौं :\1fbरत्न रेकर्डिङ्ग ट्रष्ट,\1fc2020 [1963]\1fe(काठमाडौं :\1ffनेपाल प्रेस)\1e  \1faKāṭhamāḍauṃ :\1fbRatna Rekarḍiṅga Ṭrashṭa,\1fc2020 [1963]\1fe(Kāṭhamāḍauṃ :\1ffNepāl Presa)\1e  \1faii, [2], iv, 121 p. ;\1fc18 cm.\1e  \1faPoems.\1e  \1fa3,000 copies printed.\1e  \1faCollection of the lyrics of popular  songs.\1e  \1faIn Nepali.\1e 0\1faSongs.\1fvPoetry.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4914\1e\1d01154nam a2200241Ka 4500008004300000020001700043020001300060100006500073100003400138245012400172245006600296250004600362250002600408260014400434260008600578300002600664500001100690500003000701500005300731546001500784650003200799852008100831\1e090114s1965    ii            000 p nep d  \1e  \1fcरु. 1.75\1e  \1fcRu. 1.75\1e\1faनिरौला, लक्ष्मीप्रसाद.\1e\1faNiraulā, Lakshmīprasād.\1e10\1faसयपत्रीको थुँगो /\1fcलेखक लक्ष्मीप्रसाद निरौला.\1e10\1faSayapatrīko thũgo /\1fcLekhaka Lakshmīprasād Niraulā.\1e  \1faदोस्रो संस्करण.\1e  \1faDosro saṃskaraṇa.\1e  \1faबनारस :\1fbचन्द्रप्रसाद घिमिरे,\1fc2022 [1965]\1fe(बनारस :\1ffछाया प्रेस)\1e  \1faBanāras :\1fbCandraprasād Ghimire,\1fc2022 [1965]\1fe(Banāras :\1ffChāyā Presa)\1e  \1fa[2], 128 p. ;\1fc17 cm.\1e  \1faPoems.\1e  \1faPrinted by Hīrālāl.\1e  \1faPreface by Candraprasād Upādhyāya Ghimire.\1e  \1faIn Nepali.\1e 0\1faNepali literature.\1fvPoetry.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4915\1e\1d01614nam a2200265Ka 4500008004300000020000800043110009500051110005600146245014000202245008200342250004300424250002900467260023800496260016300734300002500897500002600922500011400948520003701062546001501099650002401114700006301138700004001201852008101241952002601322\1e090114s1967    np           f000 e nep d  \1e  \1fcnil\1e\1faश्री ५ को सरकार. \1fbशिक्षा मन्त्रालय.\1e\1faŚrī 5 ko Sarakāra. \1fbŚikshā Mantrālaya.\1e10\1faसाक्षरता अभियान निर्देशिका /\1fcलेखक प्रचण्डराज सिंह.\1e10\1faSāksharatā abhiyāna nirdeśikā /\1fcLekhaka Pracaṇḍarāj Siṃha.\1e  \1faप्रथम संस्करण.\1e  \1faPrathama saṃskaraṇa.\1e  \1faकाठमाडौं :\1fbश्री ५ को सरकार शिक्षा मन्त्रालय, शिक्षा विभाग,\1fc2024 [1967]\1fe(काठमाडौं :\1ffजोरगणेश प्रेस)\1e   \1faKāṭhamāḍauṃ :\1fbŚrī 5 ko Sarakāra Śikshā Mantrālaya, Śikshā Vibhāga,\1fc2024 [1967]\1fe(Kāṭhamāḍauṃ :\1ffJoragaṇeśa Presa)\1e  \1fa[8], 39 p. ;\1fc21 cm.\1e  \1fa5,000 copies printed.\1e  \1faIntroductory note by Śaṃkaralāl Siṃha, the assistant director general of the department of education.\1e  \1faGuidelines for literacy program.\1e  \1faIn Nepali.\1e 0\1faEducation.\1fvEssays.\1e\1faसिंह, प्रचण्डराज,\1fgएम.ए.\1e\1faSiṃha, Pracaṇḍarāj,\1fgEma.E.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4916\1e  \1faLibrary has 2 copies.\1e\1d01015nam a2200193Ka 4500008004300000020000800043245011200051245006400163250002200227250001300249260016500262260012700427300003800554500001700592520009400609546001500703650002200718852008100740\1e090114s1967    np a          000 e nep d  \1e  \1fcnil\1e00\1fa९ वौं गोर्खा राइफल्स्‍को एक सय पचास वर्ष.\1e00\1fa9 vauṃ gorkhā rāiphals‍ko eka saya pacāsa varsha.\1e  \1fa[पहिलो]\1e  \1fa[Pahilo]\1e  \1faकाठमाडौं :\1fbभारतीय राजदूतावास,\1fc2024 [1967]\1fe(काठमाडौं :\1ffजोरगणेश प्रेस)\1e  \1faKāṭhamāḍauṃ :\1fbBhāratīya Rājadūtāvāsa,\1fc2024 [1967]\1fe(Kāṭhamāḍauṃ :\1ffJoragaṇeśa Presa)\1e  \1fa[1], 15 p. :\1fbill. ;\1fc15 x 22 cm.\1e  \1faCover title.\1e  \1faPublication of the 150 years of Gorkha rifels, highlighting their history and activities.\1e  \1faIn Nepali.\1e 0\1faHistory.\1fvEssays.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4917\1e\1d01075nam a2200193Ka 4500008004300000020000800043245015800051245008900209250002200298250001300320260016900333260012300502300003300625500001700658520008300675546001500758650002700773852008100800\1e090114s1967    np a          000 e nep d  \1e  \1fcnil\1e00\1faसाझा (सहकारी) संस्थाको संचालकको कर्त्तव्य र उत्तरदायित्व.\1e00\1faSājhā (sahakārī) saṃsthāko saṅcālakako karttavya ra uttaradāyitva.\1e  \1fa[पहिलो]\1e  \1fa[Pahilo]\1e  \1faकाठमाडौं :\1fbकृषि विकास तथ्याङ्क,\1fc2024 [1967]\1fe(काठमाडौं :\1ffजोरगणेश प्रेस)\1e  \1faKāṭhamāḍauṃ :\1fbKṛshi Vikāsa Tathyāṅka,\1fc2024 [1967]\1fe(Kāṭhamāḍauṃ :\1ffJoragaṇeśa Presa)\1e  \1fa[1], 18 p. :\1fbill. ;\1fc22 cm.\1e  \1faCover title.\1e  \1faDiscussion on the responsibilities and duties of Sajha Sanstha, a cooperative.\1e  \1faIn Nepali.\1e 0\1faCooperatives.\1fvEssays.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4918\1e\1d01127nam a2200193Ka 4500008004300000020000800043245019900051245012300250250002200373250001300395260014400408260011100552300003800663500001700701520009700718546001500815650002200830852008100852\1e090114s1967    np ad         000 0 nep d  \1e  \1fcnil\1e00\1faसहकारी बैंक नेपाल शेयर धनीहरूको पहिलो साधारण सभामा पेश गरिएको प्रतिवेदन.\1e00\1faSahakārī baiṃka Nepāla śeyara dhanīharūko pahilo sādhāraṇa sabhāmā peśa garieko prativedana.\1e  \1fa[पहिलो]\1e  \1fa[Pahilo]\1e  \1faकाठमाडौं :\1fbसहकारी बैक,\1fc2024 [1967]\1fe(काठमाडौं :\1ffजोरगणेश प्रेस)\1e  \1faKāṭhamāḍauṃ :\1fbSahakārī Baika,\1fc2024 [1967]\1fe(Kāṭhamāḍauṃ :\1ffJoragaṇeśa Presa)\1e  \1fa[23] p. :\1fbill., tables ;\1fc28 cm.\1e  \1faCover title.\1e  \1faReport presented in the first general assembly of the share holders of the cooperative bank.\1e  \1faIn Nepali.\1e 0\1faReport.\1fvUnknown.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4919\1e\1d01025nam a2200229Ka 4500008004300000020001400043020001000057100004400067100002900111245006200140245004300202250004300245250002700288260015000315260011100465300002000576500002600596520004200622546001500664650003500679852008100714\1e090114s1966    np            000 m nep d  \1e  \1fcरु. 1\1e  \1fcRu. 1\1e\1faजोशी, हरिहरराज.\1e\1faJośī, Harihararāj.\1e10\1faसोरठी /\1fcहरिहरराज जोशी.\1e10\1faSoraṭhī /\1fcHarihararāj Jośī.\1e  \1faपहिलो संस्करण.\1e  \1faPahilo saṃskaraṇa.\1e  \1faकाठमाडौं :\1fbरूयायन प्रकाशन,\1fc2023 [1966]\1fe(काठमाडौं :\1ffनेपाल प्रेस)\1e  \1faKāṭhamāḍauṃ :\1fbRūyāyan Prakāśana,\1fc2023 [1966]\1fe(Kāṭhamāḍauṃ :\1ffNepāl Presa)\1e  \1fa80 p. ;\1fc21 cm.\1e  \1fa1,000 copies printed.\1e  \1faReview of the Nepali folk literature.\1e  \1faIn Nepali.\1e 0\1faFolk literature.\1fvMixed forms.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4920\1e\1d01038nam a2200205Ka 4500008004300000020002500043020001700068100004100085100002900126245010000155245006400255250004300319250002900362260016600391260012200557300002500679546001500704650003200719852008100751\1e090114s1967    np            000 f nep d  \1e  \1fcमूल्य 1.50\1e  \1fcMūlya 1.50\1e\1faकोइराला, शंकर.\1e\1faKoirālā, Śaṅkar.\1e10\1faदुई ड्राइभर :\1fbउपन्यास /\1fcशंकर कोइराला.\1e10\1faDuī Ḍrāibhar :\1fbUpanyāsa /\1fcŚaṅkar Koirālā.\1e  \1faप्रथम संस्करण.\1e  \1faPrathama saṃskaraṇa.\1e  \1faकाठमाडौं :\1fbरत्न पुस्तक भण्डार,\1fc2024 [1967]\1fe(बनारस :\1ffसगरमाथा छापाखाना)\1e  \1faKāṭhamāḍauṃ :\1fbRatna Pustak Bhaṇḍāra,\1fc2024 [1967]\1fe(Banāras :\1ffSagaramāthā Chāpākhānā)\1e  \1fa[1], 80 p. ;\1fc18 cm.\1e  \1faIn Nepali.\1e 0\1faNepali literature.\1fvNovels.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4921\1e\1d00867nam a2200217Ka 4500008004300000020000800043100002800051100001900079245005200098245003300150250002200183250001300205260015500218260008600373300003300459500001100492500001700503520003300520546001500553852008100568\1e090114s1947    ii a          000 j nep d  \1e  \1fcnil\1e\1faफादर हेग.\1e\1faPhādar Hega.\1e10\1faयेसु र म /\1fcफादर हेग.\1e10\1faYesu ra ma /\1fcPhādar Hega.\1e  \1fa[पहिलो]\1e  \1fa[Pahilo]\1e  \1fa[कलकत्ता :]\1fb[येसु समाज संगति,]\1fc[2004] 1947\1fe(रांची :\1ffक्याथोलिक प्रेस)\1e  \1fa[Kalakattā : ]\1fb[yesu Samāja Saṅgati,]\1fe(Rāṃcī :\1ffKyātholika Presa)\1e  \1fa[2], 82 p. :\1fbill. ;\1fc18 cm.\1e  \1faStory.\1e  \1faCover title.\1e  \1faChristian religious stories.\1e  \1faIn Nepali.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4922\1e\1d01074nam a2200217Ka 4500008004300000020000800043100004900051100003100100245014600131245009000277250002200367250001300389260015100402260008300553300002500636500001100661500001700672520007100689546001500760852008100775\1e090114s1960    ii            000 j nep d  \1e  \1fcnil\1e\1faदोइल, फादर,\1fcएस. जे.\1e\1faDoila, Phādar,\1fcEsa. Je.\1e10\1faअऊ मेरो पछि लाग :\1fbभगवानको बोलाओट /\1fcलेखक फादर दोइल एस. जे.\1e10\1faAū mero pachhi lāga :\1fbBhagavānako bolāoṭ /\1fcLekhaka Phādar Doil Esa. Je.\1e  \1fa[पहिलो]\1e  \1fa[Pahilo]\1e  \1fa[कलकत्ता :]\1fb[फादर फर्डिनेण्ड,]\1fc[2017] 1960\1fe(बनारस :\1ffअलफोन्स प्रेस)\1e  \1fa[Kalakattā :]\1fb[Phādar Pharḍineṇḍa,]\1fe(Banāras :\1ffAlaphonsa Presa)\1e  \1fa44, [1] p. ;\1fc16 cm.\1e  \1faStory.\1e  \1faCover title.\1e  \1faCall to believe christianity and some christian religious stories.\1e  \1faIn Nepali.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4923\1e\1d00928nam a2200193Ka 4500008004300000020000800043245010200051245005800153250002200211250001300233260015200246260010500398300003300503500001100536500001700547520007400564546001500638852008100653\1e090114q19501959ii a          000 j nep d  \1e  \1fcnil\1e00\1faकाथलिक धर्मपुस्तक इतिहास :\1fbनेपालीमा.\1e00\1faKāthalika Dharmapustak Itihāsa :\1fbNepālīmā.\1e  \1fa[पहिलो]\1e  \1fa[Pahilo]\1e  \1fa[कलकत्ता :]\1fb[फादर फर्डिनेण्ड,]\1fc[200-?] [195-?]\1fe(रांची :\1ffकाथलिक प्रेस)\1e  \1fa[Kalakattā : ]\1fb[Phādar Pharḍineṇḍa,]\1fc[200-?] [195-?]\1fe(Rāṃcī :\1ffKāthalika Presa)\1e  \1fa46, [2] p. :\1fbill. ;\1fc22 cm.\1e  \1faStory.\1e  \1faCover title.\1e  \1faChristian religious stories from the old and new testaments of Bible.\1e  \1faIn Nepali.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4924\1e\1d00958nam a2200205Ka 4500008004300000020000800043100004900051100002900100245009700129245005600226250002200282250001300304260015700317260009900474300002500573500001100598520004700609546001500656852008100671\1e090114s1959    ii            000 p nep d  \1e  \1fcnil\1e\1faयोञ्जन, पास्कल,\1fetr.\1e\1faYoñjan, Pāskal,\1fetr.\1e10\1faपवित्र घडी /\1fcअनुवादक पास्कल योञ्जन.\1e10\1faPavitra ghaḍī /\1fcAnuvādaka Pāskal Yoñjan.\1e  \1fa[पहिलो]\1e  \1fa[Pahilo]\1e  \1fa[कलकत्ता :]\1fb[फादर फर्डिनेण्ड,]\1fc[2016] 1959\1fe(खरसाङ्ग :\1ffअलफोन्स प्रेस)\1e  \1fa[Kalakattā : ]\1fbPhādar Pharḍineṇḍa,\1fc[2016] 1959\1fe(Kharasāṅg :\1ffAlaphonsa Presa)\1e  \1fa[4], 33 p. ;\1fc17 cm.\1e  \1faPoems.\1e  \1faCollection of christian religious prayers.\1e  \1faIn Nepali.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4925\1e\1d00830nam a2200217Ka 4500008004300000020000800043100004100051100002500092245007700117245004000194250002200234250001300256260008800269260005900357300002000416500001100436500001700447520005200464546001500516852008100531\1e090114s1967    ii            000 j nep d  \1e  \1fcnil\1e\1faफ्यारेल, फादर.\1e\1faPhyārel, Phādar.\1e10\1faप्रश्नोत्तर /\1fcफादर फ्यारेल.\1e10\1faPraśnottar /\1fcPhādar Phyārel.\1e  \1fa[पहिलो]\1e  \1fa[Pahilo]\1e  \1fa[दार्जीलिङ :]\1fb[फादर फ्यारेल,]\1fc[2024] 1967\1e  \1fa[Dārjīliṅ :]\1fb[Phādar Phyārel,]\1fc[2024] 1967\1e  \1fa40 p. ;\1fc16 cm.\1e  \1faStory.\1e  \1faCover title.\1e  \1faQuestions and answers about christian religion.\1e  \1faIn Nepali.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4926\1e\1d00962nam a2200193Ka 4500008004300000020000800043245009700051245005700148250002200205250001300227260017200240260012800412300002000540500001700560520007400577546001500651650002100666852008100687\1e090114s1965    np            000 0 nep d  \1e  \1fcnil\1e00\1faवाह्रौं वार्षिक विवरण :\1fbवि. सं. २०२२.\1e00\1faVāhrauṃ vārshika vivaraṇ :\1fbvi. saṃ. 2022.\1e  \1fa[पहिलो]\1e  \1fa[Pahilo]\1e  \1faकाठमाडौं :\1fbगांधी आदर्श विद्यालय,\1fc2022 [1965]\1fe(काठमाडौं :\1ffजोरगणेश प्रेस)\1e  \1faKāṭhamāḍauṃ :\1fbGāṅdhī Ādarśa Vidyālaya,\1fc2022 [1965]\1fe(Kāṭhamāḍauṃ :\1ffJoragaṇeśa Presa)\1e  \1fa58 p. ;\1fc15 cm.\1e  \1faCover title.\1e  \1faDetails of the 12th annual function program of Gandhi Adarsha School.\1e  \1faIn Nepali.\1e 0\1faReport.\1fvUknown.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4927\1e\1d00944nam a2200205Ka 4500008004300000020000800043245004900051245002800100250002200128250001300150260017400163260012500337300002900462500001700491500004500508520005500553546002800608650002100636852008100657\1e090114q19601969np            000 0 nep d  \1e  \1fcnil\1e\1faचित्र संग्रहालय.\1e\1faCitra saṅgrahālaya.\1e  \1fa[पहिलो]\1e  \1fa[Pahilo]\1e  \1faकाठमाडौं :\1fbनेपाल आर्ट काउन्सिल,\1fc[201- ?] [196-?]\1fe(काठमाडौं :\1ffजोरगणेश प्रेस)\1e  \1faKāṭhamāḍauṃ :\1fbNepāl Ārṭa Kāunsila,\1fc[200- ?] [196-?]\1fe(Kāṭhamāḍauṃ :\1ffJoragaṇeśa Presa)\1e  \1fa[8], 13, 13 p. ;\1fc24 cm.\1e  \1faCover title.\1e  \1faIntroduction by Lainasiṃha Vāṅdel.\1e  \1faCatalogue of the art gallery in Nepal Art council.\1e  \1faIn Nepali, and English.\1e 0\1faIndex.\1fvUnknown.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4928\1e\1d01201nam a2200229Ka 4500008004300000020001700043020001300060100005700073100004100130245007900171245005600250250004900306250003000355260020200385260012500587300003700712500003400749520005300783546002900836650002500865852008100890\1e090114s1967    np a          000 0 nep d  \1e  \1fcरु. 1.80\1e  \1fcRu. 1.80\1e\1faआ.दी., पार्थमणि,\1fgबी. ए.\1e\1faĀ.dī., Pārthamaṇi,\1fgBī. E.\1e10\1faसंस्कृतवाणी /\1fcपार्थमणि आ. दी.\1e10\1faSaṃskṛtavāṇī /\1fcPārthamaṇi Ā. Dī.\1e  \1faद्वितीय संस्करण.\1e  \1faDvitīya saṃskaraṇa.\1e  \1faकाठमाडौं :\1fbएडुकेशनल इण्टरप्राइज,\1fc2024 [1967]\1fe(काठमाडौं :\1ffएशियन प्रिन्टिङ्ग प्रेस)\1e  \1faKāṭhamāḍauṃ :\1fbEḍukeśanal Iṇṭaraprāija,\1fc2024 [1967]\1fe(Kāṭhamāḍauṃ :\1ffEśiyan Pri. Presa)\1e  \1fa[1], iii,84 p. :\1fbill. ;\1fc18 cm.\1e  \1faCopyright holder: the author.\1e  \1faSanskrit grammar and text for grade VI students.\1e  \1faIn Nepali, and Sanskrit.\1e 0\1faTextbooks.\1fvUnknown.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4929\1e\1d01413nam a2200241Ka 4500008004300000020001600043020001200059100005300071100003100124245023200155245013600387250004300523250002900566260017500595260011000770300003300880500003700913500004600950520005400996546001501050650002501065852008101090\1e090114s1966    np a          000 0 nep d  \1e  \1fcरु.3.60\1e  \1fcRu.3.60\1e\1faथापा, नेत्रबहादुर,\1e\1faThāpā, Netrabahādur,\1e10\1faबाल सामाजिक शिक्षा :\1fbभूगोल, अर्थशास्त्र, इतिहास र नागरिक ज्ञान /\1fcलेखक नेत्रबहादुर थापा.\1e10\1faBāla sāmājika śikshā :\1fbBhūgol, arthaśāstra, itihāsa ra nāgarika jñāna /\1fcLekhaka Netrabahādur Thāpā.\1e  \1faप्रथम संस्करण.\1e  \1faPrathama saṃskaraṇa.\1e  \1faकाठमाडौं :\1fbचन्द्रप्रसाद एण्ड व्रदर्श,\1fc2023 [1966]\1fe(बनारस :\1ffकल्पना प्रेस)\1e  \1faKāṭhamāḍauṃ :\1fbCandraprasād Eṇḍa Vradarśa,\1fc2023 [1966]\1fe(Banāras :\1ffKalpanā Presa)\1e  \1faiv, 190 p. :\1fbill. ;\1fc18 cm.\1e  \1faPrinted by Vaijanāth Prasād.\1e  \1faApproved as a textbook by the government.\1e  \1faTextbook of social studies for grade VI students.\1e  \1faIn Nepali.\1e 0\1faTextbooks.\1fvUnknown.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4930\1e\1d01213nam a2200241Ka 4500008004300000020003000043020002100073100005900094100003400153245014600187245008500333250004300418250002800461260015300489260011200642300002300754500001100777500002600788520002800814546001500842650003300857852008100890\1e090114s1967    np            000 p nep d  \1e  \1fcरु.1. 25 पैसा\1e  \1fcRu.1. 25 paisā\1e\1faकाफ्ले, कृष्णप्रसाद.\1e\1faKāphle, Kṛshṇaprasād.\1e10\1faकोपिलाहरू :\1fbकविता संग्रह /\1fcरचयिता कृष्णप्रसाद काफ्ले.\1e10\1faKopilāharū :\1fbkavitā saṅgraha /\1fcRacayitā Kṛshṇaprasād Kāphle.\1e  \1faप्रथम संस्करण.\1e  \1faPratham saṃskaraṇa.\1e  \1faविराटनगर :\1fbसुषमा प्रकाशन,\1fc2024 [1967]\1fe(बनारस :\1ffसगरमाथा छापाखाना)\1e  \1faVirāṭanagar :\1fbSushamā Prakāśana,\1fc2024 [1967]\1fe(Banāras :\1ffSagaramāthā Chāpākhānā)\1e  \1fa2, 65 p. ;\1fc18 cm.\1e  \1faPoems.\1e  \1fa1,000 copies printed.\1e  \1faCollection of 39 poems.\1e  \1faIn Nepali.\1e 0\1faNepali Literature. \1fvPoetry.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4931\1e\1d00975nam a2200217Ka 4500008004300000020002200043020001700065100004700082100002800129245009000157245005700247250002200304250001300326260013900339260009400478300002000572500003700592546001500629650003200644852008100676\1e090114q19601969ii            000 f nep d  \1e  \1fc75.  पैसा\1e  \1fc75.  paisā\1e\1faरैका, जितबहादुर.\1e\1faRaikā, Jitabahādur.\1e10\1faपाँचलाखको हीरा /\1fcजितबहादुर रैका.\1e10\1faPā̃calākhako hīrā /\1fcJitabahādur Raikā.\1e  \1fa[पहिलो]\1e  \1fa[Pahilo]\1e  \1faदार्जीलिङ :\1fbशिवराज शर्मा,\1fc[201-?] [196-?]\1fe(बनारस :\1ffदीपक प्रेस)\1e  \1faDārjīliṅa :\1fbŚivarāja Śarmā,\1fc[201-?] [196-?]\1fe(Banāras :\1ffDīpak Presa)\1e  \1fa19 p. ;\1fc16 cm.\1e  \1faPrinted by Mahādeva Prasāda.\1e  \1faIn Nepali.\1e 0\1faNepali literature.\1fvNovels.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4932\1e\1d01136nam a2200217Ka 4500008004300000020001400043020001000057100006200067100003400129245013700163245008000300250004300380250002900423260016300452260011000615300002400725500004100749546001500790650003200805852008100837\1e090114q19601969np            000 f nep d  \1e  \1fcरु. 2\1e  \1fcRu. 2\1e\1faप्याकुर्‌याल, योगनाथ.\1e\1faPyākur‌yāl, Yoganāth.\1e10\1faबदला :\1fbसामाजिक उपन्यास /\1fcलेखक योगनाथ प्याकुर्‌याल.\1e10\1faBadalā :\1fbsāmājika upanyāsa /\1fcLekhaka Yoganāth Pyākur‌yāl.\1e  \1faप्रथम संस्करण.\1e  \1faPrathama saṃskaraṇa.\1e  \1faकाठमाडौं :\1fbप्याकुर्‌याल प्रकाशन,\1fc[201-?] [196-?]\1fe(बनारस :\1ffगोपाल प्रेस)\1e  \1faKāṭhamāḍauṃ :\1fbPyākur‌yāla Prakāśana,\1fc[201-?] [196-?]\1fe(Banāras :\1ffGopāla Presa)\1e  \1fa2, 108 p. ;\1fc17 cm.\1e  \1faPrinted by Ramāsaṃkar Prasāda.\1e  \1faIn Nepali.\1e 0\1faNepali literature.\1fvNovels.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4933\1e\1d01217nam a2200229Ka 4500008004300000020001400043020001000057100007600067100005100143245012700194245007200321250004300393250002700436260015900463260009900622300004400721500002600765520006300791546002700854650002500881852008100906\1e090114s1965    np f          000 d nep d  \1e  \1fcरु. 4\1e  \1fcRu. 4\1e\1faशिवाकोटी, पुष्पलाल,\1fetr.,\1fgबी. ए.\1e\1faŚivākoṭī, Pushpalāl,\1fetr.,\1fgBī. E.\1e10\1faवेनिसको व्यापारी /\1fcअनुवादक पुष्पलाल शिवाकोटी.\1e10\1faVenisako vyāpārī /\1fcAnuvādaka Pushpalāl Śivākoṭī.\1e  \1faपहिलो संस्करण.\1e  \1faPahilo saṃskaraṇa.\1e  \1faदार्जीलिङ :\1fbश्रीमती कल्पना,\1fc[2022] 1965\1fe(दार्जीलिङ :\1ffहिमालय प्रेस)\1e  \1faDārjīliṅa :\1fbŚrīmatī Kalpanā,\1fc[2022] 1965\1fe(Dārjīliṅa :\1ffHimālay Presa)\1e  \1fa[4], 96 p. [1] leaf of plates ;\1fc20 cm.\1e  \1fa1,000 copies printed.\1e  \1faTranslated from the original English "Marchent of Venice".\1e  \1faIn Nepali and english.\1e 0\1faLiterature.\1fvDramas.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4934\1e\1d01290nam a2200229Ka 4500008004300000020002100043020001600064100005300080100002900133245018600162245010300348250004300451250002700494260019100521260011600712300002600828500001700854520006100871546001500932650003200947852008100979\1e090114s1966    ii            000 e nep d  \1e  \1fcभा.रु. 3\1e  \1fcBhā.ru. 3\1e\1faराई, इन्द्रबहादुर.\1e\1faRāī, Indrabahādur.\1e10\1faटिपेका टिप्पणीहरू :\1fbसमिक्षात्मक लेखहरुको संग्रह /\1fcइन्द्रबहादुर राई.\1e10\1faṬipekā ṭippaṇīharū :\1fbsamikshātmak lekhaharuko saṅgraha /\1fcIndrabahādur Rāī.\1e  \1faपहिलो संस्करण.\1e  \1faPahilo saṃskaraṇa.\1e  \1faदार्जीलिङ :\1fbनेपाल साहित्य परिषद,\1fc[2023] 1966\1fe(दार्जीलिङ :\1ffमणि प्रिण्टिङ प्रेस)\1e  \1faDārjīliṅa :\1fbNepāla Sāhitya Parishada,\1fc[2023] 1966\1fe(Dārjīliṅa :\1ffMaṇi Priṇṭiṅa Presa)\1e  \1fa[2], 132 p. ;\1fc24 cm.\1e  \1faCover title.\1e  \1faCollection of reviews and articles of Indra Bahadur Rai.\1e  \1faIn Nepali.\1e 0\1faNepali literature.\1fvEssays.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4935\1e\1d01199nam a2200229Ka 4500008004300000020003000043020002100073100004700094100002200141245012000163245007100283250004300354250002900397260019700426260012000623300002400743500004500767520003000812546001500842650003100857852008100888\1e090114s1967    ii            000 j nep d  \1e  \1fcरु 2. 60 पैसा\1e  \1fcRu 2. 60 paisā\1e\1faसुन्दास, इन्द्र.\1e\1faSundāsa, Indra.\1e10\1faरानी खोला :\1fbकथा संग्रह /\1fcलेखक इन्द्र सुन्दास.\1e10\1faRānī kholā :\1fbkathā saṅgraha /\1fcLekhaka Indra Sundāsa.\1e  \1faप्रथम संस्करण.\1e  \1faPrathama saṃskaraṇa.\1e  \1faदार्जीलिङ :\1fbनेपाली ग्रन्थ प्रकाशन,\1fc[2024] 1967\1fe(दार्जीलिङ :\1ffमणि प्रिण्टिङ प्रेस)\1e  \1faDārjīliṅa :\1fbNepālī Grantha Prakāśana,\1fc[2024] 1967\1fe(Dārjīliṅa :\1ffMaṇi Priṇṭiṅa Presa)\1e  \1fa6, 160 p. ;\1fc18 cm.\1e  \1faPrinted by Nāgendra Maṇi Pradhāna.\1e  \1faCollection of 12 stories.\1e  \1faIn Nepali.\1e 0\1faNepali literature.\1fvStory.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4936\1e\1d01228nam a2200253Ka 4500008004300000020004000043020002800083100005900111100002900170245009600199245005200295250004300347250002900390260015500419260010300574300002500677500001100702500002600713500004000739520006700779546001500846650003200861852008100893\1e090114s1966    ii            000 p nep d  \1e  \1fcरु. 1. 50 नयापैसा\1e  \1fcRu. 1. 50 nayāpaisā\1e\1faमोक्तान, वुद्धकुमार.\1e\1faMoktān, Vuddhakumār.\1e10\1faआत्माको आवाज /\1fcवुद्धकुमार मोक्तान.\1e10\1faĀtmāko āvāja /\1fcVuddhakumār Moktān.\1e  \1faप्रथम संस्करण.\1e  \1faPrathama saṃskaraṇa.\1e  \1faखरसाङ्ग :\1fbभिक्षु कर्मा ग्याल्छेन वल,\1fc2023 [1966]\1fe(बनारस :\1ffछपाई घर)\1e  \1faKharasāṅga :\1fbBhikshu Karmā Gyālchhena Vala,\1fc2023 [1966]\1fe(Banāras :\1ffChapāī Ghara)\1e  \1fa[4], 86 p. ;\1fc18 cm.\1e  \1faPoems.\1e  \1fa1,000 copies printed.\1e  \1faPrinted by Om Prakāśa Śāha.\1e  \1faCollection of 26 poems covering Buddhist religious philosophy.\1e  \1faIn Nepali.\1e 0\1faNepali literature.\1fvPoetry.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4937\1e\1d01209nam a2200217Ka 4500008004300000020000900043100008200052100004700134245014300181245008600324250002200410250001300432260020200445260013400647300001900781500001700800520005500817546001500872650002300887852008100910\1e090114q19501959np            000 e nep d  \1e  \1fcnil.\1e\1faईश्वरीप्रसाद, \1fcक्रान्तिकारी.\1e\1faĪśvarīprasāda, \1fcKrāntikārī.\1e10\1faदेश सत्तालाई खतरा /\1fcलेखक ईश्वरीप्रसाद क्रान्तिकारी.\1e10\1faDeśa sattālāī khatarā /\1fcLekhaka Īśvarīprasād Krāntikārī.\1e  \1fa[पहिलो]\1e  \1fa[Pahilo]\1e  \1faकाठमाडौं :\1fbईश्वरीप्रसाद क्रान्तिकारी,\1fc[200-?] [195-?]\1fe(काठमाडौं :\1ffअन्नपुर्णा प्रेस)\1e  \1faKāṭhamāḍauṃ :\1fbĪśvarīprasāda Krāntikārī,\1fc[200-?] [195-?]\1fe(Kāṭhamāḍauṃ :\1ffAnnapurṇā Presa)\1e  \1fa9 p. ;\1fc16 cm.\1e  \1faCover title.\1e  \1faPolitical statement against Nepali Congress party.\1e  \1faIn Nepali.\1e 0\1faPolitics.\1fvEssays.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4938\1e\1d00745nam a2200205Ka 4500008004300000020000800043100001500051245006900066250002200135250001300157260006700170260005600237300002400293500001700317500005000334520003100384546002700415650001600442852008100458\1e090114s1968    np       d    000 0 nep d  \1e  \1fcnil\1e\1faChen, S.f.\1e10\1faComprehensive English Nepali Dictionary.\1fcCompiled by S.f. Chen.\1e  \1fa[पहिलो]\1e  \1fa[Pahilo]\1e  \1faकाठमाडौं :\1fbयु.एस.एड,\1fc[2025] 1968\1e  \1faKāṭhamāḍauṃ :\1fbYu.esa.eḍa,\1fc[2025] 1968\1e  \1fa23, 14 p. ;\1fc35 cm.\1e  \1faCover title.\1e  \1faTransliteration of the Nepali words provided.\1e  \1faEnglish-Nepali dictionary.\1e  \1faIn Nepali and English.\1e 0\1faDictionary.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4939\1e\1d01197nam a2200229Ka 4500008004300000020001400043020001000057100007800067100004100145245016300186245009300349250004300442250002800485260011800513260007900631300004700710500001700757500002600774520005800800546002800858852008100886\1e090114s1967    np f          000 m nep d  \1e  \1fcरु. 4\1e  \1fcRu. 4\1e\1faक्षेत्री, रामबहादुर गोतामे.\1e\1faKshetrī, Rāmabahādur Gotāme.\1e10\1faवेदान्त संग्रह :\1fbतृतीय भाग /\1fcलेखक रामबहादुर गोतामे क्षेत्री.\1e10\1faVedānta saṃgrah :\1fbtṛtīya bhāga /\1fcLekhaka Rāmabahādur Gotāme Kshetrī.\1e  \1faप्रथम संस्करण.\1e  \1faPratham saṃskaraṇa.\1e  \1faकाठमाडौं :\1fbरामवहादुर गोतामे क्षेत्री,\1fc2024 [1967]\1e  \1faKāṭhamāḍauṃ :\1fbRāmavahādura Gotāme Kshetrī,\1fc2024 [1967]\1e  \1fa[6], 252 p. [3] leaves of plates ;\1fc17 cm.\1e  \1faMixed forms.\1e  \1fa1,000 copies printed.\1e  \1faCollection of Hindu religious philosophy and stories.\1e  \1faIn Nepali and Sanskrit.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4940\1e\1d01273nam a2200205Ka 4500008004300000020000800043110009700051110006000148245014000208245007400348250002200422250001300444260019800457260013300655300004700788520009600835546002800931650002700959852008100986\1e090114q19601969np f          000 0 nep d  \1e  \1fcnil\1e\1faश्री ५ को सरकार. \1fbकृषि प्रचार विभाग..\1e\1faŚrī 5 ko Sarakāra. \1fbKṛshi Pracāra Vibhāga.\1e10\1faकृषि विकास कार्यमा पीस कोर स्वयम सेवकहरु २०२३-२०२५.\1e10\1faKṛshi vikāsa kāryamā pīsa kora svayam sevakaharu 2023-2025.\1e  \1fa[पहिलो]\1e  \1fa[Pahilo]\1e  \1faकाठमाडौं :\1fbकृषि प्रचार विभाग,\1fc[201-?] [196-?]\1fe(काठमाडौं :\1ffशान्ति प्रिन्टिङ्ग प्रेस)\1e  \1faKāṭhamāḍauṃ :\1fbKṛshi Pracāra Vibhāga,\1fc[201-?] [196-?]\1fe(Kāṭhamāḍauṃ :\1ffŚānti Prinṭiṅga Presa)\1e  \1fa35, [1] p., [2] leaves of plates ;\1fc26 cm.\1e  \1faDiscussion on the role of Peace Corpus volunteers in the agricultural development of Nepal.\1e  \1faIn Nepali, and English.\1e 0\1faAgriculture.\1fvUnknown.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4941\1e\1d01147nam a2200217Ka 4500008004300000020002000043020001500063100011200078100007300190245014900263245008500412250002200497250001300519260014400532260008900676300002500765500001100790546001500801650003200816852008100848\1e090114s1967    np            000 p nep d  \1e  \1fc50 पैसा\1e  \1fc50 paisā\1e\1faदेवकोटा, लक्ष्मीप्रसाद,\1fcमहाकवि,\1fd1966-2016 [1909-1959]\1e\1faDevakoṭā, Lakshmīprasād,\1fcMahākavi,\1fd1966-2016 [1909-1959]\1e10\1faराजकुमार प्रभाकर /\1fcलेखक महाकवि लक्ष्मीप्रसाद देवकोटा.\1e10\1faRājakumāra prabhākar /\1fcLekhaka Mahākavi Lakshmīprasād Devakoṭā.\1e  \1fa[पहिलो]\1e  \1fa[Pahilo]\1e  \1faललितपुर :\1fbसाझा प्रकाशन,\1fc2024 [1967]\1fe(ललितपुर :\1ffजगदम्बा प्रेस)\1e  \1faLalitapur :\1fbSājhā Prakāśana,\1fc2024 [1967]\1fe(Lalitapur :\1ffJagadambā Presa)\1e  \1fa[2], 18 p. ;\1fc18 cm.\1e  \1faPoems.\1e  \1faIn Nepali.\1e 0\1faNepali literature.\1fvPoetry.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4942\1e\1d01315nam a2200241Ka 4500008004300000020001400043020001000057100004700067100003200114245020000146245011500346250003100461250002100492260015600513260011800669300004800787500002600835500002100861520005200882546002700934650003100961852008100992\1e090114s1966    np a          000 e nep d  \1e  \1fcरु. 6\1e  \1fcRu. 6\1e\1faसिंह, भवानीभक्त.\1e\1faSiṃha, Bhavānībhakta.\1e10\1faस्वास्थ्य सेवा :\1fbनेपाली भाषामा पाश्चात्य स्वास्थ्य /\1fcलेखक भवानीभक्त सिंह.\1e10\1faSvāsthya sevā :\1fbNepālī bhāshāmā pāścātya svāsthya /\1fcLekhaka Bhavānībhakta Siṃha.\1e  \1faप्रथम वार.\1e  \1faPrathama vāra.\1e  \1faकाठमाडौं :\1fbभवानीभक्त सिंह,\1fc2023 [1966]\1fe(काठमाडौं :\1ffजोरगणेश प्रेस)\1e  \1faKāṭhamāḍauṃ :\1fbBhavānībhakta Siṃha,\1fc2023 [1966]\1fe(Kāṭhamāḍauṃ :\1ffJoragaṇeśa Presa)\1e  \1faiii, ii, iii, 275, [1] p. :\1fbill. ;\1fc18 cm.\1e  \1fa2,000 copies printed.\1e  \1faErrata Provided.\1e  \1faSimplified health education for Nepali readers.\1e  \1faIn Nepali and English.\1e 0\1faHealth education.\1fvEssays.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4943\1e\1d01084nam a2200205Ka 4500008004300000020000800043100005000051100003200101245011000133245007100243250003000314250001900344260017800363260012400541300004600665500002600711546002800737650003200765852008100797\1e090114s1967    np f          000 d nep d  \1e  \1fcnil\1e\1faउपाध्याय, गुणराज.\1e\1faUpādhyāya, Guṇarāj.\1e10\1faकलङ्क मोचन :\1fbनाटक /\1fcलेखक गुणराज उपाध्याय.\1e10\1faKalaṅka Mocan :\1fbNāṭak /\1fcLekhaka Guṇarāj Upādhyāya.\1e  \1faप्रथमबार.\1e  \1faPrathamabār.\1e  \1faकाठमाडौं :\1fbगुणराज उपाध्याय,\1fc2024 [1967]\1fe(काठमाडौं :\1ffन्यू प्रिण्टिङ प्रेस)\1e  \1faKāṭhamāḍauṃ :\1fbGuṇarāj Upādhyāya,\1fc2024 [1967]\1fe(Kāṭhamāḍauṃ :\1ffNyū Priṇṭiṅa Presa)\1e  \1fa[2], 112 p., [1] leaf of plates ;\1fc25 cm.\1e  \1fa1,000 copies printed.\1e  \1faIn Nepali, and English.\1e 0\1faNepali literature.\1fvDramas.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4944\1e\1d01056nam a2200217Ka 4500008004300000020000800043110008900051110005100140245011200191245005900303250002200362250001300384260012700397260008600524300003900610500001700649520005400666546001500720650002200735852008100757\1e090114s1967    np d         f000 0 nep d  \1e  \1fcnil\1e\1faश्री ५ को सरकार. \1fbअर्थ मन्त्रालय.\1e\1faŚrī 5 ko Sarakāra. \1fbArtha Mantrālaya.\1e10\1faआर्थिक वर्ष २०२४/२५ को पूरक बजेट वक्तव्य.\1e10\1faĀrthika varsha 2024/25 ko pūrak bajeṭa vaktavya.\1e  \1fa[पहिलो]\1e  \1fa[Pahilo]\1e  \1faकाठमाडौं :\1fbश्री ५ को सरकार अर्थ मन्त्रालय,\1fc2024 [1967]\1e  \1faKāṭhamāḍauṃ :\1fbŚrī 5 ko Sarakāra Artha Mantrālaya,\1fc2024 [1967]\1e  \1fa[1], 11, ix p. :\1fbtables ;\1fc26 cm.\1e  \1faCover title.\1e  \1faSupplimentary budget statement speech of 1667/68.\1e  \1faIn Nepali.\1e 0\1faBudget.\1fvUnknown.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4945\1e\1d01513nam a2200253Ka 4500008004300000020001600043020001100059110008900070110005500159245014700214245009000361250003000451250002000481260022900501260016300730300003000893500002600923520010500949546001501054650003201069700004701101700003001148852008101178\1e090114s1966    np           f000 d nep d  \1e  \1fcमोल 1\1e  \1fcMola 1\1e\1faश्री ५ को सरकार. \1fbसंस्कृति विभाग.\1e\1faŚrī 5 ko Sarakāra. \1fbSaṃskṛti Vibhāga.\1e10\1faशिलान्यास :\1fbमौलिक ऐतिहासिक नाटक /\1fcलेखक भीमनिधि तिवारी.\1e10\1faŚilānyāsa :\1fbmaulika aitihāsika nāṭak /\1fcLekhaka Bhīmanidhi Tivārī.\1e  \1faप्रथमबार.\1e  \1faPrathamabāra.\1e  \1faकाठमाडौं :\1fbश्री ५ को सरकार संस्कृति विभाग,\1fc2023 [1966]\1fe(काठमाडौं :\1ffश्री ५ को सरकारको छापाखाना)\1e  \1faKāṭhamāḍauṃ :\1fbŚrī 5 ko Sarakāra Saṃskṛti Vibhāga,\1fc2023 [1966]\1fe(Kāṭhamāḍauṃ :\1ffŚrī 5 ko Sarakārako Chāpākhānā)\1e  \1fa[5], 98, [4] p. ;\1fc18 cm.\1e  \1fa2,000 copies printed.\1e  \1faHistorical drama on the victory of Gorkha Kingdom and Drabya Shah, one of the early kings of Gorkha.\1e  \1faIn Nepali.\1e 0\1faNepali literature.\1fvDramas.\1e\1faतिवारी, भीमनिधि.\1e\1faTivārī, Bhīmanidhi.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4946\1e\1d01315nam a2200229Ka 4500008004300000020003600043020002300079100007400102100003900176245019900215245011000414250002400524250001100548260017000559260012700729300003100856500003900887520003100926546001500957650003200972852008101004\1e090114s1949    np            000 f nep d  \1e  \1fcमो. रु. 64 पैसा\1e  \1fcMo. ru. 64 paisā\1e\1faमल्ल, ऋद्धिबहादुर,\1fcसुब्बा.\1e\1faMalla, Ṛddhibahādur,\1fcSubbā.\1e10\1faशर्मिष्ठा :\1fbशिक्षाप्रद् पौराणिक उपाख्यान /\1fcलेखक सुब्बा ऋद्धिबहादुर मल्ल.\1e10\1faŚarmishṭhā :\1fbśikshāprad paurāṇika upākhyāna /\1fcLekhaka Subbā Ṛddhibahādur Malla.\1e  \1faतेस्रो.\1e  \1faTesro.\1e  \1faकाठमाडौं :\1fbऋद्धिबहादुर मल्ल,\1fc2006 [1949]\1feकाठमाडौं :\1ffजोरगणेश छापाखाना)\1e  \1faKāṭhamāḍauṃ :\1fbṚddhibahādur Malla,\1fc2006 [1949]\1feKāṭhamāḍauṃ :\1ffJoragaṇeśa Chāpākhānā)\1e  \1faiii, [1], 104 p. ;\1fc18 cm.\1e  \1faPrinted by Ṛddhibahādur Malla.\1e  \1faA novel on a Veidic story.\1e  \1faIn Nepali.\1e 0\1faNepali literature.\1fvNovels.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4947\1e\1d01085nam a2200193Ka 4500008004300000020000800043245019800051245010100249250002200350250001300372260016800385260012000553300002000673500001700693520006300710546001500773650002200788852008100810\1e090114s1967    np            000 0 nep d  \1e  \1fcnil\1e00\1faवनस्थली विद्याश्रम बोर्डिङ्ग हाईस्कूल :\1fbसंक्षिप्त परिचयात्मक पुस्तिका.\1e00\1faVanasthalī vidyāśram borḍiṅga hāīskūla :\1fbsaṃkshipta paricayātmak pustikā.\1e  \1fa[पहिलो]\1e  \1fa[Pahilo]\1e  \1faकाठमाडौं :\1fbवनस्थली विद्याश्रम,\1fc2024 [1967]\1fe(काठमाडौं :\1ffजोरगणेश प्रेस)\1e  \1faKāṭhamāḍauṃ :\1fbVanasthalī Vidyāśrama,\1fc2024 [1967]\1fe(Kāṭhamāḍauṃ :\1ffJoragaṇeśa Presa)\1e  \1fa15 p. ;\1fc13 cm.\1e  \1faCover title.\1e  \1faIntroduction to Vanasthali Vidyashram Boarding highschool.\1e  \1faIn Nepali.\1e 0\1faReport.\1fvUnknown.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4948\1e\1d01497nam a2200277Ka 4500008004300000100008000043100004600123245019100169245011000360250004300470250002900513260014400542260010700686300004400793500001100837500002600848500003800874500003400912500004800946500004300994520002801037546001501065650003201080852008101112952002601193\1e090114s1966    np f          000 p nep d  \1e\1faपन्त, भरतराज,\1fcसाहित्याचार्य.\1e\1faPanta, Bharatarāj,\1fcSāhityācārya.\1e10\1faजुनकीरी :\1fbमौलिक बार्णिक कविता संग्रह /\1fcलेखक भरतराज पन्त साहित्याचार्य.\1e10\1faJunakīrī :\1fbMaulika bārṇika kavitā saṅgraha /\1fcLekhaka Bharatarāj Panta Sāhityācārya.\1e  \1faप्रथम संस्करण.\1e  \1faPrathama saṃskaraṇa.\1e  \1faकाठमाडौं :\1fbभरतराज पन्त,\1fc2023 [1966]\1fe(काठमाडौं :\1ffहिमालय प्रेस)\1e  \1faKāṭhamāḍauṃ :\1fbBharatarāj Panta,\1fc2023 [1966]\1fe(Kāṭhamāḍauṃ :\1ffHimālaya Presa)\1e  \1fax, 112 p., [1] leaf of plates ;\1fc18 cm.\1e  \1faPoems.\1e  \1fa1,000 copies printed.\1e  \1faCovered by Bālakṛshṇa Sama.\1e  \1faCopyright holder: the author.\1e  \1faIntroductory note by Bālakṛshṇa Sama.\1e  \1faPreface by  Bhīmanidhī Tivārī.\1e  \1faCollection of 45 poems.\1e  \1faIn Nepali.\1e 0\1faNepali literature.\1fvPoetry.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4949\1e  \1faLibrary has 2 copies.\1e\1d01254nam a2200217Ka 4500008004300000020002700043020001800070100008300088100004600171245019800217245010700415250004300522250002900565260016800594260010200762300002000864500001100884520004500895546001500940852008100955\1e090114s1966    ii            000 p nep d  \1e  \1fcमोल रु. 1.50\1e  \1fcMola ru. 1.50\1e\1faबल, कर्मा ग्याल्छेन,\1fcभिक्षु,\1feed.\1e\1faBala, Karmā Gyālchhen,\1fcBhikshu,\1feed.\1e10\1faवुद्धवाणी चित्त तिलक्ष :\1fbधार्मिक काव्य संकलन /\1fcभिक्षु कर्मा ग्याल्छेन बल.\1e10\1faVuddhavāṇī citta tilaksha :\1fbDhārmika kāvya saṅkalan /\1fcBhikshu Karmā Gyālchhena Bala.\1e  \1faप्रथम संस्करण.\1e  \1faPrathama saṃskaraṇa.\1e  \1faदार्जीलिङ :\1fbसमता धर्मा दीप योगाश्रम,\1fc2023 [1966]\1feवनारस :\1ffकल्याण प्रेस\1e  \1faDārjīliṅ :\1fbSamatā Dharmā Dīpa Yogāśrama,\1fc2023 [1966]\1feBanāras :\1ffKalyan Presa\1e  \1fa99 p. ;\1fc13 cm.\1e  \1faPoems.\1e  \1faCollection of Buddhist religious poetry.\1e  \1faIn Nepali.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4950\1e\1d00985nam a2200217Ka 4500008004300000020000900043100004100052100002700093245009100120245005500211250002200266250001300288260015000301260011500451300002000566500001100586500001700597520004400614546002800658852008100686\1e090114q19501959xx            000 p nep d  \1e  \1fcnil.\1e\1faपाण्डे, नरदेव.\1e\1faPāṇḍe, Naradeva.\1e10\1faश्री गणेश स्तोत्र /\1fcनरदेव पाण्डे.\1e10\1faŚrī gaṇeśa stotra /\1fcNaradeva Pāṇḍe.\1e  \1fa[पहिलो]\1e  \1fa[Pahilo]\1e  \1fa[S.l. :\1fbनरदेव मोतीकृष्ण,\1fc[200-?] [195-?]\1fe(काठमाडौं :\1ffपशुपति छापाखाना)\1e  \1fa[S.l. :\1fbNaradeva Motīkṛshṇa,\1fc[200-?] [195-?]\1fe(Kāṭhamāḍauṃ :\1ffPaśupati Chāpākhānā)\1e  \1fa14 p. ;\1fc14 cm.\1e  \1faPoems.\1e  \1faCover title.\1e  \1faHindu religious prayer of Lord Ganesha.\1e  \1faIn Nepali and Sanskrit.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4951\1e\1d01097nam a2200193Ka 4500008004300000020000800043245016700051245009400218250002200312250001300334260020700347260012500554300002500679500001700704520006400721546001500785650002200800852008100822\1e090114s1967    ii            000 e nep d  \1e  \1fcnil\1e00\1faस्मारक ग्रन्थ /\1fbलोक मनोरञ्जन शाखा को छैटौ बार्षिक उपलक्ष्यमा.\1e00\1faSmārak grantha /\1fbloka manorañjan śākhā ko chaiṭau bārshika upalakshyamā.\1e  \1fa[पहिलो]\1e  \1fa[Pahilo]\1e  \1faदार्जीलिङ :\1fbदार्जीलिङ लोक मनोरञ्जन शाखा,\1fc[2024] 1967\1fe(दार्जीलिङ :\1ffजीवन ज्योति प्रेस)\1e  \1faDārjīliṅa :\1fbDārjīliṅa Loka Manorañjan Śākhā,\1fc[2024] 1967\1fe(Dārjīliṅa :\1ffJīvan Jyoti Presa)\1e  \1fa[7], 28 p. ;\1fc17 cm.\1e  \1faCover title.\1e  \1faIntroduction to different cultures and traditions of Nepal.\1e  \1faIn Nepali.\1e 0\1faCulture.\1fvEssays.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4952\1e\1d01312nam a2200241Ka 4500008004300000020003800043020002800081100005600109100002700165245015700192245009600349250004300445250002900488260018400517260011600701300002400817500002600841500004500867520003800912546001500950650002400965852008100989\1e090114s1956    ii            000 e nep d  \1e  \1fcभा.रु. 1. 25 पैसा\1e  \1fcBhā.ru. 1. 25 paisā\1e\1faमोक्तान, वुद्धिमान.\1e\1faMoktān, Vuddhimān.\1e10\1faजिकतेन ताम छयोई :\1fbतमाङ्ग वंशावली /\1fcलेखक वुद्धिमान मोक्तान.\1e10\1faJikatena tāma chayoī :\1fbtamāṅga vaṃśāvalī /\1fcLekhaka Vuddhimāna Moktān.\1e  \1faप्रथम संस्करण.\1e  \1faPrathama saṃskaraṇa.\1e  \1faदार्जीलिङ :\1fbवुद्धिमान मोक्तान,\1fc[2013] 1956\1fe(काठमाडौं :\1ffमणि प्रिण्टिङ प्रेस)\1e  \1faDārjīliṅa :\1fbVuddhimāna Moktāna,\1fc[2013] 1956\1fe(Kāṭhamāḍauṃ :\1ffMaṇi Priṇṭiṅa Presa)\1e  \1faiv, 42 p. ;\1fc18 cm.\1e  \1fa1,000 copies printed.\1e  \1faPrinted by Nāgendra Maṇi Pradhāna.\1e  \1faGeneology of Tamang ethnic group.\1e  \1faIn Nepali.\1e 0\1faGenealogy.\1fvEssays.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4953\1e\1d01759nam a2200277Ka 4500008004300000020011200043020008500155100011200240100006600352245017600418245009600594250004600690250002600736260017100762260011400933300001701047500003401064500003401098500003401132520003001166546001501196650003101211700009201242700006601334852008101400\1e090114s1967    np            000 e nep d  \1e  \1fc(Vol. 1) रु. 1. 95 पैसा (Vol. 2) रु. 2. 10 पैसा (Vol. 3) रु. 1. 80 पैसा\1e  \1fc(Vol. 1) ru. 1. 95 paisā (vol. 2) ru. 2. 10 paisā (vol. 3) ru. 1. 80 paisā\1e\1faबस्नेत, नरेन्द्र बहादुर,\1feJoint author,\1fgएम.ए. एम.एड.\1e\1faBasnet, Narendra Bahādur,\1feJoint author,\1fgEma.E. Ema.Eḍa.\1e10\1faस्वास्थ्य र शरीर :\1fbभाग १ देखी ३ सम्म /\1fcलेखक नरेन्द्र बहादुर बस्नेत.\1e10\1faSvāsthya ra śarīra :\1fbbhāga 1 dekhī 3 samma /\1fcLekhaka Narendra Bahādur Basnet.\1e  \1faदोस्रो संस्करण.\1e  \1faDosro saṃskaraṇa.\1e  \1faकाठमाडौं :\1fbखगेन्द्रबहादुर बस्नेत,\1fc2024 [1967]\1fe(काठमाडौं :\1ffनेपाल प्रेस)\1e  \1faKāṭhamāḍauṃ :\1fbKhagendrabahādura Basneta,\1fc2024 [1967]\1fe(Kāṭhamāḍauṃ :\1ffNepāla Presa)\1e  \1fa3 v.\1fc17 cm.\1e  \1faVol. 1, 5,000 copies printed.\1e  \1faVol. 2, 4,000 copies printed.\1e  \1faVol. 3, 2,000 copies printed.\1e  \1faGeneral health education.\1e  \1faIn Nepali.\1e 0\1faHealth education.\1fvEssays.\1e\1faभगत, द्धारिकाराम,\1feJoint author.\1fgबी.ए.डी.एड.\1e\1faBhagat, Ddhārikārām,\1feJoint author,\1fgBī.E.Dī.Eḍa.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4954\1e\1d01554nam a2200229Ka 4500008004300000020006900043020005600112100005300168100003000221245028500251245016200536250004300698250002700741260018600768260012600954300001701080500003401097520007301131546001501204650002401219852008101243\1e090114q19601969np            000 e nep d  \1e  \1fcVol. 1) रु. 1. 50 (vol. 2) रु. 1. 40 ( vol. 3) रु. 2\1e  \1fcVol. 1) u. 1. 50 (vol. 2) ru. 1. 40 ( vol. 3) ru. 2\1e\1faशर्मा, दुर्गादेवी.\1e\1faŚarmā, Durgādevī.\1e10\1faस्वास्थ्य र शारिरिक विज्ञान :\1fbभाग १ देखि ३ सम्म छैटौ, सातौ र आठौ श्रेणीको निमित्त /\1fcलेखिका दुर्गादेवी शर्मा.\1e10\1faSvāsthya ra śāririka vijñāna :\1fbbhāga 1 dekhi 3 samma chaiṭau, sātau ra āṭhau śreṇīko nimitta /\1fcLekhikā Durgādevī Śarmā.\1e  \1faपहिलो संस्करण.\1e  \1faPahilo saṃskaraṇa.\1e  \1faकाठमाडौं :\1fbरत्न पुस्तक भण्डार,\1fc[201-?] [196-?]\1fe(बाराणसी :\1ffमनोज प्रिण्टिङ प्रेस)\1e  \1faKāṭhamāḍauṃ :\1fbRatna Pustak Bhaṇḍāra,\1fc[201-?] [196-?]\1fe(Bārāṇasī :\1ffManoja Priṇṭiṅa Presa)\1e  \1fa3 v.\1fc16 cm.\1e  \1faVol. 2, 1,000 copies printed.\1e  \1faTextbook of health and physical education for lower secondary level.\1e  \1faIn Nepali.\1e 0\1faTextbooks.\1fvEssays.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4956\1e\1d01623nam a2200277Ka 4500008004300000020005900043020004600102100008300148100004700231245018600278245011100464250004300575250003100618260017500649260013100824300002500955500003400980500003401014500005001048520005901098546001501157650002401172700004301196700002501239852008101264\1e090114s1967    np a          000 e nep d  \1e  \1fc(Vol. 1) रु. 2 (vol. 2) रु. 2. 75 पैसा\1e  \1fc(Vol. 1) ru. 2 (vol. 2) ru. 2. 75 paisā\1e\1faश्रेष्ठ, उमाप्रसाद,\1fgएम. एस्सी..\1e\1faŚreshṭh, Umāprasād,\1fgEma. essī..\1e10\1faसमान्य विज्ञान :\1fbभाग १ र २, कक्षा ६ र ७ को लागी /\1fcलेखक उमाप्रसाद श्रेष्ठ.\1e10\1faSamānya vijñāna :\1fbbhāga 1 ra 2, kakshā 6 ra 7 ko lāgī /\1fcLekhaka Umāprasād Śreshṭh.\1e  \1faसातौं संस्करण.\1e  \1faSātauṃ saṃskaraṇa.\1e  \1faकाठमाडौं :\1fbरत्न पुस्तक भण्डार,\1fc2024 [1967]\1fe(बाराणासी :\1ffसगरमाथा छापाखाना)\1e  \1faKāṭhamāḍauṃ :\1fbRatna Pustak Bhaṇḍāra,\1fc2024 [1967]\1fe(Bārāṇāsī :\1ffSagaramāthā Chāpākhānā)\1e  \1fa2 v.\1fbill. ;\1fc17 cm.\1e  \1faVol. 1, 3,000 copies printed.\1e  \1faVol. 2, 3,000 copies printed.\1e  \1faVol. 2, Printed by Jvālāprasāda Guptā\1e  \1faTextbook of general science for lower secondary level.\1e  \1faIn Nepali.\1e 0\1faTextbooks.\1fvEssays.\1e\1faवज्राचार्य,का.\1e\1favajrācārya,Kā.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4957\1e\1d01503nam a2200241Ka 4500008004300000020008200043020006700125100009300192100005700285245018400342245011600526250002200642250001300664260017200677260012200849300001700971500003800988500004801026520006701074546001501141650002401156852008101180\1e090114s1966    np            000 e nep d  \1e  \1fc(Vol. 3) 55. पैसा (vol. 4) 80. पैसा (vol. 5) 80. पैसा\1e  \1fc(Vol. 3) 55. paisā (vol. 4) 80. paisā (vol. 5) 80. paisā\1e\1faगोपर्मा, पासाङ,\1fgएम.एस्. बी.ए. बी.एड्.\1e\1faGoparmā, Pāsāṅa,\1fgEma.Es. Bī.e. Bī.Eḍ.\1e10\1faशारिरिक शिक्षा :\1fbभाग ३, ४ र ५, कक्षा ३, ४ र ५ को लागी /\1fcलेखक पासाङ गोपर्मा.\1e10\1faŚāririka śikshā :\1fbbhāga 3, 4 ra 5, kakshā 3, 4 ra 5 ko lāgī /\1fcLekhaka Pāsāṅa Goparmā.\1e  \1fa[पहिलो]\1e  \1fa[Pahilo]\1e  \1faकाठमाडौं :\1fbरत्न पुस्तक भण्डार,\1fc2023 [1966]\1fe(बाराणसी :\1ffभार्गवभूषण प्रेस)\1e  \1faKāṭhamāḍauṃ :\1fbRatna Pustak Bhaṇḍāra,\1fc2023 [1966]\1fe(Bārāṇasī :\1ffBhārgavabhūshaṇ Presa)\1e  \1fa3 v.\1fc18 cm.\1e  \1faPrinted by Nāgendra Bhārgava.\1e  \1faApproved as the textbook by the government.\1e  \1faTextbook of physical education for the primary level students.\1e  \1faIn Nepali.\1e 0\1faTextbooks.\1fvEssays.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4959\1e\1d01698nam a2200253Ka 4500008004300000020012600043020010200169100005600271100003100327245025500358245014500613250002200758250001300780260017600793260011600969300001701085500005201102500005301154500003201207520008501239546001501324650002401339852008101363\1e090114s1963    np            000 e nep d  \1e  \1fc(Vol. 1) 50. पैसा (vol. 2) 80 पैसा (vol. 3) 70. पैसा (vol. 4) 50. पैसा (vol. 5) रु. 1\1e  \1fc(Vol. 1) 50. paisā (vol. 2) 80 paisā (vol. 3) 70. paisā (vol. 4) 50. paisā (vol. 5) ru. 1\1e\1faशर्मा, गोकुलप्रसाद.\1e\1faŚarmā, Gokulaprasād.\1e10\1faविज्ञान र स्वास्थ्य शिक्षा :\1fbभाग १ देखी ५ सम्म, कक्षा ३, ४, ५, ६ र ७ को लागी /\1fcलेखक गोकुलप्रसाद शर्मा.\1e10\1faVijñāna ra svāsthya śikshā :\1fbbhāga 1 dekhī 5 samma, kakshā 3, 4, 5, 6 ra 7 ko lāgī /\1fcLekhaka Gokulaprasād Śarmā.\1e  \1fa[पहिलो]\1e  \1fa[Pahilo]\1e  \1faकाठमाडौं :\1fbरत्न पुस्तक भण्डार,\1fc2020 [1963]\1fe(बाराणासी :\1ffन्यु ज्वाला प्रेस)\1e  \1faKāṭhamāḍauṃ :\1fbRatna Pustak Bhaṇḍāra,\1fc2020 [1963]\1fe(Bārāṇāsī :\1ffNyu Jvālā Presa)\1e  \1fa5 v.\1fc18 cm.\1e  \1faVol. 1, Printed by Jvālā Prasāda Guptā.\1e  \1faVol. 2, 3, 4, 5, Printed by Narendra Bhārgava.\1e  \1faPrinted in different press.\1e  \1faTextbook of science and health education for the students from grade III to VII.\1e  \1faIn Nepali.\1e 0\1faTextbooks.\1fvEssays.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4960\1e\1d01326nam a2200217Ka 4500008004300000020007500043020006500118100005000183100003400233245018200267245011100449250004300560250002900603260015700632260010600789300002900895520006700924546001500991650002101006852008101027\1e090114s1965    np a          000 0 nep d  \1e  \1fc75 पैशा (Vol. 1), रु. 1 (Vol. 2), 75 पैशा (Vol. 3)\1e  \1fc75 Paiśā (Vol. 1), Ru. 1 (Vol. 2), 75 Paiśā (Vol. 3)\1e\1faथापा, भैरवबहादुर.\1e\1faThāpā, Bhairavabahādur.\1e10\1faनृत्य र शारीरिक प्रवेशिका :\1fbभाग १ देखि ३ सम्म /\1fcलेखक भैरवबहादुर थापा.\1e10\1faNṛtya ra śārīrika praveśikā :\1fbbhāga 1 dekhi 3 samma /\1fcLekhaka Bhairavabahādur Thāpā.\1e  \1faप्रथम संस्करण.\1e  \1faPrathama saṃskaraṇa.\1e  \1faकाठमाडौं :\1fbरत्न पुस्तक भण्डार,\1fc2022 [1965]\1fe(बनारस :\1ffपारिजात प्रेस)\1e  \1faKāṭhamāḍauṃ :\1fbRatna Pustak Bhaṇḍāra,\1fc2022 [1965]\1fe(Banāras :\1ffPārijāta Presa)\1e  \1fa3 v p. :\1fbill. ;\1fc17 cm.\1e  \1faIntroduction to dance and physical exercises related to Dance.\1e  \1faIn Nepali.\1e 0\1faDance.\1fvUnknown.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4961\1e\1d01206nam a2200229Ka 4500008004300000020001700043020001300060100008100073100004200154245014600196245007600342250002200418250001300440260017800453260010700631300003900738500002600777520005300803546001500856650002400871852008100895\1e090114s1967    np b          000 e nep d  \1e  \1fcरु. 4.50\1e  \1fcRu. 4.50\1e\1faश्रेष्ठ, प्रद्युम्नलाल,\1fgएम.ए.\1e\1faŚreshṭha, Pradyumnalāl,\1fgEma.E.\1e10\1faनेपाल अधिराज्यको भूगोल /\1fcलेखक प्रद्युम्नलाल श्रेष्ठ.\1e10\1faNepāl adhirājyako bhūgola /\1fcLekhaka Pradyumnalāl Śreshṭha.\1e  \1fa[पहिलो]\1e  \1fa[Pahilo]\1e  \1faललितपुर :\1fbआशाकाजी बुक्सेलर,\1fc2024 [1967]\1fe(ललितपुर :\1ffसुभाष प्रिण्टिङ प्रेस)\1e  \1faLalitapur :\1fbĀśākājī Bukselara,\1fc2024 [1967]\1fe(lalitapur :\1ffSubhāsha Priṇṭiṅa Presa)\1e  \1fa[6], 209 p. :\1fb[14] maps ;\1fc18 cm.\1e  \1fa1,000 copies printed.\1e  \1faTextbook of geography of Nepal for SLC students.\1e  \1faIn Nepali.\1e 0\1faTextbooks.\1fvEssays.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4962\1e\1d01013nam a2200205Ka 4500008004300000020000800043100003200051100002300083245010700106245006800213250002200281250001300303260017800316260012400494300002600618520004400644546001500688650002300703852008100726\1e090114s1967    np            000 e nep d  \1e  \1fcnil\1e\1faबेरखिन, आई.\1e\1faBerakhina, Āī.\1e10\1faसमाजवादको निमार्णको कहानी /\1fcआई. वेरखिन.\1e10\1faSamājavādako nimārṇako kahānī /\1fcĀī. Verakhina.\1e  \1fa[पहिलो]\1e  \1fa[Pahilo]\1e  \1faकाठमाडौं :\1fbसोभियत राजदुतावास,\1fc2024 [1967]\1fe(काठमाडौं :\1ffकभनर एलाइन्स प्रेस)\1e  \1faKāṭhamāḍauṃ :\1fbSobhiyat Rājadutāvāsa,\1fc2024 [1967]\1fe(Kāṭhamāḍauṃ :\1ffKabhanar Elāinsa Presa)\1e  \1fa[5], 156 p. ;\1fc20 cm.\1e  \1faHistory of Soviet socialist revolution.\1e  \1faIn Nepali.\1e 0\1faPolitics.\1fvEssays.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4964\1e\1d01396nam a2200253Ka 4500008004300000020000800043110007700051110005000128245012500178245006600303250002200369250001300391260020900404260014400613300002500757500002400782500004500806520008000851546001500931650002600946700005900972700003001031852008101061\1e090114s1967    np           f000 e nep d  \1e  \1fcnil\1e\1faश्री ५ को सरकार. \1fbकृषि विभाग.\1e\1faŚrī 5 ko Sarakāra. \1fbKṛshi Vibhāga.\1e10\1faपूर्वी नेपालमा सुन्तला /\1fcएगृ इकनमिक्स सेक्सन.\1e10\1faPūrvī Nepālamā suntalā /\1fcEgṛ Ikanamiksa Seksana.\1e  \1fa[पहिलो]\1e  \1fa[Pahilo]\1e  \1faकाठमाडौं :\1fbश्री ५ को सरकार कृषि विभाग,\1fc2024 [1967]\1fe(काठमाडौं :\1ffशान्ति प्रिण्टिङ प्रेस)\1e  \1faKāṭhamāḍauṃ :\1fbŚrī 5 ko Sarakāra Kṛshi Vibhāga,\1fc2024 [1967]\1fe(Kāṭhamāḍauṃ :\1ffŚānti Priṇṭiṅa Presa)\1e  \1fa[4], 26 p. ;\1fc21 cm.\1e  \1fa500 copies printed.\1e  \1faPriface by Madanabahādur Śreshṭha.\1e  \1faFeasibility study of citrus fruits and orange in the eastern part of Nepal.\1e  \1faIn Nepali.\1e 0\1faAgriculture.\1fvEssays.\1e\1faएगृ इकनमिक्स सेक्सन.\1e\1faEgṛ Ikanamiksa Seksana.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4965\1e\1d01351nam a2200241Ka 4500008004300000020000800043110007700051110005000128245012200178245007300300250002200373250001300395260020900408260014400617300003500761500005000796520005400846546001500900650002700915700005800942700002801000852008101028\1e090114s1965    np d         f000 0 nep d  \1e  \1fcnil\1e\1faश्री ५ को सरकार. \1fbकृषि विभाग.\1e\1faŚrī 5 ko Sarakāra. \1fbKṛshi Vibhāga.\1e10\1faझापा, राजविराज धानवजार /\1fcएगृइकनमिक्स सेक्सन.\1e10\1faJhāpā, Rājavirāj dhānavajāra /\1fcEgṛikanamiksa Seksana.\1e  \1fa[पहिलो]\1e  \1fa[Pahilo]\1e  \1faकाठमाडौं :\1fbश्री ५ को सरकार कृषि विभाग,\1fc2022 [1965]\1fe(काठमाडौं :\1ffशान्ति प्रिण्टिङ प्रेस)\1e  \1faKāṭhamāḍauṃ :\1fbŚrī 5 ko Sarakāra Kṛshi Vibhāga,\1fc2022 [1965]\1fe(Kāṭhamāḍauṃ :\1ffŚānti Priṇṭiṅa Presa)\1e  \1fa[3], 19 p. :\1fbtables ;\1fc21 cm.\1e  \1faIntroduction by Madanabahādur Śreshṭha.\1e  \1faFeasibility of the rice market in Jhapa district.\1e  \1faIn Nepali.\1e 0\1faAgriculture.\1fvUnknown.\1e 0\1faएगृइकनमिक्स सेक्सन.\1e 0\1faEgṛikanamiksa Seksan.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4966\1e\1d01456nam a2200229Ka 4500008004300000020012900043020010500172100005900277100003500336245016200371245009200533250002200625250001300647260019100660260012400851300002900975500003501004520006201039546001501101650002901116852008101145\1e090114s1967    np a          000 m nep d  \1e  \1fcरु. 1, रु. 1.70 (Vol. 1), रु. 1.70 (Vol. 2), रु. 1.90 (Vol. 3), रु. 2.90 (Vol. 4), रु. 2.60 (Vol. 5)\1e  \1fcRu. 1, Ru. 1.70 (Vol. 1), Ru. 1.70 (Vol. 2), Ru. 1.90 (Vol. 3), Ru. 2.90 (Vol. 4), Ru. 2.60 (Vol. 5)\1e\1faकर्माचार्य, केशवलाल.\1e\1faKarmācārya, Keśavalāl.\1e10\1faमेरो नेपाली साहित्य :\1fbभाग १ देखि ५ /\1fcलेखक केशवलाल कर्माचार्य.\1e10\1faMero Nepālī sāhitya :\1fbbhāga 1 dekhi 5 /\1fcLekhaka Keśavalāl Karmācārya.\1e  \1fa[पहिलो]\1e  \1fa[Pahilo]\1e  \1faकाठमाडौं :\1fbचन्द्रप्रसाद याण्ड ब्रदर्स,\1fc2024 [1967]\1fe(बनारस :\1ffभार्गव भूषण प्रेस)\1e  \1faKāṭhamāḍauṃ :\1fbCandraprasād Yāṇḍa Bradarsa,\1fc2024 [1967]\1fe(Banāras :\1ffBhārgav Bhūshaṇa Presa)\1e  \1fa6 v p. :\1fbill. ;\1fc24 cm.\1e  \1faPrinted by Narendra Bhārgav.\1e  \1faTextbook of Nepali literature for primary level students.\1e  \1faIn Nepali.\1e 0\1faEducation.\1fvMixed forms.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4967\1e\1d01575nam a2200265Ka 4500008004300000020002000043020001500063100008000078100005300158245020900211245012100420250004900541250003000590260016600620260012200786300002700908500002600935520007100961546001501032650002301047700006501070700004501135852008101180952004801261\1e090114s1967    np a          000 e nep d  \1e  \1fc85 पैसा\1e  \1fc85 paisā\1e\1faढुंग्याल, तुलसीप्रसाद,\1fejoint author.\1e\1faḌhuṅgyāl, Tulasīprasād,\1fejoint author.\1e10\1faपञ्चायती प्रजातन्त्र :\1fbभाग १ र २ /\1fcलेखक ईश्वरराज अर्जाल, तुलसीप्रसाद ढुंग्याल.\1e10\1faPañcāyatī prajātantra :\1fbbhāga 1 ra 2 /\1fcLekhaka Īśvararāj Arjāl, Tulasīprasād Ḍhuṅgyāl.\1e  \1faद्वितीय संस्करण.\1e  \1faDvitīya saṃskaraṇa.\1e  \1faकाठमाडौं :\1fbरत्न पुस्तक भण्डार,\1fc2024 [1967]\1fe(बनारस :\1ffसगरमाथा छापाखाना)\1e  \1faKāṭhamāḍauṃ :\1fbRatna Pustak Bhaṇḍāra,\1fc2024 [1967]\1fe(Banāras :\1ffSagaramāthā Chāpākhānā)\1e  \1fa2 v. :\1fbill. ;\1fc24 cm.\1e  \1fa2,000 copies printed.\1e  \1faIntroduction to the Panchayet system, its formation and functions.\1e  \1faIn Nepali.\1e 0\1faPolitics.\1fvEssays.\1e\1faअर्जाल, ईश्वरराज,\1fejoint author.\1e\1faArjāl, Īśvararāj,\1fejoint author.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4968\1e  \1faLibrary has 2 copies of different editions.\1e\1d01463nam a2200217Ka 4500008004300000020016700043020012700210100006300337100004000400245015400440245009300594250002200687250001300709260018800722260012200910300003201032520005601064546001501120650002901135852008101164\1e090114s1967    np a          000 m nep d  \1e  \1fcरु. 1 (Vol. 1), रु. 1.80 पैसा (Vol. 2), रु. 1.95 पैसा (Vol. 3), रु. 2.77 पैसा (Vol. 4), रु. 2.40 पैसा (Vol. 5)\1e  \1fcRu. 1 (Vol. 1), Ru. 1.80 paisā (Vol. 2), Ru. 1.95 paisā (Vol. 3), Ru. 2.77 paisā (Vol. 4), Ru. 2.40 paisā (Vol. 5)\1e\1faजोशी, रामहरि,\1fgबी.एस्सी.\1e\1faJośī, Rāmahari,\1fgBī.Essī.\1e10\1faबाल विज्ञान परिचय :\1fbकक्षा १ देखि ५ सम्म /\1fcआलेख रामहरि जोशी.\1e10\1faBāla vijñāna paricaya :\1fbkakshā 1 dekhi 5 samma /\1fcĀlekha Rāmahari Jośī.\1e  \1fa[पहिलो]\1e  \1fa[Pahilo]\1e  \1faकाठमाडौं :\1fbनेपाल प्रकाशन मन्दिर,\1fc2024 [1967]\1fe(इलाहवाद :\1ffप्रयाग कम्पोजिङ हाउस)\1e  \1faKāṭhamāḍauṃ :\1fbNepāl Prakāśan Mandira,\1fc2024 [1967]\1fe(Ilāhavāda :\1ffPrayāga Kampojiṅa Hāusa)\1e  \1fa5 v. :\1fbill. ;\1fc24 x 18 cm.\1e  \1faTextbook of science for the primary level students.\1e  \1faIn Nepali.\1e 0\1faTextbooks.\1fvMixed forms.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4969\1e\1d01768nam a2200265Ka 4500008004300000020003000043020002100073100007800094100005500172245026700227245018100494250002200675250001300697260019100710260011700901300002701018520007701045546001501122650002401137700008801161700006701249700005601316700004901372852008101421\1e090114s1967    np a          000 e nep d  \1e  \1fcरु. 9.34 पैसा\1e  \1fcRu. 9.34 paisā\1e\1faजोशी, रामहरि,\1fejoint author,\1fgबी.एस्सी.\1e\1faJośī, Rāmahari,\1fejoint author,\1fgBī.Essī.\1e10\1faसमान्य विज्ञान परिचय :\1fbछैटौं, सातौं र आठौं कक्षाका निमित्त /\1fcलेखक रामहरि जोशी, जफीर आलम, जयनारायण शाह.\1e10\1faSamānya vijñāna paricaya :\1fbchhaiṭauṃ, sātauṃ ra āṭhauṃ kakshākā nimitta /\1fcLekhaka Rāmahari Jośī, Japhīra Ālama, Jayanārāyaṇa Śāha.\1e  \1fa[पहिलो]\1e  \1fa[Pahilo]\1e  \1faकाठमाडौं :\1fbनेपाल प्रकाशन मन्दिर,\1fc2024 [1967]\1fe(बनारस :\1ffचन्द्र प्रिण्डिङ वर्क्स)\1e  \1faKāṭhamāḍauṃ :\1fbNepāl Prakāśan Mandira,\1fc2024 [1967]\1fe(Banāras :\1ffCandra Priṇḍiṅa Varksa)\1e  \1fa3 v. :\1fbill. ;\1fc17 cm.\1e  \1faTextbooks of science for the students of lower secondary level of Nepal.\1e  \1faIn Nepali.\1e 0\1faEducation.\1fvEssays.\1e\1faआलम, जफीर,\1fejoint author,\1fgबी.एस्सी., डिप.एड.\1e\1faĀlama, Japhīr,\1fejoint author,\1fgBī.Essī., Ḍipa.Eḍa.\1e\1faशाह, जयनारायण,\1fejoint author.\1e\1faŚāha, Jayanārāyaṇa,\1fejoint author,\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4970\1e\1d01100nam a2200205Ka 4500008004300000020000800043100003800051100002200089245014900111245008300260250002200343250001300365260015900378260011900537300002500656500001400681520010300695546001500798852008100813\1e090114s1967    np            000 s nep d  \1e  \1fcnil\1e\1faमाओ त्से तुङ.\1e\1faMāo Tse Tuṅa.\1e10\1faसाहित्य र कला सम्बन्धि पांच दस्तावेजहरू /\1fcमाओ त्से तुङ.\1e10\1faSāhitya ra kalā sambandhi pāṅca dastāvejaharū /\1fcMāo Tse Tuṅa.\1e  \1fa[पहिलो]\1e  \1fa[Pahilo]\1e  \1faकाठमाडौं :\1fbचिनीया दूतावास,\1fc2024 [1967]\1fe(काठमाडौं :\1ffमातृभूमि प्रेस)\1e  \1faKāṭhamāḍauṃ :\1fbCinīyā Dūtāvāsa,\1fc2024 [1967]\1fe(Kāṭhamāḍauṃ :\1ffMātṛbhūmi Presa)\1e  \1fa[1], 12 p. ;\1fc14 cm.\1e  \1faSpeeches.\1e  \1faCollection of five speeches and letters of Mao, the Chinese leader, regarding literature and arts.\1e  \1faIn Nepali.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4971\1e\1d01526nam a2200229Ka 4500008004300000020007500043020006200118100004200180100002800222245028000250245015800530250004600688250002600734260016700760260011600927300002701043500003501070520006601105546001501171650002901186852008101215\1e090114s1967    np a          000 m nep d  \1e  \1fc65 पैसा (Vol. 1), रु. 1.75 (Vol. 2), रु. 1.50 (Vol. 3)\1e  \1fc65 paisā (Vol. 1), Ru. 1.75 (Vol. 2), Ru. 1.50 (Vol. 3)\1e\1faश्रेष्ठ, बी.एल.\1e\1faŚreshṭha, Bī.Ela.\1e10\1faबाल व्यावसायिक शिक्षा (कक्षा १ देखि ३ सम्म) :\1fbव्यवसायी वा स्वावलम्बी शिक्षाको पुस्तक /\1fcलेखक बी.एल. श्रेष्ठ.\1e10\1faBāla vyāvasāyika śikshā (kakshā 1 dekhi 3 samma) :\1fbvyavasāyī vā svāvalambī śikshāko pustaka /\1fcLekhaka Bī.Ela. Śreshṭha.\1e  \1faदोस्रो संस्करण.\1e  \1faDosro saṃskaraṇa.\1e  \1faकाठमाडौं :\1fbरत्न पुस्तक भण्डार,\1fc2024 [1967]\1fe(बनारस :\1ffभार्गव भूषण प्रेस)\1e  \1faKāṭhamāḍauṃ :\1fbRatna Pustak Bhaṇḍāra,\1fc2024 [1967]\1fe(Banāras :\1ffBhārgav Bhūshaṇa Presa)\1e  \1fa3 v. :\1fbill. ;\1fc24 cm.\1e  \1faPrinted by Narendra Bhārgav.\1e  \1faTextbook of voccational education for primary level students.\1e  \1faIn Nepali.\1e 0\1faTextbooks.\1fvMixed forms.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4972\1e\1d01592nam a2200229Ka 4500008004300000020012200043020010100165100005600266100003100322245024200353245013000595250004600725250002600771260018800797260012200985300002901107500003501136520006601171546001501237650002901252852008101281\1e090114s1967    np a          000 m nep d  \1e  \1fc70 पैसा (Vol. 1), रु. 1.50 (Vol. 2),  रु. 1.20 (Vol. 3),  रु. 1.60 (Vol. 4),  रु. 2 (Vol. 5),\1e  \1fc70 paisā (Vol. 1), Ru. 1.50 (Vol. 2),  Ru. 1.20 (Vol. 3),  Ru. 1.60 (Vol. 4),  Ru. 2 (Vol. 5),\1e\1faशर्मा, गोकुलप्रसाद.\1e\1faŚarmā, Gokulaprasād.\1e10\1faव्यसायी शिक्षा (कक्षा १ देखि ५ सम्म) :\1fbस्वावलम्बी शिक्षाको पुस्तक /\1fcलेखक गोकुलप्रसाद शर्मा.\1e10\1faVyasāyī śikshā (kakshā 1 dekhi 5 samma) :\1fbsvāvalambī śikshāko pustaka /\1fcLekhaka Gokulaprasād Śarmā.\1e  \1faतेस्रो संस्करण.\1e  \1faTesro saṃskaraṇa.\1e  \1faकाठमाडौं :\1fbचन्द्रप्रसाद एण्ड ब्रदर्श,\1fc2024 [1967]\1fe(बनारस :\1ffभार्गव भूषण प्रेस)\1e  \1faKāṭhamāḍauṃ :\1fbCandraprasād eṇḍa Bradarśa,\1fc2024 [1967]\1fe(Banāras :\1ffBhārgav Bhūshaṇ Presa)\1e  \1fa5 v. p :\1fbill. ;\1fc23 cm.\1e  \1faPrinted by Narendra Bhārgav.\1e  \1faTextbook of voccational education for primary level students.\1e  \1faIn Nepali.\1e 0\1faTextbooks.\1fvMixed forms.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4973\1e\1d01221nam a2200229Ka 4500008004300000020004900043020004100092100004400133100002900177245014400206245008900350250002200439250001300461260014800474260010100622300003000723500003500753520008300788546001500871650002400886852008100910\1e090114s1967    np a          000 e nep d  \1e  \1fcरु. 1.90 (Vol. 1), रु. 1.90 (Vol. 2)\1e  \1fcRu. 1.90 (Vol. 1), Ru. 1.90 (Vol. 2)\1e\1faगोपर्मा, पासाङ.\1e\1faGoparmā, Pāsāṅa.\1e10\1faस्वास्थ्य र शारीरिक शिक्षा :\1fbभाग १ र २ /\1fcपासाङ गोपर्मा.\1e10\1faSvāsthya ra śārīrika śikshā :\1fbbhāga 1 ra 2 /\1fcPāsāṅa Goparmā.\1e  \1fa[पहिलो]\1e  \1fa[Pahilo]\1e  \1faकाठमाडौं :\1fbरत्न पुस्तक भण्डार,\1fc2024 [1967]\1fe(बनारस :\1ffदीपक प्रेस)\1e  \1faKāṭhamāḍauṃ :\1fbRatna Pustak Bhaṇḍāra,\1fc2024 [1967]\1fe(Banāras :\1ffDīpak Presa)\1e  \1fa2 v. p. :\1fbill. ;\1fc23 cm.\1e  \1faPrinted by Mahādevaprasād.\1e  \1faTextbook of health and physical education for primary level students of Nepal.\1e  \1faIn Nepali.\1e 0\1faTextbooks.\1fvEssays.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4974\1e\1d01656nam a2200253Ka 4500008004300000020011200043020009200155100009400247100004900341245018600390245010800576250002200684250001300706260016700719260011600886300003001002500003501032520006501067546001501132650002401147700009001171700006001261852008101321\1e090114s1967    np a          000 0 nep d  \1e  \1fcरु. 1 (Vol. 1), रु. 2 (Vol. 2), रु. 1.50 (Vol. 3), रु. 1.75 (Vol. 4), रु. 1.25 (Vol. 5)\1e  \1fcRu. 1 (Vol. 1), Ru. 2 (Vol. 2), Ru. 1.50 (Vol. 3), Ru. 1.75 (Vol. 4), Ru. 1.25 (Vol. 5)\1e\1faबस्नेत, नीरमर्दन,\1fejoint author,\1fgएम.ए., बी.एड.\1e\1faBasneta, Nīramardana,\1fgEma.E., Bī.Eḍa.\1e10\1faसरल बाल विज्ञान :\1fbभाग १ देखि ५ सम्म /\1fcनीरमर्दन बस्नेत, वेदकेशव श्रेष्ठ.\1e10\1faSarala bāla bijñāna :\1fbbhāga 1 dekhi 5 samma /\1fcNīramardan Basneta, Vedakeśav Śreshṭha.\1e  \1fa[पहिलो]\1e  \1fa[Pahilo]\1e  \1faकाठमाडौं :\1fbरत्न पुस्तक भण्डार,\1fc2024 [1967]\1fe(बनारस :\1ffभार्गव भूषण प्रेस)\1e  \1faKāṭhamāḍauṃ :\1fbRatna Pustak Bhaṇḍāra,\1fc2024 [1967]\1fe(Banāras :\1ffBhārgav Bhūshaṇa Presa)\1e  \1fa5 v. p. :\1fbill. ;\1fc23 cm.\1e  \1faPrinted by Nagendra Bhārgav.\1e  \1faTextbook of science for the primary level students of Nepal.\1e  \1faIn Nepali.\1e 0\1faTextbook.\1fvUnknown.\1e\1faश्रेष्ठ, वेदकेशव,\1fejoint author,\1fgबी.एस्सी.\1e\1faŚreshṭha, Vedakeśav,\1fejoint author,\1fgBī.Essī.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4975\1e\1d01360nam a2200229Ka 4500008004300000020006900043020005700112100005300169100003100222245017200253245010000425250004600525250002600571260017500597260011000772300003000882500003700912520006100949546001501010650002401025852008101049\1e090114s1967    np a          000 e nep d  \1e  \1fcरु. 1 (Vol. 1), रु. 2.40 (Vol. 2), रु. 2.40 (Vol. 3)\1e  \1fcRu. 1 (Vol. 1), Ru. 2.40 (Vol. 2), Ru. 2.40 (Vol. 3)\1e\1faथापा, नेत्रबहादुर.\1e\1faThāpā, Netrabahādur.\1e10\1faबाल सामाजिक शिक्षा :\1fbकक्षा ३ देखि ५ सम्म /\1fcलेखक नेत्रबहादुर थापा.\1e10\1faBāla sāmājika śikshā :\1fbkakshā 3 dekhi 5 samma /\1fcLekhaka Netrabahādur Thāpā.\1e  \1faतेस्रो संस्करण.\1e  \1faTesro saṃskaraṇa.\1e  \1faकाठमाडौं :\1fbचन्द्रप्रसाद एण्ड ब्रदर्श,\1fc2024 [1967]\1fe(बनारस :\1ffकल्पना प्रेस)\1e  \1faKāṭhamāḍauṃ :\1fbCandraprasād eṇḍa Bradarśa,\1fc2024 [1967]\1fe(Banāras :\1ffKalpanā Presa)\1e  \1fa3 v. p. :\1fbill. ;\1fc23 cm.\1e  \1faPrinted by Baijanāthaprasād.\1e  \1faTextbook of social education for primary level students.\1e  \1faIn Nepali.\1e 0\1faTextbooks.\1fvEssays.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4976\1e\1d01599nam a2200241Ka 4500008004300000020007200043020015800115100004900273245019900322245010800521250002200629250001300651260016700664260011600831300003000947500003500977520007001012546001501082650002501097700009301122700006101215852008101276\1e090114s1967    np a          000 0 nep d  \1e  \1fcरु. 2.40 (Vol. 1), रु. 2.40 (Vol. 2), रु. 2.40 (Vol. 3)\1e  \1fcRu. 2.40 (Vol. 1), Ru. 2.40 (Vol. 2), Ru. 2.40 (Vol. 3)=100  1\\1faबस्नेत, नीरमर्दन,\1fejoint author\1fgएम.ए., बी.एड.\1e\1faBasneta, Nīramardana,\1fgEma.E., Bī.Eḍa.\1e10\1faसामाजिक शिक्षा :\1fbकक्षा १ देखि सम्म /\1fcनीरमर्दन बस्नेत, महेन्द्रबहादुर थापा.\1e10\1faSāmājika śikshā :\1fbkakshā 1 dekhi samma /\1fcNīramardan Basneta, Mahendrabahādur Thāpā.\1e  \1fa[पहिलो]\1e  \1fa[Pahilo]\1e  \1faकाठमाडौं :\1fbरत्न पुस्तक भण्डार,\1fc2024 [1967]\1fe(बनारस :\1ffभार्गव भूषण प्रेस)\1e  \1faKāṭhamāḍauṃ :\1fbRatna Pustak Bhaṇḍāra,\1fc2024 [1967]\1fe(Banāras :\1ffBhārgav Bhūshaṇa Presa)\1e  \1fa3 v. p. :\1fbill. ;\1fc24 cm.\1e  \1faPrinted by Narendra Bhārgav.\1e  \1faTextbook of social education for primary level students of Nepal.\1e  \1faIn Nepali.\1e 0\1faTextbooks.\1fvUnknown.\1e\1faथापा, महेन्द्रबहादुर,\1fejoint author,\1fgएम.एड.\1e\1faThāpā, Mahendrabahādur,\1fejoint author,\1fgEma.Eḍa.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4977\1e\1d01191nam a2200253Ka 4500008004300000020001400043020001000057100003500067100001800102245013700120245008100257250004300338250002900381260014700410260008600557300003000643500002600673500004200699500003900741520003000780546001500810650003100825852008100856\1e090114s1963    ii            000 j nep d  \1e  \1fcरु. 2\1e  \1fcRu. 2\1e\1faसुब्बा, दिल.\1e\1faSubbā, Dil.\1e10\1faएक खोलाको दुई किनारा :\1fbकथा संग्रह /\1fcलेखक दिल सुब्बा.\1e10\1faEka kholāko duī kinārā :\1fbKathā saṅgraha /\1fcLekhaka Dil Subbā.\1e  \1faप्रथम संस्करण.\1e  \1faPrathama saṃskaraṇa.\1e  \1faदार्जीलिङ :\1fbगोविन्द ब्रर्दश,\1fc[2020] 1963\1fe(बनारस :\1ffगोपाल प्रेस)\1e  \1faDārjīliṅa :\1fbGovinda Brardaśa,\1fc[2020] 1963\1fe(Banāras :\1ffGopāl Presa)\1e  \1fa10, [2], 164 p. ;\1fc17 cm.\1e  \1fa1,000 copies printed.\1e  \1faPrinted by Ramāśaṃkaraprasād.\1e  \1faPreface by Ṭī.Bi. Ṭhakurī.\1e  \1faCollection of 11 stories.\1e  \1faIn Nepali.\1e 0\1faNepali literature.\1fvStory.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4978\1e\1d01320nam a2200205Ka 4500008004300000020000800043245022600051245012200277250002200399250001300421260026500434260015400699300002000853500001700873500003500890520007100925546001500996650002201011852008101033\1e090114s1966    np            000 0 nep d  \1e  \1fcnil\1e00\1faद्वितीय देशव्यापी नेपाली साहित्य सेमिनार :\1fb2023 को आय व्यय तथा कार्य गतिविधि पुस्तिका.\1e00\1faDvitīya deśavyāpī Nepālī sāhitya semināra :\1fb2023 ko āya vyaya tathā kārya gatividhi pustikā.\1e  \1fa[पहिलो]\1e  \1fa[Pahilo]\1e  \1faझापा :\1fbप्रबन्ध समिति, द्वितीय देशव्यापी नेपाली साहित्य सेमिनार,\1fc2023 [1966]\1fe(झापा :\1ffशर्मा प्रिण्टिङ प्रेस)\1e  \1faJhāpā :\1fbPrabandha Samiti, Dvitīya Deśavyāpī Nepālī Sāhitya Semināra,\1fc2023 [1966]\1fe(Jhāpā :\1ffŚarmā Priṇṭiṅa Presa)\1e  \1fa33 p. ;\1fc18 cm.\1e  \1faCover title.\1e  \1faPrinted by Esa.Ela. Śarmā.\1e  \1faFinancial and other details of the cross-country literary seminar.\1e  \1faIn Nepali.\1e 0\1faReport.\1fvUnknown.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4979\1e\1d01653nam a2200253Ka 4500008004300000020006900043020005700112100005300169100003100222245028100253245015400534250005800688250003600746260014800782260010000930300003001030500004401060520008001104546001501184650002401199700005701223700003801280852008101318\1e090114s1966    np a          000 e nep d  \1e  \1fcरु. 4 (Vol. 1), रु. 4.25 (Vol. 2), रु. 4.50 (Vol. 3)\1e  \1fcRu. 4 (Vol. 1), Ru. 4.25 (Vol. 2), Ru. 4.50 (Vol. 3)\1e 0\1faथापा, नेत्रबहादुर.\1e 0\1faThāpā, Netrabahādur.\1e10\1faसंक्षिप्त आधुनिक भूगोल :\1fbनयाँ सिलेबसअनुसार तयार भएको पहिलो [भाग, दोस्रो र तेस्रो] /\1fcलेखक नेत्रबहादुर थापा.\1e10\1faSaṃkshipta ādhunika bhūgola :\1fbnayā̃ silebasaanusāra tayāra bhaeko pahilo [bhāga, dosro ra tesro] /\1fcLekhaka Netrabahādur Thāpā.\1e  \1faबार्‍‍र्हौ संस्करण.\1e  \1faBār‍‍rhau saṃskaraṇa.\1e  \1faकाठमाडौं :\1fbरत्न पुस्तक भण्डार,\1fc2023 [1966]\1fe(बनारस :\1ffललित प्रेस)\1e  \1faKāṭhamāḍauṃ :\1fbRatna Pustak Bhaṇḍāra,\1fc2023 [1966]\1fe(Banāras :\1ffLalita Presa)\1e  \1fa3 v. p. :\1fbill. ;\1fc21 cm.\1e  \1faPrinted by Nā.Ga. Śāstrī Lalit.\1e  \1faTextbook of geography for SLC students according to the revised curriculum.\1e  \1faIn Nepali.\1e 0\1faTextbooks.\1fvEssays.\1e\1faशर्मा, शरदचन्द्र,\1feComp.\1e\1faŚarmā, Śaradacandra,\1feComp.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4980\1e\1d01163nam a2200253Ka 4500008004300000020002500043020002000068100005600088100003100144245007600175245004800251250004300299250002900342260014900371260009900520300004800619500001800667500003700685500003000722520003000752546001500782650003100797852008100828\1e090114s1964    np f          000 j nep d  \1e  \1fcभा. रु. 1.25\1e  \1fcBhā. ru. 1.25\1e\1faयोन्जन, हर्क,\1fcविरही.\1e\1faYonjana, Harka,\1fcVirahī.\1e10\1faशेष उपहार /\1fcलेखक हर्क योनजन.\1e10\1faŚesha upahāra /\1fcLekhaka Harka Yonajan.\1e  \1faप्रथम संस्करण.\1e  \1faPrathama saṃskaraṇa.\1e  \1faदार्जीलिङ :\1fbपं. परमानन्द शर्मा,\1fc2021 [1964]\1fe(बनारस :\1ffछाया प्रेस)\1e  \1faDārjīliṅ :\1fbPaṅ. Paramānanda Śarmā,\1fc2021 [1964]\1fe(Banāras :\1ffChāyā Presa)\1e  \1fav, 78, [2] p., [1] leaf of plates ;\1fc18 cm.\1e  \1fa1,000 copies.\1e  \1faCopyright holder: the publisher.\1e  \1faPrinted by Hīrālāl.\1e  \1faCollection of 12 stories.\1e  \1faIn Nepali.\1e 0\1faNepali literature.\1fvStory.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4981\1e\1d01106nam a2200253Ka 4500008004300000020002200043020001400065100003300079100002400112245009400136245005600230250002200286250001300308260014400321260010300465300002800568500002600596500003700622500003600659520003000695546001500725650003100740852008100771\1e090114s1967    np            000 j nep d  \1e  \1fcमूल्य 2\1e  \1fcMūlya 2\1e\1faगणेश,\1fcरसिक.\1e\1faGaṇeś,\1fcRasika.\1e10\1faक्षितिजलाई छुन खोज्दा /\1fcगणेश रसिक.\1e10\1faKshitijalāī chuna khojdā /\1fcGaṇeś Rasika.\1e  \1fa[पहिलो]\1e  \1fa[Pahilo]\1e  \1faकाठमाडौं :\1fbभानु प्रकाशन,\1fc2024 [1967]\1fe(बनारस :\1ffमातृभूमि प्रेस)\1e  \1faKāṭhamāḍauṃ :\1fbBhānu Prakāśana,\1fc2024 [1967]\1fe(Banāras :\1ffMātṛbhūmi Presa)\1e  \1fa8, [4], 83 p. ;\1fc17 cm.\1e  \1fa1,000 copies printed.\1e  \1faCopyright holder: the publisher.\1e  \1faPreface by Bhavānī Ghimire.\1e  \1faCollection of 10 stories.\1e  \1faIn Nepali.\1e 0\1faNepali literature.\1fvStory.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4982\1e\1d01353nam a2200277Ka 4500008004300000020003800043020002200081100006200103100003800165245013100203245008400334250004300418250002700461260014100488260009700629300002400726500001100750500002600761500004100787500003400828520002900862546001500891650003200906852008100938952005601019\1e090114s1967    np            000 p nep d  \1e  \1fcमोल 2 रुपियाँ\1e  \1fcMola 2 rupiyā̃\1e\1faपराजुली, कृष्णप्रसाद.\1e\1faParājulī, Kṛshṇaprasād.\1e10\1faआँखाभरि सपना मुटुभरि गीत /\1fcकृष्णप्रसाद पराजुली.\1e10\1faĀ̃khābhari sapanā muṭubhari gīta /\1fcKṛshṇaprasād parājulī.\1e  \1faपहिलो संस्करण.\1e  \1faPahilo saṃskaraṇa.\1e  \1faकाठमाडौं :\1fbगुराँस प्रकाशन,\1fc2024 [1967]\1fe(बनारस :\1ffमनोहर प्रेस)\1e  \1faKāṭhamāḍauṃ :\1fbGurā̃s prakāśana,\1fc2024 [1967]\1fe(Banāras :\1ffManohar Presa)\1e  \1fa6, 100 p. ;\1fc17 cm.\1e  \1faPoems.\1e  \1fa1,000 copies printed.\1e  \1faPrinted by Viśvanāth Bhārgava.\1e  \1faCopyright holder: the author.\1e  \1faCollection of 100 poems.\1e  \1faIn Nepali.\1e 0\1faNepali literature.\1fvPoetry.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4983\1e  \1faLibrary has 2 copies including the revised edition.\1e\1d01154nam a2200253Ka 4500008004300000020001400043020001000057100006200067100003800129245009700167245006200264250004300326250002700369260014100396260009700537300002500634500001100659500002600670500004200696500003400738546001500772650003200787852008100819\1e090114s1967    np            000 p nep d  \1e  \1fcरु. 1\1e  \1fcRu. 1\1e\1faपराजुली, कृष्णप्रसाद.\1e\1faParājulī, Kṛshṇaprasād.\1e10\1faसय थुँगा फूल /\1fcकृष्णप्रसाद पराजुली.\1e10\1faSay thũgā phūla /\1fcKṛshṇaprasād Parājulī.\1e  \1faपहिलो संस्करण.\1e  \1faPahilo saṃskaraṇa.\1e  \1faकाठमाडौं :\1fbगुराँस प्रकाशन,\1fc2024 [1967]\1fe(बनारस :\1ffमनोहर प्रेस)\1e  \1faKāṭhamāḍauṃ :\1fbGurā̃s Prakāśana,\1fc2024 [1967]\1fe(Banāras :\1ffManohar Presa)\1e  \1fa[2], 50 p. ;\1fc17 cm.\1e  \1faPoems.\1e  \1fa1,000 copies printed.\1e  \1faPrinted by Viśvanātha Bhārgava.\1e  \1faCopyright holder: the author.\1e  \1faIn Nepali.\1e 0\1faNepali literature.\1fvPoetry.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4984\1e\1d01296nam a2200253Ka 4500008004300000020000800043100006200051100003800113245014100151245008600292250004300378250002900421260014400450260010300594300003300697500003400730500004300764500002100807520002000828546001500848650002300863852008100886952007500967\1e090114s1966    np            000 0 nep d  \1e  \1fcnil\1e\1faपराजुली, कृष्णप्रसाद.\1e\1faParājulī, Kṛshṇaprasād.\1e10\1faराम्रो रचना मीठो नेपाली /\1fcलेखक कृष्णप्रसाद पराजुली.\1e10\1faRāmro racanā mīṭho nepālī /\1fcLekhaka Kṛshṇaprasād Parājulī.\1e  \1faप्रथम संस्करण.\1e  \1faPrathama saṃskaraṇa.\1e  \1faकाठमाडौं :\1fbसहयोगी प्रकाशन,\1fc2023 [1966]\1fe(बनारस :\1ffमहावीर प्रेस)\1e  \1faKāṭhamāḍauṃ :\1fbSahayogī Prakāśana,\1fc2023 [1966]\1fe(Banāras :\1ffMahāvīra Presa)\1e  \1fa14, [1], 117, 3 p. ;\1fc23 cm.\1e  \1faPrinted by Bābulāl Jaina.\1e  \1faIntroduction by Bālakṛshṇa Sama.\1e  \1faIrrata Provided.\1e  \1faNepali grammar.\1e  \1faIn Nepali.\1e 0\1faGrammar.\1fvUnknown.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4985\1e  \1faLibrary has 3 copies including first, second and 25th revised edition.\1e\1d01150nam a2200217Ka 4500008004300000020002800043020001700071100005600088100003200144245015300176245009200329250004000421250002700461260014400488260008900632300003000721546001500751650003200766852008100798952005300879\1e090114s1967    np            000 f nep d  \1e  \1fc2 रुपियाँ\1e  \1fc2 rupiyā̃\1e\1faक्षत्री, लीलबहादुर.\1e\1faKshatrī, Līlabahādur.\1e10\1faबसाइँ :\1fbनेपाली सामाजिक उपन्यास /\1fcलेखक लीलबहादुर क्षत्री.\1e10\1faBasāī̃ :\1fbNepālī sāmājika upanyāsa /\1fcLekhaka Līlabahādur Kshatrī.\1e  \1faचौथो संस्करण.\1e  \1faCautho saṃskaraṇa.\1e  \1faललितपुर :\1fbसाझा प्रकाशन,\1fc2024 [1967]\1fe(ललितपुर :\1ffजगदम्बा प्रेस)\1e  \1faLalitapur :\1fbSājhā Prakāśana,\1fc2024 [1967]\1fe(Lalitapur :\1ffJagadambā Presa)\1e  \1fa[2], iv, 104 p. ;\1fc18 cm.\1e  \1faIn Nepali.\1e 0\1faNepali literature.\1fvNovels.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4986\1e  \1faLibrary has 2 copies including the 28th reprint.\1e\1d01139nam a2200241Ka 4500008004300000020001400043020001000057100005600067100002900123245007700152245003800229250004300267250002700310260018700337260010800524300002500632500004100657500003900698520003300737546001500770650003100785852008100816\1e090114s1964    ii            000 j nep d  \1e  \1fcरु. 2\1e  \1fcRu. 2\1e 0\1faवस्नेत, लक्ष्मीदास.\1e 0\1faVasneta, Lakshmīdās.\1e10\1faस्मृति /\1fcलक्ष्मीदास बस्नेत.\1e10\1faSmṛti /\1fcLakshmīdās Basnet.\1e  \1faपहिलो संस्करण.\1e  \1faPahilo saṃskaraṇa.\1e  \1faदार्जीलिङ :\1fbलक्ष्मीदास वस्नेत,\1fc[2021] 1964\1fe(दार्जीलिङ :\1ffमणि प्रिण्टिङ प्रेस)\1e  \1faDārjīliṅ :\1fbLakshmīdās Vasneta,\1fc[2021] 1964\1fe(Dārjīliṅ :\1ffMaṇi Priṇṭiṅa Presa)\1e  \1fa[6], 96 p. ;\1fc18 cm.\1e  \1faPritned by Nagendramaṇi Pradhān.\1e  \1faPreface by Śivakumāra Rāī.\1e  \1faCollection of seven stories.\1e  \1faIn Nepali.\1e 0\1faNepali literature.\1fvStory.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4987\1e\1d01320nam a2200241Ka 4500008004300000020002000043020001500063100004100078100002500119245017000144245010800314250004300422250002700465260019000492260012500682300003000807500001100837500002600848520007600874546001500950650003200965852008100997\1e090114s1967    np            000 p nep d  \1e  \1fc50 पैसा\1e  \1fc50 paisā\1e\1faभट्ट, गोविन्द.\1e\1faBhaṭṭa, Govinda.\1e10\1faशान्ति सन्देश :\1fbमहाभारतमा आधारित एउटा काव्य कथा /\1fcगोविन्द भट्ट.\1e10\1faŚānti sandeśa :\1fbMahābhāratamā ādhārita euṭā kāvya kathā /\1fcGovinda Bhaṭṭa.\1e  \1faपहिलो संस्करण.\1e  \1faPahilo saṃskaraṇa.\1e  \1faकाठमाडौं :\1fbसूर्योदय प्रकाशन,\1fc2024 [1967]\1fe(काठमाडौं :\1ffएशियन प्रिन्टिङ्ग प्रेस)\1e  \1faKāṭhamāḍauṃ :\1fbSūryoday Prakāśana,\1fc2024 [1967]\1fe(Kāṭhamāḍauṃ :\1ffEśiyan Prinṭiṅga Presa)\1e  \1faiii, [2], 19 p. ;\1fc18 cm.\1e  \1faPoems.\1e  \1fa1,000 copies printed.\1e  \1faPoetic drama on the story based on Mahabharata, a Hindu religious book.\1e  \1faIn Nepali.\1e 0\1faNepali literature.\1fvPoetry.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4988\1e\1d01267nam a2200253Ka 4500008004300000020002000043020001500063100007300078100004100151245009900192245005600291250004300347250002900390260015900419260011100578300003300689500002600722500003700748520006200785546002700847650003200874852008100906952002600987\1e090114s1967    np            000 e nep d  \1e  \1fc75 पैसा\1e  \1fc75 paisā\1e\1faलोहनी, विष्णुप्रसाद,\1fgएम. ए.\1e\1faLohanī, Vishṇuprasād,\1fgEma. E.\1e10\1faशिवशक्ति /\1fcलेखक विष्णुप्रसाद लोहनी.\1e10\1faŚivaśakti /\1fcLekhaka Vishṇuprasād Lohanī.\1e  \1faप्रथम संस्करण.\1e  \1faPrathama saṃskaraṇa.\1e  \1faकाठमाडौं :\1fbमनोरमा लोहनी,\1fc2024 [1967]\1fe(काठमाडौं :\1ffअन्नपुर्णा प्रेस)\1e  \1faKāṭhamāḍauṃ :\1fbManoramā Lohanī,\1fc2024 [1967]\1fe(Kāṭhamāḍauṃ :\1ffAnnapurṇā Presa)\1e  \1fa[1], 2, [1], 27 p. ;\1fc18 cm.\1e  \1fa1,000 copies printed.\1e  \1faCopyright holder: the publisher.\1e  \1faCollection of articles on moral education and philosophy.\1e  \1faIn Nepali and English.\1e 0\1faNepali literature.\1fvEssays.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4989\1e  \1faLibrary has 4 copies.\1e\1d01131nam a2200229Ka 4500008004300000020001700043020001300060100003500073100002300108245013800131245008300269250004300352250002900395260014700424260010800571300003000679500002600709500003800735546001500773650003200788852008100820\1e090114s1967    np            000 f nep d  \1e  \1fcरु. 2.50\1e  \1fcRu. 2.50\1e\1faथापा, युधिर.\1e\1faThāpā, Yudhir.\1e10\1faहिमालको काखमा :\1fbमौलिक सामाजिक उपन्यास /\1fcयुधिर थापा.\1e10\1faHimālako Kākhamā :\1fbMaulika Sāmājika Upanyāsa /\1fcYudhir Thāpā.\1e  \1faप्रथम संस्करण.\1e  \1faPrathama saṃskaraṇa.\1e  \1faकाठमाडौं :\1fbइन्दु थापा,\1fc2024 [1967]\1fe(काठमाडौं :\1ffमातृभूमि प्रेस)\1e  \1faKāṭhamāḍauṃ :\1fbIndu Thāpā,\1fc2024 [1967]\1fe(Kāṭhamāḍauṃ :\1ffMātṛbhūmi Presa)\1e  \1faii, [1], 125 p. ;\1fc18 cm.\1e  \1fa1,000 copies printed.\1e  \1faIntroductory note Uttam Kũvara.\1e  \1faIn Nepali.\1e 0\1faNepali literature.\1fvNovels.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4990\1e\1d01041nam a2200217Ka 4500008004300000020001400043020001000057100004900067100003400116245012800150250004200278250002700320260014500347260010700492300002500599500001400624500002600638520005100664546002700715852008100742\1e090114q19601969np            000 e nep d  \1e  \1fcरु. 5\1e  \1fcRu. 5\1e\1faतुलाधर, दमनराज,\1fetr.\1e\1faTulādhar, Damanarāj,\1fetr.\1e10\1faPronouncements of King mahendra :\1fbExcerpts from King mahendra's Proclamations Sspeeches\1fcTranslated by Daman raj Tuladhar.\1e  \1faप्रथम संस्करण\1e  \1faPrathama saṃskaraṇ\1e  \1faकाठमाडौं :\1fbसन्देह गृह,\1fc[201-?] [196-?]\1fe(काठमाडौं :\1ffएचएमजी प्रेस)\1e  \1faKāṭhamāḍauṃ :\1fbSandeha Gṛha,\1fc[201-?] [196-?]\1fe(Kāṭhamāḍauṃ :\1ffEcaemajī Presa)\1e  \1faiv, 223 p. ;\1fc21 cm.\1e  \1faSpeeches.\1e  \1fa2,000 copies printed.\1e  \1faCollection of pronouncements of King Mahendra.\1e  \1faIn Nepali and english.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4991\1e\1d01145nam a2200229Ka 4500008004300000020001400043020001000057100007000067100004000137245011300177245006600290250004600356250002600402260015600428260011900584300002600703500002600729520003500755546001500790650002900805852008100834\1e090114s1967    np            000 j nep d  \1e  \1fcरु. 2\1e  \1fcRu. 2\1e 0\1faअधिकारी, बोधविक्रम,\1fgएम. ए.\1e 0\1faAdhikārī, Bodhavikram,\1fgEma. E.\1e10\1faनेपाली दन्त कथा /\1fcलेखक बोधविक्रम अधिकारी.\1e10\1faNepālī Danta kathā /\1fcLekhaka Bodhavikram Adhikārī.\1e  \1faदोस्रो संस्करण.\1e  \1faDosro saṃskaraṇa.\1e  \1faललितपुर :\1fbसाझा प्रकाशन,\1fc2024 [1967]\1fe(काठमाडौं :\1ffसगरमाथा छापाखाना)\1e  \1faLalitapura :\1fbSājhā Prakāśana,\1fc2024 [1967]\1fe(Kāṭhamāḍauṃ :\1ffSagaramāthā Chāpākhānā)\1e  \1fa[2], 148 p. ;\1fc18 cm.\1e  \1fa5,000 copies printed.\1e  \1faCollection of 12 folk stories.\1e  \1faIn Nepali.\1e 0\1faFolk literature.\1fvStory.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4992\1e\1d00929nam a2200193Ka 4500008004300000020000900043245010800052245006400160250002200224250001300246260011700259260008400376300005200460500001700512520008900529546001500618650002100633852008100654\1e090114q19601969np f          000 e nep d  \1e  \1fcnil.\1e00\1faनेपाल उद्योग वाणिज्य संघ परिचय र विवरण.\1e00\1faNepāla udyoga vāṇijya saṅgha paricay ra vivaraṇa.\1e  \1fa[पहिलो]\1e  \1fa[Pahilo]\1e  \1faकाठमाडौं :\1fbनेपाल उद्योग वाणिज्य संघ,\1fc[201-?] [196-?]\1e  \1faKāṭhamāḍauṃ :\1fbNepāla Udyoga Vāṇijya Saṅgha,\1fc[201-?] [196-?]\1e  \1fa[2], 34, 37 p. [12] leaves of plates  ;\1fc24 cm.\1e  \1faCover title.\1e  \1faIntroduction to Nepal Chamber of Commerce and details of the first general assembly.\1e  \1faIn Nepali.\1e 0\1faReport.\1fvEssays.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4993\1e\1d01127nam a2200229Ka 4500008004300000020001400043100004400057100003100101245012100132245006700253250004300320250002700363260016300390260010700553300002800660500002600688520002900714546001500743650003200758852008100790952002600871\1e090114s1967    np            000 e nep d  \1e  \1fcरु. 5\1e\1faलामिछाने, शंकर.\1e\1faLāmichāne, Śaṅkar.\1e10\1faएब्स्ट्रयाक्ट चिन्तन प्याज /\1fcशंकर लामिछाने.\1e10\1faEbsṭrayākṭa cintan pyāja /\1fcŚaṅkar Lāmichhāne.\1e  \1faपहिलो संस्करण.\1e  \1faPahilo saṃskaraṇa.\1e  \1faबिराटनगर :\1fbपुस्तक संसार,\1fc2024 [1967]\1fe(बनारस :\1ffजीवन शिक्षा मुद्रणालय)\1e  \1faBirāṭanagar :\1fbPustak Saṅsāra,\1fc2024 [1967]\1fe(Banāras :\1ffJīvan Śikshā Mudraṇālaya)\1e  \1fa4, [2], 61 p. ;\1fc22 cm.\1e  \1fa1,200 copies printed.\1e  \1faCollection of 10 essays.\1e  \1faIn Nepali.\1e 0\1faNepali literature.\1fvEssays.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4994\1e  \1faLibrary has 3 copies.\1e\1d01029nam a2200193Ka 4500008004300000020000800043245009200051245004700143250002200190250001300212260021700225260012600442300001900568500001700587520010900604546001500713650002600728852008100754\1e090114s1960    np            000 e nep d  \1e  \1fcnil\1e00\1faवर्षे बालीको कार्यक्रम :\1fb२०१६, १७.\1e00\1faVarshe bālīko kāryakram :\1fb2016, 17.\1e  \1fa[पहिलो]\1e  \1fa[Pahilo]\1e  \1faत्रिशुली :\1fbत्रिभुवन ग्राम तथा जिल्ला विकास केन्द्र,\1fc2017 [1960]\1fe(काठमाडौं :\1ffनेपाल प्रेस)\1e  \1faTriśulī :\1fbTribhuvan Grāma Tathā Jillā Vikāsa Kendra,\1fc2017 [1960]\1fe(Kāṭhamāḍauṃ :\1ffNepāla Presa)\1e  \1fa8 p. ;\1fc21 cm.\1e  \1faCover title.\1e  \1faDiscussion on farming techniques including the selection of improved varieties and required fertilizers.\1e  \1faIn Nepali.\1e 0\1faAgriculture.\1fvEssays.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4995\1e\1d00975nam a2200217Ka 4500008004300000020001400043100004100057100002800098245008800126245005400214250002200268250001300290260015000303260009200453300004700545500001100592500002600603546001500629650003200644852008100676\1e090114s1967    np f          000 p nep d  \1e  \1fcरु. 2\1e\1faज्ञवाली, कपूर.\1e\1faJñavālī, Kapūr.\1e10\1faउरू :\1fbअश्रु काव्य /\1fcकपूर ज्ञवाली.\1e10\1faUrū :\1fbaśru kāvya /\1fcKapūr Jñavālī.\1e  \1fa[पहिलो]\1e  \1fa[Pahilo]\1e  \1faलुम्बिनी :\1fbपसिना प्रकाशन,\1fc2024 [1967]\1fe(बनारस :\1ffमाहेश्वरी प्रेस)\1e  \1faLumbinī :\1fbPasinā Prakāśana,\1fc2024 [1967]\1fe(Banāras :\1ffMāheśvarī Presa)\1e  \1fa5, 90, [2] p. [1] leaf of plates ;\1fc16 cm.\1e  \1faPoems.\1e  \1fa1,000 copies printed.\1e  \1faIn Nepali.\1e 0\1faNepali literature.\1fvPoetry.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4996\1e\1d00923nam a2200193Ka 4500008004300000020000800043245008700051245005100138250002200189250001300211260018200224260011500406300002500521500001700546520004500563546001500608650002500623852008100648\1e090114q19601969np       l    000 0 nep d  \1e  \1fcnil\1e00\1faमोरङ्ग मोटर सिण्डिकेटको विधान.\1e00\1faMoraṅga moṭar siṇḍikeṭako vidhāna.\1e  \1fa[पहिलो]\1e  \1fa[Pahilo]\1e  \1faविराटनगर :\1fbमोरङ्ग मोटर सिण्डिकेट,\1fc[201-?] [196-?]\1fe(बिराटनगर :\1ffपायोनियर प्रेस)\1e  \1faVirāṭanagar :\1fbMoraṅga Moṭar Siṇḍikeṭa,\1fc[201-?] [196-?]\1fe(Birāṭanagar :\1ffPāyoniyar Presa)\1e  \1faiii, 14 p. ;\1fc18 cm.\1e  \1faCover title.\1e  \1faConstitution of Morang moter Syindicate.\1e  \1faIn Nepali.\1e 0\1faLaw and legislation.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4997\1e\1d01375nam a2200265Ka 4500008004300000020003100043020002200074100005500096100004000151245013700191245008100328250004300409250002700452260017500479260011300654300003100767500001700798520004600815546001500861650002100876700006400897700004100961852008101002952002601083\1e090114s1961    np            000 e nep d  \1e  \1fcरु. 6. 25 पैसा\1e  \1fcRu. 6. 25 paisā\1e\1faपौडेल, भोलानाथ,\1feJoint ed.\1e\1faPauḍel, Bholānāth,\1feJoint ed.\1e10\1faगल्लीमा फ्याकिएका कसिंगर /\1fcसम्पादक भोलानाथ पौडेल.\1e10\1faGallīmā phyākiekā kasiṃgara /\1fcSampādaka Bholānāth Pauḍel.\1e  \1faपहिलो संस्करण.\1e  \1faPahilo saṃskaraṇa.\1e  \1faललितपुर :\1fbजगदम्बा प्रकाशन,\1fc2018 [1961]\1fe(काठमाडौं :\1ffविजय प्रिण्टिङ प्रेस)\1e  \1faLalitapura :\1fbJagadambā Prakāśana,\1fc2018 [1961]\1fe(Kāṭhamāḍauṃ :\1ffVijay Priṇṭiṅa Presa)\1e  \1fa[4], 269, [3] p. ;\1fc22 cm.\1e  \1faCover title.\1e  \1faReview of Nepali and Sanskrit literature.\1e  \1faIn Nepali.\1e 0\1faReview.\1fvEssays.\1e\1faबज्रचार्य, धनवज्र,\1feJoint ed.\1e\1faBajracārya, Dhanavajra,\1feJoint ed.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4998\1e  \1faLibrary has 2 copies.\1e\1d01011nam a2200217Ka 4500008004300000020003100043020002200074100003300096100002000129245007400149245004700223250004300270250002900313260015900342260012200501300002500623500001700648546001500665650003200680852008100712\1e090114s1967    np            000 f nep d  \1e  \1fcरु. 1. 25 पैसा\1e  \1fcRu. 1. 25 paisā\1e\1faदीर्घवाहु.\1e\1faDīrghavāhu.\1e10\1faमुर्कट्टा लाश /\1fcदीर्घवाहु.\1e10\1faMurkaṭṭā lāśa /\1fcDīrghavāhu.\1e  \1faप्रथम संस्करण.\1e  \1faPrathama saṃskaraṇa.\1e  \1faकाठमाडौं :\1fbसगरमाथा प्रकाशन,\1fc2024 [1967]\1fe(काठमाडौं :\1ffजोरगणेश प्रेस)\1e  \1faKāṭhamāḍauṃ :\1fbSagaramāthā Prakāśana,\1fc2024 [1967]\1fe(Kāṭhamāḍauṃ :\1ffJoragaṇeśa Presa)\1e  \1fa94, [2] p. ;\1fc18 cm.\1e  \1faCover title.\1e  \1faIn Nepali.\1e 0\1faNepali literature.\1fvNovels.\1e  \1faMadan Puraskar Pustakalaya\1fePatandhoka, Lalitpur, Nepal\1fxAccession no.: 4999\1e\1d
\ No newline at end of file
index ac22a21..58a7e4a 100644 (file)
@@ -3,9 +3,9 @@ var djConfig = { parseOnLoad : true };
 if (location.href.match(/^.*conify\/(.+)\/global.*$/, "$1")) {
        var _url_locale = location.href.replace(/^.*conify\/(.+)\/global.*$/, "$1").replace(/_/,'-','g');
 
-       if (_url_locale) djConfig.locale = _url_locale;
+       if (_url_locale) djConfig.locale = _url_locale.toLowerCase();
 
 } else {
        var _url_locale = '<!--#echo var="locale"-->';
-       if (_url_locale != '(none)') djConfig.locale = _url_locale;
+       if (_url_locale != '(none)') djConfig.locale = _url_locale.toLowerCase();
 }
index c2fe524..84bcf6f 100644 (file)
@@ -5,11 +5,9 @@
 @import "/js/dojo/dojo/resources/dojo.css";
 @import "/js/dojo/dijit/themes/tundra/tundra.css";
 @import "/js/dojo/dojox/grid/_grid/Grid.css";
-@import "/js/dojo/dojox/grid/resources/Grid.css";
 @import "/js/dojo/dojox/grid/resources/tundraGrid.css";
 
 
-
 html, body, #oils-base-body-block {
     width:100%;
     height:100%;
@@ -18,6 +16,7 @@ html, body, #oils-base-body-block {
     padding:0;
 }
 table { border-collapse: collapse; }
+
 /* use this for divs whose contents should be entirely contained within the div */
 .container:after {content: ""; display: block; height: 0; clear: both; }
 
@@ -65,4 +64,20 @@ table { border-collapse: collapse; }
 
 
 .oils-fm-edit-dialog { margin: 5px; }
-.oils-fm-edit-dialog td { padding: 5px; }
+.oils-fm-edit-dialog td { padding: 5px; border:1px solid #999;}
+.oils-header-panel {
+    width:100%;
+    margin-top:20px;
+}
+.oils-header-panel div:first-child {
+    width:48%;
+    text-align:left;
+    float:left;
+    font-size:130%;
+    font-weight: bold;
+}
+.oils-header-panel div:last-child {
+    width:48%;
+    text-align:right;
+    float:right;
+}
index 2ca4f0d..ec9066e 100644 (file)
@@ -295,7 +295,8 @@ if(!dojo._hasResource["fieldmapper.Fieldmapper"]){
                FETCH_USER_NOTES : ['open-ils.actor','open-ils.actor.note.retrieve.all'],
                FETCH_ORG_BY_SHORTNAME : ['open-ils.actor','open-ils.actor.org_unit.retrieve_by_shorname'],
                FETCH_BIB_ID_BY_BARCODE : ['open-ils.search','open-ils.search.bib_id.by_barcode'],
-               FETCH_ORG_SETTING : ['open-ils.actor','open-ils.actor.ou_setting.ancestor_default']
+               FETCH_ORG_SETTING : ['open-ils.actor','open-ils.actor.ou_setting.ancestor_default'],
+               FETCH_ORG_SETTING_BATCH : ['open-ils.actor','open-ils.actor.ou_setting.ancestor_default.batch']
        };
 
 }
index 95aed1f..105e246 100644 (file)
@@ -41,15 +41,20 @@ if(!dojo._hasResource["fieldmapper.IDL"]) {
                 var id = node.getAttribute('id');
                 var fields = node.getElementsByTagName('fields')[0];
                 window.fmclasses[id] = [];
+                
+                var fieldData = this._parseFields(node, id);
     
                 var obj = { 
-                    fields  : this._parseFields(node, id),
+                    fields  : fieldData.list,
+                    field_map : fieldData.map,
                     name    : node.getAttribute('id'),
                     //table   : node.getAttributeNS(this.NS_PERSIST, 'tablename'),
                     //core    : node.getAttributeNS(this.NS_REPORTS, 'core'),
                     label   : node.getAttributeNS(this.NS_REPORTS, 'label'),
+                    restrict_primary   : node.getAttributeNS(this.NS_PERSIST, 'restrict_primary'),
                     virtual : (node.getAttributeNS(this.NS_PERSIST, 'virtual') == 'true'),
-                    pkey    : fields.getAttributeNS(this.NS_PERSIST, 'primary')
+                    pkey    : fields.getAttributeNS(this.NS_PERSIST, 'primary'),
+                    pkey_sequence : fields.getAttributeNS(this.NS_PERSIST, 'sequence')
                 };
 
                 var permacrud = node.getElementsByTagName('permacrud')[0];
@@ -90,6 +95,7 @@ if(!dojo._hasResource["fieldmapper.IDL"]) {
         /* parses the links and fields portion of the IDL */
         _parseFields : function(node, classname) {
             var data = [];
+            var map = {};
     
             var fields = node.getElementsByTagName('fields')[0];
             fields = fields.getElementsByTagName('field');
@@ -137,6 +143,7 @@ if(!dojo._hasResource["fieldmapper.IDL"]) {
                 } 
     
                 data.push(obj);
+                map[obj.name] = obj;
             }
     
             /*
@@ -149,7 +156,7 @@ if(!dojo._hasResource["fieldmapper.IDL"]) {
             );
             */
     
-            return data;
+            return { list : data, map : map };
         }
 
     });
index 7f14256..b043edf 100644 (file)
@@ -100,7 +100,19 @@ if(!dojo._hasResource["fieldmapper.OrgUtils"]){
    /* ---------------------------------------------------------------------- */
 
        fieldmapper.aou.prototype.fetchOrgSettingDefault = function (name) {
-               return this.standardRequest( fieldmapper.OpenSRF.methods.FETCH_ORG_SETTING, name ); 
+               return this.standardRequest( fieldmapper.OpenSRF.methods.FETCH_ORG_SETTING, [this.id(), name] ); 
+       }
+
+       fieldmapper.aou.prototype.fetchOrgSettingBatch = function (nameList) {
+               return this.standardRequest( fieldmapper.OpenSRF.methods.FETCH_ORG_SETTING_BATCH, [this.id(), nameList] ); 
+       }
+
+       fieldmapper.aou.fetchOrgSettingDefault = function (orgId, name) {
+               return fieldmapper.standardRequest( fieldmapper.OpenSRF.methods.FETCH_ORG_SETTING, [orgId, name] ); 
+       }
+
+       fieldmapper.aou.fetchOrgSettingBatch = function (orgId, nameList) {
+               return fieldmapper.standardRequest( fieldmapper.OpenSRF.methods.FETCH_ORG_SETTING_BATCH, [orgId, nameList] ); 
        }
 
        fieldmapper.aout.findOrgType = function (id) {
index d35f345..a0a12e8 100644 (file)
@@ -23,6 +23,7 @@ if(!dojo._hasResource["openils.User"]) {
     dojo.require('openils.Event');
     dojo.require('fieldmapper.Fieldmapper');
     dojo.require('fieldmapper.OrgUtils');
+    dojo.require('openils.Util');
 
     dojo.declare('openils.User', null, {
 
index fbf22ef..df9f272 100644 (file)
@@ -204,4 +204,18 @@ if(!dojo._hasResource["openils.Util"]) {
         }
         return map;
     };
+
+    /**
+     * Assume a space-separated interval string, with optional comma
+     * E.g. "1 year, 2 days"  "3 days 6 hours"
+     */
+    openils.Util.intervalToSeconds = function(interval) {
+        var d = new Date();
+        var start = d.getTime();
+        var parts = interval.split(' ');
+        for(var i = 0; i < parts.length; i += 2) 
+            d = dojo.date.add(d, parts[i+1].replace(/s?,?$/,''), Number(parts[i]));
+        return Number((d.getTime() - start) / 1000);
+    };
 }
+
diff --git a/Open-ILS/web/js/dojo/openils/XUL.js b/Open-ILS/web/js/dojo/openils/XUL.js
new file mode 100644 (file)
index 0000000..80f4c09
--- /dev/null
@@ -0,0 +1,25 @@
+if(!dojo._hasResource["openils.XUL"]) {
+
+    dojo.provide("openils.XUL");
+    dojo.declare('openils.XUL', null, {});
+
+    openils.XUL.isXUL = function() {
+        return window.IAMXUL;
+    }
+    
+    openils.XUL.getStash = function() {
+        if(openils.XUL.isXUL()) {
+            try {
+                           netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
+                           var CacheClass = new Components.Constructor("@mozilla.org/openils_data_cache;1", "nsIOpenILS");
+                           return new CacheClass().wrappedJSObject.OpenILS.prototype.data;
+            } catch(e) {
+                console.log("Error loading XUL stash: " + e);
+            }
+        }
+
+        return {};
+    };
+}
+
+
index 62451fd..aa905ed 100644 (file)
@@ -19,6 +19,8 @@ if(!dojo._hasResource["openils.acq.CurrencyType"]) {
     dojo._hasResource["openils.acq.CurrencyType"] = true;
     dojo.provide("openils.acq.CurrencyType");
     dojo.require('openils.User');
+    dojo.require('openils.Util');
+    dojo.require('openils.PermaCrud');
 
     dojo.declare('openils.acq.CurrencyType', null, {
     });
@@ -29,18 +31,18 @@ if(!dojo._hasResource["openils.acq.CurrencyType"]) {
      * Retrieves all of the currency types
      */
     openils.acq.CurrencyType.fetchAll = function(onComplete) {
-        var req = new OpenSRF.ClientSession('open-ils.acq').request(
-            'open-ils.acq.currency_type.all.retrieve', openils.User.authtoken);
-
-        req.oncomplete = function(r) {
-            var msg = r.recv();
-            var types = msg.content();
-            for(var i in types) 
-                openils.acq.CurrencyType.cache[types[i].code()] = types[i];
-            onComplete(types);
-        }
-        req.send();
-    }
+        var list = [];
+        var pcrud = new openils.PermaCrud();
+        pcrud.retrieveAll('acqct', {
+            async : true,
+            oncomplete : function(r) {
+                var types = openils.Util.readResponse(r);
+                for(var idx in types)
+                    openils.acq.CurrencyType.cache[types[idx].code()] = types[idx];
+                onComplete(types);
+            }
+        });
+    };
 
     openils.acq.CurrencyType.loadSelectWidget = function(selector) {
         openils.acq.CurrencyType.fetchAll(
@@ -50,6 +52,6 @@ if(!dojo._hasResource["openils.acq.CurrencyType"]) {
                 selector.setValue(ctypes[0].code()); /* XXX get from setting */
             }
         );
-    }
+    };
 }
 
index fc9c452..ca3a1d1 100644 (file)
@@ -44,7 +44,6 @@ dojo.declare('openils.editors.FundSelectEditor', dojox.grid.editors.Dijit, {
 dojo.declare('openils.editors.ProviderSelectEditor', dojox.grid.editors.Dijit, {
     editorClass: "openils.widget.ProviderSelector",
     createEditor: function(inNode, inDatum, inRowIndex) {
-       console.log("openils.widget.ProviderSelectEditor");
        var editor = new this.editorClass(this.getEditorProps(inDatum), inNode);
        openils.acq.Provider.buildPermProviderSelector(this.cell.perm || this.perm,
                                                       editor);
index 484f6f1..96a2a43 100644 (file)
@@ -7,6 +7,7 @@ if(!dojo._hasResource['openils.widget.AutoFieldWidget']) {
     dojo.declare('openils.widget.AutoFieldWidget', null, {
 
         async : false,
+        cache : {},
 
         /**
          * args:
@@ -26,10 +27,13 @@ if(!dojo._hasResource['openils.widget.AutoFieldWidget']) {
                 this[k] = args[k];
 
             // find the field description in the IDL if not provided
+            if(this.fmObject) 
+                this.fmClass = this.fmObject.classname;
+            this.fmIDL = fieldmapper.IDL.fmclasses[this.fmClass];
+
             if(!this.idlField) {
-                if(this.fmObject)
-                    this.fmClass = this.fmObject.classname;
-                var fields = fieldmapper.IDL.fmclasses[this.fmClass].fields;
+                this.fmIDL = fieldmapper.IDL.fmclasses[this.fmClass];
+                var fields = this.fmIDL.fields;
                 for(var f in fields) 
                     if(fields[f].name == this.fmField)
                         this.idlField = fields[f];
@@ -37,10 +41,14 @@ if(!dojo._hasResource['openils.widget.AutoFieldWidget']) {
         },
 
         /**
-         * Turn the value from the dojo widget into a value oils understands
+         * Turn the widget-stored value into a value oils understands
          */
         getFormattedValue : function() {
-            var value = this.widget.attr('value');
+            var value = this.baseWidgetValue();
+
+            /* text widgets default to "" when no data is entered */
+            if(value == '') return null; 
+
             switch(this.idlField.datatype) {
                 case 'bool':
                     return (value) ? 't' : 'f'
@@ -50,7 +58,16 @@ if(!dojo._hasResource['openils.widget.AutoFieldWidget']) {
                     return value;
             }
         },
+
+        baseWidgetValue : function(value) {
+            var attr = (this.readOnly) ? 'content' : 'value';
+            if(arguments.length) this.widget.attr(attr, value);
+            return this.widget.attr(attr);
+        },
         
+        /**
+         * Turn the widget-stored value into something visually suitable
+         */
         getDisplayString : function() {
             var value = this.widgetValue;
             switch(this.idlField.datatype) {
@@ -64,61 +81,147 @@ if(!dojo._hasResource['openils.widget.AutoFieldWidget']) {
                 case 'org_unit':
                     return fieldmapper.aou.findOrgUnit(value).shortname();
                 default:
-                    return value;
+                    return value+'';
             }
         },
 
         build : function(onload) {
+
+            if(this.widget) {
+                // core widget provided for us, attach and move on
+                if(this.parentNode) // may already be in the "right" place
+                    this.parentNode.appendChild(this.widget.domNode);
+                return;
+            }
+
             this.onload = onload;
             if(this.widgetValue == null)
                 this.widgetValue = (this.fmObject) ? this.fmObject[this.idlField.name]() : null;
 
-            switch(this.idlField.datatype) {
-                
-                case 'id':
-                    dojo.require('dijit.form.TextBox');
-                    this.widget = new dijit.form.TextBox(this.dijitArgs, this.parentNode);
-                    this.widget.attr('disabled', true); // never allow editing of IDs
-                    break;
+            if(this.readOnly) {
+                dojo.require('dijit.layout.ContentPane');
+                this.widget = new dijit.layout.ContentPane(this.dijitArgs, this.parentNode);
 
-                case 'org_unit':
-                    this._buildOrgSelector();
-                    break;
+            } else if(this.widgetClass) {
+                dojo.require(this.widgetClass);
+                eval('this.widget = new ' + this.widgetClass + '(this.dijitArgs, this.parentNode);');
 
-                case 'money':
-                    dojo.require('dijit.form.CurrencyTextBox');
-                    this.widget = new dijit.form.CurrencyTextBox(this.dijitArgs, this.parentNode);
-                    break;
+            } else {
 
-                case 'timestamp':
-                    dojo.require('dijit.form.DateTextBox');
-                    dojo.require('dojo.date.stamp');
-                    this.widget = new dijit.form.DateTextBox(this.dijitArgs, this.parentNode);
-                    if(this.widgetValue != null) 
-                        this.widgetValue = dojo.date.stamp.fromISOString(this.widgetValue);
-                    break;
+                switch(this.idlField.datatype) {
+                    
+                    case 'id':
+                        dojo.require('dijit.form.TextBox');
+                        this.widget = new dijit.form.TextBox(this.dijitArgs, this.parentNode);
+                        this.widget.attr('disabled', true); // never allow editing of IDs
+                        break;
 
-                case 'bool':
-                    dojo.require('dijit.form.CheckBox');
-                    this.widget = new dijit.form.CheckBox(this.dijitArgs, this.parentNode);
-                    this.widgetValue = openils.Util.isTrue(this.widgetValue);
-                    break;
+                    case 'org_unit':
+                        this._buildOrgSelector();
+                        break;
 
-                default:
-                    dojo.require('dijit.form.TextBox');
-                    this.widget = new dijit.form.TextBox(this.dijitArgs, this.parentNode);
+                    case 'money':
+                        dojo.require('dijit.form.CurrencyTextBox');
+                        this.widget = new dijit.form.CurrencyTextBox(this.dijitArgs, this.parentNode);
+                        break;
+
+                    case 'int':
+                        dojo.require('dijit.form.NumberTextBox');
+                        this.dijitArgs = dojo.mixin(this.dijitArgs || {}, {constraints:{places:0}});
+                        this.widget = new dijit.form.NumberTextBox(this.dijitArgs, this.parentNode);
+                        break;
+
+                    case 'float':
+                        dojo.require('dijit.form.NumberTextBox');
+                        this.widget = new dijit.form.NumberTextBox(this.dijitArgs, this.parentNode);
+                        break;
+
+                    case 'timestamp':
+                        dojo.require('dijit.form.DateTextBox');
+                        dojo.require('dojo.date.stamp');
+                        this.widget = new dijit.form.DateTextBox(this.dijitArgs, this.parentNode);
+                        if(this.widgetValue != null) 
+                            this.widgetValue = dojo.date.stamp.fromISOString(this.widgetValue);
+                        break;
+
+                    case 'bool':
+                        dojo.require('dijit.form.CheckBox');
+                        this.widget = new dijit.form.CheckBox(this.dijitArgs, this.parentNode);
+                        this.widgetValue = openils.Util.isTrue(this.widgetValue);
+                        break;
+
+                    case 'link':
+                        if(this._buildLinkSelector()) break;
+
+                    default:
+                        dojo.require('dijit.form.TextBox');
+                        this.widget = new dijit.form.TextBox(this.dijitArgs, this.parentNode);
+                }
             }
 
             if(!this.async) this._widgetLoaded();
             return this.widget;
         },
 
+        _buildLinkSelector : function() {
+
+            /* verify we can and should grab the related class */
+            var linkClass = this.idlField['class'];
+            if(this.idlField.reltype != 'has_a')  return false;
+            if(!fieldmapper.IDL.fmclasses[linkClass].permacrud) return false;
+            if(!fieldmapper.IDL.fmclasses[linkClass].permacrud.retrieve) return false;
+
+            dojo.require('openils.PermaCrud');
+            dojo.require('dojo.data.ItemFileReadStore');
+            dojo.require('dijit.form.FilteringSelect');
+
+            var self = this;
+            var vfield;
+            var rclassIdl = fieldmapper.IDL.fmclasses[linkClass];
+
+            if(linkClass == 'pgt')
+                return self._buildPermGrpSelector();
+
+            this.async = true;
+            this.widget = new dijit.form.FilteringSelect(this.dijitArgs, this.parentNode);
+
+            for(var f in rclassIdl.fields) {
+                if(self.idlField.key == rclassIdl.fields[f].name) {
+                    vfield = rclassIdl.fields[f];
+                    break;
+                }
+            }
+
+            this.widget.searchAttr = this.widget.labelAttr = vfield.selector || vfield.name;
+            this.widget.valueAttr = vfield.name;
+
+            new openils.PermaCrud().retrieveAll(linkClass, {   
+                async : true,
+                oncomplete : function(r) {
+                    var list = openils.Util.readResponse(r, false, true);
+                    if(list) {
+                        self.widget.store = 
+                            new dojo.data.ItemFileReadStore({data:fieldmapper[linkClass].toStoreData(list)});
+                    }
+                    self.widget.startup();
+                    self._widgetLoaded();
+                }
+            });
+
+            return true;
+        },
+
         /**
          * For widgets that run asynchronously, provide a callback for finishing up
          */
         _widgetLoaded : function(value) {
-            if(this.widgetValue != null) 
-                this.widget.attr('value', this.widgetValue);
+            if(this.readOnly) {
+                this.baseWidgetValue(this.getDisplayString());
+            } else {
+                this.baseWidgetValue(this.widgetValue);
+                if(this.idlField.name == this.fmIDL.pkey && this.fmIDL.pkey_sequence)
+                    this.widget.attr('disabled', true); 
+            }
             if(this.onload)
                 this.onload(this.widget, self);
         },
@@ -148,6 +251,44 @@ if(!dojo._hasResource['openils.widget.AutoFieldWidget']) {
                 this.widget.tree = fieldmapper.aou.globalOrgTree;
                 this.widget.startup();
             }
+        },
+
+        _buildPermGrpSelector : function() {
+            dojo.require('openils.widget.FilteringTreeSelect');
+            this.widget = new openils.widget.FilteringTreeSelect(this.dijitArgs, this.parentNode);
+            this.widget.searchAttr = 'name';
+
+            if(this.cache.permGrpTree) {
+                this.widget.tree = this.cache.permGrpTree;
+                this.widget.startup();
+                return;
+            } 
+
+            var self = this;
+            this.async = true;
+            new openils.PermaCrud().retrieveAll('pgt', {
+                async : true,
+                oncomplete : function(r) {
+                    var list = openils.Util.readResponse(r, false, true);
+                    if(!list) return;
+                    var map = {};
+                    var root = null;
+                    for(var l in list)
+                        map[list[l].id()] = list[l];
+                    for(var l in list) {
+                        var node = list[l];
+                        var pnode = map[node.parent()];
+                        if(!pnode) {root = node; continue;}
+                        if(!pnode.children()) pnode.children([]);
+                        pnode.children().push(node);
+                    }
+                    self.widget.tree = self.cache.permGrpTree = root;
+                    self.widget.startup();
+                    self._widgetLoaded();
+                }
+            });
+
+            return true;
         }
     });
 }
index c8bb10f..d4c858c 100644 (file)
@@ -3,32 +3,195 @@ if(!dojo._hasResource['openils.widget.AutoGrid']) {
     dojo.require('dojox.grid.DataGrid');
     dojo.require('openils.widget.AutoWidget');
     dojo.require('openils.widget.AutoFieldWidget');
+    dojo.require('openils.widget.EditDialog');
     dojo.require('openils.Util');
 
     dojo.declare(
         'openils.widget.AutoGrid',
         [dojox.grid.DataGrid, openils.widget.AutoWidget],
         {
+
+            /* if true, pop up an edit dialog when user hits Enter on a give row */
+            editOnEnter : false, 
+            defaultCellWidth : null,
+
+            /* by default, don't show auto-generated (sequence) fields */
+            showSequenceFields : false, 
+
             startup : function() {
+                this.selectionMode = 'single';
                 this.inherited(arguments);
                 this.initAutoEnv();
-                var existing = (this.structure) ? this.structure[0].cells[0] : [];
+                this.setStructure(this._compileStructure());
+                this.setStore(this.buildAutoStore());
+                this.overrideEditWidgets = {};
+                if(this.editOnEnter) 
+                    this._applyEditOnEnter();
+                else if(this.singleEditStyle) 
+                    this._applySingleEditStyle();
+            },
+
+            _compileStructure : function() {
+                var existing = (this.structure && this.structure[0].cells[0]) ? 
+                    this.structure[0].cells[0] : [];
                 var fields = [];
+
+                var self = this;
+                function pushEntry(entry) {
+                    if(!entry.get) 
+                        entry.get = openils.widget.AutoGrid.defaultGetter
+                    if(!entry.width && self.defaultCellWidth)
+                        entry.width = self.defaultCellWidth;
+                    fields.push(entry);
+                }
+
+                if(!this.fieldOrder) {
+                    /* no order defined, start with any explicit grid fields */
+                    for(var e in existing) {
+                        var entry = existing[e];
+                        var field = this.fmIDL.fields.filter(
+                            function(i){return (i.name == entry.field)})[0];
+                        if(field) entry.name = entry.name || field.label;
+                        pushEntry(entry);
+                    }
+                }
+
                 for(var f in this.sortedFieldList) {
                     var field = this.sortedFieldList[f];
                     if(!field || field.virtual) continue;
+                    
+                    // field was already added above
+                    if(fields.filter(function(i){return (i.field == field.name)})[0]) 
+                        continue;
+
+
+                    if(!this.showSequenceFields && field.name == this.fmIDL.pkey && this.fmIDL.pkey_sequence)
+                        continue; 
                     var entry = existing.filter(function(i){return (i.field == field.name)})[0];
                     if(entry) entry.name = field.label;
                     else entry = {field:field.name, name:field.label};
-                    fields.push(entry);
-                    if(!entry.get) 
-                        entry.get = openils.widget.AutoGrid.defaultGetter
+                    pushEntry(entry);
                 }
-                this.setStructure([{cells: [fields]}]);
+
+                return [{cells: [fields]}];
+            },
+
+            _applySingleEditStyle : function() {
+                this.onMouseOverRow = function(e) {};
+                this.onMouseOutRow = function(e) {};
+                this.onCellFocus = function(cell, rowIndex) { 
+                    this.selection.deselectAll();
+                    this.selection.select(this.focus.rowIndex);
+                };
+            },
+
+            /* capture keydown and launch edit dialog on enter */
+            _applyEditOnEnter : function() {
+                this._applySingleEditStyle();
+
+                dojo.connect(this, 'onRowDblClick',
+                    function(e) {
+                        this._drawEditDialog(this.selection.getFirstSelected(), this.focus.rowIndex);
+                    }
+                );
+
+                dojo.connect(this, 'onKeyDown',
+                    function(e) {
+                        if(e.keyCode == dojo.keys.ENTER) {
+                            this.selection.deselectAll();
+                            this.selection.select(this.focus.rowIndex);
+                            this._drawEditDialog(this.selection.getFirstSelected(), this.focus.rowIndex);
+                        }
+                    }
+                );
+            },
+
+            _drawEditDialog : function(storeItem, rowIndex) {
+                var grid = this;
+                var fmObject = new fieldmapper[this.fmClass]().fromStoreItem(storeItem);
+                var idents = grid.store.getIdentityAttributes();
+                var dialog = new openils.widget.EditDialog({
+                    fmObject:fmObject,
+                    overrideWidgets : this.overrideEditWidgets,
+                    onPostSubmit : function() {
+                        for(var i in fmObject._fields) {
+                            var field = fmObject._fields[i];
+                            if(idents.filter(function(j){return (j == field)})[0])
+                                continue; // don't try to edit an identifier field
+                            grid.store.setValue(storeItem, field, fmObject[field]());
+                        }
+                        dialog.destroy();
+
+                        if(self.onPostUpdate)
+                            self.onPostUpdate(storeItem, rowIndex);
+
+                        setTimeout(
+                            function(){
+                                try { 
+                                    grid.views.views[0].getCellNode(rowIndex, 0).focus(); 
+                                } catch (E) {}
+                            },200
+                        );
+                    },
+                    onCancel : function() {
+                        setTimeout(function(){
+                            grid.views.views[0].getCellNode(rowIndex, 0).focus();},200);
+                    }
+                });
+                dialog.editPane.fieldOrder = this.fieldOrder;
+                dialog.editPane.mode = 'update';
+                dialog.startup();
+                dialog.show();
+            },
+
+            showCreateDialog : function() {
+                var grid = this;
+                var dialog = new openils.widget.EditDialog({
+                    fmClass : this.fmClass,
+                    overrideWidgets : this.overrideEditWidgets,
+                    onPostSubmit : function(r) {
+                        var fmObject = openils.Util.readResponse(r);
+                        if(fmObject) 
+                            grid.store.newItem(fmObject.toStoreItem());
+                        dialog.destroy();
+                        if(grid.onPostCreate)
+                            grid.onPostCreate(fmObject);
+                        setTimeout(function(){
+                            try {
+                                grid.selection.select(grid.rowCount-1);
+                                grid.views.views[0].getCellNode(grid.rowCount-1, 1).focus();
+                            } catch (E) {}
+                        },200);
+                    },
+                });
+                dialog.editPane.fieldOrder = this.fieldOrder;
+                dialog.editPane.mode = 'create';
+                dialog.startup();
+                dialog.show();
+            },
+            
+            resetStore : function() {
                 this.setStore(this.buildAutoStore());
             },
 
-        }
+            loadAll : function(opts, search) {
+                dojo.require('openils.PermaCrud');
+                if(!opts) opts = {};
+                var self = this;
+                opts = dojo.mixin(opts, {
+                    async : true,
+                    streaming : true,
+                    onresponse : function(r) {
+                        var item = openils.Util.readResponse(r);
+                        self.store.newItem(item.toStoreItem());
+                    }
+                });
+                if(search)
+                    new openils.PermaCrud().search(this.fmClass, search, opts);
+                else
+                    new openils.PermaCrud().retrieveAll(this.fmClass, opts);
+            }
+        } 
     );
     openils.widget.AutoGrid.markupFactory = dojox.grid.DataGrid.markupFactory;
 
index 39ebc64..3db5a13 100644 (file)
@@ -27,8 +27,18 @@ if(!dojo._hasResource['openils.widget.EditDialog']) {
             constructor : function(args) {
                 this.editPane = new openils.widget.EditPane(args);
                 var self = this;
-                this.editPane.onCancel = function() { self.hide(); }
-                this.editPane.onPostApply = function() { self.hide(); }
+
+                this.editPane.onCancel = function() { 
+                    if(args.onCancel)
+                        args.onCancel();
+                    self.hide(); 
+                }
+
+                this.editPane.onPostSubmit = function(r) { 
+                    self.hide(); 
+                    if(args.onPostSubmit)
+                        args.onPostSubmit(r);
+                }
             },
 
             /**
index b92c951..9b8100c 100644 (file)
@@ -12,12 +12,12 @@ if(!dojo._hasResource['openils.widget.EditPane']) {
         [dijit.layout.ContentPane, openils.widget.AutoWidget],
         {
             mode : 'update',
-            fieldList : [], // holds the field name + associated widget
-            onPostApply : null, // apply callback
+            onPostSubmit : null, // apply callback
             onCancel : null, // cancel callback
             hideActionButtons : false,
 
             constructor : function(args) {
+                this.fieldList = [];
                 for(var k in args)
                     this[k] = args[k];
             },
@@ -29,6 +29,7 @@ if(!dojo._hasResource['openils.widget.EditPane']) {
             startup : function() {
                 this.inherited(arguments);
                 this.initAutoEnv();
+                this.hideActionButtons = this.readOnly;
 
                 var table = document.createElement('table');
                 var tbody = document.createElement('tbody');
@@ -39,13 +40,21 @@ if(!dojo._hasResource['openils.widget.EditPane']) {
                 if(this.fmIDL.permacrud && this.fmIDL.permacrud[this.mode])
                     this.limitPerms = this.fmIDL.permacrud[this.mode].perms;
 
+                if(!this.overrideWidgets)
+                    this.overrideWidgets = {};
+
                 for(var f in this.sortedFieldList) {
                     var field = this.sortedFieldList[f];
                     if(!field || field.virtual) continue;
 
+                    if(field.name == this.fmIDL.pkey && this.mode == 'create' && this.fmIDL.pkey_sequence)
+                        continue; /* don't show auto-generated fields on create */
+
                     var row = document.createElement('tr');
                     var nameTd = document.createElement('td');
                     var valTd = document.createElement('td');
+                    var valSpan = document.createElement('span');
+                    valTd.appendChild(valSpan);
 
                     nameTd.appendChild(document.createTextNode(field.label));
                     row.appendChild(nameTd);
@@ -55,11 +64,16 @@ if(!dojo._hasResource['openils.widget.EditPane']) {
                     var widget = new openils.widget.AutoFieldWidget({
                         idlField : field, 
                         fmObject : this.fmObject,
-                        parentNode : valTd,
-                        orgLimitPerms : this.limitPerms
+                        fmClass : this.fmClass,
+                        parentNode : valSpan,
+                        orgLimitPerms : this.limitPerms,
+                        readOnly : this.readOnly,
+                        widget : this.overrideWidgets[field.name]
                     });
+
                     widget.build();
                     this.fieldList.push({name:field.name, widget:widget});
+                    //this.applySaveOnEnter(widget);
                 }
                 if(!this.hideActionButtons)
                     this.buildActionButtons(tbody);
@@ -67,31 +81,38 @@ if(!dojo._hasResource['openils.widget.EditPane']) {
                 openils.Util.addCSSClass(table, 'oils-fm-edit-dialog');
             },
 
+            applySaveOnEnter : function(widget) {
+                var self = this;
+                dojo.connect(this, 'onKeyDown',
+                    function(e) {
+                        if(e.keyCode == dojo.keys.ENTER) 
+                            self.performAutoEditAction();
+                    }
+                );
+            },
+
             buildActionButtons : function(tbody) {
                 var row = document.createElement('tr');
                 var cancelTd = document.createElement('td');
                 var applyTd = document.createElement('td');
+                var cancelSpan = document.createElement('span');
+                var applySpan = document.createElement('span');
                 row.appendChild(cancelTd);
                 row.appendChild(applyTd);
+                cancelTd.appendChild(cancelSpan);
+                applyTd.appendChild(applySpan);
                 tbody.appendChild(row);
 
                 var self = this;
                 new dijit.form.Button({
                     label:'Cancel', // XXX
                     onClick : this.onCancel
-                }, cancelTd);
+                }, cancelSpan);
 
                 new dijit.form.Button({
                     label:'Save',  // XXX
-                    onClick: function() {
-                        self.performEditAction({
-                            oncomplete:function() {
-                                if(self.onPostApply)
-                                    self.onPostApply();
-                            }
-                        });
-                    }
-                }, applyTd);
+                    onClick: function() {self.performAutoEditAction();}
+                }, applySpan);
             },
 
             getFields : function() {
@@ -105,13 +126,25 @@ if(!dojo._hasResource['openils.widget.EditPane']) {
                 }
             },
 
+            performAutoEditAction : function() {
+                var self = this;
+                self.performEditAction({
+                    oncomplete:function(r) {
+                        if(self.onPostSubmit)
+                            self.onPostSubmit(r);
+                    }
+                });
+            },
+
             performEditAction : function(opts) {
                 var pcrud = new openils.PermaCrud();
                 var fields = this.getFields();
                 if(this.mode == 'create')
                     this.fmObject = new fieldmapper[this.fmClass]();
-                for(var idx in fields) 
+                for(var idx in fields)  
                     this.fmObject[fields[idx]](this.getFieldValue(fields[idx]));
+                if(this.mode == 'create' && this.fmIDL.pkey_sequence)
+                    this.fmObject[this.fmIDL.pkey](null);
                 pcrud[this.mode](this.fmObject, opts);
             }
         }
index b6f9636..7adc651 100644 (file)
@@ -25,7 +25,6 @@ if(!dojo._hasResource["openils.widget.FilteringTreeSelect"]){
             labelAttr : 'name',
             childField : 'children',
             tree : null,
-            dataList : [],
 
             startup : function() {
                 this.tree = (typeof this.tree == 'string') ? 
@@ -35,10 +34,13 @@ if(!dojo._hasResource["openils.widget.FilteringTreeSelect"]){
                     return;
                 }
                 if(!dojo.isArray(this.tree)) this.tree = [this.tree];
+                this.dataList = [];
                 var self = this;
-                this.tree.forEach(function(node) { self._makeNodeList(node); });
-                this.store = new dojo.data.ItemFileReadStore(
-                    {data:fieldmapper[this.dataList[0].classname].toStoreData(this.dataList)});
+                dojo.forEach(this.tree, function(node) { self._makeNodeList(node); });
+                if(this.dataList.length > 0) {
+                    this.store = new dojo.data.ItemFileReadStore(
+                        {data:fieldmapper[this.dataList[0].classname].toStoreData(this.dataList)});
+                }
                 this.inherited(arguments);
             },
 
diff --git a/Open-ILS/web/js/ui/default/acq/financial/list_currency_types.js b/Open-ILS/web/js/ui/default/acq/financial/list_currency_types.js
deleted file mode 100644 (file)
index 21e187b..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-dojo.require("dijit.Dialog");
-dojo.require('dijit.form.Button');
-dojo.require('dojox.grid.DataGrid');
-dojo.require('dojo.data.ItemFileWriteStore');
-dojo.require('openils.acq.CurrencyType');
-dojo.require('openils.Event');
-dojo.require('openils.Util');
-dojo.require('fieldmapper.dojoData');
-
-var currencyTypes = [];
-
-function loadCTypesGrid() {
-    var store = new dojo.data.ItemFileWriteStore({data:acqct.initStoreData('code', {identifier:'code'})});
-    currencyTypeListGrid.setStore(store);
-    currencyTypeListGrid.render();
-
-    fieldmapper.standardRequest(
-        [ 'open-ils.acq', 'open-ils.acq.currency_type.all.retrieve'],
-        { async: true,
-          params: [openils.User.authtoken],
-          onresponse : function(r){
-                if(ct = openils.Util.readResponse(r)) {
-                    openils.acq.CurrencyType.cache[ct.code()] = ct;
-                    store.newItem(acqct.toStoreItem(ct));
-                }
-            }
-        }
-    );
-}
-
-function createCT(args) {
-    if(!(args.code && args.label)) return;
-    var ct = new acqct();
-    ct.code(args.code);
-    ct.label(args.label);
-    fieldmapper.standardRequest(
-        ['open-ils.permacrud', 'open-ils.permacrud.create.acqct'],
-        {   async: true,
-            params: [openils.User.authtoken, ct],
-            oncomplete: function(r) {
-                if(new String(openils.Util.readResponse(r)) != '0')
-                    loadCTypesGrid();
-            }
-        }
-    );
-}
-
-
-openils.Util.addOnLoad(loadCTypesGrid);
diff --git a/Open-ILS/web/js/ui/default/actor/user/register.js b/Open-ILS/web/js/ui/default/actor/user/register.js
new file mode 100644 (file)
index 0000000..7e4842d
--- /dev/null
@@ -0,0 +1,376 @@
+dojo.require('dojo.data.ItemFileReadStore');
+dojo.require('dijit.form.Textarea');
+dojo.require('dijit.form.FilteringSelect');
+dojo.require('dijit.form.ComboBox');
+dojo.require('fieldmapper.IDL');
+dojo.require('openils.PermaCrud');
+dojo.require('openils.widget.AutoGrid');
+dojo.require('openils.widget.AutoFieldWidget');
+dojo.require('dijit.form.CheckBox');
+dojo.require('dijit.form.Button');
+dojo.require('dojo.date');
+
+var pcrud;
+var fmClasses = ['au', 'ac', 'aua', 'actsc', 'asv', 'asvq', 'asva'];
+var fieldDoc = {};
+var statCats;
+var statCatTempate;
+var surveys;
+var staff;
+var patron;
+var uEditUsePhonePw = false;
+var widgetPile = [];
+var uEditCardVirtId = -1;
+var uEditAddrVirtId = -1;
+var orgSettings = {};
+var tbody;
+var addrTemplateRows;
+
+
+function load() {
+    staff = new openils.User().user;
+    pcrud = new openils.PermaCrud();
+    uEditNewPatron(); /* XXX */
+
+    orgSettings = fieldmapper.aou.fetchOrgSettingBatch(staff.ws_ou(), [
+        'global.juvenile_age_threshold',
+        'patron.password.use_phone',
+    ]);
+    for(k in orgSettings)
+        orgSettings[k] = orgSettings[k].value;
+
+    var list = pcrud.search('fdoc', {fm_class:fmClasses});
+    for(var i in list) {
+        var doc = list[i];
+        if(!fieldDoc[doc.fm_class()])
+            fieldDoc[doc.fm_class()] = {};
+        fieldDoc[doc.fm_class()][doc.field()] = doc;
+    }
+
+    tbody = dojo.byId('uedit-tbody');
+
+    addrTemplateRows = dojo.query('tr[type=addr-template]', tbody);
+    dojo.forEach(addrTemplateRows, function(row) { row.parentNode.removeChild(row); } );
+    statCatTemplate = tbody.removeChild(dojo.byId('stat-cat-row-template'));
+    surveyTemplate = tbody.removeChild(dojo.byId('survey-row-template'));
+    surveyQuestionTemplate = tbody.removeChild(dojo.byId('survey-question-row-template'));
+
+    loadStaticFields();
+    uEditNewAddr(null, uEditAddrVirtId);
+    loadStatCats();
+    loadSurveys();
+}
+
+function loadStaticFields() {
+    for(var idx = 0; tbody.childNodes[idx]; idx++) {
+        var row = tbody.childNodes[idx];
+        if(row.nodeType != row.ELEMENT_NODE) continue;
+        var fmcls = row.getAttribute('fmclass');
+        if(!fmcls) continue;
+        fleshFMRow(row, fmcls);
+    }
+}
+
+function loadStatCats() {
+
+    statCats = fieldmapper.standardRequest(
+        ['open-ils.circ', 'open-ils.circ.stat_cat.actor.retrieve.all'],
+        {params : [openils.User.authtoken, staff.ws_ou()]}
+    );
+
+    // draw stat cats
+    for(var idx in statCats) {
+        var stat = statCats[idx];
+        var row = statCatTemplate.cloneNode(true);
+        row.id = 'stat-cat-row-' + idx;
+        tbody.appendChild(row);
+        getByName(row, 'name').innerHTML = stat.name();
+        var valtd = getByName(row, 'widget');
+        var span = valtd.appendChild(document.createElement('span'));
+        var store = new dojo.data.ItemFileReadStore(
+                {data:fieldmapper.actsc.toStoreData(stat.entries())});
+        var comboBox = new dijit.form.ComboBox({store:store}, span);
+        comboBox.labelAttr = 'value';
+        comboBox.searchAttr = 'value';
+
+        comboBox._wtype = 'statcat';
+        comboBox._statcat = stat.id();
+        widgetPile.push(comboBox); 
+
+    }
+}
+
+function loadSurveys() {
+
+    surveys = fieldmapper.standardRequest(
+        ['open-ils.circ', 'open-ils.circ.survey.retrieve.all'],
+        {params : [openils.User.authtoken]}
+    );
+
+    // draw surveys
+    for(var idx in surveys) {
+        var survey = surveys[idx];
+        var srow = surveyTemplate.cloneNode(true);
+        tbody.appendChild(srow);
+        getByName(srow, 'name').innerHTML = survey.name();
+
+        for(var q in survey.questions()) {
+            var quest = survey.questions()[q];
+            var qrow = surveyQuestionTemplate.cloneNode(true);
+            tbody.appendChild(qrow);
+            getByName(qrow, 'question').innerHTML = quest.question();
+
+            var span = getByName(qrow, 'answers').appendChild(document.createElement('span'));
+            var store = new dojo.data.ItemFileReadStore(
+                {data:fieldmapper.asva.toStoreData(quest.answers())});
+            var select = new dijit.form.FilteringSelect({store:store}, span);
+            select.labelAttr = 'answer';
+            select.searchAttr = 'answer';
+
+            select._wtype = 'survey';
+            select._survey = survey.id();
+            select._question = quest.id();
+            widgetPile.push(select); 
+        }
+    }
+}
+
+
+function fleshFMRow(row, fmcls, args) {
+    var fmfield = row.getAttribute('fmfield');
+    var wclass = row.getAttribute('wclass');
+    var wstyle = row.getAttribute('wstyle');
+    var fieldIdl = fieldmapper.IDL.fmclasses[fmcls].field_map[fmfield];
+    if(!args) args = {};
+
+    var existing = dojo.query('td', row);
+    var htd = existing[0] || row.appendChild(document.createElement('td'));
+    var ltd = existing[1] || row.appendChild(document.createElement('td'));
+    var wtd = existing[2] || row.appendChild(document.createElement('td'));
+
+    openils.Util.addCSSClass(htd, 'uedit-help');
+    if(fieldDoc[fmcls] && fieldDoc[fmcls][fmfield]) {
+        var link = dojo.byId('uedit-help-template').cloneNode(true);
+        link.id = '';
+        link.onclick = function() { ueLoadContextHelp(fmcls, fmfield) };
+        openils.Util.removeCSSClass(link, 'hidden');
+        htd.appendChild(link);
+    }
+
+    if(!ltd.textContent) {
+        var span = document.createElement('span');
+        ltd.appendChild(document.createTextNode(fieldIdl.label));
+    }
+
+    span = document.createElement('span');
+    wtd.appendChild(span);
+
+    var widget = new openils.widget.AutoFieldWidget({
+        idlField : fieldIdl,
+        fmObject : null, // XXX
+        fmClass : fmcls,
+        parentNode : span,
+        widgetClass : wclass,
+        dijitArgs : {style: wstyle},
+        orgLimitPerms : ['UPDATE_USER'],
+    });
+    widget.build();
+
+    widget._wtype = fmcls;
+    widget._fmfield = fmfield;
+    widget._addr = args.addr;
+    widgetPile.push(widget);
+    attachWidgetEvents(fmcls, fmfield, widget);
+    return widget;
+}
+
+function findWidget(wtype, fmfield) {
+    return widgetPile.filter(
+        function(i){
+            return (i._wtype == wtype && i._fmfield == fmfield);
+        }
+    ).pop();
+}
+
+function attachWidgetEvents(fmcls, fmfield, widget) {
+
+    if(fmcls == 'ac') {
+        if(fmfield == 'barcode') {
+            dojo.connect(widget.widget, 'onChange',
+                function() {
+                    var un = findWidget('au', 'usrname');
+                    if(!un.widget.attr('value'))
+                        un.widget.attr('value', this.attr('value'));
+                }
+            );
+        }
+    }
+
+    if(fmcls == 'au') {
+        switch(fmfield) {
+
+            case 'profile': // when the profile changes, update the expire date
+                dojo.connect(widget.widget, 'onChange', 
+                    function() {
+                        var self = this;
+                        var expireWidget = findWidget('au', 'expire_date');
+                        function found(items) {
+                            if(items.length == 0) return;
+                            var item = items[0];
+                            var interval = self.store.getValue(item, 'perm_interval');
+                            expireWidget.widget.attr('value', dojo.date.add(new Date(), 
+                                'second', openils.Util.intervalToSeconds(interval)));
+                        }
+                        this.store.fetch({onComplete:found, query:{id:this.attr('value')}});
+                    }
+                );
+        }
+    }
+}
+
+function getByName(node, name) {
+    return dojo.query('[name='+name+']', node)[0];
+}
+
+
+function ueLoadContextHelp(fmcls, fmfield) {
+    openils.Util.removeCSSClass(dojo.byId('uedit-help-div'), 'hidden');
+    dojo.byId('uedit-help-field').innerHTML = fieldmapper.IDL.fmclasses[fmcls].field_map[fmfield].label;
+    dojo.byId('uedit-help-text').innerHTML = fieldDoc[fmcls][fmfield].string();
+}
+
+
+/* creates a new patron object with card attached */
+function uEditNewPatron() {
+    patron = new au();
+    patron.isnew(1);
+    patron.id(-1);
+    card = new ac();
+    card.id(uEditCardVirtId);
+    card.isnew(1);
+    patron.card(card);
+    patron.cards([card]);
+    //patron.net_access_level(defaultNetLevel);
+    patron.stat_cat_entries([]);
+    patron.survey_responses([]);
+    patron.addresses([]);
+    //patron.home_ou(USER.ws_ou());
+    uEditMakeRandomPw(patron);
+}
+
+function uEditMakeRandomPw(patron) {
+    if(uEditUsePhonePw) return;
+    var rand  = Math.random();
+    rand = parseInt(rand * 10000) + '';
+    while(rand.length < 4) rand += '0';
+/*
+    appendClear($('ue_password_plain'),text(rand));
+    unHideMe($('ue_password_gen'));
+*/
+    patron.passwd(rand);
+    return rand;
+}
+
+function uEditWidgetVal(w) {
+    var val = (w.getFormattedValue) ? w.getFormattedValue() : w.attr('value');
+    if(val == '') val = null;
+    return val;
+}
+
+function uEditSave() {
+    for(var idx in widgetPile) {
+        var w = widgetPile[idx];
+
+        switch(w._wtype) {
+            case 'au':
+                patron[w._fmfield](uEditWidgetVal(w));
+                break;
+
+            case 'ac':
+                patron.card()[w._fmfield](uEditWidgetVal(w));
+                break;
+
+            case 'aua':
+                var addr = patron.addresses().filter(function(i){return (i.id() == w._addr)})[0];
+                if(!addr) {
+                    addr = new fieldmapper.aua();
+                    addr.id(w._addr);
+                    addr.isnew(1);
+                    patron.addresses().push(addr);
+                }
+                addr[w._fmfield](uEditWidgetVal(w));
+                break;
+
+            case 'survey':
+                var val = uEditWidgetVal(w);
+                if(val == null) break;
+                var resp = new fieldmapper.asvr();
+                resp.isnew(1);
+                resp.survey(w._survey)
+                resp.usr(patron.id());
+                resp.question(w._question)
+                resp.answer(val);
+                patron.survey_responses().push(resp);
+                break;
+
+            case 'statcat':
+                var val = uEditWidgetVal(w);
+                if(val == null) break;
+                var map = new fieldmapper.actscecm();
+                map.isnew(1);
+                map.stat_cat(w._statcat);
+                map.stat_cat_entry(val);
+                map.target_usr(patron.id());
+                patron.stat_cat_entries().push(map);
+                break;
+        }
+    }
+
+    fieldmapper.standardRequest(
+        ['open-ils.actor', 'open-ils.actor.patron.update'],
+        {   async: true,
+            params: [openils.User.authtoken, patron],
+            oncomplete: function(r) {
+                patron = openils.Util.readResponse(r);
+                if(patron) {
+                    uEditRefresh();
+                } 
+            }
+        }
+    );
+}
+
+function uEditRefresh() {
+    var href = location.href;
+    href = href.replace(/\&?clone=\d+/, '');
+    location.href = href;
+}
+
+function uEditNewAddr(evt, id) {
+    if(id == null) id = --uEditAddrVirtId;
+    dojo.forEach(addrTemplateRows, 
+        function(row) {
+            row = tbody.insertBefore(row.cloneNode(true), dojo.byId('new-addr-row'));
+            row.setAttribute('type', '');
+            row.setAttribute('addr', id+'');
+            if(row.getAttribute('fmclass')) {
+                fleshFMRow(row, 'aua', {addr:id});
+            } else {
+               var btn = dojo.query('[name=delete-button]', row)[0];
+               if(btn) btn.onclick = function(){ uEditDeleteAddr(id) };
+            }
+        }
+    );
+}
+
+
+function uEditDeleteAddr(id) {
+    if(!confirm('Delete address ' + id)) return; /* XXX i18n */
+    var rows = dojo.query('tr[addr='+id+']', tbody);
+    for(var i = 0; i < rows.length; i++)
+        rows[i].parentNode.removeChild(rows[i]);
+    widgetPile = widgetPile.filter(function(w){return (w._addr != id)});
+}
+
+
+openils.Util.addOnLoad(load);
diff --git a/Open-ILS/web/js/ui/default/conify/global/acq/provider.js b/Open-ILS/web/js/ui/default/conify/global/acq/provider.js
new file mode 100644 (file)
index 0000000..faa1771
--- /dev/null
@@ -0,0 +1,39 @@
+dojo.require('openils.widget.AutoGrid');
+dojo.require('openils.PermaCrud');
+var provider;
+
+function draw() {
+    if(providerId) {
+        drawProviderSummary();
+    } else {
+        openils.Util.removeCSSClass(dojo.byId('provider-list-div'), 'hidden');
+        pListGrid.onPostCreate = function(fmObject) { 
+            location.href = location.href + '/' + fmObject.id();
+        }
+        pListGrid.loadAll({order_by:{acqpro : 'name'}}); 
+    }
+}
+openils.Util.addOnLoad(draw);
+
+function drawProviderSummary() {
+    openils.Util.removeCSSClass(dojo.byId('provider-details-div'), 'hidden');
+    openils.Util.addCSSClass(dojo.byId('provider-list-div'), 'hidden');
+    var pcrud = new openils.PermaCrud();
+    pcrud.retrieve('acqpro', providerId, {
+        oncomplete : function(r) {
+            provider = openils.Util.readResponse(r);
+            var pane = new openils.widget.EditPane({fmObject:provider, readOnly:true}, dojo.byId('provider-summary-pane'));
+            pane.startup();
+            
+        }
+    });
+}
+
+function getProviderName(rowIndex, item) {
+    if(!item) return '';
+    return '<a href="' + location.href + '/' + 
+        this.grid.store.getValue(item, 'id') + '">' + 
+        this.grid.store.getValue(item, 'name') + '</a>';
+}
+
+
diff --git a/Open-ILS/web/js/ui/default/conify/global/config/idl_field_doc.js b/Open-ILS/web/js/ui/default/conify/global/config/idl_field_doc.js
new file mode 100644 (file)
index 0000000..dbfc80e
--- /dev/null
@@ -0,0 +1,50 @@
+dojo.require('dijit.form.FilteringSelect');
+dojo.require('dojo.data.ItemFileReadStore');
+dojo.require('fieldmapper.IDL');
+dojo.require('openils.PermaCrud');
+dojo.require('openils.widget.AutoGrid');
+
+function updateFieldSelector() {
+    var cls = this.attr('value');
+    if(!cls) return;
+    var flist = fieldmapper.IDL.fmclasses[cls];
+    var fields = [];
+    for(var f in flist.fields) {
+        var field = flist.fields[f];
+        if(field.virtual) continue;
+        fields.push({name:field.label, value:field.name});
+    }
+    fdocGrid.overrideEditWidgets.field.store = new dojo.data.ItemFileReadStore(
+        {data:{identifier:'value', label:'name', items:fields}});
+}
+
+function load() {
+    var slist = fieldmapper.IDL.fmclasses;
+    var dlist = [];
+
+    fdocGrid.overrideEditWidgets.field = editFieldSelector;
+    fdocGrid.overrideEditWidgets.fm_class = editClassSelector;
+    dojo.connect(fdocGrid.overrideEditWidgets.fm_class, 'onChange', updateFieldSelector);
+
+    for(var f in slist) {
+        if(slist[f].label != slist[f].name) // only show tables that have an actual label
+            dlist.push({value:slist[f].name, name:slist[f].label});
+    }
+    dlist = dlist.sort(function(a, b){return (a.name < b.name) ? -1 : 1;});
+
+    fmClassSelector.store = 
+        fdocGrid.overrideEditWidgets.fm_class.store = 
+            new dojo.data.ItemFileReadStore({data:{identifier:'value', label:'name', items:dlist}});
+
+    fmClassSelector.startup();
+    dojo.connect(fmClassSelector, 'onChange',
+        function() {
+            fdocGrid.resetStore();
+            fdocGrid.loadAll({order_by:{fdoc : 'field'}}, {fm_class: this.attr('value')});
+        }
+    );
+}
+
+
+openils.Util.addOnLoad(load);
+
index 53d1830..aff59b4 100644 (file)
@@ -61,7 +61,8 @@ function RemoteRequest( service, method ) {
 
        /* dojo is currently only available in the OPAC */
        try {
-               this.locale     = dojo.config.locale;
+               /* We want OpenSRF.locale for xx-YY format */
+               this.locale     = OpenSRF.locale;
        }
        catch (e) {
                this.locale = null;
diff --git a/Open-ILS/web/opac/images/Thumbs.db b/Open-ILS/web/opac/images/Thumbs.db
new file mode 100644 (file)
index 0000000..133f854
Binary files /dev/null and b/Open-ILS/web/opac/images/Thumbs.db differ
diff --git a/Open-ILS/web/opac/images/advancedsearch-icon.gif b/Open-ILS/web/opac/images/advancedsearch-icon.gif
new file mode 100644 (file)
index 0000000..b823e2f
Binary files /dev/null and b/Open-ILS/web/opac/images/advancedsearch-icon.gif differ
diff --git a/Open-ILS/web/opac/images/advancedsearch-icon.png b/Open-ILS/web/opac/images/advancedsearch-icon.png
new file mode 100644 (file)
index 0000000..bde9dc2
Binary files /dev/null and b/Open-ILS/web/opac/images/advancedsearch-icon.png differ
diff --git a/Open-ILS/web/opac/images/bg.gif b/Open-ILS/web/opac/images/bg.gif
new file mode 100644 (file)
index 0000000..ca352ba
Binary files /dev/null and b/Open-ILS/web/opac/images/bg.gif differ
diff --git a/Open-ILS/web/opac/images/blank.gif b/Open-ILS/web/opac/images/blank.gif
new file mode 100644 (file)
index 0000000..2799b45
Binary files /dev/null and b/Open-ILS/web/opac/images/blank.gif differ
diff --git a/Open-ILS/web/opac/images/book-icon.png b/Open-ILS/web/opac/images/book-icon.png
new file mode 100644 (file)
index 0000000..2800684
Binary files /dev/null and b/Open-ILS/web/opac/images/book-icon.png differ
diff --git a/Open-ILS/web/opac/images/cancel-icon-u.gif b/Open-ILS/web/opac/images/cancel-icon-u.gif
new file mode 100644 (file)
index 0000000..d22bff2
Binary files /dev/null and b/Open-ILS/web/opac/images/cancel-icon-u.gif differ
diff --git a/Open-ILS/web/opac/images/cancel-icon-u.png b/Open-ILS/web/opac/images/cancel-icon-u.png
new file mode 100644 (file)
index 0000000..4522b87
Binary files /dev/null and b/Open-ILS/web/opac/images/cancel-icon-u.png differ
diff --git a/Open-ILS/web/opac/images/cancel-icon.gif b/Open-ILS/web/opac/images/cancel-icon.gif
new file mode 100644 (file)
index 0000000..97024bc
Binary files /dev/null and b/Open-ILS/web/opac/images/cancel-icon.gif differ
diff --git a/Open-ILS/web/opac/images/cancel-icon.png b/Open-ILS/web/opac/images/cancel-icon.png
new file mode 100644 (file)
index 0000000..9e8333c
Binary files /dev/null and b/Open-ILS/web/opac/images/cancel-icon.png differ
diff --git a/Open-ILS/web/opac/images/cartographic.jpg b/Open-ILS/web/opac/images/cartographic.jpg
new file mode 100644 (file)
index 0000000..b44eafa
Binary files /dev/null and b/Open-ILS/web/opac/images/cartographic.jpg differ
diff --git a/Open-ILS/web/opac/images/chooselibrary-icon.gif b/Open-ILS/web/opac/images/chooselibrary-icon.gif
new file mode 100644 (file)
index 0000000..c02ed2e
Binary files /dev/null and b/Open-ILS/web/opac/images/chooselibrary-icon.gif differ
diff --git a/Open-ILS/web/opac/images/chooselibrary-icon.png b/Open-ILS/web/opac/images/chooselibrary-icon.png
new file mode 100644 (file)
index 0000000..564e6d8
Binary files /dev/null and b/Open-ILS/web/opac/images/chooselibrary-icon.png differ
diff --git a/Open-ILS/web/opac/images/closeall-icon-u.gif b/Open-ILS/web/opac/images/closeall-icon-u.gif
new file mode 100644 (file)
index 0000000..085d107
Binary files /dev/null and b/Open-ILS/web/opac/images/closeall-icon-u.gif differ
diff --git a/Open-ILS/web/opac/images/closeall-icon-u.png b/Open-ILS/web/opac/images/closeall-icon-u.png
new file mode 100644 (file)
index 0000000..48ba717
Binary files /dev/null and b/Open-ILS/web/opac/images/closeall-icon-u.png differ
diff --git a/Open-ILS/web/opac/images/closeall-icon.gif b/Open-ILS/web/opac/images/closeall-icon.gif
new file mode 100644 (file)
index 0000000..b75a6d6
Binary files /dev/null and b/Open-ILS/web/opac/images/closeall-icon.gif differ
diff --git a/Open-ILS/web/opac/images/closeall-icon.png b/Open-ILS/web/opac/images/closeall-icon.png
new file mode 100644 (file)
index 0000000..50212ea
Binary files /dev/null and b/Open-ILS/web/opac/images/closeall-icon.png differ
diff --git a/Open-ILS/web/opac/images/content-bg.gif b/Open-ILS/web/opac/images/content-bg.gif
new file mode 100644 (file)
index 0000000..3af8f8b
Binary files /dev/null and b/Open-ILS/web/opac/images/content-bg.gif differ
diff --git a/Open-ILS/web/opac/images/content-bg.jpg b/Open-ILS/web/opac/images/content-bg.jpg
new file mode 100644 (file)
index 0000000..1ecbd30
Binary files /dev/null and b/Open-ILS/web/opac/images/content-bg.jpg differ
diff --git a/Open-ILS/web/opac/images/details-f-bg-u.gif b/Open-ILS/web/opac/images/details-f-bg-u.gif
new file mode 100644 (file)
index 0000000..30ff63a
Binary files /dev/null and b/Open-ILS/web/opac/images/details-f-bg-u.gif differ
diff --git a/Open-ILS/web/opac/images/details-f-bg.gif b/Open-ILS/web/opac/images/details-f-bg.gif
new file mode 100644 (file)
index 0000000..eed5244
Binary files /dev/null and b/Open-ILS/web/opac/images/details-f-bg.gif differ
diff --git a/Open-ILS/web/opac/images/details-headers-bg.gif b/Open-ILS/web/opac/images/details-headers-bg.gif
new file mode 100644 (file)
index 0000000..9276532
Binary files /dev/null and b/Open-ILS/web/opac/images/details-headers-bg.gif differ
diff --git a/Open-ILS/web/opac/images/earth-icon.png b/Open-ILS/web/opac/images/earth-icon.png
new file mode 100644 (file)
index 0000000..73b37ab
Binary files /dev/null and b/Open-ILS/web/opac/images/earth-icon.png differ
diff --git a/Open-ILS/web/opac/images/eg_tiny_logo.gif b/Open-ILS/web/opac/images/eg_tiny_logo.gif
new file mode 100644 (file)
index 0000000..b3b8e1e
Binary files /dev/null and b/Open-ILS/web/opac/images/eg_tiny_logo.gif differ
diff --git a/Open-ILS/web/opac/images/expandall-icon-u.gif b/Open-ILS/web/opac/images/expandall-icon-u.gif
new file mode 100644 (file)
index 0000000..fbb79be
Binary files /dev/null and b/Open-ILS/web/opac/images/expandall-icon-u.gif differ
diff --git a/Open-ILS/web/opac/images/expandall-icon-u.png b/Open-ILS/web/opac/images/expandall-icon-u.png
new file mode 100644 (file)
index 0000000..bb6d059
Binary files /dev/null and b/Open-ILS/web/opac/images/expandall-icon-u.png differ
diff --git a/Open-ILS/web/opac/images/expandall-icon.gif b/Open-ILS/web/opac/images/expandall-icon.gif
new file mode 100644 (file)
index 0000000..297fd9f
Binary files /dev/null and b/Open-ILS/web/opac/images/expandall-icon.gif differ
diff --git a/Open-ILS/web/opac/images/expandall-icon.png b/Open-ILS/web/opac/images/expandall-icon.png
new file mode 100644 (file)
index 0000000..870a23d
Binary files /dev/null and b/Open-ILS/web/opac/images/expandall-icon.png differ
diff --git a/Open-ILS/web/opac/images/footer-bg.gif b/Open-ILS/web/opac/images/footer-bg.gif
new file mode 100644 (file)
index 0000000..e2d7370
Binary files /dev/null and b/Open-ILS/web/opac/images/footer-bg.gif differ
diff --git a/Open-ILS/web/opac/images/footer-bl.gif b/Open-ILS/web/opac/images/footer-bl.gif
new file mode 100644 (file)
index 0000000..e6474a1
Binary files /dev/null and b/Open-ILS/web/opac/images/footer-bl.gif differ
diff --git a/Open-ILS/web/opac/images/footer-bottom.gif b/Open-ILS/web/opac/images/footer-bottom.gif
new file mode 100644 (file)
index 0000000..e0e2871
Binary files /dev/null and b/Open-ILS/web/opac/images/footer-bottom.gif differ
diff --git a/Open-ILS/web/opac/images/footer-br.gif b/Open-ILS/web/opac/images/footer-br.gif
new file mode 100644 (file)
index 0000000..1e0c5d1
Binary files /dev/null and b/Open-ILS/web/opac/images/footer-br.gif differ
diff --git a/Open-ILS/web/opac/images/footer-corners.gif b/Open-ILS/web/opac/images/footer-corners.gif
new file mode 100644 (file)
index 0000000..42c5b1a
Binary files /dev/null and b/Open-ILS/web/opac/images/footer-corners.gif differ
diff --git a/Open-ILS/web/opac/images/footer-left.gif b/Open-ILS/web/opac/images/footer-left.gif
new file mode 100644 (file)
index 0000000..18835c8
Binary files /dev/null and b/Open-ILS/web/opac/images/footer-left.gif differ
diff --git a/Open-ILS/web/opac/images/footer-right.gif b/Open-ILS/web/opac/images/footer-right.gif
new file mode 100644 (file)
index 0000000..ab0a380
Binary files /dev/null and b/Open-ILS/web/opac/images/footer-right.gif differ
diff --git a/Open-ILS/web/opac/images/footer-tl.gif b/Open-ILS/web/opac/images/footer-tl.gif
new file mode 100644 (file)
index 0000000..68670e4
Binary files /dev/null and b/Open-ILS/web/opac/images/footer-tl.gif differ
diff --git a/Open-ILS/web/opac/images/footer-top.gif b/Open-ILS/web/opac/images/footer-top.gif
new file mode 100644 (file)
index 0000000..2262478
Binary files /dev/null and b/Open-ILS/web/opac/images/footer-top.gif differ
diff --git a/Open-ILS/web/opac/images/footer-tr.gif b/Open-ILS/web/opac/images/footer-tr.gif
new file mode 100644 (file)
index 0000000..4ac5fb7
Binary files /dev/null and b/Open-ILS/web/opac/images/footer-tr.gif differ
diff --git a/Open-ILS/web/opac/images/header-bg.gif b/Open-ILS/web/opac/images/header-bg.gif
new file mode 100644 (file)
index 0000000..c7dc782
Binary files /dev/null and b/Open-ILS/web/opac/images/header-bg.gif differ
diff --git a/Open-ILS/web/opac/images/header-shadow.gif b/Open-ILS/web/opac/images/header-shadow.gif
new file mode 100644 (file)
index 0000000..92f2230
Binary files /dev/null and b/Open-ILS/web/opac/images/header-shadow.gif differ
diff --git a/Open-ILS/web/opac/images/home-bottom-tag-bg.gif b/Open-ILS/web/opac/images/home-bottom-tag-bg.gif
new file mode 100644 (file)
index 0000000..41b8dcc
Binary files /dev/null and b/Open-ILS/web/opac/images/home-bottom-tag-bg.gif differ
diff --git a/Open-ILS/web/opac/images/home-icon-u.gif b/Open-ILS/web/opac/images/home-icon-u.gif
new file mode 100644 (file)
index 0000000..7a4ee5c
Binary files /dev/null and b/Open-ILS/web/opac/images/home-icon-u.gif differ
diff --git a/Open-ILS/web/opac/images/home-icon-u.png b/Open-ILS/web/opac/images/home-icon-u.png
new file mode 100644 (file)
index 0000000..3a53a0d
Binary files /dev/null and b/Open-ILS/web/opac/images/home-icon-u.png differ
diff --git a/Open-ILS/web/opac/images/home-icon.gif b/Open-ILS/web/opac/images/home-icon.gif
new file mode 100644 (file)
index 0000000..3e934e8
Binary files /dev/null and b/Open-ILS/web/opac/images/home-icon.gif differ
diff --git a/Open-ILS/web/opac/images/home-icon.png b/Open-ILS/web/opac/images/home-icon.png
new file mode 100644 (file)
index 0000000..fdd57e7
Binary files /dev/null and b/Open-ILS/web/opac/images/home-icon.png differ
diff --git a/Open-ILS/web/opac/images/inner-account-icon-u.gif b/Open-ILS/web/opac/images/inner-account-icon-u.gif
new file mode 100644 (file)
index 0000000..bb2a34e
Binary files /dev/null and b/Open-ILS/web/opac/images/inner-account-icon-u.gif differ
diff --git a/Open-ILS/web/opac/images/inner-account-icon-u.png b/Open-ILS/web/opac/images/inner-account-icon-u.png
new file mode 100644 (file)
index 0000000..f28e921
Binary files /dev/null and b/Open-ILS/web/opac/images/inner-account-icon-u.png differ
diff --git a/Open-ILS/web/opac/images/inner-account-icon.gif b/Open-ILS/web/opac/images/inner-account-icon.gif
new file mode 100644 (file)
index 0000000..91df84f
Binary files /dev/null and b/Open-ILS/web/opac/images/inner-account-icon.gif differ
diff --git a/Open-ILS/web/opac/images/inner-account-icon.png b/Open-ILS/web/opac/images/inner-account-icon.png
new file mode 100644 (file)
index 0000000..b0c5cf9
Binary files /dev/null and b/Open-ILS/web/opac/images/inner-account-icon.png differ
diff --git a/Open-ILS/web/opac/images/inner-advanced-icon-u.gif b/Open-ILS/web/opac/images/inner-advanced-icon-u.gif
new file mode 100644 (file)
index 0000000..b823e2f
Binary files /dev/null and b/Open-ILS/web/opac/images/inner-advanced-icon-u.gif differ
diff --git a/Open-ILS/web/opac/images/inner-advanced-icon-u.png b/Open-ILS/web/opac/images/inner-advanced-icon-u.png
new file mode 100644 (file)
index 0000000..bde9dc2
Binary files /dev/null and b/Open-ILS/web/opac/images/inner-advanced-icon-u.png differ
diff --git a/Open-ILS/web/opac/images/inner-advanced-icon.gif b/Open-ILS/web/opac/images/inner-advanced-icon.gif
new file mode 100644 (file)
index 0000000..2ec9357
Binary files /dev/null and b/Open-ILS/web/opac/images/inner-advanced-icon.gif differ
diff --git a/Open-ILS/web/opac/images/inner-advanced-icon.png b/Open-ILS/web/opac/images/inner-advanced-icon.png
new file mode 100644 (file)
index 0000000..bf78ad8
Binary files /dev/null and b/Open-ILS/web/opac/images/inner-advanced-icon.png differ
diff --git a/Open-ILS/web/opac/images/lg-txt.gif b/Open-ILS/web/opac/images/lg-txt.gif
new file mode 100644 (file)
index 0000000..ef7ab78
Binary files /dev/null and b/Open-ILS/web/opac/images/lg-txt.gif differ
diff --git a/Open-ILS/web/opac/images/libselect-btn.gif b/Open-ILS/web/opac/images/libselect-btn.gif
new file mode 100644 (file)
index 0000000..ce67168
Binary files /dev/null and b/Open-ILS/web/opac/images/libselect-btn.gif differ
diff --git a/Open-ILS/web/opac/images/list-icon.gif b/Open-ILS/web/opac/images/list-icon.gif
new file mode 100644 (file)
index 0000000..f32e0c1
Binary files /dev/null and b/Open-ILS/web/opac/images/list-icon.gif differ
diff --git a/Open-ILS/web/opac/images/list-icon.png b/Open-ILS/web/opac/images/list-icon.png
new file mode 100644 (file)
index 0000000..61aa3d3
Binary files /dev/null and b/Open-ILS/web/opac/images/list-icon.png differ
diff --git a/Open-ILS/web/opac/images/login-icon-u.gif b/Open-ILS/web/opac/images/login-icon-u.gif
new file mode 100644 (file)
index 0000000..59a8e6b
Binary files /dev/null and b/Open-ILS/web/opac/images/login-icon-u.gif differ
diff --git a/Open-ILS/web/opac/images/login-icon-u.png b/Open-ILS/web/opac/images/login-icon-u.png
new file mode 100644 (file)
index 0000000..6fdb7f1
Binary files /dev/null and b/Open-ILS/web/opac/images/login-icon-u.png differ
diff --git a/Open-ILS/web/opac/images/login-icon.gif b/Open-ILS/web/opac/images/login-icon.gif
new file mode 100644 (file)
index 0000000..59a8e6b
Binary files /dev/null and b/Open-ILS/web/opac/images/login-icon.gif differ
diff --git a/Open-ILS/web/opac/images/login-icon.png b/Open-ILS/web/opac/images/login-icon.png
new file mode 100644 (file)
index 0000000..6fdb7f1
Binary files /dev/null and b/Open-ILS/web/opac/images/login-icon.png differ
diff --git a/Open-ILS/web/opac/images/loginas-icon.gif b/Open-ILS/web/opac/images/loginas-icon.gif
new file mode 100644 (file)
index 0000000..0799be5
Binary files /dev/null and b/Open-ILS/web/opac/images/loginas-icon.gif differ
diff --git a/Open-ILS/web/opac/images/loginas-icon.png b/Open-ILS/web/opac/images/loginas-icon.png
new file mode 100644 (file)
index 0000000..cc6af21
Binary files /dev/null and b/Open-ILS/web/opac/images/loginas-icon.png differ
diff --git a/Open-ILS/web/opac/images/logo.gif b/Open-ILS/web/opac/images/logo.gif
new file mode 100644 (file)
index 0000000..472cd9d
Binary files /dev/null and b/Open-ILS/web/opac/images/logo.gif differ
diff --git a/Open-ILS/web/opac/images/logo.png b/Open-ILS/web/opac/images/logo.png
new file mode 100644 (file)
index 0000000..5662bad
Binary files /dev/null and b/Open-ILS/web/opac/images/logo.png differ
diff --git a/Open-ILS/web/opac/images/logout-icon-u.gif b/Open-ILS/web/opac/images/logout-icon-u.gif
new file mode 100644 (file)
index 0000000..b76d63d
Binary files /dev/null and b/Open-ILS/web/opac/images/logout-icon-u.gif differ
diff --git a/Open-ILS/web/opac/images/logout-icon-u.png b/Open-ILS/web/opac/images/logout-icon-u.png
new file mode 100644 (file)
index 0000000..ece90f1
Binary files /dev/null and b/Open-ILS/web/opac/images/logout-icon-u.png differ
diff --git a/Open-ILS/web/opac/images/logout-icon.gif b/Open-ILS/web/opac/images/logout-icon.gif
new file mode 100644 (file)
index 0000000..58d9637
Binary files /dev/null and b/Open-ILS/web/opac/images/logout-icon.gif differ
diff --git a/Open-ILS/web/opac/images/logout-icon.png b/Open-ILS/web/opac/images/logout-icon.png
new file mode 100644 (file)
index 0000000..8b108e6
Binary files /dev/null and b/Open-ILS/web/opac/images/logout-icon.png differ
diff --git a/Open-ILS/web/opac/images/mix-icon.png b/Open-ILS/web/opac/images/mix-icon.png
new file mode 100644 (file)
index 0000000..2025d04
Binary files /dev/null and b/Open-ILS/web/opac/images/mix-icon.png differ
diff --git a/Open-ILS/web/opac/images/mixed material.jpg b/Open-ILS/web/opac/images/mixed material.jpg
new file mode 100644 (file)
index 0000000..f3476be
Binary files /dev/null and b/Open-ILS/web/opac/images/mixed material.jpg differ
diff --git a/Open-ILS/web/opac/images/mov-icon.png b/Open-ILS/web/opac/images/mov-icon.png
new file mode 100644 (file)
index 0000000..3f26347
Binary files /dev/null and b/Open-ILS/web/opac/images/mov-icon.png differ
diff --git a/Open-ILS/web/opac/images/moving image.jpg b/Open-ILS/web/opac/images/moving image.jpg
new file mode 100644 (file)
index 0000000..fc180ca
Binary files /dev/null and b/Open-ILS/web/opac/images/moving image.jpg differ
diff --git a/Open-ILS/web/opac/images/mussymbol-icon.png b/Open-ILS/web/opac/images/mussymbol-icon.png
new file mode 100644 (file)
index 0000000..b9e2e0d
Binary files /dev/null and b/Open-ILS/web/opac/images/mussymbol-icon.png differ
diff --git a/Open-ILS/web/opac/images/myaccount-icon.gif b/Open-ILS/web/opac/images/myaccount-icon.gif
new file mode 100644 (file)
index 0000000..bb2a34e
Binary files /dev/null and b/Open-ILS/web/opac/images/myaccount-icon.gif differ
diff --git a/Open-ILS/web/opac/images/myaccount-icon.png b/Open-ILS/web/opac/images/myaccount-icon.png
new file mode 100644 (file)
index 0000000..f28e921
Binary files /dev/null and b/Open-ILS/web/opac/images/myaccount-icon.png differ
diff --git a/Open-ILS/web/opac/images/noimg.gif b/Open-ILS/web/opac/images/noimg.gif
new file mode 100644 (file)
index 0000000..a7df9da
Binary files /dev/null and b/Open-ILS/web/opac/images/noimg.gif differ
diff --git a/Open-ILS/web/opac/images/nonmusic-icon.png b/Open-ILS/web/opac/images/nonmusic-icon.png
new file mode 100644 (file)
index 0000000..72ec1ee
Binary files /dev/null and b/Open-ILS/web/opac/images/nonmusic-icon.png differ
diff --git a/Open-ILS/web/opac/images/notated music.jpg b/Open-ILS/web/opac/images/notated music.jpg
new file mode 100644 (file)
index 0000000..fa8899e
Binary files /dev/null and b/Open-ILS/web/opac/images/notated music.jpg differ
diff --git a/Open-ILS/web/opac/images/pic-icon.png b/Open-ILS/web/opac/images/pic-icon.png
new file mode 100644 (file)
index 0000000..e6de60f
Binary files /dev/null and b/Open-ILS/web/opac/images/pic-icon.png differ
diff --git a/Open-ILS/web/opac/images/placeholder-icon.png b/Open-ILS/web/opac/images/placeholder-icon.png
new file mode 100644 (file)
index 0000000..e523300
Binary files /dev/null and b/Open-ILS/web/opac/images/placeholder-icon.png differ
diff --git a/Open-ILS/web/opac/images/progressbar_green-old.gif b/Open-ILS/web/opac/images/progressbar_green-old.gif
new file mode 100644 (file)
index 0000000..d04f463
Binary files /dev/null and b/Open-ILS/web/opac/images/progressbar_green-old.gif differ
index d04f463..f864d5f 100644 (file)
Binary files a/Open-ILS/web/opac/images/progressbar_green.gif and b/Open-ILS/web/opac/images/progressbar_green.gif differ
diff --git a/Open-ILS/web/opac/images/recsound-icon.png b/Open-ILS/web/opac/images/recsound-icon.png
new file mode 100644 (file)
index 0000000..246d5a8
Binary files /dev/null and b/Open-ILS/web/opac/images/recsound-icon.png differ
diff --git a/Open-ILS/web/opac/images/reg-txt.gif b/Open-ILS/web/opac/images/reg-txt.gif
new file mode 100644 (file)
index 0000000..f3c1bbe
Binary files /dev/null and b/Open-ILS/web/opac/images/reg-txt.gif differ
diff --git a/Open-ILS/web/opac/images/relevant-icon-u.gif b/Open-ILS/web/opac/images/relevant-icon-u.gif
new file mode 100644 (file)
index 0000000..496e58b
Binary files /dev/null and b/Open-ILS/web/opac/images/relevant-icon-u.gif differ
diff --git a/Open-ILS/web/opac/images/relevant-icon-u.png b/Open-ILS/web/opac/images/relevant-icon-u.png
new file mode 100644 (file)
index 0000000..512c35a
Binary files /dev/null and b/Open-ILS/web/opac/images/relevant-icon-u.png differ
diff --git a/Open-ILS/web/opac/images/relevant-icon.gif b/Open-ILS/web/opac/images/relevant-icon.gif
new file mode 100644 (file)
index 0000000..000886b
Binary files /dev/null and b/Open-ILS/web/opac/images/relevant-icon.gif differ
diff --git a/Open-ILS/web/opac/images/relevant-icon.png b/Open-ILS/web/opac/images/relevant-icon.png
new file mode 100644 (file)
index 0000000..716a58a
Binary files /dev/null and b/Open-ILS/web/opac/images/relevant-icon.png differ
diff --git a/Open-ILS/web/opac/images/search-btn.gif b/Open-ILS/web/opac/images/search-btn.gif
new file mode 100644 (file)
index 0000000..0775a3d
Binary files /dev/null and b/Open-ILS/web/opac/images/search-btn.gif differ
diff --git a/Open-ILS/web/opac/images/searchbar-bg.gif b/Open-ILS/web/opac/images/searchbar-bg.gif
new file mode 100644 (file)
index 0000000..7a0196d
Binary files /dev/null and b/Open-ILS/web/opac/images/searchbar-bg.gif differ
diff --git a/Open-ILS/web/opac/images/searchbox-bg.gif b/Open-ILS/web/opac/images/searchbox-bg.gif
new file mode 100644 (file)
index 0000000..a926c32
Binary files /dev/null and b/Open-ILS/web/opac/images/searchbox-bg.gif differ
diff --git a/Open-ILS/web/opac/images/series-icon-u.gif b/Open-ILS/web/opac/images/series-icon-u.gif
new file mode 100644 (file)
index 0000000..659a021
Binary files /dev/null and b/Open-ILS/web/opac/images/series-icon-u.gif differ
diff --git a/Open-ILS/web/opac/images/series-icon-u.png b/Open-ILS/web/opac/images/series-icon-u.png
new file mode 100644 (file)
index 0000000..adf6ffb
Binary files /dev/null and b/Open-ILS/web/opac/images/series-icon-u.png differ
diff --git a/Open-ILS/web/opac/images/series-icon.gif b/Open-ILS/web/opac/images/series-icon.gif
new file mode 100644 (file)
index 0000000..659a021
Binary files /dev/null and b/Open-ILS/web/opac/images/series-icon.gif differ
diff --git a/Open-ILS/web/opac/images/series-icon.png b/Open-ILS/web/opac/images/series-icon.png
new file mode 100644 (file)
index 0000000..adf6ffb
Binary files /dev/null and b/Open-ILS/web/opac/images/series-icon.png differ
diff --git a/Open-ILS/web/opac/images/sidebar-bg.gif b/Open-ILS/web/opac/images/sidebar-bg.gif
new file mode 100644 (file)
index 0000000..547e91d
Binary files /dev/null and b/Open-ILS/web/opac/images/sidebar-bg.gif differ
index c33dceb..8f5a855 100644 (file)
Binary files a/Open-ILS/web/opac/images/slimtree/folder2.gif and b/Open-ILS/web/opac/images/slimtree/folder2.gif differ
index 59ec322..a74fc3e 100644 (file)
Binary files a/Open-ILS/web/opac/images/slimtree/folderopen2.gif and b/Open-ILS/web/opac/images/slimtree/folderopen2.gif differ
diff --git a/Open-ILS/web/opac/images/small-rss.gif b/Open-ILS/web/opac/images/small-rss.gif
new file mode 100644 (file)
index 0000000..70420a8
Binary files /dev/null and b/Open-ILS/web/opac/images/small-rss.gif differ
diff --git a/Open-ILS/web/opac/images/software, multimedia.jpg b/Open-ILS/web/opac/images/software, multimedia.jpg
new file mode 100644 (file)
index 0000000..bbd2002
Binary files /dev/null and b/Open-ILS/web/opac/images/software, multimedia.jpg differ
diff --git a/Open-ILS/web/opac/images/software-icon.png b/Open-ILS/web/opac/images/software-icon.png
new file mode 100644 (file)
index 0000000..a347513
Binary files /dev/null and b/Open-ILS/web/opac/images/software-icon.png differ
diff --git a/Open-ILS/web/opac/images/sound recording-musical.jpg b/Open-ILS/web/opac/images/sound recording-musical.jpg
new file mode 100644 (file)
index 0000000..5eaf85b
Binary files /dev/null and b/Open-ILS/web/opac/images/sound recording-musical.jpg differ
diff --git a/Open-ILS/web/opac/images/sound recording-nonmusical.jpg b/Open-ILS/web/opac/images/sound recording-nonmusical.jpg
new file mode 100644 (file)
index 0000000..9b706cb
Binary files /dev/null and b/Open-ILS/web/opac/images/sound recording-nonmusical.jpg differ
diff --git a/Open-ILS/web/opac/images/sound recording.jpg b/Open-ILS/web/opac/images/sound recording.jpg
new file mode 100644 (file)
index 0000000..35f5c39
Binary files /dev/null and b/Open-ILS/web/opac/images/sound recording.jpg differ
diff --git a/Open-ILS/web/opac/images/sound-icon.png b/Open-ILS/web/opac/images/sound-icon.png
new file mode 100644 (file)
index 0000000..7edee89
Binary files /dev/null and b/Open-ILS/web/opac/images/sound-icon.png differ
diff --git a/Open-ILS/web/opac/images/still images.jpg b/Open-ILS/web/opac/images/still images.jpg
new file mode 100644 (file)
index 0000000..77f6171
Binary files /dev/null and b/Open-ILS/web/opac/images/still images.jpg differ
diff --git a/Open-ILS/web/opac/images/subject-icon-u.gif b/Open-ILS/web/opac/images/subject-icon-u.gif
new file mode 100644 (file)
index 0000000..b2a364b
Binary files /dev/null and b/Open-ILS/web/opac/images/subject-icon-u.gif differ
diff --git a/Open-ILS/web/opac/images/subject-icon-u.png b/Open-ILS/web/opac/images/subject-icon-u.png
new file mode 100644 (file)
index 0000000..7ca277d
Binary files /dev/null and b/Open-ILS/web/opac/images/subject-icon-u.png differ
diff --git a/Open-ILS/web/opac/images/text.jpg b/Open-ILS/web/opac/images/text.jpg
new file mode 100644 (file)
index 0000000..d9db115
Binary files /dev/null and b/Open-ILS/web/opac/images/text.jpg differ
diff --git a/Open-ILS/web/opac/images/three dimensional object.jpg b/Open-ILS/web/opac/images/three dimensional object.jpg
new file mode 100644 (file)
index 0000000..ede4f3b
Binary files /dev/null and b/Open-ILS/web/opac/images/three dimensional object.jpg differ
diff --git a/Open-ILS/web/opac/images/threed-icon.png b/Open-ILS/web/opac/images/threed-icon.png
new file mode 100644 (file)
index 0000000..d4e5194
Binary files /dev/null and b/Open-ILS/web/opac/images/threed-icon.png differ
diff --git a/Open-ILS/web/opac/images/title-icon-u.gif b/Open-ILS/web/opac/images/title-icon-u.gif
new file mode 100644 (file)
index 0000000..35c9504
Binary files /dev/null and b/Open-ILS/web/opac/images/title-icon-u.gif differ
diff --git a/Open-ILS/web/opac/images/title-icon-u.png b/Open-ILS/web/opac/images/title-icon-u.png
new file mode 100644 (file)
index 0000000..53b2c35
Binary files /dev/null and b/Open-ILS/web/opac/images/title-icon-u.png differ
diff --git a/Open-ILS/web/opac/images/title-icon.gif b/Open-ILS/web/opac/images/title-icon.gif
new file mode 100644 (file)
index 0000000..0be0f37
Binary files /dev/null and b/Open-ILS/web/opac/images/title-icon.gif differ
diff --git a/Open-ILS/web/opac/images/title-icon.png b/Open-ILS/web/opac/images/title-icon.png
new file mode 100644 (file)
index 0000000..dd3343e
Binary files /dev/null and b/Open-ILS/web/opac/images/title-icon.png differ
diff --git a/Open-ILS/web/opac/images/titledetails-icon-u.gif b/Open-ILS/web/opac/images/titledetails-icon-u.gif
new file mode 100644 (file)
index 0000000..dc92e72
Binary files /dev/null and b/Open-ILS/web/opac/images/titledetails-icon-u.gif differ
diff --git a/Open-ILS/web/opac/images/titledetails-icon-u.png b/Open-ILS/web/opac/images/titledetails-icon-u.png
new file mode 100644 (file)
index 0000000..2b0ba22
Binary files /dev/null and b/Open-ILS/web/opac/images/titledetails-icon-u.png differ
diff --git a/Open-ILS/web/opac/images/titledetails-icon.gif b/Open-ILS/web/opac/images/titledetails-icon.gif
new file mode 100644 (file)
index 0000000..091bfa0
Binary files /dev/null and b/Open-ILS/web/opac/images/titledetails-icon.gif differ
diff --git a/Open-ILS/web/opac/images/titledetails-icon.png b/Open-ILS/web/opac/images/titledetails-icon.png
new file mode 100644 (file)
index 0000000..fa9c732
Binary files /dev/null and b/Open-ILS/web/opac/images/titledetails-icon.png differ
diff --git a/Open-ILS/web/opac/images/tor/book-icon.gif b/Open-ILS/web/opac/images/tor/book-icon.gif
new file mode 100644 (file)
index 0000000..7ec13f0
Binary files /dev/null and b/Open-ILS/web/opac/images/tor/book-icon.gif differ
diff --git a/Open-ILS/web/opac/images/tor/book-icon.png b/Open-ILS/web/opac/images/tor/book-icon.png
new file mode 100644 (file)
index 0000000..2800684
Binary files /dev/null and b/Open-ILS/web/opac/images/tor/book-icon.png differ
index 5bbeacc..b44eafa 100644 (file)
Binary files a/Open-ILS/web/opac/images/tor/cartographic.jpg and b/Open-ILS/web/opac/images/tor/cartographic.jpg differ
diff --git a/Open-ILS/web/opac/images/tor/earth-icon.gif b/Open-ILS/web/opac/images/tor/earth-icon.gif
new file mode 100644 (file)
index 0000000..4f2e05c
Binary files /dev/null and b/Open-ILS/web/opac/images/tor/earth-icon.gif differ
diff --git a/Open-ILS/web/opac/images/tor/earth-icon.png b/Open-ILS/web/opac/images/tor/earth-icon.png
new file mode 100644 (file)
index 0000000..73b37ab
Binary files /dev/null and b/Open-ILS/web/opac/images/tor/earth-icon.png differ
diff --git a/Open-ILS/web/opac/images/tor/mix-icon.gif b/Open-ILS/web/opac/images/tor/mix-icon.gif
new file mode 100644 (file)
index 0000000..2fac684
Binary files /dev/null and b/Open-ILS/web/opac/images/tor/mix-icon.gif differ
diff --git a/Open-ILS/web/opac/images/tor/mix-icon.png b/Open-ILS/web/opac/images/tor/mix-icon.png
new file mode 100644 (file)
index 0000000..2025d04
Binary files /dev/null and b/Open-ILS/web/opac/images/tor/mix-icon.png differ
index bac8c57..f3476be 100644 (file)
Binary files a/Open-ILS/web/opac/images/tor/mixed material.jpg and b/Open-ILS/web/opac/images/tor/mixed material.jpg differ
diff --git a/Open-ILS/web/opac/images/tor/mov-icon.gif b/Open-ILS/web/opac/images/tor/mov-icon.gif
new file mode 100644 (file)
index 0000000..7c21956
Binary files /dev/null and b/Open-ILS/web/opac/images/tor/mov-icon.gif differ
diff --git a/Open-ILS/web/opac/images/tor/mov-icon.png b/Open-ILS/web/opac/images/tor/mov-icon.png
new file mode 100644 (file)
index 0000000..3f26347
Binary files /dev/null and b/Open-ILS/web/opac/images/tor/mov-icon.png differ
index a339a24..fc180ca 100644 (file)
Binary files a/Open-ILS/web/opac/images/tor/moving image.jpg and b/Open-ILS/web/opac/images/tor/moving image.jpg differ
diff --git a/Open-ILS/web/opac/images/tor/mussymbol-icon.gif b/Open-ILS/web/opac/images/tor/mussymbol-icon.gif
new file mode 100644 (file)
index 0000000..0441983
Binary files /dev/null and b/Open-ILS/web/opac/images/tor/mussymbol-icon.gif differ
diff --git a/Open-ILS/web/opac/images/tor/mussymbol-icon.png b/Open-ILS/web/opac/images/tor/mussymbol-icon.png
new file mode 100644 (file)
index 0000000..b9e2e0d
Binary files /dev/null and b/Open-ILS/web/opac/images/tor/mussymbol-icon.png differ
diff --git a/Open-ILS/web/opac/images/tor/nonmusic-icon.gif b/Open-ILS/web/opac/images/tor/nonmusic-icon.gif
new file mode 100644 (file)
index 0000000..6cd32f7
Binary files /dev/null and b/Open-ILS/web/opac/images/tor/nonmusic-icon.gif differ
diff --git a/Open-ILS/web/opac/images/tor/nonmusic-icon.png b/Open-ILS/web/opac/images/tor/nonmusic-icon.png
new file mode 100644 (file)
index 0000000..72ec1ee
Binary files /dev/null and b/Open-ILS/web/opac/images/tor/nonmusic-icon.png differ
index 4110c68..fa8899e 100644 (file)
Binary files a/Open-ILS/web/opac/images/tor/notated music.jpg and b/Open-ILS/web/opac/images/tor/notated music.jpg differ
diff --git a/Open-ILS/web/opac/images/tor/pic-icon.gif b/Open-ILS/web/opac/images/tor/pic-icon.gif
new file mode 100644 (file)
index 0000000..07fe0e8
Binary files /dev/null and b/Open-ILS/web/opac/images/tor/pic-icon.gif differ
diff --git a/Open-ILS/web/opac/images/tor/pic-icon.png b/Open-ILS/web/opac/images/tor/pic-icon.png
new file mode 100644 (file)
index 0000000..e6de60f
Binary files /dev/null and b/Open-ILS/web/opac/images/tor/pic-icon.png differ
diff --git a/Open-ILS/web/opac/images/tor/placeholder-icon.gif b/Open-ILS/web/opac/images/tor/placeholder-icon.gif
new file mode 100644 (file)
index 0000000..18d949d
Binary files /dev/null and b/Open-ILS/web/opac/images/tor/placeholder-icon.gif differ
diff --git a/Open-ILS/web/opac/images/tor/placeholder-icon.png b/Open-ILS/web/opac/images/tor/placeholder-icon.png
new file mode 100644 (file)
index 0000000..e523300
Binary files /dev/null and b/Open-ILS/web/opac/images/tor/placeholder-icon.png differ
diff --git a/Open-ILS/web/opac/images/tor/recsound-icon.gif b/Open-ILS/web/opac/images/tor/recsound-icon.gif
new file mode 100644 (file)
index 0000000..cfde2a5
Binary files /dev/null and b/Open-ILS/web/opac/images/tor/recsound-icon.gif differ
diff --git a/Open-ILS/web/opac/images/tor/recsound-icon.png b/Open-ILS/web/opac/images/tor/recsound-icon.png
new file mode 100644 (file)
index 0000000..246d5a8
Binary files /dev/null and b/Open-ILS/web/opac/images/tor/recsound-icon.png differ
index 7e34ec6..bbd2002 100644 (file)
Binary files a/Open-ILS/web/opac/images/tor/software, multimedia.jpg and b/Open-ILS/web/opac/images/tor/software, multimedia.jpg differ
diff --git a/Open-ILS/web/opac/images/tor/software-icon.gif b/Open-ILS/web/opac/images/tor/software-icon.gif
new file mode 100644 (file)
index 0000000..2fc293f
Binary files /dev/null and b/Open-ILS/web/opac/images/tor/software-icon.gif differ
diff --git a/Open-ILS/web/opac/images/tor/software-icon.png b/Open-ILS/web/opac/images/tor/software-icon.png
new file mode 100644 (file)
index 0000000..a347513
Binary files /dev/null and b/Open-ILS/web/opac/images/tor/software-icon.png differ
index 6c648d3..5eaf85b 100644 (file)
Binary files a/Open-ILS/web/opac/images/tor/sound recording-musical.jpg and b/Open-ILS/web/opac/images/tor/sound recording-musical.jpg differ
index 6c648d3..9b706cb 100644 (file)
Binary files a/Open-ILS/web/opac/images/tor/sound recording-nonmusical.jpg and b/Open-ILS/web/opac/images/tor/sound recording-nonmusical.jpg differ
index 6c648d3..35f5c39 100644 (file)
Binary files a/Open-ILS/web/opac/images/tor/sound recording.jpg and b/Open-ILS/web/opac/images/tor/sound recording.jpg differ
diff --git a/Open-ILS/web/opac/images/tor/sound-icon.gif b/Open-ILS/web/opac/images/tor/sound-icon.gif
new file mode 100644 (file)
index 0000000..463272f
Binary files /dev/null and b/Open-ILS/web/opac/images/tor/sound-icon.gif differ
diff --git a/Open-ILS/web/opac/images/tor/sound-icon.png b/Open-ILS/web/opac/images/tor/sound-icon.png
new file mode 100644 (file)
index 0000000..7edee89
Binary files /dev/null and b/Open-ILS/web/opac/images/tor/sound-icon.png differ
index 8e0c725..77f6171 100644 (file)
Binary files a/Open-ILS/web/opac/images/tor/still images.jpg and b/Open-ILS/web/opac/images/tor/still images.jpg differ
index bac8c57..d9db115 100644 (file)
Binary files a/Open-ILS/web/opac/images/tor/text.jpg and b/Open-ILS/web/opac/images/tor/text.jpg differ
index 33a02c8..ede4f3b 100644 (file)
Binary files a/Open-ILS/web/opac/images/tor/three dimensional object.jpg and b/Open-ILS/web/opac/images/tor/three dimensional object.jpg differ
diff --git a/Open-ILS/web/opac/images/tor/threed-icon.gif b/Open-ILS/web/opac/images/tor/threed-icon.gif
new file mode 100644 (file)
index 0000000..b690a1d
Binary files /dev/null and b/Open-ILS/web/opac/images/tor/threed-icon.gif differ
diff --git a/Open-ILS/web/opac/images/tor/threed-icon.png b/Open-ILS/web/opac/images/tor/threed-icon.png
new file mode 100644 (file)
index 0000000..d4e5194
Binary files /dev/null and b/Open-ILS/web/opac/images/tor/threed-icon.png differ
diff --git a/Open-ILS/web/opac/skin/craftsman/css/default.css b/Open-ILS/web/opac/skin/craftsman/css/default.css
new file mode 100644 (file)
index 0000000..254157e
--- /dev/null
@@ -0,0 +1,269 @@
+body { margin: 0; padding: 0; background: #f8f5e4 url(../../../images/bg.gif) repeat-x top left; }
+
+img { border: 0; }
+.clear { clear: both; }
+
+#container { height: 1%; }
+
+/* --------------- header --------------- */
+#header { background: #2e8469 url(../../../images/header-bg.gif) repeat-x top left; border-bottom: 1px solid #145440; min-height: 95px; }
+#header img.logo {display: block; width: 260px; }
+#header-shadow { background: url(../../../images/header-shadow.gif) repeat-x top left; height: 5px; }
+
+/* --------------- Home Search ---------- */
+.home-searcharea { margin: 65px auto 0 auto; padding: 6px; background: #fff url(../../../images/searchbox-bg.gif) repeat-x bottom left; width: 800px; -moz-border-radius: 6px; border: 1px solid #ccc8b1; }
+.home-logo { padding: 35px 40px 45px 40px; text-align: center; }
+.home-title { padding: 6px; font-size: 14px; font-weight: bold; color: #f08d4d; text-align: center; }
+.home-search-panel { margin-bottom: 5px; padding: 6px; background: #fffefa; border: 1px solid #809fb2; text-align: center; }
+.home-search-panel .search-home-input { height: 25px; padding: 4px; background: #fff; border: 1px solid #a7a6aa; font-size: 13px; width: 400px; }
+.home-search-panel .submit { padding: 3px 6px; }
+.home-filter-panel { padding: 6px; background: #fbf9ee; border: 1px solid #809fb2; text-align: center; }
+.home-filter-panel select { padding: 3px; }
+
+.home-bottom-tabs { margin: 0 auto; width: 800px; text-align: center; }
+.home-bottom-tabs ul { margin: 0 auto; padding: 0; list-style: none; width: 500px; }
+.home-bottom-tabs ul li { float: left; margin: 0 2px; padding: 12px; background: #f7f4e7 url(../../../images/home-bottom-tag-bg.gif) repeat-x bottom left; -moz-border-radius: 6px; border: 1px solid #4e819c; border-top: 0; }
+.home-bottom-tabs ul li a { display: block; padding: 5px 0 5px 25px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 11px; color: #333; text-decoration: none; }
+.home-bottom-tabs ul li a.advancedsearch { background: url(../../../images/advancedsearch-icon.gif) no-repeat 0 50%; }
+.home-bottom-tabs ul li a.chooselibrary { background: url(../../../images/chooselibrary-icon.gif) no-repeat 0 50%; }
+.home-bottom-tabs ul li a.myaccount { background: url(../../../images/myaccount-icon.gif) no-repeat 0 50%; }
+.home-bottom-tabs ul li a:hover { color: #000; }
+.home-bottom-tabs ul li:hover { background: #fff url(../../../images/sidebar-bg.gif) repeat-x bottom left; }
+
+/* --------------- text size --------------- */
+#header #text_size_div { padding: 3px 2px 3px 0; }
+#header #text_size_div ul { float: right; margin: 0; padding: 0; list-style: none; }
+#header #text_size_div ul li { float: left; padding: 0 2px; font-size: 12px; color: #fff; letter-spacing: 0.1em; }
+#header #text_size_div ul li a { font-size: 12px; color: #fff; text-decoration: underline; }
+#header #text_size_div ul li a:hover { font-size: 12px; color: #fff; text-decoration: none; }
+
+/* --------------- search bar --------------- */
+#header #searchbar { padding: 3px; }
+#header #searchbar ul { margin: 0; padding: 0; list-style: none; }
+#header #searchbar ul li { float: left; }
+#header #searchbar ul li input.input { padding: 4px; background: #fff; font-size: 13px; height: 25px; width: 200px; border: 1px solid #aeafb2; }
+#header #searchbar ul li input.submit { margin-left: 10px; padding: 2px 0; font-size: 13px; width: 80px; }
+#header #searchbar ul li select { margin: 2px 5px 2px 10px; padding: 3px; font-size: 13px; }
+#header #searchbar ul li a.classic_link { margin-left: 5px; display: block; background: url(../../../images/libselect-btn.gif) no-repeat; width: 163px; height: 25px; text-indent: -9000em; overflow: hidden; }
+#header #searchbar ul li a.classic_link:hover { background-position: bottom; }
+
+/* --------------- status bar --------------- */
+#header #statusbar { padding: 0 2px 0 0; font-family: "Trebuchet MS", Verdana, Arial, Helvetica, sans-serif; font-size: 12px; }
+#header #statusbar td { color: #fff; vertical-align: middle; }
+#header #statusbar ul { margin: 0; padding: 3px 0 0 0; list-style: none; }
+#header #statusbar ul li { float: left; }
+#header #statusbar ul li label { display: block; padding: 4px 0 0 0; }
+#header #statusbar .title { font-size: 15px; letter-spacing: 0.1em; }
+#header #statusbar li.checkbox { padding: 3px 5px 0 5px; }
+#header #statusbar input { margin: 0; padding: 0 5px 0 5px; font-size: 13px; }
+#header #statusbar select { font-size: 11px; font-size: 13px; padding: 3px; }
+/* --------------- end Header --------------- */
+
+/* --------------- Content --------------- */
+#main-content { min-height: 300px; border-collapse: collapse; }
+#main-content tbody td { vertical-align: top; }
+#main-content tbody td#main_left_cell { width: 300px; min-width: 300px; }
+#main-content tbody td#main_right_cell { width: 100%; padding-top: 5px; padding-right: 5px }
+#main-content tbody td#main_right_cell div#content { background: #fff url(../../../images/content-bg.jpg) repeat-x bottom left; -moz-border-radius: 6px; border: 1px solid #a4a39e; min-height: 450px; }
+/* --------------- end Content --------------- */
+
+/* --------------- footer --------------- */
+#footer { margin: 10px 5px 0 5px; background: #797457 url(../../../images/footer-bg.gif) repeat-x bottom; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 11px; color: #e0dcc6; -moz-border-radius: 6px; border: 1px solid #454337; }
+#footer .inner { padding: 0 10px 0 10px; -moz-border-radius: 6px; border: 3px solid #938f76; min-height: 45px; height: 65px; }
+#footer table { border-collapse: collapse; width: 100%; }
+#footer td { padding: 10px; color: #e0dcc6; font-size: 11px; vertical-align: middle; }
+#footer td.right { text-align: right }
+
+#footer a { color: #e0dcc6; text-decoration: underline; }
+#footer a:hover { color: #fff; text-decoration: none; }
+/* --------------- end footer --------------- */
+
+/* --------------- Main Left Menu ----------- */
+#main-left-menu { margin: 5px; padding: 5px; background: #fbfaf1; -moz-border-radius: 6px; border: 1px solid #b0ad97; }
+#main-left-menu ul { margin: 0; padding: 0; list-style: none; }
+#main-left-menu ul li { cursor: pointer; padding: 1px; font-family: Verdana, Arial, Helvetica, sans-serif; -moz-border-radius: 6px; border: 1px solid #fbfaf1; }
+#main-left-menu ul li:hover { background: #fff url(../../../../images/sidebar-bg.gif) repeat-x bottom left; -moz-border-radius: 6px; border: 1px solid #a0bbcb; }
+#main-left-menu ul li a { display: block; padding: 8px 5px 8px 38px; color: #000; text-decoration: none; }
+#main-left-menu ul li a.home-btn { background: url(../../../images/home-icon.gif) no-repeat 5px 50%; }
+#main-left-menu ul li a.home-btn:hover { background: url(../../../images/home-icon-u.gif) no-repeat 5px 50%; }
+#main-left-menu ul li a.advancedsearch-btn { background: url(../../../images/inner-advanced-icon.gif) no-repeat 5px 50%; }
+#main-left-menu ul li a.advancedsearch-btn:hover { background: url(../../../images/inner-advanced-icon-u.gif) no-repeat 5px 50%; }
+#main-left-menu ul li a.account-btn { background: url(../../../images/inner-account-icon.gif) no-repeat 5px 50%; }
+#main-left-menu ul li a.account-btn:hover { background: url(../../../images/inner-account-icon-u.gif) no-repeat 5px 50%; }
+#main-left-menu ul li a.login-btn { background: url(../../../images/login-icon.gif) no-repeat 8px 50%; }
+#main-left-menu ul li a.login-btn:hover { background: url(../../../images/login-icon-u.gif) no-repeat 8px 50%; }
+#main-left-menu ul li a.logout-btn { background: url(../../../images/logout-icon.gif) no-repeat 8px 50%; }
+#main-left-menu ul li a.logout-btn:hover { background: url(../../../images/logout-icon-u.gif) no-repeat 8px 50%; }
+#main-left-menu ul li a.title-btn { background: url(../../../images/title-icon.gif) no-repeat 5px 50%; }
+#main-left-menu ul li a.title-btn:hover { background: url(../../../images/title-icon-u.gif) no-repeat 5px 50%; }
+#main-left-menu ul li span { display: block; padding: 8px 5px 8px 38px; color: #000; text-decoration: none; }
+#main-left-menu ul li span.titledetails-btn { background: url(../../../images/titledetails-icon-u.gif) no-repeat 5px 50%; }
+#main-left-menu ul li span.loginas-btn { background: url(../../../images/loginas-icon.gif) no-repeat 10px 50%; }
+
+#main-left-inner { margin: 5px; padding: 5px; background: #f6f5ea; -moz-border-radius: 6px; border: 1px solid #d1cebc; }
+
+#main-left-menu div.subject_sidebar { cursor: pointer; padding: 8px; font-family: Verdana, Arial, Helvetica, sans-serif; -moz-border-radius: 6px; border: 1px solid #f6f5ea; }
+#main-left-menu div.subject_sidebar:hover { background: #fff url(../../../../images/sidebar-bg.gif) repeat-x bottom left; -moz-border-radius: 6px; border: 1px solid #a0bbcb; }
+#main-left-menu div.subject_sidebar a { color: #000; text-decoration: none; }
+#main-left-menu div.subject_sidebar a:hover { color: #4c83c7; text-decoration: underline; }
+
+#main-left-menu div.author_sidebar { cursor: pointer; padding: 8px; font-family: Verdana, Arial, Helvetica, sans-serif; -moz-border-radius: 6px; border: 1px solid #f6f5ea; }
+#main-left-menu div.author_sidebar:hover { background: #fff url(../../../../images/sidebar-bg.gif) repeat-x bottom left; -moz-border-radius: 6px; border: 1px solid #a0bbcb; }
+#main-left-menu div.author_sidebar a { color: #000; text-decoration: none; }
+#main-left-menu div.author_sidebar a:hover { color: #4c83c7; text-decoration: underline; }
+
+#main-left-menu div.series_sidebar { cursor: pointer; padding: 8px; font-family: Verdana, Arial, Helvetica, sans-serif; -moz-border-radius: 6px; border: 1px solid #f6f5ea; }
+#main-left-menu div.series_sidebar:hover { background: #fff url(../../../../images/sidebar-bg.gif) repeat-x bottom left; -moz-border-radius: 6px; border: 1px solid #a0bbcb; }
+#main-left-menu div.series_sidebar a { color: #000; text-decoration: none; }
+#main-left-menu div.series_sidebar a:hover { color: #4c83c7; text-decoration: underline; }
+
+#main-left-search { margin: 5px; padding: 5px; background: #f3f2e6; -moz-border-radius: 6px; border: 1px solid #b0ad97; font-family: Verdana, Arial, Helvetica, sans-serif; }
+#main-left-search h2 { margin: 0; padding: 6px 8px; background: #b0ad97; -moz-border-radius: 6px; font-size: 12px; color: #fff; }
+#main-left-search .content { padding: 6px 8px 10px 8px; font-size: 11px; }
+#main-left-search .content table { border-collapse: 0; }
+#main-left-search .content table td { padding: 3px; vertical-align: middle; }
+#main-left-search .content input, #main-left-search .content select { font-size: 11px; }
+#main-left-search .buttons { padding: 0 8px 8px 8px; }
+#main-left-search .buttons a { padding: 4px 8px; background: #f79456; font-size: 10px; -moz-border-radius: 6px; border: 1px solid #fb853c; color: #fff; text-decoration: none; }
+#main-left-search .buttons a:hover { background: #74b6ca; font-size: 10px; -moz-border-radius: 6px; border: 1px solid #247b9a; }
+/* --------------- end Main Left Menu ------ */
+
+/* --------------- Tool Bar ---------------- */
+.search-toolbar { background: #c8dfed; -moz-border-radius: 6px; border: 1px solid #b5cbd8; width: 90%; font-family: Verdana, Arial, Helvetica, sans-serif; }
+.search-toolbar ul { margin: 0; padding: 0; list-style: none; }
+.search-toolbar ul li { float: left; display: block; -moz-border-radius: 6px; border: 1px solid #c8dfed; }
+.search-toolbar ul li:hover { background: #fff url(../../../images/sidebar-bg.gif) repeat-x bottom left; -moz-border-radius: 6px; border: 1px solid #b5cbd8; }
+.search-toolbar ul li a { display: block; padding: 10px 10px 10px 32px; text-decoration: none; font-size: 11px; }
+.search-toolbar ul li a.expandall-btn { background: url(../../../images/expandall-icon.gif) no-repeat 10px 50%; }
+.search-toolbar ul li a.expandall-btn:hover { background: url(../../../images/expandall-icon-u.gif) no-repeat 10px 50%; }
+.search-toolbar ul li a.closeall-btn { background: url(../../../images/closeall-icon.gif) no-repeat 10px 50%; }
+.search-toolbar ul li a.closeall-btn:hover { background: url(../../../images/closeall-icon-u.gif) no-repeat 10px 50%; }
+.search-toolbar ul li a.cancel-btn { background: url(../../../images/cancel-icon.gif) no-repeat 14px 50%; }
+.search-toolbar ul li a.cancel-btn:hover { background: url(../../../images/cancel-icon-u.gif) no-repeat 14px 50%; }
+.search-toolbar ul li a:hover { color: #000; }
+/* --------------- end Tool Bar ------------ */
+
+/* --------------- org_tree_container ------ */
+.tips_box { padding: 15px; background: #fff url(../../../../images/sidebar-bg.gif) repeat-x bottom left; -moz-border-radius: 6px; border: 1px solid #a0bbcb; font-family: Verdana, Arial, Helvetica, sans-serif; text-align: center; }
+
+.org_tree_container { cursor: pointer; padding: 8px; font-family: Verdana, Arial, Helvetica, sans-serif; -moz-border-radius: 6px; border: 1px solid #f6f5ea; }
+.org_tree_container:hover { background: #fff url(../../../../images/sidebar-bg.gif) repeat-x bottom left; -moz-border-radius: 6px; border: 1px solid #a0bbcb; }
+.org_tree_container a { color: #000; text-decoration: none; }
+.org_tree_container a:hover { color: #4c83c7; text-decoration: underline; }
+/* --------------- end org_tree_container -- */
+
+/* --------------- resultinfo -------------- */
+.resultinfo-box { margin-bottom: 2px; padding: 5px; background: #c8dfed; -moz-border-radius: 6px; border: 1px solid #b5cbd8; }
+.resultinfo-box table { border-collapse: collapse; width: 100%; }
+.resultinfo-box td { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 11px; vertical-align: middle; }
+
+.resultinfo-bottom-box { padding: 5px; background: #e3eff6; -moz-border-radius: 6px; border: 1px solid #e3eff6; }
+.resultinfo-bottom-box table { border-collapse: collapse; width: 100%; }
+.resultinfo-bottom-box td { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px; color: #365364; vertical-align: middle; }
+/* --------------- end resultinfo ---------- */
+
+/* --------------- book-results ------------ */
+.book-results { border-collapse: collapse; width: 100% }
+.book-results td { padding: 6px; border-bottom: 1px solid #ddd; font-family: Verdana, Arial, Helvetica, sans-serif; vertical-align: middle; }
+.book-results td.bookjacket { text-align: middle; width: 10%; vertical-align: middle; }
+.book-results td.bookjacket img { display: block; margin: 0 auto; width: 60px; } /* border: 1px solid #b2c0c8; */
+.book-results h1 { margin: 0; padding: 0; font-size: 16px; }
+.book-results h1 a { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 16px; color: #db752a; }
+.book-results h1 a:hover { color: #569ebe; }
+.book-results h2 { margin: 0; padding: 0; font-size: 13px; }
+.book-results h2 a { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; font-weight: normal; color: #208acb; }
+.book-results h2 a:hover { color: #000; }
+.book-results blockquote { margin: 0; padding: 0; font-size: 12px; color: #5f6361; }
+.book-results td.count { text-align: center; font-size: 12px; font-weight: bold; vertical-align: middle; }
+.book-results tr:hover { background: #ecf5fa; }
+
+.book-results {  }
+.book-results .tool-icons { float: left; margin: 5px 0; padding: 3px 3px 1px 3px; background: #fbf9ee; -moz-border-radius: 6px; border: 1px solid #cac5ab; } /* width: 320px; */
+/*
+.book-results .tool-icons ul { margin: 0; padding: 0; list-style: none; }
+.book-results .tool-icons ul li { float: left; }
+.book-results .tool-icons ul li a { display: block; padding: 2px; -moz-border-radius: 6px; border: 1px solid #fbf9ee; }
+.book-results .tool-icons ul li a:hover { background: #fff; -moz-border-radius: 6px; border: 1px solid #cac5ab; }
+*/
+.book-results .tool-icons a { display: block; float: left; padding: 2px; -moz-border-radius: 6px; border: 1px solid #fbf9ee; height: 25px; text-align: center; }
+.book-results .tool-icons a:hover { background: #fff; -moz-border-radius: 6px; border: 1px solid #cac5ab; }
+.book-results .tool-icons a img { display: block; margin: 0 auto; }
+.book-results .placeholder { float: left; display: block; margin: 5px; width: 110px; padding: 2px 3px 2px 3px; background: #eeece0; -moz-border-radius: 6px; border: 1px solid #e3dfc9; }
+.book-results .placeholder a { display: block; padding: 9px 5px 8px 30px; background:  url(../../../images/tor/placeholder-icon.gif) no-repeat 5px 50%; font-size: 10px; color: #4c7b8c; -moz-border-radius: 6px; border: 1px solid #eeece0; }
+.book-results .placeholder a:hover { background: #fff url(../../../images/tor/placeholder-icon.gif) no-repeat 5px 50%; color: #000; -moz-border-radius: 6px; border: 1px solid #cac5ab; }
+
+.pageresults-box { margin: 5px 5px 0 0; padding: 10px; background: #fffefa; -moz-border-radius: 6px; border: 1px solid #8dacbf; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 11px; color: #666; }
+/* --------------- end book-results -------- */
+
+/* --------------- Low Hits ---------------- */
+.lowhits-box { margin: 5px 5px 0 0; padding: 10px; background: #fbfce5; -moz-border-radius: 6px; border: 1px solid #c4b7b7; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; color: #666; }
+.lowhits-box ul { margin: 0; padding: 0; list-style: none; }
+.lowhits-box ul li { padding: 5px 5px 5px 25px; background: url(../../../images/list-icon.gif) no-repeat 5px 50%; }
+/* --------------- end Low Hits ------------ */
+
+/* --------------- tips-box ---------------- */
+.tips-bottom-box { margin-top: 5px; padding: 15px; background: #fff url(../../../../images/sidebar-bg.gif) repeat-x bottom left; -moz-border-radius: 6px; border: 1px solid #a0bbcb; font-family: Verdana, Arial, Helvetica, sans-serif; text-align: center; }
+/* --------------- end tips-box ------------ */
+
+/* --------------- Advanced Search Box------ */
+.advancedsearch-box {  }
+.advancedsearch-box .form-panels { margin-top: 5px; padding: 10px; background: #fff url(../../../../images/sidebar-bg.gif) repeat-x bottom left; -moz-border-radius: 6px; border: 1px solid #a0bbcb; font-family: Verdana, Arial, Helvetica, sans-serif; text-align: center; }
+.advancedsearch-box h2 { margin: 0; padding: 8px; background: #666; font-size: 12px; color: #fff; -moz-border-radius: 6px; border: 1px solid #333; }
+.advancedsearch-box tbody td { padding: 3px; font-size: 11px; border-bottom: 1px solid #ddd; }
+.advancedsearch-box tbody td input, .advancedsearch-box tbody td textaream, .advancedsearch-box tbody td select { font-size: 13px; }
+.advancedsearch-box .submit { padding: 6px; }
+/* --------------- end Advanced Search Box - */
+
+/* --------------- Login ------------------- */
+.login-box {}
+.login-box .form-panels { margin: 5px auto; width: 500px; padding: 15px; background: #fff url(../../../../images/sidebar-bg.gif) repeat-x bottom left; -moz-border-radius: 6px; border: 1px solid #a0bbcb; font-family: Verdana, Arial, Helvetica, sans-serif; text-align: center; }
+.login-box h2 { margin: 0; padding: 8px; background: #666; font-size: 12px; color: #fff; -moz-border-radius: 6px; border: 1px solid #333; text-align: left; }
+.login-box tbody td { padding: 6px; font-size: 11px; border-bottom: 1px solid #ddd; vertical-align: middle; font-size: 1em; }
+.login-box tbody td input { padding: 6px; font-size: 11px; }
+.login-box .submit { padding: 6px; }
+.login-box .info { padding: 10px; background: #fbfce5; -moz-border-radius: 6px; border: 1px solid #c4b7b7; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; color: #666; }
+/* --------------- end Login --------------- */
+
+/* --------------- Book Details Page --------------- */
+.details-grid {}
+.details-grid table { border-collapse: collapse; }
+.details-grid table td { padding: 6px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; color: #000; border-bottom: 1px solid #dee2e4; }
+.details-grid td.title { color: #3c5564; white-space: nowrap; }
+/* --------------- end Book Details Page --------------- */
+
+/* --------------- Book Details Record Summary and Place Hold --------------- */
+.detailsinfo-box { margin: 2px 2px 2px 2px; padding: 5px; background: #c8dfed; -moz-border-radius: 6px; border: 1px solid #b5cbd8; }
+.detailsinfo-box table { border-collapse: collapse; width: 100%; }
+.detailsinfo-box td { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 11px; vertical-align: middle; }
+
+.detailsinfo-bottom-box { margin: 2px 2px 2px 2px; padding: 5px; background: #e3eff6; -moz-border-radius: 6px; border: 1px solid #e3eff6; }
+.detailsinfo-bottom-box table { border-collapse: collapse; width: 100%; }
+.detailsinfo-bottom-box td { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px; color: #365364; vertical-align: middle; }
+
+.detailsinfo-right {}
+.detailsinfo-right ul { float: right; margin: 0; padding: 0; list-style: none; }
+.detailsinfo-right ul li { float: left; }
+
+.detailsinfo-bottom-box .placeholder { display: block; width: 110px; padding: 2px 3px 2px 3px; background: #eeece0; -moz-border-radius: 6px; border: 1px solid #e3dfc9; }
+.detailsinfo-bottom-box .placeholder a { display: block; padding: 9px 5px 8px 30px; background:  url(../../../images/tor/placeholder-icon.gif) no-repeat 5px 50%; font-size: 10px; color: #4c7b8c; -moz-border-radius: 6px; border: 1px solid #eeece0; }
+.detailsinfo-bottom-box .placeholder a:hover { background: #fff url(../../../images/tor/placeholder-icon.gif) no-repeat 5px 50%; color: #000; -moz-border-radius: 6px; border: 1px solid #cac5ab; }
+
+.detailsinfo-bottom-box .selectBox { display: block; padding: 9px 3px 0 12px; }
+/* --------------- Book Details Record Summary and Place Hold --------------- */
+
+/* --------------- Details footer Datagrid ---------------  */
+.details-footer-datagrid { border-collapse: collapse; }
+.details-footer-datagrid td { }
+.details-footer-datagrid td a { display: block; padding: 10px 25px; background: #dadada url(../../../images/details-f-bg-u.gif) repeat-x bottom; font-family: Verdana, Arial, Helvetica, sans-serif; -moz-border-radius: 6px; border-top: 1px solid #9f9f9f; border-right: 1px solid #9f9f9f; border-left: 1px solid #9f9f9f; color: #000; text-decoration: none; }
+.details-footer-datagrid td a:hover { background: #d9d9d9 url(../../../images/details-f-bg.gif) repeat-x bottom; color: #000; }
+.details-footer-datagrid td.rdetail_extras_selected a { display: block; padding: 10px 25px; background: #fbf9ee url(../../../images/details-f-bg.gif) repeat-x bottom; font-family: Verdana, Arial, Helvetica, sans-serif; -moz-border-radius: 6px; border-top: 1px solid #9f9f9f; border-right: 1px solid #9f9f9f; border-left: 1px solid #9f9f9f; color: #000; text-decoration: none; }
+
+.details-datagrid { border-collapse: collapse; border: 0; }
+.details-datagrid thead { border: 1px solid #91a8b5; }
+.details-datagrid thead td { padding: 6px; background: #e3eff6 url(../../../images/details-headers-bg.gif) repeat-x bottom; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px; }
+.details-datagrid tbody td { padding: 6px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px; }
+
+.details-base { padding: 10px; /*background: #d6d6d6; border: 1px solid #9f9f9f; -moz-border-radius: 6px;*/
+ background: #fff url(../../../images/searchbox-bg.gif) repeat-x bottom left; -moz-border-radius: 6px; border: 1px solid #ccc8b1;
+ }
+/* --------------- end Details footer Datagrid ---------------  */
\ No newline at end of file
diff --git a/Open-ILS/web/opac/skin/craftsman/css/layout.css b/Open-ILS/web/opac/skin/craftsman/css/layout.css
new file mode 100644 (file)
index 0000000..fbb8606
--- /dev/null
@@ -0,0 +1,246 @@
+.main_header   { width: 100%; }
+.space                 { padding-right:5px; }
+.vert_space            { padding-top: 82px; width: 100%;}
+.right                 { position:absolute; right: 0px; }
+.hide_me                       { display:none; visibility: hidden; }
+
+table { border-collapse: collapse; }
+
+/* generic CSS for a table with data */
+.data_grid { font-weight: 500; border-collapse: collapse;}
+.data_grid thead tr { }
+.data_grid thead td { padding-right: 5px; padding-left: 5px;}
+.data_grid tbody td { padding: 5px; }
+.data_grid_center { text-align: center; }
+
+.data_grid_nb { font-weight: 500; border-collapse: collapse;}
+.data_grid_nb thead tr { color: #000000; }
+.data_grid_nb thead td { padding-right: 5px; padding-left: 5px;}
+.data_grid_nb tbody td { padding: 5px; }
+
+
+.classic_link { text-decoration: underline; color: black;}
+.classic_link:visited { text-decoration: underline; color: black;}
+.classic_link_col { text-decoration: underline; color: red;}
+
+.encircled { border: 1px solid black; }
+
+
+.adv_quick_search { padding: 3px;}
+.adv_quick_search_submit { padding: 3px;}
+
+.overdue { color: red; font-weight: bold;}
+
+#main_table { border-collapse: collapse; width: 100%;  }
+#main_left_cell { width: 20%; vertical-align: top;margin: 0px; padding: 0px;}
+#main_right_cell { width: 80%; vertical-align: top; margin: 0px; padding:0px;}
+
+
+/*#content { min-height: 300px; }*/
+
+.canvas {  min-height: 300px; padding-left: 4px; -moz-border-radius: 6px;}
+#canvas_main { padding-bottom: 4px; }
+
+#loading_div { width: 100%;}
+
+
+
+.shadowed { background: #F0F0E0; }
+.no_copies { background: #E0E0E0; }
+.overdue_circ { border: 2px dashed #F0D0E0; }
+
+.org_tree { padding-left: 2px; padding-right: 2px; }            
+.org_link { padding-right: 15px; }
+#org_link_container { margin-bottom: 5px; padding-left: 4px; padding-bottom: 3px; padding-top: 3px; width: 100%; }
+#left_div { float:left; width: 20%; }
+#statusbar {}
+
+#frontsearch_table { }
+#frontsearch_table tr { margin: 6px; }
+
+/* ---------------------------------------------------------------------- */
+.sidebar_div {  }
+.sidebar_header { margin-top: 10px; padding-left: 3px; margin-right: 6px; }
+
+.sidebar_extra_item { padding: 0px; margin-right: 8px;}
+.side_bar_item { padding-left: 8px; padding-right: 8px; padding-top: 4px; padding-bottom: 4px; margin-right: 8px; }
+
+.sidebar_item_active { margin-right: 0px; }
+
+.sidebar_chunk { width: 100%; }
+
+/* ---------------------------------------------------------------------- */
+/*
+#searchbar { margin-top: 18px; width: 100%; }
+#searchbar table tr td {font-weight: bold; font-size: 8pt; }
+#searchbar select, input { border-collapse: collapse; font-size: 9pt; }
+.searchbar_item { margin: 3px; font-size: 9pt; } 
+.searchbar_label_span { font-size: 9pt; }
+#searchbar_table { border-collapse: collapse; }
+
+.search_box_container { width: 240px; padding: 3px; } border: 1px solid #A0A0A0;' class='color_2'>
+#search_box { width: 260px; }
+*/
+
+/* ---------------------------------------------------------------------- */
+#login_box { width: 70%; padding: 5px;}
+.login_text { margin-left: 8px; }
+
+/* ---------------------------------------------------------------------- */
+#result_table_div { text-align: left; width: 100%; }
+
+#search_nav_links { width: 100%; }
+#result_info_box { text-align: left; }
+#next_prev_links { padding-left: 2px; padding-right: 2px; text-align: left;}
+#goto_page_links { text-align: left; padding-left: 2px; padding-right: 2px;}
+
+#next_prev_links_dead {padding-left: 5px; padding-right: 5px;}
+
+#res_table { width: 100%; }
+
+.result_table_pic_cell { width: 43px;}
+.result_table_pic { height: 50px; width: 40px;  border: none;}
+.result_table_pic_header { width: 43px; }
+
+.result_table_row { text-align: left; width: 100%;}
+.result_table_subtable { width: 100%; border-collapse: collapse; vertical-align: top;}
+.result_table_subtbody { height: 100%; width: 100%; }
+.result_table_title_cell { text-align: left; }
+
+.copy_count_cell { width: 12%; vertical-align: middle; text-align: center; }
+.copy_count_div { width:  4em; height: 99%; vertical-align: middle; text-align: center; }
+
+.search_page_nav_link { margin-right: 5px; }
+
+.np_nav_link { margin-right: 5px; }
+
+/* ---------------------------------------------------------------------- */
+
+#rdetail_detail_main { width: 100%; }
+#rdetail_details_table { padding-top: 10px; width: 100%; padding: 30px; border-collapse: collapse;}
+.rdetail_header { padding: 3px; padding-left: 10px;}
+.rdetail_desc { padding: 2px; padding-left: 2px; padding-right: 2px;}
+.rdetail_item { width: 75%; padding-left: 10px; }
+#rdetail_image { padding-right: 10px; }
+#rdetail_copy_info_table { padding: 4px; width: 100%; border-collapse: collapse; }
+.rdetail_copy_info_header_cell { padding: 2px; }
+.rdetail_copy_count_cell { text-align: center; }
+
+
+.tor_pic { width: 17px; height: 17px; border: none;}
+
+.dim2_border { border: 1px solid #F06000; -moz-border-radius: 3px;}
+
+.dim2 { 
+       filter:alpha(opacity=50); 
+       -moz-opacity:0.5; 
+       opacity: 0.5; 
+       text-decoration: none; }
+
+.dim { 
+       filter:alpha(opacity=10); 
+       -moz-opacity:0.1; 
+       opacity: 0.1; 
+       text-decoration: none; }
+
+/* ---------------------------------------------------------------------- */
+
+.myopac_link { width: 12%; margin: 3px; padding: 3px; text-align: center; vertical-align: middle;  }
+.myopac_link_active { font-weight: 700;}
+.myopac_table thead tr td { padding: 2px; font-weight: 500; border: 1px solid #808080;}
+.myopac_table td { padding: 3px; }
+.myopac_form_pic { width: 20px; height: 20px; }
+
+.tips { padding: 2px; text-align: center; border: solid #E0E0E0 3px; -moz-border-radius: 3px; width: 99%; }
+
+.holds_cell { border: 1px solid #E0E0E0; padding: 5px; width: 50%;}
+.myopac_update_cell { border: 3px solid #E0E0E0; width:100%; padding-top: 4px; padding-bottom: 4px;}
+.myopac_update_span { padding: 5px;}
+
+
+.lowhits_div { width: 100%; border-top: 1px solid #E0E0E0; text-align: center; 
+       padding-top: 8px; padding-bottom: 8px; }
+
+.rdetail_extras_div {
+       }
+
+.copy_info_region_row {
+       padding: 6px;
+       border: 2px solid #E0E0E0;
+       font-weight: 600;
+}
+
+.rdetail_extras_td { padding-right: 15px; padding-left: 15px; border-right: 1px solid #888; }
+.rdetails_extra_links { border: 1px solid #808080; padding-right: 5px; padding-left: 5px; }
+
+
+.cn_browse_item { }
+.cn_browse_info { padding: 4px; border-bottom: 1px dashed #E0E0E0;}
+
+.bookshelf {
+        /*background-image: url(http://10.4.0.10/woodgrain.jpeg);*/
+        /*
+        background-image: url(http://dev.gapines.org/opac/images/woodgrain.jpg);
+        background-repeat: repeat;
+        */
+        border-bottom: 1px solid black;
+}
+
+.cn_browse_loading { width: 95%; padding: 15px; text-align: center; background: #E0F0E0; }
+
+.cn_browse_home_cn { border: 2px solid #E0F0E0; background: green; font-weight: 700;}
+
+.rdetail_context_row { background: #F0E0E0; }
+
+.unadorned_link { text-decoration: none; vertical-align: bottom; }
+
+
+/* ie does not support disabling <option> elements */
+.disabled_option { color: #808080; }
+
+.copy_more_info { padding-left: 6px; color: #804070; }
+
+.invalid_hold { background: #F0F0D0; }
+.myopac_summary_table td { padding : 3px; }
+
+.jacket_attrib { font-size: 7pt; }
+
+/* block that contains footer links and copyright */
+#copyright_block { 
+    width: 100%; 
+    text-align: center; 
+    vertical-align: bottom; 
+    margin-top: 10px;
+}
+
+/* block that contains the footer links */
+#footer_links {
+    width: 80%;
+    text-align: center;
+    padding: 10px;
+    margin: auto;
+}
+
+/* span for each link in the footer */
+.footer-link {
+    margin-left: 10px;
+    margin-right: 10px;
+}
+
+/* block that contains the copyright text */
+#copyright_text {
+    margin-top: 4px;
+}
+
+/* block that contains the logo */
+#footer_logo {
+    text-align: center;
+    margin: auto;
+}
+
+#opac.result.sort { margin-left: 5px; }
+
+#xul_recipient_me { margin-left: 25px; }
+#myopac_holds_thaw_date_form {padding: 10px; text-align: center;}
+#myopac_holds_freeze_select_thaw {margin-right: 100px; margin-left: 100px; }
+
diff --git a/Open-ILS/web/opac/skin/craftsman/xml/advanced/adv_global_row.xml b/Open-ILS/web/opac/skin/craftsman/xml/advanced/adv_global_row.xml
new file mode 100644 (file)
index 0000000..a5a2554
--- /dev/null
@@ -0,0 +1,36 @@
+<!--
+<tr id='adv_global_trow' type='input'>
+-->
+<tr id='<!--#echo var="adv_global_row_id"-->' type='input'>
+       <td align='center' width='100%' nowrap='nowrap'>
+
+               <!-- select the search class -->
+               <select name='type' style='margin-right: 7px;'>
+                       <option value='keyword' selected='selected'>&common.keyword;</option>
+                       <option value='title'>&common.title;</option>
+                       <option value='author'>&common.author;</option>
+                       <option value='subject'>&common.subject;</option>
+                       <option value='series'>&common.series;</option>
+               </select>
+       
+               <!-- select how to treat the text -->
+               <select name='contains' style='margin-right: 7px;'>
+                       <option value='contains'>&opac.advanced.refined.contains;</option>
+                       <option value='nocontains'>&opac.advanced.refined.nocontains;</option>
+                       <option value='exact'>&opac.advanced.refined.exact;</option>
+               </select>
+                       
+               <!-- search term -->
+        <input type='text' size='18' name='term' style='margin-right: 3px; width: 120px; ' />
+       
+               <!-- Remove this row -->
+        <button 
+                       onclick='
+                               var row = this.parentNode.parentNode;
+                               var tbody = row.parentNode;
+                               if( tbody.getElementsByTagName("tr").length > 2 )
+                                       row.parentNode.removeChild(row);'>X</button>
+
+       </td>
+</tr>
+
diff --git a/Open-ILS/web/opac/skin/craftsman/xml/advanced/advanced_global.xml b/Open-ILS/web/opac/skin/craftsman/xml/advanced/advanced_global.xml
new file mode 100644 (file)
index 0000000..61c2ddd
--- /dev/null
@@ -0,0 +1,287 @@
+<div class='advancedsearch-box'>
+       <table id='adv_global_search' width='100%' align='center'>
+       <!--class='data_grid data_grid_center'-->
+       
+               <style>
+                       #adv_global_search select { width: 13em; }
+                       #adv_global_input_table select { width: 7em; }
+                       .adv_adv_link { font-size: 8pt; color: red; }
+               </style>
+       
+               <script language='javascript' type='text/javascript' src='<!--#echo var="OILS_OPAC_JS_HOST"-->/skin/default/js/adv_global.js'> </script>
+       
+               <tr>
+       
+                       <!-- Contains the user-addable(?) rows to define search class, containment and text -->
+                       <td width='65%'>
+                               <div class='form-panels'>
+                                       <table id='adv_global_input_table' width='95%' align='center'>          
+                                               <thead>
+                                                       <tr>
+                                                               <td colspan='2'><h2>&advanced.search.title;</h2></td>
+                                                       </tr>
+                                               </thead>
+                                               <tbody id='adv_global_tbody'>
+               
+                                                       <script language='javascript' type='text/javascript'>
+                                                               config.ids.common.now_searching = 'now_searching_location';
+                                                       </script>
+               
+                                                       <!--#set var="adv_global_row_id" value="adv_global_trow"-->
+                                                       <!--#include virtual="adv_global_row.xml"-->
+               
+                                                       <!--#set var="adv_global_row_id" value=""-->
+                                                       <!--#include virtual="adv_global_row.xml"-->
+                                                       <!--#include virtual="adv_global_row.xml"-->
+               
+                                                       <!-- add a new row -->
+                                                       <tr id='adv_global_addrow'>
+                                                               <td align='center'>
+                                                                       <button id='myopac_new_global_row' onclick='advAddGblRow();'>&advanced.add.row;</button>
+                                                                       <!--<span style='padding-left: 10px;'> </span>
+                                                                       <button onclick='advSubmitGlobal();'>&advanced.search.submit;</button>-->
+                                                               </td>
+                                                       </tr>   
+                                               </tbody>
+                                       </table>
+                               </div>
+                       </td>
+                       <td rowspan='2' align='right'>
+                               <div class='form-panels'>
+                                       <table>
+                                               <thead>
+                                                       <tr>
+                                                               <td colspan='2'><h2>&advanced.search.filters;</h2></td>
+                                                       </tr>
+                                               </thead>
+                                               <tbody>
+                                                       <tr>
+                                                               <td align='right'>
+                                                                       <span>&advanced.item.form;</span>
+                                                               </td>
+                                                               <td align='left'>
+                                                                       <select multiple='multiple' size='3' id='adv_global_item_form'>
+                                                                       </select>       
+                                                               </td>
+                                                       </tr>           
+                                                       <tr>
+                                                               <td align='right'>
+                                                                       <span>&advanced.item.type;</span>
+                                                                       <a id='adv_global_item_type_link_adv' class='classic_link adv_adv_link'
+                                                                               href='javascript:void(0);' onclick='
+                                                                               hideMe($("adv_global_item_type_basic"));
+                                                                               unHideMe($("adv_global_item_type"));
+                                                                               hideMe(this);
+                                                                               unHideMe($("adv_global_item_type_link_basic"));
+                                                                               '>&advanced.link;</a>
+               
+                                                                       <a id='adv_global_item_type_link_basic' class='hide_me classic_link adv_adv_link'
+                                                                               href='javascript:void(0);' onclick='
+                                                                               unHideMe($("adv_global_item_type_basic"));
+                                                                               hideMe($("adv_global_item_type"));
+                                                                               unHideMe($("adv_global_item_type_link_adv"));
+                                                                               hideMe(this);
+                                                                               '>&advanced.basic.link;</a>
+                                                               </td>
+               
+                                                               <td align='left'>
+                                                                       <select multiple='multiple' size='3' id='adv_global_item_type' class='hide_me'>
+                                                                       </select>       
+                                                                       <select multiple='multiple' size='3' id='adv_global_item_type_basic'>
+                                                                               <option value='at'>&opac.search.books;</option>
+                                                                               <option value='i'>&opac.search.audioBooks;</option>
+                                                                               <option value='g'>&opac.search.videoRecordings;</option>
+                                                                               <option value='j'>&opac.search.music;</option>
+                                                                               <option value='m'>&opac.search.electronic;</option>
+                                                                       </select>       
+                                                               </td>
+                                                       </tr>
+               
+                                                       <tr>
+                                                               <td align='right'>
+                                                                       <span>&advanced.literary.form;</span>
+                                                                       <a id='adv_global_lit_form_link_adv' class='classic_link adv_adv_link'
+                                                                               href='javascript:void(0);' onclick='
+                                                                               hideMe($("adv_global_lit_form_basic"));
+                                                                               unHideMe($("adv_global_lit_form"));
+                                                                               hideMe(this);
+                                                                               unHideMe($("adv_global_lit_form_link_basic"));
+                                                                               '>&advanced.link;</a>
+               
+                                                                       <a id='adv_global_lit_form_link_basic' class='hide_me classic_link adv_adv_link'
+                                                                               href='javascript:void(0);' onclick='
+                                                                               unHideMe($("adv_global_lit_form_basic"));
+                                                                               hideMe($("adv_global_lit_form"));
+                                                                               unHideMe($("adv_global_lit_form_link_adv"));
+                                                                               hideMe(this);
+                                                                               '>&advanced.basic.link;</a>
+                                                               </td>
+                                                               <td align='left'>
+                                                                       <select multiple='multiple' size='3' id='adv_global_lit_form' class='hide_me'>
+                                                                       </select>       
+                                                                       <select multiple='multiple' size='3' id='adv_global_lit_form_basic'>
+                                                                               <option value='0 '>&advanced.non.fiction;</option>
+                                                                               <option value='1'>&advanced.fiction;</option>
+                                                                       </select>       
+                                                               </td>
+                                                       </tr>
+               
+               
+                                                       <!-- Language selector -->
+                                                       <tr>
+                                                               <td align='right'>
+                                                                       <span>&advanced.language;</span>
+                                                               </td>
+               
+                                                               <td align='left'>
+                                                                       <select multiple='multiple' size='3' id='adv_global_lang'>
+                                                                               <!--#include virtual="../../../../../common/xml/item_lang_options.xml"-->
+                                                                       </select>
+                                                               </td>
+                                                       </tr>
+               
+                                                       <!-- Audience selector -->
+                                                       <tr>
+                                                               <td align='right'>
+                                                                       <span>&advanced.audience;</span>
+               
+                                                                       <a id='adv_global_audience_link_adv' class='classic_link adv_adv_link'
+                                                                               href='javascript:void(0);' onclick='
+                                                                               hideMe($("adv_global_audience_basic"));
+                                                                               unHideMe($("adv_global_audience"));
+                                                                               hideMe(this);
+                                                                               unHideMe($("adv_global_audience_link_basic"));
+                                                                               '>&advanced.link;</a>
+               
+                                                                       <a id='adv_global_audience_link_basic' class='hide_me classic_link adv_adv_link'
+                                                                               href='javascript:void(0);' onclick='
+                                                                               unHideMe($("adv_global_audience_basic"));
+                                                                               hideMe($("adv_global_audience"));
+                                                                               unHideMe($("adv_global_audience_link_adv"));
+                                                                               hideMe(this);'>&advanced.basic.link;</a>
+                                                               </td>
+               
+                                                               <td align='left'>
+                                                                       <select multiple='multiple' size='3' id='adv_global_audience' class='hide_me'>
+                                                                       </select>
+                                                                       <select multiple='multiple' size='3' id='adv_global_audience_basic'>
+                                                                               <option value='e '>&advanced.adult;</option>
+                                                                               <option value='abcdj'>&advanced.juvenile;</option>
+                                                                               <option value='fg '>&advanced.general;</option>
+                                                                       </select>
+                                                               </td>
+                                                       </tr>
+
+                            <tr>
+                                <td align='right'>
+                                    <span>&advanced.biblevel;</span>
+                                </td>
+                                <td align='left'>
+                                    <select multiple='multiple' size='3' id='adv_global_bib_level'>
+                                    </select>  
+                                </td>
+                            </tr>
+
+                            <tr>
+                                <td align='right'>
+                                    <span>&advanced.filter.pubyear;</span>
+                                </td>
+                                <td align='left'>
+                                    <select id='adv_global_pub_date_type' onchange='
+                                        if($("adv_global_pub_date_type").selectedIndex == 3)
+                                            unHideMe($("adv_global_pub_date_2_span"));
+                                        else
+                                            hideMe($("adv_global_pub_date_2_span"));'>
+                                        <option value='equals' selected='selected'>&advanced.filter.pubyear.equals;</option>
+                                        <option value='before'>&advanced.filter.pubyear.before;</option>
+                                        <option value='after'>&advanced.filter.pubyear.after;</option>
+                                        <option value='between'>&advanced.filter.pubyear.between;</option>
+                                    </select>  
+                                    <div style='margin-top:5px;'>
+                                        <input id='adv_global_pub_date_1' type='text' size='4' maxlength='4'/>
+                                        <span id='adv_global_pub_date_2_span' class='hide_me'>
+                                           &common.and; <input id='adv_global_pub_date_2' type='text' size='4' maxlength='4'/>
+                                        </span>
+                                    </div>
+                                </td>
+                            </tr>
+
+                            <!-- copy location selector -->
+                            <tr id='adv_copy_location_filter_row' class='hide_me'>
+                                <td align='right'>&opac.advanced.copy_loc_filter;</td>
+                                <td align='left' id='adv_copy_location_filter_td'>
+                                    <select size='3' id='adv_copy_location_filter_select' multiple='multiple'>
+                                    </select>
+                                </td>
+                            </tr>
+                                               </tbody>
+                                       </table>
+                               </div>
+                       </td>
+               </tr>   
+               <tr>
+                       <td>
+                               <div class='form-panels'>       
+                                       <table width='95%' align='center'>                                      
+                                               <thead>
+                                                       <tr>
+                                                               <td width='50%'><h2>&advanced.sort.criteria;</h2></td>
+                                                               <td><h2>&advanced.search.library;</h2></td>
+                                                       </tr>
+                                               </thead>                                        
+                                               <tbody>
+                                                       <tr>            
+                                                          <script language='javascript' type='text/javascript'>
+                                                                 function __setsortsel() {
+                                                                        var sel = $('adv_global_sort_by')
+                                                                                          if(sel.selectedIndex == 0) {
+                                                                                                  $("adv_global_sort_dir").disabled = true;
+                                                                                                  $("adv_global_sort_dir").selectedIndex = 0;
+                                                                                          } else $("adv_global_sort_dir").disabled = false;
+                                                                 }
+                                                          </script>
+                                                               <td align=''>
+                                                                       <select id='adv_global_sort_by' onchange='__setsortsel();'>
+                                                                               <option value='rel'>&advanced.relevance;</option>
+                                                                               <option value='title'>&common.title;</option>
+                                                                               <option value='author'>&common.author;</option>
+                                                                               <option value='pubdate'>&advanced.pubdate;</option>
+                                                                       </select>
+                                                               </td>
+                                                               <td align='center' width='100%' nowrap='nowrap'>
+                                                                       <b id='now_searching_location'> </b>
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <td>
+                                                                       <select id='adv_global_sort_dir' disabled='disabled'>
+                                                                               <option value='asc'>&advanced.sort.asc;</option>
+                                                                               <option value='desc'>&advanced.sort.desc;</option>
+                                                                       </select>
+                                                               </td>
+                                                          <!-- force the enable/disable sort dir code to run -->
+                                                          <script language='javascript' type='text/javascript'>__setsortsel();</script>
+                                                               <td align='center'>
+                                                                       <!--#include virtual="../common/libselect.xml"-->
+                                                               </td>
+                                                       </tr>
+                                                       <tr>
+                                                               <td align='center'>
+                                                                       <span>&advanced.frbrize;</span>
+                                                                       <input id='adv_group_titles' type='checkbox' />
+                                                               </td>
+                                                               <td align='center'>
+                                                                       <span>&result.limit2avail;</span>
+                                                                       <input type='checkbox' id='opac.result.limit2avail'/>
+                                                               </td>
+                                                       </tr>
+                                               </tbody>
+                                       </table>
+                               </div>
+                       </td>   
+               </tr>   
+               <tr>
+                       <td colspan='2'><input type='submit' onclick='advSubmitGlobal();' value='&advanced.search.submit;' class='submit'></input></td>
+               </tr>   
+       </table>
+</div>
diff --git a/Open-ILS/web/opac/skin/craftsman/xml/body.xml b/Open-ILS/web/opac/skin/craftsman/xml/body.xml
new file mode 100644 (file)
index 0000000..6a45f80
--- /dev/null
@@ -0,0 +1,51 @@
+<!--
+<body onload='init();' style='height: 100%; border: 2px solid black;'>
+-->
+<body onload='init();'>
+<div id='container'>
+       <div id='header'>
+               <table cellspacing='0' width='100%'>
+                       <tr>
+                               <td width='10%'><!--#include virtual="common/logo.xml"--></td>
+                               <td align='right' width='90%'>
+                                       <table cellspacing='0' width='100%'>
+                                               <tr>
+                                                       <td><!--#include virtual="common/fonts.xml"--></td>
+                                               </tr>
+                                               <!--#if expr="$OILS_PAGE!='advanced.xml'"-->
+                                               <tr>
+                                                       <td><!--#include virtual="common/searchbar.xml"--></td>
+                                               </tr>
+                                               <tr>
+                                                       <td><!--#include virtual="common/statusbar.xml"--></td>
+                                               </tr>
+                                               <!--#endif-->
+                                       </table>
+                               </td>
+                       </tr>
+               </table>
+       </div>
+       <div id='header-shadow'></div>
+       <table id='main-content'>
+               <tbody>
+                       <tr>
+                               <td id='main_left_cell'>
+                                       <div style='width: 300px;'>
+                                       <!--#include virtual="common/sidebar.xml"-->
+                                       </div>
+                               </td>
+                               <td id='main_right_cell'>
+                                       <div id='content' class=''>
+                                               <!--#include virtual="common/altcanvas.xml"-->
+                                               <!--#include virtual="common/ilsevents.xml"--> 
+                                               <!--#include virtual="page_${OILS_PAGE}"-->
+                                       </div>
+                                       <!--#include virtual="common/tips.xml"-->
+                               </td>
+                       </tr>
+               </tbody>
+       </table>
+       <div class='clear'></div>
+       <!--#include virtual='footer.xml'-->
+</div>
+</body>
diff --git a/Open-ILS/web/opac/skin/craftsman/xml/common/altcanvas.xml b/Open-ILS/web/opac/skin/craftsman/xml/common/altcanvas.xml
new file mode 100644 (file)
index 0000000..8f56680
--- /dev/null
@@ -0,0 +1,37 @@
+
+<!-- These are the UI components that may be needed on any given page.  The must be
+       set to class += 'hide_me' by default -->
+
+<div id='not_the_canvas' xmlns:xi="http://www.w3.org/2001/XInclude">
+
+       <!-- the login page -->
+       <!--#if expr="$FRONT_PAGE!='true'"-->
+               <!--#include virtual="login.xml"-->
+       <!--#endif-->
+
+       <!-- The org tree -->
+       <!--#include virtual="orgtree.xml"-->
+
+       <!-- ============================================================================= -->
+       <!-- Register the alternate canvases  -->
+       <script language='javascript' type='text/javascript'>
+               config.ids.altcanvas.org_tree           = config.ids.common.org_container;
+               config.ids.altcanvas.holds                      = 'holds_box';
+               config.ids.altcanvas.check_holds        = 'check_holds_box';
+               config.ids.altcanvas.xulholds           = 'xulholds_box';
+               config.ids.altcanvas.loading            = 'loading_alt';
+               //config.ids.altcanvas.cnbrowse         = 'cn_browse';
+       </script>
+
+       <!--#if expr="$FRONT_PAGE!='true'"-->
+               <!--#include virtual="holds.xml"-->
+               <!-- #include virtual="cn_browse.xml"-->
+       <!--#endif-->
+
+       <div id='loading_alt' class='hide_me canvas' style='margin-top: 6px;'>
+               <div style='margin-top: 30px; margin-bottom: 30px; text-align: center; font-weight: 700;'>
+                       <img src='../../../../images/progressbar_green.gif' style='margin: 5px;' />
+               </div>
+       </div>
+
+</div>
diff --git a/Open-ILS/web/opac/skin/craftsman/xml/common/cn_browse.xml b/Open-ILS/web/opac/skin/craftsman/xml/common/cn_browse.xml
new file mode 100644 (file)
index 0000000..65bef64
--- /dev/null
@@ -0,0 +1,36 @@
+<div id='cn_browse' class='hide_me details-base'>
+       <div id='cn_browse_loading'  class='cn_browse_loading hide_me'>&common.cn.loading;</div>
+       <div id='cn_browse_div'> 
+       
+               <div class='tips-bottom-box' style='margin-bottom: 10px;'>
+                       <span>&common.cn.browsing;</span><b style='margin-left: 6px;' id='cn_browse_where'> </b>
+               </div>
+               <table class='details-datagrid'>
+               <!-- class = data_grid bookshelf -->
+                       <thead>
+                               <tr>
+                                       <td><a id='cn_browse_next' class='classic_link' href='javascript:cnBrowsePrev();'><b>&common.cn.previous;</b></a></td>
+                                       <td colspan='1' align='center'>&common.cn.shelf;</td>
+                                       <td align='right'><a id='cn_browse_prev' class='classic_link' href='javascript:cnBrowseNext();'><b>&common.cn.next;</b></a></td>
+                               </tr>
+                       </thead>
+                       <tbody id='cn_tbody'>
+                               <tr id='cn_browse_row'>
+                                       <td id='cn_browse_td' class='cn_browse_item' width='25%' valign='top' style='border: 1px solid #ccc;'>
+                                               <table>
+                                                       <tr>
+                                                               <td valign='top'><a style='display: block; border: 1px solid #ddd; background: #efefef; padding: 1px;'><img height='60' width='50' class='cn_browse_info' name='cn_browse_pic' border='0' style='border: 1px solid #ddd; background: #efefef;' /></a></td>
+                                                               <td valign='top'>
+                                                               <div class='cn_browse_info' name='cn_browse_cn' style='font-weight: bold; border: 0; padding: 1px;'>  </div>
+                                                               <div class='cn_browse_info' style='border: 0; padding: 1px;'><a name='cn_browse_title' class='classic_link'> </a></div>
+                                                               <div class='cn_browse_info' style='border: 0; padding: 1px;'><a name='cn_browse_author' class='classic_link'>  </a></div>
+                                                               <div class='cn_browse_info' style='border: 0; padding: 1px;' name='cn_browse_lib'>  </div>
+                                                               </td>
+                                                       </tr>
+                                               </table>
+                                       </td>
+                               </tr>
+                       </tbody>
+               </table>
+       </div>
+</div>
diff --git a/Open-ILS/web/opac/skin/craftsman/xml/common/css_common.xml b/Open-ILS/web/opac/skin/craftsman/xml/common/css_common.xml
new file mode 100644 (file)
index 0000000..02ac8b5
--- /dev/null
@@ -0,0 +1,26 @@
+<!-- CSS shared across pages goes here --> 
+
+<link type='text/css' rel='stylesheet' href="<!--#echo var='OILS_SKIN_BASE'-->/craftsman/css/layout.css"/>
+<link type='text/css' rel='stylesheet' href="<!--#echo var='OILS_SKIN_BASE'-->/craftsman/css/default.css"/>
+
+<!-- Our font CSS's -->
+<link type='text/css' rel='stylesheet' href='<!--#echo var="OILS_CSS_BASE"-->/mediumfont.css' />
+
+<!-- Our colors -->
+<link type='text/css' rel="stylesheet" href="<!--#echo var='OILS_THEME_BASE'-->/craftsman/css/colors.css" />
+
+<!-- An alternate stylesheet -->
+<link type='text/css' rel="alternate stylesheet" title='&opac.style.reddish;' href="<!--#echo var='OILS_THEME_BASE'-->/reddish/css/colors.css" />
+
+<!-- OpenSearch auto discovery -->
+<link type="application/opensearchdescription+xml"
+       rel='search' title="Evergreen"
+       href="http://<!--#echo var='SERVER_NAME'-->/opac/extras/opensearch/1.1/-/osd.xml" />
+<link type='text/css' rel="alternate stylesheet" title='&opac.style.reddish;' href="<!--#echo var='OILS_THEME_BASE'-->/reddish/css/colors.css" />
+
+<!-- enable Dojo date picker -->
+<style type="text/css">
+       @import '/js/dojo/dojo/resources/dojo.css';
+       @import '/js/dojo/dijit/themes/tundra/tundra.css';
+       @import '/js/dojo/dijit/themes/tundra/tundra_rtl.css';
+</style>
diff --git a/Open-ILS/web/opac/skin/craftsman/xml/common/fonts.xml b/Open-ILS/web/opac/skin/craftsman/xml/common/fonts.xml
new file mode 100644 (file)
index 0000000..43c200f
--- /dev/null
@@ -0,0 +1,28 @@
+<div id='text_size_div'>
+       <ul>
+               <!--<li><span>&common.textsize.title;</span></li>-->
+               <li><span>Text: </span></li>
+               <li class='btn'>
+                       <a href="javascript:void(0);" onclick="setFontSize('large');" title='&common.textsize.large;'>Larger</a> |
+                       <a href="javascript:void(0);" onclick="setFontSize('regular');" title='&common.textsize.regular;'>Smaller</a>
+                   <span style='vertical-align: top;'>&nbsp;<span style="font-weight:bold;">|</span>&nbsp;</span>
+               </li>
+        <li>
+                   <span style='vertical-align: top;'>&common.language;</span>
+            <span id='translation_switch' dojoType="dijit.form.FilteringSelect" store="openils.I18N.localeStore"
+                searchAttr="label" required="false" jsId='opacLocaleSelector'>
+                <script>
+                    dojo.addOnLoad(function() {
+                        opacLocaleSelector.setValue(locale);
+                        dojo.connect(opacLocaleSelector, 'onChange', 
+                            function () {
+                                location.href = location.href.replace(/opac\/[^\/]+\/skin/, 'opac/' + this.getValue() + '/skin');
+                            }
+                        );
+                    });
+                </script>
+            </span>
+        </li>
+       </ul>
+       <div class='clear'></div>
+</div>
diff --git a/Open-ILS/web/opac/skin/craftsman/xml/common/holds.xml b/Open-ILS/web/opac/skin/craftsman/xml/common/holds.xml
new file mode 100644 (file)
index 0000000..8f30ea2
--- /dev/null
@@ -0,0 +1,242 @@
+<link rel="stylesheet" type="text/css"
+    href='<!--#echo var="OILS_JS_BASE"-->/jscalendar/calendar-brown.css' title="win2k-cold-1" />
+<script language='javascript' type='text/javascript' src='<!--#echo var="OILS_JS_BASE"-->/jscalendar/calendar.js'></script>
+<script language='javascript' type='text/javascript' src='<!--#echo var="OILS_JS_BASE"-->/jscalendar/lang/calendar-en.js'></script>
+<script language='javascript' type='text/javascript' src='<!--#echo var="OILS_JS_BASE"-->/jscalendar/calendar-setup.js'></script>
+<script language='javascript' type='text/javascript' src='<!--#echo var="OILS_OPAC_JS_HOST"-->/common/js/DP_DateExtensions.js'></script>
+
+<div>
+       <div id='xulholds_box' class='hide_me canvas' style='margin-top: 6px;'>
+               <center>
+                       <table class='data_grid' style='margin-top: 20px;'>
+                               <tbody>
+                                       <tr>
+                                               <td>&opac.holds.xulRecipient;:</td>
+                                               <td><input type='text' id='xul_recipient_barcode' /></td>
+                                               <td><input type='submit' value='&common.submit;' id='xul_recipient_barcode_submit' /></td>
+                                               <td><input type='submit' value='&common.cancel;' onclick='showCanvas();' /></td>
+                                               <td><input type='submit' value='&common.hold.place;' id='xul_recipient_me' /></td>
+                                       </tr>
+                               </tbody>
+                       </table>
+               </center>
+       </div>
+
+       <div id='check_holds_box' class='hide_me canvas' 
+               style='margin-top: 6px; width: 100%; text-align: center'>
+               <br/><br/><br/>
+               <b>&common.hold.check;</b>
+       </div>
+
+       <div id='holds_box' class='hide_me details-grid'>
+               <table>
+                       <tbody>
+                               <tr>
+                                       <td class='holds_cell' colspan='2' style='padding: 10px 0 0 5px; margin: 0; vertical-align: middle'>
+                                               <div class='detailsinfo-box'>
+                                                       <h3>&common.hold.create;</h3>
+                                               </div>
+                                       </td>
+                               </tr>
+                               <tr>
+                                       <td class='holds_cell'>&opac.holds.recipient;:</td>
+                                       <td class='holds_cell' id='holds_recipient'> </td>
+                               </tr>
+                               <tr>
+                                       <td class='holds_cell'>&common.title.label;</td>
+                                       <td class='holds_cell' id='holds_title'> </td>
+                               </tr>
+                               <tr>
+                                       <td class='holds_cell'>&common.author;</td>
+                                       <td class='holds_cell' id='holds_author'> </td>
+                               </tr>
+                               <tr>
+                                       <td class='holds_cell'>&common.format;</td>
+                                       <td class='holds_cell' id='holds_format'> </td>
+                               </tr>
+                               <tr id='hold_physical_desc_row'>
+                                       <td class='holds_cell'>&common.physical.label;</td>
+                                       <td class='holds_cell' id='holds_physical_desc'> </td>
+                               </tr>
+
+                               <tr class='hide_me' id='holds_cn_row'>
+                                       <td class='holds_cell'>&common.call.number.label;</td>
+                                       <td class='holds_cell'><b id='holds_cn'/> </td>
+                               </tr>
+
+                               <tr class='hide_me' id='holds_copy_row'>
+                                       <td class='holds_cell'>&common.copy.barcode.label;</td>
+                                       <td class='holds_cell'><b id='holds_copy'/> </td>
+                               </tr>
+
+                               <tr class='hide_me' id='holds_type_row'>
+                                       <td class='holds_cell'>&common.hold.type.label;</td>
+                                       <td class='holds_cell hide_me' id='holds_is_cn'><b>&common.hold.volume;</b></td>
+                                       <td class='holds_cell hide_me' id='holds_is_copy'><b>&common.hold.copy;</b></td>
+                               </tr>
+
+                               <tr>
+                                       <td class='holds_cell'>&opac.holds.contactPhone;:</td>
+                                       <td class='holds_cell'>
+                                               <input id='holds_phone' size='13' maxlength='12'/>
+                                               <span style='margin-left: 4px; font-size: 7pt;'>&common.phone.format;</span>
+                                       </td>
+                               </tr>
+                               <tr>
+                                       <td class='holds_cell'>&common.phone.enable;</td>
+                                       <td class='holds_cell'>
+                                               <input type='checkbox' id='holds_enable_phone'  checked='checked'
+                                                       onchange='
+                                                               if (this.checked) $("holds_phone").disabled=false; 
+                                                               else $("holds_phone").disabled = true;'/>
+                                       </td>
+                               </tr>
+
+                               <tr>
+                                       <td class='holds_cell'>&opac.holds.contactEmail;:</td>
+                                       <td class='holds_cell' id='holds_email'> 
+                        <span class='hide_me' id='holds.no_email'>
+                           &common.email.none;<br/>
+                           &common.email.set;
+                        </span>
+                        <span class='hide_me' id='holds.no_email.xul'>
+                           &common.email.none; 
+                        </span>
+
+                    </td>
+                               </tr>
+                               <tr>
+                                       <td class='holds_cell'>&common.email.enable;</td>
+                                       <td class='holds_cell'>
+                                               <input type='checkbox' id='holds_enable_email' checked='checked'/>
+                                       </td>
+                               </tr>
+                               <!--
+                               <tr id='holds_depth_selector_row' class='hide_me'>
+                                       <td class='holds_cell'>Hold Range</td>
+                                       <td class='holds_cell'>
+                                               <select id='holds_depth_selector'></select>
+                                       </td>
+                               </tr>
+                               -->
+                               <tr>
+                                       <td class='holds_cell'>&opac.holds.pickupLocation;</td>
+                                       <td class='holds_cell'>
+                                               <select id='holds_org_selector'> </select>
+                                       </td>
+                               </tr>
+
+                               <tr>
+                                       <td class='holds_cell'>&opac.holds.expire_time;</td>
+                                       <td class='holds_cell'>
+                        <input dojoType="dijit.form.DateTextBox" size='10' maxlength='10' id='holds_expire_time' />
+                                       </td>
+                               </tr>
+
+                <tr>
+                    <td class='holds_cell'>
+                        &opac.holds.freeze;
+                        <a class='classic_link' href='javascript:alert("&opac.holds.freeze.help;");'>&common.help;</a>
+                        </td>
+                    <td class='holds_cell'>
+                        <input type='checkbox' id='holds_frozen_chkbox' 
+                            onchange='
+                                if($("holds_frozen_chkbox").checked) 
+                                    unHideMe($("hold_frozen_thaw_row"));
+                                else
+                                    hideMe($("hold_frozen_thaw_row"));
+                            ' /> 
+                    </td>
+                </tr>
+
+                <tr id='hold_frozen_thaw_row' class='hide_me'>
+                    <td class='holds_cell'>
+                        <script language='javascript' type='text/javascript'> if($('holds_frozen_chkbox').checked) unHideMe($("hold_frozen_thaw_row"));</script>
+                        &opac.holds.freeze.thaw_date;
+                    </td>
+                    <td class='holds_cell'>
+                        <input dojoType="dijit.form.DateTextBox" size='10' maxlength='10' id='holds_frozen_thaw_input' />
+                    </td>
+                </tr>
+
+                               <tr id='holds_alt_formats_row_extras' class='hide_me'>
+                                       <td colspan='2' align='center'>
+                                               <div class='detailsinfo-box'>
+                                                               <a class='classic_link' href='javascript:void(0);'
+                                                               onclick='unHideMe($("holds_alt_formats_row"));'>&common.hold.advanced;</a>
+                                               </div>
+                                       </td>
+                               </tr>
+
+                               <tr id='holds_alt_formats_row' class='hide_me'>
+
+                                       <td class='holds_cell'>
+                                               <div style='margin-bottom: 5px;'>
+                                                       <span>&common.format.alternatives; </span>
+                                                       <span> <a class='classic_link' style='color:red;' href='javascript:void(0);' 
+                                                               onclick='alert($("holds_explain_adv").innerHTML)'>&common.help;</a></span>
+                                               </div>
+                                               <div>&common.control.click;</div>
+                                       </td>
+
+                                       <td class='holds_cell'>
+                                               <select id='hold_alt_form_selector' multiple='multiple' style='width: 14em;'>
+                                                       <option value='at'      class='hide_me'>&opac.search.books;</option>
+                                                       <option value='at-d' class='hide_me'>&opac.search.largePrint;</option>
+                                                       <option value='i'               class='hide_me'>&opac.search.audioBooks;</option>
+                                                       <option value='g'               class='hide_me'>&opac.search.videoRecordings;</option>
+                                                       <option value='j'               class='hide_me'>&opac.search.music;</option>
+                                               </select>
+                                       </td>
+                               </tr>
+
+                               <tr>
+                                       <td>&nbsp;</td>
+                                       <td class='holds_cell'>
+                                               <button id='holds_submit'>&opac.holds.placeHold;</button>
+                                               <button class='hide_me' id='holds_update'>&common.hold.update;</button>
+                                               <span style='padding: 20px;'> </span>
+                                               <button id='holds_cancel'>&common.cancel;</button>
+                                       </td>
+                               </tr>
+                       </tbody>
+               </table>
+       
+               <div class='hide_me' id='holds_success'>&opac.holds.success;</div>
+               <div class='hide_me' id='holds_failure'>&opac.holds.failure;</div>
+               <span class='hide_me' id='holds_bad_phone'>
+                       &common.phone.format.help;
+               </span>
+
+               <span class='hide_me' id='hold_not_allowed'>
+                       &common.hold.failed;
+               </span>
+
+       </div>
+
+       <span class='hide_me' id='format_words'>
+               <span name='at'>&opac.search.books;</span>
+               <span name='at-d'>&opac.search.largePrint;</span>
+               <span name='i'>&opac.search.audioBooks;</span>
+               <span name='g'>&opac.search.videoRecordings;</span>
+               <span name='j'>&opac.search.music;</span>
+               <span name='m'>&opac.search.electronic;</span>
+       </span>
+
+       <span class='hide_me' id='holds_explain_adv'>&holds.advanced_options;</span>
+
+       <span class='hide_me' id='holds_pick_good_org'>&common.hold.delivery;</span>
+
+       <span class='hide_me' id='hold_dup_exists'>&common.hold.exists;</span>
+
+       <span class='hide_me' id='hold_dup_exists_override'>&common.hold.exists.override;</span>
+
+       <span id='hold_failed_patron_barred' class='hide_me'>&common.hold.barred;</span>
+
+       <span id='invalid_hold' class='hide_me'>&common.hold.item.invalid;</span>
+
+       <span id='holds_invalid_recipient' class='hide_me'>&common.hold.patron.invalid;</span>
+
+</div>
+
+
diff --git a/Open-ILS/web/opac/skin/craftsman/xml/common/libselect.xml b/Open-ILS/web/opac/skin/craftsman/xml/common/libselect.xml
new file mode 100644 (file)
index 0000000..9975c4e
--- /dev/null
@@ -0,0 +1,15 @@
+<span>
+       <script language='javascript' type='text/javascript' src='<!--#echo var="OILS_OPAC_JS_HOST"-->/skin/default/js/depth_selector.js'></script>
+       <span id='depth_selector_span'>
+               <!--#if expr="$SHOW_DEPTHSEL_TEXT='true'"-->
+               <span>&library.select; </span>
+               <!--#endif-->
+               <select id='depth_selector' >
+                       <option value='new'>&library.select.label;</option>
+               </select>
+       </span>
+       <span class='hide_me' id='lib_selector_span'>
+               <a id='lib_selector_link' class='classic_link' href='javascript:void(0)' title='&library.select.help;'></a>
+       </span>
+</span>
+
diff --git a/Open-ILS/web/opac/skin/craftsman/xml/common/login.xml b/Open-ILS/web/opac/skin/craftsman/xml/common/login.xml
new file mode 100644 (file)
index 0000000..f955e6c
--- /dev/null
@@ -0,0 +1,107 @@
+
+<div id='login_box' class='login-box hide_me' style='margin-top: 6px; border: 0; width: 100%;'>
+
+       <script language='javascript' type='text/javascript'>
+               config.ids.login = {};
+               config.css.login = {};
+               config.ids.login.box                    = "login_box";
+               config.ids.login.username       = "login_username";
+               config.ids.login.password       = "login_password";
+               config.ids.login.button         = "login_button";
+               config.ids.login.cancel         = "login_cancel_button";
+               config.ids.altcanvas.login                      = config.ids.login.box;
+       </script>
+
+       <div class='form-panels'>
+               <h2><span>&opac.login.login;</span></h2>
+               
+               <table id='login_table'>
+                       <tbody>
+                               <tr>
+                                       <td style='vertical-align: middle;'><span style='font-size: 12px; font-family: Verdana, Arial, Helvetica, sans-serif;'>&login.username;</span></td>
+                                       <td>
+                                               <span class='login_text'>
+                                                       <input id='login_username' type='text' style='width: 220px; font-size: 12px; font-family: Verdana, Arial, Helvetica, sans-serif; padding: 4px; height: 1%;' />
+                                               </span>
+                                       </td>
+                               </tr>
+                               <tr>
+                                       <td style='vertical-align: middle;'>
+                                               <span style='font-size: 12px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; font-family: Verdana, Arial, Helvetica, sans-serif;'>&common.password;</span>
+                                       </td>
+                                       <td>
+                                               <span class='login_text'>
+                                                       <input id='login_password' type='password' style='width: 220px; font-size: 12px; font-family: Verdana, Arial, Helvetica, sans-serif; padding: 4px; height: 1%;' />
+                                               </span>
+                                       </td>
+                               </tr>
+                               <tr>
+                                       <td></td>
+                                       <td>
+                                               <span class='login_text' style='margin-right: 20px;'>
+                                               <input type='submit' value='&common.login;'  id='login_button'/>
+                                               </span>
+                                               <span class='login_text' style='margin-left: 20px;'>
+                                                       <input type='submit' id='login_cancel_button' value='&common.cancel;'/>
+                                               </span>
+                                       </td>
+                               </tr>
+                       </tbody>
+               </table>
+
+               <table id='change_pw_table' class='hide_me'>
+                       <thead>
+                               <tr><td colspan='2' align='center'><b>&login.password;</b></td></tr>
+                       </thead>
+                       <tbody>
+       
+                               <tr>
+                                       <td colspan='2'>
+                                               <div class='info'>
+                                                       &login.first.time;
+                                                       &common.password_criteria;
+                                               </div>
+                                       </td>
+                               </tr>
+       
+                               <tr>
+                                       <td>&login.password.current.enter;</td>
+                                       <td><input type='password' id='change_pw_current' style='width: 220px;' /></td>
+                               </tr>
+       
+                               <tr>
+                                       <td>&login.password.new.enter;</td>
+                                       <td><input type='password' id='change_pw_1' style='width: 220px;' /></td>
+                               </tr>
+                               <tr>
+                                       <td>&login.password.new.reenter;</td>
+                                       <td><input type='password' id='change_pw_2' style='width: 220px;' /></td>
+                               </tr>
+                               <tr>
+                                       <td></td>
+                                       <td>
+                                               <span class='login_text' style='margin-right: 20px;'>
+                                                       <input type='submit' value='&login.password.update;'  id='change_pw_button'/>
+                                               </span>
+                                       </td>
+                               </tr>
+                       </tbody>
+               </table>
+       </div>
+       <span id='pw_no_match' class='hide_me'>&login.password.nomatch;</span>
+       <span id='pw_update_successful' class='hide_me'>&login.password.success;</span>
+
+       <span id='pw_not_strong' class='hide_me'>
+               &login.password.strength;
+               &common.password_criteria;
+       </span>
+
+       <span id='patron_card_inactive_alert' class='hide_me'>&login.barcode.inactive;</span>
+
+       <span id='patron_inactive_alert' class='hide_me'>&login.account.inactive;</span>
+
+       <span id='patron_login_failed' class='hide_me'>&login.failed;</span>
+
+</div>
+
+
diff --git a/Open-ILS/web/opac/skin/craftsman/xml/common/logo.xml b/Open-ILS/web/opac/skin/craftsman/xml/common/logo.xml
new file mode 100644 (file)
index 0000000..27a8de5
--- /dev/null
@@ -0,0 +1,2 @@
+<script language='javascript' type='text/javascript'>config.ids.common.top_logo = "top_left_logo";</script>
+<img src='<!--#echo var="OILS_BASE"-->/images/logo.gif' alt='' class='logo' />
diff --git a/Open-ILS/web/opac/skin/craftsman/xml/common/orgtree.xml b/Open-ILS/web/opac/skin/craftsman/xml/common/orgtree.xml
new file mode 100644 (file)
index 0000000..629fb53
--- /dev/null
@@ -0,0 +1,23 @@
+
+<!-- the org tree -->
+<div id='org_container' class='hide_me' style='padding: 8px 13px 8px 8px;'>
+
+       <div id='org_link_container' class='search-toolbar'>
+               <ul>
+                       <li><a class='expandall-btn' onclick='orgTreeSelector.expandAll();' href='javascript:void(0);'>&common.org.openAll;</a></li>
+                       <li><a class='closeall-btn' onclick='orgTreeSelector.closeAll();' href='javascript:void(0);'>&common.org.closeAll;</a></li>
+                       <li><a class='cancel-btn' onclick='showCanvas();' href='javascript:void(0);'>&common.org.cancel;</a></li>
+               </ul>
+               <div class='clear'></div>
+       </div>
+
+       <div id='org_loading_div'><br/><span>&common.org.loading;</span></div>
+       
+       <br/>
+       <div id='org_selector_tip' class='tips_box hide_me'><b>&common.org.note;</b>
+               <span>&common.org.notetext;</span>
+       </div>
+       <br/>
+       <div id='org_tree' class='org_tree_container'> </div>
+       <br/>
+</div>
diff --git a/Open-ILS/web/opac/skin/craftsman/xml/common/searchbar.xml b/Open-ILS/web/opac/skin/craftsman/xml/common/searchbar.xml
new file mode 100644 (file)
index 0000000..94669e8
--- /dev/null
@@ -0,0 +1,34 @@
+<!-- Searchbar for doing metarecord searches -->
+<div id='searchbar' align='right'>
+       <!-- load my js -->
+       <script language='javascript' type='text/javascript'>
+               config.ids.searchbar = {};
+               config.css.searchbar = {};
+               config.ids.searchbar.text                       = 'search_box'; 
+               config.ids.searchbar.submit                     = 'search_submit';      
+               config.ids.searchbar.type_selector      = 'search_type_selector';
+               config.ids.searchbar.depth_selector     = 'depth_selector';
+               config.ids.searchbar.form_selector      = 'form_selector';
+               config.ids.searchbar.extra_row          = 'searchbar_extra';
+               config.ids.searchbar.main_row           = 'searchbar_main_row';
+               config.ids.searchbar.table                      = 'searchbar_table';
+               config.ids.searchbar.location_tag       = 'search_location_tag_link';
+               config.ids.searchbar.lib_sel_span       = 'lib_selector_span';
+               config.ids.searchbar.lib_sel_link       = 'lib_selector_link';
+               config.ids.searchbar.depth_sel_span     = 'depth_selector_span';
+       </script>
+    <style>
+        #searchbar-options-table td {padding:0px 1px 0px 1px;}
+    </style>
+       <table align='right' id='searchbar-options-table'>
+               <tr>
+                       <td><input id='search_box' type='text' class='input' /></td>
+                       <td><input type='submit' id='search_submit' value='Search' title='&button.go;' class='submit' /></td>
+                       <td><!--<span>&common.type;: </span>--><!--#include virtual="stypes_selector.xml"--></td>
+                       <td><!--#set var='FORM_SEL_ID' value='form_selector'--></td>
+                       <td><!--#include virtual="format_selector.xml"--></td>
+                       <td><!--#include virtual="libselect.xml"--></td>
+               </tr>
+       </table>
+       <script language='javascript' type='text/javascript' src='<!--#echo var="OILS_OPAC_JS_HOST"-->/skin/default/js/search_bar.js'></script>
+</div>
diff --git a/Open-ILS/web/opac/skin/craftsman/xml/common/sidebar.xml b/Open-ILS/web/opac/skin/craftsman/xml/common/sidebar.xml
new file mode 100644 (file)
index 0000000..846db3b
--- /dev/null
@@ -0,0 +1,174 @@
+
+<!-- Navigation bar -->
+
+<div id="sidebar_div" xmlns:xi="http://www.w3.org/2001/XInclude">
+
+       <div id='main-left-menu'>
+               <ul>
+                       <li title="&navigate.home.title;" id='home_link_div'><a class='home-btn' id='home_link' href='index.xml'>&navigate.home;</a></li>
+                       <li title="&opac.navigate.advanced.title;" id='advanced_link_div'><a class='advancedsearch-btn' id='advanced_link' href='advanced.xml'>&opac.navigate.advanced;</a></li>
+                       <li title="&navigate.myopac.title;" id='myopac_link_div'><a class='account-btn' id='myopac_link' href='myopac/myopac.xml'>&navigate.myopac;</a></li>
+                       <li title="&navigate.login.title;" id='login_link_div'><a class='login-btn' id='login_link' href='javascript:void(0);'>&navigate.login;</a></li>
+                       <!--Hide Me Section-->
+                       <li title="&navigate.logout.title;" id='logout_link_div' class="hide_me"><a class='logout-btn' id='logout_link' href='javascript:void(0);'>&navigate.logout;</a></li>
+                       <li title="&navigate.loggedinas.title;" id='logged_in_as_div' class="hide_me"><span class='loginas-btn'>&navigate.loggedinas;<b id='username_dest'> </b></span></li>
+                       <li title="&navigate.titleGroupResults;" id='mresult_link_div' class="hide_me"><a id='sidebar_title_group_results'>&navigate.titleGroupResults;</a></li>
+                       <li title="&navigate.titleResults;" id='result_link_div' class="hide_me"><a class='title-btn' id='sidebar_title_results'>&navigate.titleResults;</a></li>
+                       <li title="&navigate.record.details;" id='rdetail_link_div' class="hide_me"><span class='titledetails-btn'>&navigate.title.details;</span></li>
+               </ul>
+               
+               <div id='main-left-menu'>
+                       <div id='subject_tree_sidebar' class='subject_sidebar hide_me'> 
+                               <div id='subject_sidebar_tree_div'> </div>
+                               <script language='javascript' type='text/javascript'>
+                                       removeChildren($('subject_sidebar_tree_div'));
+                                       var subjectSidebarTree = new SlimTree(
+                                               document.getElementById('subject_sidebar_tree_div'),
+                                               'subjectSidebarTree', '../../../../images/subject-icon-u.gif');
+                                       subjectSidebarTree.addNode( 'subjectSidebarTreeRoot', -1, 
+                                               "&sidebar.relevantSubjects.headerLabel;", 
+                                               'javascript:subjectSidebarTree.toggle(' +
+                                                       '"subjectSidebarTreeRoot");');
+                               </script>
+                       </div>                  
+                       <div id='author_tree_sidebar' class='author_sidebar hide_me'> 
+                               <div id='author_sidebar_tree_div'> </div>
+                               <script language='javascript' type='text/javascript'>
+                                       removeChildren($('author_sidebar_tree_div'));
+                                       var authorSidebarTree = new SlimTree(
+                                               document.getElementById('author_sidebar_tree_div'),
+                                               'authorSidebarTree','../../../../images/relevant-icon-u.gif');
+                                       authorSidebarTree.addNode( 'authorSidebarTreeRoot', -1, 
+                                               "&sidebar.relevantAuthors.headerLabel;", 
+                                               'javascript:authorSidebarTree.toggle(' +
+                                                       '"authorSidebarTreeRoot");');
+                               </script>
+                       </div>                  
+                       <div id='series_tree_sidebar' class='series_sidebar hide_me'> 
+                               <div id='series_sidebar_tree_div'> </div>
+                               <script language='javascript' type='text/javascript'>
+                                       removeChildren($('series_sidebar_tree_div'));
+                                       var seriesSidebarTree = new SlimTree(
+                                               document.getElementById('series_sidebar_tree_div'),
+                                               'seriesSidebarTree',
+                                               '../../../../images/series-icon-u.gif');
+                                       seriesSidebarTree.addNode( 'seriesSidebarTreeRoot', -1, 
+                                               "&sidebar.relevantSeries.headerLabel;", 
+                                               'javascript:seriesSidebarTree.toggle(' +
+                                                       '"seriesSidebarTreeRoot");');
+                               </script>
+                       </div>
+               </div>
+       </div>
+
+
+       <div id='main-left-search'>
+       
+               <div id='adv_quick_search_sidebar' class='sidebar_chunk hide_me'> 
+                       <div id='adv_quick_search'>
+                               <h2>&sidebar.quick.search;</h2>
+                               <div class='content'>
+                                       <table>
+                                               <tbody>
+                                                       <tr>
+                                                               <td>
+                                                                       <select id='adv_quick_type' style='width: 6em;'>
+                                                                               <option value='isbn'>&opac.advanced.quick.isbn;</option>
+                                                                               <option value='issn'>&opac.advanced.quick.issn;</option>
+                                                                               <option value='cn'>&opac.advanced.quick.cn;</option>
+                                                                               <option value='lccn'>&opac.advanced.quick.lccn;</option>
+                                                                               <option value='tcn'>&opac.advanced.quick.tcn;</option>
+                                                                               <option value='barcode'>&opac.advanced.quick.barcode;</option>
+                                                                       </select>
+                                                               </td>
+                                                               <td><input type='text' id='adv_quick_text' size='16' /></td>
+                                                       </tr>
+                                               </tbody>
+                                       </table>
+                               </div>
+                               <div class='buttons'>
+                                       <a id='adv_quick_submit' href='javascript:advGenericSearch();'>&common.submit;</a>
+                               </div>
+       
+                               <span class='hide_me' id='myopac.copy.not.found'>&sidebar.copy.not.found;</span>
+                       </div>
+               </div>
+
+               <div id='adv_marc_search_sidebar' class='sidebar_chunk hide_me'>
+                       <h2>&search.marc;</h2>
+                       <div class='content'>
+                               <table id='adv_sdbar_table'>
+                                       <tbody>
+                                               <tr>
+                                                       <td>&search.marc.tag;</td>
+                                                       <td><input name='advanced.marc.tag' maxlength='3' size='3' /></td>
+                                                       <td>&search.marc.subfield;</td>
+                                                       <td><input name='advanced.marc.subfield' maxlength='1' size='1' /></td>
+                                               </tr>
+                                               <tr>
+                                                       <td>&search.marc.value;</td>
+                                                       <td colspan='3'><input name='advanced.marc.value' size='18' /></td>
+                                               </tr>
+                                               <tr name='crow' class='hide_me'>
+                                                       <td colspan='4' align='center'>
+                                                       <a href='javascript:void(0);' class='classic_link'
+                                                               onclick='
+                                                                       var div = $("adv_marc_search_sidebar");
+                                                                       if( div.getElementsByTagName("table").length > 1 )
+                                                                               div.removeChild(this.parentNode.parentNode.parentNode.parentNode);'>&common.close;</a>
+                                                       </td>
+                                               </tr>                                                                           
+                                       </tbody>
+                               </table>
+                       </div>
+                       <div id='adv_marc_submit' class='buttons '>
+                               <a href='javascript:advAddMARC();'>&search.marc.add.row;</a>
+                               <a href='javascript:advMARCRun();'>&common.submit;</a>
+                       </div>
+               </div>
+       
+       </div>
+
+
+       <!-- ============================================================================= -->
+       <!-- Our javascript -->
+       <script language='javascript' type='text/javascript' src='<!--#echo var="OILS_OPAC_JS_HOST"-->/skin/default/js/sidebar.js'></script>
+
+       <script language='javascript' type='text/javascript'>
+               config.ids.sidebar = {};
+               config.css.sidebar = {};
+               config.names.sidebar = {};
+               config.css.sidebar.item = {};
+               config.ids.sidebar.home                         = 'home_link_div';
+               config.ids.sidebar.advanced             = 'advanced_link_div';
+               config.ids.sidebar.myopac                       = 'myopac_link_div';
+               config.ids.sidebar.prefs                        = 'prefs_link_div';
+               config.ids.sidebar.mresult                      = 'mresult_link_div';
+               config.ids.sidebar.rresult                      = 'result_link_div';
+               config.ids.sidebar.rdetail                      = "rdetail_link_div"; 
+               config.ids.sidebar.login                        = 'login_link';
+               config.ids.sidebar.logout                       = 'logout_link';
+               config.ids.sidebar.logoutbox            = 'logout_link_div';
+               config.ids.sidebar.loginbox             = 'login_link_div';
+               config.ids.sidebar.logged_in_as = 'logged_in_as_div';
+               config.ids.sidebar.username_dest        = 'username_dest';
+               config.ids.sidebar.subject                      = 'subject_sidebar';
+               config.ids.sidebar.subject_item = 'subject_item';
+               config.ids.sidebar.author                       = 'author_sidebar';
+               config.ids.sidebar.author_item  = 'author_item';
+               config.ids.sidebar.series                       = 'series_sidebar';
+               config.ids.sidebar.series_item  = 'series_item';
+               
+               config.ids.sidebar.home_link            = 'home_link'
+               config.ids.sidebar.advanced_link        = 'advanced_link'
+               config.ids.sidebar.myopac_link  = 'myopac_link'
+               
+               config.names.sidebar.subject_item       = 'subject_item';
+               config.names.sidebar.author_item                = 'author_item';
+               config.names.sidebar.series_item                = 'series_item';
+
+               config.css.encircled                            = 'encircled';
+       </script>
+
+</div>
+
diff --git a/Open-ILS/web/opac/skin/craftsman/xml/common/statusbar.xml b/Open-ILS/web/opac/skin/craftsman/xml/common/statusbar.xml
new file mode 100644 (file)
index 0000000..b67a04f
--- /dev/null
@@ -0,0 +1,24 @@
+<div id='statusbar' align="right">
+       <table align='right' width='100%'>
+               <tbody>
+                       <tr>
+                               <td align='left' class='title' width='20%' nowrap='nowrap'>
+                                       <b>
+                                       <span style='padding: 1px;' id='now_searching_location'>  </span>
+                                       </b>
+                                       <i id='including_results_for' class='hide_me'>
+                                               <span>&status.results;</span> <b id='including_results_location'> </b>
+                                       </i>
+                               </td>
+                <td align='right' style='padding:4px;'>
+                    <!--#if expr="$OILS_PAGE='rresult.xml' || $OILS_PAGE='mresult.xml'"-->
+                    <!--#include virtual="../result/filtersort.xml" -->
+                    <!--#endif -->
+                </td>
+                       </tr>
+               </tbody>
+       </table>
+       <script language='javascript' type='text/javascript'>
+               config.ids.common.now_searching = 'now_searching_location';
+       </script>
+</div>
diff --git a/Open-ILS/web/opac/skin/craftsman/xml/common/tips.xml b/Open-ILS/web/opac/skin/craftsman/xml/common/tips.xml
new file mode 100644 (file)
index 0000000..89727a3
--- /dev/null
@@ -0,0 +1,8 @@
+
+<div id='tips' class='tips-bottom-box hide_me'>
+       <div class='hide_me'>
+               <span>&common.tips.tip1;</span>
+               <span>&common.tips.tip2;</span>
+       </div>
+       <span style="font-weight: bold;">&tips.label;  </span>
+</div>
diff --git a/Open-ILS/web/opac/skin/craftsman/xml/footer.xml b/Open-ILS/web/opac/skin/craftsman/xml/footer.xml
new file mode 100644 (file)
index 0000000..e05ecce
--- /dev/null
@@ -0,0 +1,23 @@
+<div id='footer'>
+       <div class='inner'>
+               <table>
+                       <tr>    
+                               <td>
+                                       <a href='/opac/extras/slimpac/start.html'>&opac.basic;</a> |
+                                       <a href='&footer.find.url;'>&footer.find.library;</a> | 
+                                       <a href='&footer.help.url;'>&footer.help;</a> | 
+                                       <a href='&footer.library.url;'>&footer.library.about;</a> | 
+                                       <a href='&footer.union.url;'>&footer.union;</a>                         
+                               </td>
+                               <td align='right'>
+                                       <span>&footer.copyright;</span>
+                                       <span>
+                                               <a href='http://open-ils.org'><img src='../../../../images/eg_tiny_logo.gif' alt='' style='display: inline; float: right; margin-left: 5px;' /></a>
+                                               <div style='float: right; padding: 5px 0 0 0;'>&footer.logo;</div>
+                                               <div class='clear'></div>
+                                       </span>
+                               </td>
+                       </tr>
+               </table>
+       </div>
+</div>
diff --git a/Open-ILS/web/opac/skin/craftsman/xml/home/homesearch.xml b/Open-ILS/web/opac/skin/craftsman/xml/home/homesearch.xml
new file mode 100644 (file)
index 0000000..851c5f1
--- /dev/null
@@ -0,0 +1,92 @@
+<div align='center'>
+       <div class='home-searcharea' xmlns="http://www.w3.org/1999/xhtml" xmlns:xi="http://www.w3.org/2001/XInclude">
+               <!-- load my js -->
+               <script language='javascript' type='text/javascript' src="<!--#echo var="OILS_OPAC_JS_HOST"-->/skin/default/js/depth_selector.js"> </script>
+               <script language='javascript' type='text/javascript' src="<!--#echo var="OILS_OPAC_JS_HOST"-->/skin/default/js/search_bar.js"> </script>
+       
+               <script language='javascript' type='text/javascript'>
+                       config.ids.searchbar = {};
+                       config.css.searchbar = {};
+                       config.ids.searchbar.text                               = 'search_box'; 
+                       config.ids.searchbar.submit                     = 'search_submit';      
+                       config.ids.searchbar.type_selector      = 'search_type_selector';
+                       config.ids.searchbar.depth_selector     = 'depth_selector';
+                       config.ids.searchbar.form_selector      = 'form_selector';
+                       config.ids.searchbar.extra_row          = 'searchbar_extra';
+                       config.ids.searchbar.main_row                   = 'searchbar_main_row';
+                       config.ids.searchbar.table                              = 'searchbar_table';
+                       config.ids.searchbar.location_tag       = 'search_location_tag_link';
+                       config.ids.searchbar.lib_sel_span       = 'lib_selector_span';
+                       config.ids.searchbar.lib_sel_link       = 'lib_selector_link';
+                       config.ids.searchbar.depth_sel_span     = 'depth_selector_span';
+               </script>
+               <!--Logo-->
+               <div class='home-logo'>
+                       <img src='<!--#echo var="OILS_BASE"-->/images/main_logo.jpg' />
+               </div>
+               <!--Title-->
+               <div class='home-title'>
+                       <script language='javascript' type='text/javascript'>config.ids.common.now_searching = 'now_searching_location';</script>
+                       <span>&opac.search.nowSearching;</span>
+                       <span style='padding: 1px;' id='now_searching_location'></span>
+               </div>
+               <!--Search Input/Submit-->
+               <div class='home-search-panel'>
+                       <table align='center'>
+                               <tr>
+                                       <td><input id='search_box' type='text' class='search-home-input' /></td>
+                                       <td><input type='button' id='search_submit' value='Search' class='submit' /></td>
+                               </tr>
+                       </table>
+               </div>  
+               <!--Filters-->
+               <div class='home-filter-panel'>
+                       <span style='padding-right:40px;'><!--#include virtual="../common/stypes_selector.xml"--></span>
+                       <span>
+                               <!--
+                               <span>&common.format;: </span>
+                               -->
+                               <!--#set var='FORM_SEL_ID' value='form_selector'-->
+                               <!--#include virtual="../common/format_selector.xml"-->
+                       </span> 
+               </div>  
+       </div>
+</div>
+<div align='center'>
+       <div class='home-bottom-tabs' align='center'>
+               <ul>
+                       <li><a id='home_adv_search_link' href='javascript:void(0);' class='advancedsearch'>&opac.navigate.advanced;</a></li>
+                       <li>
+                               <span class='hide_me' id='depth_selector_span'>
+                                       <select id='depth_selector' >
+                                               <option value='new'>&opac.navigate.selectNewOrg;...</option>
+                                       </select>
+                               </span>
+                               <span class='hide_me' id='lib_selector_span'>
+                                       <a id='lib_selector_link' href='javascript:void(0)' class='chooselibrary'>&opac.navigate.selectOrg;</a>
+                               </span>
+                       </li>
+                       <li><a id='home_myopac_link' href='javascript:void(0);' class='myaccount'>&opac.navigate.myopac;</a></li>
+               </ul>
+               <div class='clear'></div>
+       </div>
+</div>
+
+<!-- locale picker -->
+<div align='center' valign='bottom' style='padding-top:10px;'>
+    <span style='vertical-align: top;'>&common.language;</span>
+    <span dojoType="dijit.form.FilteringSelect" store="openils.I18N.localeStore" 
+        searchAttr="label" required="false" jsId='opacLocaleSelector'>
+        <script>
+            dojo.addOnLoad(function() {
+                opacLocaleSelector.setValue(locale);
+                dojo.connect(opacLocaleSelector, 'onChange', 
+                    function () {
+                        location.href = location.href.replace(/opac\/[^\/]+\/skin/, 'opac/' + this.getValue() + '/skin');
+                    }
+                );
+            });
+        </script>
+    </span>
+</div>
+
diff --git a/Open-ILS/web/opac/skin/craftsman/xml/home/index_body.xml b/Open-ILS/web/opac/skin/craftsman/xml/home/index_body.xml
new file mode 100644 (file)
index 0000000..aa2598c
--- /dev/null
@@ -0,0 +1,28 @@
+<body onload='init(); getId("home_adv_search_link").setAttribute("href", buildOPACLink({page:ADVANCED})); getId("home_myopac_link").setAttribute("href", buildOPACLink({page:MYOPAC}, false, true));'>
+
+       <noscript>
+               <style type="text/css">#toptable { display: none; }</style>
+               <p style="font-size: 1.3em; padding: 3em; text-align: center;">
+               &home.js.disabled;
+               </p>
+       </noscript>
+
+
+       <div id='canvas'>
+               <!--#include virtual="../common/altcanvas.xml"-->
+               <!--#include virtual="homesearch.xml"-->
+       </div>
+       <script language='javascript' type='text/javascript'>isFrontPage = true;</script>
+       <script language="javascript" type='text/javascript'>
+        try { 
+            document.getElementById('toptable').style.display = 'table'; 
+        } catch(e) {
+            try {
+                document.getElementById('toptable').style.display = ''; 
+            } catch(ee) {}
+        }
+    </script>
+       <!--#include virtual='../footer.xml'-->
+</body>
+
+
diff --git a/Open-ILS/web/opac/skin/craftsman/xml/page_cnbrowse.xml b/Open-ILS/web/opac/skin/craftsman/xml/page_cnbrowse.xml
new file mode 100644 (file)
index 0000000..ff1494b
--- /dev/null
@@ -0,0 +1,6 @@
+<div id='canvas_main'>
+       <script language='javascript' type='text/javascript' src='<!--#echo var="OILS_OPAC_JS_HOST"-->/skin/craftsman/js/cn_browse.js'></script>
+       <!--#include virtual="common/cn_browse.xml"-->
+</div>
+
+
diff --git a/Open-ILS/web/opac/skin/craftsman/xml/page_myopac.xml b/Open-ILS/web/opac/skin/craftsman/xml/page_myopac.xml
new file mode 100644 (file)
index 0000000..43d3579
--- /dev/null
@@ -0,0 +1,68 @@
+<div id='canvas_main' class='hide_me'>
+
+       <script language='javascript' type='text/javascript' src='<!--#echo var="OILS_OPAC_JS_HOST"-->/skin/default/js/myopac.js'></script>
+    <script language='javascript' type='text/javascript' src='<!--#echo var="OILS_OPAC_JS_HOST"-->/common/js/DP_DateExtensions.js'></script>
+
+       <script language='javascript' type='text/javascript'> config.ids.altcanvas.myopac_reload = 'myopac_reloading'; </script>
+       <div id='myopac_reloading' class='hide_me canvas'> &common.loading; </div>
+
+       <script language='javascript' type='text/javascript'>
+               config.ids.myopac = {};
+               config.css.myopac = {};
+               config.names.myopac = {};
+       </script>
+
+       <br/>
+       <table style='width: 98%; text-align: center;'>
+               <tbody>
+                       <tr id='myopac_nav_row'>
+
+                               <td class='myopac_link border_6' id='myopac_summary_td' >
+                                       <a href='javascript:void(0);' 
+                                               onclick='myOPACChangePage("summary");'>&myopac.account;</a>
+                               </td>
+
+                               <td class='myopac_link border_6' id='myopac_checked_td' >
+                                       <a href='javascript:void(0);' 
+                                               onclick='myOPACChangePage("checked");'>&myopac.checkouts;</a>
+                               </td>
+
+                               <td class='myopac_link border_6' id='myopac_holds_td' >
+                                       <a href='javascript:void(0);' 
+                                               onclick='myOPACChangePage("holds");'>&myopac.holds;</a>
+                               </td>
+
+                               <td class='myopac_link border_6' id='myopac_fines_td' >
+                                       <a href='javascript:void(0);' 
+                                               onclick='myOPACChangePage("fines");'>&myopac.fines;</a>
+                               </td>
+
+                               <td class='myopac_link border_6' id='myopac_prefs_td' >
+                                       <a href='javascript:void(0);' 
+                                               onclick='myOPACChangePage("prefs");'>&myopac.preferences;</a>
+                               </td>
+
+                               <td class='myopac_link border_6' id='myopac_bookbag_td' nowrap='nowrap'>
+                                       <a href='javascript:void(0);' 
+                                               onclick='myOPACChangePage("bookbag");'>&myopac.bookbags;</a>
+
+                               </td>
+
+                       </tr>
+               </tbody>
+       </table>
+
+       <br/>
+
+       <div id='myopac_main_div'>
+               <!--#include virtual="myopac/myopac_summary.xml"-->
+               <!--#include virtual="myopac/myopac_checked.xml"-->
+               <!--#include virtual="myopac/myopac_holds.xml"-->
+               <!--#include virtual="myopac/myopac_fines.xml"-->
+               <!--#include virtual="myopac/myopac_prefs.xml"-->
+               <!--#include virtual="myopac/myopac_bookbags.xml"-->
+       </div>
+
+</div>
+
+
diff --git a/Open-ILS/web/opac/skin/craftsman/xml/page_rdetail.xml b/Open-ILS/web/opac/skin/craftsman/xml/page_rdetail.xml
new file mode 100644 (file)
index 0000000..f9731fb
--- /dev/null
@@ -0,0 +1,85 @@
+<div id='canvas_main'>
+       <script language='javascript' type='text/javascript' src='<!--#echo var="OILS_OPAC_JS_HOST"-->/skin/default/js/sidebar_extras.js'></script>
+       <script language='javascript' type='text/javascript' src='<!--#echo var="OILS_OPAC_JS_HOST"-->/skin/default/js/result_common.js'></script>
+       <script language='javascript' type='text/javascript' src='<!--#echo var="OILS_OPAC_JS_HOST"-->/skin/default/js/rresult.js'></script>
+       <script language='javascript' type='text/javascript' src='<!--#echo var="OILS_OPAC_JS_HOST"-->/skin/default/js/rdetail.js'></script>
+       <script language='javascript' type='text/javascript' src='<!--#echo var="OILS_OPAC_JS_HOST"-->/skin/default/js/holds.js'></script>
+       <script language='javascript' type='text/javascript' src='<!--#echo var="OILS_OPAC_JS_HOST"-->/skin/default/js/cn_browse.js'></script>
+       <script language='javascript' type='text/javascript' src='<!--#echo var="OILS_OPAC_JS_HOST"-->/skin/default/js/container.js'></script>
+
+       <script language='javascript' type='text/javascript'>
+               config.ids.rdetail = {};
+               config.ids.rdetail.view_marc = "rdetail_view_marc";
+       </script>
+       <div class='detailsinfo-box'>
+               <table id='np_table' class='hide_me'>
+                       <tbody>
+                               <tr>
+                                       <td>
+                                               <span>
+                                                       &rdetail.result; <strong><span id='np_offset'> </span></strong>
+                                                        - 
+                                                       <strong><span id='np_count'> </span></strong>
+                                               </span>
+                                               <span style='padding-left: 40px;'>
+                                                       <a class='np_nav_link classic_link hide_me' id='np_start'
+                                                               href='javascript:rdetailStart();' title="&rdetail.page.results;">&rdetail.start;</a>
+                                                       <a class='np_nav_link classic_link hide_me' id='np_prev'
+                                                               href='javascript:rdetailPrev();' title='&rdetail.page.previous;'>&lt;&lt;</a>
+                                                       <span> </span>
+                                                       <a  class='np_nav_link classic_link hide_me' id='np_next'
+                                                               href='javascript:rdetailNext();' title='&rdetail.page.next;'>&gt;&gt;</a>
+                                                       <a class='np_nav_link classic_link hide_me' id='np_end'
+                                                               href='javascript:rdetailEnd();' title="&rdetail.page.last;">&rdetail.end;</a>
+                                               </span>
+                                       </td>
+                               </tr>
+                       </tbody>
+               </table>
+       </div>
+       <div class='detailsinfo-bottom-box'>
+               <table>
+                       <tbody>
+                               <tr>
+                                       <td width='50%' align='left' style='vertical-align: middle;'>
+                                               <span>&rdetail.detailMain.headerLabel;</span>
+                                       </td>
+                                       <td align='right' width='50%' class='detailsinfo-right'>
+                                               <ul>
+                                                       <li>
+                                                               <span class='placeholder'>
+                                                                       <a id='rdetail_place_hold'>&opac.holds.placeHold;</a>
+                                                               </span>
+                                                       </li>
+                                                       <li class='hide_me'>
+                                                               <span class='selectBox' id='rdetail_more_actions'>
+                                                                       <select id='rdetail_more_actions_selector' style='max-width: 11em;'>
+                                                                               <option value='start'>&rdetail.more;</option>
+                                                                               <option disabled='disabled'>--------------</option>
+                                                                               <option disabled='disabled'>&rdetail.bookbag.add;</option>
+                                                                               <option disabled='disabled'>--------------</option>
+                                                                               <option value='new_bookbag' onclick='rdetailNewBookbag();'>&rdetail.bookbag.create;</option>
+                                                                       </select>
+                                                               </span>
+                                                       </li>
+                                               </ul>
+                                               <div class='clear'></div>
+                                       </td>
+                               </tr>
+                       </tbody>
+               </table>
+       </div>
+       <div style='font-weight: bold; padding: 5px; margin: 5px; width: 100%;' class='hide_me color_4' id='rdetail_deleted_exp'>
+               &rdetail.record.deleted;
+       </div>
+
+       <!--#include virtual="rdetail/rdetail_summary.xml"-->
+       <br/><br/>
+       <!--#include virtual="rdetail/rdetail_extras.xml"-->
+
+       <div class='hide_me' id='rdetail_bb_none'>&rdetail.none;</div>
+       <div class='hide_me' id='rdetail_bb_item_success'>&rdetail.bookbag.add.success;</div>
+       <div class='hide_me' id='rdetail_bb_new'>&rdetail.bookbag.name;</div>
+       <div class='hide_me' id='rdetail_bb_success'>&rdetail.bookbag.create.success;</div>
+
+</div>
diff --git a/Open-ILS/web/opac/skin/craftsman/xml/rdetail/rdetail_cn_details.xml b/Open-ILS/web/opac/skin/craftsman/xml/rdetail/rdetail_cn_details.xml
new file mode 100644 (file)
index 0000000..116f1fb
--- /dev/null
@@ -0,0 +1,99 @@
+       <table style='width: 100%;' class='hide_me'>
+               <script language='javascript' type='text/javascript' src='<!--#echo var="OILS_OPAC_JS_HOST"-->/skin/default/js/copy_details.js'></script>
+               <script language='javascript' type='text/javascript' src='<!--#echo var="OILS_OPAC_JS_HOST"-->/common/js/Date.W3CDTF.js'></script>
+               <tbody>
+                       <tr id='rdetail_volume_details_row' templateRow='1'>
+                               <td colspan='10'>
+                                       <div>
+                                               <div align='center'><a name='print' href='javascript:void(0);' class='classic_link'>&rdetail.print;</a></div><br />
+                                               
+                                               <table class='data_grid data_grid_center' style='width: 100%'>
+                                                       <thead>
+                                                               <tr>
+                                                                       <td width='33%'>&rdetail.cn.barcode;</td>
+                                                                       <td>&common.status;</td>
+                                                                       <td>&rdetail.cn.location;</td>
+                                                                       <td name='age_protect_label' class='hide_me'>&rdetail.cn.hold.age;</td>
+                                                                       <td name='create_date_label' class='hide_me'>&rdetail.cn.genesis;</td>
+                                                                       <td name='holdable_label' class='hide_me'>&rdetail.cn.holdable;</td>
+                                                                       <td name='due_date_label' class='hide_me'>&rdetail.cn.due;</td>
+                                                               </tr>
+                                                       </thead>
+                                                       <tbody name='copies_tbody' class='copy_details_table' width='100%'>
+                                                               <tr name='copies_row'>
+       
+                                                                       <td>
+                                                                               <span name='barcode'> </span>
+                                                                               <a class='hide_me classic_link copy_more_info' name='details_link'>&rdetail.cn.more;</a>
+                                                                               <a class='hide_me classic_link copy_more_info' name='less_details_link'>&rdetail.cn.less;</a>
+                                                                               <a class='hide_me classic_link copy_more_info' name='copy_hold_link' href='javascript:void(0);'>&rdetail.cn.hold;</a>
+                                                                       </td>
+       
+                                                                       <td name='status'> </td>
+                                                                       <td name='location'> </td>
+                                                                       <td name='age_protect_value' class='hide_me'>&rdetail.cn.disabled;</td>
+                                                                       <td name='create_date_value' class='hide_me'> </td>
+       
+                                                                       <td name='copy_holdable_td' class='hide_me'>
+                                                                               <span name='copy_is_holdable'> </span>
+                                                                       </td>
+       
+                                                                       <td name='copy_due_date_td' class='hide_me'>
+                                                                               <span name='copy_due_date'> </span>
+                                                                       </td>
+                                                               </tr>
+       
+                                                               <tr name='copy_extras_row' class='hide_me'>
+                                                                       <td colspan='10'>
+                                                                               <table width='100%' class='data_grid'>
+                                                                                       <tbody name='extras_tbody'>
+                                                                                               <tr name='extras_row' class='hide_me'>
+                                                                                                       <td name='type' width='20%'> 
+                                                                                                               <span name='note' class='hide_me'><b>&rdetail.cn.note;</b></span>
+                                                                                                               <span name='cat' class='hide_me'><b>&rdetail.cn.category;</b></span>
+                                                                                                       </td>
+                                                                                                       <td>
+                                                                                                               <span name='key'> </span> : <span name='value'> </span>
+                                                                                                       </td>
+                                                                                               </tr>
+                                                                                       </tbody>
+                                                                               </table>
+                                                                       </td>
+                                                               </tr>
+       
+                                                       </tbody>
+                                               </table>
+                                       </div>
+                               </td>
+                       </tr>
+               </tbody>
+       </table>
+       
+       <span class='hide_me' id='rdetail.yes'>&common.yes;</span>
+       <span class='hide_me' id='rdetail.no'>&common.no;</span>
+       
+       
+       <div id='rdetail_print_details' class='hide_me'>
+               <div style='text-align: center; padding: 20px; width: 100%'>
+                       <div style='width:100%; border: 2px solid #E0F0E0; margin-bottom: 20px;'>
+                               <input type='submit' value='&rdetail.cn.print;' onclick='window.print();'> </input>
+                       </div>
+                       <div name='body'> 
+                               <table>
+                                       <tbody name='tbody'>
+                                               <tr><td>&common.library;</td><td colspan='2' name='lib'></td></tr>
+                                               <tr><td>&common.title;</td><td colspan='2' name='title'></td></tr>
+                                               <tr><td>&common.author;</td><td colspan='2' name='author'></td></tr>
+                                               <tr><td>&common.edition;</td><td colspan='2' name='edition'></td></tr>
+                                               <tr><td>&common.pubdate;</td><td colspan='2' name='pubdate'></td></tr>
+                                               <tr><td>&common.publisher;</td><td colspan='2' name='publisher'></td></tr>
+                                               <tr><td>&common.physical;</td><td colspan='2' name='phys'></td></tr>
+                                               <tr>
+                                                       <td colspan='3' style='background: #E0F0E0;'> </td>
+                                               </tr>
+                                               <tr name='cnrow'><td><b>&common.callnumber;</b></td><td><b colspan='2' name='cn'></b></td></tr>
+                                       </tbody>
+                               </table>
+                       </div>
+               </div>
+       </div>
diff --git a/Open-ILS/web/opac/skin/craftsman/xml/rdetail/rdetail_copyinfo.xml b/Open-ILS/web/opac/skin/craftsman/xml/rdetail/rdetail_copyinfo.xml
new file mode 100644 (file)
index 0000000..9557d28
--- /dev/null
@@ -0,0 +1,73 @@
+
+<!-- This holds information for copies attached to this record -->
+<div id='rdetail_copy_info_div' class='details-base'>
+
+       <div style='width: 100%; text-align: center;'>
+               <span>
+                       <a href='javascript:void(0);' id='copy_info_local_link' 
+                               class='rdetail_copy_nav_link hide_me classic_link'><b>&rdetail.copyInfo.local;</b></a>
+               </span>
+               <span width=''>
+                       <a href='javascript:void(0);' id='copy_info_all_link' 
+                               class='rdetail_copy_nav_link classic_link'><b>&rdetail.copyInfo.all;</b></a>
+               </span>
+       </div>
+
+       <table id='rdetail_copy_info_table' class='details-datagrid'>
+               <thead>
+                       <tr>
+                               <td style='border: 1px solid #ddd;'>&rdetail.copyInfo.library;</td>
+                               <td style='border: 1px solid #ddd;'>&rdetail.copyInfo.callnumber;</td>
+                               <td style='border: 1px solid #ddd;'>&rdetail.copyInfo.actions;</td>
+                               <td style='border: 1px solid #ddd;' nowrap='nowrap' class='rdetail_copy_info_header_cell' id='rdetail_copy_info_status'> 
+                                       <div name='rdetail_status_cell'> </div>&nbsp;
+                               </td>
+                       </tr>
+               </thead>
+               <tbody id='rdetail_copy_info_tbody'>
+                       <tr id='rdetail_copy_info_row' class='hide_me'>
+                               <td name='rdetail_library_cell' bgcolor='#fbf9ee' border='1px' bordercolor='#dddddd' style='border: 1px solid #ddd; background-color: #fbf9ee;'>
+                                       <a name='lib_print_link' class='hide_me'>&rdetail.copyInfo.print;</a>
+                               </td>
+                               <td name='rdetail_callnumber_cell' style='border: 1px solid #ddd;'> </td>
+                               <td name='rdetail_actions_cell' style='border: 1px solid #ddd;'> 
+                                       <div style='padding: 0 0 2px 0;'><a name='details'>&rdetail.copyInfo.details;</a></div>
+                                       <div><a name='browse'>&rdetail.copyInfo.browse;</a></div>
+                                       <div name='hold_div' class='hide_me'>
+                                               <a name='hold' href='javascript:void(0);'>&rdetail.copyInfo.hold;</a>
+                                       </div>
+                               </td>
+                               <td nowrap='nowrap' name='rdetail_copy_count_cell' style='border: 1px solid #ddd;'> &nbsp;</td>
+                       </tr>
+                       <tr id='rdetail_copy_info_loading'><td>&rdetail.loading;</td></tr>
+               </tbody>
+       </table>
+
+       <!--
+       <table class='hide_me'>
+               <tbody>
+               <tr id='rdetail_volume_details_row'><td colspan='10'></td></tr>
+               </tbody>
+       </table>
+       -->
+
+       <br/><br/>
+
+       <div id='rdetail_copy_info_none' class='hide_me'>&rdetail.noneAvailable;</div>
+
+       <script language='javascript' type='text/javascript'>
+               config.ids.rdetail.cp_status                    = "rdetail_copy_info_status";
+               config.ids.rdetail.cp_info_row          = "rdetail_copy_info_row";
+               config.ids.rdetail.cp_info_loading      = "rdetail_copy_info_loading";
+               config.ids.rdetail.cp_info_local                = "copy_info_local_link";
+               config.ids.rdetail.cp_info_all          = "copy_info_all_link";
+               config.ids.rdetail.cp_info_none         = "rdetail_copy_info_none";
+               config.names.rdetail.lib_cell                   = "rdetail_library_cell";
+               config.names.rdetail.cn_cell                    = "rdetail_callnumber_cell";
+               config.names.rdetail.cp_count_cell      = "rdetail_copy_count_cell";
+               config.names.rdetail.cp_status          = 'rdetail_status_cell';
+       </script>
+
+</div> <!-- copy info -->
+
+
diff --git a/Open-ILS/web/opac/skin/craftsman/xml/rdetail/rdetail_extras.xml b/Open-ILS/web/opac/skin/craftsman/xml/rdetail/rdetail_extras.xml
new file mode 100644 (file)
index 0000000..1cf8755
--- /dev/null
@@ -0,0 +1,78 @@
+
+<div xmlns:xi="http://www.w3.org/2001/XInclude">
+<div style='padding: 5px;'>
+       <table class='details-footer-datagrid'>
+               <thead>
+                       <tr>
+                               <td id='rdetail_copy_info_link' class='rdetail_extras_selected'>
+                                       <a href='javascript:rdetailShowExtra("copyinfo");' class='classic_link'>&rdetail.extras.summary;</a>
+                               </td>
+                               <td id='rdetail_viewcn_link' class=''>
+                                       <a href='javascript:rdetailShowExtra("cn");' class='classic_link'>&rdetail.extras.browser;</a>
+                               </td>
+                               <td id='rdetail_reviews_link' class='hide_me'>
+                                       <a href='javascript:rdetailShowExtra("reviews");' class='classic_link'>&rdetail.extras.reviews;</a>
+                               </td>
+                               <td id='rdetail_toc_link' class='hide_me '>
+                                       <a href='javascript:rdetailShowExtra("toc");' class='classic_link'>&rdetail.extras.toc;</a>
+                               </td>
+                               <td id='rdetail_excerpt_link' class='hide_me'>
+                                       <a href='javascript:rdetailShowExtra("excerpt");' class='classic_link'>&rdetail.extras.excerpt;</a>
+                               </td>
+                               <td id='rdetail_anotes_link' class='hide_me'>
+                                       <a href='javascript:rdetailShowExtra("anotes");' class='classic_link'>&rdetail.extras.author.notes;</a>
+                               </td>
+                               <td id='rdetail_annotation_link' class='hide_me'>
+                                       <a href='javascript:rdetailShowExtra("annotation");' class='classic_link'>&rdetail.extras.annotation;</a>
+                               </td>
+                               <td id='rdetail_viewmarc_link'>
+                                       <a href='javascript:rdetailShowExtra("marc");' class='classic_link'>&rdetail.extras.marc;</a>
+                               </td>
+                       </tr>
+               </thead>
+       </table>
+
+       <div id='rdetail_extras_div'>
+               <div id='rdetail_extras_loading' class='hide_me' 
+                       style='padding: 10px;'>&common.loading;</div>
+               <!--#include virtual="rdetail_copyinfo.xml"-->
+
+               <div id='rdetail_reviews_div' class='rdetail_extras_div hide_me'> 
+                       <div id='rdetail_review_container'/>
+                       <!--
+                       <div id='rdetail_review_template' style='width: 100%;'>
+                               <div name='review_header' style='width: 100%; padding: 15px; border: 1px solid #E0E0E0;'> </div>
+                               <div name='review_text' style='width: 100%; padding: 15px; border: 1px solid #E0E0E0;'> </div>
+                       </div>
+                       -->
+               </div>
+               
+               <div id='rdetail_toc_div' class='rdetail_extras_div hide_me'> </div>
+
+               <div id='rdetail_excerpt_div' class='rdetail_extras_div hide_me'> </div>
+
+               <div id='rdetail_anotes_div' class='rdetail_extras_div hide_me'> </div>
+
+               <div id='rdetail_marc_div' class='rdetail_extras_div hide_me'> 
+                       <div id='rdetail_view_marc_box' class='details-base'> </div>
+               </div>
+
+               <div id='rdetail_cn_browse_div' style='text-align: center;' class='hide_me'>
+
+                       <div id='cn_browse_none' class='hide_me color_4' style='width: 90%; text-align: center; margin: 10px;'>
+                               &rdetail.extras.call.null;
+                       </div>
+
+                       <div id='rdetail_cn_browse_select_div' class='details-base' style='margin-bottom: 5px;'>
+                               <span>&rdetail.extras.call.local; </span>
+                               <select id='cn_browse_selector'>
+                               </select>
+                       </div>
+                       <!--#include virtual="../common/cn_browse.xml"-->
+               </div>
+
+               <!--#include virtual="rdetail_cn_details.xml"-->
+
+       </div>
+</div>
+</div>
diff --git a/Open-ILS/web/opac/skin/craftsman/xml/rdetail/rdetail_summary.xml b/Open-ILS/web/opac/skin/craftsman/xml/rdetail/rdetail_summary.xml
new file mode 100644 (file)
index 0000000..8914b31
--- /dev/null
@@ -0,0 +1,83 @@
+
+<!-- This holds the record summary information -->
+<div class='details-grid'>
+       <table id='rdetail_details_table'>
+               <tbody id='rdetail_details_tbody'>
+
+                       <tr>
+                               <td id='rdetail_image_cell' rowspan='10' style='border-right: 1px solid #efefef; text-align: center;'>
+                                       <a id='rdetail_img_link'>
+                                               <img style='margin: 0 auto; border: none;' id='rdetail_image' onerror='hideMe($("rdetail.jacket_attrib_div"));hideMe($("rdetail_img_link"));'/>
+                                       </a>
+                    <!-- vendor attribution link -->
+                    <div class='jacket_attrib hide_me' id='rdetail.jacket_attrib_div'>
+                        <div>&opac.image_provided;</div>
+                        <div><a target='_blank' href='&vendor.base_link;' class='classic_link' id='rdetail.jacket_attrib_link'>&vendor.name;</a></div>
+                    </div>
+                               </td>
+                               <td class='title'>&common.title;</td>           
+                               <td id='rdetail_title'> </td>
+                       </tr>
+                       <tr>
+                               <td class='title'>&common.author;</td>          
+                               <td><a title='&rdetail.author.search;' id='rdetail_author'></a></td>
+                       </tr>
+                       <tr>
+                               <td class='title'>&common.isbn;</td>                    
+                               <td id='rdetail_isbn'> </td>
+                       </tr>
+                       <tr>
+                               <td class='title'>&common.edition;</td>         
+                               <td id='rdetail_edition'> </td>
+                       </tr>
+                       <tr>
+                               <td class='title'>&common.pubdate;</td>         
+                               <td id='rdetail_pubdate'> </td>
+                       </tr>
+                       <tr>
+                               <td class='title'>&common.publisher;</td>               
+                               <td id='rdetail_publisher'> </td>
+                       </tr>
+                       <tr>
+                               <td class='title'>&common.physical;</td>                
+                               <td id='rdetail_physical_desc'> </td>
+                       </tr>
+                       <tr>
+                               <td class='title'>&common.format;</td>                  
+                               <td>
+                                       <img id='rdetail_tor_pic' class='tor_pic' />
+                                       <span id='rdetail_tor' style='padding-left: 5px;'> </span>
+                               </td>
+                       </tr>
+                       <tr>
+                               <td class='title'>&rdetail.detailMain.abstract;</td>    
+                               <td id='rdetail_abstract'> </td>
+                       </tr>
+
+                       <tr class='hide_me' id='rdetail_online_row'>
+                               <td class='title'>&rdetail.summary.online;</td>
+                               <td id='rdetail_online'> </td>
+                       </tr>
+               </tbody>
+       </table>
+       <!-- Empty span used for creating unAPI links -->
+       <abbr name="unapi" class="unapi-id">
+               <!-- unAPI URI goes here -->
+       </abbr>
+
+       <script language='javascript' type='text/javascript'>
+               config.ids.rdetail.details_body         = 'rdetail_details_body'; 
+               config.ids.rdetail.title                        = 'rdetail_title';
+               config.ids.rdetail.author                       = 'rdetail_author';
+               config.ids.rdetail.isbn                         = 'rdetail_isbn';
+               config.ids.rdetail.edition                      = 'rdetail_edition';
+               config.ids.rdetail.pubdate                      = 'rdetail_pubdate';
+               config.ids.rdetail.publisher            = 'rdetail_publisher';
+               config.ids.rdetail.tor                          = 'rdetail_tor';
+               config.ids.rdetail.abstr                        = 'rdetail_abstract';
+               config.ids.rdetail.image                        = 'rdetail_image';
+               config.ids.rdetail.tor_pic                      = 'rdetail_tor_pic';
+       </script>
+
+</div> <!-- details_body -->
+
diff --git a/Open-ILS/web/opac/skin/craftsman/xml/result/filtersort.xml b/Open-ILS/web/opac/skin/craftsman/xml/result/filtersort.xml
new file mode 100644 (file)
index 0000000..2057fdf
--- /dev/null
@@ -0,0 +1,25 @@
+<span>
+       <table>
+               <tr>
+                       <td nowrap='nowrap'><label>&result.limit2avail;</label></td>
+                       <td class='checkbox' style='padding-right: 5px;'><input type='checkbox' id='opac.result.limit2avail' onclick='searchBarSubmit(true);' />&nbsp;</td>
+                       <td><select id='opac.result.sort' onchange='searchBarSubmit(true);'>
+                               <option selected='selected' value=''>&result.sort_by;</option>
+                               <optgroup label='&result.sort_by.title;'>
+                                       <option id='opac.result.title.a2z' label='&common.a2z.titla;' value='title.asc'>&common.a2z.title;</option>
+                                       <option id='opac.result.title.z2a' label='&common.z2a.titla;' value='title.desc'>&common.z2a.title;</option>
+                               </optgroup>
+                               <optgroup label='&result.sort_by.author;'>
+                                       <option id='opac.result.author.a2z' label='&common.a2z.author;' value='author.asc'>&common.a2z.author;</option>
+                                       <option id='opac.result.author.z2a' label='&common.z2a.author;' value='author.desc'>&common.z2a.author;</option>
+                               </optgroup>
+                               <optgroup label='&result.sort_by.pubdate;'>
+                                       <option id='opac.result.pubdate.new2old' label='&common.new2old.pubdate;' 
+                                               value='pubdate.desc'>&common.new2old.pubdate;</option>
+                                       <option id='opac.result.pubdate.old2new' label='&common.old2new.pubdate;' 
+                                               value='pubdate.asc'>&common.old2new.pubdate;</option>
+                               </optgroup>
+                       </select></td>
+               </tr>
+       </table>
+</span>
\ No newline at end of file
diff --git a/Open-ILS/web/opac/skin/craftsman/xml/result/result_info.xml b/Open-ILS/web/opac/skin/craftsman/xml/result/result_info.xml
new file mode 100644 (file)
index 0000000..01321ae
--- /dev/null
@@ -0,0 +1,74 @@
+<div class='resultinfo-box'>
+       <table>
+               <tbody>
+                       <tr>    
+                               <td id='next_prev_links'>       
+                                       <span class='hide_me' id='result_info_div' style='font-size: 9pt;'>
+                                               <span> &common.results; </span> 
+                                               <span id='offset_start'> </span>
+                                               <span> - </span>
+                                               <span id='offset_end'> </span>
+                                               <span> &common.ofAtLeast; </span>
+                                               <span id='result_count'> </span>
+                                               <span style='padding-left: 6px;'> (page </span>
+                                               <span id='current_page'> </span>
+                                               <span> &common.of; </span>
+                                               <span id='num_pages'> </span>
+                                       </span>
+       
+                                       <span id='start_end_links_span' class='hide_me' 
+                                                       style='padding-left: 40px;' >
+                                               <a class='search_page_nav_link' id='search_home_link' 
+                                                       title="&rdetail.page.results;">&rdetail.start;</a><a class='search_page_nav_link' 
+                                                               id='prev_link' title='&rdetail.page.previous;'>&#171;</a>
+       
+                                               <span class='search_page_nav_link' id='page_numbers'> </span>
+       
+                                               <a  class='search_page_nav_link' id='next_link' 
+                                                       title='&rdetail.page.next;'>&#187;</a>
+                                                       <!--
+                                                       <a class='search_page_nav_link' 
+                                                               id='end_link' title="&rdetail.page.last;">&rdetail.end;</a>
+                                                               -->
+                                       </span> 
+                               </td>   
+                               <td width='15%' colspan='5' align='center'>
+                                       <span id='search_info_table' class='hide_me'>
+                                               <b>&result.info.copies; </b>
+                                       </span>
+                               </td>
+                       </tr>           
+               </tbody>
+       </table>
+</div>
+<div class='resultinfo-bottom-box'>
+       <table>
+               <tbody>
+                       <tr id='result_thead_row'>
+                               <td> 
+                                       <div class='hide_me' id='no_formats' style='padding: 4px;'>
+                                               <b>
+                                                       <span style='color:red;'>*</span>
+                                                       &result.info.no.items;
+                                                       <div>&result.info.format.items;</div>
+                                               </b>
+                                       </div>
+                               </td>
+                               <td>
+                                       <div class='hide_me' id='rresult_show_all' style='padding: 4px;'>
+                                               <a href='javascript:rresultExpandSearch();' id='rresult_show_all_link' 
+                                                       class='classic_link'>&result.info.show; </a>
+                                       </div>
+                               </td>
+                               <td>
+                                       <div class='hide_me' id='rresult_show_here' style='padding: 4px;'>
+                                               <a href='javascript:rresultContractSearch();' id='rresult_show_here_link' 
+                                                       class='classic_link'>&result.info.show; </a>
+                                       </div>
+       
+                               </td>
+                               <td rowspan='2' class='copy_count_cell' style='font-size: 8pt; padding-top: 4px; width: 80px;'  align='center' name='result_thead_ccell'> </td>
+                       </tr>   
+               </tbody>
+       </table>
+</div>
\ No newline at end of file
diff --git a/Open-ILS/web/opac/skin/craftsman/xml/result/result_lowhits.xml b/Open-ILS/web/opac/skin/craftsman/xml/result/result_lowhits.xml
new file mode 100644 (file)
index 0000000..168819e
--- /dev/null
@@ -0,0 +1,39 @@
+<div id='result_low_hits' class='lowhits-box hide_me'>
+       <ul>
+               <li>
+                       <div id='result_low_hits_msg' class='hide_me'>&result.lowhits.few;</div>
+                       <div id='result_zero_hits_msg' class='hide_me'>&result.lowhits.zero;</div>
+               </li>   
+               <!-- spell checker -->
+               <li id='did_you_mean'>
+                       <span>&result.lowhits.did.you.mean; </span>
+                       <a class='classic_link' id='spell_check_link'> </a>
+               </li>
+       
+               <li id='low_hits_remove_format' class='hide_me'>
+                       <span>&result.lowhits.formats; </span>
+                       <a id='low_hits_remove_format_link' class='classic_link'>&result.lowhits.formats.search;</a>
+               </li>
+       
+               <li id='low_hits_cross_ref' class='hide_me'>
+                       <span>&result.lowhits.related;</span>
+                       <div>
+                               <a id='low_hits_xref_link' class='classic_link' style='padding-right: 5px;'> </a>
+                       </div>
+               </li>
+       
+               <li id='low_hits_expand_range' class='hide_me'>
+                       <span>&result.lowhits.expand; </span>
+                       <a id='low_hits_expand_link' class='classic_link' style='padding-right: 5px;'> </a>
+               </li>
+                       
+               <li id='low_hits_search_type' class='hide_me'>
+                       <span>&result.lowhits.class;</span>
+                       <a id='low_hits_title_search' class='classic_link' style='padding-right: 5px;'>&result.lowhits.title;</a>
+                       <a id='low_hits_author_search' class='classic_link' style='padding-right: 5px;'>&result.lowhits.author;</a>
+                       <a id='low_hits_subject_search' class='classic_link' style='padding-right: 5px;'>&result.lowhits.subject;</a>
+                       <a id='low_hits_series_search' class='classic_link' style='padding-right: 5px;'>&result.lowhits.series;</a>
+                       <a id='low_hits_keyword_search' class='classic_link' style='padding-right: 5px;'>&result.lowhits.keyword;</a>
+               </li>
+       </ul>
+</div>
\ No newline at end of file
diff --git a/Open-ILS/web/opac/skin/craftsman/xml/result/result_table.xml b/Open-ILS/web/opac/skin/craftsman/xml/result/result_table.xml
new file mode 100644 (file)
index 0000000..d7c2bf9
--- /dev/null
@@ -0,0 +1,146 @@
+<!-- Search results are spit into this table -->
+
+<div id='result_table_div' xmlns:xi="http://www.w3.org/2001/XInclude">
+
+       <table id='res_table'> 
+
+               <!-- for some reason, this is the only way i can force the cell widths -->
+               <thead id='result_thead'>
+                       <tr>
+                               <td class='result_table_pic_header'></td>
+                               <td> </td>
+                       </tr>
+               </thead>
+
+               <tbody id='result_table'>
+                       <tr>
+
+                               <td class='result_table_row'>
+                                       <!--#include virtual="result_info.xml"-->
+                               </td>
+                       </tr>
+
+                       <!-- Template for displaying a search result.  This row template is cloned and inserted
+                                       for each result returned -->
+
+                       <tr id='result_table_template' class='hide_me'>
+
+                               <!-- Jacket image goes here -->
+
+                               <td align='left'>
+                                       <table class='book-results'>
+                                               <tbody>
+                                                       <tr name='counts_row'>
+                                                               <td class='bookjacket' valign='middle' style='vertical-align: middle;'>
+                                                                       <a><img name='item_jacket' /></a>
+                                                               </td>
+
+                                                               <td name='result_table_title_cell'>
+                                                                       <!-- Title goes here -->
+                                                                       <h1><a title="&result.table.keyword;" name='item_title'> 
+                                                                               <!-- Title goes here -->
+                                                                       </a></h1>
+                                                                       
+                                                                       <h2><a title="&result.table.author;" name='item_author'> 
+                                                                               <!-- Author goes here -->
+                                                                       </a></h2>
+                                                                       <blockquote>
+                                                                               <span name='result_table_extra_span' class='hide_me'>
+                                                                                       <span name='result_table_pub_box'> 
+                                                                                               <span name='result_table_edition_span'></span> |
+                                                                                               <span name='result_table_pub_span'> </span> |
+                                                                                               <span name='result_table_phys_span'> </span>
+                                                                                       </span>
+                                                                               </span>
+                                                                       </blockquote>
+
+                                                                       <div name='result_table_format_cell'>
+                                                                               <div class='tool-icons'>
+                                                                                       <a name='text_link'><img src='../../../../images/tor/book-icon.gif' class='dim' /></a>
+                                                                                       <a name='sound recording-nonmusical_link'><img src='../../../../images/tor/nonmusic-icon.gif' class='dim' /></a>
+                                                                                       <a name='moving image_link'><img src='../../../../images/tor/mov-icon.gif' class='dim' /></a>
+                                                                                       <a name='software, multimedia_link'><img src='../../../../images/tor/software-icon.gif' class='dim' /></a>
+                                                                                       <a name='sound recording-musical_link'><img src='../../../../images/tor/sound-icon.gif' class='dim' /></a>
+                                                                                       <a name='cartographic_link'><img src='../../../../images/tor/earth-icon.gif' class='dim' /></a>
+                                                                                       <a name='mixed material_link'><img src='../../../../images/tor/mix-icon.gif' class='dim' /></a>
+                                                                                       <a name='notated music_link'><img src='../../../../images/tor/mussymbol-icon.gif' class='dim' /></a>
+                                                                                       <a name='sound recording_link'><img src='../../../../images/tor/recsound-icon.gif' class='dim' /></a>
+                                                                                       <a name='still image_link'><img src='../../../../images/tor/pic-icon.gif' class='dim' /></a>
+                                                                                       <a name='three dimensional object_link'><img src='../../../../images/tor/threed-icon.gif' class='dim' /></a>
+                                                                                       <div class='clear'></div>
+                                                                               </div>
+                                                                               <span class='hide_me' style='color: #9999FF; padding-left: 10px; font-size: 7pt; font-weight: 300;'> 
+                                                                                       <span>&common.relevancy; </span><span name='relevancy_span'> </span>
+                                                                               </span>
+       
+                                                                               <span class='placeholder hide_me' name='place_hold_span'>
+                                                                                       <a href='javascript:void(0);' name='place_hold_link'>&opac.holds.placeHold;</a>
+                                                                               </span>
+                                                                               <div class='clear'></div>
+       
+                                                                               <!-- Empty span used for creating unAPI links -->
+                                                                               <abbr name="unapi" class="unapi-id">
+                                                                                       <!-- unAPI URI goes here -->
+                                                                               </abbr>
+
+                                                                           <!-- Empty span used for creating Google Book Search-->
+                                                                           <span name="googleBooks" class="hide_me">
+                                                                                   <a style='padding-left: 8px;' class='classic_link' name="googleBooks-link">&result.googleBooks.browse;</a>
+                                                                           </span>
+    
+                                                                       </div>
+                                                                       
+                                                               </td>
+
+                                                               <!-- Copy this td for each copy count appended -->
+                                                               <td nowrap='nowrap' name="copy_count_cell" class='count' style="width: 80px; padding: 6px 2px;"> </td>
+                                                       </tr>
+                                               </tbody>
+                                       </table>
+                               </td>
+                       </tr>
+               </tbody>
+       </table>
+
+
+   <!-- ====================== -->
+   <div id='result_info_2' class='pageresults-box hide_me'>
+               <span class='hide_me' id='result_info_div2'>
+                  <span> &common.results; </span> 
+                  <b id='offset_start2'> </b>
+                  <span> - </span>
+                  <b id='offset_end2'> </b>
+                  <span> &common.ofAtLeast; </span>
+                  <b id='result_count2'> </b>
+                  <span style='padding-left: 6px;'> (page </span>
+                  <span id='current_page2'> </span>
+                  <span> &common.of; </span>
+                  <span id='num_pages2'> </span>
+               </span>
+                                  
+               <span id='start_end_links_span2' class='hide_me' style='padding-left: 40px;' >
+               <a class='search_page_nav_link' id='search_home_link2' 
+                  title="&rdetail.page.results;">&rdetail.start;</a><a class='search_page_nav_link' 
+                  id='prev_link2' title='&rdetail.page.previous;'>&#171;</a>
+       
+               <span class='search_page_nav_link' id='page_numbers2'> </span>
+                  <a  class='search_page_nav_link' id='next_link2' 
+                         title='&rdetail.page.next;'>&#187;</a>
+                         <!--
+                         <a class='search_page_nav_link' 
+                         id='end_link2' title="&rdetail.page.last;">&rdetail.end;</a>
+                         -->
+               </span>   
+   </div>
+   <!-- ====================== -->
+
+
+       <script language='javascript' type='text/javascript'>
+               config.names.result.format_cell = 'result_table_format_cell';
+               config.names.result.format_link = 'resource_link'
+               config.names.result.format_pic = 'format_pic'
+       </script>
+
+</div>
+
+
index beb7315..92afad0 100644 (file)
@@ -842,7 +842,7 @@ function holdProcessResult( hold, res, recurse ) {
 
 function holdsCancel(holdid, user) {
        if(!user) user = G.user;
-       var req = new Request(CANCEL_HOLD, user.session, holdid);
+       var req = new Request(CANCEL_HOLD, user.session, holdid, /* Patron via OPAC */ 6);
        req.send(true);
        return req.result();
        runEvt('common', 'holdUpdated');
index bc0c0fb..43117d6 100644 (file)
@@ -921,6 +921,7 @@ function myopacSaveAddress(row, addr, deleteMe) {
         repl.address_type(addr.address_type());
         repl.within_city_limits(addr.within_city_limits());
         repl.replaces(addr.id());
+        repl.pending('t');
         repl.isnew(true);
         repl.id(null);
         addr = repl;
index 79e179c..508b4cd 100644 (file)
@@ -41,7 +41,7 @@
         var locale = location.href.replace( /.+opac\/([^\/]+)\/skin.+/, '$1' );
         if (!locale) locale = '<!--#echo var="locale"-->';
 
-        djConfig.locale = locale;
+        djConfig.locale = locale.toLowerCase();
 
     </script>
 
diff --git a/Open-ILS/web/opac/theme/craftsman/css/colors.css b/Open-ILS/web/opac/theme/craftsman/css/colors.css
new file mode 100644 (file)
index 0000000..7209c94
--- /dev/null
@@ -0,0 +1,100 @@
+body a                 { color: black; text-decoration: none;}
+body a:visited { color: black; text-decoration: none;}
+body a:hover   { color: red; text-decoration: underline;}
+
+
+/* the idea is to have 4 complimentary colors that 
+ * are used throughout the opac.  Edit those colors
+ * in this file
+ */
+.color_1 { background: #A7EA9D; color: #000000; }
+.color_2 { background: #64EA4F; color: #000000; }
+.color_3 { background: #E0F6E0; color: #000000; }
+.color_4 { background: #E0F0E0; color: #000000; }
+
+.border_1 { border: 1px solid #A7EA9D; }
+.border_2 { border: 1px solid #64EA4F; }
+.border_3 { border: 1px solid #E0F6E0; }
+.border_4 { border: 1px solid #E0F0E0; }
+
+.border_1_2 { border: 2px solid #A7EA9D; }
+.border_2_2 { border: 2px solid #64EA4F; }
+.border_3_2 { border: 2px solid #E0F6E0; }
+.border_4_2 { border: 2px solid #E0F0E0; }
+
+.border_1_3 { border: 3px solid #A7EA9D; }
+.border_2_3 { border: 3px solid #64EA4F; }
+.border_3_3 { border: 3px solid #E0F6E0; }
+.border_4_3 { border: 3px solid #E0F0E0; }
+
+
+
+
+/* general purpose light borders */
+.border_5 { border: 1px solid #D0D0D0; }
+.border_6 { border: 1px solid #808080; }
+
+input:focus { background: #E0F0E0; color: #000000;}
+a:focus { background: #E0F0E0; color: #000000;}
+
+
+/* ---------------------------------------------------------------------- */
+
+.canvas { /* main content div for each page */
+    /*
+       border-left: 3px solid #A7EA9D;
+    border-bottom: 3px solid #A7EA9D;
+       border-top: 3px solid #A7EA9D;
+       */
+}
+
+/* border around home search box */
+.home_search { border: 3px solid #A7EA9D; }
+
+/* main nav sidebar */
+.sidebar_item_active { background: #deddd2; }
+
+/* record detail summary block */
+.rdetail_desc { border: 1px solid #A7EA9D; }
+.rdetail_item { border: 1px solid #A7EA9D; }
+.rdetail_extras_selected { background: #E0F0E0;} 
+
+
+.data_grid thead tr { background: #E0F0E0; color: #000000; }
+.data_grid thead td { border: 1px solid #808080; }
+.data_grid tbody td { border: 1px solid #E0F6E0; }
+.data_grid_nb thead tr { background: #E0F0E0; color: #000000; }
+.data_grid_nb thead td { border: none; }
+.data_grid_nb tbody td { border: none; }
+
+.light_border { border: 1px solid #E0F6E0; }
+
+.adv_quick_search_submit { border-bottom: 3px solid #E0F6E0;}
+
+.myopac_link_active { background: #E0F6E0; }
+
+.sidebar_extra_link { text-decoration: none; }
+#searchbar_tag_on { color: red; }
+.searchbar_item { color: black; } 
+#login_box { border-top: 1px solid #808080; border-bottom: 1px solid #808080; }
+#next_prev_links_dead { color: #808080; text-decoration: none; }
+
+.nav_link_active {font-weight: bold;}
+
+.search_link { text-decoration: none; }
+.result_table_subtable { border-top: 1px solid #E0E0E0; }
+
+.copy_count_cell { border-right: 1px solid #E0E0E0; } 
+.copy_count_div {      border-left: 2px solid #E0F6E0; border-right: 2px solid #E0F6E0; }
+
+#rdetail_image_cell { }
+
+
+
+.x_mark { color: red; }
+.check_mark { color: green; }
+
+#myopac_holds_thaw_date_form { border: 1px solid #E0E0E0; } 
+
+.invalid_field { border: 3px solid red; }
index 0b015e5..2153016 100644 (file)
@@ -1,6 +1,7 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns='http://www.w3.org/1999/xhtml' lang='${locale}' xml:lang='${locale}'>
+<html xmlns='http://www.w3.org/1999/xhtml' lang='[% ctx.locale %]' xml:lang='[% ctx.locale %]'>
     <head>
+        <title>[% ctx.page_title %]</title>
         <link rel='stylesheet' type='text/css' 
             href='[% ctx.media_prefix %]/css/skin/[% ctx.skin %].css'></link>
         <link rel='stylesheet' type='text/css' 
diff --git a/Open-ILS/web/templates/default/acq/financial/list_currency_types.tt2 b/Open-ILS/web/templates/default/acq/financial/list_currency_types.tt2
deleted file mode 100644 (file)
index 01f2fd2..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-[% WRAPPER 'default/base.tt2' %]
-<div id='oils-acq-list-header' class='container'>
-    <div id='oils-acq-list-header-label'>Currency Types</div>
-</div>
-
-<!-- load the page-specific JS -->
-<script src='[% ctx.media_prefix %]/js/ui/default/acq/financial/list_currency_types.js'> </script>
-
-<div class='oils-acq-actions-div'>
-    <div dojoType="dijit.form.DropDownButton">
-        <!-- TODO: add perm and disable button if necessary XXX -->
-        <span>New Currency Type</span>
-        <div dojoType="dijit.TooltipDialog" execute="createCT(arguments[0]);">
-            <table class='dijitTooltipTable'>
-                <tr>
-                    <td><label for="label">Label: </label></td>
-                    <td><input dojoType="dijit.form.TextBox" name="label"/></td>
-                </tr>
-                <tr>
-                    <td><label for="code">Code: </label></td>
-                    <td><input dojoType="dijit.form.TextBox" name="code"/></td>
-                </tr>
-                <tr>
-                    <td colspan='2' align='center'>
-                        <button dojoType=dijit.form.Button type="submit">Create</button>
-                    </td>
-                </tr>
-            </table>
-        </div>
-    </div> 
-
-    <button dojoType="dijit.form.Button" onclick="deleteSelectedCT()">
-        Delete Selected
-    </button>
-</div>
-
-<!-- The main grid lives here -->
-</script> 
-<div dojoType="dijit.layout.ContentPane" layoutAlign="top"> 
-    <div dojoType="dijit.layout.ContentPane" layoutAlign="client" style='height:600px;'> 
-        <table jsId="currencyTypeListGrid" dojoType="dojox.grid.DataGrid" query="{code: '*'}" rowSelector='20px'> 
-            <thead> 
-                <tr> 
-                    <th field="code">Code</th> 
-                    <th field="label" width='auto'>Label</th> 
-                </tr> 
-            </thead> 
-        </table>     
-    </div> 
-</div> 
-
-[% END %]
diff --git a/Open-ILS/web/templates/default/actor/user/register.tt2 b/Open-ILS/web/templates/default/actor/user/register.tt2
new file mode 100644 (file)
index 0000000..ae66734
--- /dev/null
@@ -0,0 +1,141 @@
+[% ctx.page_title = 'User Editor' %]
+[% WRAPPER default/base.tt2 %]
+<script src='[% ctx.media_prefix %]/js/ui/default/actor/user/register.js'> </script>
+
+<style>
+
+    /* XXX Move me into the CSS tree XXX */
+
+    #uedit-tbody tr td {
+        padding: 5px;
+        text-align: left;
+    }
+
+
+    #uedit-save-div {
+        position: fixed;
+        top:40px;
+        right:30px;
+        width:300px;
+        border:2px solid #d9e8f9;
+        -moz-border-radius: 10px;
+        font-weight: bold;
+        padding: 12px;
+        text-align:center;
+        vertical-align:middle;
+    }
+
+    #uedit-help-div {
+        position: fixed;
+        top:124px;
+        right:30px;
+        width:300px;
+        border:2px dashed #d9e8f9;
+        -moz-border-radius: 10px;
+        font-weight: bold;
+        padding: 20px;
+    }
+    .uedit-help {
+        width: 25px;
+        border:1px solid #e0e0e0;
+        text-align:center;
+        vertical-align:middle;
+    }
+    .divider td {
+        min-height:10px;
+        background-color: #e0e0e0;
+    }
+
+    .divider span { padding: 0px 5px 0px 5px; }
+
+    .newaddr-row td {
+        text-align: right;
+        border-top:1px dashed #d9e8f9;
+    }
+    .newaddr-row td:last-child {
+        border-right:1px dashed #d9e8f9;
+    }
+
+    .uedit-addr-del-button {margin-left: 10px; color:red;}
+
+</style>
+
+<table>
+    <tbody id='uedit-tbody'>
+        <tr fmclass='ac' fmfield='barcode'/>
+        <tr fmclass='au' fmfield='usrname'/>
+        <tr fmclass='au' fmfield='passwd'/>
+        <tr fmclass='au' fmfield='passwd'><td/><td>Verify Password</td><td/></tr>
+        <tr fmclass='au' fmfield='first_given_name'/>
+        <tr fmclass='au' fmfield='second_given_name'/>
+        <tr fmclass='au' fmfield='family_name'/>
+        <tr fmclass='au' fmfield='suffix'/>
+        <tr fmclass='au' fmfield='alias'/>
+        <tr fmclass='au' fmfield='dob'/>
+        <tr fmclass='au' fmfield='juvenile'/>
+        <tr fmclass='au' fmfield='ident_type'/>
+        <tr fmclass='au' fmfield='ident_value'/>
+        <tr fmclass='au' fmfield='email'/>
+        <tr fmclass='au' fmfield='day_phone'/>
+        <tr fmclass='au' fmfield='evening_phone'/>
+        <tr fmclass='au' fmfield='other_phone'/>
+        <tr fmclass='au' fmfield='home_ou'/>
+        <tr fmclass='au' fmfield='profile'/>
+        <tr fmclass='au' fmfield='expire_date'/>
+        <tr fmclass='au' fmfield='net_access_level'/>
+        <tr fmclass='au' fmfield='active'/>
+        <tr fmclass='au' fmfield='barred'/>
+        <tr fmclass='au' fmfield='master_account'/>
+        <tr fmclass='au' fmfield='claims_returned_count'/>
+        <tr fmclass='au' fmfield='alert_message' wclass='dijit.form.Textarea' wstyle='height:5em'/>
+
+        <!-- Address -->
+        <tr name='uedit-addr-divider' class='divider' type='addr-template'>
+            <td colspan='2'>Address</td>
+            <td>
+                <span>Mailing</span><input type='radio' name='mailing_address'>
+                <span>Billing</span><input type='radio' name='billing_address'>
+                <button name='delete-button' class='uedit-addr-del-button'>X</button>
+            </td>
+        </tr>
+        <tr fmclass='aua' fmfield='address_type' type='addr-template'/>
+        <tr fmclass='aua' fmfield='post_code' type='addr-template'/>
+        <tr fmclass='aua' fmfield='street1' type='addr-template'/>
+        <tr fmclass='aua' fmfield='street2' type='addr-template'/>
+        <tr fmclass='aua' fmfield='city' type='addr-template'/>
+        <tr fmclass='aua' fmfield='county' type='addr-template'/>
+        <tr fmclass='aua' fmfield='state' type='addr-template'/>
+        <tr fmclass='aua' fmfield='country' type='addr-template'/>
+        <tr fmclass='aua' fmfield='valid' type='addr-template'/>
+        <tr fmclass='aua' fmfield='within_city_limits' type='addr-template'/>
+
+        <tr id='new-addr-row' class='newaddr-row'>
+            <td colspan='0' style='text-align:center;'>
+                <button dojoType='dijit.form.Button' onClick='uEditNewAddr'>New Address</button>
+            </td>
+        </tr>
+
+        <!-- stat cats -->
+        <tr class='divider' id='stat-cat-divider'><td colspan='0'>Statistical Categories</td></tr>
+        <tr id='stat-cat-row-template'><td class='uedit-help'/><td name='name'/><td name='widget'/></tr>
+
+        <!-- surveys -->
+        <tr id='survey-row-template' class='divider'><td colspan='0' name='name'/></tr>
+        <tr id='survey-question-row-template'><td class='uedit-help'/><td name='question'/><td name='answers'/></tr>
+    </tbody>
+</table>
+
+<div id='uedit-save-div'>
+    <button dojoType='dijit.form.Button' jsId='saveButton' onClick='uEditSave'>Save</button>
+    <button dojoType='dijit.form.Button' jsId='saveCloneButton' onClick='uEditSaveClone'>Save &amp; Clone</button>
+</div>
+
+<!-- context help widget -->
+<a class='hidden' id='uedit-help-template'><img src='/opac/images/advancedsearch-icon.png'></img></a>
+<fieldset id='uedit-help-div' class='hidden'>
+    <legend id='uedit-help-field'/>
+    <div id='uedit-help-text'/>
+</fieldset>
+
+[% END %]
+
diff --git a/Open-ILS/web/templates/default/conify/global/acq/currency_type.tt2 b/Open-ILS/web/templates/default/conify/global/acq/currency_type.tt2
new file mode 100644 (file)
index 0000000..3399bc2
--- /dev/null
@@ -0,0 +1,26 @@
+[% WRAPPER default/base.tt2 %]
+<script>
+    dojo.require('openils.widget.AutoGrid');
+    openils.Util.addOnLoad(
+        function() { 
+            grid.loadAll({order_by:{acqct : 'code'}}); 
+        }
+    );
+</script>
+<div dojoType="dijit.layout.ContentPane" layoutAlign="top" class='oils-header-panel'>
+    <div>Currency Type</div>
+    <div><button dojoType='dijit.form.Button' onClick='grid.showCreateDialog()'>New</button></div>
+</div>
+<div dojoType="dijit.layout.ContentPane" layoutAlign="client" style='height:600px;'>
+    <table  jsId="grid" 
+            dojoType="openils.widget.AutoGrid" 
+            fieldOrder="['code', 'label']"
+            defaultCellWidth='12'
+            query="{code: '*'}" 
+            fmClass='acqct' 
+            editOnEnter='true'>
+    </table>
+</div>
+[% END %]
+
+
diff --git a/Open-ILS/web/templates/default/conify/global/acq/exchange_rate.tt2 b/Open-ILS/web/templates/default/conify/global/acq/exchange_rate.tt2
new file mode 100644 (file)
index 0000000..48a9a81
--- /dev/null
@@ -0,0 +1,26 @@
+[% WRAPPER default/base.tt2 %]
+<script>
+    dojo.require('openils.widget.AutoGrid');
+    openils.Util.addOnLoad(
+        function() { 
+            erGrid.loadAll({order_by:{acqpro : 'name'}}); 
+        }
+    );
+</script>
+<div dojoType="dijit.layout.ContentPane" layoutAlign="top" class='oils-header-panel'>
+    <div>Exchange Rates</div>
+    <div><button dojoType='dijit.form.Button' onClick='erGrid.showCreateDialog()'>New</button></div>
+</div>
+<div dojoType="dijit.layout.ContentPane" layoutAlign="client" style='height:600px;'>
+    <table  jsId="erGrid" 
+            dojoType="openils.widget.AutoGrid" 
+            fieldOrder="['id', 'from_currency', 'to_currency', 'ratio']" 
+            defaultCellWidth='12'
+            query="{id: '*'}" 
+            fmClass='acqexr' 
+            editOnEnter='true'>
+    </table>
+</div>
+[% END %]
+
+
diff --git a/Open-ILS/web/templates/default/conify/global/acq/provider.tt2 b/Open-ILS/web/templates/default/conify/global/acq/provider.tt2
new file mode 100644 (file)
index 0000000..27cdf74
--- /dev/null
@@ -0,0 +1,30 @@
+[% WRAPPER default/base.tt2 %]
+<script src='[% ctx.media_prefix %]/js/ui/default/conify/global/acq/provider.js'> </script>
+<script> var providerId = '[% ctx.page_args.0 %]';</script>
+
+<div id='provider-list-div' class='hidden'>
+    <div dojoType="dijit.layout.ContentPane" layoutAlign="top" class='oils-header-panel'>
+        <div>Provider</div>
+        <div><button dojoType='dijit.form.Button' onClick='pListGrid.showCreateDialog()'>New</button></div>
+    </div>
+    <div dojoType="dijit.layout.ContentPane" layoutAlign="client" style='height:600px;'>
+        <table  jsId="pListGrid" 
+                dojoType="openils.widget.AutoGrid" 
+                fieldOrder="['id', 'name', 'code', 'owner', 'currency_type']" 
+                defaultCellWidth='12'
+                query="{id: '*'}" 
+                fmClass='acqpro' 
+                editOnEnter='true'>
+            <thead>
+                <tr><th field='name' get='getProviderName'/></tr>
+            </thead>
+        </table>
+    </div>
+</div>
+<div id='provider-details-div' class='hidden'>
+    <div dojoType="dijit.layout.ContentPane" layoutAlign="client" style='height:600px;'>
+        <div id='provider-summary-pane'/>
+    </div>
+</div>
+[% END %]
+
diff --git a/Open-ILS/web/templates/default/conify/global/action_trigger/event_definition.tt2 b/Open-ILS/web/templates/default/conify/global/action_trigger/event_definition.tt2
new file mode 100644 (file)
index 0000000..5b0834f
--- /dev/null
@@ -0,0 +1,114 @@
+[% WRAPPER default/base.tt2 %]
+<script>
+    dojo.require('dijit.layout.TabContainer');
+    dojo.require('openils.widget.AutoGrid');
+    var loaded = {'tab-atevdef' : true};
+
+    openils.Util.addOnLoad(
+        function() { 
+            edGrid.loadAll({order_by:{atevdef : 'hook'}}); 
+            dojo.connect(tabs,'selectChild', 
+                function(child) { 
+                    if(loaded[child.id]) return;
+                    loaded[child.id] = true;
+                    switch(child.id) {
+                        case 'tab-ath': 
+                            thGrid.loadAll({order_by:{ath : 'key'}}); 
+                            break;
+                        case 'tab-atreact': 
+                            trGrid.loadAll({order_by:{atreact : 'module'}}); 
+                            break;
+                        case 'tab-atval': 
+                            tvGrid.loadAll({order_by:{atval : 'module'}}); 
+                            break;
+                    }
+                }
+            );
+        }
+    );
+</script>
+
+<div dojoType="dijit.layout.TabContainer" style='height:100%;' jsId='tabs'>
+
+    <div dojoType="dijit.layout.ContentPane" title='Event Definitions' selected='true' id='tab-atevdef'>
+        <div dojoType="dijit.layout.ContentPane" layoutAlign="top" class='oils-header-panel'>
+            <div>Trigger Event Definitions</div>
+            <div><button dojoType='dijit.form.Button' onClick='edGrid.showCreateDialog()'>New</button></div>
+        </div>
+        <div dojoType="dijit.layout.ContentPane" layoutAlign="client" style='height:90%'>
+            <table  jsId="edGrid" 
+                    dojoType="openils.widget.AutoGrid" 
+                    fieldOrder="['id', 'owner', 'hook', 'active', 'delay', 'validator', 'reactor']"
+                    query="{id: '*'}" 
+                    fmClass='atevdef'
+                    editOnEnter='true'>
+            </table>
+        </div>
+    </div>
+
+    <div dojoType="dijit.layout.ContentPane" title='Hooks' id='tab-ath'>
+        <div dojoType="dijit.layout.ContentPane" layoutAlign="top" class='oils-header-panel'>
+            <div>Trigger Hooks</div>
+            <div><button dojoType='dijit.form.Button' onClick='thGrid.showCreateDialog()'>New</button></div>
+        </div>
+        <div dojoType="dijit.layout.ContentPane" layoutAlign="client" style='height:90%'>
+            <table  jsId="thGrid" 
+                    dojoType="openils.widget.AutoGrid" 
+                    fieldOrder="['key', 'core_type', 'description', 'passive']"
+                    query="{key: '*'}" 
+                    fmClass='ath'
+                    fmClass='atval'
+                    defaultCellWidth='12'
+                    editOnEnter='true'>
+            </table>
+        </div>
+    </div>
+
+    <div dojoType="dijit.layout.ContentPane" title='Reactors' id='tab-atreact'>
+        <div dojoType="dijit.layout.ContentPane" layoutAlign="top" class='oils-header-panel'>
+            <div>Trigger Reactors</div>
+            <div><button dojoType='dijit.form.Button' onClick='trGrid.showCreateDialog()'>New</button></div>
+        </div>
+        <div dojoType="dijit.layout.ContentPane" layoutAlign="client" style='height:90%'>
+            <table  jsId="trGrid" 
+                    dojoType="openils.widget.AutoGrid" 
+                    query="{module: '*'}" 
+                    fmClass='atreact'
+                    fmClass='atval'
+                    editOnEnter='true'>
+                <thead>
+                    <tr>
+                        <th field='module' width='200px;'/>
+                        <th field='description' width='auto'/>
+                    </tr>
+                </thead>
+            </table>
+        </div>
+    </div>
+
+    <div dojoType="dijit.layout.ContentPane" title='Validators' id='tab-atval'>
+        <div dojoType="dijit.layout.ContentPane" layoutAlign="top" class='oils-header-panel'>
+            <div>Trigger Validators</div>
+            <div><button dojoType='dijit.form.Button' onClick='tvGrid.showCreateDialog()'>New</button></div>
+        </div>
+        <div dojoType="dijit.layout.ContentPane" layoutAlign="client" style='height:90%'>
+            <table  jsId="tvGrid" 
+                    dojoType="openils.widget.AutoGrid" 
+                    query="{module: '*'}" 
+                    fmClass='atval'
+                    editOnEnter='true'>
+                <thead>
+                    <tr>
+                        <th field='module' width='200px'/>
+                        <th field='description' width='auto'/>
+                    </tr>
+                </thead>
+            </table>
+        </div>
+    </div>
+
+</div>
+
+[% END %]
+
+
diff --git a/Open-ILS/web/templates/default/conify/global/config/idl_field_doc.tt2 b/Open-ILS/web/templates/default/conify/global/config/idl_field_doc.tt2
new file mode 100644 (file)
index 0000000..8fbedeb
--- /dev/null
@@ -0,0 +1,29 @@
+[% WRAPPER default/base.tt2 %]
+<script src='[% ctx.media_prefix %]/js/ui/default/conify/global/config/idl_field_doc.js'> </script>
+<table style='width:100%;margin-bottom:10px;'>
+    <tr>
+        <td align='left'><h3>Field Documentation</h3></td>
+        <td align='right'>
+            <span dojoType='dijit.form.FilteringSelect' jsId='fmClassSelector'></span>
+            <button dojoType='dijit.form.Button' onClick='fdocGrid.showCreateDialog()'>New</button>
+        </td>
+    </tr>
+</table>
+<div dojoType="dijit.layout.ContentPane" layoutAlign="client" style='height:90%'>
+    <table  jsId="fdocGrid" 
+            dojoType="openils.widget.AutoGrid" 
+            fieldOrder="['id', 'fm_class', 'field', 'owner', 'string']"
+            query="{id: '*'}" 
+            fmClass='fdoc'
+            defaultCellWidth='12'
+            editOnEnter='true'>
+        <thead>
+            <tr><th field='string' width='auto'/></tr>
+        </thead>
+    </table>
+</div>
+<div class='hidden'>
+    <span dojoType='dijit.form.FilteringSelect' jsId='editClassSelector'></span>
+    <span dojoType='dijit.form.FilteringSelect' jsId='editFieldSelector'></span>
+</div>
+[% END %]
index ddf0487..5448b01 100644 (file)
         <div dojoType="dijit.form.DropDownButton">
             <span>Admin</span>
             <div dojoType="dijit.Menu">
-                <div dojoType="dijit.MenuItem" iconClass="dijitEditorIcon dijitEditorIconCopy" 
-                        onClick="location.href = '[% ctx.base_uri %]/acq/fund/list';">Funds</div>
-                <div dojoType="dijit.MenuItem" iconClass="dijitEditorIcon dijitEditorIconCopy" 
-                        onClick="location.href = '[% ctx.base_uri %]/acq/funding_source/list';">Funding Sources</div>
-                <div dojoType="dijit.MenuItem" iconClass="dijitEditorIcon dijitEditorIconCopy" 
-                        onClick="location.href = '[% ctx.base_uri %]/acq/provider/list';">Providers</div>
-                <div dojoType="dijit.MenuItem" iconClass="dijitEditorIcon dijitEditorIconCopy" 
-                        onClick="location.href = '[% ctx.base_uri %]/acq/currency_type/list';">Currency Types</div>
-                <div dojoType="dijit.MenuItem" iconClass="dijitEditorIcon dijitEditorIconCopy" 
-                        onClick="location.href = '[% ctx.base_uri %]/conify/global/config/billing_type';">Billing Types</div>
-                <div dojoType="dijit.MenuItem" iconClass="dijitEditorIcon dijitEditorIconCopy" 
-                        onClick="location.href = '[% ctx.base_uri %]/conify/global/config/standing_penalty';">Standing Penalties</div>
-                <div dojoType="dijit.MenuItem" iconClass="dijitEditorIcon dijitEditorIconCopy" 
-                        onClick="location.href = '[% ctx.base_uri %]/conify/global/permission/grp_penalty_threshold';">Group Penalty Thresholds</div>
+                <div dojoType="dijit.PopupMenuItem" iconClass="dijitEditorIcon dijitEditorIconCopy">
+                    <span>Acquisitions</span>
+                     <div dojoType="dijit.Menu">
+                        <div dojoType="dijit.MenuItem" iconClass="dijitEditorIcon dijitEditorIconCopy"
+                            onClick="location.href = '[% ctx.base_uri %]/acq/fund/list';">Funds</div>
+                        <div dojoType="dijit.MenuItem" iconClass="dijitEditorIcon dijitEditorIconCopy" 
+                                onClick="location.href = '[% ctx.base_uri %]/acq/funding_source/list';">Funding Sources</div>
+                        <div dojoType="dijit.MenuItem" iconClass="dijitEditorIcon dijitEditorIconCopy" 
+                                onClick="location.href = '[% ctx.base_uri %]/conify/global/acq/provider';">Providers</div>
+                        <div dojoType="dijit.MenuItem" iconClass="dijitEditorIcon dijitEditorIconCopy" 
+                                onClick="location.href = '[% ctx.base_uri %]/acq/currency_type/list';">Currency Types</div>
+                        <div dojoType="dijit.MenuItem" iconClass="dijitEditorIcon dijitEditorIconCopy" 
+                                onClick="location.href = '[% ctx.base_uri %]/acq/exchange_rate';">Exchange Rates</div>
+                    </div>
+                </div>
+                <div dojoType="dijit.PopupMenuItem" iconClass="dijitEditorIcon dijitEditorIconCopy">
+                    <span>Config</span>
+                     <div dojoType="dijit.Menu">
+                        <div dojoType="dijit.MenuItem" iconClass="dijitEditorIcon dijitEditorIconCopy" 
+                                onClick="location.href = '[% ctx.base_uri %]/conify/global/config/billing_type';">Billing Types</div>
+                        <div dojoType="dijit.MenuItem" iconClass="dijitEditorIcon dijitEditorIconCopy" 
+                                onClick="location.href = '[% ctx.base_uri %]/conify/global/config/standing_penalty';">Standing Penalties</div>
+                        <div dojoType="dijit.MenuItem" iconClass="dijitEditorIcon dijitEditorIconCopy" 
+                                onClick="location.href = '[% ctx.base_uri %]/conify/global/permission/grp_penalty_threshold';">
+                                    Group Penalty Thresholds</div>
+                        <div dojoType="dijit.MenuItem" iconClass="dijitEditorIcon dijitEditorIconCopy" 
+                                onClick="location.href = '[% ctx.base_uri %]/conify/global/config/idl_field_doc';">Field Documentation</div>
+                        <div dojoType="dijit.MenuItem" iconClass="dijitEditorIcon dijitEditorIconCopy" 
+                                onClick="location.href = '[% ctx.base_uri %]/conify/global/config/z3950_source';">Z39.50 Sources</div>
+                        <div dojoType="dijit.MenuItem" iconClass="dijitEditorIcon dijitEditorIconCopy" 
+                                onClick="location.href = '[% ctx.base_uri %]/conify/global/config/circ_modifier';">Circulation Modifiers</div>
+                        <div dojoType="dijit.MenuItem" iconClass="dijitEditorIcon dijitEditorIconCopy" 
+                                onClick="location.href = '[% ctx.base_uri %]/conify/global/action_trigger/event_definition';">Action Trigger</div>
+                    </div>
+                </div>
             </div>
         </div>
     </div>
index 982d7da..de317d3 100644 (file)
@@ -8,7 +8,7 @@
 Evergreen is a library automation software product. It assists libraries in day-to-day operations such as checking out materials, keeping track of patrons, and providing a web-based library catalog. The majority of the workings of Evergreen are behind the scenes, and users (or patrons) rarely see anything behind the web catalog. The library staff, on the other hand, spend much of their day utilizing the software in order to do their jobs efficiently and effectively.
 </p>
 <p>
-Evergreen calculates due dates and loan periods. It determines how many renewals a user may have. It keeps track of where all the books, CD's, DVD's, and other materials a library may own is located and their condition. The Evergreen ILS has a user-friendly web catalog that allows patrons to find what they are looking for. It does all of that, and even more. 
+Evergreen calculates due dates and loan periods. It determines how many renewals a user may have. It keeps track of where all the books, CD's, DVD's, and other materials a library may own are located and their condition. The Evergreen ILS has a user-friendly web catalog that allows patrons to find what they are looking for. It does all of that, and even more. 
 </p>
 <p>Evergreen is Copyright &#0169; Georgia Public Library Service - A Unit of the University System of Georgia, and others. The Evergreen software is distributed under the GNU General Public License, Version 2.</p>
 </blockquote>
@@ -29,7 +29,7 @@ Evergreen calculates due dates and loan periods. It determines how many renewals
 <h2>The Translation Team:</h2>
 <ul>
 <li><b>Vaclav Jansa, Linda Skolkova, and Anna Stocklova</b>, <a href="http://uisk.ff.cuni.cz/">Institute of Information Studies and Librarianship, Faculty of Arts, Charles University, Prague</a>, cs-CZ</br/></li>
-<li><b>John Fink</b> (<a href="http://mcmaster.ca">McMaster University</a>) and Warren Layton (<a href="http://thebookpile.wordpress.com/">)</b>, en-CA<br/></li>
+<li><b>John Fink</b> (<a href="http://mcmaster.ca">McMaster University</a>) and <b><a href="http://thebookpile.wordpress.com/">Warren Layton</a></b>, en-CA<br/></li>
 <li><b><a href="http://nrcan.gc.ca/">Natural Resources Canada</a></b>, fr-CA<br/></li>
 <li><b>Tigran Zargaryan</b>, <a href="http://www.flib.sci.am">Fundamental Scientific Library of the National Academy of Sciences of the Republic of Armenia</a>, hy-AM<br/></li>
 </ul>
index 9d17257..f566860 100644 (file)
@@ -130,18 +130,26 @@ function my_init() {
 
                // Try to get the locale from our preferences
                netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
-        try {
-            const Cc = Components.classes;
-            const Ci = Components.interfaces;
-            locale = Cc["@mozilla.org/preferences-service;1"].
+               try {
+                       const Cc = Components.classes;
+                       const Ci = Components.interfaces;
+                       locale = Cc["@mozilla.org/preferences-service;1"].
                                getService(Ci.nsIPrefBranch).
                                getCharPref("general.useragent.locale");
-        }
+               }
                catch (e) { }
 
-               // Get the locale-specific tooltips
                // TODO: We should send a HEAD request to check for the existence of the desired file
-               // then fall back to the default locale if preferred locale is not necessary
+               // then fall back to the default locale if preferred locale is not necessary;
+               // however, for now we have a simplistic check:
+               //
+               // we currently have translations for only two locales; in the absence of a
+               // valid locale, default to the almighty en-US
+               if (locale != 'en-US' && locale != 'fr-CA') {
+                       locale = 'en-US';
+               }
+
+               // Get the locale-specific tooltips
                req.open('GET','/xul/server/locale/' + locale + '/marcedit-tooltips.xml',true);
 
                context_menus = createComplexXULElement('popupset');
index ca8909b..5761b79 100644 (file)
@@ -646,6 +646,7 @@ function uEditApproveAddr( tbody, row, address ) {
                 // update the ID on the new address
                 address.id(oldId);
                 address.replaces(null);
+                address.pending('f');
                 removeChildren($('ue_address_tbody'));
                    uEditBuildAddrs(patron);
             }
@@ -697,7 +698,7 @@ function uEditBuildAddrFields(patron, address) {
        uEditCheckSharedAddr(patron, address, tbody, row);
     
     // see if this is a pending address
-    if( address.replaces() != null ) {
+    if( isTrue(address.pending()) ) {
         var button = $n(row, 'ue_addr_approve');
         unHideMe(button);
         button.onclick = function() { uEditApproveAddr( tbody, row, address ); }