// return a reference to a DOM element by ID
function e(id) {
	return document.getElementById(id);
}

// return a reference to a form element by name (within the first form)
function f(name) {
	// modifying to allow for multiple forms (function fails to work as expected in magic)
	var forms = document.forms;

	for (i = 0; i < forms.length; i++) {
		if (typeof(forms[i].elements[name]) != 'undefined') return forms[i].elements[name];
	}
	return {checked:0, disabled:1, selectedIndex:0, options:{0:{value:'', text:''}}};
}

// return or set the display property of a DOM element (accepts element or element ID)
function d(element, display) {
	if (typeof(element) == 'string') element = e(element);
	if (element == null) return false;
	if (arguments.length == 1) return (element.style.display == 'none' ? false : true);
	else element.style.display = display ? '' : 'none';
	// if popupWrapper is being displayed, reposition the popup
	if (d('popupWrapper')) positionPopup();
}

// toggle display of a DOM element (accepts element or element ID)
function toggle(element) {
	if (typeof(element) == 'string') element = e(element);
	if (element == null) return false;
	element.style.display = element.style.display == 'none' ? '' : 'none';
}

// safely set or get an array of classes from an element
function c(element, classes) {
	if (typeof element != 'object') return false;
	if (arguments.length == 2) element.className = classes.join(' ');
	return element.className.split(' ');
}

// return whether or not an element has a named class set
function hasClass(element, className) {
	var classes = c(element);
	for (var i = 0; i < classes.length; i++) if (classes[i] == className) break;
	return i < classes.length;
}

// add a class to an element
function addClass(element, className) {
	var classes = c(element);
	for (var i = 0; i < classes.length; i++) if (classes[i] == className) break;
	classes[i] = className;
	c(element, classes);
	// if popupWrapper is being displayed, reposition the popup
	if (d('popupWrapper')) positionPopup();
}

// remove a class from an element
function removeClass(element, className) {
	var classes = c(element);
	for (var i = 0; i < classes.length; i++) if (classes[i] == className) break;
	delete classes[i];
	c(element, classes);
	// if popupWrapper is being displayed, reposition the popup
	if (d('popupWrapper')) positionPopup();
}

// toggle a class on an element
function toggleClass(element, className) {
	var classes = c(element);
	for (var i = 0; i < classes.length; i++) if (classes[i] == className) break;
	if (i < classes.length) delete classes[i];
	else classes[i] = className;
	c(element, classes);
	// if popupWrapper is being displayed, reposition the popup
	if (d('popupWrapper')) positionPopup();
}

// swap two classes on an element
function swapClasses(element, classNameOne, classNameTwo) {
	var classes = c(element);
	for (var i = 0; i < classes.length; i++) {
		if (classes[i] == classNameOne) classes[i] = classNameTwo;
		else if (classes[i] == classNameTwo) classes[i] = classNameOne;
	}
	c(element, classes);
	// if popupWrapper is being displayed, reposition the popup
	if (d('popupWrapper')) positionPopup();
}

// toggle minimise and maximise on a collapsible element
function toggleCollapsible(element) {
	// swap the minimised and maximised classes
	swapClasses(element.parentNode, 'minimised', 'maximised');
	// detect persistence and session the value
	if (hasClass(element.parentNode, 'persistent')) {
		var form = document.forms[document.forms.length - 1];
		form.elements[0].name = element.parentNode.id + 'Open';
		form.elements[0].value = hasClass(element.parentNode, 'maximised') ? 1 : 0;
		form.submit();
	}
	return false;
}

// get offset of element
function offsetX(element) {
	var x = element.offsetLeft;
	while (element = element.offsetParent) x += element.offsetLeft;
	return x;
}
function offsetY(element) {
	var scrollTop = document.documentElement.scrollTop >= document.body.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop;
	var y = element.offsetTop;
	while (element = element.offsetParent) {
		y += element.offsetTop;
	}
	y -= scrollTop;
	if (e('popupContent')) y -= e('popupContent').scrollTop;
	return y;
}
