/*global ActiveXObject, XMLHttpRequest, clearTimeout, document, setTimeout */

addLoadEvent(init);

function init() {

	prepareForm(
		"signupform",
		"signup-container",
		"/modules/signup/index.php");

	prepareForm(
		"feedbackform",
		"feedback-container",
		"/modules/feedback/index.php");

	submitForm(
		"commentpreviewbutton",
		"comment-container",
		"/blog/addcomment.php");
	submitForm(
		"commentsubmitbutton",
		"comment-container",
		"/blog/addcomment.php");

	var dissipate = function() {
		fadeUpErrors();
		fadeUpFeedback();
	};

	setTimeout(dissipate,1000);

}


function submitForm(buttonId,canvasId,ajaxFile) {

	if (!document.getElementById) {
		return false;
	}
	if (!document.getElementById(canvasId)) {
		return false;
	}
	if (!document.getElementById(buttonId)) {
		return false;
	}

	var thebutton = document.getElementById(buttonId);

	thebutton.theurl = ajaxFile;

	thebutton.canvasId = canvasId;

	thebutton.onclick = function() {

		var theform = this.form;

		var querystring = this.name;
		querystring+= "=";
		querystring+= escape(this.value);
		querystring+= "&";
	
		for (var i=0; i<theform.elements.length; i++) {
	
			if (theform.elements[i].type != "submit") {
	
				querystring+= theform.elements[i].name;
				querystring+= "=";
				querystring+= escape(theform.elements[i].value);
				querystring+= "&";
	
			}
		}

		var xhr = new Ajax();
		xhr.url = this.theurl;
		xhr.canvas = document.getElementById(this.canvasId);
		xhr.loading = disableButton(this);
		xhr.data = querystring;
		xhr.callback = init;
		
		return (!xhr.start());

	};

}

function prepareForm(formId,canvasId,ajaxFile) {

	if (!document.getElementById) {
		return false;
	}
	if (!document.getElementById(canvasId)) {
		return false;
	}
	if (!document.getElementById(formId)) {
		return false;
	}

	var theform = document.getElementById(formId);

	theform.theurl = ajaxFile;

	theform.canvasId = canvasId;

	theform.onsubmit = function() {

		var querystring = "";

		for (var i=0; i<this.elements.length; i++) {

			querystring+= this.elements[i].name;
			querystring+= "=";
			querystring+= escape(this.elements[i].value);
			querystring+= "&";

		}

		var xhr = new Ajax();
		xhr.url = this.theurl;
		xhr.canvas = document.getElementById(this.canvasId);
		xhr.data = querystring;
		xhr.callback = init;
		
		return (!xhr.start());

	};

}

function enableButton(button) {
	button.disabled = false;
}
function disableButton(button) {
	button.disabled = true;
}

function Ajax() {

	var url,canvas,data,loading,callback,request;

	this.start = function() {

		url			= this.url;
		canvas		= this.canvas;
		data		= this.data;
		loading		= this.loading;
		callback	= this.callback;
		request		= getHTTPObject();

		if (!request || !url) {
			return false;
		} else {
			initiateRequest();
			return true;
		}
	};

	var getHTTPObject = function() {
		var xmlhttp = false;
		if (window.XMLHttpRequest) {
			xmlhttp = new XMLHttpRequest();
		} else if(window.ActiveXObject) {
			try {
				xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
			} catch (e) {
				try {
					xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
				} catch (e) {
					xmlhttp = false;
				}
			}
		}
		return xmlhttp;
	};

	var initiateRequest = function() {
		if (loading) {
			loading();
		}
		loadData();
	};

	var loadData = function() {
		request.onreadystatechange = completeRequest;
		if (data) {
			request.open("POST", url, true);
			request.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
			request.send(data);
		} else {
			request.open("GET", url, true);
			request.send(null);
		}
	};

	var completeRequest = function() {
		if (request.readyState == 4) {
			if (request.status == 200) {
				if (canvas) {
					canvas.innerHTML = request.responseText;
				}
				if (callback) {
					callback();
				}
			} else {
				if (canvas) {
					canvas.innerHTML = request.statusText;
				}
			}
		}
	};

}

var fadeUpErrors = function() {
	var errors = document.getElementsByClassName("error");
	for (var i=0 ; i<errors.length; i++) {
		fadeUp(errors[i],204,51,102);
	}
};

var fadeUpFeedback = function() {
	var feedback = document.getElementsByClassName("feedback");
	for (var i=0 ; i<feedback.length; i++) {
		fadeUp(feedback[i],153,204,0);
	}
};


var fadeUp = function(element,red,green,blue) {
	if (element.fade) {
		clearTimeout(element.fade);
	}
	if (red == 255 && green == 255 && blue == 255) {
		element.style.backgroundColor = "transparent";
		return;
	}
	var newred = red + Math.ceil((255 - red)/10);
	var newgreen = green + Math.ceil((255 - green)/10);
	var newblue = blue + Math.ceil((255 - blue)/10);
	element.style.backgroundColor = "rgb("+newred+","+newgreen+","+newblue+")";
	var repeat = function() {
		fadeUp(element,newred,newgreen,newblue);
	};
	element.fade = setTimeout(repeat,50);
};

document.getElementsByClassName = function(name) {
	var results = [];
	var elems = document.getElementsByTagName("*");
	var pattern = new RegExp("(^|\\s)"+name+"(\\s|$)");
	for (var i=0; i<elems.length; i++) {
		if (pattern.test(elems[i].className)) {
			results[results.length] = elems[i];
		}
	}
	return results;
};