Email gateway obeys 'Reply-To:' in header.
[egate.git] / www / z39util.tcl
index 7903fd4..aa53782 100644 (file)
@@ -1,5 +1,5 @@
 #
-# $Id: z39util.tcl,v 1.25 1996/01/24 16:59:29 adam Exp $
+# $Id: z39util.tcl,v 1.34 1996/02/29 15:41:40 adam Exp $
 #
 proc saveState {} {
     uplevel #0 {
@@ -70,7 +70,6 @@ proc display-brief {zset no tno} {
     global setNo
     global sessionId
 
-
     html {<li>}
     set type [$zset type $no]
     if {$type == "SD"} {
@@ -90,7 +89,15 @@ proc display-brief {zset no tno} {
         html [join [$zset getSutrs $no]]
         html "<br>\n"
         return
-    } 
+    }
+    if {$rtype == "WAIS"} {
+        html { <a href="http:} $env(SCRIPT_NAME) /
+        html $sessionId {/showfull.egw/} $setNo + $tno + $no + full {">}
+        html [join [$zset getWAIS $no headline]]
+        html {</a>}
+        html "<br>\n"
+        return
+    }
     if {![catch {
         set author [$zset getMarc $no field 100 * a]
         set corp [$zset getMarc $no field 110 * a]
@@ -104,7 +111,9 @@ proc display-brief {zset no tno} {
        set location [$zset getMarc $no field 260 * a] 
        set publisher [$zset getMarc $no field 260 * b]
         set year [$zset getMarc $no field 260 * c]
-    } ] } {
+    } dispError ] } {
+        html { <a href="http:} $env(SCRIPT_NAME) /
+        html $sessionId {/showfull.egw/} $setNo + $tno + $no + full {">}
         set p 0
         foreach a $author {
             if {$p} {
@@ -130,32 +139,30 @@ proc display-brief {zset no tno} {
         if {$p} {
             html ": "
         }
-        html { <a href="http:} $env(SCRIPT_NAME) /
-        html $sessionId {/showfull.egw/} $setNo + $tno + $no + full {">}
        set nope 1
         foreach v $title {
             html $v
             set nope 0
         }
         if {$nope} {
-            html {No title} 
-        }
-        html {</a> }
-       foreach v $cover {
-           html $v
-       }
-        if {0} {
-            html {<br>}
-            foreach v $location {
-                html " $v"
-            }
-            foreach v $publisher {
-                html " $v"
-            }
-            foreach v $year {
-                html " $v"
+            set v [join $cover ""]
+            if {[string length $v] > 40} {
+                set nope 0
+                html [string range $v 0 38] "..."
+            } elseif {[string length $v] > 0} {
+                set nope 0
+                html $v
+            } else {
+                html "No Title"
             }
-        }
+       }
+        html {</a> }
+    } else {
+        html { <a href="http:} $env(SCRIPT_NAME) /
+        html $sessionId {/showfull.egw/} $setNo + $tno + $no + full {">}
+        html {No Title}
+        html {</a> }
+        html "Error: " $dispError "\n"
     }
     html "<br>\n"
 }
@@ -297,6 +304,84 @@ proc dl-marc-field-rec {zset no tag lead start stop startid sep} {
     }
 }
 
+proc display-full-wais {zset no} {
+    set i0 0
+    set i1 0
+    set refNo 0
+    set body [$zset getWAIS $no text]
+
+    while {[string length [set c [string index $body $i1]]]} {
+        if {[string compare $c \n]} {
+            incr i1
+            continue
+        }
+        set l [string trim [string range $body $i0 $i1]]
+        egw_log debug "line=$l"
+        incr i1
+        set i0 $i1
+        if {[string compare [string index $l 0] {<}]} {
+            egw_log "xxxxxxxxxxxxxxxx"
+            continue
+        }
+        if {[set mark [string first > $l ]] < 1} {
+            egw_log "yyyyyyyyyyyyyyyy"
+            continue
+        }
+        set data [string trim [string range $l [expr $mark +1] end]]
+        incr mark -1
+        set sw [string range $l 1 $mark]
+        egw_log debug "sw=$sw"
+        egw_log debug "data=$data"
+        switch -exact $sw {
+            ti {
+                set title $data
+            }
+            dm {
+                set dateOfLastModification $data
+            }
+            ci {
+                set controlIdentifier $data
+            }
+            lc {
+                set lastChecked $data
+            }
+            by {
+                set bytes $data
+            }
+            avli {
+                set linkage $data
+            }
+            cr {
+                incr refNo
+            }
+            li {
+                set crossRef($refNo,linkage) $data
+            }
+            cp {
+                set crossRef($refNo,title) $data
+            }
+        }
+    }
+    html {Title: } {<a href="} $linkage {">} $title "</a><br>\n"
+    html {URL: } $linkage "<br>\n"
+    if {[info exists bytes]} {
+        html {Bytes: } $bytes "<br>\n"
+    }
+    if {[info exists dateOfLastModification]} {
+        html {Last modified: } $dateOfLastModification "<br>\n"
+    }
+    if {[info exists lastChecked]} {
+        html {Last checked: } $lastChecked "<br>\n"
+    }
+    html "<ul>\n"
+    for {set i 1} {$i <= $refNo} {incr i} {
+        html {<li><a href="} $crossRef($i,linkage) {">}
+        html $crossRef($i,title) "</a><br>\n"
+        html "URL: " $crossRef($i,linkage)
+    }
+    html "</ul>\n"
+}
+
 proc display-full {zset no tno} {
     set type [$zset type $no]
     if {$type == "SD"} {
@@ -315,7 +400,11 @@ proc display-full {zset no tno} {
     if {$rtype == "SUTRS"} {
         html [join [$zset getSutrs $no]] "<br>\n"
         return
-    } 
+    }
+    if {$rtype == "WAIS"} {
+        display-full-wais $zset $no
+        return
+    }
     if {[catch {set r [$zset getMarc $no line * * *]}]} {
         html "Unknown record type: $rtype <br>\n"
         return
@@ -401,7 +490,7 @@ proc display-full {zset no tno} {
         if {"x$sp" == "x"} {
             set sp $url
         }
-        html {<dd><a href="} $url {">} [join $sp] "</a>\n"
+        html {<dd><a href="} [join $url] {">} [join $sp] "</a>\n"
     }
     dl-marc-field $zset $no 037 {[abc]} "Acquisition" {} "<br>\n"
     dl-marc-field $zset $no 037 {[f6]} "Form of issue" {} "<br>\n"
@@ -453,6 +542,15 @@ proc build-query {t ilines} {
     set q {}
     for {set i 1} {$i <= $ilines} {incr i} {
         set term [join [egw_form entry$i]]
+        if {[lindex $targets($t) 6] == "1"} {
+            if {[string length $op] == 0} {
+                set q $term
+            } else {
+                set q "$term $q"
+            }
+            set op [egw_form logic$i]
+            continue
+        }                
         if {[string length $term] > 0} {
             set field [join [egw_form menu$i]]
             foreach x [lindex $targets($t) 2] {
@@ -496,9 +594,7 @@ proc z39scan {setNo scanNo tno scanLines scanPos cache} {
         set scanAttr $hist($setNo,scanAttr)
         set scanTerm $hist($setNo,$scanNo,scanTerm)
     }
-    if {[catch [list $zz failback fail-response]]} {
-        ir $zz
-    }
+    mkAssoc $zz $host
     if {[catch [list set oldHost [$zz connect]]]} {
         set oldHost ""
     }
@@ -506,7 +602,7 @@ proc z39scan {setNo scanNo tno scanLines scanPos cache} {
     $zz callback ok-response
     $zz failback fail-response
     set thisHost [splitHostSpec $host]
-    if {$oldHost != $thisHost} {
+    if {[string compare $oldHost $thisHost]} {
         catch [list $zz disconnect]
 
         set sessionWait 0
@@ -561,6 +657,7 @@ proc z39scan {setNo scanNo tno scanLines scanPos cache} {
 
     $zz callback [list scan-response $zs]
 
+    egw_log debug "scan: ${scanAttr} ${scanTerm}"
     set sessionWait 0
     $zs scan "${scanAttr} ${scanTerm}"
 
@@ -610,16 +707,31 @@ proc display-scan {setNo scanNo tno} {
             set hist($setNo,[expr $scanNo + 1],scanTerm) $t
         }
     }
+    html {<table width=500 border=0><tr>}
+    html {<td align=left><b>Scan term</b>}
+    html {<td align=right><b>Hits</b>}
+    html {<tr>} \n
+
     for {set i 0} {$i < $m} {incr i} {
-        regsub -all {\ } [lindex [$zs scanLine $i] 1] + tterm
-        html {<a href="http:} $env(SCRIPT_NAME)
-        html / $sessionId {/query.egw/} $hist($setNo,host) + $setNo +
-        html $hist($setNo,scan) +  $tterm {">}
+        html {<td align=left>}
+        if {0} {
+            regsub -all {\ } [lindex [$zs scanLine $i] 1] + tterm
+            html {<a href="http:} $env(SCRIPT_NAME)
+            html / $sessionId {/query.egw/} $hist($setNo,host) + $setNo +
+            html $hist($setNo,scan) +  $tterm {">}
+        } else {
+            regsub -all {\ } [lindex [$zs scanLine $i] 1] + tterm
+            html {<a href="http:} $env(SCRIPT_NAME)
+            html / $sessionId {/search.egw/} $setNo +
+            html hyper + $tterm {">}
+        }
         html [lindex [$zs scanLine $i] 1]
-        html {</a>: <em>}
+        html {</a>} 
+        html {<td align=right>}
         html [lindex [$zs scanLine $i] 2]
-        html "</em><br>\n"
+        html {<tr>} \n
     }
+    html {</table} \n
 }
 
 proc z39search {setNo piggy tno elements} {
@@ -640,16 +752,14 @@ proc z39search {setNo piggy tno elements} {
         set database $hist($setNo,database)
         set query $hist($setNo,query)
     }
-    if {[catch [list $zz failback fail-response]]} {
-        ir $zz
-    }
+    mkAssoc $zz $host
     if {[catch [list set oldHost [$zz connect]]]} {
         set oldHost ""
     }
     $zz callback ok-response
     $zz failback fail-response
     set thisHost [splitHostSpec $host]
-    if {$oldHost != $thisHost} {
+    if {[string compare $oldHost $thisHost]} {
         catch [list $zz disconnect]
 
         set sessionWait 0
@@ -674,7 +784,7 @@ proc z39search {setNo piggy tno elements} {
            $zz disconnect
             return 0
         }
-        if {[catch {egw_wait sessionWait 60}]} {
+        if {$sessionWait == 0 && [catch {egw_wait sessionWait 60}]} {
             displayError "Cannot initialize target" $thisHost
            $zz disconnect
             return 0
@@ -690,15 +800,23 @@ proc z39search {setNo piggy tno elements} {
             displayError "Cannot initialize target $thisHost" $u
             return 0
         }
-    } else {
-        if {[info exists hist($setNo,hits)] && \
-                ![catch [list $zz.$setNo smallSetUpperBound 0]]} {
-            return 1
+    } 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
+            }
         }
-        
     }
-    ir-set $zz.$setNo $zz
     
+    if {[lindex $targets($host) 6] == "1"} {
+        wais-set $zz.$setNo $zz
+    } else {
+        ir-set $zz.$setNo $zz
+    }
     if {![lindex $targets($host) 5]} {
         set elements {}
     }
@@ -725,7 +843,7 @@ proc z39search {setNo piggy tno elements} {
     egw_log debug "search: $query"
     $zz.$setNo search $query
 
-    if {[catch {egw_wait sessionWait 600}]} {
+    if {[catch {egw_wait sessionWait 60}]} {
         egw_log debug "timeout/cancel in search"
         displayError "Timeout in search" {}
         html "</body></html>\n"
@@ -751,8 +869,13 @@ proc init-m-response {i} {
 
     egw_log debug "init-m-response"
 
-    set zstatus($i) 1
     incr zleft -1
+    if {![z39$i initResult]} {
+        set zstatus($i) -1
+        z39$i disconnect
+        return
+    }
+    set zstatus($i) 1
 }
 
 proc connect-m-response {i} {
@@ -776,32 +899,67 @@ proc fail-m-response {i} {
     incr zleft -1
 }
 
-proc search-m-response {setNo i} {
+proc search-m-response {setNo i start number} {
     global zleft
     global zstatus
+    global hist
 
-    incr zleft -1
-    set zstatus($i) 2
+    egw_log debug "search-m-response"
+    set status [z39$i.$setNo responseStatus]
+    egw_log debug "search-m-response1"
+    if {[lindex $status 0] == "OK"} {
+        set nor 0
+    } elseif {[lindex $status 0] == "DBOSD"} {
+        set nor [z39$i.$setNo numberOfRecordsReturned]
+    } else {
+        egw_log debug "search-m-response2"
+        incr zleft -1
+        set zstatus($i) 2
+        return
+    }
+    set hist($setNo,$i,hits) [z39$i.$setNo resultCount]
+    egw_log debug "search-m-response3"
+    set hist($setNo,$i,offset) [expr $start + $nor -1]
+    if {[expr $nor + $start] > [z39$i.$setNo resultCount]} {
+        egw_log debug "search-m-response4"
+        incr zleft -1
+        set zstatus($i) 2
+        return
+    }
+    egw_log debug "search-m-response5"
+    if {$nor >= $number} {
+        egw_log debug "search-m-response6 nor=$nor number=$number"
+        incr zleft -1
+        set zstatus($i) 2
+        return
+    }
+    egw_log debug "search-m-response7"
+    set start [expr $start + $nor]
+    set number [expr $number - $nor]
+    if {[expr $start + $number - 1] > [z39$i.$setNo resultCount]} {
+        set number [expr [z39$i.$setNo resultCount] - $start + 1]
+    }
+    z39$i callback [list search-m-response $setNo $i $start $number]
+    egw_log debug "mpresent start=$number number=$number"
+    z39$i.$setNo present $start $number
 }
 
-proc z39msearch {setNo piggy elements} {
+proc z39msearch {setNo elements start number cache} {
     global zleft
     global zstatus
     global hist
     global targets
+    global debug
 
     set not $hist($setNo,0,host)
 
+    egw_log debug "z39msearch start=$start number=$number elements=$elements"
     for {set i 1} {$i <= $not} {incr i} {
         set host $hist($setNo,$i,host)
-        if {[catch {z39 failback fail-response}]} {
-            ir z39$i
-        }
-        if {[catch {set oldHost [z39$i connect]}]} {
-            set oldHost ""
-        }
+        mkAssoc z39$i $host
+        set oldHost [z39$i connect]
         set thisHost [splitHostSpec $host]
-        if {$oldHost != $thisHost} {
+        if {[string compare $oldHost $thisHost]} {
             catch {z39$i disconnect}
         }
         z39$i callback [list connect-m-response $i]
@@ -812,10 +970,10 @@ proc z39msearch {setNo piggy elements} {
         set oldHost [z39$i connect]
         set host $hist($setNo,$i,host)
         set thisHost [splitHostSpec $host]
-        if {$oldHost == $thisHost} {
-            set zstatus($i) 1
+        if {![string compare $oldHost $thisHost]} {
             continue
         }
+        egw_log debug "old=$oldHost this=$thisHost"
         z39$i idAuthentication $hist($setNo,$i,idAuthentication)
         html "Connecting to target " $thisHost " <br>\n"
         set zstatus($i) -1
@@ -825,16 +983,33 @@ proc z39msearch {setNo piggy elements} {
     }
     while {$zleft > 0} {
         egw_log debug "Waiting for init response"
-        if {[catch {egw_wait zleft 10}]} {
+        if {[catch {egw_wait zleft 20}]} {
             break
         }
     }
     set zleft 0
     for {set i 1} {$i <= $not} {incr i} {
-        html "host " [splitHostSpec $hist($setNo,$i,host)] ": "
-        if {$zstatus($i) >= 1} {
-            html "ok <br>\n"
-            ir-set z39$i.$setNo z39$i
+        set host $hist($setNo,$i,host)
+        if {$debug} {
+            html "host " [splitHostSpec $host] ": "
+        }
+        egw_log debug "i=$i zstatus=$zstatus($i)"
+        if {$zstatus($i) < 1} {
+            if {$debug} {
+                html "fail<br>\n"
+            }
+            continue
+        }
+        if {[catch [list z39$i.$setNo preferredRecordSyntax USMARC]]} {
+            if {$debug} {
+                html "ok<br>\n"
+            }
+
+            if {[lindex $targets($host) 6] == "1"} {
+                wais-set z39$i.$setNo z39$i
+            } else {
+                ir-set z39$i.$setNo z39$i
+            }
             set hist($setNo,$i,offset) 0
             eval z39$i.$setNo databaseNames $hist($setNo,$i,database)
 
@@ -845,38 +1020,82 @@ proc z39msearch {setNo piggy elements} {
             }
             z39$i.$setNo smallSetElementSetNames $thisElements
             z39$i.$setNo mediumSetElementSetNames $thisElements
+            z39$i.$setNo elementSetNames $thisElements
             z39$i.$setNo recordElements $thisElements
 
             z39$i.$setNo preferredRecordSyntax USMARC
-            z39$i callback [list search-m-response $setNo $i]
+            z39$i callback [list search-m-response $setNo $i $start $number]
 
-            if {$piggy} {
+            if {$start == 1} {
                 z39$i.$setNo largeSetLowerBound 999999
                 z39$i.$setNo smallSetUpperBound 0
-                z39$i.$setNo mediumSetPresentNumber $hist($setNo,maxPresent)
+                z39$i.$setNo mediumSetPresentNumber $number
             } else {
                 z39$i.$setNo largeSetLowerBound 2
                 z39$i.$setNo smallSetUpperBound 0
                 z39$i.$setNo mediumSetPresentNumber 0
             }
             set zstatus($i) 1
-            egw_log debug "search " $hist($setNo,$i,query)
+            incr zleft
+            egw_log debug "setNo=$setNo msearch " $hist($setNo,$i,query)
             z39$i.$setNo search $hist($setNo,$i,query)
+        } elseif {[z39$i.$setNo resultCount] >= $start} {
+            if {[expr $start + $number - 1] > [z39$i.$setNo resultCount]} {
+                set tnumber [expr [z39$i.$setNo resultCount] - $start + 1]
+            } else {
+                set tnumber $number
+            }
+            if {![lindex $targets($hist($setNo,$i,host)) 5]} {
+                set thisElements {}
+            } else {
+                set thisElements $elements
+            }
+            z39$i.$setNo smallSetElementSetNames $thisElements
+            z39$i.$setNo mediumSetElementSetNames $thisElements
+            z39$i.$setNo elementSetNames $thisElements
+            z39$i.$setNo recordElements $thisElements
+
+            for {set n 0} {$n < $tnumber} {incr n} {
+                if {[z39$i.$setNo recordType [expr $start + $n]] == ""} {
+                    if {$n > 0} {
+                        egw_log debug "failed on $n"
+                    }
+                    if {$debug} {
+                        html "no record at #" [expr $start + $n]
+                        html " el=-" $thisElements "-"
+                    }
+                    break
+                }
+            }
+            if {$n == $tnumber} {
+                if {$debug} {
+                    html "cached<br>\n"
+                }
+                continue
+            }
+            
+            html "present<br>\n"
+            z39$i.$setNo preferredRecordSyntax USMARC
+            z39$i callback [list search-m-response $setNo $i $start $tnumber]
             incr zleft
+            egw_log debug "mpresent start=$start number=$tnumber"
+            z39$i.$setNo present $start $tnumber
         } else {
-            html "fail <br>\n"
+            if {$debug} {
+                html "ok<br>\n"
+            }
         }
     }
     while {$zleft > 0} {
-        egw_log debug "Waiting for search response"
-        if {[catch {egw_wait zleft 30}]} {
+        egw_log debug "Waiting for search/present response"
+        if {[catch {egw_wait zleft 60}]} {
             break
         }
     }
     for {set i 1} {$i <= $not} {incr i} {
         if {$zstatus($i) != 2} continue
         set status [z39$i.$setNo responseStatus]
-        if {[lindex $status 0] != "NSD"} {
+        if {0 && [lindex $status 0] != "NSD"} {
             set hist($setNo,$i,offset) [z39$i.$setNo numberOfRecordsReturned]
         }
     }
@@ -907,7 +1126,7 @@ proc z39present {setNo tno setOffset setMax dfunc elements} {
 
     while {$setMax > 0 && $toGet > 0} {
         for {set got 0} {$got < $toGet} {incr got} {
-            if {[$zz.$setNo type [expr $setOffset + $got]] == ""} {
+            if {[$zz.$setNo recordType [expr $setOffset + $got]] == ""} {
                 break
             }
         }
@@ -943,45 +1162,92 @@ proc z39history {} {
     global env
     global sessionId
     global targets
+    global html3
 
     if {![info exists nextSetNo]} {
         return
     }
-    html "<h2>History</h2><dl><br>\n"
+    html "<h2>History</h2><br>\n"
+    if {$html3} {
+        html {<table width=500 border=1><tr>}
+        html {<td align=center><b>Target</b>}
+        html {<td align=center><b>Database</b>}
+        html {<td align=center><b>Hits</b>}
+        html {<td align=center><b>Query</b>}
+        html {<tr>} "\n"
+    } else {
+        html {<dl>} "\n"
+    }
     for {set setNo 1} {$setNo < $nextSetNo} {incr setNo} {
         if {$hist($setNo,scan) > 0} continue
         set host $hist($setNo,host)
-        html {<dt> } [lindex $targets($host) 0]
-        if {[llength [lindex $targets($host) 1]] > 1} {
-            html ": "
-            foreach b $hist($setNo,database) {
-                html " $b"
+        if {$html3} {
+            html {<td align=left>}
+        } else {
+            html {<dt> }
+        }
+        html [lindex $targets($host) 0]
+        if {$html3} {
+            html {<td align=left>} [join $hist($setNo,database)]
+        } else {
+            if {[llength [lindex $targets($host) 1]] > 1} {
+                html ": "
+                foreach b $hist($setNo,database) {
+                    html " $b"
+                }
             }
+            html {. }
+        }
+        if {$html3} {
+            html {<td align=right>}
         }
-        html {. }
-
         if {[info exists hist($setNo,hits)]} {
             html { <a href="http:} $env(SCRIPT_NAME)
             html / $sessionId {/search.egw/} $setNo + 1
             html + $hist($setNo,maxPresent)
-            html {">Result</a>: } $hist($setNo,hits) { hits.}
+            if {1} {
+                html {">} $hist($setNo,hits) {</a>}
+            } else {
+                html {">Result</a>: } $hist($setNo,hits) { hits.}
+            }
         } else {
-            html {Search failed.}
+            if {$html3} {
+                html {Failed}
+            } else {
+                html {Search failed.}
+            }
+        }
+        if {$html3} {
+            html {<td align=left>}
+        } else {
+            html "<dd>\n"
         }
-        html "<dd>\n"
         html { <a href="http:} $env(SCRIPT_NAME)
-        html / $sessionId {/query.egw/} $host + $setNo 
-        html {">Query</a>: }
+        html / $sessionId {/query.egw/} $host + $setNo
+        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 $hist($setNo,form,menu$i) "=" $hist($setNo,form,entry$i)
+                html [join $hist($setNo,form,menu$i)] "=" 
+                html $hist($setNo,form,entry$i)
                 set op $hist($setNo,form,logic$i)
             }
         }
+        if {$html3} {
+            html {</a><tr>} "\n"
+        }
     }
-    html "</dl>\n"
+    if {$html3} {
+        html {</table><p>}
+    } else {
+        html {</dl>}
+    }
+    html "\n"
 }
 
 proc displayError {msga msgb} {
@@ -996,10 +1262,11 @@ proc displayError {msga msgb} {
 
 proc button-europagate {} {
     global useIcons
+    html {<a href="http://europagate.dtv.dk/">}
     if {$useIcons} {
         html {<img src="/egwgif/button-egw.gif" alt="Europagate" border=0></a>}
     } else {
-        html {Europagate | }
+        html {Europagate</a> | }
     }
 }
 
@@ -1012,9 +1279,9 @@ proc button-define-target {more} {
     html / $sessionId {/tform.egw}
     if {$useIcons} {
         html {"><img src="/egwgif/button-define-target.gif" }
-       html {alt="New Target" border=0></a>}
+       html {alt="Define Target" border=0></a>}
     } else {
-        html {">New Target</a>}
+        html {">Define Target</a>}
         if {$more} {
             html " | \n"
         } else {
@@ -1027,9 +1294,15 @@ proc button-new-target {more} {
     global useIcons
     global env
     global sessionId
+    global mMode
 
     html {<a href="http:} $env(SCRIPT_NAME)
-    html / $sessionId {/targets.egw}
+    html / $sessionId 
+    if {$mMode} {
+        html {/mtargets.egw}
+    } else {
+        html {/targets.egw}
+    }
     if {$useIcons} {
         html {"><img src="/egwgif/button-new-target.gif" }
        html {alt="New Target" border=0></a>}
@@ -1070,9 +1343,16 @@ proc button-new-query {more setNo} {
     global env
     global sessionId
     global hist
+    global mMode
 
     html {<a href="http:} $env(SCRIPT_NAME)
-    html / $sessionId {/query.egw/} $hist($setNo,host) + $setNo {">}
+    html / $sessionId 
+    if {$mMode} {
+        html {/mquery.egw/} $setNo
+    } else {
+        html {/query.egw/} $hist($setNo,host) + $setNo
+    }
+    html {">}
     if {$useIcons} {
         html {<img src="/egwgif/button-new-query.gif" }
        html {alt="New Query" border=0></a>}
@@ -1110,7 +1390,7 @@ proc button-scan-window {more setNo} {
 proc maintenance {} {
     html {<hr>This page is maintained by }
     html {<a href="mailto:pwh@dtv.dk"> Peter Wad Hansen </a>.}
-    html {Last modified 24. january 1996. <br>}
+    html {Last modified 29. january 1996. <br>}
     html {<em> This and the following pages are under construction and }
     html {will continue to be so until the end of January 1996.</em>}
 }
@@ -1127,3 +1407,23 @@ proc splitHostSpec {host} {
 proc mergeHostSpec {host databases} {
     return ${host}.[join $databases -]
 }
+
+proc mkAssoc {assoc host} {
+    global targets
+
+    if {[catch {$assoc failback fail-response}]} {
+        if {[lindex $targets($host) 6] == "1"} {
+            wais $assoc
+        } else {
+            ir $assoc
+        }
+    } else {
+        if {[lindex $targets($host) 6] == "1"} {
+            if {[$assoc comstack] == "wais"} return
+            wais $assoc
+        } else {
+            if {[$assoc comstack] == "tcpip"} return
+            ir $assoc
+        }
+    }
+}
\ No newline at end of file