// Finds all forms with class="signup"
// Expects a form element named "address" for the email
// Uses the original form action for POSTing
// Appreciates when there's an element with class="subscribe-message" in the form for spewing feedback
// Will hide anything inside the form with class="hideonsuccess" and display anything with class="showonsuccess" when subscription succeeds

// Utility functions for handling classes
function hasClass(obj,cName) { return new RegExp('\\b'+cName+'\\b').test(obj.className); }
function addClass(obj,cName) {
	if (!hasClass(obj,cName)) { obj.className+=obj.className?' '+cName:cName; } return true;
}
function removeClass(obj,cName) {
	if (!hasClass(obj,cName)) return false;
	var rep=obj.className.match(' '+cName)?' '+cName:cName;
	obj.className=obj.className.replace(rep,'');
	return true;
}

// Preserve old onload event
if (window.onload)
	oldonload = window.onload;
else
	oldonload = Function();

window.onload = function() {
	for (var i = 0; i < document.forms.length; i++) {
		if (!hasClass(document.forms[i], 'signup')) {
			continue;
		}
		document.forms[i].onsubmit = subscribe;
		var originalAction = document.forms[i].getAttribute('action');
		document.forms[i].originalAction = originalAction;
		document.forms[i].removeAttribute('action');
		document.forms[i].removeAttribute('method');
	}

	oldonload();
};

function subscribe(e) {
	var targ;
	if (!e) var e = window.event;
	if (e.target) targ = e.target;
	else if (e.srcElement) targ = e.srcElement;
	if (targ.nodeType == 3)
		targ = targ.parentNode;

	while (targ.tagName.toUpperCase() != 'FORM')
		targ = targ.parentNode;

	var messageDiv = false;
	var divs = targ.getElementsByTagName('*');
	for (var i = 0; i < divs.length; i++)
		if (hasClass(divs[i], 'subscribe-message') || divs[i].id == 'subscribe-message')
			messageDiv = divs[i];

	var address = targ.elements['address'].value;

	var req = new XMLHttpRequest();
	if (req) {
		req.onreadystatechange = function() {
			if (req.readyState == 4 && req.status == 201) {
				if (messageDiv) {
					messageDiv.innerHTML = req.responseText;
					removeClass(messageDiv, 'error');
					addClass(messageDiv, 'success');
					messageDiv.style.display = 'block';
				}
				else
					alert(req.responseText);

				var showHide = document.getElementById('signup').getElementsByTagName('*');
				for (var i = 0; i < showHide.length; i++) {
					if (hasClass(showHide[i], 'hideonsuccess')) {
						showHide[i].style.display = 'none';
					}
					else if (hasClass(showHide[i], 'showonsuccess')) {
						showHide[i].style.display = 'block';
					}
				}
			}
			else if (req.readyState == 4 && req.status == 200) {
				if (messageDiv) {
					messageDiv.innerHTML = req.responseText;
					removeClass(messageDiv, 'success');
					addClass(messageDiv, 'error');
					messageDiv.style.display = 'block';
				}
				else
					alert(req.responseText);
			}
			else
				return false;
		};
		req.open('POST', targ.originalAction, true);
		req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		req.send('address=' + address + '&ajax=true');
		return false;
	}

	return false;
}
 
