//// 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;
	};
}

//// 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;
}

// focus first text form element
function focusFirstTextField() {
//	consoleLog("running focusFirstTextField");
	if (document.forms.length === 0) {
//		consoleLog("no forms: " + document.forms.length);
		return;
	}
	var els = document.forms[0].elements;
	for (var i = 0, len = els.length; i < len; i++) {
		if (els[i].nodeName.match(/^input$/i) && els[i].type === 'text') {
			els[i].focus();
			return;
		}
	}
}

//consoleLog("lib.js loaded!");
//// EOF
