</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" />
<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">
<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" />
<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" />
<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" />
<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">
</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" />
</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">
</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" />
<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">
</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" />
<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">
</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" />
</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" />
<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"/>
<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">
<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" />
<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>
<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"/>
<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">
<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" />
<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" />
<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">
</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" />
<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" />
<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">
<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" />
</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" />
</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" />
<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/>
</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" />
<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" />
<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">
</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>
</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>
<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>
<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>
<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>
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:
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
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
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" ) )
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* );
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");
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;
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);
}
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 );
}
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
}
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 );
}
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 );
}
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 );
}
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 );
}
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;
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 ),
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");
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
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,
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 );
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 {
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);
return jsonNULL;
}
- obj = jsonObjectClone( jsonObjectGetIndex(list, 0) );
+ jsonObject* obj = jsonObjectClone( jsonObjectGetIndex(list, 0) );
jsonObjectFree( list );
jsonObjectFree( fake_params );
}
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(
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, " )" );
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" );
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);
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 );
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 )
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" ) );
leftclass
);
buffer_free(join_buf);
+ if(freeable_hash)
+ jsonObjectFree(freeable_hash);
free(field);
jsonIteratorFree(search_itr);
return NULL;
class
);
buffer_free(join_buf);
+ if(freeable_hash)
+ jsonObjectFree(freeable_hash);
free(fkey);
jsonIteratorFree(search_itr);
return NULL;
} 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",
class
);
buffer_free(join_buf);
+ if(freeable_hash)
+ jsonObjectFree(freeable_hash);
jsonIteratorFree(search_itr);
return NULL;
}
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" );
free(field);
}
- jsonIteratorFree(search_itr);
+ if(freeable_hash)
+ jsonObjectFree(freeable_hash);
+ jsonIteratorFree(search_itr);
return buffer_release(join_buf);
}
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,
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,
return NULL;
}
- char* subpred = searchPredicate( class, field, node );
+ char* subpred = searchPredicate( class, field, node, ctx );
buffer_add( sql_buf, subpred );
free(subpred);
}
return buffer_release(sql_buf);
}
-static char* SELECT (
+char* SELECT (
/* method context */ osrfMethodContext* ctx,
/* SELECT */ jsonObject* selhash,
// 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;
// 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 ))
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 ))) {
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 {
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 );
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,
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,
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 )) ) {
buffer_add(order_buf, direction);
}
- }
+ } // end while
// jsonIteratorFree(order_itr);
} else if ( snode->type == JSON_ARRAY ) {
buffer_add(order_buf, _f);
free(_f);
- }
+ } // end while
// jsonIteratorFree(order_itr);
return NULL;
}
- }
- }
+ } // end while
+ // jsonIteratorFree(class_itr);
+ }
- // jsonIteratorFree(class_itr);
string = buffer_release(group_buf);
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);
}
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");
}
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;
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(
}
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,
);
*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) {
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,
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 );
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,
/* 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);
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;
+ }
+}
);
}
+ 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,
--- /dev/null
+/*
+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 );
+}
SELECT id,
tcn_source,
tcn_value,
+ deleted,
REGEXP_REPLACE(marc, E'\\n','','g') AS marc
FROM biblio.record_entry
WHERE id = ?
<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'>
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]);
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();
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;
$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;
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 {
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;
}
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;
}
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);
}
'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(
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);
}
#--------------------------------------------------------------------
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 ]})};
}
# 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();
return $data;
} elsif( $api =~ /checkout/ ) {
+ $circulator->is_checkout(1);
$circulator->do_checkout();
} elsif( $api =~ /checkin/ ) {
$circulator->do_hold_notify($circulator->notify_hold)
if $circulator->notify_hold;
$circulator->retarget_holds if $circulator->retarget;
+ $circulator->append_reading_list;
}
}
volume
title
is_renewal
+ is_checkout
is_noncat
is_precat
request_precat
}
if( $self->is_precat ) {
- #$self->script_runner->insert("environment.isPrecat", 1, 1)
$self->make_precat_copy;
return if $self->bail_out;
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
}
+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;
+}
+
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;
},
{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 ) {
}
}
+
+__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",
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;
}
$hold->cancel_time('now');
+ $hold->cancel_cause($cause);
+ $hold->cancel_note($note);
$e->update_action_hold_request($hold)
or return $e->event;
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/;
}
+__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;
__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/);
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!",
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;
}
# 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};
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 = '';
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';
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;
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()
}
$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/::/_/;
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';
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
);
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
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
);
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);
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);
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 {
$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 {
--- /dev/null
+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;
$$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'};
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};
use integer;
use Carp;
+use DateTime;
use MARC::Record;
sub new
sub decode_pattern {
my $self = shift;
my $pattern = $self->{PATTERN}->{y};
+
+ # XXX WRITE ME (?)
}
sub compressible {
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;
# 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
$new[1] -= 12;
}
}
- } elsif (scalar(@cur) == 3) {
+ } elsif (scalar(@new) == 3) {
# Year, Month, Day: now it gets complicated.
if ($new[2] =~ /^[0-9]+$/) {
$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);
}
}
}
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,
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
);
-- 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,
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,
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);
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
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
+);
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
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 (
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
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 (
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
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;
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);
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,
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,
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
);
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
);
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)
);
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))
);
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(),
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);
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
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',
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
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
);
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 (
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 (
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
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;
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.
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)
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,
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;
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;
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')),
(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));
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);
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);
-- 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');
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'));
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;
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
);
| 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 |
--- /dev/null
+01168nam a2200241Ka 4500008004300000020001700043020001300060100006200073100003200135245010900167245006200276250004300338250002900381260016300410260009200573300002000665500002600685500003800711520004400749546001500793650003700808852008100845\1e090114s1964 np 000 m nep d \1e \1fcरु. 1.50\1e \1fcRu. 1.50\1e1 \1faशाह, वीरेन्द्रविक्रम.\1e1 \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),\1e1 \1faपोखरेल, बालकृष्ण,\1feed.\1e1 \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\1e1 \1faशास्त्री, उदयराज.\1e1 \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\1e1 \1faआचार्य, तीर्थप्रसाद ढुङ्गाना,\1fejoint author.\1e1 \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.\1e1 \1faकेशवराज अधिकारी,\1fcशास्त्री,\1fgjoint author.\1e1 \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\1e1 \1faमिश्र, कृष्णानन्द.\1e1 \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ā\1e1 \1faभट्टराई, गुणदेव.\1e1 \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\1e1 \1faसिंह, जनकलाल,\1fejoint author.\1e1 \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.\1e1 \1faसिंह, चन्द्रलाल,\1fejoint author,\1fqबी.ए.\1e1 \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\1e1 \1faप्रधान, जी.एस.\1e1 \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\1e1 \1faशर्मा, गोकुलप्रसाद.\1e1 \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)\1e1 \1faशर्मा, यदुनाथ,\1fcदर्शनाचार्य.\1e1 \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),\1e1 \1faउपाधयाय, गोपीनाथ,\1feed.\1e1 \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)\1e1 \1faपाध्या, नीलकण्ठराव,\1fgएम.एड.\1e1 \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)\1e0 \1faसुवर्ण.\1e0 \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\1e0 \1faविश्वनाथ,\1fcविमल,\1feComp.\1e0 \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\1e1 \1faनिरौला, लक्ष्मीप्रसाद.\1e1 \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\1e1 \1faश्री ५ को सरकार. \1fbशिक्षा मन्त्रालय.\1e1 \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.\1e1 \1faसिंह, प्रचण्डराज,\1fgएम.ए.\1e1 \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āiphalsko 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\1e1 \1faजोशी, हरिहरराज.\1e1 \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\1e1 \1faकोइराला, शंकर.\1e1 \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\1e0 \1faफादर हेग.\1e0 \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\1e1 \1faदोइल, फादर,\1fcएस. जे.\1e1 \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\1e1 \1faयोञ्जन, पास्कल,\1fetr.\1e1 \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\1e1 \1faफ्यारेल, फादर.\1e1 \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\1e0 \1faचित्र संग्रहालय.\1e0 \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\1e1 \1faआ.दी., पार्थमणि,\1fgबी. ए.\1e1 \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\1e1 \1faथापा, नेत्रबहादुर,\1e1 \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ā\1e1 \1faकाफ्ले, कृष्णप्रसाद.\1e1 \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ā\1e1 \1faरैका, जितबहादुर.\1e1 \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\1e1 \1faप्याकुर्याल, योगनाथ.\1e1 \1faPyākuryāl, Yoganāth.\1e10\1faबदला :\1fbसामाजिक उपन्यास /\1fcलेखक योगनाथ प्याकुर्याल.\1e10\1faBadalā :\1fbsāmājika upanyāsa /\1fcLekhaka Yoganāth Pyākuryāl.\1e \1faप्रथम संस्करण.\1e \1faPrathama saṃskaraṇa.\1e \1faकाठमाडौं :\1fbप्याकुर्याल प्रकाशन,\1fc[201-?] [196-?]\1fe(बनारस :\1ffगोपाल प्रेस)\1e \1faKāṭhamāḍauṃ :\1fbPyākuryā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\1e1 \1faशिवाकोटी, पुष्पलाल,\1fetr.,\1fgबी. ए.\1e1 \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\1e1 \1faराई, इन्द्रबहादुर.\1e1 \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ā\1e1 \1faसुन्दास, इन्द्र.\1e1 \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ā\1e1 \1faमोक्तान, वुद्धकुमार.\1e1 \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.\1e0 \1faईश्वरीप्रसाद, \1fcक्रान्तिकारी.\1e0 \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\1e1 \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\1e1 \1faक्षेत्री, रामबहादुर गोतामे.\1e1 \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\1e1 \1faश्री ५ को सरकार. \1fbकृषि प्रचार विभाग..\1e1 \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ā\1e1 \1faदेवकोटा, लक्ष्मीप्रसाद,\1fcमहाकवि,\1fd1966-2016 [1909-1959]\1e1 \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\1e1 \1faसिंह, भवानीभक्त.\1e1 \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\1e1 \1faउपाध्याय, गुणराज.\1e1 \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\1e1 \1faश्री ५ को सरकार. \1fbअर्थ मन्त्रालय.\1e1 \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\1e1 \1faश्री ५ को सरकार. \1fbसंस्कृति विभाग.\1e1 \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.\1e1 \1faतिवारी, भीमनिधि.\1e1 \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ā\1e1 \1faमल्ल, ऋद्धिबहादुर,\1fcसुब्बा.\1e1 \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 \1e1 \1faपन्त, भरतराज,\1fcसाहित्याचार्य.\1e1 \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\1e1 \1faबल, कर्मा ग्याल्छेन,\1fcभिक्षु,\1feed.\1e1 \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.\1e1 \1faपाण्डे, नरदेव.\1e1 \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ā\1e1 \1faमोक्तान, वुद्धिमान.\1e1 \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ā\1e1 \1faबस्नेत, नरेन्द्र बहादुर,\1feJoint author,\1fgएम.ए. एम.एड.\1e1 \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.\1e1 \1faभगत, द्धारिकाराम,\1feJoint author.\1fgबी.ए.डी.एड.\1e1 \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\1e1 \1faशर्मा, दुर्गादेवी.\1e1 \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ā\1e1 \1faश्रेष्ठ, उमाप्रसाद,\1fgएम. एस्सी..\1e1 \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.\1e1 \1faवज्राचार्य,का.\1e1 \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ā\1e1 \1faगोपर्मा, पासाङ,\1fgएम.एस्. बी.ए. बी.एड्.\1e1 \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\1e1 \1faशर्मा, गोकुलप्रसाद.\1e1 \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)\1e1 \1faथापा, भैरवबहादुर.\1e1 \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\1e1 \1faश्रेष्ठ, प्रद्युम्नलाल,\1fgएम.ए.\1e1 \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\1e1 \1faबेरखिन, आई.\1e1 \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\1e1 \1faश्री ५ को सरकार. \1fbकृषि विभाग.\1e1 \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.\1e0 \1faएगृ इकनमिक्स सेक्सन.\1e0 \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\1e1 \1faश्री ५ को सरकार. \1fbकृषि विभाग.\1e1 \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)\1e1 \1faकर्माचार्य, केशवलाल.\1e1 \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ā\1e1 \1faढुंग्याल, तुलसीप्रसाद,\1fejoint author.\1e1 \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.\1e1 \1faअर्जाल, ईश्वरराज,\1fejoint author.\1e1 \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)\1e1 \1faजोशी, रामहरि,\1fgबी.एस्सी.\1e1 \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ā\1e1 \1faजोशी, रामहरि,\1fejoint author,\1fgबी.एस्सी.\1e1 \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.\1e1 \1faआलम, जफीर,\1fejoint author,\1fgबी.एस्सी., डिप.एड.\1e1 \1faĀlama, Japhīr,\1fejoint author,\1fgBī.Essī., Ḍipa.Eḍa.\1e1 \1faशाह, जयनारायण,\1fejoint author.\1e1 \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\1e0 \1faमाओ त्से तुङ.\1e0 \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)\1e1 \1faश्रेष्ठ, बी.एल.\1e1 \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),\1e1 \1faशर्मा, गोकुलप्रसाद.\1e1 \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)\1e1 \1faगोपर्मा, पासाङ.\1e1 \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)\1e1 \1faबस्नेत, नीरमर्दन,\1fejoint author,\1fgएम.ए., बी.एड.\1e1 \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.\1e1 \1faश्रेष्ठ, वेदकेशव,\1fejoint author,\1fgबी.एस्सी.\1e1 \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)\1e1 \1faथापा, नेत्रबहादुर.\1e1 \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एम.ए., बी.एड.\1e1 \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.\1e1 \1faथापा, महेन्द्रबहादुर,\1fejoint author,\1fgएम.एड.\1e1 \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\1e1 \1faसुब्बा, दिल.\1e1 \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ārrhau 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.\1e1 \1faशर्मा, शरदचन्द्र,\1feComp.\1e1 \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\1e1 \1faयोन्जन, हर्क,\1fcविरही.\1e1 \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\1e0 \1faगणेश,\1fcरसिक.\1e0 \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ā̃\1e1 \1faपराजुली, कृष्णप्रसाद.\1e1 \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\1e1 \1faपराजुली, कृष्णप्रसाद.\1e1 \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\1e1 \1faपराजुली, कृष्णप्रसाद.\1e1 \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ā̃\1e1 \1faक्षत्री, लीलबहादुर.\1e1 \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ā\1e1 \1faभट्ट, गोविन्द.\1e1 \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ā\1e1 \1faलोहनी, विष्णुप्रसाद,\1fgएम. ए.\1e1 \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\1e1 \1faथापा, युधिर.\1e1 \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\1e1 \1faतुलाधर, दमनराज,\1fetr.\1e1 \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\1e1 \1faलामिछाने, शंकर.\1e1 \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\1e1 \1faज्ञवाली, कपूर.\1e1 \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ā\1e1 \1faपौडेल, भोलानाथ,\1feJoint ed.\1e1 \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.\1e1 \1faबज्रचार्य, धनवज्र,\1feJoint ed.\1e1 \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ā\1e0 \1faदीर्घवाहु.\1e0 \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
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();
}
@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%;
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; }
.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;
+}
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']
};
}
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];
/* 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');
}
data.push(obj);
+ map[obj.name] = obj;
}
/*
);
*/
- return data;
+ return { list : data, map : map };
}
});
/* ---------------------------------------------------------------------- */
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) {
dojo.require('openils.Event');
dojo.require('fieldmapper.Fieldmapper');
dojo.require('fieldmapper.OrgUtils');
+ dojo.require('openils.Util');
dojo.declare('openils.User', null, {
}
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);
+ };
}
+
--- /dev/null
+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 {};
+ };
+}
+
+
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, {
});
* 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(
selector.setValue(ctypes[0].code()); /* XXX get from setting */
}
);
- }
+ };
}
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);
dojo.declare('openils.widget.AutoFieldWidget', null, {
async : false,
+ cache : {},
/**
* args:
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];
},
/**
- * 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'
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) {
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);
},
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;
}
});
}
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;
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);
+ }
},
/**
[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];
},
startup : function() {
this.inherited(arguments);
this.initAutoEnv();
+ this.hideActionButtons = this.readOnly;
var table = document.createElement('table');
var tbody = document.createElement('tbody');
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);
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);
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() {
}
},
+ 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);
}
}
labelAttr : 'name',
childField : 'children',
tree : null,
- dataList : [],
startup : function() {
this.tree = (typeof this.tree == 'string') ?
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);
},
+++ /dev/null
-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);
--- /dev/null
+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);
--- /dev/null
+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>';
+}
+
+
--- /dev/null
+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);
+
/* 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;
--- /dev/null
+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
--- /dev/null
+.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; }
+
--- /dev/null
+<!--
+<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>
+
--- /dev/null
+<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>
--- /dev/null
+<!--
+<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>
--- /dev/null
+
+<!-- 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>
--- /dev/null
+<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>
--- /dev/null
+<!-- 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>
--- /dev/null
+<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;'> <span style="font-weight:bold;">|</span> </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>
--- /dev/null
+<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> </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>
+
+
--- /dev/null
+<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>
+
--- /dev/null
+
+<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>
+
+
--- /dev/null
+<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' />
--- /dev/null
+
+<!-- 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>
--- /dev/null
+<!-- 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>
--- /dev/null
+
+<!-- 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>
+
--- /dev/null
+<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>
--- /dev/null
+
+<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>
--- /dev/null
+<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>
--- /dev/null
+<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>
+
--- /dev/null
+<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>
+
+
--- /dev/null
+<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>
+
+
--- /dev/null
+<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>
+
+
--- /dev/null
+<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;'><<</a>
+ <span> </span>
+ <a class='np_nav_link classic_link hide_me' id='np_next'
+ href='javascript:rdetailNext();' title='&rdetail.page.next;'>>></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>
--- /dev/null
+ <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>
--- /dev/null
+
+<!-- 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>
+ </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;'> </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 -->
+
+
--- /dev/null
+
+<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>
--- /dev/null
+
+<!-- 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 -->
+
--- /dev/null
+<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);' /> </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
--- /dev/null
+<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;'>«</a>
+
+ <span class='search_page_nav_link' id='page_numbers'> </span>
+
+ <a class='search_page_nav_link' id='next_link'
+ title='&rdetail.page.next;'>»</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
--- /dev/null
+<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
--- /dev/null
+<!-- 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;'>«</a>
+
+ <span class='search_page_nav_link' id='page_numbers2'> </span>
+ <a class='search_page_nav_link' id='next_link2'
+ title='&rdetail.page.next;'>»</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>
+
+
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');
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;
var locale = location.href.replace( /.+opac\/([^\/]+)\/skin.+/, '$1' );
if (!locale) locale = '<!--#echo var="locale"-->';
- djConfig.locale = locale;
+ djConfig.locale = locale.toLowerCase();
</script>
--- /dev/null
+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; }
<!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'
+++ /dev/null
-[% 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 %]
--- /dev/null
+[% 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 & 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 %]
+
--- /dev/null
+[% 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 %]
+
+
--- /dev/null
+[% 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 %]
+
+
--- /dev/null
+[% 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 %]
+
--- /dev/null
+[% 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 %]
+
+
--- /dev/null
+[% 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 %]
<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>
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 © 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>
<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>
// 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');
// update the ID on the new address
address.id(oldId);
address.replaces(null);
+ address.pending('f');
removeChildren($('ue_address_tbody'));
uEditBuildAddrs(patron);
}
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 ); }