Major revision. Single-target result set can be reached from the
[egate.git] / www / z39util.tcl
index e50db2b..ba0b55e 100644 (file)
@@ -1,5 +1,5 @@
 #
-# $Id: z39util.tcl,v 1.39 1996/03/12 16:30:30 adam Exp $
+# $Id: z39util.tcl,v 1.40 1996/03/13 14:07:32 adam Exp $
 #
 proc saveState {} {
     uplevel #0 {
@@ -120,6 +120,7 @@ proc display-medium {zset no setNo targetNo} {
        set location [$zset getMarc $no field 260 * a] 
        set publisher [$zset getMarc $no field 260 * b]
         set year [$zset getMarc $no field 260 * c]
+        set score [$zset getMarc $no field 999 * r]
     } dispError ] } {
         html { <a href="http:} $env(SCRIPT_NAME) /
         html $sessionId {/showfull.egw/} $setNo + $targetNo + $no + full {">}
@@ -161,6 +162,9 @@ proc display-medium {zset no setNo targetNo} {
             html "No Title"
         }
         html {</a> }
+        if {[scan $score %d nscore]} {
+            html "; Score " $nscore
+        }
     } else {
         html { <a href="http:} $env(SCRIPT_NAME) /
         html $sessionId {/showfull.egw/} $setNo + $targetNo + $no + full {">}
@@ -521,6 +525,7 @@ proc display-full-marc {zset no setNo targetNo} {
     dl-marc-field $zset $no 537 * "Source of data" {} "<br>\n"
     dl-marc-field $zset $no 538 * "System details" {} "<br>\n"
     dl-marc-field $zset $no 787 {[rstw6]} "Related information" {} "<br>\n"
+    dl-marc-field $zset $no 999 r "Score" {} ", "
     dl-marc-field $zset $no 001 * "Local control number" {} ", "
     html "</dl>\n"
 }
@@ -610,7 +615,7 @@ proc display-full-wais {zset no setNo targetNo} {
         html {<dt><b>Last checked</b><dd>} $data(lastChecked) "<br>\n"
     }
     if {[info exists data(ip)]} {
-        html {<dt><b>Initial text</b><dd>} $data(ip) "</dl><br>\n"
+        html {<dt><b>Initial text</b><dd>} $data(ip) "<br>\n"
     }
     if {0} {
         html {<a href="} $env(SCRIPT_NAME) / $sessionId {/sameas.egw/}
@@ -618,7 +623,9 @@ proc display-full-wais {zset no setNo targetNo} {
         html [egw_enc [$zset getWAIS $no documentID]] {">}
         html {Similar WAIS record</a><br>}
     }
-    html "<dt><b>References</b>\n"
+    if {[info exists data($i,linkage)]} {
+        html "<dt><b>References</b>\n"
+    }
     for {set i 1} {[info exists data($i,linkage)]} {incr i} {
         html {<dd><a href="} $data($i,linkage) {">}
         if {[info exists data($i,title)]} {
@@ -868,7 +875,7 @@ proc display-scan {setNo scanNo tno} {
         if {0} {
             regsub -all {\ } [lindex [$zs scanLine $i] 1] + tterm
             html {<a href="http:} $env(SCRIPT_NAME)
-            html / $sessionId / $scriptQuery / $setNo + $hist($setNo,host) +
+            html / $sessionId / $scriptQuery {;/} $setNo + $hist($setNo,host) +
             html $hist($setNo,scan) +  $tterm {">}
         } else {
             regsub -all {\ } [lindex [$zs scanLine $i] 1] + tterm
@@ -946,14 +953,8 @@ proc z39search {setNo piggy tno elements} {
             return 0
         }
     } elseif {![catch  [list $zz.$setNo smallSetUpperBound 0]]} {
-        if {$tno > 0} {
-            if {[info exists hist($setNo,$tno,hits)]} {
-                return 1
-            }
-        } else {
-            if {[info exists hist($setNo,hits)]} {
-                return 1
-            }
+        if {[info exists hist($setNo,$tno,hits)]} {
+            return 1
         }
     }
     
@@ -1009,7 +1010,7 @@ proc z39search {setNo piggy tno elements} {
     if {$sessionWait != 1} {
        return 0
     }
-    set hist($setNo,hits) [$zz.$setNo resultCount]
+    set hist($setNo,$tno,hits) [$zz.$setNo resultCount]
     return 1
 }
 
@@ -1343,9 +1344,12 @@ proc buttons-result-set-s {setNo targetNo setMax startPos after} {
             html {">Previous Records</a>} 
         }
     }
-    button-new-query 1 $setNo
-    button-new-target 1
-    button-view-history 0
+    if {$targetNo > 0} {
+        button-result-set $setNo $targetNo
+    }
+    button-new-query $setNo
+    button-new-target
+    button-view-history
 
     html "<p>\n"
 }
@@ -1365,35 +1369,48 @@ proc display-result-set-m-score {setNo} {
         if {$zstatus($i) != 2} continue
         set status [z39$i.$setNo responseStatus]
         if {[lindex $status 0] != "DBOSD"} continue        
-        if {$hist($setNo,$i,offset) > $hist($setNo,maxPresent)} {
-            set nor $hist($setNo,maxPresent)
-        } else {
-            set nor $hist($setNo,$i,offset)
-        }
+        set nor $hist($setNo,$i,offset)
         for {set j 1} {$j <= $nor} {incr j} {
             if {![string compare [z39$i.$setNo recordType $j] WAIS]} {
                 set score [z39$i.$setNo getWAIS $j score]
-                if {$score > 0} {
-                    lappend scoreArray [list $score $i $j]
+            } elseif {![string compare [z39$i.$setNo recordType $j] USmarc]} {
+                set score [z39$i.$setNo getMarc $j field 999 * r]
+                if {[scan $score %d score] != 1} {
+                    set score 10
                 }
             } else {
-                lappend scoreArray [list 10 $i $j]
+                set score 10
+            }
+            if {$score > 0} {
+                lappend scoreArray [list $score $i $j]
             }
         }
     }
     if {![info exists scoreArray]} {
         html "<br><h3>Search produced no result</h3><br>\n"
-        return
+    } else {
+        html "<ul>\n"
+        set scoreSorted [lsort -command score-sort $scoreArray]
+        foreach r $scoreSorted {
+            set i [lindex $r 1]
+            set j [lindex $r 2]
+            display-$hist($setNo,format) z39$i.$setNo $j $setNo $i
+        }
+        html "<br></ul>\n"
     }
-    set scoreSorted [lsort -command score-sort $scoreArray]
-
-    html "<ul>\n"
-    foreach r $scoreSorted {
-        set i [lindex $r 1]
-        set j [lindex $r 2]
-        display-$hist($setNo,format) z39$i.$setNo $j $setNo $i
+    for {set i 1} {$i <= $not} {incr i} {
+        if {$zstatus($i) != 2} continue
+        set status [z39$i.$setNo responseStatus]
+        if {[lindex $status 0] == "NSD"} {
+            z39$i.$setNo nextResultSetPosition 0
+            set code [lindex $status 1]
+            set msg [lindex $status 2]
+            set addinfo [lindex $status 3]
+            html {<dt>} [lindex $targets($hist($setNo,$i,host)) 0] 
+            html "<dd>Error: $msg: $addinfo (code $code)<br>\n"
+        }
     }
-    html "</ul><br>\n"
+    html "\n<br>"
 }
 
 proc display-result-set-m-server {setNo} {
@@ -1401,20 +1418,26 @@ proc display-result-set-m-server {setNo} {
     global useIcons
     global zstatus
     global targets
+    global env
+    global sessionId
 
     set not $hist($setNo,0,host)
     html "<dl>\n"
     for {set i 1} {$i <= $not} {incr i} {
         if {$zstatus($i) != 2} continue
-        html "<dt><h3>" [lindex $targets($hist($setNo,$i,host)) 0] ": "
         set status [z39$i.$setNo responseStatus]
         if {[lindex $status 0] == "NSD"} {
+            html "<dt><h3>" [lindex $targets($hist($setNo,$i,host)) 0] ": "
             z39$i.$setNo nextResultSetPosition 0
             set code [lindex $status 1]
             set msg [lindex $status 2]
             set addinfo [lindex $status 3]
             html "Error</h3>\n<dd>NSD$code: $msg: $addinfo"
         } else {
+            html {<dt><a href="http:} $env(SCRIPT_NAME)
+            html / $sessionId {/search.egw/} $setNo + $i + 1
+            html + $hist($setNo,maxPresent) {">}
+            html "<h3>" [lindex $targets($hist($setNo,$i,host)) 0] "</a>: "
             set r [z39$i.$setNo resultCount]
             html "$r hits</h3>\n<dd>\n"
             
@@ -1518,7 +1541,6 @@ proc z39history {} {
     global html3
     global scriptQuery
 
-    set targetNo 0
     if {![info exists nextSetNo]} {
         return
     }
@@ -1534,67 +1556,77 @@ proc z39history {} {
         html {<dl>} "\n"
     }
     for {set setNo 1} {$setNo < $nextSetNo} {incr setNo} {
-        if {$hist($setNo,scan) > 0} continue
-        set host $hist($setNo,0,host)
-        if {$html3} {
-            html {<td align=left>}
-        } else {
-            html {<dt> }
+        if {[info exists hist($setNo,scan)]} {
+            if {$hist($setNo,scan) > 0} continue
         }
-        html [lindex $targets($host) 0]
-        if {$html3} {
-            html {<td align=left>} [join $hist($setNo,0,database)]
+        if {[info exists hist($setNo,1,host)]} {
+            set start 1
+            set end $hist($setNo,0,host)
         } else {
-            if {[llength [lindex $targets($host) 1]] > 1} {
-                html ": "
-                foreach b $hist($setNo,0,database) {
-                    html " $b"
+            set start 0
+            set end 0
+        }
+        for {set i $start} {$i <= $end} {incr i} {
+            if {$html3} {
+                html {<td align=left>}
+            } else {
+                html {<dt> }
+            }
+            set host $hist($setNo,$i,host)
+            html [lindex $targets($host) 0]
+            if {$html3} {
+                html {<td align=left>} [join $hist($setNo,$i,database)]
+            } else {
+                if {[llength [lindex $targets($host) 1]] > 1} {
+                    html ": "
+                    foreach b $hist($setNo,$i,database) {
+                        html " $b"
+                    }
                 }
+                html {. }
             }
-            html {. }
-        }
-        if {$html3} {
-            html {<td align=right>}
-        }
-        if {[info exists hist($setNo,hits)]} {
-            html { <a href="http:} $env(SCRIPT_NAME)
-            html / $sessionId {/search.egw/} $setNo + $targetNo + 1
-            html + $hist($setNo,maxPresent)
-            if {1} {
-                html {">} $hist($setNo,hits) {</a>}
+            if {$html3} {
+                html {<td align=right>}
+            }
+            if {[info exists hist($setNo,$i,hits)]} {
+                html { <a href="http:} $env(SCRIPT_NAME)
+                html / $sessionId {/search.egw/} $setNo + $i + 1
+                html + $hist($setNo,maxPresent)
+                html {">} $hist($setNo,$i,hits) {</a>}
             } else {
-                html {">Result</a>: } $hist($setNo,hits) { hits.}
+                if {$html3} {
+                    html {Failed}
+                } else {
+                    html {Search failed.}
+                }
             }
-        } else {
             if {$html3} {
-                html {Failed}
+                html {<td align=left>}
             } else {
-                html {Search failed.}
+                html "<dd>\n"
             }
-        }
-        if {$html3} {
-            html {<td align=left>}
-        } else {
-            html "<dd>\n"
-        }
-        html { <a href="http:} $env(SCRIPT_NAME)
-        html / $sessionId / $scriptQuery / $setNo + $host
-        if {$html3} {
-            html {">}
-        } else {
-            html {">Query</a>: }
-        }
-        set op {}
-        for {set i 1} {$i <= 3} {incr i} {
-            if {[string length $hist($setNo,form,entry$i)] > 0} {
-                html " <b>" [join $op " "] "</b> "
-                html [join $hist($setNo,form,menu$i)] "=" 
-                html $hist($setNo,form,entry$i)
-                set op $hist($setNo,form,logic$i)
+            html { <a href="http:} $env(SCRIPT_NAME)
+            html / $sessionId / $scriptQuery {;/} $setNo + $host
+            if {$html3} {
+                html {">}
+            } else {
+                html {">Query</a>: }
+            }
+            set op {}
+            for {set j 1} {$j <= 3} {incr j} {
+                if {[string length $hist($setNo,form,entry$j)] > 0} {
+                    html " <b>" [join $op " "] "</b> "
+                set pre [join $hist($setNo,form,menu$j)]
+                    if {[string length $pre] > 0} {
+                        html $pre "="
+                    }
+                    html $hist($setNo,form,entry$j)
+                    set op $hist($setNo,form,logic$j)
+                }
+            }
+            if {$html3} {
+                html {</a><tr>} "\n"
             }
-        }
-        if {$html3} {
-            html {</a><tr>} "\n"
         }
     }
     if {$html3} {
@@ -1625,7 +1657,7 @@ proc button-main {} {
     }
 }
 
-proc button-define-target {more} {
+proc button-define-target {} {
     global useIcons
     global env
     global sessionId
@@ -1643,11 +1675,10 @@ proc button-define-target {more} {
     }
 }
 
-proc button-new-target {more} {
+proc button-new-target {} {
     global useIcons
     global env
     global sessionId
-    global mMode
     global scriptTarget
 
     if {[string length $scriptTarget] == 0} return
@@ -1665,7 +1696,7 @@ proc button-new-target {more} {
     }
 }
 
-proc button-view-history {more} {
+proc button-view-history {} {
     global useIcons
     global env
     global sessionId
@@ -1685,19 +1716,18 @@ proc button-view-history {more} {
     }
 }
 
-proc button-new-query {more setNo} {
+proc button-new-query {setNo} {
     global useIcons
     global env
     global sessionId
     global hist
-    global mMode
     global scriptQuery
 
     if {!$useIcons} {
         html "\n | "
     }
     html {<a href="http:} $env(SCRIPT_NAME)
-    html / $sessionId / $scriptQuery / $setNo + $hist($setNo,0,host) {">}
+    html / $sessionId / $scriptQuery {;/} $setNo + $hist($setNo,0,host) {">}
 
     if {$useIcons} {
         html {<img src="/egwgif/button-new-query.gif" }
@@ -1707,7 +1737,31 @@ proc button-new-query {more setNo} {
     }
 }
 
-proc button-scan-window {more setNo} {
+proc button-result-set {setNo tno} {
+    global useIcons
+    global env
+    global sessionId
+    global hist
+
+    if {!$useIcons} {
+        html "\n | "
+    }
+    html {<a href="http:} $env(SCRIPT_NAME) / $sessionId 
+    if {$tno > 0} {
+        html {/msearch.egw/} $setNo
+    } else {
+        html {/search.egw/} $setNo + $tno
+    }
+    html + 1 + $hist($setNo,maxPresent)
+    if {$useIcons} {
+        html {"><img src="/egwgif/button-result-set.gif" }
+       html {alt="Result Set" border=0></a>}
+    } else {
+        html {">Result Set</a>}
+    }
+}
+
+proc button-scan-window {setNo} {
     global useIcons
     global env
     global sessionId
@@ -1779,6 +1833,45 @@ proc mkAssoc {assoc host} {
     }
 }
 
+proc serverList {headlineProc targetProc} {
+    global targets
+    global groupsDescription
+   
+    proc targetsCmp {l r} {
+        global targets
+        return [string compare [string tolower [lindex $targets($l) 0]] \
+                               [string tolower [lindex $targets($r) 0]]]
+    }
+    proc groupCmp {l r} {
+        global groupsOrder
+        if {[catch {set lo $groupsOrder($l)}]} {
+            set lo 10
+        }
+        if {[catch {set ro $groupsOrder($r)}]} {
+            set ro 10
+        }
+        return [expr $lo - $ro]
+    }
+    
+    foreach tt [array names targets] {
+        lappend groupsTmp([lindex $targets($tt) 6]) $tt
+    }
+    set gts [lsort -command groupCmp [array names groupsTmp]]
+    foreach gt $gts {
+        if {[info exists groupsDescription($gt)]} {
+            eval $headlineProc [list $groupsDescription($gt)]
+        } else {
+            eval $headlineProc $gt
+        }
+        set tn [lsort -command targetsCmp $groupsTmp($gt)]
+        foreach t $tn {
+            eval $targetProc $t
+        }
+    }
+
+    rename targetsCmp {}
+}
+
 if {[info exists utilExtension]} {
     source $utilExtension
 }
\ No newline at end of file