		function explodeIsInString (string, lookup)
		{
			var string_array = string.split(' ');
			var new_string_array = new Array();
			for ( var i = 0; i < string_array.length; i++)
			{
				if ( string_array[i] == lookup )
				{
					return true;
				}
			}
			return false;
		}
		function explodeRemoveFromString (string, remove)
		{
			var string_array = string.split(' ');
			var new_string_array = new Array();
			for ( var i = 0; i < string_array.length; i++)
			{
				if ( string_array[i] != remove )
				{
					new_string_array[new_string_array.length] = string_array[i];
				}
			}
			return new_string_array.join(' ');
		}
		function explodeAddToString (string, add)
		{
			// Maybe the item is allready in there so remove it just in case
			string = explodeRemoveFromString(string, add);
			// Add item
			var string_array = string.split(' ');
			string_array[string_array.length] = add;
			return string_array.join(' ');
		}

		for ( var i = 0; i < document.forms.length; i++ )
		{
			// Set id for callback function
			document.forms[i].id = 'form'+i;
			// Callback function
			document.forms[i].respondAJAX = function (request)
			{
				xmlDocument = request.responseXML;
				if ( xmlDocument != null )
				{
					var data = new Array();
					var status_base = xmlDocument.getElementsByTagName('status')[0];
						var callerid = status_base.getElementsByTagName('callerid')[0].firstChild.nodeValue;
						var type = status_base.getElementsByTagName('type')[0].firstChild.nodeValue;
						var code = status_base.getElementsByTagName('code')[0].firstChild.nodeValue;
						var message = status_base.getElementsByTagName('message')[0].firstChild.nodeValue;
					// Get form id from ajax
					if ( callerid == undefined ) callerid = 0;
					var form = document.getElementById(callerid);
					var category = explodeRemoveFromString(form.className, 'ajax');
					// Success :)
					if ( type == 'NOTICE' )
					{
						var data_base = xmlDocument.getElementsByTagName('data')[0];
						if ( data_base != undefined )
						{
							var id = data_base.getElementsByTagName('id')[0].firstChild.nodeValue;
							//var name = data_base.getElementsByTagName('name')[0].firstChild.nodeValue;
						}
						// Remove No content note
						var elements = document.getElementsByClassName('ajax_noContentMsg');
						for ( var i = 0; i < elements.length; i++)
						{
							if ( explodeIsInString(elements[i].className, category) )
							{
								//elements[i].innerHTML = '';
								elements[i].style.display = 'none';
							}
						}
						// Remove No content note
						var elements = document.getElementsByClassName('ajax_contentHolder');
						for ( var i = 0; i < elements.length; i++)
						{
							if ( explodeIsInString(elements[i].className, category) )
							{
								//elements[i].innerHTML = '';
								elements[i].style.display = '';
							}
						}
						// Append returned html
						var html_node = xmlDocument.getElementsByTagName('html')[0];
						if ( html_node != undefined )
						{
							var html = html_node.firstChild.nodeValue;
							var elements = document.getElementsByClassName('ajax_contentInsertPosition');
							for ( var i = 0; i < elements.length; i++)
							{
								if ( explodeIsInString(elements[i].className, category) )
								{
									elements[i].innerHTML += html;
								}
							}
						}
						// Show status
						var elements = document.getElementsByClassName('ajax_requestForm');
						for ( var i = 0; i < elements.length; i++)
						{
							if ( explodeIsInString(elements[i].className, category) )
							{
								elements[i].innerHTML = '<h4>'+message+'</h4>';
							}
						}
						// Content changed.. Restart smooth scrolling
						ScrollLinks.start();
						// Scroll to comment
						var category_array = category.split('_');
						var abbreviation = category_array[category_array.length-1].substr(0, 1);
						$(abbreviation+id) ? new fx.Scroll().scrollTo(abbreviation+id) : void(0);
					}
					// Error :/
					else
					{
						// Remove error class from all form elements
						for ( var i = 0; i < form.length; i++)
						{
							if ( form[i].type != undefined )
							{
								form[i].className = explodeRemoveFromString(form[i].className, 'error')
							}
						}
						// Add error class to any faulty form element (as specified in xml)
						for ( var i = 0; i < xmlDocument.getElementsByTagName('required_field').length; i++ )
						{
							var field_base = xmlDocument.getElementsByTagName('required_field')[i];
								var id = field_base.getElementsByTagName('id')[0].firstChild.nodeValue;
								//var name = field_base.getElementsByTagName('name')[0].firstChild.nodeValue;
							// Add error class
							var input = form[category+'_'+id];
							input.className = explodeAddToString(input.className, 'error')
						}
						// Show error message
						if ( code != 'ERROR_REQUIRED_FIELDS' )
						{
							alert(message);
						}
					}
					// Reactivate submitting
					form.ajax_is_loading = false;
				}
				else
				{
					alert('Sorry, there was a problem connecting to the server.');
				}
				// Do some crazy fx
				var elements = document.getElementsByClassName('ajax_loadingMsg');
				for ( var i = 0; i < elements.length; i++)
				{
					if ( explodeIsInString(elements[i].className, category) )
					{
						elements[i].className = explodeRemoveFromString(elements[i].className, 'loading')
					}
				}
				var elements = document.getElementsByClassName('ajax_requestForm');
				for ( var i = 0; i < elements.length; i++)
				{
					if ( explodeIsInString(elements[i].className, category) )
					{
						elements[i].impressiveFX.setOptions({duration: 200});
						elements[i].impressiveFX.custom(0, 1);
					}
				}
			}
			/*
			ajax_loadingMsg
			ajax_requestForm
			ajax_contentHolder
			ajax_noContentMsg
			*/
			//HTMLFormElement.prototype.submitAJAX = function ()
			document.forms[i].submitAJAX = function ()
			{
				var form = this;
				var category = explodeRemoveFromString(form.className, 'ajax');
				// Prevent from submitting twice
				form.ajax_is_loading = true;
	
				var data = new Array();
				// Build data and add ajax modifier so php knows to give back xml
				data[0] = 'ajax=1';
				data[1] = 'submit=1';
				data[2] = 'callerid='+form.id;
				for ( var i = 0; i < form.length; i++)
				{
					if ( form[i].type != undefined )
					{
						//alert(form[i].type);
						if ( form[i].type == 'checkbox' || form[i].type == 'radio' )
						{
							if ( form[i].checked )
								data[data.length] = form[i].name+'='+escape(form[i].value);
						}
						else
						{
							data[data.length] = form[i].name+'='+escape(form[i].value);
						}
					}
				}
				//alert(data);
				// Fx to show something happens
				var elements = document.getElementsByClassName('ajax_loadingMsg');
				for ( var i = 0; i < elements.length; i++)
				{
					if ( explodeIsInString(elements[i].className, category) )
					{
						elements[i].className = explodeAddToString(elements[i].className, 'loading')
					}
				}
				var elements = document.getElementsByClassName('ajax_requestForm');
				for ( var i = 0; i < elements.length; i++)
				{
					if ( explodeIsInString(elements[i].className, category) )
					{
						elements[i].impressiveFX = new fx.Opacity(elements[i], {duration: 200, onComplete: 
							function()
							{
								//prompt('ajax request:', form.action+'?'+data.join('&'));
								new ajax(form.action, {postBody: data.join('&'), onComplete: form.respondAJAX});
							}
						});
						elements[i].impressiveFX.custom(1, 0);
					}
				}
				//new fx.Scroll().scrollTo('comments');
				// Cancel form submission
				return false;
			}
		}
		// Enable Ajax
		var elements = document.getElementsByClassName('ajax');
		for ( var i = 0; i < elements.length; i++)
		{
			elements[i].ajax_is_loading = false;
			elements[i].onsubmit = function()
			{
				if ( !this.ajax_is_loading )
				{
					return this.submitAJAX();
				}
				else
				{
					return false;
				}
			}
		}