function check(type, field_id, return_prefix){
  	var url = 'fetch.php';
	var pars = type+'='+escape($F(field_id))+'&return='+return_prefix;
	var myAjax = new Ajax.Request(url, 
		{
			method: 'get',
			parameters: pars,
			onComplete: respond,
			onFailure: reportError
		});
}

// From http://codejanitor.com/wp/2006/03/23/ajax-timeouts-with-prototype/
function callInProgress (xmlhttp) {
	switch (xmlhttp.readyState) {
		case 1: case 2: case 3:
			return true;
			break;
		// Case 4 and 0
		default:
			return false;
			break;
	}
}

// Register global responders that will occur on all AJAX requests
Ajax.Responders.register({
	onCreate: function(request) {
		request['timeoutId'] = window.setTimeout(
			function() {
				// If we have hit the timeout and the AJAX request is active, abort it and let the user know
				if (callInProgress(request.transport)) {
					request.transport.abort();
					request.options['onFailure'](request.transport, request.json);
				}
			},
			3000 // Three seconds
		);
	},
	onComplete: function(request) {
		// Clear the timeout, the request completed ok
		window.clearTimeout(request['timeoutId']);
		request.options['onComplete'](request.transport, request.json);
	}
});

function clear(field_id, msg_id, img_id) 
{
	if($(field_id)){
		$(field_id).removeClassName("invalid");
		$(field_id).removeClassName("valid");
	}
	if(img_id && $(img_id)){
		$(img_id).update("");
	}
	if(msg_id && $(msg_id)){
		$(msg_id).update("");
	}
}

function update_fields(type, valid, message, color_fields, image_field, message_div){
	try{
		if(type == "error"){
			// invalid case fetched
			throw new Exception("Validation returned is invalid");
		}
		else{
			var image_html = "";
			var fields = color_fields.gsub(/\s/, "").split(",");
			
			if(valid == "true"){
				for(var i = 0; i < fields.size(); i++){
					$(fields[i]).removeClassName("invalid");
					$(fields[i]).addClassName("valid");
				}
				
				image_html = "<img src=\"images/ok.png\" />";
			}
			else{
				for(var i = 0; i < fields.size(); i++){
					$(fields[i]).removeClassName("valid");
					$(fields[i]).addClassName("invalid");
				}
				image_html = "<img src=\"images/false.png\" />";
			}
			
			$(message_div).update(message);
			$(image_field).update(image_html);
		}
	}
	catch(e){
		//alert(e.message);
	}
}

function respond(data){
	try{
		resp = data.responseXML.documentElement;
		
		var type = (resp.getElementsByTagName("type").item(0).firstChild) ? resp.getElementsByTagName("type").item(0).firstChild.data : "";
		var valid = (resp.getElementsByTagName("valid").item(0).firstChild) ? resp.getElementsByTagName("valid").item(0).firstChild.data : "";
		var message = (resp.getElementsByTagName("message").item(0).firstChild) ? resp.getElementsByTagName("message").item(0).firstChild.data : "";
		var color_fields = (resp.getElementsByTagName("validate").item(0).firstChild) ? resp.getElementsByTagName("validate").item(0).firstChild.data : "";
		var image_field = (resp.getElementsByTagName("imagefield").item(0).firstChild) ? resp.getElementsByTagName("imagefield").item(0).firstChild.data : "";
		var message_div = (resp.getElementsByTagName("update").item(0).firstChild) ? resp.getElementsByTagName("update").item(0).firstChild.data : "";
		
		update_fields(type, valid, message, color_fields, image_field, message_div);
		
		if(resp.getElementsByTagName("type").item(0).firstChild.data == "postalcode" && $F('bill_country') == "UNITED STATES")
		{
			var pc_city = resp.getElementsByTagName("cityfield").item(0).firstChild.data.split(",")[0];
			var pc_state = resp.getElementsByTagName("statefield").item(0).firstChild.data.split(",")[0];
			if(resp.getElementsByTagName("city").item(0).firstChild != null){
				$(pc_city).value = resp.getElementsByTagName("city").item(0).firstChild.data;
				$(pc_state).value = resp.getElementsByTagName("state").item(0).firstChild.data;
			}
			else if($F("zip_timeout") == "1"){
				// do nothing
			}
			else{
				$(pc_city).value = "";
				$(pc_state).value = "";
			}
		}
	}
	catch(e){
		//alert(e.message);
	}
}