/**
 * todo:
 * Browsererkennung ist bislang primitiv
 * Test mit MS IE
 * mouse drag der bubbles funktioniert nicht ok
 * random Examples, die man mit click benutzen kann
 *
 *
 **/

	var windowFeatures="width=200,height=200,resize,scrolling=auto";


function GetBrowser()
{
	switch ( navigator.appName ){
		case 'Netscape':
			browser = 'mozilla'
			break;
		case 'Microsoft Internet Explorer':
			browser = 'ie'
			break;
		case 'Opera':
			browser = 'opera'
			break;
		default:
			browser = 'unknown'
			break;
	}
	return( browser )
}

var browser = GetBrowser()
	

	var BubbleTimeoutId = 0

	
	// Vorspann in den Bubbletexten: '7' -> Pfeil zeigt auf 7 Uhr, '11' Pfeil zeigt 11 Uhr
	var bu_prefix7 = ''
	var bu_prefix11 ='<div style="vertical-align: bottom; border: none; margin: 0px; padding: 0;" ><img src="/images/rot11.png"></div>'

	var bu_prefix = '<div id="bubbletop"><img id="btn_BubbleClose"  style="padding: 2px;" src="http://ibu.de//misc/close.png"></div><div id="bubblecontent">' 

	var bu_suffix7 = '</div><div style="border: none;" ><img src="/images/rot7.png"></div>'
	var bu_suffix11 = '</div>'

/**
 * Bubbletexte:
 * <a> mit class="bubble" und ibu_btext="so_btext_..." werden automatisch sensitiv fuer mouseover,
 * das einen Bubbletext anzeigt. Welcher Bubbletext angezeigt wird, bestimmt der Wert des Attributes
 * "ibu_btext"; fuer diesen Wert sollte  ein eindeutiger Wert gesetzt werden.
 * Im dictionary 'sobu_text' werden die Bubbletexte definiert. 
 *
 * Beispiel: Je nach Einstellung des HTML-<select> fuer die search options wird ein kurzer Erlaeuterungstext
 * angezeigt. Das macht hier die function PrintQueryModeAbrev(). Der Erlaeuterungstext enthaelt <a class"bubble"
 *  ibu_btext="so_...: >...</a>; diese <a> Elemente erzeugen beim mouseover einen bubble.
 *
 *
 *
 *
 *
 */

	// Texte fuer Hilfebubbles, angezeigt ueber <a class"bubble" und ibu_btext="so_btext_...":
	var sobu_text ={
	'sobu_and'  : 'Bubble Text zu AND',
	'sobu_or'  : 'Bubble Text zu OR',
	'sobu_rpn_operand' :   'the format for operands <pre>([&lt;Field&gt;/]&lt;Term&gt;[&lt;Op&gt;][:&lt;Weight&gt;])',
	'sobu_rpn_operator_binary' : '<h4>Binary Operators</h4><table>' +
'<tr><td>OR  </td><td> all elements in either of two sets</td></tr>' +
'<tr><td>AND </td><td> all elements in both sets</td></tr>' +
'<tr><td>ANDNOT   </td><td>  Elements in the one set but NOT in the other</td></tr>' +
'<tr><td>XOR   </td><td>  Exclusive Union, elements in either but not both</td></tr>' +
'<tr><td>ADJ   </td><td>  Matching terms are adjacent to one another</td></tr>' +
'<tr><td>NEAR[:num] </td><td>  matching terms in the sets are within X elements</td></tr>' +
'<tr><td>BEFORE[:num] and AFTER[:num] </td><td>  As NEAR but in specific order. ' +
 'num as integer is characters. As fraction of 1 its % of doc</td></tr>' +
'<tr><td>PEER  </td><td>  Elements in the same (unnamed) final tree leaf node</td></tr>' +
'<tr><td>AND[:field] </td><td>  Elements in the same node instance of field</td></tr>' +
'<tr><td>FOLLOWS, PRECEDES</td><td> Within some ordered elements of one another</td></tr>' +
'<tr><td>FAR   </td><td>  Elements a "good distance" away from each other</td></tr>' +
'<tr><td>NEAR  </td><td>  Elements "near" one another.<td></tr>' +
'</table>'  ,

	'sobu_rpn_operator_unary' : '<h4>Unary Operators</h4><table>' +
'<tr><td>NOT </td><td> Set compliment</td><tr>' +
'<tr><td>WITHIN[:field] </td><td>  Records with elements within the specified field.' +
'RPN queries "term WITHIN:field" and "field/term" are equivalent.<br>' +
'                         (for performance the query "field/term" is prefered to "term WITHIN:field")</td></tr>' +
'<tr><td>WITHIN[:daterange] </td><td>  Record dates within the range</td></tr>' +
'<tr><td>INSIDE[:field] </td><td>  Hits are elements are in the specified field</td></tr>' +
'<tr><td>XWITHIN[:field]</td><td>  Absolutely NOT in the specified field</td></tr>' +
'<tr><td>REDUCE[:nnn]   </td><td>  Reduce set to those records with nnn matching terms<br>' +
'                    NOTE: REDUCE:metric is a special kind of unary operator that trims the result<br>' +
'                      to metric cutoff regarding the number of different terms (see -h and -joint).<br>' +
'                      Reduce MUST be specified with a positive metric and 0 (Zero) is a special case<br>' +
'                      designating the max. number of different terms found in the set.</td></tr></table>' ,



	'sobu_infix' :  'Bubble Text zu infix'
	} // sobu_text, bubble texte




function iebody(){
  return (document.compatMode && document.compatMode!="BackCompat")? document.documentElement : document.body
}


function getOffsetTop(element){
	var top=0;
	//alert ( '1 ' + element +  ':' +top)
	while(element){
		top += element.offsetTop - element.scrollTop;
	//	alert ( '2 ' +element.offsetTop +  ':' + element.scrollTop)
		element =element.offsetParent;
	}
	return top;
}



function getOffsetLeft(element){
	var l=0;
	while(element){
		l += element.offsetLeft - element.scrollLeft;
		element =element.offsetParent;
	}
	return l;
}



	var bubbleisvisible=0




	//
	// uebernimmt den Inhalt vom Feld Live Scan nach Term
	// args:
	// submit: wenn 1, dann wird sofort gesucht (submit) mit genau diesem Wort
	//

  function f1( submit ){ 
		von=document.getElementById('edit-aux');
		nach= document.getElementById('edit-term') ;
		scanfield = document.getElementById('edit-aux-prefix');
		if ( scanfield.selectedIndex !='' ) {
			field = scanfield.options[ scanfield.selectedIndex ].value + '/';
		} else {
			field = '';
		};

		if ( von.value.length > 2 ){
			if ( submit == 1 ){
				nach.value = ' ' + field.replace(/\\\\/g, '\\\\\\\\') + von.value ;
				el=document.getElementById('rain_su');
					//alert(nach.value.length);
					el.submit();
					return( 1 );
			} else {
				SearchBtnMoreAction ();
				nach.value += ' ' + field.replace(/\\\\/g, '\\\\\\\\') + von.value ;
				von.value = '';
				von.focus();
				return( false );
			};
		} else {
				return( false );
		}
	} // f1



	// Manipliert den Hintergrund von HTML-Elementen mit dem Namen searchBtnBackGround 
	// Erzeugt beim Suchen einen optischen Effekt der Art: "bitte warten, maschine arbeitet ..." 
	function SearchBtnMoreAction (){
		document.getElementById("searchBtnBackGround").setAttribute("style", "background: url(misc/progress.gif)");
	}



	// Druckt ein Feld mit den aktuellen Searchoptins

	function PrintSearchOptionsAbrev(){
		// labels for Search Options:
		var sol = [ 
			'Unsorted',      'ByDate',          'ByReverseDate',    'ByRelevance',   'ByAdjScore', 
			'ByAuxCount',    'ByHits',          'ByReverseHits',    'ByKey',         'ByIndex' ,
			'ByCategory',    'ByNewsrank',      'ByPrivate'
		] 

		var TIPS= [ 
			'Without any specific order',
			'Sort results by date, newest first',
			'Sort results by date, oldest first',
			'Relevance Ranking gives higher scores to results, which fit better to your query',
			'By adjacent score',
			'Sort results by different matches; how much different word matches per record.',
			'Sort by hit count descending counts',
			'Sort by hit count asceding counts',
			'Sort by internal database key',
			'Sort by internal database order',
			'Sort by category',
			'Newer stories, which fit well to your query, get a better NewsRank',
			'Sort by private',
		]

		f = document.forms["rain_su"];
		//rso = document.getElementsByName("edit[orderby]");   // Todo: Test in MS IE, bei radios: edit[orderby]
		rso = document.getElementById("edit-orderby");   // Todo: Test in MS IE, bei radios: edit[orderby]

// /* code fuer search options als radio buttons: */
//		var n=0;
//		for (var i=0; i <   rso.length;  i++ ) {
//			if (rso[i].checked == true) {
//				n = i;
//      }
//		}
	//		alert( n+ sol[rso[n].value] )

	// nun zeigen wir diesen Wert im HTML-Element mit id=SearchOptionsAbrev 
	// soa=document.getElementById("SearchOptionsAbrev").innerHTML=  sol[rso[n].value];
	document.getElementById("SearchOptionsAbrev").innerHTML =  sol[rso.value];
	document.getElementById("tip_so").innerHTML =  TIPS[rso.value];
	initbubbles();
	} // PrintSearchOptionsAbrev



	// Set a search options als radio buttons value
	function InitSearchOptions(){
		//f = document.forms["rain_su"];
		//rso = document.getElementsByName("edit-orderby");   // Todo: Test in MS IE
		//rso[1].checked = true
	};




	// Druckt ein Schild mit den aktuellen Query Modes (and, or, rpn, ...) 
	// funktionell analog zu PrintSearchOptionsAbrev
	function PrintQueryModeAbrev(){
		// labels for Query Modes:
		var sol = [ 
			'',      'AND',           'OR',              'smart',             'literal',       'RPN', 'infix' 
		] 

		// dazu passend:
		var TIPS= [ 
			'',
			'And: Only documents are found, which contains <b>all</b> of your search words or phrases',

			'Or: Only documents are found, which contains at least <b>one</b> of your search words or phrases',

			'Smart: finds documents, which contain <b>all</b> search words, or -if nothing found-, ' +
				'documents, which contain <b>as much as possible</b> search words. ' ,

			'Literal: document must contain exactly this phrase',

			'Reverse Polish Notation (postfix)<br>' +
				'In RPN the <a href="javascript:return (void);" class="bubble" ibu_btext="sobu_rpn_operand">' +
				'operands</a> precede the '+
				'<a href="javascript:return (void);" class="bubble" ibu_btext="sobu_rpn_operator_binary">binary</a> or ' +
				'<a href="javascript:return (void);" class="bubble" ibu_btext="sobu_rpn_operator_unary">unary</a>' +
				' operator thus dispensing with the need for parentheses.',

			'Infix have an optional postfix unary operator and/or an optional field specification prefix: <br>' +
				'<pre>[&lt;Field&gt;/]&lt;Term&gt;[&lt;Op&gt;][:&lt;Weight&gt;] </pre>'+
				'<a href="/node/125">more...</a> '
		]


		f = document.forms["rain_su"];
		//rso = document.getElementsByName("edit-qmode");   // Todo: Test in MS IE
		rso = document.getElementById("edit-qmode");   // Todo: Test in MS IE


		// /* code fuer qmode als radio buttons implementiert */
		//var n=0;
		//for (var i=0; i <   rso.length;  i++ ) {
	//		if (rso[i].checked == true) {
//				n = i;
 //     }
		//}
	//soa=document.getElementById("SearchQueryModeAbrev").innerHTML=  sol[rso[n].value];


	// an 2 Stellen setzen wir sichtbar einen Hinweis aus den nun eingestellten Query Mode:
	document.getElementById("SearchQueryModeAbrev").innerHTML=  sol[rso.value];
	document.getElementById("tip_qm").innerHTML=  TIPS[rso.value];

	// Die Elemente SearchOueryModeAbrev hat nun ggf. neue <a> drin, die muessen ueber
	// initbubbles  jetzt neu mit bubble sensitivitaet versehen werden:
	initbubbles();
	} // PrintQueryModeAbrev



	// Opens another window
	function wopen( url, name ){
		window.open( url, name,  windowFeatures );
	}


	function OverBubble (){
		//window.clearTimeout( BubbleTimeoutId )
		document.removeEventListener( 'mouseover', hidebubble_delay , true )
	}

	function OutBubble (){
		//window.clearTimeout( BubbleTimeoutId )
		document.addEventListener( 'mouseover', hidebubble_delay , true )
	}

	function fun(){
		alert('fun')
	}




	/*
	 * bubble: Sprechblase mit Erlaeuterungen
	 */


// el: bubble div element, das wir aufleuchten lassen wollen
function displaybubble(e ){
	// pel ist das element, das den Event "bubble anzeigen" ausgeloest hat
	switch (browser){
		case  'mozilla':
			pel=e.target;
			break;
		case 'ie':
			pel=e.srcElement;
			break;
		default:
			break;
	}

	//alert(pel)
	// el ist der bubble
	el = document.getElementById("bubbletext")
	bubbleisvisible=1
	switch (browser) {
		case 'mozilla':
			vmitte= window.innerHeight/2
			break;
		case 'ie':
			vmitte= e.offsetY + 20 +'px'
			break;
		default:
			break;
	};
	// alert( e.clientY + ', ' + vmitte)
	if (e.clientY < vmitte  ) {
		el.innerHTML = bu_prefix11 + bu_prefix + sobu_text [ pel.attributes['ibu_btext'].value ] + bu_suffix11
	} else {
		el.innerHTML = bu_prefix7 + bu_prefix + sobu_text [ pel.attributes['ibu_btext'].value ]  + bu_suffix7
	}

	//window.clearTimeout( BubbleTimeoutId )
//	el.addEventListener( 'mouseover', OverBubble, true )
//	el.addEventListener( 'mouseout', OutBubble, true )

	// Header Balken:
	// Versuch fuer mouse drag im Bubble Header Balken 
	buhead=el.firstChild
	switch (browser ) {
		case 'mozilla':
			//buhead.addEventListener( 'mousedown', mdrag, false )
			break;

		case 'ie':
			//buhead.attachEvent( 'onmouseup', DetachFromMouse )
			//buhead.attachEvent( 'onmousedown', AttachToMouse )
			break;

		default:
			break;
	}

	// bubble head muss als erstes ein Kindelement haben, auf das man klickt und
	// damit den bubble ausmacht, z.B. ein [x]-Image
	//buheadclose_btn=buhead.firstChild
	buheadclose_btn= document.getElementById("btn_BubbleClose")
	if ( buheadclose_btn ){
		switch (browser){
			case 'mozilla':
				buheadclose_btn.addEventListener( 'click', hidebubble, false )
				break;
			case 'ie':
				buheadclose_btn.attachEvent( 'onclick', hidebubble )
				break;
			default:
				break;
		}
	}


	x = getOffsetLeft( pel ) + pel.clientWidth/2
	y = getOffsetTop( pel )

	if ( e.clientY < vmitte ) {
		y += 14
	} else {
		y =  y - el.offsetHeight + 10
	}

	switch (browser) {
		case 'mozilla' :
			el.style.left= x +  "px";
			el.style.top= y -3 +  "px";
			el.style.visibility="visible";
			e.preventDefault()
			break;
	
		case 'ie':
			el.style.left= x +  "px"
			el.style.top= y +  "px"
			el.style.visibility="visible"
			break;
	}
	return false
}






function AttachToMouse(e){
	switch (browser) {
		case 'mozilla':
			pel=e.target.parentNode.parentNode
			pel.addEventListener( 'mousemove', mdrag, false)
			break;

		case 'ie':
			pel=e.srcElement.parentNode.parentNode
			pel.attachEvent( 'onmousemove', mdrag ) 
			break;

		default:
			break;
	}
} 


function DetachFromMouse(e){ 
	switch (browser){
		case 'mozilla':
			pel=e.target;
			break;
		case 'ie':
			pel=e.srcElement
			break;
		default:
			break;
	}
	pel.removeEventListener( 'mousemove', mdrag, false)
}

  // Versuch mit mouse drag --experimentell--
function mdrag(e)
{
	switch (browser) {
		case 'mozilla':
			//el=e.target
			el = document.getElementById("bubbletext")
			if (e.type =='mousedown'){
				el.style.left=pageXOffset+e.clientX-50+"px"
				el.style.top=pageYOffset+e.clientY-10 + "px"
			}
			break;

		case 'ie':
			el=e.srcElement
			el.style.left=iebody().scrollLeft+event.clientX
			el.style.top=iebody().scrollTop+event.clientY
			break;
	
		default:
			break;
	}
	return false
} // mdrag



	// bubble folgt der maus
function followmouse(e){
	el = document.getElementById("bubbletext")
	switch ( browser ) {
		case 'mozilla':
			el.style.left=pageXOffset+e.clientX+18+"px"
			el.style.top=pageYOffset+e.clientY-22 + "px"
			break;

		case 'ie':
			el.style.left=iebody().scrollLeft+event.clientX
			el.style.top=iebody().scrollTop+event.clientY
			break;
	
		default:
			break ;
	}

	return false
} // followmouse




function hidebubble_delay(){
	BubbleTimeoutId= window.setTimeout( hidebubble, 4000 )
}


function hidebubble(){
	
	el = document.getElementById("bubbletext")
	if (typeof el!="undefined" && bubbleisvisible){
		el.style.visibility="hidden"
		bubbleisvisible=0
	}
}


// fuer alle <a> , die class bubble sind, registrieren wir einen bubble
function init(){
	// Wir brauchen ein <div id="bubbletext" class="bubble">, also erzeugen wir es hier
	bdiv = document.createElement("div")
	bdiv.setAttribute("id", "bubbletext")	
	bdiv.setAttribute("class", "bubble")	


/* MSIE Problem: mit document.body ...
	document.body.appendChild( bdiv )
*/

	initbubbles()
}

function initbubbles(){
	switch (browser){
	case 'mozilla':
		document.addEventListener( 'click', hidebubble, false )
		break;

	case 'ie':
		document.attachEvent( 'onclick', hidebubble )
		break;

	default:
		break;
	}; 

 	var anchors = document.getElementsByTagName('a')
	for (i = 0 ; el = anchors[i]; i++ ){
		if ( el.className == 'bubble'  ){
			switch ( browser ) {
				case 'mozilla':
					el.addEventListener( 'mouseover', displaybubble, false )
					break;
				case 'ie':
					el.attachEvent( 'onmouseover', displaybubble )
					break;
				default:
					break;
			};
		}
	}


	//bubble_el=  document.getElementById('bubble')
	//bubble_el.addEventListener( 'mouseover', displaybubble, false )

}


/**
 * Clickless Spiele:
 *  Wenn Text markiert wird, dann wird ein im Text vorhandenes <div id="n" > ... </div> visible.
 *  und zeigt darinnen ein Such-REsultat mit dem markierten String als query
 *  Das <div id="n"> .. muss ggf. in die Drupalseiten generiert werden.
 **/



	var old=String()
  var http_request ;
	var eventY = 100 ; 
	var intervalID   ;
	var tempo = 1300 ;

	function GetEventY( e ){
		if ( e.clientY <  window.innerHeight/2 ){
			eventY = e.clientY + 30
		} else {
			eventY = e.clientY - 330 
		}
	}
	
	function MouseOverResults( e ){
		window.clearInterval( intervalID )
	}

	function MouseOutResults( e ){
		intervalID = window.setInterval( fsel, tempo )
	}


	function _init(){
		if (window.XMLHttpRequest) { // Mozilla, Safari, ...
			http_request = new XMLHttpRequest();
		//	http_request.overrideMimeType('text/xml')
		} else if (window.ActiveXObject) { // IE
			http_request = new ActiveXObject("Microsoft.XMLDOM")
		}

		switch ( browser )  {
		case 'mozilla':
			document.addEventListener('mouseup' , GetEventY, false )
			break;
		case 'ie':
			document.attachEvent('onmouseup' , GetEventY )
			break;
		default:
			break;
		}
	}   // _init()


_init()



  /*
   * fsel: Falls text markiert, wird der zum clickless Server per ajax geschickt und
   * das result wird ins <div id="n"> kopiert und auf visible geschaltet
   * Kein Arg, weil wir die function via setInterval registrieren und da is bei MS IE
   * keine args uebergabe moeglich
   */
	function fsel() {
		switch ( browser ) {
			case 'mozilla':
				query = this.getSelection().toString()
				break;

			case 'opera':
				/* query = this.getSelection().toString() */ /* opera haengt leicht */
				break;


			case 'ie':
				sel = document.selection
        if (sel.type == 'Text'){
          query = sel.createRange().text
        } else {
          query = ''
        }   
        break;

			default:
				query = ''
				break;
		}
		var re = /(\W+$)|(\n)/
		http_request.onreadystatechange = readresult ;
		var n = document.getElementById("n");
		if ( ! n ) { return }
		if ( browser == 'opera'){
			n.style.visibility = 'hidden'
		};
		//n.style.top = window.innerHeight-200 +"px"
		
		var database = n.getAttribute('ibdbname')
		var limit    = n.getAttribute('limit')
		n.style.top = eventY + "px" 
		if ( query ) {
			n.style.visibility="visible"
			v = query.replace(re, '')
			if ( v != old ){
				http_request.open('POST', 'http://' + window.location.host + '/cgi-bin/clickless' , true )
				http_request.setRequestHeader('Cache-Control', 'no-cache')
				http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
				http_request.send(  'limit=' + limit + '&database='+ database + '&q='+escape(v)  )
				//http_request.send(  'limit=5&q='+escape(v)  )
				old = v
			}

			switch ( browser ){
			case 'mozilla':
				n.addEventListener('mouseover' , MouseOverResults, false )
				n.addEventListener('mouseout' , MouseOutResults, false )
				break;
			case 'ie':
				n.attachEvent('onmouseover' , MouseOverResults)
				n.attachEvent('onmouseout' , MouseOutResults)
				break;
			default:
				break;
			}

		} else {
			// wenn nix selektiert, dann keine resultbox zeigen
			//n.style.border="10px solid white";
			n.style.visibility="hidden"
		
		}
	}


	function HideDiv(e){
	// wenn e ein mausclick, dann verberge das <div ...> das in der Headline den Close-Btn enthaelt
		var targ
    if (!e) var e = window.event
    if (e.target) targ = e.target
    else if (e.srcElement) targ = e.srcElement
    if (targ.nodeType == 3) { // defeat Safari bug
			targ = targ.parentNode
		}
		n = document.getElementById('n')
		n.style.visibility="hidden"

	}


	function readresult(){
		var resultfield  =document.getElementById("n")
		resultfield.innerHTML = 'Searching... ' 
		if (http_request.readyState == 4) {
			// Ersetze den Text im Block durch die AJAX response:
			if ( http_request.responseXML) {
				if (http_request.status == 200) {
					//alert(  http_request.responseText )
					var xmldoc = http_request.responseXML
					var records = xmldoc.getElementsByTagName('record')
					var totalentries = xmldoc.getElementsByTagName('totalentries').item(0)
					var query_summary= xmldoc.getElementsByTagName('query_summary').item(0)
					t = '<table class="summary"><tr>'
					if ( query_summary ){
						t += '<td>Query: ' + query_summary.firstChild.data + '</td>'
					}
					if ( totalentries ){
						t += '<td align="right">' +totalentries.firstChild.data   +'</td><td style="background: #d3d3d3; font-weight: bold; text-align: center; width: 20px; padding: 2px; border: 1pt ridge black; color: black;" id="nhide" onclick="HideDiv(event)"><img src="http://ibu.de/images/close_btn.png"></td>'
					}
					t += '</tr></table>'


					var recordnr = 0	
					var title = ''	
					var description = ''	
					var link = ''	
					var limit = ''	

					for (var i = 0; i < records.length; i++){
						record=records[i]
						s=''
						elements = record.getElementsByTagName('*')

						// ueber die Elemente eines Records: recordnr, title, description, link:
						for ( var j=0; j< elements.length; j++ ){
							el = elements[j]
							t0 =  ''
							if ( el.hasChildNodes() ){
								children = el.childNodes
								for ( var k=0; k < children.length; k++ ){
									t0 +=  children[k].data + "\n"
								}
							}

							s +=  el.nodeName + '='  + t0 + "\n" 
							//alert (',' + el.nodeName + ',')
							if ( el.nodeName == 'title' ){ title = t0 }
							l=200
							while (t0.charAt(l) != ' ' && l>0 ){ l-- }
							//alert(l)
							if ( el.nodeName == 'description' ){ description= t0.substr(0,l) + '...' }
							if ( el.nodeName == 'recordnr' ){ recordnr = t0 }
							if ( el.nodeName == 'link' ){ link= t0 }
							if ( el.nodeName == 'limit' ){ limit= t0 }
						}
						t += '<div class="title"><a href="' + link + '">' +title+ '</a></div><div class="description">' + description + '</div>';
					}

				} else {
					t = ''
				}
			} else {
				t = ''
			}
			if ( t ) {
				resultfield.innerHTML = t 
			} else {
				resultfield.style.visibility = 'hidden'
			}
		} else {
			// still not ready
		}
	};  // readresult



	//intervalID = window.setInterval(fsel, tempo, window ) 
	// MS IE kann an vCode keine args uebergeben 
	// iTimerID = window.setInterval(vCode, iMilliSeconds [, sLanguage])
	intervalID = window.setInterval(fsel, tempo ) 



/* 
 * Suchresultate zu Shakespeare XML mit AJAX  ergaenzen 
 */

function SetText(targetEl, s ){
	//alert('test: ' +targetEl +'. ' + s);
	targetEl.innerHTML = '<pre>' + s.replace(/</g, '&lt;').replace(/>/g, '&gt;') + '</pre>'
}


/* 
 * switchtr: collapsiert / uncollapsiert eine Tabellen TR mit der "id"
 * args:
 * id: HTML Id einer <TR>, die auf- oder zugemacht wird, das erste <TD> darinnen -wenn leer-
 * mit Text gefuellt wird
 */
function switchtr( id, database, fc0, fc1 )
{


	tr=document.getElementById(id);
	//alert (tr.style.visibility.length + ' . ' +  tr.style.visibility)
	td=tr.firstChild
	if ( td.innerHTML.length < 1 ){
		q= fc0 + '-' + fc1

		var targetEl = td
		http_request.onreadystatechange = function(){
				 if(http_request.readyState == 4 && http_request.status == 200) {
					// so far so good
					if(http_request.responseText != null && http_request.responseText ){
					 // success!
					 SetText(targetEl, http_request.responseText);
					} else {
					 SetText(targetEl, 'no content' );
					}
				 } else if (http_request.readyState == 4 && http_request.status != 200) {
					// fetched the wrong page or network error...
					SetText(targetEl, 'fetched the wrong page or network error...');
				 }
				}

		// ueber offset wird angegeben, wieviele Stufen in der Feldhierarchie vom Hit aus nach oben 
		// zu wandern ist, bis wir anzeigen: z.B. bei SHAKESPEARE 1= line->speech, 2= line->SCENE

		http_request.open('GET', '/cgi-bin/getfield?database=' +database+ '&offset=1&q=' +q , true)

		//http_request.open('GET', 'http://ibu.de/misc/test.xml' )
		http_request.send(null);
	}

	if (tr.style.visibility.length>0 &&  tr.style.visibility=='visible' ){
		tr.style.visibility='collapse'
	} else {
		tr.style.visibility='visible'
	}

} // switchtr


