function clearText(thefield)
{
	if (thefield.defaultValue == thefield.value) thefield.value = ""	
} 						


/* Pop up malarky */

	function raw_popup(url, target, features) {
		// pops up a window containing url optionally named target, optionally having features
		if (isUndefined(features)) features = _POPUP_FEATURES;
		if (isUndefined(target  )) target   = '_blank';
		var theWindow = window.open(url, target, features);
		theWindow.focus();
		return theWindow;
	}
	
	function link_popup(src, features) {
		// to be used in an html event handler as in: <a href="..." onclick="link_popup(this,...)" ...
		// pops up a window grabbing the url from the event source's href
		return raw_popup(src.getAttribute('href'), src.getAttribute('target') || '_blank', features);
	}
	
	function event_popup(e) {
		// to be passed as an event listener
		// pops up a window grabbing the url from the event source's href
		link_popup(e.currentTarget);
		e.preventDefault();
	}
	
	function event_popup_features(features) {
		// generates an event listener similar to event_popup, but allowing window features
		return function(e) { link_popup(e.currentTarget, features); e.preventDefault() }
	}

	// defining default features
var _POPUP_FEATURES = 'location=0,statusbar=0,menubar=0,width=532,height=324';
	

listen('load', window, function() {
	listen('click', 'popup-text', event_popup);
	listen('click', 'popup-image', event_popup);
	mlisten('click', getElementsByClass('popup','a'), event_popup);
});


/* library functions */

	// ARRAY EXTENSIONS
	
	if (!Array.prototype.push) Array.prototype.push = function() {
		for (var i=0; i<arguments.length; i++) this[this.length] = arguments[i];
		return this.length;
	}
	
	Array.prototype.find = function(value, start) {
		start = start || 0;
		for (var i=start; i<this.length; i++)
			if (this[i]==value)
				return i;
		return -1;
	}
	
	Array.prototype.has = function(value) {
		return this.find(value)!==-1;
	}

	// FUNCTIONAL
	
	function map(list, func) {
		var result = [];
		func = func || function(v) {return v};
		for (var i=0; i < list.length; i++) result.push(func(list[i], i, list));
		return result;
	}
	
	function filter(list, func) {
		var result = [];
		func = func || function(v) {return v};
		map(list, function(v) { if (func(v)) result.push(v) } );
		return result;
	}
	

	// DOM
	
	function getElem(elem) {
		if (document.getElementById) {
			if (typeof elem == "string") {
				elem = document.getElementById(elem);
				if (elem===null) throw 'cannot get element: element does not exist';
			} else if (typeof elem != "object") {
				throw 'cannot get element: invalid datatype';
			}
		} else throw 'cannot get element: unsupported DOM';
		return elem;
	}
	
	function hasClass(elem, className) {
		return getElem(elem).className.split(' ').has(className);
	}
	
	function getElementsByClass(className, tagName, parentNode) {
		parentNode = !isUndefined(parentNode)? getElem(parentNode) : document;
		if (isUndefined(tagName)) tagName = '*';
		return filter(parentNode.getElementsByTagName(tagName),
			function(elem) { return hasClass(elem, className) });
	}
	
	// DOM EVENTS
	
	function listen(event, elem, func) {
		elem = getElem(elem);
		if (elem.addEventListener)  // W3C DOM
			elem.addEventListener(event,func,false);
		else if (elem.attachEvent)  // IE DOM
			elem.attachEvent('on'+event, function(){ func(new W3CDOM_Event(elem)) } );
			// for IE we use a wrapper function that passes in a simplified faux Event object.
		else throw 'cannot add event listener';
	}
	
	function mlisten(event, elem_list, func) {
		map(elem_list, function(elem) { listen(event, elem, func) } );
	}
	
	function W3CDOM_Event(currentTarget) {
		this.currentTarget  = currentTarget;
		this.preventDefault = function() { window.event.returnValue = false }
		return this;
	}
	
	// MISC CLEANING-AFTER-MICROSOFT STUFF
	
	function isUndefined(v) {
		var undef;
		return v===undef;
	}




