Initial dev repository
[kcls-web.git] / opac / skin / lfw / js / adv_global.js
diff --git a/opac/skin/lfw/js/adv_global.js b/opac/skin/lfw/js/adv_global.js
new file mode 100644 (file)
index 0000000..1e0055d
--- /dev/null
@@ -0,0 +1,343 @@
+\r
+attachEvt("common", "run", advgInit);\r
+attachEvt("common", "locationChanged", advSyncCopyLocLink );\r
+\r
+var COOKIE_NOGROUP_RECORDS = 'grpt';\r
+var advSelectedOrg = null;\r
+\r
+function advgInit() {\r
+\r
+       /* XXX */\r
+       if( cookieManager.read(COOKIE_NOGROUP_RECORDS) || SHOW_MR_DEFAULT )\r
+               $('adv_group_titles').checked = true;\r
+\r
+       try{$n($('adv_global_tbody'), 'term').focus();} catch(e){}\r
+\r
+       var extras = [ \r
+               FETCH_LIT_FORMS, \r
+               FETCH_ITEM_FORMS, \r
+               FETCH_ITEM_TYPES, \r
+               FETCH_AUDIENCES,\r
+               FETCH_BIB_LEVELS \r
+    ];\r
+\r
+       for( var x in extras ) {\r
+\r
+               var req = new Request(extras[x]);\r
+\r
+               if(x == 0) req.request.sel = $('adv_global_lit_form');\r
+               if(x == 1) req.request.sel = $('adv_global_item_form');\r
+               if(x == 2) req.request.sel = $('adv_global_item_type');\r
+               if(x == 3) req.request.sel = $('adv_global_audience');\r
+               if(x == 4) req.request.sel = $('adv_global_bib_level');\r
+\r
+               req.callback(advDrawBibExtras);\r
+               req.send();\r
+       }\r
+\r
+       var input = $n($('adv_global_trow'), 'term');\r
+       try {input.focus();} catch(e){}\r
+       setEnterFunc(input, advSubmitGlobal);\r
+\r
+    if(getSort() && getSortDir()) {\r
+           setSelector($('adv_global_sort_by'), getSort());\r
+           setSelector($('adv_global_sort_dir'), getSortDir());\r
+        if(getSort() != 'rel')\r
+            $('adv_global_sort_dir').disabled = false;\r
+    }\r
+\r
+    if(getAvail())\r
+        $('opac.result.limit2avail').checked = true;\r
+\r
+    // not sure we want to propogate the pubdate filter, \r
+    // since other filters are not propogated\r
+    //advInitPubFilter();\r
+\r
+    if(!new CGI().param(PARAM_NOPERSIST_SEARCH))\r
+        initSearchBoxes();\r
+    advSyncCopyLocLink(getLocation());\r
+       //if(findCurrentPage()=="advanced") { hideMe(G.ui.login.box); /*unHideMe(G.ui.login.box);*/ }\r
+}\r
+\r
+function advInitPubFilter() {\r
+    var i1 = $('adv_global_pub_date_1');\r
+    var i2 = $('adv_global_pub_date_2');\r
+    var sel = $('adv_global_pub_date_type');\r
+    if(getPubdBefore()) {\r
+        i1.value = getPubdBefore();\r
+        setSelector(sel, 'before');\r
+    } else if(getPubdAfter()) {\r
+        i1.value = getPubdAfter();\r
+        setSelector(sel, 'after');\r
+    } else if(getPubdBetween()) {\r
+        var values = getPubdBetween().split(','); \r
+        i1.value = values[0]\r
+        if(values[0] == values[1]) {\r
+            setSelector(sel, 'equals');\r
+        } else {\r
+            setSelector(sel, 'between');\r
+            i2.value = values[1];\r
+        }\r
+    }\r
+}\r
+\r
+function advSyncCopyLocLink(org) {\r
+    // display the option to filter by copy location\r
+    advLocationsLoaded = false;\r
+    advSelectedOrg = org;\r
+    removeChildren($('adv_copy_location_filter_select'));\r
+\r
+    if(isTrue(findOrgType(findOrgUnit(org).ou_type()).can_have_vols())) {\r
+        unHideMe($('adv_copy_location_filter_row'));\r
+        advLoadCopyLocations(org); \r
+    } else {\r
+        hideMe($('adv_copy_location_filter_row'));\r
+    }\r
+}\r
+\r
+function clearSearchBoxes() {\r
+    var rows = $('adv_global_tbody').getElementsByTagName('tr');\r
+    for(var t = 0; t < rows.length; t++) {\r
+        if($n(rows[t], 'term')) {\r
+            $n(rows[t], 'term').value = '';\r
+            setSelector($n(rows[t], 'contains'), 'contains');\r
+            setSelector($n(rows[t], 'type'), 'keyword');\r
+        }\r
+    }\r
+    try{$n(rows[0], 'term').focus();} catch(e){}\r
+}\r
+\r
+\r
+function initSearchBoxes() {\r
+    /* loads the compiled search from the search cookie \r
+        and sets the widgets accordingly */\r
+\r
+    search = cookieManager.read(COOKIE_SEARCH);\r
+    if(!search) return;\r
+    _debug("loaded compiled search cookie: " + search);\r
+\r
+    search = JSON2js(search);\r
+    if(!search) return;\r
+\r
+    var types = getObjectKeys(search.searches);\r
+\r
+    // if we have browser cached data, clear it before populating from cookie\r
+    if (search.searches[types[0]].term)\r
+        clearSearchBoxes();\r
+\r
+    /* pre-add the needed rows */\r
+    while($('adv_global_tbody').getElementsByTagName('tr').length - 1 < types.length)\r
+        advAddGblRow();\r
+\r
+    var rows = $('adv_global_tbody').getElementsByTagName('tr');\r
+\r
+    for(var t = 0; t < types.length; t++) {\r
+        var row = rows[t];\r
+        setSelector($n(row, 'type'), types[t]);\r
+        var term = search.searches[types[t]].term;\r
+\r
+        /* if this is a single -<term> search, set the selector to nocontains */\r
+        if(match = term.match(/^-(\w+)$/)) {\r
+            term = match[1];\r
+            setSelector($n(row, 'contains'), 'nocontains');\r
+        }\r
+        $n(row, 'term').value = term;\r
+    }\r
+}\r
+\r
+function advAddGblRow() {\r
+       var tbody = $("adv_global_tbody");\r
+       var newrow = $("adv_global_trow").cloneNode(true);\r
+       tbody.insertBefore(newrow, $("adv_global_addrow"));\r
+       var input = $n(newrow, "term");\r
+       input.value = "";\r
+       setEnterFunc(input, advSubmitGlobal);\r
+       $n(newrow, 'type').focus();\r
+}\r
+\r
+function advDrawBibExtras(r) {\r
+       var data = r.getResultObject();\r
+       var sel = r.sel;\r
+\r
+       data = data.sort( /* sort alphabetically */\r
+               function(a,b) { \r
+                       if( a.value() < b.value() ) return -1;\r
+                       if( a.value() > b.value() ) return 1;\r
+                       return 0;\r
+               }\r
+       );\r
+\r
+       for( var d = 0; d < data.length; d++ ) {\r
+               var thing = data[d];\r
+               var opt = insertSelectorVal( sel, -1, thing.value(), thing.code() );\r
+               opt.setAttribute('title', thing.value());\r
+       }\r
+}\r
+\r
+function advSelToStringList(sel) {\r
+       var list = getSelectedList(sel);\r
+       var vals = [];\r
+       for( var i = 0; i < list.length; i++ ) {\r
+               var str = list[i];\r
+               for( var j = 0; j < str.length; j++ ) {\r
+                       //if(str.charAt(j) == ' ') continue;\r
+                       vals.push(str.charAt(j));\r
+               }\r
+       }\r
+       return vals.toString();\r
+}\r
+\r
+function advGetVisSelectorVals(id) {\r
+       var basic = id + '_basic';\r
+       if(! $(id).className.match(/hide_me/)) \r
+               return advSelToStringList($(id));\r
+       return advSelToStringList($(basic));\r
+}\r
+\r
+function advSubmitGlobal() {\r
+       \r
+       var sortdir = getSelectorVal($('adv_global_sort_dir'));\r
+       var sortby  = getSelectorVal($('adv_global_sort_by'));\r
+\r
+       var litforms  = advGetVisSelectorVals('adv_global_lit_form');\r
+       var itemforms = advGetVisSelectorVals('adv_global_item_form');\r
+       var itemtypes = advGetVisSelectorVals('adv_global_item_type');\r
+       var audiences = advGetVisSelectorVals('adv_global_audience');\r
+       var biblevels = advGetVisSelectorVals('adv_global_bib_level');\r
+    var locations = getSelectedList($('adv_copy_location_filter_select')) + '';\r
+       var languages = getSelectedList($('adv_global_lang')) + '';     \r
+    var limit2avail = $('opac.result.limit2avail').checked ? 1 : ''\r
+\r
+       var searches = advBuildSearchBlob();\r
+       if(!searches) return;\r
+\r
+       clearSearchParams();\r
+\r
+       var args = {};\r
+       args.page = MRESULT;\r
+       args[PARAM_ITEMFORM] = itemforms;\r
+       args[PARAM_ITEMTYPE] = itemtypes;\r
+       args[PARAM_BIBLEVEL] = biblevels;\r
+       args[PARAM_LITFORM]     = litforms;\r
+       args[PARAM_AUDIENCE]    = audiences;\r
+       args[PARAM_LANGUAGE] = languages;\r
+       args[PARAM_COPYLOCS] = locations;\r
+       //args[PARAM_SEARCHES]  = js2JSON(searches); /* break these out */\r
+       args[PARAM_DEPTH]               = depthSelGetDepth();\r
+       args[PARAM_LOCATION]    = depthSelGetNewLoc();\r
+       args[PARAM_SORT]                = sortby;\r
+       args[PARAM_SORT_DIR]    = sortdir;\r
+       args[PARAM_ADVTYPE]     = ADVTYPE_MULTI;\r
+       args[PARAM_STYPE]               = "";\r
+       args[PARAM_TERM]                = searches;\r
+       args[PARAM_AVAIL]               = limit2avail;\r
+       args[PARAM_FORM] = itemtypes[0];\r
+       args[PARAM_FACET] = itemtypes==''?'':"identifier|mattype["+itemtypes.replace(/[,]/, function(a){switch(a){case ",": return "#";}})+"]";\r
+\r
+    // publicate year filtering\r
+    var pub1;\r
+    if( (pub1 = $('adv_global_pub_date_1').value) && (''+pub1).match(/\d{4}/)) {\r
+        switch(getSelectorVal($('adv_global_pub_date_type'))) {\r
+            case 'equals':\r
+                   args[PARAM_PUBD_BETWEEN] = pub1+','+pub1;\r
+                break;\r
+            case 'before':\r
+                   args[PARAM_PUBD_BEFORE] = pub1;\r
+                break;\r
+            case 'after':\r
+                   args[PARAM_PUBD_AFTER] = pub1;\r
+                break;\r
+            case 'between':\r
+                var pub2 = $('adv_global_pub_date_2').value;\r
+                if((''+pub2).match(/\d{4}/))\r
+                       args[PARAM_PUBD_BETWEEN] = pub1+','+pub2;\r
+                break;\r
+        }\r
+    }\r
+\r
+       /* pubdate sorting causes a record (not metarecord) search */\r
+       if( sortby == SORT_TYPE_PUBDATE || !$('adv_group_titles').checked ) {\r
+               args.page = RRESULT;\r
+               args[PARAM_RTYPE] = RTYPE_MULTI;\r
+       }\r
+\r
+       if($('adv_group_titles').checked ) \r
+               cookieManager.write(COOKIE_NOGROUP_RECORDS,'1',-1);\r
+       else\r
+               cookieManager.write(COOKIE_NOGROUP_RECORDS,'');\r
+\r
+       goTo(buildOPACLink(args));\r
+}\r
+\r
+\r
+function advBuildSearchBlob() {\r
+\r
+       var searches = '';\r
+       var tbody    = $('adv_global_tbody');\r
+       var rows     = tbody.getElementsByTagName('tr');\r
+\r
+       for( var i = 0; i < rows.length; i++ ) {\r
+\r
+               var row = rows[i];\r
+               if(!(row && typeof row == 'object')) continue;\r
+               if(!row.getAttribute('type')) continue;\r
+               \r
+               var stype        = getSelectorVal($n(row, 'type'));\r
+               var contains = getSelectorVal($n(row, 'contains'));\r
+               var term                 = $n(row, 'term').value;\r
+               if(!term) continue;\r
+\r
+               var string = "";\r
+               switch(contains) {\r
+                       case 'contains' : \r
+                               string += " " + term; \r
+                               break;\r
+\r
+                       case 'nocontains' : {\r
+                               var words = term.split(" ");\r
+                                       for( var j in words ) \r
+                                               string += " -" + words[j];\r
+                               }\r
+                               break;\r
+\r
+                       case 'exact' : \r
+                               if(term.indexOf('"') > -1) string += " " + term;\r
+                               else string += " \"" + term + "\"";\r
+                               break;\r
+               }\r
+               if(string) {\r
+                       string = string.replace(/'/g,' ');\r
+                       string = string.replace(/\\/g,' ');\r
+            string = string.replace(/^\s*/,'');\r
+            string = string.replace(/\s*$/,'');\r
+                       //searches[stype].term = string;\r
+            if(searches) searches += ' ';\r
+            searches += stype + ':'+ string;\r
+               }\r
+       }\r
+\r
+    _debug("created search query " + searches);\r
+       return searches;\r
+}\r
+\r
+\r
+// retrieves the shelving locations\r
+var advLocationsLoaded = false;\r
+function advLoadCopyLocations(org) {\r
+    if(org == null) \r
+        org = advSelectedOrg;\r
+    var req = new Request(FETCH_COPY_LOCATIONS, org);\r
+    req.callback(advShowCopyLocations);\r
+    req.send();\r
+    advLocationsLoaded = true;\r
+}\r
+\r
+// inserts the shelving locations into the multi-select\r
+function advShowCopyLocations(r) {\r
+    var locations = r.getResultObject();\r
+    var sel = $('adv_copy_location_filter_select');\r
+    for(var i = 0; i < locations.length; i++) \r
+        insertSelectorVal(sel, -1, locations[i].name(), locations[i].id());\r
+}\r
+\r
+\r