//// BOF

//// make sure we are not in a frame
if (self != top) {
	top.location.href = self.location.href;
}

//// for browser lacking a console
function consoleLog(txt) {
	if (!window.console || !window.console.log) {
		return;
	}
	console.log(txt);
}

//// Ajax setup
function getXmlHttpRequestObject() {
	if (window.XMLHttpRequest) {
		return new XMLHttpRequest();
	} else if(window.ActiveXObject) {
		return new ActiveXObject("Microsoft.XMLHTTP");
	} else {
		alert("Your Browser Sucks!");
	}
}

//// cross-browser event handling
//// http://ejohn.org/projects/flexible-javascript-events/
function addEvent(obj, type, fn) {
	if (obj.attachEvent) {
		obj['e'+type+fn] = fn;
		obj[type+fn] = function(){obj['e'+type+fn](window.event);}
		obj.attachEvent('on'+type, obj[type+fn]);
	} else {
		obj.addEventListener(type, fn, false);
	}
}

function removeEvent(obj, type, fn) {
	if (obj.detachEvent) {
		obj.detachEvent('on'+type, obj[type+fn]);
		obj[type+fn] = null;
	} else {
		obj.removeEventListener(type, fn, false);
	}
}
//// cross-browser event handling

//// compensate for lack of Array.filter support in some browsers
//// https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference:Objects:Array:filter
if (!Array.prototype.filter) {
	Array.prototype.filter = function(fun /*, thisp*/) {
		if (typeof fun !== "function") {
			throw new TypeError();
		}
		var res = new Array();
		var thisp = arguments[1];
		for (var i = 0, len = this.length; i < len; i++) {
			if (i in this) {
				var val = this[i]; // in case fun mutates this
				if (fun.call(thisp, val, i, this))
					res.push(val);
			}
		}
		return res;
	};
}

if (!Array.prototype.forEach) {
	Array.prototype.forEach = function(fun /*, thisp*/) {
		var len = this.length >>> 0;
		if (typeof fun != "function")
			throw new TypeError();

		var thisp = arguments[1];
		for (var i = 0; i < len; i++) {
			if (i in this)
				fun.call(thisp, this[i], i, this);
		}
	};
}

//// library function that returns all elements of a certain 'class'
function getElementsByClass(searchClass, node, tag) {
	var classElements = new Array();
	node = node || document;
	tag = tag || '*';
	if (document.getElementsByClassName) { // FF3
//		consoleLog("getElementsByClassName supported!");
		classElements = node.getElementsByClassName(searchClass);
		if (tag === '*') {
			return classElements;
		} else {
			return classElements.filter(function (elem, index, list) {
				return elem.tagName === tag;
			});
		}
	} else {
//		consoleLog("getElementsByClassName NOT supported!");
		var els = node.getElementsByTagName(tag);
		// an element can have several space-separeted classes
		var pattern = new RegExp('(^|\\\\s)'+searchClass+'(\\\\s|$)');
		for (var i = 0, j = 0, len = els.length; i < len; i++) {
			if (pattern.test(els[i].className)) {
				classElements[j++] = els[i];
			}
		}
	}
	return classElements;
}

//
function findParent(el, tag){
	return el.parentNode.nodeName == tag ? el.parentNode :
		findParent(el.parentNode, tag);
}

function syncGetRequest(url) {
	var req = getXmlHttpRequestObject();
	// false -> synchronous
	req.open('GET', url, false);
	req.send(null);
	if(req.status !== 200 && req.status !== 204) {
		consoleLog("server sent wrong response: " + req.status);
//	} else {
//		consoleLog("req: " + typeof req.status);
	}
}

//// EOF

