//Can;t get it to work for Radio Buttons yet. All options should be valid anyway
	function validateForm(form)
	{
	
	
		$(form).getElementsBySelector('input[type="text"],input[type="radio"],input[type="checkbox"], select,textarea').each(
			function(item)
			{
				if(item.getAttribute('type')=='checkbox')
				{//TODO: Fix Safari Bug, no focus onblur...
					item.observe('click',validateLine);
				}
				else
				{
					item.observe('blur',validateLine);
				}
				
				if(item.getAttribute('type') != 'radio')
				{
					item.observe('focus',setInputFocus);
				}
			});
	}
	
	
	function validateLine(e)
	{		
		var element = e.element();	
		validateInput(element.name, $F(element), element.form.id);
	}
	
	function validateInput(iId, sValue, sForm)
	{
		var iId, sValue, sForm;
		
		
		new Ajax.Request(window.location.href.replace(/#.*$/ig,''),
		{
			method:'get',
			parameters: 'ajax=true'+'&'+'_submitted=' + sForm + '&' + iId + '=' + sValue,
			onSuccess: function(transport){
				var response = transport.responseXML || "no response text";
						
				validated = response.getElementsByTagName('validated');
				if(validated[0].firstChild.nodeValue=='true')
				{
					if($(validated[0].getAttribute('id')).type != 'radio')
				 	{
				 		setInputValid(validated[0].getAttribute('id'));
				 	}
				 	//TODO: Radio Buttons, also leave in as using for 'previous' memory
				 }
				 else
				 {
				 	var aError = response.getElementsByTagName('error');
			
				 	for(var i=0;i<aError.length;i++)
				 	{
				 		if(aError[i].firstChild)
				 		{
					 		var error = aError[i].firstChild.nodeValue;
				 		}
				 		else
				 		{
				 			var error = '';
				 		}
				 		setInputInvalid(aError[i].getAttribute('fieldname'),error);
				 	}
				}
			},
			onFailure: function(){ alert('An error occured on validateInput') }
		});
	}
	
	function setInputFocus(e)
	{
		element = e.element();
		
		element.removeClassName('validInput');
		element.removeClassName('invalidInput');
		element.addClassName('focusInput');
	}
	
	function setInputValid(id)
	{
		input = $(id)
	
		input.removeClassName('focusInput');
		input.removeClassName('invalidInput');
		input.addClassName('validInput');
		
		
		
		$$('label[for="'+input.name+'"] span.error').each(function(item){
				item.removeClassName('error');
				if(!item.hasClassName('required'))
				{//Remove "!" span
					item.remove();
				}
			});
			
		$$('#'+input.id+'_error_top_, #'+input.id+'_error_').each(function(item){
				item.addClassName('removeEffect');
				new Effect.BlindUp(item);
				new Effect.Fade(item,{
					afterFinish: function(element) 
					{//Remove object
						$$('.removeEffect').reduce().remove();
					}
				});
			});
	}
	
	function setInputInvalid(id,error)
	{
	
		element = $(id);
		element.removeClassName('validInput');
		element.removeClassName('focusInput');
		element.addClassName('invalidInput');
		
		var bIsRequired = false;
		
		$$('label[for="'+element.name+'"] span.required').each(function(item){
				bIsRequired = true;
				if(item.previous('.error'))
				{
					item.previous('.error').remove();
				}
				
				item.addClassName('error');
				new Insertion.Before(item, '<span class="error">!</span>');
			});
			
		if(!bIsRequired)
		{	
			item = $$('label[for="'+element.name+'"]').reduce();
			new Insertion.Bottom(item, '<span class="error">!</span>');
		}
		
		var bErrorRemoved = false;
		
		$$('#'+element.id+'_error_top_, #'+element.id+'_error_').each(function(item){
				item.remove();
				bErrorRemoved = true;
			});
			
		if(error)
		{	
			errorPara = Builder.node( 'p', {className:'errorBottom error',id:id+'_error_'}, error);	
		
			$(id).parentNode.parentNode.appendChild(errorPara);
			
			if(bErrorRemoved == false)
			{
				Element.setStyle(errorPara,{display:'none'});
				new Effect.BlindDown(errorPara);
				new Effect.Appear(errorPara);
			}
		}
	}	
