custom OPAC skin at the time of migration
authorJason Etheridge <jason@esilibrary.com>
Wed, 29 Feb 2012 19:57:38 +0000 (14:57 -0500)
committerJason Etheridge <jason@esilibrary.com>
Wed, 29 Feb 2012 19:57:38 +0000 (14:57 -0500)
82 files changed:
Open-ILS/web/opac/images/tadl/main_logo.gif [new file with mode: 0644]
Open-ILS/web/opac/images/tadl/netlibrary.gif [new file with mode: 0644]
Open-ILS/web/opac/images/tadl/overdrive.png [new file with mode: 0644]
Open-ILS/web/opac/images/tadl/small_logo.jpg [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/css/layout.css [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/js/adv_global.js [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/js/advanced.js [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/js/cn_browse.js [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/js/combined.js [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/js/container.js [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/js/copy_details.js [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/js/depth_selector.js [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/js/grpl_utils.js [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/js/holds.js [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/js/mresult.js [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/js/myopac.js [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/js/password_reset.js [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/js/rdetail.js [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/js/result_common.js [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/js/rresult.js [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/js/search_bar.js [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/js/sidebar.js [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/js/sidebar_extras.js [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/js/tips.js [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/xml/advanced.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/xml/advanced/adv_global_row.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/xml/advanced/advanced_global.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/xml/advanced/advanced_marc.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/xml/advanced/advanced_quick.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/xml/body.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/xml/cnbrowse.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/xml/common/altcanvas.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/xml/common/cn_browse.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/xml/common/css_common.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/xml/common/fonts.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/xml/common/format_selector.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/xml/common/holds.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/xml/common/ilsevents.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/xml/common/js_common.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/xml/common/libselect.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/xml/common/login.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/xml/common/logo.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/xml/common/orgtree.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/xml/common/searchbar.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/xml/common/sidebar.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/xml/common/statusbar.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/xml/common/stypes_selector.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/xml/common/tips.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/xml/footer.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/xml/header.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/xml/home/homesearch.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/xml/home/index_body.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/xml/html_xsl.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/xml/index.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/xml/mresult.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/xml/myopac.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/xml/myopac/myopac_bookbags.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/xml/myopac/myopac_checked.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/xml/myopac/myopac_fines.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/xml/myopac/myopac_holds.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/xml/myopac/myopac_prefs.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/xml/myopac/myopac_summary.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/xml/page_advanced.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/xml/page_cnbrowse.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/xml/page_mresult.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/xml/page_myopac.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/xml/page_rdetail.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/xml/page_rresult.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/xml/rdetail.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/xml/rdetail/rdetail_altcanvas.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/xml/rdetail/rdetail_cn_details.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/xml/rdetail/rdetail_copyinfo.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/xml/rdetail/rdetail_extras.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/xml/rdetail/rdetail_summary.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/xml/result/filtersort.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/xml/result/result_common.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/xml/result/result_info.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/xml/result/result_lowhits.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/xml/result/result_table.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/xml/rresult.xml [new file with mode: 0644]
Open-ILS/web/opac/skin/tadl/xml/setenv.xml [new file with mode: 0644]
Open-ILS/web/opac/theme/tadl/css/colors.css [new file with mode: 0644]

diff --git a/Open-ILS/web/opac/images/tadl/main_logo.gif b/Open-ILS/web/opac/images/tadl/main_logo.gif
new file mode 100644 (file)
index 0000000..e048d6b
Binary files /dev/null and b/Open-ILS/web/opac/images/tadl/main_logo.gif differ
diff --git a/Open-ILS/web/opac/images/tadl/netlibrary.gif b/Open-ILS/web/opac/images/tadl/netlibrary.gif
new file mode 100644 (file)
index 0000000..a10388e
Binary files /dev/null and b/Open-ILS/web/opac/images/tadl/netlibrary.gif differ
diff --git a/Open-ILS/web/opac/images/tadl/overdrive.png b/Open-ILS/web/opac/images/tadl/overdrive.png
new file mode 100644 (file)
index 0000000..7b31ad6
Binary files /dev/null and b/Open-ILS/web/opac/images/tadl/overdrive.png differ
diff --git a/Open-ILS/web/opac/images/tadl/small_logo.jpg b/Open-ILS/web/opac/images/tadl/small_logo.jpg
new file mode 100644 (file)
index 0000000..210ce87
Binary files /dev/null and b/Open-ILS/web/opac/images/tadl/small_logo.jpg differ
diff --git a/Open-ILS/web/opac/skin/tadl/css/layout.css b/Open-ILS/web/opac/skin/tadl/css/layout.css
new file mode 100644 (file)
index 0000000..e95585a
--- /dev/null
@@ -0,0 +1,239 @@
+body { margin: 6px; }
+body { background-color: white; }
+
+/* block that contains footer links and copyright */
+#copyright_block {
+    width: 100%;
+    text-align: center;
+    vertical-align: bottom;
+    margin-top: 10px;
+}
+
+
+
+#copyright_text { display: none; }
+
+.main_header   { width: 100%; }
+.space                 { padding-right:5px; }
+.vert_space            { padding-top: 82px; width: 100%;}
+.right                 { position:absolute; right: 0px; }
+.hide_me                       { display:none; visibility: hidden; }
+
+table { border-collapse: collapse; }
+
+/* generic CSS for a table with data */
+.data_grid { font-weight: 500; border-collapse: collapse;}
+.data_grid thead tr { }
+.data_grid thead td { padding-right: 5px; padding-left: 5px;}
+.data_grid tbody td { padding: 5px; }
+.data_grid_center { text-align: center; }
+
+.data_grid_nb { font-weight: 500; border-collapse: collapse;}
+.data_grid_nb thead tr { color: #000000; }
+.data_grid_nb thead td { padding-right: 5px; padding-left: 5px;}
+.data_grid_nb tbody td { padding: 5px; }
+
+
+.classic_link { text-decoration: underline; color: black;}
+.classic_link:visited { text-decoration: underline; color: black;}
+.classic_link_col { text-decoration: underline; color: red;}
+
+.print_button {
+  border: 2px outset;
+  padding: 3px;
+  text-decoration: none;
+  background-color: #dedede;
+  height: 15px;
+}
+
+.encircled { border: 1px solid black; }
+
+
+.adv_quick_search { padding: 3px;}
+.adv_quick_search_submit { padding: 3px;}
+
+.overdue { color: red; font-weight: bold;}
+
+#main_table { border-collapse: collapse; width: 100%;  }
+#main_left_cell { width: 20%; vertical-align: top;margin: 0px; padding: 0px;}
+#main_right_cell { width: 80%; vertical-align: top; margin: 0px; padding:0px;}
+
+
+#content { min-height: 300px; }
+
+.canvas {  min-height: 300px; padding-left: 4px; -moz-border-radius: 6px;}
+#canvas_main { padding-bottom: 4px; }
+
+#loading_div { width: 100%;}
+
+
+
+.shadowed { background: #F0E0F0; }
+.no_copies { background: #E0E0E0; }
+.overdue_circ { border: 2px dashed #F0D0E0; }
+
+.org_tree { padding-left: 2px; padding-right: 2px; }            
+.org_link { padding-right: 15px; }
+#org_link_container { margin-bottom: 5px; padding-left: 4px; padding-bottom: 3px; padding-top: 3px; width: 100%; }
+#left_div { float:left; width: 20%; }
+#statusbar {}
+
+#frontsearch_table { }
+#frontsearch_table tr { margin: 6px; }
+
+/* ---------------------------------------------------------------------- */
+.sidebar_div { width: 100%; font-size: 9pt; margin-top: 12px; }
+.sidebar_header { margin-top: 10px; padding-left: 3px; margin-right: 6px; }
+
+.sidebar_extra_item { padding: 0px; margin-right: 8px;}
+.side_bar_item { padding-left: 8px; padding-right: 8px; padding-top: 4px; padding-bottom: 4px; margin-right: 8px; }
+
+.sidebar_item_active { margin-right: 0px; }
+
+.sidebar_chunk { width: 100%; }
+
+/* ---------------------------------------------------------------------- */
+
+#searchbar { margin-top: 18px; width: 100%; }
+#searchbar table tr td {font-weight: bold; font-size: 8pt; }
+#searchbar select, input { border-collapse: collapse; font-size: 9pt; }
+.searchbar_item { margin: 3px; font-size: 9pt; } 
+.searchbar_label_span { font-size: 9pt; }
+#searchbar_table { border-collapse: collapse; }
+
+.search_box_container { width: 240px; padding: 3px; }/* border: 1px solid #A0A0A0;' class='color_2'>*/
+
+
+/* ---------------------------------------------------------------------- */
+#login_box { width: 70%; padding: 5px;}
+.login_text { margin-left: 8px; }
+
+/* ---------------------------------------------------------------------- */
+#result_table_div { text-align: left; width: 100%; }
+
+#search_nav_links { width: 100%; }
+#result_info_box { text-align: left; }
+#next_prev_links { padding-left: 2px; padding-right: 2px; text-align: left;}
+#goto_page_links { text-align: left; padding-left: 2px; padding-right: 2px;}
+
+#next_prev_links_dead {padding-left: 5px; padding-right: 5px;}
+
+#res_table { width: 100%; }
+
+.result_table_pic_cell { width: 43px;}
+.result_table_pic { height: 50px; width: 40px;  border: none;}
+.result_table_pic_header { width: 43px; }
+
+.result_table_row { text-align: left; width: 100%;}
+.result_table_subtable { width: 100%; border-collapse: collapse; vertical-align: top;}
+.result_table_subtbody { height: 100%; width: 100%; }
+.result_table_title_cell { text-align: left; }
+
+.copy_count_cell { width: 12%; vertical-align: middle; text-align: center; }
+.copy_count_div { width:  4em; height: 99%; vertical-align: middle; text-align: center; }
+
+.search_page_nav_link { margin-right: 5px; }
+.search_page_nav_link a {  text-decoration: underline; }
+.search_page_nav_link a:visited {  text-decoration: underline; } 
+
+.np_nav_link { margin-right: 5px; }
+
+/* ---------------------------------------------------------------------- */
+
+#rdetail_detail_main { width: 100%; }
+#rdetail_details_table { padding-top: 10px; width: 100%; padding: 30px; border-collapse: collapse;}
+.rdetail_header { padding: 3px; padding-left: 10px;}
+.rdetail_desc { padding: 2px; padding-left: 2px; padding-right: 2px;}
+.rdetail_item { width: 75%; padding-left: 10px; }
+#rdetail_image { padding-right: 10px; }
+#rdetail_copy_info_table { padding: 4px; width: 100%; border-collapse: collapse; }
+.rdetail_copy_info_header_cell { padding: 2px; }
+.rdetail_copy_count_cell { text-align: center; }
+
+
+.tor_pic { width: 17px; height: 17px; border: none;}
+
+.dim2_border { border: 1px solid #F06000; -moz-border-radius: 3px;}
+
+.dim2 { 
+       filter:alpha(opacity=50); 
+       -moz-opacity:0.5; 
+       opacity: 0.5; 
+       text-decoration: none; }
+
+.dim { 
+       filter:alpha(opacity=10); 
+       -moz-opacity:0.1; 
+       opacity: 0.1; 
+       text-decoration: none; }
+
+/* ---------------------------------------------------------------------- */
+
+.myopac_link { width: 12%; margin: 3px; padding: 3px; text-align: center; vertical-align: middle;  }
+.myopac_link_active { font-weight: 700;}
+.myopac_table thead tr td { padding: 2px; font-weight: 500; border: 1px solid #808080;}
+.myopac_table td { padding: 3px; }
+.myopac_form_pic { width: 20px; height: 20px; }
+
+.tips { padding: 2px; text-align: center; border: solid #E0E0E0 3px; -moz-border-radius: 3px; width: 99%; }
+
+.holds_cell { border: 1px solid #E0E0E0; padding: 5px; width: 50%;}
+.myopac_update_cell { border: 3px solid #E0E0E0; width:100%; padding-top: 4px; padding-bottom: 4px;}
+.myopac_update_span { padding: 5px;}
+
+#result_low_hits { border-top: 2px solid #6699cc }
+
+.lowhits_div { width: 100%; border-top: 1px solid #E0E0E0; text-align: center; 
+       padding-top: 8px; padding-bottom: 8px; }
+
+.rdetail_extras_div {
+       border-top: 3px solid #E0E0E0;margin-top: 3px; padding-top: 5px; width: 100%;}
+
+.copy_info_region_row {
+       padding: 6px;
+       border: 2px solid #E0E0E0;
+       font-weight: 600;
+}
+
+.rdetail_extras_td { padding-right: 15px; padding-left: 15px; border-right: 1px solid #888; }
+.rdetails_extra_links { border: 1px solid #808080; padding-right: 5px; padding-left: 5px; }
+
+
+.cn_browse_item { height: 190px; }
+.cn_browse_info { padding: 4px; border-bottom: 1px dashed #E0E0E0;}
+
+.bookshelf {
+        /*background-image: url(http://10.4.0.10/woodgrain.jpeg);*/
+        /*
+        background-image: url(http://dev.gapines.org/opac/images/woodgrain.jpg);
+        background-repeat: repeat;
+        */
+        border-bottom: 1px solid #6699cc;
+}
+
+.cn_browse_loading { width: 95%; padding: 15px; text-align: center; background: #E0F0E0; }
+
+.cn_browse_home_cn { border: 2px solid #E0F0E0; background: green; font-weight: 700;}
+
+.rdetail_context_row { background: #F0E0E0; }
+
+.unadorned_link { text-decoration: none; vertical-align: bottom; }
+
+
+/* ie does not support disabling <option> elements */
+.disabled_option { color: #808080; }
+
+.copy_more_info { padding-left: 6px; color: #804070; }
+
+
+.invalid_hold { background: #F0F0D0; }
+.myopac_summary_table td { padding : 3px; }
+
+.print_button {
+  border: 2px outset;
+  padding: 3px;
+  text-decoration: none;
+  background-color: #dedede;
+  height: 15px;
+}
+
diff --git a/Open-ILS/web/opac/skin/tadl/js/adv_global.js b/Open-ILS/web/opac/skin/tadl/js/adv_global.js
new file mode 100644 (file)
index 0000000..897b1ea
--- /dev/null
@@ -0,0 +1,331 @@
+
+attachEvt("common", "run", advgInit);
+attachEvt("common", "locationChanged", advSyncCopyLocLink );
+
+var COOKIE_NOGROUP_RECORDS = 'grpt';
+var advSelectedOrg = null;
+
+function advgInit() {
+
+       /* XXX */
+    dojo.require('dojo.cookie');
+       if( dojo.cookie(COOKIE_NOGROUP_RECORDS) || SHOW_MR_DEFAULT )
+               $('adv_group_titles').checked = true;
+
+       $n($('adv_global_tbody'), 'term').focus();
+
+    var ctypes = ["bib_level", "item_form", "item_type", "audience", "lit_form"];
+
+    var req = new Request('open-ils.fielder:open-ils.fielder.ccvm.atomic', {"cache":1,"query":{"ctype":ctypes}});
+    req.callback(advDrawBibExtras);
+    req.request.ctypes = ctypes;
+    req.send();
+
+       var input = $n($('adv_global_trow'), 'term');
+       input.focus();
+       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(getAvail())
+        $('opac.result.limit2avail').checked = true;
+
+    // not sure we want to propogate the pubdate filter, 
+    // since other filters are not propogated
+    //advInitPubFilter();
+
+    if(!new CGI().param(PARAM_NOPERSIST_SEARCH))
+        initSearchBoxes();
+    advSyncCopyLocLink(getLocation());
+}
+
+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];
+        }
+    }
+}
+
+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');
+        }
+    }
+    $n(rows[0], 'term').focus();
+}
+
+
+function initSearchBoxes() {
+    /* loads the compiled search from the search cookie 
+        and sets the widgets accordingly */
+
+    search = dojo.cookie(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 -<term> 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 ctypes = r.ctypes
+    dojo.forEach(ctypes,
+        function(ctype) {
+               var sel = $('adv_global_' + ctype);
+            var ctypeData = dojo.filter(data, function(item) { return item.ctype == ctype } );
+            ctypeData = ctypeData.sort(
+                function(a,b) { /* sort alphabetically */
+                    return (a.value < b.value) ? -1 : 1;
+                }
+            );
+            dojo.forEach(ctypeData,
+                function(thing) {
+                    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 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]               = depthSelGetDepth();
+       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;
+
+    // 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 ) 
+               dojo.cookie(COOKIE_NOGROUP_RECORDS,'1');
+       else
+               dojo.cookie(COOKIE_NOGROUP_RECORDS,null,{'expires':-1});
+
+
+       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' : {
+                               // Normalize spaces so we don't get "- " embedded in the query
+                               var words = term.replace(/\s+/g,' ').replace(/^\s*/,'').replace(/\s*$/,'').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(/^\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/tadl/js/advanced.js b/Open-ILS/web/opac/skin/tadl/js/advanced.js
new file mode 100644 (file)
index 0000000..0e898e4
--- /dev/null
@@ -0,0 +1,178 @@
+/* advanced search interface */
+
+attachEvt("common", "run", advInit);
+
+function advInit() { 
+
+       /* propogate these? */
+
+       depthSelInit(); 
+       setEnterFunc( $n( $('advanced.marc.tbody'), 'advanced.marc.value'), advMARCRun );
+
+       unHideMe($('adv_quick_search_sidebar'));
+
+       /*
+       if(isXUL()) 
+               setSelector($('adv_quick_type'), 'tcn'); */
+
+       setEnterFunc($('adv_quick_text'), advGenericSearch);
+
+       unHideMe($('adv_marc_search_sidebar'));
+}
+
+
+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_IDS_BY_BARCODE, barcode);
+    req.callback(advDrawBarcode);
+    req.request.alertEvent = false;
+    req.send();
+}
+
+function advDrawBarcode(r) {
+    var title_ids = r.getResultObject();
+    if(checkILSEvent(title_ids)) {
+        alertId('myopac.copy.not.found');
+        return;
+    }
+    if(!title_ids) return;
+    var args = {};
+    if (title_ids.length == 1) {
+        args.page = RDETAIL;
+        args[PARAM_RID] = title_ids[0];
+    } else {
+        args.page = RRESULT;
+           args[PARAM_RTYPE] = RTYPE_LIST;
+           args[PARAM_RLIST] = title_ids;
+    }
+    location.href = buildOPACLink(args);
+}
+
+
+
diff --git a/Open-ILS/web/opac/skin/tadl/js/cn_browse.js b/Open-ILS/web/opac/skin/tadl/js/cn_browse.js
new file mode 100644 (file)
index 0000000..94b8c8b
--- /dev/null
@@ -0,0 +1,145 @@
+var cnOffset = 0;
+var cnCount = 9;
+var cnBrowseCN;
+var cnBrowseOrg;
+
+if( findCurrentPage() == CNBROWSE ) {
+       attachEvt("common", "run", cnBrowseLoadSearch);
+       attachEvt( "common", "locationUpdated", cnBrowseResubmit );
+       attachEvt( "common", "depthChanged", cnBrowseResubmit );
+}
+
+
+function cnBrowseLoadSearch() {
+       unHideMe($('cn_browse'));
+       cnBrowseGo(getCallnumber(), getLocation(), getDepth());
+}
+
+
+function cnBrowseResubmit() {
+       var args = {}
+       args[PARAM_CN] = cnBrowseCN;
+       args[PARAM_DEPTH] = depthSelGetDepth();
+       args[PARAM_LOCATION] = getNewSearchLocation();
+       goTo(buildOPACLink(args));
+}
+
+
+
+function cnBrowseGo(cn, org, depth) { 
+       if(depth == null) depth = getDepth();
+
+       org = findOrgUnit(org);
+       cnOffset = 0;
+
+       do {
+               var t = findOrgType(org.ou_type());
+               if( t.depth() > depth ) 
+                       org = findOrgUnit(org.parent_ou());
+               else break;
+       } while(true); 
+
+       cnBrowseOrg = org;
+       cnBrowseCN = cn;
+
+       _cnBrowseGo( cn, org );
+       appendClear($('cn_browse_where'), text(org.name()));
+}
+
+
+function _cnBrowseGo( cn, org ) {
+       var req = new Request( FETCH_CNBROWSE, cn, org.id(), cnCount, cnOffset );
+       req.callback( cnBrowseDraw );
+       req.send();
+}
+
+function cnBrowseNext() {
+       cnOffset++;
+       _cnBrowseGo( cnBrowseCN, cnBrowseOrg );
+}
+
+function cnBrowsePrev() {
+       cnOffset--;
+       _cnBrowseGo( cnBrowseCN, cnBrowseOrg );
+}
+
+
+function cnBrowseDraw( r ) {
+       var list = r.getResultObject();
+       _cnBrowseDraw(list);
+}
+
+
+var cnTbody;
+var cnRowT;
+var cnTdT;
+function _cnBrowseDraw( list ) {
+
+       if(!cnTbody) {
+               cnTbody = $('cn_tbody');
+               cnRowT = $('cn_browse_row');
+               cnTdT = cnRowT.removeChild($('cn_browse_td'));
+               cnTbody.removeChild(cnRowT);
+       }
+       removeChildren(cnTbody);
+
+       var counter = 1;
+       var currentRow = cnRowT.cloneNode(true);
+       cnTbody.appendChild(currentRow);
+
+       for( var idx in list ) {
+               
+
+               var currentTd = cnTdT.cloneNode(true);
+               currentRow.appendChild(currentTd);
+
+               var td = cnTdT.cloneNode(true);
+
+               var obj = list[idx];
+               var cn  = obj.cn;
+               var mods = obj.mods;
+
+               var cn_td                       = $n(currentTd, 'cn_browse_cn');
+               var lib_td                      = $n(currentTd, 'cn_browse_lib');
+               var title_td            = $n(currentTd, 'cn_browse_title');
+               var author_td           = $n(currentTd, 'cn_browse_author');
+               var pic_td                      = $n(currentTd, 'cn_browse_pic');
+
+               if (parseInt(cn.prefix().id()) > -1) {
+            cn_td.appendChild(text(cn.prefix().label()));
+            cn_td.appendChild(text(' '));
+        }
+
+               cn_td.appendChild(text(cn.label()));
+
+               if (parseInt(cn.suffix().id()) > -1) {
+            cn_td.appendChild(text(' '));
+            cn_td.appendChild(text(cn.suffix().label()));
+        }
+
+               lib_td.appendChild(text(findOrgUnit(cn.owning_lib()).name()));
+               cnBrowseDrawTitle(mods, title_td, author_td, pic_td);
+
+               if( counter++ % 3 == 0 ) {
+                       counter = 1;
+                       currentRow = cnRowT.cloneNode(true);
+                       cnTbody.appendChild(currentRow);
+               }
+       }
+}
+
+
+function cnBrowseDrawTitle(mods, title_td, author_td, pic_td) {
+
+       buildTitleDetailLink(mods, title_td); 
+       buildSearchLink(STYPE_AUTHOR, mods.author(), author_td);
+       pic_td.setAttribute("src", buildISBNSrc(cleanISBN(mods.isbn())));
+
+       var args = {};
+       args.page = RDETAIL;
+       args[PARAM_OFFSET] = 0;
+       args[PARAM_RID] = mods.doc_id();
+       args[PARAM_MRID] = 0;
+       pic_td.parentNode.setAttribute("href", buildOPACLink(args));
+}
+
diff --git a/Open-ILS/web/opac/skin/tadl/js/combined.js b/Open-ILS/web/opac/skin/tadl/js/combined.js
new file mode 100644 (file)
index 0000000..a6cee68
--- /dev/null
@@ -0,0 +1,3446 @@
+function $(id) { return getId(id); }
+function getId(id) {
+       return document.getElementById(id);
+}
+
+function swapCSSClass(obj, old, newc ) {
+       removeCSSClass(obj, old );
+       addCSSClass(obj, newc );
+}
+
+
+function addCSSClass(e,c) {
+       if(!e || !c) return;
+
+       var css_class_string = e.className;
+       var css_class_array;
+
+       if(css_class_string)
+               css_class_array = css_class_string.split(/\s+/);
+
+       var string_ip = ""; /*strip out nulls*/
+       for (var css_class in css_class_array) {
+               if (css_class_array[css_class] == c) { return; }
+               if(css_class_array[css_class] !=null)
+                       string_ip += css_class_array[css_class] + " ";
+       }
+       string_ip += c;
+       e.className = string_ip;
+}
+
+function removeCSSClass(e, c) {
+       if(!e || !c) return;
+
+       var css_class_string = '';
+
+       var css_class_array = e.className;
+       if( css_class_array )
+               css_class_array = css_class_array.split(/\s+/);
+
+       var first = 1;
+       for (var css_class in css_class_array) {
+               if (css_class_array[css_class] != c) {
+                       if (first == 1) {
+                               css_class_string = css_class_array[css_class];
+                               first = 0;
+                       } else {
+                               css_class_string = css_class_string + ' ' +
+                                       css_class_array[css_class];
+                       }
+               }
+       }
+       e.className = css_class_string;
+}
+
+
+/*returns the character code pressed that caused the event */
+function grabCharCode(evt) {
+   evt = (evt) ? evt : ((window.event) ? event : null); 
+   if( evt ) {
+      return (evt.charCode ? evt.charCode : 
+         ((evt.which) ? evt.which : evt.keyCode ));
+   } else { return -1; }
+}       
+
+
+/* returns true if the user pressed enter */
+function userPressedEnter(evt) {
+   var code = grabCharCode(evt);
+   if(code==13||code==3) return true;
+   return false;
+}   
+
+
+function goTo(url) {
+       /* setTimeout because ie sux */
+       setTimeout( function(){ location.href = url; }, 0 );
+}
+
+
+function removeChildren(dom) {
+       if(!dom) return;
+       while(dom.childNodes[0])
+               dom.removeChild(dom.childNodes[0]);
+}
+
+function appendClear(node, child) {
+       if(typeof child =='string') child = text(child);
+       removeChildren(node);
+       node.appendChild(child);
+}
+
+
+function instanceOf(object, constructorFunction) {
+
+   if(!IE) {
+      while (object != null) {
+         if (object == constructorFunction.prototype)
+            return true;
+         object = object.__proto__;
+      }
+   } else {
+      while(object != null) {
+         if( object instanceof constructorFunction )
+            return true;
+         object = object.__proto__;
+      }
+   }
+   return false;
+}         
+
+
+/* ------------------------------------------------------------------------------------------- */
+/* detect my browser */
+var isMac, NS, NS4, NS6, IE, IE4, IEmac, IE4plus, IE5, IE5plus, IE6, IEMajor, ver4, Safari;
+function detect_browser() {       
+
+   isMac = (navigator.appVersion.indexOf("Mac")!=-1) ? true : false;
+   NS = (navigator.appName == "Netscape") ? true : false;
+   NS4 = (document.layers) ? true : false;
+   IE = (navigator.appName == "Microsoft Internet Explorer") ? true : false;
+   IEmac = ((document.all)&&(isMac)) ? true : false;
+   IE4plus = (document.all) ? true : false;
+   IE4 = ((document.all)&&(navigator.appVersion.indexOf("MSIE 4.")!=-1)) ? true : false;
+   IE5 = ((document.all)&&(navigator.appVersion.indexOf("MSIE 5.")!=-1)) ? true : false;
+   IE6 = ((document.all)&&(navigator.appVersion.indexOf("MSIE 6.")!=-1)) ? true : false;
+   ver4 = (NS4 || IE4plus) ? true : false;
+   NS6 = (!document.layers) && (navigator.userAgent.indexOf('Netscape')!=-1)?true:false;
+   Safari = navigator.userAgent.match(/Safari/);
+
+   IE5plus = IE5 || IE6;
+   IEMajor = 0;
+
+   if (IE4plus) {
+      var start = navigator.appVersion.indexOf("MSIE");
+      var end = navigator.appVersion.indexOf(".",start);
+      IEMajor = parseInt(navigator.appVersion.substring(start+5,end));
+      IE5plus = (IEMajor>=5) ? true : false;
+   }
+}  
+detect_browser();
+/* ------------------------------------------------------------------------------------------- */
+
+
+function text(t) {
+       if(t == null) t = "";
+       return document.createTextNode(t);
+}
+
+function elem(name, attrs, txt) {
+    var e = document.createElement(name);
+    if (attrs) {
+        for (key in attrs) {
+                         if( key == 'id') e.id = attrs[key];
+                         else e.setAttribute(key, attrs[key]);
+        }
+    }
+    if (txt) e.appendChild(text(txt));
+    return e;
+}                   
+
+
+/* sel is the selector object, sets selected on the 
+       option with the given value. case does not matter...*/
+function setSelector( sel, value ) {
+       if(sel && value != null) {
+               for( var i = 0; i!= sel.options.length; i++ ) { 
+                       if( sel.options[i] ) {
+                               var val = sel.options[i].value;
+                               if( val == null || val == "" ) /* for IE */
+                                       val = sel.options[i].innerHTML;
+                               value += ""; /* in case of number */ 
+                               if( val && val.toLowerCase() == value.toLowerCase() ) {
+                                       sel.selectedIndex = i;
+                                       sel.options[i].selected = true;
+                                       return true;
+                               }
+                       }
+               }
+       }
+       return false;
+}
+
+function setSelectorRegex( sel, regex ) {
+       if(sel && regex != null) {
+               for( var i = 0; i!= sel.options.length; i++ ) { 
+                       if( sel.options[i] ) {
+                               var val = sel.options[i].value;
+                               if( val == null || val == "" ) /* for IE */
+                                       val = sel.options[i].innerHTML;
+                               value += ""; /* in case of number */ 
+                               if( val && val.match(regex) ) {
+                                       sel.selectedIndex = i;
+                                       sel.options[i].selected = true;
+                                       return true;
+                               }
+                       }
+               }
+       }
+       return false;
+}
+
+function getSelectorVal( sel ) {
+       if(!sel) return null;
+       var idx = sel.selectedIndex;
+       if( idx < 0 ) return null;
+       var o = sel.options[idx];
+       var v = o.value; 
+       if(v == null) v = o.innerHTML;
+       return v;
+}
+
+function getSelectorName( sel ) {
+       var o = sel.options[sel.selectedIndex];
+       var v = o.name;
+       if(v == null || v == undefined || v == "") v = o.innerHTML;
+       return v;
+}
+
+function setSelectorByName( sel, name ) {
+       for( var o in sel.options ) {
+               var opt = sel.options[o];
+               if( opt.name == name || opt.innerHTML == name ) {
+                       sel.selectedIndex = o;
+                       opt.selected = true;
+               }
+       }
+}
+
+function findSelectorOptByValue( sel, val ) {
+       for( var i = 0; i < sel.options.length; i++ ) {
+               var opt = sel.options[i];
+               if( opt.value == val ) return opt;
+       }
+       return null;
+}
+
+function debugSelector(sel) {
+       var s = 'Selector\n';
+       for( var i = 0; i != sel.options.length; i++ ) {
+               var o = sel.options[i];
+               s += "\t" + o.innerHTML + "\n";
+       }
+       return s;
+}
+
+function findParentByNodeName(node, name) {
+       while( ( node = node.parentNode) ) 
+               if (node.nodeName == name) return node;
+       return null;
+}
+
+/* returns only elements in nodes childNodes list, not sub-children */
+function getElementsByTagNameFlat( node, name ) {
+       var elements = [];
+       for( var e in node.childNodes ) {
+               var n = node.childNodes[e];
+               if( n && n.nodeName == name ) elements.push(n);
+       }
+       return elements;
+}
+
+/* expects a tree with a id() method on each node and a 
+children() method to get to each node */
+function findTreeItemById( tree, id ) {
+       if( tree.id() == id ) return tree;
+       for( var c in tree.children() ) {
+               var found = findTreeItemById( tree.children()[c], id );
+               if(found) return found;
+       }
+       return null;
+}
+
+/* returns null if none of the tests are true.  returns sub-array of 
+matching array items otherwise */
+function grep( arr, func ) {
+       var results = [];
+       if(!arr) return null;
+       if( arr.constructor == Array ) {
+               for( var i = 0; i < arr.length; i++ ) {
+                       if( func(arr[i]) ) 
+                               results.push(arr[i]);
+               }
+       } else {
+               for( var i in arr ) {
+                       if( func(arr[i]) ) 
+                               results.push(arr[i]);
+               }
+       }
+       if(results.length > 0) return results;
+       return null;
+}
+
+function ogrep( obj, func ) {
+       var results = {};
+       var found = false;
+       for( var i in obj ) {
+               if( func(obj[i]) ) {
+                       results[i] = obj[i];
+                       found = true;
+               }
+       }
+       if(found) return results;
+       return null;
+}
+
+function doSelectorActions(sel) {
+       if((IE || Safari) && sel) { 
+               sel.onchange = function() {
+                       var o = sel.options[sel.selectedIndex];
+                       if(o && o.onclick) o.onclick()
+               }
+       }
+}
+
+/* if index < 0, the item is pushed onto the end */
+function insertSelectorVal( selector, index, name, value, action, indent ) {
+       if( index < 0 ) index = selector.options.length;
+       var a = [];
+       for( var i = selector.options.length; i != index; i-- ) 
+               a[i] = selector.options[i-1];
+
+       var opt = setSelectorVal( selector, index, name, value, action, indent );
+
+       for( var i = index + 1; i < a.length; i++ ) 
+               selector.options[i] = a[i];
+
+       return opt;
+}
+
+/* changes the value of the option at the specified index */
+function setSelectorVal( selector, index, name, value, action, indent ) {
+       if(!indent || indent < 0) indent = 0;
+       indent = parseInt(indent);
+
+       var option;
+
+       if(IE) {
+               var pre = elem("pre");
+               for( var i = 0; i != indent; i++ )
+                       pre.appendChild(text("   "));
+
+               pre.appendChild(text(name));
+               option = new Option("", value);
+               selector.options[index] = option;
+               option.appendChild(pre);
+       
+       } else {
+               indent = indent * 14;
+               option= new Option(name, value);
+               option.setAttribute("style", "padding-left: "+indent+'px;');
+               selector.options[index] = option;
+               if(action) option.onclick = action;
+       }
+
+       if(action) option.onclick = action;
+       return option;
+}
+
+
+/* split on spaces.  capitalize the first /\w/ character in
+   each substring */
+function normalize(val) {
+       return val; /* disable me for now */
+
+   if(!val) return ""; 
+
+   var newVal = '';
+   try {val = val.split(' ');} catch(E) {return val;}
+   var reg = /\w/;
+
+   for( var c = 0; c < val.length; c++) {
+
+      var string = val[c];
+      var cap = false; 
+      for(var x = 0; x != string.length; x++) {
+
+         if(!cap) {
+            var ch = string.charAt(x);
+            if(reg.exec(ch + "")) {
+               newVal += string.charAt(x).toUpperCase();
+               cap = true;
+               continue;
+            }
+         }
+
+         newVal += string.charAt(x).toLowerCase();
+      }
+      if(c < (val.length-1)) newVal += " ";
+   }
+
+   newVal = newVal.replace(/\s*\.\s*$/,'');
+   newVal = newVal.replace(/\s*\/\s*\/\s*$/,' / ');
+   newVal = newVal.replace(/\s*\/\s*$/,'');
+
+   return newVal;
+}
+
+
+/* returns true if n is null or stringifies to 'undefined' */
+function isNull(n) {
+       if( n == null || n == undefined || n.toString().toLowerCase() == "undefined" 
+               || n.toString().toLowerCase() == "null" )
+               return true;
+       return false;
+}
+
+
+/* find nodes with an attribute of 'name' that equals nodeName */
+
+function $n( root, nodeName ) { return findNodeByName(root,nodeName); }
+
+function findNodeByName(root, nodeName) {
+       if( !root || !nodeName) return null;
+
+       if(root.nodeType != 1) return null;
+
+       if(root.getAttribute("name") == nodeName || root.name == nodeName ) 
+               return root;
+
+       var children = root.childNodes;
+
+       for( var i = 0; i != children.length; i++ ) {
+               var n = findNodeByName(children[i], nodeName);
+               if(n) return n;
+       }
+
+       return null;
+}
+
+
+/* truncates the string at 'size' characters and appends a '...' to the end */
+function truncate(string, size) {
+       if(string && size != null && 
+                       size > -1 && string.length > size) 
+               return string.substr(0, size) + "... "; 
+       return string;
+}
+
+
+/* style sheets must have a 'name' attribute for these functions to work */
+function setActivateStyleSheet(name) {
+       var i, a, main;
+       for (i = 0; (a = document.getElementsByTagName ("link")[i]); i++) {
+               if (a.getAttribute ("rel").indexOf ("style") != -1 && a.getAttribute ("name")) {
+                       a.disabled = true;
+                       if (a.getAttribute ("name").indexOf(name) != -1)
+                               a.disabled = false;
+               }
+       }
+}
+
+
+/* ----------------------------------------------------- */
+var currentFontSize;
+function scaleFonts(type) {
+
+       var size                = "";
+       var ssize       = "";
+       var size2       = "";
+       var a;
+       
+       if(!currentFontSize) currentFontSize = 'regular';
+       if(currentFontSize == 'regular' && type == 'regular' ) return;
+       if( currentFontSize == type ) return;
+       currentFontSize = type;
+
+       switch(type) {
+               case "large":  /* these are arbitrary.. but they seem to work ok in FF/IE */
+                       size = "142%"; 
+                       size2 = "107%"; 
+                       ssize = "94%";
+                       break;
+       }
+
+       document.getElementsByTagName('body')[0].style.fontSize = size;
+       for (i = 0; (a = document.getElementsByTagName ("td")[i]); i++) a.style.fontSize = size;;
+       for (i = 0; (a = document.getElementsByTagName ("div")[i]); i++) a.style.fontSize = ssize;
+       for (i = 0; (a = document.getElementsByTagName ("option")[i]); i++) a.style.fontSize = ssize;
+       for (i = 0; (a = document.getElementsByTagName ("li")[i]); i++) a.style.fontSize = ssize;
+       for (i = 0; (a = document.getElementsByTagName ("span")[i]); i++) a.style.fontSize = ssize;
+       for (i = 0; (a = document.getElementsByTagName ("select")[i]); i++) a.style.fontSize = ssize;
+       for (i = 0; (a = document.getElementsByTagName ("a")[i]); i++) a.style.fontSize = size2;
+}
+
+
+function sortWordsIgnoreCase(a, b) {
+       a = a.toLowerCase();
+       b = b.toLowerCase();
+       if(a>b) return 1;
+       if(a<b) return -1;
+       return 0;
+}
+
+
+function getSelectedList(sel) {
+       if(!sel) return [];
+       var vals = [];
+       for( var i = 0; i != sel.options.length; i++ ) {
+               if(sel.options[i].selected)
+                       vals.push(sel.options[i].value);
+       }
+       return vals;
+}
+
+
+function setEnterFunc(node, func) {
+       if(!(node && func)) return;
+       node.onkeydown = function(evt) {
+               if( userPressedEnter(evt)) func();
+       }
+}
+
+function iterate( arr, callback ) {
+       for( var i = 0; arr && i < arr.length; i++ ) 
+               callback(arr[i]);
+}
+
+
+
+
+/* taken directly from the JSAN util.date library */
+/* but changed from the util.date.interval_to_seconds invocation, 
+because JSAN will assume the whole library is already loaded if 
+it sees that, and the staff client uses both this file and the
+JSAN library*/
+function interval_to_seconds( $interval ) {
+
+       $interval = $interval.replace( /and/, ',' );
+       $interval = $interval.replace( /,/, ' ' );
+       
+       var $amount = 0;
+       var results = $interval.match( /\s*\+?\s*(\d+)\s*(\w{1})\w*\s*/g);  
+       for( var i = 0; i < results.length; i++ ) {
+               if(!results[i]) continue;
+               var result = results[i].match( /\s*\+?\s*(\d+)\s*(\w{1})\w*\s*/ );
+               if (result[2] == 's') $amount += result[1] ;
+               if (result[2] == 'm') $amount += 60 * result[1] ;
+               if (result[2] == 'h') $amount += 60 * 60 * result[1] ;
+               if (result[2] == 'd') $amount += 60 * 60 * 24 * result[1] ;
+               if (result[2] == 'w') $amount += 60 * 60 * 24 * 7 * result[1] ;
+               if (result[2] == 'M') $amount += ((60 * 60 * 24 * 365)/12) * result[1] ;
+               if (result[2] == 'y') $amount += 60 * 60 * 24 * 365 * result[1] ;
+       }
+       return $amount;
+}
+
+
+function openWindow( data ) {
+       if( isXUL() ) {
+               var data = window.escape(
+                       '<html><head><title></title></head><body>' + data + '</body></html>');
+
+               xulG.window_open(
+                       'data:text/html,' + data,
+                       '', 
+                       'chrome,resizable,width=700,height=500'); 
+
+       } else {
+               win = window.open('','', 'resizable,width=700,height=500,scrollbars=1'); 
+               win.document.body.innerHTML = data;
+       }
+}
+
+
+/* alerts the innerhtml of the node with the given id */
+function alertId(id) {
+       var node = $(id);
+       if(node) alert(node.innerHTML);
+}
+
+function alertIdText(id, text) {
+       var node = $(id);
+   if(!node) return;
+   if(text)
+      alert(text + '\n\n' + node.innerHTML);
+   else 
+          alert(node.innerHTML);
+}
+
+function confirmId(id) {
+       var node = $(id);
+       if(node) return confirm(node.innerHTML);
+}
+
+
+function goBack() { history.back(); }
+function goForward() { history.forward(); }
+
+
+function uniquify(arr) {
+       if(!arr) return [];
+       var newarr = [];
+       for( var i = 0; i < arr.length; i++ ) {
+               var item = arr[i];
+               if( ! grep( newarr, function(x) {return (x == item);}))
+                       newarr.push(item);
+       }
+       return newarr;
+}
+
+function contains(arr, item) {
+       for( var i = 0; i < arr.length; i++ ) 
+               if( arr[i] == item ) return true;
+       return false;
+}
+
+function isTrue(i) {
+       return (i && !(i+'').match(/f/i) );
+}
+
+
+/* builds a JS date object with the given info.  The given data
+       has to be valid (e.g. months == 30 is not valid).  Returns NULL on 
+       invalid date 
+       Months are 1-12 (unlike the JS date object)
+       */
+
+function buildDate( year, month, day, hours, minutes, seconds ) {
+
+       if(!year) year = 0;
+       if(!month) month = 1;
+       if(!day) day = 1;
+       if(!hours) hours = 0;
+       if(!minutes) minutes = 0;
+       if(!seconds) seconds = 0;
+
+       var d = new Date(year, month - 1, day, hours, minutes, seconds);
+       
+       _debug('created date with ' +
+               (d.getYear() + 1900) +'-'+
+               (d.getMonth() + 1) +'-'+
+               d.getDate()+' '+
+               d.getHours()+':'+
+               d.getMinutes()+':'+
+               d.getSeconds());
+
+
+       if( 
+               (d.getYear() + 1900) == year &&
+               d.getMonth()    == (month - 1) &&
+               d.getDate()             == new Number(day) &&
+               d.getHours()    == new Number(hours) &&
+               d.getMinutes() == new Number(minutes) &&
+               d.getSeconds() == new Number(seconds) ) {
+               return d;
+       }
+
+       return null;
+}
+
+function mkYearMonDay(date) {
+       if(!date) date = new Date();
+       var y = date.getYear() + 1900;
+       var m = (date.getMonth() + 1)+'';
+       var d = date.getDate()+'';
+       if(m.length == 1) m = '0'+m;
+       if(d.length == 1) d = '0'+d;
+       return y+'-'+m+'-'+d;
+}
+
+
+function debugFMObject(obj) {
+       if(typeof obj != 'object' ) return obj;
+       _debug("---------------------");
+       var keys = fmclasses[obj.classname];
+       if(!keys) { _debug(formatJSON(js2JSON(obj))); return; }
+
+       keys.sort();
+       for( var i = 0; i < keys.length; i++ ) {
+               var key = keys[i];
+               while( key.length < 12 ) key += ' ';
+               var val = obj[keys[i]]();
+               if( typeof val == 'object' ) {
+                       _debug(key+' :=\n');
+                       _debugFMObject(val);
+               } else {
+                       _debug(key+' = ' +val);
+               }
+
+       }
+       _debug("---------------------");
+}
+
+
+function getTableRows(tbody) {
+    var rows = [];
+    if(!tbody) return rows;
+
+    var children = tbody.childNodes;
+    if(!children) return rows;
+
+    for(var i = 0; i < children.length; i++) {
+        var child = children[i];
+        if(child.nodeName.match(/^tr$/i)) 
+            rows.push(child);
+    }
+    return rows;
+}
+
+function getObjectKeys(obj) {
+    keys = []
+    for(var k in obj)
+        keys.push(k)
+    return keys;
+}
+/* Export some constants  ----------------------------------------------------- */
+
+var SHOW_MR_DEFAULT = false; /* true if we show metarecords by default */
+
+//var DO_AUTHORITY_LOOKUPS = false;
+var DO_AUTHORITY_LOOKUPS = true;
+
+var STAFF_WEB_BASE_PATH = '/eg'; // root of the web-based staff interfaces
+
+/* URL param names */
+var PARAM_TERM                 = "t";                  /* search term */
+var PARAM_FACET                        = "ft";                 /* facet term */
+var PARAM_STYPE                = "tp";                 /* search type */
+var PARAM_LOCATION     = "l";                  /* current location */
+var PARAM_LASSO        = "sg";                 /* current location */
+var PARAM_DEPTH                = "d";                  /* search depth */
+var PARAM_FORM                 = "f";                  /* search format */
+var PARAM_OFFSET               = "o";                  /* search offset */
+var PARAM_COUNT                = "c";                  /* hits per page */
+var PARAM_HITCOUNT     = "hc";                 /* hits per page */
+var PARAM_MRID                 = "m";                  /* metarecord id */
+var PARAM_RID                  = "r";                  /* record id */
+var PARAM_RLIST                = "rl";
+var PARAM_ORIGLOC              = "ol";                 /* the original location */
+var PARAM_AUTHTIME     = "at";                 /* inactivity timeout in seconds */
+var PARAM_ADVTERM              = "adv";                        /* advanced search term */
+var PARAM_ADVTYPE              = "adt";                        /* the advanced search type */
+var PARAM_RTYPE                = "rt";
+var PARAM_SORT                 = "s";
+var PARAM_SORT_DIR     = "sd";
+var PARAM_DEBUG                = "dbg";
+var PARAM_CN                   = "cn";
+var PARAM_LITFORM              = 'lf';
+var PARAM_ITEMFORM     = 'if';
+var PARAM_ITEMTYPE     = 'it';
+var PARAM_BIBLEVEL     = 'bl';
+var PARAM_AUDIENCE     = 'a';
+var PARAM_SEARCHES     = 'ss';
+var PARAM_LANGUAGE     = 'la';
+var PARAM_TFORM                = 'tf'; /* temporary format for title result pages */
+var PARAM_RDEPTH               = 'rd';
+var PARAM_REDIR                = 're'; /* true if we have been redirected by IP (we're at a real lib) */
+var PARAM_AVAIL     = 'av'; /* limit search results to available items */
+var PARAM_COPYLOCS  = 'cl'; // copy (shelving) locations
+var PARAM_PUBD_BEFORE = 'pdb';
+var PARAM_PUBD_AFTER = 'pda';
+var PARAM_PUBD_BETWEEN = 'pdt';
+var PARAM_PUBD_DURING = 'pdd';
+var PARAM_NOPERSIST_SEARCH = 'nps';
+
+/* URL param values (see comments above) */
+var TERM;  
+var FACET;  
+var STYPE;  
+var LOCATION;  
+var LASSO;  
+var DEPTH;  
+var FORM; 
+var OFFSET;
+var COUNT;  
+var HITCOUNT;  
+var RANKS; 
+var FONTSIZE;
+var ORIGLOC;
+var AUTHTIME;
+var ADVTERM;
+var ADVTYPE;
+var MRID;
+var RID;
+var RTYPE;
+var SORT;
+var SORT_DIR;
+var RLIST;
+var DEBUG;
+var CALLNUM;
+var LITFORM;
+var ITEMFORM;
+var ITEMTYPE;
+var BIBLEVEL;
+var AUDIENCE;
+var SEARCHES;
+var LANGUAGE;
+var TFORM;
+var RDEPTH;
+var AVAIL;
+var COPYLOCS;
+var PUBD_BEFORE;
+var PUBD_AFTER;
+var PUBD_BETWEEN;
+var PUBD_DURING;
+
+/* cookie values */
+var SBEXTRAS; 
+var SKIN;
+
+/* cookies */
+var COOKIE_SB          = "sbe";
+var COOKIE_SES         = "ses";
+//var COOKIE_IDS               = "ids"; /* list of mrecord ids */
+//var COOKIE_SRIDS     = "srids"; /* record ids cached from a search */
+var COOKIE_FONT        = "fnt";
+var COOKIE_SKIN        = "skin";
+var COOKIE_RIDS        = "rids"; /* list of record ids */
+var COOKIE_SEARCH = 'sr';
+
+/* pages */
+var MRESULT            = "mresult";
+var RRESULT            = "rresult";
+var RDETAIL            = "rdetail";
+var MYOPAC             = "myopac";
+var ADVANCED   = "advanced";
+var HOME                       = "home";
+var BBAGS              = "bbags";
+var REQITEMS   = "reqitems";
+var CNBROWSE   = "cnbrowse";
+
+/* search type (STYPE) options */
+var STYPE_AUTHOR       = "author";
+var STYPE_TITLE        = "title";
+var STYPE_SUBJECT      = "subject";
+var STYPE_SERIES       = "series";
+var STYPE_KEYWORD      = "keyword";
+
+/* record-level search types */
+var RTYPE_MRID         = "mrid";
+var RTYPE_COOKIE       = "cookie";
+var RTYPE_AUTHOR       = STYPE_AUTHOR;
+var RTYPE_SUBJECT      = STYPE_SUBJECT;
+var RTYPE_TITLE        = STYPE_TITLE;
+var RTYPE_SERIES       = STYPE_SERIES;
+var RTYPE_KEYWORD      = STYPE_KEYWORD;
+var RTYPE_LIST         = "list";
+var RTYPE_MULTI        = 'multi';
+var RTYPE_MARC         = 'marc';
+var RTYPE_ISBN         = 'isbn';
+var RTYPE_ISSN         = 'issn';
+var RTYPE_TCN          = 'tcn';
+
+var SORT_TYPE_REL                      = "rel";
+var SORT_TYPE_AUTHOR           = STYPE_AUTHOR; 
+var SORT_TYPE_TITLE            = STYPE_TITLE;
+var SORT_TYPE_PUBDATE  = "pubdate";
+var SORT_DIR_ASC                       = "asc";
+var SORT_DIR_DESC                      = "desc";
+
+/* types of advanced search */
+var ADVTYPE_MULTI = 'ml';
+var ADVTYPE_MARC       = 'ma';
+
+/*
+var ADVTYPE_ISBN       = 'isbn';
+var ADVTYPE_ISSN       = 'issn';
+*/
+
+var LOGOUT_WARNING_TIME = 30; /* "head up" for session timeout */
+
+/* user preferences */
+var PREF_HITS_PER              = 'opac.hits_per_page';
+var PREF_DEF_FONT              = 'opac.default_font';
+var PREF_HOLD_NOTIFY = 'opac.hold_notify';
+var PREF_DEF_LOCATION = 'opac.default_search_location';
+var PREF_DEF_DEPTH     = 'opac.default_search_depth';
+
+
+/** If enabled, added content attribution links will be 
+    made visible where appropriate.  The added content vendor name 
+    and URL are defined in the entities in opac.dtd
+    */
+var ENABLE_ADDED_CONTENT_ATTRIB_LINKS = false;
+
+
+/* container for global variables shared accross pages */
+var G          = {};
+G.user = null; /* global user object */
+G.ui           = {} /* cache of UI components */
+
+
+/* regexes */
+var REGEX_BARCODE = /^\d+/; /* starts with a number */
+var REGEX_PHONE = /^\d{3}-\d{3}-\d{4}$/; /* 111-222-3333 */
+
+
+/* call me after page init and I will load references 
+       to all of the ui object id's defined below 
+       They will be stored in G.ui.<page>.<thingy>
+ */
+function loadUIObjects() {
+       for( var p in config.ids ) {
+               G.ui[p] = {};
+               for( var o in config.ids[p] ) 
+                       G.ui[p][o] = getId(config.ids[p][o]);
+       }
+}
+
+/* try our best to free memory */
+function clearUIObjects() {
+       for( var p in config.ids ) {
+               for( var o in config.ids[p] ) {
+                       if(G.ui[p][o]) {
+                               G.ui[p][o].onclick = null;
+                               G.ui[p][o].onkeydown = null;
+                               G.ui[p][o] = null;
+                       }
+               }
+               G.ui[p] = null;
+       }
+}
+
+/* ---------------------------------------------------------------------------- 
+       Set up ID's and CSS classes 
+       Any new ids, css, etc. may be added by giving the unique names and putting 
+       them into the correct scope 
+/* ---------------------------------------------------------------------------- */
+
+var config = {};
+
+/* Set up the page names */
+config.page = {};
+config.page[HOME]                      = "index.xml";
+config.page[ADVANCED]  = "advanced.xml";
+config.page[MRESULT]           = "mresult.xml";
+config.page[RRESULT]           = "rresult.xml";
+config.page[MYOPAC]            = "myopac.xml";
+config.page[RDETAIL]           = "rdetail.xml";
+config.page[BBAGS]             = "bbags.xml";
+config.page[REQITEMS]  = "reqitems.xml";
+config.page[CNBROWSE]  = "cnbrowse.xml";
+
+/* themes */
+config.themes = {};
+
+/* set up images  */
+config.images = {};
+config.images.logo = "main_logo.jpg";
+
+
+/* set up ID's, CSS, and node names */
+config.ids                             = {};
+config.ids.result              = {};
+config.ids.mresult     = {};
+config.ids.advanced    = {};
+config.ids.rresult     = {};
+config.ids.myopac              = {};
+config.ids.rdetail     = {};
+
+config.css                             = {};
+config.css.result              = {};
+config.css.mresult     = {};
+config.css.advanced    = {};
+config.css.rresult     = {};
+config.css.myopac              = {};
+config.css.rdetail     = {};
+
+config.names                   = {};
+config.names.result    = {};
+config.names.mresult = {};
+config.names.advanced = {};
+config.names.rresult = {};
+config.names.myopac    = {};
+config.names.rdetail = {};
+
+
+/* id's shared accross skins. These *must* be defined */
+config.ids.common = {};
+config.ids.common.loading                      = "loading_div";                
+config.ids.common.canvas                       = "canvas";                             
+config.ids.common.canvas_main          = "canvas_main";                
+config.ids.common.org_tree                     = "org_tree";                   
+config.ids.common.org_container        = "org_container";
+
+config.ids.xul = {};
+
+
+/* shared CSS */
+config.css.hide_me = "hide_me";
+config.css.dim = "dim";
+config.css.dim2 = "dim2";
+
+
+/* ---------------------------------------------------------------------------- */
+/* These are pages that may replace the canvas */
+/* ---------------------------------------------------------------------------- */
+config.ids.altcanvas = {};
+
+
+
+/* ---------------------------------------------------------------------------- */
+/* Methods are defined as service:method 
+       An optional 3rd component is when a method is followed by a :1, such methods
+       have a staff counterpart and should have ".staff" appended to the method 
+       before the method is called when in XUL mode */
+
+var SEARCH_MRS                                         = 'open-ils.search:open-ils.search.metabib.multiclass:1';
+var SEARCH_RS                                          = 'open-ils.search:open-ils.search.biblio.multiclass:1';
+var SEARCH_MRS_QUERY                   = 'open-ils.search:open-ils.search.metabib.multiclass.query:1';
+var SEARCH_RS_QUERY             = 'open-ils.search:open-ils.search.biblio.multiclass.query:1';
+var FETCH_SEARCH_RIDS                  = "open-ils.search:open-ils.search.biblio.record.class.search:1";
+var CREATE_MFHD_RECORD                 = "open-ils.cat:open-ils.cat.serial.record.xml.create";
+var DELETE_MFHD_RECORD                 = "open-ils.cat:open-ils.cat.serial.record.delete";
+var FETCH_MFHD_SUMMARY                 = "open-ils.search:open-ils.search.serial.record.bib.retrieve";
+var FETCH_MRMODS                                       = "open-ils.search:open-ils.search.biblio.metarecord.mods_slim.retrieve";
+var FETCH_MODS_FROM_COPY               = "open-ils.search:open-ils.search.biblio.mods_from_copy";
+var FETCH_MR_COPY_COUNTS               = "open-ils.search:open-ils.search.biblio.metarecord.copy_count:1";
+var FETCH_RIDS                                         = "open-ils.search:open-ils.search.biblio.metarecord_to_records:1";
+var FETCH_RMODS                                        = "open-ils.search:open-ils.search.biblio.record.mods_slim.retrieve";
+var FETCH_R_COPY_COUNTS                        = "open-ils.search:open-ils.search.biblio.record.copy_count:1";
+var FETCH_FLESHED_USER                 = "open-ils.actor:open-ils.actor.user.fleshed.retrieve";
+var FETCH_SESSION                                      = "open-ils.auth:open-ils.auth.session.retrieve";
+var LOGIN_INIT                                         = "open-ils.auth:open-ils.auth.authenticate.init";
+var LOGIN_COMPLETE                             = "open-ils.auth:open-ils.auth.authenticate.complete";
+var LOGIN_DELETE                                       = "open-ils.auth:open-ils.auth.session.delete";
+var FETCH_USER_PREFS                           = "open-ils.actor:open-ils.actor.patron.settings.retrieve"; 
+var UPDATE_USER_PREFS                  = "open-ils.actor:open-ils.actor.patron.settings.update"; 
+var FETCH_COPY_STATUSES                        = "open-ils.search:open-ils.search.config.copy_status.retrieve.all";
+var FETCH_COPY_LOCATION_COUNTS_SUMMARY = "open-ils.search:open-ils.search.biblio.copy_location_counts.summary.retrieve";
+var FETCH_COPY_COUNTS_SUMMARY  = "open-ils.search:open-ils.search.biblio.copy_counts.summary.retrieve";
+//var FETCH_COPY_COUNTS_SUMMARY        = "open-ils.search:open-ils.search.biblio.copy_counts.location.summary.retrieve";
+var FETCH_MARC_HTML                            = "open-ils.search:open-ils.search.biblio.record.html";
+var FETCH_CHECKED_OUT_SUM              = "open-ils.actor:open-ils.actor.user.checked_out";
+var FETCH_HOLDS                                        = "open-ils.circ:open-ils.circ.holds.retrieve";
+var FETCH_FINES_SUMMARY                        = "open-ils.actor:open-ils.actor.user.fines.summary";
+var FETCH_TRANSACTIONS                 = "open-ils.actor:open-ils.actor.user.transactions.have_charge.fleshed";
+var FETCH_MONEY_BILLING                        = 'open-ils.circ:open-ils.circ.money.billing.retrieve.all';
+var FETCH_CROSSREF                             = "open-ils.search:open-ils.search.authority.crossref";
+var FETCH_CROSSREF_BATCH               = "open-ils.search:open-ils.search.authority.crossref.batch";
+var CREATE_HOLD                                        = "open-ils.circ:open-ils.circ.holds.create";
+var CREATE_HOLD_OVERRIDE               = "open-ils.circ:open-ils.circ.holds.create.override";
+var CANCEL_HOLD                                        = "open-ils.circ:open-ils.circ.hold.cancel";
+var UPDATE_USERNAME                            = "open-ils.actor:open-ils.actor.user.username.update";
+var UPDATE_PASSWORD                            = "open-ils.actor:open-ils.actor.user.password.update";
+var UPDATE_EMAIL                                       = "open-ils.actor:open-ils.actor.user.email.update";
+var RENEW_CIRC                                         = "open-ils.circ:open-ils.circ.renew";
+var CHECK_SPELL                                        = "open-ils.search:open-ils.search.spellcheck";
+var FETCH_REVIEWS                                      = "open-ils.search:open-ils.search.added_content.review.retrieve.all";
+var FETCH_TOC                                          = "open-ils.search:open-ils.search.added_content.toc.retrieve";
+var FETCH_ACONT_SUMMARY                        = "open-ils.search:open-ils.search.added_content.summary.retrieve";
+var FETCH_USER_BYBARCODE               = "open-ils.actor:open-ils.actor.user.fleshed.retrieve_by_barcode";
+var FETCH_ADV_MARC_MRIDS               = "open-ils.search:open-ils.search.biblio.marc:1";
+var FETCH_ADV_ISBN_RIDS                        = "open-ils.search:open-ils.search.biblio.isbn:1";
+var FETCH_ADV_ISSN_RIDS                        = "open-ils.search:open-ils.search.biblio.issn:1";
+var FETCH_ADV_TCN_RIDS                 = "open-ils.search:open-ils.search.biblio.tcn";
+var FETCH_CNBROWSE                             = 'open-ils.search:open-ils.search.callnumber.browse';
+var FETCH_CONTAINERS                           = 'open-ils.actor:open-ils.actor.container.retrieve_by_class.authoritative';
+var CREATE_CONTAINER                           = 'open-ils.actor:open-ils.actor.container.create';
+var DELETE_CONTAINER                           = 'open-ils.actor:open-ils.actor.container.full_delete';
+var CREATE_CONTAINER_ITEM              = 'open-ils.actor:open-ils.actor.container.item.create';
+var DELETE_CONTAINER_ITEM              = 'open-ils.actor:open-ils.actor.container.item.delete';
+var FLESH_CONTAINER                            = 'open-ils.actor:open-ils.actor.container.flesh';
+var FLESH_PUBLIC_CONTAINER             = 'open-ils.actor:open-ils.actor.container.public.flesh';
+var UPDATE_CONTAINER                           = 'open-ils.actor:open-ils.actor.container.update';
+var FETCH_COPY                                         = 'open-ils.search:open-ils.search.asset.copy.retrieve';
+var FETCH_FLESHED_COPY                 = 'open-ils.search:open-ils.search.asset.copy.fleshed2.retrieve';
+var CHECK_HOLD_POSSIBLE                        = 'open-ils.circ:open-ils.circ.title_hold.is_possible';
+var UPDATE_HOLD                                        = 'open-ils.circ:open-ils.circ.hold.update';
+var FETCH_COPIES_FROM_VOLUME   = 'open-ils.search:open-ils.search.asset.copy.retrieve_by_cn_label:1';
+var FETCH_VOLUME_BY_INFO               = 'open-ils.search:open-ils.search.call_number.retrieve_by_info'; /* XXX staff method? */
+var FETCH_VOLUME                                       = 'open-ils.search:open-ils.search.asset.call_number.retrieve';
+var FETCH_ISSUANCE                                     = 'open-ils.serial:open-ils.serial.issuance.pub_fleshed.batch.retrieve';
+var FETCH_COPY_LOCATIONS               = 'open-ils.circ:open-ils.circ.copy_location.retrieve.all';
+var FETCH_COPY_NOTES                           = 'open-ils.circ:open-ils.circ.copy_note.retrieve.all';
+var FETCH_COPY_STAT_CATS               = 'open-ils.circ:open-ils.circ.asset.stat_cat_entries.fleshed.retrieve_by_copy';
+
+/* XXX deprecated.  Use ccvm's instead  */
+var FETCH_LIT_FORMS             = 'open-ils.search:open-ils.search.biblio.lit_form_map.retrieve.all';
+var FETCH_ITEM_FORMS            = 'open-ils.search:open-ils.search.biblio.item_form_map.retrieve.all';
+var FETCH_ITEM_TYPES            = 'open-ils.search:open-ils.search.biblio.item_type_map.retrieve.all';
+var FETCH_BIB_LEVELS            = 'open-ils.search:open-ils.search.biblio.bib_level_map.retrieve.all';
+var FETCH_AUDIENCES             = 'open-ils.search:open-ils.search.biblio.audience_map.retrieve.all';
+/* ----------------------------------- */
+
+//var FETCH_HOLD_STATUS                        = 'open-ils.circ:open-ils.circ.hold.status.retrieve';
+var FETCH_HOLD_STATUS                  = 'open-ils.circ:open-ils.circ.hold.queue_stats.retrieve';
+var FETCH_NON_CAT_CIRCS                        = 'open-ils.circ:open-ils.circ.open_non_cataloged_circulation.user';
+var FETCH_NON_CAT_CIRC                 = 'open-ils.circ:open-ils.circ.non_cataloged_circulation.retrieve';
+var FETCH_NON_CAT_TYPES                        = "open-ils.circ:open-ils.circ.non_cat_types.retrieve.all";
+var FETCH_BRE                                          = 'open-ils.search:open-ils.search.biblio.record_entry.slim.retrieve';
+var CHECK_USERNAME                             = 'open-ils.actor:open-ils.actor.username.exists';
+var FETCH_CIRC_BY_ID                           = 'open-ils.circ:open-ils.circ.retrieve';
+var FETCH_MR_DESCRIPTORS               = 'open-ils.search:open-ils.search.metabib.record_to_descriptors';
+var FETCH_HIGHEST_PERM_ORG             = 'open-ils.actor:open-ils.actor.user.perm.highest_org.batch';
+var FETCH_USER_NOTES                           = 'open-ils.actor:open-ils.actor.note.retrieve.all';
+var FETCH_ORG_BY_SHORTNAME             = 'open-ils.actor:open-ils.actor.org_unit.retrieve_by_shortname';
+var FETCH_BIB_IDS_BY_BARCODE = 'open-ils.search:open-ils.search.multi_home.bib_ids.by_barcode';
+var FETCH_ORG_SETTING = 'open-ils.actor:open-ils.actor.ou_setting.ancestor_default';
+var TEST_PEER_BIBS                             = 'open-ils.search:open-ils.search.peer_bibs.test';
+var FETCH_PEER_BIBS                            = 'open-ils.search:open-ils.search.peer_bibs';
+
+/* ---------------------------------------------------------------------------- */
+
+
+/* ---------------------------------------------------------------------------- */
+/* event callback functions. Other functions may be appended to these vars to
+       for added functionality.  */
+
+G.evt                          = {}; /* events container */
+
+function runEvt(scope, name, a, b, c, d, e, f, g) {
+       var evt = G.evt[scope][name];
+       for( var i in evt ) {
+               evt[i](a, b, c, d, e, f, g);    
+       }
+}
+
+/* creates a new event if it doesn't already exist */
+function createEvt(scope, name) {
+       if(!G.evt[scope]) G.evt[scope] = {};
+       if(G.evt[scope][name] == null)
+               G.evt[scope][name] = []; 
+}
+
+function attachEvt(scope, name, action) {
+       createEvt(scope, name);
+       G.evt[scope][name].push(action);
+}
+
+function detachAllEvt(scope, name) {
+       G.evt[scope][name] = [];
+}
+
+
+createEvt("common", "init");                                           /* f() : what happens on page init */
+createEvt("common", "pageRendered");                   /* f() : what happens when the page is done (up to the skin to call this even)*/
+createEvt("common", "unload");                                 /* f() : what happens on window unload (clean memory, etc.)*/
+createEvt("common", "locationChanged");                /* f() : what happens when the location has changed */
+createEvt("common", "locationUpdated");                /* f() : what happens when the location has updated by the code */
+
+createEvt("common", "run");                                            /* f() : make the page do stuff */
+createEvt("result", "idsReceived");                            /* f(ids) */
+createEvt("rresult", "recordDrawn");                   /* f(recordid, linkDOMNode) : after record is drawn, allow others (xul) to plugin actions */
+createEvt("result", "preCollectRecords");              /* f() we're about to go and grab the recs */
+
+createEvt("result", "hitCountReceived");               /* f() : display hit info, pagination, etc. */
+createEvt("result", "recordReceived");                 /* f(mvr, pagePosition, isMr) : display the record*/
+createEvt("result", "recordDrawn");                            /* f(recordid, linkDOMNode) : after record is drawn, allow others (xul) to plugin actions */
+createEvt("result", "copyCountsReceived");     /* f(mvr, pagePosition, copyCountInfo) : display copy counts*/
+createEvt("result", "allRecordsReceived");     /* f(mvrsArray) : add other page stuff, sidebars, etc.*/
+
+createEvt("rdetail", "recordDrawn");                   /* f() : the record has been drawn */
+
+createEvt("common", "loggedIn");                                       /* f() : user has just logged in */
+createEvt("common", "loginCanceled");                                  /* f() : user has just logged in */
+createEvt('result', 'zeroHits');
+createEvt('result', 'lowHits');
+createEvt('rdetail', 'recordRetrieved');                       /* we are about to draw the rdetail page */
+createEvt('common', 'depthChanged');
+createEvt('common', 'holdUpdated'); 
+createEvt('common', 'holdUpdateCanceled'); 
+
+createEvt('rdetail', 'nextPrevDrawn');
+
+
+
+
+
+function CGI() {
+       /* load up the url parameters */
+
+       this._keys = new Array();
+       this.data = new Object();
+
+       var string = location.search.replace(/^\?/,"");
+       this.server_name = location.href.replace(/^https?:\/\/([^\/]+).+$/,"$1");
+
+       var key = ""; 
+       var value = "";
+       var inkey = true;
+       var invalue = false;
+
+       for( var idx = 0; idx!= string.length; idx++ ) {
+
+               var c = string.charAt(idx);
+
+               if( c == "=" )  {
+                       invalue = true;
+                       inkey = false;
+                       continue;
+               } 
+
+               if(c == "&" || c == ";") {
+                       inkey = 1;
+                       invalue = 0;
+                       if( ! this.data[key] ) this.data[key] = [];
+                       this.data[key].push(decodeURIComponent(value));
+                       this._keys.push(key);
+                       key = ""; value = "";
+                       continue;
+               }
+
+               if(inkey) key += c;
+               else if(invalue) value += c;
+       }
+
+       if( ! this.data[key] ) this.data[key] = [];
+       this.data[key].push(decodeURIComponent(value));
+       this._keys.push(key);
+}
+
+/* returns the value for the given param.  If there is only one value for the
+   given param, it returns that value.  Otherwise it returns an array of values
+ */
+CGI.prototype.param = function(p) {
+       if(this.data[p] == null) return null;
+       if(this.data[p].length == 1)
+               return this.data[p][0];
+       return this.data[p];
+}
+
+/* returns an array of param names */
+CGI.prototype.keys = function() {
+       return this._keys;
+}
+
+/* debuggin method */
+CGI.prototype.toString = function() {
+       var string = "";
+       var keys = this.keys();
+
+       for( var k in keys ) {
+               string += keys[k] + " : ";
+               var params = this.param(keys[k]);
+
+               for( var p in params ) {
+                       string +=  params[p] + " ";
+               }
+               string += "\n";
+       }
+       return string;
+}
+
+
+/*
+ * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
+ * Digest Algorithm, as defined in RFC 1321.
+ * Version 2.1 Copyright (C) Paul Johnston 1999 - 2002.
+ * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
+ * Distributed under the BSD License
+ * See http://pajhome.org.uk/crypt/md5 for more info.
+ */
+
+var hexcase = 0;  /* hex output format. 0 - lowercase; 1 - uppercase        */
+var b64pad  = ""; /* base-64 pad character. "=" for strict RFC compliance   */
+var chrsz   = 8;  /* bits per input character. 8 - ASCII; 16 - Unicode      */
+function hex_md5(s){ return binl2hex(core_md5(str2binl(s), s.length * chrsz));}
+function b64_md5(s){ return binl2b64(core_md5(str2binl(s), s.length * chrsz));}
+function str_md5(s){ return binl2str(core_md5(str2binl(s), s.length * chrsz));}
+function hex_hmac_md5(key, data) { return binl2hex(core_hmac_md5(key, data)); }
+function b64_hmac_md5(key, data) { return binl2b64(core_hmac_md5(key, data)); }
+function str_hmac_md5(key, data) { return binl2str(core_hmac_md5(key, data)); }
+function md5_vm_test()
+{
+  return hex_md5("abc") == "900150983cd24fb0d6963f7d28e17f72";
+}
+function core_md5(x, len)
+{
+  /* append padding */
+  x[len >> 5] |= 0x80 << ((len) % 32);
+  x[(((len + 64) >>> 9) << 4) + 14] = len;
+
+  var a =  1732584193;
+  var b = -271733879;
+  var c = -1732584194;
+  var d =  271733878;
+
+  for(var i = 0; i < x.length; i += 16)
+  {
+    var olda = a;
+    var oldb = b;
+    var oldc = c;
+    var oldd = d;
+
+    a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936);
+    d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586);
+    c = md5_ff(c, d, a, b, x[i+ 2], 17,  606105819);
+    b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330);
+    a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897);
+    d = md5_ff(d, a, b, c, x[i+ 5], 12,  1200080426);
+    c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341);
+    b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983);
+    a = md5_ff(a, b, c, d, x[i+ 8], 7 ,  1770035416);
+    d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417);
+    c = md5_ff(c, d, a, b, x[i+10], 17, -42063);
+    b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162);
+    a = md5_ff(a, b, c, d, x[i+12], 7 ,  1804603682);
+    d = md5_ff(d, a, b, c, x[i+13], 12, -40341101);
+    c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290);
+    b = md5_ff(b, c, d, a, x[i+15], 22,  1236535329);
+
+    a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510);
+    d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632);
+    c = md5_gg(c, d, a, b, x[i+11], 14,  643717713);
+    b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302);
+    a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691);
+    d = md5_gg(d, a, b, c, x[i+10], 9 ,  38016083);
+    c = md5_gg(c, d, a, b, x[i+15], 14, -660478335);
+    b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848);
+    a = md5_gg(a, b, c, d, x[i+ 9], 5 ,  568446438);
+    d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690);
+    c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961);
+    b = md5_gg(b, c, d, a, x[i+ 8], 20,  1163531501);
+    a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467);
+    d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784);
+    c = md5_gg(c, d, a, b, x[i+ 7], 14,  1735328473);
+    b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734);
+
+    a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558);
+    d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463);
+    c = md5_hh(c, d, a, b, x[i+11], 16,  1839030562);
+    b = md5_hh(b, c, d, a, x[i+14], 23, -35309556);
+    a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060);
+    d = md5_hh(d, a, b, c, x[i+ 4], 11,  1272893353);
+    c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632);
+    b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640);
+    a = md5_hh(a, b, c, d, x[i+13], 4 ,  681279174);
+    d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222);
+    c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979);
+    b = md5_hh(b, c, d, a, x[i+ 6], 23,  76029189);
+    a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487);
+    d = md5_hh(d, a, b, c, x[i+12], 11, -421815835);
+    c = md5_hh(c, d, a, b, x[i+15], 16,  530742520);
+    b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651);
+
+    a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844);
+    d = md5_ii(d, a, b, c, x[i+ 7], 10,  1126891415);
+    c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905);
+    b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055);
+    a = md5_ii(a, b, c, d, x[i+12], 6 ,  1700485571);
+    d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606);
+    c = md5_ii(c, d, a, b, x[i+10], 15, -1051523);
+    b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799);
+    a = md5_ii(a, b, c, d, x[i+ 8], 6 ,  1873313359);
+    d = md5_ii(d, a, b, c, x[i+15], 10, -30611744);
+    c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380);
+    b = md5_ii(b, c, d, a, x[i+13], 21,  1309151649);
+    a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070);
+    d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379);
+    c = md5_ii(c, d, a, b, x[i+ 2], 15,  718787259);
+    b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551);
+
+    a = safe_add(a, olda);
+    b = safe_add(b, oldb);
+    c = safe_add(c, oldc);
+    d = safe_add(d, oldd);
+  }
+  return Array(a, b, c, d);
+
+}
+function md5_cmn(q, a, b, x, s, t)
+{
+  return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b);
+}
+function md5_ff(a, b, c, d, x, s, t)
+{
+  return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
+}
+function md5_gg(a, b, c, d, x, s, t)
+{
+  return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
+}
+function md5_hh(a, b, c, d, x, s, t)
+{
+  return md5_cmn(b ^ c ^ d, a, b, x, s, t);
+}
+function md5_ii(a, b, c, d, x, s, t)
+{
+  return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
+}
+function core_hmac_md5(key, data)
+{
+  var bkey = str2binl(key);
+  if(bkey.length > 16) bkey = core_md5(bkey, key.length * chrsz);
+
+  var ipad = Array(16), opad = Array(16);
+  for(var i = 0; i < 16; i++)
+  {
+    ipad[i] = bkey[i] ^ 0x36363636;
+    opad[i] = bkey[i] ^ 0x5C5C5C5C;
+  }
+
+  var hash = core_md5(ipad.concat(str2binl(data)), 512 + data.length * chrsz);
+  return core_md5(opad.concat(hash), 512 + 128);
+}
+function safe_add(x, y)
+{
+  var lsw = (x & 0xFFFF) + (y & 0xFFFF);
+  var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
+  return (msw << 16) | (lsw & 0xFFFF);
+}
+function bit_rol(num, cnt)
+{
+  return (num << cnt) | (num >>> (32 - cnt));
+}
+function str2binl(str)
+{
+  var bin = Array();
+  var mask = (1 << chrsz) - 1;
+  for(var i = 0; i < str.length * chrsz; i += chrsz)
+    bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (i%32);
+  return bin;
+}
+function binl2str(bin)
+{
+  var str = "";
+  var mask = (1 << chrsz) - 1;
+  for(var i = 0; i < bin.length * 32; i += chrsz)
+    str += String.fromCharCode((bin[i>>5] >>> (i % 32)) & mask);
+  return str;
+}
+function binl2hex(binarray)
+{
+  var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
+  var str = "";
+  for(var i = 0; i < binarray.length * 4; i++)
+  {
+    str += hex_tab.charAt((binarray[i>>2] >> ((i%4)*8+4)) & 0xF) +
+           hex_tab.charAt((binarray[i>>2] >> ((i%4)*8  )) & 0xF);
+  }
+  return str;
+}
+function binl2b64(binarray)
+{
+  var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+  var str = "";
+  for(var i = 0; i < binarray.length * 4; i += 3)
+  {
+    var triplet = (((binarray[i   >> 2] >> 8 * ( i   %4)) & 0xFF) << 16)
+                | (((binarray[i+1 >> 2] >> 8 * ((i+1)%4)) & 0xFF) << 8 )
+                |  ((binarray[i+2 >> 2] >> 8 * ((i+2)%4)) & 0xFF);
+    for(var j = 0; j < 4; j++)
+    {
+      if(i * 8 + j * 6 > binarray.length * 32) str += b64pad;
+      else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F);
+    }
+  }
+  return str;
+}
+/*
+var stpicopen  = '../../../../images/slimtree/folder.gif';
+var stpicclose = '../../../../images/slimtree/folderopen.gif';
+*/
+var stpicopen  = '../../../../images/slimtree/folder2.gif';
+var stpicclose = '../../../../images/slimtree/folderopen2.gif';
+var stpicblank = '../../../../images/slimtree/page.gif';
+var stpicline  = '../../../../images/slimtree/line.gif';
+var stpicjoin  = '../../../../images/slimtree/join.gif';
+var stpicjoinb = '../../../../images/slimtree/joinbottom.gif';
+
+var stimgopen;
+var stimgclose;
+var stimgblank;
+var stimgline;
+var stimgjoin;
+
+function _apc(root,node) { root.appendChild(node); }
+
+function SlimTree(context, handle, rootimg) { 
+       
+       if(!stimgopen) {
+               stimgopen       = elem('img',{src:stpicopen,border:0, style:'height:13px;width:31px;'});
+               stimgclose      = elem('img',{src:stpicclose,border:0, style:'height:13px;width:31px;'});
+               stimgblank      = elem('img',{src:stpicblank,border:0, style:'height:18px;width:18px;'});
+               stimgline       = elem('img',{src:stpicline,border:0, style:'height:18px;width:18px;'});
+               stimgjoin       = elem('img',{src:stpicjoin,border:0, style:'display:inline;height:18px;width:18px;'});
+       }
+
+       this.context    = context; 
+       this.handle             = handle;
+       this.cache              = new Object();
+       if(rootimg) 
+               this.rootimg = elem('img', 
+                       {src:rootimg,border:0,style:'padding-right: 4px;'});
+}
+
+SlimTree.prototype.addCachedChildren = function(pid) {
+       var child;
+       while( child = this.cache[pid].shift() ) 
+               this.addNode( child.id, child.pid, 
+                       child.name, child.action, child.title );
+       this.cache[pid] = null;
+}
+
+SlimTree.prototype.addNode = function( id, pid, name, action, title, cls ) {
+
+       if( pid != -1 && !$(pid)) {
+               if(!this.cache[pid]) this.cache[pid] = new Array();
+               this.cache[pid].push(
+                       {id:id,pid:pid,name:name,action:action,title:title });
+               return;
+       }
+
+       if(!action)
+               action='javascript:'+this.handle+'.toggle("'+id+'");';
+
+       var actionref;
+       if( typeof action == 'string' )
+               actionref = elem('a',{href:action}, name);
+       else {
+               actionref = elem('a',{href:'javascript:void(0);'}, name);
+               actionref.onclick = action;
+       }
+
+       var div                 = elem('div',{id:id});
+       var topdiv              = elem('div',{style:'vertical-align:middle'});
+       var link                        = elem('a', {id:'stlink_' + id}); 
+       var contdiv             = elem('div',{id:'stcont_' + id});
+
+       if(cls) addCSSClass(actionref, cls);
+
+       //actionref.setAttribute('href',action);
+       if(title) actionref.setAttribute('title',title);
+       else actionref.setAttribute('title',name);
+
+       _apc(topdiv,link);
+       _apc(topdiv,actionref);
+       _apc(div,topdiv);
+       _apc(div,contdiv);
+
+       if( pid == -1 ) { 
+
+               this.rootid = id;
+               _apc(this.context,div);
+               if(this.rootimg) _apc(link,this.rootimg.cloneNode(true));
+               else _apc(link,stimgblank.cloneNode(true));
+
+       } else {
+
+               if(pid == this.rootid) this.open(pid);
+               else this.close(pid);
+               $(pid).setAttribute('haschild','1');
+               _apc(link,stimgblank.cloneNode(true));
+               div.style.paddingLeft = '18px';
+               div.style.backgroundImage = 'url('+stpicjoinb+')';
+               div.style.backgroundRepeat = 'no-repeat';
+               _apc($('stcont_' + pid), div);
+               if (div.previousSibling) stMakePaths(div);
+       }
+       if(this.cache[id]) this.addCachedChildren(id);
+}
+
+function stMakePaths(div) {
+       _apc(div.previousSibling.firstChild,stimgjoin.cloneNode(true));
+       _apc(div.previousSibling.firstChild,div.previousSibling.firstChild.firstChild);
+       _apc(div.previousSibling.firstChild,div.previousSibling.firstChild.firstChild);
+       div.previousSibling.firstChild.firstChild.style.marginLeft = '-18px';
+       div.previousSibling.style.backgroundImage = 'url('+stpicline+')';
+       div.previousSibling.style.backgroundRepeat = 'repeat-y';
+}
+
+SlimTree.prototype.expandAll = function() { this.flex(this.rootid, 'open'); }
+SlimTree.prototype.closeAll = function() { this.flex(this.rootid,'close'); }
+SlimTree.prototype.flex = function(id, type) {
+       if(type=='open') this.open(id);
+       else { if (id != this.rootid) this.close(id); }
+       var n = $('stcont_' + id);
+       for( var c = 0; c != n.childNodes.length; c++ ) {
+               var ch = n.childNodes[c];
+               if(ch.nodeName.toLowerCase() == 'div') {
+                       if($(ch.id).getAttribute('haschild') == '1') 
+                               this.flex(ch.id, type);
+               }
+       }
+}
+
+SlimTree.prototype.toggle = function(id) {
+       if($(id).getAttribute('ostate') == '1') this.open(id);
+       else if($(id).getAttribute('ostate') == '2') this.close(id);
+}
+
+SlimTree.prototype.open = function(id) {
+       if($(id).getAttribute('ostate') == '2') return;
+       var link = $('stlink_' + id);
+       if(!link) return;
+       if(id != this.rootid || !this.rootimg) {
+               removeChildren(link);
+               _apc(link,stimgclose.cloneNode(true));
+       }
+       link.setAttribute('href','javascript:' + this.handle + '.close("'+id+'");');
+       unHideMe($('stcont_' + id));
+       $(id).setAttribute('ostate','2');
+}
+
+SlimTree.prototype.close = function(id) {
+       var link = $('stlink_' + id);
+       if(!link) return;
+       if(id != this.rootid || !this.rootimg) {
+               removeChildren(link);
+               _apc(link,stimgopen.cloneNode(true));
+       }
+       link.setAttribute('href','javascript:' + this.handle + '.open("'+id+'");');
+       hideMe($('stcont_' + id));
+       $(id).setAttribute('ostate','1');
+}
+
+/* - Request ------------------------------------------------------------- */
+
+
+/* define it again here for pages that don't load RemoteRequest */
+function isXUL() { try { if(IAMXUL) return true;}catch(e){return false;}; }
+
+
+var __ilsEvent; /* the last event the occurred */
+
+var DEBUGSLIM;
+function Request(type) {
+
+       var s = type.split(":");
+       if(s[2] == "1" && isXUL()) s[1] += ".staff";
+       this.request = new RemoteRequest(s[0], s[1]);
+       var p = [];
+
+       if(isXUL()) {
+               if(!location.href.match(/^https:/))
+                       this.request.setSecure(false);
+
+       } else {
+
+               if( G.user && G.user.session ) {
+                       /* if the user is logged in, all activity resets the timeout 
+                               This is not entirely accurate in the sense that not all 
+                               requests will reset the server timeout - this should
+                               get close enough, however.
+                       */
+                       var at = getAuthtime();
+                       if(at) new AuthTimer(at).run(); 
+               }
+       }
+
+       for( var x = 1; x!= arguments.length; x++ ) {
+               p.push(arguments[x]);
+               this.request.addParam(arguments[x]);
+       }
+
+       if( getDebug() ) {
+               var str = "";
+               for( var i = 0; i != p.length; i++ ) {
+                       if( i > 0 ) str += ", "
+                       str += js2JSON(p[i]);
+               }
+               _debug('request ' + s[0] + ' ' + s[1] + ' ' + str );
+
+       } else if( DEBUGSLIM ) {
+               _debug('request ' + s[1]);
+       }
+}
+
+Request.prototype.callback = function(cal) {this.request.setCompleteCallback(cal);}
+Request.prototype.send         = function(block){this.request.send(block);}
+Request.prototype.result       = function(){return this.request.getResultObject();}
+
+function showCanvas() {
+       for( var x in G.ui.altcanvas ) {
+               hideMe(G.ui.altcanvas[x]);
+       }
+       hideMe(G.ui.common.loading);
+       unHideMe(G.ui.common.canvas_main);
+       try{G.ui.searchbar.text.focus();}catch(e){}
+}
+
+function swapCanvas(newNode) {
+       for( var x in G.ui.altcanvas ) 
+               hideMe(G.ui.altcanvas[x]);
+
+       hideMe(G.ui.common.loading);
+       hideMe(G.ui.common.canvas_main);
+       unHideMe(newNode);
+}
+
+/* finds the name of the current page */
+var currentPage = null;
+function findCurrentPage() {
+       if(currentPage) return currentPage;
+
+       var pages = [];
+       for( var p in config.page ) pages.push(config.page[p]);
+       pages = pages.sort( function(a,b){ return - (a.length - b.length); } );
+
+       var path = location.pathname;
+       if(!path.match(/.*\.xml$/))
+               path += "index.xml"; /* in case they go to  / */
+
+       var page = null;
+       for( var p = 0; p < pages.length; p++ ) {
+               if( path.indexOf(pages[p]) != -1)
+                       page = pages[p];
+       }
+
+       for( var p in config.page ) {
+               if(config.page[p] == page) {
+                       currentPage = p;
+                       return p;
+               }
+       }
+       return null;
+}
+
+
+/* sets all of the params values  ----------------------------- */
+function initParams() {
+       var cgi = new CGI();    
+
+       /* handle the location var */
+       var org;
+       var loc = cgi.param(PARAM_LOCATION);
+       var lasso = cgi.param(PARAM_LASSO);
+
+    if ( lasso ) {
+               lasso = findOrgLasso( lasso );
+               LASSO = lasso ? lasso.id() : null;
+       }
+
+    if (loc) {
+               org = findOrgUnit(loc);
+               LOCATION = org ? org.id() : null;
+
+               if ( !LOCATION ){
+                       org = findOrgUnit(loc);
+                       LOCATION = org ? org.id() : null;
+               }
+    }
+
+       org = null;
+       loc = cgi.param(PARAM_ORIGLOC);
+       if( loc ) {
+               org = findOrgUnit(loc);
+               if(!org) org = findOrgUnitSN(loc);
+       }
+       ORIGLOC = (org) ? org.id() : null;
+
+
+       DEPTH = parseInt(cgi.param(PARAM_DEPTH));
+       if(isNaN(DEPTH)) DEPTH = null;
+
+
+       FACET           = cgi.param(PARAM_FACET);
+       TERM            = cgi.param(PARAM_TERM);
+       STYPE           = cgi.param(PARAM_STYPE);
+       FORM            = cgi.param(PARAM_FORM);
+       //DEPTH         = parseInt(cgi.param(PARAM_DEPTH));
+       OFFSET  = parseInt(cgi.param(PARAM_OFFSET));
+       COUNT           = parseInt(cgi.param(PARAM_COUNT));
+       HITCOUNT        = parseInt(cgi.param(PARAM_HITCOUNT));
+       MRID            = parseInt(cgi.param(PARAM_MRID));
+       RID             = parseInt(cgi.param(PARAM_RID));
+       AUTHTIME        = parseInt(cgi.param(PARAM_AUTHTIME));
+       ADVTERM = cgi.param(PARAM_ADVTERM);
+       ADVTYPE = cgi.param(PARAM_ADVTYPE);
+       RTYPE           = cgi.param(PARAM_RTYPE);
+       SORT            = cgi.param(PARAM_SORT);
+       SORT_DIR        = cgi.param(PARAM_SORT_DIR);
+       DEBUG           = cgi.param(PARAM_DEBUG);
+       CALLNUM = cgi.param(PARAM_CN);
+       LITFORM = cgi.param(PARAM_LITFORM);
+       ITEMFORM        = cgi.param(PARAM_ITEMFORM);
+       ITEMTYPE        = cgi.param(PARAM_ITEMTYPE);
+       BIBLEVEL        = cgi.param(PARAM_BIBLEVEL);
+       AUDIENCE        = cgi.param(PARAM_AUDIENCE);
+       SEARCHES = cgi.param(PARAM_SEARCHES);
+       LANGUAGE        = cgi.param(PARAM_LANGUAGE);
+       TFORM           = cgi.param(PARAM_TFORM);
+       RDEPTH  = cgi.param(PARAM_RDEPTH);
+    AVAIL   = cgi.param(PARAM_AVAIL);
+    COPYLOCS   = cgi.param(PARAM_COPYLOCS);
+    PUBD_BEFORE = cgi.param(PARAM_PUBD_BEFORE);
+    PUBD_AFTER = cgi.param(PARAM_PUBD_AFTER);
+    PUBD_BETWEEN = cgi.param(PARAM_PUBD_BETWEEN);
+    PUBD_DURING = cgi.param(PARAM_PUBD_DURING);
+
+    
+       /* set up some sane defaults */
+       //if(isNaN(DEPTH))      DEPTH           = 0;
+       if(isNaN(RDEPTH))       RDEPTH  = 0;
+       if(isNaN(OFFSET))       OFFSET  = 0;
+       if(isNaN(COUNT))        COUNT           = 10;
+       if(isNaN(HITCOUNT))     HITCOUNT        = 0;
+       if(isNaN(MRID))         MRID            = 0;
+       if(isNaN(RID))          RID             = 0;
+       if(isNaN(ORIGLOC))      ORIGLOC = 0; /* so we know it hasn't been set */
+       if(isNaN(AUTHTIME))     AUTHTIME        = 0;
+       if(ADVTERM==null)       ADVTERM = "";
+    if(isNaN(AVAIL))    AVAIL = 0;
+}
+
+function clearSearchParams() {
+       TERM        = null;
+       STYPE       = null;
+       FORM        = null;
+       OFFSET      = 0;
+       HITCOUNT    = 0;  
+       ADVTERM     = null;
+       ADVTYPE     = null;
+       MRID        = null;
+       RID         = null;
+       RTYPE       = null;
+       SORT        = null;
+       SORT_DIR    = null;
+       RLIST       = null;
+       CALLNUM     = null;
+       LITFORM     = null;
+       ITEMFORM    = null;
+       ITEMTYPE    = null;
+       BIBLEVEL    = null;
+       AUDIENCE    = null;
+       SEARCHES    = null;
+       LANGUAGE    = null;
+       RDEPTH      = null;
+    AVAIL       = null;
+    COPYLOCS    = null;
+    PUBD_BEFORE = null;
+    PUBD_AFTER  = null;
+    PUBD_BETWEEN = null;
+    PUBD_DURING = null;
+}
+
+
+function initCookies() {
+    dojo.require('dojo.cookie');
+       FONTSIZE = "regular";
+       var font = dojo.cookie(COOKIE_FONT);
+       scaleFonts(font);
+       if(font) FONTSIZE = font;
+       SKIN = dojo.cookie(COOKIE_SKIN);
+    if(findCurrentPage() == HOME)
+        dojo.cookie(COOKIE_SEARCH,null,{'expires':-1});
+}
+
+/* URL param accessors */
+function getTerm(){return TERM;}
+function getFacet(){return FACET;}
+function getStype(){return STYPE;}
+function getLocation(){return LOCATION;}
+function getLasso(){return LASSO;}
+function getDepth(){return DEPTH;}
+function getForm(){return FORM;}
+function getTform(){return TFORM;}
+function getOffset(){return OFFSET;}
+function getDisplayCount(){return COUNT;}
+function getHitCount(){return HITCOUNT;}
+function getMrid(){return MRID;};
+function getRid(){return RID;};
+function getOrigLocation(){return ORIGLOC;}
+function getAuthtime() { return AUTHTIME; }
+function getSearchBarExtras(){return SBEXTRAS;}
+function getFontSize(){return FONTSIZE;};
+function getSkin(){return SKIN;};
+function getAdvTerm(){return ADVTERM;}
+function getAdvType(){return ADVTYPE;}
+function getRtype(){return RTYPE;}
+function getSort(){return SORT;}
+function getSortDir(){return SORT_DIR;}
+function getDebug(){return DEBUG;}
+function getCallnumber() { return CALLNUM; }
+function getLitForm() { return LITFORM; }
+function getItemForm() { return ITEMFORM; }
+function getItemType() { return ITEMTYPE; }
+function getBibLevel() { return BIBLEVEL; }
+function getAudience() { return AUDIENCE; }
+function getSearches() { return SEARCHES; }
+function getLanguage() { return LANGUAGE; }
+function getRdepth() { return RDEPTH; }
+function getAvail() { return AVAIL; }
+function getCopyLocs() { return COPYLOCS; }
+function getPubdBefore() { return PUBD_BEFORE; }
+function getPubdAfter() { return PUBD_AFTER; }
+function getPubdBetween() { return PUBD_BETWEEN; }
+function getPubdDuring() { return PUBD_DURING; }
+
+
+function findBasePath() {
+       var path = location.pathname;
+       if(!path.match(/.*\.xml$/)) path += "index.xml"; 
+       var idx = path.indexOf(config.page[findCurrentPage()]);
+       return path.substring(0, idx);
+}
+
+function findBaseURL(ssl) {
+       var path = findBasePath();
+       var proto = (ssl) ? "https:" : "http:";
+
+       /* strip port numbers.  This is necessary for browsers that
+       send an explicit  <host>:80, 443 - explicit ports
+       break links that need to change ports (e.g. http -> https) */
+       var h = location.host.replace(/:.*/,''); 
+
+       return proto + "//" + h + path;
+}
+
+/*
+function buildISBNSrc(isbn) {
+       return "http://" + location.host + "/jackets/" + isbn;
+}
+*/
+
+function buildImageLink(name, ssl) {
+       return findBaseURL(ssl) + "../../../../images/" + name;
+}
+
+function buildExtrasLink(name, ssl) {
+       return findBaseURL(ssl) + "../../../../extras/" + name;
+}
+
+var consoleService;
+function _debug(str) { 
+       try { dump('dbg: ' + str + '\n'); } catch(e) {} 
+
+       /* potentially useful, but usually just annoying */
+       /*
+       if(!IE) {
+               if(!consoleService) {
+                       try {
+                               netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
+                               this.consoleService = Components.classes['@mozilla.org/consoleservice;1']
+                                       .getService(Components.interfaces.nsIConsoleService);
+                       } catch(e) {}
+               }
+       
+               try {
+                       if(consoleService) {
+                               netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
+                               consoleService.logStringMessage(str + '\n');
+                       }
+               } catch(e){}
+       }
+       */
+}
+
+var forceLoginSSL; // set via Apache env variable
+function  buildOPACLink(args, slim, ssl) {
+
+       if(!args) args = {};
+       var string = "";
+
+    if( ssl == undefined && (
+            location.protocol == 'https:' ||
+            (forceLoginSSL && G.user && G.user.session))) {
+        ssl = true;
+    }
+
+       if(!slim) {
+               string = findBaseURL(ssl);
+               if(args.page) string += config.page[args.page];
+               else string += config.page[findCurrentPage()];
+       }
+
+       /* this may seem unnecessary.. safety precaution for now */
+       /*
+       if( args[PARAM_DEPTH] == null )
+               args[PARAM_DEPTH] = getDepth();
+               */
+
+       string += "?";
+
+       for( var x in args ) {
+               var v = args[x];
+               if(x == "page" || v == null || v == undefined || v+'' == 'NaN' ) continue;
+               if(x == PARAM_OFFSET && v == 0) continue;
+               if(x == PARAM_COUNT && v == 10) continue;
+               if(x == PARAM_FORM && v == 'all' ) continue;
+               if( instanceOf(v, Array) && v.length ) {
+                       for( var i = 0; i < v.length; i++ ) {
+                               string += "&" + x + "=" + encodeURIComponent(v[i]);
+                       }
+               } else {
+                       string += "&" + x + "=" + encodeURIComponent(v);
+               }
+       }
+
+       if(getDebug())
+               string += _appendParam(DEBUG,           PARAM_DEBUG, args, getDebug, string);
+       if(getOrigLocation() != 1) 
+               string += _appendParam(ORIGLOC, PARAM_ORIGLOC, args, getOrigLocation, string);
+       if(getTerm()) 
+               string += _appendParam(TERM,            PARAM_TERM, args, getTerm, string);
+       if(getFacet()) 
+               string += _appendParam(FACET,           PARAM_FACET, args, getFacet, string);
+       if(getStype()) 
+               string += _appendParam(STYPE,           PARAM_STYPE, args, getStype, string);
+       if(getLocation() != 1) 
+               string += _appendParam(LOCATION, PARAM_LOCATION, args, getLocation, string);
+       if(getLasso() != null) 
+               string += _appendParam(LASSO, PARAM_LASSO, args, getLasso, string);
+       if(getDepth() != null) 
+               string += _appendParam(DEPTH,           PARAM_DEPTH, args, getDepth, string);
+       if(getForm() && (getForm() != 'all') ) 
+               string += _appendParam(FORM,            PARAM_FORM, args, getForm, string);
+       if(getTform() && (getTform() != 'all') ) 
+               string += _appendParam(TFORM,           PARAM_TFORM, args, getTform, string);
+       if(getOffset() != 0) 
+               string += _appendParam(OFFSET,  PARAM_OFFSET, args, getOffset, string);
+       if(getDisplayCount() != 10) 
+               string += _appendParam(COUNT,           PARAM_COUNT, args, getDisplayCount, string);
+       if(getHitCount()) 
+               string += _appendParam(HITCOUNT, PARAM_HITCOUNT, args, getHitCount, string);
+       if(getMrid())
+               string += _appendParam(MRID,            PARAM_MRID, args, getMrid, string);
+       if(getRid())
+               string += _appendParam(RID,             PARAM_RID, args, getRid, string);
+       if(getAuthtime())
+               string += _appendParam(AUTHTIME,        PARAM_AUTHTIME, args, getAuthtime, string);
+       if(getAdvTerm())
+               string += _appendParam(ADVTERM, PARAM_ADVTERM, args, getAdvTerm, string);
+       if(getAdvType())
+               string += _appendParam(ADVTYPE, PARAM_ADVTYPE, args, getAdvType, string);
+       if(getRtype())
+               string += _appendParam(RTYPE,           PARAM_RTYPE, args, getRtype, string);
+       if(getItemForm())
+               string += _appendParam(ITEMFORM,        PARAM_ITEMFORM, args, getItemForm, string);
+       if(getItemType())
+               string += _appendParam(ITEMTYPE,        PARAM_ITEMTYPE, args, getItemType, string);
+       if(getBibLevel())
+               string += _appendParam(BIBLEVEL,        PARAM_BIBLEVEL, args, getBibLevel, string);
+       if(getLitForm())
+               string += _appendParam(LITFORM, PARAM_LITFORM, args, getLitForm, string);
+       if(getAudience())
+               string += _appendParam(AUDIENCE,        PARAM_AUDIENCE, args, getAudience, string);
+       if(getSearches())
+               string += _appendParam(SEARCHES,        PARAM_SEARCHES, args, getSearches, string);
+       if(getLanguage())
+               string += _appendParam(LANGUAGE,        PARAM_LANGUAGE, args, getLanguage, string);
+       if(getRdepth() != null)
+               string += _appendParam(RDEPTH,  PARAM_RDEPTH, args, getRdepth, string);
+       if(getSort() != null)
+               string += _appendParam(SORT,    PARAM_SORT, args, getSort, string);
+       if(getSortDir() != null)
+               string += _appendParam(SORT_DIR,        PARAM_SORT_DIR, args, getSortDir, string);
+       if(getAvail())
+               string += _appendParam(AVAIL, PARAM_AVAIL, args, getAvail, string);
+       if(getCopyLocs())
+               string += _appendParam(COPYLOCS, PARAM_COPYLOCS, args, getCopyLocs, string);
+    if(getPubdBefore())
+               string += _appendParam(PUBD_BEFORE, PARAM_PUBD_BEFORE, args, getPubdBefore, string);
+    if(getPubdAfter())
+               string += _appendParam(PUBD_AFTER, PARAM_PUBD_AFTER, args, getPubdAfter, string);
+    if(getPubdBetween())
+               string += _appendParam(PUBD_BETWEEN, PARAM_PUBD_BETWEEN, args, getPubdBetween, string);
+    if(getPubdDuring())
+               string += _appendParam(PUBD_DURING, PARAM_PUBD_DURING, args, getPubdDuring, string);
+
+
+       return string.replace(/\&$/,'').replace(/\?\&/,"?");    
+}
+
+var xx = 1;
+function _appendParam( fieldVar, fieldName, overrideArgs, getFunc, string ) {
+
+       var ret = "";
+
+       if(     fieldVar != null && 
+                       (fieldVar +'' != 'NaN') && 
+                       overrideArgs[fieldName] == null &&
+                       getFunc() != null &&
+                       getFunc()+'' != '' ) {
+
+               ret = "&" + fieldName + "=" + encodeURIComponent(getFunc());
+       }
+
+       return ret;
+}
+
+/* ----------------------------------------------------------------------- */
+function cleanISBN(isbn) {
+   if(isbn) {
+      isbn = isbn.toString().replace(/^\s+/,"");
+      var idx = isbn.indexOf(" ");
+      if(idx > -1) { isbn = isbn.substring(0, idx); }
+   } else isbn = "";
+   return isbn;
+}       
+
+
+/* builds a link that goes to the title listings for a metarecord */
+function buildTitleLink(rec, link) {
+       if(!rec) return;
+       link.appendChild(text(normalize(truncate(rec.title(), 65))));
+       var args = {};
+       args.page = RRESULT;
+       args[PARAM_OFFSET] = 0;
+       args[PARAM_MRID] = rec.doc_id();
+       args[PARAM_RTYPE] = RTYPE_MRID;
+    var linkText = link.innerHTML; // IE
+       link.setAttribute("href", buildOPACLink(args));
+    link.innerHTML = linkText; // IE
+}
+
+function buildTitleDetailLink(rec, link) {
+       if(!rec) return;
+       link.appendChild(text(normalize(truncate(rec.title(), 65))));
+       var args = {};
+       args.page = RDETAIL;
+       args[PARAM_RID] = rec.doc_id();
+    // in IE, if the link text contains a '@', it replaces the innerHTML text 
+    // with the value of the href attribute.  Wait, what?  Yes.  Capture the
+    // innerHTML and put it back into place after the href is set
+    var linkText = link.innerHTML; // IE
+       link.setAttribute("href", buildOPACLink(args));
+    link.innerHTML = linkText; // IE
+}
+
+/* 'type' is one of STYPE_AUTHOR, STYPE_SUBJECT, ... found in config.js 
+       'trunc' is the number of characters to show in the string, defaults to 65 */
+function buildSearchLink(type, string, linknode, trunc) {
+       if(!trunc) trunc = 65;
+       var args = {};
+       if( SHOW_MR_DEFAULT || findCurrentPage() == MRESULT ) {
+               args.page = MRESULT;
+       } else {
+               args.page = RRESULT;
+               args[PARAM_RTYPE] = type;
+       }
+       args[PARAM_OFFSET] = 0;
+       args[PARAM_TERM] = string;
+       args[PARAM_STYPE] = type;
+       linknode.appendChild(text(normalize(truncate(string, trunc))));
+       linknode.setAttribute("href", buildOPACLink(args));
+}
+
+function setSessionCookie(ses) {
+       dojo.cookie(COOKIE_SES, ses);
+}
+
+
+
+/* ----------------------------------------------------------------------- */
+/* user session handling */
+/* ----------------------------------------------------------------------- */
+/* session is the login session.  If no session is provided, we attempt
+       to find one in the cookies.  If 'force' is true we retrieve the 
+       user from the server even if there is already a global user present.
+       if ses != G.user.session, we also force a grab */
+function grabUser(ses, force) {
+
+    _debug("grabUser auth token = " + ses);
+       if(!ses && isXUL()) {
+               stash = fetchXULStash();
+               ses = stash.session.key
+               _debug("stash auth token = " + ses);
+       }
+
+       if(!ses) {
+               ses = dojo.cookie(COOKIE_SES);
+               /* https cookies don't show up in http servers.. */
+               _debug("cookie auth token = " + ses);
+       }
+
+       if(!ses) return false;
+
+       if(!force) 
+               if(G.user && G.user.session == ses)
+                       return G.user;
+
+       /* first make sure the session is valid */
+       var request = new Request(FETCH_SESSION, ses);
+       request.request.alertEvent = false;
+       request.send(true);
+       var user = request.result();
+
+       if(!user || user.textcode == 'NO_SESSION') {
+
+        if(isXUL()) {
+            dojo.require('openils.XUL');
+            dump('getNewSession in opac_utils.js\n');
+            openils.XUL.getNewSession( 
+                function(success, authtoken) { 
+                    if(success) {
+                        ses = authtoken;
+                        var request = new Request(FETCH_SESSION, ses);
+                        request.request.alertEvent = false;
+                        request.send(true);
+                        user = request.result();
+                    }
+                }
+            );
+        }
+
+           if(!user || user.textcode == 'NO_SESSION') {
+                   doLogout();
+                   return false; /* unable to grab the session */
+        }
+       }
+
+       if( !(typeof user == 'object' && user._isfieldmapper) ) {
+               doLogout();
+               return false;
+       }
+
+       G.user = user;
+       G.user.fleshed = false;
+       G.user.session = ses;
+       setSessionCookie(ses);
+
+       grabUserPrefs();
+       if(G.user.prefs['opac.hits_per_page'])
+               COUNT = parseInt(G.user.prefs['opac.hits_per_page']);
+
+       if(G.user.prefs[PREF_DEF_FONT]) 
+               setFontSize(G.user.prefs[PREF_DEF_FONT]);
+
+       var at = getAuthtime();
+       //if(isXUL()) at = xulG['authtime'];
+
+       if(at && !isXUL()) new AuthTimer(at).run(); 
+       return G.user;
+}
+
+
+/* sets the 'prefs' field of the user object to their preferences 
+       and returns the preferences */
+function grabUserPrefs(user, force) {
+       if(user == null) user = G.user;
+       if(!force && user.prefs) return user.prefs;     
+       var req = new Request(FETCH_USER_PREFS, G.user.session, user.id());
+       req.send(true);
+       user.prefs = req.result();
+       return user.prefs;
+}
+
+function grabFleshedUser() {
+
+       if(!G.user || !G.user.session) {
+               grabUser();     
+               if(!G.user || !G.user.session) return null;
+       }
+
+       if(G.user.fleshed) return G.user;
+
+   var req = new Request(FETCH_FLESHED_USER, G.user.session);
+       req.send(true);
+
+       G.user = req.result();
+
+       if(!G.user || G.user.length == 0) { 
+               dojo.cookie(COOKIE_SES,null,{'expires':-1});
+               G.user = null; return false; 
+       }
+
+       G.user.session = ses;
+       G.user.fleshed = true;
+
+       setSessionCookie(ses);
+       return G.user;
+}
+
+function checkUserSkin(new_skin) {
+
+       return; /* XXX do some debugging with this... */
+
+       var user_skin = getSkin();
+       var cur_skin = grabSkinFromURL();
+
+       if(new_skin) user_skin = new_skin;
+
+       if(!user_skin) {
+
+               if(grabUser()) {
+                       if(grabUserPrefs()) {
+                               user_skin = G.user.prefs["opac.skin"];
+                               dojo.cookie( COOKIE_SKIN, user_skin, { 'expires' : 365 } );
+                       }
+               }
+       }
+
+       if(!user_skin) return;
+
+       if( cur_skin != user_skin ) {
+               var url = buildOPACLink();
+               goTo(url.replace(cur_skin, user_skin));
+       }
+}
+
+function updateUserSetting(setting, value, user) {
+       if(user == null) user = G.user;
+       var a = {};
+       a[setting] = value;
+       var req = new Request( UPDATE_USER_PREFS, user.session, a );
+       req.send(true);
+       return req.result();
+}
+
+function commitUserPrefs() {
+       var req = new Request( 
+               UPDATE_USER_PREFS, G.user.session, null, G.user.prefs );
+       req.send(true);
+       return req.result();
+}
+
+function grabSkinFromURL() {
+       var path = findBasePath();
+       path = path.replace("/xml/", "");
+       var skin = "";
+       for( var i = path.length - 1; i >= 0; i-- ) {
+               var ch = path.charAt(i);
+               if(ch == "/") break;
+               skin += ch;
+       }
+
+       var skin2 = "";
+       for( i = skin.length - 1; i >= 0; i--)
+               skin2 += skin.charAt(i);
+
+       return skin2;
+}
+
+
+/* returns a fleshed G.user on success, false on failure */
+function doLogin(suppressEvents) {
+
+       abortAllRequests();
+
+       var uname = G.ui.login.username.value;
+       var passwd = G.ui.login.password.value; 
+
+       var init_request = new Request( LOGIN_INIT, uname );
+   init_request.send(true);
+   var seed = init_request.result();
+
+   if( ! seed || seed == '0') {
+      alert( "Error Communicating with Authentication Server" );
+      return null;
+   }
+
+       var args = {
+               password : hex_md5(seed + hex_md5(passwd)), 
+               type            : "opac", 
+               org             : getOrigLocation()
+       };
+
+    r = fetchOrgSettingDefault(getLocation(), 'opac.barcode_regex');
+    if(r) REGEX_BARCODE = new RegExp(r);
+    
+    if( uname.match(REGEX_BARCODE) ) args.barcode = uname;
+       else args.username = uname;
+
+   var auth_request = new Request( LOGIN_COMPLETE, args );
+
+       auth_request.request.alertEvent = false;
+   auth_request.send(true);
+   var auth_result = auth_request.result();
+
+       if(!auth_result) {
+               alertId('patron_login_failed');
+               return null;
+       }
+
+       if( checkILSEvent(auth_result) ) {
+
+               if( auth_result.textcode == 'PATRON_INACTIVE' ) {
+                       alertId('patron_inactive_alert');
+                       return;
+               }
+
+               if( auth_result.textcode == 'PATRON_CARD_INACTIVE' ) {
+                       alertId('patron_card_inactive_alert');
+                       return;
+               }
+
+               if( auth_result.textcode == 'LOGIN_FAILED' || 
+                               auth_result.textcode == 'PERM_FAILURE' ) {
+                       alertId('patron_login_failed');
+                       return;
+               }
+       }
+
+
+       AUTHTIME = parseInt(auth_result.payload.authtime);
+       var u = grabUser(auth_result.payload.authtoken, true);
+       if(u && ! suppressEvents) 
+               runEvt( "common", "locationChanged", u.ws_ou(), findOrgDepth(u.ws_ou()) );
+
+       checkUserSkin();
+
+       return u;
+}
+
+function doLogout() {
+
+       /* cancel everything else */
+       abortAllRequests();
+
+       /* be nice and delete the session from the server */
+       if(G.user && G.user.session) { 
+               var req = new Request(LOGIN_DELETE, G.user.session);
+      req.send(true);
+               try { req.result(); } catch(E){}
+    }
+
+       G.user = null;
+
+       /* remove any cached data */
+    dojo.require('dojo.cookie');
+    dojo.cookie(COOKIE_SES, null, {expires:-1});
+    dojo.cookie(COOKIE_RIDS, null, {expires:-1});
+    dojo.cookie(COOKIE_SKIN, null, {expires:-1});
+    dojo.cookie(COOKIE_SEARCH, null, {expires:-1});
+
+
+       checkUserSkin("default");
+       COUNT = 10;
+
+
+       var args = {};
+       args[PARAM_TERM] = "";
+       args[PARAM_LOCATION] = getOrigLocation();
+    args[PARAM_DEPTH] = findOrgDepth(getOrigLocation() || globalOrgTree);
+       args.page = "home";
+
+       
+       var nored = false;
+       try{ if(isFrontPage) nored = true; } catch(e){nored = false;}
+       if(!nored) goTo(buildOPACLink(args, false, false));
+}
+
+
+function hideMe(obj) { addCSSClass(obj, config.css.hide_me); } 
+function unHideMe(obj) { removeCSSClass(obj, config.css.hide_me); }
+
+
+/* ----------------------------------------------------------------------- */
+/* build the org tree */
+/* ----------------------------------------------------------------------- */
+function drawOrgTree() {
+       //setTimeout( 'buildOrgSelector(G.ui.common.org_tree, orgTreeSelector);', 10 );
+       setTimeout( 'buildOrgSelector(G.ui.common.org_tree, orgTreeSelector);', 1 );
+}
+
+var checkOrgHiding_cached = false;
+var checkOrgHiding_cached_context_org;
+var checkOrgHiding_cached_depth;
+function checkOrgHiding() {
+    if (isXUL()) {
+        return false; // disable org hiding for staff client
+    }
+    var context_org = getOrigLocation() || globalOrgTree.id();
+    var depth;
+    if (checkOrgHiding_cached) {
+        if (checkOrgHiding_cached_context_org != context_org) {
+            checkOrgHiding_cached_context_org = context_org;
+            checkOrgHiding_cached_depth = undefined;
+            checkOrgHiding_cached = false;
+        } else {
+            depth = checkOrgHiding_cached_depth;
+        }
+    } else {
+        depth = fetchOrgSettingDefault( context_org, 'opac.org_unit_hiding.depth');
+        checkOrgHiding_cached_depth = depth;
+        checkOrgHiding_cached_context_org = context_org;
+        checkOrgHiding_cached = true;
+    }
+    if ( findOrgDepth( context_org ) < depth ) {
+        return false; // disable org hiding if Original Location doesn't make sense with setting depth (avoids disjointed org selectors)
+    }
+    if (depth) {
+        return { 'org' : findOrgUnit(context_org), 'depth' : depth };
+    } else {
+        return false;
+    }
+}
+
+var orgTreeSelector;
+function buildOrgSelector(node) {
+       var tree = new SlimTree(node,'orgTreeSelector');
+       orgTreeSelector = tree;
+       var orgHiding = checkOrgHiding();
+       for( var i in orgArraySearcher ) { 
+               var node = orgArraySearcher[i];
+               if( node == null ) continue;
+               if(!isXUL() && !isTrue(node.opac_visible())) continue; 
+               if (orgHiding) {
+                       if ( ! orgIsMine( orgHiding.org, node, orgHiding.depth ) ) {
+                               continue;
+                       }
+               }
+               if(node.parent_ou() == null) {
+                       tree.addNode(node.id(), -1, node.name(), 
+                               "javascript:orgSelect(" + node.id() + ");", node.name());
+               } else {
+                       if (orgHiding && orgHiding.depth == findOrgDepth(node)) {
+                               tree.addNode(node.id(), -1, node.name(), 
+                                       "javascript:orgSelect(" + node.id() + ");", node.name());
+                       } else {
+                               tree.addNode(node.id(), node.parent_ou(), node.name(), 
+                                       "javascript:orgSelect(" + node.id() + ");", node.name());
+                       }
+               }
+       }
+       hideMe($('org_loading_div'));
+       unHideMe($('org_selector_tip'));
+       return tree;
+}
+
+function orgSelect(id) {
+       showCanvas();
+       runEvt("common", "locationChanged", id, findOrgDepth(id) );
+
+
+       var loc = findOrgLasso(getLasso());
+       if (!loc) loc = findOrgUnit(id);
+
+       removeChildren(G.ui.common.now_searching);
+       G.ui.common.now_searching.appendChild(text(loc.name()));
+}
+
+function setFontSize(size) {
+       scaleFonts(size);
+       dojo.cookie(COOKIE_FONT, size, { 'expires' : 365});
+}
+
+var resourceFormats = [
+   "text",
+   "moving image",
+   "sound recording", "software, multimedia",
+   "still image",
+   "cartographic",
+   "mixed material",
+   "notated music",
+   "three dimensional object" ];
+
+
+function modsFormatToMARC(format) {
+   switch(format) {
+      case "text":
+         return "at";
+      case "moving image":
+         return "g";
+      case "sound recording":
+         return "ij";
+      case "sound recording-nonmusical":
+         return "i";
+      case "sound recording-musical":
+         return "j";
+      case "software, multimedia":
+         return "m";
+      case "still image":
+         return "k";
+      case "cartographic":
+         return "ef";
+      case "mixed material":
+         return "op";
+      case "notated music":
+         return "cd";
+      case "three dimensional object":
+         return "r";
+   }
+   return "at";
+}
+
+
+function MARCFormatToMods(format) {
+   switch(format) {
+      case "a":
+      case "t":
+         return "text";
+      case "g":
+         return "moving image";
+      case "i":
+         return "sound recording-nonmusical";
+      case "j":
+         return "sound recording-musical";
+      case "m":
+         return "software, multimedia";
+      case "k":
+         return "still image";
+      case "e":
+      case "f":
+         return "cartographic";
+      case "o":
+      case "p":
+         return "mixed material";
+      case "c":
+      case "d":
+         return "notated music";
+      case "r":
+         return "three dimensional object";
+   }
+   return "text";
+}
+
+function MARCTypeToFriendly(format) {
+       var words = $('format_words');
+       switch(format) {
+               case 'a' :
+               case 't' : return $n(words, 'at').innerHTML;
+               default:
+                       var node = $n(words,format);
+                       if( node ) return node.innerHTML;
+       }
+       return "";
+}
+
+function setResourcePic( img, resource ) {
+       img.setAttribute( "src", "../../../../images/tor/" + resource + ".jpg");
+       img.title = resource;
+}
+
+
+
+function msg( text ) {
+       try { alert( text ); } catch(e) {}
+}
+
+function findRecord(id,type) {
+       try {
+               for( var i = 0; i != recordsCache.length; i++ ) {
+                       var rec = recordsCache[i];
+                       if( rec && rec.doc_id() == id ) return rec;
+               }
+       } catch(E){}
+       var meth = FETCH_RMODS
+       if(type == 'M') meth = FETCH_MRMODS;
+       var req = new Request(meth, id);
+       req.request.alertEvent = false;
+       req.send(true);
+       var res = req.result();
+       if( checkILSEvent(res) ) return null; 
+       return res;
+}
+
+function Timer(name, node){
+       this.name = name;
+       this.count = 1;
+       this.node = node;
+}
+Timer.prototype.start = 
+       function(){_timerRun(this.name);}
+Timer.prototype.stop = 
+       function(){this.done = true;}
+function _timerRun(tname) {
+       var _t;
+       eval('_t='+tname);
+       if(_t.done) return;
+       if(_t.count > 100) return;
+       var str = ' . ';
+       if( (_t.count % 5) == 0 ) 
+               str = _t.count / 5;
+       _t.node.appendChild(text(str));
+       setTimeout("_timerRun('"+tname+"');", 200);
+       _t.count++;
+}
+
+function checkILSEvent(obj) {
+       if (obj && typeof obj == 'object' && typeof obj.ilsevent != 'undefined') {
+        if (obj.ilsevent === '') {
+            return true;
+        } else if ( obj.ilsevent != null && obj.ilsevent != 0 ) {
+            return parseInt(obj.ilsevent);
+        }
+    }
+       return null;
+}
+
+
+function alertILSEvent(evt, msg) {
+   if(!msg) msg = "";
+       if(msg)
+               alert(msg +'\n' + evt.textcode + '\n' + evt.desc );
+       else 
+               alert(evt.textcode + '\n' + evt.desc );
+}
+
+
+var __authTimer;
+function AuthTimer(time) { 
+       this.time = (time - LOGOUT_WARNING_TIME) * 1000; 
+       if(__authTimer) 
+               try {clearTimeout(__authTimer.id)} catch(e){}
+       __authTimer = this;
+}
+
+AuthTimer.prototype.run = function() {
+       this.id = setTimeout('_authTimerAlert()', this.time);
+}
+
+function _authTimerAlert() {
+       alert( $('auth_session_expiring').innerHTML );
+       if(!grabUser(null, true)) doLogout();
+}
+
+
+function grabUserByBarcode( authtoken, barcode ) {
+       var req = new Request( FETCH_USER_BYBARCODE, authtoken, barcode );
+       req.send(true);
+       return req.result();
+}
+
+
+function goHome() {
+       goTo(buildOPACLink({page:HOME}));
+}
+
+
+function buildOrgSel(selector, org, offset, namecol) {
+    if(!namecol) namecol = 'name';
+    if(!isXUL() && !isTrue(org.opac_visible())) return;
+       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++ )
+                   buildOrgSel( selector, kids[c], offset, namecol);
+    }
+}
+
+function buildMergedOrgSel(selector, org_list, offset, namecol) {
+    if(!namecol) namecol = 'name';
+    for(var i = 0; i < org_list.length; i++) {
+        var org = findOrgUnit(org_list[i]);
+       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++ )
+                       buildOrgSel( selector, kids[c], offset, namecol);
+        }
+    }
+}
+
+
+function parseForm(form) {
+       if(!form) return {};
+
+       var it = form.replace(/-\w+$/,"");
+       var itf = null;
+       var item_form;
+       var item_type;
+
+       if(form.match(/-/)) itf = form.replace(/^\w+-/,"");
+
+       if(it) {
+               item_type = [];
+               for( var i = 0; i < it.length; i++ ) 
+                       item_type.push( it.charAt(i) );
+       }
+
+       if(itf) {
+               item_form = [];
+               for( var i = 0; i < itf.length; i++ ) 
+                       item_form.push( itf.charAt(i) );
+       }
+
+       return {item_type: item_type, item_form:item_form};
+}
+
+
+function isTrue(x) { return ( x && x != "0" && !(x+'').match(/^f$/i) ); }
+
+function fetchPermOrgs() {
+       var a = []; /* Q: why does arguments come accross as an object and not an array? A: because arguments is a special object, a collection */
+
+       for( var i = 0; i < arguments.length; i++ ) 
+               a.push(arguments[i])
+
+       var preq = new Request(FETCH_HIGHEST_PERM_ORG, 
+               G.user.session, G.user.id(), a );
+       preq.send(true);
+       return preq.result();
+}
+
+
+function print_tabs(t) {
+       var r = '';
+       for (var j = 0; j < t; j++ ) { r = r + "  "; }
+       return r;
+}
+function formatJSON(s) {
+       var r = ''; var t = 0;
+       for (var i in s) {
+               if (s[i] == '{' || s[i] == '[' ) {
+                       r = r + s[i] + "\n" + print_tabs(++t);
+               } else if (s[i] == '}' || s[i] == ']') {
+                       t--; r = r + "\n" + print_tabs(t) + s[i];
+               } else if (s[i] == ',') {
+                       r = r + s[i] + "\n" + print_tabs(t);
+               } else {
+                       r = r + s[i];
+               }
+       }
+       return r;
+}
+/* ------------------------------------------------------------------------------------------------------ */
+/* org tree utilities */
+/* ------------------------------------------------------------------------------------------------------ */
+
+function fetchOrgSettingDefault(orgId, name) {
+    var req = new Request(FETCH_ORG_SETTING, orgId, name);
+    req.send(true);
+    var res = req.result();
+    return (res) ? res.value : null;
+}
+
+function fetchBatchOrgSetting(orgId, nameList, onload) {
+    var req = new Request(
+        'open-ils.actor:open-ils.actor.ou_setting.ancestor_default.batch', orgId, nameList);
+    if(onload) {
+        req.callback(function(r) { onload(r.getResultObject()); });
+        req.send();
+    } else {
+        req.send(true);
+        return req.result();
+    }
+}
+
+
+/* takes an org unit or id and return the numeric depth */
+function findOrgDepth(org_id_or_node) {
+       var org = findOrgUnit(org_id_or_node);
+       if(!org) return -1;
+       var type = findOrgType(org.ou_type());
+       if(type) return type.depth();
+       return -1;
+}
+
+function findOrgTypeFromDepth(depth) {
+       if( depth == null ) return null;
+       for( var type = 0; type < globalOrgTypes.length; type++ ) {
+               var t = globalOrgTypes[type];
+               if( t.depth() == depth ) return t;
+       }
+}
+
+/* takes the org type id from orgunit.ou_type() field and returns
+       the org type object */
+function findOrgType(type_id) {
+       if(typeof type_id == 'object') return type_id;
+       for(var type = 0; type < globalOrgTypes.length; type++) {
+               var t =globalOrgTypes[type]; 
+               if( t.id() == type_id || t.id() == parseInt(type_id) ) 
+                       return t;
+       }
+       return null;
+}
+
+
+/* returns an org unit by id.  if an object is passed in as the id,
+       then the object is assumed to be an org unit and is returned */
+function findOrgUnit(org_id) {
+       return (typeof org_id == 'object') ? org_id : orgArraySearcher[org_id];
+}
+
+function findOrgLasso(lasso_id) {
+       if (typeof lasso_id == 'object') return lasso_id;
+    for (var i = 0; i < _lasso.length; i++) {
+        if (_lasso[i].id() == lasso_id) return _lasso[i];
+    }
+    return null;
+}
+
+var orgArraySearcherSN = {};
+function findOrgUnitSN(shortname) {
+       if (typeof shortname == 'object') return shortname;
+       if( orgArraySearcherSN[shortname] ) return orgArraySearcherSN[shortname];
+       _debug("fetching org by shortname "+shortname);
+       var req = new Request(FETCH_ORG_BY_SHORTNAME, shortname);
+       req.request.alertEvent = false;
+       req.send(true);
+       return req.result();
+}
+
+
+/* builds a trail from the top of the org tree to the node provide.
+       basically fleshes out 'my orgs' 
+       Returns an array of [org0, org1, ..., myorg] */
+function orgNodeTrail(node) {
+       var na = new Array();
+       while( node ) {
+               na.push(node);
+               node = findOrgUnit(node.parent_ou());
+       }
+       return na.reverse();
+}
+
+function findSiblingOrgs(node) { return findOrgUnit(node.parent_ou()).children(); }
+
+/* true if 'org' is 'me' or a child of mine, or optionally, a child of an ancestor org within the specified depth */
+function orgIsMine(me, org, depth) {
+       if(!me || !org) {
+               return false;
+       }
+       if(me.id() == org.id()) {
+               return true;
+       }
+       if (depth) {
+               while (depth < findOrgDepth(me)) {
+                       me = findOrgUnit( me.parent_ou() );
+               }
+               if(me.id() == org.id()) {
+                       return true;
+               }
+       }
+       var kids = me.children();
+       for( var i = 0; kids && i < kids.length; i++ ) {
+               if(orgIsMine(kids[i], org, false)) {
+                       return true;
+               }
+
+       }
+       return false;
+}
+
+function orgIsMineFromSet(meList, org) {
+    org = findOrgUnit(org);
+    for(var i = 0; i < meList.length; i++) {
+        if(orgIsMine(findOrgUnit(meList[i]), org))
+            return true;
+    }
+    return false;
+}
+
+var orgArraySearcher = {};
+var globalOrgTree;
+for (var i = 0; i < _l.length; i++) {
+       var x = new aou();
+       x.id(_l[i][0]);
+       x.ou_type(_l[i][1]);
+       x.parent_ou(_l[i][2]);
+       x.name(_l[i][3]);
+    x.opac_visible(_l[i][4]);
+    x.shortname(_l[i][5]);
+       orgArraySearcher[x.id()] = x;
+}
+for (var i in orgArraySearcher) {
+       var x = orgArraySearcher[i];
+       if (x.parent_ou() == null || x.parent_ou() == '') {
+               globalOrgTree = x;
+               continue;
+       } 
+
+       var par = findOrgUnit(x.parent_ou());
+       if (!par.children()) par.children(new Array());
+       par.children().push(x);
+}
+
+function _tree_killer () {
+       for (var i in orgArraySearcher) {
+               x=orgArraySearcher[i];
+               x.children(null);
+               x.parent_ou(null);
+               orgArraySearcher[i]=null;
+       }
+       globalOrgTree = null;
+       orgArraySearcher = null;
+       globalOrgTypes = null;
+}
+
+
+
+var XML_HTTP_GATEWAY = "osrf-gateway-v1";
+var XML_HTTP_SERVER = "";
+
+
+/* This object is thrown when network failures occur */
+function NetworkFailure(stat, url) { 
+       this._status = stat; 
+       this._url = url;
+}
+
+NetworkFailure.prototype.status = function() { return this._status; }
+NetworkFailure.prototype.url = function() { return this._url; }
+NetworkFailure.prototype.toString = function() { 
+       return "Network Failure: status = " + this.status() +'\n'+this.url(); 
+}
+
+
+
+function isXUL() { try { if(IAMXUL) return true;}catch(e){return false;}; }
+var _allrequests = {};
+
+// If the legacy JSON gateway is needed by the staff client, uncomment this
+/* 
+if(isXUL()) {
+    XML_HTTP_GATEWAY = 'gateway';
+}
+*/
+
+function cleanRemoteRequests() {
+       for( var i in _allrequests ) 
+               destroyRequest(_allrequests[i]);
+}
+
+function abortAllRequests() {
+       for( var i in _allrequests ) {
+               var r = _allrequests[i];
+               if(r) { 
+                       r.abort();
+                       destroyRequest(r);
+               }
+       }
+}
+
+function destroyRequest(r) {
+       if(r == null) return;
+
+       if( r.xmlhttp ) {
+               r.xmlhttp.onreadystatechange = function(){};
+               r.xmlhttp = null;
+       }
+
+       r.callback                              = null;
+       r.userdata                              = null;
+       _allrequests[r.id]      = null;
+}
+
+/* ----------------------------------------------------------------------- */
+/* Request object */
+var rrId = 0;
+function RemoteRequest( service, method ) {
+
+       /* dojo is currently only available in the OPAC */
+       try {
+               /* We want OpenSRF.locale for xx-YY format */
+               this.locale     = OpenSRF.locale;
+       }
+       catch (e) {
+               this.locale = null;
+       }
+       this.service    = service;
+       this.method             = method;
+       this.xmlhttp    = false;
+       this.name               = null;
+       this.alertEvent = true; /* only used when isXUL is false */
+
+       this.type               = "POST"; /* default */
+       this.id                 = rrId++;
+       this.cancelled = false;
+
+       this.setSecure(false);
+       if(isXUL()) this.setSecure(true);
+
+       _allrequests[this.id] = this;
+
+       var i = 2;
+       this.params = ""; 
+
+       while(i < arguments.length) {
+               var object = js2JSON(arguments[i++]);
+               this.params += "&param=" + encodeURIComponent(object);
+       }
+
+       if(!this.params) { this.params = ""; }
+
+       this.param_string = "service=" + service + "&method=" + method + this.params;
+       if (this.locale != null) {
+               this.param_string = this.param_string + "&locale=" + this.locale;
+       }
+       if( this.buildXMLRequest() == null ) alert("Browser is not supported!");
+
+}
+
+
+RemoteRequest.prototype.timeout = function(t) {
+       t *= 1000
+       var req = this;
+       req.timeoutFunc = setTimeout(
+               function() {
+                       if( req && req.xmlhttp ) {
+                               req.cancelled = true;
+                               req.abort();
+                               if( req.abtCallback ) {
+                                       req.abtCallback(req);
+                               }
+                       }
+               },
+               t
+       );
+}
+
+RemoteRequest.prototype.abortCallback = function(func) {
+       this.abtCallback = func;
+}
+
+RemoteRequest.prototype.event = function(evt) {
+       if( arguments.length > 0 )
+               this.evt = evt;
+       return this.evt;
+}
+
+RemoteRequest.prototype.abort = function() {
+       if( this.xmlhttp ) {
+               /* this has to come before abort() or IE will puke on you */
+               this.xmlhttp.onreadystatechange = function(){};
+               this.xmlhttp.abort();
+       }
+}
+
+/* constructs our XMLHTTPRequest object */
+RemoteRequest.prototype.buildXMLRequest = function() {
+       this.xmlhttp = buildXMLRequest();
+       return true;
+}
+
+
+function buildXMLRequest() {
+    try {
+           return new XMLHttpRequest();
+    } catch(e) {
+           try { 
+                   return new ActiveXObject("Msxml2.XMLHTTP"); 
+           } catch (e2) {
+                   try { 
+                           return new ActiveXObject("Microsoft.XMLHTTP"); 
+                   } catch (e3) {
+                       alert("NEEDS NEWER JAVASCRIPT for XMLHTTPRequest()");
+                return null;
+                   }
+           }
+    }
+}
+
+
+function _remoteRequestCallback(id) {
+
+       var object = _allrequests[id];
+       if(object.cancelled) return;
+
+       if( object.xmlhttp.readyState == 4 ) {
+
+        try {
+            object.duration = new Date().getTime() - object.sendTime;
+            dump('request ' + object.id + ': duration = ' + object.duration + ' ms\n');
+        } catch(ee){}
+
+               try {
+                       object.callback(object);
+               } catch(E) {
+            throw E
+               } finally { 
+                       destroyRequest(object); 
+                       object = null; 
+               }  
+       }
+}
+
+
+/* define the callback we use when this request has received
+       all of its data */
+RemoteRequest.prototype.setCompleteCallback = function(callback) {
+       if(this.cancelled) return;
+       this.callback = callback;
+       var id = this.id;
+       this.xmlhttp.onreadystatechange = function() { _remoteRequestCallback(id); }
+}
+
+
+/* http by default.  This makes it https. *ONLY works when
+       embedded in a XUL app. */
+RemoteRequest.prototype.setSecure = function(bool) {
+       this.secure = bool; 
+}
+
+RemoteRequest.prototype.send = function(blocking) {
+
+       if(this.cancelled) return;
+
+       /* determine the xmlhttp server dynamically */
+       var url = location.protocol + "//" + location.host + "/" + XML_HTTP_GATEWAY;
+
+       if(isXUL()) {
+               if( XML_HTTP_SERVER ) 
+                       url = 'http://'+XML_HTTP_SERVER+'/'+XML_HTTP_GATEWAY;
+
+               if( url.match(/^http:/) && 
+                               (this.secure || location.href.match(/^https:/)) ) {
+                       netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
+                       url = url.replace(/^http:/, 'https:');
+               }
+       }
+
+       var data = null;
+       if( this.type == 'GET' ) url +=  "?" + this.param_string; 
+
+       this.url = url;
+
+   //if( isXUL() ) dump('request URL = ' + url + '?' + this.param_string + '\n');
+
+       try {
+
+               if(blocking) this.xmlhttp.open(this.type, url, false);
+               else this.xmlhttp.open(this.type, url, true);
+               
+       } catch(E) {
+               alert("Fatal error opening XMLHTTPRequest for URL:\n" + url + '\n' + E);
+               return;
+       }
+
+       if( this.type == 'POST' ) {
+               data = this.param_string;
+               this.xmlhttp.setRequestHeader('Content-Type',
+                               'application/x-www-form-urlencoded');
+       }
+
+       try {
+               var auth;
+               try { dojo.require('dojo.cookie'); auth = dojo.cookie(COOKIE_SES) } catch(ee) {}
+               if( isXUL() ) auth = fetchXULStash().session.key;
+               if( auth ) 
+                       this.xmlhttp.setRequestHeader('X-OILS-Authtoken', auth);
+
+       } catch(e) {}
+
+       if(data && data.match(/param=undefined/)) {
+               /* we get a bogus param .. replace with NULL */
+               try{dump('!+! UNDEFINED PARAM IN QUERY: ' + this.service + ' : ' + this.method+'\n');}catch(r){}
+               data = data.replace(/param=undefined/g,'param=null');
+       }
+
+
+    this.sendTime = new Date().getTime();
+       try{ this.xmlhttp.send( data ); } catch(e){}
+
+       return this;
+}
+
+/* returns the actual response text from the request */
+RemoteRequest.prototype.getText = function() {
+       return this.xmlhttp.responseText;
+}
+
+RemoteRequest.prototype.isReady = function() {
+       return this.xmlhttp.readyState == 4;
+}
+
+
+/* returns the JSON->js result object  */
+RemoteRequest.prototype.getResultObject = function() {
+
+       if(this.cancelled) return null;
+       if(!this.xmlhttp) return null;
+
+       var failed = false;
+       var status = null;
+       this.event(null);
+
+       /*
+       try {
+               dump(this.url + '?' + this.param_string + '\n' +
+                       'Returned with \n\tstatus = ' + this.xmlhttp.status + 
+                       '\n\tpayload= ' + this.xmlhttp.responseText + '\n');
+       } catch(e) {}
+       */
+
+       try {
+               status = this.xmlhttp.status;
+               if( status != 200 ) failed = true;
+       } catch(e) { failed = true; }
+
+       if( failed ) {
+               if(!status) status = '<unknown>';
+               try{dump('! NETWORK FAILURE.  HTTP STATUS = ' +status+'\n'+this.param_string+'\n');}catch(e){}
+               if(isXUL()) 
+                       throw new NetworkFailure(status, this.param_string);
+               else return null;
+       }
+
+       var text = this.xmlhttp.responseText;
+
+       //try{if(getDebug()) _debug('response: ' + text + '\n')}catch(e){}
+
+       if(text == "" || text == " " || text == null) {
+               try { dump('dbg: Request returned no text!\n'); } catch(E) {}
+               if(isXUL()) 
+                       throw new NetworkFailure(status, this.param_string);
+               return null;
+       }
+
+       var obj = JSON2js(text);
+       if(!obj) return null;
+
+       if( obj.status != 200 ) {
+
+               var str = 'A server error occurred. Debug information follows: ' +
+                                       '\ncode = '             + obj.status + 
+                                       '\ndebug: '             + obj.debug + 
+                                       '\npayload: '   + js2JSON(obj.payload); 
+
+               if(isXUL()) {
+                       dump(str);
+                       throw obj;
+
+               } else {
+                       _debug(str);
+                       throw str;
+               }
+       }
+
+       var payload = obj.payload;
+       if(!payload || payload.length == 0) return null;
+       payload = (payload.length == 1) ? payload[0] : payload;
+
+       if(!isXUL()) {
+               if( checkILSEvent(payload) ) {
+                       this.event(payload);
+                       if( this.alertEvent ) {
+                               alertILSEvent(payload);
+                               return null;
+                       }
+               } 
+       }
+
+       return payload;
+}
+
+/* adds a new parameter to the request */
+RemoteRequest.prototype.addParam = function(param) {
+       var string = encodeURIComponent(js2JSON(param));
+       this.param_string += "&param=" + string;
+}
+
+function fetchXULStash() {
+       if( isXUL() ) {
+               try {
+                       netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
+                       var __OILS = new Components.Constructor("@mozilla.org/openils_data_cache;1", "nsIOpenILS");
+                       var data_cache = new __OILS( );
+                       return data_cache.wrappedJSObject.OpenILS.prototype.data;
+       
+               } catch(E) {
+                       _debug('Error in OpenILS.data._debug_stash(): ' + js2JSON(E) );
+               }
+       }
+       return {};
+}
+
+
+
+/* these events should be used by all */
+
+window.onunload = windowUnload;
+
+attachEvt("common", "init", loadUIObjects);
+//attachEvt("common", "init", initParams);
+attachEvt("common", "init", initCookies);
+
+attachEvt("common", "unload", _tree_killer);
+try{ attachEvt("common", "unload", cleanRemoteRequests);} catch(e){}
+
+function init() {
+
+       initParams();
+
+       if( getLocation() == null && getOrigLocation() != null )
+               LOCATION = getOrigLocation();
+
+       if( getLocation() == null && getOrigLocation() == null )
+               LOCATION = globalOrgTree.id();
+
+       /* if they click on the home page and the origlocation is set
+               take the opac back to the origlocation */
+       if( findCurrentPage() == HOME && getOrigLocation() != null )
+               LOCATION = getOrigLocation();
+
+       if(getDepth() == null) DEPTH = findOrgDepth(getLocation());
+
+
+       runEvt('common','init');
+
+       var cgi = new CGI();
+       if( grabUser() ) {
+               if( cgi.param(PARAM_LOCATION) == null ) {
+                       var org = G.user.prefs[PREF_DEF_LOCATION];
+                       var depth = G.user.prefs[PREF_DEF_DEPTH];
+
+                       if(org == null) org = G.user.ws_ou();
+                       if(depth == null) depth = findOrgDepth(org);
+
+                       LOCATION = org;
+                       DEPTH = depth;
+               }
+       }
+
+       runEvt("common", "run");
+       //checkUserSkin();
+
+       var loc = findOrgLasso(getLasso());
+       if (!loc) loc = findOrgUnit(getLocation());
+
+       if (getLasso()) G.ui.common.now_searching.appendChild(text('Search group: '));
+       G.ui.common.now_searching.appendChild(text(loc.name()));
+}
+
+function windowUnload() { runEvt("common", "unload"); }
+/**
+* This function should return a URL which points to the book cover image based on ISBN.
+*/
+
+
+function buildISBNSrc(isbn, size) {
+       size = (size) ? size : 'small';
+       var protocol = (OILS_OPAC_STATIC_PROTOCOL) ? OILS_OPAC_STATIC_PROTOCOL + ':' : location.protocol;
+    if(OILS_OPAC_IMAGES_HOST)
+        return protocol + '//' + OILS_OPAC_IMAGES_HOST + size + '/' + isbn;
+       return '../../../../extras/ac/jacket/'+size+'/'+isbn;
+}      
+
+
+function acMakeURL(type, key) {
+       return '../../../../extras/ac/' + type + '/html/' + key;
+}
+
+
+function acCollectData( key, callback ) {
+       var context = { key : key, callback: callback, data : {} };
+       acCollectItem(context, 'summary');
+       acCollectItem(context, 'reviews');
+       acCollectItem(context, 'toc');
+       acCollectItem(context, 'excerpt');
+       acCollectItem(context, 'anotes');
+}
+
+function acCheckDone(context) {
+       if(     context.data.reviews && context.data.reviews.done &&
+                       context.data.toc                && context.data.toc.done &&
+                       context.data.excerpt && context.data.excerpt.done &&
+                       context.data.anotes     && context.data.anotes.done ) {
+
+               if(context.callback) context.callback(context.data);
+       }
+}
+
+function acCollectItem(context, type) {
+       var req = buildXMLRequest();
+       req.open('GET', acMakeURL(type, context.key), true);
+       req.onreadystatechange = function() {
+               if( req.readyState == 4 ) {
+                       context.data[type] = { done : true }
+
+                       if(IE) {
+
+                               /* Someone please explain why IE treats status 404 as status 200?? 
+                                       On second thought, don't bother.
+                               */
+                               if( ! req.responseText.match(
+                                       /The requested URL.*was not found on this server/) )
+                                       context.data[type].html = req.responseText;
+
+                       } else {
+                               if( req.status != 404 ) 
+                                       context.data[type].html = req.responseText;
+                       }
+                       acCheckDone(context);
+               }
+       }
+       req.send(null);
+}
+
+
diff --git a/Open-ILS/web/opac/skin/tadl/js/container.js b/Open-ILS/web/opac/skin/tadl/js/container.js
new file mode 100644 (file)
index 0000000..c8f1028
--- /dev/null
@@ -0,0 +1,69 @@
+
+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 ) {
+
+    fieldmapper.IDL.load(['cbreb']);
+       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 ) {
+
+    fieldmapper.IDL.load(['cbrebi']);
+       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/tadl/js/copy_details.js b/Open-ILS/web/opac/skin/tadl/js/copy_details.js
new file mode 100644 (file)
index 0000000..4236266
--- /dev/null
@@ -0,0 +1,475 @@
+var cpdTemplate;
+var cpdCounter = 0;
+var cpdNodes = {};
+
+/* showDueDate will show the due date in the OPAC */
+var showDueDate = false;
+/* showDueTime will show the due time (hours and minutes) in the OPAC;
+   if showDueDate is false, then showDueTime has no effect
+*/
+var showDueTime = false;
+
+function cpdBuild( contextTbody, contextRow, record, callnumber, orgid, depth, copy_location, already_fetched_copies, peer_types ) {
+       var i = cpdCheckExisting(contextRow);
+       if(i) return i;
+
+       var counter = cpdCounter++;
+
+       /* yank out all of the template rows */
+       if(!cpdTemplate) cpdTemplate = $('rdetail_volume_details_row');
+       var templateRow = cpdTemplate.cloneNode(true);
+       templateRow.id = 'cpd_row_' + counter;
+
+       /* shove a dummy a tag in before the context previous sibling */
+       /*
+       contextTbody.insertBefore( 
+               elem('a',{name:'slot_'+templateRow.id}), contextRow.previousSibling);
+       goTo('#slot_'+templateRow.id);
+       */
+
+       if(isXUL()) {
+               /* unhide before we unhide/clone the parent */
+               unHideMe($n(templateRow, 'age_protect_label'));
+               unHideMe($n(templateRow, 'create_date_label'));
+               unHideMe($n(templateRow, 'holdable_label'));
+       }
+
+       if (isXUL() || showDueDate) {
+               unHideMe($n(templateRow, 'due_date_label'));
+       }
+
+       unHideMe(templateRow);
+
+       var print = $n(templateRow,'print');
+       print.onclick = function() { cpdBuildPrintPane(
+               contextRow, record, callnumber, orgid, depth) };
+    if (callnumber == null) {
+        addCSSClass(print,'hide_me');
+    }
+
+       var mainTbody = $n(templateRow, 'copies_tbody');
+       var extrasRow = mainTbody.removeChild($n(mainTbody, 'copy_extras_row'));
+
+    var request_args = {
+        peer_types      : peer_types, /* indexed the same as already_fetched_copies */
+        contextTbody   : contextTbody, /* tbody that holds the contextrow */
+        contextRow             : contextRow, /* the row our new row will be inserted after */
+        record                 : record,
+        callnumber             : callnumber, 
+        orgid                          : orgid,
+        depth                          : depth,
+        templateRow            : templateRow, /* contains everything */
+        copy_location          : copy_location,
+        mainTbody              : mainTbody, /* holds the copy rows */
+        extrasRow              : extrasRow, /* wrapper row for all extras */
+        counter                        : counter
+    }
+
+    if (! already_fetched_copies) {
+        var req = new Request(FETCH_COPIES_FROM_VOLUME, record.doc_id(), callnumber, orgid);
+        req.callback(cpdDrawCopies);
+
+        req.request.args = request_args;
+
+        req.send();
+    } else {
+        setTimeout(
+            function() {
+                delete request_args['copy_location'];
+                cpdDrawCopies({
+                    'args' : request_args,
+                    'getResultObject' : function() { return already_fetched_copies; }
+                });
+            }, 0
+        );
+    }
+
+       if( contextRow.nextSibling ) 
+               contextTbody.insertBefore( templateRow, contextRow.nextSibling );
+       else
+               contextTbody.appendChild( templateRow );
+       _debug('creating new details row with id ' + templateRow.id);
+       cpdNodes[templateRow.id] = { templateRow : templateRow };
+       return templateRow.id;
+}
+
+
+function cpdBuildPrintWindow(record, orgid) {
+       var div = $('rdetail_print_details').cloneNode(true);
+       div.id = "";
+
+       $n(div, 'lib').appendChild(text(findOrgUnit(orgid).name()));
+       $n(div, 'title').appendChild(text(record.title()));
+       $n(div, 'author').appendChild(text(record.author()));
+       $n(div, 'edition').appendChild(text(record.edition()));
+       $n(div, 'pubdate').appendChild(text(record.pubdate()));
+       $n(div, 'publisher').appendChild(text(record.publisher()));
+       $n(div, 'phys').appendChild(text(record.physical_description()));
+
+       return div;
+}
+
+function cpdStylePopupWindow(div) {
+       var tds = div.getElementsByTagName('td');
+       for( var i = 0; i < tds.length ; i++ ) {
+               var td = tds[i];
+               var sty = td.getAttribute('style');
+               if(!sty) sty = "";
+               td.setAttribute('style', sty + 'padding: 2px; border: 1px solid #F0F0E0;');
+               if( td.className && td.className.match(/hide_me/) ) 
+                       td.parentNode.removeChild(td);
+       }
+}
+
+
+/* builds a friendly print window for this CNs data */
+function cpdBuildPrintPane(contextRow, record, cn, orgid, depth) {
+
+       var div = cpdBuildPrintWindow( record, orgid);
+
+    var whole_cn_text = (cn[0] ? cn[0] + ' ' : '') + cn[1] + (cn[2] ? ' ' + cn[2] : '');
+       $n(div, 'cn').appendChild(text(whole_cn_text));
+
+       unHideMe($n(div, 'copy_header'));
+
+       var subtbody = $n(contextRow.nextSibling, 'copies_tbody');
+       var rows = subtbody.getElementsByTagName('tr');
+
+       for( var r = 0; r < rows.length; r++ ) {
+               var row = rows[r];
+               if(!row) continue;
+               var name = row.getAttribute('name');
+               if( name.match(/extras_row/) ) continue; /* hide the copy notes, stat-cats */
+               var clone = row.cloneNode(true);
+               var links = clone.getElementsByTagName('a');
+               for( var i = 0; i < links.length; i++ ) 
+                       links[i].style.display = 'none';
+
+               $n(div, 'tbody').appendChild(clone);
+       }
+
+       cpdStylePopupWindow(div);
+       openWindow( div.innerHTML);
+}
+
+
+
+/* hide any open tables and if we've already 
+       fleshed this cn, just unhide it */
+function cpdCheckExisting( contextRow ) {
+
+       var existingid;
+       var next = contextRow.nextSibling;
+
+       if( next && next.getAttribute('templateRow') ) {
+               var obj = cpdNodes[next.id];
+               if(obj.templateRow.className.match(/hide_me/)) 
+                       unHideMe(obj.templateRow);
+               else hideMe(obj.templateRow);
+               existingid = next.id;
+       }
+
+       if(existingid) _debug('row exists with id ' + existingid);
+
+       for( var o in cpdNodes ) {
+               var node = cpdNodes[o];
+               if( existingid && o == existingid ) continue;
+               hideMe(node.templateRow);
+               removeCSSClass(node.templateRow.previousSibling, 'rdetail_context_row');
+       }
+
+       addCSSClass(contextRow, 'rdetail_context_row');
+       if(existingid) return existingid;
+       return null;
+}
+
+/*
+function cpdFetchCopies(r) {
+       var args = r.args;
+       args.cn = r.getResultObject();
+       var req = new Request(FETCH_COPIES_FROM_VOLUME, args.cn.id());
+       req.request.args = args;
+       req.callback(cpdDrawCopies);
+       req.send();
+}
+*/
+
+function cpdDrawCopies(r) {
+
+       var copies              = r.getResultObject();
+       var args                        = r.args;
+       var copytbody   = $n(args.templateRow, 'copies_tbody');
+       var copyrow             = copytbody.removeChild($n(copytbody, 'copies_row'));
+
+       if(isXUL()) {
+               /* unhide before we unhide/clone the parent */
+               unHideMe($n(copyrow, 'age_protect_value'));
+               unHideMe($n(copyrow, 'create_date_value'));
+               unHideMe($n(copyrow, 'copy_holdable_td'));
+       }
+
+       if(isXUL() || showDueDate) {
+               unHideMe($n(copyrow, 'copy_due_date_td'));
+       }
+
+       for( var i = 0; i < copies.length; i++ ) {
+               var row = copyrow.cloneNode(true);
+               var copyid = copies[i];
+        var pt; if (args.peer_types) pt = args.peer_types[i];
+        if (typeof copyid != 'object') {
+            var req = new Request(FETCH_FLESHED_COPY, copyid);
+            req.callback(cpdDrawCopy);
+            req.request.args = r.args;
+            req.request.row = row;
+            req.send();
+        } else {
+            setTimeout(
+                function(copy,row,pt) {
+                    return function() {
+                        cpdDrawCopy({
+                            'getResultObject' : function() { return copy; },
+                            'args' : r.args,
+                            'peer_type' : pt,
+                            'row' : row
+                        });
+                    };
+                }(copies[i],row,pt), 0
+            );
+        }
+               copytbody.appendChild(row);
+       }
+}
+
+function cpdDrawCopy(r) {
+       var copy = r.getResultObject();
+       var row  = r.row;
+       var pt   = r.peer_type;
+    var trow = r.args.templateRow;
+
+    if (r.args.copy_location && copy.location().name() != r.args.copy_location) {
+        hideMe(row);
+        return;
+    }
+
+    // Make barcode more useful for staff client usage
+    if(isXUL()) {
+        var my_a = document.createElement('a');
+        my_a.appendChild(text(copy.barcode()));
+        my_a.setAttribute("href","javascript:void(0);");
+        my_a.onclick = function() {
+            xulG.new_tab(xulG.urls.XUL_COPY_STATUS, {}, {'from_item_details_new': true, 'barcodes': [copy.barcode()]});
+               };
+        $n(row, 'barcode').appendChild(my_a);
+    }
+    else {
+       $n(row, 'barcode').appendChild(text(copy.barcode()));
+    }
+
+    /* show the peer type*/
+    if (pt) {
+        $n(row, 'barcode').appendChild(text(' :: ' + pt));
+    }
+
+       $n(row, 'location').appendChild(text(copy.location().name()));
+       $n(row, 'status').appendChild(text(copy.status().name()));
+
+    // append comma-separated list of part this copy is linked to
+    if(copy.parts() && copy.parts().length) {
+        unHideMe($n(trow, 'copy_part_label'));
+        unHideMe($n(row, 'copy_part'));
+        for(var i = 0; i < copy.parts().length; i++) {
+            var part = copy.parts()[i];
+            var node = $n(row, 'copy_part');
+            if(i > 0) node.appendChild(text(','));
+            node.appendChild(text(part.label()));
+        }
+    }
+
+    /* show the other bibs link */
+    if (copy.peer_record_maps().length > 0) {
+        var l = $n(row, 'copy_multi_home');
+        unHideMe(l);
+        var link_args = {};
+        link_args.page = RRESULT;
+        link_args[PARAM_RTYPE] = RTYPE_LIST;
+        link_args[PARAM_RLIST] = new Array();
+        for (var i = 0; i < copy.peer_record_maps().length; i++) {
+            link_args[PARAM_RLIST].push( copy.peer_record_maps()[i].peer_record() );
+        }
+        l.setAttribute('href',buildOPACLink(link_args));
+    }
+
+       if(isXUL()) {
+               /* show the hold link */
+               var l = $n(row, 'copy_hold_link');
+               unHideMe(l);
+               l.onclick = function() {
+                       holdsDrawEditor( 
+                               { 
+                                       type                    : 'C',
+                                       copyObject      : copy,
+                                       onComplete      : function(){}
+                               }
+                       );
+               }
+
+               /* show the book now link */
+               l = $n(row, 'copy_reserve_link');
+//             unHideMe(l);
+               l.onclick = function() {
+                       // XXX FIXME this duplicates things in cat/util.js
+                       // Also needs i18n
+                       dojo.require("fieldmapper.Fieldmapper");
+                       var r = fieldmapper.standardRequest(
+                               ["open-ils.booking",
+                                       "open-ils.booking.resources.create_from_copies"],
+                               [G.user.session, [copy.id()]]
+                       );
+                       if (!r) {
+                               alert("No response from server!");
+                       } else if (r.ilsevent != undefined) {
+                               alert("Error from server:\n" + js2JSON(r));
+                       } else {
+                               xulG.auth = {"session": {"key": G.user.session}};
+                               xulG.bresv_interface_opts = {"booking_results": r};
+                               location.href = "/eg/booking/reservation";
+                       }
+               }
+
+               if( copy.age_protect() ) 
+                       appendClear($n(row, 'age_protect_value'), text(copy.age_protect().name()));
+
+               var cd = copy.create_date();
+               cd = cd.replace(/T.*/, '');
+               $n(row, 'create_date_value').appendChild(text(cd));
+
+               var yes = $('rdetail.yes').innerHTML;
+               var no = $('rdetail.no').innerHTML;
+
+               if( isTrue(copy.holdable()) &&
+                               isTrue(copy.location().holdable()) &&
+                               isTrue(copy.status().holdable()) ) {
+                       $n(row, 'copy_is_holdable').appendChild(text(yes));     
+               } else {
+                       $n(row, 'copy_is_holdable').appendChild(text(no));      
+               }
+       }
+
+       if (isXUL() || showDueDate) {
+               var circ;
+               if( copy.circulations() ) {
+                       circ = copy.circulations()[0];
+                       if( circ ) {
+                                var due_time = dojo.date.stamp.fromISOString(circ.due_date());
+                                if( showDueTime ) {
+                                        $n(row, 'copy_due_date').appendChild(text(dojo.date.locale.format(due_time, {"formatLength": "medium"})));
+                                } else {
+                                        $n(row, 'copy_due_date').appendChild(text(dojo.date.locale.format(due_time, {"selector": "date", "formatLength": "medium"})));
+                                }
+                       }
+               }
+       }
+
+       r.args.copy = copy;
+       r.args.copyrow = row;
+       cpdShowNotes(copy, r.args)
+       cpdShowStats(copy, r.args);
+
+}
+
+function _cpdExtrasInit(args) {
+
+       var newrid      = 'extras_row_' + args.copy.barcode();
+       var newrow      = $(newrid);
+       if(!newrow) newrow = args.extrasRow.cloneNode(true);
+       var tbody       = $n(newrow, 'extras_tbody');
+       var rowt                = $n(tbody, 'extras_row');
+       newrow.id       = newrid;
+
+       var cr = args.copyrow;
+       var nr = cr.nextSibling;
+       var np = args.mainTbody;
+
+       /* insert the extras row into the main table */
+       if(nr) np.insertBefore( newrow, nr );
+       else np.appendChild(newrow);
+
+       var link = $n(args.copyrow, 'details_link');
+       var link2 = $n(args.copyrow, 'less_details_link');
+       var id = newrow.id;
+       link.id = id + '_morelink';
+       link2.id = id + '_lesslink';
+       unHideMe(link);
+       hideMe(link2);
+
+       link.setAttribute('href', 
+                       'javascript:unHideMe($("'+link2.id+'")); hideMe($("'+link.id+'"));unHideMe($("'+newrow.id+'"));');
+
+       link2.setAttribute('href', 
+                       'javascript:unHideMe($("'+link.id+'")); hideMe($("'+link2.id+'"));hideMe($("'+newrow.id+'"));');
+
+       return [ tbody, rowt ];
+}
+
+function cpdShowNotes(copy, args) {
+       var notes = copy.notes();
+       if(!notes || notes.length == 0) return;
+
+       var a = _cpdExtrasInit(args);
+       var tbody = a[0];
+       var rowt = a[1];
+
+       for( var n in notes ) {
+               var note = notes[n];
+               if(!isTrue(note.pub())) continue;
+               var row = rowt.cloneNode(true);
+               $n(row, 'key').appendChild(text(note.title()));
+               $n(row, 'value').appendChild(text(note.value()));
+               unHideMe($n(row, 'note'));
+               unHideMe(row);
+               tbody.appendChild(row);
+       }
+}
+
+
+function cpdShowStats(copy, args) {
+       var entries = copy.stat_cat_entry_copy_maps();
+       if(!entries || entries.length == 0) return;
+
+       var visibleStatCat = false;
+
+       /*
+               check all copy stat cats; if we find one that's OPAC visible,
+               set the flag and break the loop. If we've found one, or we're
+               in the staff client, build the table. if not, we return doing
+               nothing, as though the stat_cat_entry_copy_map was empty or null
+       */
+
+       for( var n in entries )
+       {
+                       var entry = entries[n];
+                       if(isTrue(entry.stat_cat().opac_visible()))
+                       {
+                               visibleStatCat = true;
+                               break;
+                       }
+       }
+
+       if(!(isXUL() || visibleStatCat)) return;
+
+       var a = _cpdExtrasInit(args);
+       var tbody = a[0];
+       var rowt = a[1];
+
+       for( var n in entries ) {
+               var entry = entries[n];
+               if(!(isXUL() || isTrue(entry.stat_cat().opac_visible()))) continue;
+               var row = rowt.cloneNode(true);
+               $n(row, 'key').appendChild(text(entry.stat_cat().name()));
+               $n(row, 'value').appendChild(text(entry.stat_cat_entry().value()));
+               unHideMe($n(row, 'cat'));
+               unHideMe(row);
+               tbody.appendChild(row);
+       }
+}
+
diff --git a/Open-ILS/web/opac/skin/tadl/js/depth_selector.js b/Open-ILS/web/opac/skin/tadl/js/depth_selector.js
new file mode 100644 (file)
index 0000000..6bd4b0e
--- /dev/null
@@ -0,0 +1,129 @@
+
+attachEvt( "common", "locationChanged", updateLoc );
+
+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();
+       }
+
+       setSelector(_ds,        getDepth());
+       _newlocation = getLocation();
+}
+
+
+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() {
+       var i = _ds.selectedIndex;
+       if( i == _ds.options.length - 1 ) {
+               setSelector( _ds, getDepth() );
+               _opacHandleLocationTagClick();
+       } else { 
+               /* this re-submits the search when they change the search range
+                       disabled for testing...
+                       */
+               /*runEvt('common', 'depthChanged');*/ 
+       }
+}
+
+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());
+
+       var orgHiding = checkOrgHiding();
+       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());
+                       if (orgHiding && orgHiding.depth > type.depth()) {
+                               type = null;
+                       }
+               } 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/tadl/js/grpl_utils.js b/Open-ILS/web/opac/skin/tadl/js/grpl_utils.js
new file mode 100644 (file)
index 0000000..b45cdf2
--- /dev/null
@@ -0,0 +1,107 @@
+function show_reset_pw() {
+    unHideMe($('reset_pw_block'));
+    hideMe($('reset_pw_link'));
+    hideMe($('login_table'));
+    hideMe($('reset_pw_fail'));
+    hideMe($('reset_pw_success'));
+}
+
+function hide_pw_result() {
+    hideMe($('reset_pw_fail'));
+    hideMe($('reset_pw_success'));
+}
+
+function reset_pw(){
+
+    var b = $('reset_pw_bcode').value;
+    var e = $('reset_pw_email').value;
+    var result=null;
+
+    var request = false;
+    var self = this;
+    var url = '/cgi-bin/utils/public/reset_passwd.cgi';
+    var qstr = 'barcode='+b+'&email='+e;
+
+    self.request = new XMLHttpRequest();
+    self.request.open("POST", url, false);
+    self.request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
+    self.request.setRequestHeader('Cache-Control', 'no-cache, must-revalidate');
+    self.request.setRequestHeader('Pragma','no-cache');
+
+    self.request.onreadystatechange = function() {
+        if (self.request.readyState == 4) {
+            result = self.request.responseText;
+        }
+    }
+    self.request.send(qstr);
+//    self = null;
+
+
+  if (self.request.responseText == 1 ){
+    unHideMe($('login_table'));
+    hideMe($('reset_pw_block'));
+    unHideMe($('reset_pw_success'));
+    result = null;
+  }else{
+    unHideMe($('reset_pw_fail'));
+    result = null;
+  }
+}
+
+
+
+function getHoldCount(id){
+  var holdCount = null;
+  var result = null;
+
+  if (window.XMLHttpRequest) {
+    // Code for all new browsers
+    holdCount = new XMLHttpRequest();
+  } else if ( window.ActiveXObject ) {
+    // Code for IE 5 and 6
+    holdCount = new ActiveXObject( "Microsoft.XMLHTTP" );
+  }
+
+   holdCount.open( "GET", "/cgi-bin/utils/public/hold_count_tadl.cgi?id=" + id, false )
+   holdCount.onreadystatechange = function() {
+        if (holdCount.readyState == 4) {
+            result = holdCount.responseText;
+        }
+    }
+    holdCount.send(null);
+
+    if (holdCount.responseText)
+       return  holdCount.responseText;
+
+}
+
+function txtCallNumber(tit,cn){
+       tit = tit.replace(/'/g,'');
+       cn = cn.replace(/'/g,'');
+
+       dojo.require('dojo.cookie');
+       var carrier = dojo.cookie('txtCarrier') || '';
+       var number = dojo.cookie('txtNumber') || '';            
+
+       var win = window.open('','',"location=no,width=450,height=230,scrollbars");
+       var content = "<body>";
+       content += '<link type="text/css" rel="stylesheet" href="http://grpl-new.michiganevergreen.org//opac//common/css/mediumfont.css">';
+       content += "<span>Call number and title information can be sent via text message to certain mobile devices.  Please select your carrier and enter your 10-digit mobile number.</span><br/>&nbsp;";
+       content += "<form method='post' action='/cgi-bin/utils/txtCallNumber.cgi'>";
+       content += "<select name='carrier' id='carrier'><option>"+carrier;
+       content += "<option>Alltel<option>AT&T<option>BoostMobile<option>MetroPCS<option>Sprint/Nextel<option>T-Mobile<option>USCellular<option>VirginMobile<option>Verizon</select>";
+       content += "<input type='text' name='number' id='number' size='15' value='" + number + "'/>";
+       content += "<input type='hidden' name='title' value=\"" + tit + "\"/>";
+       content += "<input type='hidden' name='callnumber' value=\"" + cn + "\"/>";
+       content += "<input type='submit' value='Send' onClick='storeValues()'/></form>";
+       content += "<ul><span><b>" + tit + " : " + cn + "</b></span></ul>";
+       content += "<p><br/>** Standard text messaging rates apply.<br/></p>";
+       content += '<script type="text/javascript" src="/js/dojo/dojo/dojo.js"></script><script language="javascript" type="text/javascript">dojo.require("dojo.cookie");dojo.require("dojo.date");';
+       content += 'function clearIt() {dojo.cookie("txtCarrier","",{expire: -1});dojo.cookie("txtNumber","",{expire: -1});document.getElementById("carrier").value="";document.getElementById("number").value="";}';
+       content += 'function storeValues() {document.body.style.opacity = ".3"; var c = document.getElementById("carrier").value; var n = document.getElementById("number").value; var now = new Date(); var exp = dojo.date.add(now,"minute",3); dojo.cookie("txtCarrier",c,{expires: exp}); dojo.cookie("txtNumber",n,{expires: exp}); } </script>';
+       content += "<div align='right'><input type='button' value='Clear' onclick='clearIt();'/></div>";
+
+       content += "</body>";
+
+       win.document.write(content);
+}
diff --git a/Open-ILS/web/opac/skin/tadl/js/holds.js b/Open-ILS/web/opac/skin/tadl/js/holds.js
new file mode 100644 (file)
index 0000000..6ca16a2
--- /dev/null
@@ -0,0 +1,1125 @@
+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;
+
+var holdTargetTypeMap = {
+    M : 'metarecord',
+    T : 'record',
+    V : 'volume',
+    I : 'issuance',
+    C : 'copy',
+    P : 'part'
+};
+
+
+
+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)) {
+               detachAllEvt('common','locationChanged');
+               attachEvt('common','loggedIn', holdsDrawEditor)
+               initLogin();
+               return;
+       }
+
+       if(holdArgs.editHold) // flesh the args with the existing hold 
+               holdArgsFromHold(holdArgs.editHold, holdArgs);
+
+       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;
+       }
+
+    dijit.byId('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()) {
+            dijit.byId('holds_frozen_thaw_input').setValue(dojo.date.stamp.fromISOString(hold.thaw_date()));
+        } else {
+            dijit.byId('holds_frozen_thaw_input').setValue('');
+        }
+    } else {
+        frozenbox.checked = false;
+        dijit.byId('holds_frozen_thaw_input').setValue('');
+        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();
+    args[holdTargetTypeMap[args.type]] = target;
+       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 == 'I' ) {
+            _h_set_issuance(args, doneCallback);
+
+        } else if( type == 'P' ) {
+            _h_set_parts(args, doneCallback);
+
+               } else {
+                       if( type == 'T') {
+                               _h_set_rec(args, doneCallback);
+                       } else {
+                               _h_set_rec_descriptors(args, doneCallback);
+                       }
+               }
+       }
+
+       return args;
+}
+
+function _h_set_parts(args, doneCallback) {
+
+    var preq = new Request(
+        'open-ils.fielder:open-ils.fielder.bmp.atomic',
+        {"cache":1, "fields":["label", "record"],"query": {"id":args.part}}
+    );
+
+    preq.callback(
+        function(r) {
+            var part = r.getResultObject()[0];
+            args.record = part.record;
+            args.partObject = part;
+            _h_set_rec(args, doneCallback);
+        }
+    );
+
+    preq.send();
+}
+
+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_issuance(args, doneCallback) {
+
+       if( args.issuanceObject ) {
+               args.issuance = args.issuanceObject.id();
+               args.record = args.issuanceObject.subscription().record_entry();
+               _h_set_rec(args, doneCallback);
+
+       } else {
+
+               var vreq = new Request(FETCH_ISSUANCE, [args.issuance]);
+               vreq.callback(
+                       function(r) {
+                               var issuance = r.getResultObject()[0];
+                               args.issuanceObject = issuance;
+                               args.record = issuance.subscription().record_entry();
+                               _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(args.type == 'P') {
+        //_h_get_parts(args, doneCallback);
+    } else {
+               if(doneCallback) doneCallback(args);
+    }
+}
+
+
+function _h_set_rec_descriptors(args, doneCallback) {
+
+    if( ! args.pickup_lib )
+        args.pickup_lib = getSelectorVal($('holds_org_selector'));
+
+    if(args.pickup_lib === null)
+        args.pickup_lib = args.recipient.home_ou();
+
+       // grab the list of record desciptors attached to this records metarecord 
+       if( ! args.recordDescriptors )  {
+               var params = { pickup_lib: args.pickup_lib };
+
+        if (args.type == 'M') {
+               if( !args.metarecord && args.record) {
+                params.metarecord = args.metarecord = args.record;
+                delete(args.record);
+               } else {
+                               params.metarecord = args.metarecordObject.doc_id();
+               }
+        } else {
+               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 = args.recordDescriptors = data.descriptors;
+                               args.metarecord = args.metarecord = data.metarecord;
+                               if( args.type == 'M' && ! args.metarecordObject) 
+                                       args.metarecordObject = args.metarecordObject = findRecord(args.metarecord, 'M');       
+
+                _h_get_parts(args, doneCallback);
+                       }
+               );
+               req.send();
+
+       } else {
+        _h_get_parts(args, doneCallback);
+       }
+
+       return args;
+}
+
+function _h_get_parts(args, doneCallback) {
+
+    if(args.type == 'M' || args.editHold || args.holdParts) {
+        if(doneCallback) 
+            doneCallback(args);
+
+    } else {
+
+               var req = new Request(
+            'open-ils.search:open-ils.search.biblio.record_hold_parts', 
+                   {pickup_lib: args.pickup_lib, record: args.record}
+        );
+
+               req.callback(
+                       function(r) {
+                               args.recordParts = r.getResultObject();
+                if(doneCallback)
+                    doneCallback(args);
+                       }
+               );
+               req.send();
+    }
+}
+
+
+
+function holdsDrawWindow() {
+       swapCanvas($('holds_box'));
+       $('holds_cancel').onclick = function(){ runEvt('common', 'holdUpdateCanceled'), showCanvas() };
+       $('holds_submit').onclick = function(){holdsPlaceHold(holdsBuildHoldFromWindow())};
+       $('holds_update').onclick = function(){holdsPlaceHold(holdsBuildHoldFromWindow())};
+    $('holds_org_selector').onchange = function(){holdsDrawWindow()};
+       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 __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 
+               */
+
+               setSelector(selector, holdArgs.recipient.home_ou());
+       
+       }
+
+       /*
+       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 == 'I' ) {
+               unHideMe($('holds_type_row'));
+        unHideMe($('holds_is_issuance'));
+        unHideMe($('holds_issuance_row'));
+        appendClear($('holds_issuance_label'), text(holdArgs.issuanceObject.label()));
+
+    } else 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'));
+               hideMe($('holds_issuance_row'));
+       }
+
+    if(holdArgs.recordParts && holdArgs.recordParts.length) {
+        var selector = $('holds_parts_selector');
+        unHideMe($('holds_parts_row'));
+        unHideMe(selector);
+
+        var nodeList = [];
+        dojo.forEach(selector.options, 
+            function(node) { if(node.value != '') nodeList.push(node) } );
+
+        dojo.forEach(nodeList, function(node) { selector.removeChild(node); });
+
+        dojo.forEach(
+            holdArgs.recordParts, 
+            function(part) {
+                insertSelectorVal(selector, -1, part.label, part.id);
+            }
+        );
+
+    } else if(holdArgs.type == 'P') {
+        unHideMe($('holds_parts_row'));
+        unHideMe($('holds_parts_label'));
+           appendClear( $('holds_parts_label'), text(holdArgs.partObject.label));
+    }
+
+       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 mr_formats;
+               if(holdArgs.editHold){
+                       mr_formats = holdArgs.editHold.holdable_formats();
+               }else{
+                       mr_formats = ''; // collect the item_type()s from all holdArgs.recordDescriptors
+                       for(var desc in holdArgs.recordDescriptors){
+                if (!holdArgs.recordDescriptors[desc].item_type()) continue;
+                               mr_formats += holdArgs.recordDescriptors[desc].item_type();
+                       }
+
+            var first_form = 1;
+                       for(var desc in holdArgs.recordDescriptors){
+                if (!holdArgs.recordDescriptors[desc].item_form()) continue;
+                if (first_form) {
+                    mr_formats += '-';
+                    first_form = 0;
+                }
+                               mr_formats += holdArgs.recordDescriptors[desc].item_form();
+                       }
+
+
+               }
+               
+               var data = holdsParseMRFormats(mr_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();
+       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'));
+        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' || type == "I" || holdArgs.editHold ) return;
+
+       var data                                = holdsGetFormats();
+       var avail_formats       = data.avail_formats;
+       var sel_formats = data.sel_formats;
+       holdArgs.language = data.lang;
+       if( type=='M'){         
+               hideMe($('holds_alt_formats_row_extras'));
+               unHideMe($('holds_alt_formats_row'));   
+       }else{
+               unHideMe($('holds_alt_formats_row_extras'));
+       }
+
+       var selector = $('hold_alt_form_selector');
+
+    for( var i = 0; i < selector.options.length; i++ ) {
+        if (selector.options[i].className.indexOf('hide_me') == -1)
+            hideMe(selector.options[i]);
+    }
+
+       for( var i = 0; i < avail_formats.length; i++ ) {
+               var form = avail_formats[i];
+               var opt = findFormatSelectorOptByParts(selector,form);
+        if (!opt) continue;
+               if(type=='M') opt.selected=true;
+               unHideMe(opt);
+       }
+
+    // If the user selects a format, P-type holds are no longer an option
+    // disable and reset the P-type form control
+    selector.onchange = function() {
+        var partsSel = $('holds_parts_selector');
+        for(var i = 0; i < selector.options.length; i++) {
+            if(selector.options[i].selected) {
+                partsSel.selectedIndex = 0; // none selected
+                partsSel.disabled = true;
+                return;
+            }
+        }
+        partsSel.disabled = false;
+    }
+}
+
+function findFormatSelectorOptByParts( sel, val ) {
+    var parts = val.split('-');
+    for( var i = 0; i < sel.options.length; i++ ) {
+        var opt = sel.options[i];
+        var oval = opt.value;
+        var oparts = oval.split('-');
+        if( oparts[0].indexOf(parts[0]) > -1 && (!parts[1] || oparts[1].indexOf(parts[1]) > -1) ) return opt;
+    }
+    return null;
+}
+
+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( type == 'T' && d.item_lang() != lang ) continue;
+               formats.push( _t_f_2_format(d.item_type(), d.item_form()));
+           }
+
+       } else if( type =='M') {
+
+        // All available formats are selected by default in MR holds
+               for( var i = 0; i < desc.length; i++ ) {
+               var d = desc[i];
+                   var _tmp_f = _t_f_2_format(d.item_type(), d.item_form());
+               formats.push( _tmp_f );
+               sformats.push( _tmp_f );
+       }
+       }
+
+       formats = uniquify(formats);
+       sformats = uniquify(sformats);
+
+       return {
+               lang : lang,
+               avail_formats : formats, 
+               sel_formats : sformats
+       };
+}
+
+
+
+function _t_f_2_format(type, form) {
+       if( (type == 'a' || type == 't') && form == 's' ) return 'at-s';
+       if( form == 'd' ) return 'at-d';
+       return (type == 'a' || type == 't') ? 'at' : type;
+}
+
+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') || contains(vals, 'at-s')) {
+               if( contains(vals, 'at') ) {
+                       fstring = 'at';
+               } else if (contains(vals, 'at-s') && contains(vals, 'at-d')) {
+                       fstring = 'at-sd';
+               } else if (!contains(vals, 'at-s')) {
+                       fstring = 'at-d';
+       } else {
+                       fstring = 'at-s';
+               }
+       }
+
+       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,
+               mrid : holdArgs.metarecord,
+               volume_id : holdArgs.volume,
+               issuanceid : holdArgs.issuance,
+               copy_id : holdArgs.copy,
+               hold_type : holdArgs.type,
+               patronid : holdArgs.recipient.id(),
+               depth : 0, 
+               pickup_lib : pickuplib,
+        partid : holdArgs.part
+       };
+
+       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) {
+
+       if(!node) node = globalOrgTree;
+       if(!isTrue(node.opac_visible())) return;
+       if(node.id() != 1 && (node.id() < 22|| node.id() > 28)) return;
+
+       var render_this_org = true;
+       var orgHiding = checkOrgHiding(); // value here is cached so not too painful with the recursion
+       if (orgHiding) {
+               if (node.id() == globalOrgTree.id()) {
+                       node = orgHiding.org; // top of tree = org hiding context org
+               }
+               if ( ! orgIsMine( orgHiding.org, node, orgHiding.depth ) ) {
+                       render_this_org = false;
+               }
+       }
+
+       if (render_this_org) {
+               var selector = $('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;
+       }
+
+    fieldmapper.IDL.load(['ahr']);
+       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 part = getSelectorVal($('holds_parts_selector'));
+    if(part) {
+        holdArgs.type = 'P';
+        holdArgs.part = part;
+    }
+
+       var target = holdArgs[holdTargetTypeMap[holdArgs.type]];
+
+    // a mono part is selected
+
+       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);
+
+    var expDate = dijit.byId('holds_expire_time').getValue();
+    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'));
+        var thawDate = dijit.byId('holds_frozen_thaw_input').attr('value');
+        if(thawDate) {
+            thawDate = dojo.date.stamp.toISOString(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);
+                       } else {
+                               if( res.textcode == 'PATRON_BARRED' ) {
+                                       alertId('hold_failed_patron_barred');
+                       } else {
+                                       alert($('hold_not_allowed').innerHTML);
+                               }
+                       }
+                       swapCanvas($('holds_box'));
+                       return;
+               }
+        r._hold.selection_depth(res.depth);
+       }       
+
+       holdCreateHold(r._recurse, r._hold);
+}
+
+
+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');
+    }
+}
+
diff --git a/Open-ILS/web/opac/skin/tadl/js/mresult.js b/Open-ILS/web/opac/skin/tadl/js/mresult.js
new file mode 100644 (file)
index 0000000..c6c548b
--- /dev/null
@@ -0,0 +1,141 @@
+//var records = {};
+var records = [];
+var ranks = [];
+var onlyrecord = {};
+var table;
+var mresultPreCache = 200;
+var searchTimer;
+var resultFacetKey;
+
+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();
+    resultFacetKey = res.facet_key;
+    resultCompiledSearch = res.compiled_search;
+    dojo.require('dojo.cookie');
+    dojo.cookie(COOKIE_SEARCH, js2JSON(res.compiled_search));
+       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/tadl/js/myopac.js b/Open-ILS/web/opac/skin/tadl/js/myopac.js
new file mode 100644 (file)
index 0000000..d63e3fb
--- /dev/null
@@ -0,0 +1,1708 @@
+
+attachEvt("common", "run", myOPACInit );
+//attachEvt("common", "loggedIn", myOPACInit );
+attachEvt('common','locationUpdated', myopacReload );
+
+dojo.requireLocalization("openils.opac", "opac");
+
+var opac_strings = dojo.i18n.getLocalization("openils.opac", "opac");
+var fleshedUser = null;
+var fleshedContainers = {};
+var holdCache = {};
+var holdStatusCache = {};
+var showHoldQueuePosition = false;
+var allowPendingAddr = false;
+var myopacEnableRefWorks = false;
+var myopacRefWorksHost = 'http://www.refworks.com';
+
+function clearNodes( node, keepArray ) {
+       if(!node) return;
+       for( var n in keepArray ) node.removeChild(keepArray[n]);
+       removeChildren(node);
+       for( var n in keepArray ) node.appendChild(keepArray[n]);
+}
+
+function myOPACInit() {
+
+    fieldmapper.IDL.load(['mous']);
+
+    var orgHiding = checkOrgHiding();
+    if (orgHiding) {
+        hideMe($('prefs_def_location_row'));
+        hideMe($('prefs_def_range_row'));
+    }
+
+       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'));
+           myOPACChangePage( "summary" );
+    }
+
+    $('myopac_holds_thaw_date_input').onkeyup = 
+        function(){holdsVerifyThawDateUI('myopac_holds_thaw_date_input'); }
+    $('myopac_holds_thaw_date_input').onchange = 
+        function(){holdsVerifyThawDateUI('myopac_holds_thaw_date_input'); }
+
+}
+
+function myopacReload() {
+       //swapCanvas($('myopac_reloading'));
+       var a = {};
+       a[PARAM_LOCATION] = getNewSearchLocation();
+       a[PARAM_DEPTH] = getNewSearchDepth();
+       hideMe($('canvas_main'));
+       goTo(buildOPACLink(a, true));
+}
+
+
+function myOPACChangePage( page ) {
+       showCanvas();
+
+       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');
+
+       var cls = "myopac_link";
+       var acls = "myopac_link_active";
+
+       hideMe(ss);
+       hideMe(cc); hideMe(ff);
+       hideMe(hh); hideMe(pp);
+       hideMe(bb);
+
+       removeCSSClass(s, acls );
+       removeCSSClass(c, acls );
+       removeCSSClass(f, acls );
+       removeCSSClass(h, acls );
+       removeCSSClass(p, acls );
+       removeCSSClass(b, acls );
+
+       switch( page ) {
+
+               case "summary": 
+                       unHideMe(ss);
+                       addCSSClass(s, acls );
+                       myOPACShowSummary();
+                       break;
+
+               case "checked": 
+                       unHideMe(cc);
+                       addCSSClass(c, acls );
+                       myOPACShowChecked();
+                       break;
+
+               case "holds": 
+                       unHideMe(hh);
+                       addCSSClass(h, acls );
+                       myOPACShowHolds();
+                       break;
+
+               case "fines": 
+                       unHideMe(ff);
+                       addCSSClass(f, acls );
+                       myOPACShowFines();
+                       break;
+
+               case "prefs": 
+                       unHideMe(pp);
+                       addCSSClass(p, acls );
+                       myOPACShowPrefs();
+                       break;
+
+               case 'bookbag':
+                       unHideMe(bb);
+                       addCSSClass(b, acls);
+                       myOPACShowBookbags();
+                       break;
+       }
+}
+
+function myOPACShowChecked() {
+       if(checkedDrawn) return;
+       var req = new Request(FETCH_CHECKED_OUT_SUM, G.user.session, G.user.id());      
+       req.callback(myOPACDrawCheckedOutSlim);
+       req.send();
+
+       var nreq = new Request(FETCH_NON_CAT_CIRCS, G.user.session);
+       nreq.callback(myOPACDrawNonCatCircs);
+       nreq.send();
+}
+
+
+var checkedRowTemplate;
+var circsCache = new Array();
+var checkedDrawn = false;
+
+function moClearCheckedTable() {
+       var tbody                       = $("myopac_checked_tbody");
+       var loading                     = $("myopac_checked_loading");
+       var none                                = $("myopac_checked_none");
+       clearNodes( tbody, [ loading, none ] );
+}
+
+var __can_renew_one = false;
+
+function myOPACDrawCheckedOutSlim(r) {
+
+       var checked                     = r.getResultObject();
+       var tbody                       = $("myopac_checked_tbody");
+       var loading                     = $("myopac_checked_loading");
+       var none                                = $("myopac_checked_none");
+
+   __can_renew_one = false;
+
+       if(checkedDrawn) return;
+       checkedDrawn = true;
+       if(!checkedRowTemplate) 
+               checkedRowTemplate = tbody.removeChild($("myopac_checked_row"));
+
+   moClearCheckedTable();
+
+       hideMe(loading); /* remove all children and start over */
+       if(!(checked && (checked.out || checked.overdue))) {
+               unHideMe(none);
+               return;
+       }
+
+    var totalAsync = checked.overdue.length + checked.out.length;
+    var fetchedCircs = [];
+    var collectCircs = function(r) {
+        var circ = r.getResultObject();
+        circ._od = r.od;
+        fetchedCircs.push(circ);
+        if(fetchedCircs.length < totalAsync) return;
+
+        // sort by due date, oldest to newest
+        fetchedCircs = fetchedCircs.sort(
+            function(a, b) {
+                if(a.due_date() > b.due_date()) return 1;
+                return -1;
+            }
+        )
+
+        dojo.forEach(fetchedCircs, 
+            function(circ) { 
+                myOPACDrawCheckedItem(circ, tbody);
+            }
+        );
+    }
+
+       for( var i = 0; i < checked.overdue.length; i++ ) {
+               var req = new Request(FETCH_CIRC_BY_ID, G.user.session, checked.overdue[i]);
+               //req.request.tbody = tbody;
+               req.request.od = true;
+               req.callback(collectCircs);
+               req.send();
+       }
+
+
+       for( var i = 0; i < checked.out.length; i++ ) {
+               var req = new Request(FETCH_CIRC_BY_ID, G.user.session, checked.out[i]);
+               //req.request.tbody = tbody;
+               req.callback(collectCircs);
+               req.send();
+       }
+
+   appendClear($('mo_items_out_count'), 
+      text(new String( parseInt(checked.overdue.length) + parseInt(checked.out.length) )) );
+
+   if( checked.overdue.length > 0 ) {
+      addCSSClass($('mo_items_overdue_count'), 'overdue');
+      appendClear($('mo_items_overdue_count'),
+         text(new String( parseInt(checked.overdue.length) )) );
+   }
+
+}
+
+
+//function myOPACDrawCheckedItem(r) {
+function myOPACDrawCheckedItem(circ, tbody) {
+
+       //var circ = r.getResultObject();
+       //var tbody = r.tbody;
+       var row = checkedRowTemplate.cloneNode(true);
+       row.id = 'myopac_checked_row_ ' + circ.id();
+    row.setAttribute('circid', circ.id());
+
+       var due = _trimTime(circ.due_date());
+
+       var dlink = $n( row, "myopac_checked_due" );
+       var rlink = $n( row, "myopac_checked_renewals" );
+       //var rnlink = $n( row, "myopac_checked_renew_link" );
+
+       //if( r.od ) due = elem('b', {style:'color:red;font-size:110%'},due);
+       if( circ._od ) {
+      due = elem('b', null, due);
+      addCSSClass(due, 'overdue');
+   } else {
+      due = text(due);
+   }
+
+       dlink.appendChild(due);
+       rlink.appendChild(text(circ.renewal_remaining()));
+       unHideMe(row);
+       //rnlink.setAttribute('href', 'javascript:myOPACRenewCirc("'+circ.id()+'");');
+       circsCache.push(circ);
+
+   if( circ.renewal_remaining() < 1 ) {
+      $n(row, 'selectme').disabled = true;
+      if(!__can_renew_one)
+         $('mo_renew_button').disabled = true;
+   } else {
+      __can_renew_one = true;
+      $('mo_renew_button').disabled = false;
+      $n(row, 'selectme').disabled = false;
+   }
+
+       tbody.appendChild(row);
+
+       var req = new Request(FETCH_MODS_FROM_COPY, circ.target_copy() );
+       req.request.alertEvent = false;
+       req.request.circ = circ.id();
+       req.request.copy = circ.target_copy();
+       req.callback(myOPACDrawCheckedTitle);
+       req.send();
+}
+
+var __circ_titles = {};
+
+function myOPACDrawCheckedTitle(r) {
+       var record = r.getResultObject();
+       var circid = r.circ;
+
+       /* Draw pre-cataloged items */
+       if(!record || checkILSEvent(record) || !(record.title() || record.author())) {
+               var req = new Request( FETCH_COPY, r.copy );
+               req.request.circ = circid;
+               req.callback(myOPACDrawPreCatalogedItem);
+               req.send();
+               return;
+       }
+
+       var row = $('myopac_checked_row_ ' + circid);
+       var tlink = $n( row, "myopac_checked_title_link" );
+       var alink = $n( row, "myopac_checked_author_link" );
+
+       buildTitleDetailLink(record, tlink);
+       buildSearchLink(STYPE_AUTHOR, record.author(), alink);
+   __circ_titles[circid] = record.title();
+}
+
+function myOPACDrawPreCatalogedItem(r) {
+       var copy = r.getResultObject();
+       var circid = r.circ;
+
+       var row = $('myopac_checked_row_ ' + circid);
+       var tlink = $n( row, "myopac_checked_title_link" );
+       var alink = $n( row, "myopac_checked_author_link" );
+
+       tlink.parentNode.appendChild(text(copy.dummy_title()));
+       alink.parentNode.appendChild(text(copy.dummy_author()));
+   __circ_titles[circid] = copy.dummy_title();
+}
+
+
+/*
+function myOPACRenewCirc(circid) {
+
+       var circ;
+       for( var i = 0; i != circsCache.length; i++ ) 
+               if(circsCache[i].id() == circid)
+                       circ = circsCache[i];
+
+       if(!confirm($('myopac_renew_confirm').innerHTML)) return;
+
+       var req = new Request(RENEW_CIRC, G.user.session, 
+               { patron : G.user.id(), copyid : circ.target_copy(), opac_renewal : 1 } );
+       req.request.alertEvent = false;
+       req.send(true);
+       var res = req.result();
+
+       if(checkILSEvent(res) || checkILSEvent(res[0])) {
+               alertId('myopac_renew_fail');
+               return;
+       }
+
+       alert($('myopac_renew_success').innerHTML);     
+       checkedDrawn = false;
+       myOPACShowChecked();
+}
+*/
+
+
+
+function myOPACShowHolds() {
+       var req = new Request(FETCH_HOLDS, G.user.session, G.user.id());        
+       req.callback(myOPACDrawHolds);
+       req.send();
+    $('myopac_holds_actions_none').selected = true;
+}
+
+var holdsTemplateRowOrig;
+var holdsTemplateRow;
+var myopacForceHoldsRedraw = false;
+function myOPACDrawHolds(r) {
+
+       var tbody = $("myopac_holds_tbody");
+       if(holdsTemplateRow && !myopacForceHoldsRedraw) return;
+    myopacForceHoldsRedraw = false;
+
+       if(holdsTemplateRowOrig) {
+               holdsTemplateRow = holdsTemplateRowOrig;
+               removeChildren(tbody);
+       } else {
+               holdsTemplateRow = tbody.removeChild($("myopac_holds_row"));
+               holdsTemplateRowOrig = holdsTemplateRow;
+       }
+
+       hideMe($('myopac_holds_loading'));
+
+       var holds = r.getResultObject();
+
+       if(!holds || holds.length < 1) unHideMe($('myopac_holds_none'));
+       for( var i = 0; i != holds.length; i++ ) {
+
+               var h = holds[i];
+               holdCache[h.id()] = h;
+
+               var row = holdsTemplateRow.cloneNode(true);
+               row.id = "myopac_holds_row_" + h.id();
+
+               var form = $n(row, "myopac_holds_formats");
+               form.id = "myopac_holds_form_" + h.id();
+
+               var orglink = $n(row, "myopac_holds_location");
+               orglink.appendChild(text(findOrgUnit(h.pickup_lib()).name()));
+
+               tbody.appendChild(row);
+
+               $n(row,'myopac_holds_edit_link').setAttribute(
+                       'href','javascript:myOPACEditHold("'+ h.id()+'");'); 
+
+        if(isTrue(h.frozen())) {
+            hideMe($n(row, 'myopac_hold_unfrozen_true'))
+            unHideMe($n(row, 'myopac_hold_unfrozen_false'))
+            if(h.thaw_date()) {
+                var d = dojo.date.stamp.fromISOString(h.thaw_date());
+                $n(row, 'myopac_holds_frozen_until').appendChild(text(dojo.date.locale.format(d, {selector: 'date', fullYear: true})));
+            }
+        } else {
+            unHideMe($n(row, 'myopac_hold_unfrozen_true'))
+            hideMe($n(row, 'myopac_hold_unfrozen_false'))
+        }
+
+        $n(row, 'myopac_holds_selected_chkbx').checked = false;
+
+        var exp_date;
+        if(h.expire_time()) {
+            exp_date = dojo.date.stamp.fromISOString(h.expire_time().replace(/(T\d\d:\d\d:\d\d)([+-]\d\d)(\d)/, "$1$2:$3"));
+            $n(row, 'myopac_hold_expire_time').appendChild(
+                text(dojo.date.locale.format(exp_date, {selector:'date'})));
+        }
+
+               unHideMe(row);
+
+        var interval = fetchOrgSettingDefault(G.user.home_ou(), 'circ.hold_expire_alert_interval');
+        if(interval && exp_date) {
+            secs = interval_to_seconds(interval) * 1000;
+            var diff = exp_date.getTime() - new Date().getTime();
+            if(diff < secs)
+                addCSSClass($n(row, 'myopac_hold_expire_time'), 'hold_expire_warning');
+        }
+
+        myOPACDrawHoldTitle(h);
+        myOPACDrawHoldStatus(h);
+    }
+}
+
+function myOPACEditHold(holdid) {
+       var hold = holdCache[holdid];
+
+       holdsDrawEditor( 
+               { 
+                       editHold : hold,
+                       onComplete : function(){ 
+                               holdsTemplateRow = null;
+                               myOPACShowHolds(); 
+                       }
+               }
+       );
+}
+
+
+function myOPACDrawHoldStatus(hold) {
+       var req = new Request(FETCH_HOLD_STATUS, G.user.session, hold.id() );
+       req.callback(myOShowHoldStatus);
+       req.request.hold = hold;
+       req.send();
+}
+
+var myopacShowHoldEstimate = false;
+function myOShowHoldStatus(r) {
+
+       var hold = r.hold;
+       var qstats = r.getResultObject();
+    holdStatusCache[hold.id()] = qstats;
+
+       var row = $("myopac_holds_row_" + r.hold.id());
+
+    if(qstats.estimated_wait || myopacShowHoldEstimate) {
+        myopacShowHoldEstimate = true;
+        if(qstats.estimated_wait) {
+            // wait is currently returned in seconds, but displayed in days
+            var wait = Math.ceil(qstats.estimated_wait / 86400);
+            $n(row, 'myopac_holds_estimated_wait').appendChild(text(wait));
+        }
+        unHideMe($('myopac_holds_estimated_wait_column'));
+        unHideMe($n(row, 'myopac_holds_estimated_wait'));
+    } 
+
+       if( qstats.status == 4 ) {
+               unHideMe($n(row, 'hold_status_available'));
+               hideMe($n(row, 'myopac_holds_cancel_link'));
+       }
+
+    if (showHoldQueuePosition) {
+        var node = $n(row, 'hold_qstats');
+        if (qstats.potential_copies == 1) {
+            node.appendChild(text(dojo.string.substitute(opac_strings.HOLD_STATUS_SINGULAR, [qstats.queue_position, qstats.total_holds, qstats.potential_copies])));
+        } else {
+            node.appendChild(text(dojo.string.substitute(opac_strings.HOLD_STATUS_PLURAL, [qstats.queue_position, qstats.total_holds, qstats.potential_copies])));
+        }
+        unHideMe(node);
+
+    } else {
+           if( qstats.status < 3 )
+                   unHideMe($n(row, 'hold_status_waiting'));
+    
+           if( qstats.status == 3 )
+                   unHideMe($n(row, 'hold_status_transit'));
+    }
+}
+
+
+function myOPACDrawHoldTitle(hold) {
+       var method;
+
+       if( hold.hold_type() == 'T' || hold.hold_type() == 'M') {
+               if(hold.hold_type() == "M") method = FETCH_MRMODS;
+               if(hold.hold_type() == "T") method = FETCH_RMODS;
+               var req = new Request(method, hold.target());
+               req.callback(myOPACFleshHoldTitle);
+               req.request.hold = hold;
+               req.request.alertEvent = false;
+               req.send();
+
+       } else {
+               holdFetchObjects(hold, 
+                       function(a) { _myOPACFleshHoldTitle(hold, a);});
+       }
+}
+
+function myOPACFleshHoldTitle(r) {
+       var rec = r.getResultObject();
+       _myOPACFleshHoldTitle(r.hold, {recordObject: rec});
+}
+
+function _myOPACFleshHoldTitle(hold, holdObjects) {
+
+       var record  = holdObjects.recordObject;
+       var volume      = holdObjects.volumeObject;
+       var copy        = holdObjects.copyObject;
+
+       var row = $("myopac_holds_row_" + hold.id());
+       var title_link = $n(row, "myopac_holds_title_link");
+       var author_link = $n(row, "myopac_holds_author_link");
+
+       if(!record || checkILSEvent(record) ) {
+               addCSSClass(row, 'invalid_hold');
+               $n(row, 'myopac_holds_edit_link').setAttribute('href', 'javascript:void(0);');
+               $n(row, 'myopac_holds_edit_link').onclick = function(){alertId('invalid_hold');};
+               return;
+       }
+
+       buildTitleDetailLink(record, title_link);
+       buildSearchLink(STYPE_AUTHOR, record.author(), author_link);
+
+    if(hold.hold_type() == 'P') {
+        unHideMe($n(row, 'vol_copy'));
+        $n(row, 'part').appendChild(text(holdObjects.partObject.label));
+    }
+
+       if( volume ) {
+               $n(row, 'volume').appendChild(text(volume.label()));
+               unHideMe($n(row, 'vol_copy'));
+               if(copy) $n(row, 'copy').appendChild(text(copy.barcode()));
+       }
+
+       var form = $("myopac_holds_form_" + hold.id());
+
+       if(form) {
+               var mods_formats = record.types_of_resource();
+
+               if( hold.hold_type() == 'M' ) {
+                       var data = holdsParseMRFormats(hold.holdable_formats());
+                       mods_formats = data.mods_formats;
+               }
+
+               for( var i = 0; i < mods_formats.length; i++ ) {
+                       var img = elem("img");
+                       setResourcePic(img, mods_formats[i]);
+                       form.appendChild(img);
+               }
+       }
+}
+
+var finesShown = false;
+function myOPACShowFines() {
+       if(finesShown) return; finesShown = true;
+       var req = new Request(FETCH_FINES_SUMMARY, G.user.session, G.user.id() );
+       req.callback(_myOPACShowFines);
+       req.send();
+       $('myopac_fines_pay_ses').value = G.user.session;
+}
+
+function _myOPACShowFines(r) {
+       hideMe($('myopac_fines_summary_loading'));
+       unHideMe($('myopac_fines_summary_row'));
+
+       var summary = r.getResultObject();
+       var total       = "0.00"; /* localization? */
+       var paid                = "0.00";
+       var balance = "0.00";
+       if( instanceOf(summary,mous) ) {
+
+               total           = _finesFormatNumber(summary.total_owed());
+               paid            = _finesFormatNumber(summary.total_paid());
+               balance = _finesFormatNumber(summary.balance_owed());
+
+               var req = new Request(FETCH_TRANSACTIONS, G.user.session, G.user.id() );
+               req.callback(myOPACShowTransactions);
+               req.send();
+       }
+
+       $('myopac_fines_summary_total').appendChild(text(total));
+       $('myopac_fines_summary_paid').appendChild(text(paid));
+       $('myopac_fines_summary_balance').appendChild(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 ""; return time.replace(/\ .*/,""); }
+function _trimTime(time) { 
+       if(!time) return ""; 
+    time = time.replace(/(T\d\d:\d\d:\d\d)([+-]\d\d)(\d)/, "$1$2:$3");
+    var d = dojo.date.stamp.fromISOString(time);
+    if(!d) return ""; /* date parse failed */
+    return dojo.date.locale.format(d, {"formatLength": "medium"});
+}
+
+function _trimSeconds(time) { 
+    if(!time) return ""; 
+    var d = dojo.date.stamp.fromISOString(time.replace(/(T\d\d:\d\d:\d\d)([+-]\d\d)(\d)/, "$1$2:$3"));
+    if(!d) return ""; /* date parse failed */
+    return dojo.date.locale.format(d, { "timePattern" : "h:ma", "formatLength" : "medium" });
+}
+
+function myOPACShowTransactions(r) {
+
+       if(myopacGenericTransTemplate || myopacCircTransTemplate) return;
+
+       var transactions = r.getResultObject();
+
+       for( var idx in transactions ) {
+
+               var trans       = transactions[idx].transaction;
+               var record      = transactions[idx].record;
+               var circ                = transactions[idx].circ;
+
+               if(trans.xact_type() == 'circulation') 
+                       myOPACShowCircTransaction(trans, record, circ);
+
+               else if(trans.xact_type() == 'grocery' ) 
+                       myopacShowGenericTransaction( trans );
+
+/*      XXX need to copy circulation output function here
+               else if(trans.xact_type() == 'reservation' ) 
+                       myopacShowReservationTransaction( trans );
+*/
+
+       }
+}
+
+var myopacGenericTransTemplate;
+function myopacShowGenericTransaction( trans ) {
+       var tbody = $('myopac_trans_tbody');
+
+       if(!myopacGenericTransTemplate) {
+               myopacGenericTransTemplate = 
+                       tbody.removeChild($('myopac_trans_row'));
+               removeChildren(tbody);
+       }
+
+       var row = myopacGenericTransTemplate.cloneNode(true);
+
+       $n(row,'myopac_trans_start').appendChild(
+                       text(_trimSeconds(trans.xact_start())));
+
+       $n(row,'myopac_trans_last_payment').appendChild(
+                       text(_trimSeconds(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())));
+
+       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'));
+}
+
+
+
+/* draws a circulation transaction summary */
+var myopacCircTransTemplate;
+function myOPACShowCircTransaction(trans, record, circ) {
+       var tbody = $('myopac_circ_trans_tbody');
+
+       if(!myopacCircTransTemplate) {
+               myopacCircTransTemplate = tbody.removeChild($('myopac_circ_trans_row'));
+               removeChildren(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(_trimTime(trans.xact_start())));
+       var due = _trimTime(circ.due_date());
+       var checkin = _trimTime(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())));
+
+       tbody.appendChild(row);
+       unHideMe($('myopac_circ_trans_div'));
+}
+
+
+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_HOLD_NOTIFY] = getSelectorVal($('prefs_hold_notify'));
+       G.user.prefs[PREF_DEF_DEPTH] = getSelectorVal($('prefs_def_range'));
+
+       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'));
+
+       if(commitUserPrefs())
+               alert($('prefs_update_success').innerHTML);
+       else alert($('prefs_update_failure').innerHTML);
+}
+
+
+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 myOPACShowHoldNotify() {
+       var pref = G.user.prefs[PREF_HOLD_NOTIFY];
+
+       if(pref) {
+               if(pref.match(/email/i) && pref.match(/phone/i)) {
+                       setSelector($('prefs_hold_notify'), 'phone:email');
+               } else if( pref.match(/email/i) ) {
+                       setSelector($('prefs_hold_notify'), 'email');
+               } else if( pref.match(/phone/i) ) {
+                       setSelector($('prefs_hold_notify'), 'phone');
+               }
+
+       } else {
+               setSelector($('prefs_hold_notify'), 'phone:email');
+       }
+}
+
+function myOPACShowPrefs() {
+       grabUserPrefs();
+       myOPACShowHitsPer();
+       myOPACShowDefFont();
+       myOPACShowHoldNotify();
+       myOPACShowDefLocation();
+       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 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);
+}
+
+var userShown = false;
+function myOPACShowSummary() {
+       if(userShown) return; userShown = true;
+       var req = new Request(FETCH_FLESHED_USER,G.user.session, G.user.id());
+       req.callback(_myOPACSummaryShowUer);
+       req.send();
+}
+
+var addrRowTemplate;
+var notesTemplate;
+function _myOPACSummaryShowUer(r) {
+
+       var user = r.getResultObject();
+       fleshedUser = user;
+       if(!user) return;
+
+    var expireDate = dojo.date.stamp.fromISOString(user.expire_date());
+    if( expireDate < new Date() ) {
+        appendClear($('myopac.expired.date'), dojo.date.locale.format(expireDate, { "formatLength" : "medium", "selector" : "date" }));
+        unHideMe($('myopac.expired.alert'));
+    }
+
+       var iv1 = user.ident_value()+'';
+    if (iv1.length > 4 && iv1.match(/\d{4}/)) iv1 = iv1.substring(0,4) + '***********';
+
+
+       appendClear($('myopac_summary_prefix'),text(user.prefix()));
+       appendClear($('myopac_summary_first'),text(user.first_given_name()));
+       appendClear($('myopac_summary_middle'),text(user.second_given_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_last'),text(user.family_name()));
+       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_homelib'),text(findOrgUnit(user.home_ou()).name()));
+       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(!isTrue(addr.valid()))
+        unHideMe($n(row, 'myopac_invalid_addr_row'));
+
+    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)};
+}
+
+// if no pending addr exists, this is called with the original address
+function myopacSaveAddress(row, addr, deleteMe) {
+
+    if(addr.replaces() == null) {
+        // we are editing a non-pending address.  create a pending address to manage that
+        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 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(getLocation(), '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 the username does not already exist, res will be null;
+        * we can move on to updating the username.
+        * 
+        * If the username does exist, then res will be the user ID.
+        * G.user.id() gives us the currently authenticated user ID.
+        * If res == G.user.id(), we try to update the username anyways.
+        */
+       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;
+               }
+
+               G.user.usrname(username);
+               hideMe($('myopac_update_username_row'));
+               userShown = false;
+               alertId('myopac_username_success');
+               myOPACShowSummary();
+               return;
+       }
+
+       alert($('myopac_username_failure').innerHTML);
+}
+
+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);
+               hideMe($('myopac_update_email_row'));
+               userShown = false;
+               alertId('myopac_email_success');
+               myOPACShowSummary();
+               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()) {
+               hideMe($('myopac_update_password_row'));
+               userShown = false;
+               alertId('myopac_password_success');
+               myOPACShowSummary();
+               return;
+       }
+
+       alert($('myopac_password_failure').innerHTML);
+}
+
+
+
+
+var containerTemplate;
+function myOPACShowBookbags(force) {
+
+       var tbody =$('myopac_bookbag_tbody') ;
+
+       if(!containerTemplate) 
+               containerTemplate = tbody.removeChild($('myopac_bookbag_tr'));
+       else if(!force) return;
+
+       removeChildren(tbody);
+
+       var containers = containerFetchAll();
+
+       var found = false;
+       for( var i in containers ) {
+               found = true;
+               var cont = containers[i];
+               var row = containerTemplate.cloneNode(true);
+               row.id = 'myopac_bookbag_row_' + cont.id();
+               var link = $n(row, 'myopac_expand_bookbag');
+               var dlink = $n(row, 'myopac_container_delete');
+               link.appendChild( text(cont.name()) );
+               link.setAttribute('href', 
+                       'javascript:myOPACExpandBookbag("' + cont.id() + '","' + cont.name() + '");');
+               myOPACFetchBBItems( cont.id(), row );
+               dlink.setAttribute('href', 'javascript:myOPACDeleteBookbag("'+cont.id()+'");');
+
+               if( isTrue(cont.pub()) ) {
+                       unHideMe($n(row, 'myopac_bb_published_yes'));
+                       var link = $n(row, 'myopac_bb_published_view');
+                       link.setAttribute('href', buildExtrasLink( 'feed/bookbag/html-full/'+cont.id(), false));  
+                       link.setAttribute('target', '_blank' );
+                       unHideMe(link);
+
+                       link = $n(row, 'myopac_bb_published_atom');
+                       link.setAttribute('href', buildExtrasLink( 'feed/bookbag/rss2-full/'+cont.id(), false));  
+                       link.setAttribute('target', '_blank' );
+                       unHideMe(link);
+
+                       link = $n(row, 'myopac_bb_make_unpublished');
+                       link.setAttribute('href', 'javascript:myOPACMakeBBPublished("'+cont.id()+'", true);');
+                       unHideMe(link);
+                        
+                       var RW = $n(row, 'myopac_bb_exp_refworks');
+                       if (RW && myopacEnableRefWorks) {
+                               var here = (findOrgUnit(getLocation())).name();
+                               var org_name = here.replace(" ", "+");
+                               var cgi = new CGI();
+
+                               RW.setAttribute('href',
+                               myopacRefWorksHost + '/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/feed/bookbag/marctxt-full/'
+                                       + cont.id()
+                               );
+                               RW.setAttribute('target', 'RefWorksMain');
+                               unHideMe($n(row, 'myopac_bb_exp_refworks'));
+                       }
+               } else { 
+                       unHideMe($n(row, 'myopac_bb_published_no')); 
+                       var link = $n(row, 'myopac_bb_make_published');
+                       link.setAttribute('href', 'javascript:myOPACMakeBBPublished("'+cont.id()+'");');
+                       unHideMe(link);
+               }
+
+               tbody.appendChild(row); 
+       }
+
+       if(!found) unHideMe($('myopac_bookbags_none'));
+       else unHideMe($('myopac_bookbag_table'));       
+}
+
+function myOPACMakeBBPublished(bbid, hideme) {
+
+       var bb = fleshedContainers[bbid];
+
+       if(hideme) {
+               if(!confirm($('myopac_make_unpublished_confirm').innerHTML)) return;
+               bb.pub('f');
+       } else {
+               if(!confirm($('myopac_make_published_confirm').innerHTML)) return;
+               bb.pub('t');
+       }
+
+       var result = containerUpdate(bb);
+
+       var code = checkILSEvent(result);
+       if(code) { alertILSEvent(result); return; }
+
+       alert($('myopac_bb_update_success').innerHTML);
+       myOPACShowBookbags(true);
+}
+
+
+
+function myOPACDeleteBookbag(id) {
+       if( confirm( $('myopac_delete_bookbag_warn').innerHTML ) ) {
+               var result = containerDelete(id);
+               var code = checkILSEvent(result);
+               if(code) { alertILSEvent(result); return; }
+               alert($('myopac_bb_update_success').innerHTML);
+               hideMe($('myopac_bookbag_items_table'));
+               hideMe($('myopac_bookbag_items_name'));
+               hideMe($('myopac_bookbag_no_items'));
+               myOPACShowBookbags(true);
+       }
+}
+
+function myOPACFetchBBItems( id, row, block ) {
+       if(!block) {
+               containerFlesh( id, _myOPACSetBBItems, { row: row }  );
+       } else {
+               var cont = containerFlesh(id);
+               myOPACSetBBItems( cont, row );
+       }
+}
+
+function _myOPACSetBBItems(r) { myOPACSetBBItems( r.getResultObject(), r.args.row ); }
+
+function myOPACSetBBItems( container, row ) {
+       fleshedContainers[container.id()] = container;
+       var node = $n(row, 'myopac_bookbag_item_count');
+       removeChildren(node);
+       node.appendChild( text(container.items().length) );
+}
+
+var BBItemsRow;
+function myOPACExpandBookbag( id, name ) {
+       
+       var tbody = $('myopac_bookbag_items_tbody');
+       if(!BBItemsRow) BBItemsRow = tbody.removeChild($('myopac_bookbag_items_row'));
+       removeChildren(tbody);
+       removeChildren($('myopac_bookbag_items_name'));
+
+       $('myopac_bookbag_items_name').appendChild(text(name));
+
+       if( fleshedContainers[id] ) {
+               var len = fleshedContainers[id].items().length;
+
+               if( len == 0 ) {
+                       unHideMe($('myopac_bookbag_no_items'));
+                       hideMe($('myopac_bookbag_items_table'));
+                       return;
+               }
+
+               hideMe($('myopac_bookbag_no_items'));
+               unHideMe($('myopac_bookbag_items_table'));
+
+               for( var i = 0; i != len; i++ ) {
+                       var row = BBItemsRow.cloneNode(true);
+                       found = true;
+
+                       var item = fleshedContainers[id].items()[i];
+                       var tlink = $n(row,'myopac_bookbag_items_title');
+                       var alink = $n(row,'myopac_bookbag_items_author');
+
+                       var req = new Request( FETCH_RMODS, item.target_biblio_record_entry() );
+                       req.request.tlink = tlink;
+                       req.request.alink = alink;
+                       req.callback(myOPACShowBBItem);
+                       req.send();
+
+                       var clink = $n(row, 'myopac_bookbag_items_remove');
+                       clink.setAttribute('href', 'javascript:myOPACRemoveBBItem("'+item.id()+'","'+id+'","'+name+'");');
+
+                       tbody.appendChild(row);
+               }
+       }
+}
+
+function myOPACRemoveBBItem( id, containerid, container_name ) {
+       if(!confirm($('myopac_remove_bb_item_confirm').innerHTML)) return;
+       var stat = containerRemoveItem( id );
+       if(stat) alert($('myopac_bb_update_success').innerHTML);
+       myOPACFetchBBItems( containerid, $('myopac_bookbag_row_' + containerid), true);
+       myOPACExpandBookbag( containerid, container_name );
+}
+
+function myOPACShowBBItem(r) {
+       var record = r.getResultObject();
+       buildTitleDetailLink(record, r.tlink);
+       buildSearchLink(STYPE_AUTHOR, record.author(), r.alink);
+}
+
+function myOPACCreateBookbag() {
+       var name = $('myopac_bookbag_new_name').value;  
+       if(!name) return;
+
+       var exists = false;
+       for( var c in fleshedContainers ) { exists = true; break; }
+
+       /* let them know what they are getting into... */
+       if(!exists) if(!confirm($('bb_create_warning').innerHTML)) return;
+
+       var result = containerCreate( name, $('bb_public_yes').checked );
+       var code = checkILSEvent(result);
+       if(code) { alertILSEvent(result); return; }
+       if(result) alert($('myopac_bb_update_success').innerHTML);
+       myOPACShowBookbags(true);
+}
+
+
+/* ---------------------------------------------------------------------- */
+/* Non cat circs */
+/* ---------------------------------------------------------------------- */
+
+var nonCatCircIds;
+var nonCatTypes;
+/* if we have some circs, grab the non-cat types */
+function myOPACDrawNonCatCircs(r) {
+       var ids = r.getResultObject();
+       if(ids.length == 0) return;
+       nonCatCircIds = ids;
+       unHideMe($('non_cat_circs_div'));
+       var req = new Request(FETCH_NON_CAT_TYPES, G.user.home_ou());
+       req.callback(myOPACDrawNonCatCircs2);
+       req.send();
+}
+
+
+/* now we have circs and the types.. draw each one */
+var nonCatTbody;
+var nonCatRow;
+function myOPACDrawNonCatCircs2(r) {
+       nonCatTypes = r.getResultObject();
+       nonCatTbody = $('non_cat_circs_tbody');
+       if(!nonCatRow) nonCatRow = 
+               nonCatTbody.removeChild($('non_cat_circs_row'));
+       removeChildren(nonCatTbody);
+       for( var i in nonCatCircIds ) {
+               var req = new Request(FETCH_NON_CAT_CIRC, G.user.session, nonCatCircIds[i]);
+               req.callback(myOPACDrawNonCatCirc);
+               req.send();
+       }
+}
+
+
+/* draw a single circ */
+function myOPACDrawNonCatCirc(r) {
+       var circ = r.getResultObject();
+
+
+       var type = grep(nonCatTypes, 
+               function(i){
+                       return (i.id() == circ.item_type());
+               }
+       )[0];
+
+
+       var row = nonCatTbody.appendChild(nonCatRow.cloneNode(true));
+       appendClear($n(row, 'circ_lib'), text(findOrgUnit(circ.circ_lib()).name()));
+       appendClear($n(row, 'item_type'), text(type.name()));
+
+       appendClear(
+        $n(row, 'circ_time'), 
+        text(dojo.date.locale.format(
+            dojo.date.stamp.fromISOString(circ.duedate()),
+            {format : 'short'}
+        ))
+    );
+}
+
+
+
+
+function myopacSelectAllChecked() {
+   __myopacSelectChecked(true);
+}
+
+function myopacSelectNoneChecked() {
+   __myopacSelectChecked(false);
+}
+
+function __myopacSelectChecked(value) {
+   var rows = myopacGetCheckedOutRows();
+   for( var i = 0; i < rows.length; i++ ) {
+      var row = rows[i];
+      var box = $n(row, 'selectme');
+      if( box && ! box.disabled )
+      box.checked = value;
+   }
+}
+
+function myopacGetCheckedOutRows() {
+   var rows = [];
+   var tbody = $('myopac_checked_tbody');
+   var children = tbody.childNodes;
+   for( var i = 0; i < children.length; i++ ) {
+      var child = children[i];
+      if( child.nodeName.match(/^tr$/i) ) 
+         if( $n(child, 'selectme') ) 
+            rows.push(child);
+   }
+   return rows;
+}
+
+var __renew_circs = [];
+
+/* true if 1 renewal succeeded */
+var __success_count = 0;
+
+/* renews all selected circulations */
+function myOPACRenewSelected() {
+   var rows = myopacGetCheckedOutRows();
+       if(!confirm($('myopac_renew_confirm').innerHTML)) return;
+   __success_count = 0;
+
+   for( var i = 0; i < rows.length; i++ ) {
+
+      var row = rows[i];
+      if( ! $n(row, 'selectme').checked ) continue;
+      var circ_id = row.getAttribute('circid');
+
+          var circ;
+          for( var j = 0; j != circsCache.length; j++ ) 
+                  if(circsCache[j].id() == circ_id)
+                          circ = circsCache[j];
+
+      __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 );
+    }
+}
+
+
+/* renews a single circulation */
+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) {
+   var res = r.getResultObject();
+   var circ = r.circ;
+
+   /* remove this circ from the list of circs to renew */
+   __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])) 
+      alertIdText('myopac_renew_fail', __circ_titles[circ.id()]);
+   else __success_count++;
+
+   if(__renew_circs) return; /* more to come */
+
+   __renew_circs = [];
+
+       if( __success_count > 0 )
+      alertIdText('myopac_renew_success', __success_count);
+
+   hideMe($('my_renewing'));
+   checkedDrawn = false;
+    myOPACShowChecked();
+}
+
+/** ---- batch hold processing ------------ */
+
+
+/* myopac_holds_checkbx */
+function myopacSelectAllHolds() {
+    var rows = getTableRows($("myopac_holds_tbody"));
+    for(var i = 0; i < rows.length; i++) {
+        cb = $n(rows[i], 'myopac_holds_selected_chkbx');
+        if(cb) cb.checked = true;
+    }
+}
+
+function myopacSelectNoneHolds() {
+    var rows = getTableRows($("myopac_holds_tbody"));
+    for(var i = 0; i < rows.length; i++) {
+        cb = $n(rows[i], 'myopac_holds_selected_chkbx');
+        if(cb) cb.checked = false;
+    }
+}
+
+function myopacSelectedHoldsRows() {
+    var r = [];
+    var rows = getTableRows($("myopac_holds_tbody"));
+    for(var i = 0; i < rows.length; i++) {
+        cb = $n(rows[i], 'myopac_holds_selected_chkbx');
+        if(cb && cb.checked)
+            r.push(rows[i]);
+    }
+    return r;
+}
+
+var myopacProcessedHolds = 0;
+var myopacHoldsToProcess = 0;
+function myopacDoHoldAction() {
+
+    var selectedRows = myopacSelectedHoldsRows();
+    action = getSelectorVal($('myopac_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++) {
+        hold = holdCache[myopacHoldIDFromRow(selectedRows[i])];
+        var qstats = holdStatusCache[hold.id()];
+        switch(action) {
+            case 'cancel':
+                holds.push(hold);
+                break;
+            case 'thaw_date':
+            case 'thaw':
+                if(isTrue(hold.frozen()))
+                    holds.push(hold);
+                break;
+            case 'freeze':
+                if(!isTrue(hold.frozen()) && qstats.status < 3)
+                    holds.push(hold);
+                break;
+        }
+    }
+    myopacHoldsToProcess = holds;
+    if(myopacHoldsToProcess.length == 0) return;
+
+    if(action == 'thaw_date' || action == 'freeze') 
+        myopacDrawHoldThawDateForm();
+    else
+    myopacProcessHolds(action);
+}
+
+
+function myopacProcessHolds(action, thawDate) {
+
+    myopacShowHoldProcessing();
+    /* now we process them */
+    for(var i = 0; i < myopacHoldsToProcess.length; i++) {
+
+        hold = myopacHoldsToProcess[i];
+        
+        var req;
+        switch(action) { 
+
+            case 'cancel':
+                   req = new Request(CANCEL_HOLD, G.user.session, hold.id(), /* Patron via OPAC */ 6);
+                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 myopacDrawHoldThawDateForm() {
+    hideMe($('myopac_holds_main_table'));
+    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;
+        }
+    }
+    myopacProcessHolds('freeze', dateString);
+}
+
+function myopacHoldIDFromRow(row) {
+    return row.id.replace(/.*_(\d+)$/, '$1');
+}
+
+function myopacShowHoldProcessing() {
+    unHideMe($('myopac_holds_processing'));
+    hideMe($('myopac_holds_main_table'));
+}
+
+function myopacHideHoldProcessing() {
+    hideMe($('myopac_holds_processing'));
+    unHideMe($('myopac_holds_main_table'));
+    hideMe($('myopac_holds_thaw_date_form'));
+}
+
+function myopacBatchHoldCallback(r) {
+    if(r) /* force load any exceptions */
+        r.getResultObject();
+    if(++myopacProcessedHolds >= myopacHoldsToProcess.length) {
+        myopacHideHoldProcessing();
+        holdCache = {};
+        holdStatusCache = {};
+        myopacForceHoldsRedraw = true;
+        myOPACShowHolds();
+    }
+}
+
diff --git a/Open-ILS/web/opac/skin/tadl/js/password_reset.js b/Open-ILS/web/opac/skin/tadl/js/password_reset.js
new file mode 100644 (file)
index 0000000..83ab76d
--- /dev/null
@@ -0,0 +1,117 @@
+dojo.require('dojo.parser');
+dojo.require('dijit.Dialog');
+dojo.require('dijit.form.Button');
+dojo.require('dijit.form.TextBox');
+
+dojo.requireLocalization("openils.opac", "opac");
+opac_strings = dojo.i18n.getLocalization("openils.opac", "opac");
+
+dojo.addOnLoad(function() {
+
+    // Create the password reset dialog
+    var pwResetFormDlg = createResetDialog();
+    dojo.parser.parse();
+
+    // Connect the buttons to submit / cancel events that override
+    // the default actions associated with the buttons to do
+    // pleasing Ajax things
+    dojo.connect(dijit.byId("pwCancel"), "onClick", function(event) {
+        event.preventDefault();
+        event.stopPropagation();
+        pwResetFormDlg.hide();
+        dijit.byId('pwUsername').attr('value', null);
+        dijit.byId('pwBarcode').attr('value', null);
+    });
+    dojo.connect(dijit.byId("pwSubmit"), "onClick", function(event) {
+        event.preventDefault();
+        event.stopPropagation();
+        var xhrArgs = {
+            form: dojo.byId("requestReset"),
+            handleAs: "text",
+            load: function(data) {
+                pwResetFormDlg.hide();
+                passwordSubmission(opac_strings.PWD_RESET_SUBMIT_SUCCESS);
+                dijit.byId('pwUsername').attr('value', null);
+                dijit.byId('pwBarcode').attr('value', null);
+            },
+            error: function(error) {
+                pwResetFormDlg.hide();
+                passwordSubmission(opac_strings.PWD_RESET_SUBMIT_ERROR);
+            }
+        }
+        var deferred = dojo.xhrPost(xhrArgs);
+    });
+    dojo.place("<tr><td colspan='2' align='center'><a class='classic_link' href='http://www.tadl.org/evergreen/catalog/'>Having trouble logging in?</a></td></tr>", config.ids.login.tbody);
+    /* remove Evergreen password resets for now
+    dojo.place("<tr><td colspan='2' align='center'><a class='classic_link' id='pwResetLink' onClick='dijit.byId(\"pwResetFormDlg\").show();'</a></td></tr>", config.ids.login.tbody);
+    dojo.query("#pwResetLink").attr("innerHTML", opac_strings.PWD_RESET_FORGOT_PROMPT);
+    */
+
+});
+
+function passwordSubmission( msg ) {
+    var responseDialog = new dijit.Dialog({
+        title: opac_strings.PWD_RESET_RESPONSE_TITLE,
+        style: "width: 35em"
+    });
+    responseDialog.startup();
+    var requestStatusDiv = dojo.create("div", { style: "width: 30em" });
+    var requestStatusMsg = dojo.create("div", { innerHTML: msg }, requestStatusDiv);
+    var okButton = new dijit.form.Button({
+        id: "okButton",
+        type: "submit",
+        label: opac_strings.OK
+    }).placeAt(requestStatusDiv);
+    responseDialog.attr("content", requestStatusDiv);
+    responseDialog.show();
+    dojo.connect(dijit.byId("okButton"), "onClick", responseDialog, "hide");
+}
+
+function createResetDialog() {
+    var pwResetFormDlg = new dijit.Dialog({
+        id: "pwResetFormDlg",
+        title: opac_strings.PWD_RESET_FORM_TITLE,
+        style: "width: 35em"
+    });
+    pwResetFormDlg.startup();
+
+    // Instantiate the form
+    var pwResetFormURL = "/opac/password/" + (OpenSRF.locale || "en-US") + "/";
+    var pwResetFormDiv = dojo.create("form", { id: "requestReset", style: "width: 30em", method: "post", action: pwResetFormURL });
+    dojo.create("p", { innerHTML: opac_strings.PWD_RESET_SUBMIT_PROMPT }, pwResetFormDiv);
+    var pwResetFormTable = dojo.create("table", null, pwResetFormDiv);
+    var pwResetFormTbody = dojo.create("tbody", null, pwResetFormTable);
+    var pwResetFormRow = dojo.create("tr", null, pwResetFormTbody);
+    var pwResetFormCell = dojo.create("td", null, pwResetFormRow);
+    var pwResetFormLabel = dojo.create("label", null, pwResetFormCell);
+    dojo.attr(pwResetFormCell, { innerHTML: opac_strings.BARCODE_PROMPT });
+    pwResetFormCell = dojo.create("td", null, pwResetFormRow);
+    var barcodeText = new dijit.form.TextBox({
+        id: "pwBarcode",
+        name: "barcode"
+    }).placeAt(pwResetFormCell);
+    pwResetFormRow = dojo.create("tr", {}, pwResetFormTbody);
+    pwResetFormCell = dojo.create("td", {}, pwResetFormRow);
+    dojo.attr(pwResetFormCell, { innerHTML: opac_strings.USERNAME_PROMPT });
+    pwResetFormCell = dojo.create("td", {}, pwResetFormRow);
+    var usernameText = new dijit.form.TextBox({
+        id: "pwUsername",
+        name: "username"
+    }).placeAt(pwResetFormCell);
+    dojo.create("br", null, pwResetFormDiv);
+    var submitButton = new dijit.form.Button({
+        id: "pwSubmit",
+        type: "submit",
+        label: opac_strings.SUBMIT_BUTTON_LABEL
+    }).placeAt(pwResetFormDiv);
+    var cancelButton = new dijit.form.Button({
+        id: "pwCancel",
+        type: "cancel",
+        label: opac_strings.CANCEL_BUTTON_LABEL
+    }).placeAt(pwResetFormDiv);
+
+    // Set the content of the Dialog to the pwResetForm
+    pwResetFormDlg.attr("content", pwResetFormDiv);
+    return pwResetFormDlg;
+}
+
diff --git a/Open-ILS/web/opac/skin/tadl/js/rdetail.js b/Open-ILS/web/opac/skin/tadl/js/rdetail.js
new file mode 100644 (file)
index 0000000..fe5bac4
--- /dev/null
@@ -0,0 +1,1387 @@
+
+/* */
+
+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 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 nextContainerIndex;
+
+var nextRecord;
+var prevRecord;
+
+var rdetailPrev = null;
+var rdetailNext = null;
+var rdetailStart = null;
+var rdetailEnd = null;
+
+var mfhdDetails = [];
+var orgHiding = false;
+
+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($('np_prev'));
+               unHideMe($('np_start'));
+               rdetailPrev = function() { _rdetailNav(prevRecord); };
+               rdetailStart = function() { _rdetailNav(cachedRecords.ids[0]); };
+       }
+
+       if(nextRecord) {
+               unHideMe($('np_table'));
+               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 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;
+
+       if(getLocation() == globalOrgTree.id())
+               hideMe(G.ui.rdetail.cp_info_all);
+
+    if(getRid()) {
+
+           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 = new Request(FETCH_ADV_ISBN_RIDS, getAdvTerm() );
+            req.callback(
+                function(r) {
+                    var blob = r.getResultObject();
+                    if(blob && blob.count > 0) 
+                        RID = blob.ids[0]; 
+                    var req2 = new Request(FETCH_RMODS, getRid());
+                    req2.callback(_rdetailDraw);
+                    req2.send();
+                }
+            );
+            req.send();
+        }
+    }
+
+
+       if (rdetailDisplaySerialHoldings && (
+        isXUL() || !fetchOrgSettingDefault(
+            getLocation(), "opac.fully_compressed_serial_holdings")
+        )
+    ) {
+               var req = new Request(FETCH_MFHD_SUMMARY, getRid());
+               req.callback(_holdingsDraw);
+               req.send();
+               if (isXUL()) {
+                       var here = findOrgUnit(getLocation());
+                       dojo.place("<div id='mfhd_ad_menu'></div>", "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 = [];
+
+    if(isXUL()) 
+        unHideMe($('rdetail_show_orders'));
+}
+
+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', record.doc_id() );
+
+       $('rdetail_view_marc_box').insertBefore(span, $('rdetail_view_marc_box').firstChild);
+}
+
+function rdetailForeignItems(r,id) {
+       hideMe($('rdetail_extras_loading'));
+    var tbody = $('rdetail_foreign_items_tbody');
+
+    var robj = r.getResultObject(); /* mvr list with foreign_copy_maps fleshed */
+
+    for (var i = 0; i < robj.length; i++) {
+        var args = {};
+        args.page = RDETAIL;
+        args[PARAM_OFFSET] = 0;
+        args[PARAM_RID] = robj[i].doc_id();
+        var row = elem('tr'); tbody.appendChild(row);
+        var td1 = elem('td'); row.appendChild(td1);
+        var title = elem(
+            'a',
+            {
+                'href' : buildOPACLink(args),
+                'class' : 'classic_link'
+            },
+            robj[i].title()
+        );
+        td1.appendChild(title);
+        var td2 = elem('td',{},robj[i].author()); row.appendChild(td2);
+        var td3 = elem('td'); row.appendChild(td3);
+        var details = elem(
+            'a',
+            {
+                'href' : 'javascript:void(0)',
+                'class' : 'classic_link'
+            },
+            'Copy Details'
+        );
+        details.onclick = function(idx,context_row){
+            return function() {
+                cpdBuild(
+                    tbody,
+                    context_row,
+                    robj[idx],
+                    null,
+                    1,
+                    0,
+                    1,
+                    dojo.map(
+                        robj[idx].foreign_copy_maps(),
+                        function(x){ return x.target_copy(); }
+                    ),
+                    dojo.map(
+                        robj[idx].foreign_copy_maps(),
+                        function(x){ return x.peer_type().name(); }
+                    )
+                );
+            };
+        }(i,row);
+        td3.appendChild(details);
+    }
+}
+
+
+
+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(), "rtype": "sre"},
+               "save": {
+                       "label": opac_strings.SAVE_MFHD_LABEL,
+                       "func": function(xmlString) {
+                               rec.marc(xmlString);
+                               rec.edit_date('now');
+                               rec.ischanged(true);
+                               pcrud.update(rec);
+                       }
+               },
+        'lock_tab' : typeof xulG != 'undefined' ? (typeof xulG['lock_tab'] != 'undefined' ? xulG.lock_tab : undefined) : undefined,
+        'unlock_tab' : typeof xulG != 'undefined' ? (typeof xulG['unlock_tab'] != 'undefined' ? xulG.unlock_tab : undefined) : undefined
+       };
+}
+
+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) {
+        // Only draw holdings within our OU scope
+        var here = findOrgUnit(getLocation());
+        var entryNum = 0;
+        dojo.forEach(holdings, function (item) {
+            if (orgIsMine(here, findOrgUnit(item.owning_lib()))) {
+                _holdingsDrawMFHD(item, entryNum);
+                entryNum++;
+            }
+        });
+    }
+
+    // Populate XUL menus
+    if (isXUL()) {
+        runEvt('rdetail','MFHDDrawn');
+    }
+}
+
+function _holdingsDrawMFHD(holdings, entryNum) {
+       var hb = holdings.basic_holdings();
+       var hba = holdings.basic_holdings_add();
+       var hs = holdings.supplement_holdings();
+       var hsa = holdings.supplement_holdings_add();
+       var hi = holdings.index_holdings();
+       var hia = holdings.index_holdings_add();
+       var ho = holdings.online();
+       var hm = holdings.missing();
+       var hinc = holdings.incomplete();
+       var hloc = holdings.location() || 'MFHD';
+
+       if (    hb.length == 0 && hba.length == 0 && hs.length == 0 &&
+               hsa.length == 0 && hi.length == 0 && hia.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
+                        */
+                       hb = ['PLACEHOLDER'];
+               } else {
+                       return null;
+               }
+       }
+
+       // Show entryNum + 1 in staff client for better menu correlation
+       // Maybe this should be holdings.sre_id() instead? (which could get long after time)
+       var entryNumString = '';
+       if (isXUL()) {
+               var entryNumInc = entryNum + 1;
+               entryNumString = ' [Entry #'+entryNumInc+'] ';
+       }
+
+       var refNode;
+       if (entryNum > 0) {
+               refNode = 'rdetail_holdings_table_' + (entryNum - 1);
+       } else {
+               refNode = 'rdetail_details_table';
+       }
+
+       dojo.place("<table style='width: 100%;' id='rdetail_holdings_table_"+entryNum+"'><caption id='mfhdHoldingsCaption" + entryNum + "' class='rdetail_header color_1'>" +
+               dojo.string.substitute(opac_strings.HOLDINGS_TABLE_CAPTION, [hloc]) + entryNumString +
+               "</caption><tbody id='rdetail_holdings_tbody_" + entryNum +
+               "'></tbody></table>", refNode, "after"
+       );
+       if (hb.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.BASIC_HOLDINGS, hb); }
+       if (hba.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.BASIC_HOLDINGS_ADD, hba); }
+       if (hs.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.SUPPLEMENT_HOLDINGS, hs); }
+       if (hsa.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.SUPPLEMENT_HOLDINGS_ADD, hsa); }
+       if (hi.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.INDEX_HOLDINGS, hi); }
+       if (hia.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.INDEX_HOLDINGS_ADD, hia); }
+       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() && holdings.sre_id() != -1) { // -1 indicates in-DB only holdings, so no button or menu entries for MFHD
+               mfhdDetails.push({ 'id' : holdings.sre_id(), 'label' : hloc, 'entryNum' : entryNum, 'owning_lib' : holdings.owning_lib() });
+               dojo.require('openils.Event');
+               dojo.require('openils.PermaCrud');
+               var mfhd_edit = new dijit.Menu({});
+               new dijit.MenuItem({onClick: function(){loadMarcEditor(holdings.sre_id())}, label:opac_strings.EDIT_MFHD_RECORD}).placeAt(mfhd_edit, "first");
+               new dijit.MenuItem({onClick:function(){
+                       // Avoid accidental deletion of MFHD records
+                       if (!confirm(opac_strings.DELETE_MFHD_CONFIRM)) {
+                               return;
+                       }
+                       var pcrud = new openils.PermaCrud({"authtoken": G.user.session});
+                       var mfhd_rec = pcrud.retrieve("sre", holdings.sre_id());
+                       if (mfhd_rec) {
+                               pcrud.eliminate(mfhd_rec);
+                               alert(dojo.string.substitute(opac_strings.DELETED_MFHD_RECORD, [holdings.sre_id()]));
+                       }
+               }, label:opac_strings.DELETE_MFHD}).placeAt(mfhd_edit, "last");
+               // new dijit.MenuItem({onClick:function(){alert("Edit properties " + holdings.sre_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("<tr><td> </td><td nowrap='nowrap' class='rdetail_desc'>" + entryName + "</td><td class='rdetail_item'>" + flatEntry + "</td></tr>", "rdetail_holdings_tbody_" + entryNum, "last");
+}
+
+function _rdetailDraw(r) {
+       record = r.getResultObject();
+
+       runEvt('rdetail', 'recordRetrieved', record.doc_id());
+
+       G.ui.rdetail.title.appendChild(text(record.title()));
+       buildSearchLink(STYPE_AUTHOR, record.author(), G.ui.rdetail.author);
+       G.ui.rdetail.isbn.appendChild(text(cleanISBN(record.isbn())));
+       G.ui.rdetail.edition.appendChild(text(record.edition()));
+       G.ui.rdetail.pubdate.appendChild(text(record.pubdate()));
+       G.ui.rdetail.publisher.appendChild(text(record.publisher()));
+       $('rdetail_physical_desc').appendChild(text(record.physical_description()));
+if (record.series()){
+   unHideMe($("series_row"));
+   $('rdetail_series').appendChild(text(record.series()));
+}
+
+       r = record.types_of_resource();
+       if(r) {
+               G.ui.rdetail.tor.appendChild(text(r[0]));
+               setResourcePic( G.ui.rdetail.tor_pic, r[0]);
+       }
+       G.ui.rdetail.abstr.appendChild(text(record.synopsis()));
+
+       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++) {
+               if (abbrs[i].getAttribute('name') == 'unapi') {
+                       span = abbrs[i];
+                       break;
+               }
+       }
+       buildunAPISpan( span, 'biblio-record_entry', record.doc_id() );
+
+       $('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'});
+        }
+    }
+
+
+       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 
+
+    // Proxied through Evergreen AddedContent module
+       acCollectData(cleanISBN(record.isbn()), rdetailhandleAC);
+
+    var currentISBN = cleanISBN(record.isbn());
+
+    // Not proxied, cross-site javascript
+
+    // ChiliFresh
+    if (chilifresh && chilifresh != '(none)' && currentISBN) {
+        $('chilifreshReviewLink').setAttribute('id','isbn_'+currentISBN);
+        $('chilifreshReviewResult').setAttribute('id','chili_review_'+currentISBN);
+        unHideMe($('rdetail_reviews_link'));
+        unHideMe($('rdetail_chilifresh_reviews'));
+        try {
+            chili_init();
+        } catch(E) {
+            console.log(E + '\n');
+            hideMe($('rdetail_reviews_link'));
+            hideMe($('rdetail_chilifresh_reviews'));
+        }
+    }
+
+    // Novelist
+    if (novelist && currentISBN) {
+        unHideMe($('rdetail_novelist_link'));
+    }
+
+    // Multi-Home / Foreign Items / Peer Bibs
+    var req = new Request( TEST_PEER_BIBS, record.doc_id() );
+    req.callback(function(r){
+        var test = r.getResultObject();
+        if (test == "1") {
+            unHideMe($('rdetail_foreign_items_link'));
+        }
+    }); 
+    req.send();
+
+        var curr_holds = getHoldCount(record.doc_id());
+        if (curr_holds)
+                $('rdetail_hold_count').appendChild(text(curr_holds));
+}
+
+
+
+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();
+}
+
+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);
+       }
+}
+
+
+var rdetailMarcFetched = false;
+var rdetailForeignItemsFetched = false;
+function rdetailShowExtra(type, args) {
+
+       hideMe($('rdetail_copy_info_div'));
+       hideMe($('rdetail_summary_div'));
+       hideMe($('rdetail_reviews_div'));
+       hideMe($('rdetail_toc_div'));
+       hideMe($('rdetail_anotes_div'));
+       hideMe($('rdetail_excerpt_div'));
+       hideMe($('rdetail_preview_div'));
+       hideMe($('rdetail_marc_div'));
+       hideMe($('cn_browse'));
+       hideMe($('rdetail_cn_browse_div'));
+       hideMe($('rdetail_novelist_div'));
+       hideMe($('rdetail_foreign_items_div'));
+       hideMe($('rdetail_notes_div'));
+
+       removeCSSClass($('rdetail_copy_info_link'), 'rdetail_extras_selected');
+       removeCSSClass($('rdetail_viewcn_link'), 'rdetail_extras_selected');
+       removeCSSClass($('rdetail_summary_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');
+       removeCSSClass($('rdetail_foreign_items_link'), 'rdetail_extras_selected');
+
+       switch(type) {
+
+               case "copyinfo": 
+                       unHideMe($('rdetail_copy_info_div')); 
+                       addCSSClass($('rdetail_copy_info_link'), 'rdetail_extras_selected');
+                       break;
+
+        case "summary":
+            addCSSClass($('rdetail_summary_link'), 'rdetail_extras_selected');
+            unHideMe($('rdetail_summary_div'));
+            break;
+
+               case "reviews": 
+                       addCSSClass($('rdetail_reviews_link'), 'rdetail_extras_selected');
+                       unHideMe($('rdetail_reviews_div')); 
+                       break;
+
+               case "excerpt": 
+                       addCSSClass($('rdetail_excerpt_link'), 'rdetail_extras_selected');
+                       unHideMe($('rdetail_excerpt_div'));
+                       break;
+
+               case "preview": 
+                       addCSSClass($('rdetail_preview_link'), 'rdetail_extras_selected');
+                       unHideMe($('rdetail_preview_div'));
+                       rdetailDisplayGBPreview();
+                       break;
+
+               case "anotes": 
+                       addCSSClass($('rdetail_anotes_link'), 'rdetail_extras_selected');
+                       unHideMe($('rdetail_anotes_div'));
+                       break;
+
+               case "toc": 
+                       addCSSClass($('rdetail_toc_link'), 'rdetail_extras_selected');
+                       unHideMe($('rdetail_toc_div'));
+                       break;
+
+               case "marc": 
+                       addCSSClass($('rdetail_viewmarc_link'), 'rdetail_extras_selected');
+                       unHideMe($('rdetail_marc_div')); 
+                       if(rdetailMarcFetched) return;
+                       unHideMe($('rdetail_extras_loading'));
+                       rdetailMarcFetched = true;
+                       var req = new Request( FETCH_MARC_HTML, record.doc_id() );
+                       req.callback(rdetailViewMarc); 
+                       req.send();
+                       break;
+
+               case "novelist": 
+                       addCSSClass($('rdetail_novelist_link'), 'rdetail_extras_selected');
+                       unHideMe($('rdetail_novelist_div')); 
+                       break;
+
+               case "foreign_items": 
+                       addCSSClass($('rdetail_foreign_items_link'), 'rdetail_extras_selected');
+                       unHideMe($('rdetail_foreign_items_div')); 
+            if(rdetailForeignItemsFetched) return;
+                       unHideMe($('rdetail_extras_loading'));
+            rdetailForeignItemsFetched = true;
+                       var req = new Request( FETCH_PEER_BIBS, record.doc_id() );
+                       req.callback(rdetailForeignItems); 
+                       req.send();
+                       break;
+
+               case 'cn':
+                       addCSSClass($('rdetail_viewcn_link'), 'rdetail_extras_selected');
+                       unHideMe($('rdetail_cn_browse_div'));
+                       rdetailShowCNBrowse(defaultCN[1], getLocation(), null, true);
+                       break;
+
+       }
+}
+
+function rdetailVolumeDetails(args) {
+       var row = $(args.rowid);
+       var tbody = row.parentNode;
+       cpdBuild( tbody, row, record, [args.cn_prefix, args.cn, args.cn_suffix], args.org, args.depth, args.copy_location );
+       return;
+}
+
+function rdetailBuildCNList() {
+
+       var select = $('cn_browse_selector');
+       var index = 0;
+       var arr = [];
+       for( var cn_json in callnumberCache ) arr.push( cn_json );
+       arr.sort();
+
+       if( arr.length == 0 ) {
+               hideMe($('rdetail_cn_browse_select_div'));
+               return;
+       }
+
+       for( var i = 0; i < arr.length; i++ ) {
+               var cn_json = arr[i];
+        var cn = JSON2js(cn_json);
+        var whole_cn_text = (cn[0] ? cn[0] + ' ' : '') + cn[1] + (cn[2] ? ' ' + cn[2] : '');
+               var opt = new Option(whole_cn_text,cn_json);
+               select.options[index++] = opt;
+       }
+       select.onchange = rdetailGatherCN;
+}
+
+function rdetailGatherCN() {
+       var cn = getSelectorVal($('cn_browse_selector'));
+       rdetailShowCNBrowse( JSON2js(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'), js2JSON(cn) );
+       hideMe($('rdetail_copy_info_div'));
+       hideMe($('rdetail_reviews_div'));
+       hideMe($('rdetail_summary_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.summary.html ) {
+               $('rdetail_summary_div').innerHTML = data.summary.html;
+               unHideMe($('rdetail_summary_link'));
+       }
+
+       if( data.reviews.html ) {
+               $('rdetail_review_container').innerHTML = data.reviews.html;
+               unHideMe($('rdetail_reviews_link'));
+       }
+
+       if( data.toc.html ) {
+               $('rdetail_toc_div').innerHTML = data.toc.html;
+               unHideMe($('rdetail_toc_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_anotes_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_toc_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, record.doc_id(), getLocation(), getDepth())
+       else
+               req = new Request(method, record.doc_id());
+       req.callback(_rdetailBuildInfoRows);
+       req.send();
+}
+
+function _rdetailRows(node) {
+
+       if( rdetailShowLocal && getLocation() != globalOrgTree.id() ) {
+               var loc = findOrgUnit(getLocation());
+               if( node ) {
+                       if( !orgIsMine(node, loc) && !orgIsMine(loc,node) ) return;
+               } else {
+            var kids = globalOrgTree.children();
+            if (kids) {
+                       for( var i = 0; i < kids.length; i++ ) {
+                               var org = findOrgUnit(kids[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 (orgHiding) {
+                       if (isTrue( findOrgType(node.ou_type()).can_have_vols() )) {
+                               if ( ! orgIsMine( orgHiding.org, node, orgHiding.depth ) ) {
+                                       return;
+                               }
+                       }
+               }
+
+               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; }
+
+    var kids = node.children();
+    if (kids) {
+       for( var c = 0; c < kids.length; c++ ) 
+               _rdetailRows(kids[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);
+
+       orgHiding = checkOrgHiding();
+
+       _rdetailRows();
+
+       var summary = r.getResultObject();
+       if(!summary) return;
+
+       var found = false;
+       for( var i = 0; i < summary.length; i++ ) {
+
+               var arr = summary[i];
+//MIEG: only the entities we want to see
+                if (arr[0] < 22 || arr[0] > 28) continue;
+
+               globalCNCache[js2JSON([arr[1],arr[2],arr[3]])] = 1; // prefix, label, suffix.  FIXME - Am I used anywhere?
+               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[4];
+               var cl = '';
+               if (rdetailShowCopyLocation) {
+                       cl = arr[4];
+                       statuses = arr[5];
+               }
+
+
+               rdetailApplyStatuses(rowNode, cpc_temp, statuses);
+
+               var isLocal = false;
+               if( orgIsMine( findOrgUnit(getLocation()), thisOrg ) ) { 
+                       found = true; 
+                       isLocal = true; 
+                       if(!localCNFound) {
+                               localCNFound = true;
+                               defaultCN = [arr[1],arr[2],arr[3]]; // prefix, label, suffix
+                       }
+               }
+
+               //if(isLocal) unHideMe(rowNode);
+               unHideMe(rowNode);
+
+               rdetailSetPath( thisOrg, isLocal );
+               rdetailBuildBrowseInfo( rowNode, [arr[1],arr[2],arr[3]], isLocal, thisOrg, cl );
+
+               if( i == summary.length - 1 && !defaultCN) defaultCN = [arr[1],arr[2],arr[3]]; // prefix, label, suffix
+       }
+
+       if(!found) unHideMe(G.ui.rdetail.cp_info_none);
+}
+
+function rdetailBuildBrowseInfo(row, cn, local, orgNode, cl) {
+
+    var whole_cn_json = js2JSON(cn);
+    var whole_cn_text = (cn[0] ? cn[0] + ' ' : '') + cn[1] + (cn[2] ? ' ' + cn[2] : '');
+
+       if(local) {
+               var cache = callnumberCache[whole_cn_json];
+               if( cache ) cache.count++;
+               else callnumberCache[whole_cn_json] = { count : 1 };
+       }
+
+       var depth = getDepth();
+       if( !local ) depth = findOrgDepth(globalOrgTree);
+
+       $n(row, 'rdetail_callnumber_cell').appendChild(text(whole_cn_text));
+
+       if (rdetailShowCopyLocation) {
+               var cl_cell = $n(row, 'rdetail_copylocation_cell');
+               cl_cell.appendChild(text(cl));
+               unHideMe(cl_cell);
+       }
+
+       _debug('setting action clicks for cn ' + whole_cn_text);
+
+       var dHref = 'javascript:rdetailVolumeDetails('+
+                       '{copy_location : "'+cl.replace(/\"/g, '\\"')+'", rowid : "'+row.id+'", cn_prefix :"'+cn[0].replace(/\"/g, '\\"')+'",cn :"'+cn[1].replace(/\"/g, '\\"')+'",cn_suffix :"'+cn[2].replace(/\"/g, '\\"')+'", depth:"'+depth+'", org:"'+orgNode.id()+'", local: '+local+'});';
+
+       var bHref = 'javascript:rdetailShowCNBrowse("'+cn[1].replace(/\"/g, '\\"') + '", '+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())
+//MIEG: Custom Status Columns
+                      && c.name() != 'Courtesy Hold'
+                     && c.name() != 'Reserves'
+                ) {
+
+                       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 after the main page loads
+ */
+function rdetailCheckForGBPreview() {
+       if (!rdetailGoogleBookPreview) return;
+        dojo.addOnLoad(function() {
+               searchForGBPreview( cleanISBN(record.isbn()) );
+       });
+}
+
+/**
+ *
+ * @param {DOM object} isbn The form element containing the input parameters "isbns"
+ */
+function searchForGBPreview( isbn ) {
+       dojo.require("dojo.io.script");
+       dojo.io.script.get({"url": "https://www.google.com/jsapi"});
+       dojo.io.script.get({"url": "http://books.google.com/books", "content": { "bibkeys": isbn, "jscmd": "viewapi", "callback": "GBPreviewCallback"}});
+}
+
+/**
+ * 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} GBPBookInfo 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" ) {
+               // 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 rdetailDrawExpandedHoldings(anchor, bibid, type) {
+    var offsets = {"basic": 0, "index": 0, "supplement": 0};
+    var limit = 10; /* XXX give user control over this? */
+    var target_id = "holding_type_" + type;
+    var target = dojo.byId(target_id);
+
+    anchor.innerHTML = "[-]";
+    anchor.oldonclick = anchor.onclick;
+    anchor.onclick = function() {
+        anchor.onclick = anchor.oldonclick;
+        anchor.innerHTML = "[+]";
+        dojo.empty(target);
+    };
+
+    function _load() {
+        dojo.empty(target);
+        fieldmapper.standardRequest(
+            ["open-ils.serial",
+                "open-ils.serial.received_siss.retrieve.by_bib.atomic"], {
+                "params": [bibid, {"offset": offsets[type], "limit": limit}],
+                "async": true,
+                "oncomplete": function(r) {
+                    try {
+                        if (msg = r.recv().content()) { /* sic, assignment */
+                            if (!msg.length) return;
+                            offsets[type] += msg.length;
+                            var table = dojo.create("table", null, target);
+                            dojo.forEach(
+                                msg, function(o) {
+                                    var tr = dojo.create("tr", null, table);
+                                    dojo.create(
+                                        "td", {
+                                            "innerHTML": o.issuance.label(),
+                                            "style": {"paddingLeft": "3em"}
+                                        }, tr
+                                    );
+
+                                    if (!o.has_units) return;
+                                    /* can't place holds if no units */
+                                    var td = dojo.create("td", null, tr);
+                                    dojo.create(
+                                        "a", {
+                                            "href":"javascript:void(0);",
+                                            "style": {"marginLeft": "1.5em"},
+                                            "onclick": function() {
+                                                holdsDrawEditor({
+                                                    "type": "I",
+                                                    "issuance": o.issuance.id()
+                                                });
+                                            },
+                                            "innerHTML": "[" +
+                                                opac_strings.PLACE_HOLD + "]"
+                                        }, td
+                                    );
+                                }
+                            );
+                            if (msg.length == limit) {
+                                dojo.create("br", null, target);
+                                dojo.create(
+                                    "a", {
+                                        "href": "javascript:void(0);",
+                                        "innerHTML":
+                                            "[" + opac_strings.MORE + "]",
+                                        "onclick": _load
+                                    }, target
+                                );
+                            }
+                        }
+                    } catch (E) {
+                        void(0);
+                    }
+                }
+            }
+        );
+    }
+    _load();
+}
diff --git a/Open-ILS/web/opac/skin/tadl/js/result_common.js b/Open-ILS/web/opac/skin/tadl/js/result_common.js
new file mode 100644 (file)
index 0000000..0b67f4c
--- /dev/null
@@ -0,0 +1,862 @@
+dojo.require('openils.BibTemplate');
+dojo.requireLocalization("openils.opac", "opac");
+var opac_strings = dojo.i18n.getLocalization("openils.opac", "opac");
+
+var recordsHandled = 0;
+var recordsCache = [];
+var lowHitCount = 4;
+var isbnList = '';
+var googleBooksLink = false;
+
+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($('result_info_2'))}, fetchGoogleBooksLink, fetchChiliFreshReviews);
+
+       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;
+}
+
+
+
+
+/* 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;
+       }
+
+       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;
+
+
+       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 my_ou = findOrgUnit(args.org_unit);
+        if (my_ou && my_ou.shortname()) {
+                var atomfeed = "/opac/extras/opensearch/1.1/" + my_ou.shortname() + "/atom-full/" + getStype() + '?searchTerms=' + getTerm();
+                if (args.facets) { atomfeed += ' ' + args.facets; }
+                if (sort) { atomfeed += '&searchSort=' + sort; }
+                if (sortdir) { atomfeed += '&searchSortDir=' + sortdir; }
+                dojo.create('link', {"rel":"alternate", "href":atomfeed, "type":"application/atom+xml"}, dojo.query('head')[0]);
+        }
+
+       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'));
+                       $('including_results_location').appendChild(text(tmporg.name()));
+               }
+       }
+
+
+       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);
+
+       $('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() {
+       showCanvas();
+       unHideMe($('result_low_hits'));
+       unHideMe($('result_zero_hits_msg'));
+       //if(getTerm()) resultExpandSearch(); /* advanced search */
+}
+
+function resultExpandSearch() {
+       var top = findOrgDepth(globalOrgTree);
+        if (top == 0) top=1;
+       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.found && blob.suggestions && blob.suggestions[0] ) {
+                               newterm += " " + blob.suggestions[0];
+                               unHideMe($('did_you_mean'));
+                       } else {
+                               newterm += " " + word;
+                       }
+               }
+       }
+
+       var arg = {};
+       arg[PARAM_TERM] = newterm;
+       $('spell_check_link').setAttribute('href', buildOPACLink(arg));
+       $('spell_check_link').appendChild(text(newterm));
+}
+
+
+function resultPaginate() {
+       var o = getOffset();
+
+       if( !(  ((o) + getDisplayCount()) >= getHitCount()) ) {
+
+               var args = {};
+               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();
+
+        /*
+               G.ui.result.end_link.setAttribute("href", buildOPACLink(args)); 
+               addCSSClass(G.ui.result.end_link, config.css.result.nav_active);
+
+               $('end_link2').setAttribute("href", buildOPACLink(args)); 
+               addCSSClass($('end_link2'), config.css.result.nav_active);
+        */
+       }
+
+       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);
+
+               $('search_home_link2').setAttribute( "href", buildOPACLink(args)); 
+               addCSSClass($('search_home_link2'), config.css.result.nav_active);
+       }
+
+       if(getDisplayCount() < getHitCount()) {
+               unHideMe($('start_end_links_span'));
+               unHideMe($('start_end_links_span2'));
+   }
+
+       showCanvas();
+       try{searchTimer.stop()}catch(e){}
+}
+
+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 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 = new mvr(); /* so the page won't die if there was an error */
+       recordsHandled++;
+       recordsCache.push(rec);
+
+       var r = table.rows[pos + 1];
+    var currentISBN = cleanISBN(rec.isbn());
+
+    if (googleBooksLink) {
+           var gbspan = $n(r, "googleBooksLink");
+        if (currentISBN) {
+            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
+            )
+        }
+    }
+*/
+
+/*
+       try {
+               var rank = parseFloat(ranks[pos + getOffset()]);
+               rank            = parseInt( rank * 100 );
+               var relspan = $n(r, "relevancy_span");
+               relspan.appendChild(text(rank));
+               unHideMe(relspan.parentNode);
+       } catch(e){ }
+*/
+
+        var pic = $n(r, config.names.result.item_jacket);
+        if (currentISBN) {
+                pic.setAttribute("src", buildISBNSrc(currentISBN));
+        } else {
+                pic.setAttribute("src", "/opac/images/blank.png");
+        }
+
+       var title_link = $n(r, config.names.result.item_title);
+       var author_link = $n(r, config.names.result.item_author);
+
+       var onlyrec;
+       if( is_mr )  {
+               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));
+               }
+
+               unHideMe($n(r,'place_hold_span'));
+               $n(r,'place_hold_link').onclick = function() { resultDrawHoldsWindow(rec.doc_id(), 'M'); }
+
+       } else {
+               onlyrec = rec.doc_id();
+               buildunAPISpan($n(r,'unapi'), 'biblio-record_entry', rec.doc_id());
+
+               buildTitleDetailLink(rec, title_link); 
+               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').onclick = function() { resultDrawHoldsWindow(rec.doc_id(), 'T'); }
+
+       }
+
+       buildSearchLink(STYPE_AUTHOR, rec.author(), author_link);
+
+       if(! is_mr ) {
+       
+               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 );
+
+       var bt_params = {
+               sync                    : false,
+               root                    : r,
+               subObjectLimit  : 10,
+               org_unit                : findOrgUnit(getLocation()).shortname(),
+               depth                   : getDepth()
+       };
+
+       if (!is_mr) {
+               bt_params = dojo.mixin( bt_params, { record : onlyrec } );
+       } else {
+               bt_params = dojo.mixin( bt_params, { metarecord : onlyrec } );
+       }
+
+       if (findOrgType(findOrgUnit(getLocation()).ou_type()).can_have_vols())
+               unHideMe($n(r,'local_callnumber_list'));
+
+       new openils.BibTemplate( bt_params ).render();
+
+       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 = rec.types_of_resource();
+
+       for( var i in ress ) {
+
+               var res = ress[i];
+               if(!res) continue;
+
+               var link = $n(row, res + "_link");
+               link.title = res;
+               var img = link.getElementsByTagName("img")[0];
+               removeCSSClass( img, config.css.dim );
+
+               var f = getForm();
+               if( f != "all" ) {
+                       if( f == modsFormatToMARC(res) ) 
+                               addCSSClass( img, "dim2_border");
+               }
+
+               var args = {};
+               args[PARAM_OFFSET] = 0;
+
+               if(is_mr) {
+                       args.page = RRESULT;
+                       args[PARAM_TFORM] = modsFormatToMARC(res);
+                       args[PARAM_MRID] = rec.doc_id();
+
+               } else {
+                       args.page = RDETAIL
+                       args[PARAM_RID] = rec.doc_id();
+               }
+
+               link.setAttribute("href", buildOPACLink(args));
+
+       }
+}
+
+function fetchGoogleBooksLink () {
+    if (isbnList && googleBooksLink) {
+        var scriptElement = document.createElement("script");
+        scriptElement.setAttribute("id", "jsonScript");
+        scriptElement.setAttribute("src",
+            "http://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 fetchChiliFreshReviews() {
+    return;  // wtf is chilifresh?
+    if (chilifresh && chilifresh != '(none)') {
+        try { chili_init(); } catch(E) { dump(E + '\n'); }
+    }
+}
+
+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_<depth>_<pagePosition>'  */
+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 start_here = 1;
+       var orgHiding = checkOrgHiding();
+       if (orgHiding) {
+               for (var i = 0; i < nodes.length; i++) {
+                       if (orgHiding.depth == findOrgDepth(nodes[i])) {
+                               start_here = i;
+                       }
+               }
+       }
+
+       var node = nodes[start_here];
+       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;
+       }
+
+       if(nodes[start_here+1]) {
+
+               var x = start_here+1;
+               var d = findOrgDepth(nodes[start_here+1]);
+               var d2 = findOrgDepth(nodes[nodes.length -1]);
+
+               for( var i = d; i <= d2 ; i++ ) {
+       
+                       ccell = ccell.cloneNode(true);
+
+                       //if((i % 2)) removeCSSClass(ccell, "copy_count_cell_even");
+                       //else addCSSClass(ccell, "copy_count_cell_even");
+
+                       var node = nodes[x++];
+                       var type = findOrgType(node.ou_type());
+       
+                       ccell.id = "copy_count_cell_" + type.depth() + "_" + pagePosition;
+                       ccell.title = type.opac_label();
+                       countsrow.insertBefore(ccell, lastcell);
+                       lastcell = ccell;
+
+                       if(ccheadcell) {
+                               var t = ccheadcell.cloneNode(true);
+                               t.appendChild(text(type.opac_label()));
+                               ccrow.insertBefore(t, lastheadcell);
+                               lastheadcell = t;
+                       }
+               }
+       }
+
+       unHideMe($("search_info_table"));
+}
+
+/* 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;
+
+       if (getLasso()) {
+               var copy_counts_lasso = {
+                       transcendant : null,
+                       count : 0,
+                       unshadow : 0,
+                       available : 0,
+                       depth : -1,
+                       org_unit : getLasso()
+               };
+
+               for (var i in copy_counts) {
+                       copy_counts_lasso.transcendant = copy_counts[i].transcendant;
+                       copy_counts_lasso.count += parseInt(copy_counts[i].count);
+                       copy_counts_lasso.unshadow += parseInt(copy_counts[i].unshadow);
+                       copy_counts_lasso.available += parseInt(copy_counts[i].available);
+               }
+
+               copy_counts = [ copy_counts_lasso ];
+       }
+
+       var i = 0;
+       while(copy_counts[i] != null) {
+               var cell = $("copy_count_cell_" + i +"_" + pagePosition);
+               if (cell) {
+                       var cts = copy_counts[i];
+                       cell.appendChild(text(cts.available + " / " + cts.count));
+
+                       if(isXUL()) {
+                               /* here we style opac-invisible records for xul */
+
+                               if( cts.depth == 1 ) {
+                                       if(cts.transcendant == null && cts.unshadow == 0) {
+                                               _debug("found an opac-shadowed record: " + rec.doc_id());
+                                               var row = cell.parentNode.parentNode.parentNode.parentNode.parentNode; 
+                                               if( cts.count == 0 ) 
+                                                       addCSSClass( row, 'no_copies' );
+                                               else 
+                                                       addCSSClass( row, 'shadowed' );
+                                       }
+                               }
+                       }
+               }
+               i++;
+       }
+}
+
+
diff --git a/Open-ILS/web/opac/skin/tadl/js/rresult.js b/Open-ILS/web/opac/skin/tadl/js/rresult.js
new file mode 100644 (file)
index 0000000..6dccc49
--- /dev/null
@@ -0,0 +1,359 @@
+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)));
+       }
+       rresultCollectIds();
+}
+
+function rresultCollectIds() {
+       var ids;
+
+
+    var holdTarget = new CGI().param('hold_target');
+    if(holdTarget != null) {
+        rresultHandlePlaceHold(holdTarget);
+        return;
+    }
+
+    var rtype = getRtype();
+    if (rtype && rtype.indexOf('|') > -1)
+        rtype = rtype.substring(0,rtype.indexOf('|'));
+
+       switch(rtype) {
+
+               case RTYPE_COOKIE:
+                       ids = JSON2js(dojo.cookie(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});
+       /*
+       dojo.cookie(COOKIE_SRIDS, json, {'expires':1});
+       */
+
+       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;
+
+    // don't perform rdetail redirect if user was on rdetail and cliecked Back
+    if(findCurrentPage() == RRESULT && isXUL()) {
+        if(ids.length == 1 && !xulG.fromBack) {
+            var args = {};
+            args.page = RDETAIL;
+            args[PARAM_OFFSET] = 0;
+            args[PARAM_RID] = ids[0];
+            location.href = buildOPACLink(args);
+        }
+    }
+
+       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;
+    dojo.require('dojo.cookie');
+    dojo.cookie(COOKIE_SEARCH, js2JSON(result.compiled_search));
+       _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/tadl/js/search_bar.js b/Open-ILS/web/opac/skin/tadl/js/search_bar.js
new file mode 100644 (file)
index 0000000..76d123d
--- /dev/null
@@ -0,0 +1,91 @@
+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() : "";
+       if (!isFrontPage) G.ui.searchbar.facets.value = (getFacet() != null) ? getFacet() : "";
+       setSelector(_ts,        getStype());
+       setSelector(_fs,        getForm());
+
+       depthSelInit();
+
+
+       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());
+    }
+}
+
+function searchBarSubmit(isFilterSort) {
+
+       var text = G.ui.searchbar.text.value;
+       var facet_text = isFrontPage ? '' : G.ui.searchbar.facets.value;
+
+       clearSearchParams();
+
+       if(!text || text == "") return;
+
+       var d   = (newSearchDepth != null) ?  newSearchDepth : depthSelGetDepth();
+       if(isNaN(d)) d = 0;
+
+       var args = {};
+
+       if(SHOW_MR_DEFAULT || 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_TERM]                = text;
+       args[PARAM_FACET]               = facet_text;
+       args[PARAM_LOCATION] = depthSelGetNewLoc();
+       args[PARAM_DEPTH]               = d;
+       args[PARAM_FORM]                = _fs.options[_fs.selectedIndex].value;
+
+    if($('opac.result.limit2avail')) {
+        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]
+        }
+    }
+
+       goTo(buildOPACLink(args));
+}
+
+
diff --git a/Open-ILS/web/opac/skin/tadl/js/sidebar.js b/Open-ILS/web/opac/skin/tadl/js/sidebar.js
new file mode 100644 (file)
index 0000000..c11a50f
--- /dev/null
@@ -0,0 +1,224 @@
+/* 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);
+        unHideMe($("overdrive"));
+       }
+
+       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() {
+
+       if(doLogin(true)) {
+
+               if(!strongPassword( G.ui.login.password.value ) ) {
+
+            dojo.require('dojo.cookie');
+                       dojo.cookie(COOKIE_SES, "");
+                       hideMe($('login_table'));
+                       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];
+       if(!org) org = G.user.home_ou();
+
+       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() {
+    swapCanvas(G.ui.login.box);
+    try{G.ui.login.username.focus();} catch(e) {}
+
+    G.ui.login.cancel.onclick = function(evt) { 
+        G.ui.login.form.setAttribute('action',
+            'javascript:showCanvas();runEvt("common", "loginCanceled");'); 
+    };
+
+    if(findCurrentPage() == MYOPAC) {
+        G.ui.login.cancel.onclick = function(evt) { 
+            G.ui.login.form.setAttribute('action','javascript: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() {
+/*
+       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/tadl/js/sidebar_extras.js b/Open-ILS/web/opac/skin/tadl/js/sidebar_extras.js
new file mode 100644 (file)
index 0000000..cb35d88
--- /dev/null
@@ -0,0 +1,243 @@
+
+/* 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 ) {
+       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/tadl/js/tips.js b/Open-ILS/web/opac/skin/tadl/js/tips.js
new file mode 100644 (file)
index 0000000..48fa83a
--- /dev/null
@@ -0,0 +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);
+        try { tip_div.appendChild( tips[index] ); } catch(E) {}
+               removeCSSClass(tip_div, 'hide_me');
+       }
+}
+
diff --git a/Open-ILS/web/opac/skin/tadl/xml/advanced.xml b/Open-ILS/web/opac/skin/tadl/xml/advanced.xml
new file mode 100644 (file)
index 0000000..f3e84e5
--- /dev/null
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!-- Loads the environment -->
+<!--#include virtual="setenv.xml"-->
+
+<!DOCTYPE html PUBLIC 
+       "-//W3C//DTD XHTML 1.0 Transitional//EN" 
+       "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" [
+       <!--#include virtual="/opac/locale/${locale}/opac.dtd"-->
+]>
+
+
+<html xmlns='http://www.w3.org/1999/xhtml'>
+       <!--#include virtual="header.xml"-->
+       <!--#if expr="$OILS_PAGE='index.xml'"-->
+               <!--#include virtual="home/index_body.xml"-->
+       <!--#else-->
+               <!--#include virtual="body.xml"-->
+       <!--#endif-->
+</html>
+
diff --git a/Open-ILS/web/opac/skin/tadl/xml/advanced/adv_global_row.xml b/Open-ILS/web/opac/skin/tadl/xml/advanced/adv_global_row.xml
new file mode 100644 (file)
index 0000000..f5c5ca7
--- /dev/null
@@ -0,0 +1,36 @@
+<!--
+<tr id='adv_global_trow' type='input'>
+-->
+<tr id='<!--#echo var="adv_global_row_id"-->' type='input'>
+       <td align='center' width='100%' nowrap='nowrap'>
+
+               <!-- select the search class -->
+               <select name='type' style='margin-right: 7px;'>
+                       <option value='keyword' selected='selected'>&common.keyword;</option>
+                       <option value='title'>&common.title;</option>
+                       <option value='author'>&common.author;</option>
+                       <option value='subject'>&common.subject;</option>
+                       <option value='series'>&common.series;</option>
+               </select>
+       
+               <!-- select how to treat the text -->
+               <select name='contains' style='margin-right: 7px;'>
+                       <option value='contains'>&opac.advanced.refined.contains;</option>
+                       <option value='nocontains'>&opac.advanced.refined.nocontains;</option>
+                       <option value='exact'>&opac.advanced.refined.exact;</option>
+               </select>
+                       
+               <!-- search term -->
+               <input type='text' size='18' name='term' style='margin-right: 3px;' />
+       
+               <!-- Remove this row -->
+        <button 
+                       onclick='
+                               var row = this.parentNode.parentNode;
+                               var tbody = row.parentNode;
+                               if( tbody.getElementsByTagName("tr").length > 2 )
+                                       row.parentNode.removeChild(row);'>X</button>
+
+       </td>
+</tr>
+
diff --git a/Open-ILS/web/opac/skin/tadl/xml/advanced/advanced_global.xml b/Open-ILS/web/opac/skin/tadl/xml/advanced/advanced_global.xml
new file mode 100644 (file)
index 0000000..003a17f
--- /dev/null
@@ -0,0 +1,309 @@
+<table id='adv_global_search' class='data_grid data_grid_center' width='100%'>
+
+       <style type="text/css">
+               #adv_global_search select { width: 13em; }
+               #adv_global_input_table select { width: 7em; }
+               .adv_adv_link { font-size: 8pt; color: red; }
+       </style>
+
+       <script language='javascript' type='text/javascript' src='<!--#echo var="OILS_OPAC_JS_HOST"-->/skin/tadl/js/adv_global.js'> </script>
+
+       <tr style='border-bottom: none;'>
+
+               <!-- Contains the user-addable(?) rows to define search class, containment and text -->
+               <td valign='top' width='65%' style='border-bottom: none;'>
+                       <table width='100%' id='adv_global_input_table'>
+       
+                               <thead>
+                                       <tr><td colspan='2' align='center'>&advanced.search.title;</td></tr>
+                               </thead>
+                               <tbody id='adv_global_tbody'>
+
+                                       <script language='javascript' type='text/javascript'>
+                                               config.ids.common.now_searching = 'now_searching_location';
+                                       </script>
+
+                                       <!--#set var="adv_global_row_id" value="adv_global_trow"-->
+                                       <!--#include virtual="adv_global_row.xml"-->
+
+                                       <!--#set var="adv_global_row_id" value=""-->
+                                       <!--#include virtual="adv_global_row.xml"-->
+                                       <!--#include virtual="adv_global_row.xml"-->
+
+                                       <!-- add a new row -->
+                                       <tr id='adv_global_addrow'>
+                                               <td align='center'>
+                            <button onclick='clearSearchBoxes();'>&advanced.search.reset;</button>
+                            <span style='padding-left: 10px;'> </span>
+                                                       <button id='myopac_new_global_row' onclick='advAddGblRow();'>&advanced.add.row;</button>
+                                                       <span style='padding-left: 10px;'> </span>
+                            <button onclick='advSubmitGlobal();'>&advanced.search.submit;</button>
+                                               </td>
+                                       </tr>
+
+                               </tbody>
+                       </table>
+               </td>
+
+
+               <td rowspan='2'>
+
+                       <table width='100%'>
+                               <thead>
+                                       <tr><td colspan='2' align='center'>&advanced.search.filters;</td></tr>
+                               </thead>
+                               <tbody>
+
+                                       <tr>
+                                               <td align='right'>
+                                                       <span>&advanced.item.form;</span>
+                                               </td>
+                                               <td align='left'>
+                                                       <select multiple='multiple' size='3' id='adv_global_item_form'>
+                                                       </select>       
+                                               </td>
+                                       </tr>
+
+                                       <tr>
+                                               <td align='right'>
+                                                       <span>&advanced.item.type;</span>
+                                                       <a id='adv_global_item_type_link_adv' class='classic_link adv_adv_link'
+                                                               href='javascript:void(0);' onclick='
+                                                               hideMe($("adv_global_item_type_basic"));
+                                                               unHideMe($("adv_global_item_type"));
+                                                               hideMe(this);
+                                                               unHideMe($("adv_global_item_type_link_basic"));
+                                                               '>&advanced.link;</a>
+
+                                                       <a id='adv_global_item_type_link_basic' class='hide_me classic_link adv_adv_link'
+                                                               href='javascript:void(0);' onclick='
+                                                               unHideMe($("adv_global_item_type_basic"));
+                                                               hideMe($("adv_global_item_type"));
+                                                               unHideMe($("adv_global_item_type_link_adv"));
+                                                               hideMe(this);
+                                                               '>&advanced.basic.link;</a>
+                                               </td>
+
+                                               <td align='left'>
+                                                       <select multiple='multiple' size='3' id='adv_global_item_type' class='hide_me'>
+                                                       </select>       
+                                                       <select multiple='multiple' size='3' id='adv_global_item_type_basic'>
+                                                               <option value='at'>&opac.search.books;</option>
+                                                               <option value='i'>&opac.search.audioBooks;</option>
+                                                               <option value='g'>&opac.search.videoRecordings;</option>
+                                                               <option value='j'>&opac.search.music;</option>
+                                                               <option value='m'>&opac.search.electronic;</option>
+                                                       </select>       
+                                               </td>
+                                       </tr>
+
+                                       <tr>
+                                               <td align='right'>
+                                                       <span>&advanced.literary.form;</span>
+                                                       <a id='adv_global_lit_form_link_adv' class='classic_link adv_adv_link'
+                                                               href='javascript:void(0);' onclick='
+                                                               hideMe($("adv_global_lit_form_basic"));
+                                                               unHideMe($("adv_global_lit_form"));
+                                                               hideMe(this);
+                                                               unHideMe($("adv_global_lit_form_link_basic"));
+                                                               '>&advanced.link;</a>
+
+                                                       <a id='adv_global_lit_form_link_basic' class='hide_me classic_link adv_adv_link'
+                                                               href='javascript:void(0);' onclick='
+                                                               unHideMe($("adv_global_lit_form_basic"));
+                                                               hideMe($("adv_global_lit_form"));
+                                                               unHideMe($("adv_global_lit_form_link_adv"));
+                                                               hideMe(this);
+                                                               '>&advanced.basic.link;</a>
+                                               </td>
+                                               <td align='left'>
+                                                       <select multiple='multiple' size='3' id='adv_global_lit_form' class='hide_me'>
+                                                       </select>       
+                                                       <select multiple='multiple' size='3' id='adv_global_lit_form_basic'>
+                                                               <option value='0 '>&advanced.non.fiction;</option>
+                                                               <option value='1'>&advanced.fiction;</option>
+                                                       </select>       
+                                               </td>
+                                       </tr>
+
+
+                                       <!-- Language selector -->
+                                       <tr>
+                                               <td align='right'>
+                                                       <span>&advanced.language;</span>
+                                               </td>
+
+                                               <td align='left'>
+                                                       <select multiple='multiple' size='3' id='adv_global_lang'>
+                                                               <!--#include virtual="../../../../../common/xml/item_lang_options.xml"-->
+                                                       </select>
+                                               </td>
+                                       </tr>
+
+                                       <!-- Audience selector -->
+                                       <tr>
+                                               <td align='right'>
+                                                       <span>&advanced.audience;</span>
+
+                                                       <a id='adv_global_audience_link_adv' class='classic_link adv_adv_link'
+                                                               href='javascript:void(0);' onclick='
+                                                               hideMe($("adv_global_audience_basic"));
+                                                               unHideMe($("adv_global_audience"));
+                                                               hideMe(this);
+                                                               unHideMe($("adv_global_audience_link_basic"));
+                                                               '>&advanced.link;</a>
+
+                                                       <a id='adv_global_audience_link_basic' class='hide_me classic_link adv_adv_link'
+                                                               href='javascript:void(0);' onclick='
+                                                               unHideMe($("adv_global_audience_basic"));
+                                                               hideMe($("adv_global_audience"));
+                                                               unHideMe($("adv_global_audience_link_adv"));
+                                                               hideMe(this);'>&advanced.basic.link;</a>
+                                               </td>
+
+                                               <td align='left'>
+                                                       <select multiple='multiple' size='3' id='adv_global_audience' class='hide_me'>
+                                                       </select>
+                                                       <select multiple='multiple' size='3' id='adv_global_audience_basic'>
+                                                               <option value='e '>&advanced.adult;</option>
+                                                               <option value='abcdj'>&advanced.juvenile;</option>
+                                                               <option value='fg '>&advanced.general;</option>
+                                                       </select>
+                                               </td>
+                                       </tr>
+
+                                       <tr>
+                                               <td align='right'>
+                                                       <span>&advanced.biblevel;</span>
+                                               </td>
+                                               <td align='left'>
+                                                       <select multiple='multiple' size='3' id='adv_global_bib_level'>
+                                                       </select>       
+                                               </td>
+                                       </tr>
+
+                                       <tr>
+                                               <td align='right'>
+                                                       <span>&advanced.filter.pubyear;</span>
+                                               </td>
+                                               <td align='left'>
+                                                       <select id='adv_global_pub_date_type' onchange='
+                                if($("adv_global_pub_date_type").selectedIndex == 3)
+                                    unHideMe($("adv_global_pub_date_2_span"));
+                                else
+                                    hideMe($("adv_global_pub_date_2_span"));'>
+                                <option value='equals' selected='selected'>&advanced.filter.pubyear.equals;</option>
+                                <option value='before'>&advanced.filter.pubyear.before;</option>
+                                <option value='after'>&advanced.filter.pubyear.after;</option>
+                                <option value='between'>&advanced.filter.pubyear.between;</option>
+                                                       </select>       
+                            <div style='margin-top:5px;'>
+                                <input id='adv_global_pub_date_1' type='text' size='4' maxlength='4'/>
+                                <span id='adv_global_pub_date_2_span' class='hide_me'>
+                                   &common.and; <input id='adv_global_pub_date_2' type='text' size='4' maxlength='4'/>
+                                </span>
+                            </div>
+                                               </td>
+                                       </tr>
+
+
+                    <!-- copy location selector -->
+                    <tr id='adv_copy_location_filter_row' class='hide_me'>
+                        <td align='right'>&opac.advanced.copy_loc_filter;</td>
+                        <td align='left' id='adv_copy_location_filter_td'>
+                            <select size='3' id='adv_copy_location_filter_select' multiple='multiple'>
+                            </select>
+                        </td>
+                    </tr>
+                               </tbody>
+                       </table>
+               </td>
+       </tr>
+
+       <tr style='border-top: none;'>
+               <td align='center' valign='top' style='border-top: none;'>
+
+                       <table style='border: none; width: 100%;'>
+                               <tr>
+                                       <td align='center' width='100%'>
+                                               <table class='' width='100%'>
+                       
+                                                       <thead>
+                                                               <tr>
+                                                                       <td align='center' width='50%'>&advanced.sort.criteria;</td>
+                                                                       <td align='center'>&advanced.search.library;</td>
+                                                               </tr>
+                                                       </thead>
+                       
+                                                       <tbody>
+                                                               <tr>
+
+                           <script language='javascript' type='text/javascript'>
+                              function __setsortsel() {
+                                 var sel = $('adv_global_sort_by')
+                                                                                  if(sel.selectedIndex == 0) {
+                                                                                          $("adv_global_sort_dir").disabled = true;
+                                                                                          $("adv_global_sort_dir").selectedIndex = 0;
+                                                                                  } else $("adv_global_sort_dir").disabled = false;
+                              }
+                           </script>
+
+                                                                       <td align=''>
+                                                                               <select id='adv_global_sort_by' onchange='__setsortsel();'>
+                                                                                       <option value='rel'>&advanced.relevance;</option>
+                                                                                       <option value='titlesort'>&common.title;</option>
+                                                                                       <option value='authorsort'>&common.author;</option>
+                                                                                       <option value='pubdate'>&advanced.pubdate;</option>
+                                                                               </select>
+                                                                       </td>
+
+
+                                                                       <td align='center' width='100%' nowrap='nowrap'>
+                                                                               <b id='now_searching_location'> </b>
+                                                                       </td>
+
+                                                               </tr>
+                       
+                                                               <tr>
+
+                                                                       <td>
+                                                                               <select id='adv_global_sort_dir' disabled='disabled'>
+                                                                                       <option value='asc'>&advanced.sort.asc;</option>
+                                                                                       <option value='desc'>&advanced.sort.desc;</option>
+                                                                               </select>
+                                                                       </td>
+
+                           <!-- force the enable/disable sort dir code to run -->
+                           <script language='javascript' type='text/javascript'>__setsortsel();</script>
+
+                                                                       <td align='center'>
+                                                                               <!--#include virtual="../common/libselect.xml"-->
+                                                                       </td>
+
+                                                               </tr>
+                                                               <tr>
+                                                                       <td align='center'>
+                                                                               <span>&advanced.frbrize;</span>
+                                                                               <input id='adv_group_titles' type='checkbox' />
+                                                                       </td>
+                                    <td align='center'>
+                                        <span>&result.limit2avail;</span>
+                                        <input type='checkbox' id='opac.result.limit2avail'/>
+                                    </td>
+                                                               </tr>
+                                                       </tbody>
+                                               </table>
+                                       </td>
+                               </tr>
+                       </table>
+               </td>
+
+       </tr>
+
+       <tr class='border_4_2'>
+               <td colspan='2'><input type='submit' onclick='advSubmitGlobal();' value='&advanced.search.submit;'></input></td>
+       </tr>
+
+</table>
+
+
diff --git a/Open-ILS/web/opac/skin/tadl/xml/advanced/advanced_marc.xml b/Open-ILS/web/opac/skin/tadl/xml/advanced/advanced_marc.xml
new file mode 100644 (file)
index 0000000..46fe287
--- /dev/null
@@ -0,0 +1,46 @@
+<!--
+XXX Deprecate me
+-->
+
+<table class='data_grid' width='100%'>
+       <thead>
+               <tr>
+                       <td colspan='6'>&opac.advanced.marc.title;</td>
+               </tr>
+       </thead>
+       <tbody id='advanced.marc.tbody'>
+               <tr id='advanced.marc.template'>
+                       <td>
+                               <span>&opac.advanced.marc.tag;: </span>
+                               <input name='advanced.marc.tag' maxlength='3' size='3' />
+                       </td>
+                       <td>
+                               <span>&opac.advanced.marc.subfield;: </span>
+                               <input name='advanced.marc.subfield' maxlength='1' size='1' />
+                       </td>
+                       <td>
+                               <span>&opac.advanced.marc.value;: </span>
+                               <input name='advanced.marc.value' size='36' />
+                       </td>
+
+                       <td>
+                               <input type='submit' value='X' onclick='
+                                       var row = this.parentNode.parentNode;
+                                       var tbody = row.parentNode;
+                                       if(tbody.getElementsByTagName("tr").length > 2)
+                                               tbody.removeChild(row);
+                                       ' />
+                       </td>
+               </tr>
+               <tr id='advanced.marc.submit.row'>
+                       <td colspan='4' align='center'>
+
+                               <input name='advanced.marc.addrow' type='submit' onclick='advAddMARC();'
+                                       value='&opac.advanced.marc.addrow;' />
+
+                               <input style='margin-left: 10px;' 
+                                       onclick='advMARCRun();' type='submit' value='&common.submit;' />
+                       </td>
+               </tr>
+       </tbody>
+</table>
diff --git a/Open-ILS/web/opac/skin/tadl/xml/advanced/advanced_quick.xml b/Open-ILS/web/opac/skin/tadl/xml/advanced/advanced_quick.xml
new file mode 100644 (file)
index 0000000..3f7da6f
--- /dev/null
@@ -0,0 +1,30 @@
+<!--
+XXX Deprecate me
+-->
+
+<table class='data_grid' width='95%'>
+       <thead>
+               <tr>
+                       <td colspan='6'>&opac.advanced.quick.title;</td>
+               </tr>
+       </thead>
+       <tbody>
+               <tr>
+                       <td>
+                               <span style='padding-right: 0px;'>&common.call.number.label;</span>
+                               <input id='opac.advanced.quick.cn' style='margin: 2px;' type='text' size='12' />
+                               <input type='submit' onclick='advCNRun();' value='&advanced.go;' />
+                       </td>
+                       <td>
+                               <span style='padding-right: 0px;'>&common.isbn.label;</span>
+                               <input id='opac.advanced.quick.isbn' style='margin: 2px;' type='text' size='13' maxlength='13' />
+                               <input type='submit' onclick='advISBNRun();' value='&advanced.go;' />
+                       </td>
+                       <td>
+                               <span style='padding-right: 0px;'>&common.issn.label;</span>
+                               <input id='opac.advanced.quick.issn' style='margin: 2px;' type='text' size='9' maxlength='9' />
+                               <input type='submit' onclick='advISSNRun();' value='&advanced.go;' />
+                       </td>
+               </tr>
+       </tbody>
+</table>
diff --git a/Open-ILS/web/opac/skin/tadl/xml/body.xml b/Open-ILS/web/opac/skin/tadl/xml/body.xml
new file mode 100644 (file)
index 0000000..a8fd019
--- /dev/null
@@ -0,0 +1,42 @@
+<body class="tundra">
+       <table width='100%'>
+               <tbody>
+                       <tr>
+                               <td id='main_left_cell'>
+                                       <!--#include virtual="common/logo.xml"-->
+                                       <!--#include virtual="common/sidebar.xml"-->
+                               </td>
+                               <td id='main_right_cell'>
+                                       <div id='content' class=''>
+
+                                               <!--#if expr="$OILS_PAGE!='advanced.xml'"-->
+                                                       <!--#include virtual="common/searchbar.xml"-->
+                                                       <!--#include virtual="common/statusbar.xml"-->
+                                               <!--#endif-->
+
+                                               <!--#include virtual="common/fonts.xml"-->
+
+                                               <!--#include virtual="common/altcanvas.xml"-->
+                                               <!--#include virtual="common/ilsevents.xml"--> 
+                                               <!--#include virtual="page_${OILS_PAGE}"-->
+                                       </div>
+                                       <br/>
+                                       <!--#include virtual="common/tips.xml"-->
+                               </td>
+                       </tr>
+               </tbody>
+       </table>
+               <!--#include virtual='footer.xml'-->
+
+    <script language="javascript" type="text/javascript">
+        dojo.addOnLoad(init);
+        dojo.require("dijit._Calendar");
+        dojo.require("dijit.form.DateTextBox");
+        dojo.require("dijit.form.FilteringSelect");
+        dojo.require("dojo.date.locale");
+        dojo.require("dojo.date.stamp");
+        dojo.require("dojo.parser");
+        dojo.require("openils.widget.FacetSidebar"); // pulls in Searcher and I18N
+    </script>
+
+</body>
diff --git a/Open-ILS/web/opac/skin/tadl/xml/cnbrowse.xml b/Open-ILS/web/opac/skin/tadl/xml/cnbrowse.xml
new file mode 100644 (file)
index 0000000..f3e84e5
--- /dev/null
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!-- Loads the environment -->
+<!--#include virtual="setenv.xml"-->
+
+<!DOCTYPE html PUBLIC 
+       "-//W3C//DTD XHTML 1.0 Transitional//EN" 
+       "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" [
+       <!--#include virtual="/opac/locale/${locale}/opac.dtd"-->
+]>
+
+
+<html xmlns='http://www.w3.org/1999/xhtml'>
+       <!--#include virtual="header.xml"-->
+       <!--#if expr="$OILS_PAGE='index.xml'"-->
+               <!--#include virtual="home/index_body.xml"-->
+       <!--#else-->
+               <!--#include virtual="body.xml"-->
+       <!--#endif-->
+</html>
+
diff --git a/Open-ILS/web/opac/skin/tadl/xml/common/altcanvas.xml b/Open-ILS/web/opac/skin/tadl/xml/common/altcanvas.xml
new file mode 100644 (file)
index 0000000..97448da
--- /dev/null
@@ -0,0 +1,37 @@
+
+<!-- These are the UI components that may be needed on any given page.  The must be
+       set to class += 'hide_me' by default -->
+
+<div id='not_the_canvas' xmlns:xi="http://www.w3.org/2001/XInclude">
+
+       <!-- the login page -->
+       <!--#if expr="$FRONT_PAGE!='true'"-->
+               <!--#include virtual="login.xml"-->
+       <!--#endif-->
+
+       <!-- The org tree -->
+       <!--#include virtual="orgtree.xml"-->
+
+       <!-- ============================================================================= -->
+       <!-- Register the alternate canvases  -->
+       <script language='javascript' type='text/javascript'>
+               config.ids.altcanvas.org_tree           = config.ids.common.org_container;
+               config.ids.altcanvas.holds                      = 'holds_box';
+               config.ids.altcanvas.check_holds        = 'check_holds_box';
+               config.ids.altcanvas.xulholds           = 'xulholds_box';
+               config.ids.altcanvas.loading            = 'loading_alt';
+               //config.ids.altcanvas.cnbrowse         = 'cn_browse';
+       </script>
+
+       <!--#if expr="$FRONT_PAGE!='true'"-->
+               <!--#include virtual="holds.xml"-->
+               <!-- #include virtual="cn_browse.xml"-->
+       <!--#endif-->
+
+       <div id='loading_alt' class='hide_me canvas' style='margin-top: 6px;'>
+               <div style='margin-top: 30px; margin-bottom: 30px; text-align: center; font-weight: 700;' class='color_3'>
+                       <img src='../../../../images/progressbar_green.gif' style='margin: 5px; height: 32px; width: 32px;' />
+               </div>
+       </div>
+
+</div>
diff --git a/Open-ILS/web/opac/skin/tadl/xml/common/cn_browse.xml b/Open-ILS/web/opac/skin/tadl/xml/common/cn_browse.xml
new file mode 100644 (file)
index 0000000..aea7fa1
--- /dev/null
@@ -0,0 +1,34 @@
+<div id='cn_browse' class='hide_me cn_browser' 
+       style='width: 95%; text-align: center; padding: 15px;'>
+       <div id='cn_browse_loading'  class='cn_browse_loading hide_me'>&common.cn.loading;</div>
+       <div id='cn_browse_div'> 
+
+
+               <div style='width: 90%; text-align: center; margin: 10px;' class='color_4'>
+                       <span>&common.cn.browsing;</span><b style='margin-left: 6px;' id='cn_browse_where'> </b>
+               </div>
+               <table class='data_grid bookshelf' width='100%'>
+                       <thead>
+                               <tr>
+                                       <td><a id='cn_browse_next' class='classic_link' 
+                                               href='javascript:cnBrowsePrev();'><b>&common.cn.previous;</b></a></td>
+                                       <td colspan='1' align='center'>&common.cn.shelf;</td>
+                                       <td><a id='cn_browse_prev' class='classic_link' 
+                                               href='javascript:cnBrowseNext();'><b>&common.cn.next;</b></a></td>
+                               </tr>
+                       </thead>
+                       <tbody id='cn_tbody'>
+                               <tr id='cn_browse_row'>
+                                       <td id='cn_browse_td' class='cn_browse_item' width='25%' valign='top'>
+                                               <a><img height='60' width='50' 
+                                                       class='cn_browse_info' name='cn_browse_pic' border='0' /></a>
+                                               <div style='font-weight: bold;' class='cn_browse_info' name='cn_browse_cn'>  </div>
+                                               <div class='cn_browse_info'><a name='cn_browse_title' class='classic_link'> </a></div>
+                                               <div class='cn_browse_info'><a name='cn_browse_author' class='classic_link'>  </a></div>
+                                               <div class='cn_browse_info' name='cn_browse_lib'>  </div>
+                                       </td>
+                               </tr>
+                       </tbody>
+               </table>
+       </div>
+</div>
diff --git a/Open-ILS/web/opac/skin/tadl/xml/common/css_common.xml b/Open-ILS/web/opac/skin/tadl/xml/common/css_common.xml
new file mode 100644 (file)
index 0000000..2ba1e44
--- /dev/null
@@ -0,0 +1,21 @@
+<!-- CSS shared across pages goes here --> 
+
+<link type='text/css' rel='stylesheet' href="<!--#echo var='OILS_SKIN_BASE'-->/tadl/css/layout.css"/>
+
+<!-- Our font CSS's -->
+<link type='text/css' rel='stylesheet' href='<!--#echo var="OILS_CSS_BASE"-->/mediumfont.css' />
+
+<!-- Our colors -->
+<link type='text/css' rel="stylesheet" href="<!--#echo var='OILS_THEME_BASE'-->/tadl/css/colors.css" />
+
+
+<!-- OpenSearch auto discovery -->
+<link type="application/opensearchdescription+xml"
+       rel='search' title="Evergreen"
+       href="http://<!--#echo var='SERVER_NAME'-->/opac/extras/opensearch/1.1/-/osd.xml" />
+
+<!-- enable Dojo date picker -->
+<style type="text/css">
+       @import '/js/dojo/dojo/resources/dojo.css';
+       @import '/js/dojo/dijit/themes/tundra/tundra.css';
+</style>
diff --git a/Open-ILS/web/opac/skin/tadl/xml/common/fonts.xml b/Open-ILS/web/opac/skin/tadl/xml/common/fonts.xml
new file mode 100644 (file)
index 0000000..c7ebef3
--- /dev/null
@@ -0,0 +1,25 @@
+<div id='fonts_div'>
+
+       <div id='text_size_div' style='position:absolute; top: 2px; right: 6px;'>
+               <span style='vertical-align: top;'>&common.textsize.title;</span>
+               <span style='vertical-align: top;'><a href="javascript:void(0);" onclick="setFontSize('regular');"> &common.textsize.regular; </a></span>
+               <span style='vertical-align: top;'> &common.textsize.separator; </span>
+               <span style='vertical-align: top;'><a href="javascript:void(0);" onclick="setFontSize('large');"> &common.textsize.large; </a></span>
+               <span style='vertical-align: top;'>&nbsp;<span style="font-weight:bold;">|</span>&nbsp;</span>
+               <span style='vertical-align: top;'>&common.language;</span>
+               <span id='translation_switch' dojoType="dijit.form.FilteringSelect" store="openils.I18N.localeStore"
+            searchAttr="label" required="false" jsId='opacLocaleSelector'>
+            <script type="text/javascript">
+                dojo.addOnLoad(function() {
+                    opacLocaleSelector.setValue(locale);
+                    dojo.connect(opacLocaleSelector, 'onChange', 
+                        function () {
+                            location.href = location.href.replace(/opac\/[^\/]+\/skin/, 'opac/' + this.getValue() + '/skin');
+                        }
+                    );
+                });
+            </script>
+               </span>
+       </div>
+       
+</div>
diff --git a/Open-ILS/web/opac/skin/tadl/xml/common/format_selector.xml b/Open-ILS/web/opac/skin/tadl/xml/common/format_selector.xml
new file mode 100644 (file)
index 0000000..6d329a9
--- /dev/null
@@ -0,0 +1,11 @@
+<select id='<!--#echo var="FORM_SEL_ID"-->' >
+       <option value=''>&opac.search.allFormats;</option>
+       <option value='at'>&opac.search.books;</option>
+       <option value='at-d'>&opac.search.largePrint;</option>
+       <option value='at-s'>&opac.search.ebook;</option>
+       <option value='i'>&opac.search.audioBooks;</option>
+       <option value='g'>&opac.search.videoRecordings;</option>
+       <option value='j'>&opac.search.music;</option>
+       <option value='m'>&opac.search.electronic;</option>
+</select>
+       
diff --git a/Open-ILS/web/opac/skin/tadl/xml/common/holds.xml b/Open-ILS/web/opac/skin/tadl/xml/common/holds.xml
new file mode 100644 (file)
index 0000000..7d8712d
--- /dev/null
@@ -0,0 +1,250 @@
+<div>
+       <div id='xulholds_box' class='hide_me canvas' style='margin-top: 6px;'>
+               <center>
+                       <table class='data_grid' style='margin-top: 20px;'>
+                               <tbody>
+                                       <tr>
+                                               <td>&opac.holds.xulRecipient;:</td>
+                                               <td><input type='text' id='xul_recipient_barcode' /></td>
+                                               <td><input type='submit' value='&common.submit;' id='xul_recipient_barcode_submit' /></td>
+                                               <td><input type='submit' value='&common.cancel;' onclick='showCanvas();' /></td>
+                                               <td><input type='submit' value='&common.hold.place;' id='xul_recipient_me' /></td>
+                                       </tr>
+                               </tbody>
+                       </table>
+               </center>
+       </div>
+
+       <div id='check_holds_box' class='hide_me canvas' 
+               style='margin-top: 6px; width: 100%; text-align: center'>
+               <br/><br/><br/>
+               <b>&common.hold.check;</b>
+       </div>
+
+       <div id='holds_box' class='hide_me canvas' style='margin-top: 6px;'>
+       
+               <br/>
+               <table width='90%'>
+                       <tbody>
+                               <tr>
+                                       <td class='holds_cell color_1' 
+                                               align='center' colspan='2'>&common.hold.create;</td>
+                               </tr>
+                               <tr>
+                                       <td class='holds_cell'>&opac.holds.recipient;:</td>
+                                       <td class='holds_cell' id='holds_recipient'> </td>
+                               </tr>
+                               <tr>
+                                       <td class='holds_cell'>&common.title.label;</td>
+                                       <td class='holds_cell' id='holds_title'> </td>
+                               </tr>
+                               <tr>
+                                       <td class='holds_cell'>&common.author;</td>
+                                       <td class='holds_cell' id='holds_author'> </td>
+                               </tr>
+                               <tr>
+                                       <td class='holds_cell'>&common.format;</td>
+                                       <td class='holds_cell' id='holds_format'> </td>
+                               </tr>
+                               <tr id='hold_physical_desc_row'>
+                                       <td class='holds_cell'>&common.physical.label;</td>
+                                       <td class='holds_cell' id='holds_physical_desc'> </td>
+                               </tr>
+
+                               <tr class='hide_me' id='holds_parts_row'>
+                                       <td class='holds_cell'>&common.mono_parts.label;</td>
+                                       <td class='holds_cell'>
+                        <span class='hide_me' id='holds_parts_label'></span>
+                        <select id='holds_parts_selector' class='hide_me'>
+                            <option value=''></option>
+                        </select>
+                    </td>
+                               </tr>
+
+                               <tr class='hide_me' id='holds_cn_row'>
+                                       <td class='holds_cell'>&common.call.number.label;</td>
+                                       <td class='holds_cell'><b id='holds_cn'/> </td>
+                               </tr>
+
+                               <tr class='hide_me' id='holds_copy_row'>
+                                       <td class='holds_cell'>&common.copy.barcode.label;</td>
+                                       <td class='holds_cell'><b id='holds_copy'/> </td>
+                               </tr>
+
+                               <tr class='hide_me' id='holds_issuance_row'>
+                                       <td class='holds_cell'>&common.issuance_label.label;</td>
+                                       <td class='holds_cell'><b id='holds_issuance_label'/> </td>
+                               </tr>
+
+                               <tr class='hide_me' id='holds_type_row'>
+                                       <td class='holds_cell'>&common.hold.type.label;</td>
+                                       <td class='holds_cell hide_me' id='holds_is_cn'><b>&common.hold.volume;</b></td>
+                                       <td class='holds_cell hide_me' id='holds_is_copy'><b>&common.hold.copy;</b></td>
+                                       <td class='holds_cell hide_me' id='holds_is_issuance'><b>&common.hold.issuance;</b></td>
+                               </tr>
+
+                               <tr>
+                                       <td class='holds_cell'>&opac.holds.contactPhone;:</td>
+                                       <td class='holds_cell'>
+                                               <input id='holds_phone' size='13' maxlength='12'/>
+                                               <span style='margin-left: 4px; font-size: 7pt;'>&common.phone.format;</span>
+                                       </td>
+                               </tr>
+                               <tr>
+                                       <td class='holds_cell'>&common.phone.enable;</td>
+                                       <td class='holds_cell'>
+                                               <input type='checkbox' id='holds_enable_phone'  checked='checked'
+                                                       onchange='
+                                                               if (this.checked) $("holds_phone").disabled=false; 
+                                                               else $("holds_phone").disabled = true;'/>
+                                       </td>
+                               </tr>
+
+                               <tr>
+                                       <td class='holds_cell'>&opac.holds.contactEmail;:</td>
+                                       <td class='holds_cell' id='holds_email'> 
+                        <span class='hide_me' id='holds.no_email'>
+                           &common.email.none;<br/>
+                           &common.email.set;
+                        </span>
+                        <span class='hide_me' id='holds.no_email.xul'>
+                           &common.email.none; 
+                        </span>
+
+                    </td>
+                               </tr>
+                               <tr>
+                                       <td class='holds_cell'>&common.email.enable;</td>
+                                       <td class='holds_cell'>
+                                               <input type='checkbox' id='holds_enable_email' checked='checked'/>
+                                       </td>
+                               </tr>
+                               <!--
+                               <tr id='holds_depth_selector_row' class='hide_me'>
+                                       <td class='holds_cell'>Hold Range</td>
+                                       <td class='holds_cell'>
+                                               <select id='holds_depth_selector'></select>
+                                       </td>
+                               </tr>
+                               -->
+                               <tr>
+                                       <td class='holds_cell'>&opac.holds.pickupLocation;</td>
+                                       <td class='holds_cell'>
+                                               <select id='holds_org_selector'> </select>
+                                       </td>
+                               </tr>
+
+                               <tr>
+                                       <td class='holds_cell'>&opac.holds.expire_time;</td>
+                                       <td class='holds_cell'>
+                        <input dojoType="dijit.form.DateTextBox" size='10' maxlength='10' id='holds_expire_time' />
+                                       </td>
+                               </tr>
+
+                <tr>
+                    <td class='holds_cell'>
+                        &opac.holds.freeze;
+                        <a class='classic_link' href='javascript:alert("&opac.holds.freeze.help;");'>&common.help;</a>
+                        </td>
+                    <td class='holds_cell'>
+                        <input type='checkbox' id='holds_frozen_chkbox' 
+                            onchange='
+                                if($("holds_frozen_chkbox").checked) 
+                                    unHideMe($("hold_frozen_thaw_row"));
+                                else
+                                    hideMe($("hold_frozen_thaw_row"));
+                            ' /> 
+                    </td>
+                </tr>
+
+                <tr id='hold_frozen_thaw_row' class='hide_me'>
+                    <td class='holds_cell'>
+                        <script language='javascript' type='text/javascript'> if($('holds_frozen_chkbox').checked) unHideMe($("hold_frozen_thaw_row"));</script>
+                        &opac.holds.freeze.thaw_date;
+                    </td>
+                    <td class='holds_cell'>
+                        <input dojoType="dijit.form.DateTextBox" size='10' maxlength='10' id='holds_frozen_thaw_input' />
+                    </td>
+                </tr>
+
+                               <tr id='holds_alt_formats_row_extras' class='hide_me'>
+                                       <td colspan='2' align='center'>
+                                               <div style='padding: 8px;'>
+                                                       <a class='classic_link' href='javascript:void(0);' style='padding: 5px;'
+                                                               onclick='unHideMe($("holds_alt_formats_row"));'>&common.hold.advanced;</a>
+                                               </div>
+                                       </td>
+                               </tr>
+
+                               <tr id='holds_alt_formats_row' class='hide_me'>
+
+                                       <td class='holds_cell'>
+                                               <div style='margin-bottom: 5px;'>
+                                                       <span>&common.format.alternatives; </span>
+                                                       <span> <a class='classic_link' style='color:red;' href='javascript:void(0);' 
+                                                               onclick='alert($("holds_explain_adv").innerHTML)'>&common.help;</a></span>
+                                               </div>
+                                               <div>&common.control.click;</div>
+                                       </td>
+
+                                       <td class='holds_cell'>
+                                               <select id='hold_alt_form_selector' multiple='multiple' style='width: 14em;'>
+                                                       <option value='at'      class='hide_me'>&opac.search.books;</option>
+                                                       <option value='at-d' class='hide_me'>&opac.search.largePrint;</option>
+                                                       <option value='at-s' class='hide_me'>&opac.search.ebook;</option>
+                                                       <option value='i'               class='hide_me'>&opac.search.audioBooks;</option>
+                                                       <option value='g'               class='hide_me'>&opac.search.videoRecordings;</option>
+                                                       <option value='j'               class='hide_me'>&opac.search.music;</option>
+                                               </select>
+                                       </td>
+                               </tr>
+
+                               <tr>
+                                       <td class='holds_cell' align='center' colspan='2'>
+                                               <button id='holds_submit'>&opac.holds.placeHold;</button>
+                                               <button class='hide_me' id='holds_update'>&common.hold.update;</button>
+                                               <span style='padding: 20px;'> </span>
+                                               <button id='holds_cancel'>&common.cancel;</button>
+                                       </td>
+                               </tr>
+                       </tbody>
+               </table>
+       
+               <div class='hide_me' id='holds_success'>&opac.holds.success;</div>
+               <div class='hide_me' id='holds_failure'>&opac.holds.failure;</div>
+               <span class='hide_me' id='holds_bad_phone'>
+                       &common.phone.format.help;
+               </span>
+
+               <span class='hide_me' id='hold_not_allowed'>
+                       &common.hold.failed;
+               </span>
+
+       </div>
+
+       <span class='hide_me' id='format_words'>
+               <span name='at'>&opac.search.books;</span>
+               <span name='at-d'>&opac.search.largePrint;</span>
+               <span name='i'>&opac.search.audioBooks;</span>
+               <span name='g'>&opac.search.videoRecordings;</span>
+               <span name='j'>&opac.search.music;</span>
+               <span name='m'>&opac.search.electronic;</span>
+       </span>
+
+       <span class='hide_me' id='holds_explain_adv'>&holds.advanced_options;</span>
+
+       <span class='hide_me' id='holds_pick_good_org'>&common.hold.delivery;</span>
+
+       <span class='hide_me' id='hold_dup_exists'>&common.hold.exists;</span>
+       <span class='hide_me' id='hold_checked_out'>&common.hold.checked_out;</span>
+
+       <span class='hide_me' id='hold_dup_exists_override'>&common.hold.exists.override;</span>
+       <span class='hide_me' id='hold_checked_out_override'>&common.hold.checked_out.override;</span>
+
+       <span id='hold_failed_patron_barred' class='hide_me'>&common.hold.barred;</span>
+
+       <span id='invalid_hold' class='hide_me'>&common.hold.item.invalid;</span>
+
+       <span id='holds_invalid_recipient' class='hide_me'>&common.hold.patron.invalid;</span>
+
+</div>
diff --git a/Open-ILS/web/opac/skin/tadl/xml/common/ilsevents.xml b/Open-ILS/web/opac/skin/tadl/xml/common/ilsevents.xml
new file mode 100644 (file)
index 0000000..dcef13f
--- /dev/null
@@ -0,0 +1,14 @@
+<span class='hide_me'>
+       <span id='ilsevent.1000'>&ilsevent.1000;</span>
+       <span id='ilsevent.1001'>&ilsevent.1001;</span>
+       <span id='ilsevent.1002'>&ilsevent.1002;</span>
+       <span id='ilsevent.1200'>&ilsevent.1200;</span>
+       <span id='ilsevent.5000'>&ilsevent.5000;</span>
+       <span id='ilsperm.CREATE_HOLD'>&ilsperm.CREATE_HOLD;</span>
+
+       <!-- Local OPAC Specific strings/events -->
+       <span id='auth_session_expiring'>&opac.session_expiring;</span>
+       <span id='auth_session_expired'>&opac.session_expired;</span>
+       <span id='user_not_found'>&common.user_not_found;</span>
+</span>
+
diff --git a/Open-ILS/web/opac/skin/tadl/xml/common/js_common.xml b/Open-ILS/web/opac/skin/tadl/xml/common/js_common.xml
new file mode 100644 (file)
index 0000000..eb0f1c6
--- /dev/null
@@ -0,0 +1,76 @@
+<!--#if expr="$OILS_PAGE='myopac.xml'"-->
+<!-- my acccount uses a lot more classes -->
+<script language='javascript'  
+    src='/IDL2js?mvr,bre,aou,aout,pgt,lasso,cmf,cmc,cmsa,cam,cifm,clfm,citm,cblvl,ccs,accs,au,ahr,ahrn,acn,actscecm,cbreb,cbreb,cbrebi,acp,cust,ac,aua,mous,circ,mbts,mb,ausp,csp'
+    type='text/javascript'></script>
+<!--#else-->
+<script language='javascript'  
+    src='/IDL2js?mvr,bre,aou,aout,pgt,lasso,cmf,cmc,cmsa,cam,cifm,clfm,citm,cblvl,ccs'
+    type='text/javascript'></script>
+<!--#endif-->
+
+<script language='javascript' type="text/javascript">
+    var locale = location.href.replace( /.+opac\/([^\/]+)\/skin.+/, '$1' );
+    if (!locale) locale = '<!--#echo var="locale"-->';
+     var djConfig = {
+         locale: locale.toLowerCase(),
+         parseOnLoad: true,
+         isDebug: false
+     }, lang, bidi;
+</script>
+
+<script language='javascript' src='/js/dojo/dojo/dojo.js?<!--#include virtual="/eg_cache_hash"-->'></script>
+<script language='javascript' type='text/javascript' src='<!--#echo var="OILS_JS_BASE"-->/JSON_v1.js?<!--#include virtual="/eg_cache_hash"-->'></script>
+<script language='javascript' type="text/javascript" src='/js/dojo/opensrf/opensrf.js?<!--#include virtual="/eg_cache_hash"-->'></script>
+<script language='javascript' type="text/javascript" src='/js/dojo/dojo/openils_dojo.js?<!--#include virtual="/eg_cache_hash"-->'></script>
+<script language='javascript' type="text/javascript" src='/js/dojo/fieldmapper/AutoIDL.js?<!--#include virtual="/eg_cache_hash"-->'></script>
+
+<script language='javascript' type="text/javascript" src='<!--#echo var="OILS_JS_BASE"-->/<!--#echo var="locale"-->/OrgTree.js?<!--#include virtual="/eg_cache_hash"-->'></script>
+<script language='javascript' type="text/javascript" src='<!--#echo var="OILS_JS_BASE"-->/<!--#echo var="locale"-->/FacetDefs.js?<!--#include virtual="/eg_cache_hash"-->'></script>
+<script language='javascript' type="text/javascript" src='<!--#echo var="OILS_JS_BASE"-->/OrgLasso.js?<!--#include virtual="/eg_cache_hash"-->'></script>
+
+<!--#if expr="$OILS_OPAC_COMBINED_JS"-->
+<script language='javascript' type='text/javascript' src='<!--#echo var="OILS_OPAC_JS_HOST"-->/skin/tadl/js/combined.js?<!--#include virtual="/eg_cache_hash"-->'></script>
+<!--#else --> 
+<!-- 
+    When combined JS is enabled in the Apache config, the block 
+    below defines which files are added to the final combined JS file. 
+    Currently, only files in $OPAC/common/js/ are eligible for automatic combination.
+-->
+<!--START COMPRESSION-->
+<script language='javascript' type='text/javascript' src='<!--#echo var="OILS_JS_BASE"-->/utils.js'></script>
+<script language='javascript' type='text/javascript' src='<!--#echo var="OILS_JS_BASE"-->/config.js'></script>
+<script language='javascript' type='text/javascript' src='<!--#echo var="OILS_JS_BASE"-->/CGI.js'></script>
+<script language='javascript' type='text/javascript' src='<!--#echo var="OILS_JS_BASE"-->/md5.js'></script>
+<script language='javascript' type='text/javascript' src='<!--#echo var="OILS_JS_BASE"-->/slimtree.js'></script>
+<script language='javascript' type='text/javascript' src='<!--#echo var="OILS_JS_BASE"-->/opac_utils.js'></script>
+<script language='javascript' type='text/javascript' src='<!--#echo var="OILS_JS_BASE"-->/org_utils.js'></script>
+<script language='javascript' type='text/javascript' src='<!--#echo var="OILS_JS_BASE"-->/RemoteRequest.js'></script>
+<script language='javascript' type='text/javascript' src='<!--#echo var="OILS_JS_BASE"-->/init.js'></script>
+<script language='javascript' type='text/javascript' src='<!--#echo var="OILS_JS_BASE"-->/added_content.js'></script>
+<!--END COMPRESSION--> 
+<!--#endif -->
+
+<!-- Some global js -->
+<script language='javascript' type='text/javascript'>
+    config.css.color_1 = "color_1";
+    config.css.color_2 = "color_2";
+    config.css.color_3 = "color_3";
+    <!-- set up some global JS config variables, read from the Apache config -->
+    var OILS_OPAC_IMAGES_HOST = null;
+    <!--#if expr="$OILS_OPAC_IMAGES_HOST"-->
+        OILS_OPAC_IMAGES_HOST = '<!--#echo var="OILS_OPAC_IMAGES_HOST"-->extras/ac/jacket/';
+    <!--#endif -->
+    var OILS_OPAC_STATIC_PROTOCOL = null;
+    <!--#if expr="$OILS_OPAC_STATIC_PROTOCOL"-->
+        OILS_OPAC_STATIC_PROTOCOL = '<!--#echo var="OILS_OPAC_STATIC_PROTOCOL"-->';
+    <!--#endif -->
+    <!-- builds the "Now searching: <org_unit>" text on the home page -->
+    function home_init() {
+        getId("home_adv_search_link").setAttribute("href", buildOPACLink({page:ADVANCED})); 
+        getId("home_myopac_link").setAttribute("href", buildOPACLink({page:MYOPAC}, false, true));
+    }
+    <!--#if expr="$OILS_OPAC_FORCE_LOGIN_SSL"-->
+        forceLoginSSL = true;
+    <!--#endif -->
+</script>
diff --git a/Open-ILS/web/opac/skin/tadl/xml/common/libselect.xml b/Open-ILS/web/opac/skin/tadl/xml/common/libselect.xml
new file mode 100644 (file)
index 0000000..e4cd4c1
--- /dev/null
@@ -0,0 +1,15 @@
+<span>
+       <script language='javascript' type='text/javascript' src='<!--#echo var="OILS_OPAC_JS_HOST"-->/skin/tadl/js/depth_selector.js'></script>
+       <span class='hide_me' id='depth_selector_span'>
+               <!--#if expr="$SHOW_DEPTHSEL_TEXT='true'"-->
+               <span>&library.select; </span>
+               <!--#endif-->
+               <select id='depth_selector' >
+                       <option value='new'>&library.select.label;</option>
+               </select>
+       </span>
+       <span class='hide_me' id='lib_selector_span'>
+               <a id='lib_selector_link' class='classic_link' href='javascript:void(0)'>&library.select.help;</a>
+       </span>
+</span>
+
diff --git a/Open-ILS/web/opac/skin/tadl/xml/common/login.xml b/Open-ILS/web/opac/skin/tadl/xml/common/login.xml
new file mode 100644 (file)
index 0000000..bf2287d
--- /dev/null
@@ -0,0 +1,115 @@
+
+<div id='login_box' class='hide_me canvas' style='margin-top: 6px;'>
+
+       <script language='javascript' type='text/javascript'>
+               config.ids.login = {};
+               config.css.login = {};
+               config.ids.login.form                   = "login_form";
+               config.ids.login.box                    = "login_box";
+               config.ids.login.tbody                  = "login_tbody";
+               config.ids.login.username       = "login_username";
+               config.ids.login.password       = "login_password";
+               config.ids.login.button         = "login_button";
+               config.ids.login.cancel         = "login_cancel_button";
+               config.ids.altcanvas.login                      = config.ids.login.box;
+       </script>
+       <script type='text/javascript' src='<!--#echo var="OILS_OPAC_JS_HOST"-->/skin/tadl/js/password_reset.js'></script>
+
+       <br/>
+
+       <div class='login_text color_1' style='padding: 4px; text-align: center;'>
+               <span>&opac.login.login;</span>
+       </div>
+
+       <br/>
+
+    <form id='login_form' method='POST' action='javascript:loginDance();'>
+        <table id='login_table' class='data_grid' style='margin-left: 20px;' width='95%'>
+            <tbody id='login_tbody'>
+                <tr>
+                    <td><span class='login_text'>&login.username;</span></td>
+                    <td>
+                        <span class='login_text'>
+                            <input id='login_username' name='login_username' type='text' size='16'></input>
+                        </span>
+                    </td>
+                </tr>
+                <tr>
+                    <td>
+                        <span class='login_text'>&common.password;</span>
+                    </td>
+                    <td>
+                        <span class='login_text'>
+                            <input id='login_password' name='login_password' type='password' size='16'></input>
+                        </span>
+                    </td>
+                </tr>
+                <tr><td><br/></td><td/></tr>
+                <tr class='color_1'>
+                    <td colspan='2' align='center'>
+                        <span class='login_text' style='margin-right: 20px;'>
+                        <input type='submit' value='&common.login;' name='login_button' id='login_button'></input>
+                        </span>
+                        <span class='login_text' style='margin-left: 20px;'>
+                            <input type='submit' name='login_cancel_button' id='login_cancel_button' value='&common.cancel;'></input>
+                        </span>
+                    </td>
+                </tr>
+            </tbody>
+        </table>
+    </form>
+
+       <table id='change_pw_table' class='data_grid hide_me' style='margin-left: 20px;' width='95%'>
+               <thead>
+                       <tr><td colspan='2' align='center'><b>&login.password;</b></td></tr>
+               </thead>
+               <tbody>
+
+                       <tr>
+                               <td colspan='2' style='padding:10px;'>
+                                       &login.first.time;
+                                       &common.password_criteria;
+                               </td>
+                       </tr>
+
+                       <tr>
+                               <td>&login.password.current.enter;</td>
+                               <td><input type='password' id='change_pw_current'/></td>
+                       </tr>
+
+                       <tr>
+                               <td>&login.password.new.enter;</td>
+                               <td><input type='password' id='change_pw_1'/></td>
+                       </tr>
+                       <tr>
+                               <td>&login.password.new.reenter;</td>
+                               <td><input type='password' id='change_pw_2'/></td>
+                       </tr>
+                       <tr><td><br/></td><td/></tr>
+                       <tr class='color_1'>
+                               <td colspan='2' align='center'>
+                                       <span class='login_text' style='margin-right: 20px;'>
+                                               <input type='submit' value='&login.password.update;'  id='change_pw_button'/>
+                                       </span>
+                               </td>
+                       </tr>
+               </tbody>
+       </table>
+
+       <span id='pw_no_match' class='hide_me'>&login.password.nomatch;</span>
+       <span id='pw_update_successful' class='hide_me'>&login.password.success;</span>
+
+       <span id='pw_not_strong' class='hide_me'>
+               &login.password.strength;
+               &common.password_criteria;
+       </span>
+
+       <span id='patron_card_inactive_alert' class='hide_me'>&login.barcode.inactive;</span>
+
+       <span id='patron_inactive_alert' class='hide_me'>&login.account.inactive;</span>
+
+       <span id='patron_login_failed' class='hide_me'>&login.failed;</span>
+
+</div>
+
+
diff --git a/Open-ILS/web/opac/skin/tadl/xml/common/logo.xml b/Open-ILS/web/opac/skin/tadl/xml/common/logo.xml
new file mode 100644 (file)
index 0000000..72f23bc
--- /dev/null
@@ -0,0 +1,4 @@
+<div id='logo_div'>
+       <script language='javascript' type='text/javascript'>config.ids.common.top_logo = "top_left_logo";</script>
+       <a href='http://www.tadl.org/' border='0'><img style='margin-left: 10px; ' src='<!--#echo var="OILS_BASE"-->/images/tadl/small_logo.jpg' id='top_left_logo' border='0' class='logo' /></a>
+</div>
diff --git a/Open-ILS/web/opac/skin/tadl/xml/common/orgtree.xml b/Open-ILS/web/opac/skin/tadl/xml/common/orgtree.xml
new file mode 100644 (file)
index 0000000..d4008d3
--- /dev/null
@@ -0,0 +1,27 @@
+
+<!-- the org tree -->
+<div id='org_container' class='hide_me canvas'>
+
+       <div id='org_link_container' class='color_1'>
+               <span class='org_link'>
+                       <a onclick='orgTreeSelector.expandAll();' 
+                               href='javascript:void(0);'>&common.org.openAll;</a>
+               </span>
+               <span class='org_link'>
+                       <a onclick='orgTreeSelector.closeAll();' 
+                               href='javascript:void(0);'>&common.org.closeAll;</a>
+               </span>
+               <span class='org_link'>
+                       <a onclick='showCanvas();' href='javascript:void(0);'>&common.org.cancel;</a>
+               </span>
+       </div>
+
+       <div id='org_loading_div'><br/><span>&common.org.loading;</span></div>
+       <br/>
+       <div id='org_selector_tip' class='tips hide_me'><b>&common.org.note;</b>
+               <span>&common.org.notetext;</span>
+       </div>
+       <br/>
+       <div id='org_tree' class='org_tree'> </div>
+       <br/>
+</div>
diff --git a/Open-ILS/web/opac/skin/tadl/xml/common/searchbar.xml b/Open-ILS/web/opac/skin/tadl/xml/common/searchbar.xml
new file mode 100644 (file)
index 0000000..4ba8b4f
--- /dev/null
@@ -0,0 +1,96 @@
+
+<!-- Searchbar for doing metarecord searches -->
+
+<div id='searchbar' dojoType="openils.widget.Searcher" basicTextBox='search_box'>
+    <script type='dojo/method' event='performSearch'>
+        this.compileFullSearch();
+        dojo.byId(this.basicTextBox).value = this.basic_query;
+        dojo.byId(this.facetTextBox).value += this.facet_query;
+        dojo.byId('search_submit').click();
+    </script>
+    <script type='dojo/method' event='populate'><![CDATA[
+        var searcher = this;
+        attachEvt("result", "allRecordsReceived", function () {
+            if(!resultCompiledSearch) {
+                return;
+            }
+        
+            var all_search = dojo.query( '.classedSearch', searcher.classedSearches );
+            if (all_search.length > 1) {
+                for (var i = 1; i < all_search.length; i++) {
+                    dojo.destroy(all_search[i]);
+                }
+            }
+
+            var csearch = dijit.byNode(dojo.query( '.classedSearch', searcher.classedSearches )[0]);
+        
+            for (var type in resultCompiledSearch.searches) {
+                csearch.matchIndex.attr('value',type);
+                csearch.searchValue.attr('value',resultCompiledSearch.searches[type].term);
+                csearch = searcher.addClassAnd();
+            }
+        });
+    ]]></script>
+
+
+       <!-- load my js -->
+       <script language='javascript' type='text/javascript'>
+               config.ids.searchbar = {};
+               config.css.searchbar = {};
+               config.ids.searchbar.text                               = 'search_box'; 
+               config.ids.searchbar.facets                             = 'facet_box';  
+               config.ids.searchbar.submit                     = 'search_submit';      
+               config.ids.searchbar.type_selector      = 'search_type_selector';
+               config.ids.searchbar.depth_selector     = 'depth_selector';
+               config.ids.searchbar.form_selector      = 'form_selector';
+               config.ids.searchbar.extra_row          = 'searchbar_extra';
+               config.ids.searchbar.main_row                   = 'searchbar_main_row';
+               config.ids.searchbar.table                              = 'searchbar_table';
+               config.ids.searchbar.location_tag       = 'search_location_tag_link';
+               config.ids.searchbar.lib_sel_span       = 'lib_selector_span';
+               config.ids.searchbar.lib_sel_link       = 'lib_selector_link';
+               config.ids.searchbar.depth_sel_span     = 'depth_selector_span';
+       </script>
+
+
+       <table class='color_1 color_border1' width='100%' style='border-collapse: collapse;'>
+               <tbody>
+                       <tr>
+
+                               <td nowrap='nowrap' align='center'  class='search_box_container color_2'>
+
+                                       <input id='search_box' type='text' onkeyup='dojo.byId("facet_box").value = "";'/>
+                                       <input id='facet_box' type='hidden' />
+                                       <span style='padding-left: 6px;'>
+                                               <input type='button' style='width: 40px;' id='search_submit' value='&button.go;' />
+                                       </span>
+                               </td>
+
+                               <td nowrap='nowrap' style='padding: 3px;' align='right' >
+
+                                       <span style='padding-right:9px;'>
+                                               <!--
+                                               <span>&common.type;: </span>
+                                               -->
+                                               <!--#include virtual="stypes_selector.xml"-->
+                                       </span>
+
+                                       <span style='padding-right:9px;'>
+                                               <!--#set var='FORM_SEL_ID' value='form_selector'-->
+                                               <!--#include virtual="format_selector.xml"-->
+                                       </span>
+
+                                       <!--#include virtual="libselect.xml"-->
+
+                               </td>
+                       </tr>
+               </tbody>
+       </table>
+       <script language='javascript' type='text/javascript' src='<!--#echo var="OILS_OPAC_JS_HOST"-->/skin/tadl/js/search_bar.js'></script>
+</div>
+
+
+
+
+
+
diff --git a/Open-ILS/web/opac/skin/tadl/xml/common/sidebar.xml b/Open-ILS/web/opac/skin/tadl/xml/common/sidebar.xml
new file mode 100644 (file)
index 0000000..3a132a7
--- /dev/null
@@ -0,0 +1,181 @@
+
+<!-- Navigation bar -->
+
+<div id="sidebar_div" class="sidebar_div" xmlns:xi="http://www.w3.org/2001/XInclude">
+
+       <div class='sidebar_chunk'>
+
+               <div title="&navigate.home.title;" 
+                       id='home_link_div' class="side_bar_item ">
+                       <a id='home_link' href='index.xml'>&navigate.home;</a>
+               </div>
+       
+               <div title="&opac.navigate.advanced.title;"
+                       id='advanced_link_div' class="side_bar_item ">
+                       <a id='advanced_link' href='advanced.xml'>&opac.navigate.advanced;</a>
+               </div>
+
+               <div title="&navigate.myopac.title;"
+                       id='myopac_link_div' class="side_bar_item ">
+                       <a  id='myopac_link' href='myopac/myopac.xml'>&navigate.myopac;</a>
+               </div>
+
+               <div title="&navigate.login.title;"
+                       id='login_link_div' class="side_bar_item ">
+                       <a id='login_link' href='javascript:void(0);'>&navigate.login;</a>
+               </div>
+
+               <div title="&navigate.logout.title;"
+                       id='logout_link_div' class="side_bar_item hide_me ">
+                       <a id='logout_link' href='javascript:void(0);'>&navigate.logout;</a>
+               </div>
+
+        <div id='overdrive' class='side_bar_item hide_me'>
+            <span><a href="http://www.tadl.org/go/overdrive">Access OverDrive downloadable audiobooks and music</a></span>
+        </div>
+
+
+               <!-- Informational sidebar components -->
+
+               <div id='logged_in_as_div' title="&navigate.loggedinas.title;" class="side_bar_item hide_me">
+                       <span>&navigate.loggedinas;<b id='username_dest'> </b></span>
+               </div>
+
+               <div id='sidebar_results_wrapper' class='hide_me border_1'>
+                       <div title="&navigate.titleGroupResults;" 
+                               id='mresult_link_div' class="side_bar_item hide_me">
+                               <a id='sidebar_title_group_results'>&navigate.titleGroupResults;</a>
+                       </div>
+               
+                       <div title="&navigate.titleResults;"
+                               id='result_link_div' class="side_bar_item hide_me">
+                               <a id='sidebar_title_results'>&navigate.titleResults;</a>
+                       </div>
+       
+                       <div title="&navigate.record.details;"
+                               id='rdetail_link_div' class="side_bar_item hide_me">
+                               <span>&navigate.title.details;</span>
+                       </div>
+               </div>
+       </div>
+
+    <div id='facetSidebarContainer' class='hide_me'>
+
+        <div class="side_bar_item" style="margin-top: 10px; font-weight: bold;">
+      <span>&navigate.facetRefine;</span>
+       </div>
+
+     <div dojoType='openils.widget.FacetSidebar' searchBox='facet_box' searchSubmit='search_submit' facetLimit='5' classOrder='["author","subject","series","title","keyword"]'>
+            <script type='dojo/method' event='populate'><![CDATA[
+                var fblob = this;
+                attachEvt("result", "allRecordsReceived", function () {
+                    if(!resultFacetKey) return;
+                    if (fblob.facetCacheKey) return; // already rendered it
+
+                    dojo.removeClass('facetSidebarContainer','hide_me');
+
+                    fblob.facetCacheKey = resultFacetKey;
+                    fblob.render();
+                });
+            ]]></script>
+        </div>
+       </div>
+
+       <div id='adv_quick_search_sidebar' class='sidebar_chunk hide_me' 
+               style='text-align:center; margin-top: 20px;'> 
+               <hr/>
+               <div id='adv_quick_search'>
+                       <div class='adv_quick_search color_4'><b>&sidebar.quick.search;</b></div>
+                       <div style='margin-top: 8px;'>
+                               <table><tbody><tr>
+                                       <td>
+                                               <select id='adv_quick_type' style='width: 6em;'>
+                                                       <option value='isbn'>&opac.advanced.quick.isbn;</option>
+                                                       <option value='issn'>&opac.advanced.quick.issn;</option>
+                                                       <option value='cn'>&opac.advanced.quick.cn;</option>
+                                                       <option value='lccn'>&opac.advanced.quick.lccn;</option>
+                                                       <option value='tcn'>&opac.advanced.quick.tcn;</option>
+                                                       <option value='barcode'>&opac.advanced.quick.barcode;</option>
+                                               </select>
+                                       </td><td>
+                                               <input type='text' id='adv_quick_text' size='16' />
+                                       </td>
+                               </tr></tbody></table>
+                       </div>
+
+            <span class='hide_me' id='myopac.copy.not.found'>&sidebar.copy.not.found;</span>
+                       <div style='margin-top: 8px;' class='adv_quick_search_submit'>
+                               <a id='adv_quick_submit' href='javascript:advGenericSearch();' class='classic_link'>&common.submit;</a>
+                       </div>
+               </div>
+       </div>
+
+       <div id='adv_marc_search_sidebar' class='sidebar_chunk hide_me' 
+               style='text-align:center; margin-top: 20px;'> 
+               <hr/>
+               <div class='adv_quick_search color_4'><b>&search.marc;</b></div>
+               <table style='margin: 3px; width: 100%;' id='adv_sdbar_table' class='border_4_3'>
+                       <tbody>
+                               <tr>
+                                       <td>&search.marc.tag;</td>
+                                       <td><input name='advanced.marc.tag' maxlength='3' size='3' /></td>
+                                       <td>&search.marc.subfield;</td>
+                                       <td><input name='advanced.marc.subfield' maxlength='1' size='1' /></td>
+                               </tr>
+                               <tr>
+                                       <td>&search.marc.value;</td>
+                                       <td colspan='3'><input name='advanced.marc.value' size='18' /></td>
+                               </tr>
+                               <tr name='crow' class='hide_me'>
+                                       <td colspan='4' align='center'>
+                                       <a href='javascript:void(0);' class='classic_link'
+                                               onclick='
+                                                       var div = $("adv_marc_search_sidebar");
+                                                       if( div.getElementsByTagName("table").length > 1 )
+                                                               div.removeChild(this.parentNode.parentNode.parentNode.parentNode);'>&common.close;</a>
+                                       </td>
+                               </tr>
+                                                               
+                       </tbody>
+               </table>
+               <div id='adv_marc_submit' class='adv_quick_search_submit'>
+                       <a style='margin-right: 4px;' class='classic_link' href='javascript:advAddMARC();'>&search.marc.add.row;</a>
+                       <a style='margin-left: 4px;' class='classic_link' href='javascript:advMARCRun();'>&common.submit;</a>
+               </div>
+       </div>
+
+
+
+
+       <!-- ============================================================================= -->
+       <!-- Our javascript -->
+       <script language='javascript' type='text/javascript' src='<!--#echo var="OILS_OPAC_JS_HOST"-->/skin/tadl/js/sidebar.js'></script>
+
+       <script language='javascript' type='text/javascript'>
+               config.ids.sidebar = {};
+               config.css.sidebar = {};
+               config.names.sidebar = {};
+               config.css.sidebar.item = {};
+               config.ids.sidebar.home                         = 'home_link_div';
+               config.ids.sidebar.advanced             = 'advanced_link_div';
+               config.ids.sidebar.myopac                       = 'myopac_link_div';
+               config.ids.sidebar.prefs                        = 'prefs_link_div';
+               config.ids.sidebar.mresult                      = 'mresult_link_div';
+               config.ids.sidebar.rresult                      = 'result_link_div';
+               config.ids.sidebar.rdetail                      = "rdetail_link_div"; 
+               config.ids.sidebar.login                        = 'login_link';
+               config.ids.sidebar.logout                       = 'logout_link';
+               config.ids.sidebar.logoutbox            = 'logout_link_div';
+               config.ids.sidebar.loginbox             = 'login_link_div';
+               config.ids.sidebar.logged_in_as = 'logged_in_as_div';
+               config.ids.sidebar.username_dest        = 'username_dest';
+               
+               config.ids.sidebar.home_link            = 'home_link'
+               config.ids.sidebar.advanced_link        = 'advanced_link'
+               config.ids.sidebar.myopac_link  = 'myopac_link'
+               
+               config.css.encircled                            = 'encircled';
+       </script>
+
+</div>
+
diff --git a/Open-ILS/web/opac/skin/tadl/xml/common/statusbar.xml b/Open-ILS/web/opac/skin/tadl/xml/common/statusbar.xml
new file mode 100644 (file)
index 0000000..237be62
--- /dev/null
@@ -0,0 +1,28 @@
+
+<div id='statusbar' style='margin-bottom: 6px; margin-top: 6px;'>
+
+       <table width='100%'>
+               <tbody>
+                       <tr>
+                               <td align='left'>
+                                       <b>
+                                       <span style='padding: 1px; ' id='now_searching_location'>  </span>
+                                       </b>
+                                       <i id='including_results_for' class='hide_me'>
+                                               <span>&status.results;</span> <b id='including_results_location'> </b>
+                                       </i>
+                               </td>
+                <td align='right'>
+                    <!--#if expr="$OILS_PAGE='rresult.xml' || $OILS_PAGE='mresult.xml'"-->
+                    <!--#include virtual="../result/filtersort.xml" -->
+                    <!--#endif -->
+                </td>
+                       </tr>
+               </tbody>
+       </table>
+
+       <script language='javascript' type='text/javascript'>
+               config.ids.common.now_searching = 'now_searching_location';
+       </script>
+
+</div>
diff --git a/Open-ILS/web/opac/skin/tadl/xml/common/stypes_selector.xml b/Open-ILS/web/opac/skin/tadl/xml/common/stypes_selector.xml
new file mode 100644 (file)
index 0000000..588030c
--- /dev/null
@@ -0,0 +1,8 @@
+<select id='search_type_selector'>
+       <option value='keyword' selected='selected'>&common.keyword;</option>
+       <option value='title'>&common.title;</option>
+       <option value='author'>&common.author;</option>
+       <option value='subject'>&common.subject;</option>
+       <option value='series'>&common.series;</option>
+</select>
+
diff --git a/Open-ILS/web/opac/skin/tadl/xml/common/tips.xml b/Open-ILS/web/opac/skin/tadl/xml/common/tips.xml
new file mode 100644 (file)
index 0000000..84919f5
--- /dev/null
@@ -0,0 +1,8 @@
+
+<div id='tips' class='tips hide_me'>
+       <div class='hide_me'>
+               <span>&common.tips.tip1;</span>
+               <span>&common.tips.tip2;</span>
+       </div>
+       <span style="font-weight: bold;">&tips.label;  </span>
+</div>
diff --git a/Open-ILS/web/opac/skin/tadl/xml/footer.xml b/Open-ILS/web/opac/skin/tadl/xml/footer.xml
new file mode 100644 (file)
index 0000000..405ac23
--- /dev/null
@@ -0,0 +1,19 @@
+<div id='copyright_block'>
+               <div id='footer_links'>
+                               <span class='footer_link'>
+                                       <a class='classic_link'
+                                               href='/opac/<!--#echo var="locale"-->/extras/slimpac/start.html'>&opac.basic;</a>
+                               </span> 
+                               <span> | </span>
+                               <span class='footer_link'>
+                                       <a target='_blank' class='classic_link'
+                                               href='&footer.help.url;'>&footer.help;</a>
+                               </span>
+               </div>
+        <div id='copyright_text' class='hide_me'>
+            <span>&footer.copyright;</span>
+        </div>
+        <div id='footer_logo'>&footer.logo;
+            <a href='http://open-ils.org'><img style='border:none;' src='../../../../images/eg_tiny_logo.jpg'/></a>
+        </div>
+</div>
diff --git a/Open-ILS/web/opac/skin/tadl/xml/header.xml b/Open-ILS/web/opac/skin/tadl/xml/header.xml
new file mode 100644 (file)
index 0000000..3f312b4
--- /dev/null
@@ -0,0 +1,15 @@
+<head>
+    <meta http-equiv="X-UA-Compatible" content="chrome=1"></meta>
+       <!-- Set the page title -->
+
+       <!--#include virtual="common/css_common.xml"-->
+
+       <title>&<!--#echo var="OILS_TITLE"-->;</title>
+       <link rel="unapi-server" type="application/xml" title="unAPI" href="http://<!--#echo var='HTTP_HOST'-->/opac/extras/unapi"/>
+       <link rel="icon" type="image/ico" href="/favicon.ico"/>
+
+       <!--#if expr="$slimpac!='true'"-->
+               <!--#include virtual="common/js_common.xml"-->
+       <!--#endif-->
+
+</head>
diff --git a/Open-ILS/web/opac/skin/tadl/xml/home/homesearch.xml b/Open-ILS/web/opac/skin/tadl/xml/home/homesearch.xml
new file mode 100644 (file)
index 0000000..1d4da50
--- /dev/null
@@ -0,0 +1,144 @@
+
+<div id='canvas_main' class='home_search canvas'
+       style='-moz-border-radius: 6px; padding: 6px; margin-top: 65px;' 
+       xmlns="http://www.w3.org/1999/xhtml" xmlns:xi="http://www.w3.org/2001/XInclude">
+
+       <!-- load my js -->
+       <script language='javascript' type='text/javascript'
+               src="<!--#echo var="OILS_OPAC_JS_HOST"-->/skin/tadl/js/depth_selector.js"> </script>
+       <script language='javascript' type='text/javascript'
+               src="<!--#echo var="OILS_OPAC_JS_HOST"-->/skin/tadl/js/search_bar.js"> </script>
+
+       <script language='javascript' type='text/javascript'>
+               config.ids.searchbar = {};
+               config.css.searchbar = {};
+               config.ids.searchbar.text                               = 'search_box'; 
+               config.ids.searchbar.submit                     = 'search_submit';      
+               config.ids.searchbar.type_selector      = 'search_type_selector';
+               config.ids.searchbar.depth_selector     = 'depth_selector';
+               config.ids.searchbar.form_selector      = 'form_selector';
+               config.ids.searchbar.extra_row          = 'searchbar_extra';
+               config.ids.searchbar.main_row                   = 'searchbar_main_row';
+               config.ids.searchbar.table                              = 'searchbar_table';
+               config.ids.searchbar.location_tag       = 'search_location_tag_link';
+               config.ids.searchbar.lib_sel_span       = 'lib_selector_span';
+               config.ids.searchbar.lib_sel_link       = 'lib_selector_link';
+               config.ids.searchbar.depth_sel_span     = 'depth_selector_span';
+       </script>
+
+
+       <div style='width: 100%; text-align: center'>
+               <img src='<!--#echo var="OILS_BASE"-->/images/tadl/main_logo.gif' />
+       </div>
+
+       <style type="text/css">.rowpad { height: 20px; }</style>
+
+       <table id='frontsearch_table' height='100%' width='100%' 
+               style='margin-top: 10px; border-collapse: collapse;'>
+
+               <tbody>
+
+                       <tr class='color_3'>
+
+                               <script language='javascript' type='text/javascript'>
+                                       config.ids.common.now_searching = 'now_searching_location';
+                               </script>
+
+                               <td style='padding: 6px;' class='border_5' align='center'>
+                                       <span>&opac.search.nowSearching;</span>
+                                       <span style='padding: 1px;' id='now_searching_location'>  </span>
+                               </td>
+                       </tr>
+
+
+                       <tr class='rowpad'><td></td></tr>
+
+                       <tr>
+                               <td nowrap='nowrap' align='center' class='color_1 border_5'>
+                                       <input id='search_box' style='width: 300px;' type='text' />
+                                       <span style='padding-left: 6px;'>
+                                               <input type='button' style='width: 40px;' id='search_submit' value='Go!' />
+                                       </span>
+                               </td>
+                       </tr>
+
+                       <tr class='rowpad'><td></td></tr>
+
+                       <tr class='color_3 border_5'>
+
+                               <td nowrap='nowrap' align='center' style='padding: 4px;'>
+
+                                       <span style='padding-right:40px;'>
+                                               <!--#include virtual="../common/stypes_selector.xml"-->
+                                       </span>
+
+                                       <span>
+                                               <!--
+                                               <span>&common.format;: </span>
+                                               -->
+                                               <!--#set var='FORM_SEL_ID' value='form_selector'-->
+                                               <!--#include virtual="../common/format_selector.xml"-->
+                                       </span>
+
+                               </td>
+                       </tr>
+
+                       <tr class='rowpad'><td></td></tr>
+
+                       <tr class='color_1 border_5'>
+                               <td align='center' style='padding: 4px; padding-bottom: 6px;'>
+                                       <span style='padding-right: 15px;'>
+                                               <a id='home_adv_search_link' href='javascript:void(0);'>&opac.navigate.advanced;</a></span>
+                                       <span>
+                                               <span class='hide_me' id='depth_selector_span'>
+                                                       <select id='depth_selector' >
+                                                               <option value='new'>&opac.navigate.selectNewOrg;...</option>
+                                                       </select>
+                                               </span>
+                                               <span class='hide_me' id='lib_selector_span'>
+                                                       <a id='lib_selector_link' href='javascript:void(0)'>&opac.navigate.selectOrg;</a>
+                                               </span>
+                                       </span>
+                                       <span style='padding-left: 15px;'>
+                                               <a id='home_myopac_link' href='javascript:void(0);'>&opac.navigate.myopac;</a>
+                                       </span>
+                               </td>
+                       </tr>
+
+            <!-- locale picker -->
+            <tr><td align='center' valign='bottom' style='padding-top:10px;'>
+                       <span style='vertical-align: top;'>&common.language;</span>
+                       <span dojoType="dijit.form.FilteringSelect" store="openils.I18N.localeStore" 
+                    searchAttr="label" required="false" jsId='opacLocaleSelector'>
+                    <script type="text/javascript">
+                        dojo.addOnLoad(function() {
+                            opacLocaleSelector.setValue(locale);
+                            dojo.connect(opacLocaleSelector, 'onChange', 
+                                function () {
+                                                       location.href = location.href.replace(/opac\/[^\/]+\/skin/, 'opac/' + this.getValue() + '/skin');
+                                }
+                            );
+                        });
+                    </script>
+                       </span>
+            </td></tr>
+
+               </tbody>
+       </table>
+
+</div>
+
+
+<div style="float: left;">
+        <p><a href="http://www.tadl.org/go/overdrive">Download audiobooks and music:<br />
+        <img src="<!--#echo var="OILS_BASE"-->/images/tadl/overdrive.png" /></a></p>
+</div>
+<div style="float: right;">
+        <p><a href="http://www.tadl.org/elibrary">More Electronic Resources available at: <br />
+        tadl.org/elibrary</a></p>
+</div>
+
+
+
+
+
diff --git a/Open-ILS/web/opac/skin/tadl/xml/home/index_body.xml b/Open-ILS/web/opac/skin/tadl/xml/home/index_body.xml
new file mode 100644 (file)
index 0000000..574af3b
--- /dev/null
@@ -0,0 +1,67 @@
+<body class="tundra">
+
+       <noscript>
+               <style type="text/css">#toptable { display: none; }</style>
+               <p style="font-size: 1.3em; padding: 3em; text-align: center;">
+               &home.js.disabled;
+               </p>
+       </noscript>
+
+       <table id='toptable' width='100%' style='border-collapse: collapse;'>
+               <tbody>
+                       <tr>
+                               <td width='10%'> </td>
+                               <td width='80%'>
+                                       <div id='canvas'>
+                                               <!--#include virtual="../common/altcanvas.xml"-->
+                                               <!--#include virtual="homesearch.xml"-->
+                                       </div>
+                               </td>
+                               <td width='10%'> </td>
+                       </tr>
+               </tbody>
+       </table>
+       <!--#include virtual='../footer.xml'-->
+    <center>
+        <div id='gcfPrompt' class='hide_me'>
+            <script>dojo.require('dojo.cookie');</script>
+            <div><span>&common.googlechromeframe.why;</span></div>
+            <button onclick='CFInstall.check({preventPrompt: false, mode: "popup"});'>&common.googlechromeframe.install;</button>
+            <button onclick='dojo.cookie("noGCF", "true", {path:"/", expires: 365}); hideMe($("gcfPrompt"));'>&common.googlechromeframe.dontask;</button>
+        </div>
+    </center>
+    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/chrome-frame/1/CFInstall.min.js"></script>
+    <script><![CDATA[ 
+        CFInstall.check({
+            preventPrompt: true,
+            onmissing: function() {
+                if (dojo.cookie("noGCF") != "true")
+                    unHideMe($('gcfPrompt'));
+            }
+        });]]>
+    </script>
+
+    <script language="javascript" type="text/javascript">
+        isFrontPage = true;
+        dojo.addOnLoad(init);
+        dojo.addOnLoad(home_init);
+
+        try { 
+            dojo.style(dojo.byId('toptable'), 'display', 'table'); 
+        } catch(e) {
+            try {
+                dojo.style(dojo.byId('toptable'), 'display', ''); 
+            } catch(ee) {}
+        }
+
+        dojo.require("dijit._Calendar");
+        dojo.require("dijit.form.DateTextBox");
+        dojo.require("dijit.form.FilteringSelect");
+        dojo.require("dojo.date.locale");
+        dojo.require("dojo.date.stamp");
+        dojo.require("dojo.parser");
+        dojo.require("openils.widget.FacetSidebar"); // pulls in Searcher and I18N
+    </script>
+</body>
+
+
diff --git a/Open-ILS/web/opac/skin/tadl/xml/html_xsl.xml b/Open-ILS/web/opac/skin/tadl/xml/html_xsl.xml
new file mode 100644 (file)
index 0000000..f223320
--- /dev/null
@@ -0,0 +1,10 @@
+
+<xsl:stylesheet version="1.0"
+       xmlns:xlink="http://www.w3.org/1999/xlink" 
+       xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+
+       <xsl:output method="html" indent="yes" encoding="utf-8"/>
+       <xsl:template match="/">
+               <xsl:copy-of select='/*[local-name()="html"]'/>
+       </xsl:template>
+</xsl:stylesheet>   
diff --git a/Open-ILS/web/opac/skin/tadl/xml/index.xml b/Open-ILS/web/opac/skin/tadl/xml/index.xml
new file mode 100644 (file)
index 0000000..f3e84e5
--- /dev/null
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!-- Loads the environment -->
+<!--#include virtual="setenv.xml"-->
+
+<!DOCTYPE html PUBLIC 
+       "-//W3C//DTD XHTML 1.0 Transitional//EN" 
+       "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" [
+       <!--#include virtual="/opac/locale/${locale}/opac.dtd"-->
+]>
+
+
+<html xmlns='http://www.w3.org/1999/xhtml'>
+       <!--#include virtual="header.xml"-->
+       <!--#if expr="$OILS_PAGE='index.xml'"-->
+               <!--#include virtual="home/index_body.xml"-->
+       <!--#else-->
+               <!--#include virtual="body.xml"-->
+       <!--#endif-->
+</html>
+
diff --git a/Open-ILS/web/opac/skin/tadl/xml/mresult.xml b/Open-ILS/web/opac/skin/tadl/xml/mresult.xml
new file mode 100644 (file)
index 0000000..f3e84e5
--- /dev/null
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!-- Loads the environment -->
+<!--#include virtual="setenv.xml"-->
+
+<!DOCTYPE html PUBLIC 
+       "-//W3C//DTD XHTML 1.0 Transitional//EN" 
+       "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" [
+       <!--#include virtual="/opac/locale/${locale}/opac.dtd"-->
+]>
+
+
+<html xmlns='http://www.w3.org/1999/xhtml'>
+       <!--#include virtual="header.xml"-->
+       <!--#if expr="$OILS_PAGE='index.xml'"-->
+               <!--#include virtual="home/index_body.xml"-->
+       <!--#else-->
+               <!--#include virtual="body.xml"-->
+       <!--#endif-->
+</html>
+
diff --git a/Open-ILS/web/opac/skin/tadl/xml/myopac.xml b/Open-ILS/web/opac/skin/tadl/xml/myopac.xml
new file mode 100644 (file)
index 0000000..f3e84e5
--- /dev/null
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!-- Loads the environment -->
+<!--#include virtual="setenv.xml"-->
+
+<!DOCTYPE html PUBLIC 
+       "-//W3C//DTD XHTML 1.0 Transitional//EN" 
+       "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" [
+       <!--#include virtual="/opac/locale/${locale}/opac.dtd"-->
+]>
+
+
+<html xmlns='http://www.w3.org/1999/xhtml'>
+       <!--#include virtual="header.xml"-->
+       <!--#if expr="$OILS_PAGE='index.xml'"-->
+               <!--#include virtual="home/index_body.xml"-->
+       <!--#else-->
+               <!--#include virtual="body.xml"-->
+       <!--#endif-->
+</html>
+
diff --git a/Open-ILS/web/opac/skin/tadl/xml/myopac/myopac_bookbags.xml b/Open-ILS/web/opac/skin/tadl/xml/myopac/myopac_bookbags.xml
new file mode 100644 (file)
index 0000000..db28ed5
--- /dev/null
@@ -0,0 +1,136 @@
+
+<div id='myopac_bookbag_div' class='hide_me' xmlns:xi="http://www.w3.org/2001/XInclude" >
+
+       <script language='javascript' type='text/javascript' src='<!--#echo var="OILS_OPAC_JS_HOST"-->/skin/tadl/js/container.js'> </script>
+
+       <div id='myopac_delete_bookbag_warn' class='hide_me'>
+               &myopac.delete.bookbag;
+       </div>
+
+       <div style='text-align: center; font-weight: bold;' 
+               class='hide_me' id='myopac_bookbags_none'>&myopac.no.bookbags;</div>
+
+       <div style='width: 99%; text-align: center; margin-bottom: 10px;'> 
+               <b>&myopac.bookbags.title;</b>
+               <!--
+               <a class='classic_link' style='margin-left: 5px; font-size: 8pt;'
+                       href='javascript:alert($("myopac_bb_what_are").innerHTML);'>(What are Bookbags?)</a>
+                       -->
+       </div>
+
+       <table width='100%' class='data_grid data_grid_center hide_me' id='myopac_bookbag_table'>
+               <thead>
+                       <tr><td>&common.name;</td><td>&myopac.bookbag.items;</td><td>&myopac.bookbag.shared;</td><td>&myopac.bookbag.toggle;</td><td>&myopac.bookbag.delete;</td></tr>
+               </thead>
+               <tbody id='myopac_bookbag_tbody'>
+                       <tr id='myopac_bookbag_tr'>
+                               <td>
+                                       <a href='javascript:void(0);' class='classic_link' name='myopac_expand_bookbag'> </a>
+                               </td>
+                               <td><span name='myopac_bookbag_item_count'> </span> <span> &myopac.items;</span></td>
+                               <td>
+                                       <span name='myopac_bb_published_no' class='hide_me'>&common.no;</span>
+                                       <span name='myopac_bb_published_yes' class='hide_me'>&common.yes;</span>
+                                       <a name='myopac_bb_published_view' class='classic_link hide_me'>&myopac.view;</a>
+                                       <a name='myopac_bb_published_atom' class='unadorned_link hide_me'>
+                                               <img border="0" src="/opac/images/small-rss.png" title="&myopac.atom.feed;" alt="&myopac.atom.feed;"/>
+                                       </a>
+                                       <br/><a name='myopac_bb_exp_refworks' class='classic_link hide_me'>&myopac.bookbag.refworks;</a>
+                               </td>
+
+                               <td>
+                                       <a name='myopac_bb_make_unpublished' class='classic_link hide_me'>&myopac.bookbag.hide;</a>
+                                       <a name='myopac_bb_make_published' class='classic_link hide_me'>&myopac.bookbag.share;</a>
+                               </td>
+
+                               <td>
+                                       <a class='classic_link' href='javascript:void(0);' name='myopac_container_delete'>&myopac.delete;</a>
+                               </td>
+                       </tr>
+               </tbody>
+       </table>
+
+       <table width='100%' class='data_grid data_grid_center' style='margin-top: 10px;'>
+               <thead>
+                       <tr><td>&myopac.bookbag.create;</td></tr>
+               </thead>
+               <tbody>
+                       <tr>
+                               <td> 
+                                       <span style='padding-right: 5px;'>&myopac.bookbag.naming;</span>
+                                       <input id='myopac_bookbag_new_name' type='text' /> 
+                               </td>
+                       </tr>
+                       <tr>
+                               <td>
+                                       <span style='padding: 5px;'>&myopac.bookbag.share;</span>
+                                       <a class='classic_link' href='javascript:alert($("bb_publish_text").innerHTML);'><b>&common.help;</b></a>
+                                       <span>&common.yes;</span> <input type='radio' name='bb_public' id='bb_public_yes'/>
+                                       <span>&common.no;</span> <input type='radio' name='bb_public' id='bb_public_no' checked='checked'/>
+                                       <input style='padding-left: 10px;' onclick='myOPACCreateBookbag();' 
+                                               type='submit' value='&common.submit;' />
+                               </td>
+                       </tr>
+               </tbody>
+       </table>
+
+       <!--
+       <div style='overflow: auto; max-height: 200px;' class='hide_me'>
+       -->
+       <div style='width: 99%; text-align: center'> <b id='myopac_bookbag_items_name'> </b></div>
+
+       <div class='hide_me' style='width: 100%; text-align: center; font-weight: 700; margin-top: 10px;'
+               id='myopac_bookbag_no_items'>&myopac.bookbag.no.items;</div>
+
+       <table width='100%' class='hide_me data_grid data_grid_center' id='myopac_bookbag_items_table'>
+               <thead> 
+                       <tr> <td>&common.title;</td> <td>&common.authors;</td> <td>&myopac.bookbag.remove;</td> </tr> 
+               </thead>
+               <tbody id='myopac_bookbag_items_tbody'>
+                       <tr id='myopac_bookbag_items_row'>
+                               <td> <a name='myopac_bookbag_items_title' class='classic_link'> </a> </td>
+                               <!--
+                               <td> <a name='myopac_bookbag_items_author' class='classic_link'> </a> </td>
+                               -->
+                               <td name='myopac_bookbag_items_author'> </td>
+                               <td><a name='myopac_bookbag_items_remove' class='classic_link'>&myopac.remove.link;</a></td>    
+                       </tr>
+               </tbody>
+       </table>
+       <!--</div>-->
+
+       <span id='bb_publish_text' class='hide_me'>
+               &myopac.publish.text;
+       </span>
+
+       <span id='myopac_remove_bb_item_confirm' class='hide_me'>
+               &myopac.item.confirm;
+       </span>
+
+       <span id='myopac_make_published_confirm' class='hide_me'>
+               &myopac.publish.confirm;
+       </span>
+
+       <span id='myopac_make_unpublished_confirm' class='hide_me'>
+               &myopac.unpublish.confirm;
+       </span>
+
+       <span id='myopac_bb_update_success' class='hide_me'>
+               &myopac.update.success;
+       </span>
+
+       <span id='bb_create_warning' class='hide_me'>
+               &myopac.create.warning;
+       </span>
+
+       <span id='myopac_bb_what_are' class='hide_me'>
+               &myopac.describe.bookbags;
+       </span>
+
+       <span class='hide_me' id='bb_update_success'>
+               &myopac.updated.success;
+       </span>
+
+</div>
+
+
diff --git a/Open-ILS/web/opac/skin/tadl/xml/myopac/myopac_checked.xml b/Open-ILS/web/opac/skin/tadl/xml/myopac/myopac_checked.xml
new file mode 100644 (file)
index 0000000..5d00be1
--- /dev/null
@@ -0,0 +1,107 @@
+
+<div id='myopac_checked_div' xmlns:xi="http://www.w3.org/2001/XInclude" >
+
+    <!--
+       <script language='javascript' type='text/javascript' src='<!||#echo var="OILS_JS_BASE"||>/Date.W3CDTF.js'/>
+    -->
+
+   <table width='100%'><tbody>
+      <tr>
+         <td aligh='left' class='data_grid'>
+               <!--
+               Total items out: <b id='mo_items_out_count' style='padding-right: 20px;'>0</b>
+               -->
+               &myopac.checked.out; <b id='mo_items_out_count' style='padding: 5px;'>0</b> / 
+               &myopac.checked.overdue; <b id='mo_items_overdue_count' style='padding: 5px;'>0</b>
+         </td>
+         <td align='right'>
+            <button onclick='myOPACRenewSelected();' id='mo_renew_button' disabled='disabled'>&myopac.checked.renew;</button>
+         </td>
+      </tr>
+       <tr id='my_renewing' class='hide_me'><td align='center'><b>&myopac.checked.renewing;</b></td></tr>
+   </tbody></table>
+
+       <table width='100%' class='light_border data_grid'>
+
+               <thead class='color_3'>
+                       <tr>
+                               <td width='45%'>&common.title;</td>
+                               <td width='20%'>&common.author;</td>
+                               <td width='10%' nowrap='nowrap' align='center'>&myopac.fines.due;</td>
+                               <td width='10%' nowrap='nowrap' align='center'>&myopac.checked.renew.remaining;</td>
+            <td width='15%'>&common.select;
+               (<a id='myopac_select_all_checked' onclick='myopacSelectAllChecked();' 
+                  class='classic_link' href='javascript:void(0);'>&common.all;</a>/<a id='myopac_select_none_checked' 
+                  onclick='myopacSelectNoneChecked();' class='classic_link'   href='javascript:void(0);'>&common.none;</a>)
+            </td>
+                       </tr>
+               </thead>
+
+
+               <tbody id='myopac_checked_tbody'>
+
+                       <tr id='myopac_checked_none' class='hide_me'>
+                               <td colspan='10' align='center'><b>&myopac.checked.noitems;</b></td>
+                       </tr>
+
+
+                       <tr id='myopac_checked_loading'><td>&common.loading;</td></tr>
+
+                       <tr id='myopac_checked_row' class='light_border hide_me'>
+
+                               <td name='myopac_checked_title' class='light_border'>
+                                       <a href='javascript:void(0);' name='myopac_checked_title_link'> </a>
+                               </td>
+
+                               <td name='myopac_checked_author' class='light_border'>
+                                       <a href='javascript:void(0);' name='myopac_checked_author_link'> </a>
+                               </td>
+
+                               <td align='center' name='myopac_checked_due' class='light_border'> </td>
+                               <td align='center' name='myopac_checked_renewals' class='light_border'> </td>
+
+            <!--
+                               <td align='center' name='myopac_checked_renew' class='light_border'>
+                                       <a style='text-decoration:underline;' href='javascript:void(0);' 
+                                               name='myopac_checked_renew_link' class='class_link'>Renew</a>
+                               </td>
+            -->
+
+            <td align='center'><input type='checkbox' name='selectme'/></td>
+
+                       </tr>
+               </tbody>
+       </table>
+
+       <div id='non_cat_circs_div' class='hide_me'>
+               <br/>
+               <div style='text-align: center'><b>&myopac.common.other.circ;</b></div>
+               <table class='data_grid' width='100%'>
+                       <thead>
+                               <tr>    
+                                       <td>&myopac.checked.circ.lib;</td>
+                                       <td>&myopac.checked.item.type;</td>
+                                       <td>&myopac.checked.circ.time;</td>
+                               </tr>
+                       </thead>
+                       <tbody id='non_cat_circs_tbody'>
+                               <tr id='non_cat_circs_row'>
+                                       <td name='circ_lib'/>
+                                       <td name='item_type'/>
+                                       <td name='circ_time'/>
+                               </tr>
+                       </tbody>
+               </table>
+       </div>
+
+       <div id='myopac_renew_success' class='hide_me'>&myopac.checked.renew.success;</div>
+
+       <span class='hide_me' id='myopac_renew_confirm'>&myopac.checked.renew.confirm;</span>
+
+       <span class='hide_me' id='myopac_renew_fail'>&myopac.checked.renew.fail;</span>
+
+   <span class='hide_me' id='myopac_renew_fail2'>&myopac.checked.renew.fail2;</span>
+
+</div>
+
+
diff --git a/Open-ILS/web/opac/skin/tadl/xml/myopac/myopac_fines.xml b/Open-ILS/web/opac/skin/tadl/xml/myopac/myopac_fines.xml
new file mode 100644 (file)
index 0000000..f7793d5
--- /dev/null
@@ -0,0 +1,106 @@
+
+<div id='myopac_fines_div' xmlns:xi="http://www.w3.org/2001/XInclude" >
+
+<form method="POST" action="https://www.tadl.org/pay/pay.cgi">
+<input type="hidden" name="ses" id="myopac_fines_pay_ses" />
+<input style="background-color: #ffff55; font-weight: bold;" type="submit" value="Pay Fines Online" />
+</form>
+
+       <table width='100%' class='data_grid data_grid_center'>
+
+               <thead class='color_3'>
+                       <tr><td colspan='3' style='padding: 6px'><b>&myopac.fines.title;</b></td></tr>
+                       <tr>
+                               <td width='33%'>&myopac.fines.owed;</td>
+                               <td width='33%'>&myopac.fines.paid;</td>
+                               <td width='33%'>&myopac.fines.balance;</td>
+                       </tr>
+               </thead>
+
+               <tbody id='myopac_fines_summary_tbody'>
+                       <tr id='myopac_fines_summary_loading'><td>&myopac.fines.status;</td></tr>
+                       <tr id='myopac_fines_summary_row' class='hide_me'>
+                               <td id='myopac_fines_summary_total' >&common.currency;</td>
+                               <td id='myopac_fines_summary_paid' >&common.currency;</td>
+                               <td id='myopac_fines_summary_balance' style='color:red;font-weight: bold;'>&common.currency;</td>
+                       </tr>
+               </tbody>
+       </table>
+
+       <!--
+       <div id='accrue_explanation' class='hide_me'>
+               <span>Transactions whose balances are marked with a</span>
+               <span style='color:red; font-weight: bold'>*</span>
+               <span>will continue to accrue fines until the checked out item is returned.</span>
+       </div>
+       -->
+
+
+       <!-- Table for circulation transactions only -->
+       <div id='myopac_circ_trans_div' class='hide_me'>
+               <br/><hr/><br/>
+               <table width='100%' class='data_grid data_grid_center' id='myopac_circ_trans_table'>
+                       <thead>
+                               <tr><td colspan='10' style='padding: 6px'><b>&myopac.fines.overdue;</b></td></tr>
+                               <tr>
+                                       <td>&common.title;</td>
+                                       <td>&common.author;</td>
+                                       <td>&myopac.fines.checkout;</td>
+                                       <td>&myopac.fines.due;</td>
+                                       <td>&myopac.fines.returned;</td>
+                                       <td>&myopac.fines.balance;</td>
+                               </tr>
+                       </thead>
+                       <tbody id='myopac_circ_trans_tbody'>
+                               <tr id='myopac_circ_trans_row'>
+                                       <td><a class='classic_link' name='myopac_circ_trans_title'> </a></td>
+                                       <td name='myopac_circ_trans_author'> </td>
+                                       <td name='myopac_circ_trans_start'> </td>
+                                       <td name='myopac_circ_trans_due'> </td>
+                                       <td name='myopac_circ_trans_finished'><span style='color:red;'>&myopac.fines.accruing;</span></td>
+                                       <td>
+                                               <span style='color: red; font-weight: bold;' 
+                                                       name='myopac_circ_trans_balance'>&common.currency;</span>
+                                       </td>
+                               </tr>
+                       </tbody>
+               </table>
+       </div>
+
+       <!-- Table for all non-circulation transactions -->
+       <div id='myopac_trans_div' class='hide_me'>
+               <br/><hr/><br/>
+               <table width='100%' class='data_grid data_grid_center' id='myopac_trans_table'>
+                       <thead>
+                               <tr><td colspan='8' style='padding: 6px'><b>&myopac.fines.other;</b></td></tr>
+                               <tr>
+                                       <td width='12%'>&myopac.fines.time.start;</td>
+                                       <td width='12%'>&myopac.fines.time.paid;</td>
+                                       <td width='12%'>&myopac.fines.owed.initial;</td>
+                                       <td width='12%'>&myopac.fines.paid.amount;</td>
+                                       <td width='12%'>&myopac.fines.balance;</td>
+                                       <td width='12%'>&myopac.fines.type;</td>
+                               </tr>
+                       </thead>
+       
+                       <tbody id='myopac_trans_tbody'>
+                               <tr id='myopac_trans_row'>
+                                       <td name='myopac_trans_start'> </td>
+                                       <td name='myopac_trans_last_payment'> </td>
+                                       <td name='myopac_trans_init_amount'>&common.currency;</td>
+                                       <td name='myopac_trans_total_paid'>&common.currency;</td>
+                                       <td style='color:red; font-weight: bold;'>
+                                               <span name='myopac_trans_balance_recur' class='hide_me'> * </span>
+                                               <span name='myopac_trans_balance'>&common.currency;</span>
+                                       </td>
+                                       <td name='myopac_trans_bill_type'> </td>
+                               </tr>
+                       </tbody>
+               </table>
+       </div>
+       
+       <br/>
+       
+</div>
+
+
diff --git a/Open-ILS/web/opac/skin/tadl/xml/myopac/myopac_holds.xml b/Open-ILS/web/opac/skin/tadl/xml/myopac/myopac_holds.xml
new file mode 100644 (file)
index 0000000..0d98e71
--- /dev/null
@@ -0,0 +1,123 @@
+
+<div id='myopac_holds_div' xmlns:xi="http://www.w3.org/2001/XInclude" >
+
+       <script language='javascript' type='text/javascript' src='<!--#echo var="OILS_OPAC_JS_HOST"-->/skin/tadl/js/holds.js'> </script>
+
+       <table width='100%'>
+        <tbody><tr><td width='100%' align='right'>
+            <select id='myopac_holds_actions' onchange='myopacDoHoldAction();'>
+                <option id='myopac_holds_actions_none' value=''>-- &myopac.holds.actions; --</option>
+                <option value='freeze'>&myopac.holds.freeze_selected;</option>
+                <option value='thaw'>&myopac.holds.thaw_selected;</option>
+                <option value='thaw_date'>&myopac.holds.thaw_date_selected;</option>
+                <option value='cancel'>&myopac.holds.cancel_selected;</option>
+            </select>
+        </td></tr></tbody>
+        <script language='javascript' type='text/javascript'>$('myopac_holds_actions_none').selected = true;</script>
+    </table>
+
+    <span id='myopac.holds.cancel.confirm' class='hide_me'>&myopac.holds.cancel.confirm;</span>
+    <span id='myopac.holds.freeze.confirm' class='hide_me'>&myopac.holds.freeze.confirm;</span>
+    <span id='myopac.holds.thaw.confirm' class='hide_me'>&myopac.holds.thaw.confirm;</span>
+    <span id='myopac.holds.thaw_date.confirm' class='hide_me'>&myopac.holds.thaw_date.confirm;</span>
+    <span id='myopac.holds.freeze.select_thaw' class='hide_me'>&myopac.holds.freeze.select_thaw;</span>
+
+    <table width='100%' id='myopac_holds_processing' class='hide_me'>
+        <tr><td>&myopac.holds.processing;</td></tr>
+    </table>
+
+    <div id='myopac_holds_thaw_date_form' class='hide_me'>
+        <div id='myopac_holds_freeze_select_thaw'>&myopac.holds.freeze.select_thaw;</div>
+        <p>
+            <input dojoType="dijit.form.DateTextBox" size='10' maxlength='10' type='text' id='myopac_holds_thaw_date_input' /> 
+        </p>
+        <p>
+            <button onclick='myopacApplyThawDate();'>&common.submit;</button>
+        </p>
+    </div>
+
+       <table width='100%' class='light_border data_grid data_grid_center' id='myopac_holds_main_table'>
+
+               <thead class='color_3'>
+                       <tr>
+                               <td width=''>&common.title;</td>
+                               <td width=''>&common.author;</td>
+                               <td>&myopac.holds.formats;</td>
+                               <td>&myopac.holds.location;</td>
+                               <td>&common.status;</td>
+                               <td class='hide_me' id='myopac_holds_estimated_wait_column'>&myopac.holds.estimated_wait;</td>
+                               <td>&myopac.holds.unfrozen;</td>
+                               <td>&myopac.holds.frozen.until;</td>
+                               <td>&opac.holds.expire_time;</td>
+                <td width=''>&common.select;
+                    (<a id='myopac_select_all_holds' onclick='myopacSelectAllHolds();' 
+                        class='classic_link' href='javascript:void(0);'>&common.all;</a>/<a id='myopac_select_none_holds' 
+                        onclick='myopacSelectNoneHolds();' class='classic_link'  href='javascript:void(0);'>&common.none;</a>)
+                </td>
+
+                               <td>&myopac.holds.edit;</td>
+                       </tr>
+               </thead>
+
+               <tbody id='myopac_holds_tbody'>
+
+                       <tr id='myopac_holds_none' class='hide_me'>
+                               <td colspan='10'><b>&myopac.holds.status.none;</b></td>
+                       </tr>
+                       <tr id='myopac_holds_loading'><td>&myopac.loading;</td></tr>
+
+                       <tr id='myopac_holds_row' class='hide_me'>
+
+                               <td name='myopac_holds_title'>
+                                       <a href='javascript:void(0);' name='myopac_holds_title_link'> </a>
+                                       <div name='vol_copy' style='border: 1px solid #808080; width:98%; margin-top: 2px;' class='hide_me'>
+                                               <div style='font-size: 90%' name='part'></div>
+                                               <div style='font-size: 90%' name='volume'></div>
+                                               <div style='font-size: 90%' name='copy'></div>
+                                       </div>
+                               </td>
+
+                               <td name='myopac_holds_author'>
+                                       <a href='javascript:void(0);' name='myopac_holds_author_link'> </a>
+                               </td>
+
+                               <td name='myopac_holds_formats'> </td>
+
+                               <td name='myopac_holds_location'></td>
+                               <td>
+                                       <span class='hide_me' name='hold_status_waiting'>&myopac.holds.status.waiting;</span>
+                                       <span class='hide_me' name='hold_status_transit'>&myopac.holds.status.intransit;</span>
+                                       <span class='hide_me' name='hold_status_available'><b style='color:red'>&myopac.holds.status.available;</b></span>
+                                       <span class='hide_me' name='hold_qstats'></span>
+                               </td>
+                <td class='hide_me' name='myopac_holds_estimated_wait'/>
+
+                <td>
+                    <!-- These characaters do not display in Internet Exploror, *sigh*
+                    <span name='myopac_hold_unfrozen_false' class='x_mark'>&#x2717;</span>
+                    <span name='myopac_hold_unfrozen_true' class='hide_me check_mark'>&#x2713;</span>
+                    -->
+                    <span name='myopac_hold_unfrozen_false' class='x_mark'>&common.no;</span>
+                    <span name='myopac_hold_unfrozen_true' class='hide_me check_mark'>&common.yes;</span>
+                </td>
+
+
+                <td name='myopac_holds_frozen_until'></td>
+                <td name='myopac_hold_expire_time'></td>
+                <td><input type='checkbox' name='myopac_holds_selected_chkbx'/></td>
+
+                               <td name='myopac_holds_cancel' style='border-left: 3px solid #E0E0E0; border-right: 3px solid #E0E0E0;'>
+                                       <a href='javascript:void(0);' 
+                                               name='myopac_holds_edit_link' class='classic_link'>&myopac.holds.edit;</a>
+                               </td>
+                       </tr>
+               </tbody>
+       </table>
+
+       <span class='hide_me' id='myopac_holds_cancel_verify'>
+               &myopac.holds.verify;
+       </span>
+
+</div>
+
+
diff --git a/Open-ILS/web/opac/skin/tadl/xml/myopac/myopac_prefs.xml b/Open-ILS/web/opac/skin/tadl/xml/myopac/myopac_prefs.xml
new file mode 100644 (file)
index 0000000..0687aa6
--- /dev/null
@@ -0,0 +1,105 @@
+
+<div id='myopac_prefs_div' xmlns:xi="http://www.w3.org/2001/XInclude" >
+
+       <table width='100%' class='data_grid'>
+
+               <thead>
+                       <tr>
+                               <td colspan='2' align='center'>
+                                       <b>&myopac.prefs.title;</b>
+                               </td>
+                       </tr>
+               </thead>
+
+               <tbody id='myopac_prefs_tbody'>
+                       <tr id='myopac_prefs_loading'><td colspan='3'><b>&myopac.loading;</b></td></tr>
+                       <tr id='myopac_prefs_row'>
+                               <td width='50%'>&myopac.prefs.hits;</td>
+                               <td>
+                                       <select id='prefs_hits_per'>
+                                               <option value='5'>5</option>
+                                               <option value='8'>8</option>
+                                               <option value='10'>10</option>
+                                               <option value='15'>15</option>
+                                               <option value='20'>20</option>
+                                               <option value='25'>25</option>
+                                               <option value='50'>50</option>
+                                       </select>
+                               </td>
+                       </tr>
+
+                       <!-- FONT size preference -->
+                       <tr>
+                               <td>&myopac.prefs.font;</td>
+                               <td>
+                                       <select id='prefs_def_font'>
+                                               <option value='regular'>&myopac.prefs.font.regular;</option>
+                                               <option value='large'>&myopac.prefs.font.large;</option>
+                                       </select>
+                               </td>
+                       </tr>
+
+                       <!-- default hold notification type -->
+                       <tr>
+                               <td>
+                                       <span>&myopac.prefs.holds.notify;</span>
+                                       <a class='classic_link' href='javascript:void(0);' 
+                                               onclick='alert($("myopac_pref_hold_notify_alert").textContent);' >&common.help;</a>
+                               </td>
+                               <td>
+                                       <select id='prefs_hold_notify'>
+                                               <option value='phone:email' selected='selected'>&myopac.prefs.holds.both;</option>
+                                               <option value='phone'>&myopac.prefs.holds.phone;</option>
+                                               <option value='email'>&myopac.prefs.holds.email;</option>
+                                       </select>
+                               </td>
+                       </tr>
+
+
+                       <tr id='prefs_def_location_row'>
+                               <td>&myopac.prefs.search.location;</td>
+                               <td>
+                                       <div style='margin-bottom: 5px;'>
+                                               <input type='checkbox' id='myopac_pref_home_lib' 
+                                                       onclick='
+                                                               if( this.checked ) $("prefs_def_location").disabled = true;
+                                                               else $("prefs_def_location").disabled = false;
+                                                       ' /> &myopac.prefs.search.home; 
+                                       </div>
+                                       <select id='prefs_def_location'>
+                                       </select>
+                               </td>
+                       </tr>
+
+                       <tr id='prefs_def_range_row'>
+                               <td>&myopac.prefs.search.range;</td>
+                               <td>
+                                       <select id='prefs_def_range'>
+                                       </select>
+                               </td>
+                       </tr>
+
+
+
+                       <!-- Save the preferences -->
+                       <tr><td colspan='2'><br/></td></tr>
+
+                       <tr>
+                               <td align='center' class='color_3' colspan='2'>
+                                       <button onclick='myOPACSavePrefs();' 
+                                               id='myopac_prefs_submit'>&myopac.prefs.save;</button>
+                               </td>
+                       </tr>
+
+               </tbody>
+       </table>
+
+       <div class='hide_me' id='prefs_update_success'>&myopac.prefs.save.success;</div>
+       <div class='hide_me' id='prefs_update_failure'>&myopac.prefs.save.failed;</div>
+       <span class='hide_me' id='myopac_pref_hold_notify_alert'>
+               &myopac.prefs.help;
+       </span>
+
+</div>
+
+
diff --git a/Open-ILS/web/opac/skin/tadl/xml/myopac/myopac_summary.xml b/Open-ILS/web/opac/skin/tadl/xml/myopac/myopac_summary.xml
new file mode 100644 (file)
index 0000000..40eda7f
--- /dev/null
@@ -0,0 +1,289 @@
+
+<div id='myopac_summary_div' xmlns:xi="http://www.w3.org/2001/XInclude" >
+
+
+    <div id='myopac.expired.alert' class='hide_me' style='margin-bottom: 20px;'>
+               <table class='data_grid' width='100%'>
+            <tbody>
+                <tr>
+                    <td width='100%' style='color:red;'>
+                       &myopac.summary.expired;
+                    </td>
+                </tr>
+            </tbody>
+        </table>
+    </div>
+
+       <div id='myopac.notes.div' class='hide_me'>
+               <table class='data_grid' width='100%'>
+                       <thead>
+                               <tr>
+                                       <td colspan='2'><b> &myopac.summary.notes;</b></td>
+                               </tr>
+                       </thead>
+                       <tbody id='myopac.notes.tbody'>
+                               <tr id='myopac.notes.tr'>
+                                       <td>
+                                               <b name='title'/> : <span name='value'/>
+                                       </td>
+                               </tr>
+                       </tbody>
+               </table>
+               <br/>
+       </div>
+
+       <table width='70%' class='light_border myopac_summary_table'>
+               <tbody id='myopac_summary_tbody'>
+                       <tr>
+                               <td width='30%' class='color_4 light_border'>&common.name;</td>
+                               <td class='light_border'>
+                                       <span id='myopac_summary_prefix' style='padding-right: 5px;'> </span> 
+                                       <span id='myopac_summary_first' style='padding-right: 5px;'> </span> 
+                                       <span id='myopac_summary_middle' style='padding-right: 5px;'> </span> 
+                                       <span id='myopac_summary_last' style='padding-right: 5px;'> </span> 
+                                       <span id='myopac_summary_suffix'> </span> 
+                               </td>
+                       </tr>
+
+                       <tr>
+                               <td class='color_4 light_border'>&myopac.summary.phone.day;</td>
+                               <td class='light_border' id='myopac_summary_dayphone'> </td>
+                       </tr>
+                       <tr>
+                               <td class='color_4 light_border'>&myopac.summary.phone.evening;</td>
+                               <td class='light_border' id='myopac_summary_eveningphone'> </td>
+                       </tr>
+                       <tr>
+                               <td class='color_4 light_border'>&myopac.summary.phone.other;</td>
+                               <td class='light_border' id='myopac_summary_otherphone'> </td>
+                       </tr>
+                       <tr>
+                               <td class='color_4 light_border'>&common.username;</td>
+                               <td class='light_border' id='myopac_summary_username'> </td>
+                               <td class='light_border'><a href='javascript:void(0);' 
+                                       onclick='unHideMe($("myopac_update_username_row"));$("myopac_new_username").focus();'
+                                       id='myopac_summary_username_change' style='text-decoration: underline;'>&myopac.summary.change;</a></td>
+                       </tr>
+
+                       <tr id='myopac_update_username_row' class='hide_me'>
+                               <td class='myopac_update_cell' colspan='3'>
+                                       <span class='myopac_update_span'>&myopac.summary.username.enter; </span>
+                                       <input type='text' size='24' id='myopac_new_username'
+                                               onkeydown='if(userPressedEnter(event)) myOPACUpdateUsername();' />
+                                       <span class='myopac_update_span'>
+                                               <button onclick='myOPACUpdateUsername();'>&common.submit;</button>
+                                       </span>
+                                       <span class='myopac_update_span'>
+                                               <button onclick='hideMe($("myopac_update_username_row"));'>&common.cancel;</button>
+                                       </span>
+                               </td>
+                       </tr>
+
+
+                       <tr>
+                               <td class='color_4 light_border'>&common.password;</td>
+                               <td class='light_border' id='myopac_summary_password'>&myopac.summary.password.text;</td>
+                               <td class='light_border'><a href='javascript:void(0);' 
+                                       onclick='unHideMe($("myopac_update_password_row"));$("myopac_current_password").focus();'
+                                       id='myopac_summary_password_change' style='text-decoration: underline;'>&myopac.summary.change;</a></td>
+                       </tr>
+
+                       <tr id='myopac_update_password_row' class='hide_me'>
+                               <td class='myopac_update_cell' colspan='3'>
+
+                                       <table><tbody>
+                                               <tr>
+                                                       <td><span class='myopac_update_span'>&myopac.summary.password.current; </span></td>
+                                                       <td><input type='password' size='24' id='myopac_current_password'
+                                                               onkeydown='if(userPressedEnter(event)) myOPACUpdatePassword();' /></td>
+                                               </tr>
+                                               <tr>
+                                                       <td><span class='myopac_update_span'>&myopac.summary.password.new; </span></td>
+                                                       <td><input type='password' size='24' id='myopac_new_password'
+                                                               onkeydown='if(userPressedEnter(event)) myOPACUpdatePassword();' /></td>
+                                               </tr>
+                                               <tr>
+                                                       <td><span class='myopac_update_span'>&myopac.summary.password.reenter; </span></td>
+                                                       <td><input type='password' size='24' id='myopac_new_password2'
+                                                               onkeydown='if(userPressedEnter(event)) myOPACUpdatePassword();' /></td>
+                                               </tr>
+                                       </tbody></table>
+
+                                       <span class='myopac_update_span'>
+                                               <button onclick='myOPACUpdatePassword();'>&common.submit;</button>
+                                       </span>
+                                       <span class='myopac_update_span'>
+                                               <button onclick='hideMe($("myopac_update_password_row"));'>&common.cancel;</button>
+                                       </span>
+                               </td>
+                       </tr>
+
+                       <tr>
+                               <td class='color_4 light_border'>&myopac.summary.email;</td>
+                               <td class='light_border' id='myopac_summary_email'> </td>
+                               <td class='light_border'><a href='javascript:void(0);' 
+                                       onclick='unHideMe($("myopac_update_email_row"));$("myopac_new_email").focus();'
+                                       id='myopac_summary_email_change' style='text-decoration: underline;'>&myopac.summary.change;</a></td>
+                       </tr>
+
+                       <tr id='myopac_update_email_row' class='hide_me'>
+                               <td class='myopac_update_cell' colspan='3'>
+                                       <span class='myopac_update_span'>&myopac.summary.email.new; </span>
+                                       <input type='text' size='24' id='myopac_new_email'
+                                               onkeydown='if(userPressedEnter(event)) myOPACUpdateEmail();' />
+                                       <span class='myopac_update_span'>
+                                               <button onclick='myOPACUpdateEmail();'>&common.submit;</button>
+                                       </span>
+                                       <span class='myopac_update_span'>
+                                               <button onclick='hideMe($("myopac_update_email_row"));'>&common.cancel;</button>
+                                       </span>
+                               </td>
+                       </tr>
+
+                       <tr>
+                               <td class='color_4 light_border'>&myopac.summary.id.primary;</td>
+                               <td class='light_border' id='myopac_summary_ident1'> </td>
+                       </tr>
+                       <!--
+                       <tr>
+                               <td class='color_4 light_border'>Secondary Identification</td>
+                               <td class='light_border' id='myopac_summary_ident2'> </td>
+                       </tr>
+                       -->
+                       <tr>
+                               <td class='color_4 light_border'>&myopac.summary.barcode;</td>
+                               <td class='light_border' id='myopac_summary_barcode'> </td>
+                       </tr>
+                       <tr>
+                               <td class='color_4 light_border'>&myopac.summary.home;</td>
+                               <td class='light_border' id='myopac_summary_homelib'> </td>
+                       </tr>
+                       <tr>
+                               <td class='color_4 light_border'>&myopac.summary.genesis;</td>
+                               <td class='light_border' id='myopac_summary_create_date'> </td>
+                       </tr>
+
+               </tbody>
+       </table>
+
+
+       <br/><hr/><br/>
+
+       <table width='100%' class='light_border data_grid'>
+        <thead>
+            <tr>
+                <td>&myopac.summary.addresses;</td>
+                <td id='myopac_pending_addr_td' class='hide_me'>&myopac.summary.addresses.pending;</td>
+            </tr>
+        </thead>
+               <tbody id='myopac_addr_tbody'>
+                       <tr id='myopac_addr_row' class='light_border'>
+                <td>
+                    <table>
+                        <tr>
+                            <td>&myopac.summary.address.type;</td>
+                            <td name='myopac_addr_type'> </td>
+                        </tr>
+                        <tr>
+                            <td>&myopac.summary.address.street;</td>
+                            <td name='myopac_addr_street'> </td>
+                        </tr>
+                        <tr>
+                            <td>&myopac.summary.address.street;</td>
+                            <td name='myopac_addr_street2'> </td>
+                        </tr>
+                        <tr>
+                            <td>&myopac.summary.address.city;</td>
+                            <td name='myopac_addr_city'> </td>
+                        </tr>
+                        <tr>
+                            <td>&myopac.summary.address.county;</td>
+                            <td name='myopac_addr_county'> </td>
+                        </tr>
+                        <tr>
+                            <td>&myopac.summary.address.state;</td>
+                            <td name='myopac_addr_state'> </td>
+                        </tr>
+                        <tr>
+                            <td>&myopac.summary.address.country;</td>
+                            <td name='myopac_addr_country'> </td>
+                        </tr>
+                        <tr>
+                            <td>&myopac.summary.address.zip;</td>
+                            <td name='myopac_addr_zip'> </td>
+                        </tr>
+                        <tr name='myopac_invalid_addr_row' class='hide_me'>
+                            <td colspan='2'>&myopac.summary.address.invalid;</td>
+                        </tr>
+                        <tr>
+                            <td name='myopac_addr_edit_td' colspan='2' class='hide_me'>
+                                <a class='classic_link' name='myopac_addr_edit_link' href='javascript:void(0);'>&myopac.summary.address.edit;</a>
+                            </td>
+                        </tr>
+                    </table>
+                </td>
+                <td class='hide_me' name='myopac_pending_addr_td'>
+                    <table>
+                        <tr>
+                            <td>&myopac.summary.address.type;</td>
+                            <td><input name='myopac_pending_addr_type'/> </td>
+                        </tr>
+                        <tr>
+                            <td>&myopac.summary.address.street;</td>
+                            <td><input name='myopac_pending_addr_street'/> </td>
+                        </tr>
+                        <tr>
+                            <td>&myopac.summary.address.street;</td>
+                            <td><input name='myopac_pending_addr_street2'/> </td>
+                        </tr>
+                        <tr>
+                            <td>&myopac.summary.address.city;</td>
+                            <td><input name='myopac_pending_addr_city'/> </td>
+                        </tr>
+                        <tr>
+                            <td>&myopac.summary.address.county;</td>
+                            <td><input name='myopac_pending_addr_county'/> </td>
+                        </tr>
+                        <tr>
+                            <td>&myopac.summary.address.state;</td>
+                            <td><input name='myopac_pending_addr_state'/> </td>
+                        </tr>
+                        <tr>
+                            <td>&myopac.summary.address.country;</td>
+                            <td><input name='myopac_pending_addr_country'/> </td>
+                        </tr>
+                        <tr>
+                            <td>&myopac.summary.address.zip;</td>
+                            <td><input name='myopac_pending_addr_zip'/> </td>
+                        </tr>
+                        <tr>
+                            <td name='myopac_addr_edit_td' colspan='2'>
+                                <a class='classic_link' name='myopac_pending_addr_edit_link' href='javascript:void(0);'>Save Changes</a>
+                                <a style='padding-left:10px;' class='classic_link' name='myopac_pending_addr_del_link' href='javascript:void(0);'>Discard Pending Address</a>
+                            </td>
+                        </tr>
+                    </table>
+                </td>
+            </tr>
+               </tbody>
+       </table>
+
+       <div class='hide_me' id='myopac_username_error'>&myopac.summary.username.error;</div>
+       <div class='hide_me' id='myopac_username_dup'>
+               &myopac.summary.username.dup;
+       </div>
+       <div class='hide_me' id='myopac_username_success'>&myopac.summary.username.success;</div>
+       <div class='hide_me' id='myopac_username_failure'>&myopac.summary.username.failure;</div>
+
+       <div class='hide_me' id='myopac_email_error'>&myopac.summary.email.error;</div>
+       <div class='hide_me' id='myopac_email_success'>&myopac.summary.email.success;</div>
+       <div class='hide_me' id='myopac_email_failure'>&myopac.summary.email.failed;</div>
+
+       <div class='hide_me' id='myopac_password_error'>&myopac.summary.password.error;</div>
+       <div class='hide_me' id='myopac_password_success'>&myopac.summary.password.success;</div>
+       <div class='hide_me' id='myopac_password_failure'>&myopac.summary.password.failure;</div>
+       <span class='hide_me' id='myopac_invalid_username'>&myopac.summary.username.invalid;</span>
+       <span class='hide_me' id='myopac_addr_changes_saved'>Address Saved</span>
+</div>
+
+
diff --git a/Open-ILS/web/opac/skin/tadl/xml/page_advanced.xml b/Open-ILS/web/opac/skin/tadl/xml/page_advanced.xml
new file mode 100644 (file)
index 0000000..2f02c9b
--- /dev/null
@@ -0,0 +1,14 @@
+<div id='canvas_main' class='canvas' style='margin-top: 20px;'>
+
+       <script language='javascript' type='text/javascript' src='<!--#echo var="OILS_OPAC_JS_HOST"-->/skin/tadl/js/advanced.js'></script>
+
+       <style type='text/css'>
+               .advanced_div { text-align: center; margin: 8px; margin-left: 2px; width: 95%; padding: 5px; }
+       </style>
+
+       <div class='advanced_div'>
+               <!--#include virtual="advanced/advanced_global.xml"-->
+       </div>
+</div>
+
+
diff --git a/Open-ILS/web/opac/skin/tadl/xml/page_cnbrowse.xml b/Open-ILS/web/opac/skin/tadl/xml/page_cnbrowse.xml
new file mode 100644 (file)
index 0000000..658a6f3
--- /dev/null
@@ -0,0 +1,6 @@
+<div id='canvas_main' class='canvas' style='margin-top: 20px;'>
+       <script language='javascript' type='text/javascript' src='<!--#echo var="OILS_OPAC_JS_HOST"-->/skin/tadl/js/cn_browse.js'></script>
+       <!--#include virtual="common/cn_browse.xml"-->
+</div>
+
+
diff --git a/Open-ILS/web/opac/skin/tadl/xml/page_mresult.xml b/Open-ILS/web/opac/skin/tadl/xml/page_mresult.xml
new file mode 100644 (file)
index 0000000..af0424c
--- /dev/null
@@ -0,0 +1,9 @@
+<div>
+       <script language='javascript' type='text/javascript' src='<!--#echo var="OILS_OPAC_JS_HOST"-->/skin/tadl/js/sidebar_extras.js'></script>
+       <script language='javascript' type='text/javascript' src='<!--#echo var="OILS_OPAC_JS_HOST"-->/skin/tadl/js/mresult.js'></script>
+       <script language='javascript' type='text/javascript' src='<!--#echo var="OILS_OPAC_JS_HOST"-->/skin/tadl/js/result_common.js'></script>
+       <script language='javascript' type='text/javascript' src='<!--#echo var="OILS_OPAC_JS_HOST"-->/skin/tadl/js/tips.js'></script>
+       <script language='javascript' type='text/javascript' src='<!--#echo var="OILS_OPAC_JS_HOST"-->/skin/tadl/js/holds.js'></script>   
+       <!--#include virtual="result/result_common.xml"-->
+</div>
+
diff --git a/Open-ILS/web/opac/skin/tadl/xml/page_myopac.xml b/Open-ILS/web/opac/skin/tadl/xml/page_myopac.xml
new file mode 100644 (file)
index 0000000..fc1f2be
--- /dev/null
@@ -0,0 +1,68 @@
+<div id='canvas_main' class='canvas hide_me'>
+
+       <script language='javascript' type='text/javascript' src='<!--#echo var="OILS_OPAC_JS_HOST"-->/skin/tadl/js/myopac.js'></script>
+       <script language='javascript' type='text/javascript' src='<!--#echo var="OILS_OPAC_JS_HOST"-->/skin/tadl/js/grpl_utils.js'></script>
+
+       <script language='javascript' type='text/javascript'> config.ids.altcanvas.myopac_reload = 'myopac_reloading'; </script>
+       <div id='myopac_reloading' class='hide_me canvas'> &common.loading; </div>
+
+       <script language='javascript' type='text/javascript'>
+               config.ids.myopac = {};
+               config.css.myopac = {};
+               config.names.myopac = {};
+       </script>
+
+       <br/>
+       <table style='width: 98%; text-align: center;'>
+               <tbody>
+                       <tr id='myopac_nav_row'>
+
+                               <td class='myopac_link border_6' id='myopac_summary_td' >
+                                       <a href='javascript:void(0);' 
+                                               onclick='myOPACChangePage("summary");'>&myopac.account;</a>
+                               </td>
+
+                               <td class='myopac_link border_6' id='myopac_checked_td' >
+                                       <a href='javascript:void(0);' 
+                                               onclick='myOPACChangePage("checked");'>&myopac.checkouts;</a>
+                               </td>
+
+                               <td class='myopac_link border_6' id='myopac_holds_td' >
+                                       <a href='javascript:void(0);' 
+                                               onclick='myOPACChangePage("holds");'>&myopac.holds;</a>
+                               </td>
+
+                               <td class='myopac_link border_6' id='myopac_fines_td' >
+                                       <a href='javascript:void(0);' 
+                                               onclick='myOPACChangePage("fines");'>&myopac.fines;</a>
+                               </td>
+
+                               <td class='myopac_link border_6' id='myopac_prefs_td' >
+                                       <a href='javascript:void(0);' 
+                                               onclick='myOPACChangePage("prefs");'>&myopac.preferences;</a>
+                               </td>
+
+                               <td class='myopac_link border_6' id='myopac_bookbag_td' nowrap='nowrap'>
+                                       <a href='javascript:void(0);' 
+                                               onclick='myOPACChangePage("bookbag");'>&myopac.bookbags;</a>
+
+                               </td>
+
+                       </tr>
+               </tbody>
+       </table>
+
+       <br/>
+
+       <div id='myopac_main_div'>
+               <!--#include virtual="myopac/myopac_summary.xml"-->
+               <!--#include virtual="myopac/myopac_checked.xml"-->
+               <!--#include virtual="myopac/myopac_holds.xml"-->
+               <!--#include virtual="myopac/myopac_fines.xml"-->
+               <!--#include virtual="myopac/myopac_prefs.xml"-->
+               <!--#include virtual="myopac/myopac_bookbags.xml"-->
+       </div>
+
+</div>
+
+
diff --git a/Open-ILS/web/opac/skin/tadl/xml/page_rdetail.xml b/Open-ILS/web/opac/skin/tadl/xml/page_rdetail.xml
new file mode 100644 (file)
index 0000000..de8e55c
--- /dev/null
@@ -0,0 +1,90 @@
+<div id='canvas_main' class='canvas'>
+
+       <script language='javascript' type='text/javascript' src='<!--#echo var="OILS_OPAC_JS_HOST"-->/skin/tadl/js/sidebar_extras.js'></script>
+       <script language='javascript' type='text/javascript' src='<!--#echo var="OILS_OPAC_JS_HOST"-->/skin/tadl/js/result_common.js'></script>
+       <script language='javascript' type='text/javascript' src='<!--#echo var="OILS_OPAC_JS_HOST"-->/skin/tadl/js/rresult.js'></script>
+       <script language='javascript' type='text/javascript' src='<!--#echo var="OILS_OPAC_JS_HOST"-->/skin/tadl/js/rdetail.js'></script>
+       <script language='javascript' type='text/javascript' src='<!--#echo var="OILS_OPAC_JS_HOST"-->/skin/tadl/js/holds.js'></script>
+       <script language='javascript' type='text/javascript' src='<!--#echo var="OILS_OPAC_JS_HOST"-->/skin/tadl/js/cn_browse.js'></script>
+       <script language='javascript' type='text/javascript' src='<!--#echo var="OILS_OPAC_JS_HOST"-->/skin/tadl/js/container.js'></script>
+       <script language='javascript' type='text/javascript' src='<!--#echo var="OILS_OPAC_JS_HOST"-->/skin/tadl/js/grpl_utils.js'></script>
+
+       <script language='javascript' type='text/javascript'>
+               config.ids.rdetail = {};
+               config.ids.rdetail.view_marc = "rdetail_view_marc";
+       </script>
+
+       <table width='100%' id='np_table' class='hide_me' style='margin-top: 3px;'>
+               <tbody>
+                       <tr class='color_4' style='height: 1em;'>
+                               <td style='vertical-align: top;'>
+
+                                       <span>
+                                               &rdetail.result; <span id='np_offset'> </span>
+                                               <span> &common.of; </span>
+                                               <span id='np_count'> </span>
+                                       </span>
+       
+                                       <span style='padding-left: 40px;' >
+                                               <a class='np_nav_link classic_link hide_me' id='np_start'
+                                                       href='javascript:rdetailStart();' title="&rdetail.page.results;">&rdetail.start;</a>
+                                               <a class='np_nav_link classic_link hide_me' id='np_prev'
+                                                       href='javascript:rdetailPrev();' title='&rdetail.page.previous;'>&rdetail.page.previous.short;</a>
+                                               <span> </span>
+                                               <a  class='np_nav_link classic_link hide_me' id='np_next'
+                                                       href='javascript:rdetailNext();' title='&rdetail.page.next;'>&rdetail.page.next.short;</a>
+                                               <a class='np_nav_link classic_link hide_me' id='np_end'
+                                                       href='javascript:rdetailEnd();' title="&rdetail.page.last;">&rdetail.end;</a>
+                                       </span>
+       
+                               </td>
+                       </tr>
+               </tbody>
+       </table>
+
+       <table style='' class='rdetail_header color_1' width='100%'>
+               <tbody>
+
+                       <tr>
+                               <td width='33%' align='left'>
+                                       <span>&rdetail.detailMain.headerLabel;</span>
+                               </td>
+
+                               <td align='right' style='padding-right: 7px;' width='33%'>
+                                       <span id='rdetail_exp_refworks_span' class='hide_me' style='padding-right: 7px;'>
+                                               <a id='rdetail_exp_refworks'>&opac.holds.exportRefWorks;</a>
+                                       </span>
+                                       <span style='padding-right: 7px;'>
+                                               <a id='rdetail_place_hold' class='classic_link' href='javascript:;'>&opac.holds.placeHold;</a>
+                                       </span>
+                                       <span style='padding-right: 7px;' class='hide_me' id='rdetail_more_actions'>
+                                               <select id='rdetail_more_actions_selector' style='max-width: 11em;'>
+                                                       <option value='start'>&rdetail.more;</option>
+                                                       <option disabled='disabled'>--------------</option>
+                                                       <option disabled='disabled'>&rdetail.bookbag.add;</option>
+                                                       <option disabled='disabled'>--------------</option>
+                                                       <option value='new_bookbag' onclick='rdetailNewBookbag();'>&rdetail.bookbag.create;</option>
+                                                       <option disabled='disabled'>--------------</option>
+                                               </select>
+                                       </span>
+
+                               </td>
+                       </tr>
+               </tbody>
+       </table>
+
+       <div style='font-weight: bold; padding: 5px; margin: 5px; width: 100%;' 
+               class='hide_me color_4' id='rdetail_deleted_exp'>
+               &rdetail.record.deleted;
+       </div>
+
+       <!--#include virtual="rdetail/rdetail_summary.xml"-->
+       <br/><br/>
+       <!--#include virtual="rdetail/rdetail_extras.xml"-->
+
+       <div class='hide_me' id='rdetail_bb_none'>&rdetail.none;</div>
+       <div class='hide_me' id='rdetail_bb_item_success'>&rdetail.bookbag.add.success;</div>
+       <div class='hide_me' id='rdetail_bb_new'>&rdetail.bookbag.name;</div>
+       <div class='hide_me' id='rdetail_bb_success'>&rdetail.bookbag.create.success;</div>
+
+</div>
diff --git a/Open-ILS/web/opac/skin/tadl/xml/page_rresult.xml b/Open-ILS/web/opac/skin/tadl/xml/page_rresult.xml
new file mode 100644 (file)
index 0000000..a734e7b
--- /dev/null
@@ -0,0 +1,9 @@
+<div>
+       <script language='javascript' type='text/javascript' src='<!--#echo var="OILS_OPAC_JS_HOST"-->/skin/tadl/js/sidebar_extras.js'></script>
+       <script language='javascript' type='text/javascript' src='<!--#echo var="OILS_OPAC_JS_HOST"-->/skin/tadl/js/rresult.js'></script>
+       <script language='javascript' type='text/javascript' src='<!--#echo var="OILS_OPAC_JS_HOST"-->/skin/tadl/js/result_common.js'></script>
+       <script language='javascript' type='text/javascript' src='<!--#echo var="OILS_OPAC_JS_HOST"-->/skin/tadl/js/tips.js'></script>
+       <script language='javascript' type='text/javascript' src='<!--#echo var="OILS_OPAC_JS_HOST"-->/skin/tadl/js/holds.js'></script>   
+       <!--#include virtual="result/result_common.xml"-->
+</div>
+
diff --git a/Open-ILS/web/opac/skin/tadl/xml/rdetail.xml b/Open-ILS/web/opac/skin/tadl/xml/rdetail.xml
new file mode 100644 (file)
index 0000000..f3e84e5
--- /dev/null
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!-- Loads the environment -->
+<!--#include virtual="setenv.xml"-->
+
+<!DOCTYPE html PUBLIC 
+       "-//W3C//DTD XHTML 1.0 Transitional//EN" 
+       "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" [
+       <!--#include virtual="/opac/locale/${locale}/opac.dtd"-->
+]>
+
+
+<html xmlns='http://www.w3.org/1999/xhtml'>
+       <!--#include virtual="header.xml"-->
+       <!--#if expr="$OILS_PAGE='index.xml'"-->
+               <!--#include virtual="home/index_body.xml"-->
+       <!--#else-->
+               <!--#include virtual="body.xml"-->
+       <!--#endif-->
+</html>
+
diff --git a/Open-ILS/web/opac/skin/tadl/xml/rdetail/rdetail_altcanvas.xml b/Open-ILS/web/opac/skin/tadl/xml/rdetail/rdetail_altcanvas.xml
new file mode 100644 (file)
index 0000000..ff17d17
--- /dev/null
@@ -0,0 +1,28 @@
+
+<!-- record details alternate canvases -->
+<div class=''>
+
+       <!--
+       <script language='javascript' type='text/javascript'>
+               config.ids.rdetail.view_marc_div = 'view_marc_div';
+               config.ids.altcanvas.view_marc_div = config.ids.rdetail.view_marc_div; 
+               config.ids.rdetail.hide_marc = "rdetail_hide_marc";
+               config.ids.rdetail.view_marc_box = "rdetail_view_marc_box";
+       </script>
+
+       <div class='hide_me canvas' id='view_marc_div'> 
+               <div>
+                       <table width='100%'><tbody><tr>
+                               <td class='color_1' align='left' style='padding-left: 7px;text-decoration: underline;'>
+                                       <a href="javascript:void(0);" id='rdetail_hide_marc'>&rdetail.detailMain.hideMarc;</a>
+                               </td>
+                       </tr></tbody></table>
+               </div>
+               <br/>
+               <div id='rdetail_view_marc_box'> </div>
+               <br/><br/>
+       </div>
+       -->
+       
+</div>
+
diff --git a/Open-ILS/web/opac/skin/tadl/xml/rdetail/rdetail_cn_details.xml b/Open-ILS/web/opac/skin/tadl/xml/rdetail/rdetail_cn_details.xml
new file mode 100644 (file)
index 0000000..8db40c8
--- /dev/null
@@ -0,0 +1,109 @@
+<table class='hide_me'>
+       <script language='javascript' type='text/javascript' src='<!--#echo var="OILS_OPAC_JS_HOST"-->/skin/tadl/js/copy_details.js'></script>
+       <script language='javascript' type='text/javascript' src='<!--#echo var="OILS_OPAC_JS_HOST"-->/common/js/Date.W3CDTF.js'></script>
+       <tbody>
+               <tr style='border: 3px solid #E0E0E0;' id='rdetail_volume_details_row' templateRow='1'>
+                       <td colspan='10'>
+                               <div style='text-align: center; margin-top: 6px; margin-bottom: 6px'>
+                               
+                                       <a name='print' href='javascript:void(0);' class='classic_link'>&rdetail.print;</a>
+                                       <table class='data_grid data_grid_center' style='width: 100%'>
+                                               <thead>
+                                                       <tr>
+                                                               <td width='33%'>&rdetail.cn.barcode;</td>
+                                                               <td>&common.status;</td>
+                                                               <td>&rdetail.cn.location;</td>
+                                                               <td name='copy_part_label' class='hide_me'>&rdetail.cn.part;</td>
+                                                               <td name='age_protect_label' class='hide_me'>&rdetail.cn.hold.age;</td>
+                                                               <td name='create_date_label' class='hide_me'>&rdetail.cn.genesis;</td>
+                                                               <td name='holdable_label' class='hide_me'>&rdetail.cn.holdable;</td>
+                                                               <td name='due_date_label' class='hide_me'>&rdetail.cn.due;</td>
+                                                       </tr>
+                                               </thead>
+                                               <tbody name='copies_tbody' class='copy_details_table' width='100%'>
+
+                                                       <tr name='copies_row'>
+
+                                                               <td>
+                                                                       <span name='barcode'> </span>
+                                                                       <a class='hide_me classic_link copy_more_info' name='details_link'>&rdetail.cn.more;</a>
+                                                                       <a class='hide_me classic_link copy_more_info' name='less_details_link'>&rdetail.cn.less;</a>
+                                                                       <a class='hide_me classic_link copy_more_info' name='copy_hold_link' 
+                                                                               href='javascript:void(0);'>&rdetail.cn.hold;</a>
+                                                                       <a class='hide_me classic_link copy_more_info' name='copy_reserve_link' 
+                                                                               href='javascript:void(0);'>&rdetail.cn.reserve;</a>
+                                                                       <a class='hide_me classic_link copy_more_info' name='copy_multi_home'
+                                                                               href='javascript:void(0);'>&rdetail.cn.multi_home;</a>
+                                                               </td>
+
+                                                               <td name='status'> </td>
+                                                               <td name='location'> </td>
+                                                               <td name='copy_part' class='hide_me'> </td>
+                                                               <td name='age_protect_value' class='hide_me'>&rdetail.cn.disabled;</td>
+                                                               <td name='create_date_value' class='hide_me'> </td>
+
+                                                               <td name='copy_holdable_td' class='hide_me'>
+                                                                       <span name='copy_is_holdable'> </span>
+                                                               </td>
+
+                                                               <td name='copy_due_date_td' class='hide_me'>
+                                                                       <span name='copy_due_date'> </span>
+                                                               </td>
+
+                                                       </tr>
+
+                                                       <tr name='copy_extras_row' class='hide_me'>
+                                                               <td colspan='10'>
+                                                                       <table width='100%' class='data_grid'>
+                                                                               <tbody name='extras_tbody'>
+                                                                                       <tr name='extras_row' class='hide_me'>
+                                                                                               <td name='type' width='20%'> 
+                                                                                                       <span name='note' class='hide_me'><b>&rdetail.cn.note;</b></span>
+                                                                                                       <span name='cat' class='hide_me'><b>&rdetail.cn.category;</b></span>
+                                                                                               </td>
+                                                                                               <td>
+                                                                                                       <span name='key'> </span> : <span name='value'> </span>
+                                                                                               </td>
+                                                                                       </tr>
+                                                                               </tbody>
+                                                                       </table>
+                                                               </td>
+                                                       </tr>
+
+                                               </tbody>
+                                       </table>
+                               </div>
+                       </td>
+               </tr>
+       </tbody>
+</table>
+
+<span class='hide_me' id='rdetail.yes'>&common.yes;</span>
+<span class='hide_me' id='rdetail.no'>&common.no;</span>
+
+
+<div id='rdetail_print_details' class='hide_me'>
+       <div style='text-align: center; padding: 20px; width: 100%'>
+               <div style='width:100%; border: 2px solid #E0F0E0; margin-bottom: 20px;'>
+                       <input type='submit' value='&rdetail.cn.print;' onclick='window.print();'> </input>
+               </div>
+               <div name='body'> 
+                       <table>
+                               <tbody name='tbody'>
+                                       <tr><td>&common.library;</td><td colspan='2' name='lib'></td></tr>
+                                       <tr><td>&common.title;</td><td colspan='2' name='title'></td></tr>
+                                       <tr><td>&common.author;</td><td colspan='2' name='author'></td></tr>
+                                       <tr><td>&common.edition;</td><td colspan='2' name='edition'></td></tr>
+                                       <tr><td>&common.pubdate;</td><td colspan='2' name='pubdate'></td></tr>
+                                       <tr><td>&common.publisher;</td><td colspan='2' name='publisher'></td></tr>
+                                       <tr><td>&common.physical;</td><td colspan='2' name='phys'></td></tr>
+                                       <tr>
+                                               <td colspan='3' style='background: #E0F0E0;'> </td>
+                                       </tr>
+                                       <tr name='cnrow'><td><b>&common.callnumber;</b></td><td><b colspan='2' name='cn'></b></td></tr>
+                               </tbody>
+                       </table>
+               </div>
+       </div>
+</div>
+
diff --git a/Open-ILS/web/opac/skin/tadl/xml/rdetail/rdetail_copyinfo.xml b/Open-ILS/web/opac/skin/tadl/xml/rdetail/rdetail_copyinfo.xml
new file mode 100644 (file)
index 0000000..01e463b
--- /dev/null
@@ -0,0 +1,89 @@
+
+<!-- This holds information for copies attached to this record -->
+<div id='rdetail_copy_info_div' class='rdetail_extras_div'>
+
+       <div style='width: 100%; text-align: center; padding-bottom: 5px;'>
+               <span>
+                       <a href='javascript:void(0);' id='copy_info_local_link' 
+                               class='rdetail_copy_nav_link hide_me classic_link'><b>&rdetail.copyInfo.local;</b></a>
+               </span>
+               <span width=''>
+                       <a href='javascript:void(0);' id='copy_info_all_link' 
+                               class='rdetail_copy_nav_link classic_link'><b>&rdetail.copyInfo.all;</b></a>
+               </span>
+       </div>
+
+       <table id='rdetail_copy_info_table' class='data_grid'>
+               <thead>
+
+                       <tr>
+                               <td  class='rdetail_copy_info_header_cell'>&rdetail.copyInfo.library;</td>
+                               <td  class='rdetail_copy_info_header_cell'>&rdetail.copyInfo.callnumber;</td>
+                               <td  name='rdetail_copylocation_header' class='rdetail_copy_info_header_cell hide_me'>&rdetail.copyInfo.copylocation;</td>
+                               <td  class='rdetail_copy_info_header_cell'>&rdetail.copyInfo.actions;</td>
+                               <td  nowrap='nowrap' class='rdetail_copy_info_header_cell' id='rdetail_copy_info_status'> 
+                                       <div name='rdetail_status_cell'> </div>
+                               </td>
+                       </tr>
+
+               </thead>
+               <tbody id='rdetail_copy_info_tbody'>
+                       <tr id='rdetail_copy_info_row' class='hide_me'>
+                               <td name='rdetail_library_cell'>
+                                       <a name='lib_print_link' class='hide_me classic_link' style='font-size: 8pt; padding-left: 20px;'>
+                                               &rdetail.copyInfo.print;
+                                       </a>
+                               </td>
+                               <td name='rdetail_callnumber_cell'> </td>
+                               <td class="hide_me" name='rdetail_copylocation_cell'> </td>
+                               <td name='rdetail_actions_cell'> 
+                                       <div style='padding-bottom: 1px;'>
+                                               <a style='font-size: 8pt;'
+                                                       name='details' class='hide_me classic_link'>&rdetail.copyInfo.details;</a>
+                                       </div>
+                                       <div style='margin-top: 2px;'>
+                                               <a name='browse' style='font-size: 8pt;'
+                                                       class='hide_me classic_link'>&rdetail.copyInfo.browse;</a>
+                                       </div>
+                                       <div style='margin-top: 2px;' name='hold_div' class='hide_me'>
+                                               <a name='hold' style='font-size: 8pt;' href='javascript:void(0);'
+                                                       class='classic_link'>&rdetail.copyInfo.hold;</a>
+                                       </div>
+                               </td>
+                               <td nowrap='nowrap' class='rdetail_copy_count_cell vertical' 
+                                       name='rdetail_copy_count_cell'> </td>
+                       </tr>
+
+                       <tr id='rdetail_copy_info_loading'><td>&rdetail.loading;</td></tr>
+
+               </tbody>
+       </table>
+
+       <!--
+       <table class='hide_me'>
+               <tbody>
+               <tr style='border: 3px solid #E0E0E0;' id='rdetail_volume_details_row'><td colspan='10'></td></tr>
+               </tbody>
+       </table>
+       -->
+
+       <br/><br/>
+
+       <div id='rdetail_copy_info_none' class='hide_me'>&rdetail.noneAvailable;</div>
+
+       <script language='javascript' type='text/javascript'>
+               config.ids.rdetail.cp_status                    = "rdetail_copy_info_status";
+               config.ids.rdetail.cp_info_row          = "rdetail_copy_info_row";
+               config.ids.rdetail.cp_info_loading      = "rdetail_copy_info_loading";
+               config.ids.rdetail.cp_info_local                = "copy_info_local_link";
+               config.ids.rdetail.cp_info_all          = "copy_info_all_link";
+               config.ids.rdetail.cp_info_none         = "rdetail_copy_info_none";
+               config.names.rdetail.lib_cell                   = "rdetail_library_cell";
+               config.names.rdetail.cn_cell                    = "rdetail_callnumber_cell";
+               config.names.rdetail.cp_count_cell      = "rdetail_copy_count_cell";
+               config.names.rdetail.cp_status          = 'rdetail_status_cell';
+       </script>
+
+</div> <!-- copy info -->
+
+
diff --git a/Open-ILS/web/opac/skin/tadl/xml/rdetail/rdetail_extras.xml b/Open-ILS/web/opac/skin/tadl/xml/rdetail/rdetail_extras.xml
new file mode 100644 (file)
index 0000000..4245824
--- /dev/null
@@ -0,0 +1,184 @@
+
+<div xmlns:xi="http://www.w3.org/2001/XInclude">
+
+       <table class='rdetails_extra_links'>
+               <thead>
+                       <tr>
+                               <td id='rdetail_copy_info_link' class='rdetail_extras_td rdetail_extras_selected' 
+                                       style='padding-right: 15px; padding-left: 15px;' >
+                                       <a href='javascript:rdetailShowExtra("copyinfo");' 
+                                               class='classic_link'>&rdetail.extras.summary;</a>
+                               </td>
+
+                               <td id='rdetail_viewcn_link' class='rdetail_extras_td'
+                                       style='padding-right: 15px; padding-left: 15px;' >
+                                       <a href='javascript:rdetailShowExtra("cn");' 
+                                               class='classic_link'>&rdetail.extras.browser;</a>
+                               </td>
+
+                               <td id='rdetail_summary_link' class='hide_me rdetail_extras_td'
+                                       style='padding-right: 15px; padding-left: 15px;' >
+                                       <a href='javascript:rdetailShowExtra("summary");' 
+                                               class='classic_link'>&rdetail.extras.bib_summary;</a>
+                               </td>
+
+                               <td id='rdetail_reviews_link' class='hide_me rdetail_extras_td'
+                                       style='padding-right: 15px; padding-left: 15px;' >
+                                       <a href='javascript:rdetailShowExtra("reviews");' 
+                                               class='classic_link'>&rdetail.extras.reviews;</a>
+                               </td>
+
+                               <td id='rdetail_toc_link' class='hide_me rdetail_extras_td'
+                                       style='padding-right: 15px; padding-left: 15px;' >
+                                       <a href='javascript:rdetailShowExtra("toc");' 
+                                               class='classic_link'>&rdetail.extras.toc;</a>
+                               </td>
+
+                               <td id='rdetail_excerpt_link' class='hide_me rdetail_extras_td'
+                                       style='padding-right: 15px; padding-left: 15px;' >
+                                       <a href='javascript:rdetailShowExtra("excerpt");' 
+                                               class='classic_link'>&rdetail.extras.excerpt;</a>
+                               </td>
+
+                               <td id='rdetail_preview_link' class='hide_me rdetail_extras_td'
+                                       style='padding-right: 15px; padding-left: 15px;' >
+                                       <a href='javascript:rdetailShowExtra("preview");' 
+                                               class='classic_link'>&rdetail.extras.preview;</a>
+                               </td>
+
+                               <td id='rdetail_anotes_link' class='hide_me rdetail_extras_td'
+                                       style='padding-right: 15px; padding-left: 15px;' >
+                                       <a href='javascript:rdetailShowExtra("anotes");' 
+                                               class='classic_link'>&rdetail.extras.author.notes;</a>
+                               </td>
+
+                               <td id='rdetail_annotation_link' class='hide_me rdetail_extras_td'
+                                       style='padding-right: 15px; padding-left: 15px;' >
+                                       <a href='javascript:rdetailShowExtra("annotation");' 
+                                               class='classic_link'>&rdetail.extras.annotation;</a>
+                               </td>
+
+                               <td id='rdetail_viewmarc_link' class='rdetail_extras_td'
+                                       style='padding-right: 15px; padding-left: 15px;' >
+                                       <a href='javascript:rdetailShowExtra("marc");' 
+                                               class='classic_link'>&rdetail.extras.marc;</a>
+                               </td>
+
+                               <td id='rdetail_novelist_link' class='hide_me rdetail_extras_td'
+                                       style='padding-right: 15px; padding-left: 15px;' >
+                                       <a href='javascript:rdetailShowExtra("novelist");' 
+                                               class='classic_link'>&rdetail.extras.novelist;</a>
+                               </td>
+
+                               <td id='rdetail_foreign_items_link' class='hide_me rdetail_extras_td'
+                                       style='padding-right: 15px; padding-left: 15px;' >
+                                       <a href='javascript:rdetailShowExtra("foreign_items");'
+                                               class='classic_link'>&rdetail.extras.foreign_items;</a>
+                               </td>
+
+                       </tr>
+               </thead>
+       </table>
+
+       <div id='rdetail_extras_div' style='width: 95%;'> 
+               <div id='rdetail_extras_loading' class='hide_me' 
+                       style='padding: 10px;'>&common.loading;</div>
+               <!--#include virtual="rdetail_copyinfo.xml"-->
+
+               <div id='rdetail_summary_div' class='rdetail_extras_div hide_me'> </div>
+
+               <div id='rdetail_reviews_div' class='rdetail_extras_div hide_me'> 
+                       <div id='rdetail_review_container'/>
+                       <!--
+                       <div id='rdetail_review_template' style='width: 100%;'>
+                               <div name='review_header' style='width: 100%; padding: 15px; border: 1px solid #E0E0E0;'> </div>
+                               <div name='review_text' style='width: 100%; padding: 15px; border: 1px solid #E0E0E0;'> </div>
+                       </div>
+                       -->
+            <div id='rdetail_chilifresh_reviews' class='hide_me'>
+                <div id='chilifreshReviewLink' name='chilifreshReviewLink' class='chili_review'></div>
+                <div id='chilifreshReviewResult' name='chilifreshReviewResult' style='display:none'></div>
+            </div>
+               </div>
+               
+               <div id='rdetail_toc_div' class='rdetail_extras_div hide_me'> </div>
+
+               <div id='rdetail_excerpt_div' class='rdetail_extras_div hide_me'> </div>
+
+               <div id='rdetail_preview_div' class='rdetail_extras_div hide_me'> </div>
+
+               <div id='rdetail_anotes_div' class='rdetail_extras_div hide_me'> </div>
+
+               <div id='rdetail_marc_div' class='rdetail_extras_div hide_me'> 
+                       <div id='rdetail_view_marc_box'> </div>
+               </div>
+
+        <div id='rdetail_novelist_div' class='rdetail_extras_div hide_me'>
+            <div id="NoveListSelect" class="NoveListSelect">
+                <div id="NoveListAnchor" class="NoveListSelect"></div>
+                <div id="novsuggestions"></div>
+                <div id="nextreads"></div>
+                <div id="novrelatedauthors"></div>
+               <div id="novrelateditems"></div>
+            </div>
+        </div>
+
+               <div id='rdetail_foreign_items_div' class='rdetail_extras_div hide_me'>
+            <table width='100%' class='data_grid data_grid_center' id='rdetail_foreign_items_table'>
+                <thead>
+                    <tr> <td>&common.title;</td> <td>&common.authors;</td> <td>&nbsp;</td></tr>
+                </thead>
+                <tbody id='rdetail_foreign_items_tbody'>
+                </tbody>
+            </table>
+        </div>
+               <div id='rdetail_cn_browse_div' style='text-align: center;' class='hide_me'>
+
+                       <div id='cn_browse_none' class='hide_me color_4' style='width: 90%; text-align: center; margin: 10px;'>
+                               &rdetail.extras.call.null;
+                       </div>
+
+                       <div id='rdetail_cn_browse_select_div' 
+                               style='width: 100%; border: 1px solid black; padding: 6px; margin-top: 5px;'>
+                               <span>&rdetail.extras.call.local; </span>
+                               <select id='cn_browse_selector'>
+                               </select>
+                       </div>
+                       
+                       <!--#include virtual="../common/cn_browse.xml"-->
+               </div>
+
+               <!--#include virtual="rdetail_cn_details.xml"-->
+
+       </div>
+       <!-- Text for dynamic JavaScript -->
+       <div id='rdetail_preview_full_text' class='hide_me'>&rdetail.extras.preview.fulltext;</div>
+       <div id='rdetail_preview_title' class='hide_me'>&rdetail.extras.preview.title;</div>
+       <div id='rdetail_preview_badge' class='hide_me'>&rdetail.extras.preview.badge;</div>
+
+    <!-- ChiliFresh setup -->
+    <script language='javascript' type='text/javascript'>
+        var chilifresh = '<!--#echo var="OILS_CHILIFRESH_ACCOUNT"-->';
+        if (chilifresh == '(none)') { chilifresh = false; }
+    </script>
+    <!--if expr="${OILS_CHILIFRESH_ACCOUNT} && ${OILS_CHILIFRESH_ACCOUNT}!='(none)'"-->
+        <input type="hidden" id="chilifresh_account" name="chilifresh_account"
+            value="<!--#echo var='OILS_CHILIFRESH_ACCOUNT'-->" />
+        <input type="hidden" id="chilifresh_profile" name="chilifresh_profile"
+            value="<!--#echo var='OILS_CHILIFRESH_PROFILE'-->" />
+        <input type="hidden" id="chilifresh_version" name="chilifresh_version" value="onsite_v1" />
+        <input type="hidden" id="chilifresh_type" name="chilifresh_type" value="search" />
+        <script language="javascript" type="text/javascript" src="<!--#echo var='OILS_CHILIFRESH_URL'-->"></script>
+    <!--endif-->
+
+    <!-- Novelist setup -->
+    <!--if expr="${OILS_NOVELIST_URL} && ${OILS_NOVELIST_URL}!='(none)'"-->
+        <script type="text/javascript" id="EIT" src="<!--#echo var='OILS_NOVELIST_URL'-->"></script>
+    <!--endif-->
+    <script language='javascript' type='text/javascript'>
+        var novelist = '<!--#echo var="OILS_NOVELIST_URL"-->';
+        if (novelist == '(none)') { novelist = false; }
+    </script>
+
+</div>
diff --git a/Open-ILS/web/opac/skin/tadl/xml/rdetail/rdetail_summary.xml b/Open-ILS/web/opac/skin/tadl/xml/rdetail/rdetail_summary.xml
new file mode 100644 (file)
index 0000000..ccad9c2
--- /dev/null
@@ -0,0 +1,240 @@
+
+<abbr class="unapi-id" title='tag:<!--#echo var="HTTP_HOST"-->,<!--#echo var="OILS_TIME_YEAR"-->:biblio-record_entry/<!--#echo var="OILS_OPAC_RID"-->'></abbr>
+<!-- This holds the record summary information -->
+<div>
+       <!-- temporary hack to give IE somewhere to put these things; should just rip out from rdetail.js 
+               See https://bugs.launchpad.net/evergreen/+bug/532217 -->
+       <span class='hide_me' id='rdetail_title'></span>
+       <table id='rdetail_details_table'>
+               <tbody id='rdetail_details_tbody'>
+
+                       <tr>
+                               <td id='rdetail_image_cell' rowspan='30'>
+                                       <a id='rdetail_img_link'>
+                                               <img style='border: none;' id='rdetail_image' 
+                            onerror='
+                                hideMe($("rdetail.jacket_attrib_div"));
+                                hideMe($("rdetail_img_link"));'/>
+                                       </a>
+                    <!-- vendor attribution link -->
+                    <div class='jacket_attrib hide_me' id='rdetail.jacket_attrib_div'>
+                        <div>&opac.image_provided;</div>
+                        <div><a target='_blank' href='&vendor.base_link;' 
+                            class='classic_link' id='rdetail.jacket_attrib_link'>&vendor.name;</a></div>
+                    </div>
+                               </td>
+                               <td nowrap='nowrap' class='rdetail_desc'>&common.title;</td>            
+                <!-- *** Example of how to use the openils.BibTemplate infrastructure to augment the stock
+                     *** summary screen with more and/or different information.  In this case, the raw MARC 245. -->
+                <td type='opac/slot-data' query='datafield[tag="245"]' class='rdetail_item'>
+                    <script type='opac/slot-format'><![CDATA[
+                        var out = '';
+                        var list = dojo.query( 'subfield', item );
+                        for (var i = 0; i < list.length; i++) {
+                            out += BT.textContent(list[i]) + ' ';
+                        }
+                        document.title += ': ' + out;
+                        return out;
+                    ]]></script>
+                </td>
+                       </tr>
+
+                       <tr>
+                               <td nowrap='nowrap' class='rdetail_desc'>&common.author;</td>           
+                               <td class='rdetail_item'>
+                                       <a title='&rdetail.author.search;' id='rdetail_author'> </a>
+                               </td>
+                       </tr>
+
+                       <tr>
+                               <td nowrap='nowrap' class='rdetail_desc'>&common.isbn;</td>                     
+                               <td class='rdetail_item' id='rdetail_isbn'> </td>
+                       </tr>
+
+                       <tr>
+                               <td nowrap='nowrap' class='rdetail_desc'>&common.edition;</td>          
+                               <td class='rdetail_item' id='rdetail_edition'> </td>
+                       </tr>
+
+                       <tr>
+                               <td nowrap='nowrap' class='rdetail_desc'>&common.pubdate;</td>          
+                               <td class='rdetail_item' id='rdetail_pubdate'> </td>
+                       </tr>
+
+                       <tr>
+                               <td nowrap='nowrap' class='rdetail_desc'>&common.publisher;</td>                
+                               <td class='rdetail_item' id='rdetail_publisher'> </td>
+                       </tr>
+
+                        <tr id='series_row' class='hide_me less'>
+                                <td nowrap='nowrap' class='rdetail_desc'>Series</td>
+                                <td class='rdetail_item' id='rdetail_series'> </td>
+                        </tr>
+
+
+                       <tr>
+                               <td nowrap='nowrap' class='rdetail_desc'>&common.physical;</td>         
+                               <td class='rdetail_item' id='rdetail_physical_desc'> </td>
+                       </tr>
+
+                       <tr>
+                               <td nowrap='nowrap' class='rdetail_desc'>&common.format;</td>                   
+                               <td class='rdetail_item'>
+                                       <img id='rdetail_tor_pic' class='tor_pic' />
+                                       <span id='rdetail_tor' style='padding-left: 5px;'> </span>
+                               </td>
+                       </tr>
+
+                       <tr>
+                               <td nowrap='nowrap' class='rdetail_desc'>&rdetail.detailMain.abstract;</td>     
+                               <td class='rdetail_item' id='rdetail_abstract'> </td>
+                       </tr>
+
+            <!-- *** Example of how to use the openils.BibTemplate infrastructure to augment the stock
+                 *** summary screen with complex information, such as new search links on subjects. -->
+            <tr>
+                <td nowrap='nowrap' class='rdetail_desc'>&rdetail.summary.subjects;</td>
+                <td type='opac/slot-data' query='datafield[tag^="6"]' class='rdetail_item'>
+                    <script type='opac/slot-format'><![CDATA[
+                        var cgi = new CGI();
+                        var other_params = [ 'd', 'l', 'r', 'av', 's', 'sd', 'ol' ];
+                        var total = '';
+                        var output = [];
+                        var list = dojo.query( 'subfield', item );
+                        for (var i = 0; i < list.length; i++) {
+                            var sub_code = list[i].getAttribute('code');
+                            if ( sub_code.match(/[a-z]/i) ) {
+                                var current = '';
+                                if ( sub_code.match(/[vxyz]/) ) {
+                                    current += '&#x2d;&#x2d; ';
+                                }
+                                total += BT.textContent(list[i]) + ' ';
+                                current += '<a href="rresult.xml?rt=subject&tp=subject&t=' + total.replace(/\s+$/, '');
+                                for (var p in other_params) {
+                                    if (cgi.param(other_params[p]))
+                                        current += '&' + other_params[p] + '=' + cgi.param(other_params[p]);
+                                }
+                                current += '">' + BT.textContent(list[i]) + '</a>'
+                                output.push(current);
+                            }
+                        }
+                        return '<span>' + output.join(' ') + '</span><br/>';
+                    ]]></script>
+                </td>
+            </tr>
+                        <tr id='rdetail_hold_count_row' class=''>
+                                <td nowrap='nowrap' class='rdetail_desc'>Current Holds</td>
+                                <td class='rdetail_item' id='rdetail_hold_count'> </td>
+                        </tr>
+
+                       <tr class='hide_me' id='rdetail_online_row'>
+                               <!-- *** Example of how to use the openils.BibTemplate infrastructure to augment the stock
+                                    *** summary screen with complex information, such as location-specific URIs (856$9). -->
+                               <td nowrap='nowrap' class='rdetail_desc'>&rdetail.summary.online;</td>
+                               <td class='rdetail_item' id='rdetail_online' type='opac/slot-data' query='volumes volume uris uri' join=", ">
+                                       <script type='opac/slot-format'><![CDATA[
+                                               var link = '<a href="' + item.getAttribute('href') + '">' + item.getAttribute('label') + '</a>';
+                                               if (item.getAttribute('use_restriction'))
+                                                       link += ' (Use restriction: ' + item.getAttribute('use_restriction') + ')';
+                                               return link;
+                                       ]]></script>
+                               </td>
+                       </tr>
+                       <tr name="serial_holdings_label"
+                               class="result_table_title_cell hide_me">
+                <td class="rdetail_desc">&rdetail.summary.issues_held;</td>
+                <td templated="true" type="opac/slot-data"
+                    query="datafield[tag='901'] subfield[code='c']"
+                    class="rdetail_item">
+                    ${holdingsStatement}
+                                       <span class="hide_me" name="holdingsStatement" type="opac/template-value"><![CDATA[
+                        if (fetchOrgSettingDefault(
+                            getLocation(),
+                            "opac.fully_compressed_serial_holdings"
+                        )) {
+                            var bibid = BT.textContent(item_list[0]);
+                            var blob = fieldmapper.standardRequest(
+                                ["open-ils.serial",
+                                    "open-ils.serial.bib.summary_statements"],
+                                [bibid, {
+                                    "orgid": getLocation(), "depth": getDepth()
+                                }]
+                            );
+
+                            var fake = dojo.create("td");
+                            var something = false;
+
+                            for (var i in blob) {
+                                if (!blob[i].length) continue;
+                                if (something) dojo.create("br", null, fake);
+                                something = true;
+
+                                var a = dojo.create(
+                                    "a", {
+                                        "innerHTML": "[+]",
+                                        "href": "javascript:void(0);",
+                                        "onclick":
+                                            "rdetailDrawExpandedHoldings(this,"+
+                                            bibid + ",'" + i + "');",
+                                        "style": {"marginRight": "1.5em"}
+                                    }, fake
+                                );
+                                dojo.create(
+                                    "span", {
+                                        "innerHTML": blob[i].join(", ")
+                                    }, fake
+                                );
+                                dojo.create(
+                                    "span", {"id": "holding_type_" + i}, fake
+                                );
+                            }
+
+                            if (something)
+                                unHideMe(slot.parentNode);
+
+                            return fake.innerHTML;
+                        } else {
+                            return "";
+                        }
+                                       ]]></span>
+                               </td>
+                       </tr>
+
+               </tbody>
+       </table>
+
+       <!-- Empty span used for creating unAPI links -->
+       <abbr name="unapi" class="unapi-id">
+               <!-- unAPI URI goes here -->
+       </abbr>
+
+       <script language='javascript' type='text/javascript'><![CDATA[
+
+               config.ids.rdetail.details_body         = 'rdetail_details_body'; 
+               config.ids.rdetail.title                                = 'rdetail_title';
+               config.ids.rdetail.author                               = 'rdetail_author';
+               config.ids.rdetail.isbn                                 = 'rdetail_isbn';
+               config.ids.rdetail.edition                              = 'rdetail_edition';
+               config.ids.rdetail.pubdate                              = 'rdetail_pubdate';
+               config.ids.rdetail.publisher                    = 'rdetail_publisher';
+               config.ids.rdetail.tor                                  = 'rdetail_tor';
+               config.ids.rdetail.abstr                                = 'rdetail_abstract';
+               config.ids.rdetail.image                                = 'rdetail_image';
+               config.ids.rdetail.tor_pic                              = 'rdetail_tor_pic';
+
+        dojo.addOnLoad(function() {
+            setTimeout( function () {
+                var here = findOrgUnit(getLocation());
+                if (getDepth() > 0 || getDepth === 0 ) {
+                    while (getDepth() < findOrgDepth(here))
+                        here = findOrgUnit( here.parent_ou() );
+                }
+    
+                dojo.require('openils.BibTemplate');
+                new openils.BibTemplate({ record : new CGI().param('r'), org_unit : here.shortname() }).render();
+            }, 0);
+        });
+       ]]></script>
+
+</div> <!-- details_body -->
+
diff --git a/Open-ILS/web/opac/skin/tadl/xml/result/filtersort.xml b/Open-ILS/web/opac/skin/tadl/xml/result/filtersort.xml
new file mode 100644 (file)
index 0000000..c8b3327
--- /dev/null
@@ -0,0 +1,20 @@
+<span>
+    &result.limit2avail;<input type='checkbox' id='opac.result.limit2avail' onclick='searchBarSubmit(true);'/>
+    <select id='opac.result.sort' onchange='searchBarSubmit(true);'>
+        <option selected='selected' value=''>&result.sort_by;</option>
+        <optgroup label='&result.sort_by.title;'>
+            <option id='opac.result.title.a2z' label='&common.a2z.titla;' value='titlesort.asc'>&common.a2z.title;</option>
+            <option id='opac.result.title.z2a' label='&common.z2a.titla;' value='titlesort.desc'>&common.z2a.title;</option>
+        </optgroup>
+        <optgroup label='&result.sort_by.author;'>
+            <option id='opac.result.author.a2z' label='&common.a2z.author;' value='authorsort.asc'>&common.a2z.author;</option>
+            <option id='opac.result.author.z2a' label='&common.z2a.author;' value='authorsort.desc'>&common.z2a.author;</option>
+        </optgroup>
+        <optgroup label='&result.sort_by.pubdate;'>
+            <option id='opac.result.pubdate.new2old' label='&common.new2old.pubdate;' 
+                value='pubdate.desc'>&common.new2old.pubdate;</option>
+            <option id='opac.result.pubdate.old2new' label='&common.old2new.pubdate;' 
+                value='pubdate.asc'>&common.old2new.pubdate;</option>
+        </optgroup>
+    </select>
+</span>
diff --git a/Open-ILS/web/opac/skin/tadl/xml/result/result_common.xml b/Open-ILS/web/opac/skin/tadl/xml/result/result_common.xml
new file mode 100644 (file)
index 0000000..86848ab
--- /dev/null
@@ -0,0 +1,36 @@
+
+<div id='canvas_main' class='canvas' xmlns:xi="http://www.w3.org/2001/XInclude" >
+
+       <script language='javascript' type='text/javascript'>
+               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";
+       </script>
+
+       <!--#include virtual="result_table.xml"-->
+       <!--#include virtual="result_lowhits.xml"-->
+
+</div>
+
+
diff --git a/Open-ILS/web/opac/skin/tadl/xml/result/result_info.xml b/Open-ILS/web/opac/skin/tadl/xml/result/result_info.xml
new file mode 100644 (file)
index 0000000..902035b
--- /dev/null
@@ -0,0 +1,74 @@
+<table style='width: 100%;'>
+       <tbody>
+
+               <tr class='color_4' style='height: 1em;'>
+
+                       <td style='vertical-align: top;'  id='next_prev_links'>
+
+                               <span class='hide_me' id='result_info_div' style='font-size: 9pt;'>
+                                       <span> &common.results; </span> 
+                                       <span id='offset_start'> </span>
+                                       <span> - </span>
+                                       <span id='offset_end'> </span>
+                                       <span> &common.ofAtLeast; </span>
+                                       <span id='result_count'> </span>
+                                       <span style='padding-left: 6px;'> (page </span>
+                                       <span id='current_page'> </span>
+                                       <span> &common.of; </span>
+                                       <span id='num_pages'> </span>
+                               </span>
+
+                               <span id='start_end_links_span' class='hide_me' 
+                                               style='padding-left: 40px;' >
+                                       <a class='search_page_nav_link' id='search_home_link' 
+                                               title="&rdetail.page.results;">&rdetail.start;</a><a class='search_page_nav_link' 
+                                                       id='prev_link' title='&rdetail.page.previous;'>&rdetail.page.previous.short;</a>
+
+                                       <span class='search_page_nav_link' id='page_numbers'> </span>
+
+                                       <a  class='search_page_nav_link' id='next_link' 
+                                               title='&rdetail.page.next;'>&rdetail.page.next.short;</a>
+                        <!--
+                        <a class='search_page_nav_link' 
+                                                       id='end_link' title="&rdetail.page.last;">&rdetail.end;</a>
+                            -->
+                               </span>
+
+                       </td>
+
+                       <td  colspan='5' 
+                               style='padding-bottom: 4px; text-align:center; vertical-align: top; border-bottom: 1px solid #E0E0E0;'>
+                                       <span id='search_info_table' class='hide_me' style='font-size: 8pt;'>
+                                               <b>&result.info.copies; </b>
+                                       </span>
+                       </td>
+               </tr>
+
+               <tr style='height: 2em;' id='result_thead_row'>
+                       <td> 
+                               <div class='hide_me' id='no_formats' style='padding: 4px;'>
+                                       <b>
+                                               <span style='color:red;'>*</span>
+                                               &result.info.no.items;
+                                               <div>&result.info.format.items;</div>
+                                       </b>
+                               </div>
+
+                               <div class='hide_me' id='rresult_show_all' style='padding: 4px;'>
+                                       <a href='javascript:rresultExpandSearch();' id='rresult_show_all_link' 
+                                               class='classic_link'>&result.info.show; </a>
+                               </div>
+
+                               <div class='hide_me' id='rresult_show_here' style='padding: 4px;'>
+                                       <a href='javascript:rresultContractSearch();' id='rresult_show_here_link' 
+                                               class='classic_link'>&result.info.show; </a>
+                               </div>
+
+                       </td>
+                       <td rowspan='2' style='font-size: 8pt; padding-top: 4px;' class='copy_count_cell' 
+                               width='12%' align='center' name='result_thead_ccell'> </td>
+               </tr>
+
+       </tbody>
+</table>
+
diff --git a/Open-ILS/web/opac/skin/tadl/xml/result/result_lowhits.xml b/Open-ILS/web/opac/skin/tadl/xml/result/result_lowhits.xml
new file mode 100644 (file)
index 0000000..0933ed1
--- /dev/null
@@ -0,0 +1,49 @@
+
+<div id='result_low_hits' class='hide_me'>
+
+       <br/><br/><br/>
+
+       <div style='text-align: center; padding-bottom: 8px;'>
+               <div id='result_low_hits_msg' class='hide_me'>&result.lowhits.few;</div>
+               <div id='result_zero_hits_msg' class='hide_me'>&result.lowhits.zero;</div>
+       </div>
+
+       <!-- spell checker -->
+       <div id='did_you_mean' class='lowhits_div hide_me'>
+               <span>&result.lowhits.did.you.mean; </span>
+               <a class='classic_link' id='spell_check_link'> </a>
+       </div>
+
+       <div id='low_hits_remove_format' class='lowhits_div hide_me'>
+               <span>&result.lowhits.formats; </span>
+               <a id='low_hits_remove_format_link' class='classic_link'>&result.lowhits.formats.search;</a>
+       </div>
+
+       <div id='low_hits_cross_ref' class='lowhits_div hide_me'>
+               <span>&result.lowhits.related;</span>
+               <div style='padding: 5px;'>
+                       <a id='low_hits_xref_link' class='classic_link' style='padding-right: 5px;'> </a>
+               </div>
+       </div>
+
+       <div id='low_hits_expand_range' class='lowhits_div hide_me'>
+               <span>&result.lowhits.expand; </span>
+               <a id='low_hits_expand_link' class='classic_link' style='padding-right: 5px;'> </a>
+       </div>
+
+       <div id='low_hits_search_type' class='lowhits_div hide_me'>
+               <span>&result.lowhits.class;</span>
+               <a id='low_hits_title_search' class='hide_me classic_link' 
+                       style='padding-right: 5px;'>&result.lowhits.title;</a>
+               <a id='low_hits_author_search' class='hide_me classic_link' 
+                       style='padding-right: 5px;'>&result.lowhits.author;</a>
+               <a id='low_hits_subject_search' class='hide_me classic_link' 
+                       style='padding-right: 5px;'>&result.lowhits.subject;</a>
+               <a id='low_hits_series_search' class='hide_me classic_link' 
+                               style='padding-right: 5px;'>&result.lowhits.series;</a>
+               <a id='low_hits_keyword_search' class='hide_me classic_link' 
+                       style='padding-right: 5px;'>&result.lowhits.keyword;</a>
+       </div>
+
+</div>
+
diff --git a/Open-ILS/web/opac/skin/tadl/xml/result/result_table.xml b/Open-ILS/web/opac/skin/tadl/xml/result/result_table.xml
new file mode 100644 (file)
index 0000000..7ee942a
--- /dev/null
@@ -0,0 +1,321 @@
+<!-- Search results are spit into this table -->
+
+<div id='result_table_div' xmlns:xi="http://www.w3.org/2001/XInclude">
+
+    <table id='res_table'> 
+
+        <!-- for some reason, this is the only way i can force the cell widths -->
+        <thead id='result_thead'>
+            <tr>
+                <td class='result_table_pic_header'></td>
+                <td> </td>
+            </tr>
+        </thead>
+
+        <tbody id='result_table'>
+            <tr>
+
+                <td class='result_table_row'>
+                    <!--#include virtual="result_info.xml"-->
+                </td>
+            </tr>
+
+            <!-- Template for displaying a search result.  This row template is cloned and inserted
+                    for each result returned -->
+
+            <tr id='result_table_template' class='hide_me'>
+
+                <!-- Jacket image goes here -->
+
+                <td class='result_table_row' align='left'>
+                    <table class='result_table_subtable'>
+                        <tbody class='result_table_subtbody'>
+
+                            <tr style='height: 1em' name='counts_row' valign="top">
+
+                                <td  rowspan='4' class='result_table_pic_header'>
+                                    <a><img name='item_jacket' class='result_table_pic'/></a>
+                                </td>
+
+                                <td class='result_table_title_cell' name='result_table_title_cell'>
+                                    <!-- Title goes here -->
+                                    <a title="&result.table.keyword;" name='item_title' class='search_link'> 
+                                        <!-- Title goes here -->
+                                    </a>
+                                </td>
+
+                                <!-- Copy this td for each copy count appended -->
+                                <td  rowspan='4' nowrap='nowrap' name="copy_count_cell" class='copy_count_cell'> 
+                                </td>
+
+                            </tr>
+        
+                            <tr style='height: 1em' >
+                                <td class='result_table_author_cell'>
+                                    <a title="&result.table.author;" name='item_author' class='search_link'> 
+                                        <!-- Author goes here -->
+                                    </a>
+                                    <div>
+                                    <span name='result_table_extra_span' class='hide_me'>
+                                        <span name='result_table_pub_box' style='padding-left: 10px;'> 
+                                            <span name='result_table_edition_span' style='padding-left: 10px;'></span> |
+                                            <span name='result_table_pub_span'> </span> |
+                                            <span name='result_table_phys_span'> </span>
+                                        </span>
+                                    </span>
+                                    </div>
+                                </td>
+                            </tr>
+
+                            <tr style='height:1em;' >
+                                <td name='result_table_format_cell' class='result_table_format_cell'>
+
+                                    <a name='text_link' class='search_link'> 
+                                        <img src='../../../../images/tor/text.jpg' class='dim tor_pic' />
+                                    </a>
+
+                                    <a name='sound recording-nonmusical_link' class='search_link'> 
+                                        <img src='../../../../images/tor/sound recording-nonmusical.jpg' class='dim tor_pic' />
+                                    </a>
+
+                                    <a name='moving image_link' class='search_link'> 
+                                        <img src='../../../../images/tor/moving image.jpg' class='dim tor_pic' />
+                                    </a>
+
+                                    <a name='software, multimedia_link' class='search_link'> 
+                                        <img src='../../../../images/tor/software, multimedia.jpg' class='dim tor_pic' />
+                                    </a>
+
+                                    <a name='sound recording-musical_link' class='search_link'> 
+                                        <img src='../../../../images/tor/sound recording-musical.jpg' class='dim tor_pic' />
+                                    </a>
+
+                                    <a name='cartographic_link' class='search_link'> 
+                                        <img src='../../../../images/tor/cartographic.jpg' class='dim tor_pic' />
+                                    </a>
+
+                                    <a name='mixed material_link' class='search_link'> 
+                                        <img src='../../../../images/tor/mixed material.jpg' class='dim tor_pic' />
+                                    </a>
+
+                                    <a name='notated music_link' class='search_link'> 
+                                        <img src='../../../../images/tor/notated music.jpg' class='dim tor_pic' />
+                                    </a>
+
+                                    <a name='sound recording_link' class='search_link'> 
+                                        <img src='../../../../images/tor/sound recording.jpg' class='dim tor_pic' />
+                                    </a>
+
+                                    <a name='still image_link' class='search_link'> 
+                                        <img src='../../../../images/tor/still images.jpg' class='dim tor_pic' />
+                                    </a>
+
+                                    <a name='three dimensional object_link' class='search_link'> 
+                                        <img src='../../../../images/tor/three dimensional object.jpg' class='dim tor_pic' />
+                                    </a>
+
+                                    <span class='hide_me' 
+                                        style='color: #9999FF; padding-left: 10px; font-size: 7pt; font-weight: 300;'> 
+                                        <span>&common.relevancy; </span><span name='relevancy_span'> </span>
+                                    </span>
+
+                                    <span class='hide_me' name='place_hold_span'>
+                                        <a style='padding-left: 8px;' href='javascript:void(0);' 
+                                            class='classic_link' name='place_hold_link'>&opac.holds.placeHold;</a>
+                                    </span>
+
+                                    <!-- Empty span used for creating unAPI links -->
+                                    <abbr style='padding-left: 8px;' name="unapi" class="unapi-id">
+                                        <!-- unAPI URI goes here -->
+                                    </abbr>
+
+                                    <!-- Empty span used for creating Google Book Search-->
+                                    <span name="googleBooksLink" class="hide_me">
+                                        <a style='padding-left: 8px;' class='classic_link' name="googleBooks-link">&result.googleBooks.browse;</a>
+                                    </span>
+
+                                </td>
+                            </tr>
+                            <tr name="local_callnumber_list" class="result_table_title_cell">
+                                <td>
+                                <span type='opac/slot-data+holdings_xml-full' query='volumes'>
+                                <span class='hide_me' debug='true' type='opac/slot-format'><![CDATA[
+                                    var output = dojo.create('span'); 
+
+                                    var item_cnt = 0;
+                                    var max_items = 4;
+
+                                    dojo.query('volume', item).forEach(function(vol) {
+                                        if (item_cnt >= max_items) {
+                                            return output.innerHTML;
+                                        }
+                                        if (vol.getAttribute('deleted') == 't') {
+                                            return;
+                                        }
+                                        if (vol.getAttribute('opac_visible') == 'f') {
+                                            return;
+                                        }
+                                        dojo.query('copy', vol).forEach(function (cp) {
+                                            if (item_cnt >= max_items) {
+                                                return;
+                                            }
+                                            if (cp.getAttribute('deleted') == 't') {
+                                                return;
+                                            }
+                                            if (cp.getAttribute('opac_visible') == 'f') {
+                                                return;
+                                            }
+
+                                            /* Ensure the status is visible */
+                                            var visible_status;
+                                            dojo.query('status', cp).forEach(function (status) {
+                                                visible_status = status.getAttribute('opac_visible');
+                                            });
+                                            if (visible_status == 'f') {
+                                                return;
+                                            }
+
+                                            /* Ensure the circulation library is visible */
+                                            var lib_vis;
+                                            dojo.query('circlib', cp).forEach(function (status) {
+                                                lib_vis = status.getAttribute('opac_visible');
+                                            });
+                                            if (lib_vis != 't') {
+                                                return;
+                                            }
+
+                                            var cp_entry = dojo.create('div');
+                                            var loc_visible;
+                                            var vol_appended = false;
+                                            dojo.query('location', cp).forEach(function (location) {
+                                                loc_visible = location.getAttribute('opac_visible');
+                                                if (loc_visible == 't') {
+                                                    if (!vol_appended) {
+                                                        var cn = dojo.create('span', { style: "font-weight: bold;" }, cp_entry);
+                                                        var cn_txt = dojo.doc.createTextNode(vol.getAttribute('label'));
+                                                        cn.appendChild(cn_txt);
+                                                        vol_appended = true;
+                                                    }
+                                                    var loc = dojo.create('span', { "style": "font-weight: bold;"}, cp_entry);
+                                                    var loc_txt = dojo.doc.createTextNode(' - ' + BT.textContent(location));
+                                                    loc.appendChild(loc_txt);
+                                                }
+                                            });
+                                            if (loc_visible != 't') {
+                                                return;
+                                            }
+                                            dojo.query('circ_lib', cp).forEach(function (circ_lib) {
+                                                var cp_lib = dojo.create('span', { "style": "font-weight: bold;" }, cp_entry, "first");
+                                                var cp_lib_txt = dojo.doc.createTextNode(circ_lib.getAttribute('name') + ' - ');
+                                                cp_lib.appendChild(cp_lib_txt);
+                                            });
+                                            dojo.query('status', cp).forEach(function (status) {
+                                                var cp_status = dojo.create('span', { "style": "font-weight: bold;" }, cp_entry);
+                                                var cp_status_txt = dojo.doc.createTextNode(' (' + BT.textContent(status) + ')');
+                                                cp_status.appendChild(cp_status_txt);
+                                            });
+
+                                            item_cnt++;
+                                            if (item_cnt >= max_items) {
+                                                dojo.create('br', null, cp_entry);
+                                                cp_entry.appendChild(dojo.doc.createTextNode(opac_strings.MORE_COPIES_FULL_RECORD));
+                                            }
+                                            output.appendChild(cp_entry);
+                                        });
+                                    });
+
+                                return output.innerHTML;
+                                ]]></span>
+                                </span>
+                                </td>
+                            </tr>
+                            <!-- Placeholder for ChiliFresh Review -->
+                            <tr class="hide_me" name="chilifreshReview">
+                                <td valign="top" colspan="2">
+                                        <span name="chilifreshReviewLink" class="chili_review"></span>
+                                        <div name="chilifreshReviewResult" style="display:none"></div>
+                                </td>
+                            </tr>
+                        </tbody>
+                    </table>
+                </td>
+            </tr>
+        </tbody>
+    </table>
+
+
+   <!-- ====================== -->
+   <table style='width: 100%; margin-top: 12px;' id='result_info_2' class='hide_me'>
+      <tbody>
+               
+          <tr class='color_4' style='height: 1em;'>
+                     
+             <td style='vertical-align: top;'  id='next_prev_links2'>
+                        
+                <span class='hide_me' id='result_info_div2' style='font-size: 9pt;'>
+                   <span> &common.results; </span> 
+                   <b id='offset_start2'> </b>
+                   <span> - </span>
+                   <b id='offset_end2'> </b>
+                   <span> &common.ofAtLeast; </span>
+                   <b id='result_count2'> </b>
+                   <span style='padding-left: 6px;'> (page </span>
+                   <span id='current_page2'> </span>
+                   <span> &common.of; </span>
+                   <span id='num_pages2'> </span>
+                </span>
+                           
+                <span id='start_end_links_span2' class='hide_me' 
+                   style='padding-left: 40px;' >
+                <a class='search_page_nav_link' id='search_home_link2' 
+                   title="&rdetail.page.results;">&rdetail.start;</a><a class='search_page_nav_link' 
+                   id='prev_link2' title='&rdetail.page.previous;'>&rdetail.page.previous.short;</a>
+            
+                <span class='search_page_nav_link' id='page_numbers2'> </span>
+                   <a  class='search_page_nav_link' id='next_link2' 
+                      title='&rdetail.page.next;'>&rdetail.page.next.short;</a>
+                      <!--
+                      <a class='search_page_nav_link' 
+                      id='end_link2' title="&rdetail.page.last;">&rdetail.end;</a>
+                      -->
+                </span>
+                        
+             </td>
+                        
+             <td  colspan='5' 
+                style='padding-bottom: 4px; text-align:center; vertical-align: top; border-bottom: 1px solid #E0E0E0;'>
+               <!--
+                <span id='search_info_table2' style='font-size: 8pt;'>
+                <b>Available copies / Total copies </b>
+                </span>
+               -->
+             </td>
+          </tr>
+      </tbody>
+   </table>
+   <!-- ====================== -->
+
+
+    <script language='javascript' type='text/javascript'>
+        config.names.result.format_cell = 'result_table_format_cell';
+        config.names.result.format_link = 'resource_link'
+        config.names.result.format_pic = 'format_pic'
+    </script>
+
+    <!-- ChiliFresh setup -->
+    <script language='javascript' type='text/javascript'>
+        var chilifresh = '<!--#echo var="OILS_CHILIFRESH_ACCOUNT"-->';
+        if (chilifresh=='(none)') { chilifresh = false; }
+    </script>
+    <!--if expr="${OILS_CHILIFRESH_ACCOUNT} && ${OILS_CHILIFRESH_ACCOUNT}!='(none)'"-->
+        <input type="hidden" id="chilifresh_account" name="chilifresh_account"
+            value="<!--#echo var='OILS_CHILIFRESH_ACCOUNT'-->" />
+        <input type="hidden" id="chilifresh_profile" name="chilifresh_profile"
+            value="<!--#echo var='OILS_CHILIFRESH_PROFILE'-->" />
+        <input type="hidden" id="chilifresh_version" name="chilifresh_version" value="onsite_v1" />
+        <input type="hidden" id="chilifresh_type" name="chilifresh_type" value="search" />
+        <script language="javascript" type="text/javascript" src="<!--#echo var='OILS_CHILIFRESH_URL'-->"></script>
+    <!--endif-->
+</div>
+
+
diff --git a/Open-ILS/web/opac/skin/tadl/xml/rresult.xml b/Open-ILS/web/opac/skin/tadl/xml/rresult.xml
new file mode 100644 (file)
index 0000000..f3e84e5
--- /dev/null
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!-- Loads the environment -->
+<!--#include virtual="setenv.xml"-->
+
+<!DOCTYPE html PUBLIC 
+       "-//W3C//DTD XHTML 1.0 Transitional//EN" 
+       "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" [
+       <!--#include virtual="/opac/locale/${locale}/opac.dtd"-->
+]>
+
+
+<html xmlns='http://www.w3.org/1999/xhtml'>
+       <!--#include virtual="header.xml"-->
+       <!--#if expr="$OILS_PAGE='index.xml'"-->
+               <!--#include virtual="home/index_body.xml"-->
+       <!--#else-->
+               <!--#include virtual="body.xml"-->
+       <!--#endif-->
+</html>
+
diff --git a/Open-ILS/web/opac/skin/tadl/xml/setenv.xml b/Open-ILS/web/opac/skin/tadl/xml/setenv.xml
new file mode 100644 (file)
index 0000000..e64b270
--- /dev/null
@@ -0,0 +1,74 @@
+<!-- Sets our environment variables for convenience and determining which page we're on -->
+
+<!--#set var='OILS_PAGE' value="$DOCUMENT_NAME"-->
+
+<!--#if expr="$DOCUMENT_NAME='index.xml'"-->
+       <!--#set var='OILS_TITLE' value='opac.title.home'-->
+       <!--#set var='FRONT_PAGE' value='true'-->
+
+<!--#elif expr="$DOCUMENT_NAME='mresult.xml'"-->
+       <!--#set var='OILS_TITLE' value='opac.title.mresult'-->
+       
+
+<!--#elif expr="$DOCUMENT_NAME='rresult.xml'"-->
+       <!--#set var='OILS_TITLE' value='opac.title.rresult'-->
+
+<!--#elif expr="$DOCUMENT_NAME='rdetail.xml'"-->
+       <!--#set var='OILS_TITLE' value='opac.title.rdetail'-->
+
+<!--#elif expr="$DOCUMENT_NAME='myopac.xml'"-->
+       <!--#set var='OILS_TITLE' value='opac.title.myopac'-->
+
+<!--#elif expr="$DOCUMENT_NAME='advanced.xml'"-->
+       <!--#set var='OILS_TITLE' value='opac.title.advanced'-->
+
+<!--#elif expr="$DOCUMENT_NAME='reqitems.xml'"-->
+       <!--#set var='OILS_TITLE' value='opac.title.reqitems'-->
+
+<!--#elif expr="$DOCUMENT_NAME='cnbrowse.xml'"-->
+       <!--#set var='OILS_TITLE' value='opac.title.cnbrowse'-->
+
+<!--#endif-->
+
+<!--#if expr="$HTTPS"-->
+       <!--#set var="OILS_PROTOCOL" value="https"-->
+       <!--#if expr="$OILS_OPAC_BYPASS_STATIC_FOR_HTTPS=='yes'"-->
+               <!--#set var="OILS_OPAC_CSS_HOST" value=""-->
+               <!--#set var="OILS_OPAC_JS_HOST" value=""-->
+       <!--#endif-->
+<!--#else-->
+       <!--#set var="OILS_PROTOCOL" value="http"-->
+<!--#endif-->
+
+<!--#if expr="$OILS_OPAC_STATIC_PROTOCOL"-->
+
+<!--#else-->
+       <!--#set var="OILS_OPAC_STATIC_PROTOCOL" value="$OILS_PROTOCOL"-->
+<!--#endif-->
+
+<!--#set var="OILS_BASE" value="${OILS_PROTOCOL}://${SERVER_NAME}/${OILS_OPAC_BASE}"-->
+<!--#set var="OILS_XML_BASE" value="${OILS_BASE}/common/xml"--> 
+
+
+<!-- Javascript host -->
+<!--#if expr="$OILS_OPAC_JS_HOST"-->
+    <!--#set var="OILS_OPAC_JS_HOST" value="${OILS_OPAC_STATIC_PROTOCOL}://${OILS_OPAC_JS_HOST}"-->
+<!--#else -->
+    <!--#set var="OILS_OPAC_JS_HOST" value="$OILS_BASE"-->
+<!--#endif -->
+<!--#set var="OILS_JS_BASE" value="${OILS_OPAC_JS_HOST}/common/js"-->
+
+
+<!--#if expr="$OILS_OPAC_CSS_HOST"-->
+    <!--#set var="OILS_OPAC_CSS_HOST" value="${OILS_OPAC_STATIC_PROTOCOL}://${OILS_OPAC_CSS_HOST}"-->
+<!--#else -->
+    <!--#set var="OILS_OPAC_CSS_HOST" value="$OILS_BASE"-->
+<!--#endif -->
+<!--#set var="OILS_THEME_BASE" value="${OILS_OPAC_CSS_HOST}/theme"--> 
+<!--#set var="OILS_SKIN_BASE" value="${OILS_OPAC_CSS_HOST}/skin"--> 
+<!--#set var="OILS_CSS_BASE" value="${OILS_OPAC_CSS_HOST}/common/css"--> 
+
+
+<!--#if expr="!$locale || $locale=''"-->
+       <!--#set var="locale" value="en-US"-->
+<!--#endif-->
diff --git a/Open-ILS/web/opac/theme/tadl/css/colors.css b/Open-ILS/web/opac/theme/tadl/css/colors.css
new file mode 100644 (file)
index 0000000..2728b4a
--- /dev/null
@@ -0,0 +1,117 @@
+body a                 { color: black; text-decoration: none;}
+body a:visited { color: black; text-decoration: none;}
+body a:hover   { color: #7d0049; text-decoration: underline;}
+
+
+/* the idea is to have 4 complimentary colors that 
+ * are used throughout the opac.  Edit those colors
+ * in this file
+ */
+.color_1 { background: #acc4de; color: #000000; }
+.color_2 { background: #acc4de; color: #000000; }
+.color_3 { background: #d1e1a2; color: #000000; }
+.color_4 { background: #d1e1a2; color: #000000; }
+
+.border_1 { border: 1px solid #6699cc; }
+.border_2 { border: 1px solid #6699cc; }
+.border_3 { border: 1px solid #ddeeff; }
+.border_4 { border: 1px solid #ddeeff; }
+
+.border_1_2 { border: 2px solid #6699cc; }
+.border_2_2 { border: 2px solid #6699cc; }
+.border_3_2 { border: 2px solid #ddeeff; }
+.border_4_2 { border: 2px solid #ddeeff; }
+
+.border_1_3 { border: 3px solid #6699cc; }
+.border_2_3 { border: 3px solid #6699cc; }
+.border_3_3 { border: 3px solid #ddeeff; }
+.border_4_3 { border: 3px solid #ddeeff; }
+
+
+/* some facet styling */
+.facetClassContainer { margin: 2px; border: 1px solid #6699cc; }
+.facetClassLabelContainer { background: #acc4de; border: 1px solid #acc4de; }
+.facetClassLabel { font-weight: bold; text-align: center; }
+.facetFieldContainer { background: #d1e1a2; }
+.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 #acc4de; color: gray; width: 3em; margin-right: 3px }
+.facetField { border-top: 1px solid #acc4de; }
+.facetFields { padding-left: 5px; }
+.facetFieldLineValue { overflow: hidden; text-overflow: ellipsis; }
+
+
+
+
+/* general purpose light borders */
+.border_5 { border: 1px solid #D0D0D0; }
+.border_6 { border: 1px solid #808080; }
+
+input:focus { background: #e5f1fd; color: #000000;}
+a:focus { background: #e5f1fd; color: #000000;}
+
+
+/* ---------------------------------------------------------------------- */
+
+.canvas { /* main content div for each page */
+    border-left: 3px solid #7fa2ca;
+    border-bottom: 3px solid #7fa2ca;
+       border-top: 3px solid #7fa2ca;
+}
+
+/* border around home search box */
+.home_search { border: 3px solid #7fa2ca; }
+
+/* main nav sidebar */
+.sidebar_item_active { background: #acc4de; }
+
+/* record detail summary block */
+.rdetail_desc { border: 1px solid #6699cc; }
+.rdetail_item { border: 1px solid #6699cc; }
+.rdetail_extras_selected { background: #d1e1a2;} 
+
+
+.data_grid thead tr { background: #acc4de; color: #000000; }
+.data_grid thead td { border: 1px solid #808080; }
+.data_grid tbody td { border: 1px solid #6699cc; }
+.data_grid_nb thead tr { background: #6699cc; color: #000000; }
+.data_grid_nb thead td { border: none; }
+.data_grid_nb tbody td { border: none; }
+
+.light_border { border: 1px solid #99ccff; }
+
+.adv_quick_search_submit { border-bottom: 3px solid #99ccff;}
+
+.myopac_link_active { background: #ddeeff; }
+
+.sidebar_extra_link { text-decoration: none; }
+#searchbar_tag_on { color: red; }
+.searchbar_item { color: black; } 
+#login_box { border-top: 1px solid #7fa2ca; border-bottom: 1px solid #7fa2ca; }
+#next_prev_links_dead { color: #808080; text-decoration: none; }
+
+.nav_link_active {font-weight: bold;}
+
+.search_link { text-decoration: none; color: #0e63ba;}
+.result_table_subtable { border-top: 1px solid #Eeffff; }
+
+.copy_count_cell { border-right: 1px solid #E0E0E0; } 
+.copy_count_div {      border-left: 2px solid #99ccff; border-right: 2px solid #99ccff; }
+
+#rdetail_image_cell { border: 1px solid white; border-right: 1px solid #99ccff;}
+
+/* For slimpac */
+.maintable { border-collapse: collapse; border: 3px solid #6699cc; -moz-border-radius: 6px; padding: 6px; margin-top: 65px; }
+.greenrow  { border: 1px solid #D0D0D0; background: #ddeeff; }
+.bluerow   { border: 1px solid #D0D0D0; background: #6699cc; }
+.rowpad    { height: 20px; }
+
+.footer_link { margin-left: 10px; margin-right: 10px; }
+
+.indent0 { padding-left: 0px; }
+.indent1 { padding-left: 10px; }
+.indent2 { padding-left: 20px; }
+
+