From 49e564082fc7ed6c7449f83ac19f5f704a1949ac Mon Sep 17 00:00:00 2001 From: senator Date: Thu, 3 Mar 2011 10:37:32 -0500 Subject: [PATCH] great bleedin' dos2unix conversion --- Open-ILS/web/opac/skin/kcls/css/EricKCLSTest.css | 4 +- Open-ILS/web/opac/skin/kcls/css/style.css | 1748 ++++---- Open-ILS/web/opac/skin/kcls/js/adv_global.js | 720 +-- Open-ILS/web/opac/skin/kcls/js/advanced.js | 390 +- Open-ILS/web/opac/skin/kcls/js/container.js | 134 +- Open-ILS/web/opac/skin/kcls/js/contentcafe.js | 24 +- Open-ILS/web/opac/skin/kcls/js/contentslider.js | 468 +- Open-ILS/web/opac/skin/kcls/js/depth_selector.js | 224 +- Open-ILS/web/opac/skin/kcls/js/fgi-search_bar.js | 206 +- Open-ILS/web/opac/skin/kcls/js/holds.js | 2122 ++++----- Open-ILS/web/opac/skin/kcls/js/marc.js | 454 +- Open-ILS/web/opac/skin/kcls/js/miker-search_bar.js | 226 +- Open-ILS/web/opac/skin/kcls/js/misc.js | 1016 ++--- Open-ILS/web/opac/skin/kcls/js/mresult.js | 270 +- Open-ILS/web/opac/skin/kcls/js/myopac.js | 4636 ++++++++++---------- Open-ILS/web/opac/skin/kcls/js/rdetail.js | 2966 ++++++------- Open-ILS/web/opac/skin/kcls/js/result_common.js | 1732 ++++---- Open-ILS/web/opac/skin/kcls/js/rresult.js | 678 +-- Open-ILS/web/opac/skin/kcls/js/search_bar.js | 210 +- Open-ILS/web/opac/skin/kcls/js/sidebar.js | 456 +- Open-ILS/web/opac/skin/kcls/js/sidebar_extras.js | 488 +-- Open-ILS/web/opac/skin/kcls/js/tips.js | 38 +- .../kcls/xml/advanced/adv_global_row - Copy.xml | 39 - .../opac/skin/kcls/xml/advanced/adv_global_row.xml | 66 +- .../skin/kcls/xml/advanced/advanced_global.xml | 692 +-- Open-ILS/web/opac/skin/kcls/xml/body.xml | 196 +- .../web/opac/skin/kcls/xml/common/js_common.xml | 44 +- .../web/opac/skin/kcls/xml/home/homesearch.xml | 152 +- .../opac/skin/kcls/xml/myopac/myopac_bookbags.xml | 360 +- .../web/opac/skin/kcls/xml/myopac/myopac_fines.xml | 10 +- .../web/opac/skin/kcls/xml/myopac/myopac_holds.xml | 232 +- .../opac/skin/kcls/xml/myopac/myopac_summary.xml | 642 +-- Open-ILS/web/opac/skin/kcls/xml/page_rdetail.xml | 162 +- .../opac/skin/kcls/xml/rdetail/rdetail_extras.xml | 420 +- .../opac/skin/kcls/xml/rdetail/rdetail_summary.xml | 298 +- .../opac/skin/kcls/xml/result/result_header.xml | 48 +- .../web/opac/skin/kcls/xml/result/result_info.xml | 114 +- .../web/opac/skin/kcls/xml/result/result_table.xml | 366 +- Open-ILS/web/opac/skin/kcls/xml/top_nav.xml | 98 +- 39 files changed, 11555 insertions(+), 11594 deletions(-) delete mode 100644 Open-ILS/web/opac/skin/kcls/xml/advanced/adv_global_row - Copy.xml diff --git a/Open-ILS/web/opac/skin/kcls/css/EricKCLSTest.css b/Open-ILS/web/opac/skin/kcls/css/EricKCLSTest.css index 32f43f870a..fd422a97fa 100644 --- a/Open-ILS/web/opac/skin/kcls/css/EricKCLSTest.css +++ b/Open-ILS/web/opac/skin/kcls/css/EricKCLSTest.css @@ -1,2 +1,2 @@ -Please feel free to delete, only for testing purposes. -Test2 +Please feel free to delete, only for testing purposes. +Test2 diff --git a/Open-ILS/web/opac/skin/kcls/css/style.css b/Open-ILS/web/opac/skin/kcls/css/style.css index 53332dc6be..0ac080c590 100644 --- a/Open-ILS/web/opac/skin/kcls/css/style.css +++ b/Open-ILS/web/opac/skin/kcls/css/style.css @@ -1,874 +1,874 @@ -@charset "utf-8"; -/* CSS Document */ - -@import '/js/dojo/dijit/themes/tundra/tundra.css'; - -body { - margin:0; - font-family: Arial, Helvetica, sans-serif; - font-size: 12px; - background:#333; -} - -img { - border: none; -} - -a { - color: #003399; - text-decoration: none; -} - -a:hover { - text-decoration: underline; -} - -#search-wrapper input[type=text] { - border:none; - margin:0; - padding:0; -} - -#search-wrapper select { - border:1px solid #e9ebf3; - margin:0; - padding:0; - width:168px; -} - -/* -#search-wrapper select { - border:0px solid black; - filter:alpha(opacity=0); - -moz-opacity:0; - -khtml-opacity:0; - opacity:0; - padding:0; - margin:0; - height:18px; - font-size: 12px; -} -*/ -h1 { - margin:0; - margin-bottom: 5px; - font-size: 20px; - font-weight:normal; -} - -h2 { - margin:0; - margin-bottom: 5px; - font-size: 14px; - font-weight:bold; -} - -.hide_me { - display: none; - visibility: hidden; -} - -div.select-box-wrapper { - position:absolute; - padding-top:2px; - padding-left:3px; - overflow:hidden; - text-align:left; -} - -div.select-wrapper { - border:1px solid #4C8AB0; - display:inline-block; - position:relative; - z-index:2; - background:url('/opac/skin/kcls/graphics/dropdown.gif') no-repeat right center; -} - -div.select-wrapper:hover { - background:url('/opac/skin/kcls/graphics/dropdown-hover.gif') no-repeat right center; -} - -#dash_wrapper { - width:500px; - position:relative; - top:-26px; -} - -#dashboard { - clear:both; - float:right; - width:384px; -} - -#dashboard span { - font-weight:bold; - position:relative; - left:-1px; -} - -#dash_user { - font-weight:bold; - text-transform:capitalize; -} - -#header { - color: #fff; - padding: 26px 0px 26px 0px; - width: 974px; - margin: auto; - font-size:11px; -} - -#header a { - color: #fff; -} - -#header a:hover { - color: white; - text-decoration: none; -} - -#header-links { - color: #afafaf; - font-size: 11px; - font-weight: bold; - position: relative; - top:4px; - -} - -#header-links a { - color: #afafaf; - display: block; - float:left; - margin-right:22px; -} - -#header-links a:hover { - color: white; - text-decoration: none; -} - -#header #header-links2 { - position:relative; - top:-8px; - color: white; - padding-bottom: 15px; -} - -#header #header-links2 a { - color: white; -} - -#header #header-links2 a:hover { - text-decoration: underline; -} - -#header #your-acct-login { - padding-top:10px; -} - -#gold-links { - margin:auto; - width:974px; - padding-left:0px; -} - -#util-bar { - margin:auto; - width:974px; - padding-left:0px; - height:0px; -} - -#search-wrapper { - border-bottom: 1px solid #e9ebf3; - padding-bottom: 5px; - background: white; -} - -#search_box_wrapper { - border:1px solid #e9ebf3; - padding: 1px; - padding-left:3px; -} - -#search-wrapper #breadcrumb { - margin-top:0px; - font-size: 10px; - float:left; -} - -#search-wrapper #search-within { - margin-top:10px; - float:right; - position:relative; - left:-173px; -} - -#search-wrapper #breadcrumb a { - color: black; -} - -#search-wrapper #search_frm label { - font-size: 10px; -} - -#search-wrapper #search-box { - width:974px; - margin:auto; - padding-left: 0px; -} - -#utils { - float:right; - z-index:1; - width:150px; - height:30px; - background:url('/opac/skin/kcls/graphics/utils-corner-left.png') no-repeat left top; - padding-left: 3px; - color: white; - position:relative; -} - -#utils a { - color: white; - font-size: 10px; -} -#adv_search_tabs { - height:33px; - width:974px; - margin:auto; -} - -#adv_search_tabs a { - float: left; - display: block; - height:33px; - margin-right:7px; -} - -#adv_search { - width:156px; - background:url('/opac/skin/kcls/graphics/adv_search_on.gif') no-repeat bottom; -} - -#num_search { - width:156px; - background:url('/opac/skin/kcls/graphics/num_search_off.gif') no-repeat bottom; -} - -#expert_search { - width:156px; - background:url('/opac/skin/kcls/graphics/expert_search_off.gif') no-repeat bottom; -} - -#acct_tabs, #acct_fines_tabs { - height:33px; - width:974px; - margin:auto; -} - -#acct_tabs a, #acct_fines_tabs a { - float: left; - display: block; - height:33px; - margin-right:7px; -} - -#acct_fines_tab { - width:156px; - background:url('/opac/skin/kcls/graphics/acct_fines_on.jpg') no-repeat bottom; -} -#acct_payments_tab { - width:156px; - background:url('/opac/skin/kcls/graphics/acct_payments_off.jpg') no-repeat bottom; -} - -#acct_summary { - width:156px; - background:url('/opac/skin/kcls/graphics/acct_summary_on.gif') no-repeat bottom; -} - -#acct_checked_out { - width:156px; - background:url('/opac/skin/kcls/graphics/acct_checked_out_off.gif') no-repeat bottom; -} - -#acct_holds { - width:156px; - background:url('/opac/skin/kcls/graphics/acct_holds_off.gif') no-repeat bottom; -} - -#acct_prefs { - width:156px; - background:url('/opac/skin/kcls/graphics/acct_prefs_off.gif') no-repeat bottom; -} - -#acct_favs { - width:156px; - background:url('/opac/skin/kcls/graphics/acct_favs_off.gif') no-repeat bottom; -} - -#acct_lists { - width:156px; - background:url('/opac/skin/kcls/graphics/acct_lists_off.gif') no-repeat bottom; -} - -#rdetail_header { - font-size:14px; - font-weight:bold; - color:#074079; - padding: 5px 7px 6px 0px; - border-bottom: 1px dotted #ccc; -} - -#rdetail_result_count { - color: black; - font-size: 11px; - font-weight: normal; -} - -#rdetail_result_nav { - float:right; - font-size: 11px; - font-weight:normal; -} - -#rdetail_details_table { - margin-top: 15px; -} - -#rdetail_title { - font-size: 18px; -} - -#rdetail_image_cell { - padding-top: 3px; - padding-right: 10px; -} - -.rdetail_aux_utils { - border-left:1px dotted #ccc; - padding-left: 17px; - padding-bottom: 6px; - padding-right: 70px; -} - -.results_aux_utils { - border-left:1px dotted #ccc; - padding-left: 17px; - padding-bottom: 6px; - padding-right: 50px; -} - -#rdetails_status td, #rdetails_status2 td { - white-space:nowrap !important; - padding: 7px 0px 3px 13px; -} - -#rdetails_status_head td { - background-color: #d8d8d8; - padding: 13px 0px 13px 13px; - font-size: 10px; - text-transform: uppercase; - font-weight: bold; -} - -#rdetails_status_head2 td { - padding: 0px; -} - -.rdetail_extras { - height: 29px; - background: #9ad0f1; - padding-top:1px; - margin-bottom: 10px; - margin-top: 10px; - clear:both; -} - -.rdetail_extras_hr { - height: 1px; - background: #b7def5; - margin-left: 1px; - margin-right: 1px; -} - -.rdetail_extras_link { - padding-top: 4px; - padding-left: 12px; - font-size: 10px; - text-transform: uppercase; - font-weight: bold; -} - -.rdetail_extras_lbl { - position: relative; - top: -4px; - left: 7px; -} - -#paginate-homebanner a.toc { - display:block; - width:20px; - height:20px; - background:gray; - float:left; - margin-left:2px; - margin-right:2px; - margin-top:2px; -} - -#rdetail_extras_expand, #rdetail_extras_collapse, #rdetail_locs_collapse { - margin-left: 13px; -} - -#rdetail_locs_expand, #rdetail_locs_collapse { - padding-bottom:3px; - margin-left:13px; -} - -#rdetail_anotes_div .biography { - margin:0; -} - -#paginate-homebanner a.selected { - border: 2px solid black; - margin-top:0px; - margin-left:0px; - margin-right:0px; -} - -#hp-buttons { - margin: auto; - margin-top: 6px; - width: 974px; -} - -#hp-welcome { - position:absolute; - width:295px; - height:192px; - background: url('/opac/skin/kcls/graphics/banner-bg.png') no-repeat; - color: #fff; - padding-left: 33px; - padding-top: 21px; - z-index:9999999999; -} - -#hp-welcome h1 { - font-size: 25px; - margin-bottom:15px; -} - -#hp-welcome a { - color: #fff; - text-decoration: underline; -} - -#hp-banner { - margin: auto; - width:974px; - height: 213px; -} - -#hp-ql-table { - margin-left: 2px; - padding-top: 3px; -} - -#hp-ql-table a { - color: #333; - font-weight: bold; - font-size: 13px; - text-transform: uppercase; - text-decoration: none; - display: block; - width: 144px; - height: 25px; - padding-top: 9px; - padding-left: 15px; - background: url('/opac/skin/kcls/graphics/button-bg.png') no-repeat; -} - -#hp-ql-bottom { - width: 640px; - height: 31px; - padding-left: 24px; - padding-top: 13px; - background: url('/opac/skin/kcls/graphics/hp-links-mid.jpg') repeat-x; -} - -#hp-ql-bottom a { - display: inline-block; - text-decoration: none; - color: white; - font-size: 15px; - font-weight: bold; -} - -#content-wrapper { - background: white; - min-height: 260px; - border-bottom: 1px solid black; -} - -#main-content { - width: 974px; - margin:auto; - padding-left:0px; -} - -#main-content .login_boxes { - border: 1px solid #dedede; - background:url('/opac/skin/kcls/graphics/login-bg.jpg') top repeat-x; - color: #333; -} - -#main-content .login_boxes h1 { - font-weight: normal; - font-size: 25px; - margin:0; -} - -#main-content .left_brain { - padding-left:28px; - padding-top:25px; -} - -#main-content .left_brain input[type=text], #main-content .left_brain input[type=password] { - width:167px; - height:18px; - margin:0; - padding:0; - border:none; - background: none; - font-size: 15px; - color: #333; - font-weight:bold; -} - -#main-content .left_brain .input_bg { - padding:10px 10px 0px 13px; - background: url('/opac/skin/kcls/graphics/login-box-bg.jpg') no-repeat; - width:167px; - height:29px; -} - -#home-buttons-inner { - width:664px; - height:117px; - background:#bda964; -} - -#holds_temp_parent td { - border-bottom:1px solid #dcdbdb; -} - -#holds_temp_parent input, #holds_temp_parent select { - margin:0; -} - - - - -#results_header_bar { - background: #929292; - border-top:1px solid #8b8b8b; -} - -#results_header_inner { - height:32px; - width:974px; - margin:auto; - padding-top:6px; -} - -.results_header_btns { - float:left; - margin-right: 6px; -} - -.results_header_div { - float: left; - width: 0px; - height: 25px; - border-left: 1px solid #7c7c7c; - border-right: 1px solid #9c9c9c; - margin: 0px 13px; -} - -.results_header_lbl { - font-weight: bold; - float: left; - font-size: 11px; - color: #191919; - position: relative; - top: 5px; - margin-right: 6px; -} - -.results_header_sel { - float:left; - position: relative; - top: 2px; - margin:0; -} - -#results_header_nav1 { - padding: 5px 7px 6px 0px; - border-bottom: 1px dotted #ccc; -} - -#results_header_nav1 .h1 { - font-size:14px; - font-weight:bold; - color:#074079; -} - -#start_end_links_span { - font-size: 11px; -} - -#start_end_links_span2 { - font-size: 11px; -} - -.nav_arrow_fix { - font-size:8px; - position:relative; - top:-1px; -} - -#result_table_div { - margin-top: 20px; -} - -#result_numbers1 { - font-size: 11px; - padding-left:15px; -} - - - - - - -.icon_text { - text-transform:capitalize; -} - -.result_table_title_cell { - padding-left: 7px; -} - -#myopac_summary_div p { - margin:0; - margin-bottom: 10px; -} - -#acct_sum_checked_table td { - padding-bottom:5px; -} - -#zero_search_hits p { - margin-top:0; -} - -#zero_hits_term { - text-transform: uppercase; -} - -#zero_search_hits #spell_check_link { - text-transform: uppercase; -} - -#zero_search_hits #zero_hits_suggestions { - text-transform: uppercase; -} - -.results_info_table td { - padding-right: 10px; -} - -#myopac_holds_main_table { - border-collapse: collapse; -} - -#myopac_holds_main_table td { - border: 1px solid black; - -} - -#myopac_prefs_div .data_grid { - border-collapse:collapse; -} - -#myopac_prefs_div .data_grid td { - background:#f0f0f0; - border-bottom:3px solid white; - padding:6px 0px 7px 17px; -} - -.header_middle { - height:22px; - font-size:14px; - font-weight:bold; - color:#074079; - padding: 7px 7px 0px 0px; - border-bottom: 1px dotted #ccc; -} - -.header_middle a { - font-size: 12px; - font-weight: normal; -} - -.acct_sum_row { - padding: 7px 15px; - width: 712px; - background: #f0f0f0; - margin-bottom: 2px; - font-size: 10px; - font-weight: bold; - text-transform: uppercase; -} - -.acct_sum_row a { - text-transform: none; - font-size: 12px; - position:relative; - top:-1px; -} - -.acct_sum_row .view_link { - font-weight: normal; - font-size:12px; -} - -#myopac_sum_fines { - float:right; - padding: 15px 0px 0px 23px; - background: #f0f0f0; - width: 177px; - height: 166px; -} - -.acct_holds_temp td { - text-align: left; -} - -#acct_checked_tabs .align, #acct_holds_tabs .align, #acct_prefs_tabs .align { - float:left; - /*padding-left:10px;*/ -} - -#acct_checked_tabs .selected, #acct_holds_tabs .selected, #acct_prefs_tabs .selected { - /*background:url('/opac/skin/kcls/graphics/gray-arrow.png') left 3px no-repeat;*/ -} - -#acct_checked_main_header, #acct_holds_main_header, #acct_checked_hist_header, #acct_list_header, #acct_list_header_anon, #temp_list_holds { - font-weight:bold; - text-transform:uppercase; - font-size: 10px; -} - -#acct_checked_main_header td, #acct_holds_main_header td, #acct_checked_hist_header td, #acct_list_header td, #acct_list_header_anon td, #temp_list_holds td { - background: #d8d8d8; - padding: 8px 0px 7px 0px; -} - -#acct_list_header select, #acct_list_header_anon select { - font-weight:normal; - text-transform:none; -} - -#acct_holds_activates_table label { - font-weight: bold; - font-size: 11px; - text-transform:uppercase; - padding-right: 5px; -} - -.adv_search_font { - font-size: 10px; -} - -.search_catalog_lbl { - font-size: 14px; -} - -.lbl1 { - font-size:14px; - font-weight:bold; -} - -.lbl2 { - font-size:10px; - font-weight:normal; - position:relative; - top:3px; -} - -#myopac_tabs, #adv_search_parent, #fines_payments_wrapper { - background: #929292; - border-top:1px solid #8b8b8b; - padding-top:5px; - margin-bottom:20px; -} - -#adv_search_parent { - margin-bottom:0px; -} - -#myopac_loading { - width:100%; - text-align:center; - padding-top:20px; - font-size:16px; - font-weight:bold; -} - -.chili_link { - width:100px !important; - text-align: center !important; -} - -.chili_review div.chili_link div { - margin: auto; -} - -/* some facet styling */ -.facetClassContainer { margin: 2px; border: 1px solid #CCC; } -.facetClassLabelContainer { border: 1px solid #CCC; } -.facetClassLabel { font-weight: bold; text-align: center; } -.facetFieldContainer { } -.facetFieldLabel { padding-left: 2px; margin-top: 5px; margin-bottom: 5px; font-weight: bold; text-align: left; } -.extraFacetFieldsWrapper { } -.toggleExtraFacetFieldsButton { float: right; margin: 0px; padding: 0px; } -.facetFieldLineCount { display: inline-block; border-right: 1px solid #CCC; color: gray; width: 3em; margin-right: 3px } -.facetField { border-top: 1px solid #CCC; } -.facetFields { padding-left: 5px; } -.facetFieldLineValue { overflow: hidden; text-overflow: ellipsis; } - -#footer { - padding-top:5px; - padding-bottom: 10px; - color: white; - margin: auto; - width: 974px; - color: #afafaf; - font-size: 11px; -} - -#footer a { - color: white; - color: #afafaf; -} - -.color_4 { - text-transform: uppercase; - font-weight: bold; - font-size: 10px; -} +@charset "utf-8"; +/* CSS Document */ + +@import '/js/dojo/dijit/themes/tundra/tundra.css'; + +body { + margin:0; + font-family: Arial, Helvetica, sans-serif; + font-size: 12px; + background:#333; +} + +img { + border: none; +} + +a { + color: #003399; + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + +#search-wrapper input[type=text] { + border:none; + margin:0; + padding:0; +} + +#search-wrapper select { + border:1px solid #e9ebf3; + margin:0; + padding:0; + width:168px; +} + +/* +#search-wrapper select { + border:0px solid black; + filter:alpha(opacity=0); + -moz-opacity:0; + -khtml-opacity:0; + opacity:0; + padding:0; + margin:0; + height:18px; + font-size: 12px; +} +*/ +h1 { + margin:0; + margin-bottom: 5px; + font-size: 20px; + font-weight:normal; +} + +h2 { + margin:0; + margin-bottom: 5px; + font-size: 14px; + font-weight:bold; +} + +.hide_me { + display: none; + visibility: hidden; +} + +div.select-box-wrapper { + position:absolute; + padding-top:2px; + padding-left:3px; + overflow:hidden; + text-align:left; +} + +div.select-wrapper { + border:1px solid #4C8AB0; + display:inline-block; + position:relative; + z-index:2; + background:url('/opac/skin/kcls/graphics/dropdown.gif') no-repeat right center; +} + +div.select-wrapper:hover { + background:url('/opac/skin/kcls/graphics/dropdown-hover.gif') no-repeat right center; +} + +#dash_wrapper { + width:500px; + position:relative; + top:-26px; +} + +#dashboard { + clear:both; + float:right; + width:384px; +} + +#dashboard span { + font-weight:bold; + position:relative; + left:-1px; +} + +#dash_user { + font-weight:bold; + text-transform:capitalize; +} + +#header { + color: #fff; + padding: 26px 0px 26px 0px; + width: 974px; + margin: auto; + font-size:11px; +} + +#header a { + color: #fff; +} + +#header a:hover { + color: white; + text-decoration: none; +} + +#header-links { + color: #afafaf; + font-size: 11px; + font-weight: bold; + position: relative; + top:4px; + +} + +#header-links a { + color: #afafaf; + display: block; + float:left; + margin-right:22px; +} + +#header-links a:hover { + color: white; + text-decoration: none; +} + +#header #header-links2 { + position:relative; + top:-8px; + color: white; + padding-bottom: 15px; +} + +#header #header-links2 a { + color: white; +} + +#header #header-links2 a:hover { + text-decoration: underline; +} + +#header #your-acct-login { + padding-top:10px; +} + +#gold-links { + margin:auto; + width:974px; + padding-left:0px; +} + +#util-bar { + margin:auto; + width:974px; + padding-left:0px; + height:0px; +} + +#search-wrapper { + border-bottom: 1px solid #e9ebf3; + padding-bottom: 5px; + background: white; +} + +#search_box_wrapper { + border:1px solid #e9ebf3; + padding: 1px; + padding-left:3px; +} + +#search-wrapper #breadcrumb { + margin-top:0px; + font-size: 10px; + float:left; +} + +#search-wrapper #search-within { + margin-top:10px; + float:right; + position:relative; + left:-173px; +} + +#search-wrapper #breadcrumb a { + color: black; +} + +#search-wrapper #search_frm label { + font-size: 10px; +} + +#search-wrapper #search-box { + width:974px; + margin:auto; + padding-left: 0px; +} + +#utils { + float:right; + z-index:1; + width:150px; + height:30px; + background:url('/opac/skin/kcls/graphics/utils-corner-left.png') no-repeat left top; + padding-left: 3px; + color: white; + position:relative; +} + +#utils a { + color: white; + font-size: 10px; +} +#adv_search_tabs { + height:33px; + width:974px; + margin:auto; +} + +#adv_search_tabs a { + float: left; + display: block; + height:33px; + margin-right:7px; +} + +#adv_search { + width:156px; + background:url('/opac/skin/kcls/graphics/adv_search_on.gif') no-repeat bottom; +} + +#num_search { + width:156px; + background:url('/opac/skin/kcls/graphics/num_search_off.gif') no-repeat bottom; +} + +#expert_search { + width:156px; + background:url('/opac/skin/kcls/graphics/expert_search_off.gif') no-repeat bottom; +} + +#acct_tabs, #acct_fines_tabs { + height:33px; + width:974px; + margin:auto; +} + +#acct_tabs a, #acct_fines_tabs a { + float: left; + display: block; + height:33px; + margin-right:7px; +} + +#acct_fines_tab { + width:156px; + background:url('/opac/skin/kcls/graphics/acct_fines_on.jpg') no-repeat bottom; +} +#acct_payments_tab { + width:156px; + background:url('/opac/skin/kcls/graphics/acct_payments_off.jpg') no-repeat bottom; +} + +#acct_summary { + width:156px; + background:url('/opac/skin/kcls/graphics/acct_summary_on.gif') no-repeat bottom; +} + +#acct_checked_out { + width:156px; + background:url('/opac/skin/kcls/graphics/acct_checked_out_off.gif') no-repeat bottom; +} + +#acct_holds { + width:156px; + background:url('/opac/skin/kcls/graphics/acct_holds_off.gif') no-repeat bottom; +} + +#acct_prefs { + width:156px; + background:url('/opac/skin/kcls/graphics/acct_prefs_off.gif') no-repeat bottom; +} + +#acct_favs { + width:156px; + background:url('/opac/skin/kcls/graphics/acct_favs_off.gif') no-repeat bottom; +} + +#acct_lists { + width:156px; + background:url('/opac/skin/kcls/graphics/acct_lists_off.gif') no-repeat bottom; +} + +#rdetail_header { + font-size:14px; + font-weight:bold; + color:#074079; + padding: 5px 7px 6px 0px; + border-bottom: 1px dotted #ccc; +} + +#rdetail_result_count { + color: black; + font-size: 11px; + font-weight: normal; +} + +#rdetail_result_nav { + float:right; + font-size: 11px; + font-weight:normal; +} + +#rdetail_details_table { + margin-top: 15px; +} + +#rdetail_title { + font-size: 18px; +} + +#rdetail_image_cell { + padding-top: 3px; + padding-right: 10px; +} + +.rdetail_aux_utils { + border-left:1px dotted #ccc; + padding-left: 17px; + padding-bottom: 6px; + padding-right: 70px; +} + +.results_aux_utils { + border-left:1px dotted #ccc; + padding-left: 17px; + padding-bottom: 6px; + padding-right: 50px; +} + +#rdetails_status td, #rdetails_status2 td { + white-space:nowrap !important; + padding: 7px 0px 3px 13px; +} + +#rdetails_status_head td { + background-color: #d8d8d8; + padding: 13px 0px 13px 13px; + font-size: 10px; + text-transform: uppercase; + font-weight: bold; +} + +#rdetails_status_head2 td { + padding: 0px; +} + +.rdetail_extras { + height: 29px; + background: #9ad0f1; + padding-top:1px; + margin-bottom: 10px; + margin-top: 10px; + clear:both; +} + +.rdetail_extras_hr { + height: 1px; + background: #b7def5; + margin-left: 1px; + margin-right: 1px; +} + +.rdetail_extras_link { + padding-top: 4px; + padding-left: 12px; + font-size: 10px; + text-transform: uppercase; + font-weight: bold; +} + +.rdetail_extras_lbl { + position: relative; + top: -4px; + left: 7px; +} + +#paginate-homebanner a.toc { + display:block; + width:20px; + height:20px; + background:gray; + float:left; + margin-left:2px; + margin-right:2px; + margin-top:2px; +} + +#rdetail_extras_expand, #rdetail_extras_collapse, #rdetail_locs_collapse { + margin-left: 13px; +} + +#rdetail_locs_expand, #rdetail_locs_collapse { + padding-bottom:3px; + margin-left:13px; +} + +#rdetail_anotes_div .biography { + margin:0; +} + +#paginate-homebanner a.selected { + border: 2px solid black; + margin-top:0px; + margin-left:0px; + margin-right:0px; +} + +#hp-buttons { + margin: auto; + margin-top: 6px; + width: 974px; +} + +#hp-welcome { + position:absolute; + width:295px; + height:192px; + background: url('/opac/skin/kcls/graphics/banner-bg.png') no-repeat; + color: #fff; + padding-left: 33px; + padding-top: 21px; + z-index:9999999999; +} + +#hp-welcome h1 { + font-size: 25px; + margin-bottom:15px; +} + +#hp-welcome a { + color: #fff; + text-decoration: underline; +} + +#hp-banner { + margin: auto; + width:974px; + height: 213px; +} + +#hp-ql-table { + margin-left: 2px; + padding-top: 3px; +} + +#hp-ql-table a { + color: #333; + font-weight: bold; + font-size: 13px; + text-transform: uppercase; + text-decoration: none; + display: block; + width: 144px; + height: 25px; + padding-top: 9px; + padding-left: 15px; + background: url('/opac/skin/kcls/graphics/button-bg.png') no-repeat; +} + +#hp-ql-bottom { + width: 640px; + height: 31px; + padding-left: 24px; + padding-top: 13px; + background: url('/opac/skin/kcls/graphics/hp-links-mid.jpg') repeat-x; +} + +#hp-ql-bottom a { + display: inline-block; + text-decoration: none; + color: white; + font-size: 15px; + font-weight: bold; +} + +#content-wrapper { + background: white; + min-height: 260px; + border-bottom: 1px solid black; +} + +#main-content { + width: 974px; + margin:auto; + padding-left:0px; +} + +#main-content .login_boxes { + border: 1px solid #dedede; + background:url('/opac/skin/kcls/graphics/login-bg.jpg') top repeat-x; + color: #333; +} + +#main-content .login_boxes h1 { + font-weight: normal; + font-size: 25px; + margin:0; +} + +#main-content .left_brain { + padding-left:28px; + padding-top:25px; +} + +#main-content .left_brain input[type=text], #main-content .left_brain input[type=password] { + width:167px; + height:18px; + margin:0; + padding:0; + border:none; + background: none; + font-size: 15px; + color: #333; + font-weight:bold; +} + +#main-content .left_brain .input_bg { + padding:10px 10px 0px 13px; + background: url('/opac/skin/kcls/graphics/login-box-bg.jpg') no-repeat; + width:167px; + height:29px; +} + +#home-buttons-inner { + width:664px; + height:117px; + background:#bda964; +} + +#holds_temp_parent td { + border-bottom:1px solid #dcdbdb; +} + +#holds_temp_parent input, #holds_temp_parent select { + margin:0; +} + + + + +#results_header_bar { + background: #929292; + border-top:1px solid #8b8b8b; +} + +#results_header_inner { + height:32px; + width:974px; + margin:auto; + padding-top:6px; +} + +.results_header_btns { + float:left; + margin-right: 6px; +} + +.results_header_div { + float: left; + width: 0px; + height: 25px; + border-left: 1px solid #7c7c7c; + border-right: 1px solid #9c9c9c; + margin: 0px 13px; +} + +.results_header_lbl { + font-weight: bold; + float: left; + font-size: 11px; + color: #191919; + position: relative; + top: 5px; + margin-right: 6px; +} + +.results_header_sel { + float:left; + position: relative; + top: 2px; + margin:0; +} + +#results_header_nav1 { + padding: 5px 7px 6px 0px; + border-bottom: 1px dotted #ccc; +} + +#results_header_nav1 .h1 { + font-size:14px; + font-weight:bold; + color:#074079; +} + +#start_end_links_span { + font-size: 11px; +} + +#start_end_links_span2 { + font-size: 11px; +} + +.nav_arrow_fix { + font-size:8px; + position:relative; + top:-1px; +} + +#result_table_div { + margin-top: 20px; +} + +#result_numbers1 { + font-size: 11px; + padding-left:15px; +} + + + + + + +.icon_text { + text-transform:capitalize; +} + +.result_table_title_cell { + padding-left: 7px; +} + +#myopac_summary_div p { + margin:0; + margin-bottom: 10px; +} + +#acct_sum_checked_table td { + padding-bottom:5px; +} + +#zero_search_hits p { + margin-top:0; +} + +#zero_hits_term { + text-transform: uppercase; +} + +#zero_search_hits #spell_check_link { + text-transform: uppercase; +} + +#zero_search_hits #zero_hits_suggestions { + text-transform: uppercase; +} + +.results_info_table td { + padding-right: 10px; +} + +#myopac_holds_main_table { + border-collapse: collapse; +} + +#myopac_holds_main_table td { + border: 1px solid black; + +} + +#myopac_prefs_div .data_grid { + border-collapse:collapse; +} + +#myopac_prefs_div .data_grid td { + background:#f0f0f0; + border-bottom:3px solid white; + padding:6px 0px 7px 17px; +} + +.header_middle { + height:22px; + font-size:14px; + font-weight:bold; + color:#074079; + padding: 7px 7px 0px 0px; + border-bottom: 1px dotted #ccc; +} + +.header_middle a { + font-size: 12px; + font-weight: normal; +} + +.acct_sum_row { + padding: 7px 15px; + width: 712px; + background: #f0f0f0; + margin-bottom: 2px; + font-size: 10px; + font-weight: bold; + text-transform: uppercase; +} + +.acct_sum_row a { + text-transform: none; + font-size: 12px; + position:relative; + top:-1px; +} + +.acct_sum_row .view_link { + font-weight: normal; + font-size:12px; +} + +#myopac_sum_fines { + float:right; + padding: 15px 0px 0px 23px; + background: #f0f0f0; + width: 177px; + height: 166px; +} + +.acct_holds_temp td { + text-align: left; +} + +#acct_checked_tabs .align, #acct_holds_tabs .align, #acct_prefs_tabs .align { + float:left; + /*padding-left:10px;*/ +} + +#acct_checked_tabs .selected, #acct_holds_tabs .selected, #acct_prefs_tabs .selected { + /*background:url('/opac/skin/kcls/graphics/gray-arrow.png') left 3px no-repeat;*/ +} + +#acct_checked_main_header, #acct_holds_main_header, #acct_checked_hist_header, #acct_list_header, #acct_list_header_anon, #temp_list_holds { + font-weight:bold; + text-transform:uppercase; + font-size: 10px; +} + +#acct_checked_main_header td, #acct_holds_main_header td, #acct_checked_hist_header td, #acct_list_header td, #acct_list_header_anon td, #temp_list_holds td { + background: #d8d8d8; + padding: 8px 0px 7px 0px; +} + +#acct_list_header select, #acct_list_header_anon select { + font-weight:normal; + text-transform:none; +} + +#acct_holds_activates_table label { + font-weight: bold; + font-size: 11px; + text-transform:uppercase; + padding-right: 5px; +} + +.adv_search_font { + font-size: 10px; +} + +.search_catalog_lbl { + font-size: 14px; +} + +.lbl1 { + font-size:14px; + font-weight:bold; +} + +.lbl2 { + font-size:10px; + font-weight:normal; + position:relative; + top:3px; +} + +#myopac_tabs, #adv_search_parent, #fines_payments_wrapper { + background: #929292; + border-top:1px solid #8b8b8b; + padding-top:5px; + margin-bottom:20px; +} + +#adv_search_parent { + margin-bottom:0px; +} + +#myopac_loading { + width:100%; + text-align:center; + padding-top:20px; + font-size:16px; + font-weight:bold; +} + +.chili_link { + width:100px !important; + text-align: center !important; +} + +.chili_review div.chili_link div { + margin: auto; +} + +/* some facet styling */ +.facetClassContainer { margin: 2px; border: 1px solid #CCC; } +.facetClassLabelContainer { border: 1px solid #CCC; } +.facetClassLabel { font-weight: bold; text-align: center; } +.facetFieldContainer { } +.facetFieldLabel { padding-left: 2px; margin-top: 5px; margin-bottom: 5px; font-weight: bold; text-align: left; } +.extraFacetFieldsWrapper { } +.toggleExtraFacetFieldsButton { float: right; margin: 0px; padding: 0px; } +.facetFieldLineCount { display: inline-block; border-right: 1px solid #CCC; color: gray; width: 3em; margin-right: 3px } +.facetField { border-top: 1px solid #CCC; } +.facetFields { padding-left: 5px; } +.facetFieldLineValue { overflow: hidden; text-overflow: ellipsis; } + +#footer { + padding-top:5px; + padding-bottom: 10px; + color: white; + margin: auto; + width: 974px; + color: #afafaf; + font-size: 11px; +} + +#footer a { + color: white; + color: #afafaf; +} + +.color_4 { + text-transform: uppercase; + font-weight: bold; + font-size: 10px; +} diff --git a/Open-ILS/web/opac/skin/kcls/js/adv_global.js b/Open-ILS/web/opac/skin/kcls/js/adv_global.js index 2a3134df4b..99fcdd9491 100644 --- a/Open-ILS/web/opac/skin/kcls/js/adv_global.js +++ b/Open-ILS/web/opac/skin/kcls/js/adv_global.js @@ -1,360 +1,360 @@ - -attachEvt("common", "run", advgInit); -attachEvt("common", "locationChanged", advSyncCopyLocLink ); - -var COOKIE_NOGROUP_RECORDS = 'grpt'; -var advSelectedOrg = null; - -function advgInit() { - - /* XXX */ - if( cookieManager.read(COOKIE_NOGROUP_RECORDS) || SHOW_MR_DEFAULT ) - $('adv_group_titles').checked = true; - - try{$n($('adv_global_tbody'), 'term').focus();} catch(e){} - - var extras = [ - FETCH_LIT_FORMS, - FETCH_ITEM_FORMS, - FETCH_ITEM_TYPES, - FETCH_AUDIENCES, - FETCH_BIB_LEVELS - ]; - - for( var x in extras ) { - - var req = new Request(extras[x]); - - if(x == 0) req.request.sel = $('adv_global_lit_form'); - if(x == 1) req.request.sel = $('adv_global_item_form'); - if(x == 2) req.request.sel = $('adv_global_item_type'); - if(x == 3) req.request.sel = $('adv_global_audience'); - if(x == 4) req.request.sel = $('adv_global_bib_level'); - - req.callback(advDrawBibExtras); - req.send(); - } - - var input = $n($('adv_global_trow'), 'term'); - try {input.focus();} catch(e){} - setEnterFunc(input, advSubmitGlobal); - - if(getSort() && getSortDir()) { - setSelector($('adv_global_sort_by'), getSort()); - setSelector($('adv_global_sort_dir'), getSortDir()); - if(getSort() != 'rel') - $('adv_global_sort_dir').disabled = false; - } - - if(getLanguage()) setSelector($('adv_global_lang'), getLanguage()); - if(getFacet()) { - var facet_val = getFacet().replace("identifier|mattype[", ""); - facet_val = facet_val.replace("]", ""); - setSelector($('adv_global_item_type_basic'), facet_val); - } - - if(getAudience()) { - var aud = getAudience().split(/,/).join(""); - setSelector($('adv_global_audience_basic'), aud); - } - - advInitPubFilter(); - - if(getAvail()) - $('opac.result.limit2avail').checked = true; - - // not sure we want to propogate the pubdate filter, - // since other filters are not propogated - - if(!new CGI().param(PARAM_NOPERSIST_SEARCH)) - initSearchBoxes(); - advSyncCopyLocLink(getLocation()); - //if(findCurrentPage()=="advanced") { hideMe(G.ui.login.box); /*unHideMe(G.ui.login.box);*/ } -} - -function advInitPubFilter() { - var i1 = $('adv_global_pub_date_1'); - var i2 = $('adv_global_pub_date_2'); - var sel = $('adv_global_pub_date_type'); - if(getPubdBefore()) { - i1.value = getPubdBefore(); - setSelector(sel, 'before'); - } else if(getPubdAfter()) { - i1.value = getPubdAfter(); - setSelector(sel, 'after'); - } else if(getPubdBetween()) { - var values = getPubdBetween().split(','); - i1.value = values[0] - if(values[0] == values[1]) { - setSelector(sel, 'equals'); - } else { - setSelector(sel, 'between'); - i2.value = values[1]; - unHideMe($('adv_global_pub_date_2_span')); - } - } -} - -function advSyncCopyLocLink(org) { - // display the option to filter by copy location - advLocationsLoaded = false; - advSelectedOrg = org; - removeChildren($('adv_copy_location_filter_select')); - - if(isTrue(findOrgType(findOrgUnit(org).ou_type()).can_have_vols())) { - //unHideMe($('adv_copy_location_filter_row')); - advLoadCopyLocations(org); - } else { - hideMe($('adv_copy_location_filter_row')); - } -} - -function clearSearchBoxes() { - var rows = $('adv_global_tbody').getElementsByTagName('tr'); - for(var t = 0; t < rows.length; t++) { - if($n(rows[t], 'term')) { - $n(rows[t], 'term').value = ''; - setSelector($n(rows[t], 'contains'), 'contains'); - setSelector($n(rows[t], 'type'), 'keyword'); - } - } - try{$n(rows[0], 'term').focus();} catch(e){} -} - - -function initSearchBoxes() { - /* loads the compiled search from the search cookie - and sets the widgets accordingly */ - - search = cookieManager.read(COOKIE_SEARCH); - if(!search) return; - _debug("loaded compiled search cookie: " + search); - - search = JSON2js(search); - if(!search) return; - - var types = getObjectKeys(search.searches); - - // if we have browser cached data, clear it before populating from cookie - if (search.searches[types[0]].term) - clearSearchBoxes(); - - /* pre-add the needed rows */ - while($('adv_global_tbody').getElementsByTagName('tr').length - 1 < types.length) - advAddGblRow(); - - var rows = $('adv_global_tbody').getElementsByTagName('tr'); - - for(var t = 0; t < types.length; t++) { - var row = rows[t]; - setSelector($n(row, 'type'), types[t]); - var term = search.searches[types[t]].term; - - /* if this is a single - search, set the selector to nocontains */ - if(match = term.match(/^-(\w+)$/)) { - term = match[1]; - setSelector($n(row, 'contains'), 'nocontains'); - } - $n(row, 'term').value = term; - } -} - -function advAddGblRow() { - var tbody = $("adv_global_tbody"); - var newrow = $("adv_global_trow").cloneNode(true); - tbody.insertBefore(newrow, $("adv_global_addrow")); - var input = $n(newrow, "term"); - input.value = ""; - setEnterFunc(input, advSubmitGlobal); - $n(newrow, 'type').focus(); -} - -function advDrawBibExtras(r) { - var data = r.getResultObject(); - var sel = r.sel; - - data = data.sort( /* sort alphabetically */ - function(a,b) { - if( a.value() < b.value() ) return -1; - if( a.value() > b.value() ) return 1; - return 0; - } - ); - - for( var d = 0; d < data.length; d++ ) { - var thing = data[d]; - var opt = insertSelectorVal( sel, -1, thing.value(), thing.code() ); - opt.setAttribute('title', thing.value()); - } -} - -function advSelToStringList(sel) { - var list = getSelectedList(sel); - var vals = []; - for( var i = 0; i < list.length; i++ ) { - var str = list[i]; - for( var j = 0; j < str.length; j++ ) { - //if(str.charAt(j) == ' ') continue; - vals.push(str.charAt(j)); - } - } - return vals.toString(); -} - -function advGetVisSelectorVals(id) { - var basic = id + '_basic'; - if(! $(id).className.match(/hide_me/)) - return advSelToStringList($(id)); - return advSelToStringList($(basic)); -} - -function advSubmitGlobal() { - - var sortdir = getSelectorVal($('adv_global_sort_dir')); - var sortby = getSelectorVal($('adv_global_sort_by')); - - var litforms = advGetVisSelectorVals('adv_global_lit_form'); - var itemforms = advGetVisSelectorVals('adv_global_item_form'); - var itemtypes = advGetVisSelectorVals('adv_global_item_type'); - var audiences = advGetVisSelectorVals('adv_global_audience'); - var biblevels = advGetVisSelectorVals('adv_global_bib_level'); - var locations = getSelectedList($('adv_copy_location_filter_select')) + ''; - var languages = getSelectedList($('adv_global_lang')) + ''; - var limit2avail = $('opac.result.limit2avail').checked ? 1 : '' - - var searches = advBuildSearchBlob(); - if(!searches) return; - - clearSearchParams(); - - var depth = depthSelGetDepth(); - if(depth==1) depth = 0; - var args = {}; - args.page = MRESULT; - args[PARAM_ITEMFORM] = itemforms; - args[PARAM_ITEMTYPE] = itemtypes; - args[PARAM_BIBLEVEL] = biblevels; - args[PARAM_LITFORM] = litforms; - args[PARAM_AUDIENCE] = audiences; - args[PARAM_LANGUAGE] = languages; - args[PARAM_COPYLOCS] = locations; - //args[PARAM_SEARCHES] = js2JSON(searches); /* break these out */ - args[PARAM_DEPTH] = depth; - args[PARAM_LOCATION] = depthSelGetNewLoc(); - args[PARAM_SORT] = sortby; - args[PARAM_SORT_DIR] = sortdir; - args[PARAM_ADVTYPE] = ADVTYPE_MULTI; - args[PARAM_STYPE] = ""; - args[PARAM_TERM] = searches; - args[PARAM_AVAIL] = limit2avail; - args[PARAM_FORM] = itemtypes[0]; - args[PARAM_FACET] = itemtypes==''?'':"identifier|mattype["+itemtypes.replace(/[,]/, function(a){switch(a){case ",": return "#";}})+"]"; - if(G.user && G.user.prefs['opac.hits_per_page']) args[PARAM_COUNT] = G.user.prefs['opac.hits_per_page']; - - // publicate year filtering - var pub1; - if( (pub1 = $('adv_global_pub_date_1').value) && (''+pub1).match(/\d{4}/)) { - switch(getSelectorVal($('adv_global_pub_date_type'))) { - case 'equals': - args[PARAM_PUBD_BETWEEN] = pub1+','+pub1; - break; - case 'before': - args[PARAM_PUBD_BEFORE] = pub1; - break; - case 'after': - args[PARAM_PUBD_AFTER] = pub1; - break; - case 'between': - var pub2 = $('adv_global_pub_date_2').value; - if((''+pub2).match(/\d{4}/)) - args[PARAM_PUBD_BETWEEN] = pub1+','+pub2; - break; - } - } - - /* pubdate sorting causes a record (not metarecord) search */ - if( sortby == SORT_TYPE_PUBDATE || !$('adv_group_titles').checked ) { - args.page = RRESULT; - args[PARAM_RTYPE] = RTYPE_MULTI; - } - - if($('adv_group_titles').checked ) - cookieManager.write(COOKIE_NOGROUP_RECORDS,'1',-1); - else - cookieManager.write(COOKIE_NOGROUP_RECORDS,''); - - goTo(buildOPACLink(args)); -} - - -function advBuildSearchBlob() { - - var searches = ''; - var tbody = $('adv_global_tbody'); - var rows = tbody.getElementsByTagName('tr'); - - for( var i = 0; i < rows.length; i++ ) { - - var row = rows[i]; - if(!(row && typeof row == 'object')) continue; - if(!row.getAttribute('type')) continue; - - var stype = getSelectorVal($n(row, 'type')); - var contains = getSelectorVal($n(row, 'contains')); - var term = $n(row, 'term').value; - if(!term) continue; - - var string = ""; - switch(contains) { - case 'contains' : - string += " " + term; - break; - - case 'nocontains' : { - var words = term.split(" "); - for( var j in words ) - string += " -" + words[j]; - } - break; - - case 'exact' : - if(term.indexOf('"') > -1) string += " " + term; - else string += " \"" + term + "\""; - break; - } - if(string) { - string = string.replace(/'/g,' '); - string = string.replace(/\\/g,' '); - string = string.replace(/^\s*/,''); - string = string.replace(/\s*$/,''); - //searches[stype].term = string; - if(searches) searches += ' '; - searches += stype + ':'+ string; - } - } - - _debug("created search query " + searches); - return searches; -} - - -// retrieves the shelving locations -var advLocationsLoaded = false; -function advLoadCopyLocations(org) { - if(org == null) - org = advSelectedOrg; - var req = new Request(FETCH_COPY_LOCATIONS, org); - req.callback(advShowCopyLocations); - req.send(); - advLocationsLoaded = true; -} - -// inserts the shelving locations into the multi-select -function advShowCopyLocations(r) { - var locations = r.getResultObject(); - var sel = $('adv_copy_location_filter_select'); - for(var i = 0; i < locations.length; i++) - insertSelectorVal(sel, -1, locations[i].name(), locations[i].id()); -} - - + +attachEvt("common", "run", advgInit); +attachEvt("common", "locationChanged", advSyncCopyLocLink ); + +var COOKIE_NOGROUP_RECORDS = 'grpt'; +var advSelectedOrg = null; + +function advgInit() { + + /* XXX */ + if( cookieManager.read(COOKIE_NOGROUP_RECORDS) || SHOW_MR_DEFAULT ) + $('adv_group_titles').checked = true; + + try{$n($('adv_global_tbody'), 'term').focus();} catch(e){} + + var extras = [ + FETCH_LIT_FORMS, + FETCH_ITEM_FORMS, + FETCH_ITEM_TYPES, + FETCH_AUDIENCES, + FETCH_BIB_LEVELS + ]; + + for( var x in extras ) { + + var req = new Request(extras[x]); + + if(x == 0) req.request.sel = $('adv_global_lit_form'); + if(x == 1) req.request.sel = $('adv_global_item_form'); + if(x == 2) req.request.sel = $('adv_global_item_type'); + if(x == 3) req.request.sel = $('adv_global_audience'); + if(x == 4) req.request.sel = $('adv_global_bib_level'); + + req.callback(advDrawBibExtras); + req.send(); + } + + var input = $n($('adv_global_trow'), 'term'); + try {input.focus();} catch(e){} + setEnterFunc(input, advSubmitGlobal); + + if(getSort() && getSortDir()) { + setSelector($('adv_global_sort_by'), getSort()); + setSelector($('adv_global_sort_dir'), getSortDir()); + if(getSort() != 'rel') + $('adv_global_sort_dir').disabled = false; + } + + if(getLanguage()) setSelector($('adv_global_lang'), getLanguage()); + if(getFacet()) { + var facet_val = getFacet().replace("identifier|mattype[", ""); + facet_val = facet_val.replace("]", ""); + setSelector($('adv_global_item_type_basic'), facet_val); + } + + if(getAudience()) { + var aud = getAudience().split(/,/).join(""); + setSelector($('adv_global_audience_basic'), aud); + } + + advInitPubFilter(); + + if(getAvail()) + $('opac.result.limit2avail').checked = true; + + // not sure we want to propogate the pubdate filter, + // since other filters are not propogated + + if(!new CGI().param(PARAM_NOPERSIST_SEARCH)) + initSearchBoxes(); + advSyncCopyLocLink(getLocation()); + //if(findCurrentPage()=="advanced") { hideMe(G.ui.login.box); /*unHideMe(G.ui.login.box);*/ } +} + +function advInitPubFilter() { + var i1 = $('adv_global_pub_date_1'); + var i2 = $('adv_global_pub_date_2'); + var sel = $('adv_global_pub_date_type'); + if(getPubdBefore()) { + i1.value = getPubdBefore(); + setSelector(sel, 'before'); + } else if(getPubdAfter()) { + i1.value = getPubdAfter(); + setSelector(sel, 'after'); + } else if(getPubdBetween()) { + var values = getPubdBetween().split(','); + i1.value = values[0] + if(values[0] == values[1]) { + setSelector(sel, 'equals'); + } else { + setSelector(sel, 'between'); + i2.value = values[1]; + unHideMe($('adv_global_pub_date_2_span')); + } + } +} + +function advSyncCopyLocLink(org) { + // display the option to filter by copy location + advLocationsLoaded = false; + advSelectedOrg = org; + removeChildren($('adv_copy_location_filter_select')); + + if(isTrue(findOrgType(findOrgUnit(org).ou_type()).can_have_vols())) { + //unHideMe($('adv_copy_location_filter_row')); + advLoadCopyLocations(org); + } else { + hideMe($('adv_copy_location_filter_row')); + } +} + +function clearSearchBoxes() { + var rows = $('adv_global_tbody').getElementsByTagName('tr'); + for(var t = 0; t < rows.length; t++) { + if($n(rows[t], 'term')) { + $n(rows[t], 'term').value = ''; + setSelector($n(rows[t], 'contains'), 'contains'); + setSelector($n(rows[t], 'type'), 'keyword'); + } + } + try{$n(rows[0], 'term').focus();} catch(e){} +} + + +function initSearchBoxes() { + /* loads the compiled search from the search cookie + and sets the widgets accordingly */ + + search = cookieManager.read(COOKIE_SEARCH); + if(!search) return; + _debug("loaded compiled search cookie: " + search); + + search = JSON2js(search); + if(!search) return; + + var types = getObjectKeys(search.searches); + + // if we have browser cached data, clear it before populating from cookie + if (search.searches[types[0]].term) + clearSearchBoxes(); + + /* pre-add the needed rows */ + while($('adv_global_tbody').getElementsByTagName('tr').length - 1 < types.length) + advAddGblRow(); + + var rows = $('adv_global_tbody').getElementsByTagName('tr'); + + for(var t = 0; t < types.length; t++) { + var row = rows[t]; + setSelector($n(row, 'type'), types[t]); + var term = search.searches[types[t]].term; + + /* if this is a single - search, set the selector to nocontains */ + if(match = term.match(/^-(\w+)$/)) { + term = match[1]; + setSelector($n(row, 'contains'), 'nocontains'); + } + $n(row, 'term').value = term; + } +} + +function advAddGblRow() { + var tbody = $("adv_global_tbody"); + var newrow = $("adv_global_trow").cloneNode(true); + tbody.insertBefore(newrow, $("adv_global_addrow")); + var input = $n(newrow, "term"); + input.value = ""; + setEnterFunc(input, advSubmitGlobal); + $n(newrow, 'type').focus(); +} + +function advDrawBibExtras(r) { + var data = r.getResultObject(); + var sel = r.sel; + + data = data.sort( /* sort alphabetically */ + function(a,b) { + if( a.value() < b.value() ) return -1; + if( a.value() > b.value() ) return 1; + return 0; + } + ); + + for( var d = 0; d < data.length; d++ ) { + var thing = data[d]; + var opt = insertSelectorVal( sel, -1, thing.value(), thing.code() ); + opt.setAttribute('title', thing.value()); + } +} + +function advSelToStringList(sel) { + var list = getSelectedList(sel); + var vals = []; + for( var i = 0; i < list.length; i++ ) { + var str = list[i]; + for( var j = 0; j < str.length; j++ ) { + //if(str.charAt(j) == ' ') continue; + vals.push(str.charAt(j)); + } + } + return vals.toString(); +} + +function advGetVisSelectorVals(id) { + var basic = id + '_basic'; + if(! $(id).className.match(/hide_me/)) + return advSelToStringList($(id)); + return advSelToStringList($(basic)); +} + +function advSubmitGlobal() { + + var sortdir = getSelectorVal($('adv_global_sort_dir')); + var sortby = getSelectorVal($('adv_global_sort_by')); + + var litforms = advGetVisSelectorVals('adv_global_lit_form'); + var itemforms = advGetVisSelectorVals('adv_global_item_form'); + var itemtypes = advGetVisSelectorVals('adv_global_item_type'); + var audiences = advGetVisSelectorVals('adv_global_audience'); + var biblevels = advGetVisSelectorVals('adv_global_bib_level'); + var locations = getSelectedList($('adv_copy_location_filter_select')) + ''; + var languages = getSelectedList($('adv_global_lang')) + ''; + var limit2avail = $('opac.result.limit2avail').checked ? 1 : '' + + var searches = advBuildSearchBlob(); + if(!searches) return; + + clearSearchParams(); + + var depth = depthSelGetDepth(); + if(depth==1) depth = 0; + var args = {}; + args.page = MRESULT; + args[PARAM_ITEMFORM] = itemforms; + args[PARAM_ITEMTYPE] = itemtypes; + args[PARAM_BIBLEVEL] = biblevels; + args[PARAM_LITFORM] = litforms; + args[PARAM_AUDIENCE] = audiences; + args[PARAM_LANGUAGE] = languages; + args[PARAM_COPYLOCS] = locations; + //args[PARAM_SEARCHES] = js2JSON(searches); /* break these out */ + args[PARAM_DEPTH] = depth; + args[PARAM_LOCATION] = depthSelGetNewLoc(); + args[PARAM_SORT] = sortby; + args[PARAM_SORT_DIR] = sortdir; + args[PARAM_ADVTYPE] = ADVTYPE_MULTI; + args[PARAM_STYPE] = ""; + args[PARAM_TERM] = searches; + args[PARAM_AVAIL] = limit2avail; + args[PARAM_FORM] = itemtypes[0]; + args[PARAM_FACET] = itemtypes==''?'':"identifier|mattype["+itemtypes.replace(/[,]/, function(a){switch(a){case ",": return "#";}})+"]"; + if(G.user && G.user.prefs['opac.hits_per_page']) args[PARAM_COUNT] = G.user.prefs['opac.hits_per_page']; + + // publicate year filtering + var pub1; + if( (pub1 = $('adv_global_pub_date_1').value) && (''+pub1).match(/\d{4}/)) { + switch(getSelectorVal($('adv_global_pub_date_type'))) { + case 'equals': + args[PARAM_PUBD_BETWEEN] = pub1+','+pub1; + break; + case 'before': + args[PARAM_PUBD_BEFORE] = pub1; + break; + case 'after': + args[PARAM_PUBD_AFTER] = pub1; + break; + case 'between': + var pub2 = $('adv_global_pub_date_2').value; + if((''+pub2).match(/\d{4}/)) + args[PARAM_PUBD_BETWEEN] = pub1+','+pub2; + break; + } + } + + /* pubdate sorting causes a record (not metarecord) search */ + if( sortby == SORT_TYPE_PUBDATE || !$('adv_group_titles').checked ) { + args.page = RRESULT; + args[PARAM_RTYPE] = RTYPE_MULTI; + } + + if($('adv_group_titles').checked ) + cookieManager.write(COOKIE_NOGROUP_RECORDS,'1',-1); + else + cookieManager.write(COOKIE_NOGROUP_RECORDS,''); + + goTo(buildOPACLink(args)); +} + + +function advBuildSearchBlob() { + + var searches = ''; + var tbody = $('adv_global_tbody'); + var rows = tbody.getElementsByTagName('tr'); + + for( var i = 0; i < rows.length; i++ ) { + + var row = rows[i]; + if(!(row && typeof row == 'object')) continue; + if(!row.getAttribute('type')) continue; + + var stype = getSelectorVal($n(row, 'type')); + var contains = getSelectorVal($n(row, 'contains')); + var term = $n(row, 'term').value; + if(!term) continue; + + var string = ""; + switch(contains) { + case 'contains' : + string += " " + term; + break; + + case 'nocontains' : { + var words = term.split(" "); + for( var j in words ) + string += " -" + words[j]; + } + break; + + case 'exact' : + if(term.indexOf('"') > -1) string += " " + term; + else string += " \"" + term + "\""; + break; + } + if(string) { + string = string.replace(/'/g,' '); + string = string.replace(/\\/g,' '); + string = string.replace(/^\s*/,''); + string = string.replace(/\s*$/,''); + //searches[stype].term = string; + if(searches) searches += ' '; + searches += stype + ':'+ string; + } + } + + _debug("created search query " + searches); + return searches; +} + + +// retrieves the shelving locations +var advLocationsLoaded = false; +function advLoadCopyLocations(org) { + if(org == null) + org = advSelectedOrg; + var req = new Request(FETCH_COPY_LOCATIONS, org); + req.callback(advShowCopyLocations); + req.send(); + advLocationsLoaded = true; +} + +// inserts the shelving locations into the multi-select +function advShowCopyLocations(r) { + var locations = r.getResultObject(); + var sel = $('adv_copy_location_filter_select'); + for(var i = 0; i < locations.length; i++) + insertSelectorVal(sel, -1, locations[i].name(), locations[i].id()); +} + + diff --git a/Open-ILS/web/opac/skin/kcls/js/advanced.js b/Open-ILS/web/opac/skin/kcls/js/advanced.js index 14322da954..7a824f113c 100644 --- a/Open-ILS/web/opac/skin/kcls/js/advanced.js +++ b/Open-ILS/web/opac/skin/kcls/js/advanced.js @@ -1,195 +1,195 @@ -/* advanced search interface */ - -attachEvt("common", "run", advInit); - -function advInit() { - - unHideMe($('adv_search_parent')); - /* propogate these? */ - - depthSelInit(); - setEnterFunc( $n( $('advanced.marc.tbody'), 'advanced.marc.value'), advMARCRun ); - hideMe($('adv_quick_search_sidebar')); - - var adv_set = true; - if(getAdvTerm()) $('adv_quick_text').value = getAdvTerm(); - if(getRtype()) { - var rtype_val = getRtype(); - if(rtype_val==RTYPE_MARC) rtype_val='iccn'; - adv_set = setSelector($('adv_quick_type'), rtype_val); - } - if(getCallnumber()) { - adv_set = setSelector($('adv_quick_type'), 'cn'); - $('adv_quick_text').value = getCallnumber(); - } - if(!adv_set) { - setSelector($('adv_quick_type'), 'barcode'); - $('adv_quick_text').value = getRid(); - } - - /* - if(isXUL()) - setSelector($('adv_quick_type'), 'tcn'); */ - - setEnterFunc($('adv_quick_text'), advGenericSearch); - hideMe($('adv_marc_search_sidebar')); - //hideMe($('adv_global_search')); - advAddGblRow(); -} - -function advAddMARC() { - var newt = $('adv_sdbar_table').cloneNode(true); - newt.id = ""; - unHideMe($n(newt, 'crow')); - $n(newt, 'advanced.marc.tag').value = ""; - $n(newt, 'advanced.marc.subfield').value = ""; - $n(newt, 'advanced.marc.value').value = ""; - $('adv_marc_search_sidebar').insertBefore(newt, $('adv_marc_submit')); -} - -function advMARCRun() { - - clearSearchParams(); - - var div = $('adv_marc_search_sidebar'); - var tbodies = div.getElementsByTagName('tbody'); - var searches = []; - - for( var i = 0; i < tbodies.length; i++ ) { - var tbody = tbodies[i]; - var val = advExtractMARC(tbody); - if(val) searches.push(val); - } - - if(searches.length == 0) return; - - var arg = {}; - arg.page = RRESULT; - arg[PARAM_FORM] = 'all'; - arg[PARAM_RTYPE] = RTYPE_MARC; - arg[PARAM_OFFSET] = 0; - arg[PARAM_DEPTH] = depthSelGetDepth(); - arg[PARAM_LOCATION] = depthSelGetNewLoc(); - arg[PARAM_SEARCHES] = js2JSON(searches); - arg[PARAM_ADVTYPE] = ADVTYPE_MARC; - arg[PARAM_TERM] = ""; - - goTo(buildOPACLink(arg)); -} - - -/* EXAMPLE => {"term":"0516011901","restrict":[{"tag":"020","subfield":"a"}]} */ -function advExtractMARC(tbody) { - if(!tbody) return null; - var term = $n(tbody, 'advanced.marc.value').value; - if(!term) return null; - - var subfield = $n(tbody, 'advanced.marc.subfield').value; - if(!subfield) subfield = "_"; - - var tag = $n(tbody, 'advanced.marc.tag').value; - if(!tag) return null; - - return { 'term' : term.toLowerCase(), 'restrict' : [ { 'tag' : tag, 'subfield' : subfield } ] }; -} - -function advGenericSearch() { - clearSearchParams(); - var type = getSelectorVal($('adv_quick_type')); - - var term = $('adv_quick_text').value; - if(!term) return; - - var arg = {}; - - switch(type) { - - case 'isbn' : - arg.page = RRESULT; - arg[PARAM_STYPE] = ""; - arg[PARAM_TERM] = ""; - arg[PARAM_RTYPE] = RTYPE_ISBN; - arg[PARAM_OFFSET] = 0; - arg[PARAM_ADVTERM] = term.toLowerCase(); - break; - - case 'issn' : - arg.page = RRESULT; - arg[PARAM_STYPE] = ""; - arg[PARAM_TERM] = ""; - arg[PARAM_ADVTERM] = term.toLowerCase(); - arg[PARAM_OFFSET] = 0; - arg[PARAM_RTYPE] = RTYPE_ISSN; - break; - - case 'tcn' : - arg.page = RRESULT; - arg[PARAM_STYPE] = ""; - arg[PARAM_TERM] = ""; - arg[PARAM_ADVTERM] = term; - arg[PARAM_OFFSET] = 0; - arg[PARAM_RTYPE] = RTYPE_TCN; - break; - - case 'barcode': - advFindBarcode(term); - break; - - - case 'cn': - arg.page = CNBROWSE; - arg[PARAM_CN] = term; - arg[PARAM_DEPTH] = depthSelGetDepth(); - arg[PARAM_LOCATION] = depthSelGetNewLoc(); - break; - - case 'lccn': - arg.page = RRESULT; - arg[PARAM_FORM] = 'all' - arg[PARAM_RTYPE] = RTYPE_MARC; - arg[PARAM_OFFSET] = 0; - arg[PARAM_DEPTH] = depthSelGetDepth(); - arg[PARAM_LOCATION] = depthSelGetNewLoc(); - arg[PARAM_SEARCHES] = js2JSON([{ 'term' : term.toLowerCase(), - 'restrict' : [ { 'tag' : '010', 'subfield' : '_' } ] }]); - arg[PARAM_ADVTYPE] = ADVTYPE_MARC; - arg[PARAM_TERM] = ""; - break; - - - default: alert('not done'); - } - - if(arg.page) goTo(buildOPACLink(arg)); -} - - -function advFindBarcode(barcode) { - var req = new Request(FETCH_BIB_ID_BY_BARCODE, barcode); - req.callback(advDrawBarcode); - req.request.alertEvent = false; - req.send(); -} - -function advDrawBarcode(r) { - titleid = r.getResultObject(); - if(checkILSEvent(titleid)) { - alertId('myopac.copy.not.found'); - return; - } - if(!titleid) return; - var args = {}; - args.page = RDETAIL; - args[PARAM_RID] = titleid; - location.href = buildOPACLink(args); -} - -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; -} - -__setsortsel(); +/* advanced search interface */ + +attachEvt("common", "run", advInit); + +function advInit() { + + unHideMe($('adv_search_parent')); + /* propogate these? */ + + depthSelInit(); + setEnterFunc( $n( $('advanced.marc.tbody'), 'advanced.marc.value'), advMARCRun ); + hideMe($('adv_quick_search_sidebar')); + + var adv_set = true; + if(getAdvTerm()) $('adv_quick_text').value = getAdvTerm(); + if(getRtype()) { + var rtype_val = getRtype(); + if(rtype_val==RTYPE_MARC) rtype_val='iccn'; + adv_set = setSelector($('adv_quick_type'), rtype_val); + } + if(getCallnumber()) { + adv_set = setSelector($('adv_quick_type'), 'cn'); + $('adv_quick_text').value = getCallnumber(); + } + if(!adv_set) { + setSelector($('adv_quick_type'), 'barcode'); + $('adv_quick_text').value = getRid(); + } + + /* + if(isXUL()) + setSelector($('adv_quick_type'), 'tcn'); */ + + setEnterFunc($('adv_quick_text'), advGenericSearch); + hideMe($('adv_marc_search_sidebar')); + //hideMe($('adv_global_search')); + advAddGblRow(); +} + +function advAddMARC() { + var newt = $('adv_sdbar_table').cloneNode(true); + newt.id = ""; + unHideMe($n(newt, 'crow')); + $n(newt, 'advanced.marc.tag').value = ""; + $n(newt, 'advanced.marc.subfield').value = ""; + $n(newt, 'advanced.marc.value').value = ""; + $('adv_marc_search_sidebar').insertBefore(newt, $('adv_marc_submit')); +} + +function advMARCRun() { + + clearSearchParams(); + + var div = $('adv_marc_search_sidebar'); + var tbodies = div.getElementsByTagName('tbody'); + var searches = []; + + for( var i = 0; i < tbodies.length; i++ ) { + var tbody = tbodies[i]; + var val = advExtractMARC(tbody); + if(val) searches.push(val); + } + + if(searches.length == 0) return; + + var arg = {}; + arg.page = RRESULT; + arg[PARAM_FORM] = 'all'; + arg[PARAM_RTYPE] = RTYPE_MARC; + arg[PARAM_OFFSET] = 0; + arg[PARAM_DEPTH] = depthSelGetDepth(); + arg[PARAM_LOCATION] = depthSelGetNewLoc(); + arg[PARAM_SEARCHES] = js2JSON(searches); + arg[PARAM_ADVTYPE] = ADVTYPE_MARC; + arg[PARAM_TERM] = ""; + + goTo(buildOPACLink(arg)); +} + + +/* EXAMPLE => {"term":"0516011901","restrict":[{"tag":"020","subfield":"a"}]} */ +function advExtractMARC(tbody) { + if(!tbody) return null; + var term = $n(tbody, 'advanced.marc.value').value; + if(!term) return null; + + var subfield = $n(tbody, 'advanced.marc.subfield').value; + if(!subfield) subfield = "_"; + + var tag = $n(tbody, 'advanced.marc.tag').value; + if(!tag) return null; + + return { 'term' : term.toLowerCase(), 'restrict' : [ { 'tag' : tag, 'subfield' : subfield } ] }; +} + +function advGenericSearch() { + clearSearchParams(); + var type = getSelectorVal($('adv_quick_type')); + + var term = $('adv_quick_text').value; + if(!term) return; + + var arg = {}; + + switch(type) { + + case 'isbn' : + arg.page = RRESULT; + arg[PARAM_STYPE] = ""; + arg[PARAM_TERM] = ""; + arg[PARAM_RTYPE] = RTYPE_ISBN; + arg[PARAM_OFFSET] = 0; + arg[PARAM_ADVTERM] = term.toLowerCase(); + break; + + case 'issn' : + arg.page = RRESULT; + arg[PARAM_STYPE] = ""; + arg[PARAM_TERM] = ""; + arg[PARAM_ADVTERM] = term.toLowerCase(); + arg[PARAM_OFFSET] = 0; + arg[PARAM_RTYPE] = RTYPE_ISSN; + break; + + case 'tcn' : + arg.page = RRESULT; + arg[PARAM_STYPE] = ""; + arg[PARAM_TERM] = ""; + arg[PARAM_ADVTERM] = term; + arg[PARAM_OFFSET] = 0; + arg[PARAM_RTYPE] = RTYPE_TCN; + break; + + case 'barcode': + advFindBarcode(term); + break; + + + case 'cn': + arg.page = CNBROWSE; + arg[PARAM_CN] = term; + arg[PARAM_DEPTH] = depthSelGetDepth(); + arg[PARAM_LOCATION] = depthSelGetNewLoc(); + break; + + case 'lccn': + arg.page = RRESULT; + arg[PARAM_FORM] = 'all' + arg[PARAM_RTYPE] = RTYPE_MARC; + arg[PARAM_OFFSET] = 0; + arg[PARAM_DEPTH] = depthSelGetDepth(); + arg[PARAM_LOCATION] = depthSelGetNewLoc(); + arg[PARAM_SEARCHES] = js2JSON([{ 'term' : term.toLowerCase(), + 'restrict' : [ { 'tag' : '010', 'subfield' : '_' } ] }]); + arg[PARAM_ADVTYPE] = ADVTYPE_MARC; + arg[PARAM_TERM] = ""; + break; + + + default: alert('not done'); + } + + if(arg.page) goTo(buildOPACLink(arg)); +} + + +function advFindBarcode(barcode) { + var req = new Request(FETCH_BIB_ID_BY_BARCODE, barcode); + req.callback(advDrawBarcode); + req.request.alertEvent = false; + req.send(); +} + +function advDrawBarcode(r) { + titleid = r.getResultObject(); + if(checkILSEvent(titleid)) { + alertId('myopac.copy.not.found'); + return; + } + if(!titleid) return; + var args = {}; + args.page = RDETAIL; + args[PARAM_RID] = titleid; + location.href = buildOPACLink(args); +} + +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; +} + +__setsortsel(); diff --git a/Open-ILS/web/opac/skin/kcls/js/container.js b/Open-ILS/web/opac/skin/kcls/js/container.js index 152bb1f856..c898663642 100644 --- a/Open-ILS/web/opac/skin/kcls/js/container.js +++ b/Open-ILS/web/opac/skin/kcls/js/container.js @@ -1,67 +1,67 @@ - -function containerDoRequest( req, callback, args ) { - - if( callback ) { - req.callback( callback ); - req.request.args = args; - req.send(); - return null; - } - - req.send(true); - return req.result(); -} - - -function containerFetchAll( callback, args ) { - var req = new Request( - FETCH_CONTAINERS, G.user.session, G.user.id(), 'biblio', 'bookbag' ); - return containerDoRequest( req, callback, args ); -} - -function containerFlesh( id, callback, args ) { - var req = new Request( FLESH_CONTAINER, G.user.session, 'biblio', id ); - return containerDoRequest( req, callback, args ); -} - -function containerDelete( id, callback, args ) { - var req = new Request( DELETE_CONTAINER, G.user.session, 'biblio', id ); - return containerDoRequest(req, callback, args ); -} - - -function containerCreate( name, pub, callback, args ) { - - var container = new cbreb(); - container.btype('bookbag'); - container.owner( G.user.id() ); - container.name( name ); - if(pub) container.pub('t'); - else container.pub('f'); - - var req = new Request( - CREATE_CONTAINER, G.user.session, 'biblio', container ); - return containerDoRequest( req, callback, args ); -} - -function containerUpdate( container, callback, args ) { - var req = new Request(UPDATE_CONTAINER, G.user.session, 'biblio', container); - return containerDoRequest(req, callback, args); -} - -function containerCreateItem( containerId, target, callback, args ) { - - var item = new cbrebi(); - item.target_biblio_record_entry(target); - item.bucket(containerId); - - var req = new Request( CREATE_CONTAINER_ITEM, - G.user.session, 'biblio', item ); - - return containerDoRequest( req, callback, args ); -} - -function containerRemoveItem( id, callback, args ) { - var req = new Request( DELETE_CONTAINER_ITEM, G.user.session, 'biblio', id ); - return containerDoRequest( req, callback, args ); -} + +function containerDoRequest( req, callback, args ) { + + if( callback ) { + req.callback( callback ); + req.request.args = args; + req.send(); + return null; + } + + req.send(true); + return req.result(); +} + + +function containerFetchAll( callback, args ) { + var req = new Request( + FETCH_CONTAINERS, G.user.session, G.user.id(), 'biblio', 'bookbag' ); + return containerDoRequest( req, callback, args ); +} + +function containerFlesh( id, callback, args ) { + var req = new Request( FLESH_CONTAINER, G.user.session, 'biblio', id ); + return containerDoRequest( req, callback, args ); +} + +function containerDelete( id, callback, args ) { + var req = new Request( DELETE_CONTAINER, G.user.session, 'biblio', id ); + return containerDoRequest(req, callback, args ); +} + + +function containerCreate( name, pub, callback, args ) { + + var container = new cbreb(); + container.btype('bookbag'); + container.owner( G.user.id() ); + container.name( name ); + if(pub) container.pub('t'); + else container.pub('f'); + + var req = new Request( + CREATE_CONTAINER, G.user.session, 'biblio', container ); + return containerDoRequest( req, callback, args ); +} + +function containerUpdate( container, callback, args ) { + var req = new Request(UPDATE_CONTAINER, G.user.session, 'biblio', container); + return containerDoRequest(req, callback, args); +} + +function containerCreateItem( containerId, target, callback, args ) { + + var item = new cbrebi(); + item.target_biblio_record_entry(target); + item.bucket(containerId); + + var req = new Request( CREATE_CONTAINER_ITEM, + G.user.session, 'biblio', item ); + + return containerDoRequest( req, callback, args ); +} + +function containerRemoveItem( id, callback, args ) { + var req = new Request( DELETE_CONTAINER_ITEM, G.user.session, 'biblio', id ); + return containerDoRequest( req, callback, args ); +} diff --git a/Open-ILS/web/opac/skin/kcls/js/contentcafe.js b/Open-ILS/web/opac/skin/kcls/js/contentcafe.js index 037b7fa013..86109843c6 100644 --- a/Open-ILS/web/opac/skin/kcls/js/contentcafe.js +++ b/Open-ILS/web/opac/skin/kcls/js/contentcafe.js @@ -1,13 +1,13 @@ - - -function ContentCafe(recordid) { - var xml = null; - var xhr = buildXMLRequest(); - - xhr.open("GET","http://contentcafe2.btol.com/ContentCafe/ContentCafe.asmx/Single?userID=KC72927&password=CC14647&key="+recordid+"&content=AvailableContent", false); - xhr.send(null); - if(xhr.responseXML && xhr.responseXML.documentElement && xhr.status == 200) xml = xhr.responseXML.documentElement; - //this.toString = function() { return this.marcObj.toString(); }; - this.xml = xml; - this.parser = "test"; + + +function ContentCafe(recordid) { + var xml = null; + var xhr = buildXMLRequest(); + + xhr.open("GET","http://contentcafe2.btol.com/ContentCafe/ContentCafe.asmx/Single?userID=KC72927&password=CC14647&key="+recordid+"&content=AvailableContent", false); + xhr.send(null); + if(xhr.responseXML && xhr.responseXML.documentElement && xhr.status == 200) xml = xhr.responseXML.documentElement; + //this.toString = function() { return this.marcObj.toString(); }; + this.xml = xml; + this.parser = "test"; } \ No newline at end of file diff --git a/Open-ILS/web/opac/skin/kcls/js/contentslider.js b/Open-ILS/web/opac/skin/kcls/js/contentslider.js index f5836973c0..4231e80911 100644 --- a/Open-ILS/web/opac/skin/kcls/js/contentslider.js +++ b/Open-ILS/web/opac/skin/kcls/js/contentslider.js @@ -1,235 +1,235 @@ -//** Featured Content Slider script- (c) Dynamic Drive DHTML code library: http://www.dynamicdrive.com. -//** May 2nd, 08'- Script rewritten and updated to 2.0. -//** June 12th, 08'- Script updated to v 2.3, which adds the following features: - //1) Changed behavior of script to actually collapse the previous content when the active one is shown, instead of just tucking it underneath the later. - //2) Added setting to reveal a content either via "click" or "mouseover" of pagination links (default is former). - //3) Added public function for jumping to a particular slide within a Featured Content instance using an arbitrary link, for example. - -//** July 11th, 08'- Script updated to v 2.4: - //1) Added ability to select a particular slide when the page first loads using a URL parameter (ie: mypage.htm?myslider=4 to select 4th slide in "myslider") - //2) Fixed bug where the first slide disappears when the mouse clicks or mouses over it when page first loads. - -var featuredcontentslider={ - -//3 variables below you can customize if desired: -ajaxloadingmsg: '', -bustajaxcache: true, //bust caching of external ajax page after 1st request? -enablepersist: true, //persist to last content viewed when returning to page? - -settingcaches: {}, //object to cache "setting" object of each script instance - -jumpTo:function(fcsid, pagenumber){ //public function to go to a slide manually. - this.turnpage(this.settingcaches[fcsid], pagenumber) -}, - -ajaxconnect:function(setting){ - var page_request = false - if (window.ActiveXObject){ //Test for support for ActiveXObject in IE first (as XMLHttpRequest in IE7 is broken) - try { - page_request = new ActiveXObject("Msxml2.XMLHTTP") - } - catch (e){ - try{ - page_request = new ActiveXObject("Microsoft.XMLHTTP") - } - catch (e){} - } - } - else if (window.XMLHttpRequest) // if Mozilla, Safari etc - page_request = new XMLHttpRequest() - else - return false - var pageurl=setting.contentsource[1] - page_request.onreadystatechange=function(){ - featuredcontentslider.ajaxpopulate(page_request, setting) - } - document.getElementById(setting.id).innerHTML=this.ajaxloadingmsg - var bustcache=(!this.bustajaxcache)? "" : (pageurl.indexOf("?")!=-1)? "&"+new Date().getTime() : "?"+new Date().getTime() - page_request.open('GET', pageurl+bustcache, true) - page_request.send(null) -}, - -ajaxpopulate:function(page_request, setting){ - if (page_request.readyState == 4 && (page_request.status==200 || window.location.href.indexOf("http")==-1)){ - document.getElementById(setting.id).innerHTML=page_request.responseText - this.buildpaginate(setting) - } -}, - -buildcontentdivs:function(setting){ - var alldivs=document.getElementById(setting.id).getElementsByTagName("div") - for (var i=0; i'+(typeof toc=="string"? toc.replace(/#increment/, i) : toc[i-1])+' ' - } - phtml=(nextprev[0]!=''? ' ' : '') + phtml + (nextprev[1]!=''? '' : '') - pdiv.innerHTML=phtml - } - var pdivlinks=pdiv.getElementsByTagName("a") - var toclinkscount=0 //var to keep track of actual # of toc links - for (var i=0; isetting.contentdivs.length-1){ //if this toc link is out of range (user defined more toc links then there are contents) - pdivlinks[i].style.display="none" //hide this toc link - continue - } - pdivlinks[i].setAttribute("rel", ++toclinkscount) //store page number inside toc link - pdivlinks[i][setting.revealtype]=function(){ - featuredcontentslider.turnpage(setting, this.getAttribute("rel")) - return false - } - setting.toclinks.push(pdivlinks[i]) - } - else if (this.css(pdivlinks[i], "prev", "check") || this.css(pdivlinks[i], "next", "check")){ //check for links with class "prev" or "next" - pdivlinks[i].onclick=function(){ - featuredcontentslider.turnpage(setting, this.className) - return false - } - } - } - this.turnpage(setting, setting.currentpage, true) - if (setting.autorotate[0]){ //if auto rotate enabled - pdiv[setting.revealtype]=function(){ - featuredcontentslider.cleartimer(setting, window["fcsautorun"+setting.id]) - } - sliderdiv["onclick"]=function(){ //stop content slider when slides themselves are clicked on - featuredcontentslider.cleartimer(setting, window["fcsautorun"+setting.id]) - } - setting.autorotate[1]=setting.autorotate[1]+(1/setting.enablefade[1]*50) //add time to run fade animation (roughly) to delay between rotation - this.autorotate(setting) - } -}, - -urlparamselect:function(fcsid){ - var result=window.location.search.match(new RegExp(fcsid+"=(\\d+)", "i")) //check for "?featuredcontentsliderid=2" in URL - return (result==null)? null : parseInt(RegExp.$1) //returns null or index, where index (int) is the selected tab's index -}, - -turnpage:function(setting, thepage, autocall){ - var currentpage=setting.currentpage //current page # before change - var totalpages=setting.contentdivs.length - var turntopage=(/prev/i.test(thepage))? currentpage-1 : (/next/i.test(thepage))? currentpage+1 : parseInt(thepage) - turntopage=(turntopage<1)? totalpages : (turntopage>totalpages)? 1 : turntopage //test for out of bound and adjust - if (turntopage==setting.currentpage && typeof autocall=="undefined") //if a pagination link is clicked on repeatedly - return - setting.currentpage=turntopage - setting.contentdivs[turntopage-1].style.zIndex=++setting.topzindex - this.cleartimer(setting, window["fcsfade"+setting.id]) - setting.cacheprevpage=setting.prevpage - if (setting.enablefade[0]==true){ - setting.curopacity=0 - this.fadeup(setting) - } - if (setting.enablefade[0]==false){ //if fade is disabled, fire onChange event immediately (verus after fade is complete) - setting.contentdivs[setting.prevpage-1].style.display="none" //collapse last content div shown (it was set to "block") - setting.onChange(setting.prevpage, setting.currentpage) - } - setting.contentdivs[turntopage-1].style.visibility="visible" - setting.contentdivs[turntopage-1].style.display="block" - if (setting.prevpage<=setting.toclinks.length) //make sure pagination link exists (may not if manually defined via "markup", and user omitted) - this.css(setting.toclinks[setting.prevpage-1], "selected", "remove") - if (turntopage<=setting.toclinks.length) //make sure pagination link exists (may not if manually defined via "markup", and user omitted) - this.css(setting.toclinks[turntopage-1], "selected", "add") - setting.prevpage=turntopage - if (this.enablepersist) - this.setCookie("fcspersist"+setting.id, turntopage) -}, - -setopacity:function(setting, value){ //Sets the opacity of targetobject based on the passed in value setting (0 to 1 and in between) - var targetobject=setting.contentdivs[setting.currentpage-1] - if (targetobject.filters && targetobject.filters[0]){ //IE syntax - if (typeof targetobject.filters[0].opacity=="number") //IE6 - targetobject.filters[0].opacity=value*100 - else //IE 5.5 - targetobject.style.filter="alpha(opacity="+value*100+")" - } - else if (typeof targetobject.style.MozOpacity!="undefined") //Old Mozilla syntax - targetobject.style.MozOpacity=value - else if (typeof targetobject.style.opacity!="undefined") //Standard opacity syntax - targetobject.style.opacity=value - setting.curopacity=value -}, - -fadeup:function(setting){ - if (setting.curopacity<1){ - this.setopacity(setting, setting.curopacity+setting.enablefade[1]) - window["fcsfade"+setting.id]=setTimeout(function(){featuredcontentslider.fadeup(setting)}, 10) - } - else{ //when fade is complete - if (setting.cacheprevpage!=setting.currentpage) //if previous content isn't the same as the current shown div (happens the first time the page loads/ script is run) - setting.contentdivs[setting.cacheprevpage-1].style.display="none" //collapse last content div shown (it was set to "block") - setting.onChange(setting.cacheprevpage, setting.currentpage) - } -}, - -cleartimer:function(setting, timervar){ - if (typeof timervar!="undefined"){ - clearTimeout(timervar) - clearInterval(timervar) - if (setting.cacheprevpage!=setting.currentpage){ //if previous content isn't the same as the current shown div - setting.contentdivs[setting.cacheprevpage-1].style.display="none" - } - } -}, - -css:function(el, targetclass, action){ - var needle=new RegExp("(^|\\s+)"+targetclass+"($|\\s+)", "ig") - if (action=="check") - return needle.test(el.className) - else if (action=="remove") - el.className=el.className.replace(needle, "") - else if (action=="add") - el.className+=" "+targetclass -}, - -autorotate:function(setting){ - window["fcsautorun"+setting.id]=setInterval(function(){featuredcontentslider.turnpage(setting, "next")}, setting.autorotate[1]) -}, - -getCookie:function(Name){ - var re=new RegExp(Name+"=[^;]+", "i"); //construct RE to search for target name/value pair - if (document.cookie.match(re)) //if cookie found - return document.cookie.match(re)[0].split("=")[1] //return its value - return null -}, - -setCookie:function(name, value){ - document.cookie = name+"="+value - -}, - - -init:function(setting){ - var persistedpage=this.getCookie("fcspersist"+setting.id) || 1 - var urlselectedpage=this.urlparamselect(setting.id) //returns null or index from: mypage.htm?featuredcontentsliderid=index - this.settingcaches[setting.id]=setting //cache "setting" object - setting.contentdivs=[] - setting.toclinks=[] - setting.topzindex=0 - setting.currentpage=urlselectedpage || ((this.enablepersist)? persistedpage : 1) - setting.prevpage=setting.currentpage - setting.revealtype="on"+(setting.revealtype || "click") - setting.curopacity=0 - setting.onChange=setting.onChange || function(){} - if (setting.contentsource[0]=="inline") - this.buildpaginate(setting) - if (setting.contentsource[0]=="ajax") - this.ajaxconnect(setting) -} - +//** Featured Content Slider script- (c) Dynamic Drive DHTML code library: http://www.dynamicdrive.com. +//** May 2nd, 08'- Script rewritten and updated to 2.0. +//** June 12th, 08'- Script updated to v 2.3, which adds the following features: + //1) Changed behavior of script to actually collapse the previous content when the active one is shown, instead of just tucking it underneath the later. + //2) Added setting to reveal a content either via "click" or "mouseover" of pagination links (default is former). + //3) Added public function for jumping to a particular slide within a Featured Content instance using an arbitrary link, for example. + +//** July 11th, 08'- Script updated to v 2.4: + //1) Added ability to select a particular slide when the page first loads using a URL parameter (ie: mypage.htm?myslider=4 to select 4th slide in "myslider") + //2) Fixed bug where the first slide disappears when the mouse clicks or mouses over it when page first loads. + +var featuredcontentslider={ + +//3 variables below you can customize if desired: +ajaxloadingmsg: '', +bustajaxcache: true, //bust caching of external ajax page after 1st request? +enablepersist: true, //persist to last content viewed when returning to page? + +settingcaches: {}, //object to cache "setting" object of each script instance + +jumpTo:function(fcsid, pagenumber){ //public function to go to a slide manually. + this.turnpage(this.settingcaches[fcsid], pagenumber) +}, + +ajaxconnect:function(setting){ + var page_request = false + if (window.ActiveXObject){ //Test for support for ActiveXObject in IE first (as XMLHttpRequest in IE7 is broken) + try { + page_request = new ActiveXObject("Msxml2.XMLHTTP") + } + catch (e){ + try{ + page_request = new ActiveXObject("Microsoft.XMLHTTP") + } + catch (e){} + } + } + else if (window.XMLHttpRequest) // if Mozilla, Safari etc + page_request = new XMLHttpRequest() + else + return false + var pageurl=setting.contentsource[1] + page_request.onreadystatechange=function(){ + featuredcontentslider.ajaxpopulate(page_request, setting) + } + document.getElementById(setting.id).innerHTML=this.ajaxloadingmsg + var bustcache=(!this.bustajaxcache)? "" : (pageurl.indexOf("?")!=-1)? "&"+new Date().getTime() : "?"+new Date().getTime() + page_request.open('GET', pageurl+bustcache, true) + page_request.send(null) +}, + +ajaxpopulate:function(page_request, setting){ + if (page_request.readyState == 4 && (page_request.status==200 || window.location.href.indexOf("http")==-1)){ + document.getElementById(setting.id).innerHTML=page_request.responseText + this.buildpaginate(setting) + } +}, + +buildcontentdivs:function(setting){ + var alldivs=document.getElementById(setting.id).getElementsByTagName("div") + for (var i=0; i'+(typeof toc=="string"? toc.replace(/#increment/, i) : toc[i-1])+' ' + } + phtml=(nextprev[0]!=''? ' ' : '') + phtml + (nextprev[1]!=''? '' : '') + pdiv.innerHTML=phtml + } + var pdivlinks=pdiv.getElementsByTagName("a") + var toclinkscount=0 //var to keep track of actual # of toc links + for (var i=0; isetting.contentdivs.length-1){ //if this toc link is out of range (user defined more toc links then there are contents) + pdivlinks[i].style.display="none" //hide this toc link + continue + } + pdivlinks[i].setAttribute("rel", ++toclinkscount) //store page number inside toc link + pdivlinks[i][setting.revealtype]=function(){ + featuredcontentslider.turnpage(setting, this.getAttribute("rel")) + return false + } + setting.toclinks.push(pdivlinks[i]) + } + else if (this.css(pdivlinks[i], "prev", "check") || this.css(pdivlinks[i], "next", "check")){ //check for links with class "prev" or "next" + pdivlinks[i].onclick=function(){ + featuredcontentslider.turnpage(setting, this.className) + return false + } + } + } + this.turnpage(setting, setting.currentpage, true) + if (setting.autorotate[0]){ //if auto rotate enabled + pdiv[setting.revealtype]=function(){ + featuredcontentslider.cleartimer(setting, window["fcsautorun"+setting.id]) + } + sliderdiv["onclick"]=function(){ //stop content slider when slides themselves are clicked on + featuredcontentslider.cleartimer(setting, window["fcsautorun"+setting.id]) + } + setting.autorotate[1]=setting.autorotate[1]+(1/setting.enablefade[1]*50) //add time to run fade animation (roughly) to delay between rotation + this.autorotate(setting) + } +}, + +urlparamselect:function(fcsid){ + var result=window.location.search.match(new RegExp(fcsid+"=(\\d+)", "i")) //check for "?featuredcontentsliderid=2" in URL + return (result==null)? null : parseInt(RegExp.$1) //returns null or index, where index (int) is the selected tab's index +}, + +turnpage:function(setting, thepage, autocall){ + var currentpage=setting.currentpage //current page # before change + var totalpages=setting.contentdivs.length + var turntopage=(/prev/i.test(thepage))? currentpage-1 : (/next/i.test(thepage))? currentpage+1 : parseInt(thepage) + turntopage=(turntopage<1)? totalpages : (turntopage>totalpages)? 1 : turntopage //test for out of bound and adjust + if (turntopage==setting.currentpage && typeof autocall=="undefined") //if a pagination link is clicked on repeatedly + return + setting.currentpage=turntopage + setting.contentdivs[turntopage-1].style.zIndex=++setting.topzindex + this.cleartimer(setting, window["fcsfade"+setting.id]) + setting.cacheprevpage=setting.prevpage + if (setting.enablefade[0]==true){ + setting.curopacity=0 + this.fadeup(setting) + } + if (setting.enablefade[0]==false){ //if fade is disabled, fire onChange event immediately (verus after fade is complete) + setting.contentdivs[setting.prevpage-1].style.display="none" //collapse last content div shown (it was set to "block") + setting.onChange(setting.prevpage, setting.currentpage) + } + setting.contentdivs[turntopage-1].style.visibility="visible" + setting.contentdivs[turntopage-1].style.display="block" + if (setting.prevpage<=setting.toclinks.length) //make sure pagination link exists (may not if manually defined via "markup", and user omitted) + this.css(setting.toclinks[setting.prevpage-1], "selected", "remove") + if (turntopage<=setting.toclinks.length) //make sure pagination link exists (may not if manually defined via "markup", and user omitted) + this.css(setting.toclinks[turntopage-1], "selected", "add") + setting.prevpage=turntopage + if (this.enablepersist) + this.setCookie("fcspersist"+setting.id, turntopage) +}, + +setopacity:function(setting, value){ //Sets the opacity of targetobject based on the passed in value setting (0 to 1 and in between) + var targetobject=setting.contentdivs[setting.currentpage-1] + if (targetobject.filters && targetobject.filters[0]){ //IE syntax + if (typeof targetobject.filters[0].opacity=="number") //IE6 + targetobject.filters[0].opacity=value*100 + else //IE 5.5 + targetobject.style.filter="alpha(opacity="+value*100+")" + } + else if (typeof targetobject.style.MozOpacity!="undefined") //Old Mozilla syntax + targetobject.style.MozOpacity=value + else if (typeof targetobject.style.opacity!="undefined") //Standard opacity syntax + targetobject.style.opacity=value + setting.curopacity=value +}, + +fadeup:function(setting){ + if (setting.curopacity<1){ + this.setopacity(setting, setting.curopacity+setting.enablefade[1]) + window["fcsfade"+setting.id]=setTimeout(function(){featuredcontentslider.fadeup(setting)}, 10) + } + else{ //when fade is complete + if (setting.cacheprevpage!=setting.currentpage) //if previous content isn't the same as the current shown div (happens the first time the page loads/ script is run) + setting.contentdivs[setting.cacheprevpage-1].style.display="none" //collapse last content div shown (it was set to "block") + setting.onChange(setting.cacheprevpage, setting.currentpage) + } +}, + +cleartimer:function(setting, timervar){ + if (typeof timervar!="undefined"){ + clearTimeout(timervar) + clearInterval(timervar) + if (setting.cacheprevpage!=setting.currentpage){ //if previous content isn't the same as the current shown div + setting.contentdivs[setting.cacheprevpage-1].style.display="none" + } + } +}, + +css:function(el, targetclass, action){ + var needle=new RegExp("(^|\\s+)"+targetclass+"($|\\s+)", "ig") + if (action=="check") + return needle.test(el.className) + else if (action=="remove") + el.className=el.className.replace(needle, "") + else if (action=="add") + el.className+=" "+targetclass +}, + +autorotate:function(setting){ + window["fcsautorun"+setting.id]=setInterval(function(){featuredcontentslider.turnpage(setting, "next")}, setting.autorotate[1]) +}, + +getCookie:function(Name){ + var re=new RegExp(Name+"=[^;]+", "i"); //construct RE to search for target name/value pair + if (document.cookie.match(re)) //if cookie found + return document.cookie.match(re)[0].split("=")[1] //return its value + return null +}, + +setCookie:function(name, value){ + document.cookie = name+"="+value + +}, + + +init:function(setting){ + var persistedpage=this.getCookie("fcspersist"+setting.id) || 1 + var urlselectedpage=this.urlparamselect(setting.id) //returns null or index from: mypage.htm?featuredcontentsliderid=index + this.settingcaches[setting.id]=setting //cache "setting" object + setting.contentdivs=[] + setting.toclinks=[] + setting.topzindex=0 + setting.currentpage=urlselectedpage || ((this.enablepersist)? persistedpage : 1) + setting.prevpage=setting.currentpage + setting.revealtype="on"+(setting.revealtype || "click") + setting.curopacity=0 + setting.onChange=setting.onChange || function(){} + if (setting.contentsource[0]=="inline") + this.buildpaginate(setting) + if (setting.contentsource[0]=="ajax") + this.ajaxconnect(setting) +} + } \ No newline at end of file diff --git a/Open-ILS/web/opac/skin/kcls/js/depth_selector.js b/Open-ILS/web/opac/skin/kcls/js/depth_selector.js index 326aead1f2..83031bd812 100644 --- a/Open-ILS/web/opac/skin/kcls/js/depth_selector.js +++ b/Open-ILS/web/opac/skin/kcls/js/depth_selector.js @@ -1,112 +1,112 @@ - -attachEvt( "common", "locationChanged", updateLoc ); -attachEvt("common", "run", function(){ - setSelector(_ds, getLocation()); _newlocation = getLocation(); -}); // sets default search to home library -//attachEvt("common", "run", function(){setSelector(_ds, "1"); _newlocation = "1";}); - -var _ds; -var _libselspan; -var _libselslink; -var _dselspan; -var _newlocation = null; - -function depthSelInit() { - _ds = $('depth_selector'); - _ds.onchange = depthSelectorChanged; - _libselspan = $('lib_selector_span'); - _libsellink = $('lib_selector_link'); - _dselspan = $('depth_selector_span'); - - if( getLocation() == globalOrgTree.id() ) { - unHideMe( _libselspan ); - _libsellink.onclick = _opacHandleLocationTagClick; - } else { - unHideMe( _dselspan ); - //buildLocationSelector(); - } -} - - -var orgTreeIsBuilt = false; -function _opacHandleLocationTagClick() { - - swapCanvas(G.ui.common.org_container); - - if(!orgTreeIsBuilt) { - drawOrgTree(); - orgTreeIsBuilt = true; - } - -} - -function depthSelGetDepth() { - var depth = parseInt(_ds.options[_ds.selectedIndex].value); - if(isNaN(depth)) depth = 0; - return depth; -} - -function depthSelectorChanged() { - if(!_ds) return; - _newlocation = _ds.options[_ds.selectedIndex].value; -} - -var chooseAnotherNode; -function buildLocationSelector(newLoc) { - - var loc; - if(newLoc != null) loc = newLoc; - else loc = getLocation(); - - if( loc == globalOrgTree.id() ) return; - - var selector = _ds; - if(!chooseAnotherNode) - chooseAnotherNode = selector.removeChild( - selector.getElementsByTagName("option")[0]); - var node = chooseAnotherNode; - removeChildren(selector); - - var location = findOrgUnit(loc); - var type; - if (location) type = findOrgType(location.ou_type()); - - while( type && location ) { - var n = node.cloneNode(true); - n.setAttribute("value", type.depth()); - removeChildren(n); - n.appendChild(text(type.opac_label())); - selector.appendChild(n); - location = findOrgUnit(location.parent_ou()); - if(location) type = findOrgType(location.ou_type()); - else type = null; - } - - selector.appendChild(node); -} - -function getNewSearchDepth() { return newSearchDepth; } -function getNewSearchLocation() { return (isNull(_newlocation)) ? LOCATION : _newlocation; } -function depthSelGetNewLoc() { return getNewSearchLocation(); } - -function updateLoc(location, depth) { - if( depth != null ) { - if(depth != 0 ){ - _libsellink.onclick = _opacHandleLocationTagClick; - if( location == globalOrgTree.id() ) { - hideMe( _dselspan ); - unHideMe( _libselspan ); - } else { - buildLocationSelector(location); - hideMe( _libselspan ); - unHideMe( _dselspan ); - } - } - - setSelector(_ds, depth); - newSearchDepth = depth; - } - - _newlocation = location; - runEvt('common','locationUpdated', location); -} + +attachEvt( "common", "locationChanged", updateLoc ); +attachEvt("common", "run", function(){ + setSelector(_ds, getLocation()); _newlocation = getLocation(); +}); // sets default search to home library +//attachEvt("common", "run", function(){setSelector(_ds, "1"); _newlocation = "1";}); + +var _ds; +var _libselspan; +var _libselslink; +var _dselspan; +var _newlocation = null; + +function depthSelInit() { + _ds = $('depth_selector'); + _ds.onchange = depthSelectorChanged; + _libselspan = $('lib_selector_span'); + _libsellink = $('lib_selector_link'); + _dselspan = $('depth_selector_span'); + + if( getLocation() == globalOrgTree.id() ) { + unHideMe( _libselspan ); + _libsellink.onclick = _opacHandleLocationTagClick; + } else { + unHideMe( _dselspan ); + //buildLocationSelector(); + } +} + + +var orgTreeIsBuilt = false; +function _opacHandleLocationTagClick() { + + swapCanvas(G.ui.common.org_container); + + if(!orgTreeIsBuilt) { + drawOrgTree(); + orgTreeIsBuilt = true; + } + +} + +function depthSelGetDepth() { + var depth = parseInt(_ds.options[_ds.selectedIndex].value); + if(isNaN(depth)) depth = 0; + return depth; +} + +function depthSelectorChanged() { + if(!_ds) return; + _newlocation = _ds.options[_ds.selectedIndex].value; +} + +var chooseAnotherNode; +function buildLocationSelector(newLoc) { + + var loc; + if(newLoc != null) loc = newLoc; + else loc = getLocation(); + + if( loc == globalOrgTree.id() ) return; + + var selector = _ds; + if(!chooseAnotherNode) + chooseAnotherNode = selector.removeChild( + selector.getElementsByTagName("option")[0]); + var node = chooseAnotherNode; + removeChildren(selector); + + var location = findOrgUnit(loc); + var type; + if (location) type = findOrgType(location.ou_type()); + + while( type && location ) { + var n = node.cloneNode(true); + n.setAttribute("value", type.depth()); + removeChildren(n); + n.appendChild(text(type.opac_label())); + selector.appendChild(n); + location = findOrgUnit(location.parent_ou()); + if(location) type = findOrgType(location.ou_type()); + else type = null; + } + + selector.appendChild(node); +} + +function getNewSearchDepth() { return newSearchDepth; } +function getNewSearchLocation() { return (isNull(_newlocation)) ? LOCATION : _newlocation; } +function depthSelGetNewLoc() { return getNewSearchLocation(); } + +function updateLoc(location, depth) { + if( depth != null ) { + if(depth != 0 ){ + _libsellink.onclick = _opacHandleLocationTagClick; + if( location == globalOrgTree.id() ) { + hideMe( _dselspan ); + unHideMe( _libselspan ); + } else { + buildLocationSelector(location); + hideMe( _libselspan ); + unHideMe( _dselspan ); + } + } + + setSelector(_ds, depth); + newSearchDepth = depth; + } + + _newlocation = location; + runEvt('common','locationUpdated', location); +} diff --git a/Open-ILS/web/opac/skin/kcls/js/fgi-search_bar.js b/Open-ILS/web/opac/skin/kcls/js/fgi-search_bar.js index 2846700269..79e56ae848 100644 --- a/Open-ILS/web/opac/skin/kcls/js/fgi-search_bar.js +++ b/Open-ILS/web/opac/skin/kcls/js/fgi-search_bar.js @@ -1,103 +1,103 @@ -var searchBarExpanded = false; -/* our search selector boxes */ -var _ts, _fs; -var isFrontPage = false; -G.evt.common.init.push(searchBarInit); - -/* if set by the org selector, this will be the location used the - next time the search is submitted */ -var newSearchLocation; -var newSearchDepth = null; - - -function searchBarInit() { - - _ts = G.ui.searchbar.type_selector; - _fs = G.ui.searchbar.form_selector; - - try{G.ui.searchbar.text.focus();}catch(e){} - G.ui.searchbar.text.onkeydown = function(evt) {if(userPressedEnter(evt)) { searchBarSubmit(); } }; - _ts.onkeydown = function(evt) {if(userPressedEnter(evt)) { searchBarSubmit(); } }; - _fs.onkeydown = function(evt) {if(userPressedEnter(evt)) { searchBarSubmit(); } }; - - G.ui.searchbar.submit.onclick = searchBarSubmit; - - /* set up the selector objects, etc */ - G.ui.searchbar.text.value = (getTerm() != null) ? getTerm() : ""; - G.ui.searchbar.facets.value = (getFacet() != null) ? getFacet() : ""; - setSelector(_ts, getStype()); - setSelector(_fs, getForm()); - - depthSelInit(); - - if(getSearches()) { - var searches = JSON2js(getSearches()); - setSelector(_fs, searches[1].term); - if(!G.ui.searchbar.text.value) G.ui.searchbar.text.value = searches[0].term; - } - - if(!isFrontPage && (findCurrentPage() != MYOPAC)) { - attachEvt('common','depthChanged', searchBarSubmit); - } - - if( (limit = $('opac.result.limit2avail')) ) { - if(getAvail()) limit.checked = true; - if(getSort() && getSortDir()) - setSelector($('opac.result.sort'), getSort()+'.'+getSortDir()); - } - - if( (limit2 = $('opac.result.limit2avail2')) ) if(getAvail()) limit2.checked = true; -} - -function searchBarSubmit(isFilterSort) { - var text = G.ui.searchbar.text.value; - var facet_text = isFrontPage ? '' : G.ui.searchbar.facets.value; - clearSearchParams(); - if(!text || text == "" || text == "Search Keyword") return; - //var d = (newSearchDepth != null) ? newSearchDepth : depthSelGetDepth(); - var d = getDepth(); - if(isNaN(d)) d = 0; - var args = {}; - - if(SHOW_MR_DEFAULT || (isFilterSort && findCurrentPage() == MRESULT)) { - args.page = MRESULT; - } else { - args.page = RRESULT; - args[PARAM_RTYPE] = _ts.options[_ts.selectedIndex].value; - } - - args[PARAM_STYPE] = _ts.options[_ts.selectedIndex].value; - args[PARAM_LOCATION] = depthSelGetNewLoc(); - args[PARAM_DEPTH] = d; - - var val = _fs.options[_fs.selectedIndex].value; - if(val!='') { - args[PARAM_SEARCHES] = '[{"term":"'+text+'","restrict":[{"tag":"245","subfield":"a"}]},{"term":"'+val+'","restrict":[{"tag":"998","subfield":"d"}]}]'; - args[PARAM_ADVTYPE] = ADVTYPE_MARC; - args[PARAM_TERM] = ""; - args[PARAM_FORM] = 'all'; - args[PARAM_RTYPE] = RTYPE_MARC; - } else { - args[PARAM_TERM] = text; - args[PARAM_FACET]= facet_text; - } - - - if($('opac.result.limit2avail') && !arguments[1]) { - args[PARAM_AVAIL] = ($('opac.result.limit2avail').checked) ? 1 : ''; - if( (val = getSelectorVal($('opac.result.sort'))) ) { - args[PARAM_SORT] = val.split('.')[0]; - args[PARAM_SORT_DIR] = val.split('.')[1]; - } - } else if(arguments[1]) { - args[PARAM_AVAIL] = (arguments[1].checked) ? 1 : ''; - if( (val = getSelectorVal($('opac.result.sort'))) ) { - args[PARAM_SORT] = val.split('.')[0]; - args[PARAM_SORT_DIR] = val.split('.')[1]; - } - } - - goTo(buildOPACLink(args)); -} - - +var searchBarExpanded = false; +/* our search selector boxes */ +var _ts, _fs; +var isFrontPage = false; +G.evt.common.init.push(searchBarInit); + +/* if set by the org selector, this will be the location used the + next time the search is submitted */ +var newSearchLocation; +var newSearchDepth = null; + + +function searchBarInit() { + + _ts = G.ui.searchbar.type_selector; + _fs = G.ui.searchbar.form_selector; + + try{G.ui.searchbar.text.focus();}catch(e){} + G.ui.searchbar.text.onkeydown = function(evt) {if(userPressedEnter(evt)) { searchBarSubmit(); } }; + _ts.onkeydown = function(evt) {if(userPressedEnter(evt)) { searchBarSubmit(); } }; + _fs.onkeydown = function(evt) {if(userPressedEnter(evt)) { searchBarSubmit(); } }; + + G.ui.searchbar.submit.onclick = searchBarSubmit; + + /* set up the selector objects, etc */ + G.ui.searchbar.text.value = (getTerm() != null) ? getTerm() : ""; + G.ui.searchbar.facets.value = (getFacet() != null) ? getFacet() : ""; + setSelector(_ts, getStype()); + setSelector(_fs, getForm()); + + depthSelInit(); + + if(getSearches()) { + var searches = JSON2js(getSearches()); + setSelector(_fs, searches[1].term); + if(!G.ui.searchbar.text.value) G.ui.searchbar.text.value = searches[0].term; + } + + if(!isFrontPage && (findCurrentPage() != MYOPAC)) { + attachEvt('common','depthChanged', searchBarSubmit); + } + + if( (limit = $('opac.result.limit2avail')) ) { + if(getAvail()) limit.checked = true; + if(getSort() && getSortDir()) + setSelector($('opac.result.sort'), getSort()+'.'+getSortDir()); + } + + if( (limit2 = $('opac.result.limit2avail2')) ) if(getAvail()) limit2.checked = true; +} + +function searchBarSubmit(isFilterSort) { + var text = G.ui.searchbar.text.value; + var facet_text = isFrontPage ? '' : G.ui.searchbar.facets.value; + clearSearchParams(); + if(!text || text == "" || text == "Search Keyword") return; + //var d = (newSearchDepth != null) ? newSearchDepth : depthSelGetDepth(); + var d = getDepth(); + if(isNaN(d)) d = 0; + var args = {}; + + if(SHOW_MR_DEFAULT || (isFilterSort && findCurrentPage() == MRESULT)) { + args.page = MRESULT; + } else { + args.page = RRESULT; + args[PARAM_RTYPE] = _ts.options[_ts.selectedIndex].value; + } + + args[PARAM_STYPE] = _ts.options[_ts.selectedIndex].value; + args[PARAM_LOCATION] = depthSelGetNewLoc(); + args[PARAM_DEPTH] = d; + + var val = _fs.options[_fs.selectedIndex].value; + if(val!='') { + args[PARAM_SEARCHES] = '[{"term":"'+text+'","restrict":[{"tag":"245","subfield":"a"}]},{"term":"'+val+'","restrict":[{"tag":"998","subfield":"d"}]}]'; + args[PARAM_ADVTYPE] = ADVTYPE_MARC; + args[PARAM_TERM] = ""; + args[PARAM_FORM] = 'all'; + args[PARAM_RTYPE] = RTYPE_MARC; + } else { + args[PARAM_TERM] = text; + args[PARAM_FACET]= facet_text; + } + + + if($('opac.result.limit2avail') && !arguments[1]) { + args[PARAM_AVAIL] = ($('opac.result.limit2avail').checked) ? 1 : ''; + if( (val = getSelectorVal($('opac.result.sort'))) ) { + args[PARAM_SORT] = val.split('.')[0]; + args[PARAM_SORT_DIR] = val.split('.')[1]; + } + } else if(arguments[1]) { + args[PARAM_AVAIL] = (arguments[1].checked) ? 1 : ''; + if( (val = getSelectorVal($('opac.result.sort'))) ) { + args[PARAM_SORT] = val.split('.')[0]; + args[PARAM_SORT_DIR] = val.split('.')[1]; + } + } + + goTo(buildOPACLink(args)); +} + + diff --git a/Open-ILS/web/opac/skin/kcls/js/holds.js b/Open-ILS/web/opac/skin/kcls/js/holds.js index 9e284cb3b4..7d29dbaad6 100644 --- a/Open-ILS/web/opac/skin/kcls/js/holds.js +++ b/Open-ILS/web/opac/skin/kcls/js/holds.js @@ -1,1061 +1,1061 @@ -var holdsOrgSelectorBuilt = false; -var holdArgs; - -/* -note: metarecord holds have a holdable_formats field that contains -item_type(s)-item_forms(s)-language -item_form and language are optional - if language exist and no -item_form is specified, use item_type(s)--language -*/ - -var noEmailMessage; -var noEmailMessageXUL; - -function hideResultsPage(bool) { - if(!bool) { - unHideMe($('result_header')); - unHideMe($('tehSideBar')); - unHideMe($('facetSidebarContainer')); - unHideMe($('sidebar_div')); - unHideMe($('statusbar')); - unHideMe($('tips')); - unHideMe($('result_table_div')); - unHideMe($('results_header_nav1')); - unHideMe($('result_info_2')); - unHideMe($('results_header_bar')); - } else { - hideMe($('result_header')); - hideMe($('tehSideBar')); - hideMe($('facetSidebarContainer')); - hideMe($('sidebar_div')); - hideMe($('statusbar')); - hideMe($('tips')); - hideMe($('result_table_div')); - hideMe($('anonListTable')); - hideMe($('results_header_nav1')); - hideMe($('result_info_2')); - hideMe($('results_header_bar')); - } -} - -function holdsHandleStaff() { - - // if we know the recipient's barcode, use it - if(xulG.patron_barcode) return _holdsHandleStaff(); - - swapCanvas($('xulholds_box')); - $('xul_recipient_barcode').focus(); - $('xul_recipient_barcode').onkeypress = function(evt) - {if(userPressedEnter(evt)) { _holdsHandleStaff(); } }; - $('xul_recipient_barcode_submit').onclick = _holdsHandleStaff; - $('xul_recipient_me').onclick = _holdsHandleStaffMe; - - $('xul_recipient_barcode').onkeyup = function(evt) { - if($('xul_recipient_barcode').value == '') - $('xul_recipient_me').disabled = false; - else - $('xul_recipient_me').disabled = true; - }; -} - -$('holds_frozen_thaw_input').onchange = function(){holdsVerifyThawDateUI('holds_frozen_thaw_input');} -$('holds_frozen_thaw_input').onkeyup = function(){holdsVerifyThawDateUI('holds_frozen_thaw_input');} - -function _holdsHandleStaffMe() { - holdArgs.recipient = G.user; - holdsDrawEditor(); -} - -function _holdsHandleStaff() { - var barcode = xulG.patron_barcode || $('xul_recipient_barcode').value; - var user = grabUserByBarcode( G.user.session, barcode ); - - var evt; - if(evt = checkILSEvent(user)) { - alertILSEvent(user); - return; - } - - if(!barcode || !user) { - alertId('holds_invalid_recipient', barcode); - return - } - - grabUserPrefs(user); - - holdArgs.recipient = user; - holdsDrawEditor(); -} - - - -/** args: - * record, volume, copy (ids) - * request, recipient, editHold (objects) - */ - -function holdsDrawEditor(args) { - holdArgs = (args) ? args : holdArgs; - - if(!noEmailMessage) noEmailMessage = $('holds_email').removeChild($('holds.no_email')); - if(!noEmailMessageXUL) noEmailMessageXUL = $('holds_email').removeChild($('holds.no_email.xul')); - - if(isXUL() && holdArgs.recipient == null && holdArgs.editHold == null) { - holdsHandleStaff(); - return; - } - - if(!holdArgs.recipient) holdArgs.recipient = G.user; - if(!holdArgs.requestor) holdArgs.requestor = G.user; - - if(!(holdArgs.requestor && holdArgs.requestor.session)) { - /* - alert("Please login first before placing a hold"); - setCacheValue('returnURL',{href:window.location.href, record:holdArgs.record, type:holdArgs.type}); - goTo(buildOPACLink({page:MYOPAC}, false, true)); - return; - */ - detachAllEvt('common','locationChanged'); - attachEvt('common','loggedIn', holdsDrawEditor); - initLogin(); - return; - } -// flesh the args with the existing hold - if(holdArgs.editHold) holdArgsFromHold(holdArgs.editHold, holdArgs); - - hideResultsPage(true); - holdsDrawWindow(); -} - - -// updates the edit window with the existing hold's data -function _holdsUpdateEditHold() { - - var hold = holdArgs.editHold; - var qstats = holdArgs.status; - - var orgsel = $('holds_org_selector'); - var frozenbox = $('holds_frozen_chkbox'); - - setSelector(orgsel, hold.pickup_lib()); - - if( hold.capture_time() || qstats.status > 2 ) { - frozenbox.disabled = true; - $('holds_frozen_thaw_input').disabled = true; - if(qstats.status == 3) { - // no pickup lib changes while in-transit - orgsel.disabled = true; - } else { - var orgs = fetchPermOrgs('UPDATE_PICKUP_LIB_FROM_HOLDS_SHELF'); - if(orgs[0] == -1) - orgsel.disabled = true; - } - } else { - orgsel.disabled = false; - frozenbox.disabled = false; - } - - - $('holds_submit').onclick = holdsEditHold; - $('holds_update').onclick = holdsEditHold; - - if(hold.phone_notify()) { - $('holds_enable_phone').checked = true; - $('holds_phone').value = hold.phone_notify(); - - } else { - $('holds_phone').disabled = true; - $('holds_enable_phone').checked = false; - } - - if(isTrue(hold.email_notify())) { - $('holds_enable_email').checked = true; - - } else { - $('holds_enable_email').checked = false; - } - - //$('holds_expire_time').setValue(dojo.date.stamp.fromISOString(hold.expire_time())); - - /* populate the hold freezing info */ - if(!frozenbox.disabled && isTrue(hold.frozen())) { - frozenbox.checked = true; - unHideMe($('hold_frozen_thaw_row')); - if(hold.thaw_date()) { - $('holds_frozen_thaw_input').value=dojo.date.stamp.fromISOString(hold.thaw_date()); - } else { - $('holds_frozen_thaw_input').value=''; - } - } else { - frozenbox.checked = false; - $('holds_frozen_thaw_input').value=''; - hideMe($('hold_frozen_thaw_row')); - } -} - -function holdsEditHold() { - var hold = holdsBuildHoldFromWindow(); - if(!hold) return; - holdsUpdate(hold); - showCanvas(); - if(holdArgs.onComplete) - holdArgs.onComplete(hold); -} - -function holdArgsFromHold(hold, oargs) { - var args = (oargs) ? oargs : {}; - args.type = hold.hold_type(); - var target = hold.target(); - - switch(args.type) { - case 'M': - args.metarecord = target; - break; - case 'T': - args.record = target; - break; - case 'V': - args.volume = target; - break; - case 'C': - args.copy = target; - break; - } - return args; -} - -function holdFetchObjects(hold, doneCallback) { - var args = (hold) ? holdArgsFromHold(hold) : holdArgs; - var type = args.type; - - if( type == 'C' ) { - if( args.copyObject ) { - - args.copy = args.copyObject.id(); - args.volume = args.copyObject.call_number(); - _h_set_vol(args, doneCallback); - - } else { - var creq = new Request(FETCH_COPY, args.copy); - - creq.callback( - function(r) { - var cp = r.getResultObject(); - args.copyObject = cp; - args.volume = args.copyObject.call_number(); - _h_set_vol(args, doneCallback); - } - ); - creq.send(); - } - } else { - if( type == 'V' ) { - _h_set_vol(args, doneCallback); - - } else { - if( type == 'T' ) { - _h_set_rec(args, doneCallback); - } else { - _h_set_rec_descriptors(args, doneCallback); - } - } - } - - return args; -} - -function _h_set_vol(args, doneCallback) { - - if( args.volumeObject ) { - args.volume = args.volumeObject.id(); - args.record = args.volumeObject.record(); - _h_set_rec(args, doneCallback); - - } else { - - var vreq = new Request(FETCH_VOLUME, args.volume); - vreq.callback( - function(r) { - var vol = r.getResultObject(); - args.volumeObject = vol; - args.record = vol.record(); - _h_set_rec(args, doneCallback); - } - ); - vreq.send(); - } -} - -function _h_set_rec(args, doneCallback) { - - if(args.recordObject) - args.record = args.recordObject.doc_id(); - else - args.recordObject = findRecord( args.record, 'T' ); - - if( args.type == 'T' || args.type == 'M' ) - _h_set_rec_descriptors(args, doneCallback); - else - if(doneCallback) doneCallback(args); -} - - -function _h_set_rec_descriptors(args, doneCallback) { - - // grab the list of record desciptors attached to this records metarecord - if( ! args.recordDescriptors ) { - var params = { record: args.record }; - - if( ! args.record ) { - if( args.metarecord ) - params = { metarecord : args.metarecord }; - else - params = { metarecord : args.metarecordObject.doc_id() }; - } - - var req = new Request(FETCH_MR_DESCRIPTORS, params ); - req.callback( - function(r) { - var data = r.getResultObject(); - args.recordDescriptors = data.descriptors; - args.metarecord = data.metarecord; - if( args.type == 'M' && ! args.metarecordObject) - args.metarecordObject = findRecord(args.metarecord, 'M'); - - if(doneCallback) doneCallback(args); - } - ); - req.send(); - - } else { - if(doneCallback) doneCallback(args); - } - - return args; -} - - - -function holdsDrawWindow(bool) { - swapCanvas($('holds_box')); - $('holds_cancel').onclick = function(){ - hideResultsPage(false); - hideMe($('holds_box')); - unHideMe($('canvas_main')); - //runEvt('common', 'holdUpdateCanceled'), showCanvas() - }; - $('holds_submit').onclick = function(){holdsPlaceHold(holdsBuildHoldFromWindow())}; - $('holds_update').onclick = function(){holdsPlaceHold(holdsBuildHoldFromWindow())}; - holdFetchObjects(null, - function(){ - __holdsDrawWindow(); - - if(holdArgs.editHold) { - //hideMe($('holds_submit')); - unHideMe($('holds_update')); - var req = new Request(FETCH_HOLD_STATUS, - G.user.session, holdArgs.editHold.id()); - req.send(true); - holdArgs.status = req.result(); - _holdsUpdateEditHold(); - } - } - ); -} - -function selOrgChange(e) { - - $('holds_pickup_lib').innerHTML = this.options[this.selectedIndex].text; -} - -function __holdsDrawWindow() { - - var rec = holdArgs.recordObject; - var vol = holdArgs.volumeObject; - var copy = holdArgs.copyObject; - var mr = holdArgs.metarecordObject; - - rec = (rec) ? rec : mr; - - if(!holdsOrgSelectorBuilt) { - holdsBuildOrgSelector(null,0); - holdsOrgSelectorBuilt = true; - var selector = $('holds_org_selector'); - - /* - var o_loc = findOrgUnit(getOrigLocation()); - var t = findOrgType(o_loc.ou_type()); - if( t.can_have_users() ) - setSelector(selector, o_loc.id()); - else - */ - selector.onchange = selOrgChange; - setSelector(selector, holdArgs.recipient.home_ou()); - } - - var obj = findOrgUnit(holdArgs.recipient.home_ou()); - $('holds_pickup_lib').innerHTML = obj.name(); - - /* - if(isXUL()) { - var dsel = $('holds_depth_selector'); - unHideMe($('holds_depth_selector_row')); - if(dsel.getElementsByTagName('option').length == 0) { - var types = globalOrgTypes; - var depth = findOrgDepth(G.user.ws_ou()); - iterate(types, - function(t) { - if(t.depth() > depth) return; - insertSelectorVal(dsel, -1, t.opac_label(), t.depth()); - } - ); - } - } - */ - - appendClear($('holds_recipient'), text( - holdArgs.recipient.family_name() + ', ' + - holdArgs.recipient.first_given_name())); - appendClear($('holds_title'), text(rec.title())); - appendClear($('holds_author'), text(rec.author())); - - if( holdArgs.type == 'V' || holdArgs.type == 'C' ) { - - unHideMe($('holds_type_row')); - unHideMe($('holds_cn_row')); - appendClear($('holds_cn'), text(holdArgs.volumeObject.label())); - - if( holdArgs.type == 'V' ) { - unHideMe($('holds_is_cn')); - hideMe($('holds_is_copy')); - - } else { - hideMe($('holds_is_cn')); - unHideMe($('holds_is_copy')); - unHideMe($('holds_copy_row')); - appendClear($('holds_copy'), text(holdArgs.copyObject.barcode())); - } - - } else { - hideMe($('holds_type_row')); - hideMe($('holds_copy_row')); - hideMe($('holds_cn_row')); - } - - removeChildren($('holds_format')); - - var mods_formats = rec.types_of_resource(); - var formats; - - if(holdArgs.recordDescriptors) - formats = holdArgs.recordDescriptors[0].item_type(); - - if( holdArgs.type == 'T' ) { - var desc = grep( holdArgs.recordDescriptors, - function(i) { - return (i.record() == holdArgs.record); - } - ); - formats = desc[0].item_type(); - } - - if( holdArgs.type == 'M' ) { - var data = holdsParseMRFormats(holdArgs.editHold.holdable_formats()); - mods_formats = data.mods_formats; - formats = data.formats; - } - - - for( var i in mods_formats ) { - var res = mods_formats[i]; - var img = elem("img"); - setResourcePic(img, res); - $('holds_format').appendChild(img); - if(formats) - $('holds_format').appendChild(text(' '+ MARCTypeToFriendly(formats[i]) +' ')); - else - $('holds_format').appendChild(text(' '+ mods_formats[i] +' ')); - $('holds_format').appendChild(elem('br')); - } - - - $('holds_phone').value = (holdArgs.recipient.day_phone())?holdArgs.recipient.day_phone():""; - appendClear( $('holds_email'), text(holdArgs.recipient.email())); - - var pref = holdArgs.recipient.prefs[PREF_HOLD_NOTIFY]; - - if(pref) { - if( ! pref.match(/email/i) ) { - $('holds_enable_email').checked = false; - } else { - $('holds_enable_email').checked = true; - } - - if( ! pref.match(/phone/i) ) { - $('holds_phone').disabled = true; - $('holds_enable_phone').checked = false; - } else { - $('holds_phone').disabled = false; - $('holds_enable_phone').checked = true; - } - } - - if(!holdArgs.recipient.email()) { - $('holds_enable_email').checked = false; - $('holds_enable_email').disabled = true; - var message; - if(isXUL()) { - message = noEmailMessageXUL.cloneNode(true); - appendClear($('holds_email'), message); - } else { - message = noEmailMessage.cloneNode(true); - appendClear($('holds_email'), message); - $('holds.no_email.my_account').setAttribute('href', buildOPACLink({page:MYOPAC},null,true)); - } - unHideMe(message); - } - - if(!$('holds_phone').value) - $('holds_enable_phone').checked = false; - - appendClear($('holds_physical_desc'), text(rec.physical_description())); - - if(holdArgs.type == 'M') hideMe($('hold_physical_desc_row')); - - holdsSetFormatSelector(); - - $('holds_frozen_chkbox').checked = false; - hideMe($('hold_frozen_thaw_row')); - - var interval = fetchOrgSettingDefault(holdArgs.recipient.home_ou(), 'circ.hold_expire_interval'); - var secs = 0; - if(interval) { - secs = interval_to_seconds(interval); - var expire = new Date(); - expire.setTime(expire.getTime() + Number(secs + '000')); - if(dijit.byId('holds_expire_time')) dijit.byId('holds_expire_time').setValue(expire); - } -} - -function holdsParseMRFormats(str) { - var data = str.split(/-/); - - var formats = []; - var mods_formats = []; - - for( var i = 0; i < data[0].length; i++ ) { - formats.push( data[0].charAt(i) ); - mods_formats.push( MARCFormatToMods( formats[i] ) ); - } - - formats = uniquify(formats); - mods_formats = uniquify(mods_formats); - - return { - formats : formats, - mods_formats : mods_formats, - lang : data[2], - largeprint : data[1] - }; -} - - -function holdsSetFormatSelector() { - var type = holdArgs.type; - if( type == 'C' || type == 'V' || holdArgs.editHold ) return; - - var data = holdsGetFormats(); - var avail_formats = data.avail_formats; - var sel_formats = data.sel_formats; - holdArgs.language = data.lang; - - unHideMe($('holds_alt_formats_row_extras')); - var selector = $('hold_alt_form_selector'); - - for( var i = 0; i < avail_formats.length; i++ ) { - var form = avail_formats[i]; - unHideMe(findSelectorOptByValue(selector, form)); - } -} - - -function holdsGetFormats() { - - var lang; - var formats = []; - var sformats = []; // selected formats - - var type = holdArgs.type; - var desc = holdArgs.recordDescriptors; - var rec = holdArgs.record; - var mrec = holdArgs.metarecord; - - if( type == 'T' ) { - - for( var i = 0; i < desc.length; i++ ) { - var d = desc[i]; - if( d.record() == holdArgs.record ) { - lang = d.item_lang(); - holdArgs.myFormat = _t_f_2_format(d.item_type(), d.item_form()); - sformats.push(holdArgs.myFormat); - break; - } - } - } - - for( var i = 0; i < desc.length; i++ ) { - var d = desc[i]; - if( d.item_lang() != lang ) continue; - formats.push( _t_f_2_format(d.item_type(), d.item_form())); - } - - formats = uniquify(formats); - - return { - lang : lang, - avail_formats : formats, - sel_formats : sformats - }; -} - - - -function _t_f_2_format(type, form) { - if( form == 'd' ) return 'at-d'; - return (type == 'a' || type == 't') ? 'at' : - ( type == 'i' || type == 'g' || type == 'j' ) ? type : null; -} - -function holdsSetSelectedFormats() { - - var cn = $('holds_alt_formats_row').className; - if( cn && cn.match(/hide_me/) ) return; - - var selector = $('hold_alt_form_selector'); - var vals = getSelectedList(selector); - - if(vals.length == 0) return; - - var fstring = ""; - - if( contains(vals, 'at-d') ) { - if( contains(vals, 'at') ) - fstring = 'at'; - else - fstring = 'at-d'; - } else { - if( contains(vals, 'at') ) - fstring = 'at'; - } - - for( var i = 0; i < vals.length; i++ ) { - var val = vals[i]; - if( !val.match(/at/) ) fstring = val + fstring; - } - - if( holdArgs.language ) { - if( fstring.match(/-/) ) - fstring = fstring + '-' + holdArgs.language; - else - fstring = fstring + '--' + holdArgs.language; - } - return fstring; -} - - -function holdsCheckPossibility(pickuplib, hold, recurse) { - - var args = { - titleid : holdArgs.record, - volume_id : holdArgs.volume, - copy_id : holdArgs.copy, - hold_type : holdArgs.type, - patronid : holdArgs.recipient.id(), - depth : 0, - pickup_lib : pickuplib - }; - - if(recurse) { - /* if we're calling create again (recursing), - we know that the hold possibility check already succeeded */ - holdHandleCreateResponse({_recurse:true, _hold:hold}, true ); - - } else { - _debug("hold possible args = "+js2JSON(args)); - - var req = new Request(CHECK_HOLD_POSSIBLE, G.user.session, args ); - - req.request.alertEvent = false; - req.request._hold = hold; - req.request._recurse = recurse; - req.callback(holdHandleCreateResponse); - req.send(); - } -} - - -function holdsBuildOrgSelector(node, sel) { - - if(!node) node = globalOrgTree; - if(!isTrue(node.opac_visible())) return; - - var selector = sel?sel:$('holds_org_selector'); - var index = selector.options.length; - - var type = findOrgType(node.ou_type()); - var indent = type.depth() - 1; - var opt = setSelectorVal( selector, index, node.name(), node.id(), null, indent ); - if(!type.can_have_users()) { - opt.disabled = true; - addCSSClass(opt, 'disabled_option'); - } - - for( var i in node.children() ) { - var child = node.children()[i]; - if(child) holdsBuildOrgSelector(child); - } -} - -function holdsBuildHoldFromWindow() { - - var org = getSelectorVal($('holds_org_selector')); - var node = findOrgUnit(org); - var ntype = findOrgType(node.ou_type()); - if(!ntype.can_have_users()) { - alertId('holds_pick_good_org'); - return; - } - - var hold = new ahr(); - if(holdArgs.editHold) { - hold = holdArgs.editHold; - holdArgs.editHold = null; - } - - if( $('holds_enable_phone').checked ) { - var phone = $('holds_phone').value; - if( !phone || !phone.match(REGEX_PHONE) ) { - alert($('holds_bad_phone').innerHTML); - return null; - } - hold.phone_notify(phone); - - } else { - hold.phone_notify(""); - } - - if( $('holds_enable_email').checked ) - hold.email_notify(1); - else - hold.email_notify(0); - - var target; - - switch(holdArgs.type) { - case 'M': - target = holdArgs.metarecord; break; - case 'T': - target = holdArgs.record; break; - case 'V': - target = holdArgs.volume; break; - case 'C': - target = holdArgs.copy; break; - } - - - - hold.pickup_lib(org); - //hold.request_lib(org); - hold.requestor(holdArgs.requestor.id()); - hold.usr(holdArgs.recipient.id()); - hold.target(target); - hold.hold_type(holdArgs.type); - - try{var expDate = dijit.byId('holds_expire_time').getValue();} catch(e){} - if(expDate) { - var expireDate = dojo.date.stamp.toISOString(expDate); - expireDate = holdsVerifyThawDate(expireDate); - if(expireDate) - hold.expire_time(expireDate); - else - return; - } - - // see if this hold should be frozen and for how long - if($('holds_frozen_chkbox').checked) { - hold.frozen('t'); - unHideMe($('hold_frozen_thaw_row')); - thawDate = dojo.date.stamp.toISOString(dijit.byId('holds_frozen_thaw_input').getValue()); - if(thawDate) { - thawDate = holdsVerifyThawDate(thawDate); - if(thawDate) - hold.thaw_date(thawDate); - else - return; - } else { - hold.thaw_date(null); - } - } else { - hold.frozen('f'); - hold.thaw_date(null); - } - - //check for alternate hold formats - var fstring = holdsSetSelectedFormats(); - if(fstring) { - hold.hold_type('M'); - hold.holdable_formats(fstring); - hold.target(holdArgs.metarecord); - } - return hold; -} - -function holdsPlaceHold(hold, recurse) { - if(!hold) return; - swapCanvas($('check_holds_box')); - holdsCheckPossibility(hold.pickup_lib(), hold, recurse); -} - - -function holdHandleCreateResponse(r, recurse) { - - if(!recurse) { - var res = r.getResultObject(); - if(checkILSEvent(res) || res.success != 1) { - if(res.success != 1) { - alert($('hold_not_allowed').innerHTML+(!res.last_event.desc?"":"\n\nHold failure description:\n"+res.last_event.desc)); - } else { - if( res.textcode == 'PATRON_BARRED' ) { - alertId('hold_failed_patron_barred'); - } else { - alert($('hold_not_allowed').innerHTML+(!res.last_event.desc?"":"\n\nHold failure description:\n"+res.last_event.desc)); - } - } - swapCanvas($('holds_box')); - return; - } - r._hold.selection_depth(res.depth); - } - - holdCreateHold(r._recurse, r._hold); - hideResultsPage(false); -} - - -function holdCreateHold( recurse, hold ) { - var method = CREATE_HOLD; - if(recurse) method = CREATE_HOLD_OVERRIDE; - var req = new Request( method, holdArgs.requestor.session, hold ); - req.request.alertEvent = false; - req.send(true); - var res = req.result(); - holdProcessResult(hold, res, recurse); - - showCanvas(); - - runEvt('common', 'holdUpdated'); -} - - -function holdProcessResult( hold, res, recurse ) { - - if( res && res > -1 ) { - alert($('holds_success').innerHTML); - holdArgs = null; - if(isXUL() && typeof xulG.opac_hold_placed == 'function') - xulG.opac_hold_placed(res); - - } else { - - if( recurse ) { - alert($('holds_failure').innerHTML); - return; - } - - if( grep(res, function(e) { return (e.textcode == 'HOLD_EXISTS'); }) ) { - if( fetchPermOrgs('HOLD_EXISTS.override')[0] != -1 ) { - if( confirm($('hold_dup_exists_override').innerHTML) ) { - return holdsPlaceHold(hold, true); - } - return; - - } else { - return alert($('hold_dup_exists').innerHTML); - } - } - - if( grep(res, function(e) { return (e.textcode == 'HOLD_ITEM_CHECKED_OUT'); }) ) { - if( fetchPermOrgs('HOLD_ITEM_CHECKED_OUT.override')[0] != -1 ) { - if( confirm($('hold_checked_out_override').innerHTML) ) { - return holdsPlaceHold(hold, true); - } - return; - - } else { - return alert($('hold_checked_out').innerHTML); - } - } - - - alert($('holds_failure').innerHTML); - } -} - - -function holdsCancel(holdid, user) { - if(!user) user = G.user; - var req = new Request(CANCEL_HOLD, user.session, holdid, /* Patron via OPAC */ 6); - req.send(true); - return req.result(); - runEvt('common', 'holdUpdated'); -} - -function holdsUpdate(hold, user) { - if(!user) user = G.user; - var req = new Request(UPDATE_HOLD, user.session, hold); - req.send(true); - var x = req.result(); // cause an exception if there is one - runEvt('common', 'holdUpdated'); -} - -/* verify that the thaw date is valid and after today */ -function holdsVerifyThawDate(dateString, isGreater) { - thawDate = dojo.date.stamp.fromISOString(dateString); - if(thawDate) { - if(isGreater) { - if(dojo.date.compare(thawDate) > 0) { - return dojo.date.stamp.toISOString(thawDate); - } - } else { - return dojo.date.stamp.toISOString(thawDate); - } - } - return null; -} - -function holdsVerifyThawDateUI(element) { - value = dojo.date.stamp.toISOString(dijit.byId(element).getValue()); - - if(!value) { - removeCSSClass($(element), 'invalid_field'); - return; - } - - if(!holdsVerifyThawDate(value, true)) { - addCSSClass($(element), 'invalid_field'); - } else { - removeCSSClass($(element), 'invalid_field'); - } -} - - -function editHold(h) { - var row = $('myopac_holds_row_'+h); - var objs = []; - - objs['hold_pickup_lib'] = $n(row,'hold_pickup_lib'); - objs['hold_pickup_lib_sel'] = $n(row,'hold_pickup_lib_sel'); - objs['hold_active'] = $n(row,'hold_active'); - objs['activate_label'] = $n(row,'activate_label'); - objs['activate_date'] = $n(row,'activate_date'); - objs['activate_box'] = $n(row,'activate_box'); - objs['hold_expires_label'] = $n(row,'hold_expires_label'); - objs['hold_expires'] = $n(row,'hold_expires'); - objs['hold_expires_box'] = $n(row,'hold_expires_box'); - objs['hold_active_sel'] = $n(row,'hold_active_sel'); - objs['hold_edit_link'] = $n(row,'hold_edit_link'); - objs['hold_save_link'] = $n(row,'hold_save_link'); - objs['hold_cancel_link'] = $n(row,'hold_cancel_link'); - - for(var i in objs) unHideMe(objs[i]); - - hideMe(objs['activate_date']); - hideMe(objs['hold_active']); - hideMe(objs['hold_expires']); - hideMe(objs['hold_pickup_lib']); - hideMe(objs['hold_edit_link']); - row.orig_bgcolor = row.style.background; - row.style.background= "#fcdf89"; -} - -function cancelHold(h) { - var row = $('myopac_holds_row_'+h); - var objs = []; - - objs['hold_pickup_lib'] = $n(row,'hold_pickup_lib'); - objs['hold_pickup_lib_sel'] = $n(row,'hold_pickup_lib_sel'); - objs['hold_active'] = $n(row,'hold_active'); - objs['activate_label'] = $n(row,'activate_label'); - objs['activate_date'] = $n(row,'activate_date'); - objs['activate_box'] = $n(row,'activate_box'); - objs['hold_expires_label'] = $n(row,'hold_expires_label'); - objs['hold_expires'] = $n(row,'hold_expires'); - objs['hold_expires_box'] = $n(row,'hold_expires_box'); - objs['hold_active_sel'] = $n(row,'hold_active_sel'); - objs['hold_edit_link'] = $n(row,'hold_edit_link'); - objs['hold_save_link'] = $n(row,'hold_save_link'); - objs['hold_cancel_link'] = $n(row,'hold_cancel_link'); - - for(var i in objs) hideMe(objs[i]); - - unHideMe(objs['hold_edit_link']); - unHideMe(objs['hold_pickup_lib']); - unHideMe(objs['holds_active']); - unHideMe(objs['hold_active']); - unHideMe(objs['activate_date']); - unHideMe(objs['hold_expires']); - if(objs['hold_expires'].innerHTML) unHideMe(objs['hold_expires_label']); - if(objs['activate_date'].innerHTML) unHideMe(objs['activate_label']); - row.style.background=row.orig_bgcolor; -} - -function saveHold(h) { - var row = $('myopac_holds_row_'+h); - var hold = holdsCache[holdsCacheMap[h]].hold; - - var activateDataBox = $n(row,'activate_box'); - var expireDateBox = $n(row,'hold_expires_box'); - var pickupLibSel = $n(row,'hold_pickup_lib_sel'); - var activateSel = $n(row,'hold_active_sel'); - var expireTime = dojo.date.stamp.toISOString(new Date(Date.parse(expireDateBox.value)),null); - var activateTime = dojo.date.stamp.toISOString(new Date(Date.parse(activateDataBox.value)),null); - if(parseInt(expireTime)) hold.expire_time(expireTime); - if(parseInt(activateTime)) hold.thaw_date(activateTime); - hold.frozen(activateSel.options[activateSel.selectedIndex].value); - hold.pickup_lib(pickupLibSel.options[pickupLibSel.selectedIndex].value) - - fieldmapper.standardRequest(['open-ils.circ','open-ils.circ.hold.update'],{params:[G.user.session,hold],oncomplete:refreshHold}); - row.style.background= isTrue(hold.frozen())?"#e5e5e5":""; - row.orig_bgcolor=row.style.background; -} - -function updateHoldInfo(holdid,holdrow) { - var h = holdsCache[holdsCacheMap[holdid]].hold; - if(!h) return; - var row = holdrow?holdrow:$('myopac_holds_row_'+holdid); - if(!row) return; - - $n(row,'hold_pickup_lib').innerHTML = findOrgUnit(h.pickup_lib()).name(); - $n(row,'hold_active').innerHTML = isTrue(h.frozen())?"Suspended":"Active"; - - if(h.thaw_date()) { - var d = dojo.date.stamp.fromISOString(h.thaw_date()); - $n(row, 'activate_date').innerHTML = dojo.date.locale.format(d, {selector: 'date', fullYear: true}); - unHideMe($n(row,'activate_label')); - $n(row,'activate_box').value = dojo.date.locale.format(d, {selector:'date', fullYear: true}); - } - - if(h.expire_time()) { - var exp_date = dojo.date.stamp.fromISOString(h.expire_time()); - $n(row, 'hold_expires').innerHTML = dojo.date.locale.format(exp_date, {selector:'date', fullYear: true}); - unHideMe($n(row,'hold_expires_label')); - $n(row,'hold_expires_box').value = dojo.date.locale.format(exp_date, {selector:'date', fullYear: true}); - } -} - -function refreshHold(r) { - var hold = r.recv().content(); - if(!parseInt(hold)) return; - updateHoldInfo(hold); - cancelHold(hold); -} +var holdsOrgSelectorBuilt = false; +var holdArgs; + +/* +note: metarecord holds have a holdable_formats field that contains +item_type(s)-item_forms(s)-language +item_form and language are optional - if language exist and no +item_form is specified, use item_type(s)--language +*/ + +var noEmailMessage; +var noEmailMessageXUL; + +function hideResultsPage(bool) { + if(!bool) { + unHideMe($('result_header')); + unHideMe($('tehSideBar')); + unHideMe($('facetSidebarContainer')); + unHideMe($('sidebar_div')); + unHideMe($('statusbar')); + unHideMe($('tips')); + unHideMe($('result_table_div')); + unHideMe($('results_header_nav1')); + unHideMe($('result_info_2')); + unHideMe($('results_header_bar')); + } else { + hideMe($('result_header')); + hideMe($('tehSideBar')); + hideMe($('facetSidebarContainer')); + hideMe($('sidebar_div')); + hideMe($('statusbar')); + hideMe($('tips')); + hideMe($('result_table_div')); + hideMe($('anonListTable')); + hideMe($('results_header_nav1')); + hideMe($('result_info_2')); + hideMe($('results_header_bar')); + } +} + +function holdsHandleStaff() { + + // if we know the recipient's barcode, use it + if(xulG.patron_barcode) return _holdsHandleStaff(); + + swapCanvas($('xulholds_box')); + $('xul_recipient_barcode').focus(); + $('xul_recipient_barcode').onkeypress = function(evt) + {if(userPressedEnter(evt)) { _holdsHandleStaff(); } }; + $('xul_recipient_barcode_submit').onclick = _holdsHandleStaff; + $('xul_recipient_me').onclick = _holdsHandleStaffMe; + + $('xul_recipient_barcode').onkeyup = function(evt) { + if($('xul_recipient_barcode').value == '') + $('xul_recipient_me').disabled = false; + else + $('xul_recipient_me').disabled = true; + }; +} + +$('holds_frozen_thaw_input').onchange = function(){holdsVerifyThawDateUI('holds_frozen_thaw_input');} +$('holds_frozen_thaw_input').onkeyup = function(){holdsVerifyThawDateUI('holds_frozen_thaw_input');} + +function _holdsHandleStaffMe() { + holdArgs.recipient = G.user; + holdsDrawEditor(); +} + +function _holdsHandleStaff() { + var barcode = xulG.patron_barcode || $('xul_recipient_barcode').value; + var user = grabUserByBarcode( G.user.session, barcode ); + + var evt; + if(evt = checkILSEvent(user)) { + alertILSEvent(user); + return; + } + + if(!barcode || !user) { + alertId('holds_invalid_recipient', barcode); + return + } + + grabUserPrefs(user); + + holdArgs.recipient = user; + holdsDrawEditor(); +} + + + +/** args: + * record, volume, copy (ids) + * request, recipient, editHold (objects) + */ + +function holdsDrawEditor(args) { + holdArgs = (args) ? args : holdArgs; + + if(!noEmailMessage) noEmailMessage = $('holds_email').removeChild($('holds.no_email')); + if(!noEmailMessageXUL) noEmailMessageXUL = $('holds_email').removeChild($('holds.no_email.xul')); + + if(isXUL() && holdArgs.recipient == null && holdArgs.editHold == null) { + holdsHandleStaff(); + return; + } + + if(!holdArgs.recipient) holdArgs.recipient = G.user; + if(!holdArgs.requestor) holdArgs.requestor = G.user; + + if(!(holdArgs.requestor && holdArgs.requestor.session)) { + /* + alert("Please login first before placing a hold"); + setCacheValue('returnURL',{href:window.location.href, record:holdArgs.record, type:holdArgs.type}); + goTo(buildOPACLink({page:MYOPAC}, false, true)); + return; + */ + detachAllEvt('common','locationChanged'); + attachEvt('common','loggedIn', holdsDrawEditor); + initLogin(); + return; + } +// flesh the args with the existing hold + if(holdArgs.editHold) holdArgsFromHold(holdArgs.editHold, holdArgs); + + hideResultsPage(true); + holdsDrawWindow(); +} + + +// updates the edit window with the existing hold's data +function _holdsUpdateEditHold() { + + var hold = holdArgs.editHold; + var qstats = holdArgs.status; + + var orgsel = $('holds_org_selector'); + var frozenbox = $('holds_frozen_chkbox'); + + setSelector(orgsel, hold.pickup_lib()); + + if( hold.capture_time() || qstats.status > 2 ) { + frozenbox.disabled = true; + $('holds_frozen_thaw_input').disabled = true; + if(qstats.status == 3) { + // no pickup lib changes while in-transit + orgsel.disabled = true; + } else { + var orgs = fetchPermOrgs('UPDATE_PICKUP_LIB_FROM_HOLDS_SHELF'); + if(orgs[0] == -1) + orgsel.disabled = true; + } + } else { + orgsel.disabled = false; + frozenbox.disabled = false; + } + + + $('holds_submit').onclick = holdsEditHold; + $('holds_update').onclick = holdsEditHold; + + if(hold.phone_notify()) { + $('holds_enable_phone').checked = true; + $('holds_phone').value = hold.phone_notify(); + + } else { + $('holds_phone').disabled = true; + $('holds_enable_phone').checked = false; + } + + if(isTrue(hold.email_notify())) { + $('holds_enable_email').checked = true; + + } else { + $('holds_enable_email').checked = false; + } + + //$('holds_expire_time').setValue(dojo.date.stamp.fromISOString(hold.expire_time())); + + /* populate the hold freezing info */ + if(!frozenbox.disabled && isTrue(hold.frozen())) { + frozenbox.checked = true; + unHideMe($('hold_frozen_thaw_row')); + if(hold.thaw_date()) { + $('holds_frozen_thaw_input').value=dojo.date.stamp.fromISOString(hold.thaw_date()); + } else { + $('holds_frozen_thaw_input').value=''; + } + } else { + frozenbox.checked = false; + $('holds_frozen_thaw_input').value=''; + hideMe($('hold_frozen_thaw_row')); + } +} + +function holdsEditHold() { + var hold = holdsBuildHoldFromWindow(); + if(!hold) return; + holdsUpdate(hold); + showCanvas(); + if(holdArgs.onComplete) + holdArgs.onComplete(hold); +} + +function holdArgsFromHold(hold, oargs) { + var args = (oargs) ? oargs : {}; + args.type = hold.hold_type(); + var target = hold.target(); + + switch(args.type) { + case 'M': + args.metarecord = target; + break; + case 'T': + args.record = target; + break; + case 'V': + args.volume = target; + break; + case 'C': + args.copy = target; + break; + } + return args; +} + +function holdFetchObjects(hold, doneCallback) { + var args = (hold) ? holdArgsFromHold(hold) : holdArgs; + var type = args.type; + + if( type == 'C' ) { + if( args.copyObject ) { + + args.copy = args.copyObject.id(); + args.volume = args.copyObject.call_number(); + _h_set_vol(args, doneCallback); + + } else { + var creq = new Request(FETCH_COPY, args.copy); + + creq.callback( + function(r) { + var cp = r.getResultObject(); + args.copyObject = cp; + args.volume = args.copyObject.call_number(); + _h_set_vol(args, doneCallback); + } + ); + creq.send(); + } + } else { + if( type == 'V' ) { + _h_set_vol(args, doneCallback); + + } else { + if( type == 'T' ) { + _h_set_rec(args, doneCallback); + } else { + _h_set_rec_descriptors(args, doneCallback); + } + } + } + + return args; +} + +function _h_set_vol(args, doneCallback) { + + if( args.volumeObject ) { + args.volume = args.volumeObject.id(); + args.record = args.volumeObject.record(); + _h_set_rec(args, doneCallback); + + } else { + + var vreq = new Request(FETCH_VOLUME, args.volume); + vreq.callback( + function(r) { + var vol = r.getResultObject(); + args.volumeObject = vol; + args.record = vol.record(); + _h_set_rec(args, doneCallback); + } + ); + vreq.send(); + } +} + +function _h_set_rec(args, doneCallback) { + + if(args.recordObject) + args.record = args.recordObject.doc_id(); + else + args.recordObject = findRecord( args.record, 'T' ); + + if( args.type == 'T' || args.type == 'M' ) + _h_set_rec_descriptors(args, doneCallback); + else + if(doneCallback) doneCallback(args); +} + + +function _h_set_rec_descriptors(args, doneCallback) { + + // grab the list of record desciptors attached to this records metarecord + if( ! args.recordDescriptors ) { + var params = { record: args.record }; + + if( ! args.record ) { + if( args.metarecord ) + params = { metarecord : args.metarecord }; + else + params = { metarecord : args.metarecordObject.doc_id() }; + } + + var req = new Request(FETCH_MR_DESCRIPTORS, params ); + req.callback( + function(r) { + var data = r.getResultObject(); + args.recordDescriptors = data.descriptors; + args.metarecord = data.metarecord; + if( args.type == 'M' && ! args.metarecordObject) + args.metarecordObject = findRecord(args.metarecord, 'M'); + + if(doneCallback) doneCallback(args); + } + ); + req.send(); + + } else { + if(doneCallback) doneCallback(args); + } + + return args; +} + + + +function holdsDrawWindow(bool) { + swapCanvas($('holds_box')); + $('holds_cancel').onclick = function(){ + hideResultsPage(false); + hideMe($('holds_box')); + unHideMe($('canvas_main')); + //runEvt('common', 'holdUpdateCanceled'), showCanvas() + }; + $('holds_submit').onclick = function(){holdsPlaceHold(holdsBuildHoldFromWindow())}; + $('holds_update').onclick = function(){holdsPlaceHold(holdsBuildHoldFromWindow())}; + holdFetchObjects(null, + function(){ + __holdsDrawWindow(); + + if(holdArgs.editHold) { + //hideMe($('holds_submit')); + unHideMe($('holds_update')); + var req = new Request(FETCH_HOLD_STATUS, + G.user.session, holdArgs.editHold.id()); + req.send(true); + holdArgs.status = req.result(); + _holdsUpdateEditHold(); + } + } + ); +} + +function selOrgChange(e) { + + $('holds_pickup_lib').innerHTML = this.options[this.selectedIndex].text; +} + +function __holdsDrawWindow() { + + var rec = holdArgs.recordObject; + var vol = holdArgs.volumeObject; + var copy = holdArgs.copyObject; + var mr = holdArgs.metarecordObject; + + rec = (rec) ? rec : mr; + + if(!holdsOrgSelectorBuilt) { + holdsBuildOrgSelector(null,0); + holdsOrgSelectorBuilt = true; + var selector = $('holds_org_selector'); + + /* + var o_loc = findOrgUnit(getOrigLocation()); + var t = findOrgType(o_loc.ou_type()); + if( t.can_have_users() ) + setSelector(selector, o_loc.id()); + else + */ + selector.onchange = selOrgChange; + setSelector(selector, holdArgs.recipient.home_ou()); + } + + var obj = findOrgUnit(holdArgs.recipient.home_ou()); + $('holds_pickup_lib').innerHTML = obj.name(); + + /* + if(isXUL()) { + var dsel = $('holds_depth_selector'); + unHideMe($('holds_depth_selector_row')); + if(dsel.getElementsByTagName('option').length == 0) { + var types = globalOrgTypes; + var depth = findOrgDepth(G.user.ws_ou()); + iterate(types, + function(t) { + if(t.depth() > depth) return; + insertSelectorVal(dsel, -1, t.opac_label(), t.depth()); + } + ); + } + } + */ + + appendClear($('holds_recipient'), text( + holdArgs.recipient.family_name() + ', ' + + holdArgs.recipient.first_given_name())); + appendClear($('holds_title'), text(rec.title())); + appendClear($('holds_author'), text(rec.author())); + + if( holdArgs.type == 'V' || holdArgs.type == 'C' ) { + + unHideMe($('holds_type_row')); + unHideMe($('holds_cn_row')); + appendClear($('holds_cn'), text(holdArgs.volumeObject.label())); + + if( holdArgs.type == 'V' ) { + unHideMe($('holds_is_cn')); + hideMe($('holds_is_copy')); + + } else { + hideMe($('holds_is_cn')); + unHideMe($('holds_is_copy')); + unHideMe($('holds_copy_row')); + appendClear($('holds_copy'), text(holdArgs.copyObject.barcode())); + } + + } else { + hideMe($('holds_type_row')); + hideMe($('holds_copy_row')); + hideMe($('holds_cn_row')); + } + + removeChildren($('holds_format')); + + var mods_formats = rec.types_of_resource(); + var formats; + + if(holdArgs.recordDescriptors) + formats = holdArgs.recordDescriptors[0].item_type(); + + if( holdArgs.type == 'T' ) { + var desc = grep( holdArgs.recordDescriptors, + function(i) { + return (i.record() == holdArgs.record); + } + ); + formats = desc[0].item_type(); + } + + if( holdArgs.type == 'M' ) { + var data = holdsParseMRFormats(holdArgs.editHold.holdable_formats()); + mods_formats = data.mods_formats; + formats = data.formats; + } + + + for( var i in mods_formats ) { + var res = mods_formats[i]; + var img = elem("img"); + setResourcePic(img, res); + $('holds_format').appendChild(img); + if(formats) + $('holds_format').appendChild(text(' '+ MARCTypeToFriendly(formats[i]) +' ')); + else + $('holds_format').appendChild(text(' '+ mods_formats[i] +' ')); + $('holds_format').appendChild(elem('br')); + } + + + $('holds_phone').value = (holdArgs.recipient.day_phone())?holdArgs.recipient.day_phone():""; + appendClear( $('holds_email'), text(holdArgs.recipient.email())); + + var pref = holdArgs.recipient.prefs[PREF_HOLD_NOTIFY]; + + if(pref) { + if( ! pref.match(/email/i) ) { + $('holds_enable_email').checked = false; + } else { + $('holds_enable_email').checked = true; + } + + if( ! pref.match(/phone/i) ) { + $('holds_phone').disabled = true; + $('holds_enable_phone').checked = false; + } else { + $('holds_phone').disabled = false; + $('holds_enable_phone').checked = true; + } + } + + if(!holdArgs.recipient.email()) { + $('holds_enable_email').checked = false; + $('holds_enable_email').disabled = true; + var message; + if(isXUL()) { + message = noEmailMessageXUL.cloneNode(true); + appendClear($('holds_email'), message); + } else { + message = noEmailMessage.cloneNode(true); + appendClear($('holds_email'), message); + $('holds.no_email.my_account').setAttribute('href', buildOPACLink({page:MYOPAC},null,true)); + } + unHideMe(message); + } + + if(!$('holds_phone').value) + $('holds_enable_phone').checked = false; + + appendClear($('holds_physical_desc'), text(rec.physical_description())); + + if(holdArgs.type == 'M') hideMe($('hold_physical_desc_row')); + + holdsSetFormatSelector(); + + $('holds_frozen_chkbox').checked = false; + hideMe($('hold_frozen_thaw_row')); + + var interval = fetchOrgSettingDefault(holdArgs.recipient.home_ou(), 'circ.hold_expire_interval'); + var secs = 0; + if(interval) { + secs = interval_to_seconds(interval); + var expire = new Date(); + expire.setTime(expire.getTime() + Number(secs + '000')); + if(dijit.byId('holds_expire_time')) dijit.byId('holds_expire_time').setValue(expire); + } +} + +function holdsParseMRFormats(str) { + var data = str.split(/-/); + + var formats = []; + var mods_formats = []; + + for( var i = 0; i < data[0].length; i++ ) { + formats.push( data[0].charAt(i) ); + mods_formats.push( MARCFormatToMods( formats[i] ) ); + } + + formats = uniquify(formats); + mods_formats = uniquify(mods_formats); + + return { + formats : formats, + mods_formats : mods_formats, + lang : data[2], + largeprint : data[1] + }; +} + + +function holdsSetFormatSelector() { + var type = holdArgs.type; + if( type == 'C' || type == 'V' || holdArgs.editHold ) return; + + var data = holdsGetFormats(); + var avail_formats = data.avail_formats; + var sel_formats = data.sel_formats; + holdArgs.language = data.lang; + + unHideMe($('holds_alt_formats_row_extras')); + var selector = $('hold_alt_form_selector'); + + for( var i = 0; i < avail_formats.length; i++ ) { + var form = avail_formats[i]; + unHideMe(findSelectorOptByValue(selector, form)); + } +} + + +function holdsGetFormats() { + + var lang; + var formats = []; + var sformats = []; // selected formats + + var type = holdArgs.type; + var desc = holdArgs.recordDescriptors; + var rec = holdArgs.record; + var mrec = holdArgs.metarecord; + + if( type == 'T' ) { + + for( var i = 0; i < desc.length; i++ ) { + var d = desc[i]; + if( d.record() == holdArgs.record ) { + lang = d.item_lang(); + holdArgs.myFormat = _t_f_2_format(d.item_type(), d.item_form()); + sformats.push(holdArgs.myFormat); + break; + } + } + } + + for( var i = 0; i < desc.length; i++ ) { + var d = desc[i]; + if( d.item_lang() != lang ) continue; + formats.push( _t_f_2_format(d.item_type(), d.item_form())); + } + + formats = uniquify(formats); + + return { + lang : lang, + avail_formats : formats, + sel_formats : sformats + }; +} + + + +function _t_f_2_format(type, form) { + if( form == 'd' ) return 'at-d'; + return (type == 'a' || type == 't') ? 'at' : + ( type == 'i' || type == 'g' || type == 'j' ) ? type : null; +} + +function holdsSetSelectedFormats() { + + var cn = $('holds_alt_formats_row').className; + if( cn && cn.match(/hide_me/) ) return; + + var selector = $('hold_alt_form_selector'); + var vals = getSelectedList(selector); + + if(vals.length == 0) return; + + var fstring = ""; + + if( contains(vals, 'at-d') ) { + if( contains(vals, 'at') ) + fstring = 'at'; + else + fstring = 'at-d'; + } else { + if( contains(vals, 'at') ) + fstring = 'at'; + } + + for( var i = 0; i < vals.length; i++ ) { + var val = vals[i]; + if( !val.match(/at/) ) fstring = val + fstring; + } + + if( holdArgs.language ) { + if( fstring.match(/-/) ) + fstring = fstring + '-' + holdArgs.language; + else + fstring = fstring + '--' + holdArgs.language; + } + return fstring; +} + + +function holdsCheckPossibility(pickuplib, hold, recurse) { + + var args = { + titleid : holdArgs.record, + volume_id : holdArgs.volume, + copy_id : holdArgs.copy, + hold_type : holdArgs.type, + patronid : holdArgs.recipient.id(), + depth : 0, + pickup_lib : pickuplib + }; + + if(recurse) { + /* if we're calling create again (recursing), + we know that the hold possibility check already succeeded */ + holdHandleCreateResponse({_recurse:true, _hold:hold}, true ); + + } else { + _debug("hold possible args = "+js2JSON(args)); + + var req = new Request(CHECK_HOLD_POSSIBLE, G.user.session, args ); + + req.request.alertEvent = false; + req.request._hold = hold; + req.request._recurse = recurse; + req.callback(holdHandleCreateResponse); + req.send(); + } +} + + +function holdsBuildOrgSelector(node, sel) { + + if(!node) node = globalOrgTree; + if(!isTrue(node.opac_visible())) return; + + var selector = sel?sel:$('holds_org_selector'); + var index = selector.options.length; + + var type = findOrgType(node.ou_type()); + var indent = type.depth() - 1; + var opt = setSelectorVal( selector, index, node.name(), node.id(), null, indent ); + if(!type.can_have_users()) { + opt.disabled = true; + addCSSClass(opt, 'disabled_option'); + } + + for( var i in node.children() ) { + var child = node.children()[i]; + if(child) holdsBuildOrgSelector(child); + } +} + +function holdsBuildHoldFromWindow() { + + var org = getSelectorVal($('holds_org_selector')); + var node = findOrgUnit(org); + var ntype = findOrgType(node.ou_type()); + if(!ntype.can_have_users()) { + alertId('holds_pick_good_org'); + return; + } + + var hold = new ahr(); + if(holdArgs.editHold) { + hold = holdArgs.editHold; + holdArgs.editHold = null; + } + + if( $('holds_enable_phone').checked ) { + var phone = $('holds_phone').value; + if( !phone || !phone.match(REGEX_PHONE) ) { + alert($('holds_bad_phone').innerHTML); + return null; + } + hold.phone_notify(phone); + + } else { + hold.phone_notify(""); + } + + if( $('holds_enable_email').checked ) + hold.email_notify(1); + else + hold.email_notify(0); + + var target; + + switch(holdArgs.type) { + case 'M': + target = holdArgs.metarecord; break; + case 'T': + target = holdArgs.record; break; + case 'V': + target = holdArgs.volume; break; + case 'C': + target = holdArgs.copy; break; + } + + + + hold.pickup_lib(org); + //hold.request_lib(org); + hold.requestor(holdArgs.requestor.id()); + hold.usr(holdArgs.recipient.id()); + hold.target(target); + hold.hold_type(holdArgs.type); + + try{var expDate = dijit.byId('holds_expire_time').getValue();} catch(e){} + if(expDate) { + var expireDate = dojo.date.stamp.toISOString(expDate); + expireDate = holdsVerifyThawDate(expireDate); + if(expireDate) + hold.expire_time(expireDate); + else + return; + } + + // see if this hold should be frozen and for how long + if($('holds_frozen_chkbox').checked) { + hold.frozen('t'); + unHideMe($('hold_frozen_thaw_row')); + thawDate = dojo.date.stamp.toISOString(dijit.byId('holds_frozen_thaw_input').getValue()); + if(thawDate) { + thawDate = holdsVerifyThawDate(thawDate); + if(thawDate) + hold.thaw_date(thawDate); + else + return; + } else { + hold.thaw_date(null); + } + } else { + hold.frozen('f'); + hold.thaw_date(null); + } + + //check for alternate hold formats + var fstring = holdsSetSelectedFormats(); + if(fstring) { + hold.hold_type('M'); + hold.holdable_formats(fstring); + hold.target(holdArgs.metarecord); + } + return hold; +} + +function holdsPlaceHold(hold, recurse) { + if(!hold) return; + swapCanvas($('check_holds_box')); + holdsCheckPossibility(hold.pickup_lib(), hold, recurse); +} + + +function holdHandleCreateResponse(r, recurse) { + + if(!recurse) { + var res = r.getResultObject(); + if(checkILSEvent(res) || res.success != 1) { + if(res.success != 1) { + alert($('hold_not_allowed').innerHTML+(!res.last_event.desc?"":"\n\nHold failure description:\n"+res.last_event.desc)); + } else { + if( res.textcode == 'PATRON_BARRED' ) { + alertId('hold_failed_patron_barred'); + } else { + alert($('hold_not_allowed').innerHTML+(!res.last_event.desc?"":"\n\nHold failure description:\n"+res.last_event.desc)); + } + } + swapCanvas($('holds_box')); + return; + } + r._hold.selection_depth(res.depth); + } + + holdCreateHold(r._recurse, r._hold); + hideResultsPage(false); +} + + +function holdCreateHold( recurse, hold ) { + var method = CREATE_HOLD; + if(recurse) method = CREATE_HOLD_OVERRIDE; + var req = new Request( method, holdArgs.requestor.session, hold ); + req.request.alertEvent = false; + req.send(true); + var res = req.result(); + holdProcessResult(hold, res, recurse); + + showCanvas(); + + runEvt('common', 'holdUpdated'); +} + + +function holdProcessResult( hold, res, recurse ) { + + if( res && res > -1 ) { + alert($('holds_success').innerHTML); + holdArgs = null; + if(isXUL() && typeof xulG.opac_hold_placed == 'function') + xulG.opac_hold_placed(res); + + } else { + + if( recurse ) { + alert($('holds_failure').innerHTML); + return; + } + + if( grep(res, function(e) { return (e.textcode == 'HOLD_EXISTS'); }) ) { + if( fetchPermOrgs('HOLD_EXISTS.override')[0] != -1 ) { + if( confirm($('hold_dup_exists_override').innerHTML) ) { + return holdsPlaceHold(hold, true); + } + return; + + } else { + return alert($('hold_dup_exists').innerHTML); + } + } + + if( grep(res, function(e) { return (e.textcode == 'HOLD_ITEM_CHECKED_OUT'); }) ) { + if( fetchPermOrgs('HOLD_ITEM_CHECKED_OUT.override')[0] != -1 ) { + if( confirm($('hold_checked_out_override').innerHTML) ) { + return holdsPlaceHold(hold, true); + } + return; + + } else { + return alert($('hold_checked_out').innerHTML); + } + } + + + alert($('holds_failure').innerHTML); + } +} + + +function holdsCancel(holdid, user) { + if(!user) user = G.user; + var req = new Request(CANCEL_HOLD, user.session, holdid, /* Patron via OPAC */ 6); + req.send(true); + return req.result(); + runEvt('common', 'holdUpdated'); +} + +function holdsUpdate(hold, user) { + if(!user) user = G.user; + var req = new Request(UPDATE_HOLD, user.session, hold); + req.send(true); + var x = req.result(); // cause an exception if there is one + runEvt('common', 'holdUpdated'); +} + +/* verify that the thaw date is valid and after today */ +function holdsVerifyThawDate(dateString, isGreater) { + thawDate = dojo.date.stamp.fromISOString(dateString); + if(thawDate) { + if(isGreater) { + if(dojo.date.compare(thawDate) > 0) { + return dojo.date.stamp.toISOString(thawDate); + } + } else { + return dojo.date.stamp.toISOString(thawDate); + } + } + return null; +} + +function holdsVerifyThawDateUI(element) { + value = dojo.date.stamp.toISOString(dijit.byId(element).getValue()); + + if(!value) { + removeCSSClass($(element), 'invalid_field'); + return; + } + + if(!holdsVerifyThawDate(value, true)) { + addCSSClass($(element), 'invalid_field'); + } else { + removeCSSClass($(element), 'invalid_field'); + } +} + + +function editHold(h) { + var row = $('myopac_holds_row_'+h); + var objs = []; + + objs['hold_pickup_lib'] = $n(row,'hold_pickup_lib'); + objs['hold_pickup_lib_sel'] = $n(row,'hold_pickup_lib_sel'); + objs['hold_active'] = $n(row,'hold_active'); + objs['activate_label'] = $n(row,'activate_label'); + objs['activate_date'] = $n(row,'activate_date'); + objs['activate_box'] = $n(row,'activate_box'); + objs['hold_expires_label'] = $n(row,'hold_expires_label'); + objs['hold_expires'] = $n(row,'hold_expires'); + objs['hold_expires_box'] = $n(row,'hold_expires_box'); + objs['hold_active_sel'] = $n(row,'hold_active_sel'); + objs['hold_edit_link'] = $n(row,'hold_edit_link'); + objs['hold_save_link'] = $n(row,'hold_save_link'); + objs['hold_cancel_link'] = $n(row,'hold_cancel_link'); + + for(var i in objs) unHideMe(objs[i]); + + hideMe(objs['activate_date']); + hideMe(objs['hold_active']); + hideMe(objs['hold_expires']); + hideMe(objs['hold_pickup_lib']); + hideMe(objs['hold_edit_link']); + row.orig_bgcolor = row.style.background; + row.style.background= "#fcdf89"; +} + +function cancelHold(h) { + var row = $('myopac_holds_row_'+h); + var objs = []; + + objs['hold_pickup_lib'] = $n(row,'hold_pickup_lib'); + objs['hold_pickup_lib_sel'] = $n(row,'hold_pickup_lib_sel'); + objs['hold_active'] = $n(row,'hold_active'); + objs['activate_label'] = $n(row,'activate_label'); + objs['activate_date'] = $n(row,'activate_date'); + objs['activate_box'] = $n(row,'activate_box'); + objs['hold_expires_label'] = $n(row,'hold_expires_label'); + objs['hold_expires'] = $n(row,'hold_expires'); + objs['hold_expires_box'] = $n(row,'hold_expires_box'); + objs['hold_active_sel'] = $n(row,'hold_active_sel'); + objs['hold_edit_link'] = $n(row,'hold_edit_link'); + objs['hold_save_link'] = $n(row,'hold_save_link'); + objs['hold_cancel_link'] = $n(row,'hold_cancel_link'); + + for(var i in objs) hideMe(objs[i]); + + unHideMe(objs['hold_edit_link']); + unHideMe(objs['hold_pickup_lib']); + unHideMe(objs['holds_active']); + unHideMe(objs['hold_active']); + unHideMe(objs['activate_date']); + unHideMe(objs['hold_expires']); + if(objs['hold_expires'].innerHTML) unHideMe(objs['hold_expires_label']); + if(objs['activate_date'].innerHTML) unHideMe(objs['activate_label']); + row.style.background=row.orig_bgcolor; +} + +function saveHold(h) { + var row = $('myopac_holds_row_'+h); + var hold = holdsCache[holdsCacheMap[h]].hold; + + var activateDataBox = $n(row,'activate_box'); + var expireDateBox = $n(row,'hold_expires_box'); + var pickupLibSel = $n(row,'hold_pickup_lib_sel'); + var activateSel = $n(row,'hold_active_sel'); + var expireTime = dojo.date.stamp.toISOString(new Date(Date.parse(expireDateBox.value)),null); + var activateTime = dojo.date.stamp.toISOString(new Date(Date.parse(activateDataBox.value)),null); + if(parseInt(expireTime)) hold.expire_time(expireTime); + if(parseInt(activateTime)) hold.thaw_date(activateTime); + hold.frozen(activateSel.options[activateSel.selectedIndex].value); + hold.pickup_lib(pickupLibSel.options[pickupLibSel.selectedIndex].value) + + fieldmapper.standardRequest(['open-ils.circ','open-ils.circ.hold.update'],{params:[G.user.session,hold],oncomplete:refreshHold}); + row.style.background= isTrue(hold.frozen())?"#e5e5e5":""; + row.orig_bgcolor=row.style.background; +} + +function updateHoldInfo(holdid,holdrow) { + var h = holdsCache[holdsCacheMap[holdid]].hold; + if(!h) return; + var row = holdrow?holdrow:$('myopac_holds_row_'+holdid); + if(!row) return; + + $n(row,'hold_pickup_lib').innerHTML = findOrgUnit(h.pickup_lib()).name(); + $n(row,'hold_active').innerHTML = isTrue(h.frozen())?"Suspended":"Active"; + + if(h.thaw_date()) { + var d = dojo.date.stamp.fromISOString(h.thaw_date()); + $n(row, 'activate_date').innerHTML = dojo.date.locale.format(d, {selector: 'date', fullYear: true}); + unHideMe($n(row,'activate_label')); + $n(row,'activate_box').value = dojo.date.locale.format(d, {selector:'date', fullYear: true}); + } + + if(h.expire_time()) { + var exp_date = dojo.date.stamp.fromISOString(h.expire_time()); + $n(row, 'hold_expires').innerHTML = dojo.date.locale.format(exp_date, {selector:'date', fullYear: true}); + unHideMe($n(row,'hold_expires_label')); + $n(row,'hold_expires_box').value = dojo.date.locale.format(exp_date, {selector:'date', fullYear: true}); + } +} + +function refreshHold(r) { + var hold = r.recv().content(); + if(!parseInt(hold)) return; + updateHoldInfo(hold); + cancelHold(hold); +} diff --git a/Open-ILS/web/opac/skin/kcls/js/marc.js b/Open-ILS/web/opac/skin/kcls/js/marc.js index e6be8b3ce7..7256b56d16 100644 --- a/Open-ILS/web/opac/skin/kcls/js/marc.js +++ b/Open-ILS/web/opac/skin/kcls/js/marc.js @@ -1,227 +1,227 @@ - -// constructor - -// take docid and pull xml from server, then turn it into a JS object -// MarcRecord.marcObj - JS object of marc data -// MarcRecord.xml - marc XML data pulled from server -function MarcRecord(docid) { - var xml = null; - var cgi = new CGI(); - var xhr = buildXMLRequest(); - var proto = (location.href.match(/^[Hh][Tt][Tt][Pp][Ss]:/))?"https://":"http://"; - - xhr.open("GET",proto+cgi.server_name+"/opac/extras/supercat/retrieve/marcxml/record/"+docid, false); - xhr.send(null); - if(xhr.responseXML && xhr.responseXML.documentElement && xhr.status == 200) xml = xhr.responseXML.documentElement; - //this.toString = function() { return this.marcObj.toString(); }; - this.xml = xml; - this.marcObj = this.XML2js(this.xml); -} - -/* fields - string with 1 field or array of fields to process from the marc record - optional args (as object): - container - string with dom id of container to fill with rendered data - if not present, MarcRecord.render() will return rendered code as a string instead - label - string with 1 dom id or array of dom ids to unhide if marc data is present - searchType - will turn each subfield into a searchable link using the specified search type (e.g. STYPE_KEYWORD, found in config.js) - showAGR - boolean value, set to true if marc field 880 data is needed for each matching field - showOnly - string with 1 subfield or array of subfields to process - skipCodes - string with 1 subfield or array of subfields to skip over - unlink - only valid if searchType is present - string with 1 subfield or array of subfields to NOT turn into links (will still return its data though) - linkText - string with 1 subfield or ordered array of subfields to check for link text, only valid if linkSrc is present, resulting fields will be turned into links using linkSrc as the href - linkSrc - string with 1 subfield that contains the link href for linkText - fGlue - if multiple matching fields exist in the marc record, join them together using fGlue.joinStr string, - use fGlue.startStr to add code to the start of the set of matched fields - use fGlue.endStr to add code to the end of the set of matched fields - sGlue - if mutiple subfields exist for each matched field, join them together using sGlue.joinStr sting, - use sGlue.startStr to add code to the start of each match field - use sGlue.endStr to add code to the end of each field - -author example: - MarcRecord.render( - ["100", "110", "111"], // fields to look for - { - "container":"rdetail_authors_inner", // DOM element to dump resulting code into (will clear the element's contents) - "searchType":STYPE_AUTHOR, // make each subfield a search link using search type STYPE_AUTHOR - "label":["rdetail_authors_link", "authors_lbl"], // unHide these DOM elements if any matching fields ("100", "110", "111") are found in the marc record - "sGlue":{"joinStr":" ", "endStr":"
"}, // join each subfield together with a space and add a
element to the end - "showAGR":true, // if matching 880 data is present, show it - sGlue treats it as if it were a new field - "unlink":"d" // do NOT turn subfield "d" into a searchable link - } - ); -*/ -MarcRecord.prototype.render = function(fields, args) { - if(!fields) return; - var retVal = ""; - var returnStr = false; - args = args || {}; - if(typeof fields=="string") fields = [fields]; - if(typeof args.label=="undefined") args.label = []; - if(typeof args.label=="string") args.label = [args.label]; - if(typeof args.showOnly=="undefined") args.showOnly = []; - if(typeof args.showOnly=="string") args.showOnly = [args.showOnly]; - if(typeof args.skipCodes=="undefined") args.skipCodes = []; - if(typeof args.skipCodes=="string") args.skipCodes = [args.skipCodes]; - if(typeof args.unlink=="undefined") args.unlink = []; - if(typeof args.unlink=="string") args.unlink = [args.unlink]; - if(typeof args.linkText=="undefined") args.linkText = []; - if(typeof args.linkText=="string") args.linkText = [args.linkText]; - var cont = typeof args.container == "undefined" ? null : $(args.container); - if(!cont) returnStr = true; - - args.fGlue = args.fGlue || {}; - args.sGlue = args.sGlue || {}; - args.fGlue.startStr = args.fGlue.startStr || ""; - args.fGlue.endStr = args.fGlue.endStr || ""; - args.sGlue.startStr = args.sGlue.startStr || ""; - args.sGlue.endStr = args.sGlue.endStr || ""; - args.fGlue.joinStr = args.fGlue.joinStr || ""; - args.sGlue.joinStr = args.sGlue.joinStr || ""; - - for(var i in fields) { - var f = this.marcObj[fields[i]]; - if(!f) continue; - for(var n in args.label) unHideMe($(args.label[n])); - - if(args.linkSrc) args.linkText.push(args.linkSrc); - f.args = {}; - f.args.showAGR = args.showAGR || false; - f.args.skipCodes = args.skipCodes; - f.args.showOnly = args.showOnly; - f.args.unlink = args.unlink; - f.args.linkText = args.linkText; - f.args.linkSrc = args.linkSrc || null; - f.args.searchType = args.searchType || null; - f.args.sGlue = args.sGlue; - - var str = f.join(args.fGlue.joinStr); - str = args.fGlue.startStr + str + args.fGlue.endStr; - - if(returnStr) retVal+=str; - else cont.innerHTML += str; - } - - if(returnStr) return retVal; -}; - -// wrap each item in the array with an anchor tag for searching -// excluding those subfields specified in 'codes' -MarcRecord.prototype.buildSearchStr = function(arr, args, codes) { - for(var i in arr) { - var skip = false; - for(var n in args.unlink) - if(args.unlink[n]==codes[i]) skip = true; - if(skip) continue; - var args2 = {}; - if( SHOW_MR_DEFAULT || findCurrentPage() == MRESULT ) { - args2.page = MRESULT; - } else { - args2.page = RRESULT; - args2[PARAM_RTYPE] = args.searchType; - } - args2[PARAM_OFFSET] = 0; - args2[PARAM_TERM] = arr[i]; - args2[PARAM_STYPE] = args.searchType; - arr[i] = ""+arr[i]+""; - } -}; - -// if field 880 exists, append its data to matching normal field -// AGR = Alternate Graphic Representation - -// typically used to display foreign languages -MarcRecord.prototype.getAGRdata = function(field, args) { - var str = ""; - var val = parseInt(field.split("-")[1]); - field = this.marcObj["880"][--val]; - field.args = args; - str += field; - return str; -}; - -// toString function override for subfield objects -MarcRecord.prototype.marcObjToStr = function() { - var str = ""; - var str2 = ""; // AGR data - var args = this.args || this.master.marcObj[this.field].args || {"searchType":null, "linkSrc":null, "linkText":[], "unlink":[], "showOnly":[], "skipCodes":[], "showAGR":false, "sGlue":{"joinStr":"", "endStr":"", "startStr":""}}; - var arr = []; - var subs = []; - var found = false; - for(var i in this.codes) { - var c = this.codes[i]; - var skipCode = false; - for(var n in args.skipCodes) if(c==args.skipCodes[n]) skipCode = true; - if(skipCode) continue; - if(c=="6" && this[c][0].indexOf("880")>=0 && args.showAGR) str2+=this.master.getAGRdata(this[c][0], args); - if(c=="0" || c=="2" || c=="3" || c=="4" || c=="5" || c=="6" || c=="8") continue; - if(args.linkSrc && this[args.linkSrc]) { - var src = this[args.linkSrc][0]; - for(var n in args.linkText) { - if(this[args.linkText[n]]) { arr.push(""+this[args.linkText[n]].join(args.sGlue.joinStr)+""); found = true; break; } - } - if(found) break; - } - subs.push(c); - if(args.showOnly.length) - for(var n in args.showOnly) { - if(args.showOnly[n]==c) arr = arr.concat(this[c]); - } - else arr = arr.concat(this[c]); - } - - if(args.searchType) this.master.buildSearchStr(arr, args, subs); - str += arr.join(args.sGlue.joinStr); - str = args.sGlue.startStr + str + args.sGlue.endStr; - return str+str2; -}; - -/* marc XML to JS object conversion function - resulting object will look similar to: - MarcRecord.marcObj = { - "245":[ - {"a":["Title of item"], "c":["More title data"]}, - {"a":["Another 245 field"], "c":["More title data"]} - ], - - "100":[ - {"a":["Author", "Author last name"], "b":["Author life span"]}, - {"a":["Author 2", "Author2 last name"], "b":["Author2 life span"]} - ] - } -*/ -MarcRecord.prototype.XML2js = function(parent) { - var marc = {}; - var nodes = parent.childNodes || []; - // field-level (and master) object augmentation - //marc.toString = this.marcObjToStr2; - marc.master = this; // link back to global parent object - - for(var i=0; i"}, // join each subfield together with a space and add a
element to the end + "showAGR":true, // if matching 880 data is present, show it - sGlue treats it as if it were a new field + "unlink":"d" // do NOT turn subfield "d" into a searchable link + } + ); +*/ +MarcRecord.prototype.render = function(fields, args) { + if(!fields) return; + var retVal = ""; + var returnStr = false; + args = args || {}; + if(typeof fields=="string") fields = [fields]; + if(typeof args.label=="undefined") args.label = []; + if(typeof args.label=="string") args.label = [args.label]; + if(typeof args.showOnly=="undefined") args.showOnly = []; + if(typeof args.showOnly=="string") args.showOnly = [args.showOnly]; + if(typeof args.skipCodes=="undefined") args.skipCodes = []; + if(typeof args.skipCodes=="string") args.skipCodes = [args.skipCodes]; + if(typeof args.unlink=="undefined") args.unlink = []; + if(typeof args.unlink=="string") args.unlink = [args.unlink]; + if(typeof args.linkText=="undefined") args.linkText = []; + if(typeof args.linkText=="string") args.linkText = [args.linkText]; + var cont = typeof args.container == "undefined" ? null : $(args.container); + if(!cont) returnStr = true; + + args.fGlue = args.fGlue || {}; + args.sGlue = args.sGlue || {}; + args.fGlue.startStr = args.fGlue.startStr || ""; + args.fGlue.endStr = args.fGlue.endStr || ""; + args.sGlue.startStr = args.sGlue.startStr || ""; + args.sGlue.endStr = args.sGlue.endStr || ""; + args.fGlue.joinStr = args.fGlue.joinStr || ""; + args.sGlue.joinStr = args.sGlue.joinStr || ""; + + for(var i in fields) { + var f = this.marcObj[fields[i]]; + if(!f) continue; + for(var n in args.label) unHideMe($(args.label[n])); + + if(args.linkSrc) args.linkText.push(args.linkSrc); + f.args = {}; + f.args.showAGR = args.showAGR || false; + f.args.skipCodes = args.skipCodes; + f.args.showOnly = args.showOnly; + f.args.unlink = args.unlink; + f.args.linkText = args.linkText; + f.args.linkSrc = args.linkSrc || null; + f.args.searchType = args.searchType || null; + f.args.sGlue = args.sGlue; + + var str = f.join(args.fGlue.joinStr); + str = args.fGlue.startStr + str + args.fGlue.endStr; + + if(returnStr) retVal+=str; + else cont.innerHTML += str; + } + + if(returnStr) return retVal; +}; + +// wrap each item in the array with an anchor tag for searching +// excluding those subfields specified in 'codes' +MarcRecord.prototype.buildSearchStr = function(arr, args, codes) { + for(var i in arr) { + var skip = false; + for(var n in args.unlink) + if(args.unlink[n]==codes[i]) skip = true; + if(skip) continue; + var args2 = {}; + if( SHOW_MR_DEFAULT || findCurrentPage() == MRESULT ) { + args2.page = MRESULT; + } else { + args2.page = RRESULT; + args2[PARAM_RTYPE] = args.searchType; + } + args2[PARAM_OFFSET] = 0; + args2[PARAM_TERM] = arr[i]; + args2[PARAM_STYPE] = args.searchType; + arr[i] = ""+arr[i]+""; + } +}; + +// if field 880 exists, append its data to matching normal field +// AGR = Alternate Graphic Representation - +// typically used to display foreign languages +MarcRecord.prototype.getAGRdata = function(field, args) { + var str = ""; + var val = parseInt(field.split("-")[1]); + field = this.marcObj["880"][--val]; + field.args = args; + str += field; + return str; +}; + +// toString function override for subfield objects +MarcRecord.prototype.marcObjToStr = function() { + var str = ""; + var str2 = ""; // AGR data + var args = this.args || this.master.marcObj[this.field].args || {"searchType":null, "linkSrc":null, "linkText":[], "unlink":[], "showOnly":[], "skipCodes":[], "showAGR":false, "sGlue":{"joinStr":"", "endStr":"", "startStr":""}}; + var arr = []; + var subs = []; + var found = false; + for(var i in this.codes) { + var c = this.codes[i]; + var skipCode = false; + for(var n in args.skipCodes) if(c==args.skipCodes[n]) skipCode = true; + if(skipCode) continue; + if(c=="6" && this[c][0].indexOf("880")>=0 && args.showAGR) str2+=this.master.getAGRdata(this[c][0], args); + if(c=="0" || c=="2" || c=="3" || c=="4" || c=="5" || c=="6" || c=="8") continue; + if(args.linkSrc && this[args.linkSrc]) { + var src = this[args.linkSrc][0]; + for(var n in args.linkText) { + if(this[args.linkText[n]]) { arr.push(""+this[args.linkText[n]].join(args.sGlue.joinStr)+""); found = true; break; } + } + if(found) break; + } + subs.push(c); + if(args.showOnly.length) + for(var n in args.showOnly) { + if(args.showOnly[n]==c) arr = arr.concat(this[c]); + } + else arr = arr.concat(this[c]); + } + + if(args.searchType) this.master.buildSearchStr(arr, args, subs); + str += arr.join(args.sGlue.joinStr); + str = args.sGlue.startStr + str + args.sGlue.endStr; + return str+str2; +}; + +/* marc XML to JS object conversion function + resulting object will look similar to: + MarcRecord.marcObj = { + "245":[ + {"a":["Title of item"], "c":["More title data"]}, + {"a":["Another 245 field"], "c":["More title data"]} + ], + + "100":[ + {"a":["Author", "Author last name"], "b":["Author life span"]}, + {"a":["Author 2", "Author2 last name"], "b":["Author2 life span"]} + ] + } +*/ +MarcRecord.prototype.XML2js = function(parent) { + var marc = {}; + var nodes = parent.childNodes || []; + // field-level (and master) object augmentation + //marc.toString = this.marcObjToStr2; + marc.master = this; // link back to global parent object + + for(var i=0; i 0) { - dashfines.style.color = "#f41d36"; - dashfines.innerHTML = "$"+parseFloat(stats.fines.balance_owed).toFixed(2) - } else { - dashfines.style.fontWeight="normal"; - dashfines.innerHTML = "No"; - } - $('dash_user').innerHTML = u.first_given_name()+' '+u.family_name(); - $('dash_checked').innerHTML = stats.checkouts.out+stats.checkouts.overdue; - $('dash_holds').innerHTML = stats.holds.total; - $('dash_pickup').innerHTML = stats.holds.ready; - } else unHideMe($('your-acct-login')); -} - -function mySuperInitFunction() { - G.ui.common.now_searching = elem('div'); - webCacheKey = cookieManager.read('sessionID'); - var list = getCacheValue('anonListCache'); - anonListCache = isTrue(list)?list:[]; - if(anonListCache.length) try { unHideMe($('cacheListLink')); } catch(e){} - - if(G.user && G.user.prefs[PREF_DEF_LOCATION]!="1") { - G.user.prefs[PREF_DEF_LOCATION]="1"; - LOCATION = "1"; - commitUserPrefs(); - setSelector($('depth_selector'), getLocation()); - _newlocation = getLocation(); - } -} - -function setCacheValue(field, value, timeout) { - if(!timeout) timeout = '30m'; - var key = fieldmapper.standardRequest(['open-ils.actor','open-ils.actor.anon_cache.set_value'],{async:false, params:[webCacheKey, field, value]}); - if(!isTrue(webCacheKey)) { - webCacheKey = key; - cookieManager.write('sessionID', webCacheKey, timeout); - } - return key; -} - -function getCacheValue(field) { - if(!isTrue(webCacheKey)) return null; - var val = fieldmapper.standardRequest(['open-ils.actor','open-ils.actor.anon_cache.get_value'], {async:false, params:[webCacheKey, field]}); - return val; -} - -function isInAnonList(id) { - for(var i in anonListCache) { - if(anonListCache[i] == id) return true; - } - return false; -} - -var isCacheListDrawn = false; -var anonListParent; -var anonListTemp; -function showCachedList() { - if(grabUser()) goTo(buildOPACLink({page:MYOPAC, 'acctpage':6}, false, true)); - if(!anonListCache.length) {try { hideResultsPage(); } catch(e) {} hideMe($('anonListTable')); hideMe($('cacheListLink')); return;} - try { hideResultsPage(true); } catch(e) {} - unHideMe($('anonListTable')); - if(!isCacheListDrawn) fieldmapper.standardRequest(["open-ils.search","open-ils.search.biblio.record.mods_slim.retrieve"],{async:true, params:[anonListCache], oncomplete:drawCacheList}); -} - -function drawCacheList(r) { - isCacheListDrawn = true; - var bibs = r.recv().content(); - if(!anonListParent) anonListParent = $('anonListParent'); - if(!anonListTemp) anonListTemp = anonListParent.removeChild($('anonListTemp')); - removeChildren(anonListParent); - $('anon_selector').checked = false; - - if(grabUser()) { - unHideMe($('holdsCacheSel')); - setSelector($('holdsCacheSel'), grabUser().home_ou()); - } - - for(var i in bibs) { - var row = anonListTemp.cloneNode(true); - $n(row, 'anon_selector').doc_id = bibs[i].doc_id(); - $n(row, 'curr_row').innerHTML = parseInt(i)+1; - $n(row, 'title').innerHTML = bibs[i].title(); - anonListParent.appendChild(row); - } -} - -function createBibHoldObject(org) { - if(!G.user) return null; - if(!org) org = G.user.home_ou(); - - var node = findOrgUnit(org); - var ntype = findOrgType(node.ou_type()); - if(!ntype.can_have_users()) return null; - - var hold = new ahr(); - var interval = fetchOrgSettingDefault(G.user.home_ou(), 'circ.hold_expire_interval'); - if(!interval) interval = 0; - var secs = interval_to_seconds(interval); - var expire = new Date(); - expire.setTime(expire.getTime() + Number(secs + '000')); - var expireDate = holdsVerifyThawDate(dojo.date.stamp.toISOString(expire)); - - if(expireDate) hold.expire_time(expireDate); - hold.phone_notify(""); - hold.email_notify(0); - hold.pickup_lib(org); - hold.usr(G.user.id()); - hold.hold_type("T"); - hold.frozen('f'); - hold.thaw_date(null); - - return hold; -} - -function batchHoldMyList(org, parent) { - if(!grabUser()) return; - if(!org) G.user.home_ou(); - if(!parent) parent = $('myopac_bookbag_div'); - - var nodes = dojo.query('input[name=list_action_chbx]', parent).filter(function(node, index){ return node.checked; }); - if(!nodes.length) return; - var arr = []; - nodes.forEach(function(node, index){ arr.push(node.getAttribute("recordid")); }); - var error = {err:""}; - var resp = placeBatchHold(arr, org, error); - if(resp == -1) alert("Unable to place holds"); else alert(resp+" hold"+(resp==1?"":"s")+" placed successfully\n\n"+error.err); - -} - -function placeBatchHold(ids, org, error) { // array of bib IDs, pickup lib (optional), error msgs from holds (optional) - if(!grabUser() || !ids.length) return -1; - if(!org) org = G.user.home_ou(); - - var holds = []; - var chkArr = []; - for(var i=0; i 0) { + dashfines.style.color = "#f41d36"; + dashfines.innerHTML = "$"+parseFloat(stats.fines.balance_owed).toFixed(2) + } else { + dashfines.style.fontWeight="normal"; + dashfines.innerHTML = "No"; + } + $('dash_user').innerHTML = u.first_given_name()+' '+u.family_name(); + $('dash_checked').innerHTML = stats.checkouts.out+stats.checkouts.overdue; + $('dash_holds').innerHTML = stats.holds.total; + $('dash_pickup').innerHTML = stats.holds.ready; + } else unHideMe($('your-acct-login')); +} + +function mySuperInitFunction() { + G.ui.common.now_searching = elem('div'); + webCacheKey = cookieManager.read('sessionID'); + var list = getCacheValue('anonListCache'); + anonListCache = isTrue(list)?list:[]; + if(anonListCache.length) try { unHideMe($('cacheListLink')); } catch(e){} + + if(G.user && G.user.prefs[PREF_DEF_LOCATION]!="1") { + G.user.prefs[PREF_DEF_LOCATION]="1"; + LOCATION = "1"; + commitUserPrefs(); + setSelector($('depth_selector'), getLocation()); + _newlocation = getLocation(); + } +} + +function setCacheValue(field, value, timeout) { + if(!timeout) timeout = '30m'; + var key = fieldmapper.standardRequest(['open-ils.actor','open-ils.actor.anon_cache.set_value'],{async:false, params:[webCacheKey, field, value]}); + if(!isTrue(webCacheKey)) { + webCacheKey = key; + cookieManager.write('sessionID', webCacheKey, timeout); + } + return key; +} + +function getCacheValue(field) { + if(!isTrue(webCacheKey)) return null; + var val = fieldmapper.standardRequest(['open-ils.actor','open-ils.actor.anon_cache.get_value'], {async:false, params:[webCacheKey, field]}); + return val; +} + +function isInAnonList(id) { + for(var i in anonListCache) { + if(anonListCache[i] == id) return true; + } + return false; +} + +var isCacheListDrawn = false; +var anonListParent; +var anonListTemp; +function showCachedList() { + if(grabUser()) goTo(buildOPACLink({page:MYOPAC, 'acctpage':6}, false, true)); + if(!anonListCache.length) {try { hideResultsPage(); } catch(e) {} hideMe($('anonListTable')); hideMe($('cacheListLink')); return;} + try { hideResultsPage(true); } catch(e) {} + unHideMe($('anonListTable')); + if(!isCacheListDrawn) fieldmapper.standardRequest(["open-ils.search","open-ils.search.biblio.record.mods_slim.retrieve"],{async:true, params:[anonListCache], oncomplete:drawCacheList}); +} + +function drawCacheList(r) { + isCacheListDrawn = true; + var bibs = r.recv().content(); + if(!anonListParent) anonListParent = $('anonListParent'); + if(!anonListTemp) anonListTemp = anonListParent.removeChild($('anonListTemp')); + removeChildren(anonListParent); + $('anon_selector').checked = false; + + if(grabUser()) { + unHideMe($('holdsCacheSel')); + setSelector($('holdsCacheSel'), grabUser().home_ou()); + } + + for(var i in bibs) { + var row = anonListTemp.cloneNode(true); + $n(row, 'anon_selector').doc_id = bibs[i].doc_id(); + $n(row, 'curr_row').innerHTML = parseInt(i)+1; + $n(row, 'title').innerHTML = bibs[i].title(); + anonListParent.appendChild(row); + } +} + +function createBibHoldObject(org) { + if(!G.user) return null; + if(!org) org = G.user.home_ou(); + + var node = findOrgUnit(org); + var ntype = findOrgType(node.ou_type()); + if(!ntype.can_have_users()) return null; + + var hold = new ahr(); + var interval = fetchOrgSettingDefault(G.user.home_ou(), 'circ.hold_expire_interval'); + if(!interval) interval = 0; + var secs = interval_to_seconds(interval); + var expire = new Date(); + expire.setTime(expire.getTime() + Number(secs + '000')); + var expireDate = holdsVerifyThawDate(dojo.date.stamp.toISOString(expire)); + + if(expireDate) hold.expire_time(expireDate); + hold.phone_notify(""); + hold.email_notify(0); + hold.pickup_lib(org); + hold.usr(G.user.id()); + hold.hold_type("T"); + hold.frozen('f'); + hold.thaw_date(null); + + return hold; +} + +function batchHoldMyList(org, parent) { + if(!grabUser()) return; + if(!org) G.user.home_ou(); + if(!parent) parent = $('myopac_bookbag_div'); + + var nodes = dojo.query('input[name=list_action_chbx]', parent).filter(function(node, index){ return node.checked; }); + if(!nodes.length) return; + var arr = []; + nodes.forEach(function(node, index){ arr.push(node.getAttribute("recordid")); }); + var error = {err:""}; + var resp = placeBatchHold(arr, org, error); + if(resp == -1) alert("Unable to place holds"); else alert(resp+" hold"+(resp==1?"":"s")+" placed successfully\n\n"+error.err); + +} + +function placeBatchHold(ids, org, error) { // array of bib IDs, pickup lib (optional), error msgs from holds (optional) + if(!grabUser() || !ids.length) return -1; + if(!org) org = G.user.home_ou(); + + var holds = []; + var chkArr = []; + for(var i=0; i 0 ) runEvt("result", "preCollectRecords"); - var i = 0; - for( var x = getOffset(); x!= getDisplayCount() + getOffset(); x++ ) { - if(isNull(records[x])) break; - if(isNaN(records[x])) continue; - var req = new Request(FETCH_MRMODS, records[x]); - - req.request.userdata = i++; - - /* wait at most 10 seconds for the mods rec to come back */ - /* this needs more testing */ - req.request.timeout(10); - req.request.abortCallback( - function(){ - recordsHandled++; - if(resultPageIsDone() && !recsReceivedCalled) { - recsReceivedCalled = true; - runEvt('result', 'allRecordsReceived', recordsCache); - unHideMe($('copyright_block')); - } - } - ); - - req.callback(mresultHandleMods); - req.send(); - } -} - -function mresultHandleMods(r) { - var rec = r.getResultObject(); - var pagePosition = r.userdata; - runEvt('result', 'recordReceived', rec, pagePosition, true); - if(rec) resultCollectCopyCounts(rec, pagePosition, FETCH_MR_COPY_COUNTS); - if(resultPageIsDone()) { - runEvt('result', 'allRecordsReceived', recordsCache); - unHideMe($('copyright_block')); /* *** */ - } -} - -function mresultHandlePlaceHold(target) { - function reload() { - location.href = location.href.replace(/&hold_target=\d+/, ''); - } - attachEvt("common", "holdUpdated", reload); - attachEvt("common", "holdUpdateCanceled", reload); - attachEvt("common", "loginCanceled", reload); - holdsDrawEditor({record:target, type: 'M'}); -} - - - +//var records = {}; +var records = []; +var ranks = []; +var onlyrecord = {}; +var table; +var mresultPreCache = 200; +var searchTimer; + +attachEvt("common", "unload", mresultUnload); +attachEvt("common", "run", mresultDoSearch); +attachEvt("result", "idsReceived", mresultSetRecords); +attachEvt("result", "idsReceived", mresultCollectRecords); + +function mresultUnload() { removeChildren(table); table = null;} + +hideMe($('copyright_block')); + +function mresultDoSearch() { + TFORM = null; /* clear the rresult tform var so it's not propogated */ + + swapCanvas($('loading_alt')); + table = G.ui.result.main_table; + + var holdTarget = new CGI().param('hold_target'); + if(holdTarget != null) { + mresultHandlePlaceHold(holdTarget); + return; + } + + while( table.parentNode.rows.length <= (getDisplayCount() + 1) ) + table.appendChild(G.ui.result.row_template.cloneNode(true)); + + if( (getSearches() || getAdvTerm()) && !getTerm() ) { + if(getAdvType() == ADVTYPE_MULTI ) mresultCollectAdvIds(); + + } else { + _mresultCollectIds(); + ADVTERM = ""; + ADVTYPE = ""; + } +} + +function _mresultCollectIds() { + resultCollectSearchIds(true, SEARCH_MRS_QUERY, mresultHandleMRIds ); +} + +function mresultCollectAdvIds() { + resultCollectSearchIds(false, SEARCH_MRS_QUERY, mresultHandleMRIds ); +} + + +function mresultHandleMRIds(r) { + var res = r.getResultObject(); + resultCompiledSearch = res.compiled_search; + cookieManager.write(COOKIE_SEARCH, js2JSON(res.compiled_search), -1); + if(res.count != null) { + if( getOffset() == 0 ) HITCOUNT = res.count; + runEvt('result', 'hitCountReceived'); + } + runEvt('result', 'idsReceived', res.ids); +} + + + +function mresultSetRecords(idstruct) { + if(!idstruct) return; + var o = getOffset(); + for( var x = o; x < idstruct.length + o; x++ ) { + if( idstruct[x-o] != null ) { + var r = parseInt(idstruct[x - o][0]); + var ra = parseFloat(idstruct[x - o][1]); + var or = parseInt(idstruct[x - o][2]); + if(!isNull(r) && !isNaN(r)) records[x] = r; + if(!isNull(ra) && !isNaN(ra)) ranks[x] = ra; + if(!isNull(or) && !isNaN(or)) onlyrecord[x] = or; + } + } + + TOPRANK = ranks[getOffset()]; +} + + +var recsReceivedCalled = false; +function mresultCollectRecords() { + if(getHitCount() > 0 ) runEvt("result", "preCollectRecords"); + var i = 0; + for( var x = getOffset(); x!= getDisplayCount() + getOffset(); x++ ) { + if(isNull(records[x])) break; + if(isNaN(records[x])) continue; + var req = new Request(FETCH_MRMODS, records[x]); + + req.request.userdata = i++; + + /* wait at most 10 seconds for the mods rec to come back */ + /* this needs more testing */ + req.request.timeout(10); + req.request.abortCallback( + function(){ + recordsHandled++; + if(resultPageIsDone() && !recsReceivedCalled) { + recsReceivedCalled = true; + runEvt('result', 'allRecordsReceived', recordsCache); + unHideMe($('copyright_block')); + } + } + ); + + req.callback(mresultHandleMods); + req.send(); + } +} + +function mresultHandleMods(r) { + var rec = r.getResultObject(); + var pagePosition = r.userdata; + runEvt('result', 'recordReceived', rec, pagePosition, true); + if(rec) resultCollectCopyCounts(rec, pagePosition, FETCH_MR_COPY_COUNTS); + if(resultPageIsDone()) { + runEvt('result', 'allRecordsReceived', recordsCache); + unHideMe($('copyright_block')); /* *** */ + } +} + +function mresultHandlePlaceHold(target) { + function reload() { + location.href = location.href.replace(/&hold_target=\d+/, ''); + } + attachEvt("common", "holdUpdated", reload); + attachEvt("common", "holdUpdateCanceled", reload); + attachEvt("common", "loginCanceled", reload); + holdsDrawEditor({record:target, type: 'M'}); +} + + + diff --git a/Open-ILS/web/opac/skin/kcls/js/myopac.js b/Open-ILS/web/opac/skin/kcls/js/myopac.js index 987b040c47..8af56cfb38 100644 --- a/Open-ILS/web/opac/skin/kcls/js/myopac.js +++ b/Open-ILS/web/opac/skin/kcls/js/myopac.js @@ -1,2318 +1,2318 @@ - -//attachEvt("common", "run", myOPACInit ); -// force init to run after opac_init(); -dojo.addOnLoad(function(){setTimeout(myOPACInit, 0)}); - -attachEvt('common','locationUpdated', myopacReload ); -dojo.require('openils.Util'); - -var FETCH_CONTAINER_DETAILS = ['open-ils.actor','open-ils.actor.container.flesh']; -var FETCH_CHECKED_DETAILS = ['open-ils.circ','open-ils.circ.actor.user.checked_out.atomic']; -var FETCH_CHECKED_HISTORY = ['open-ils.actor','open-ils.actor.history.circ.visible.atomic']; -var FETCH_FAV_SEARCHES = ['open-ils.actor','open-ils.actor.user.saved_search.retrieve']; -var FETCH_HOLD_DETAILS = ['open-ils.circ','open-ils.circ.hold.details.batch.retrieve.atomic']; -var FETCH_MODS_BY_COPY = ['open-ils.search','open-ils.search.biblio.mods_from_copy']; -var FETCH_CALL_NUMBER = ['open-ils.search','open-ils.search.callnumber.retrieve']; -var FETCH_MODS_SLIM = ['open-ils.search','open-ils.search.biblio.record.mods_slim.retrieve']; -var FETCH_FULL_USER = ['open-ils.actor','open-ils.actor.user.fleshed.retrieve']; -var FETCH_HOLD_IDS = ['open-ils.circ','open-ils.circ.holds.id_list.retrieve']; -var FETCH_COPY_OBJ = ['open-ils.search','open-ils.search.asset.copy.retrieve']; -var FETCH_OPT_INS = ['open-ils.actor','open-ils.actor.event_def.opt_in.settings.atomic']; -var FETCH_LISTS = ['open-ils.actor','open-ils.actor.container.flesh']; -var PASS_RESET = ['open-ils.actor','open-ils.actor.patron.password_reset.request']; -var PAY_BILLS = ['open-ils.circ','open-ils.circ.money.payment']; -// number of api calls to run before firing myOPACPostCollect() -- helps make all data available first (avoids having to make sync'd calls) -var TOTAL_CALLS = 6; - -var PREFS_HOLD_PHONE = "notification.hold.pickup.phone"; -var PREFS_HOLD_EMAIL = "notification.hold.pickup.email"; -var PREFS_PREDUE_3DAY = "notification.predue.email"; -var PREFS_OVER_FIRST = "notification.overdue.first.email"; -var PREFS_OVER_FIRST_P = "notification.overdue.first.phone"; -var PREFS_HOLD_EXPIRE = "notification.hold.expire.email"; -var PREFS_HOLD_CANCEL = "notification.hold.cancel.email"; -var PREFS_CIRC_HIST_AGE = "history.circ.retention_age"; -var PREFS_CIRC_HIST_START = "history.circ.retention_start"; - -var listsCache = []; -var holdsCache = []; -var holdsCacheMap = []; -var itemsOutCache = []; -var callNumCache = []; -var favsCache = []; -var copyObjCache = []; -var mvrObjCache = []; -var itemsOutHistory = []; -var userOptIns = []; -var userOptInsMap = []; -var fleshedLists = []; -var imgFormatCache = []; -var transCache = []; -var fleshedContainers = {}; -var subPageObjs = {}; - -var CIRC_HIST_PAGE_LIMIT = 10; -var circHistPage = 0; -var showXUL = false; -var holdsList = null; -var fleshedUser = null; -var allowPendingAddr = false; -var currPage = ""; -var templates = {}; -var containerTemplate; -var containerTemplate2; -var myopacGenericTransTemplate; -var myopacCircTransTemplate; -var addrRowTemplate; -var notesTemplate; -var myopacReturnToPayment = false; - -function myOPACInit() { - if(!(G.user && G.user.session)) { - initLogin(); - } else { - allowPendingAddr = fetchOrgSettingDefault(G.user.home_ou(), 'opac.allow_pending_address'); - if(allowPendingAddr) unHideMe($('myopac_pending_addr_td')); - - unHideMe($('myopac_tabs')); - currPage = "summary"; - holdsList = getCacheValue('saveAnonCache'); - if(holdsList) { currPage = "holds"; swapTabs($('acct_holds')); setCacheValue('saveAnonCache', null); TOTAL_CALLS -= 2; } - var retUrl = getCacheValue('returnURL'); - if(retUrl) { setCacheValue('returnURL', null); setCacheValue('showHoldEditor', {record:retUrl.record, type:retUrl.type}); window.location=retUrl.href; } - - var sel = $('myopac_new_home'); - buildOrgSel(sel, globalOrgTree, 0); - setSelector(sel, G.user.home_ou()); - - switch(new CGI().param('acctpage')) { - case "1": currPage = "summary"; break; - case "2": currPage = "checked"; swapTabs($('acct_checked_out')); break; - case "3": currPage = "holds"; swapTabs($('acct_holds')); break; - case "4": currPage = "prefs"; swapTabs($('acct_prefs')); break; - case "5": currPage = "fines"; swapTabs($('acct_favs')); break; - case "6": currPage = "bookbag"; swapTabs($('acct_lists')); break; - } - - if(!isXUL()) { - unHideMe($('myopac_summary_email_change')); - unHideMe($('myopac_summary_password_change')); - unHideMe($('myopac_summary_username_change')); - } else { - unHideMe($('myopac_summary_phone1_change')); - unHideMe($('myopac_summary_phone2_change')); - unHideMe($('myopac_summary_phone3_change')); - } - - - fieldmapper.standardRequest(FETCH_FULL_USER, {async:true, params:[G.user.session, G.user.id()], - oncomplete:function(r) { - showXUL = isXUL(); - fleshedUser = openils.Util.readResponse(r); - myOPACShowFines(true); - myOPACShowUser(false); - myOPACChangePage(currPage); - myOPACInitTemplates(); - myOPACInitSubpages(); - //myOPACShowBookbags(true); - if(holdsList) doBatchAnonHolds(); - showCanvas(); - } - }); - } -} - -function myopacReload() { - var a = {}; - a[PARAM_LOCATION] = getNewSearchLocation(); - a[PARAM_DEPTH] = getNewSearchDepth(); - hideMe($('canvas_main')); - goTo(buildOPACLink(a, true)); -} - -function myOPACChangePage( page ) { - var s = $("myopac_summary_td"); - var c = $("myopac_checked_td"); - var f = $("myopac_fines_td"); - var h = $("myopac_holds_td"); - var p = $("myopac_prefs_td"); - var b = $('myopac_bookbag_td'); - - var ss = $("myopac_summary_div"); - var cc = $("myopac_checked_div"); - var ff = $("myopac_fines_div"); - var hh = $("myopac_holds_div"); - var pp = $("myopac_prefs_div"); - var bb = $('myopac_bookbag_div'); - - hideMe(ss); - hideMe(cc); hideMe(ff); - hideMe(hh); hideMe(pp); - hideMe(bb); - - if(page != 'prefs') - myopacReturnToPayment = false; - - var oncomplete = null; - - switch( page ) { - case "summary": unHideMe(ss); - if($('show_fines_link').innerHTML=="Hide Overdue Materials") unHideMe(ff); - oncomplete = myOPACDrawSummary; - break; - - case "checked": - unHideMe(cc); - oncomplete = drawCheckedPage; - break; - - case "holds": - unHideMe(hh); - oncomplete = drawHoldsPage; - break; - - case "prefs": - unHideMe(pp); - oncomplete = myOPACShowPrefs; - break; - - case 'bookbag': - unHideMe(bb); - break; - } - currPage = page; - myOPACGrabPageData(page, oncomplete); -} - -var fetchedPages={} -function myOPACGrabPageData(page, oncomplete) { - if(fetchedPages[page]) return; - fetchedPages[page] = true; - - switch(page) { - - case "summary": - oncomplete(); - break; - - case "checked": - - progressDialog.show(true); - fieldmapper.standardRequest(FETCH_CHECKED_DETAILS, {async:true, params:[G.user.session, G.user.id()], - oncomplete:function(r) { - progressDialog.hide(); - itemsOutCache = openils.Util.readResponse(r); - oncomplete(); - } - }); - - break; - - case "holds": - - holdsCache=null; - fieldmapper.standardRequest(FETCH_HOLD_IDS, {async:true, params:[G.user.session, G.user.id()], - oncomplete: function(r) { - oncomplete(false, openils.Util.readResponse(r)); - - /* - var holdids = openils.Util.readResponse(r); - fieldmapper.standardRequest(FETCH_HOLD_DETAILS, {async:true, params:[G.user.session, holdids], - oncomplete: function(rr) { - progressDialog.hide(); - var holds = openils.Util.readResponse(rr); - holdsCache = holds; - setTimeout(function(){oncomplete()}, 150); // give the progress dialog a chance to clear out - oncomplete(); - } - }); - */ - } - }); - - break; - - case "prefs": - fieldmapper.standardRequest(FETCH_OPT_INS, {async:true, params:[G.user.session], - oncomplete:function(r) { - userOptIns = openils.Util.readResponse(r); - for(var i=0; i 0) { - var bal = $('myopac_sum_fines_bal'); - bal.style.color = "red"; - appendClear(bal, text("$" + Number(stats.fines.balance_owed).toFixed(2))); - showFinesDiv($('show_fines_link')); - unHideMe($('pay_fines_btn1')); - unHideMe($('show_fines_link')); - } -} - -function myOPACInitTemplates() { - //holds page - if(!templates.holdsParent) templates.holdsParent = $('holds_temp_parent'); - if(!templates.holdsTemp) templates.holdsTemp = templates.holdsParent.removeChild($('acct_holds_temp')); - //checked out page - if(!templates.checkedParent) templates.checkedParent = $('checked_temp_parent'); - if(!templates.checkedTemp) templates.checkedTemp = templates.checkedParent.removeChild($('acct_checked_temp')); - //checked history page - if(!templates.circHistPar) templates.circHistPar = $('acct_checked_hist_parent'); - if(!templates.circHistTemp) templates.circHistTemp = templates.circHistPar.removeChild($('acct_checked_hist_temp')); -} - -// link-up all the Account sub-pages for switchSubPage() -function myOPACInitSubpages() { - // create a primary object for each page... - subPageObjs.checked = {}; - subPageObjs.holds = {}; - subPageObjs.prefs = {}; - - // ... then create an array for each sub-page - subPageObjs.checked.main = []; - subPageObjs.checked.hist = []; - subPageObjs.holds.main = []; - subPageObjs.holds.hist = []; - subPageObjs.prefs.info = []; - subPageObjs.prefs.notify = []; - subPageObjs.prefs.search = []; - - // add .header to each primary page object and link to the page's blue header bar. - // add ['header'] to each sub-page array and put the text to display - subPageObjs.checked.header = $('acct_checked_header'); - subPageObjs.checked.main['header'] = "Current Items Checked Out"; - subPageObjs.checked.hist['header'] = "Check Out History"; - subPageObjs.checked.main.push($('checked_label')); - subPageObjs.checked.hist.push($('checked_link')); - subPageObjs.checked.main.push($('checked_hist_link')); - subPageObjs.checked.hist.push($('checked_hist_label')); - subPageObjs.checked.main.push($('checked_main')); - subPageObjs.checked.hist.push($('checked_hist')); - - subPageObjs.holds.header = $('acct_holds_header'); - subPageObjs.holds.main['header'] = "Current Items on Hold"; - subPageObjs.holds.hist['header'] = "Holds History"; - subPageObjs.holds.main.push($('holds_label')); - subPageObjs.holds.hist.push($('holds_link')); - subPageObjs.holds.main.push($('holds_hist_link')); - subPageObjs.holds.hist.push($('holds_hist_label')); - subPageObjs.holds.main.push($('holds_main')); - subPageObjs.holds.hist.push($('holds_hist_table')); - - subPageObjs.prefs.header = $('acct_prefs_header'); - subPageObjs.prefs.info['header'] = "Account Information and Preferences"; - subPageObjs.prefs.notify['header'] = "Notification Preferences"; - subPageObjs.prefs.search['header'] = "Search Preferences"; - subPageObjs.prefs.info.push($('prefs_info_lbl')); - subPageObjs.prefs.notify.push($('prefs_info_link')); - subPageObjs.prefs.notify.push($('prefs_notify_lbl')); - subPageObjs.prefs.info.push($('prefs_notify_link')); - subPageObjs.prefs.search.push($('prefs_search_lbl')); - subPageObjs.prefs.info.push($('prefs_search_link')); - subPageObjs.prefs.notify.push($('prefs_search_link')); - subPageObjs.prefs.search.push($('prefs_notify_link')); - subPageObjs.prefs.search.push($('prefs_info_link')); - subPageObjs.prefs.info.push($('acct_info_main')); - subPageObjs.prefs.search.push($('acct_search_main')); - subPageObjs.prefs.notify.push($('acct_notify_main')); - subPageObjs.prefs.notify.push($('acct_prefs_save')); - subPageObjs.prefs.search.push($('acct_prefs_save')); -} - -function fetchAllHolds() { -} - -var myopacForceHoldsRedraw = false; -function drawHoldsPage(sort, holdIds) { - if(sort == undefined) sort = true; - if(!templates.holdsParent || !templates.holdsTemp) return; - var parent = templates.holdsParent; - var temp = templates.holdsTemp; - var holdsReady = 0; - - if(myopacForceHoldsRedraw) { - holdsCache = fieldmapper.standardRequest(FETCH_HOLD_DETAILS, {async:false, params:[G.user.session, - fieldmapper.standardRequest(FETCH_HOLD_IDS, {async:false, params:[G.user.session, G.user.id()]}) - ]}); - } - - if(sort) holdsCache = holdsCache.sort(function(a, b) { - if(a.status==4) return -1; - if(b.status==4) return 1; - if(isTrue(a.hold.frozen())) return 1; - if(isTrue(b.hold.frozen())) return -1; - return dojo.date.stamp.fromISOString(a.hold.request_time()) > dojo.date.stamp.fromISOString(b.hold.request_time())?1:-1; - }); - - function allHoldsFetched() { - holdsCacheMap=[]; - for(var i=0; i
- - if(hold.status == 4) holdsReady++; - } - allHoldsFetched(); - - } else if(holdIds) { - - holdsCache = []; - var holdsReceived = 0; - - dojo.forEach(holdIds, - function(holdId) { - var row = temp.cloneNode(true); - dojo.style(row, 'visibility', 'hidden'); - parent.appendChild(row); - - //parent.appendChild(elem('tr').appendChild(elem('td', {'colspan':'10'}).appendChild(elem('div', {'style':'position:absolute;'}).appendChild(elem('div', {'style':'position:relative;'}).appendChild(elem('div', {'style':'width:974px;height:1px;background:#dcdbdb;'})))))); - - fieldmapper.standardRequest(FETCH_HOLD_DETAILS, {async:true, params:[G.user.session, [holdId]], - oncomplete: function(rr) { - var hold = openils.Util.readResponse(rr)[0]; - holdsCache.push(hold); - dojo.style(row, 'visibility', 'visible'); - drawOneHold(hold, row, parent); - if(hold.status == 4) holdsReady++; - if(++holdsReceived == holdIds.length) - allHoldsFetched(); - } - }); - } - ); - } -} - -function drawOneHold(h, row, parent) { - var imgTD = null; - var imgEl = null; - var d = null; - var exp_date; - var suffix = ""; - - row.id = "myopac_holds_row_" + h.hold.id(); - var form = $n(row, "myopac_holds_formats"); - form.id = "myopac_holds_form_" + h.hold.id(); - $n(row,'hold_pickup_lib_span').appendChild($('hold_pickup_lib_temp').cloneNode(true)); - - var tree = $n(row,'hold_pickup_lib_sel'); - buildOrgSelAlt(tree, globalOrgTree, 0); - setSelector(tree, h.hold.pickup_lib()); - $n(row,'check_all_holds').holdid = h.hold.id(); - $n(row,'hold_edit_link').setAttribute('href','javascript:editHold('+h.hold.id()+');'); - $n(row,'hold_cancel_link').setAttribute('href','javascript:cancelHold('+h.hold.id()+');'); - $n(row,'hold_save_link').setAttribute('href','javascript:saveHold('+h.hold.id()+');'); - var activeSel = $n(row,'hold_active_sel'); - activeSel.selectedIndex = isTrue(h.hold.frozen())?1:0; - - //var djBox = $n(row,'activate_box').parentNode.parentNode.parentNode; - //djBox.id=djBox.id+h.hold.id(); - //var blah = dojo.query('input',$n(row,'activate_box').parentNode)[0]; - //blah.id = djBox.getAttribute("widgetId")+h.hold.id(); - //$().id = djBox.id+h.hold.id(); - //djBox.setAttribute("widgetId", djBox.getAttribute("widgetId")+h.hold.id()); - - $n(row,'hold_pickup_lib').innerHTML = findOrgUnit(h.hold.pickup_lib()).name(); - $n(row,'hold_active').innerHTML = isTrue(h.hold.frozen())?"Suspended":"Active"; - if(isTrue(h.hold.frozen())) row.style.background="#e5e5e5"; - - if(h.hold.thaw_date()) { - d = dojo.date.stamp.fromISOString(h.hold.thaw_date()); - $n(row, 'activate_date').innerHTML = dojo.date.locale.format(d, {selector: 'date', fullYear: true}); - unHideMe($n(row,'activate_label')); - $n(row,'activate_box').value = dojo.date.locale.format(d, {selector:'date', fullYear: true}); - } - - if(h.hold.expire_time()) { - exp_date = dojo.date.stamp.fromISOString(h.hold.expire_time().replace(/(T\d\d:\d\d:\d\d)([+-]\d\d)(\d)/, "$1$2:$3")) - $n(row, 'hold_expires').innerHTML = dojo.date.locale.format(exp_date, {selector:'date', fullYear: true}); - unHideMe($n(row,'hold_expires_label')); - $n(row,'hold_expires_box').value = dojo.date.locale.format(exp_date, {selector:'date', fullYear: true}); - } - - buildTitleDetailLink(h.mvr, $n(row,'myopac_holds_title_link')); - $n(row,'myopac_holds_title_link').title = h.mvr.title(); - - imgTD = $n(row, "myopac_holds_formats"); - imgEl = elem('img'); - imgEl.className = 'hide_me'; - imgEl.name = 'format_icon_'+h.hold.id(); - imgTD.appendChild(imgEl); - if(imgFormatCache[h.hold.id()]==null) imgFormatCache[h.hold.id()] = getMarcData(h.mvr.doc_id(),"998","d"); - setFormatIcon(imgEl, imgFormatCache[h.hold.id()]); - - $n(row,'myopac_holds_author').innerHTML = h.mvr.author(); - - if( h.status == 4) { - $n(row,'acct_holds_status').innerHTML = "Ready for Pickup"; - hideMe($n(row,'holds_editor_row')); - unHideMe($n(row,'holds_ready_row')); - if(h.hold.shelf_expire_time()) $n(row,'hold_ready_expire').innerHTML = - dojo.date.locale.format(dojo.date.stamp.fromISOString(h.hold.shelf_expire_time()), {selector:'date', fullYear: true});; - } else { - var num = h.queue_position+''; - suffix = (num.charAt(num.length-1)=="1")?"st":(num.charAt(num.length-1)=="2")?"nd":(num.charAt(num.length-1)=="3")?"rd":"th"; - if(num=="11" || num=="12" || num=="13") suffix = "th"; - $n(row,'acct_holds_status').innerHTML = h.queue_position+suffix+" hold on "+h.potential_copies+" circulating cop"+(h.potential_copies==1?"y":"ies"); - } -} - -var checkedDrawn = true; -function drawCheckedPage(sort) { - if(sort==undefined) sort = true; - if(!templates.checkedParent || !templates.checkedTemp) return; - var parent = templates.checkedParent; - var temp = templates.checkedTemp; - - if(!checkedDrawn) itemsOutCache = fieldmapper.standardRequest(FETCH_CHECKED_DETAILS, {async:false, params:[G.user.session, G.user.id()]}); - if(sort) itemsOutCache = itemsOutCache.sort(function(a, b) { - if(dojo.date.stamp.fromISOString(a.circ.due_date()) > dojo.date.stamp.fromISOString(b.circ.due_date())) return 1; - return -1; - }); - checkedDrawn = true; - - removeChildren(parent); - for(var i in itemsOutCache) { - var row = temp.cloneNode(true); - var out = itemsOutCache[i]; - //row.id = "myopac_holds_row_" + out.hold.id(); - if(!mvrObjCache[out.circ.target_copy()]) mvrObjCache[out.circ.target_copy()] = out.record; - if(!copyObjCache[out.copy.id()]) copyObjCache[out.copy.id()] = out.copy; - - if(out.circ.due_date()) { - var exp_date = dojo.date.stamp.fromISOString(out.circ.due_date()); - if(exp_date<(new Date())) $n(row,'due_date').style.color="red"; - $n(row, 'due_date').innerHTML = dojo.date.locale.format(exp_date, {selector:'date', fullYear: true}); - } - - $n(row, 'renewals').innerHTML = out.circ.renewal_remaining(); - buildTitleDetailLink(out.record, $n(row,'title')); - if(out.record.author()) $n(row, 'author').appendChild(text(" / "+out.record.author())); - dojo.attr($n(row, 'check_all_checked'), 'circid', out.circ.id()) - $n(row,'title').title = out.record.title(); - $n(row, 'barcode').innerHTML = out.copy.barcode(); - if(callNumCache[out.copy.call_number()]==null) callNumCache[out.copy.call_number()] = fieldmapper.standardRequest(FETCH_CALL_NUMBER, {async:false, params:[out.copy.call_number()]}); - $n(row, 'call_number').innerHTML = callNumCache[out.copy.call_number()].label(); - - parent.appendChild(row); - } - - if(!itemsOutCache.length) parent.appendChild(elem('div',{style:"font-weight:bold;font-size:14px;width:100%;text-align:center;",align:'center'},'No items checked out.')); -} - -var circHistDrawn = true; -function drawCircHistory(sort, offset) { - if(sort==undefined) sort = true; - if(offset==undefined) offset = circHistPage; else circHistPage = offset; - if(!templates.circHistPar || !templates.circHistTemp) return; - var parent = templates.circHistPar; - var temp = templates.circHistTemp; - - if(!circHistDrawn) itemsOutHistory = fieldmapper.standardRequest(FETCH_CHECKED_HISTORY, {async:false, params:[G.user.session, G.user.id(), {'limit':CIRC_HIST_PAGE_LIMIT, 'offset':offset}]}); - circHistDrawn = true; - - removeChildren(parent); - for(var i in itemsOutHistory) { - var row = temp.cloneNode(true); - var h = itemsOutHistory[i]; - if(mvrObjCache[h.circ.target_copy()]==null) mvrObjCache[h.circ.target_copy()] = fieldmapper.standardRequest(FETCH_MODS_BY_COPY, {async:false, params:[h.circ.target_copy()]}); - var mvr = mvrObjCache[h.circ.target_copy()]; - - if(mvr && !mvr.desc) { - buildTitleDetailLink(mvr, $n(row, 'title')); - $n(row, 'title').title = mvr.title(); - $n(row, 'author').innerHTML = mvr.author(); - - //dojo.date.locale.format(dojo.date.stamp.fromISOString(), {selector:'date', fullYear: true}); - } - - //date formatting and coloring - var ret = $n(row, 'returned'); - var due = $n(row, 'due_date'); - $n(row, 'checkout').innerHTML = dojo.date.locale.format(dojo.date.stamp.fromISOString(h.circ.create_time()), {selector:'date', fullYear: true}); - due.innerHTML = dojo.date.locale.format(dojo.date.stamp.fromISOString(h.circ.due_date()), {selector:'date', fullYear: true}); - if(!h.circ.checkin_time() && new Date() > dojo.date.stamp.fromISOString(h.circ.due_date())) due.style.color="red"; - if(h.circ.checkin_time() && dojo.date.stamp.fromISOString(h.circ.checkin_time()) > dojo.date.stamp.fromISOString(h.circ.due_date())) ret.style.color="red"; - if(h.circ.checkin_time()) ret.innerHTML = dojo.date.locale.format(dojo.date.stamp.fromISOString(h.circ.checkin_time()), {selector:'date', fullYear: true}); - else ret.innerHTML = "Checked Out"; - - if(copyObjCache[h.circ.target_copy()]==null) copyObjCache[h.circ.target_copy()] = fieldmapper.standardRequest(FETCH_COPY_OBJ, {async:false, params:[h.circ.target_copy()]}); - if(callNumCache[copyObjCache[h.circ.target_copy()].call_number()]==null) - callNumCache[copyObjCache[h.circ.target_copy()].call_number()] = fieldmapper.standardRequest(FETCH_CALL_NUMBER, {async:false, params:[copyObjCache[h.circ.target_copy()].call_number()]}); - - if(copyObjCache[h.circ.target_copy()] && callNumCache[copyObjCache[h.circ.target_copy()].call_number()]) - $n(row,'call_number').innerHTML = callNumCache[copyObjCache[h.circ.target_copy()].call_number()].label(); - parent.appendChild(row); - } - - if(!itemsOutHistory.length) { - parent.appendChild(elem('tr').appendChild(elem('td',{style:"font-weight:bold;font-size:14px;width:100%;text-align:center;",align:'center'},'No items found.'))); - return; - } - - //build pagination - var pageTR = elem('tr'); - var pageTD = elem('td', {'align':'center', 'colspan':'5'}, null); - - var offPrev = offset - CIRC_HIST_PAGE_LIMIT; - var offNext = offset + CIRC_HIST_PAGE_LIMIT; - if(offset==0) offPrev = 0; - - if(offset!=0) var prev = elem('a', {'href':'javascript: circHistDrawn = false; drawCircHistory(true,'+offPrev+');'}, '< Previous'); - else var prev = elem('span', null, '< Previous'); - if(itemsOutHistory.length'); - else var next = elem('a', {'href':'javascript: circHistDrawn = false; drawCircHistory(true,'+offNext+');'}, 'Next >'); - - pageTD.appendChild(prev); - pageTD.appendChild(elem('span', null, ' ')); - pageTD.appendChild(next); - pageTR.appendChild(pageTD); - parent.appendChild(pageTR); -} - -function myOPACShowPrefs() { - grabUserPrefs(); - myOPACShowHitsPer(); - myOPACShowDefFont(); - myOPACShowDefLocation(); - myOPACShowNotifyPrefs(); - hideMe($('myopac_prefs_loading')); -} - -var defSearchLocationDrawn = false; -var defDepthIndex = 0; -function myOPACShowDefLocation() { - - var selector = $('prefs_def_location'); - var rsel = $('prefs_def_range'); - - if(!defSearchLocationDrawn) { - defSearchLocationDrawn = true; - var org = G.user.prefs[PREF_DEF_LOCATION]; - - if(!org) { - $('myopac_pref_home_lib').checked = true; - $('prefs_def_location').disabled = true; - org = G.user.home_ou(); - } - buildOrgSel(selector, globalOrgTree, 0); - - globalOrgTypes = globalOrgTypes.sort( - function(a, b) { - if( a.depth() < b.depth() ) return -1; - return 1; - } - ); - - iterate(globalOrgTypes, - function(t) { - if( t.depth() <= findOrgDepth(org) ) { - setSelectorVal(rsel, defDepthIndex++, t.opac_label(), t.depth()); - if( t.depth() == findOrgDepth(org)) - setSelector(rsel, t.depth()); - } - } - ); - } - - setSelector(selector, org); -} - -function myOPACShowNotifyPrefs() { - var preEmail = $(PREFS_PREDUE_3DAY); - var overEmail = $(PREFS_OVER_FIRST); - var overPhone = $(PREFS_OVER_FIRST_P); - var holdsCancel = $(PREFS_HOLD_CANCEL); - var holdsExpire = $(PREFS_HOLD_EXPIRE); - var holdsEmail = $("opac.hold_notify.email"); - var holdsPhone = $("opac.hold_notify.phone"); - if(G.user.prefs[PREFS_CIRC_HIST_START]) { $('circHistStart').checked = true; } - - if(preEmail && typeof(G.user.prefs[PREFS_PREDUE_3DAY]) !="undefined") preEmail.checked = G.user.prefs[PREFS_PREDUE_3DAY]; - if(overEmail && typeof(G.user.prefs[PREFS_OVER_FIRST]) !="undefined") overEmail.checked = G.user.prefs[PREFS_OVER_FIRST]; - if(overPhone && typeof(G.user.prefs[PREFS_OVER_FIRST_P]) !="undefined") overPhone.checked = G.user.prefs[PREFS_OVER_FIRST_P]; - if(holdsCancel && typeof(G.user.prefs[PREFS_HOLD_CANCEL])!="undefined") holdsCancel.checked = G.user.prefs[PREFS_HOLD_CANCEL]; - if(holdsExpire && typeof(G.user.prefs[PREFS_HOLD_EXPIRE])!="undefined") holdsExpire.checked = G.user.prefs[PREFS_HOLD_EXPIRE]; - if(holdsPhone && typeof(G.user.prefs[PREFS_HOLD_PHONE]) !="undefined") holdsPhone.checked = G.user.prefs[PREFS_HOLD_PHONE]; - if(holdsEmail && typeof(G.user.prefs[PREFS_HOLD_EMAIL]) !="undefined") holdsEmail.checked = G.user.prefs[PREFS_HOLD_EMAIL]; -} - -function myOPACShowHitsPer() { - var hits = 10; - if(G.user.prefs[PREF_HITS_PER]) - hits = G.user.prefs[PREF_HITS_PER]; - var hitsSel = $('prefs_hits_per'); - setSelector(hitsSel, hits); -} - -function myOPACShowDefFont() { - var font; - if(G.user.prefs[PREF_DEF_FONT]) - font = G.user.prefs[PREF_DEF_FONT]; - else font = "regular"; - setSelector($('prefs_def_font'), font); -} - -function myOPACShowUser(bool) { - if(bool) fleshedUser = fieldmapper.standardRequest(FETCH_FULL_USER, {async:false, params:[G.user.session, G.user.id()]}); - var user = fleshedUser; - - var expireDate = dojo.date.stamp.fromISOString(user.expire_date()); - if( expireDate < new Date() ) { - appendClear($('myopac.expired.date'), expireDate.iso8601Format('YMD')); - unHideMe($('myopac.expired.alert')); - } - - var iv1 = user.ident_value()+''; - if (iv1.length > 4 && iv1.match(/\d{4}/)) iv1 = iv1.substring(0,4) + '***********'; - - appendClear($('myopac_sum_name'),text(user.first_given_name()+" "+(user.family_name()==null?"":user.family_name()))); - appendClear($('myopac_summary_prefix'),text(user.first_given_name()+" "+(user.family_name()==null?"":user.family_name()))); - appendClear($('myopac_summary_homelib'),text(findOrgUnit(user.home_ou()).name())); - - appendClear($('myopac_summary_dayphone'),text(user.day_phone())); - appendClear($('myopac_summary_eveningphone'),text(user.evening_phone())); - appendClear($('myopac_summary_otherphone'),text(user.other_phone())); - appendClear($('myopac_summary_suffix'),text(user.suffix())); - appendClear($('myopac_summary_username'),text(user.usrname())); - appendClear($('myopac_summary_email'),text(user.email())); - appendClear($('myopac_summary_barcode'),text(user.card().barcode())); - appendClear($('myopac_summary_ident1'),text(iv1)); - appendClear($('myopac_summary_create_date'),text(_trimTime(user.create_date()))); - - var req = new Request( - FETCH_USER_NOTES, G.user.session, {pub:1, patronid:G.user.id()}); - req.callback(myopacDrawNotes); - req.send(); - - var tbody = $('myopac_addr_tbody'); - var template; - - if(addrRowTemplate) { - template = addrRowTemplate; - } else { - template = tbody.removeChild($('myopac_addr_row')); - addrRowTemplate = template; - } - removeChildren(tbody); - - var addrs = user.addresses(); - for( var a in addrs ) { - var addr = addrs[a]; - if(!allowPendingAddr && isTrue(addr.pending())) - continue; - if(addr.replaces() != null) continue; - var row = template.cloneNode(true); - myOPACDrawAddr(row, addr, addrs); - tbody.appendChild(row); - } -} - -function myopacDrawNotes(r) { - var notes = r.getResultObject(); - var tbody = $('myopac.notes.tbody'); - if(!notesTemplate) - notesTemplate = tbody.removeChild($('myopac.notes.tr')); - removeChildren(tbody); - - iterate(notes, - function(note) { - unHideMe($('myopac.notes.div')); - var row = notesTemplate.cloneNode(true); - $n(row, 'title').appendChild(text(note.title())); - $n(row, 'value').appendChild(text(note.value())); - tbody.appendChild(row); - } - ); -} - -function myOPACDrawAddr(row, addr, addrs) { - appendClear($n(row, 'myopac_addr_type'),text(addr.address_type())); - appendClear($n(row, 'myopac_addr_street'),text(addr.street1())); - appendClear($n(row, 'myopac_addr_street2'),text(addr.street2())); - appendClear($n(row, 'myopac_addr_city'),text(addr.city())); - appendClear($n(row, 'myopac_addr_county'),text(addr.county())); - appendClear($n(row, 'myopac_addr_state'),text(addr.state())); - appendClear($n(row, 'myopac_addr_country'),text(addr.country())); - appendClear($n(row, 'myopac_addr_zip'),text(addr.post_code())); - - if(!allowPendingAddr) return; - - $n(row, 'myopac_addr_edit_link').onclick = function(){myopacEditAddress(addr)}; - unHideMe($n(row, 'myopac_addr_edit_td')); - - /* if we have a replacement address, plop it into the table next to this addr */ - var repl = grep(addrs, function(a) { return a.replaces() == addr.id(); }); - - $n(row, 'myopac_pending_addr_td').id = 'myopac_pending_addr_td_' + addr.id(); - - if(repl) { - hideMe($n(row, 'myopac_addr_edit_td')); // hide the edit link - repl = repl[0]; - myopacSetAddrInputs(row, repl); - } -} - -function myopacEditAddress(addr) { - var td = $('myopac_pending_addr_td_' + addr.id()); - var row = td.parentNode; - myopacSetAddrInputs(row, addr); -} - -function myopacSetAddrInputs(row, addr, prefix) { - unHideMe($n(row, 'myopac_pending_addr_td')); - $n(row, 'myopac_pending_addr_type').value = addr.address_type(); - $n(row, 'myopac_pending_addr_street').value = addr.street1(); - $n(row, 'myopac_pending_addr_street2').value = addr.street2(); - $n(row, 'myopac_pending_addr_city').value = addr.city(); - $n(row, 'myopac_pending_addr_county').value = addr.county(); - $n(row, 'myopac_pending_addr_state').value = addr.state(); - $n(row, 'myopac_pending_addr_country').value = addr.country(); - $n(row, 'myopac_pending_addr_zip').value = addr.post_code(); - $n(row, 'myopac_pending_addr_edit_link').onclick = function(){myopacSaveAddress(row, addr)}; - $n(row, 'myopac_pending_addr_del_link').onclick = function(){myopacSaveAddress(row, addr, true)}; -} - -function _trimTime(time) { - if(!time) return ""; - var d = dojo.date.stamp.fromISOString(time); - if(!d) return ""; /* date parse failed */ - return d.iso8601Format('YMD'); -} - -function _trimSeconds(time) { - if(!time) return ""; - var d = dojo.date.stamp.fromISOString(time); - if(!d) return ""; /* date parse failed */ - return d.iso8601Format('YMDHM',null,true,true); -} - -function myopacSaveAddress(row, addr, deleteMe) { - if(addr.replaces() == null) { - var repl = new aua(); - repl.usr(addr.usr()); - 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; - } - - if(deleteMe) { - if(addr.id() == null) { - hideMe($n(row, 'myopac_pending_addr_td')); - return; - } - addr.isdeleted(true); - } else { - addr.address_type($n(row, 'myopac_pending_addr_type').value); - addr.street1($n(row, 'myopac_pending_addr_street').value); - addr.street2($n(row, 'myopac_pending_addr_street2').value); - addr.city($n(row, 'myopac_pending_addr_city').value); - addr.county($n(row, 'myopac_pending_addr_county').value); - addr.state($n(row, 'myopac_pending_addr_state').value); - addr.country($n(row, 'myopac_pending_addr_country').value); - addr.post_code($n(row, 'myopac_pending_addr_zip').value); - } - - var req = new Request('open-ils.actor:open-ils.actor.user.address.pending.cud', G.user.session, addr); - - req.callback( - function(r) { - var resp = r.getResultObject(); - - if(addr.isnew()) { - // new, add to list of addrs - addr.id(resp); - fleshedUser.addresses().push(addr); - } else { - // deleted, remove from list of addrs - if(addr.isdeleted()) { - hideMe($n(row, 'myopac_pending_addr_td')); - var addrs = []; - for(var i in fleshedUser.addresses()) { - var a = fleshedUser.addresses()[i]; - if(a.id() != addr.id()) addrs.push(a); - } - fleshedUser.addresses(addrs); - } - } - alertId('myopac_addr_changes_saved'); - } - ); - req.send(); -} - -function myOPACSavePrefs() { - G.user.prefs[PREF_HITS_PER] = getSelectorVal($('prefs_hits_per')); - G.user.prefs[PREF_DEF_FONT] = getSelectorVal($('prefs_def_font')); - G.user.prefs[PREF_DEF_DEPTH] = getSelectorVal($('prefs_def_range')); - - var holdsPhone = $("opac.hold_notify.phone"); - var holdsEmail = $("opac.hold_notify.email"); - var circStartBox = $('circHistStart').checked; - var circStart = null; - circStart = (circStartBox && G.user.prefs[PREFS_CIRC_HIST_START])?G.user.prefs[PREFS_CIRC_HIST_START]:dojo.date.stamp.toISOString(new Date()); - if(!circStartBox) circStart = null; - - G.user.prefs[PREFS_HOLD_PHONE] = holdsPhone.checked; - G.user.prefs[PREFS_HOLD_EMAIL] = holdsEmail.checked; - G.user.prefs[PREFS_PREDUE_3DAY] = $(PREFS_PREDUE_3DAY).checked; - G.user.prefs[PREFS_OVER_FIRST] = $(PREFS_OVER_FIRST).checked; - G.user.prefs[PREFS_OVER_FIRST_P] = $(PREFS_OVER_FIRST_P).checked; - G.user.prefs[PREFS_HOLD_EXPIRE] = $(PREFS_HOLD_EXPIRE).checked; - G.user.prefs[PREFS_HOLD_CANCEL] = $(PREFS_HOLD_CANCEL).checked; - //G.user.prefs[PREFS_CIRC_HIST_AGE] = "2592000"; - G.user.prefs[PREFS_CIRC_HIST_START] = circStart; - - if( $('myopac_pref_home_lib').checked == true ) - G.user.prefs[PREF_DEF_LOCATION] = null; - else - G.user.prefs[PREF_DEF_LOCATION] = getSelectorVal($('prefs_def_location')); - - try { - if(commitUserPrefs()) - alert($('prefs_update_success').innerHTML); - else alert($('prefs_update_failure').innerHTML); - } catch(e) { - alert(e); - } - fieldmapper.standardRequest(FETCH_CHECKED_HISTORY,{params:[G.user.session, G.user.id()],oncomplete:function(r){ - var resp = r.recv(); - if(resp) resp = resp.content(); - }}); -} - -function myOPACUpdateEmail() { - var email = $('myopac_new_email').value; - if(email == null || email == "") { - alert($('myopac_email_error').innerHTML); - return; - } - - var req = new Request(UPDATE_EMAIL, G.user.session, email ); - req.send(true); - if(req.result()) { - //G.user.email(email); - // force re-fetch to pick up latest last_xact_id - grabUser(null, true); - hideMe($('myopac_update_email_row')); - userShown = false; - alertId('myopac_email_success'); - myOPACShowUser(true); - - // user got here after trying to make a payment then deciding - // the email addr needed updating. take the user back to the - // in-progress payment form - if(myopacReturnToPayment) { - myopacReturnToPayment = false; - myOPACChangePage("summary"); - $('myopac-cc-email').innerHTML = email; - } - return; - } - - alert($('myopac_email_failure').innerHTML); -} - -function myOPACUpdatePassword() { - var curpassword = $('myopac_current_password').value; - var password = $('myopac_new_password').value; - var password2 = $('myopac_new_password2').value; - - if( curpassword == null || curpassword == "" || - password == null || password == "" || - password2 == null || password2 == "" || password != password2 ) { - alert($('myopac_password_error').innerHTML); - return; - } - - if(!strongPassword(password, true)) return; - - var req = new Request(UPDATE_PASSWORD, G.user.session, password, curpassword ); - req.send(true); - if(req.result()) { - grabUser(null, true); - hideMe($('myopac_update_password_row')); - userShown = false; - alertId('myopac_password_success'); - myOPACShowUser(true); - return; - } - - alert($('myopac_password_failure').innerHTML); -} - -function myOPACUpdatePhone(which) { - if(!which) return; - var tr = $('myopac_update_phone'+which+'_row'); - var input = $('myopac_new_phone'+which); - if(!tr || !input) return; - var val = input.value; - if(!val.match(REGEX_PHONE)) { - alert("Not a valid phone number. Should be in the form ###-###-####"); - input.focus(); - input.select(); - return; - } - - var newUser = fleshedUser.clone(true); - switch(which) { - case "1": newUser.day_phone(val); break; - case "2": newUser.evening_phone(val); break; - case "3": newUser.other_phone(val); break; - } - - newUser.ischanged("t"); - var resp = fieldmapper.standardRequest(['open-ils.actor', 'open-ils.actor.patron.update'], {async:false, params:[G.user.session, newUser]}); - if(typeof(resp.desc)=="undefined") { - hideMe(tr); - userShown = false; - fleshedUser = resp; - alert("Phone number updated successfully."); - myOPACShowUser(true); - } else { - alert(resp.textcode+'\n'+resp.desc); - input.focus(); - input.select(); - } -} - -function myOPACUpdateUsername() { - var username = $('myopac_new_username').value; - if(username == null || username == "") { - alert($('myopac_username_error').innerHTML); - return; - } - - if( username.match(/.*\s.*/) ) { - alert($('myopac_invalid_username').innerHTML); - return; - } - - r = fetchOrgSettingDefault(globalOrgTree.id(), 'opac.barcode_regex'); - if(r) REGEX_BARCODE = new RegExp(r); - - if(username.match(REGEX_BARCODE)) { - alert($('myopac_invalid_username').innerHTML); - return; - } - - /* first see if the requested username is taken */ - var req = new Request(CHECK_USERNAME, G.user.session, username); - req.send(true); - var res = req.result(); - if( res !== null && res != G.user.id() ) { - alertId('myopac_username_dup'); - return; - } - - var req = new Request(UPDATE_USERNAME, G.user.session, username ); - req.send(true); - if(req.result()) { - - var evt; - var res = req.result(); - if(evt = checkILSEvent(res)) { - alertILSEvent(res); - return; - } - - grabUser(null, true); - hideMe($('myopac_update_username_row')); - userShown = false; - alertId('myopac_username_success'); - myOPACShowUser(true); - return; - } - - alert($('myopac_username_failure').innerHTML); -} - -function iForgotMyPassword(un,email) { - if(!un) return; - //var type = un.match(/^\d+$/)?'barcode':'username'; - fieldmapper.standardRequest(PASS_RESET,{params:['barcode',un,email],oncomplete:function(rr){ - var resp = rr.recv().content(); - if(resp.textcode=="ACTOR_USER_NOT_FOUND") fieldmapper.standardRequest(PASS_RESET,{params:['username',un,email],oncomplete:function(r){ - var resp2 = r.recv().content(); - if(resp2.textcode) alert(resp2.textcode+'\n'+resp2.desc); - else { alert("Password reset request sent successfully."); unHideMe($('login_box'));hideMe($('forget_pw')); } - }}); else { - if(resp.textcode) alert(resp.textcode+'\n'+resp.desc); - else { alert("Password reset request sent successfully."); unHideMe($('login_box'));hideMe($('forget_pw')); } - } - }}); -} - -function myOPACShowBookbags(force) { - if(anonListCache.length) drawAnonLists(force); else hideMe($('acct_list_template2')); - var wrapper = $('acct_lists_prime'); - if(!containerTemplate) containerTemplate = wrapper.removeChild($('acct_list_template')); else if(!force) return; - if(!wrapper) return; - - var containers = containerFetchAll(); - - var found = false; - for(var i in containers) { - found = true; - var cont = containers[i]; - fleshedContainers[cont.id()] = cont; - var temp = containerTemplate.cloneNode(true); - var title = $n(temp, 'list_name'); - var share = $n(temp, 'share_list_link'); - var rem = $n(temp, 'remove_list'); - if(!title || !share || !rem) continue; - - title.appendChild(text(cont.name())); - share.onclick = myListAction; - share.listID = cont.id(); - rem.value='delete'; - rem.onclick = myListAction; - rem.listID = cont.id(); - temp.setAttribute("id",temp.id + '_' + cont.id()); - - if(containers.length>1) { - var sel = $n(temp, 'list_actions'); - var optg = elem('optgroup', {label:'Move Items to'}); - for(var n in containers) { - var cont2 = containers[n]; - if(cont2.id()==cont.id()) continue; - var opt = elem('option', {value:'move', container:cont2.id()}, cont2.name()); - optg.appendChild(opt); - } - sel.appendChild(optg); - } - - if(isTrue(cont.pub())) { - share.value='hide'; - share.innerHTML = 'Un-share'; - share.title=''; - var link = $n(temp,'share_list_rss'); - link.setAttribute('href', buildExtrasLink( 'feed/bookbag/rss2-full/'+cont.id(), false)); - unHideMe(link); - } else { - share.value='share'; - share.title = 'Sharing this bookbag will allow the contents of the bookbag to be seen by others.' - share.innerHTML = 'Share'; - } - - wrapper.appendChild(temp); - // grab container items after adding each list to the page - fieldmapper.standardRequest(FETCH_CONTAINER_DETAILS,{params:[G.user.session, 'biblio', cont.id()],oncomplete:drawListItemRows}); - } - - if(!found) wrapper.appendChild(elem("div",{style:"font-weight:bold;text-align:center;font-size:14px;"},"You have not created any lists")); - - var anonSel = $('sel_all_list_anon'); - if(!anonSel) return; - var optg2 = elem('optgroup', {label:'Move Items to', id:'anon_list_grp'}); - for(var t in containers) { - var cont3 = containers[t]; - var opt2 = elem('option', {value:'move', container:cont3.id()}, cont3.name()); - optg2.appendChild(opt2); - } - anonSel.appendChild(optg2); -} - -function drawAnonLists() { - var cont = $('acct_list_template2'); - var bibs = fieldmapper.standardRequest(FETCH_MODS_SLIM, {async:false, params:[anonListCache]}); - - var tbody = $('anon_list_tbody'); - for(var i in bibs) { - var it = bibs[i]; - var tr = elem('tr'); - var td1 = elem('td',{style:'padding-right:5px;'},it.title()); - var td2 = elem('td',{width:'1'}); - var el = elem('input',{type:'checkbox', name:'list_action_chbx', recordid:it.doc_id()+'', doc_id:it.doc_id()+'', listID:'anon'}); - el.className = "list_action_chbx"; - el.name="list_action_chbx"; - td2.appendChild(el); - tr.appendChild(td2); - tr.appendChild(td1); - tbody.appendChild(tr); - } - unHideMe(cont); -} - -function drawListItemRows(r) { - var fleshed = r.recv().content(); - if(!fleshed) return; - var modsArr = []; - - var temp = $('acct_list_template_'+fleshed.id()); - if(!temp) return; - var tbody = $n(temp,'list_tbody'); - if(!tbody) return; - var items = fleshed.items(); - - for(var i=0; i 0.00) { - var bal = $('myopac_sum_fines_bal'); - bal.style.color = "red"; - appendClear(bal,text("$"+balance2)); - unHideMe($('myopac_sum_fines')); - unHideMe($('myopac_sum_fines_slim')); - unHideMe($('pay_fines_btn')); - if(!r.__showing) - showFinesDiv($('show_fines_link')); - } - - appendClear($('myopac_fines_summary_total'), text(total)); - appendClear($('myopac_fines_summary_paid'), text(paid)); - appendClear($('myopac_fines_summary_balance'), text(balance)); -} - -function _finesFormatNumber(num) { - if(isNull(num)) num = 0; - num = num + ""; - if(num.length < 2 || !num.match(/\./)) num += ".00"; - if(num.match(/\./) && num.charAt(num.length-2) == '.') num += "0"; - return num; -} - -function _trimTime(time) { - if(!time) return ""; - var d = dojo.date.stamp.fromISOString(time); - if(!d) return ""; /* date parse failed */ - return d.iso8601Format('YMD'); -} - -function _trimSeconds(time) { - if(!time) return ""; - var d = dojo.date.stamp.fromISOString(time); - if(!d) return ""; /* date parse failed */ - return d.iso8601Format('YMDHM',null,true,true); -} - -function myOPACShowTransactions(r) { - var transactions = r.getResultObject(); - - if(!myopacGenericTransTemplate) myopacGenericTransTemplate = $('myopac_trans_tbody').removeChild($('myopac_trans_row')); - if(!myopacCircTransTemplate) myopacCircTransTemplate = $('myopac_circ_trans_tbody').removeChild($('myopac_circ_trans_row')); - removeChildren($('myopac_trans_tbody')); - removeChildren($('myopac_circ_trans_tbody')); - transCache = []; - - transactions = transactions.sort( - function(a, b) { - if(a.transaction.xact_start() < b.transaction.xact_start()) - return 1; - else return -1; - } - ); - - for( var idx in transactions ) { - var trans = transactions[idx].transaction; - var record = transactions[idx].record; - var circ = transactions[idx].circ; - transCache[trans.id()] = transactions[idx]; - - if(trans.xact_type() == 'circulation') myOPACShowCircTransaction(trans, record, circ); - else if(trans.xact_type() == 'grocery') myopacShowGenericTransaction( trans ); - } -} - -// for toggling between payments and fines tabs -function showFinesTab() { - hideMe($("myopac_payments_div")); - unHideMe($("pay-fines-image")); - unHideMe($("myopac_trans_div")); - unHideMe($("myopac_circ_trans_div")); - $('acct_fines_tab').style.background="url('/opac/skin/kcls/graphics/acct_fines_on.jpg') no-repeat bottom"; - $('acct_payments_tab').style.background="url('/opac/skin/kcls/graphics/acct_payments_off.jpg') no-repeat bottom"; -} - -var paymentsDrawn = false; -function myopacDrawPayments() { - - unHideMe($("myopac_payments_div")); - hideMe($("myopac_circ_trans_div")); - hideMe($("myopac_trans_div")); - hideMe($("pay-fines-image")); - $('acct_fines_tab').style.background="url('/opac/skin/kcls/graphics/acct_fines_off.jpg') no-repeat bottom"; - $('acct_payments_tab').style.background="url('/opac/skin/kcls/graphics/acct_payments_on.jpg') no-repeat bottom"; - - if(paymentsDrawn) return; - paymentsDrawn = true; - - var before = new Date() - before.setFullYear(before.getFullYear() - 1); - // KCLS limits payment history view to 1 year. This will eventually be expanded - // out to a history view page, but for now, just fetch what's needed. - var req = new Request( - 'open-ils.actor:open-ils.actor.user.payments.retrieve', - G.user.session, G.user.id(), - {"where":{"payment_ts":{">=":dojo.date.stamp.toISOString(before)}}}); - - req.callback(_myopacDrawPayments); - req.send(); -} - -function _myopacDrawPayments(r) { - - var payments = r.getResultObject(); - var tbody = $('myopac_payments_tbody'); - rowTmpl = tbody.removeChild($('myopac_payments_tmpl')); - - dojo.forEach(payments, - function(payment) { - var row = rowTmpl.cloneNode(true); - $n(row, 'date').innerHTML = dojo.date.locale.format( - dojo.date.stamp.fromISOString(payment.mp.payment_ts()), - {selector:'date', fullYear: true} - ); - $n(row, 'for').innerHTML = (payment.title) ? payment.title : payment.last_billing_type; - $n(row, 'amount').innerHTML += Number(payment.mp.amount()).toFixed(2); - if(payment.mp.payment_type() == 'credit_card_payment') { - $n(row, 'print_recpt').onclick = function () { printPaymentReceipt([payment.mp.id()]) }; - $n(row, 'email_recpt').onclick = function () { emailPaymentReceipt([payment.mp.id()]) }; - } else { - $n(row, 'print_recpt').parentNode.style.visibility = 'hidden'; - } - tbody.appendChild(row); - } - ); -} - -function emailPaymentReceipt(paymentIds, callback) { - - if(!G.user.email()) { - if(callback) callback(); - return; - } - - progressDialog.show(true); - - fieldmapper.standardRequest( - ['open-ils.circ', 'open-ils.circ.money.payment_receipt.email'], - { - async : true, - params : [G.user.session, paymentIds], - oncomplete : function(r) { - progressDialog.hide(); - openils.Util.readResponse(r); - if(callback) callback(); - } - } - ); -} - -function dateFromISO(d) { - if(!d) return ''; - return dojo.date.locale.format( - dojo.date.stamp.fromISOString(d), - {selector:'date', fullYear: true} - ); -} - -function myopacShowGenericTransaction( trans ) { - var tbody = $('myopac_trans_tbody'); - - var row = myopacGenericTransTemplate.cloneNode(true); - $n(row,'myopac_trans_start').appendChild(text(dateFromISO(trans.xact_start()))); - $n(row,'myopac_trans_last_payment').appendChild(text(dateFromISO(trans.last_payment_ts()))); - $n(row,'myopac_trans_init_amount').appendChild(text(_finesFormatNumber(trans.total_owed()))); - $n(row,'myopac_trans_total_paid').appendChild(text(_finesFormatNumber(trans.total_paid()))); - $n(row,'myopac_trans_balance').appendChild(text(_finesFormatNumber(trans.balance_owed()))); - $n(row,'selector').balance_owed = trans.balance_owed(); - $n(row,'selector').setAttribute("xact", trans.id()); - - var req = new Request(FETCH_MONEY_BILLING, G.user.session, trans.id()); - req.send(true); - var bills = req.result(); - if(bills && bills[0]) $n(row,'myopac_trans_bill_type').appendChild(text(bills[0].billing_type())); - - tbody.appendChild(row); - unHideMe($('myopac_trans_div')); -} - -function myOPACShowCircTransaction(trans, record, circ) { - var tbody = $('myopac_circ_trans_tbody'); - - var row = myopacCircTransTemplate.cloneNode(true); - if(record) { - buildTitleDetailLink(record, $n(row,'myopac_circ_trans_title')); - $n(row,'myopac_circ_trans_author').appendChild(text(normalize(truncate(record.author(), 65)))); - } else { - var req = new Request( FETCH_COPY, circ.target_copy() ); - req.alertEvents = false; - req.send(true); - var copy = req.result(); - if( copy ) { - $n(row,'myopac_circ_trans_title').appendChild(text(copy.dummy_title())); - $n(row,'myopac_circ_trans_author').appendChild(text(copy.dummy_author())); - } - } - - $n(row,'myopac_circ_trans_start').appendChild(text(dateFromISO(trans.xact_start()))); - - var due = dateFromISO(circ.due_date()); - var checkin = dateFromISO(circ.stop_fines_time()); - - $n(row,'myopac_circ_trans_due').appendChild(text(due)) - if(checkin) appendClear($n(row,'myopac_circ_trans_finished'), text(checkin)); - if(circ.stop_fines() == 'LOST') appendClear($n(row,'myopac_circ_trans_finished'), text(circ.stop_fines())); - if(circ.stop_fines() == 'CLAIMSRETURNED') appendClear($n(row,'myopac_circ_trans_finished'), text("")); - $n(row,'myopac_circ_trans_balance').appendChild(text(_finesFormatNumber(trans.balance_owed()))); - $n(row,'selector').balance_owed = trans.balance_owed(); - $n(row,'selector').setAttribute("xact",trans.id()); - - tbody.appendChild(row); - unHideMe($('myopac_circ_trans_div')); -} - -function showFinesDiv(el) { - if(!el) return; - if($('myopac_fines_div').className.indexOf('hide_me')>=0) { - unHideMe($('myopac_fines_div')); - el.innerHTML="Hide Overdue Materials"; - if(!finesShown) { - myOPACShowFines(true); - } - } else { - hideMe($('myopac_fines_div')); - el.innerHTML="Show Overdue Materials"; - } -} - -var ecom_event_map = { - CREDIT_PROCESSOR_DECLINED_TRANSACTION : - 'Sorry. Your payment has been declined. Please confirm your information is entered correctly or contact your credit card company.', - CREDIT_PROCESSOR_INVALID_CC_NUMBER : - 'The credit card number entered is not valid. Please confirm your information is entered correctly or contact your credit card company.', - SUCCESS : 'Your payment has been approved' -} - -function showPaymentForm() { - unHideMe($('pay_fines_now')); - hideMe($('acct_sum')); - hideMe($('cc-payment-error-message')); - drawPayFinesPage( - G.user, - getSelectedFinesTotal(), - getSelectedFineTransactions(), - function(resp) { - unHideMe($('cc-payment-error-message')); - if(resp.textcode) { - var message = ecom_event_map[resp.textcode] || resp.textcode+'\n'+resp.desc + ''; - $('cc-payment-error-message').innerHTML = message; - return; - } - G.user.last_xact_id(resp.last_xact_id); // update to match latest from server - $('cc-payment-error-message').innerHTML = ecom_event_map.SUCCESS; - printPaymentReceipt(resp.payments); - emailPaymentReceipt(resp.payments); - hideMe($('pay_fines_now'));unHideMe($('acct_sum')); - finesShown = false; - myOPACShowFines(); - showFinesDiv($('show_fines_link')); - } - ); -} - -function getSelectedFinesTotal() { - var total = 0; - dojo.forEach( - dojo.query("[name=selector]", $('myopac_circ_trans_tbody')), - function(input) { if(input.checked && input.getAttribute("xact")) total += Number(input.balance_owed); } - ); - - dojo.forEach( - dojo.query("[name=selector]", $('myopac_trans_tbody')), - function(input) { if(input.checked && input.getAttribute("xact")) total += Number(input.balance_owed); } - ); - return total.toFixed(2); -} - -function getSelectedFineTransactions() { - var set1 = dojo.query("[name=selector]", $('myopac_circ_trans_tbody')). - filter(function (o) { return o.checked }). - map(function (o) {return [o.getAttribute("xact"), Number(o.balance_owed).toFixed(2)];} - ); - var set2 = dojo.query("[name=selector]", $('myopac_trans_tbody')). - filter(function (o) { return o.checked }). - map(function (o) {return [o.getAttribute("xact"), Number(o.balance_owed).toFixed(2)];} - ); - var obj = set1.concat(set2); - return obj.filter(function(el){return el[0]==null?false:true;}); -} - -var payFinesDrawn = false; -function drawPayFinesPage(patron, total, xacts, onPaymentSubmit) { - if (typeof(this.authtoken) == "undefined") - this.authtoken = patron.session; - - dojo.query("span", "oils-selfck-cc-payment-summary")[0].innerHTML = total; - - $('myopac-cc-email').innerHTML = patron.email(); - oilsSelfckCCNumber.attr('value', ''); - oilsSelfckCCCVV.attr('value', ''); - oilsSelfckCCMonth.attr('value', '01'); - oilsSelfckCCYear.attr('value', new Date().getFullYear()); - oilsSelfckCCFName.attr('value', patron.first_given_name()); - oilsSelfckCCLName.attr('value', patron.family_name()); - - var addr = patron.billing_address() || patron.mailing_address(); - - if (typeof(addr) != "object") { - /* still don't have usable address? try getting better user object. */ - fieldmapper.standardRequest( - FETCH_FULL_USER, { - "params": [patron.session, patron.id(), ["billing_address", "mailing_address"]], - "async": false, - "oncomplete": function(r) { - var usr = r.recv().content(); - if (usr) addr = usr.billing_address() || usr.mailing_address(); - } - } - ); - } - - if (addr) { - oilsSelfckCCStreet.attr('value', addr.street1()+' '+addr.street2()); - oilsSelfckCCCity.attr('value', addr.city()); - oilsSelfckCCState.attr('value', addr.state()); - oilsSelfckCCZip.attr('value', addr.post_code()); - } - - dojo.connect(oilsSelfckEditDetails, 'onChange', - function(newVal) { - dojo.forEach( - [oilsSelfckCCFName, oilsSelfckCCLName, oilsSelfckCCStreet, oilsSelfckCCCity, oilsSelfckCCState, oilsSelfckCCZip], - function(dij) { dij.attr('disabled', !newVal); } - ); - } - ); - - if(!payFinesDrawn) { - dojo.connect(oilsSelfckCCSubmit, 'onClick', - function() { - hideMe($('pay_fines_now')); - unHideMe($('pay_fines_confirm')); - - $('pay_fines_confirm_amount').innerHTML = - dojo.query("span", "oils-selfck-cc-payment-summary")[0].innerHTML; - - dojo.connect(payConfirmSubmit, 'onClick', - function() { - if (typeof(progressDialog) != "undefined") progressDialog.show(true); - unHideMe($('pay_fines_now')); - hideMe($('pay_fines_confirm')); - sendCCPayment(patron, xacts, onPaymentSubmit); - } - ); - - dojo.connect(payConfirmCancel, 'onClick', - function() { - unHideMe($('pay_fines_now')); - hideMe($('pay_fines_confirm')); - } - ); - - /* - if(!confirm("Are you sure?")) return; - sendCCPayment(patron, xacts, onPaymentSubmit); - */ - } - ); - payFinesDrawn = true; - } - - var selFines = $('selectedFines'); - removeChildren(selFines); - for(var i in xacts) { - var xact = transCache[xacts[i][0]]; - if(!xact) continue; - var tr = elem('tr'); - var td1 = elem('td', {}, xact["record"]?xact.record.title():xact.transaction.last_billing_type()); - var td2 = elem('td', {'nowrap':'nowrap', 'valign':'top'}, '$'+xact.transaction.balance_owed()); - td2.style.paddingLeft = '5px'; - td2.style.color = 'red'; - tr.appendChild(td1); - tr.appendChild(td2); - selFines.appendChild(tr); - } -} - -function sendCCPayment(patron, xacts, onPaymentSubmit) { - // in this context, patron will always be G.user. set it explicitly - // to pick up the latest last_xact_id value - patron = G.user; - - var args = { - userid : patron.id(), - payment_type : 'credit_card_payment', - payments : xacts, - cc_args : { - where_process : 1, - //type : 'MasterCard',//oilsSelfckCCType.attr('value'), - number : oilsSelfckCCNumber.attr('value'), - cvv2 : oilsSelfckCCCVV.attr('value'), - expire_year : oilsSelfckCCYear.attr('value'), - expire_month : oilsSelfckCCMonth.attr('value'), - billing_first : oilsSelfckCCFName.attr('value'), - billing_last : oilsSelfckCCLName.attr('value'), - billing_address : oilsSelfckCCStreet.attr('value'), - billing_city : oilsSelfckCCCity.attr('value'), - billing_state : oilsSelfckCCState.attr('value'), - billing_zip : oilsSelfckCCZip.attr('value') - } - } - - var resp = fieldmapper.standardRequest(PAY_BILLS,{params : [patron.session, args, patron.last_xact_id()]}); - if (typeof(progressDialog) != "undefined") - progressDialog.hide(); - - if (typeof(onPaymentSubmit) == "function") { - onPaymentSubmit(resp); - } else { - var evt = openils.Event.parse(resp); - if (evt) alert(evt); - } -} - -function myopacSelectedHoldsRows() { - var r = []; - var cb; - var rows = dojo.query('[name=acct_holds_temp]',$("holds_temp_parent")); - for(var i = 0; i < rows.length; i++) { - cb = $n(rows[i], 'check_all_holds'); - if(cb && cb.checked) - r.push(rows[i]); - } - return r; -} - -var myopacProcessedHolds = 0; -var myopacHoldsToProcess = 0; -function myopacDoHoldAction() { - var selectedRows = myopacSelectedHoldsRows(); - var action = getSelectorVal($('acct_holds_actions')); - $('myopac_holds_actions_none').selected = true; - if(selectedRows.length == 0) return; - - myopacProcessedHolds = 0; - - if(!confirmId('myopac.holds.'+action+'.confirm')) return; - //myopacSelectNoneHolds(); /* clear the selection */ - - - /* first, let's collect the holds that actually need processing and - collect the full process count while we're at it */ - var holds = []; - for(var i = 0; i < selectedRows.length; i++) { - var ahold = $n(selectedRows[i],'check_all_holds'); - var hold = holdsCache[holdsCacheMap[ahold.holdid]]; - var qstats = hold.status; - switch(action) { - case 'cancel': - holds.push(hold.hold); - break; - case 'thaw_date': - case 'thaw': - if(isTrue(hold.hold.frozen())) - holds.push(hold.hold); - break; - case 'freeze': - if(!isTrue(hold.hold.frozen()) && qstats < 3) - holds.push(hold.hold); - break; - } - } - - myopacHoldsToProcess = holds; - if(myopacHoldsToProcess.length == 0) return; - - if(action == 'thaw_date' || action == 'freeze') - myopacDrawHoldThawDateForm(); - else - myopacProcessHolds(action); -} - -function myopacDrawHoldThawDateForm() { - hideMe($('myopac_holds_div')); - unHideMe($('myopac_holds_thaw_date_form')); - $('myopac_holds_thaw_date_input').focus(); -} - -function myopacApplyThawDate() { - var dateString = dijit.byId('myopac_holds_thaw_date_input').getValue(); - if(dateString) { - dateString = dojo.date.stamp.toISOString(dateString); - if(dateString) { - dateString = holdsVerifyThawDate(dateString); - if(!dateString) return; - } else { - dateString = null; - } - } - unHideMe($('myopac_holds_div')); - hideMe($('myopac_holds_thaw_date_form')); - myopacProcessHolds('freeze', dateString); -} - - -function myopacProcessHolds(action, thawDate) { - progressDialog.show(true); - // myopacShowHoldProcessing(); - /* now we process them */ - for(var i = 0; i < myopacHoldsToProcess.length; i++) { - var hold = myopacHoldsToProcess[i]; - - var req; - switch(action) { - - case 'cancel': - req = new Request(CANCEL_HOLD, G.user.session, hold.id()); - break; - - case 'thaw': - hold.frozen('f'); - hold.thaw_date(null); - req = new Request(UPDATE_HOLD, G.user.session, hold); - break; - - case 'thaw_date': - case 'freeze': - hold.frozen('t'); - hold.thaw_date(thawDate); - req = new Request(UPDATE_HOLD, G.user.session, hold); - break; - //thawDate = prompt($('myopac.holds.freeze.select_thaw').innerHTML); - - } - - req.callback(myopacBatchHoldCallback); - req.send(); - req = null; - } -} - -function myopacBatchHoldCallback(r) { - var res = r.getResultObject(); - myopacHoldsToProcess = grep(myopacHoldsToProcess, function(i) { return (i.id() != res); }); - if(!myopacHoldsToProcess || ++myopacProcessedHolds >= myopacHoldsToProcess.length) { - //alert(res); - progressDialog.hide(); - myopacForceHoldsRedraw = true; - $('check_all_holds').checked = false; - drawHoldsPage(); - } -} - -function myOPACRenewSelected() { - var rows = dojo.query('input[name=check_all_checked]',$('checked_temp_parent')).filter(function(n,i){ return n.checked; }); - __renew_circs = []; - if(!rows.length || !confirm($('myopac_renew_confirm').innerHTML)) return; - __success_count = 0; - __fail_count = 0; - - for( var i = 0; i < rows.length; i++ ) { - var row = rows[i]; - var circ_id = row.getAttribute('circid'); - - var circ; - for( var j = 0; j != itemsOutCache.length; j++ ) - if(itemsOutCache[j].circ.id() == circ_id) - circ = itemsOutCache[j].circ; - - __renew_circs.push(circ); - } - - if( __renew_circs.length == 0 ) return; - - //unHideMe($('my_renewing')); - //moClearCheckedTable(); - - for( var i = 0; i < __renew_circs.length; i++ ) { - var circ = __renew_circs[i]; - moRenewCirc( circ.target_copy(), G.user.id(), circ ); - } -} - -var __renew_circs = []; -var __rewnew_errors = []; -var __success_count = 0; -var __fail_count = 0; -function moRenewCirc(copy_id, user_id, circ) { - - _debug('renewing circ ' + circ.id() + ' with copy ' + copy_id); - var req = new Request(RENEW_CIRC, G.user.session, - { patron : user_id, - copyid : copy_id, - opac_renewal : 1 - } - ); - - req.request.alertEvent = false; - req.callback(myHandleRenewResponse); - req.request.circ = circ; - req.send(); -} - -/* handles the circ renew results */ - -function myHandleRenewResponse(r) { - try{ var res = r.getResultObject(); } catch(e){ alert("Renew Error\n\n"+e); __renew_circs = []; __rewnew_errors = []; return; } - var circ = r.circ; - - /* remove this circ from the list of circs to renew */ - if(checkILSEvent(res) || checkILSEvent(res[0])) { - var str1 = truncate(mvrObjCache[circ.target_copy()].title(),65)+'\n'; - if(res.ilsevent) str1 += res.ilsevent+': '+res.desc+'\n'; else for(var i in res) str1 += res[i].ilsevent+': '+res[i].desc+'\n'; - __rewnew_errors[circ.id()] = str1; - } - __renew_circs = grep(__renew_circs, function(i) { return (i.id() != circ.id()); }); - _debug("handling renew result for " + circ.id()); - - if(checkILSEvent(res) || checkILSEvent(res[0])) __fail_count++; - //alertIdText('myopac_renew_fail', __circ_titles[circ.id()]); - else __success_count++; - - if(__renew_circs) return; /* more to come */ - __renew_circs = []; - - var str = ""; - if(__success_count) str+= __success_count+" items renewed successfully"; - if(__fail_count) str+=__fail_count+" items did not renew."; - str+='\n\n'; - for(var i in __rewnew_errors) str+=__rewnew_errors[i]+'\n'; - - if(__success_count || __fail_count) alert(str); - __rewnew_errors = []; - - //if( __success_count > 0 ) - // alertIdText('myopac_renew_success', __success_count); - - hideMe($('my_renewing')); - checkedDrawn = false; - drawCheckedPage(); - $('check_all_checked').checked = false; -} - - -function moveToNewList(parent, dest) { - if(!parent || !dest) return; - - var items = dojo.query('input[name=list_action_chbx]', parent); - if(!items.length) items = dojo.query('.list_action_chbx', parent); - items.filter(function(item, index, arr){return item.checked;},this); - - if(items.length) { - for(var i=0; iget998dValue(imgFormatCache[b.hold.id()])?-1:1; - }); - break; - case "title": - holdsCache = holdsCache.sort(function(a, b) { - if(sortOrder) return a.mvr.title()b.mvr.title()?-1:1; - }); - break; - case "pickup": - holdsCache = holdsCache.sort(function(a, b) { - if(sortOrder) return findOrgUnit(a.hold.pickup_lib()).name()findOrgUnit(b.hold.pickup_lib()).name()?-1:1; - }); - break; - case "author": - holdsCache = holdsCache.sort(function(a, b) { - if(sortOrder) return a.mvr.author()b.mvr.author()?-1:1; - }); - break; - case "status": - if(sortOrder) { - drawHoldsPage(true); - return; - } else { - holdsCache = holdsCache.sort(function(a, b) { - if(a.status==4) return 1; - if(b.status==4) return -1; - if(isTrue(a.hold.frozen())) return -1; - if(isTrue(b.hold.frozen())) return 1; - return dojo.date.stamp.fromISOString(a.hold.request_time()) > dojo.date.stamp.fromISOString(b.hold.request_time())?-1:1; - }); - } - } - - drawHoldsPage(false); -} - -function sortChecked(by) { - if(!by) return; - - sortOrder = !sortOrder; - switch(by.toLowerCase()) { - case "title": - itemsOutCache = itemsOutCache.sort(function(a, b) { - if(sortOrder) return a.record.title()b.record.title()?-1:1; - }); - break; - case "author": - itemsOutCache = itemsOutCache.sort(function(a, b) { - if(sortOrder) return a.record.author()b.record.author()?-1:1; - }); - break; - case "due": - if(sortOrder) { - drawCheckedPage(); return; - } else itemsOutCache = itemsOutCache.sort(function(a, b) { - return dojo.date.stamp.fromISOString(a.circ.due_date()) < dojo.date.stamp.fromISOString(b.circ.due_date())?1:-1; - }); - break; - case "barcode": - itemsOutCache = itemsOutCache.sort(function(a, b) { - if(sortOrder) return Number(a.copy.barcode())Number(b.copy.barcode())?-1:1; - }); - break; - case "cn": - itemsOutCache = itemsOutCache.sort(function(a, b) { - if(sortOrder) return callNumCache[a.copy.call_number()]callNumCache[b.copy.call_number()]?-1:1; - }); - break; - case "renews": - itemsOutCache = itemsOutCache.sort(function(a, b) { - if(sortOrder) return Number(a.circ.renewal_remaining())Number(b.circ.renewal_remaining())?-1:1; - }); - break; - } - - drawCheckedPage(false); -} - -function sortCheckedHist(by) { - if(!by) return; - - sortOrder = !sortOrder; - switch(by.toLowerCase()) { - case "title": - itemsOutHistory = itemsOutHistory.sort(function(a, b) { - if(mvrObjCache[a.circ.target_copy()].title()==null) return 1; - if(mvrObjCache[b.circ.target_copy()].title()==null) return -1; - if(sortOrder) return mvrObjCache[a.circ.target_copy()].title().toLowerCase()mvrObjCache[b.circ.target_copy()].title().toLowerCase()?-1:1; - }); - break; - case "author": - itemsOutHistory = itemsOutHistory.sort(function(a, b) { - if(mvrObjCache[a.circ.target_copy()].author()==null) return 1; - if(mvrObjCache[b.circ.target_copy()].author()==null) return -1; - if(sortOrder) return mvrObjCache[a.circ.target_copy()].author().toLowerCase()mvrObjCache[b.circ.target_copy()].author().toLowerCase()?1:-1; - }); - break; - case "duedate": - if(sortOrder) { - drawCheckedPage(); return; - } else itemsOutHistory = itemsOutHistory.sort(function(a, b) { - return dojo.date.stamp.fromISOString(a.circ.due_date()) < dojo.date.stamp.fromISOString(b.circ.due_date())?1:-1; - }); - break; - case "cn": - itemsOutHistory = itemsOutHistory.sort(function(a, b) { - // ya, i know, but it gets the job done. - if(sortOrder) return callNumCache[copyObjCache[a.circ.target_copy()].call_number()].label().toLowerCase()callNumCache[copyObjCache[b.circ.target_copy()].call_number()].label().toLowerCase()?-1:1; - }); - break; - } - - drawCircHistory(false); -} - -function printData(data, numItems, callback) { - - //unHideMe($('receipt-print-frame-wrapper')); - receiptPrintDialog.show(); - - var frame = window["receipt-frame"]; - frame.document.body.innerHTML = data; - - var cancel = $('receipt-view-print-cancel'); - cancel.onclick = function() { - frame.document.body.innerHTML = ''; - // hideMe($('receipt-print-frame-wrapper')); - receiptPrintDialog.hide(); - } - - $('receipt-view-print-button').onclick = function() { - frame.focus(); - frame.print(); - var sleepTime = 1000; - if(numItems > 0) - sleepTime += (numItems / 2) * 1000; - - setTimeout( - function() { - cancel.onclick(); - if(callback) callback(); // fire optional post-print callback - }, - sleepTime - ); - }; -} - - -function printPaymentReceipt(paymentIds, callback) { - progressDialog.show(true); - - fieldmapper.standardRequest( - ['open-ils.circ', 'open-ils.circ.money.payment_receipt.print'], - { - async : true, - params : [G.user.session, paymentIds], - oncomplete : function(r) { - var resp = openils.Util.readResponse(r); - var output = ""; - if(resp) output = resp.template_output(); - progressDialog.hide(); - if(output) { - printData(output.data(), 1, callback); - } else { - var error = resp.error_output(); - if(error) { - throw new Error("Error creating receipt: " + error.data()); - } else { - throw new Error("No receipt data returned from server"); - } - } - } - } - ); -} - -function printFinesReceipt(callback) { - progressDialog.show(true); - - var params = [ - G.user.session, - G.user.ws_ou(), - null, - 'format.selfcheck.fines', - 'print-on-demand', - [G.user.id()] - ]; - - fieldmapper.standardRequest( - ['open-ils.circ', 'open-ils.circ.fire_user_trigger_events'], - { - async : true, - params : params, - oncomplete : function(r) { - progressDialog.hide(); - var resp = openils.Util.readResponse(r); - var output = resp.template_output(); - if(output) { - printData(output.data(), 240, callback); - } else { - var error = resp.error_output(); - if(error) { - throw new Error("Error creating receipt: " + error.data()); - } else { - throw new Error("No receipt data returned from server"); - } - } - } - } - ); -} - -function buildOrgSelAlt(selector, org, offset, namecol) { - if(!namecol) namecol = 'name'; - if(!showXUL && !isTrue(org.opac_visible())) return; // for some reason, isXUL() is rather slow when used in a decently sized loop. - insertSelectorVal( selector, -1, - org[namecol](), org.id(), null, findOrgDepth(org) - offset ); - var kids = org.children(); - if (kids) { - for( var c = 0; c < kids.length; c++ ) - buildOrgSelAlt( selector, kids[c], offset, namecol); - } -} + +//attachEvt("common", "run", myOPACInit ); +// force init to run after opac_init(); +dojo.addOnLoad(function(){setTimeout(myOPACInit, 0)}); + +attachEvt('common','locationUpdated', myopacReload ); +dojo.require('openils.Util'); + +var FETCH_CONTAINER_DETAILS = ['open-ils.actor','open-ils.actor.container.flesh']; +var FETCH_CHECKED_DETAILS = ['open-ils.circ','open-ils.circ.actor.user.checked_out.atomic']; +var FETCH_CHECKED_HISTORY = ['open-ils.actor','open-ils.actor.history.circ.visible.atomic']; +var FETCH_FAV_SEARCHES = ['open-ils.actor','open-ils.actor.user.saved_search.retrieve']; +var FETCH_HOLD_DETAILS = ['open-ils.circ','open-ils.circ.hold.details.batch.retrieve.atomic']; +var FETCH_MODS_BY_COPY = ['open-ils.search','open-ils.search.biblio.mods_from_copy']; +var FETCH_CALL_NUMBER = ['open-ils.search','open-ils.search.callnumber.retrieve']; +var FETCH_MODS_SLIM = ['open-ils.search','open-ils.search.biblio.record.mods_slim.retrieve']; +var FETCH_FULL_USER = ['open-ils.actor','open-ils.actor.user.fleshed.retrieve']; +var FETCH_HOLD_IDS = ['open-ils.circ','open-ils.circ.holds.id_list.retrieve']; +var FETCH_COPY_OBJ = ['open-ils.search','open-ils.search.asset.copy.retrieve']; +var FETCH_OPT_INS = ['open-ils.actor','open-ils.actor.event_def.opt_in.settings.atomic']; +var FETCH_LISTS = ['open-ils.actor','open-ils.actor.container.flesh']; +var PASS_RESET = ['open-ils.actor','open-ils.actor.patron.password_reset.request']; +var PAY_BILLS = ['open-ils.circ','open-ils.circ.money.payment']; +// number of api calls to run before firing myOPACPostCollect() -- helps make all data available first (avoids having to make sync'd calls) +var TOTAL_CALLS = 6; + +var PREFS_HOLD_PHONE = "notification.hold.pickup.phone"; +var PREFS_HOLD_EMAIL = "notification.hold.pickup.email"; +var PREFS_PREDUE_3DAY = "notification.predue.email"; +var PREFS_OVER_FIRST = "notification.overdue.first.email"; +var PREFS_OVER_FIRST_P = "notification.overdue.first.phone"; +var PREFS_HOLD_EXPIRE = "notification.hold.expire.email"; +var PREFS_HOLD_CANCEL = "notification.hold.cancel.email"; +var PREFS_CIRC_HIST_AGE = "history.circ.retention_age"; +var PREFS_CIRC_HIST_START = "history.circ.retention_start"; + +var listsCache = []; +var holdsCache = []; +var holdsCacheMap = []; +var itemsOutCache = []; +var callNumCache = []; +var favsCache = []; +var copyObjCache = []; +var mvrObjCache = []; +var itemsOutHistory = []; +var userOptIns = []; +var userOptInsMap = []; +var fleshedLists = []; +var imgFormatCache = []; +var transCache = []; +var fleshedContainers = {}; +var subPageObjs = {}; + +var CIRC_HIST_PAGE_LIMIT = 10; +var circHistPage = 0; +var showXUL = false; +var holdsList = null; +var fleshedUser = null; +var allowPendingAddr = false; +var currPage = ""; +var templates = {}; +var containerTemplate; +var containerTemplate2; +var myopacGenericTransTemplate; +var myopacCircTransTemplate; +var addrRowTemplate; +var notesTemplate; +var myopacReturnToPayment = false; + +function myOPACInit() { + if(!(G.user && G.user.session)) { + initLogin(); + } else { + allowPendingAddr = fetchOrgSettingDefault(G.user.home_ou(), 'opac.allow_pending_address'); + if(allowPendingAddr) unHideMe($('myopac_pending_addr_td')); + + unHideMe($('myopac_tabs')); + currPage = "summary"; + holdsList = getCacheValue('saveAnonCache'); + if(holdsList) { currPage = "holds"; swapTabs($('acct_holds')); setCacheValue('saveAnonCache', null); TOTAL_CALLS -= 2; } + var retUrl = getCacheValue('returnURL'); + if(retUrl) { setCacheValue('returnURL', null); setCacheValue('showHoldEditor', {record:retUrl.record, type:retUrl.type}); window.location=retUrl.href; } + + var sel = $('myopac_new_home'); + buildOrgSel(sel, globalOrgTree, 0); + setSelector(sel, G.user.home_ou()); + + switch(new CGI().param('acctpage')) { + case "1": currPage = "summary"; break; + case "2": currPage = "checked"; swapTabs($('acct_checked_out')); break; + case "3": currPage = "holds"; swapTabs($('acct_holds')); break; + case "4": currPage = "prefs"; swapTabs($('acct_prefs')); break; + case "5": currPage = "fines"; swapTabs($('acct_favs')); break; + case "6": currPage = "bookbag"; swapTabs($('acct_lists')); break; + } + + if(!isXUL()) { + unHideMe($('myopac_summary_email_change')); + unHideMe($('myopac_summary_password_change')); + unHideMe($('myopac_summary_username_change')); + } else { + unHideMe($('myopac_summary_phone1_change')); + unHideMe($('myopac_summary_phone2_change')); + unHideMe($('myopac_summary_phone3_change')); + } + + + fieldmapper.standardRequest(FETCH_FULL_USER, {async:true, params:[G.user.session, G.user.id()], + oncomplete:function(r) { + showXUL = isXUL(); + fleshedUser = openils.Util.readResponse(r); + myOPACShowFines(true); + myOPACShowUser(false); + myOPACChangePage(currPage); + myOPACInitTemplates(); + myOPACInitSubpages(); + //myOPACShowBookbags(true); + if(holdsList) doBatchAnonHolds(); + showCanvas(); + } + }); + } +} + +function myopacReload() { + var a = {}; + a[PARAM_LOCATION] = getNewSearchLocation(); + a[PARAM_DEPTH] = getNewSearchDepth(); + hideMe($('canvas_main')); + goTo(buildOPACLink(a, true)); +} + +function myOPACChangePage( page ) { + var s = $("myopac_summary_td"); + var c = $("myopac_checked_td"); + var f = $("myopac_fines_td"); + var h = $("myopac_holds_td"); + var p = $("myopac_prefs_td"); + var b = $('myopac_bookbag_td'); + + var ss = $("myopac_summary_div"); + var cc = $("myopac_checked_div"); + var ff = $("myopac_fines_div"); + var hh = $("myopac_holds_div"); + var pp = $("myopac_prefs_div"); + var bb = $('myopac_bookbag_div'); + + hideMe(ss); + hideMe(cc); hideMe(ff); + hideMe(hh); hideMe(pp); + hideMe(bb); + + if(page != 'prefs') + myopacReturnToPayment = false; + + var oncomplete = null; + + switch( page ) { + case "summary": unHideMe(ss); + if($('show_fines_link').innerHTML=="Hide Overdue Materials") unHideMe(ff); + oncomplete = myOPACDrawSummary; + break; + + case "checked": + unHideMe(cc); + oncomplete = drawCheckedPage; + break; + + case "holds": + unHideMe(hh); + oncomplete = drawHoldsPage; + break; + + case "prefs": + unHideMe(pp); + oncomplete = myOPACShowPrefs; + break; + + case 'bookbag': + unHideMe(bb); + break; + } + currPage = page; + myOPACGrabPageData(page, oncomplete); +} + +var fetchedPages={} +function myOPACGrabPageData(page, oncomplete) { + if(fetchedPages[page]) return; + fetchedPages[page] = true; + + switch(page) { + + case "summary": + oncomplete(); + break; + + case "checked": + + progressDialog.show(true); + fieldmapper.standardRequest(FETCH_CHECKED_DETAILS, {async:true, params:[G.user.session, G.user.id()], + oncomplete:function(r) { + progressDialog.hide(); + itemsOutCache = openils.Util.readResponse(r); + oncomplete(); + } + }); + + break; + + case "holds": + + holdsCache=null; + fieldmapper.standardRequest(FETCH_HOLD_IDS, {async:true, params:[G.user.session, G.user.id()], + oncomplete: function(r) { + oncomplete(false, openils.Util.readResponse(r)); + + /* + var holdids = openils.Util.readResponse(r); + fieldmapper.standardRequest(FETCH_HOLD_DETAILS, {async:true, params:[G.user.session, holdids], + oncomplete: function(rr) { + progressDialog.hide(); + var holds = openils.Util.readResponse(rr); + holdsCache = holds; + setTimeout(function(){oncomplete()}, 150); // give the progress dialog a chance to clear out + oncomplete(); + } + }); + */ + } + }); + + break; + + case "prefs": + fieldmapper.standardRequest(FETCH_OPT_INS, {async:true, params:[G.user.session], + oncomplete:function(r) { + userOptIns = openils.Util.readResponse(r); + for(var i=0; i 0) { + var bal = $('myopac_sum_fines_bal'); + bal.style.color = "red"; + appendClear(bal, text("$" + Number(stats.fines.balance_owed).toFixed(2))); + showFinesDiv($('show_fines_link')); + unHideMe($('pay_fines_btn1')); + unHideMe($('show_fines_link')); + } +} + +function myOPACInitTemplates() { + //holds page + if(!templates.holdsParent) templates.holdsParent = $('holds_temp_parent'); + if(!templates.holdsTemp) templates.holdsTemp = templates.holdsParent.removeChild($('acct_holds_temp')); + //checked out page + if(!templates.checkedParent) templates.checkedParent = $('checked_temp_parent'); + if(!templates.checkedTemp) templates.checkedTemp = templates.checkedParent.removeChild($('acct_checked_temp')); + //checked history page + if(!templates.circHistPar) templates.circHistPar = $('acct_checked_hist_parent'); + if(!templates.circHistTemp) templates.circHistTemp = templates.circHistPar.removeChild($('acct_checked_hist_temp')); +} + +// link-up all the Account sub-pages for switchSubPage() +function myOPACInitSubpages() { + // create a primary object for each page... + subPageObjs.checked = {}; + subPageObjs.holds = {}; + subPageObjs.prefs = {}; + + // ... then create an array for each sub-page + subPageObjs.checked.main = []; + subPageObjs.checked.hist = []; + subPageObjs.holds.main = []; + subPageObjs.holds.hist = []; + subPageObjs.prefs.info = []; + subPageObjs.prefs.notify = []; + subPageObjs.prefs.search = []; + + // add .header to each primary page object and link to the page's blue header bar. + // add ['header'] to each sub-page array and put the text to display + subPageObjs.checked.header = $('acct_checked_header'); + subPageObjs.checked.main['header'] = "Current Items Checked Out"; + subPageObjs.checked.hist['header'] = "Check Out History"; + subPageObjs.checked.main.push($('checked_label')); + subPageObjs.checked.hist.push($('checked_link')); + subPageObjs.checked.main.push($('checked_hist_link')); + subPageObjs.checked.hist.push($('checked_hist_label')); + subPageObjs.checked.main.push($('checked_main')); + subPageObjs.checked.hist.push($('checked_hist')); + + subPageObjs.holds.header = $('acct_holds_header'); + subPageObjs.holds.main['header'] = "Current Items on Hold"; + subPageObjs.holds.hist['header'] = "Holds History"; + subPageObjs.holds.main.push($('holds_label')); + subPageObjs.holds.hist.push($('holds_link')); + subPageObjs.holds.main.push($('holds_hist_link')); + subPageObjs.holds.hist.push($('holds_hist_label')); + subPageObjs.holds.main.push($('holds_main')); + subPageObjs.holds.hist.push($('holds_hist_table')); + + subPageObjs.prefs.header = $('acct_prefs_header'); + subPageObjs.prefs.info['header'] = "Account Information and Preferences"; + subPageObjs.prefs.notify['header'] = "Notification Preferences"; + subPageObjs.prefs.search['header'] = "Search Preferences"; + subPageObjs.prefs.info.push($('prefs_info_lbl')); + subPageObjs.prefs.notify.push($('prefs_info_link')); + subPageObjs.prefs.notify.push($('prefs_notify_lbl')); + subPageObjs.prefs.info.push($('prefs_notify_link')); + subPageObjs.prefs.search.push($('prefs_search_lbl')); + subPageObjs.prefs.info.push($('prefs_search_link')); + subPageObjs.prefs.notify.push($('prefs_search_link')); + subPageObjs.prefs.search.push($('prefs_notify_link')); + subPageObjs.prefs.search.push($('prefs_info_link')); + subPageObjs.prefs.info.push($('acct_info_main')); + subPageObjs.prefs.search.push($('acct_search_main')); + subPageObjs.prefs.notify.push($('acct_notify_main')); + subPageObjs.prefs.notify.push($('acct_prefs_save')); + subPageObjs.prefs.search.push($('acct_prefs_save')); +} + +function fetchAllHolds() { +} + +var myopacForceHoldsRedraw = false; +function drawHoldsPage(sort, holdIds) { + if(sort == undefined) sort = true; + if(!templates.holdsParent || !templates.holdsTemp) return; + var parent = templates.holdsParent; + var temp = templates.holdsTemp; + var holdsReady = 0; + + if(myopacForceHoldsRedraw) { + holdsCache = fieldmapper.standardRequest(FETCH_HOLD_DETAILS, {async:false, params:[G.user.session, + fieldmapper.standardRequest(FETCH_HOLD_IDS, {async:false, params:[G.user.session, G.user.id()]}) + ]}); + } + + if(sort) holdsCache = holdsCache.sort(function(a, b) { + if(a.status==4) return -1; + if(b.status==4) return 1; + if(isTrue(a.hold.frozen())) return 1; + if(isTrue(b.hold.frozen())) return -1; + return dojo.date.stamp.fromISOString(a.hold.request_time()) > dojo.date.stamp.fromISOString(b.hold.request_time())?1:-1; + }); + + function allHoldsFetched() { + holdsCacheMap=[]; + for(var i=0; i
+ + if(hold.status == 4) holdsReady++; + } + allHoldsFetched(); + + } else if(holdIds) { + + holdsCache = []; + var holdsReceived = 0; + + dojo.forEach(holdIds, + function(holdId) { + var row = temp.cloneNode(true); + dojo.style(row, 'visibility', 'hidden'); + parent.appendChild(row); + + //parent.appendChild(elem('tr').appendChild(elem('td', {'colspan':'10'}).appendChild(elem('div', {'style':'position:absolute;'}).appendChild(elem('div', {'style':'position:relative;'}).appendChild(elem('div', {'style':'width:974px;height:1px;background:#dcdbdb;'})))))); + + fieldmapper.standardRequest(FETCH_HOLD_DETAILS, {async:true, params:[G.user.session, [holdId]], + oncomplete: function(rr) { + var hold = openils.Util.readResponse(rr)[0]; + holdsCache.push(hold); + dojo.style(row, 'visibility', 'visible'); + drawOneHold(hold, row, parent); + if(hold.status == 4) holdsReady++; + if(++holdsReceived == holdIds.length) + allHoldsFetched(); + } + }); + } + ); + } +} + +function drawOneHold(h, row, parent) { + var imgTD = null; + var imgEl = null; + var d = null; + var exp_date; + var suffix = ""; + + row.id = "myopac_holds_row_" + h.hold.id(); + var form = $n(row, "myopac_holds_formats"); + form.id = "myopac_holds_form_" + h.hold.id(); + $n(row,'hold_pickup_lib_span').appendChild($('hold_pickup_lib_temp').cloneNode(true)); + + var tree = $n(row,'hold_pickup_lib_sel'); + buildOrgSelAlt(tree, globalOrgTree, 0); + setSelector(tree, h.hold.pickup_lib()); + $n(row,'check_all_holds').holdid = h.hold.id(); + $n(row,'hold_edit_link').setAttribute('href','javascript:editHold('+h.hold.id()+');'); + $n(row,'hold_cancel_link').setAttribute('href','javascript:cancelHold('+h.hold.id()+');'); + $n(row,'hold_save_link').setAttribute('href','javascript:saveHold('+h.hold.id()+');'); + var activeSel = $n(row,'hold_active_sel'); + activeSel.selectedIndex = isTrue(h.hold.frozen())?1:0; + + //var djBox = $n(row,'activate_box').parentNode.parentNode.parentNode; + //djBox.id=djBox.id+h.hold.id(); + //var blah = dojo.query('input',$n(row,'activate_box').parentNode)[0]; + //blah.id = djBox.getAttribute("widgetId")+h.hold.id(); + //$().id = djBox.id+h.hold.id(); + //djBox.setAttribute("widgetId", djBox.getAttribute("widgetId")+h.hold.id()); + + $n(row,'hold_pickup_lib').innerHTML = findOrgUnit(h.hold.pickup_lib()).name(); + $n(row,'hold_active').innerHTML = isTrue(h.hold.frozen())?"Suspended":"Active"; + if(isTrue(h.hold.frozen())) row.style.background="#e5e5e5"; + + if(h.hold.thaw_date()) { + d = dojo.date.stamp.fromISOString(h.hold.thaw_date()); + $n(row, 'activate_date').innerHTML = dojo.date.locale.format(d, {selector: 'date', fullYear: true}); + unHideMe($n(row,'activate_label')); + $n(row,'activate_box').value = dojo.date.locale.format(d, {selector:'date', fullYear: true}); + } + + if(h.hold.expire_time()) { + exp_date = dojo.date.stamp.fromISOString(h.hold.expire_time().replace(/(T\d\d:\d\d:\d\d)([+-]\d\d)(\d)/, "$1$2:$3")) + $n(row, 'hold_expires').innerHTML = dojo.date.locale.format(exp_date, {selector:'date', fullYear: true}); + unHideMe($n(row,'hold_expires_label')); + $n(row,'hold_expires_box').value = dojo.date.locale.format(exp_date, {selector:'date', fullYear: true}); + } + + buildTitleDetailLink(h.mvr, $n(row,'myopac_holds_title_link')); + $n(row,'myopac_holds_title_link').title = h.mvr.title(); + + imgTD = $n(row, "myopac_holds_formats"); + imgEl = elem('img'); + imgEl.className = 'hide_me'; + imgEl.name = 'format_icon_'+h.hold.id(); + imgTD.appendChild(imgEl); + if(imgFormatCache[h.hold.id()]==null) imgFormatCache[h.hold.id()] = getMarcData(h.mvr.doc_id(),"998","d"); + setFormatIcon(imgEl, imgFormatCache[h.hold.id()]); + + $n(row,'myopac_holds_author').innerHTML = h.mvr.author(); + + if( h.status == 4) { + $n(row,'acct_holds_status').innerHTML = "Ready for Pickup"; + hideMe($n(row,'holds_editor_row')); + unHideMe($n(row,'holds_ready_row')); + if(h.hold.shelf_expire_time()) $n(row,'hold_ready_expire').innerHTML = + dojo.date.locale.format(dojo.date.stamp.fromISOString(h.hold.shelf_expire_time()), {selector:'date', fullYear: true});; + } else { + var num = h.queue_position+''; + suffix = (num.charAt(num.length-1)=="1")?"st":(num.charAt(num.length-1)=="2")?"nd":(num.charAt(num.length-1)=="3")?"rd":"th"; + if(num=="11" || num=="12" || num=="13") suffix = "th"; + $n(row,'acct_holds_status').innerHTML = h.queue_position+suffix+" hold on "+h.potential_copies+" circulating cop"+(h.potential_copies==1?"y":"ies"); + } +} + +var checkedDrawn = true; +function drawCheckedPage(sort) { + if(sort==undefined) sort = true; + if(!templates.checkedParent || !templates.checkedTemp) return; + var parent = templates.checkedParent; + var temp = templates.checkedTemp; + + if(!checkedDrawn) itemsOutCache = fieldmapper.standardRequest(FETCH_CHECKED_DETAILS, {async:false, params:[G.user.session, G.user.id()]}); + if(sort) itemsOutCache = itemsOutCache.sort(function(a, b) { + if(dojo.date.stamp.fromISOString(a.circ.due_date()) > dojo.date.stamp.fromISOString(b.circ.due_date())) return 1; + return -1; + }); + checkedDrawn = true; + + removeChildren(parent); + for(var i in itemsOutCache) { + var row = temp.cloneNode(true); + var out = itemsOutCache[i]; + //row.id = "myopac_holds_row_" + out.hold.id(); + if(!mvrObjCache[out.circ.target_copy()]) mvrObjCache[out.circ.target_copy()] = out.record; + if(!copyObjCache[out.copy.id()]) copyObjCache[out.copy.id()] = out.copy; + + if(out.circ.due_date()) { + var exp_date = dojo.date.stamp.fromISOString(out.circ.due_date()); + if(exp_date<(new Date())) $n(row,'due_date').style.color="red"; + $n(row, 'due_date').innerHTML = dojo.date.locale.format(exp_date, {selector:'date', fullYear: true}); + } + + $n(row, 'renewals').innerHTML = out.circ.renewal_remaining(); + buildTitleDetailLink(out.record, $n(row,'title')); + if(out.record.author()) $n(row, 'author').appendChild(text(" / "+out.record.author())); + dojo.attr($n(row, 'check_all_checked'), 'circid', out.circ.id()) + $n(row,'title').title = out.record.title(); + $n(row, 'barcode').innerHTML = out.copy.barcode(); + if(callNumCache[out.copy.call_number()]==null) callNumCache[out.copy.call_number()] = fieldmapper.standardRequest(FETCH_CALL_NUMBER, {async:false, params:[out.copy.call_number()]}); + $n(row, 'call_number').innerHTML = callNumCache[out.copy.call_number()].label(); + + parent.appendChild(row); + } + + if(!itemsOutCache.length) parent.appendChild(elem('div',{style:"font-weight:bold;font-size:14px;width:100%;text-align:center;",align:'center'},'No items checked out.')); +} + +var circHistDrawn = true; +function drawCircHistory(sort, offset) { + if(sort==undefined) sort = true; + if(offset==undefined) offset = circHistPage; else circHistPage = offset; + if(!templates.circHistPar || !templates.circHistTemp) return; + var parent = templates.circHistPar; + var temp = templates.circHistTemp; + + if(!circHistDrawn) itemsOutHistory = fieldmapper.standardRequest(FETCH_CHECKED_HISTORY, {async:false, params:[G.user.session, G.user.id(), {'limit':CIRC_HIST_PAGE_LIMIT, 'offset':offset}]}); + circHistDrawn = true; + + removeChildren(parent); + for(var i in itemsOutHistory) { + var row = temp.cloneNode(true); + var h = itemsOutHistory[i]; + if(mvrObjCache[h.circ.target_copy()]==null) mvrObjCache[h.circ.target_copy()] = fieldmapper.standardRequest(FETCH_MODS_BY_COPY, {async:false, params:[h.circ.target_copy()]}); + var mvr = mvrObjCache[h.circ.target_copy()]; + + if(mvr && !mvr.desc) { + buildTitleDetailLink(mvr, $n(row, 'title')); + $n(row, 'title').title = mvr.title(); + $n(row, 'author').innerHTML = mvr.author(); + + //dojo.date.locale.format(dojo.date.stamp.fromISOString(), {selector:'date', fullYear: true}); + } + + //date formatting and coloring + var ret = $n(row, 'returned'); + var due = $n(row, 'due_date'); + $n(row, 'checkout').innerHTML = dojo.date.locale.format(dojo.date.stamp.fromISOString(h.circ.create_time()), {selector:'date', fullYear: true}); + due.innerHTML = dojo.date.locale.format(dojo.date.stamp.fromISOString(h.circ.due_date()), {selector:'date', fullYear: true}); + if(!h.circ.checkin_time() && new Date() > dojo.date.stamp.fromISOString(h.circ.due_date())) due.style.color="red"; + if(h.circ.checkin_time() && dojo.date.stamp.fromISOString(h.circ.checkin_time()) > dojo.date.stamp.fromISOString(h.circ.due_date())) ret.style.color="red"; + if(h.circ.checkin_time()) ret.innerHTML = dojo.date.locale.format(dojo.date.stamp.fromISOString(h.circ.checkin_time()), {selector:'date', fullYear: true}); + else ret.innerHTML = "Checked Out"; + + if(copyObjCache[h.circ.target_copy()]==null) copyObjCache[h.circ.target_copy()] = fieldmapper.standardRequest(FETCH_COPY_OBJ, {async:false, params:[h.circ.target_copy()]}); + if(callNumCache[copyObjCache[h.circ.target_copy()].call_number()]==null) + callNumCache[copyObjCache[h.circ.target_copy()].call_number()] = fieldmapper.standardRequest(FETCH_CALL_NUMBER, {async:false, params:[copyObjCache[h.circ.target_copy()].call_number()]}); + + if(copyObjCache[h.circ.target_copy()] && callNumCache[copyObjCache[h.circ.target_copy()].call_number()]) + $n(row,'call_number').innerHTML = callNumCache[copyObjCache[h.circ.target_copy()].call_number()].label(); + parent.appendChild(row); + } + + if(!itemsOutHistory.length) { + parent.appendChild(elem('tr').appendChild(elem('td',{style:"font-weight:bold;font-size:14px;width:100%;text-align:center;",align:'center'},'No items found.'))); + return; + } + + //build pagination + var pageTR = elem('tr'); + var pageTD = elem('td', {'align':'center', 'colspan':'5'}, null); + + var offPrev = offset - CIRC_HIST_PAGE_LIMIT; + var offNext = offset + CIRC_HIST_PAGE_LIMIT; + if(offset==0) offPrev = 0; + + if(offset!=0) var prev = elem('a', {'href':'javascript: circHistDrawn = false; drawCircHistory(true,'+offPrev+');'}, '< Previous'); + else var prev = elem('span', null, '< Previous'); + if(itemsOutHistory.length'); + else var next = elem('a', {'href':'javascript: circHistDrawn = false; drawCircHistory(true,'+offNext+');'}, 'Next >'); + + pageTD.appendChild(prev); + pageTD.appendChild(elem('span', null, ' ')); + pageTD.appendChild(next); + pageTR.appendChild(pageTD); + parent.appendChild(pageTR); +} + +function myOPACShowPrefs() { + grabUserPrefs(); + myOPACShowHitsPer(); + myOPACShowDefFont(); + myOPACShowDefLocation(); + myOPACShowNotifyPrefs(); + hideMe($('myopac_prefs_loading')); +} + +var defSearchLocationDrawn = false; +var defDepthIndex = 0; +function myOPACShowDefLocation() { + + var selector = $('prefs_def_location'); + var rsel = $('prefs_def_range'); + + if(!defSearchLocationDrawn) { + defSearchLocationDrawn = true; + var org = G.user.prefs[PREF_DEF_LOCATION]; + + if(!org) { + $('myopac_pref_home_lib').checked = true; + $('prefs_def_location').disabled = true; + org = G.user.home_ou(); + } + buildOrgSel(selector, globalOrgTree, 0); + + globalOrgTypes = globalOrgTypes.sort( + function(a, b) { + if( a.depth() < b.depth() ) return -1; + return 1; + } + ); + + iterate(globalOrgTypes, + function(t) { + if( t.depth() <= findOrgDepth(org) ) { + setSelectorVal(rsel, defDepthIndex++, t.opac_label(), t.depth()); + if( t.depth() == findOrgDepth(org)) + setSelector(rsel, t.depth()); + } + } + ); + } + + setSelector(selector, org); +} + +function myOPACShowNotifyPrefs() { + var preEmail = $(PREFS_PREDUE_3DAY); + var overEmail = $(PREFS_OVER_FIRST); + var overPhone = $(PREFS_OVER_FIRST_P); + var holdsCancel = $(PREFS_HOLD_CANCEL); + var holdsExpire = $(PREFS_HOLD_EXPIRE); + var holdsEmail = $("opac.hold_notify.email"); + var holdsPhone = $("opac.hold_notify.phone"); + if(G.user.prefs[PREFS_CIRC_HIST_START]) { $('circHistStart').checked = true; } + + if(preEmail && typeof(G.user.prefs[PREFS_PREDUE_3DAY]) !="undefined") preEmail.checked = G.user.prefs[PREFS_PREDUE_3DAY]; + if(overEmail && typeof(G.user.prefs[PREFS_OVER_FIRST]) !="undefined") overEmail.checked = G.user.prefs[PREFS_OVER_FIRST]; + if(overPhone && typeof(G.user.prefs[PREFS_OVER_FIRST_P]) !="undefined") overPhone.checked = G.user.prefs[PREFS_OVER_FIRST_P]; + if(holdsCancel && typeof(G.user.prefs[PREFS_HOLD_CANCEL])!="undefined") holdsCancel.checked = G.user.prefs[PREFS_HOLD_CANCEL]; + if(holdsExpire && typeof(G.user.prefs[PREFS_HOLD_EXPIRE])!="undefined") holdsExpire.checked = G.user.prefs[PREFS_HOLD_EXPIRE]; + if(holdsPhone && typeof(G.user.prefs[PREFS_HOLD_PHONE]) !="undefined") holdsPhone.checked = G.user.prefs[PREFS_HOLD_PHONE]; + if(holdsEmail && typeof(G.user.prefs[PREFS_HOLD_EMAIL]) !="undefined") holdsEmail.checked = G.user.prefs[PREFS_HOLD_EMAIL]; +} + +function myOPACShowHitsPer() { + var hits = 10; + if(G.user.prefs[PREF_HITS_PER]) + hits = G.user.prefs[PREF_HITS_PER]; + var hitsSel = $('prefs_hits_per'); + setSelector(hitsSel, hits); +} + +function myOPACShowDefFont() { + var font; + if(G.user.prefs[PREF_DEF_FONT]) + font = G.user.prefs[PREF_DEF_FONT]; + else font = "regular"; + setSelector($('prefs_def_font'), font); +} + +function myOPACShowUser(bool) { + if(bool) fleshedUser = fieldmapper.standardRequest(FETCH_FULL_USER, {async:false, params:[G.user.session, G.user.id()]}); + var user = fleshedUser; + + var expireDate = dojo.date.stamp.fromISOString(user.expire_date()); + if( expireDate < new Date() ) { + appendClear($('myopac.expired.date'), expireDate.iso8601Format('YMD')); + unHideMe($('myopac.expired.alert')); + } + + var iv1 = user.ident_value()+''; + if (iv1.length > 4 && iv1.match(/\d{4}/)) iv1 = iv1.substring(0,4) + '***********'; + + appendClear($('myopac_sum_name'),text(user.first_given_name()+" "+(user.family_name()==null?"":user.family_name()))); + appendClear($('myopac_summary_prefix'),text(user.first_given_name()+" "+(user.family_name()==null?"":user.family_name()))); + appendClear($('myopac_summary_homelib'),text(findOrgUnit(user.home_ou()).name())); + + appendClear($('myopac_summary_dayphone'),text(user.day_phone())); + appendClear($('myopac_summary_eveningphone'),text(user.evening_phone())); + appendClear($('myopac_summary_otherphone'),text(user.other_phone())); + appendClear($('myopac_summary_suffix'),text(user.suffix())); + appendClear($('myopac_summary_username'),text(user.usrname())); + appendClear($('myopac_summary_email'),text(user.email())); + appendClear($('myopac_summary_barcode'),text(user.card().barcode())); + appendClear($('myopac_summary_ident1'),text(iv1)); + appendClear($('myopac_summary_create_date'),text(_trimTime(user.create_date()))); + + var req = new Request( + FETCH_USER_NOTES, G.user.session, {pub:1, patronid:G.user.id()}); + req.callback(myopacDrawNotes); + req.send(); + + var tbody = $('myopac_addr_tbody'); + var template; + + if(addrRowTemplate) { + template = addrRowTemplate; + } else { + template = tbody.removeChild($('myopac_addr_row')); + addrRowTemplate = template; + } + removeChildren(tbody); + + var addrs = user.addresses(); + for( var a in addrs ) { + var addr = addrs[a]; + if(!allowPendingAddr && isTrue(addr.pending())) + continue; + if(addr.replaces() != null) continue; + var row = template.cloneNode(true); + myOPACDrawAddr(row, addr, addrs); + tbody.appendChild(row); + } +} + +function myopacDrawNotes(r) { + var notes = r.getResultObject(); + var tbody = $('myopac.notes.tbody'); + if(!notesTemplate) + notesTemplate = tbody.removeChild($('myopac.notes.tr')); + removeChildren(tbody); + + iterate(notes, + function(note) { + unHideMe($('myopac.notes.div')); + var row = notesTemplate.cloneNode(true); + $n(row, 'title').appendChild(text(note.title())); + $n(row, 'value').appendChild(text(note.value())); + tbody.appendChild(row); + } + ); +} + +function myOPACDrawAddr(row, addr, addrs) { + appendClear($n(row, 'myopac_addr_type'),text(addr.address_type())); + appendClear($n(row, 'myopac_addr_street'),text(addr.street1())); + appendClear($n(row, 'myopac_addr_street2'),text(addr.street2())); + appendClear($n(row, 'myopac_addr_city'),text(addr.city())); + appendClear($n(row, 'myopac_addr_county'),text(addr.county())); + appendClear($n(row, 'myopac_addr_state'),text(addr.state())); + appendClear($n(row, 'myopac_addr_country'),text(addr.country())); + appendClear($n(row, 'myopac_addr_zip'),text(addr.post_code())); + + if(!allowPendingAddr) return; + + $n(row, 'myopac_addr_edit_link').onclick = function(){myopacEditAddress(addr)}; + unHideMe($n(row, 'myopac_addr_edit_td')); + + /* if we have a replacement address, plop it into the table next to this addr */ + var repl = grep(addrs, function(a) { return a.replaces() == addr.id(); }); + + $n(row, 'myopac_pending_addr_td').id = 'myopac_pending_addr_td_' + addr.id(); + + if(repl) { + hideMe($n(row, 'myopac_addr_edit_td')); // hide the edit link + repl = repl[0]; + myopacSetAddrInputs(row, repl); + } +} + +function myopacEditAddress(addr) { + var td = $('myopac_pending_addr_td_' + addr.id()); + var row = td.parentNode; + myopacSetAddrInputs(row, addr); +} + +function myopacSetAddrInputs(row, addr, prefix) { + unHideMe($n(row, 'myopac_pending_addr_td')); + $n(row, 'myopac_pending_addr_type').value = addr.address_type(); + $n(row, 'myopac_pending_addr_street').value = addr.street1(); + $n(row, 'myopac_pending_addr_street2').value = addr.street2(); + $n(row, 'myopac_pending_addr_city').value = addr.city(); + $n(row, 'myopac_pending_addr_county').value = addr.county(); + $n(row, 'myopac_pending_addr_state').value = addr.state(); + $n(row, 'myopac_pending_addr_country').value = addr.country(); + $n(row, 'myopac_pending_addr_zip').value = addr.post_code(); + $n(row, 'myopac_pending_addr_edit_link').onclick = function(){myopacSaveAddress(row, addr)}; + $n(row, 'myopac_pending_addr_del_link').onclick = function(){myopacSaveAddress(row, addr, true)}; +} + +function _trimTime(time) { + if(!time) return ""; + var d = dojo.date.stamp.fromISOString(time); + if(!d) return ""; /* date parse failed */ + return d.iso8601Format('YMD'); +} + +function _trimSeconds(time) { + if(!time) return ""; + var d = dojo.date.stamp.fromISOString(time); + if(!d) return ""; /* date parse failed */ + return d.iso8601Format('YMDHM',null,true,true); +} + +function myopacSaveAddress(row, addr, deleteMe) { + if(addr.replaces() == null) { + var repl = new aua(); + repl.usr(addr.usr()); + 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; + } + + if(deleteMe) { + if(addr.id() == null) { + hideMe($n(row, 'myopac_pending_addr_td')); + return; + } + addr.isdeleted(true); + } else { + addr.address_type($n(row, 'myopac_pending_addr_type').value); + addr.street1($n(row, 'myopac_pending_addr_street').value); + addr.street2($n(row, 'myopac_pending_addr_street2').value); + addr.city($n(row, 'myopac_pending_addr_city').value); + addr.county($n(row, 'myopac_pending_addr_county').value); + addr.state($n(row, 'myopac_pending_addr_state').value); + addr.country($n(row, 'myopac_pending_addr_country').value); + addr.post_code($n(row, 'myopac_pending_addr_zip').value); + } + + var req = new Request('open-ils.actor:open-ils.actor.user.address.pending.cud', G.user.session, addr); + + req.callback( + function(r) { + var resp = r.getResultObject(); + + if(addr.isnew()) { + // new, add to list of addrs + addr.id(resp); + fleshedUser.addresses().push(addr); + } else { + // deleted, remove from list of addrs + if(addr.isdeleted()) { + hideMe($n(row, 'myopac_pending_addr_td')); + var addrs = []; + for(var i in fleshedUser.addresses()) { + var a = fleshedUser.addresses()[i]; + if(a.id() != addr.id()) addrs.push(a); + } + fleshedUser.addresses(addrs); + } + } + alertId('myopac_addr_changes_saved'); + } + ); + req.send(); +} + +function myOPACSavePrefs() { + G.user.prefs[PREF_HITS_PER] = getSelectorVal($('prefs_hits_per')); + G.user.prefs[PREF_DEF_FONT] = getSelectorVal($('prefs_def_font')); + G.user.prefs[PREF_DEF_DEPTH] = getSelectorVal($('prefs_def_range')); + + var holdsPhone = $("opac.hold_notify.phone"); + var holdsEmail = $("opac.hold_notify.email"); + var circStartBox = $('circHistStart').checked; + var circStart = null; + circStart = (circStartBox && G.user.prefs[PREFS_CIRC_HIST_START])?G.user.prefs[PREFS_CIRC_HIST_START]:dojo.date.stamp.toISOString(new Date()); + if(!circStartBox) circStart = null; + + G.user.prefs[PREFS_HOLD_PHONE] = holdsPhone.checked; + G.user.prefs[PREFS_HOLD_EMAIL] = holdsEmail.checked; + G.user.prefs[PREFS_PREDUE_3DAY] = $(PREFS_PREDUE_3DAY).checked; + G.user.prefs[PREFS_OVER_FIRST] = $(PREFS_OVER_FIRST).checked; + G.user.prefs[PREFS_OVER_FIRST_P] = $(PREFS_OVER_FIRST_P).checked; + G.user.prefs[PREFS_HOLD_EXPIRE] = $(PREFS_HOLD_EXPIRE).checked; + G.user.prefs[PREFS_HOLD_CANCEL] = $(PREFS_HOLD_CANCEL).checked; + //G.user.prefs[PREFS_CIRC_HIST_AGE] = "2592000"; + G.user.prefs[PREFS_CIRC_HIST_START] = circStart; + + if( $('myopac_pref_home_lib').checked == true ) + G.user.prefs[PREF_DEF_LOCATION] = null; + else + G.user.prefs[PREF_DEF_LOCATION] = getSelectorVal($('prefs_def_location')); + + try { + if(commitUserPrefs()) + alert($('prefs_update_success').innerHTML); + else alert($('prefs_update_failure').innerHTML); + } catch(e) { + alert(e); + } + fieldmapper.standardRequest(FETCH_CHECKED_HISTORY,{params:[G.user.session, G.user.id()],oncomplete:function(r){ + var resp = r.recv(); + if(resp) resp = resp.content(); + }}); +} + +function myOPACUpdateEmail() { + var email = $('myopac_new_email').value; + if(email == null || email == "") { + alert($('myopac_email_error').innerHTML); + return; + } + + var req = new Request(UPDATE_EMAIL, G.user.session, email ); + req.send(true); + if(req.result()) { + //G.user.email(email); + // force re-fetch to pick up latest last_xact_id + grabUser(null, true); + hideMe($('myopac_update_email_row')); + userShown = false; + alertId('myopac_email_success'); + myOPACShowUser(true); + + // user got here after trying to make a payment then deciding + // the email addr needed updating. take the user back to the + // in-progress payment form + if(myopacReturnToPayment) { + myopacReturnToPayment = false; + myOPACChangePage("summary"); + $('myopac-cc-email').innerHTML = email; + } + return; + } + + alert($('myopac_email_failure').innerHTML); +} + +function myOPACUpdatePassword() { + var curpassword = $('myopac_current_password').value; + var password = $('myopac_new_password').value; + var password2 = $('myopac_new_password2').value; + + if( curpassword == null || curpassword == "" || + password == null || password == "" || + password2 == null || password2 == "" || password != password2 ) { + alert($('myopac_password_error').innerHTML); + return; + } + + if(!strongPassword(password, true)) return; + + var req = new Request(UPDATE_PASSWORD, G.user.session, password, curpassword ); + req.send(true); + if(req.result()) { + grabUser(null, true); + hideMe($('myopac_update_password_row')); + userShown = false; + alertId('myopac_password_success'); + myOPACShowUser(true); + return; + } + + alert($('myopac_password_failure').innerHTML); +} + +function myOPACUpdatePhone(which) { + if(!which) return; + var tr = $('myopac_update_phone'+which+'_row'); + var input = $('myopac_new_phone'+which); + if(!tr || !input) return; + var val = input.value; + if(!val.match(REGEX_PHONE)) { + alert("Not a valid phone number. Should be in the form ###-###-####"); + input.focus(); + input.select(); + return; + } + + var newUser = fleshedUser.clone(true); + switch(which) { + case "1": newUser.day_phone(val); break; + case "2": newUser.evening_phone(val); break; + case "3": newUser.other_phone(val); break; + } + + newUser.ischanged("t"); + var resp = fieldmapper.standardRequest(['open-ils.actor', 'open-ils.actor.patron.update'], {async:false, params:[G.user.session, newUser]}); + if(typeof(resp.desc)=="undefined") { + hideMe(tr); + userShown = false; + fleshedUser = resp; + alert("Phone number updated successfully."); + myOPACShowUser(true); + } else { + alert(resp.textcode+'\n'+resp.desc); + input.focus(); + input.select(); + } +} + +function myOPACUpdateUsername() { + var username = $('myopac_new_username').value; + if(username == null || username == "") { + alert($('myopac_username_error').innerHTML); + return; + } + + if( username.match(/.*\s.*/) ) { + alert($('myopac_invalid_username').innerHTML); + return; + } + + r = fetchOrgSettingDefault(globalOrgTree.id(), 'opac.barcode_regex'); + if(r) REGEX_BARCODE = new RegExp(r); + + if(username.match(REGEX_BARCODE)) { + alert($('myopac_invalid_username').innerHTML); + return; + } + + /* first see if the requested username is taken */ + var req = new Request(CHECK_USERNAME, G.user.session, username); + req.send(true); + var res = req.result(); + if( res !== null && res != G.user.id() ) { + alertId('myopac_username_dup'); + return; + } + + var req = new Request(UPDATE_USERNAME, G.user.session, username ); + req.send(true); + if(req.result()) { + + var evt; + var res = req.result(); + if(evt = checkILSEvent(res)) { + alertILSEvent(res); + return; + } + + grabUser(null, true); + hideMe($('myopac_update_username_row')); + userShown = false; + alertId('myopac_username_success'); + myOPACShowUser(true); + return; + } + + alert($('myopac_username_failure').innerHTML); +} + +function iForgotMyPassword(un,email) { + if(!un) return; + //var type = un.match(/^\d+$/)?'barcode':'username'; + fieldmapper.standardRequest(PASS_RESET,{params:['barcode',un,email],oncomplete:function(rr){ + var resp = rr.recv().content(); + if(resp.textcode=="ACTOR_USER_NOT_FOUND") fieldmapper.standardRequest(PASS_RESET,{params:['username',un,email],oncomplete:function(r){ + var resp2 = r.recv().content(); + if(resp2.textcode) alert(resp2.textcode+'\n'+resp2.desc); + else { alert("Password reset request sent successfully."); unHideMe($('login_box'));hideMe($('forget_pw')); } + }}); else { + if(resp.textcode) alert(resp.textcode+'\n'+resp.desc); + else { alert("Password reset request sent successfully."); unHideMe($('login_box'));hideMe($('forget_pw')); } + } + }}); +} + +function myOPACShowBookbags(force) { + if(anonListCache.length) drawAnonLists(force); else hideMe($('acct_list_template2')); + var wrapper = $('acct_lists_prime'); + if(!containerTemplate) containerTemplate = wrapper.removeChild($('acct_list_template')); else if(!force) return; + if(!wrapper) return; + + var containers = containerFetchAll(); + + var found = false; + for(var i in containers) { + found = true; + var cont = containers[i]; + fleshedContainers[cont.id()] = cont; + var temp = containerTemplate.cloneNode(true); + var title = $n(temp, 'list_name'); + var share = $n(temp, 'share_list_link'); + var rem = $n(temp, 'remove_list'); + if(!title || !share || !rem) continue; + + title.appendChild(text(cont.name())); + share.onclick = myListAction; + share.listID = cont.id(); + rem.value='delete'; + rem.onclick = myListAction; + rem.listID = cont.id(); + temp.setAttribute("id",temp.id + '_' + cont.id()); + + if(containers.length>1) { + var sel = $n(temp, 'list_actions'); + var optg = elem('optgroup', {label:'Move Items to'}); + for(var n in containers) { + var cont2 = containers[n]; + if(cont2.id()==cont.id()) continue; + var opt = elem('option', {value:'move', container:cont2.id()}, cont2.name()); + optg.appendChild(opt); + } + sel.appendChild(optg); + } + + if(isTrue(cont.pub())) { + share.value='hide'; + share.innerHTML = 'Un-share'; + share.title=''; + var link = $n(temp,'share_list_rss'); + link.setAttribute('href', buildExtrasLink( 'feed/bookbag/rss2-full/'+cont.id(), false)); + unHideMe(link); + } else { + share.value='share'; + share.title = 'Sharing this bookbag will allow the contents of the bookbag to be seen by others.' + share.innerHTML = 'Share'; + } + + wrapper.appendChild(temp); + // grab container items after adding each list to the page + fieldmapper.standardRequest(FETCH_CONTAINER_DETAILS,{params:[G.user.session, 'biblio', cont.id()],oncomplete:drawListItemRows}); + } + + if(!found) wrapper.appendChild(elem("div",{style:"font-weight:bold;text-align:center;font-size:14px;"},"You have not created any lists")); + + var anonSel = $('sel_all_list_anon'); + if(!anonSel) return; + var optg2 = elem('optgroup', {label:'Move Items to', id:'anon_list_grp'}); + for(var t in containers) { + var cont3 = containers[t]; + var opt2 = elem('option', {value:'move', container:cont3.id()}, cont3.name()); + optg2.appendChild(opt2); + } + anonSel.appendChild(optg2); +} + +function drawAnonLists() { + var cont = $('acct_list_template2'); + var bibs = fieldmapper.standardRequest(FETCH_MODS_SLIM, {async:false, params:[anonListCache]}); + + var tbody = $('anon_list_tbody'); + for(var i in bibs) { + var it = bibs[i]; + var tr = elem('tr'); + var td1 = elem('td',{style:'padding-right:5px;'},it.title()); + var td2 = elem('td',{width:'1'}); + var el = elem('input',{type:'checkbox', name:'list_action_chbx', recordid:it.doc_id()+'', doc_id:it.doc_id()+'', listID:'anon'}); + el.className = "list_action_chbx"; + el.name="list_action_chbx"; + td2.appendChild(el); + tr.appendChild(td2); + tr.appendChild(td1); + tbody.appendChild(tr); + } + unHideMe(cont); +} + +function drawListItemRows(r) { + var fleshed = r.recv().content(); + if(!fleshed) return; + var modsArr = []; + + var temp = $('acct_list_template_'+fleshed.id()); + if(!temp) return; + var tbody = $n(temp,'list_tbody'); + if(!tbody) return; + var items = fleshed.items(); + + for(var i=0; i 0.00) { + var bal = $('myopac_sum_fines_bal'); + bal.style.color = "red"; + appendClear(bal,text("$"+balance2)); + unHideMe($('myopac_sum_fines')); + unHideMe($('myopac_sum_fines_slim')); + unHideMe($('pay_fines_btn')); + if(!r.__showing) + showFinesDiv($('show_fines_link')); + } + + appendClear($('myopac_fines_summary_total'), text(total)); + appendClear($('myopac_fines_summary_paid'), text(paid)); + appendClear($('myopac_fines_summary_balance'), text(balance)); +} + +function _finesFormatNumber(num) { + if(isNull(num)) num = 0; + num = num + ""; + if(num.length < 2 || !num.match(/\./)) num += ".00"; + if(num.match(/\./) && num.charAt(num.length-2) == '.') num += "0"; + return num; +} + +function _trimTime(time) { + if(!time) return ""; + var d = dojo.date.stamp.fromISOString(time); + if(!d) return ""; /* date parse failed */ + return d.iso8601Format('YMD'); +} + +function _trimSeconds(time) { + if(!time) return ""; + var d = dojo.date.stamp.fromISOString(time); + if(!d) return ""; /* date parse failed */ + return d.iso8601Format('YMDHM',null,true,true); +} + +function myOPACShowTransactions(r) { + var transactions = r.getResultObject(); + + if(!myopacGenericTransTemplate) myopacGenericTransTemplate = $('myopac_trans_tbody').removeChild($('myopac_trans_row')); + if(!myopacCircTransTemplate) myopacCircTransTemplate = $('myopac_circ_trans_tbody').removeChild($('myopac_circ_trans_row')); + removeChildren($('myopac_trans_tbody')); + removeChildren($('myopac_circ_trans_tbody')); + transCache = []; + + transactions = transactions.sort( + function(a, b) { + if(a.transaction.xact_start() < b.transaction.xact_start()) + return 1; + else return -1; + } + ); + + for( var idx in transactions ) { + var trans = transactions[idx].transaction; + var record = transactions[idx].record; + var circ = transactions[idx].circ; + transCache[trans.id()] = transactions[idx]; + + if(trans.xact_type() == 'circulation') myOPACShowCircTransaction(trans, record, circ); + else if(trans.xact_type() == 'grocery') myopacShowGenericTransaction( trans ); + } +} + +// for toggling between payments and fines tabs +function showFinesTab() { + hideMe($("myopac_payments_div")); + unHideMe($("pay-fines-image")); + unHideMe($("myopac_trans_div")); + unHideMe($("myopac_circ_trans_div")); + $('acct_fines_tab').style.background="url('/opac/skin/kcls/graphics/acct_fines_on.jpg') no-repeat bottom"; + $('acct_payments_tab').style.background="url('/opac/skin/kcls/graphics/acct_payments_off.jpg') no-repeat bottom"; +} + +var paymentsDrawn = false; +function myopacDrawPayments() { + + unHideMe($("myopac_payments_div")); + hideMe($("myopac_circ_trans_div")); + hideMe($("myopac_trans_div")); + hideMe($("pay-fines-image")); + $('acct_fines_tab').style.background="url('/opac/skin/kcls/graphics/acct_fines_off.jpg') no-repeat bottom"; + $('acct_payments_tab').style.background="url('/opac/skin/kcls/graphics/acct_payments_on.jpg') no-repeat bottom"; + + if(paymentsDrawn) return; + paymentsDrawn = true; + + var before = new Date() + before.setFullYear(before.getFullYear() - 1); + // KCLS limits payment history view to 1 year. This will eventually be expanded + // out to a history view page, but for now, just fetch what's needed. + var req = new Request( + 'open-ils.actor:open-ils.actor.user.payments.retrieve', + G.user.session, G.user.id(), + {"where":{"payment_ts":{">=":dojo.date.stamp.toISOString(before)}}}); + + req.callback(_myopacDrawPayments); + req.send(); +} + +function _myopacDrawPayments(r) { + + var payments = r.getResultObject(); + var tbody = $('myopac_payments_tbody'); + rowTmpl = tbody.removeChild($('myopac_payments_tmpl')); + + dojo.forEach(payments, + function(payment) { + var row = rowTmpl.cloneNode(true); + $n(row, 'date').innerHTML = dojo.date.locale.format( + dojo.date.stamp.fromISOString(payment.mp.payment_ts()), + {selector:'date', fullYear: true} + ); + $n(row, 'for').innerHTML = (payment.title) ? payment.title : payment.last_billing_type; + $n(row, 'amount').innerHTML += Number(payment.mp.amount()).toFixed(2); + if(payment.mp.payment_type() == 'credit_card_payment') { + $n(row, 'print_recpt').onclick = function () { printPaymentReceipt([payment.mp.id()]) }; + $n(row, 'email_recpt').onclick = function () { emailPaymentReceipt([payment.mp.id()]) }; + } else { + $n(row, 'print_recpt').parentNode.style.visibility = 'hidden'; + } + tbody.appendChild(row); + } + ); +} + +function emailPaymentReceipt(paymentIds, callback) { + + if(!G.user.email()) { + if(callback) callback(); + return; + } + + progressDialog.show(true); + + fieldmapper.standardRequest( + ['open-ils.circ', 'open-ils.circ.money.payment_receipt.email'], + { + async : true, + params : [G.user.session, paymentIds], + oncomplete : function(r) { + progressDialog.hide(); + openils.Util.readResponse(r); + if(callback) callback(); + } + } + ); +} + +function dateFromISO(d) { + if(!d) return ''; + return dojo.date.locale.format( + dojo.date.stamp.fromISOString(d), + {selector:'date', fullYear: true} + ); +} + +function myopacShowGenericTransaction( trans ) { + var tbody = $('myopac_trans_tbody'); + + var row = myopacGenericTransTemplate.cloneNode(true); + $n(row,'myopac_trans_start').appendChild(text(dateFromISO(trans.xact_start()))); + $n(row,'myopac_trans_last_payment').appendChild(text(dateFromISO(trans.last_payment_ts()))); + $n(row,'myopac_trans_init_amount').appendChild(text(_finesFormatNumber(trans.total_owed()))); + $n(row,'myopac_trans_total_paid').appendChild(text(_finesFormatNumber(trans.total_paid()))); + $n(row,'myopac_trans_balance').appendChild(text(_finesFormatNumber(trans.balance_owed()))); + $n(row,'selector').balance_owed = trans.balance_owed(); + $n(row,'selector').setAttribute("xact", trans.id()); + + var req = new Request(FETCH_MONEY_BILLING, G.user.session, trans.id()); + req.send(true); + var bills = req.result(); + if(bills && bills[0]) $n(row,'myopac_trans_bill_type').appendChild(text(bills[0].billing_type())); + + tbody.appendChild(row); + unHideMe($('myopac_trans_div')); +} + +function myOPACShowCircTransaction(trans, record, circ) { + var tbody = $('myopac_circ_trans_tbody'); + + var row = myopacCircTransTemplate.cloneNode(true); + if(record) { + buildTitleDetailLink(record, $n(row,'myopac_circ_trans_title')); + $n(row,'myopac_circ_trans_author').appendChild(text(normalize(truncate(record.author(), 65)))); + } else { + var req = new Request( FETCH_COPY, circ.target_copy() ); + req.alertEvents = false; + req.send(true); + var copy = req.result(); + if( copy ) { + $n(row,'myopac_circ_trans_title').appendChild(text(copy.dummy_title())); + $n(row,'myopac_circ_trans_author').appendChild(text(copy.dummy_author())); + } + } + + $n(row,'myopac_circ_trans_start').appendChild(text(dateFromISO(trans.xact_start()))); + + var due = dateFromISO(circ.due_date()); + var checkin = dateFromISO(circ.stop_fines_time()); + + $n(row,'myopac_circ_trans_due').appendChild(text(due)) + if(checkin) appendClear($n(row,'myopac_circ_trans_finished'), text(checkin)); + if(circ.stop_fines() == 'LOST') appendClear($n(row,'myopac_circ_trans_finished'), text(circ.stop_fines())); + if(circ.stop_fines() == 'CLAIMSRETURNED') appendClear($n(row,'myopac_circ_trans_finished'), text("")); + $n(row,'myopac_circ_trans_balance').appendChild(text(_finesFormatNumber(trans.balance_owed()))); + $n(row,'selector').balance_owed = trans.balance_owed(); + $n(row,'selector').setAttribute("xact",trans.id()); + + tbody.appendChild(row); + unHideMe($('myopac_circ_trans_div')); +} + +function showFinesDiv(el) { + if(!el) return; + if($('myopac_fines_div').className.indexOf('hide_me')>=0) { + unHideMe($('myopac_fines_div')); + el.innerHTML="Hide Overdue Materials"; + if(!finesShown) { + myOPACShowFines(true); + } + } else { + hideMe($('myopac_fines_div')); + el.innerHTML="Show Overdue Materials"; + } +} + +var ecom_event_map = { + CREDIT_PROCESSOR_DECLINED_TRANSACTION : + 'Sorry. Your payment has been declined. Please confirm your information is entered correctly or contact your credit card company.', + CREDIT_PROCESSOR_INVALID_CC_NUMBER : + 'The credit card number entered is not valid. Please confirm your information is entered correctly or contact your credit card company.', + SUCCESS : 'Your payment has been approved' +} + +function showPaymentForm() { + unHideMe($('pay_fines_now')); + hideMe($('acct_sum')); + hideMe($('cc-payment-error-message')); + drawPayFinesPage( + G.user, + getSelectedFinesTotal(), + getSelectedFineTransactions(), + function(resp) { + unHideMe($('cc-payment-error-message')); + if(resp.textcode) { + var message = ecom_event_map[resp.textcode] || resp.textcode+'\n'+resp.desc + ''; + $('cc-payment-error-message').innerHTML = message; + return; + } + G.user.last_xact_id(resp.last_xact_id); // update to match latest from server + $('cc-payment-error-message').innerHTML = ecom_event_map.SUCCESS; + printPaymentReceipt(resp.payments); + emailPaymentReceipt(resp.payments); + hideMe($('pay_fines_now'));unHideMe($('acct_sum')); + finesShown = false; + myOPACShowFines(); + showFinesDiv($('show_fines_link')); + } + ); +} + +function getSelectedFinesTotal() { + var total = 0; + dojo.forEach( + dojo.query("[name=selector]", $('myopac_circ_trans_tbody')), + function(input) { if(input.checked && input.getAttribute("xact")) total += Number(input.balance_owed); } + ); + + dojo.forEach( + dojo.query("[name=selector]", $('myopac_trans_tbody')), + function(input) { if(input.checked && input.getAttribute("xact")) total += Number(input.balance_owed); } + ); + return total.toFixed(2); +} + +function getSelectedFineTransactions() { + var set1 = dojo.query("[name=selector]", $('myopac_circ_trans_tbody')). + filter(function (o) { return o.checked }). + map(function (o) {return [o.getAttribute("xact"), Number(o.balance_owed).toFixed(2)];} + ); + var set2 = dojo.query("[name=selector]", $('myopac_trans_tbody')). + filter(function (o) { return o.checked }). + map(function (o) {return [o.getAttribute("xact"), Number(o.balance_owed).toFixed(2)];} + ); + var obj = set1.concat(set2); + return obj.filter(function(el){return el[0]==null?false:true;}); +} + +var payFinesDrawn = false; +function drawPayFinesPage(patron, total, xacts, onPaymentSubmit) { + if (typeof(this.authtoken) == "undefined") + this.authtoken = patron.session; + + dojo.query("span", "oils-selfck-cc-payment-summary")[0].innerHTML = total; + + $('myopac-cc-email').innerHTML = patron.email(); + oilsSelfckCCNumber.attr('value', ''); + oilsSelfckCCCVV.attr('value', ''); + oilsSelfckCCMonth.attr('value', '01'); + oilsSelfckCCYear.attr('value', new Date().getFullYear()); + oilsSelfckCCFName.attr('value', patron.first_given_name()); + oilsSelfckCCLName.attr('value', patron.family_name()); + + var addr = patron.billing_address() || patron.mailing_address(); + + if (typeof(addr) != "object") { + /* still don't have usable address? try getting better user object. */ + fieldmapper.standardRequest( + FETCH_FULL_USER, { + "params": [patron.session, patron.id(), ["billing_address", "mailing_address"]], + "async": false, + "oncomplete": function(r) { + var usr = r.recv().content(); + if (usr) addr = usr.billing_address() || usr.mailing_address(); + } + } + ); + } + + if (addr) { + oilsSelfckCCStreet.attr('value', addr.street1()+' '+addr.street2()); + oilsSelfckCCCity.attr('value', addr.city()); + oilsSelfckCCState.attr('value', addr.state()); + oilsSelfckCCZip.attr('value', addr.post_code()); + } + + dojo.connect(oilsSelfckEditDetails, 'onChange', + function(newVal) { + dojo.forEach( + [oilsSelfckCCFName, oilsSelfckCCLName, oilsSelfckCCStreet, oilsSelfckCCCity, oilsSelfckCCState, oilsSelfckCCZip], + function(dij) { dij.attr('disabled', !newVal); } + ); + } + ); + + if(!payFinesDrawn) { + dojo.connect(oilsSelfckCCSubmit, 'onClick', + function() { + hideMe($('pay_fines_now')); + unHideMe($('pay_fines_confirm')); + + $('pay_fines_confirm_amount').innerHTML = + dojo.query("span", "oils-selfck-cc-payment-summary")[0].innerHTML; + + dojo.connect(payConfirmSubmit, 'onClick', + function() { + if (typeof(progressDialog) != "undefined") progressDialog.show(true); + unHideMe($('pay_fines_now')); + hideMe($('pay_fines_confirm')); + sendCCPayment(patron, xacts, onPaymentSubmit); + } + ); + + dojo.connect(payConfirmCancel, 'onClick', + function() { + unHideMe($('pay_fines_now')); + hideMe($('pay_fines_confirm')); + } + ); + + /* + if(!confirm("Are you sure?")) return; + sendCCPayment(patron, xacts, onPaymentSubmit); + */ + } + ); + payFinesDrawn = true; + } + + var selFines = $('selectedFines'); + removeChildren(selFines); + for(var i in xacts) { + var xact = transCache[xacts[i][0]]; + if(!xact) continue; + var tr = elem('tr'); + var td1 = elem('td', {}, xact["record"]?xact.record.title():xact.transaction.last_billing_type()); + var td2 = elem('td', {'nowrap':'nowrap', 'valign':'top'}, '$'+xact.transaction.balance_owed()); + td2.style.paddingLeft = '5px'; + td2.style.color = 'red'; + tr.appendChild(td1); + tr.appendChild(td2); + selFines.appendChild(tr); + } +} + +function sendCCPayment(patron, xacts, onPaymentSubmit) { + // in this context, patron will always be G.user. set it explicitly + // to pick up the latest last_xact_id value + patron = G.user; + + var args = { + userid : patron.id(), + payment_type : 'credit_card_payment', + payments : xacts, + cc_args : { + where_process : 1, + //type : 'MasterCard',//oilsSelfckCCType.attr('value'), + number : oilsSelfckCCNumber.attr('value'), + cvv2 : oilsSelfckCCCVV.attr('value'), + expire_year : oilsSelfckCCYear.attr('value'), + expire_month : oilsSelfckCCMonth.attr('value'), + billing_first : oilsSelfckCCFName.attr('value'), + billing_last : oilsSelfckCCLName.attr('value'), + billing_address : oilsSelfckCCStreet.attr('value'), + billing_city : oilsSelfckCCCity.attr('value'), + billing_state : oilsSelfckCCState.attr('value'), + billing_zip : oilsSelfckCCZip.attr('value') + } + } + + var resp = fieldmapper.standardRequest(PAY_BILLS,{params : [patron.session, args, patron.last_xact_id()]}); + if (typeof(progressDialog) != "undefined") + progressDialog.hide(); + + if (typeof(onPaymentSubmit) == "function") { + onPaymentSubmit(resp); + } else { + var evt = openils.Event.parse(resp); + if (evt) alert(evt); + } +} + +function myopacSelectedHoldsRows() { + var r = []; + var cb; + var rows = dojo.query('[name=acct_holds_temp]',$("holds_temp_parent")); + for(var i = 0; i < rows.length; i++) { + cb = $n(rows[i], 'check_all_holds'); + if(cb && cb.checked) + r.push(rows[i]); + } + return r; +} + +var myopacProcessedHolds = 0; +var myopacHoldsToProcess = 0; +function myopacDoHoldAction() { + var selectedRows = myopacSelectedHoldsRows(); + var action = getSelectorVal($('acct_holds_actions')); + $('myopac_holds_actions_none').selected = true; + if(selectedRows.length == 0) return; + + myopacProcessedHolds = 0; + + if(!confirmId('myopac.holds.'+action+'.confirm')) return; + //myopacSelectNoneHolds(); /* clear the selection */ + + + /* first, let's collect the holds that actually need processing and + collect the full process count while we're at it */ + var holds = []; + for(var i = 0; i < selectedRows.length; i++) { + var ahold = $n(selectedRows[i],'check_all_holds'); + var hold = holdsCache[holdsCacheMap[ahold.holdid]]; + var qstats = hold.status; + switch(action) { + case 'cancel': + holds.push(hold.hold); + break; + case 'thaw_date': + case 'thaw': + if(isTrue(hold.hold.frozen())) + holds.push(hold.hold); + break; + case 'freeze': + if(!isTrue(hold.hold.frozen()) && qstats < 3) + holds.push(hold.hold); + break; + } + } + + myopacHoldsToProcess = holds; + if(myopacHoldsToProcess.length == 0) return; + + if(action == 'thaw_date' || action == 'freeze') + myopacDrawHoldThawDateForm(); + else + myopacProcessHolds(action); +} + +function myopacDrawHoldThawDateForm() { + hideMe($('myopac_holds_div')); + unHideMe($('myopac_holds_thaw_date_form')); + $('myopac_holds_thaw_date_input').focus(); +} + +function myopacApplyThawDate() { + var dateString = dijit.byId('myopac_holds_thaw_date_input').getValue(); + if(dateString) { + dateString = dojo.date.stamp.toISOString(dateString); + if(dateString) { + dateString = holdsVerifyThawDate(dateString); + if(!dateString) return; + } else { + dateString = null; + } + } + unHideMe($('myopac_holds_div')); + hideMe($('myopac_holds_thaw_date_form')); + myopacProcessHolds('freeze', dateString); +} + + +function myopacProcessHolds(action, thawDate) { + progressDialog.show(true); + // myopacShowHoldProcessing(); + /* now we process them */ + for(var i = 0; i < myopacHoldsToProcess.length; i++) { + var hold = myopacHoldsToProcess[i]; + + var req; + switch(action) { + + case 'cancel': + req = new Request(CANCEL_HOLD, G.user.session, hold.id()); + break; + + case 'thaw': + hold.frozen('f'); + hold.thaw_date(null); + req = new Request(UPDATE_HOLD, G.user.session, hold); + break; + + case 'thaw_date': + case 'freeze': + hold.frozen('t'); + hold.thaw_date(thawDate); + req = new Request(UPDATE_HOLD, G.user.session, hold); + break; + //thawDate = prompt($('myopac.holds.freeze.select_thaw').innerHTML); + + } + + req.callback(myopacBatchHoldCallback); + req.send(); + req = null; + } +} + +function myopacBatchHoldCallback(r) { + var res = r.getResultObject(); + myopacHoldsToProcess = grep(myopacHoldsToProcess, function(i) { return (i.id() != res); }); + if(!myopacHoldsToProcess || ++myopacProcessedHolds >= myopacHoldsToProcess.length) { + //alert(res); + progressDialog.hide(); + myopacForceHoldsRedraw = true; + $('check_all_holds').checked = false; + drawHoldsPage(); + } +} + +function myOPACRenewSelected() { + var rows = dojo.query('input[name=check_all_checked]',$('checked_temp_parent')).filter(function(n,i){ return n.checked; }); + __renew_circs = []; + if(!rows.length || !confirm($('myopac_renew_confirm').innerHTML)) return; + __success_count = 0; + __fail_count = 0; + + for( var i = 0; i < rows.length; i++ ) { + var row = rows[i]; + var circ_id = row.getAttribute('circid'); + + var circ; + for( var j = 0; j != itemsOutCache.length; j++ ) + if(itemsOutCache[j].circ.id() == circ_id) + circ = itemsOutCache[j].circ; + + __renew_circs.push(circ); + } + + if( __renew_circs.length == 0 ) return; + + //unHideMe($('my_renewing')); + //moClearCheckedTable(); + + for( var i = 0; i < __renew_circs.length; i++ ) { + var circ = __renew_circs[i]; + moRenewCirc( circ.target_copy(), G.user.id(), circ ); + } +} + +var __renew_circs = []; +var __rewnew_errors = []; +var __success_count = 0; +var __fail_count = 0; +function moRenewCirc(copy_id, user_id, circ) { + + _debug('renewing circ ' + circ.id() + ' with copy ' + copy_id); + var req = new Request(RENEW_CIRC, G.user.session, + { patron : user_id, + copyid : copy_id, + opac_renewal : 1 + } + ); + + req.request.alertEvent = false; + req.callback(myHandleRenewResponse); + req.request.circ = circ; + req.send(); +} + +/* handles the circ renew results */ + +function myHandleRenewResponse(r) { + try{ var res = r.getResultObject(); } catch(e){ alert("Renew Error\n\n"+e); __renew_circs = []; __rewnew_errors = []; return; } + var circ = r.circ; + + /* remove this circ from the list of circs to renew */ + if(checkILSEvent(res) || checkILSEvent(res[0])) { + var str1 = truncate(mvrObjCache[circ.target_copy()].title(),65)+'\n'; + if(res.ilsevent) str1 += res.ilsevent+': '+res.desc+'\n'; else for(var i in res) str1 += res[i].ilsevent+': '+res[i].desc+'\n'; + __rewnew_errors[circ.id()] = str1; + } + __renew_circs = grep(__renew_circs, function(i) { return (i.id() != circ.id()); }); + _debug("handling renew result for " + circ.id()); + + if(checkILSEvent(res) || checkILSEvent(res[0])) __fail_count++; + //alertIdText('myopac_renew_fail', __circ_titles[circ.id()]); + else __success_count++; + + if(__renew_circs) return; /* more to come */ + __renew_circs = []; + + var str = ""; + if(__success_count) str+= __success_count+" items renewed successfully"; + if(__fail_count) str+=__fail_count+" items did not renew."; + str+='\n\n'; + for(var i in __rewnew_errors) str+=__rewnew_errors[i]+'\n'; + + if(__success_count || __fail_count) alert(str); + __rewnew_errors = []; + + //if( __success_count > 0 ) + // alertIdText('myopac_renew_success', __success_count); + + hideMe($('my_renewing')); + checkedDrawn = false; + drawCheckedPage(); + $('check_all_checked').checked = false; +} + + +function moveToNewList(parent, dest) { + if(!parent || !dest) return; + + var items = dojo.query('input[name=list_action_chbx]', parent); + if(!items.length) items = dojo.query('.list_action_chbx', parent); + items.filter(function(item, index, arr){return item.checked;},this); + + if(items.length) { + for(var i=0; iget998dValue(imgFormatCache[b.hold.id()])?-1:1; + }); + break; + case "title": + holdsCache = holdsCache.sort(function(a, b) { + if(sortOrder) return a.mvr.title()b.mvr.title()?-1:1; + }); + break; + case "pickup": + holdsCache = holdsCache.sort(function(a, b) { + if(sortOrder) return findOrgUnit(a.hold.pickup_lib()).name()findOrgUnit(b.hold.pickup_lib()).name()?-1:1; + }); + break; + case "author": + holdsCache = holdsCache.sort(function(a, b) { + if(sortOrder) return a.mvr.author()b.mvr.author()?-1:1; + }); + break; + case "status": + if(sortOrder) { + drawHoldsPage(true); + return; + } else { + holdsCache = holdsCache.sort(function(a, b) { + if(a.status==4) return 1; + if(b.status==4) return -1; + if(isTrue(a.hold.frozen())) return -1; + if(isTrue(b.hold.frozen())) return 1; + return dojo.date.stamp.fromISOString(a.hold.request_time()) > dojo.date.stamp.fromISOString(b.hold.request_time())?-1:1; + }); + } + } + + drawHoldsPage(false); +} + +function sortChecked(by) { + if(!by) return; + + sortOrder = !sortOrder; + switch(by.toLowerCase()) { + case "title": + itemsOutCache = itemsOutCache.sort(function(a, b) { + if(sortOrder) return a.record.title()b.record.title()?-1:1; + }); + break; + case "author": + itemsOutCache = itemsOutCache.sort(function(a, b) { + if(sortOrder) return a.record.author()b.record.author()?-1:1; + }); + break; + case "due": + if(sortOrder) { + drawCheckedPage(); return; + } else itemsOutCache = itemsOutCache.sort(function(a, b) { + return dojo.date.stamp.fromISOString(a.circ.due_date()) < dojo.date.stamp.fromISOString(b.circ.due_date())?1:-1; + }); + break; + case "barcode": + itemsOutCache = itemsOutCache.sort(function(a, b) { + if(sortOrder) return Number(a.copy.barcode())Number(b.copy.barcode())?-1:1; + }); + break; + case "cn": + itemsOutCache = itemsOutCache.sort(function(a, b) { + if(sortOrder) return callNumCache[a.copy.call_number()]callNumCache[b.copy.call_number()]?-1:1; + }); + break; + case "renews": + itemsOutCache = itemsOutCache.sort(function(a, b) { + if(sortOrder) return Number(a.circ.renewal_remaining())Number(b.circ.renewal_remaining())?-1:1; + }); + break; + } + + drawCheckedPage(false); +} + +function sortCheckedHist(by) { + if(!by) return; + + sortOrder = !sortOrder; + switch(by.toLowerCase()) { + case "title": + itemsOutHistory = itemsOutHistory.sort(function(a, b) { + if(mvrObjCache[a.circ.target_copy()].title()==null) return 1; + if(mvrObjCache[b.circ.target_copy()].title()==null) return -1; + if(sortOrder) return mvrObjCache[a.circ.target_copy()].title().toLowerCase()mvrObjCache[b.circ.target_copy()].title().toLowerCase()?-1:1; + }); + break; + case "author": + itemsOutHistory = itemsOutHistory.sort(function(a, b) { + if(mvrObjCache[a.circ.target_copy()].author()==null) return 1; + if(mvrObjCache[b.circ.target_copy()].author()==null) return -1; + if(sortOrder) return mvrObjCache[a.circ.target_copy()].author().toLowerCase()mvrObjCache[b.circ.target_copy()].author().toLowerCase()?1:-1; + }); + break; + case "duedate": + if(sortOrder) { + drawCheckedPage(); return; + } else itemsOutHistory = itemsOutHistory.sort(function(a, b) { + return dojo.date.stamp.fromISOString(a.circ.due_date()) < dojo.date.stamp.fromISOString(b.circ.due_date())?1:-1; + }); + break; + case "cn": + itemsOutHistory = itemsOutHistory.sort(function(a, b) { + // ya, i know, but it gets the job done. + if(sortOrder) return callNumCache[copyObjCache[a.circ.target_copy()].call_number()].label().toLowerCase()callNumCache[copyObjCache[b.circ.target_copy()].call_number()].label().toLowerCase()?-1:1; + }); + break; + } + + drawCircHistory(false); +} + +function printData(data, numItems, callback) { + + //unHideMe($('receipt-print-frame-wrapper')); + receiptPrintDialog.show(); + + var frame = window["receipt-frame"]; + frame.document.body.innerHTML = data; + + var cancel = $('receipt-view-print-cancel'); + cancel.onclick = function() { + frame.document.body.innerHTML = ''; + // hideMe($('receipt-print-frame-wrapper')); + receiptPrintDialog.hide(); + } + + $('receipt-view-print-button').onclick = function() { + frame.focus(); + frame.print(); + var sleepTime = 1000; + if(numItems > 0) + sleepTime += (numItems / 2) * 1000; + + setTimeout( + function() { + cancel.onclick(); + if(callback) callback(); // fire optional post-print callback + }, + sleepTime + ); + }; +} + + +function printPaymentReceipt(paymentIds, callback) { + progressDialog.show(true); + + fieldmapper.standardRequest( + ['open-ils.circ', 'open-ils.circ.money.payment_receipt.print'], + { + async : true, + params : [G.user.session, paymentIds], + oncomplete : function(r) { + var resp = openils.Util.readResponse(r); + var output = ""; + if(resp) output = resp.template_output(); + progressDialog.hide(); + if(output) { + printData(output.data(), 1, callback); + } else { + var error = resp.error_output(); + if(error) { + throw new Error("Error creating receipt: " + error.data()); + } else { + throw new Error("No receipt data returned from server"); + } + } + } + } + ); +} + +function printFinesReceipt(callback) { + progressDialog.show(true); + + var params = [ + G.user.session, + G.user.ws_ou(), + null, + 'format.selfcheck.fines', + 'print-on-demand', + [G.user.id()] + ]; + + fieldmapper.standardRequest( + ['open-ils.circ', 'open-ils.circ.fire_user_trigger_events'], + { + async : true, + params : params, + oncomplete : function(r) { + progressDialog.hide(); + var resp = openils.Util.readResponse(r); + var output = resp.template_output(); + if(output) { + printData(output.data(), 240, callback); + } else { + var error = resp.error_output(); + if(error) { + throw new Error("Error creating receipt: " + error.data()); + } else { + throw new Error("No receipt data returned from server"); + } + } + } + } + ); +} + +function buildOrgSelAlt(selector, org, offset, namecol) { + if(!namecol) namecol = 'name'; + if(!showXUL && !isTrue(org.opac_visible())) return; // for some reason, isXUL() is rather slow when used in a decently sized loop. + insertSelectorVal( selector, -1, + org[namecol](), org.id(), null, findOrgDepth(org) - offset ); + var kids = org.children(); + if (kids) { + for( var c = 0; c < kids.length; c++ ) + buildOrgSelAlt( selector, kids[c], offset, namecol); + } +} diff --git a/Open-ILS/web/opac/skin/kcls/js/rdetail.js b/Open-ILS/web/opac/skin/kcls/js/rdetail.js index 22765c3a71..2d00adba05 100644 --- a/Open-ILS/web/opac/skin/kcls/js/rdetail.js +++ b/Open-ILS/web/opac/skin/kcls/js/rdetail.js @@ -1,1484 +1,1484 @@ -/* */ - -if(findCurrentPage()==RDETAIL){ -detachAllEvt('common', 'run'); -attachEvt("common", "run", rdetailDraw); -attachEvt("rdetail", "recordDrawn", rdetailBuildStatusColumns); -attachEvt("rdetail", "recordDrawn", rdetailBuildInfoRows); -attachEvt("rdetail", "recordDrawn", rdetailGetPageIds); - -/* Per-skin configuration settings */ -var rdetailLocalOnly = true; -var rdetailShowLocal = true; -var rdetailShowCopyLocation = true; -var rdetailGoogleBookPreview = false; -var rdetailDisplaySerialHoldings = true; -var rdetailEnableRefWorks = false; -var rdetailRefWorksHost = 'http://www.refworks.com'; - -/* vars vars vars */ -var record = null; -var marc = null; -var cp_statuses = null; -var recordsCache = []; - -var copyRowParent = null; -var copyRow = null; -var statusRow = null; -var numStatuses = null; -var defaultCN; -var callnumberCache = {}; -var globalCNCache = {}; -var localTOC; -var cachedRecords; -var _statusPositions = {}; -var opac_strings; -var copyObjs = []; -var copyObjsCN = []; -var copyObjsCount = 0; - -var nextContainerIndex; - -var nextRecord; -var prevRecord; - -var rdetailPrev = null; -var rdetailNext = null; -var rdetailStart = null; -var rdetailEnd = null; - -if(location.href.match(/&place_hold=1/)) { - // prevent load flicker between canvases - hideMe(dojo.byId('canvas_main')); -} - -/* serials are currently the only use of Dojo strings in the OPAC */ - if (rdetailDisplaySerialHoldings) { - dojo.require("dijit.Menu"); - dojo.require("dijit.form.Button"); - dojo.requireLocalization("openils.opac", "opac"); - opac_strings = dojo.i18n.getLocalization("openils.opac", "opac"); - } -} - -function rdetailReload() { - var args = {}; - args[PARAM_LOCATION] = getNewSearchLocation(); - args[PARAM_DEPTH] = depthSelGetDepth(); - goTo(buildOPACLink(args)); -} - -/* looks to see if we have a next and/or previous record in the - record cache, if so, set up the nav links */ -function rdetailSetPaging(ids) { - - cachedRecords = {}; - cachedRecords.ids = ids; - - for( var i = 0; i < cachedRecords.ids.length; i++ ) { - var rec = cachedRecords.ids[i]; - if( rec == getRid() ) { - if( i > 0 ) prevRecord = cachedRecords.ids[i-1]; - if( i < cachedRecords.ids.length - 1 ) - nextRecord = cachedRecords.ids[i+1]; - break; - } - } - - $('np_offset').appendChild(text(i + 1)); - $('np_count').appendChild(text(getHitCount())); - - if(prevRecord) { - //unHideMe($('np_table')); - unHideMe($('rdetail_result_count')); - unHideMe($('np_prev')); - unHideMe($('np_start')); - rdetailPrev = function() { _rdetailNav(prevRecord); }; - rdetailStart = function() { _rdetailNav(cachedRecords.ids[0]); }; - } - - if(nextRecord) { - //unHideMe($('np_table')); - unHideMe($('rdetail_result_count')); - unHideMe($('np_next')); - unHideMe($('np_end')); - rdetailNext = function() { _rdetailNav(nextRecord); }; - rdetailEnd = function() { _rdetailNav(cachedRecords.ids[cachedRecords.ids.length-1]); }; - } - - runEvt('rdetail', 'nextPrevDrawn', i, cachedRecords.ids.length); -} - - -function _rdetailNav(id, offset) { - var args = {}; - args[PARAM_RID] = id; - goTo(buildOPACLink(args)); -} - -function rdetailHandlePlaceHold() { - function reload() { - location.href = location.href.replace(/&place_hold=1/, ''); - } - attachEvt("common", "holdUpdated", reload); - attachEvt("common", "holdUpdateCanceled", reload); - attachEvt("common", "loginCanceled", reload); - holdsDrawEditor({record:getRid(), type: 'T'}); -} - -function ridPreDraw() { - if(isInAnonList(parseInt(getRid()))) { - var mylist = $('add_mylist'); - mylist.innerHTML = 'Remove from my list'; - mylist.title = 'Remove from my list'; - } - - record = new mvr(); - record.doc_id(getRid()); - - fieldmapper.standardRequest(["open-ils.search","open-ils.search.biblio.record.copy_count"], {'params':[getLocation(), getRid(), getForm()], 'oncomplete':drawCopyCounts}); -} - -function rdetailDraw() { - if(new CGI().param('place_hold')) { - rdetailHandlePlaceHold(); - return; - } - - detachAllEvt('common','depthChanged'); - detachAllEvt('common','locationUpdated'); - attachEvt('common','depthChanged', rdetailReload); - attachEvt('common','locationUpdated', rdetailReload); - attachEvt('common','holdUpdated', rdetailReload); - attachEvt('common','holdUpdateCanceled', rdetailReload); - - copyRowParent = G.ui.rdetail.cp_info_row.parentNode; - copyRow = copyRowParent.removeChild(G.ui.rdetail.cp_info_row); - statusRow = G.ui.rdetail.cp_status.parentNode; - statusRow.id = '__rdsrow'; - - G.ui.rdetail.cp_info_local.onclick = rdetailShowLocalCopies; - G.ui.rdetail.cp_info_all.onclick = rdetailShowAllCopies; - - $('rdetail_place_hold').onclick = function() { - var src = location.href; - if(forceLoginSSL && src.match(/^http:/)) { - src = src.replace(/^http:/, 'https:'); - if(!src.match(/&place_hold=1/)) { - src += '&place_hold=1'; - } - location.href = src; - } else { - holdsDrawEditor({record:record.doc_id(), type:'T'}); - } - } - - if(getLocation() == globalOrgTree.id()) - hideMe(G.ui.rdetail.cp_info_all); - - if(getRid()) { - ridPreDraw(); - marc = new MarcRecord(getRid()); - drawMarcData(); - //var req = new Request(FETCH_RMODS, getRid()); - //req.callback(_rdetailDraw); - //req.send(); - - } else { // No record ID was specified - - // If we have an ISBN in the URL, let's try to find that record - // This allows direct linking by ISBN. - // Note, this uses the first record it finds - if(getRtype() == RTYPE_ISBN) { - var req = fieldmapper.standardRequest(['open-ils.search','open-ils.search.biblio.isbn'], {'params':[getAdvTerm()]}); - if(req && req.count > 0) RID = req.ids[0]; - ridPreDraw(); - marc = new MarcRecord(getRid()); - drawMarcData(); - //var req2 = new Request(FETCH_RMODS, getRid()); - //req2.callback(_rdetailDraw); - //req2.send(); - } - } - - var isbn = cleanISBN(marc.marcObj["020"] ? marc.marcObj["020"][0]["a"][0] : (marc.marcObj["024"]?marc.marcObj["024"][0]["a"][0]:"0")); - $('rdetail_image').src = buildISBNSrc(isbn); - $('rdetail_img_link').href = buildISBNSrc(isbn, "large"); - unHideMe($('rdetail_img_link')); - - $('content_cafe_summary').src="http://contentcafe2.btol.com/ContentCafeClient/ContentCafe.aspx?UserID=KC72927&Password=CC14647&ItemKey="+isbn+"&Options=Y"; - // ChiliFresh - if (chilifresh && chilifresh != '(none)' && isbn) { - $('chilifreshReviewLink').setAttribute('id','isbn_'+isbn); - $('chilifreshReviewResult').setAttribute('id','chili_review_'+isbn); - try { - chili_init(); - unHideMe($('rdetail_awards_link')); - unHideMe($('rdetail_chilifresh_reviews')); - unHideMe($('rdetail_chilifresh_lbl')); - } catch(E) { - alert(E + '\n'); - } - } - - // Novelist - if (novelist && isbn) { - unHideMe($('rdetail_awards_link')); - unHideMe($('rdetail_novelist_lbl')); - unHideMe($('rdetail_novelist_div')); - var isbnEl = elem("div",null,"ISBN "+isbn); - isbnEl.className = "hide_me"; - document.body.appendChild(isbnEl); - } - - fieldmapper.standardRequest(["open-ils.search","open-ils.search.biblio.copy_counts.summary.retrieve"], {"async":true, "params":[getRid()], "oncomplete":function(r){ - var res = []; if(r) res = r.recv(); if(res) res = res.content(); - for(var i in res) { - copyObjsCN[res[i][0]] = res[i][1]; - fieldmapper.standardRequest(["open-ils.search", "open-ils.search.asset.copy.retrieve_by_cn_label"], {"async":true, "params":[getRid(), res[i][1], res[i][0]], "oncomplete":getCopyIDs}); - } - }}); - -runEvt("rdetail", "recordDrawn"); - - if (rdetailDisplaySerialHoldings) { - var req = new Request(FETCH_MFHD_SUMMARY, getRid()); - req.callback(_holdingsDraw); - req.send(); - if (isXUL()) { - var here = findOrgUnit(getLocation()); - dojo.place("
", "rdetail_details_table", "after"); - var mfhd_add = new dijit.Menu({style:"float: right;"}); - new dijit.MenuItem({onClick:function(){ - var req = new Request(CREATE_MFHD_RECORD, G.user.session, 1, here.id(), getRid()); - var res = req.send(); - alert(dojo.string.substitute(opac_strings.CREATED_MFHD_RECORD, [here.name()])); - }, label:opac_strings.CREATE_MFHD}).placeAt(mfhd_add); - mfhd_add.placeAt('mfhd_ad_menu'); - } - } - - detachAllEvt("result", "idsReceived"); - G.evt.result.hitCountReceived = []; - G.evt.result.recordReceived = []; - G.evt.result.copyCountsReceived = []; - G.evt.result.allRecordsReceived = []; - //unHideMe($('rdetail_copy_info_link')); -} - -function getCopyIDs(r) { - var res = []; if(r) res = r.recv(); if(res) res = res.content(); - copyObjsCount += res.length; - if(res.length) fieldmapper.standardRequest(["open-ils.search", "open-ils.search.asset.copy.fleshed.batch.retrieve"], {"async":true, "params":[res], "oncomplete":getCopyObjs}); -} - -function getCopyObjs(r) { - var res = []; if(r) res = r.recv(); if(res) res = res.content(); - if(res.length) copyObjs = copyObjs.concat(res); - if(copyObjs.length >= copyObjsCount) drawCopyStatusDetails(); -} - -function drawCopyStatusDetails() { - var tehTR = $('rdetails_status_head'); - if(!tehTR) return; - var showLibCount = 5; - - if(getOrigLocation()) copyObjs.sort(function(a,b) { - if(a.circ_lib().id()==getOrigLocation()) return -1; - if(b.circ_lib().id()==getOrigLocation()) return 1; - return a.circ_lib().name().toLowerCase()>=b.circ_lib().name().toLowerCase()?1:-1; - }); else copyObjs.sort(function(a,b){ - return a.circ_lib().name().toLowerCase()>=b.circ_lib().name().toLowerCase()?1:-1; - }); - - if(copyObjs.length) unHideMe($('rdetails_status')); - for(var i in copyObjs) { - var obj = copyObjs[i]; - if(!isTrue(obj.circ_lib().opac_visible())) { showLibCount++; continue; } - var par = ishowLibCount) unHideMe($('rdetail_locs_expand')); -} - -function drawCopyStatus(r) { - var res = null; if(r) res = r.recv(); if(res) res = res.content(); - if(!res) return; - var cell = $("copy_status_"+r.params[0]); - if(cell) cell.innerHTML = dojo.date.locale.format(dojo.date.stamp.fromISOString(res), {selector:'date', fullYear: true, datePattern:"M-d-yyyy"}); -} - -function rdetailGetPageIds() { - attachEvt("result", "idsReceived", rdetailSetPaging ); - resultFetchAllRecords = true; - rresultCollectIds(true); -} - -function buildunAPISpan (span, type, id) { - var cgi = new CGI(); - var d = new Date(); - - addCSSClass(span,'unapi-id'); - - span.setAttribute( - 'title', 'tag:' + cgi.server_name + ',' + - d.getFullYear() + ':' + type + '/' + id - ); -} - -function rdetailViewMarc(r,id) { - hideMe($('rdetail_extras_loading')); - $('rdetail_view_marc_box').innerHTML = r.getResultObject(); - - var div = elem('div', { "class" : 'hide_me' }); - var span = div.appendChild( elem('abbr') ); - - buildunAPISpan( span, 'biblio-record_entry', getRid() ); - - $('rdetail_view_marc_box').insertBefore(span, $('rdetail_view_marc_box').firstChild); -} - - -function rdetailShowLocalCopies() { - rdetailShowLocal = true; - rdetailBuildInfoRows(); - hideMe(G.ui.rdetail.cp_info_local); - unHideMe(G.ui.rdetail.cp_info_all); - hideMe(G.ui.rdetail.cp_info_none); -} - -function rdetailShowAllCopies() { - - rdetailShowLocal = false; - rdetailBuildInfoRows(); - hideMe(G.ui.rdetail.cp_info_all); - unHideMe(G.ui.rdetail.cp_info_local); - hideMe(G.ui.rdetail.cp_info_none); -} - -function OpenMarcEditWindow(pcrud, rec) { - /* - To run in Firefox directly, must set signed.applets.codebase_principal_support - to true in about:config - */ - netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect'); - win = window.open('/xul/server/cat/marcedit.xul'); // XXX version? - dojo.require('openils.PermaCrud'); - - win.xulG = { - "record": {"marc": rec.marc()}, - "save": { - "label": opac_strings.SAVE_MFHD_LABEL, - "func": function(xmlString) { - rec.marc(xmlString); - rec.ischanged(true); - pcrud.update(rec); - } - } - }; -} - -function loadMarcEditor(recId) { - var pcrud = new openils.PermaCrud({"authtoken": G.user.session}); - var rec = pcrud.retrieve("sre", recId); - if (rec) { - OpenMarcEditWindow(pcrud, rec); - } -} - -/* - * This function could be written much more intelligently - * Limited brain power means that I'm brute-forcing it for now - */ -function _holdingsDraw(h) { - holdings = h.getResultObject(); - if (!holdings) { return null; } - - dojo.forEach(holdings, _holdingsDrawMFHD); - -} - -function _holdingsDrawMFHD(holdings, entryNum) { - - var here = findOrgUnit(getLocation()); - if (getDepth() > 0 || getDepth === 0 ) { - while (getDepth() < findOrgDepth(here)) - here = findOrgUnit( here.parent_ou() ); - if (!orgIsMine(findOrgUnit(here), findOrgUnit(holdings.owning_lib()))) { - return null; - } - } - - var hh = holdings.basic_holdings_add(); - var hch = holdings.basic_holdings(); - var hs = holdings.supplement_holdings_add(); - var hcs = holdings.supplement_holdings(); - var hi = holdings.index_holdings_add(); - var hci = holdings.index_holdings(); - var ho = holdings.online(); - var hm = holdings.missing(); - var hinc = holdings.incomplete(); - var hloc = holdings.location() || 'MFHD'; - - if ( hh.length == 0 && hch.length == 0 && hs.length == 0 && - hcs.length == 0 && hi.length == 0 && hci.length == 0 && - ho.length == 0 && hm.length == 0 && hinc.length == 0 - ) { - - if (isXUL()) { - /* - * If we have a record, but nothing to show for it, then the - * record is likely empty or corrupt. This gives cataloguers a - * chance to add holdings or correct the record - */ - hh = 'PLACEHOLDER'; - } else { - return null; - } - } - - dojo.place("
" + - dojo.string.substitute(opac_strings.HOLDINGS_TABLE_CAPTION, [hloc]) + - "
", "rdetail_details_table", "after" - ); - if (hh.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.HOLDINGS, hh); } - if (hch.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.CURRENT_HOLDINGS, hch); } - if (hs.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.SUPPLEMENTS, hs); } - if (hcs.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.CURRENT_SUPPLEMENTS, hcs); } - if (hi.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.INDEXES, hi); } - if (hci.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.CURRENT_INDEXES, hci); } - if (ho.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.ONLINE_VOLUMES, ho); } - if (hm.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.MISSING_VOLUMES, hm); } - if (hinc.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.INCOMPLETE_VOLUMES, hinc); } - - if (isXUL()) { - dojo.require('openils.Event'); - dojo.require('openils.PermaCrud'); - var mfhd_edit = new dijit.Menu({}); - new dijit.MenuItem({onClick: function(){loadMarcEditor(holdings.id())}, label:opac_strings.EDIT_MFHD_RECORD}).placeAt(mfhd_edit, "first"); - new dijit.MenuItem({onClick:function(){ - var pcrud = new openils.PermaCrud({"authtoken": G.user.session}); - var mfhd_rec = pcrud.retrieve("sre", holdings.id()); - if (mfhd_rec) { - pcrud.eliminate(mfhd_rec); - alert(dojo.string.substitute(opac_strings.DELETED_MFHD_RECORD, [holdings.id()])); - } - }, label:opac_strings.DELETE_MFHD}).placeAt(mfhd_edit, "last"); - // new dijit.MenuItem({onClick:function(){alert("Edit properties " + holdings.id());}, label:opac_strings.EDIT_PROPERTIES}).placeAt(mfhd_edit, "last"); - var mfhd_mb = new dijit.form.DropDownButton({dropDown: mfhd_edit, label:opac_strings.EDIT_MFHD_MENU, style:"float:right"}); - mfhd_mb.placeAt("mfhdHoldingsCaption" + entryNum, "last"); - mfhd_edit.startup(); - } -} - -function _holdingsDrawMFHDEntry(entryNum, entryName, entry) { - var flatEntry = entry.toString().replace(/,/g, ', '); - dojo.place(" " + entryName + "" + flatEntry + "", "rdetail_holdings_tbody_" + entryNum, "last"); -} - -function drawCopyCounts(r) { - var res = r.recv().content(); - if(!res.length) return; - var str = ""; - - var holdCnt = fieldmapper.standardRequest(['open-ils.circ','open-ils.circ.bre.holds.count'], {"async":false, "params":[getRid()]}); - str += holdCnt+' hold'+(holdCnt==1?'':'s')+' on first copy returned of '+res[0].count+' cop'+(res[0].count==1?'y':'ies')+'
'; - str += res[0].available+' cop'+(res[0].available==1?'y':'ies')+' available'; - $('rdetail_copies_avail').innerHTML = str; -} - -function drawMarcData() { - marc.render("245", {"container":"rdetail_title", "showAGR":true, "sGlue":{"startStr":"
", "joinStr":" ", "endStr":"
"}}); - marc.render("520", {"container":"rdetail_summary_container", "label":"rdetail_summary_link", "sGlue":{"joinStr":" "}}); - marc.render("505", {"container":"rdetail_content_div_inner", "label":"rdetail_content_link", "sGlue":{"joinStr":" "}}); - marc.render(["100", "110", "111"], {"container":"rdetail_author", "label":"author_lbl", "searchType":STYPE_AUTHOR, "skipCodes":"d"}); - - // authors box - marc.render(["100", "110", "111"], {"container":"rdetail_authors_inner", "searchType":STYPE_AUTHOR, "label":["rdetail_authors_link", "authors_lbl"], "sGlue":{"joinStr":" ", "endStr":"
"}, "showAGR":true, "unlink":"d"}); - marc.render(["700", "710", "711"], {"container":"rdetail_moar_authors", "searchType":STYPE_AUTHOR, "label":["rdetail_authors_link", "add_authors_lbl"], "sGlue":{"joinStr":" ", "endStr":"
"}, "unlink":"d"}); - marc.render("508", {"container":"rdetail_credits", "searchType":STYPE_AUTHOR, "label":["rdetail_authors_link", "credits_lbl"]}); - marc.render("511", {"container":"rdetail_cast", "searchType":STYPE_AUTHOR, "label":["rdetail_authors_link", "cast_lbl"]}); - - // subject box - marc.render(["600", "610", "611", "630", "650", "651"], {"sGlue":{"joinStr":" -- ", "endStr":"
"}, "container":"rdetail_subject_container", "label":["rdetail_subject_link", "subject_lbl"], "searchType":STYPE_SUBJECT}); - marc.render(["655", "695"], {"sGlue":{"joinStr":" -- ", "endStr":"
"}, "container":"rdetail_genre_cont", "label":["rdetail_subject_link", "genre_lbl"], "searchType":STYPE_SUBJECT}); - marc.render("690", {"sGlue":{"joinStr":" -- ", "endStr":"
"}, "container":"rdetail_topic_cont", "label":["rdetail_subject_link", "topic_lbl"], "searchType":STYPE_SUBJECT}); - marc.render("691", {"sGlue":{"joinStr":" -- ", "endStr":"
"}, "container":"rdetail_geo_cont", "label":["rdetail_subject_link", "geo_set_lbl"], "searchType":STYPE_SUBJECT}); - marc.render("692", {"sGlue":{"joinStr":" -- ", "endStr":"
"}, "container":"rdetail_bio_cont", "label":["rdetail_subject_link", "bio_sub_lbl"], "searchType":STYPE_SUBJECT}); - marc.render("693", {"sGlue":{"joinStr":" -- ", "endStr":"
"}, "container":"rdetail_attrib_cont", "label":["rdetail_subject_link", "char_attrib_lbl"], "searchType":STYPE_SUBJECT}); - marc.render("698", {"sGlue":{"joinStr":" -- ", "endStr":"
"}, "container":"rdetail_setting_cont", "label":["rdetail_subject_link", "setting_lbl"], "searchType":STYPE_SUBJECT}); - marc.render("699", {"sGlue":{"joinStr":" -- ", "endStr":"
"}, "container":"rdetail_time_cont", "label":["rdetail_subject_link", "time_lbl"], "searchType":STYPE_SUBJECT}); - - // series box - marc.render(['440','490','800','810','811','830','694'], {"showAGR":true, "container":"rdetail_series_container", "label":"rdetail_series_link", "searchType":STYPE_SERIES, "sGlue":{"joinStr":" -- ", "endStr":"
"}}); - - // awards box - marc.render(["586", "697"], {"container":"rdetail_awards_cont", "label":"rdetail_awards_link", "showOnly":"a"}); - - // details box - marc.render(["130", "240", "246", "730", "740"], {"container":"added_title", "label":["rdetail_details_link", "add_title_lbl"], "searchType":STYPE_KEYWORD, "sGlue":{"joinStr":" -- ", "endStr":"
"}}); - marc.render("250", {"container":"rdetail_edition", "label":["rdetail_details_link", "edition_lbl"], "searchType":STYPE_KEYWORD, "fGlue":{"joinStr":" "}, "sGlue":{"joinStr":" "}}); - marc.render("500", {"container":"rdetail_note", "label":["rdetail_details_link", "note_lbl"], "searchType":STYPE_KEYWORD, "fGlue":{"joinStr":" "}, "sGlue":{"joinStr":" "}}); - marc.render("546", {"container":"rdetail_lang", "label":["rdetail_details_link", "lang_lbl"], "searchType":STYPE_KEYWORD, "fGlue":{"joinStr":" "}, "sGlue":{"joinStr":" "}}); - marc.render("516", {"container":"comp_file_note", "label":["rdetail_details_link", "comp_note_lbl"], "searchType":STYPE_KEYWORD, "fGlue":{"joinStr":" "}, "sGlue":{"joinStr":" "}}); - marc.render("538", {"container":"sys_details", "label":["rdetail_details_link", "sys_detail_lbl"], "searchType":STYPE_KEYWORD, "fGlue":{"joinStr":" "}, "sGlue":{"joinStr":" "}}); - marc.render("507", {"container":"map_scale_note", "label":["rdetail_details_link", "map_scale_lbl"], "searchType":STYPE_KEYWORD, "fGlue":{"joinStr":" "}, "sGlue":{"joinStr":" "}}); - marc.render("518", {"container":"rdetail_event", "label":["rdetail_details_link", "event_lbl"], "searchType":STYPE_KEYWORD, "fGlue":{"joinStr":" "}, "sGlue":{"joinStr":" "}}); - marc.render("521", {"container":"audience", "label":["rdetail_details_link", "audience_lbl"], "searchType":STYPE_KEYWORD, "fGlue":{"joinStr":" "}, "sGlue":{"joinStr":" "}}); - marc.render("530", {"container":"phys_form", "label":["rdetail_details_link", "phys_form_lbl"], "searchType":STYPE_KEYWORD, "fGlue":{"joinStr":" "}, "sGlue":{"joinStr":" "}}); - marc.render("504", {"container":"rdetail_biblio", "label":["rdetail_details_link", "biblio_lbl"], "searchType":STYPE_KEYWORD, "fGlue":{"joinStr":" "}, "sGlue":{"joinStr":" "}}); - marc.render("590", {"container":"local_note", "label":["rdetail_details_link", "local_note_lbl"], "searchType":STYPE_KEYWORD, "fGlue":{"joinStr":" "}, "sGlue":{"joinStr":" "}}); - marc.render("506", {"container":"restrictions", "label":["rdetail_details_link", "restrict_lbl"], "searchType":STYPE_KEYWORD, "fGlue":{"joinStr":" "}, "sGlue":{"joinStr":" "}}); - marc.render("780", {"container":"continues", "label":["rdetail_details_link", "continues_lbl"], "searchType":STYPE_KEYWORD, "fGlue":{"joinStr":" "}, "sGlue":{"joinStr":" "}}); - marc.render("785", {"container":"cont_by", "label":["rdetail_details_link", "cont_by_lbl"], "searchType":STYPE_KEYWORD, "fGlue":{"joinStr":" "}, "sGlue":{"joinStr":" "}}); - - marc.render(["092", "099"], {"container":"rdetail_callnum", "label":"callnum_lbl", "sGlue":{"joinStr":" ", "endStr":" "}}); - marc.render("260", {"container":"rdetail_pubdate", "label":"pubdate_lbl", "showOnly":"c"}); - marc.render("300", {"container":"rdetail_physical_desc", "label":"phys_desc_lbl", "sGlue":{"joinStr":" "}}); - marc.render("260", {"container":"rdetail_publisher", "label":"publisher_lbl", "showAGR":true, "showOnly":["a", "b"], "sGlue":{"joinStr":" ", "endStr":"
"}}); - marc.render("856", {"container":"online_resources", "label":"online_res_lbl", "linkSrc":"u", "linkText":["z", "y", "3"], "fGlue":{"joinStr":"
"}}); - - var code = marc.render("998", {"showOnly":"d"}); - var imgEl = $("rdetail_tor_pic"); - if(setFormatIcon(imgEl, code)) unHideMe(imgEl); - -/* - - if(marcObj["856"]) { - var online = $('online_resources'); - var m856 = marcObj["856"]; - for(var i in m856) { - var url = m856[i]["u"] || ""; - online.appendChild(elem('a', {"href":url}, (m856[i]["z"] | m856[i]["y"] | m856[i]["3"]))); // should only be one of z, y, 3 - online.appendChild(elem('br')); - } - } -*/ -} - -function _rdetailDraw(r) { - record = r.getResultObject(); - runEvt('rdetail', 'recordRetrieved', record.doc_id()); - - if(isInAnonList(parseInt(record.doc_id()))) { - $('add_mylist').innerHTML = 'Remove from my list'; - $('add_mylist').title = 'Remove from my list'; - } - - G.ui.rdetail.title.appendChild(text(record.title())); - buildSearchLink(STYPE_AUTHOR, record.author(), G.ui.rdetail.author); - if(record.isbn()) { unHideMe($('rdetail_isbn_lbl')); G.ui.rdetail.isbn.appendChild(text(cleanISBN(record.isbn()))); } - if(record.edition()) { unHideMe($('rdetail_ed_lbl')); G.ui.rdetail.edition.appendChild(text(record.edition())); } - if(record.pubdate()) { unHideMe($('rdetail_pubdate_lbl')); G.ui.rdetail.pubdate.appendChild(text(record.pubdate())); } - if(record.publisher()) { unHideMe($('rdetail_pub_lbl')); G.ui.rdetail.publisher.appendChild(text(record.publisher())); } - if(record.physical_description()) { unHideMe($('rdetail_phys_lbl')); $('rdetail_physical_desc').appendChild(text(record.physical_description())); } - $('content_cafe_summary').src="http://contentcafe2.btol.com/ContentCafeClient/ContentCafe.aspx?UserID=KC72927&Password=CC14647&ItemKey="+cleanISBN(record.isbn())+"&Options=Y"; - - var code = getMarcData(record.doc_id(),"998","d"); - var imgEl = $("rdetail_tor_pic"); - - if(code) { unHideMe($('rdetail_form_lbl')); G.ui.rdetail.tor.innerHTML = get998dValue(code); } - //if(record.synopsis()) { unHideMe($('rdetail_sum_lbl')); G.ui.rdetail.abstr.appendChild(text(record.synopsis())); } - if(setFormatIcon(imgEl, code)) unHideMe(imgEl); - - try{ - if(record.isbn()) { - if(ENABLE_ADDED_CONTENT_ATTRIB_LINKS) { - unHideMe($('rdetail.jacket_attrib_div')); - var href = $('rdetail.jacket_attrib_link').getAttribute('href') +cleanISBN(record.isbn()); - $('rdetail.jacket_attrib_link').setAttribute('href', href); - } - rdetailCheckForGBPreview(); - - } else { - //hideMe($("rdetail.jacket_attrib_div")); - //hideMe($("rdetail_img_link")); - } - } catch(E) {} - - - // see if the record has any external links - var links = record.online_loc(); - for( var i = 0; links && links.length > 0 && i < links.length; i = i + 3 ) { - var href = links[i]; - // avoid matching "HTTP: The Complete Reference" - if( href.match(/https?:\/|ftps?:\/|mailto:/i) ) { - unHideMe($('rdetail_online_row')); - // MODS can contain a display label (used for the text of the link) - // as well as a note about the URL; many legacy systems conflate the - // two and generate MARC records that expect the note to be used as - // the text of the link, with no display label; here's the canonical - // format: - // - // 856 40 $uhttp://localhost$yDisplay label$zPublic note - // - // Note that the MARC21slim2MODS XSL concatenates $3 and $y together - // (as $y was defined later in MARC21's life as the display label) - var displayLabel = '' + links[i+1]; - var note = '' + links[i+2]; - if(!displayLabel || displayLabel.match(/https?:\/|ftps?:\/|mailto:/i)) { - if(!note || note.match(/https?:\/|ftps?:\/|mailto:/i)) { - displayLabel = href; - } else { - displayLabel = note; - } - } - $('rdetail_online').appendChild(elem('a', {href:href,'class':'classic_link'}, displayLabel)); - if (note && note != displayLabel) { - $('rdetail_online').appendChild(elem('span', {'class':'url_note'}, ' - ' + note)); - } - $('rdetail_online').appendChild(elem('br')); - } - } - - // Fill in our unAPI ID, if anyone cares - var abbrs = document.getElementsByTagName('abbr'); - var span; - for (var i = 0; i < abbrs.length; i = i + 1) { - if (abbrs[i].getAttribute('name') == 'unapi') { - span = abbrs[i]; - break; - } - } - buildunAPISpan( span, 'biblio-record_entry', record.doc_id() ); - - var RW = $('rdetail_exp_refworks'); - if (RW && rdetailEnableRefWorks) { - - var here = (findOrgUnit(getLocation())).name(); - var org_name = here.replace(" ", "+"); - var cgi = new CGI(); - - RW.setAttribute( - 'href', - rdetailRefWorksHost + '/express/expressimport.asp?vendor=' - + org_name - + '&filter=MARC+Format&database=All+MARC+Formats&encoding=65001&url=http%3A%2F%2F' - + cgi.server_name + '/opac/extras/supercat/marctxt/record/' - + record.doc_id() - ); - - RW.setAttribute('target', 'RefWorksMain'); - unHideMe($('rdetail_exp_refworks_span')); - } - - //$('rdetail_img_link').setAttribute('href', buildISBNSrc(cleanISBN(record.isbn()), 'large')); - //G.ui.rdetail.image.setAttribute("src", buildISBNSrc(cleanISBN(record.isbn()))); - runEvt("rdetail", "recordDrawn"); - recordsCache.push(record); - - rdetailSetExtrasSelector(); - - var breq = new Request(FETCH_BRE, [getRid()]); - breq.callback( rdetailCheckDeleted ); - breq.send(); - - //resultBuildCaches( [ record ] ); - //resultDrawSubjects(); - //resultDrawSeries(); - - // grab added content - acCollectData(cleanISBN(record.isbn()), rdetailhandleAC); - - var currentISBN = cleanISBN(record.isbn()); - - - - var it = getCacheValue('showHoldEditor'); - if(it) { - setCacheValue('showHoldEditor', null); - holdsDrawEditor({record:it.record, type:it.type}); - } -} - - - -function rdetailCheckDeleted(r) { - var br = r.getResultObject()[0]; - if( isTrue(br.deleted()) ) { - hideMe($('rdetail_place_hold')); - $('rdetail_more_actions_selector').disabled = true; - unHideMe($('rdetail_deleted_exp')); - } -} - -function rdetailSetExtrasSelector() { - if(!grabUser()) return; - unHideMe($('rdetail_more_actions')); - - var req = new Request( - FETCH_CONTAINERS, G.user.session, G.user.id(), 'biblio', 'bookbag' ); - req.callback(rdetailAddBookbags); - req.send(); -} - -var myListsFetched = false; -var selectedItem = null; -function addMyList(id) { - if(!id) id = record.doc_id(); - //if(!grabUser()) { alert("Please login first"); goTo(buildOPACLink({page:MYOPAC}, false, true)); return; } - - var holdsLink = $n($('result_table_template_'+id), 'result_my_list_link'); - if(!holdsLink) holdsLink = $('add_mylist'); - var lbl = $('myListLabel'); - var title = ""; - if(_resultFindRec) title = _resultFindRec(id); - if(title) title = title.title(); - if(lbl) lbl.innerHTML = title; else lbl.innerHTML = ""; - - //if(!grabUser()) { - isCacheListDrawn = false; - for(var i in anonListCache) { - if(anonListCache[i] == id) { - anonListCache.splice(i, 1); - setCacheValue('anonListCache', anonListCache); - if(!anonListCache.length) hideMe($('cacheListLink')); - if(holdsLink) { - holdsLink.innerHTML = 'Add to my list'; - //holdsLink.appendChild(elem('img', {src:'/opac/skin/kcls/graphics/add_mylist.gif'}, null)); - holdsLink.title = "Add to my list"; - } - return; - } - } - - anonListCache.push(id); - setCacheValue('anonListCache', anonListCache); - unHideMe($('cacheListLink')); - if(holdsLink) { - holdsLink.innerHTML = 'Remove from my list'; - //holdsLink.appendChild(elem('img', {src:'/opac/skin/kcls/graphics/add_mylist_sel.gif'}, null)); - holdsLink.title = "Remove from my list"; - } - return; - //} - - selectedItem = id; - var selector = $('mylist_selector'); - - if(findCurrentPage()==RDETAIL) { - unHideMe($('rdetail_more_actions_selector')); - } else if(findCurrentPage()==RRESULT) { - hideResultsPage(true); - unHideMe($('mylist_div')); - } - if(!myListsFetched) { - myListsFetched = true; - var req = new Request(FETCH_CONTAINERS, G.user.session, G.user.id(), 'biblio', 'bookbag' ); - req.callback(showMyLists); - req.send(); - } -} - -function saveMyList() { - if(!selectedItem) return true; - var newList = $('mylist_new'); - if(!newList) return true; - - var selector = $('mylist_selector'); - if(!selector.options.length && !newList.value) { alert('Please choose a name for the new list'); newList.focus(); return false; } - - if(newList.value) { - var id; - var name = newList.value - if(id = containerCreate(name)) { - selector.options.length=0; - if(!selector.options.length) { - unHideMe($('myListSelect')); - var req = new Request(FETCH_CONTAINERS, G.user.session, G.user.id(), 'biblio', 'bookbag' ); - req.callback(showMyLists); - req.send(); - } - if(containerCreateItem(id, selectedItem)) { - alert('Item successfully added to list'); - newList.value = ""; - } else { return false; } - } else { return false; } - } else { //save to selected list - var selectedID = selector.options[selector.selectedIndex].value; - if(containerCreateItem(selectedID, selectedItem)) { - alert('Item successfully added to list'); - newList.value = ""; - } else { return false; } - } - - if(findCurrentPage()==RDETAIL) { - hideMe($('rdetail_more_actions_selector')); - } else if(findCurrentPage()==RRESULT) { - hideResultsPage(false); - } - return true; -} - -function showMyLists(r) { - var containers = r.getResultObject(); - var selector = $('mylist_selector'); - - for( var i = 0; i != containers.length; i++ ) { - var container = containers[i]; - insertSelectorVal( selector, i, container.name(), container.id(), null, 0 ); - } - if(!selector.options.length) hideMe($('myListSelect')); -} - - -function rdetailAddBookbags(r) { - - var containers = r.getResultObject(); - var selector = $('rdetail_more_actions_selector'); - var found = false; - var index = 3; - doSelectorActions(selector); - - for( var i = 0; i != containers.length; i++ ) { - found = true; - var container = containers[i]; - insertSelectorVal( selector, index++, container.name(), - "container_" + container.id(), rdetailAddToBookbag, 1 ); - } - - nextContainerIndex = index; -} - -var _actions = {}; -function rdetailNewBookbag() { - var name = prompt($('rdetail_bb_new').innerHTML,""); - if(!name) return; - - var id; - if( id = containerCreate( name ) ) { - alert($('rdetail_bb_success').innerHTML); - var selector = $('rdetail_more_actions_selector'); - insertSelectorVal( selector, nextContainerIndex++, name, - "container_" + id, rdetailAddToBookbag, 1 ); - setSelector( selector, 'start' ); - } -} - - -function rdetailAddToBookbag() { - var selector = $('rdetail_more_actions_selector'); - var id = selector.options[selector.selectedIndex].value; - setSelector( selector, 'start' ); - - if( containerCreateItem( id.substring(10), record.doc_id() )) { - alert($('rdetail_bb_item_success').innerHTML); - } -} - -function rdetailShowAllExtras(bool) { - var nodes = jQuery('.rdetail_extras').filter(function(){ return jQuery(this).css('display')=='block';}); - nodes.each(function(){ - rdetailShowExtra(this.getAttribute("rel2")); - var node = $(this.getAttribute("rel")); - if(bool) unHideMe(node); else hideMe(node); - }); -} - - -var rdetailMarcFetched = false; -function rdetailShowExtra(type, args) { - var obj = jQuery('[rel2='+type+']').get()[0]; - var node = $(obj.getAttribute('rel')); - var arrow = $(obj.getAttribute('rel')+"_arrow"); - if(jQuery(node).css('display')=='block') { - hideMe(node); - arrow.src="/opac/skin/kcls/graphics/rdetail_arrow.png"; - } else { - unHideMe(node); - arrow.src="/opac/skin/kcls/graphics/rdetail_arrow_down.png"; - } - - removeCSSClass($('rdetail_copy_info_link'), 'rdetail_extras_selected'); - removeCSSClass($('rdetail_viewcn_link'), 'rdetail_extras_selected'); - removeCSSClass($('rdetail_reviews_link'), 'rdetail_extras_selected'); - removeCSSClass($('rdetail_toc_link'), 'rdetail_extras_selected'); - removeCSSClass($('rdetail_excerpt_link'), 'rdetail_extras_selected'); - removeCSSClass($('rdetail_preview_link'), 'rdetail_extras_selected'); - removeCSSClass($('rdetail_anotes_link'), 'rdetail_extras_selected'); - removeCSSClass($('rdetail_annotation_link'), 'rdetail_extras_selected'); - removeCSSClass($('rdetail_viewmarc_link'), 'rdetail_extras_selected'); - removeCSSClass($('rdetail_novelist_link'), 'rdetail_extras_selected'); - - switch(type) { - - case "copyinfo": - addCSSClass($('rdetail_copy_info_link'), 'rdetail_extras_selected'); - break; - - case "reviews": - addCSSClass($('rdetail_reviews_link'), 'rdetail_extras_selected'); - break; - - case "excerpt": - addCSSClass($('rdetail_excerpt_link'), 'rdetail_extras_selected'); - break; - - case "preview": - addCSSClass($('rdetail_preview_link'), 'rdetail_extras_selected'); - rdetailDisplayGBPreview(); - break; - - case "anotes": - addCSSClass($('rdetail_anotes_link'), 'rdetail_extras_selected'); - break; - - case "toc": - addCSSClass($('rdetail_toc_link'), 'rdetail_extras_selected'); - break; - - case "marc": - addCSSClass($('rdetail_viewmarc_link'), 'rdetail_extras_selected'); - if(rdetailMarcFetched) return; - unHideMe($('rdetail_extras_loading')); - rdetailMarcFetched = true; - var req = new Request( FETCH_MARC_HTML, getRid()); - req.callback(rdetailViewMarc); - req.send(); - break; - - case "novelist": - addCSSClass($('rdetail_novelist_link'), 'rdetail_extras_selected'); - break; - - case 'cn': - addCSSClass($('rdetail_viewcn_link'), 'rdetail_extras_selected'); - rdetailShowCNBrowse(defaultCN, getLocation(), null, true); - break; - - } -} - -function rdetailVolumeDetails(args) { - var row = $(args.rowid); - var tbody = row.parentNode; - cpdBuild( tbody, row, record, args.cn, args.org, args.depth, args.copy_location ); - return; -} - -function rdetailBuildCNList() { - - var select = $('cn_browse_selector'); - var index = 0; - var arr = []; - for( var cn in callnumberCache ) arr.push( cn ); - arr.sort(); - - if( arr.length == 0 ) { - hideMe($('rdetail_cn_browse_select_div')); - return; - } - - for( var i in arr ) { - var cn = arr[i]; - var opt = new Option(cn); - select.options[index++] = opt; - } - select.onchange = rdetailGatherCN; -} - -function rdetailGatherCN() { - var cn = getSelectorVal($('cn_browse_selector')); - rdetailShowCNBrowse( cn, getLocation(), getDepth(), true ); - setSelector( $('cn_browse_selector'), cn ); -} - - -function rdetailShowCNBrowse( cn, loc, depth, fromOnclick ) { - - if(!cn) { - unHideMe($('cn_browse_none')); - hideMe($('rdetail_cn_browse_select_div')); - return; - } - - unHideMe($('rdetail_cn_browse_select_div')); - rdetailBuildCNList(); - setSelector( $('cn_browse_selector'), cn ); - //hideMe($('rdetail_copy_info_div')); - //hideMe($('rdetail_reviews_div')); - //hideMe($('rdetail_toc_div')); - //hideMe($('rdetail_marc_div')); - //unHideMe($('rdetail_cn_browse_div')); - unHideMe($('cn_browse')); - if( !rdetailLocalOnly && ! fromOnclick ) depth = findOrgDepth(globalOrgTree); - cnBrowseGo(cn, loc, depth); -} - -function rdetailhandleAC(data) { - - if( data.reviews.html ) { - $('rdetail_review_container').innerHTML = data.reviews.html; - unHideMe($('rdetail_awards_link')); - } - - if( data.toc.html ) { - $('rdetail_toc_div').innerHTML = data.toc.html; - unHideMe($('rdetail_content_link')); - } - - if( data.excerpt.html ) { - $('rdetail_excerpt_div').innerHTML = data.excerpt.html; - unHideMe($('rdetail_excerpt_link')); - } - - if( data.anotes.html ) { - $('rdetail_anotes_div').innerHTML = data.anotes.html; - unHideMe($('rdetail_authors_link')); - } -} - -function rdetailShowReviews(r) { - hideMe($('rdetail_extras_loading')); - var res = r.getResultObject(); - var par = $('rdetail_reviews_div'); - var template = par.removeChild($('rdetail_review_template')); - if( res && res.length > 0 ) { - unHideMe($('rdetail_reviews_link')); - for( var i = 0; i != res.length; i++ ) { - var rev = res[i]; - if( rev.text && rev.info ) { - var node = template.cloneNode(true); - $n(node, 'review_header').appendChild(text(rev.info)); - $n(node, 'review_text').appendChild(text(rev.text)); - par.appendChild(node); - } - } - } -} - - -function rdetailShowTOC(r) { - hideMe($('rdetail_extras_loading')); - var resp = r.getResultObject(); - if(resp) { - unHideMe($('rdetail_content_link')); - $('rdetail_toc_div').innerHTML = resp; - } -} - -function rdetailBuildInfoRows() { - var req; - var method = FETCH_COPY_COUNTS_SUMMARY; - if (rdetailShowCopyLocation) - method = FETCH_COPY_LOCATION_COUNTS_SUMMARY; - - - if( rdetailShowLocal ) - req = new Request(method, getRid(), 1, 0) - else - req = new Request(method, getRid()); - req.callback(_rdetailBuildInfoRows); - req.send(); -} - -function _rdetailRows(node) { - - if( rdetailShowLocal && /*getLocation()*/1 != globalOrgTree.id() ) { - var loc = findOrgUnit(1/*getLocation()*/); - if( node ) { - if( !orgIsMine(node, loc) && !orgIsMine(loc,node) ) return; - } else { - for( var i = 0; i < globalOrgTree.children().length; i++ ) { - var org = findOrgUnit(globalOrgTree.children()[i]); - if( orgIsMine(org, loc) ) { - node = org; - break; - } - } - } - } - - if(!node && findOrgType(globalOrgTree.ou_type()).can_have_vols()) - node = globalOrgTree; - - - /* don't show hidden orgs */ - - if(node) { - - //if(!isXUL() && !isTrue(node.opac_visible())) return; - if(!isXUL() && !isTrue(node.opac_visible())) { - // locally suppressed orgs should appear in the copy summary - if(!localSuppressedOrgs[node.id()]) { // indexOf() on user arrays isn't supported on <= IE8 - return; - } - } - - // , 1555:true, 1499:true, 1510:true, 1538:true - - var row = copyRow.cloneNode(true); - row.id = "cp_info_" + node.id(); - - var libtd = findNodeByName( row, config.names.rdetail.lib_cell ); - var cntd = findNodeByName( row, config.names.rdetail.cn_cell ); - var cpctd = findNodeByName( row, config.names.rdetail.cp_count_cell ); - var actions = $n(row, 'rdetail_actions_cell'); - - var p = libtd.getElementsByTagName('a')[0]; - libtd.insertBefore(text(node.name()), p); - libtd.setAttribute("style", "padding-left: " + ((findOrgDepth(node) - 1) * 9) + "px;"); - - if(!findOrgType(node.ou_type()).can_have_vols()) { - - row.removeChild(cntd); - row.removeChild(cpctd); - row.removeChild(actions); - row.setAttribute('novols', '1'); - - libtd.setAttribute("colspan", numStatuses + 3 ); - libtd.colSpan = numStatuses + 3; - addCSSClass(row, 'copy_info_region_row'); - } - - copyRowParent.appendChild(row); - - } else { node = globalOrgTree; } - - for( var c in node.children() ) - _rdetailRows(node.children()[c]); -} - -function rdetailCNPrint(orgid, cn) { - var div = cpdBuildPrintWindow( record, orgid); - var template = div.removeChild($n(div, 'cnrow')); - var rowNode = $("cp_info_" + orgid); - cpdStylePopupWindow(div); - openWindow(div.innerHTML); -} - -var localCNFound = false; -var ctr = 0; -function _rdetailBuildInfoRows(r) { - - if (rdetailShowCopyLocation) - unHideMe( $n( $('rdetail_copy_info_table'), 'rdetail_copylocation_header' )); - - removeChildren(copyRowParent); - - _rdetailRows(); - - var summary = r.getResultObject(); - if(!summary) return; - - var found = false; - for( var i = 0; i < summary.length; i++ ) { - - var arr = summary[i]; - globalCNCache[arr[1]] = 1; - var thisOrg = findOrgUnit(arr[0]); - var rowNode = $("cp_info_" + thisOrg.id()); - if(!rowNode) continue; - - if(rowNode.getAttribute("used")) { - - if( rowNode.nextSibling ) { - sib = rowNode.nextSibling; - o ='cp_info_'+thisOrg.id()+'_'; - /* push the new row on as the last row for this org unit */ - while( sib && sib.id.match(o) ) { - sib = sib.nextSibling; - } - if(sib) - rowNode = copyRowParent.insertBefore(copyRow.cloneNode(true), sib); - else - rowNode = copyRowParent.appendChild(copyRow.cloneNode(true)); - } else { - rowNode = copyRowParent.appendChild(copyRow.cloneNode(true)); - } - - var n = findNodeByName( rowNode, config.names.rdetail.lib_cell ); - n.appendChild(text(thisOrg.name())); - n.setAttribute("style", "padding-left: " + ((findOrgDepth(thisOrg) - 1) * 9) + "px;"); - rowNode.id = "cp_info_" + thisOrg.id() + '_' + (++ctr); - - } else { - rowNode.setAttribute("used", "1"); - } - - var cpc_temp = rowNode.removeChild( - findNodeByName(rowNode, config.names.rdetail.cp_count_cell)); - - var statuses = arr[2]; - var cl = ''; - if (rdetailShowCopyLocation) { - cl = arr[2]; - statuses = arr[3]; - } - - rdetailApplyStatuses(rowNode, cpc_temp, statuses); - - var isLocal = false; - if( orgIsMine( findOrgUnit(getLocation()), thisOrg ) ) { - found = true; - isLocal = true; - if(!localCNFound) { - localCNFound = true; - defaultCN = arr[1]; - } - } - - //if(isLocal) unHideMe(rowNode); - unHideMe(rowNode); - - rdetailSetPath( thisOrg, isLocal ); - rdetailBuildBrowseInfo( rowNode, arr[1], isLocal, thisOrg, cl ); - - if( i == summary.length - 1 && !defaultCN) defaultCN = arr[1]; - } - - if(!found) unHideMe(G.ui.rdetail.cp_info_none); -} - -function rdetailBuildBrowseInfo(row, cn, local, orgNode, cl) { - if(local) { - var cache = callnumberCache[cn]; - if( cache ) cache.count++; - else callnumberCache[cn] = { count : 1 }; - } - - var depth = getDepth(); - if( !local ) depth = findOrgDepth(globalOrgTree); - - $n(row, 'rdetail_callnumber_cell').appendChild(text(cn)); - - if (rdetailShowCopyLocation) { - var cl_cell = $n(row, 'rdetail_copylocation_cell'); - cl_cell.appendChild(text(cl)); - unHideMe(cl_cell); - } - - _debug('setting action clicks for cn ' + cn); - - var dHref = 'javascript:rdetailVolumeDetails('+ - '{copy_location : "'+cl+'", rowid : "'+row.id+'", cn :"'+cn+'", depth:"'+depth+'", org:"'+orgNode.id()+'", local: '+local+'});'; - - var bHref = 'javascript:rdetailShowCNBrowse("' + cn + '", '+orgNode.id()+', "'+depth+'");'; - - unHideMe( $n(row, 'details') ) - $n(row, 'details').setAttribute('href', dHref); - unHideMe( $n(row, 'browse') ) - $n(row, 'browse').setAttribute('href', bHref); - - if(isXUL()) { - unHideMe($n(row, 'hold_div')); - $n(row, 'hold').onclick = function() { - var req = new Request(FETCH_VOLUME_BY_INFO, cn, record.doc_id(), orgNode.id()); - req.callback( - function(r) { - var vol = r.getResultObject(); - holdsDrawEditor({type: 'V', volumeObject : vol}); - }); - req.send(); - }; - } -} - -// sets the path to org as 'active' and displays the path if it's local -function rdetailSetPath(org, local) { - if( findOrgDepth(org) == 0 ) return; - var row = $("cp_info_" + org.id()); - row.setAttribute("hasinfo", "1"); - unHideMe(row); - rdetailSetPath(findOrgUnit(org.parent_ou()), local); -} - -//Append all the statuses for a given summary to the -//copy summary table -function rdetailApplyStatuses( row, template, statuses ) { - for( var j in _statusPositions ) { - var stat = _statusPositions[j]; - var val = statuses[stat.id()]; - var nn = template.cloneNode(true); - if(val) nn.appendChild(text(val)); - else nn.appendChild(text(0)); - row.appendChild(nn); - } -} - -//Add one td (creating a new column) to the copy summary -//table for each opac_visible copy status -function rdetailBuildStatusColumns() { - - rdetailGrabCopyStatuses(); - var parent = statusRow; - var template = parent.removeChild(G.ui.rdetail.cp_status); - - var i = 0; - for( i = 0; i < cp_statuses.length; i++ ) { - - var c = cp_statuses[i]; - if( c && isTrue(c.opac_visible()) ) { - var name = c.name(); - _statusPositions[i] = c; - var node = template.cloneNode(true); - var data = findNodeByName( node, config.names.rdetail.cp_status); - - data.appendChild(text(name)); - parent.appendChild(node); - } - } - - numStatuses = 0; - for(x in _statusPositions) numStatuses++; -} - -function rdetailGrabCopyStatuses() { - if(cp_statuses) return cp_statuses; - var req = new Request(FETCH_COPY_STATUSES); - req.send(true); - cp_statuses = req.result(); - cp_statuses = cp_statuses.sort(_rdetailSortStatuses); -} - -function _rdetailSortStatuses(a, b) { - return parseInt(a.id()) - parseInt(b.id()); -} - -/** - * Check for a Google Book preview - */ -function rdetailCheckForGBPreview() { - if (!rdetailGoogleBookPreview) return; - searchForGBPreview( cleanISBN(record.isbn()) ); -} - -/** - * - * @param {DOM object} query The form element containing the - * input parameters "isbns" - */ -function searchForGBPreview( isbn ) { - - // Delete any previous Google Booksearch JSON queries. - var GBPJsonScript = document.getElementById("GBPJsonScript"); - if (GBPJsonScript) { - GBPJsonScript.parentNode.removeChild(GBPJsonScript); - } - - // Add a script element with the src as the user's Google Booksearch query. - // JSON output is specified by including the alt=json-in-script argument - // and the callback function is also specified as a URI argument. - var GBPScriptElement = document.createElement("script"); - - GBPScriptElement.setAttribute("id", "GBPJsonScript"); - GBPScriptElement.setAttribute("src", - "http://books.google.com/books?bibkeys=" + - isbn + "&jscmd=viewapi&callback=GBPreviewCallback"); - GBPScriptElement.setAttribute("type", "text/javascript"); - - // make the request to Google booksearch - document.documentElement.firstChild.appendChild(GBPScriptElement); -} - -/** - * This function is the call-back function for the JSON scripts which - * executes a Google book search response. - * - * XXX I18N of text needed - * - * @param {JSON} booksInfo is the JSON object pulled from the Google books service. - */ -function GBPreviewCallback(GBPBookInfo) { - var GBPreviewDiv = document.getElementById("rdetail_preview_div"); - var GBPBook; - - for ( i in GBPBookInfo ) { - GBPBook = GBPBookInfo[i]; - } - - if ( !GBPBook ) { - return; - } - - if ( GBPBook.preview != "noview" ) { - if ( GBPBook.preview == 'full' ) { - setText( $('rdetail_preview_link'), $('rdetail_preview_full_text').innerHTML ); - $('rdetail_preview_link_a').title = $('rdetail_preview_title').innerHTML; - } - - // Add a button below the book cover image to load the preview. - GBPBadge = document.createElement( 'img' ); - GBPBadge.src = 'http://books.google.com/intl/en/googlebooks/images/gbs_preview_button1.gif'; - GBPBadge.title = $('rdetail_preview_badge').innerHTML; - GBPBadge.style.border = 0; - GBPBadgelink = document.createElement( 'a' ); - GBPBadgelink.href = 'javascript:rdetailShowExtra("preview");'; - GBPBadgelink.appendChild( GBPBadge ); - $('rdetail_image_cell').appendChild( GBPBadgelink ); - $('rdetail_preview_div').style.height = 600; - - /* Display the "Preview" tab in the Extras section */ - unHideMe( $('rdetail_preview_link' ) ); - } -} - -/** - * This is called when the user clicks on the 'Preview' link. We assume - * a preview is available from Google if this link was made visible. - * - * XXX I18N of Google Book Preview language attribute needed - */ -function rdetailDisplayGBPreview() { - unHideMe($('rdetail_extras_loading')); - GBPreviewPane = $('rdetail_preview_div'); - if ( GBPreviewPane.getAttribute('loaded') == null || - GBPreviewPane.getAttribute('loaded') == "false" ) { - google.load("books", "0", {"callback" : rdetailGBPViewerLoadCallback, "language": "en"} ); - GBPreviewPane.setAttribute('loaded', 'true'); - } -} - -function rdetailGBPViewerLoadCallback() { - hideMe($('rdetail_extras_loading')); - var GBPViewer = new google.books.DefaultViewer(document.getElementById('rdetail_preview_div')); - GBPViewer.load('ISBN:' + cleanISBN(record.isbn()) ); - -} - -function expandBoxes(type,bool) { - if(type=="locs") { - if(bool) { - unHideMe($('rdetail_locs_collapse')); - unHideMe($('rdetails_status2')); - hideMe($('rdetail_locs_expand')); - - } else { - hideMe($('rdetails_status2')); - hideMe($('rdetail_locs_collapse')); - unHideMe($('rdetail_locs_expand')); - } - return; - } - - if(type=="tabs") { - if(bool) { - rdetailShowAllExtras(true); - hideMe($('rdetail_extras_expand')); - unHideMe($('rdetail_extras_collapse')); - } else { - rdetailShowAllExtras(); - hideMe($('rdetail_extras_collapse')); - unHideMe($('rdetail_extras_expand')); - } - return; - } +/* */ + +if(findCurrentPage()==RDETAIL){ +detachAllEvt('common', 'run'); +attachEvt("common", "run", rdetailDraw); +attachEvt("rdetail", "recordDrawn", rdetailBuildStatusColumns); +attachEvt("rdetail", "recordDrawn", rdetailBuildInfoRows); +attachEvt("rdetail", "recordDrawn", rdetailGetPageIds); + +/* Per-skin configuration settings */ +var rdetailLocalOnly = true; +var rdetailShowLocal = true; +var rdetailShowCopyLocation = true; +var rdetailGoogleBookPreview = false; +var rdetailDisplaySerialHoldings = true; +var rdetailEnableRefWorks = false; +var rdetailRefWorksHost = 'http://www.refworks.com'; + +/* vars vars vars */ +var record = null; +var marc = null; +var cp_statuses = null; +var recordsCache = []; + +var copyRowParent = null; +var copyRow = null; +var statusRow = null; +var numStatuses = null; +var defaultCN; +var callnumberCache = {}; +var globalCNCache = {}; +var localTOC; +var cachedRecords; +var _statusPositions = {}; +var opac_strings; +var copyObjs = []; +var copyObjsCN = []; +var copyObjsCount = 0; + +var nextContainerIndex; + +var nextRecord; +var prevRecord; + +var rdetailPrev = null; +var rdetailNext = null; +var rdetailStart = null; +var rdetailEnd = null; + +if(location.href.match(/&place_hold=1/)) { + // prevent load flicker between canvases + hideMe(dojo.byId('canvas_main')); +} + +/* serials are currently the only use of Dojo strings in the OPAC */ + if (rdetailDisplaySerialHoldings) { + dojo.require("dijit.Menu"); + dojo.require("dijit.form.Button"); + dojo.requireLocalization("openils.opac", "opac"); + opac_strings = dojo.i18n.getLocalization("openils.opac", "opac"); + } +} + +function rdetailReload() { + var args = {}; + args[PARAM_LOCATION] = getNewSearchLocation(); + args[PARAM_DEPTH] = depthSelGetDepth(); + goTo(buildOPACLink(args)); +} + +/* looks to see if we have a next and/or previous record in the + record cache, if so, set up the nav links */ +function rdetailSetPaging(ids) { + + cachedRecords = {}; + cachedRecords.ids = ids; + + for( var i = 0; i < cachedRecords.ids.length; i++ ) { + var rec = cachedRecords.ids[i]; + if( rec == getRid() ) { + if( i > 0 ) prevRecord = cachedRecords.ids[i-1]; + if( i < cachedRecords.ids.length - 1 ) + nextRecord = cachedRecords.ids[i+1]; + break; + } + } + + $('np_offset').appendChild(text(i + 1)); + $('np_count').appendChild(text(getHitCount())); + + if(prevRecord) { + //unHideMe($('np_table')); + unHideMe($('rdetail_result_count')); + unHideMe($('np_prev')); + unHideMe($('np_start')); + rdetailPrev = function() { _rdetailNav(prevRecord); }; + rdetailStart = function() { _rdetailNav(cachedRecords.ids[0]); }; + } + + if(nextRecord) { + //unHideMe($('np_table')); + unHideMe($('rdetail_result_count')); + unHideMe($('np_next')); + unHideMe($('np_end')); + rdetailNext = function() { _rdetailNav(nextRecord); }; + rdetailEnd = function() { _rdetailNav(cachedRecords.ids[cachedRecords.ids.length-1]); }; + } + + runEvt('rdetail', 'nextPrevDrawn', i, cachedRecords.ids.length); +} + + +function _rdetailNav(id, offset) { + var args = {}; + args[PARAM_RID] = id; + goTo(buildOPACLink(args)); +} + +function rdetailHandlePlaceHold() { + function reload() { + location.href = location.href.replace(/&place_hold=1/, ''); + } + attachEvt("common", "holdUpdated", reload); + attachEvt("common", "holdUpdateCanceled", reload); + attachEvt("common", "loginCanceled", reload); + holdsDrawEditor({record:getRid(), type: 'T'}); +} + +function ridPreDraw() { + if(isInAnonList(parseInt(getRid()))) { + var mylist = $('add_mylist'); + mylist.innerHTML = 'Remove from my list'; + mylist.title = 'Remove from my list'; + } + + record = new mvr(); + record.doc_id(getRid()); + + fieldmapper.standardRequest(["open-ils.search","open-ils.search.biblio.record.copy_count"], {'params':[getLocation(), getRid(), getForm()], 'oncomplete':drawCopyCounts}); +} + +function rdetailDraw() { + if(new CGI().param('place_hold')) { + rdetailHandlePlaceHold(); + return; + } + + detachAllEvt('common','depthChanged'); + detachAllEvt('common','locationUpdated'); + attachEvt('common','depthChanged', rdetailReload); + attachEvt('common','locationUpdated', rdetailReload); + attachEvt('common','holdUpdated', rdetailReload); + attachEvt('common','holdUpdateCanceled', rdetailReload); + + copyRowParent = G.ui.rdetail.cp_info_row.parentNode; + copyRow = copyRowParent.removeChild(G.ui.rdetail.cp_info_row); + statusRow = G.ui.rdetail.cp_status.parentNode; + statusRow.id = '__rdsrow'; + + G.ui.rdetail.cp_info_local.onclick = rdetailShowLocalCopies; + G.ui.rdetail.cp_info_all.onclick = rdetailShowAllCopies; + + $('rdetail_place_hold').onclick = function() { + var src = location.href; + if(forceLoginSSL && src.match(/^http:/)) { + src = src.replace(/^http:/, 'https:'); + if(!src.match(/&place_hold=1/)) { + src += '&place_hold=1'; + } + location.href = src; + } else { + holdsDrawEditor({record:record.doc_id(), type:'T'}); + } + } + + if(getLocation() == globalOrgTree.id()) + hideMe(G.ui.rdetail.cp_info_all); + + if(getRid()) { + ridPreDraw(); + marc = new MarcRecord(getRid()); + drawMarcData(); + //var req = new Request(FETCH_RMODS, getRid()); + //req.callback(_rdetailDraw); + //req.send(); + + } else { // No record ID was specified + + // If we have an ISBN in the URL, let's try to find that record + // This allows direct linking by ISBN. + // Note, this uses the first record it finds + if(getRtype() == RTYPE_ISBN) { + var req = fieldmapper.standardRequest(['open-ils.search','open-ils.search.biblio.isbn'], {'params':[getAdvTerm()]}); + if(req && req.count > 0) RID = req.ids[0]; + ridPreDraw(); + marc = new MarcRecord(getRid()); + drawMarcData(); + //var req2 = new Request(FETCH_RMODS, getRid()); + //req2.callback(_rdetailDraw); + //req2.send(); + } + } + + var isbn = cleanISBN(marc.marcObj["020"] ? marc.marcObj["020"][0]["a"][0] : (marc.marcObj["024"]?marc.marcObj["024"][0]["a"][0]:"0")); + $('rdetail_image').src = buildISBNSrc(isbn); + $('rdetail_img_link').href = buildISBNSrc(isbn, "large"); + unHideMe($('rdetail_img_link')); + + $('content_cafe_summary').src="http://contentcafe2.btol.com/ContentCafeClient/ContentCafe.aspx?UserID=KC72927&Password=CC14647&ItemKey="+isbn+"&Options=Y"; + // ChiliFresh + if (chilifresh && chilifresh != '(none)' && isbn) { + $('chilifreshReviewLink').setAttribute('id','isbn_'+isbn); + $('chilifreshReviewResult').setAttribute('id','chili_review_'+isbn); + try { + chili_init(); + unHideMe($('rdetail_awards_link')); + unHideMe($('rdetail_chilifresh_reviews')); + unHideMe($('rdetail_chilifresh_lbl')); + } catch(E) { + alert(E + '\n'); + } + } + + // Novelist + if (novelist && isbn) { + unHideMe($('rdetail_awards_link')); + unHideMe($('rdetail_novelist_lbl')); + unHideMe($('rdetail_novelist_div')); + var isbnEl = elem("div",null,"ISBN "+isbn); + isbnEl.className = "hide_me"; + document.body.appendChild(isbnEl); + } + + fieldmapper.standardRequest(["open-ils.search","open-ils.search.biblio.copy_counts.summary.retrieve"], {"async":true, "params":[getRid()], "oncomplete":function(r){ + var res = []; if(r) res = r.recv(); if(res) res = res.content(); + for(var i in res) { + copyObjsCN[res[i][0]] = res[i][1]; + fieldmapper.standardRequest(["open-ils.search", "open-ils.search.asset.copy.retrieve_by_cn_label"], {"async":true, "params":[getRid(), res[i][1], res[i][0]], "oncomplete":getCopyIDs}); + } + }}); + +runEvt("rdetail", "recordDrawn"); + + if (rdetailDisplaySerialHoldings) { + var req = new Request(FETCH_MFHD_SUMMARY, getRid()); + req.callback(_holdingsDraw); + req.send(); + if (isXUL()) { + var here = findOrgUnit(getLocation()); + dojo.place("
", "rdetail_details_table", "after"); + var mfhd_add = new dijit.Menu({style:"float: right;"}); + new dijit.MenuItem({onClick:function(){ + var req = new Request(CREATE_MFHD_RECORD, G.user.session, 1, here.id(), getRid()); + var res = req.send(); + alert(dojo.string.substitute(opac_strings.CREATED_MFHD_RECORD, [here.name()])); + }, label:opac_strings.CREATE_MFHD}).placeAt(mfhd_add); + mfhd_add.placeAt('mfhd_ad_menu'); + } + } + + detachAllEvt("result", "idsReceived"); + G.evt.result.hitCountReceived = []; + G.evt.result.recordReceived = []; + G.evt.result.copyCountsReceived = []; + G.evt.result.allRecordsReceived = []; + //unHideMe($('rdetail_copy_info_link')); +} + +function getCopyIDs(r) { + var res = []; if(r) res = r.recv(); if(res) res = res.content(); + copyObjsCount += res.length; + if(res.length) fieldmapper.standardRequest(["open-ils.search", "open-ils.search.asset.copy.fleshed.batch.retrieve"], {"async":true, "params":[res], "oncomplete":getCopyObjs}); +} + +function getCopyObjs(r) { + var res = []; if(r) res = r.recv(); if(res) res = res.content(); + if(res.length) copyObjs = copyObjs.concat(res); + if(copyObjs.length >= copyObjsCount) drawCopyStatusDetails(); +} + +function drawCopyStatusDetails() { + var tehTR = $('rdetails_status_head'); + if(!tehTR) return; + var showLibCount = 5; + + if(getOrigLocation()) copyObjs.sort(function(a,b) { + if(a.circ_lib().id()==getOrigLocation()) return -1; + if(b.circ_lib().id()==getOrigLocation()) return 1; + return a.circ_lib().name().toLowerCase()>=b.circ_lib().name().toLowerCase()?1:-1; + }); else copyObjs.sort(function(a,b){ + return a.circ_lib().name().toLowerCase()>=b.circ_lib().name().toLowerCase()?1:-1; + }); + + if(copyObjs.length) unHideMe($('rdetails_status')); + for(var i in copyObjs) { + var obj = copyObjs[i]; + if(!isTrue(obj.circ_lib().opac_visible())) { showLibCount++; continue; } + var par = ishowLibCount) unHideMe($('rdetail_locs_expand')); +} + +function drawCopyStatus(r) { + var res = null; if(r) res = r.recv(); if(res) res = res.content(); + if(!res) return; + var cell = $("copy_status_"+r.params[0]); + if(cell) cell.innerHTML = dojo.date.locale.format(dojo.date.stamp.fromISOString(res), {selector:'date', fullYear: true, datePattern:"M-d-yyyy"}); +} + +function rdetailGetPageIds() { + attachEvt("result", "idsReceived", rdetailSetPaging ); + resultFetchAllRecords = true; + rresultCollectIds(true); +} + +function buildunAPISpan (span, type, id) { + var cgi = new CGI(); + var d = new Date(); + + addCSSClass(span,'unapi-id'); + + span.setAttribute( + 'title', 'tag:' + cgi.server_name + ',' + + d.getFullYear() + ':' + type + '/' + id + ); +} + +function rdetailViewMarc(r,id) { + hideMe($('rdetail_extras_loading')); + $('rdetail_view_marc_box').innerHTML = r.getResultObject(); + + var div = elem('div', { "class" : 'hide_me' }); + var span = div.appendChild( elem('abbr') ); + + buildunAPISpan( span, 'biblio-record_entry', getRid() ); + + $('rdetail_view_marc_box').insertBefore(span, $('rdetail_view_marc_box').firstChild); +} + + +function rdetailShowLocalCopies() { + rdetailShowLocal = true; + rdetailBuildInfoRows(); + hideMe(G.ui.rdetail.cp_info_local); + unHideMe(G.ui.rdetail.cp_info_all); + hideMe(G.ui.rdetail.cp_info_none); +} + +function rdetailShowAllCopies() { + + rdetailShowLocal = false; + rdetailBuildInfoRows(); + hideMe(G.ui.rdetail.cp_info_all); + unHideMe(G.ui.rdetail.cp_info_local); + hideMe(G.ui.rdetail.cp_info_none); +} + +function OpenMarcEditWindow(pcrud, rec) { + /* + To run in Firefox directly, must set signed.applets.codebase_principal_support + to true in about:config + */ + netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect'); + win = window.open('/xul/server/cat/marcedit.xul'); // XXX version? + dojo.require('openils.PermaCrud'); + + win.xulG = { + "record": {"marc": rec.marc()}, + "save": { + "label": opac_strings.SAVE_MFHD_LABEL, + "func": function(xmlString) { + rec.marc(xmlString); + rec.ischanged(true); + pcrud.update(rec); + } + } + }; +} + +function loadMarcEditor(recId) { + var pcrud = new openils.PermaCrud({"authtoken": G.user.session}); + var rec = pcrud.retrieve("sre", recId); + if (rec) { + OpenMarcEditWindow(pcrud, rec); + } +} + +/* + * This function could be written much more intelligently + * Limited brain power means that I'm brute-forcing it for now + */ +function _holdingsDraw(h) { + holdings = h.getResultObject(); + if (!holdings) { return null; } + + dojo.forEach(holdings, _holdingsDrawMFHD); + +} + +function _holdingsDrawMFHD(holdings, entryNum) { + + var here = findOrgUnit(getLocation()); + if (getDepth() > 0 || getDepth === 0 ) { + while (getDepth() < findOrgDepth(here)) + here = findOrgUnit( here.parent_ou() ); + if (!orgIsMine(findOrgUnit(here), findOrgUnit(holdings.owning_lib()))) { + return null; + } + } + + var hh = holdings.basic_holdings_add(); + var hch = holdings.basic_holdings(); + var hs = holdings.supplement_holdings_add(); + var hcs = holdings.supplement_holdings(); + var hi = holdings.index_holdings_add(); + var hci = holdings.index_holdings(); + var ho = holdings.online(); + var hm = holdings.missing(); + var hinc = holdings.incomplete(); + var hloc = holdings.location() || 'MFHD'; + + if ( hh.length == 0 && hch.length == 0 && hs.length == 0 && + hcs.length == 0 && hi.length == 0 && hci.length == 0 && + ho.length == 0 && hm.length == 0 && hinc.length == 0 + ) { + + if (isXUL()) { + /* + * If we have a record, but nothing to show for it, then the + * record is likely empty or corrupt. This gives cataloguers a + * chance to add holdings or correct the record + */ + hh = 'PLACEHOLDER'; + } else { + return null; + } + } + + dojo.place("
" + + dojo.string.substitute(opac_strings.HOLDINGS_TABLE_CAPTION, [hloc]) + + "
", "rdetail_details_table", "after" + ); + if (hh.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.HOLDINGS, hh); } + if (hch.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.CURRENT_HOLDINGS, hch); } + if (hs.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.SUPPLEMENTS, hs); } + if (hcs.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.CURRENT_SUPPLEMENTS, hcs); } + if (hi.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.INDEXES, hi); } + if (hci.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.CURRENT_INDEXES, hci); } + if (ho.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.ONLINE_VOLUMES, ho); } + if (hm.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.MISSING_VOLUMES, hm); } + if (hinc.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.INCOMPLETE_VOLUMES, hinc); } + + if (isXUL()) { + dojo.require('openils.Event'); + dojo.require('openils.PermaCrud'); + var mfhd_edit = new dijit.Menu({}); + new dijit.MenuItem({onClick: function(){loadMarcEditor(holdings.id())}, label:opac_strings.EDIT_MFHD_RECORD}).placeAt(mfhd_edit, "first"); + new dijit.MenuItem({onClick:function(){ + var pcrud = new openils.PermaCrud({"authtoken": G.user.session}); + var mfhd_rec = pcrud.retrieve("sre", holdings.id()); + if (mfhd_rec) { + pcrud.eliminate(mfhd_rec); + alert(dojo.string.substitute(opac_strings.DELETED_MFHD_RECORD, [holdings.id()])); + } + }, label:opac_strings.DELETE_MFHD}).placeAt(mfhd_edit, "last"); + // new dijit.MenuItem({onClick:function(){alert("Edit properties " + holdings.id());}, label:opac_strings.EDIT_PROPERTIES}).placeAt(mfhd_edit, "last"); + var mfhd_mb = new dijit.form.DropDownButton({dropDown: mfhd_edit, label:opac_strings.EDIT_MFHD_MENU, style:"float:right"}); + mfhd_mb.placeAt("mfhdHoldingsCaption" + entryNum, "last"); + mfhd_edit.startup(); + } +} + +function _holdingsDrawMFHDEntry(entryNum, entryName, entry) { + var flatEntry = entry.toString().replace(/,/g, ', '); + dojo.place(" " + entryName + "" + flatEntry + "", "rdetail_holdings_tbody_" + entryNum, "last"); +} + +function drawCopyCounts(r) { + var res = r.recv().content(); + if(!res.length) return; + var str = ""; + + var holdCnt = fieldmapper.standardRequest(['open-ils.circ','open-ils.circ.bre.holds.count'], {"async":false, "params":[getRid()]}); + str += holdCnt+' hold'+(holdCnt==1?'':'s')+' on first copy returned of '+res[0].count+' cop'+(res[0].count==1?'y':'ies')+'
'; + str += res[0].available+' cop'+(res[0].available==1?'y':'ies')+' available'; + $('rdetail_copies_avail').innerHTML = str; +} + +function drawMarcData() { + marc.render("245", {"container":"rdetail_title", "showAGR":true, "sGlue":{"startStr":"
", "joinStr":" ", "endStr":"
"}}); + marc.render("520", {"container":"rdetail_summary_container", "label":"rdetail_summary_link", "sGlue":{"joinStr":" "}}); + marc.render("505", {"container":"rdetail_content_div_inner", "label":"rdetail_content_link", "sGlue":{"joinStr":" "}}); + marc.render(["100", "110", "111"], {"container":"rdetail_author", "label":"author_lbl", "searchType":STYPE_AUTHOR, "skipCodes":"d"}); + + // authors box + marc.render(["100", "110", "111"], {"container":"rdetail_authors_inner", "searchType":STYPE_AUTHOR, "label":["rdetail_authors_link", "authors_lbl"], "sGlue":{"joinStr":" ", "endStr":"
"}, "showAGR":true, "unlink":"d"}); + marc.render(["700", "710", "711"], {"container":"rdetail_moar_authors", "searchType":STYPE_AUTHOR, "label":["rdetail_authors_link", "add_authors_lbl"], "sGlue":{"joinStr":" ", "endStr":"
"}, "unlink":"d"}); + marc.render("508", {"container":"rdetail_credits", "searchType":STYPE_AUTHOR, "label":["rdetail_authors_link", "credits_lbl"]}); + marc.render("511", {"container":"rdetail_cast", "searchType":STYPE_AUTHOR, "label":["rdetail_authors_link", "cast_lbl"]}); + + // subject box + marc.render(["600", "610", "611", "630", "650", "651"], {"sGlue":{"joinStr":" -- ", "endStr":"
"}, "container":"rdetail_subject_container", "label":["rdetail_subject_link", "subject_lbl"], "searchType":STYPE_SUBJECT}); + marc.render(["655", "695"], {"sGlue":{"joinStr":" -- ", "endStr":"
"}, "container":"rdetail_genre_cont", "label":["rdetail_subject_link", "genre_lbl"], "searchType":STYPE_SUBJECT}); + marc.render("690", {"sGlue":{"joinStr":" -- ", "endStr":"
"}, "container":"rdetail_topic_cont", "label":["rdetail_subject_link", "topic_lbl"], "searchType":STYPE_SUBJECT}); + marc.render("691", {"sGlue":{"joinStr":" -- ", "endStr":"
"}, "container":"rdetail_geo_cont", "label":["rdetail_subject_link", "geo_set_lbl"], "searchType":STYPE_SUBJECT}); + marc.render("692", {"sGlue":{"joinStr":" -- ", "endStr":"
"}, "container":"rdetail_bio_cont", "label":["rdetail_subject_link", "bio_sub_lbl"], "searchType":STYPE_SUBJECT}); + marc.render("693", {"sGlue":{"joinStr":" -- ", "endStr":"
"}, "container":"rdetail_attrib_cont", "label":["rdetail_subject_link", "char_attrib_lbl"], "searchType":STYPE_SUBJECT}); + marc.render("698", {"sGlue":{"joinStr":" -- ", "endStr":"
"}, "container":"rdetail_setting_cont", "label":["rdetail_subject_link", "setting_lbl"], "searchType":STYPE_SUBJECT}); + marc.render("699", {"sGlue":{"joinStr":" -- ", "endStr":"
"}, "container":"rdetail_time_cont", "label":["rdetail_subject_link", "time_lbl"], "searchType":STYPE_SUBJECT}); + + // series box + marc.render(['440','490','800','810','811','830','694'], {"showAGR":true, "container":"rdetail_series_container", "label":"rdetail_series_link", "searchType":STYPE_SERIES, "sGlue":{"joinStr":" -- ", "endStr":"
"}}); + + // awards box + marc.render(["586", "697"], {"container":"rdetail_awards_cont", "label":"rdetail_awards_link", "showOnly":"a"}); + + // details box + marc.render(["130", "240", "246", "730", "740"], {"container":"added_title", "label":["rdetail_details_link", "add_title_lbl"], "searchType":STYPE_KEYWORD, "sGlue":{"joinStr":" -- ", "endStr":"
"}}); + marc.render("250", {"container":"rdetail_edition", "label":["rdetail_details_link", "edition_lbl"], "searchType":STYPE_KEYWORD, "fGlue":{"joinStr":" "}, "sGlue":{"joinStr":" "}}); + marc.render("500", {"container":"rdetail_note", "label":["rdetail_details_link", "note_lbl"], "searchType":STYPE_KEYWORD, "fGlue":{"joinStr":" "}, "sGlue":{"joinStr":" "}}); + marc.render("546", {"container":"rdetail_lang", "label":["rdetail_details_link", "lang_lbl"], "searchType":STYPE_KEYWORD, "fGlue":{"joinStr":" "}, "sGlue":{"joinStr":" "}}); + marc.render("516", {"container":"comp_file_note", "label":["rdetail_details_link", "comp_note_lbl"], "searchType":STYPE_KEYWORD, "fGlue":{"joinStr":" "}, "sGlue":{"joinStr":" "}}); + marc.render("538", {"container":"sys_details", "label":["rdetail_details_link", "sys_detail_lbl"], "searchType":STYPE_KEYWORD, "fGlue":{"joinStr":" "}, "sGlue":{"joinStr":" "}}); + marc.render("507", {"container":"map_scale_note", "label":["rdetail_details_link", "map_scale_lbl"], "searchType":STYPE_KEYWORD, "fGlue":{"joinStr":" "}, "sGlue":{"joinStr":" "}}); + marc.render("518", {"container":"rdetail_event", "label":["rdetail_details_link", "event_lbl"], "searchType":STYPE_KEYWORD, "fGlue":{"joinStr":" "}, "sGlue":{"joinStr":" "}}); + marc.render("521", {"container":"audience", "label":["rdetail_details_link", "audience_lbl"], "searchType":STYPE_KEYWORD, "fGlue":{"joinStr":" "}, "sGlue":{"joinStr":" "}}); + marc.render("530", {"container":"phys_form", "label":["rdetail_details_link", "phys_form_lbl"], "searchType":STYPE_KEYWORD, "fGlue":{"joinStr":" "}, "sGlue":{"joinStr":" "}}); + marc.render("504", {"container":"rdetail_biblio", "label":["rdetail_details_link", "biblio_lbl"], "searchType":STYPE_KEYWORD, "fGlue":{"joinStr":" "}, "sGlue":{"joinStr":" "}}); + marc.render("590", {"container":"local_note", "label":["rdetail_details_link", "local_note_lbl"], "searchType":STYPE_KEYWORD, "fGlue":{"joinStr":" "}, "sGlue":{"joinStr":" "}}); + marc.render("506", {"container":"restrictions", "label":["rdetail_details_link", "restrict_lbl"], "searchType":STYPE_KEYWORD, "fGlue":{"joinStr":" "}, "sGlue":{"joinStr":" "}}); + marc.render("780", {"container":"continues", "label":["rdetail_details_link", "continues_lbl"], "searchType":STYPE_KEYWORD, "fGlue":{"joinStr":" "}, "sGlue":{"joinStr":" "}}); + marc.render("785", {"container":"cont_by", "label":["rdetail_details_link", "cont_by_lbl"], "searchType":STYPE_KEYWORD, "fGlue":{"joinStr":" "}, "sGlue":{"joinStr":" "}}); + + marc.render(["092", "099"], {"container":"rdetail_callnum", "label":"callnum_lbl", "sGlue":{"joinStr":" ", "endStr":" "}}); + marc.render("260", {"container":"rdetail_pubdate", "label":"pubdate_lbl", "showOnly":"c"}); + marc.render("300", {"container":"rdetail_physical_desc", "label":"phys_desc_lbl", "sGlue":{"joinStr":" "}}); + marc.render("260", {"container":"rdetail_publisher", "label":"publisher_lbl", "showAGR":true, "showOnly":["a", "b"], "sGlue":{"joinStr":" ", "endStr":"
"}}); + marc.render("856", {"container":"online_resources", "label":"online_res_lbl", "linkSrc":"u", "linkText":["z", "y", "3"], "fGlue":{"joinStr":"
"}}); + + var code = marc.render("998", {"showOnly":"d"}); + var imgEl = $("rdetail_tor_pic"); + if(setFormatIcon(imgEl, code)) unHideMe(imgEl); + +/* + + if(marcObj["856"]) { + var online = $('online_resources'); + var m856 = marcObj["856"]; + for(var i in m856) { + var url = m856[i]["u"] || ""; + online.appendChild(elem('a', {"href":url}, (m856[i]["z"] | m856[i]["y"] | m856[i]["3"]))); // should only be one of z, y, 3 + online.appendChild(elem('br')); + } + } +*/ +} + +function _rdetailDraw(r) { + record = r.getResultObject(); + runEvt('rdetail', 'recordRetrieved', record.doc_id()); + + if(isInAnonList(parseInt(record.doc_id()))) { + $('add_mylist').innerHTML = 'Remove from my list'; + $('add_mylist').title = 'Remove from my list'; + } + + G.ui.rdetail.title.appendChild(text(record.title())); + buildSearchLink(STYPE_AUTHOR, record.author(), G.ui.rdetail.author); + if(record.isbn()) { unHideMe($('rdetail_isbn_lbl')); G.ui.rdetail.isbn.appendChild(text(cleanISBN(record.isbn()))); } + if(record.edition()) { unHideMe($('rdetail_ed_lbl')); G.ui.rdetail.edition.appendChild(text(record.edition())); } + if(record.pubdate()) { unHideMe($('rdetail_pubdate_lbl')); G.ui.rdetail.pubdate.appendChild(text(record.pubdate())); } + if(record.publisher()) { unHideMe($('rdetail_pub_lbl')); G.ui.rdetail.publisher.appendChild(text(record.publisher())); } + if(record.physical_description()) { unHideMe($('rdetail_phys_lbl')); $('rdetail_physical_desc').appendChild(text(record.physical_description())); } + $('content_cafe_summary').src="http://contentcafe2.btol.com/ContentCafeClient/ContentCafe.aspx?UserID=KC72927&Password=CC14647&ItemKey="+cleanISBN(record.isbn())+"&Options=Y"; + + var code = getMarcData(record.doc_id(),"998","d"); + var imgEl = $("rdetail_tor_pic"); + + if(code) { unHideMe($('rdetail_form_lbl')); G.ui.rdetail.tor.innerHTML = get998dValue(code); } + //if(record.synopsis()) { unHideMe($('rdetail_sum_lbl')); G.ui.rdetail.abstr.appendChild(text(record.synopsis())); } + if(setFormatIcon(imgEl, code)) unHideMe(imgEl); + + try{ + if(record.isbn()) { + if(ENABLE_ADDED_CONTENT_ATTRIB_LINKS) { + unHideMe($('rdetail.jacket_attrib_div')); + var href = $('rdetail.jacket_attrib_link').getAttribute('href') +cleanISBN(record.isbn()); + $('rdetail.jacket_attrib_link').setAttribute('href', href); + } + rdetailCheckForGBPreview(); + + } else { + //hideMe($("rdetail.jacket_attrib_div")); + //hideMe($("rdetail_img_link")); + } + } catch(E) {} + + + // see if the record has any external links + var links = record.online_loc(); + for( var i = 0; links && links.length > 0 && i < links.length; i = i + 3 ) { + var href = links[i]; + // avoid matching "HTTP: The Complete Reference" + if( href.match(/https?:\/|ftps?:\/|mailto:/i) ) { + unHideMe($('rdetail_online_row')); + // MODS can contain a display label (used for the text of the link) + // as well as a note about the URL; many legacy systems conflate the + // two and generate MARC records that expect the note to be used as + // the text of the link, with no display label; here's the canonical + // format: + // + // 856 40 $uhttp://localhost$yDisplay label$zPublic note + // + // Note that the MARC21slim2MODS XSL concatenates $3 and $y together + // (as $y was defined later in MARC21's life as the display label) + var displayLabel = '' + links[i+1]; + var note = '' + links[i+2]; + if(!displayLabel || displayLabel.match(/https?:\/|ftps?:\/|mailto:/i)) { + if(!note || note.match(/https?:\/|ftps?:\/|mailto:/i)) { + displayLabel = href; + } else { + displayLabel = note; + } + } + $('rdetail_online').appendChild(elem('a', {href:href,'class':'classic_link'}, displayLabel)); + if (note && note != displayLabel) { + $('rdetail_online').appendChild(elem('span', {'class':'url_note'}, ' - ' + note)); + } + $('rdetail_online').appendChild(elem('br')); + } + } + + // Fill in our unAPI ID, if anyone cares + var abbrs = document.getElementsByTagName('abbr'); + var span; + for (var i = 0; i < abbrs.length; i = i + 1) { + if (abbrs[i].getAttribute('name') == 'unapi') { + span = abbrs[i]; + break; + } + } + buildunAPISpan( span, 'biblio-record_entry', record.doc_id() ); + + var RW = $('rdetail_exp_refworks'); + if (RW && rdetailEnableRefWorks) { + + var here = (findOrgUnit(getLocation())).name(); + var org_name = here.replace(" ", "+"); + var cgi = new CGI(); + + RW.setAttribute( + 'href', + rdetailRefWorksHost + '/express/expressimport.asp?vendor=' + + org_name + + '&filter=MARC+Format&database=All+MARC+Formats&encoding=65001&url=http%3A%2F%2F' + + cgi.server_name + '/opac/extras/supercat/marctxt/record/' + + record.doc_id() + ); + + RW.setAttribute('target', 'RefWorksMain'); + unHideMe($('rdetail_exp_refworks_span')); + } + + //$('rdetail_img_link').setAttribute('href', buildISBNSrc(cleanISBN(record.isbn()), 'large')); + //G.ui.rdetail.image.setAttribute("src", buildISBNSrc(cleanISBN(record.isbn()))); + runEvt("rdetail", "recordDrawn"); + recordsCache.push(record); + + rdetailSetExtrasSelector(); + + var breq = new Request(FETCH_BRE, [getRid()]); + breq.callback( rdetailCheckDeleted ); + breq.send(); + + //resultBuildCaches( [ record ] ); + //resultDrawSubjects(); + //resultDrawSeries(); + + // grab added content + acCollectData(cleanISBN(record.isbn()), rdetailhandleAC); + + var currentISBN = cleanISBN(record.isbn()); + + + + var it = getCacheValue('showHoldEditor'); + if(it) { + setCacheValue('showHoldEditor', null); + holdsDrawEditor({record:it.record, type:it.type}); + } +} + + + +function rdetailCheckDeleted(r) { + var br = r.getResultObject()[0]; + if( isTrue(br.deleted()) ) { + hideMe($('rdetail_place_hold')); + $('rdetail_more_actions_selector').disabled = true; + unHideMe($('rdetail_deleted_exp')); + } +} + +function rdetailSetExtrasSelector() { + if(!grabUser()) return; + unHideMe($('rdetail_more_actions')); + + var req = new Request( + FETCH_CONTAINERS, G.user.session, G.user.id(), 'biblio', 'bookbag' ); + req.callback(rdetailAddBookbags); + req.send(); +} + +var myListsFetched = false; +var selectedItem = null; +function addMyList(id) { + if(!id) id = record.doc_id(); + //if(!grabUser()) { alert("Please login first"); goTo(buildOPACLink({page:MYOPAC}, false, true)); return; } + + var holdsLink = $n($('result_table_template_'+id), 'result_my_list_link'); + if(!holdsLink) holdsLink = $('add_mylist'); + var lbl = $('myListLabel'); + var title = ""; + if(_resultFindRec) title = _resultFindRec(id); + if(title) title = title.title(); + if(lbl) lbl.innerHTML = title; else lbl.innerHTML = ""; + + //if(!grabUser()) { + isCacheListDrawn = false; + for(var i in anonListCache) { + if(anonListCache[i] == id) { + anonListCache.splice(i, 1); + setCacheValue('anonListCache', anonListCache); + if(!anonListCache.length) hideMe($('cacheListLink')); + if(holdsLink) { + holdsLink.innerHTML = 'Add to my list'; + //holdsLink.appendChild(elem('img', {src:'/opac/skin/kcls/graphics/add_mylist.gif'}, null)); + holdsLink.title = "Add to my list"; + } + return; + } + } + + anonListCache.push(id); + setCacheValue('anonListCache', anonListCache); + unHideMe($('cacheListLink')); + if(holdsLink) { + holdsLink.innerHTML = 'Remove from my list'; + //holdsLink.appendChild(elem('img', {src:'/opac/skin/kcls/graphics/add_mylist_sel.gif'}, null)); + holdsLink.title = "Remove from my list"; + } + return; + //} + + selectedItem = id; + var selector = $('mylist_selector'); + + if(findCurrentPage()==RDETAIL) { + unHideMe($('rdetail_more_actions_selector')); + } else if(findCurrentPage()==RRESULT) { + hideResultsPage(true); + unHideMe($('mylist_div')); + } + if(!myListsFetched) { + myListsFetched = true; + var req = new Request(FETCH_CONTAINERS, G.user.session, G.user.id(), 'biblio', 'bookbag' ); + req.callback(showMyLists); + req.send(); + } +} + +function saveMyList() { + if(!selectedItem) return true; + var newList = $('mylist_new'); + if(!newList) return true; + + var selector = $('mylist_selector'); + if(!selector.options.length && !newList.value) { alert('Please choose a name for the new list'); newList.focus(); return false; } + + if(newList.value) { + var id; + var name = newList.value + if(id = containerCreate(name)) { + selector.options.length=0; + if(!selector.options.length) { + unHideMe($('myListSelect')); + var req = new Request(FETCH_CONTAINERS, G.user.session, G.user.id(), 'biblio', 'bookbag' ); + req.callback(showMyLists); + req.send(); + } + if(containerCreateItem(id, selectedItem)) { + alert('Item successfully added to list'); + newList.value = ""; + } else { return false; } + } else { return false; } + } else { //save to selected list + var selectedID = selector.options[selector.selectedIndex].value; + if(containerCreateItem(selectedID, selectedItem)) { + alert('Item successfully added to list'); + newList.value = ""; + } else { return false; } + } + + if(findCurrentPage()==RDETAIL) { + hideMe($('rdetail_more_actions_selector')); + } else if(findCurrentPage()==RRESULT) { + hideResultsPage(false); + } + return true; +} + +function showMyLists(r) { + var containers = r.getResultObject(); + var selector = $('mylist_selector'); + + for( var i = 0; i != containers.length; i++ ) { + var container = containers[i]; + insertSelectorVal( selector, i, container.name(), container.id(), null, 0 ); + } + if(!selector.options.length) hideMe($('myListSelect')); +} + + +function rdetailAddBookbags(r) { + + var containers = r.getResultObject(); + var selector = $('rdetail_more_actions_selector'); + var found = false; + var index = 3; + doSelectorActions(selector); + + for( var i = 0; i != containers.length; i++ ) { + found = true; + var container = containers[i]; + insertSelectorVal( selector, index++, container.name(), + "container_" + container.id(), rdetailAddToBookbag, 1 ); + } + + nextContainerIndex = index; +} + +var _actions = {}; +function rdetailNewBookbag() { + var name = prompt($('rdetail_bb_new').innerHTML,""); + if(!name) return; + + var id; + if( id = containerCreate( name ) ) { + alert($('rdetail_bb_success').innerHTML); + var selector = $('rdetail_more_actions_selector'); + insertSelectorVal( selector, nextContainerIndex++, name, + "container_" + id, rdetailAddToBookbag, 1 ); + setSelector( selector, 'start' ); + } +} + + +function rdetailAddToBookbag() { + var selector = $('rdetail_more_actions_selector'); + var id = selector.options[selector.selectedIndex].value; + setSelector( selector, 'start' ); + + if( containerCreateItem( id.substring(10), record.doc_id() )) { + alert($('rdetail_bb_item_success').innerHTML); + } +} + +function rdetailShowAllExtras(bool) { + var nodes = jQuery('.rdetail_extras').filter(function(){ return jQuery(this).css('display')=='block';}); + nodes.each(function(){ + rdetailShowExtra(this.getAttribute("rel2")); + var node = $(this.getAttribute("rel")); + if(bool) unHideMe(node); else hideMe(node); + }); +} + + +var rdetailMarcFetched = false; +function rdetailShowExtra(type, args) { + var obj = jQuery('[rel2='+type+']').get()[0]; + var node = $(obj.getAttribute('rel')); + var arrow = $(obj.getAttribute('rel')+"_arrow"); + if(jQuery(node).css('display')=='block') { + hideMe(node); + arrow.src="/opac/skin/kcls/graphics/rdetail_arrow.png"; + } else { + unHideMe(node); + arrow.src="/opac/skin/kcls/graphics/rdetail_arrow_down.png"; + } + + removeCSSClass($('rdetail_copy_info_link'), 'rdetail_extras_selected'); + removeCSSClass($('rdetail_viewcn_link'), 'rdetail_extras_selected'); + removeCSSClass($('rdetail_reviews_link'), 'rdetail_extras_selected'); + removeCSSClass($('rdetail_toc_link'), 'rdetail_extras_selected'); + removeCSSClass($('rdetail_excerpt_link'), 'rdetail_extras_selected'); + removeCSSClass($('rdetail_preview_link'), 'rdetail_extras_selected'); + removeCSSClass($('rdetail_anotes_link'), 'rdetail_extras_selected'); + removeCSSClass($('rdetail_annotation_link'), 'rdetail_extras_selected'); + removeCSSClass($('rdetail_viewmarc_link'), 'rdetail_extras_selected'); + removeCSSClass($('rdetail_novelist_link'), 'rdetail_extras_selected'); + + switch(type) { + + case "copyinfo": + addCSSClass($('rdetail_copy_info_link'), 'rdetail_extras_selected'); + break; + + case "reviews": + addCSSClass($('rdetail_reviews_link'), 'rdetail_extras_selected'); + break; + + case "excerpt": + addCSSClass($('rdetail_excerpt_link'), 'rdetail_extras_selected'); + break; + + case "preview": + addCSSClass($('rdetail_preview_link'), 'rdetail_extras_selected'); + rdetailDisplayGBPreview(); + break; + + case "anotes": + addCSSClass($('rdetail_anotes_link'), 'rdetail_extras_selected'); + break; + + case "toc": + addCSSClass($('rdetail_toc_link'), 'rdetail_extras_selected'); + break; + + case "marc": + addCSSClass($('rdetail_viewmarc_link'), 'rdetail_extras_selected'); + if(rdetailMarcFetched) return; + unHideMe($('rdetail_extras_loading')); + rdetailMarcFetched = true; + var req = new Request( FETCH_MARC_HTML, getRid()); + req.callback(rdetailViewMarc); + req.send(); + break; + + case "novelist": + addCSSClass($('rdetail_novelist_link'), 'rdetail_extras_selected'); + break; + + case 'cn': + addCSSClass($('rdetail_viewcn_link'), 'rdetail_extras_selected'); + rdetailShowCNBrowse(defaultCN, getLocation(), null, true); + break; + + } +} + +function rdetailVolumeDetails(args) { + var row = $(args.rowid); + var tbody = row.parentNode; + cpdBuild( tbody, row, record, args.cn, args.org, args.depth, args.copy_location ); + return; +} + +function rdetailBuildCNList() { + + var select = $('cn_browse_selector'); + var index = 0; + var arr = []; + for( var cn in callnumberCache ) arr.push( cn ); + arr.sort(); + + if( arr.length == 0 ) { + hideMe($('rdetail_cn_browse_select_div')); + return; + } + + for( var i in arr ) { + var cn = arr[i]; + var opt = new Option(cn); + select.options[index++] = opt; + } + select.onchange = rdetailGatherCN; +} + +function rdetailGatherCN() { + var cn = getSelectorVal($('cn_browse_selector')); + rdetailShowCNBrowse( cn, getLocation(), getDepth(), true ); + setSelector( $('cn_browse_selector'), cn ); +} + + +function rdetailShowCNBrowse( cn, loc, depth, fromOnclick ) { + + if(!cn) { + unHideMe($('cn_browse_none')); + hideMe($('rdetail_cn_browse_select_div')); + return; + } + + unHideMe($('rdetail_cn_browse_select_div')); + rdetailBuildCNList(); + setSelector( $('cn_browse_selector'), cn ); + //hideMe($('rdetail_copy_info_div')); + //hideMe($('rdetail_reviews_div')); + //hideMe($('rdetail_toc_div')); + //hideMe($('rdetail_marc_div')); + //unHideMe($('rdetail_cn_browse_div')); + unHideMe($('cn_browse')); + if( !rdetailLocalOnly && ! fromOnclick ) depth = findOrgDepth(globalOrgTree); + cnBrowseGo(cn, loc, depth); +} + +function rdetailhandleAC(data) { + + if( data.reviews.html ) { + $('rdetail_review_container').innerHTML = data.reviews.html; + unHideMe($('rdetail_awards_link')); + } + + if( data.toc.html ) { + $('rdetail_toc_div').innerHTML = data.toc.html; + unHideMe($('rdetail_content_link')); + } + + if( data.excerpt.html ) { + $('rdetail_excerpt_div').innerHTML = data.excerpt.html; + unHideMe($('rdetail_excerpt_link')); + } + + if( data.anotes.html ) { + $('rdetail_anotes_div').innerHTML = data.anotes.html; + unHideMe($('rdetail_authors_link')); + } +} + +function rdetailShowReviews(r) { + hideMe($('rdetail_extras_loading')); + var res = r.getResultObject(); + var par = $('rdetail_reviews_div'); + var template = par.removeChild($('rdetail_review_template')); + if( res && res.length > 0 ) { + unHideMe($('rdetail_reviews_link')); + for( var i = 0; i != res.length; i++ ) { + var rev = res[i]; + if( rev.text && rev.info ) { + var node = template.cloneNode(true); + $n(node, 'review_header').appendChild(text(rev.info)); + $n(node, 'review_text').appendChild(text(rev.text)); + par.appendChild(node); + } + } + } +} + + +function rdetailShowTOC(r) { + hideMe($('rdetail_extras_loading')); + var resp = r.getResultObject(); + if(resp) { + unHideMe($('rdetail_content_link')); + $('rdetail_toc_div').innerHTML = resp; + } +} + +function rdetailBuildInfoRows() { + var req; + var method = FETCH_COPY_COUNTS_SUMMARY; + if (rdetailShowCopyLocation) + method = FETCH_COPY_LOCATION_COUNTS_SUMMARY; + + + if( rdetailShowLocal ) + req = new Request(method, getRid(), 1, 0) + else + req = new Request(method, getRid()); + req.callback(_rdetailBuildInfoRows); + req.send(); +} + +function _rdetailRows(node) { + + if( rdetailShowLocal && /*getLocation()*/1 != globalOrgTree.id() ) { + var loc = findOrgUnit(1/*getLocation()*/); + if( node ) { + if( !orgIsMine(node, loc) && !orgIsMine(loc,node) ) return; + } else { + for( var i = 0; i < globalOrgTree.children().length; i++ ) { + var org = findOrgUnit(globalOrgTree.children()[i]); + if( orgIsMine(org, loc) ) { + node = org; + break; + } + } + } + } + + if(!node && findOrgType(globalOrgTree.ou_type()).can_have_vols()) + node = globalOrgTree; + + + /* don't show hidden orgs */ + + if(node) { + + //if(!isXUL() && !isTrue(node.opac_visible())) return; + if(!isXUL() && !isTrue(node.opac_visible())) { + // locally suppressed orgs should appear in the copy summary + if(!localSuppressedOrgs[node.id()]) { // indexOf() on user arrays isn't supported on <= IE8 + return; + } + } + + // , 1555:true, 1499:true, 1510:true, 1538:true + + var row = copyRow.cloneNode(true); + row.id = "cp_info_" + node.id(); + + var libtd = findNodeByName( row, config.names.rdetail.lib_cell ); + var cntd = findNodeByName( row, config.names.rdetail.cn_cell ); + var cpctd = findNodeByName( row, config.names.rdetail.cp_count_cell ); + var actions = $n(row, 'rdetail_actions_cell'); + + var p = libtd.getElementsByTagName('a')[0]; + libtd.insertBefore(text(node.name()), p); + libtd.setAttribute("style", "padding-left: " + ((findOrgDepth(node) - 1) * 9) + "px;"); + + if(!findOrgType(node.ou_type()).can_have_vols()) { + + row.removeChild(cntd); + row.removeChild(cpctd); + row.removeChild(actions); + row.setAttribute('novols', '1'); + + libtd.setAttribute("colspan", numStatuses + 3 ); + libtd.colSpan = numStatuses + 3; + addCSSClass(row, 'copy_info_region_row'); + } + + copyRowParent.appendChild(row); + + } else { node = globalOrgTree; } + + for( var c in node.children() ) + _rdetailRows(node.children()[c]); +} + +function rdetailCNPrint(orgid, cn) { + var div = cpdBuildPrintWindow( record, orgid); + var template = div.removeChild($n(div, 'cnrow')); + var rowNode = $("cp_info_" + orgid); + cpdStylePopupWindow(div); + openWindow(div.innerHTML); +} + +var localCNFound = false; +var ctr = 0; +function _rdetailBuildInfoRows(r) { + + if (rdetailShowCopyLocation) + unHideMe( $n( $('rdetail_copy_info_table'), 'rdetail_copylocation_header' )); + + removeChildren(copyRowParent); + + _rdetailRows(); + + var summary = r.getResultObject(); + if(!summary) return; + + var found = false; + for( var i = 0; i < summary.length; i++ ) { + + var arr = summary[i]; + globalCNCache[arr[1]] = 1; + var thisOrg = findOrgUnit(arr[0]); + var rowNode = $("cp_info_" + thisOrg.id()); + if(!rowNode) continue; + + if(rowNode.getAttribute("used")) { + + if( rowNode.nextSibling ) { + sib = rowNode.nextSibling; + o ='cp_info_'+thisOrg.id()+'_'; + /* push the new row on as the last row for this org unit */ + while( sib && sib.id.match(o) ) { + sib = sib.nextSibling; + } + if(sib) + rowNode = copyRowParent.insertBefore(copyRow.cloneNode(true), sib); + else + rowNode = copyRowParent.appendChild(copyRow.cloneNode(true)); + } else { + rowNode = copyRowParent.appendChild(copyRow.cloneNode(true)); + } + + var n = findNodeByName( rowNode, config.names.rdetail.lib_cell ); + n.appendChild(text(thisOrg.name())); + n.setAttribute("style", "padding-left: " + ((findOrgDepth(thisOrg) - 1) * 9) + "px;"); + rowNode.id = "cp_info_" + thisOrg.id() + '_' + (++ctr); + + } else { + rowNode.setAttribute("used", "1"); + } + + var cpc_temp = rowNode.removeChild( + findNodeByName(rowNode, config.names.rdetail.cp_count_cell)); + + var statuses = arr[2]; + var cl = ''; + if (rdetailShowCopyLocation) { + cl = arr[2]; + statuses = arr[3]; + } + + rdetailApplyStatuses(rowNode, cpc_temp, statuses); + + var isLocal = false; + if( orgIsMine( findOrgUnit(getLocation()), thisOrg ) ) { + found = true; + isLocal = true; + if(!localCNFound) { + localCNFound = true; + defaultCN = arr[1]; + } + } + + //if(isLocal) unHideMe(rowNode); + unHideMe(rowNode); + + rdetailSetPath( thisOrg, isLocal ); + rdetailBuildBrowseInfo( rowNode, arr[1], isLocal, thisOrg, cl ); + + if( i == summary.length - 1 && !defaultCN) defaultCN = arr[1]; + } + + if(!found) unHideMe(G.ui.rdetail.cp_info_none); +} + +function rdetailBuildBrowseInfo(row, cn, local, orgNode, cl) { + if(local) { + var cache = callnumberCache[cn]; + if( cache ) cache.count++; + else callnumberCache[cn] = { count : 1 }; + } + + var depth = getDepth(); + if( !local ) depth = findOrgDepth(globalOrgTree); + + $n(row, 'rdetail_callnumber_cell').appendChild(text(cn)); + + if (rdetailShowCopyLocation) { + var cl_cell = $n(row, 'rdetail_copylocation_cell'); + cl_cell.appendChild(text(cl)); + unHideMe(cl_cell); + } + + _debug('setting action clicks for cn ' + cn); + + var dHref = 'javascript:rdetailVolumeDetails('+ + '{copy_location : "'+cl+'", rowid : "'+row.id+'", cn :"'+cn+'", depth:"'+depth+'", org:"'+orgNode.id()+'", local: '+local+'});'; + + var bHref = 'javascript:rdetailShowCNBrowse("' + cn + '", '+orgNode.id()+', "'+depth+'");'; + + unHideMe( $n(row, 'details') ) + $n(row, 'details').setAttribute('href', dHref); + unHideMe( $n(row, 'browse') ) + $n(row, 'browse').setAttribute('href', bHref); + + if(isXUL()) { + unHideMe($n(row, 'hold_div')); + $n(row, 'hold').onclick = function() { + var req = new Request(FETCH_VOLUME_BY_INFO, cn, record.doc_id(), orgNode.id()); + req.callback( + function(r) { + var vol = r.getResultObject(); + holdsDrawEditor({type: 'V', volumeObject : vol}); + }); + req.send(); + }; + } +} + +// sets the path to org as 'active' and displays the path if it's local +function rdetailSetPath(org, local) { + if( findOrgDepth(org) == 0 ) return; + var row = $("cp_info_" + org.id()); + row.setAttribute("hasinfo", "1"); + unHideMe(row); + rdetailSetPath(findOrgUnit(org.parent_ou()), local); +} + +//Append all the statuses for a given summary to the +//copy summary table +function rdetailApplyStatuses( row, template, statuses ) { + for( var j in _statusPositions ) { + var stat = _statusPositions[j]; + var val = statuses[stat.id()]; + var nn = template.cloneNode(true); + if(val) nn.appendChild(text(val)); + else nn.appendChild(text(0)); + row.appendChild(nn); + } +} + +//Add one td (creating a new column) to the copy summary +//table for each opac_visible copy status +function rdetailBuildStatusColumns() { + + rdetailGrabCopyStatuses(); + var parent = statusRow; + var template = parent.removeChild(G.ui.rdetail.cp_status); + + var i = 0; + for( i = 0; i < cp_statuses.length; i++ ) { + + var c = cp_statuses[i]; + if( c && isTrue(c.opac_visible()) ) { + var name = c.name(); + _statusPositions[i] = c; + var node = template.cloneNode(true); + var data = findNodeByName( node, config.names.rdetail.cp_status); + + data.appendChild(text(name)); + parent.appendChild(node); + } + } + + numStatuses = 0; + for(x in _statusPositions) numStatuses++; +} + +function rdetailGrabCopyStatuses() { + if(cp_statuses) return cp_statuses; + var req = new Request(FETCH_COPY_STATUSES); + req.send(true); + cp_statuses = req.result(); + cp_statuses = cp_statuses.sort(_rdetailSortStatuses); +} + +function _rdetailSortStatuses(a, b) { + return parseInt(a.id()) - parseInt(b.id()); +} + +/** + * Check for a Google Book preview + */ +function rdetailCheckForGBPreview() { + if (!rdetailGoogleBookPreview) return; + searchForGBPreview( cleanISBN(record.isbn()) ); +} + +/** + * + * @param {DOM object} query The form element containing the + * input parameters "isbns" + */ +function searchForGBPreview( isbn ) { + + // Delete any previous Google Booksearch JSON queries. + var GBPJsonScript = document.getElementById("GBPJsonScript"); + if (GBPJsonScript) { + GBPJsonScript.parentNode.removeChild(GBPJsonScript); + } + + // Add a script element with the src as the user's Google Booksearch query. + // JSON output is specified by including the alt=json-in-script argument + // and the callback function is also specified as a URI argument. + var GBPScriptElement = document.createElement("script"); + + GBPScriptElement.setAttribute("id", "GBPJsonScript"); + GBPScriptElement.setAttribute("src", + "http://books.google.com/books?bibkeys=" + + isbn + "&jscmd=viewapi&callback=GBPreviewCallback"); + GBPScriptElement.setAttribute("type", "text/javascript"); + + // make the request to Google booksearch + document.documentElement.firstChild.appendChild(GBPScriptElement); +} + +/** + * This function is the call-back function for the JSON scripts which + * executes a Google book search response. + * + * XXX I18N of text needed + * + * @param {JSON} booksInfo is the JSON object pulled from the Google books service. + */ +function GBPreviewCallback(GBPBookInfo) { + var GBPreviewDiv = document.getElementById("rdetail_preview_div"); + var GBPBook; + + for ( i in GBPBookInfo ) { + GBPBook = GBPBookInfo[i]; + } + + if ( !GBPBook ) { + return; + } + + if ( GBPBook.preview != "noview" ) { + if ( GBPBook.preview == 'full' ) { + setText( $('rdetail_preview_link'), $('rdetail_preview_full_text').innerHTML ); + $('rdetail_preview_link_a').title = $('rdetail_preview_title').innerHTML; + } + + // Add a button below the book cover image to load the preview. + GBPBadge = document.createElement( 'img' ); + GBPBadge.src = 'http://books.google.com/intl/en/googlebooks/images/gbs_preview_button1.gif'; + GBPBadge.title = $('rdetail_preview_badge').innerHTML; + GBPBadge.style.border = 0; + GBPBadgelink = document.createElement( 'a' ); + GBPBadgelink.href = 'javascript:rdetailShowExtra("preview");'; + GBPBadgelink.appendChild( GBPBadge ); + $('rdetail_image_cell').appendChild( GBPBadgelink ); + $('rdetail_preview_div').style.height = 600; + + /* Display the "Preview" tab in the Extras section */ + unHideMe( $('rdetail_preview_link' ) ); + } +} + +/** + * This is called when the user clicks on the 'Preview' link. We assume + * a preview is available from Google if this link was made visible. + * + * XXX I18N of Google Book Preview language attribute needed + */ +function rdetailDisplayGBPreview() { + unHideMe($('rdetail_extras_loading')); + GBPreviewPane = $('rdetail_preview_div'); + if ( GBPreviewPane.getAttribute('loaded') == null || + GBPreviewPane.getAttribute('loaded') == "false" ) { + google.load("books", "0", {"callback" : rdetailGBPViewerLoadCallback, "language": "en"} ); + GBPreviewPane.setAttribute('loaded', 'true'); + } +} + +function rdetailGBPViewerLoadCallback() { + hideMe($('rdetail_extras_loading')); + var GBPViewer = new google.books.DefaultViewer(document.getElementById('rdetail_preview_div')); + GBPViewer.load('ISBN:' + cleanISBN(record.isbn()) ); + +} + +function expandBoxes(type,bool) { + if(type=="locs") { + if(bool) { + unHideMe($('rdetail_locs_collapse')); + unHideMe($('rdetails_status2')); + hideMe($('rdetail_locs_expand')); + + } else { + hideMe($('rdetails_status2')); + hideMe($('rdetail_locs_collapse')); + unHideMe($('rdetail_locs_expand')); + } + return; + } + + if(type=="tabs") { + if(bool) { + rdetailShowAllExtras(true); + hideMe($('rdetail_extras_expand')); + unHideMe($('rdetail_extras_collapse')); + } else { + rdetailShowAllExtras(); + hideMe($('rdetail_extras_collapse')); + unHideMe($('rdetail_extras_expand')); + } + return; + } } \ No newline at end of file diff --git a/Open-ILS/web/opac/skin/kcls/js/result_common.js b/Open-ILS/web/opac/skin/kcls/js/result_common.js index 82a9531fda..7e26da8554 100644 --- a/Open-ILS/web/opac/skin/kcls/js/result_common.js +++ b/Open-ILS/web/opac/skin/kcls/js/result_common.js @@ -1,866 +1,866 @@ -config.ids.result = {}; -config.css.result = {}; -config.names.result = {}; -config.ids.result.offset_start = "offset_start"; -config.ids.result.offset_end = "offset_end"; -config.ids.result.result_count = "result_count"; -config.ids.result.next_link = 'next_link'; -config.ids.result.prev_link = 'prev_link'; -config.ids.result.home_link = 'search_home_link'; -config.ids.result.end_link = 'end_link'; -config.ids.result.main_table = 'result_table'; -config.ids.result.row_template = 'result_table_template'; -config.ids.result.num_pages = 'num_pages'; -config.ids.result.current_page = 'current_page'; -config.css.result.nav_active = "nav_link_active"; -config.ids.result.top_div = "result_table_div"; -config.ids.result.nav_links = "search_nav_links"; -config.ids.result.info = "result_info_div"; -config.css.result.cc_cell_even = "copy_count_cell_even"; -config.names.result.item_jacket = "item_jacket"; -config.names.result.item_title = "item_title"; -config.names.result.item_author = "item_author"; -config.names.result.counts_row = "counts_row"; -config.names.result.count_cell = "copy_count_cell"; -config.names.result.format_cell = 'result_table_format_cell'; -config.names.result.format_link = 'resource_link' -config.names.result.format_pic = 'format_pic' -config.ids.result = {}; -config.css.result = {}; -config.names.result = {}; -config.ids.result.offset_start = "offset_start"; -config.ids.result.offset_end = "offset_end"; -config.ids.result.result_count = "result_count"; -config.ids.result.next_link = 'next_link'; -config.ids.result.prev_link = 'prev_link'; -config.ids.result.home_link = 'search_home_link'; -config.ids.result.end_link = 'end_link'; -config.ids.result.main_table = 'result_table'; -config.ids.result.row_template = 'result_table_template'; -config.ids.result.num_pages = 'num_pages'; -config.ids.result.current_page = 'current_page'; -config.css.result.nav_active = "nav_link_active"; -config.ids.result.top_div = "result_table_div"; -config.ids.result.nav_links = "search_nav_links"; -config.ids.result.info = "result_info_div"; -config.css.result.cc_cell_even = "copy_count_cell_even"; -config.names.result.item_jacket = "item_jacket"; -config.names.result.item_title = "item_title"; -config.names.result.item_author = "item_author"; -config.names.result.counts_row = "counts_row"; -config.names.result.count_cell = "copy_count_cell"; -config.names.result.format_cell = 'result_table_format_cell'; -config.names.result.format_link = 'resource_link' -config.names.result.format_pic = 'format_pic' - -var recordsHandled = 0; -var recordsCache = []; -var lowHitCount = 4; -var isbnList = ''; -var googleBooksLink = true; -buildOrgSel($('holdsCacheSel'), globalOrgTree, 0); - -var resultFetchAllRecords = false; -var resultCompiledSearch = null; - -/* set up the event handlers */ -if( findCurrentPage() == MRESULT || findCurrentPage() == RRESULT ) { - G.evt.result.hitCountReceived.push(resultSetHitInfo); - G.evt.result.recordReceived.push(resultDisplayRecord, resultAddCopyCounts); - G.evt.result.copyCountsReceived.push(resultDisplayCopyCounts); - G.evt.result.allRecordsReceived.push(function(){unHideMe($('tehSideBar'));},function(){unHideMe($('results_view_span'));},resultBuildCaches, - function(){unHideMe($('result_info_2'))}, fetchGoogleBooksLink, fetchChiliFreshReviews, postResultsCollect); - - attachEvt('result','lowHits',resultLowHits); - attachEvt('result','zeroHits',resultZeroHits); - attachEvt( "common", "locationUpdated", resultSBSubmit ); - /* do this after we have ID's so the rank for mr pages will be correct */ - attachEvt("result", "preCollectRecords", resultPaginate); -} - -function resultSBSubmit(){searchBarSubmit();} - -/* returns the last 'index' postion ocurring in this page */ -function resultFinalPageIndex() { - if(getHitCount() < (getOffset() + getDisplayCount())) - return getHitCount() - 1; - return getOffset() + getDisplayCount() - 1; -} - -function plausible_ident(s) { - s = s.replace(/^\s*(.+)\s*$/, '$1'); - s = s.replace(/^(\S+)\s.*$/, '$1'); - return s; -} - - -/* generic search method */ -function resultCollectSearchIds( type, method, handler ) { - - var sort = (getSort() == SORT_TYPE_REL) ? null : getSort(); - var sortdir = (sort) ? ((getSortDir()) ? getSortDir() : SORT_DIR_ASC) : null; - - var item_type; - var item_form; - var args = {}; - - if( type ) { - var form = parseForm(getForm()); - item_type = form.item_type; - item_form = form.item_form; - - } else { - item_type = (getItemType()) ? getItemType().split(/,/) : null; - item_form = (getItemForm()) ? getItemForm().split(/,/) : null; - } - - item_type=null; - - var limit = (resultFetchAllRecords) ? 1000 : getDisplayCount(); - - if( getOffset() > 0 ) { - if( getHitCount() > 0 && (getOffset() + getDisplayCount()) > getHitCount() ) - limit = getHitCount() - getOffset(); - } - - var lasso = getLasso(); - - if (lasso) args.org_unit = -lasso; - else args.org_unit = getLocation(); - - args.depth = getDepth(); - args.limit = limit; - args.offset = getOffset(); - args.visibility_limit = 3000; - args.default_class = getStype(); - - if(sort) args.sort = sort; - if(sortdir) args.sort_dir = sortdir; - if(item_type) args.item_type = item_type; - if(item_form) args.item_form = item_form; - if(getAvail()) args.available = 1; - //args.format="marcxml"; - - if(getFacet()) args.facets = getFacet(); - - if(getAudience()) args.audience = getAudience().split(/,/); - if(getLitForm()) args.lit_form = getLitForm().split(/,/); - if(getLanguage()) args.language = getLanguage().split(/,/); - if(getBibLevel()) args.bib_level = getBibLevel().split(/,/); - if(getCopyLocs()) args.locations = getCopyLocs().split(/,/); - if(getPubdBefore()) args.before = getPubdBefore(); - else if(getPubdAfter()) args.after = getPubdAfter(); - else if(getPubdBetween()) args.between = getPubdBetween().split(/,/); - - _debug('Search args: ' + js2JSON(args)); - _debug('Raw query: ' + getTerm()); - - var req = new Request(method, args, getTerm(), 1); - req.callback(handler); - req.send(); -} - - - - - -/* set the search result info, number of hits, which results we're - displaying, links to the next/prev pages, etc. */ -function resultSetHitInfo() { - - var lasso = getLasso(); - if (!lasso) { - /* tell the user where the results are coming from */ - var baseorg = findOrgUnit(getLocation()); - var depth = getDepth(); - var mydepth = findOrgDepth(baseorg); - if( findOrgDepth(baseorg) != depth ) { - var tmporg = baseorg; - while( mydepth > depth ) { - mydepth--; - tmporg = findOrgUnit(tmporg.parent_ou()); - } - unHideMe($('including_results_for')); - try{$('including_results_location').appendChild(text(tmporg.name()));} catch(e){} - } - } - - - try{searchTimer.stop()}catch(e){} - - //if( findCurrentPage() == MRESULT ) { - if( findCurrentPage() == MRESULT || - - (findCurrentPage() == RRESULT && - ( - getRtype() == RTYPE_TITLE || - getRtype() == RTYPE_AUTHOR || - getRtype() == RTYPE_SUBJECT || - getRtype() == RTYPE_SERIES || - getRtype() == RTYPE_KEYWORD - ) - - ) ) { - - if(getHitCount() <= lowHitCount && getTerm()) - runEvt('result', 'lowHits'); - } - - if(getHitCount() == 0) { - runEvt('result', 'zeroHits'); - return; - } - - - var pages = getHitCount() / getDisplayCount(); - if(pages % 1) pages = parseInt(pages) + 1; - - - - var cpage = (getOffset()/getDisplayCount()) + 1; - - G.ui.result.current_page.appendChild(text(cpage)); - G.ui.result.num_pages.appendChild(text(pages)); /* the ) is dumb */ - - $('current_page2').appendChild(text(cpage)); - $('num_pages2').appendChild(text(pages + ")")); /* the ) is dumb */ - - /* set the offsets */ - var offsetEnd = getDisplayCount() + getOffset(); - if( getDisplayCount() > (getHitCount() - getOffset())) - offsetEnd = getHitCount(); - - G.ui.result.offset_end.appendChild(text(offsetEnd)); - G.ui.result.offset_start.appendChild(text(getOffset() + 1)); - - $('offset_end2').appendChild(text(offsetEnd)); - $('offset_start2').appendChild(text(getOffset() + 1)); - - G.ui.result.result_count.appendChild(text(getHitCount())); - unHideMe(G.ui.result.info); - unHideMe($('result_numbers1')); - - $('result_count2').appendChild(text(getHitCount())); - unHideMe($('result_info_div2')); -} - -function resultLowHits() { - showCanvas(); - unHideMe($('result_low_hits')); - if(getHitCount() > 0) - unHideMe($('result_low_hits_msg')); - - var words = []; - for(var key in resultCompiledSearch.searches) - words.push(resultCompiledSearch.searches[key].term); - - var sreq = new Request(CHECK_SPELL, words.join(' ')); - sreq.callback(resultSuggestSpelling); - sreq.send(); - - for(var key in resultCompiledSearch.searches) { - var areq = new Request(FETCH_CROSSREF, key, resultCompiledSearch.searches[key].term); - areq.callback(resultLowHitXRef); - areq.send(); - } - - if( !(getForm() == null || getForm() == 'all' || getForm() == "") ) { - var a = {}; - a[PARAM_FORM] = "all"; - $('low_hits_remove_format_link').setAttribute('href',buildOPACLink(a)); - unHideMe($('low_hits_remove_format')); - } - - resultSuggestSearchClass(); - - if(getTerm()) resultExpandSearch(); /* advanced search */ -} - -var lowHitsXRefSet = {}; -var lowHitsXRefLink; -var lowHitsXRefLinkParent; -function resultLowHitXRef(r) { - if(!lowHitsXRefLink){ - lowHitsXRefLinkParent = $('low_hits_xref_link').parentNode; - lowHitsXRefLink = lowHitsXRefLinkParent.removeChild($('low_hits_xref_link')); - } - var res = r.getResultObject(); - var arr = res.from; - arr.concat(res.also); - if(arr && arr.length > 0) { - unHideMe($('low_hits_cross_ref')); - var word; - var c = 0; - while( word = arr.shift() ) { - - if (lowHitsXRefSet[word] == 1) continue; - lowHitsXRefSet[word] = 1; - - if(c++ > 20) break; - var a = {}; - a[PARAM_TERM] = word; - var template = lowHitsXRefLink.cloneNode(true); - template.setAttribute('href',buildOPACLink(a)); - template.appendChild(text(word)); - lowHitsXRefLinkParent.appendChild(template); - lowHitsXRefLinkParent.appendChild(text(' ')); - } - } -} - -function resultZeroHits() { - hideMe($('result_header')); - hideMe($('result_table_div')); - hideMe($('statusbar')); - $('rresults_page').style.width="690px"; - unHideMe($('zero_search_hits')); - $('zero_hits_term').innerHTML = getTerm(); - //showCanvas(); - unHideMe($('result_low_hits')); - unHideMe($('result_zero_hits_msg')); - if(getTerm()) resultExpandSearch(); /* advanced search */ -} - -function resultExpandSearch() { - var top = findOrgDepth(globalOrgTree); - if(getDepth() == top) return; - unHideMe($('low_hits_expand_range')); - var par = $('low_hits_expand_link').parentNode; - var template = par.removeChild($('low_hits_expand_link')); - - var bottom = getDepth(); - while( top < bottom ) { - var a = {}; - a[PARAM_DEPTH] = top; - var temp = template.cloneNode(true); - temp.appendChild(text(findOrgTypeFromDepth(top).opac_label())) - temp.setAttribute('href',buildOPACLink(a)); - par.appendChild(temp); - top++; - } -} - -function resultSuggestSearchClass() { - var stype = getStype(); - if(stype == STYPE_KEYWORD) return; - var a = {}; var ref; - unHideMe($('low_hits_search_type')); - if(stype != STYPE_TITLE) { - ref = $('low_hits_title_search'); - unHideMe(ref); - a[PARAM_STYPE] = STYPE_TITLE; - ref.setAttribute('href',buildOPACLink(a)); - } - if(stype != STYPE_AUTHOR) { - ref = $('low_hits_author_search'); - unHideMe(ref); - a[PARAM_STYPE] = STYPE_AUTHOR; - ref.setAttribute('href',buildOPACLink(a)); - } - if(stype != STYPE_SUBJECT) { - ref = $('low_hits_subject_search'); - unHideMe(ref); - a[PARAM_STYPE] = STYPE_SUBJECT; - ref.setAttribute('href',buildOPACLink(a)); - } - if(stype != STYPE_KEYWORD) { - ref = $('low_hits_keyword_search'); - unHideMe(ref); - a[PARAM_STYPE] = STYPE_KEYWORD; - ref.setAttribute('href',buildOPACLink(a)); - } - if(stype != STYPE_SERIES) { - ref = $('low_hits_series_search'); - unHideMe(ref); - a[PARAM_STYPE] = STYPE_SERIES; - ref.setAttribute('href',buildOPACLink(a)); - } -} - -function resultSuggestSpelling(r) { - var res = r.getResultObject(); - var phrase = getTerm(); - var words = phrase.split(/ /); - - var newterm = ""; - - for( var w = 0; w < words.length; w++ ) { - var word = words[w]; - var blob = grep(res, function(i){return (i.word == word);}); - if( blob ) blob = blob[0]; - else continue; - if( blob.word == word ) { - if( blob.suggestions && blob.suggestions[0] ) { - newterm += " " + blob.suggestions[0]; - unHideMe($('did_you_mean')); - } else { - newterm += " " + word; - } - } - } - var cell = $('zero_hits_suggestions'); - var s = res[0].suggestions; - for(var i in s) { - if(i==0) continue; - if(i==10) break; //limit suggestions - cell.appendChild(elem('a',{href:buildOPACLink({t:s[i]})},s[i])); - cell.appendChild(elem('br')); - } - if(newterm.toLowerCase().trim()!=getTerm().toLowerCase().trim()) unHideMe($('zero_hits_label1')); - if(res[0].suggestions && res[0].suggestions.length>0) unHideMe($('zero_hits_label2')); - - var arg = {}; - arg[PARAM_TERM] = newterm; - $('spell_check_link').setAttribute('href', buildOPACLink(arg)); - $('spell_check_link').appendChild(text(newterm)); -} - - -function resultPaginate() { - var o = getOffset(); - var args = {}; - - if( !( ((o) + getDisplayCount()) >= getHitCount()) ) { - - args[PARAM_OFFSET] = o + getDisplayCount(); - args[PARAM_SORT] = SORT; - args[PARAM_SORT_DIR] = SORT_DIR; - args[PARAM_RLIST] = new CGI().param(PARAM_RLIST); - - G.ui.result.next_link.setAttribute("href", buildOPACLink(args)); - addCSSClass(G.ui.result.next_link, config.css.result.nav_active); - - $('next_link2').setAttribute("href", buildOPACLink(args)); - addCSSClass($('next_link2'), config.css.result.nav_active); - - args[PARAM_OFFSET] = getHitCount() - (getHitCount() % getDisplayCount()); - - /* when hit count is divisible by display count, we have to adjust */ - if( getHitCount() % getDisplayCount() == 0 ) - args[PARAM_OFFSET] -= getDisplayCount(); - } - - if( o > 0 ) { - - var args = {}; - args[PARAM_SORT] = SORT; - args[PARAM_SORT_DIR] = SORT_DIR; - args[PARAM_RLIST] = new CGI().param(PARAM_RLIST); - - args[PARAM_OFFSET] = o - getDisplayCount(); - G.ui.result.prev_link.setAttribute( "href", buildOPACLink(args)); - addCSSClass(G.ui.result.prev_link, config.css.result.nav_active); - - $('prev_link2').setAttribute( "href", buildOPACLink(args)); - addCSSClass($('prev_link2'), config.css.result.nav_active); - - args[PARAM_OFFSET] = 0; - G.ui.result.home_link.setAttribute( "href", buildOPACLink(args)); - addCSSClass(G.ui.result.home_link, config.css.result.nav_active); - } - - // pagination - google style - var pages = getHitCount() / getDisplayCount(); - var cpage = (getOffset()/getDisplayCount()) + 1; - var start = 0; - pages = Math.floor(pages); - cpage = Math.floor(cpage); - var end = pages>9?8:pages; - - // narrow our window of visible page numbers to 9 - sets start and end pages for the loop - if(cpage>4) { - start = cpage-5; - end = cpage+3>pages?pages:cpage+3; - if(cpage+3>pages) { start = (cpage-5)-(cpage-pages+3); } - if(start<0) start=0; - } // ugh... I hate math. - - if(pages>0) { - var span = $('nav_pages'); - var span2 = $('nav_pages2'); - for(var i=start; i<=end; i++) { - if(i==end && (getHitCount()%getDisplayCount())==0) break; - var temp = elem('span',{style:'padding:0px 3px;'}); - temp.style.padding='0px 3px'; - args[PARAM_OFFSET] = getDisplayCount()*i; - if(i==cpage-1) { var link = text(i+1); temp.style.color="red" } - else var link = elem('a',{href:buildOPACLink(args)},i+1); - temp.appendChild(link); - span.appendChild(temp); - span2.appendChild(temp.cloneNode(true)); - } - } - ////// - - if(getDisplayCount() < getHitCount()) { - unHideMe($('start_end_links_span')); - unHideMe($('start_end_links_span2')); - } - - showCanvas(); - try{searchTimer.stop()}catch(e){} -} - -function buildunAPISpan (span, type, id) { - if(!span || !type || !id) return; - var cgi = new CGI(); - var d = new Date(); - - addCSSClass(span,'unapi-id'); - - span.setAttribute( - 'title', - 'tag:' + cgi.server_name + ',' + - d.getFullYear() + - ':' + type + '/' + id - ); -} - -function unhideGoogleBooksLink (data) { - for ( var i in data ) { - //if (data[i].preview == 'noview') continue; - - var gbspan = $n(document.documentElement, 'googleBooksLink-' + i); - var gba = $n(gbspan, "googleBooks-link"); - - gba.setAttribute( - 'href', - data[i].info_url - ); - removeCSSClass( gbspan, 'hide_me' ); - } -} - -/* display the record info in the record display table 'pos' is the - zero based position the record should have in the display table */ -function resultDisplayRecord(rec, pos, is_mr) { - //fieldmapper.IDL.load(['mvr']); - if(rec == null || rec.__c) rec = new mvr(); /* so the page won't die if there was an error */ - recordsHandled++; - recordsCache.push(rec); - - var r = table.rows[pos + 1]; - r.id += "_" + rec.doc_id(); - var currentISBN = cleanISBN(rec.isbn()); - - if (googleBooksLink) { - var gbspan = $n(r, "googleBooksLink"); - if (currentISBN && gbspan) { - gbspan.setAttribute('name', gbspan.getAttribute('name') + '-' + currentISBN ); - if (isbnList) isbnList += ', '; - isbnList += currentISBN; - } - } - - if (currentISBN && chilifresh && chilifresh != '(none)') { - var cfrow = $n(r, "chilifreshReview"); - if (cfrow) { - removeCSSClass( cfrow, 'hide_me' ); - } - var cflink = $n(r, "chilifreshReviewLink"); - if (cflink) { - cflink.setAttribute( - 'id', - 'isbn_' + currentISBN - ); - } - var cfdiv = $n(r, "chilifreshReviewResult"); - if (cfdiv) { - cfdiv.setAttribute( - 'id', - 'chili_review_' + currentISBN - ) - } - } - - var pic = $n(r, config.names.result.item_jacket); - if (!pic) pic = elem("img"); - //pic.setAttribute("src", buildISBNSrc(currentISBN)); - pic.setAttribute("width",55); - - var title_link = $n(r, config.names.result.item_title); - var author_link = $n(r, config.names.result.item_author); - var row_count = $n(r,"results_row_count"); - var myListLink = $n(r,"result_my_list_link"); - var reviewsLink = $n(r, 'reviews_and_more'); - if(currentISBN) { - reviewsLink.href="http://contentcafe2.btol.com/ContentCafeClient/ContentCafe.aspx?UserID=KC72927&Password=CC14647&ItemKey="+currentISBN+"&Options=Y"; - } - - if( is_mr ) { - var onlyrec = onlyrecord[ getOffset() + pos ]; - if(onlyrec) { - buildunAPISpan($n(r,'unapi'), 'biblio-record_entry', onlyrec); - - var args = {}; - args.page = RDETAIL; - args[PARAM_OFFSET] = 0; - args[PARAM_RID] = onlyrec; - args[PARAM_MRID] = rec.doc_id(); - pic.parentNode.setAttribute("href", buildOPACLink(args)); - title_link.setAttribute("href", buildOPACLink(args)); - title_link.appendChild(text(normalize(truncate(rec.title(), 65)))); - - } else { - buildunAPISpan($n(r,'unapi'), 'metabib-metarecord', rec.doc_id()); - - buildTitleLink(rec, title_link); - var args = {}; - args.page = RRESULT; - args[PARAM_OFFSET] = 0; - args[PARAM_MRID] = rec.doc_id(); - pic.parentNode.setAttribute("href", buildOPACLink(args)); - } - - } else { - buildunAPISpan($n(r,'unapi'), 'biblio-record_entry', rec.doc_id()); - - //if(title_link) buildTitleDetailLink(rec, title_link); - if(title_link) { - title_link.appendChild(text(normalize(truncate(rec.title(), 1000)))); - var argss = {}; - argss.page = RDETAIL; - argss[PARAM_RID] = rec.doc_id(); - var linkText = title_link.innerHTML; // IE - title_link.setAttribute("href", buildOPACLink(argss)); - title_link.innerHTML = linkText; // IE - } - var args = {}; - args.page = RDETAIL; - args[PARAM_OFFSET] = 0; - args[PARAM_RID] = rec.doc_id(); - pic.parentNode.setAttribute("href", buildOPACLink(args)); - - unHideMe($n(r,'place_hold_span')); - //$n(r,'place_hold_link').setAttribute('href','javascript:holdsDrawEditor({record:"'+rec.doc_id()+'",type:"T"});'); - $n(r,'place_hold_link').onclick = function() { resultDrawHoldsWindow(rec.doc_id(), 'T'); } - - /** BILL */ - //dojo.require('openils.BibTemplate'); // -- this causes redundant requests per record - put in js_common.xml instead - setTimeout( - function () { - //new openils.BibTemplate({root : $n(r, 'bib_cn_list'), record : rec.doc_id()}).render(); - new openils.BibTemplate({root : r, record : rec.doc_id()}).render(); - }, 0 - ); - /** BILL */ - } - - if(row_count) row_count.innerHTML = (pos+1)+getOffset()+"."; - if(myListLink) myListLink.setAttribute("href","javascript:addMyList("+rec.doc_id()+");") - title_link.setAttribute("title",rec.title()); - buildSearchLink(STYPE_AUTHOR, rec.author(), author_link); - - if(! is_mr ) { - $n(r, "results_pub_date").innerHTML = (!rec.pubdate())?"":rec.pubdate(); - $n(r, "results_pub").innerHTML = (!rec.publisher())?"":rec.publisher(); - $n(r, "results_isbn").innerHTML = (!currentISBN)?"":currentISBN; - $n(r, "results_edition").innerHTML = (!rec.edition())?"":rec.edition(); - $n(r, "results_phys_desc").innerHTML = (!rec.physical_description())?"":rec.physical_description(); - if(isInAnonList(parseInt(rec.doc_id()))) { - $n(r, 'result_my_list_link').innerHTML = 'Remove from my list'; - $n(r, 'result_my_list_link').title = 'Remove from my list'; - //$n(r, 'result_my_list_link').appendChild(elem('img', {src:'/opac/skin/kcls/graphics/add_mylist_sel.gif'}, null)); - } - - if(!isNull(rec.edition())) { - unHideMe( $n(r, "result_table_extra_span")); - $n(r, "result_table_edition_span").appendChild( text( rec.edition()) ); - } - if(!isNull(rec.pubdate())) { - unHideMe( $n(r, "result_table_extra_span")); - unHideMe($n(r, "result_table_pub_span")); - $n(r, "result_table_pub_span").appendChild( text( rec.pubdate() )); - } - if(!isNull(rec.publisher()) ) { - unHideMe( $n(r, "result_table_extra_span")); - unHideMe($n(r, "result_table_pub_span")); - $n(r, "result_table_pub_span").appendChild( text( " " + rec.publisher() )); - } - - if(!isNull(rec.physical_description()) ) { - unHideMe( $n(r, "result_table_extra_span")); - var t = " " + rec.physical_description(); - //$n(r, "result_table_phys_span").appendChild( text(t.replace(/:.*/g,''))); - $n(r, "result_table_phys_span").appendChild( text(t)); - } - } - - resultBuildFormatIcons( r, rec, is_mr ); - unHideMe(r); - runEvt("result", "recordDrawn", rec.doc_id(), title_link); - - - if(resultPageIsDone()) { - runEvt('result', 'allRecordsReceived', recordsCache); - } -} - -function resultDrawHoldsWindow(hold_target, hold_type) { - var src = location.href; - if(forceLoginSSL && src.match(/^http:/)) { - src = src.replace(/^http:/, 'https:'); - if(src.match(/&hold_target=/)) { - src.replace(/&hold_target=(\d+)/, hold_target); - } else { - src += '&hold_target=' + hold_target; - } - location.href = src; - } else { - holdsDrawEditor({record:hold_target, type:hold_type}); - } -} - - -function _resultFindRec(id) { - for( var i = 0; i != recordsCache.length; i++ ) { - var rec = recordsCache[i]; - if( rec && rec.doc_id() == id ) - return rec; - } - return null; -} - - -function resultBuildFormatIcons( row, rec, is_mr ) { - var ress = ""; - var imgEl = $n(row, "result_mat_type"); - if(!imgEl) return; - - ress = getMarcData(rec.doc_id(),"998","d"); - if(setFormatIcon(imgEl, ress)) unHideMe(imgEl); - -} - -function fetchGoogleBooksLink () { - return; - if (isbnList && googleBooksLink) { - var scriptElement = document.createElement("script"); - scriptElement.setAttribute("id", "jsonScript"); - scriptElement.setAttribute("src", - "https://books.google.com/books?bibkeys=" + - escape(isbnList) + "&jscmd=viewapi&callback=unhideGoogleBooksLink"); - scriptElement.setAttribute("type", "text/javascript"); - // make the request to Google Book Search - document.documentElement.firstChild.appendChild(scriptElement); - } -} - -function resultPageIsDone(pos) { - - return (recordsHandled == getDisplayCount() - || recordsHandled + getOffset() == getHitCount()); -} - -var resultCCHeaderApplied = false; - -/* -------------------------------------------------------------------- */ -/* dynamically add the copy count rows based on the org type 'countsrow' - is the row into which we will add TD's to hold the copy counts - This code generates copy count cells with an id of - 'copy_count_cell__' */ -function resultAddCopyCounts(rec, pagePosition) { - - var r = table.rows[pagePosition + 1]; - var countsrow = $n(r, config.names.result.counts_row ); - var ccell = $n(countsrow, config.names.result.count_cell); - - var nodes = orgNodeTrail(findOrgUnit(getLocation())); - var node = nodes[0]; - var type = findOrgType(node.ou_type()); - ccell.id = "copy_count_cell_" + type.depth() + "_" + pagePosition; - ccell.title = type.opac_label(); - //addCSSClass(ccell, config.css.result.cc_cell_even); - - var lastcell = ccell; - var lastheadcell = null; - - var cchead = null; - var ccheadcell = null; - if(!resultCCHeaderApplied && !getLasso()) { - ccrow = $('result_thead_row'); - ccheadcell = ccrow.removeChild($n(ccrow, "result_thead_ccell")); - var t = ccheadcell.cloneNode(true); - lastheadcell = t; - t.appendChild(text(type.opac_label())); - ccrow.appendChild(t); - resultCCHeaderApplied = true; - } -} - -/* collect copy counts for a record using method 'methodName' */ -function resultCollectCopyCounts(rec, pagePosition, methodName) { - if(rec == null || rec.doc_id() == null) return; - - var loc = getLasso(); - if (loc) loc = -loc; - else loc= getLocation(); - - var req = new Request(methodName, loc, rec.doc_id(), getForm() ); - req.request.userdata = [ rec, pagePosition ]; - req.callback(resultHandleCopyCounts); - req.send(); -} - -function resultHandleCopyCounts(r) { - runEvt('result', 'copyCountsReceived', r.userdata[0], r.userdata[1], r.getResultObject()); -} - - -/* XXX Needs to understand Lasso copy counts... */ -/* display the collected copy counts */ -function resultDisplayCopyCounts(rec, pagePosition, copy_counts) { - if(copy_counts == null || rec == null) return; - var r = table.rows[pagePosition + 1]; - var cnt_avail = $n(r, "copy_count_avail"); - if(cnt_avail && copy_counts[0]) { - /*if(copy_counts[0].available)*/ cnt_avail.innerHTML = copy_counts[0].available+' cop'+(copy_counts[0].available==1?'y':'ies')+' available'; - //else { - fieldmapper.standardRequest(['open-ils.circ','open-ils.circ.bre.holds.count'], {async:true, params:[rec.doc_id(), r.id], oncomplete: drawHoldsCount}); - $n(r, 'copy_holds2').innerHTML = ' on first copy returned of '+copy_counts[0].count+' cop'+(copy_counts[0].count==1?'y':'ies'); - //} - } -} - -function drawHoldsCount(r) { - if(!r.params[1]) return; - var row = $(r.params[1]); - if(!row) return; - var span = $n(row, 'copy_holds'); - var resp = r.recv().content(); - span.innerHTML = resp+' hold'+(resp==1?'':'s')+' '; -} - -function showDetailedInfo(bool) { - - var tbls = dojo.query('.results_info_table',$('result_table')); - if(bool) { - tbls.forEach(function(node, index, arr){ - unHideMe($n(node,'results_pub_tr')); - unHideMe($n(node,'results_isbn_tr')); - unHideMe($n(node,'results_edition_tr')); - unHideMe($n(node,'results_phys_desc_tr')); - }); - } else { - tbls.forEach(function(node, index, arr){ - hideMe($n(node,'results_pub_tr')); - hideMe($n(node,'results_isbn_tr')); - hideMe($n(node,'results_edition_tr')); - hideMe($n(node,'results_phys_desc_tr')); - }); - } -} - -function fetchChiliFreshReviews() { - if (chilifresh && chilifresh != '(none)') { - try { chili_init(); } catch(E) { dump(E + '\n'); } - } -} - -function postResultsCollect() { - var it = getCacheValue('showHoldEditor'); - if(it) { - setCacheValue('showHoldEditor', null); - holdsDrawEditor({record:it.record, type:it.type}); - } -} +config.ids.result = {}; +config.css.result = {}; +config.names.result = {}; +config.ids.result.offset_start = "offset_start"; +config.ids.result.offset_end = "offset_end"; +config.ids.result.result_count = "result_count"; +config.ids.result.next_link = 'next_link'; +config.ids.result.prev_link = 'prev_link'; +config.ids.result.home_link = 'search_home_link'; +config.ids.result.end_link = 'end_link'; +config.ids.result.main_table = 'result_table'; +config.ids.result.row_template = 'result_table_template'; +config.ids.result.num_pages = 'num_pages'; +config.ids.result.current_page = 'current_page'; +config.css.result.nav_active = "nav_link_active"; +config.ids.result.top_div = "result_table_div"; +config.ids.result.nav_links = "search_nav_links"; +config.ids.result.info = "result_info_div"; +config.css.result.cc_cell_even = "copy_count_cell_even"; +config.names.result.item_jacket = "item_jacket"; +config.names.result.item_title = "item_title"; +config.names.result.item_author = "item_author"; +config.names.result.counts_row = "counts_row"; +config.names.result.count_cell = "copy_count_cell"; +config.names.result.format_cell = 'result_table_format_cell'; +config.names.result.format_link = 'resource_link' +config.names.result.format_pic = 'format_pic' +config.ids.result = {}; +config.css.result = {}; +config.names.result = {}; +config.ids.result.offset_start = "offset_start"; +config.ids.result.offset_end = "offset_end"; +config.ids.result.result_count = "result_count"; +config.ids.result.next_link = 'next_link'; +config.ids.result.prev_link = 'prev_link'; +config.ids.result.home_link = 'search_home_link'; +config.ids.result.end_link = 'end_link'; +config.ids.result.main_table = 'result_table'; +config.ids.result.row_template = 'result_table_template'; +config.ids.result.num_pages = 'num_pages'; +config.ids.result.current_page = 'current_page'; +config.css.result.nav_active = "nav_link_active"; +config.ids.result.top_div = "result_table_div"; +config.ids.result.nav_links = "search_nav_links"; +config.ids.result.info = "result_info_div"; +config.css.result.cc_cell_even = "copy_count_cell_even"; +config.names.result.item_jacket = "item_jacket"; +config.names.result.item_title = "item_title"; +config.names.result.item_author = "item_author"; +config.names.result.counts_row = "counts_row"; +config.names.result.count_cell = "copy_count_cell"; +config.names.result.format_cell = 'result_table_format_cell'; +config.names.result.format_link = 'resource_link' +config.names.result.format_pic = 'format_pic' + +var recordsHandled = 0; +var recordsCache = []; +var lowHitCount = 4; +var isbnList = ''; +var googleBooksLink = true; +buildOrgSel($('holdsCacheSel'), globalOrgTree, 0); + +var resultFetchAllRecords = false; +var resultCompiledSearch = null; + +/* set up the event handlers */ +if( findCurrentPage() == MRESULT || findCurrentPage() == RRESULT ) { + G.evt.result.hitCountReceived.push(resultSetHitInfo); + G.evt.result.recordReceived.push(resultDisplayRecord, resultAddCopyCounts); + G.evt.result.copyCountsReceived.push(resultDisplayCopyCounts); + G.evt.result.allRecordsReceived.push(function(){unHideMe($('tehSideBar'));},function(){unHideMe($('results_view_span'));},resultBuildCaches, + function(){unHideMe($('result_info_2'))}, fetchGoogleBooksLink, fetchChiliFreshReviews, postResultsCollect); + + attachEvt('result','lowHits',resultLowHits); + attachEvt('result','zeroHits',resultZeroHits); + attachEvt( "common", "locationUpdated", resultSBSubmit ); + /* do this after we have ID's so the rank for mr pages will be correct */ + attachEvt("result", "preCollectRecords", resultPaginate); +} + +function resultSBSubmit(){searchBarSubmit();} + +/* returns the last 'index' postion ocurring in this page */ +function resultFinalPageIndex() { + if(getHitCount() < (getOffset() + getDisplayCount())) + return getHitCount() - 1; + return getOffset() + getDisplayCount() - 1; +} + +function plausible_ident(s) { + s = s.replace(/^\s*(.+)\s*$/, '$1'); + s = s.replace(/^(\S+)\s.*$/, '$1'); + return s; +} + + +/* generic search method */ +function resultCollectSearchIds( type, method, handler ) { + + var sort = (getSort() == SORT_TYPE_REL) ? null : getSort(); + var sortdir = (sort) ? ((getSortDir()) ? getSortDir() : SORT_DIR_ASC) : null; + + var item_type; + var item_form; + var args = {}; + + if( type ) { + var form = parseForm(getForm()); + item_type = form.item_type; + item_form = form.item_form; + + } else { + item_type = (getItemType()) ? getItemType().split(/,/) : null; + item_form = (getItemForm()) ? getItemForm().split(/,/) : null; + } + + item_type=null; + + var limit = (resultFetchAllRecords) ? 1000 : getDisplayCount(); + + if( getOffset() > 0 ) { + if( getHitCount() > 0 && (getOffset() + getDisplayCount()) > getHitCount() ) + limit = getHitCount() - getOffset(); + } + + var lasso = getLasso(); + + if (lasso) args.org_unit = -lasso; + else args.org_unit = getLocation(); + + args.depth = getDepth(); + args.limit = limit; + args.offset = getOffset(); + args.visibility_limit = 3000; + args.default_class = getStype(); + + if(sort) args.sort = sort; + if(sortdir) args.sort_dir = sortdir; + if(item_type) args.item_type = item_type; + if(item_form) args.item_form = item_form; + if(getAvail()) args.available = 1; + //args.format="marcxml"; + + if(getFacet()) args.facets = getFacet(); + + if(getAudience()) args.audience = getAudience().split(/,/); + if(getLitForm()) args.lit_form = getLitForm().split(/,/); + if(getLanguage()) args.language = getLanguage().split(/,/); + if(getBibLevel()) args.bib_level = getBibLevel().split(/,/); + if(getCopyLocs()) args.locations = getCopyLocs().split(/,/); + if(getPubdBefore()) args.before = getPubdBefore(); + else if(getPubdAfter()) args.after = getPubdAfter(); + else if(getPubdBetween()) args.between = getPubdBetween().split(/,/); + + _debug('Search args: ' + js2JSON(args)); + _debug('Raw query: ' + getTerm()); + + var req = new Request(method, args, getTerm(), 1); + req.callback(handler); + req.send(); +} + + + + + +/* set the search result info, number of hits, which results we're + displaying, links to the next/prev pages, etc. */ +function resultSetHitInfo() { + + var lasso = getLasso(); + if (!lasso) { + /* tell the user where the results are coming from */ + var baseorg = findOrgUnit(getLocation()); + var depth = getDepth(); + var mydepth = findOrgDepth(baseorg); + if( findOrgDepth(baseorg) != depth ) { + var tmporg = baseorg; + while( mydepth > depth ) { + mydepth--; + tmporg = findOrgUnit(tmporg.parent_ou()); + } + unHideMe($('including_results_for')); + try{$('including_results_location').appendChild(text(tmporg.name()));} catch(e){} + } + } + + + try{searchTimer.stop()}catch(e){} + + //if( findCurrentPage() == MRESULT ) { + if( findCurrentPage() == MRESULT || + + (findCurrentPage() == RRESULT && + ( + getRtype() == RTYPE_TITLE || + getRtype() == RTYPE_AUTHOR || + getRtype() == RTYPE_SUBJECT || + getRtype() == RTYPE_SERIES || + getRtype() == RTYPE_KEYWORD + ) + + ) ) { + + if(getHitCount() <= lowHitCount && getTerm()) + runEvt('result', 'lowHits'); + } + + if(getHitCount() == 0) { + runEvt('result', 'zeroHits'); + return; + } + + + var pages = getHitCount() / getDisplayCount(); + if(pages % 1) pages = parseInt(pages) + 1; + + + + var cpage = (getOffset()/getDisplayCount()) + 1; + + G.ui.result.current_page.appendChild(text(cpage)); + G.ui.result.num_pages.appendChild(text(pages)); /* the ) is dumb */ + + $('current_page2').appendChild(text(cpage)); + $('num_pages2').appendChild(text(pages + ")")); /* the ) is dumb */ + + /* set the offsets */ + var offsetEnd = getDisplayCount() + getOffset(); + if( getDisplayCount() > (getHitCount() - getOffset())) + offsetEnd = getHitCount(); + + G.ui.result.offset_end.appendChild(text(offsetEnd)); + G.ui.result.offset_start.appendChild(text(getOffset() + 1)); + + $('offset_end2').appendChild(text(offsetEnd)); + $('offset_start2').appendChild(text(getOffset() + 1)); + + G.ui.result.result_count.appendChild(text(getHitCount())); + unHideMe(G.ui.result.info); + unHideMe($('result_numbers1')); + + $('result_count2').appendChild(text(getHitCount())); + unHideMe($('result_info_div2')); +} + +function resultLowHits() { + showCanvas(); + unHideMe($('result_low_hits')); + if(getHitCount() > 0) + unHideMe($('result_low_hits_msg')); + + var words = []; + for(var key in resultCompiledSearch.searches) + words.push(resultCompiledSearch.searches[key].term); + + var sreq = new Request(CHECK_SPELL, words.join(' ')); + sreq.callback(resultSuggestSpelling); + sreq.send(); + + for(var key in resultCompiledSearch.searches) { + var areq = new Request(FETCH_CROSSREF, key, resultCompiledSearch.searches[key].term); + areq.callback(resultLowHitXRef); + areq.send(); + } + + if( !(getForm() == null || getForm() == 'all' || getForm() == "") ) { + var a = {}; + a[PARAM_FORM] = "all"; + $('low_hits_remove_format_link').setAttribute('href',buildOPACLink(a)); + unHideMe($('low_hits_remove_format')); + } + + resultSuggestSearchClass(); + + if(getTerm()) resultExpandSearch(); /* advanced search */ +} + +var lowHitsXRefSet = {}; +var lowHitsXRefLink; +var lowHitsXRefLinkParent; +function resultLowHitXRef(r) { + if(!lowHitsXRefLink){ + lowHitsXRefLinkParent = $('low_hits_xref_link').parentNode; + lowHitsXRefLink = lowHitsXRefLinkParent.removeChild($('low_hits_xref_link')); + } + var res = r.getResultObject(); + var arr = res.from; + arr.concat(res.also); + if(arr && arr.length > 0) { + unHideMe($('low_hits_cross_ref')); + var word; + var c = 0; + while( word = arr.shift() ) { + + if (lowHitsXRefSet[word] == 1) continue; + lowHitsXRefSet[word] = 1; + + if(c++ > 20) break; + var a = {}; + a[PARAM_TERM] = word; + var template = lowHitsXRefLink.cloneNode(true); + template.setAttribute('href',buildOPACLink(a)); + template.appendChild(text(word)); + lowHitsXRefLinkParent.appendChild(template); + lowHitsXRefLinkParent.appendChild(text(' ')); + } + } +} + +function resultZeroHits() { + hideMe($('result_header')); + hideMe($('result_table_div')); + hideMe($('statusbar')); + $('rresults_page').style.width="690px"; + unHideMe($('zero_search_hits')); + $('zero_hits_term').innerHTML = getTerm(); + //showCanvas(); + unHideMe($('result_low_hits')); + unHideMe($('result_zero_hits_msg')); + if(getTerm()) resultExpandSearch(); /* advanced search */ +} + +function resultExpandSearch() { + var top = findOrgDepth(globalOrgTree); + if(getDepth() == top) return; + unHideMe($('low_hits_expand_range')); + var par = $('low_hits_expand_link').parentNode; + var template = par.removeChild($('low_hits_expand_link')); + + var bottom = getDepth(); + while( top < bottom ) { + var a = {}; + a[PARAM_DEPTH] = top; + var temp = template.cloneNode(true); + temp.appendChild(text(findOrgTypeFromDepth(top).opac_label())) + temp.setAttribute('href',buildOPACLink(a)); + par.appendChild(temp); + top++; + } +} + +function resultSuggestSearchClass() { + var stype = getStype(); + if(stype == STYPE_KEYWORD) return; + var a = {}; var ref; + unHideMe($('low_hits_search_type')); + if(stype != STYPE_TITLE) { + ref = $('low_hits_title_search'); + unHideMe(ref); + a[PARAM_STYPE] = STYPE_TITLE; + ref.setAttribute('href',buildOPACLink(a)); + } + if(stype != STYPE_AUTHOR) { + ref = $('low_hits_author_search'); + unHideMe(ref); + a[PARAM_STYPE] = STYPE_AUTHOR; + ref.setAttribute('href',buildOPACLink(a)); + } + if(stype != STYPE_SUBJECT) { + ref = $('low_hits_subject_search'); + unHideMe(ref); + a[PARAM_STYPE] = STYPE_SUBJECT; + ref.setAttribute('href',buildOPACLink(a)); + } + if(stype != STYPE_KEYWORD) { + ref = $('low_hits_keyword_search'); + unHideMe(ref); + a[PARAM_STYPE] = STYPE_KEYWORD; + ref.setAttribute('href',buildOPACLink(a)); + } + if(stype != STYPE_SERIES) { + ref = $('low_hits_series_search'); + unHideMe(ref); + a[PARAM_STYPE] = STYPE_SERIES; + ref.setAttribute('href',buildOPACLink(a)); + } +} + +function resultSuggestSpelling(r) { + var res = r.getResultObject(); + var phrase = getTerm(); + var words = phrase.split(/ /); + + var newterm = ""; + + for( var w = 0; w < words.length; w++ ) { + var word = words[w]; + var blob = grep(res, function(i){return (i.word == word);}); + if( blob ) blob = blob[0]; + else continue; + if( blob.word == word ) { + if( blob.suggestions && blob.suggestions[0] ) { + newterm += " " + blob.suggestions[0]; + unHideMe($('did_you_mean')); + } else { + newterm += " " + word; + } + } + } + var cell = $('zero_hits_suggestions'); + var s = res[0].suggestions; + for(var i in s) { + if(i==0) continue; + if(i==10) break; //limit suggestions + cell.appendChild(elem('a',{href:buildOPACLink({t:s[i]})},s[i])); + cell.appendChild(elem('br')); + } + if(newterm.toLowerCase().trim()!=getTerm().toLowerCase().trim()) unHideMe($('zero_hits_label1')); + if(res[0].suggestions && res[0].suggestions.length>0) unHideMe($('zero_hits_label2')); + + var arg = {}; + arg[PARAM_TERM] = newterm; + $('spell_check_link').setAttribute('href', buildOPACLink(arg)); + $('spell_check_link').appendChild(text(newterm)); +} + + +function resultPaginate() { + var o = getOffset(); + var args = {}; + + if( !( ((o) + getDisplayCount()) >= getHitCount()) ) { + + args[PARAM_OFFSET] = o + getDisplayCount(); + args[PARAM_SORT] = SORT; + args[PARAM_SORT_DIR] = SORT_DIR; + args[PARAM_RLIST] = new CGI().param(PARAM_RLIST); + + G.ui.result.next_link.setAttribute("href", buildOPACLink(args)); + addCSSClass(G.ui.result.next_link, config.css.result.nav_active); + + $('next_link2').setAttribute("href", buildOPACLink(args)); + addCSSClass($('next_link2'), config.css.result.nav_active); + + args[PARAM_OFFSET] = getHitCount() - (getHitCount() % getDisplayCount()); + + /* when hit count is divisible by display count, we have to adjust */ + if( getHitCount() % getDisplayCount() == 0 ) + args[PARAM_OFFSET] -= getDisplayCount(); + } + + if( o > 0 ) { + + var args = {}; + args[PARAM_SORT] = SORT; + args[PARAM_SORT_DIR] = SORT_DIR; + args[PARAM_RLIST] = new CGI().param(PARAM_RLIST); + + args[PARAM_OFFSET] = o - getDisplayCount(); + G.ui.result.prev_link.setAttribute( "href", buildOPACLink(args)); + addCSSClass(G.ui.result.prev_link, config.css.result.nav_active); + + $('prev_link2').setAttribute( "href", buildOPACLink(args)); + addCSSClass($('prev_link2'), config.css.result.nav_active); + + args[PARAM_OFFSET] = 0; + G.ui.result.home_link.setAttribute( "href", buildOPACLink(args)); + addCSSClass(G.ui.result.home_link, config.css.result.nav_active); + } + + // pagination - google style + var pages = getHitCount() / getDisplayCount(); + var cpage = (getOffset()/getDisplayCount()) + 1; + var start = 0; + pages = Math.floor(pages); + cpage = Math.floor(cpage); + var end = pages>9?8:pages; + + // narrow our window of visible page numbers to 9 - sets start and end pages for the loop + if(cpage>4) { + start = cpage-5; + end = cpage+3>pages?pages:cpage+3; + if(cpage+3>pages) { start = (cpage-5)-(cpage-pages+3); } + if(start<0) start=0; + } // ugh... I hate math. + + if(pages>0) { + var span = $('nav_pages'); + var span2 = $('nav_pages2'); + for(var i=start; i<=end; i++) { + if(i==end && (getHitCount()%getDisplayCount())==0) break; + var temp = elem('span',{style:'padding:0px 3px;'}); + temp.style.padding='0px 3px'; + args[PARAM_OFFSET] = getDisplayCount()*i; + if(i==cpage-1) { var link = text(i+1); temp.style.color="red" } + else var link = elem('a',{href:buildOPACLink(args)},i+1); + temp.appendChild(link); + span.appendChild(temp); + span2.appendChild(temp.cloneNode(true)); + } + } + ////// + + if(getDisplayCount() < getHitCount()) { + unHideMe($('start_end_links_span')); + unHideMe($('start_end_links_span2')); + } + + showCanvas(); + try{searchTimer.stop()}catch(e){} +} + +function buildunAPISpan (span, type, id) { + if(!span || !type || !id) return; + var cgi = new CGI(); + var d = new Date(); + + addCSSClass(span,'unapi-id'); + + span.setAttribute( + 'title', + 'tag:' + cgi.server_name + ',' + + d.getFullYear() + + ':' + type + '/' + id + ); +} + +function unhideGoogleBooksLink (data) { + for ( var i in data ) { + //if (data[i].preview == 'noview') continue; + + var gbspan = $n(document.documentElement, 'googleBooksLink-' + i); + var gba = $n(gbspan, "googleBooks-link"); + + gba.setAttribute( + 'href', + data[i].info_url + ); + removeCSSClass( gbspan, 'hide_me' ); + } +} + +/* display the record info in the record display table 'pos' is the + zero based position the record should have in the display table */ +function resultDisplayRecord(rec, pos, is_mr) { + //fieldmapper.IDL.load(['mvr']); + if(rec == null || rec.__c) rec = new mvr(); /* so the page won't die if there was an error */ + recordsHandled++; + recordsCache.push(rec); + + var r = table.rows[pos + 1]; + r.id += "_" + rec.doc_id(); + var currentISBN = cleanISBN(rec.isbn()); + + if (googleBooksLink) { + var gbspan = $n(r, "googleBooksLink"); + if (currentISBN && gbspan) { + gbspan.setAttribute('name', gbspan.getAttribute('name') + '-' + currentISBN ); + if (isbnList) isbnList += ', '; + isbnList += currentISBN; + } + } + + if (currentISBN && chilifresh && chilifresh != '(none)') { + var cfrow = $n(r, "chilifreshReview"); + if (cfrow) { + removeCSSClass( cfrow, 'hide_me' ); + } + var cflink = $n(r, "chilifreshReviewLink"); + if (cflink) { + cflink.setAttribute( + 'id', + 'isbn_' + currentISBN + ); + } + var cfdiv = $n(r, "chilifreshReviewResult"); + if (cfdiv) { + cfdiv.setAttribute( + 'id', + 'chili_review_' + currentISBN + ) + } + } + + var pic = $n(r, config.names.result.item_jacket); + if (!pic) pic = elem("img"); + //pic.setAttribute("src", buildISBNSrc(currentISBN)); + pic.setAttribute("width",55); + + var title_link = $n(r, config.names.result.item_title); + var author_link = $n(r, config.names.result.item_author); + var row_count = $n(r,"results_row_count"); + var myListLink = $n(r,"result_my_list_link"); + var reviewsLink = $n(r, 'reviews_and_more'); + if(currentISBN) { + reviewsLink.href="http://contentcafe2.btol.com/ContentCafeClient/ContentCafe.aspx?UserID=KC72927&Password=CC14647&ItemKey="+currentISBN+"&Options=Y"; + } + + if( is_mr ) { + var onlyrec = onlyrecord[ getOffset() + pos ]; + if(onlyrec) { + buildunAPISpan($n(r,'unapi'), 'biblio-record_entry', onlyrec); + + var args = {}; + args.page = RDETAIL; + args[PARAM_OFFSET] = 0; + args[PARAM_RID] = onlyrec; + args[PARAM_MRID] = rec.doc_id(); + pic.parentNode.setAttribute("href", buildOPACLink(args)); + title_link.setAttribute("href", buildOPACLink(args)); + title_link.appendChild(text(normalize(truncate(rec.title(), 65)))); + + } else { + buildunAPISpan($n(r,'unapi'), 'metabib-metarecord', rec.doc_id()); + + buildTitleLink(rec, title_link); + var args = {}; + args.page = RRESULT; + args[PARAM_OFFSET] = 0; + args[PARAM_MRID] = rec.doc_id(); + pic.parentNode.setAttribute("href", buildOPACLink(args)); + } + + } else { + buildunAPISpan($n(r,'unapi'), 'biblio-record_entry', rec.doc_id()); + + //if(title_link) buildTitleDetailLink(rec, title_link); + if(title_link) { + title_link.appendChild(text(normalize(truncate(rec.title(), 1000)))); + var argss = {}; + argss.page = RDETAIL; + argss[PARAM_RID] = rec.doc_id(); + var linkText = title_link.innerHTML; // IE + title_link.setAttribute("href", buildOPACLink(argss)); + title_link.innerHTML = linkText; // IE + } + var args = {}; + args.page = RDETAIL; + args[PARAM_OFFSET] = 0; + args[PARAM_RID] = rec.doc_id(); + pic.parentNode.setAttribute("href", buildOPACLink(args)); + + unHideMe($n(r,'place_hold_span')); + //$n(r,'place_hold_link').setAttribute('href','javascript:holdsDrawEditor({record:"'+rec.doc_id()+'",type:"T"});'); + $n(r,'place_hold_link').onclick = function() { resultDrawHoldsWindow(rec.doc_id(), 'T'); } + + /** BILL */ + //dojo.require('openils.BibTemplate'); // -- this causes redundant requests per record - put in js_common.xml instead + setTimeout( + function () { + //new openils.BibTemplate({root : $n(r, 'bib_cn_list'), record : rec.doc_id()}).render(); + new openils.BibTemplate({root : r, record : rec.doc_id()}).render(); + }, 0 + ); + /** BILL */ + } + + if(row_count) row_count.innerHTML = (pos+1)+getOffset()+"."; + if(myListLink) myListLink.setAttribute("href","javascript:addMyList("+rec.doc_id()+");") + title_link.setAttribute("title",rec.title()); + buildSearchLink(STYPE_AUTHOR, rec.author(), author_link); + + if(! is_mr ) { + $n(r, "results_pub_date").innerHTML = (!rec.pubdate())?"":rec.pubdate(); + $n(r, "results_pub").innerHTML = (!rec.publisher())?"":rec.publisher(); + $n(r, "results_isbn").innerHTML = (!currentISBN)?"":currentISBN; + $n(r, "results_edition").innerHTML = (!rec.edition())?"":rec.edition(); + $n(r, "results_phys_desc").innerHTML = (!rec.physical_description())?"":rec.physical_description(); + if(isInAnonList(parseInt(rec.doc_id()))) { + $n(r, 'result_my_list_link').innerHTML = 'Remove from my list'; + $n(r, 'result_my_list_link').title = 'Remove from my list'; + //$n(r, 'result_my_list_link').appendChild(elem('img', {src:'/opac/skin/kcls/graphics/add_mylist_sel.gif'}, null)); + } + + if(!isNull(rec.edition())) { + unHideMe( $n(r, "result_table_extra_span")); + $n(r, "result_table_edition_span").appendChild( text( rec.edition()) ); + } + if(!isNull(rec.pubdate())) { + unHideMe( $n(r, "result_table_extra_span")); + unHideMe($n(r, "result_table_pub_span")); + $n(r, "result_table_pub_span").appendChild( text( rec.pubdate() )); + } + if(!isNull(rec.publisher()) ) { + unHideMe( $n(r, "result_table_extra_span")); + unHideMe($n(r, "result_table_pub_span")); + $n(r, "result_table_pub_span").appendChild( text( " " + rec.publisher() )); + } + + if(!isNull(rec.physical_description()) ) { + unHideMe( $n(r, "result_table_extra_span")); + var t = " " + rec.physical_description(); + //$n(r, "result_table_phys_span").appendChild( text(t.replace(/:.*/g,''))); + $n(r, "result_table_phys_span").appendChild( text(t)); + } + } + + resultBuildFormatIcons( r, rec, is_mr ); + unHideMe(r); + runEvt("result", "recordDrawn", rec.doc_id(), title_link); + + + if(resultPageIsDone()) { + runEvt('result', 'allRecordsReceived', recordsCache); + } +} + +function resultDrawHoldsWindow(hold_target, hold_type) { + var src = location.href; + if(forceLoginSSL && src.match(/^http:/)) { + src = src.replace(/^http:/, 'https:'); + if(src.match(/&hold_target=/)) { + src.replace(/&hold_target=(\d+)/, hold_target); + } else { + src += '&hold_target=' + hold_target; + } + location.href = src; + } else { + holdsDrawEditor({record:hold_target, type:hold_type}); + } +} + + +function _resultFindRec(id) { + for( var i = 0; i != recordsCache.length; i++ ) { + var rec = recordsCache[i]; + if( rec && rec.doc_id() == id ) + return rec; + } + return null; +} + + +function resultBuildFormatIcons( row, rec, is_mr ) { + var ress = ""; + var imgEl = $n(row, "result_mat_type"); + if(!imgEl) return; + + ress = getMarcData(rec.doc_id(),"998","d"); + if(setFormatIcon(imgEl, ress)) unHideMe(imgEl); + +} + +function fetchGoogleBooksLink () { + return; + if (isbnList && googleBooksLink) { + var scriptElement = document.createElement("script"); + scriptElement.setAttribute("id", "jsonScript"); + scriptElement.setAttribute("src", + "https://books.google.com/books?bibkeys=" + + escape(isbnList) + "&jscmd=viewapi&callback=unhideGoogleBooksLink"); + scriptElement.setAttribute("type", "text/javascript"); + // make the request to Google Book Search + document.documentElement.firstChild.appendChild(scriptElement); + } +} + +function resultPageIsDone(pos) { + + return (recordsHandled == getDisplayCount() + || recordsHandled + getOffset() == getHitCount()); +} + +var resultCCHeaderApplied = false; + +/* -------------------------------------------------------------------- */ +/* dynamically add the copy count rows based on the org type 'countsrow' + is the row into which we will add TD's to hold the copy counts + This code generates copy count cells with an id of + 'copy_count_cell__' */ +function resultAddCopyCounts(rec, pagePosition) { + + var r = table.rows[pagePosition + 1]; + var countsrow = $n(r, config.names.result.counts_row ); + var ccell = $n(countsrow, config.names.result.count_cell); + + var nodes = orgNodeTrail(findOrgUnit(getLocation())); + var node = nodes[0]; + var type = findOrgType(node.ou_type()); + ccell.id = "copy_count_cell_" + type.depth() + "_" + pagePosition; + ccell.title = type.opac_label(); + //addCSSClass(ccell, config.css.result.cc_cell_even); + + var lastcell = ccell; + var lastheadcell = null; + + var cchead = null; + var ccheadcell = null; + if(!resultCCHeaderApplied && !getLasso()) { + ccrow = $('result_thead_row'); + ccheadcell = ccrow.removeChild($n(ccrow, "result_thead_ccell")); + var t = ccheadcell.cloneNode(true); + lastheadcell = t; + t.appendChild(text(type.opac_label())); + ccrow.appendChild(t); + resultCCHeaderApplied = true; + } +} + +/* collect copy counts for a record using method 'methodName' */ +function resultCollectCopyCounts(rec, pagePosition, methodName) { + if(rec == null || rec.doc_id() == null) return; + + var loc = getLasso(); + if (loc) loc = -loc; + else loc= getLocation(); + + var req = new Request(methodName, loc, rec.doc_id(), getForm() ); + req.request.userdata = [ rec, pagePosition ]; + req.callback(resultHandleCopyCounts); + req.send(); +} + +function resultHandleCopyCounts(r) { + runEvt('result', 'copyCountsReceived', r.userdata[0], r.userdata[1], r.getResultObject()); +} + + +/* XXX Needs to understand Lasso copy counts... */ +/* display the collected copy counts */ +function resultDisplayCopyCounts(rec, pagePosition, copy_counts) { + if(copy_counts == null || rec == null) return; + var r = table.rows[pagePosition + 1]; + var cnt_avail = $n(r, "copy_count_avail"); + if(cnt_avail && copy_counts[0]) { + /*if(copy_counts[0].available)*/ cnt_avail.innerHTML = copy_counts[0].available+' cop'+(copy_counts[0].available==1?'y':'ies')+' available'; + //else { + fieldmapper.standardRequest(['open-ils.circ','open-ils.circ.bre.holds.count'], {async:true, params:[rec.doc_id(), r.id], oncomplete: drawHoldsCount}); + $n(r, 'copy_holds2').innerHTML = ' on first copy returned of '+copy_counts[0].count+' cop'+(copy_counts[0].count==1?'y':'ies'); + //} + } +} + +function drawHoldsCount(r) { + if(!r.params[1]) return; + var row = $(r.params[1]); + if(!row) return; + var span = $n(row, 'copy_holds'); + var resp = r.recv().content(); + span.innerHTML = resp+' hold'+(resp==1?'':'s')+' '; +} + +function showDetailedInfo(bool) { + + var tbls = dojo.query('.results_info_table',$('result_table')); + if(bool) { + tbls.forEach(function(node, index, arr){ + unHideMe($n(node,'results_pub_tr')); + unHideMe($n(node,'results_isbn_tr')); + unHideMe($n(node,'results_edition_tr')); + unHideMe($n(node,'results_phys_desc_tr')); + }); + } else { + tbls.forEach(function(node, index, arr){ + hideMe($n(node,'results_pub_tr')); + hideMe($n(node,'results_isbn_tr')); + hideMe($n(node,'results_edition_tr')); + hideMe($n(node,'results_phys_desc_tr')); + }); + } +} + +function fetchChiliFreshReviews() { + if (chilifresh && chilifresh != '(none)') { + try { chili_init(); } catch(E) { dump(E + '\n'); } + } +} + +function postResultsCollect() { + var it = getCacheValue('showHoldEditor'); + if(it) { + setCacheValue('showHoldEditor', null); + holdsDrawEditor({record:it.record, type:it.type}); + } +} diff --git a/Open-ILS/web/opac/skin/kcls/js/rresult.js b/Open-ILS/web/opac/skin/kcls/js/rresult.js index 545106c54c..a769033a8f 100644 --- a/Open-ILS/web/opac/skin/kcls/js/rresult.js +++ b/Open-ILS/web/opac/skin/kcls/js/rresult.js @@ -1,339 +1,339 @@ -var records = new Array(); -var table; -var rowtemplate; -var rresultLimit = 200; -var resultFacetKey; - -var rresultIsPaged = false; - -function rresultUnload() { removeChildren(table); table = null;} - -attachEvt("common", "unload", rresultUnload); -attachEvt("common", "run", rresultDoSearch); -attachEvt("result", "idsReceived", rresultCollectRecords); -attachEvt("result", "recordDrawn", rresultLaunchDrawn); - -hideMe($('copyright_block')); - -function rresultDoSearch() { - - swapCanvas($('loading_alt')); - - table = G.ui.result.main_table; - hideMe(G.ui.result.row_template); - if( table && table.parentNode ) { - while( table.parentNode.rows.length <= (getDisplayCount() +1) ) - hideMe(table.appendChild(G.ui.result.row_template.cloneNode(true))); - } - unHideMe($('results_header_bar')); - rresultCollectIds(); -} - -function rresultCollectIds() { - var ids; - - var rtype = getRtype(); - if (rtype && rtype.indexOf('|') > -1) - rtype = rtype.substring(0,rtype.indexOf('|')); - - switch(rtype) { - - case RTYPE_COOKIE: - ids = JSON2js(cookieManager.read(COOKIE_RIDS)); - _rresultHandleIds( ids, ids.length ); - break; - - case RTYPE_TITLE: - case RTYPE_AUTHOR: - case RTYPE_SUBJECT: - case RTYPE_SERIES: - case RTYPE_KEYWORD: - rresultDoRecordSearch(); - break; - - case RTYPE_MULTI: - rresultDoRecordMultiSearch(); - break; - - case RTYPE_LIST : - rresultHandleList(); - break; - - case RTYPE_MARC : - rresultCollectMARCIds(); - break; - - case RTYPE_ISBN : - rresultCollectISBNIds(); - break; - - case RTYPE_TCN : - rresultCollectTCNIds(); - break; - - case RTYPE_ISSN : - rresultCollectISSNIds(); - break; - - - case RTYPE_MRID : - case null : - case "" : - default: - var form = rresultGetForm(); - var args = { format : form, org : getLocation(), depth : rresultGetDepth() }; - - var lasso = getLasso(); - if (lasso) args.org = -lasso; - - var req = new Request(FETCH_RIDS, getMrid(), args); - req.callback( rresultHandleRIds ); - req.send(); - - if( rresultGetDepth() != findOrgDepth(globalOrgTree) ) { - var link = $('rresult_show_all_link'); - if(link) { - unHideMe($('rresult_show_all')); - link.appendChild( text( - findOrgType(globalOrgTree.ou_type()).opac_label())); - } - - } else { - if( rresultGetDepth() != getDepth() ) { /* inside a limited display */ - var link = $('rresult_show_here_link'); - if(link) { - link.appendChild( text( - findOrgType(findOrgUnit(getLocation()).ou_type()).opac_label())); - unHideMe($('rresult_show_here')); - } - } - } - } -} - -function rresultExpandSearch() { - var args = {}; - args[PARAM_RDEPTH] = findOrgDepth(globalOrgTree); - goTo(buildOPACLink(args)); -} - -function rresultContractSearch() { - var args = {}; - RDEPTH = null; - args[PARAM_OFFSET] = 0; - goTo(buildOPACLink(args)); -} - - -function rresultGetDepth() { - if( getRdepth() != null) return getRdepth(); - return getDepth(); -} - - -function rresultGetForm() { - var form; - - if(getTform()) /* did the user select a format from the icon list (temporary) */ - form = (getTform() == 'all') ? null : getTform(); - else /* did the use select a format from simple search dropdown */ - form = (getForm() == 'all') ? null : getForm(); - - if(!form) { /* did the user select a format from the advanced search */ - form = getItemType(); - var f = getItemForm(); - - if(form) { - form = form.replace(/,/,''); - if(f) form += '-' + f; - } else { - if(f) form = '-' + f; - } - } - - return form; -} - - -function rresultCollectMARCIds() { - - var args = {}; - args.searches = JSON2js(getSearches()); - args.limit = 200; - args.org_unit = globalOrgTree.id(); - args.depth = 0; - - rresultIsPaged = true; - var req = new Request(FETCH_ADV_MARC_MRIDS, args, getDisplayCount(), getOffset()); - req.callback(rresultHandleRIds); - req.request.noretry = true; - req.send(); -} - - -function rresultCollectISBNIds() { - var req = new Request(FETCH_ADV_ISBN_RIDS, getAdvTerm() ); - req.callback( - function(r) { - var blob = r.getResultObject(); - _rresultHandleIds(blob.ids, blob.count); - } - ); - req.send(); -} - -function rresultCollectTCNIds() { - var req = new Request(FETCH_ADV_TCN_RIDS, getAdvTerm() ); - req.callback( - function(r) { - var blob = r.getResultObject(); - _rresultHandleIds(blob.ids, blob.count); - } - ); - req.send(); -} - -function rresultCollectISSNIds() { - var req = new Request(FETCH_ADV_ISSN_RIDS, getAdvTerm() ); - req.callback( - function(r) { - var blob = r.getResultObject(); - _rresultHandleIds(blob.ids, blob.count); - } - ); - req.send(); -} - -function rresultHandleList() { - var ids = new CGI().param(PARAM_RLIST); - var count; - if(!dojo.isArray(ids)) { - count = 1; - ids = [ids]; - } else { - count = ids.length; - } - if(ids) _rresultHandleIds(ids, count); -} - -var rresultTries = 0; -function rresultHandleRIds(r) { - var res = r.getResultObject(); - - if(!res) res = {count:0,ids:[]}; - - if( res.count == 0 && rresultTries == 0 && ! r.noretry) { - - rresultTries++; - var form = rresultGetForm(); - var args = { format : form, org : getLocation(), depth : findOrgDepth(globalOrgTree) }; - - var lasso = getLasso(); - if (lasso) args.org = -lasso; - - var req = new Request(FETCH_RIDS, getMrid(), args ); - req.callback( rresultHandleRIds ); - req.send(); - unHideMe($('no_formats')); - hideMe($('rresult_show_all')); - - } else { - - _rresultHandleIds(res.ids, res.count); - } -} - -function _rresultHandleIds(ids, count) { - //var json = js2JSON({ids:ids,count:count}); - /* - cookieManager.write(COOKIE_SRIDS, json, '+1d'); - */ - - HITCOUNT = parseInt(count); - runEvt('result', 'hitCountReceived'); - runEvt('result', 'idsReceived', ids, getOffset()); -} - -/* -function rresultCollectRecords(ids) { - runEvt("result", "preCollectRecords"); - var x = 0; - for( var i = getOffset(); i!= getDisplayCount() + getOffset(); i++ ) { - if(ids[i] == null) break; - var req = new Request(FETCH_RMODS, parseInt(ids[i])); - req.callback(rresultHandleMods); - req.request.userdata = x++; - req.send(); - } -} -*/ - - -function rresultCollectRecords(ids, base) { - runEvt("result", "preCollectRecords"); - var x = 0; - - if (!base) base = 0; - if( rresultIsPaged ) base = 0; - - for( var i = base; i!= getDisplayCount() + base; i++ ) { - if(ids[i] == null) break; - var req = new Request(FETCH_RMODS, parseInt(ids[i])); - req.callback(rresultHandleMods); - req.request.userdata = x++; - req.send(); - } -} - -var recsReceivedCalled = false; -function rresultHandleMods(r) { - var rec = r.getResultObject(); - runEvt('result', 'recordReceived', rec, r.userdata, false); - resultCollectCopyCounts(rec, r.userdata, FETCH_R_COPY_COUNTS); - if(resultPageIsDone() && !recsReceivedCalled) { - recsReceivedCalled = true; - runEvt('result', 'allRecordsReceived', recordsCache); - unHideMe($('copyright_block')); - } -} - -function rresultLaunchDrawn(id, node) { - runEvt("rresult", "recordDrawn", id, node); -} - - -function rresultDoRecordSearch() { - rresultIsPaged = true; - resultCollectSearchIds(true, SEARCH_RS_QUERY, rresultFilterSearchResults ); -} - -function rresultDoRecordMultiSearch() { - rresultIsPaged = true; - resultCollectSearchIds(false, SEARCH_RS_QUERY, rresultFilterSearchResults ); -} - - -function rresultFilterSearchResults(r) { - var result = r.getResultObject(); - var ids = []; - if( result.count > 0 ) { - for( var i = 0; i != result.ids.length; i++ ) - ids.push(result.ids[i][0]); - } - - resultFacetKey = result.facet_key; - resultCompiledSearch = result.compiled_search; - cookieManager.write(COOKIE_SEARCH, js2JSON(result.compiled_search), -1); - _rresultHandleIds( ids, result.count ); -} - -function rresultHandlePlaceHold(target) { - function reload() { - location.href = location.href.replace(/&hold_target=\d+/, ''); - } - attachEvt("common", "holdUpdated", reload); - attachEvt("common", "holdUpdateCanceled", reload); - attachEvt("common", "loginCanceled", reload); - holdsDrawEditor({record:target, type: 'T'}); -} - +var records = new Array(); +var table; +var rowtemplate; +var rresultLimit = 200; +var resultFacetKey; + +var rresultIsPaged = false; + +function rresultUnload() { removeChildren(table); table = null;} + +attachEvt("common", "unload", rresultUnload); +attachEvt("common", "run", rresultDoSearch); +attachEvt("result", "idsReceived", rresultCollectRecords); +attachEvt("result", "recordDrawn", rresultLaunchDrawn); + +hideMe($('copyright_block')); + +function rresultDoSearch() { + + swapCanvas($('loading_alt')); + + table = G.ui.result.main_table; + hideMe(G.ui.result.row_template); + if( table && table.parentNode ) { + while( table.parentNode.rows.length <= (getDisplayCount() +1) ) + hideMe(table.appendChild(G.ui.result.row_template.cloneNode(true))); + } + unHideMe($('results_header_bar')); + rresultCollectIds(); +} + +function rresultCollectIds() { + var ids; + + var rtype = getRtype(); + if (rtype && rtype.indexOf('|') > -1) + rtype = rtype.substring(0,rtype.indexOf('|')); + + switch(rtype) { + + case RTYPE_COOKIE: + ids = JSON2js(cookieManager.read(COOKIE_RIDS)); + _rresultHandleIds( ids, ids.length ); + break; + + case RTYPE_TITLE: + case RTYPE_AUTHOR: + case RTYPE_SUBJECT: + case RTYPE_SERIES: + case RTYPE_KEYWORD: + rresultDoRecordSearch(); + break; + + case RTYPE_MULTI: + rresultDoRecordMultiSearch(); + break; + + case RTYPE_LIST : + rresultHandleList(); + break; + + case RTYPE_MARC : + rresultCollectMARCIds(); + break; + + case RTYPE_ISBN : + rresultCollectISBNIds(); + break; + + case RTYPE_TCN : + rresultCollectTCNIds(); + break; + + case RTYPE_ISSN : + rresultCollectISSNIds(); + break; + + + case RTYPE_MRID : + case null : + case "" : + default: + var form = rresultGetForm(); + var args = { format : form, org : getLocation(), depth : rresultGetDepth() }; + + var lasso = getLasso(); + if (lasso) args.org = -lasso; + + var req = new Request(FETCH_RIDS, getMrid(), args); + req.callback( rresultHandleRIds ); + req.send(); + + if( rresultGetDepth() != findOrgDepth(globalOrgTree) ) { + var link = $('rresult_show_all_link'); + if(link) { + unHideMe($('rresult_show_all')); + link.appendChild( text( + findOrgType(globalOrgTree.ou_type()).opac_label())); + } + + } else { + if( rresultGetDepth() != getDepth() ) { /* inside a limited display */ + var link = $('rresult_show_here_link'); + if(link) { + link.appendChild( text( + findOrgType(findOrgUnit(getLocation()).ou_type()).opac_label())); + unHideMe($('rresult_show_here')); + } + } + } + } +} + +function rresultExpandSearch() { + var args = {}; + args[PARAM_RDEPTH] = findOrgDepth(globalOrgTree); + goTo(buildOPACLink(args)); +} + +function rresultContractSearch() { + var args = {}; + RDEPTH = null; + args[PARAM_OFFSET] = 0; + goTo(buildOPACLink(args)); +} + + +function rresultGetDepth() { + if( getRdepth() != null) return getRdepth(); + return getDepth(); +} + + +function rresultGetForm() { + var form; + + if(getTform()) /* did the user select a format from the icon list (temporary) */ + form = (getTform() == 'all') ? null : getTform(); + else /* did the use select a format from simple search dropdown */ + form = (getForm() == 'all') ? null : getForm(); + + if(!form) { /* did the user select a format from the advanced search */ + form = getItemType(); + var f = getItemForm(); + + if(form) { + form = form.replace(/,/,''); + if(f) form += '-' + f; + } else { + if(f) form = '-' + f; + } + } + + return form; +} + + +function rresultCollectMARCIds() { + + var args = {}; + args.searches = JSON2js(getSearches()); + args.limit = 200; + args.org_unit = globalOrgTree.id(); + args.depth = 0; + + rresultIsPaged = true; + var req = new Request(FETCH_ADV_MARC_MRIDS, args, getDisplayCount(), getOffset()); + req.callback(rresultHandleRIds); + req.request.noretry = true; + req.send(); +} + + +function rresultCollectISBNIds() { + var req = new Request(FETCH_ADV_ISBN_RIDS, getAdvTerm() ); + req.callback( + function(r) { + var blob = r.getResultObject(); + _rresultHandleIds(blob.ids, blob.count); + } + ); + req.send(); +} + +function rresultCollectTCNIds() { + var req = new Request(FETCH_ADV_TCN_RIDS, getAdvTerm() ); + req.callback( + function(r) { + var blob = r.getResultObject(); + _rresultHandleIds(blob.ids, blob.count); + } + ); + req.send(); +} + +function rresultCollectISSNIds() { + var req = new Request(FETCH_ADV_ISSN_RIDS, getAdvTerm() ); + req.callback( + function(r) { + var blob = r.getResultObject(); + _rresultHandleIds(blob.ids, blob.count); + } + ); + req.send(); +} + +function rresultHandleList() { + var ids = new CGI().param(PARAM_RLIST); + var count; + if(!dojo.isArray(ids)) { + count = 1; + ids = [ids]; + } else { + count = ids.length; + } + if(ids) _rresultHandleIds(ids, count); +} + +var rresultTries = 0; +function rresultHandleRIds(r) { + var res = r.getResultObject(); + + if(!res) res = {count:0,ids:[]}; + + if( res.count == 0 && rresultTries == 0 && ! r.noretry) { + + rresultTries++; + var form = rresultGetForm(); + var args = { format : form, org : getLocation(), depth : findOrgDepth(globalOrgTree) }; + + var lasso = getLasso(); + if (lasso) args.org = -lasso; + + var req = new Request(FETCH_RIDS, getMrid(), args ); + req.callback( rresultHandleRIds ); + req.send(); + unHideMe($('no_formats')); + hideMe($('rresult_show_all')); + + } else { + + _rresultHandleIds(res.ids, res.count); + } +} + +function _rresultHandleIds(ids, count) { + //var json = js2JSON({ids:ids,count:count}); + /* + cookieManager.write(COOKIE_SRIDS, json, '+1d'); + */ + + HITCOUNT = parseInt(count); + runEvt('result', 'hitCountReceived'); + runEvt('result', 'idsReceived', ids, getOffset()); +} + +/* +function rresultCollectRecords(ids) { + runEvt("result", "preCollectRecords"); + var x = 0; + for( var i = getOffset(); i!= getDisplayCount() + getOffset(); i++ ) { + if(ids[i] == null) break; + var req = new Request(FETCH_RMODS, parseInt(ids[i])); + req.callback(rresultHandleMods); + req.request.userdata = x++; + req.send(); + } +} +*/ + + +function rresultCollectRecords(ids, base) { + runEvt("result", "preCollectRecords"); + var x = 0; + + if (!base) base = 0; + if( rresultIsPaged ) base = 0; + + for( var i = base; i!= getDisplayCount() + base; i++ ) { + if(ids[i] == null) break; + var req = new Request(FETCH_RMODS, parseInt(ids[i])); + req.callback(rresultHandleMods); + req.request.userdata = x++; + req.send(); + } +} + +var recsReceivedCalled = false; +function rresultHandleMods(r) { + var rec = r.getResultObject(); + runEvt('result', 'recordReceived', rec, r.userdata, false); + resultCollectCopyCounts(rec, r.userdata, FETCH_R_COPY_COUNTS); + if(resultPageIsDone() && !recsReceivedCalled) { + recsReceivedCalled = true; + runEvt('result', 'allRecordsReceived', recordsCache); + unHideMe($('copyright_block')); + } +} + +function rresultLaunchDrawn(id, node) { + runEvt("rresult", "recordDrawn", id, node); +} + + +function rresultDoRecordSearch() { + rresultIsPaged = true; + resultCollectSearchIds(true, SEARCH_RS_QUERY, rresultFilterSearchResults ); +} + +function rresultDoRecordMultiSearch() { + rresultIsPaged = true; + resultCollectSearchIds(false, SEARCH_RS_QUERY, rresultFilterSearchResults ); +} + + +function rresultFilterSearchResults(r) { + var result = r.getResultObject(); + var ids = []; + if( result.count > 0 ) { + for( var i = 0; i != result.ids.length; i++ ) + ids.push(result.ids[i][0]); + } + + resultFacetKey = result.facet_key; + resultCompiledSearch = result.compiled_search; + cookieManager.write(COOKIE_SEARCH, js2JSON(result.compiled_search), -1); + _rresultHandleIds( ids, result.count ); +} + +function rresultHandlePlaceHold(target) { + function reload() { + location.href = location.href.replace(/&hold_target=\d+/, ''); + } + attachEvt("common", "holdUpdated", reload); + attachEvt("common", "holdUpdateCanceled", reload); + attachEvt("common", "loginCanceled", reload); + holdsDrawEditor({record:target, type: 'T'}); +} + diff --git a/Open-ILS/web/opac/skin/kcls/js/search_bar.js b/Open-ILS/web/opac/skin/kcls/js/search_bar.js index cc25dee2c3..61f136ee42 100644 --- a/Open-ILS/web/opac/skin/kcls/js/search_bar.js +++ b/Open-ILS/web/opac/skin/kcls/js/search_bar.js @@ -1,105 +1,105 @@ -var searchBarExpanded = false; -/* our search selector boxes */ -var _ts, _fs; -var isFrontPage = false; -G.evt.common.init.push(searchBarInit); - -/* if set by the org selector, this will be the location used the - next time the search is submitted */ -var newSearchLocation; -var newSearchDepth = null; - - -function searchBarInit() { - _ts = G.ui.searchbar.type_selector; - _fs = G.ui.searchbar.form_selector; - - try{G.ui.searchbar.text.focus();}catch(e){} - G.ui.searchbar.text.onkeydown = function(evt) {if(userPressedEnter(evt)) { searchBarSubmit(); } }; - _ts.onkeydown = function(evt) {if(userPressedEnter(evt)) { searchBarSubmit(); } }; - _fs.onkeydown = function(evt) {if(userPressedEnter(evt)) { searchBarSubmit(); } }; - - G.ui.searchbar.submit.onclick = searchBarSubmit; - _fs.onchange = function(e) { - var fs = G.ui.searchbar.form_selector; - var val = fs.options[fs.selectedIndex].value; - - G.ui.searchbar.facets.value = val==''?'':"identifier|mattype["+val+"]"; - }; - - /* set up the selector objects, etc */ - var txtVal = (getTerm() != null) ? getTerm() : ""; - if(getStype()=="cn") txtVal = txtVal.replace(/identifier\|bibcn:/, ""); - - G.ui.searchbar.text.value = txtVal; - G.ui.searchbar.facets.value = (getFacet() != null) ? getFacet() : ""; - setSelector(_ts, getStype()); - setSelector(_fs, getForm()); - - depthSelInit(); - - if(getSearches()) { - var searches = JSON2js(getSearches()); - if(searches[1]) setSelector(_fs, searches[1].term); - if(!G.ui.searchbar.text.value) G.ui.searchbar.text.value = searches[0].term; - } - - if(!isFrontPage && (findCurrentPage() != MYOPAC)) { - attachEvt('common','depthChanged', searchBarSubmit); - } - - if( (limit = $('opac.result.limit2avail')) ) { - if(getAvail()) limit.checked = true; - if(getSort() && getSortDir()) - setSelector($('opac.result.sort'), getSort()+'.'+getSortDir()); - } - - if( (limit2 = $('opac.result.limit2avail2')) ) if(getAvail()) limit2.checked = true; -} - -function searchBarSubmit(isFilterSort) { - var text = G.ui.searchbar.text.value; - var facet_text = isFrontPage ? '' : G.ui.searchbar.facets.value; - clearSearchParams(); - if(!text || text == "" || text == "Search Keyword") return; - //var d = (newSearchDepth != null) ? newSearchDepth : depthSelGetDepth(); - var d = getDepth(); - if(isNaN(d)) d = 0; - var args = {}; - - var tsVal = _ts.options[_ts.selectedIndex].value; - if(SHOW_MR_DEFAULT || (isFilterSort && findCurrentPage() == MRESULT)) { - args.page = MRESULT; - } else { - args.page = RRESULT; - args[PARAM_RTYPE] = tsVal=="cn"?"keyword":tsVal; - } - - if(G.user && G.user.prefs['opac.hits_per_page']) args[PARAM_COUNT] = G.user.prefs['opac.hits_per_page']; - args[PARAM_STYPE] = tsVal; - args[PARAM_TERM] = tsVal=="cn"?"identifier|bibcn:"+text:text; - args[PARAM_FACET] = facet_text; - args[PARAM_LOCATION] = depthSelGetNewLoc(); - args[PARAM_DEPTH] = d; - args[PARAM_FORM] = _fs.options[_fs.selectedIndex].value; - //args[PARAM_SORT] = isFilterSort?'':'pubdate'; - //args[PARAM_SORT_DIR] = isFilterSort?'':'desc'; - - if($('opac.result.limit2avail') && !arguments[1]) { - args[PARAM_AVAIL] = ($('opac.result.limit2avail').checked) ? 1 : ''; - if( (val = getSelectorVal($('opac.result.sort'))) ) { - args[PARAM_SORT] = val.split('.')[0]; - args[PARAM_SORT_DIR] = val.split('.')[1]; - } - } else if(arguments[1]) { - args[PARAM_AVAIL] = (arguments[1].checked) ? 1 : ''; - if( (val = getSelectorVal($('opac.result.sort'))) ) { - args[PARAM_SORT] = val.split('.')[0]; - args[PARAM_SORT_DIR] = val.split('.')[1]; - } - } - - goTo(buildOPACLink(args)); -} - - +var searchBarExpanded = false; +/* our search selector boxes */ +var _ts, _fs; +var isFrontPage = false; +G.evt.common.init.push(searchBarInit); + +/* if set by the org selector, this will be the location used the + next time the search is submitted */ +var newSearchLocation; +var newSearchDepth = null; + + +function searchBarInit() { + _ts = G.ui.searchbar.type_selector; + _fs = G.ui.searchbar.form_selector; + + try{G.ui.searchbar.text.focus();}catch(e){} + G.ui.searchbar.text.onkeydown = function(evt) {if(userPressedEnter(evt)) { searchBarSubmit(); } }; + _ts.onkeydown = function(evt) {if(userPressedEnter(evt)) { searchBarSubmit(); } }; + _fs.onkeydown = function(evt) {if(userPressedEnter(evt)) { searchBarSubmit(); } }; + + G.ui.searchbar.submit.onclick = searchBarSubmit; + _fs.onchange = function(e) { + var fs = G.ui.searchbar.form_selector; + var val = fs.options[fs.selectedIndex].value; + + G.ui.searchbar.facets.value = val==''?'':"identifier|mattype["+val+"]"; + }; + + /* set up the selector objects, etc */ + var txtVal = (getTerm() != null) ? getTerm() : ""; + if(getStype()=="cn") txtVal = txtVal.replace(/identifier\|bibcn:/, ""); + + G.ui.searchbar.text.value = txtVal; + G.ui.searchbar.facets.value = (getFacet() != null) ? getFacet() : ""; + setSelector(_ts, getStype()); + setSelector(_fs, getForm()); + + depthSelInit(); + + if(getSearches()) { + var searches = JSON2js(getSearches()); + if(searches[1]) setSelector(_fs, searches[1].term); + if(!G.ui.searchbar.text.value) G.ui.searchbar.text.value = searches[0].term; + } + + if(!isFrontPage && (findCurrentPage() != MYOPAC)) { + attachEvt('common','depthChanged', searchBarSubmit); + } + + if( (limit = $('opac.result.limit2avail')) ) { + if(getAvail()) limit.checked = true; + if(getSort() && getSortDir()) + setSelector($('opac.result.sort'), getSort()+'.'+getSortDir()); + } + + if( (limit2 = $('opac.result.limit2avail2')) ) if(getAvail()) limit2.checked = true; +} + +function searchBarSubmit(isFilterSort) { + var text = G.ui.searchbar.text.value; + var facet_text = isFrontPage ? '' : G.ui.searchbar.facets.value; + clearSearchParams(); + if(!text || text == "" || text == "Search Keyword") return; + //var d = (newSearchDepth != null) ? newSearchDepth : depthSelGetDepth(); + var d = getDepth(); + if(isNaN(d)) d = 0; + var args = {}; + + var tsVal = _ts.options[_ts.selectedIndex].value; + if(SHOW_MR_DEFAULT || (isFilterSort && findCurrentPage() == MRESULT)) { + args.page = MRESULT; + } else { + args.page = RRESULT; + args[PARAM_RTYPE] = tsVal=="cn"?"keyword":tsVal; + } + + if(G.user && G.user.prefs['opac.hits_per_page']) args[PARAM_COUNT] = G.user.prefs['opac.hits_per_page']; + args[PARAM_STYPE] = tsVal; + args[PARAM_TERM] = tsVal=="cn"?"identifier|bibcn:"+text:text; + args[PARAM_FACET] = facet_text; + args[PARAM_LOCATION] = depthSelGetNewLoc(); + args[PARAM_DEPTH] = d; + args[PARAM_FORM] = _fs.options[_fs.selectedIndex].value; + //args[PARAM_SORT] = isFilterSort?'':'pubdate'; + //args[PARAM_SORT_DIR] = isFilterSort?'':'desc'; + + if($('opac.result.limit2avail') && !arguments[1]) { + args[PARAM_AVAIL] = ($('opac.result.limit2avail').checked) ? 1 : ''; + if( (val = getSelectorVal($('opac.result.sort'))) ) { + args[PARAM_SORT] = val.split('.')[0]; + args[PARAM_SORT_DIR] = val.split('.')[1]; + } + } else if(arguments[1]) { + args[PARAM_AVAIL] = (arguments[1].checked) ? 1 : ''; + if( (val = getSelectorVal($('opac.result.sort'))) ) { + args[PARAM_SORT] = val.split('.')[0]; + args[PARAM_SORT_DIR] = val.split('.')[1]; + } + } + + goTo(buildOPACLink(args)); +} + + diff --git a/Open-ILS/web/opac/skin/kcls/js/sidebar.js b/Open-ILS/web/opac/skin/kcls/js/sidebar.js index 1c93a8aa74..3f55bdef28 100644 --- a/Open-ILS/web/opac/skin/kcls/js/sidebar.js +++ b/Open-ILS/web/opac/skin/kcls/js/sidebar.js @@ -1,228 +1,228 @@ -/* set up the colors in the sidebar - Disables/Enables certain components based on various state data */ - -attachEvt("common", "init", initSideBar); -//attachEvt("common", "init", setSidebarLinks); -//attachEvt("common", "unload", sidebarTreesFree ); - -function prevRResults() { - return buildOPACLink({ page : RRESULT }); -} - -function prevMResults() { - return buildOPACLink({ page : MRESULT }); -} - -function initSideBar() { - var page = findCurrentPage(); - - if( page == MRESULT ) - unHideMe($("sidebar_results_wrapper")); - - if( page == RRESULT ) { - unHideMe($("sidebar_results_wrapper")); - unHideMe(G.ui.sidebar[MRESULT]); - if( getRtype() == RTYPE_MRID ) - $("sidebar_title_group_results").setAttribute("href", prevMResults()); - else hideMe($("sidebar_title_group_results").parentNode); - } - - /* if( page == RDETAIL ) { - unHideMe($("sidebar_results_wrapper")); - unHideMe(G.ui.sidebar[MRESULT]); - if(getRtype()) - $("sidebar_title_results").setAttribute("href", prevRResults()); - unHideMe(G.ui.sidebar[RRESULT]); - - if( getRtype() == RTYPE_MRID ) - $("sidebar_title_group_results").setAttribute("href", prevMResults()); - else hideMe($("sidebar_title_group_results").parentNode); - } */ - - unHideMe(G.ui.sidebar[page]); - addCSSClass(G.ui.sidebar[page], "sidebar_item_active"); - - /* if we're logged in, show it and replace the Login link with the Logout link */ - if(grabUser()) { - //G.ui.sidebar.username_dest.appendChild(text(G.user.usrname())); - //unHideMe(G.ui.sidebar.logoutbox); - unHideMe(G.ui.sidebar.logged_in_as); - hideMe(G.ui.sidebar.loginbox); - } - - if(G.ui.sidebar.login) G.ui.sidebar.login.onclick = initLogin; - //if(G.ui.sidebar.logout) G.ui.sidebar.logout.onclick = doLogout; - - if(isXUL()) hideMe( G.ui.sidebar.logoutbox ); -} - -/* sets up the login ui components */ -var loginBoxVisible = false; -function loginDance() { - var rem = $('remember_me'); - if(rem) rem = rem.checked; else rem = false; - rem = rem?"persist":"opac"; - - if(doLogin(true, rem)) { - - if(!strongPassword( G.ui.login.password.value ) ) { - - cookieManager.write(COOKIE_SES, ""); - hideMe($('login_box')); - unHideMe($('change_pw_table')); - $('change_pw_current').focus(); - $('change_pw_button').onclick = changePassword; - setEnterFunc($('change_pw_2'), changePassword); - - } else { - loggedInOK(); - } - } -} - -function loggedInOK() { - showCanvas(); - //G.ui.sidebar.username_dest.appendChild(text(G.user.usrname())); - //unHideMe(G.ui.sidebar.logoutbox); - unHideMe(G.ui.sidebar.logged_in_as); - hideMe(G.ui.sidebar.loginbox); - runEvt( 'common', 'loggedIn'); - - var org = G.user.prefs[PREF_DEF_LOCATION]; - // KCLS wants the defautl search location to be the consortium - //if(!org) org = G.user.home_ou(); - if(!org) org = globalOrgTree.id(); - - var depth = G.user.prefs[PREF_DEF_DEPTH]; - if(! ( depth && depth <= findOrgDepth(org)) ) - depth = findOrgDepth(org); - - runEvt( "common", "locationChanged", org, depth); -} - - -function changePassword() { - - var pc = $('change_pw_current').value; - var p1 = $('change_pw_1').value; - var p2 = $('change_pw_2').value; - - if( p1 != p2 ) { - alert($('pw_no_match').innerHTML); - return; - } - - if(!strongPassword(p2, true) ) return; - - var req = new Request(UPDATE_PASSWORD, G.user.session, p2, pc ); - req.send(true); - if(req.result()) { - alert($('pw_update_successful').innerHTML); - loggedInOK(); - } -} - -var pwRegexSetting; -function strongPassword(pass, alrt) { - - /* first, let's see if there is a configured regex */ - if(!pwRegexSetting) { - var regex = fetchOrgSettingDefault(G.user.home_ou(), 'global.password_regex'); - if(regex) { - if(pass.match(new RegExp(regex))) { - return true; - } else { - if(alrt) - alert($('pw_not_strong').innerHTML); - return false; - } - } - } - - /* no regex configured, use the default */ - - var good = false; - - do { - - if(pass.length < 7) break; - if(!pass.match(/.*\d+.*/)) break; - if(!pass.match(/.*[A-Za-z]+.*/)) break; - good = true; - - } while(0); - - if(!good && alrt) alert($('pw_not_strong').innerHTML); - return good; -} - -function initLogin() { - if(G.ui.login.button) G.ui.login.button.onclick = function(){$('login_form_submit').click();}; - if(dojo.isIE) { - if(G.ui.login.username) G.ui.login.username.onkeydown = function(evt) {if(userPressedEnter(evt)) $('login_form_submit').click();}; - if(G.ui.login.password) G.ui.login.password.onkeydown = function(evt) {if(userPressedEnter(evt)) $('login_form_submit').click();}; - } - - //if(findCurrentPage()==MYOPAC) { - swapCanvas(G.ui.login.box); - try{G.ui.login.username.focus();}catch(e){} - //} - - G.ui.login.cancel.onclick = function(evt) { - showCanvas(); - runEvt("common", "loginCanceled"); - }; - - if(findCurrentPage() == MYOPAC) - G.ui.login.cancel.onclick = goHome; -} - -function setSidebarLinks() { - G.ui.sidebar.home_link.setAttribute("href", buildOPACLink({page:HOME})); - G.ui.sidebar.advanced_link.setAttribute("href", buildOPACLink({page:ADVANCED})); - G.ui.sidebar.myopac_link.setAttribute("href", buildOPACLink({page:MYOPAC}, false, true)); -} - -function sidebarTreesFree() { - return; - removeChildren($(subjectSidebarTree.rootid)); - removeChildren($(authorSidebarTree.rootid)); - removeChildren($(seriesSidebarTree.rootid)); - subjectSidebarTree = null; - authorSidebarTree = null; - seriesSidebarTree = null; -} - - - - -/* --------------------------------------------------------------------------------- */ -/* Code to support GALILEO links for PINES. Fails gracefully -/* --------------------------------------------------------------------------------- */ -attachEvt('common', 'init', buildEGGalLink); -function buildEGGalLink() { - - /* we're in a lib, nothing to do here */ - if( getOrigLocation() ) return; - if(!$('eg_gal_link')) return; - - //var link = 'http://demo.galib.uga.edu/express?pinesid='; - var link = 'http://www.galileo.usg.edu/express?pinesid='; - if(grabUser()) { - $('eg_gal_link').setAttribute('href', link + G.user.session); - return; - } - - $('eg_gal_link').setAttribute('href', 'javascript:void(0);'); - $('eg_gal_link').setAttribute('target', ''); - $('eg_gal_link').onclick = function() { - /* we're not logged in. go ahead and login */ - detachAllEvt('common','locationChanged'); - detachAllEvt('common','loggedIn'); - attachEvt('common','loggedIn', function() { goTo(link + G.user.session); }) - initLogin(); - }; -} -/* --------------------------------------------------------------------------------- */ - - +/* set up the colors in the sidebar + Disables/Enables certain components based on various state data */ + +attachEvt("common", "init", initSideBar); +//attachEvt("common", "init", setSidebarLinks); +//attachEvt("common", "unload", sidebarTreesFree ); + +function prevRResults() { + return buildOPACLink({ page : RRESULT }); +} + +function prevMResults() { + return buildOPACLink({ page : MRESULT }); +} + +function initSideBar() { + var page = findCurrentPage(); + + if( page == MRESULT ) + unHideMe($("sidebar_results_wrapper")); + + if( page == RRESULT ) { + unHideMe($("sidebar_results_wrapper")); + unHideMe(G.ui.sidebar[MRESULT]); + if( getRtype() == RTYPE_MRID ) + $("sidebar_title_group_results").setAttribute("href", prevMResults()); + else hideMe($("sidebar_title_group_results").parentNode); + } + + /* if( page == RDETAIL ) { + unHideMe($("sidebar_results_wrapper")); + unHideMe(G.ui.sidebar[MRESULT]); + if(getRtype()) + $("sidebar_title_results").setAttribute("href", prevRResults()); + unHideMe(G.ui.sidebar[RRESULT]); + + if( getRtype() == RTYPE_MRID ) + $("sidebar_title_group_results").setAttribute("href", prevMResults()); + else hideMe($("sidebar_title_group_results").parentNode); + } */ + + unHideMe(G.ui.sidebar[page]); + addCSSClass(G.ui.sidebar[page], "sidebar_item_active"); + + /* if we're logged in, show it and replace the Login link with the Logout link */ + if(grabUser()) { + //G.ui.sidebar.username_dest.appendChild(text(G.user.usrname())); + //unHideMe(G.ui.sidebar.logoutbox); + unHideMe(G.ui.sidebar.logged_in_as); + hideMe(G.ui.sidebar.loginbox); + } + + if(G.ui.sidebar.login) G.ui.sidebar.login.onclick = initLogin; + //if(G.ui.sidebar.logout) G.ui.sidebar.logout.onclick = doLogout; + + if(isXUL()) hideMe( G.ui.sidebar.logoutbox ); +} + +/* sets up the login ui components */ +var loginBoxVisible = false; +function loginDance() { + var rem = $('remember_me'); + if(rem) rem = rem.checked; else rem = false; + rem = rem?"persist":"opac"; + + if(doLogin(true, rem)) { + + if(!strongPassword( G.ui.login.password.value ) ) { + + cookieManager.write(COOKIE_SES, ""); + hideMe($('login_box')); + unHideMe($('change_pw_table')); + $('change_pw_current').focus(); + $('change_pw_button').onclick = changePassword; + setEnterFunc($('change_pw_2'), changePassword); + + } else { + loggedInOK(); + } + } +} + +function loggedInOK() { + showCanvas(); + //G.ui.sidebar.username_dest.appendChild(text(G.user.usrname())); + //unHideMe(G.ui.sidebar.logoutbox); + unHideMe(G.ui.sidebar.logged_in_as); + hideMe(G.ui.sidebar.loginbox); + runEvt( 'common', 'loggedIn'); + + var org = G.user.prefs[PREF_DEF_LOCATION]; + // KCLS wants the defautl search location to be the consortium + //if(!org) org = G.user.home_ou(); + if(!org) org = globalOrgTree.id(); + + var depth = G.user.prefs[PREF_DEF_DEPTH]; + if(! ( depth && depth <= findOrgDepth(org)) ) + depth = findOrgDepth(org); + + runEvt( "common", "locationChanged", org, depth); +} + + +function changePassword() { + + var pc = $('change_pw_current').value; + var p1 = $('change_pw_1').value; + var p2 = $('change_pw_2').value; + + if( p1 != p2 ) { + alert($('pw_no_match').innerHTML); + return; + } + + if(!strongPassword(p2, true) ) return; + + var req = new Request(UPDATE_PASSWORD, G.user.session, p2, pc ); + req.send(true); + if(req.result()) { + alert($('pw_update_successful').innerHTML); + loggedInOK(); + } +} + +var pwRegexSetting; +function strongPassword(pass, alrt) { + + /* first, let's see if there is a configured regex */ + if(!pwRegexSetting) { + var regex = fetchOrgSettingDefault(G.user.home_ou(), 'global.password_regex'); + if(regex) { + if(pass.match(new RegExp(regex))) { + return true; + } else { + if(alrt) + alert($('pw_not_strong').innerHTML); + return false; + } + } + } + + /* no regex configured, use the default */ + + var good = false; + + do { + + if(pass.length < 7) break; + if(!pass.match(/.*\d+.*/)) break; + if(!pass.match(/.*[A-Za-z]+.*/)) break; + good = true; + + } while(0); + + if(!good && alrt) alert($('pw_not_strong').innerHTML); + return good; +} + +function initLogin() { + if(G.ui.login.button) G.ui.login.button.onclick = function(){$('login_form_submit').click();}; + if(dojo.isIE) { + if(G.ui.login.username) G.ui.login.username.onkeydown = function(evt) {if(userPressedEnter(evt)) $('login_form_submit').click();}; + if(G.ui.login.password) G.ui.login.password.onkeydown = function(evt) {if(userPressedEnter(evt)) $('login_form_submit').click();}; + } + + //if(findCurrentPage()==MYOPAC) { + swapCanvas(G.ui.login.box); + try{G.ui.login.username.focus();}catch(e){} + //} + + G.ui.login.cancel.onclick = function(evt) { + showCanvas(); + runEvt("common", "loginCanceled"); + }; + + if(findCurrentPage() == MYOPAC) + G.ui.login.cancel.onclick = goHome; +} + +function setSidebarLinks() { + G.ui.sidebar.home_link.setAttribute("href", buildOPACLink({page:HOME})); + G.ui.sidebar.advanced_link.setAttribute("href", buildOPACLink({page:ADVANCED})); + G.ui.sidebar.myopac_link.setAttribute("href", buildOPACLink({page:MYOPAC}, false, true)); +} + +function sidebarTreesFree() { + return; + removeChildren($(subjectSidebarTree.rootid)); + removeChildren($(authorSidebarTree.rootid)); + removeChildren($(seriesSidebarTree.rootid)); + subjectSidebarTree = null; + authorSidebarTree = null; + seriesSidebarTree = null; +} + + + + +/* --------------------------------------------------------------------------------- */ +/* Code to support GALILEO links for PINES. Fails gracefully +/* --------------------------------------------------------------------------------- */ +attachEvt('common', 'init', buildEGGalLink); +function buildEGGalLink() { + + /* we're in a lib, nothing to do here */ + if( getOrigLocation() ) return; + if(!$('eg_gal_link')) return; + + //var link = 'http://demo.galib.uga.edu/express?pinesid='; + var link = 'http://www.galileo.usg.edu/express?pinesid='; + if(grabUser()) { + $('eg_gal_link').setAttribute('href', link + G.user.session); + return; + } + + $('eg_gal_link').setAttribute('href', 'javascript:void(0);'); + $('eg_gal_link').setAttribute('target', ''); + $('eg_gal_link').onclick = function() { + /* we're not logged in. go ahead and login */ + detachAllEvt('common','locationChanged'); + detachAllEvt('common','loggedIn'); + attachEvt('common','loggedIn', function() { goTo(link + G.user.session); }) + initLogin(); + }; +} +/* --------------------------------------------------------------------------------- */ + + diff --git a/Open-ILS/web/opac/skin/kcls/js/sidebar_extras.js b/Open-ILS/web/opac/skin/kcls/js/sidebar_extras.js index 9cd2672ccf..a5fd3795ec 100644 --- a/Open-ILS/web/opac/skin/kcls/js/sidebar_extras.js +++ b/Open-ILS/web/opac/skin/kcls/js/sidebar_extras.js @@ -1,244 +1,244 @@ - -/* captures extraneous info from each record */ - -var subjectCache = {}; -var authorCache = {}; -var seriesCache = {}; - -function resultBuildCaches(records) { - for( var r in records ) { - var rec = records[r]; - for( var s in rec.subject() ) - subjectCache[s] == null ? subjectCache[s] = 1 : subjectCache[s]++; - authorCache[rec.author()] = 1; - for( var s in rec.series() ) seriesCache[rec.series()[s]] = 1; - } -} - -function resultSortSubjects(a, b) { return -(a.count - b.count); } /* sort in reverse */ -function resultDrawSubjects() { - - var subjs = []; - for( var s in subjectCache ) - subjs.push( { sub : s, count : subjectCache[s] } ); - subjs.sort(resultSortSubjects); - - var ss = []; - for( var s in subjs ) ss.push(subjs[s].sub); - - resultDrawSidebarTrees( - STYPE_SUBJECT, - "subjectSidebarTree", ss, - $("subject_tree_sidebar"), - $("subject_sidebar_tree_div") ); -} - -function resultDrawAuthors() { - var auths = new Array(); - for( var s in authorCache ) auths.push(s); - - resultDrawSidebarTrees( - STYPE_AUTHOR, - "authorSidebarTree", auths.sort(), - $("author_tree_sidebar"), - $("author_sidebar_tree_div") ); -} - -function resultDrawSeries() { - var sers = new Array(); - for( var s in seriesCache ) sers.push(s); - resultDrawSidebarTrees( - STYPE_SERIES, - "seriesSidebarTree", sers.sort(), - $("series_tree_sidebar"), - $("series_sidebar_tree_div") ); -} - -var IESux = true; - -function resultDrawSidebarTrees( stype, treeName, items, wrapperNode, destNode ) { - if(findCurrentPage()=="rdetail") return; - eval("tree = " + treeName); - - var xrefCache = []; - var found = false; - var x = 0; - for( var i in items ) { - - if(isNull(items[i])) continue; - - /* again, IE is a turd */ - if(IE) { if(x++ > 5) break; } - else { if(x++ > 7) break; } - - found = true; - - var item = normalize(truncate(items[i], 65)); - var args = {}; - var href = resultQuickLink( items[i], stype ); - tree.addNode( stype + "_" + items[i], treeName + 'Root', item, href ); - -// if( !IE ) resultFireXRefReq(treeName, stype, items[i]); - - var a = {}; - a.type = stype; - a.term = item; - xrefCache.push(a); - } - - if(found) { - unHideMe(wrapperNode); -// if(IE) resultFireXRefSingle(treeName, xrefCache, stype); - /* XXX */ // disabled auth lookups for now - - if( DO_AUTHORITY_LOOKUPS ) { - resultFireXRefBatch(treeName, xrefCache, stype); - } - } -} - -/* XXX */ -function resultFireXRefBatch(treeName, xrefCache, stype) { - var query = []; - for( var i = 0; i != xrefCache.length; i++ ) { - var topic = xrefCache[i]; - query.push( [ topic.type, topic.term ] ); - } - var req = new Request(FETCH_CROSSREF_BATCH, query); - var tree; - eval('tree=' + treeName); - req.request._tree = tree; - req.request._stype = stype; - req.callback(resultRenderXRefTree); - req.send(); -} - -var xrefCacheIndex = {}; -xrefCacheIndex['subject'] = 0; -xrefCacheIndex['author'] = 0; -xrefCacheIndex['series'] = 0; - -function resultHandleXRefResponse(r) { - resultFireXRefSingle( r._treename, r._cache, r._stype ); - resultAppendCrossRef(r); -} - - -function resultFireXRefSingle( treeName, xrefCache, stype ) { - var i = xrefCacheIndex[stype]++; - if(xrefCache[i] == null) return; - var item = xrefCache[i].term; - var tree; - eval('tree=' + treeName); - var req = new Request(FETCH_CROSSREF, stype, item); - req.request._tree = tree; - req.request._item = item; - req.request._stype = stype; - req.request._cache = xrefCache; - req.request._treename = treeName; - req.callback(resultHandleXRefResponse); - req.send(); -} - -function resultFireXRefReq( treeName, stype, item ) { - var tree; - eval('tree=' + treeName); - var req = new Request(FETCH_CROSSREF, stype, item); - req.request._tree = tree; - req.request._item = item; - req.request._stype = stype; - req.callback(resultAppendCrossRef); - req.send(); -} - - -function resultQuickLink( term, type ) { - var args = {}; - if(SHOW_MR_DEFAULT) { - args.page = MRESULT; - } else { - args.page = RRESULT; - args[PARAM_RTYPE] = type; - } - args[PARAM_OFFSET] = 0; - args[PARAM_TERM] = term; - args[PARAM_STYPE] = type; - return buildOPACLink(args); -} - -/* XXX */ -function resultRenderXRefTree(r) { - var tree = r._tree; - var res = r.getResultObject(); - var stype = r._stype; - - for( var c in res ) { - var cls = res[c]; - for( var t in cls ) { - var term = res[c][t]; - var froms = term['from']; - var alsos = term['also']; - var total = 0; - - for( var i = 0; (total++ < 5 && i < froms.length); i++ ) { - var string = normalize(truncate(froms[i], 45)); - if($(stype + '_' + froms[i])) continue; - tree.addNode(stype + '_' + froms[i], - stype + '_' + t, string, resultQuickLink(froms[i],stype)); - } - for( var i = 0; (total++ < 10 && i < alsos.length); i++ ) { - var string = normalize(truncate(alsos[i], 45)); - if($(stype + '_' + alsos[i])) continue; - tree.addNode(stype + '_' + alsos[i], - stype + '_' + t, string, resultQuickLink(alsos[i],stype)); - } - } - } -} - - -/* Addes the see-from/see-also entries for this subject item */ -function resultAppendCrossRef(r) { - var tree = r._tree - var item = r._item - var stype = r._stype; - var result = r.getResultObject(); - if(!result) return; - var froms = result['from']; - var alsos = result['also']; - - var total = 0; - - for( var i = 0; (total++ < 5 && i < froms.length); i++ ) - resultAddXRefItem( tree, item, stype, froms, i ); - - for( var i = 0; (total++ < 10 && i < alsos.length); i++ ) - resultAddXRefItem( tree, item, stype, alsos, i ); -} - -/** - * Adds a single entry into the see-from/also sidebar tree - */ -var collectedStrings = []; -function resultAddXRefItem(tree, rootItem, stype, arr, idx) { - - var string = normalize(truncate(arr[idx], 45)); - - if( string == rootItem ) return; - - if( grep( collectedStrings, - function(a) { return (a == string); }) ) return; - - if($(stype + '_' + arr[idx])) return; - - tree.addNode(stype + '_' + arr[idx], - stype + '_' + rootItem, string, resultQuickLink(arr[idx],stype)); - - collectedStrings.push(string); -} - - - - - - + +/* captures extraneous info from each record */ + +var subjectCache = {}; +var authorCache = {}; +var seriesCache = {}; + +function resultBuildCaches(records) { + for( var r in records ) { + var rec = records[r]; + for( var s in rec.subject() ) + subjectCache[s] == null ? subjectCache[s] = 1 : subjectCache[s]++; + authorCache[rec.author()] = 1; + for( var s in rec.series() ) seriesCache[rec.series()[s]] = 1; + } +} + +function resultSortSubjects(a, b) { return -(a.count - b.count); } /* sort in reverse */ +function resultDrawSubjects() { + + var subjs = []; + for( var s in subjectCache ) + subjs.push( { sub : s, count : subjectCache[s] } ); + subjs.sort(resultSortSubjects); + + var ss = []; + for( var s in subjs ) ss.push(subjs[s].sub); + + resultDrawSidebarTrees( + STYPE_SUBJECT, + "subjectSidebarTree", ss, + $("subject_tree_sidebar"), + $("subject_sidebar_tree_div") ); +} + +function resultDrawAuthors() { + var auths = new Array(); + for( var s in authorCache ) auths.push(s); + + resultDrawSidebarTrees( + STYPE_AUTHOR, + "authorSidebarTree", auths.sort(), + $("author_tree_sidebar"), + $("author_sidebar_tree_div") ); +} + +function resultDrawSeries() { + var sers = new Array(); + for( var s in seriesCache ) sers.push(s); + resultDrawSidebarTrees( + STYPE_SERIES, + "seriesSidebarTree", sers.sort(), + $("series_tree_sidebar"), + $("series_sidebar_tree_div") ); +} + +var IESux = true; + +function resultDrawSidebarTrees( stype, treeName, items, wrapperNode, destNode ) { + if(findCurrentPage()=="rdetail") return; + eval("tree = " + treeName); + + var xrefCache = []; + var found = false; + var x = 0; + for( var i in items ) { + + if(isNull(items[i])) continue; + + /* again, IE is a turd */ + if(IE) { if(x++ > 5) break; } + else { if(x++ > 7) break; } + + found = true; + + var item = normalize(truncate(items[i], 65)); + var args = {}; + var href = resultQuickLink( items[i], stype ); + tree.addNode( stype + "_" + items[i], treeName + 'Root', item, href ); + +// if( !IE ) resultFireXRefReq(treeName, stype, items[i]); + + var a = {}; + a.type = stype; + a.term = item; + xrefCache.push(a); + } + + if(found) { + unHideMe(wrapperNode); +// if(IE) resultFireXRefSingle(treeName, xrefCache, stype); + /* XXX */ // disabled auth lookups for now + + if( DO_AUTHORITY_LOOKUPS ) { + resultFireXRefBatch(treeName, xrefCache, stype); + } + } +} + +/* XXX */ +function resultFireXRefBatch(treeName, xrefCache, stype) { + var query = []; + for( var i = 0; i != xrefCache.length; i++ ) { + var topic = xrefCache[i]; + query.push( [ topic.type, topic.term ] ); + } + var req = new Request(FETCH_CROSSREF_BATCH, query); + var tree; + eval('tree=' + treeName); + req.request._tree = tree; + req.request._stype = stype; + req.callback(resultRenderXRefTree); + req.send(); +} + +var xrefCacheIndex = {}; +xrefCacheIndex['subject'] = 0; +xrefCacheIndex['author'] = 0; +xrefCacheIndex['series'] = 0; + +function resultHandleXRefResponse(r) { + resultFireXRefSingle( r._treename, r._cache, r._stype ); + resultAppendCrossRef(r); +} + + +function resultFireXRefSingle( treeName, xrefCache, stype ) { + var i = xrefCacheIndex[stype]++; + if(xrefCache[i] == null) return; + var item = xrefCache[i].term; + var tree; + eval('tree=' + treeName); + var req = new Request(FETCH_CROSSREF, stype, item); + req.request._tree = tree; + req.request._item = item; + req.request._stype = stype; + req.request._cache = xrefCache; + req.request._treename = treeName; + req.callback(resultHandleXRefResponse); + req.send(); +} + +function resultFireXRefReq( treeName, stype, item ) { + var tree; + eval('tree=' + treeName); + var req = new Request(FETCH_CROSSREF, stype, item); + req.request._tree = tree; + req.request._item = item; + req.request._stype = stype; + req.callback(resultAppendCrossRef); + req.send(); +} + + +function resultQuickLink( term, type ) { + var args = {}; + if(SHOW_MR_DEFAULT) { + args.page = MRESULT; + } else { + args.page = RRESULT; + args[PARAM_RTYPE] = type; + } + args[PARAM_OFFSET] = 0; + args[PARAM_TERM] = term; + args[PARAM_STYPE] = type; + return buildOPACLink(args); +} + +/* XXX */ +function resultRenderXRefTree(r) { + var tree = r._tree; + var res = r.getResultObject(); + var stype = r._stype; + + for( var c in res ) { + var cls = res[c]; + for( var t in cls ) { + var term = res[c][t]; + var froms = term['from']; + var alsos = term['also']; + var total = 0; + + for( var i = 0; (total++ < 5 && i < froms.length); i++ ) { + var string = normalize(truncate(froms[i], 45)); + if($(stype + '_' + froms[i])) continue; + tree.addNode(stype + '_' + froms[i], + stype + '_' + t, string, resultQuickLink(froms[i],stype)); + } + for( var i = 0; (total++ < 10 && i < alsos.length); i++ ) { + var string = normalize(truncate(alsos[i], 45)); + if($(stype + '_' + alsos[i])) continue; + tree.addNode(stype + '_' + alsos[i], + stype + '_' + t, string, resultQuickLink(alsos[i],stype)); + } + } + } +} + + +/* Addes the see-from/see-also entries for this subject item */ +function resultAppendCrossRef(r) { + var tree = r._tree + var item = r._item + var stype = r._stype; + var result = r.getResultObject(); + if(!result) return; + var froms = result['from']; + var alsos = result['also']; + + var total = 0; + + for( var i = 0; (total++ < 5 && i < froms.length); i++ ) + resultAddXRefItem( tree, item, stype, froms, i ); + + for( var i = 0; (total++ < 10 && i < alsos.length); i++ ) + resultAddXRefItem( tree, item, stype, alsos, i ); +} + +/** + * Adds a single entry into the see-from/also sidebar tree + */ +var collectedStrings = []; +function resultAddXRefItem(tree, rootItem, stype, arr, idx) { + + var string = normalize(truncate(arr[idx], 45)); + + if( string == rootItem ) return; + + if( grep( collectedStrings, + function(a) { return (a == string); }) ) return; + + if($(stype + '_' + arr[idx])) return; + + tree.addNode(stype + '_' + arr[idx], + stype + '_' + rootItem, string, resultQuickLink(arr[idx],stype)); + + collectedStrings.push(string); +} + + + + + + diff --git a/Open-ILS/web/opac/skin/kcls/js/tips.js b/Open-ILS/web/opac/skin/kcls/js/tips.js index 2387dd337f..deca7ea64d 100644 --- a/Open-ILS/web/opac/skin/kcls/js/tips.js +++ b/Open-ILS/web/opac/skin/kcls/js/tips.js @@ -1,19 +1,19 @@ -attachEvt('result', 'allRecordsReceived', insertTip); - -/* -var user_tips = [ - 'Click on a folder icon in the sidebar to access related quick searches', - "If you don't find what you want try expanding your search using the range selector at the right of the search bar" -]; -*/ - -function insertTip () { - var tip_div = document.getElementById('tips'); - if (tip_div) { - var tips = tip_div.getElementsByTagName('div')[0].getElementsByTagName('span'); - var index = Math.floor(Math.random() * tips.length); - if(tips[index]) tip_div.appendChild( tips[index] ); - removeCSSClass(tip_div, 'hide_me'); - } -} - +attachEvt('result', 'allRecordsReceived', insertTip); + +/* +var user_tips = [ + 'Click on a folder icon in the sidebar to access related quick searches', + "If you don't find what you want try expanding your search using the range selector at the right of the search bar" +]; +*/ + +function insertTip () { + var tip_div = document.getElementById('tips'); + if (tip_div) { + var tips = tip_div.getElementsByTagName('div')[0].getElementsByTagName('span'); + var index = Math.floor(Math.random() * tips.length); + if(tips[index]) tip_div.appendChild( tips[index] ); + removeCSSClass(tip_div, 'hide_me'); + } +} + diff --git a/Open-ILS/web/opac/skin/kcls/xml/advanced/adv_global_row - Copy.xml b/Open-ILS/web/opac/skin/kcls/xml/advanced/adv_global_row - Copy.xml deleted file mode 100644 index 6f41466414..0000000000 --- a/Open-ILS/web/opac/skin/kcls/xml/advanced/adv_global_row - Copy.xml +++ /dev/null @@ -1,39 +0,0 @@ - -]]> - - - - - - - - - - - - - - - - - -]]> diff --git a/Open-ILS/web/opac/skin/kcls/xml/advanced/adv_global_row.xml b/Open-ILS/web/opac/skin/kcls/xml/advanced/adv_global_row.xml index 9e1aa2c33c..86fcfb8074 100644 --- a/Open-ILS/web/opac/skin/kcls/xml/advanced/adv_global_row.xml +++ b/Open-ILS/web/opac/skin/kcls/xml/advanced/adv_global_row.xml @@ -1,33 +1,33 @@ - -]]> - - - - - - - - - - - - - - -]]> + +]]> + + + + + + + + + + + + + + +]]> diff --git a/Open-ILS/web/opac/skin/kcls/xml/advanced/advanced_global.xml b/Open-ILS/web/opac/skin/kcls/xml/advanced/advanced_global.xml index d442dc6ea7..5d604b0f54 100644 --- a/Open-ILS/web/opac/skin/kcls/xml/advanced/advanced_global.xml +++ b/Open-ILS/web/opac/skin/kcls/xml/advanced/advanced_global.xml @@ -1,346 +1,346 @@ - -]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -]]> - + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + diff --git a/Open-ILS/web/opac/skin/kcls/xml/body.xml b/Open-ILS/web/opac/skin/kcls/xml/body.xml index 305b66f280..f2d45ec19c 100644 --- a/Open-ILS/web/opac/skin/kcls/xml/body.xml +++ b/Open-ILS/web/opac/skin/kcls/xml/body.xml @@ -1,98 +1,98 @@ - - - - - -
-
-
-
- -
- - -
- -
-
-
- - - - - - -
-
- -
-
- - - -
-
- -
-
-
Another Search
-
Advanced Search
-
View My List
- -
-
Sort by
- - - -
-
View
- -
- -
-
-
- -
-
- - - - - -
- -
- - - - - - - - - - - - -
- -
-
-
- -
-
- -
-
-
-
-
-
- + + + + + +
+
+
+
+ +
+ + +
+ +
+
+
+ + + + + + +
+
+ +
+
+ + + +
+
+ +
+
+
Another Search
+
Advanced Search
+
View My List
+ +
+
Sort by
+ + + +
+
View
+ +
+ +
+
+
+ +
+
+ + + + + +
+ +
+ + + + + + + + + + + + +
+ +
+
+
+ +
+
+ +
+
+
+
+
+
+ diff --git a/Open-ILS/web/opac/skin/kcls/xml/common/js_common.xml b/Open-ILS/web/opac/skin/kcls/xml/common/js_common.xml index 1f1f086c2f..ed12d4d3e0 100644 --- a/Open-ILS/web/opac/skin/kcls/xml/common/js_common.xml +++ b/Open-ILS/web/opac/skin/kcls/xml/common/js_common.xml @@ -1,22 +1,22 @@ - - - - - - - - + + + + + + + + diff --git a/Open-ILS/web/opac/skin/kcls/xml/home/homesearch.xml b/Open-ILS/web/opac/skin/kcls/xml/home/homesearch.xml index 94501ae1e5..8cd3d2f98a 100644 --- a/Open-ILS/web/opac/skin/kcls/xml/home/homesearch.xml +++ b/Open-ILS/web/opac/skin/kcls/xml/home/homesearch.xml @@ -1,76 +1,76 @@ - -]]> -
-
- - - -

Welcome to the
New Library Catalog!

- Featuring enhanced holds, management
tools, improved self checkout, and more.

- Learn more »]]>

- - - -
- - - - - - - - - - - - -
-
-
-
- - - - -
- /kcls/graphics/seewhatsnew.jpg" /> -
-
- /kcls/graphics/newbooks.jpg" /> -
-
- /kcls/graphics/connect.jpg" /> -
-
- /kcls/graphics/digitaldownloads.jpg" /> -
-
- /kcls/graphics/fiestas.jpg" /> -
-
- /kcls/graphics/libraryelf.jpg" /> -
- - - -
-
-
- -
-
/kcls/graphics/hp-links-left.jpg" />
- -
/kcls/graphics/hp-links-right.jpg" />
- -
-
-]]> + +]]> +
+
+ + + +

Welcome to the
New Library Catalog!

+ Featuring enhanced holds, management
tools, improved self checkout, and more.

+ Learn more »]]>

+ + + +
+ + + + + + + + + + + + +
+
+
+
+ + + + +
+ /kcls/graphics/seewhatsnew.jpg" /> +
+
+ /kcls/graphics/newbooks.jpg" /> +
+
+ /kcls/graphics/connect.jpg" /> +
+
+ /kcls/graphics/digitaldownloads.jpg" /> +
+
+ /kcls/graphics/fiestas.jpg" /> +
+
+ /kcls/graphics/libraryelf.jpg" /> +
+ + + +
+
+
+ +
+
/kcls/graphics/hp-links-left.jpg" />
+ +
/kcls/graphics/hp-links-right.jpg" />
+ +
+
+]]> diff --git a/Open-ILS/web/opac/skin/kcls/xml/myopac/myopac_bookbags.xml b/Open-ILS/web/opac/skin/kcls/xml/myopac/myopac_bookbags.xml index 4ac3e8d818..9a7e7a1e77 100644 --- a/Open-ILS/web/opac/skin/kcls/xml/myopac/myopac_bookbags.xml +++ b/Open-ILS/web/opac/skin/kcls/xml/myopac/myopac_bookbags.xml @@ -1,180 +1,180 @@ - -]]> - -
-
-

Create new list

- Enter the name of the new list:
- -
- - - -
Share this list? Sharing Help
- Submit - Cancel -
- -
- -
My Lists Export List
- -
-
- Saving Help - Save -
-
- - - - -
-
-
-
Temporary List - Anonymous List Help
-
-
-
- - - - - -
Title
- - - -
- -

-
- -
-
-
-
-
RSS Feed
- - -
-
- - - - - -
Title
- - - - - -
- -

-
-
-
- - -
- &myopac.delete.bookbag; -
- -
&myopac.no.bookbags;
- - - - - - - - - - - - - - - - -
&common.name;&myopac.bookbag.items;&myopac.bookbag.shared;&myopac.bookbag.toggle;&myopac.bookbag.delete;
- - &myopac.items; - &common.no; - &common.yes; - &myopac.view; - - RSS Feed - - - &myopac.bookbag.hide; - &myopac.bookbag.share; - - &myopac.delete; -
- - - - - - - - - - - - - -
&myopac.bookbag.create;
- &myopac.bookbag.naming; - -
- &myopac.bookbag.share; - &common.help; - &common.yes; - &common.no; - -
- - -
- -
&myopac.bookbag.no.items;
- - - - - - - - - - - - - -
&common.title; &common.authors; &myopac.bookbag.remove;
&myopac.remove.link;
- - - &myopac.publish.text; - &myopac.item.confirm; - &myopac.publish.confirm; - &myopac.unpublish.confirm; - &myopac.update.success; - &myopac.create.warning; - &myopac.describe.bookbags; - &myopac.updated.success; - -
-]]> - + +]]> + +
+
+

Create new list

+ Enter the name of the new list:
+ +
+ + + +
Share this list? Sharing Help
+ Submit + Cancel +
+ +
+ +
My Lists Export List
+ +
+
+ Saving Help + Save +
+
+ + + + +
+
+
+
Temporary List + Anonymous List Help
+
+
+
+ + + + + +
Title
+ + + +
+ +

+
+ +
+
+
+
+
RSS Feed
+ + +
+
+ + + + + +
Title
+ + + + + +
+ +

+
+
+
+ + +
+ &myopac.delete.bookbag; +
+ +
&myopac.no.bookbags;
+ + + + + + + + + + + + + + + + +
&common.name;&myopac.bookbag.items;&myopac.bookbag.shared;&myopac.bookbag.toggle;&myopac.bookbag.delete;
+ + &myopac.items; + &common.no; + &common.yes; + &myopac.view; + + RSS Feed + + + &myopac.bookbag.hide; + &myopac.bookbag.share; + + &myopac.delete; +
+ + + + + + + + + + + + + +
&myopac.bookbag.create;
+ &myopac.bookbag.naming; + +
+ &myopac.bookbag.share; + &common.help; + &common.yes; + &common.no; + +
+ + +
+ +
&myopac.bookbag.no.items;
+ + + + + + + + + + + + + +
&common.title; &common.authors; &myopac.bookbag.remove;
&myopac.remove.link;
+ + + &myopac.publish.text; + &myopac.item.confirm; + &myopac.publish.confirm; + &myopac.unpublish.confirm; + &myopac.update.success; + &myopac.create.warning; + &myopac.describe.bookbags; + &myopac.updated.success; + +
+]]> + diff --git a/Open-ILS/web/opac/skin/kcls/xml/myopac/myopac_fines.xml b/Open-ILS/web/opac/skin/kcls/xml/myopac/myopac_fines.xml index ad56b71fe7..82747bc7cb 100644 --- a/Open-ILS/web/opac/skin/kcls/xml/myopac/myopac_fines.xml +++ b/Open-ILS/web/opac/skin/kcls/xml/myopac/myopac_fines.xml @@ -1,5 +1,5 @@ - -]]> - -]]> - + +]]> + +]]> + diff --git a/Open-ILS/web/opac/skin/kcls/xml/myopac/myopac_holds.xml b/Open-ILS/web/opac/skin/kcls/xml/myopac/myopac_holds.xml index eb1a8b15d9..96250131a4 100644 --- a/Open-ILS/web/opac/skin/kcls/xml/myopac/myopac_holds.xml +++ b/Open-ILS/web/opac/skin/kcls/xml/myopac/myopac_holds.xml @@ -1,116 +1,116 @@ - -]]> - -
-
-
- - -
-
-
- -
Current Items on Hold Export List
-
- -
- - - - - -
SaveHolds Help
- - - - - - - - - - -
TitleAuthorFormatPickup LocationActivateCancel if not
filled by
ActiveStatus
- -
- - - - - - - - - - - - - - - - -
Edit Save Back
- - - - - -
-
- testing... -
- - &myopac.holds.cancel.confirm; - &myopac.holds.freeze.confirm; - &myopac.holds.thaw.confirm; - &myopac.holds.thaw_date.confirm; - &myopac.holds.freeze.select_thaw; - - - -
&myopac.holds.processing;
- - - &myopac.holds.verify; - -
-
-
&myopac.holds.freeze.select_thaw;
-

-

-
-]]> - + +]]> + +
+
+
+ + +
+
+
+ +
Current Items on Hold Export List
+
+ +
+ + + + + +
SaveHolds Help
+ + + + + + + + + + +
TitleAuthorFormatPickup LocationActivateCancel if not
filled by
ActiveStatus
+ +
+ + + + + + + + + + + + + + + + +
Edit Save Back
+ + + + + +
+
+ testing... +
+ + &myopac.holds.cancel.confirm; + &myopac.holds.freeze.confirm; + &myopac.holds.thaw.confirm; + &myopac.holds.thaw_date.confirm; + &myopac.holds.freeze.select_thaw; + + + +
&myopac.holds.processing;
+ + + &myopac.holds.verify; + +
+
+
&myopac.holds.freeze.select_thaw;
+

+

+
+]]> + diff --git a/Open-ILS/web/opac/skin/kcls/xml/myopac/myopac_summary.xml b/Open-ILS/web/opac/skin/kcls/xml/myopac/myopac_summary.xml index 1c924d546d..9d0733b999 100644 --- a/Open-ILS/web/opac/skin/kcls/xml/myopac/myopac_summary.xml +++ b/Open-ILS/web/opac/skin/kcls/xml/myopac/myopac_summary.xml @@ -1,321 +1,321 @@ - - -]]> -
-
-
-
Account Summary
-
-
-
/kcls/graphics/acct_sum_fines_tl.png" />
-
/kcls/graphics/acct_sum_fines_tr.png" />
-
/kcls/graphics/acct_sum_fines_bl.png" />
-
/kcls/graphics/acct_sum_fines_br.png" />
- Fines: $0.00
- Pay Fines/kcls/graphics/pay-fines-btn-hover.png';" onmouseout="this.src='/kcls/graphics/pay-fines-btn.png';" src="/kcls/graphics/pay-fines-btn.png" style="position:relative;top:5px;" /> -
- -
-
-
-
Items Currently Checked out (0)
-
Items Currently on Hold (0)
-
Items ready for pickup (0)
- -
-
-
-
- - - - - - - - - - - - - - - - - - -
&myopac.fines.title;
&myopac.fines.owed;&myopac.fines.paid;&myopac.fines.balance;
&myopac.fines.status;
&common.currency;&common.currency;&common.currency;
- - -
-
- - -
-
- - - -
-
Payments
- - - - - - - - - - - - - -
Payment DatePayment ForAmountReceipt
- - $ - Print / Email -
-
- - - - - -
-


- - - - - - - - - - - - - - - - - - - - - - - - - -
&common.title;&common.author;&myopac.fines.checkout;&myopac.fines.due;&myopac.fines.returned;&myopac.fines.balance; -
Pay Fines
-
-
&myopac.fines.accruing;&common.currency;
-
- - -
-


- - - - - - - - - - - - - - - - - - - - - - - - - - -
&myopac.fines.other;
Date Applied&myopac.fines.time.paid;&myopac.fines.owed.initial;&myopac.fines.paid.amount;&myopac.fines.balance;&myopac.fines.type; -
Pay Fines
- -
-
&common.currency;&common.currency; - * - &common.currency; -
-
- Pay Fines/kcls/graphics/pay-fines-btn-hover.png';" src="/kcls/graphics/pay-fines-btn.png" style="position:relative;top:5px;" /> - -
-
-
- - -
-
- - -
- -
- -
- Amount to pay: $. Are you sure?

- - -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
KCLS only accespts Visa or MasterCard
Billing Information - Selected fines you are paying for: - - -
NameAmount

-
- Total amount to pay: $ -

- Click Cancel to go back and (un)select other fines. -
First Name
Last Name
Email Address - - - Update - -
Street Address
City
State or Province
ZIP or Postal Code
Credit Card Information
Credit Card #
Security Code
Exipration Month - -
Expiration Year - - -
Edit Billing Address
- - -

- Important! You must have a printed receipt to be eligible for a refund on lost items (regulations allow for no exceptions).

- To ensure your necessary receipt information is not lost, enter your email address above and a receipt will be emailed to you. Otherwise, make certain you have a printed receipt in hand before closing the payment receipt screen.
Refunds are not available for parts and pieces, overdue fines, or items that do not display a specific title in My Account. For a full list of refundable and non-refundable items, visit http://www.kcls.org/usingthelibrary/borrowing/refundable.cfm

This site uses VeriSign SSL encryption to ensure your privacy. -
-
-
- - -]]> - + + +]]> +
+
+
+
Account Summary
+
+
+
/kcls/graphics/acct_sum_fines_tl.png" />
+
/kcls/graphics/acct_sum_fines_tr.png" />
+
/kcls/graphics/acct_sum_fines_bl.png" />
+
/kcls/graphics/acct_sum_fines_br.png" />
+ Fines: $0.00
+ Pay Fines/kcls/graphics/pay-fines-btn-hover.png';" onmouseout="this.src='/kcls/graphics/pay-fines-btn.png';" src="/kcls/graphics/pay-fines-btn.png" style="position:relative;top:5px;" /> +
+ +
+
+
+
Items Currently Checked out (0)
+
Items Currently on Hold (0)
+
Items ready for pickup (0)
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + +
&myopac.fines.title;
&myopac.fines.owed;&myopac.fines.paid;&myopac.fines.balance;
&myopac.fines.status;
&common.currency;&common.currency;&common.currency;
+ + +
+
+ + +
+
+ + + +
+
Payments
+ + + + + + + + + + + + + +
Payment DatePayment ForAmountReceipt
+ + $ + Print / Email +
+
+ + + + + +
+


+ + + + + + + + + + + + + + + + + + + + + + + + + +
&common.title;&common.author;&myopac.fines.checkout;&myopac.fines.due;&myopac.fines.returned;&myopac.fines.balance; +
Pay Fines
+
+
&myopac.fines.accruing;&common.currency;
+
+ + +
+


+ + + + + + + + + + + + + + + + + + + + + + + + + + +
&myopac.fines.other;
Date Applied&myopac.fines.time.paid;&myopac.fines.owed.initial;&myopac.fines.paid.amount;&myopac.fines.balance;&myopac.fines.type; +
Pay Fines
+ +
+
&common.currency;&common.currency; + * + &common.currency; +
+
+ Pay Fines/kcls/graphics/pay-fines-btn-hover.png';" src="/kcls/graphics/pay-fines-btn.png" style="position:relative;top:5px;" /> + +
+
+
+ + +
+
+ + +
+ +
+ +
+ Amount to pay: $. Are you sure?

+ + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KCLS only accespts Visa or MasterCard
Billing Information + Selected fines you are paying for: + + +
NameAmount

+
+ Total amount to pay: $ +

+ Click Cancel to go back and (un)select other fines. +
First Name
Last Name
Email Address + + + Update + +
Street Address
City
State or Province
ZIP or Postal Code
Credit Card Information
Credit Card #
Security Code
Exipration Month + +
Expiration Year + + +
Edit Billing Address
+ + +

+ Important! You must have a printed receipt to be eligible for a refund on lost items (regulations allow for no exceptions).

+ To ensure your necessary receipt information is not lost, enter your email address above and a receipt will be emailed to you. Otherwise, make certain you have a printed receipt in hand before closing the payment receipt screen.
Refunds are not available for parts and pieces, overdue fines, or items that do not display a specific title in My Account. For a full list of refundable and non-refundable items, visit http://www.kcls.org/usingthelibrary/borrowing/refundable.cfm

This site uses VeriSign SSL encryption to ensure your privacy. +
+
+
+ + +]]> + diff --git a/Open-ILS/web/opac/skin/kcls/xml/page_rdetail.xml b/Open-ILS/web/opac/skin/kcls/xml/page_rdetail.xml index 4ca22f7b43..61d553c645 100644 --- a/Open-ILS/web/opac/skin/kcls/xml/page_rdetail.xml +++ b/Open-ILS/web/opac/skin/kcls/xml/page_rdetail.xml @@ -1,81 +1,81 @@ - -]]> - -
-
-
- Search ResultsShowing Item  of ]]> -
- -
-
- - - - - - - -
- « Back - - - - - -
- - - - - - - - - - -
- &rdetail.detailMain.headerLabel; - - - &opac.holds.exportRefWorks; - - - - - - -
- -
- &rdetail.record.deleted; -
- - -
-
-
-
- - -
&rdetail.none;
-
&rdetail.bookbag.add.success;
-
&rdetail.bookbag.name;
-
&rdetail.bookbag.create.success;
- -
-]]> + +]]> + +
+
+
+ Search ResultsShowing Item  of ]]> +
+ +
+
+ + + + + + + +
+ « Back + + + + + +
+ + + + + + + + + + +
+ &rdetail.detailMain.headerLabel; + + + &opac.holds.exportRefWorks; + + + + + + +
+ +
+ &rdetail.record.deleted; +
+ + +
+
+
+
+ + +
&rdetail.none;
+
&rdetail.bookbag.add.success;
+
&rdetail.bookbag.name;
+
&rdetail.bookbag.create.success;
+ +
+]]> diff --git a/Open-ILS/web/opac/skin/kcls/xml/rdetail/rdetail_extras.xml b/Open-ILS/web/opac/skin/kcls/xml/rdetail/rdetail_extras.xml index cd52bfb580..58f523f404 100644 --- a/Open-ILS/web/opac/skin/kcls/xml/rdetail/rdetail_extras.xml +++ b/Open-ILS/web/opac/skin/kcls/xml/rdetail/rdetail_extras.xml @@ -1,210 +1,210 @@ -]]> -
- - - - - - - - -
-
&common.loading;
- -
-
Summary:
-