var timer = null ;
var request = null ;
var lastQuery = null ;
var oldStatus = "" ;

// ------------------------------------------------------------------------
// Explorer/Mozilla compatibility stuff

function createXMLHttpRequest() {
    try { return new ActiveXObject("Msxml2.XMLHTTP");    } catch(e) {}
    try { return new ActiveXObject("Microsoft.XMLHTTP"); } catch(e) {}
    try { return new XMLHttpRequest();                   } catch(e) {}
    alert("XMLHttpRequest not supported");
    return null;
}

function byTag(prefix, tag) {
    if (document.all) return document.all.tags(tag) ;
    return document.getElementsByTagName(prefix+":"+tag) ;
}

function byId(id) {
    return document.getElementById(id) ;
}

// ------------------------------------------------------------------------

function toggleBibTeX(key) {
    var item = byId(key) ;
    if (item.style.display!="block") item.style.display = "block" ;
    else item.style.display = "none" ;
}

// ------------------------------------------------------------------------

function QueryString(q) {
    this.keyValuePairs = new Array() ;
    if (q.length > 1) {
	   chunks = q.substring(1, q.length).split("&") ;
	   for (var i=0; i<chunks.length; i++) this.keyValuePairs[i] = chunks[i] ;
     }
    this.get = function(key, defval) {
	   for(var j=0; j<this.keyValuePairs.length; j++) {
		  pair = this.keyValuePairs[j].split("=") ;
		  if (pair[0] == key) return pair[1] ;
	   }
	   return defval ;
    }
}

function trim(str) {
    return str.replace(/^(\s+)?(.*\S)(\s+)?$/, '$2') ;
}

// ------------------------------------------------------------------------

function bvStateChange() {
    /* 0=UNINITIALIZED, 1=LOADING, 2=LOADED, 3=INTERACTIVE, 4=COMPLETED */
    if (request==null || request.readyState!=4) return ;

    if (request.status!=200) {
	   byId("bvStatus").innerHTML = oldStatus = "Server error" ;
	   byId("bvResults").innerHTML = request.statusText+" ("+request.status+")" ;
	   request = null ;
	   return ;
    }

    bibFiles = byId("bvSources").value ;
    query = request.getResponseHeader("Content-Location") ;
    duration = request.getResponseHeader("bibview-completion-time") ;
    nbmatches = request.getResponseHeader("bibview-nbmatches") ;
    nbrefs = request.getResponseHeader("bibview-nbrefs") ;
    command = request.getResponseHeader("bibview-command") ;
    if (nbmatches==1)
	   info = "One result" ;
    else if (nbmatches>1)
	   info = nbmatches+" results" ;
    else
	   info = "No result" ;
  //  info = info + " ("+nbrefs+" references, "+duration+" seconds)." ;
    querylink = byId("bvQueryLink") ;
    if (querylink!=null)
	   querylink.href = query ;
    // info = info + ' <a href="'+query+'">Bookmark this query</a>.' ;
    byId("bvStatus").innerHTML = oldStatus = info ;
    if (command=="filter") {
	   allrefs = byTag("bib","ref") ;
	   if (allrefs.length==0) {
		  byId("bvStatus").innerHTML = oldStatus = "Dynamic filtering failed. Sorry..." ;
		  return ;
	   }
	   for (var i = 0; i<allrefs.length; i++) allrefs[i].style.display = "none" ;
	   okrefs = request.responseText.split("\n") ;
	   for (var i=0; i<okrefs.length; i++)
		  try {
			 id = "bibref-"+okrefs[i] ;
			 byId(id).style.display = "block" ;
		  } catch (e) {
			 // alert(e+"\n"+id) ;
		  }
    } else {
	   byId("bvResults").innerHTML = request.responseText ;
    }
    title = "Aviz Publications";
    filter = byId("bvFilter").value ;
    if (filter!="") title = title + " (" + filter + ")" ;
    document.title = title ;
}

function bvRequest() {
    query = byId("bvFilter").value ;
    if (query!=lastQuery) {
	   byId("bvStatus").innerHTML = "Waiting for server response..." ;
	   if (query=="" || lastQuery==null) cmd = "load" ; else cmd = "filter" ;
	   lastQuery = query ;
	   request = createXMLHttpRequest() ;
	   request.onreadystatechange = bvStateChange ;
	   args = "c="+cmd
		+"&s="+byId("bvSources").value
		+"&q="+query
		+"&g="+byId("bvSort").value
		+"&k=" + byId("bvShowkey").value ;
	   request.open("GET", "bibview/bibview.cgi?"+args, true) ;
	   request.send("") ;
	   timer = 0 ;
    }
}

function bvCallback(e) {
    var characterCode ;
    if (e && e.which) characterCode = e.which ; else characterCode = e.keyCode ;
    if (characterCode == 13) return false ;
    if (timer) clearTimeout(timer) ;
    if (request!=null) request.abort() ;
    byId("bvStatus").innerHTML = oldStatus ;
    timer = setTimeout("bvRequest()",200) ;
    return true ;
}

function bvSortByTypeCallback(e) {
    s = byId("bvSort") ;
    s.value = "type" ;
    lastQuery = null ;
    bvRequest() ;
    return true ;
}

function bvSortByAuthorCallback(e) {
    s = byId("bvSort") ;
    s.value = "author" ;
    lastQuery = null ;
    bvRequest() ;
    return true ;
}

function bvSortByDateCallback(e) {
    s = byId("bvSort") ;
    s.value = "date" ;
    lastQuery = null ;
    bvRequest() ;
    return true ;
}

window.onload = function() {
    qs = new QueryString(location.search) ;

    bibFiles = byId("bvSources") ;
    files = unescape(qs.get("s","")) ;
    if (files!="") bibFiles.value = files ;

    bibSort = byId("bvSort") ;
    sort = unescape(qs.get("g","")) ;
    if (sort!="") bibSort.value = sort ;

    bibShowkey = byId("bvShowkey") ;
    bibShowkey.value = unescape(qs.get("k","False")) ;

    bibFilter = byId("bvFilter") ;
    bibFilter.value = unescape(qs.get("q","")) ;
    bibFilter.onkeypress = bvCallback ;

    helper = byId("bvSortByType") ;
    if (helper!=null)
	   helper.onclick = bvSortByTypeCallback ;

    helper = byId("bvSortByAuthor") ;
    if (helper!=null)
	   helper.onclick = bvSortByAuthorCallback ;

    helper = byId("bvSortByDate") ;
    if (helper!=null)
	   helper.onclick = bvSortByDateCallback ;

    bvRequest() ;
}
