/* nazi-size restrained stripped down js-lib */
function log() {
    /*
    if (typeof(console) != "undefined" && typeof(console.log) == "function") {
        console.log.apply(this, arguments);
    } else {
        window.alert.apply(this, arguments);
    }
    */
}
function stopEvent(e) {
    if (e.preventDefault) {
        e.preventDefault();
    } else {
        e.returnValue = false;
    }
    
    if (e.stopPropagation) {
        e.stopPropagation();
    } else {
        e.cancelBubble = true;                                
    }
    return false;
}
function E(obj, event, cb) {
    this.obj = obj;
    this.event = event;
    this._cb = cb;
    this.cb = function(e) {
        if (!e) {
            e = window.event;
        }
        log("calling propper cb for event", e.type, this.obj);
        return this._cb.apply(this, [e]);
    };
};
function _listener(e) {
    return function() {
        return e.cb.apply(e, arguments);
    };
}
function connect(obj, event, cb) {
    /*
    if (!event.search(/^on/)) {
        log("only DOM-events supported");
    }
    */
    if (typeof(obj) == "string") {
        //Tlog("looking up object");
        obj = document.getElementById(obj);
    }
    if (typeof(obj) == "undefined" || obj == null) {
        return;
    }
/*    log("connecting", event, " to ", obj); */
    
    var e = new E(obj, event, cb);
    var listener = _listener(e);
    if (obj.addEventListener) {
        obj.addEventListener(event.substr(2), listener, false);
    } else {
        obj.attachEvent(event, listener);
    }
    return e;
}
/* Borrowed loosely from mochikit */
function getElementsByTagAndClassName(tagname, classname, root) {
    if (typeof(tagname) == 'undefined' || tagname === null) {
        tagName = '*';
    }
    if (typeof(root) == 'undefined' || root === null) {
        root = window.document;
    }
    if (typeof(root) != "object") {
        root = document.getElementById(root);
    }
    /* normalization done, yay */
    var childs = root.getElementsByTagName(tagname) || document.all;
    if (typeof(classname) == "undefined" || classname === null) {
        /* We can shortcircuit! */
        return childs; 
    }
    var elements = [];
    for (var i = 0; i < childs.length; i++) {
        var n = childs[i];
        var cls = n.className;
        if (!cls)
            continue;
        
        var classes = cls.split(' ');
        for (var j = 0; j < classes.length; j++) {
            if (classes[j] == classname) {
                elements.push(n);
                break;
            }
        }
    }
    return elements;
}
/* perform an ajax-request. Call cb(xhr) on success, err(error) on failure */
function get(url, query, cb, err) {
    fetch('GET', url, query, cb, err);
}


function fetch(method, url, query, cb, err) {
    var xhr = _get_xhr();
    var qs = _qs(query);
    if (qs != "") {
        url += "?" + qs;
    }
/*    log("fetching url ", url, " with method ", method); */
    /* fetching */
    xhr.open(method, url, true);
    try {
        xhr.onreadystatechange = function() {
            if (xhr.readyState == 4) {
                try {
                    xhr.onreadystatechange = null;
                } catch (e) {
                    /* IE SUCKS apparently */
                    try {
                        xhr.onreadystatechange = function() {};
                    } catch(e) {
                        
                    }
                }
                /* status == 0 for localhost */
                if (xhr.status == 200 || xhr.status == 0) {
                    cb(xhr);
                } else {
                    log("ERROR: ", xhr);
                    err(xhr);
                }
            }
        };
    } catch (e) {
        log("ERROR:", e);
        err(e);
    }
    xhr.send('');
}
/* returns a string with key=value&key2=value2 */
function _qs(query) {
    var qps = new Array();
    for (var property in query) {
        qps.push(property + "=" + query[property]);
    }
    return qps.join('&');
}
/* stolen from MochiKit (http://www.mochikit.com/) */
function _get_xhr() {
    var self = arguments.callee;
    if (!self.XMLHttpRequest) {
        var tryThese = [
            function () { return new XMLHttpRequest(); },
            function () { return new ActiveXObject('Msxml2.XMLHTTP'); },
            function () { return new ActiveXObject('Microsoft.XMLHTTP'); },
            function () { return new ActiveXObject('Msxml2.XMLHTTP.4.0'); },
            function () {
                throw new MochiKit.Async.BrowserComplianceError("Browser does not support XMLHttpRequest");
            }
        ];
        for (var i = 0; i < tryThese.length; i++) {
            var func = tryThese[i];
            try {
                self.XMLHttpRequest = func;
                return func();
            } catch (e) {
                /* pass */
            }
        }
    }
    return self.XMLHttpRequest();
}

