var MailBox;
var RequestCache = new Array();
var ResponseCache = new Array();
document.write("<div id=\"MailBoxContainer\" style=\"display: none;\"></div>");

function PostOfficeBox(_address, _timeOut) {
	if (!MailBox) MailBox = document.getElementById("MailBoxContainer");
	this.Address = _address;
	this.TimeOut = (isNaN(_timeOut) ? 0 : _timeOut);

	var MailMessage = document.createElement("script");
	MailMessage.language = "javascript";
	MailMessage.type = "text/javascript";

	this.Posting = false;
	this.Messages = new Array();
	this.HasMessages = false;
	this.StartStamp = 0;
	this.Attempts = 0;

	this.MailID = RequestCache.length;
	RequestCache[this.MailID] = this;
	RequestCache[this.MailID].MailMessage = MailMessage;

	this.SetMessage = function(Name, Value) {
		this.Messages[escape(Name)] = escape(Value);
		this.HasMessages = true;
	}

	this.CreateQuery = function() {
		var Result = this.Address;
		var First = true;

		for (var Key in this.Messages) {
			Result += ((First) ? "?" : "&") +
				Key + "=" + this.Messages[Key];
			First = false;
		}

		return Result;
	}

	this.SendPost = function() {
		this.Posting = true;
		var QueryString = this.CreateQuery();

		if (ResponseCache[QueryString]) {
			ResponseCache[QueryString]();
		}
		else {
			this.StartStamp = (new Date()).getTime();
			RequestCache[this.MailID].MailMessage.src = QueryString +
				((this.HasMessages) ? "&" : "?") +
				(new Date()).getTime() + "_" + this.MailID;

			MailBox.appendChild(RequestCache[this.MailID].MailMessage);
			PollRequest(this.MailID);
		}
	}
}

function PollRequest(MailID) {
	var Request = RequestCache[MailID];
	window.status = "ID: " + MailID + "   Attempt: " + Request.Attempts++;

	if (Request.serverReturn) {
		Request.Posting = false;
		Request.serverReturn();
		FinalizeRequest(MailID, true);
	}
	else {
		if ((new Date()).getTime() - Request.StartStamp < Request.TimeOut) {
			setTimeout("PollRequest(" + MailID + ")", 10);
		}
		else {
			Request.Posting = false;
			FinalizeRequest(MailID, false);
		}
	}
}

function FinalizeRequest(MailID, Confirmed) {
	MailBox.removeChild(RequestCache[MailID].MailMessage);
	RequestCache[MailID].MailMessage = null;
	if (window.PostConfirmation)
		PostConfirmation(Confirmed, MailID);
}