/*
 * Utility functions for tabulator
 */

function output(o) {
    var k = document.createElement('div')
    k.textContent = o
    document.body.appendChild(k)
}

// emulates scheme filter (remove elements from list that do not fulfill func)
function filter(func, list) {
    //tdebug("entered filter with list length=" + list.length);
    var output = [];
    for (var elt in list) {
        //tdebug("elt=" + list[elt] + ", true? " + func(list[elt]));
        if (func(list[elt])) output.push(list[elt]);
    } //construct output
    //tdebug("exiting filter with list length=" + output.length);
    return output;
}

// emulates scheme map (apply a function to each element of an array, return
// a new array)
function map (func, list) {
    //tdebug("entered map with list=" + list.join(", "));
    var output = [];
    for (var i in list)  //works on assoc? i hope so
        output[i] = func(list[i]);
    return output;
}

include = (function() {
	       
	       var includeIndex = []
	       
	       // include inserts a URI as a javascript
	       function include(uri) {
		   var js = document.createElement('script')
		   js.setAttribute('language', 'javascript')
		   js.setAttribute('type','text/javascript')
		   js.setAttribute('src',uri)
		   document.getElementsByTagName('head')[0].appendChild(js)
		   includeIndex[uri] = true
		   return
	       }
	       
	       // include once ensures that the file won't be included more
	       // than once
	       function includeOnce(uri) {
		   if (typeof includeIndex[uri] != 'undefined') {
		       return
		   }
		   include(uri)
		   return
	       }
	       
	       return [include, includeOnce]
	   })()

includeOnce = include[1]
include = include[0]

/**
 * A standard way to create XMLHttpRequest objects
 * @returns an XMLHttpRequest object
 */
function XMLHTTPFactory() {
    if (window.XMLHttpRequest) {
	try {
	    return new XMLHttpRequest()
	} catch (e) {
	    return false
	}
    }
    else if (window.ActiveXObject) {
	try {
	    return new ActiveXObject("Msxml2.XMLHTTP")
	} catch (e) {
	    try {
		return new ActiveXObject("Microsoft.XMLHTTP")
	    } catch (e) {
		return false
	    }
	}
    }
    else {
	return false
    }
}




