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 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 dlStateChange() {
    /* 0=UNINITIALIZED, 1=LOADING, 2=LOADED, 3=INTERACTIVE, 4=COMPLETED */
    if (request==null || request.readyState!=4) return ;

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

    dlFiles = byId("dlSources").value ;
    query = request.getResponseHeader("Content-Location") ;
    duration = request.getResponseHeader("dl-completion-time") ;
    nbmatches = request.getResponseHeader("dl-nbmatches") ;
    nbrefs = request.getResponseHeader("dl-nbrefs") ;
    if (nbmatches==1)
	   info = "One match" ;
    else if (nbmatches>1)
	   info = nbmatches+" matches" ;
    else
	   info = "No match" ;
    info = info + " ("+nbrefs+" references, "+duration+" seconds)." ;
    info = info + ' <a href="'+query+'">Bookmark this query</a>' ;
    byId("dlStatus").innerHTML = oldStatus = info ;
    byId("dlResults").innerHTML = request.responseText ;
    title = "Videos and demos: " + dlFiles ;
    filter = byId("dlFilter").value ;
    if (filter!="") title = title + " (" + filter + ")" ;
    document.title = title ;
}

function dlRequest() {
    query = byId("dlFilter").value ;
    if (query!=lastQuery) {
	   byId("dlStatus").innerHTML = "Waiting for server response..." ;
	   lastQuery = query ;
	   request = createXMLHttpRequest() ;
	   request.onreadystatechange = dlStateChange ;
	   args = "q="+query+"&s="+byId("dlSources").value ;
	   request.open("GET", "/~roussel/digital-library/metadata/query/dl.cgi?"+args, true) ;
	   request.send("") ;
	   timer = 0 ;
    }
}

function dlCallback(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("dlStatus").innerHTML = oldStatus ;
    timer = setTimeout("dlRequest()",200) ;
    return true ;
}

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

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

    filter = byId("dlFilter") ;
    filter.value = unescape(qs.get("q","")) ;
    filter.onkeypress = dlCallback ;

    dlRequest() ;
}

