function urlencode( str ) {
	var histogram = {}, histogram_r = {}, code = 0, tmp_arr = [];
	var ret = str.toString();

	var replacer = function(search, replace, str) {
		var tmp_arr = [];
		tmp_arr = str.split(search);
		return tmp_arr.join(replace);
	};

	histogram['!']   = '%21';
	histogram['%20'] = '+';

	ret = encodeURIComponent(ret);

	for (search in histogram) {
		replace = histogram[search];
		ret = replacer(search, replace, ret) // Custom replace. No regexing
	}

	return ret.replace(/(\%([a-z0-9]{2}))/g, function(full, m1, m2) {
	    return "%"+m2.toUpperCase();
	});

	return ret;
}

function rsvp(url,form,element) {
	cload = new myXMLHttpRequest ();
	cload.onreadystatechange = function () {
		if (cload.readyState == 4) {
			cloadtext = cload.responseText;
			//setInnerHTML(document.getElementById(element),'Thank You. Your message has been sent.');
			setInnerHTML(document.getElementById('zoom_content'),cloadtext);
			//alert('Thank You. Your message has been sent.');
		}
		else {
		}
	}

	var n = urlencode(form.name.value);
	var e = urlencode(form.email.value);
	var c = urlencode(form.company.value);
	var w = urlencode(form.website.value);
	var a = urlencode(form.attendees.value);
	var content = 'name=' + n + '&email=' + e + '&company=' + c + '&website=' + w + '&attendees=' + a + '&sendContactEmail=true';
	
	cload.open ("POST", url, true);
	if (typeof(cload.setRequestHeader) != "undefined")
		cload.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	cload.send(content);
}

function contact(url,form,element) {
	cload = new myXMLHttpRequest ();
	cload.onreadystatechange = function () {
		if (cload.readyState == 4) {
			cloadtext = cload.responseText;
			//setInnerHTML(document.getElementById(element),'Thank You. Your message has been sent.');
			setInnerHTML(document.getElementById('zoom_content'),cloadtext);
			//alert('Thank You. Your message has been sent.');
		}
		else {
		}
	}

	var n = urlencode(form.posName.value);
	var e = urlencode(form.posEmail.value);
	var t = urlencode(form.posText.value);
	var content = 'name=' + n + '&email=' + e + '&text=' + t + '&sendContactEmail=true';
	
	cload.open ("POST", url, true);
	if (typeof(cload.setRequestHeader) != "undefined")
		cload.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	cload.send(content);
}

// Load a page and put it's content into element
function loadPage(url,element) {
	cload = new myXMLHttpRequest ();
	cload.onreadystatechange = function () {
		if (cload.readyState == 4) {
			cloadtext = cload.responseText;
			setInnerHTML(document.getElementById(element),cloadtext);
		}
		else {
		}
	}

	cload.open ("GET", url, true);
	cload.send (null);
}


//Create an XMLHttpRequest object
function myXMLHttpRequest ()
{
	var xmlhttplocal = false;
	if (typeof XMLHttpRequest != 'undefined') {
		try {
			xmlhttplocal = new XMLHttpRequest ();
		}
		catch (e) {
  			xmlhttplocal = false;
		}
	}
	if (!xmlhttplocal) {
		try {
			xmlhttplocal = new ActiveXObject ("Msxml2.XMLHTTP")
		}
		catch (e) {
			try {
				xmlhttplocal = new ActiveXObject ("Microsoft.XMLHTTP")
			}
			catch (E) {
				xmlhttplocal = false;
				alert ('couldn\'t create xmlhttp object');
			}
  		}
	}
	return (xmlhttplocal);
}

// Load an XML document using XMLHttpRequest.
function getXMLDocument(url, callback)
{
	if (!window.XMLHttpRequest)
		return false;

	var myDoc = new XMLHttpRequest();
	if (typeof(callback) != "undefined")
	{
		myDoc.onreadystatechange = function ()
		{
			if (myDoc.readyState != 4)
				return;

			if (myDoc.responseXML != null && myDoc.status == 200)
				callback(myDoc.responseXML);
		};
	}
	myDoc.open('GET', url, true);
	myDoc.send(null);

	return true;
}

// Send a post form to the server using XMLHttpRequest.
function sendXMLDocument(url, content, callback)
{
	if (!window.XMLHttpRequest)
		return false;

	var sendDoc = new window.XMLHttpRequest();
	if (typeof(callback) != "undefined")
	{
		sendDoc.onreadystatechange = function ()
		{
			if (sendDoc.readyState != 4)
				return;

			if (sendDoc.responseXML != null && sendDoc.status == 200)
				callback(sendDoc.responseXML);
			else
				callback(false);
		};
	}
	sendDoc.open('POST', url, true);
	if (typeof(sendDoc.setRequestHeader) != "undefined")
		sendDoc.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	sendDoc.send(content);

	return true;
}

// Set the "inside" HTML of an element.
function setInnerHTML(element, toValue)
{
	// IE has this built in...
	if (typeof(element.innerHTML) != 'undefined')
		element.innerHTML = toValue;
	// Otherwise, try createContextualFragment().
	else
	{
		var range = document.createRange();
		range.selectNodeContents(element);
		range.deleteContents();
		element.appendChild(range.createContextualFragment(toValue));
	}
}

// Set the "outer" HTML of an element.
function setOuterHTML(element, toValue)
{
	if (typeof(element.outerHTML) != 'undefined')
		element.outerHTML = toValue;
	else
	{
		var range = document.createRange();
		range.setStartBefore(element);
		element.parentNode.replaceChild(range.createContextualFragment(toValue), element);
	}
}

// Get the inner HTML of an element.
function getInnerHTML(element)
{
	if (typeof(element.innerHTML) != 'undefined')
		return element.innerHTML;
	else
	{
		var returnStr = '';
		for (var i = 0; i < element.childNodes.length; i++)
			returnStr += getOuterHTML(element.childNodes[i]);

		return returnStr;
	}
}

function getOuterHTML(node)
{
	if (typeof(node.outerHTML) != 'undefined')
		return node.outerHTML;

	var str = '';

	switch (node.nodeType)
	{
	// An element.
	case 1:
		str += '<' + node.nodeName;

		for (var i = 0; i < node.attributes.length; i++)
		{
			if (node.attributes[i].nodeValue != null)
				str += ' ' + node.attributes[i].nodeName + '="' + node.attributes[i].nodeValue + '"';
		}

		if (node.childNodes.length == 0 && in_array(node.nodeName.toLowerCase(), ['hr', 'input', 'img', 'link', 'meta', 'br']))
			str += ' />';
		else
			str += '>' + getInnerHTML(node) + '</' + node.nodeName + '>';
		break;

	// 2 is an attribute.

	// Just some text..
	case 3:
		str += node.nodeValue;
		break;

	// A CDATA section.
	case 4:
		str += '<![CDATA' + '[' + node.nodeValue + ']' + ']>';
		break;

	// Entity reference..
	case 5:
		str += '&' + node.nodeName + ';';
		break;

	// 6 is an actual entity, 7 is a PI.

	// Comment.
	case 8:
		str += '<!--' + node.nodeValue + '-->';
		break;
	}

	return str;
}
