function $(id) {
	return document.getElementById(id);
}

function getElementsByClassName(classname, node) {
    if(!node) node = document.getElementsByTagName("body")[0];
    var a = [];
    var re = new RegExp('\\b' + classname + '\\b');
    var els = node.getElementsByTagName("*");
    for(var i=0,j=els.length; i<j; i++)
    if(re.test(els[i].className))a.push(els[i]);
    return a;
}

function error(el, err) {

	var ps = getPreviousSibling(el);
	if(ps.className != 'error') {
		var p = document.createElement('p');
		var errText = document.createTextNode(err)
		p.appendChild(errText);
		p.className = 'error';
		el.parentNode.insertBefore(p, el);
	} else if(ps.innerHTML != err) {
		// already a different error on screen, update it with new error
		ps.innerHTML = err;
	}
	
	return false;
	
}

function getPreviousSibling(n) {
	var x;
	if(n.previousSibling) {
		x = n.previousSibling;
		while (x.nodeType != 1) {
			if(x.previousSibling) {
				x = x.previousSibling;
			} else {
				break;
			}
		}
	}
	return x;
}

function loadGoogleMap(lat, lng) {
	if(GBrowserIsCompatible()) {
		var map = new GMap2($('map'));
		var point = new GLatLng(lat, lng);
		map.setCenter(point, 12);
		map.addOverlay(new GMarker(point));
		map.setUIToDefault();
		map.disableScrollWheelZoom();
	}
}

function validEmail(email) {
    var emailReg = "^[\\w-_\.+]*[\\w-_\.]\@([\\w]+\\.)+[\\w]+[\\w]$";
    var regex = new RegExp(emailReg);
    return regex.test(email); 
}

function clearErrors(el) {
	var errors = getElementsByClassName('error', el);
	var i = errors.length; while (i--) {
		errors[i].parentNode.removeChild(errors[i]);
	}
}

function createXHR() {
    try { return new XMLHttpRequest(); } catch(e) {}
    try { return new ActiveXObject("Msxml2.XMLHTTP.6.0"); } catch(e) {}
    try { return new ActiveXObject("Msxml2.XMLHTTP.3.0"); } catch(e) {}
    try { return new ActiveXObject("Msxml2.XMLHTTP"); } catch(e) {}
    try { return new ActiveXObject("Microsoft.XMLHTTP"); } catch(e) {}
	return null;
}

function twitterify(ret) {

	ret = ret.replace(/(^|[\n ])([\w]+?:\/\/[\w]+[^ \"\n\r\t< ]*)/, "$1<a href=\"$2\" target=\"_blank\">$2</a>");
	ret = ret.replace(/(^|[\n ])((www|ftp)\.[^ \"\t\n\r< ]*)/, "$1<a href=\"http://$2\" target=\"_blank\">$2</a>");
	ret = ret.replace(/@(\w+)/, "<a href=\"http://www.twitter.com/$1\" target=\"_blank\">@$1</a>");
	ret = ret.replace(/#(\w+)/, "<a href=\"http://search.twitter.com/search?q=$1\" target=\"_blank\">#$1</a>");
	
	return ret;
	
}

function handleTwitterResponse(response) {
	var user = response;
	
	// format date
	var parts = user.status.created_at.split(" ");
	// remove year
	parts.pop();
	// remove +0000
	parts.pop();
	// put back together
	var when = parts.join(" ");
	
	// create image
	var img = document.createElement("img");
	img.src = user.profile_image_url;
	img.alt = user.screen_name;
	img.className = "twitpic";
	
	// create links
	var a = document.createElement("a");
	a.href = "http://www.twitter.com/" + user.screen_name;
	var a2 = document.createElement("a");
	a2.href = "http://www.twitter.com/" + user.screen_name;	
	a2.innerHTML = user.screen_name;
	
	// create h2
	var h2 = document.createElement("h2");
	h2.style.margin = "10px";
	
	// create tweet paragraph
	var tweetp = document.createElement("p");
	tweetp.style.clear = "both";
	tweetp.innerHTML = twitterify(user.status.text);
	
	// create small text
	var smallp = document.createElement("p");
	smallp.className = "light";
	smallp.innerHTML = when + " via " + user.status.source;
	
	// inner appends
	a.appendChild(img);
	h2.appendChild(a2);
	
	// hide loader
	g_ajaxLoaders[g_users.position(user.screen_name)].style.display = "none";
	// append to twitterbox
	g_twitterbox.appendChild(a);
	g_twitterbox.appendChild(h2);
	g_twitterbox.appendChild(tweetp);
	g_twitterbox.appendChild(smallp);	

}

// need to be accessible from handleTwitterResponse()
var g_twitterbox;
var g_ajaxLoaders = new Array();
var g_users = ["laura_simunix", "jamie_simunix"]

Array.prototype.position = function(s) {
	var i = 0;
	while (i < this.length && this [i] != s) {i++};
	return i < this.length ? i : undefined;
}

function loadScript(url) {
	if(url) {
		// get head tag
		var head = document.getElementsByTagName("head")[0];
		// create script element
		var script = document.createElement("script");
		// set type
		script.type = "text/javascript";
		// set src
		script.src = url;
		// append to head
		head.appendChild(script);
		// return object
		return script;
	}
	return false;
}

function loadTwitterBox(el) {
	
	// get box to load twitter info into
	g_twitterbox = $(el);
	
	// base twitter url
	var url = "http://api.twitter.com/1/users/show/";		
	
	// array to hold json scripts
	var scripts = new Array(g_users.length);
	
	// loop through users
	for(var i = 0; i < g_users.length; i++) {

		// create ajax loading gif
		var img = document.createElement("img");
		img.src = "images/ajax-loader.gif";
		img.alt = "Loading...";
		img.style.display = "block";
		g_twitterbox.appendChild(img);
		/* put in array so we can access it later 
		and hide it when this user's info is ready */
		g_ajaxLoaders.push(img);
		
		// create json script
		scripts[i] = loadScript(url + g_users[i] + ".json?callback=handleTwitterResponse");
	}

}

function handleTPSResponse(response) {
	if(response.exceeded) {
		alert("Sorry, you have exceeded your maximum number of free TPS checks for today.");
	} else if(response.oktocall) {
		alert("This number is OK to call.");
	} else {
		alert("This number is not OK to call.");
	}
}

function doTPSCheck() {
	var number = $("number");
	if(number && number.value != "") { 
		var url = "http://www.ukphonebook.com/dotnet/json.aspx?cd=tps&client=simunix&tel=" + encodeURIComponent(number.value) + "&callback=handleTPSResponse";
		loadScript(url);
	} else {
		alert("Please enter a UK telephone number.");
	}
	return false;
}