var validemail = /^[a-z0-9_\.\-+]+@[a-z0-9]([a-z0-9\.\-_]*[a-z0-9])?\.[a-z]{2,4}$/;

/* Cookies (from w3schools.com) */
function setCookie(c_name,value,expiredays) {
	var exdate=new Date();
	exdate.setDate(exdate.getDate()+expiredays);
	document.cookie=c_name+ "=" +escape(value)+ ((expiredays==null) ? "" : ";expires="+exdate.toUTCString());
}

function getCookie(c_name) {
	if (document.cookie.length>0) {
		c_start=document.cookie.indexOf(c_name + "=");
		if (c_start!=-1) {
			c_start=c_start + c_name.length+1;
			c_end=document.cookie.indexOf(";",c_start);
			if (c_end==-1) c_end=document.cookie.length;
			return unescape(document.cookie.substring(c_start,c_end));
		}
	}
	return "";
}


// Wrapper function to ensure compatibility with older browsers
function getElement(name) {
	return document.getElementById?document.getElementById(name):document.all[name];
}
function getElementsByClass(searchClass,node,tag) {
	var classElements = new Array();
	if ( node == null )
		node = document;
	if ( tag == null )
		tag = '*';
	var els = node.getElementsByTagName(tag);
	var elsLen = els.length;
	var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
	for (i = 0, j = 0; i < elsLen; i++) {
		if ( pattern.test(els[i].className) ) {
			classElements[j] = els[i];
			j++;
		}
	}
	return classElements;
}
// Controls the styling of buttons
function highlight(button) {
	var style = button.style;
	style.color = '#000088';
}
function unhighlight(button) {
	var style = button.style;
	style.color = '#000000';
}

function trim (str) {
	str = str.replace(/^\s+/, '');
	for (var i = str.length - 1; i >= 0; i--) {
		if (/\S/.test(str.charAt(i))) {
			str = str.substring(0, i + 1);
			break;
		}
	}
	return str;
}

// Toggles all checkboxes with a given prefix to the provided checked value
function toggleall(prefix, checked) {
	var els = document.getElementsByTagName('input');
	var elsLen = els.length;
	var pattern = new RegExp("^"+prefix+"_");
	for (i = 0; i < elsLen; i++) {
		if (pattern.test(els[i].name)) {
			els[i].checked = checked;
		}
	}
}

// When focusing on a text input, clears it if it matches the provided value
function focuson(input, value) {
	if (input.value == value) input.value = '';
}

// When leaving focus on a text input, if it's empty it becomes the provided value
function focusoff(input, value) {
	if (trim(input.value) == '') input.value = value;
}

/* AJAX
 * It is assumed that all functions that make use of these AJAX functions are called in such a way as to fail gracefully
 * That means the expectation is for a failed AJAX call to be designed to automatically submit to an HTML or PHP page
 * As such, all on-screen reporting has been removed
 */

function makeXMLHTTP() {
	var httpr = false;
	if (window.XMLHttpRequest) { // Mozilla, Safari,...
		httpr = new XMLHttpRequest();
		if (httpr.overrideMimeType) {
			// set type accordingly to anticipated content type
			//httpr.overrideMimeType('text/xml');
			httpr.overrideMimeType('text/html');
		}
	} else if (window.ActiveXObject) { // IE
		try {
			httpr = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
				httpr = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e) {}
		}
	}
	if (!httpr) {
		return false;
	}
	return httpr;
}

// Check whether we can do AJAX. Testing once at the beginning will save time on mouseclicks, and make the graceful failure a little more seamless
var http_request = false;
var canAJAX = false;
function testAJAX() {
	http_request = false;
	http_request = makeXMLHTTP();
	if (http_request) return true;
	else return false;
}
if (getCookie('canAJAX')) {
	canAJAX = getCookie('canAJAX');
} else {
	canAJAX = testAJAX();
	setCookie('canAJAX',canAJAX);
}

// POST submissions, modified from http://www.captain.at/howto-ajax-form-post-request.php
function makePOSTRequest(url, parameters, whereto) {
	if (!canAJAX) return false;
	http_request = false;
	http_request = makeXMLHTTP();
	if (!http_request) {
		return false;
	}

	eval ("http_request.onreadystatechange = "+whereto+";");
	http_request.open('POST', url, true);
	http_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	http_request.setRequestHeader("Content-length", parameters.length);
	http_request.setRequestHeader("Connection", "close");
	http_request.send(parameters);
	return true;
}

// GET submissions
function makeGETRequest (url, parameters, whereto) {
	if (!canAJAX) return false;

	// Try to create the AJAX object
	http_request = false;
	http_request = makeXMLHTTP();
	if (!http_request) {
		return false;
	}

	eval ("http_request.onreadystatechange = "+whereto+";");
	http_request.open("GET",url+"?"+parameters,true);
	http_request.send(null);
	return true;
}


