(function() {
	var lastSelected = null;		  
		  
	function getXHR() {
		var xmlHTTP = false;
		try {
			return new ActiveXObject("Msxml2.XMLHTTP");
		} catch(e) {
			try {
				return new ActiveXObject("Microsoft.XMLHTTP");
			} catch(e) {
				if (typeof XMLHttpRequest != "undefined") {
				  return new XMLHttpRequest();
				}					
			}
		}		
		return null;
	}
		  
	function easeInOutCubic(current, start, change, duration) {
		current /= duration / 2;
		if (current < 1) {
			return change / 2 * current * current * current + start;
		} else {
			current -= 2;
			return change / 2 * (current * current * current + 2) + start;
		}
	}		
	
	function easeOutCubic(current, start, change, duration) {
		return change * ((current = current / duration - 1) * current * current + 1) + start;
	}	
	
	function setAlpha(element, value) {
		element.style.MozOpacity = value / 100;
		element.style.filter = "alpha(opacity=" + value + ")";
		element.style.opacity = value / 100;
	}	
		  
	function itemClick() {
		if (lastSelected) {
			lastSelected.className = "item";
		}
		this.className = "item selected";
		lastSelected = this;
	}
	
	var percentages = null;
	
	function showPercentages(results) {
		var elements = [];
		var opts = barometer.getElementsByTagName("div");
		for (var i = 0; i < opts.length; i++) {
			if (opts[i].className.indexOf("item") > -1) {
				var node = opts[i];
				var div = document.createElement("div");
				div.className = "percent";
				setAlpha(div, 0);
				var barDiv = document.createElement("img");
				barDiv.src = "images/barometer_gradient.gif";
				barDiv.className = "bar";
				barDiv.style.width = "1px";
				var numDiv = document.createElement("div");
				numDiv.className = "number";
				numDiv.appendChild(document.createTextNode("0%"));
				div.appendChild(barDiv);
				div.appendChild(numDiv);
				node.appendChild(div);
				elements.push([barDiv, numDiv]);
			}
		}
		
		var frame = 0;
		var timer = window.setInterval(function() {
			var alpha = easeInOutCubic(frame++, 0, 100, 10); 		
			for (var i = 0; i < elements.length; i++) {
				setAlpha(elements[i][0].parentNode, alpha);
			}
			if (frame >= 10) {
				window.clearInterval(timer);
				frame = 0;
				timer = window.setInterval(function() {
					for (var i = 0; i < elements.length; i++) {
						var percent = easeOutCubic(frame, 0, percentages[i], 50); 
						var width = easeOutCubic(frame, 0, percentages[i] / 100 * 155, 50);
						if (percentages[i] > 0) {
							elements[i][0].style.width = Math.round(Math.max(3, width)) + "px";
						} else {
							elements[i][0].style.width = "1px";
						}
						elements[i][1].innerHTML = Math.round(percent) + "%";
					}
					if (frame++ == 50) {
						window.clearInterval(timer);	
					}
				}, 10);
			}
		}, 10);
	}
	
	function showResults(results) {
		var additionalHeight = 30 + GENIESSER_BAROMETER.answerIds.length * 10;
		var barometer = document.getElementById("geniesser-barometer");
		var srcHeight = barometer.offsetHeight;
		var dstHeight = srcHeight + additionalHeight;
		
		var checkBoxes = [];
		var opts = barometer.getElementsByTagName("div");
		for (var i = 0; i < opts.length; i++) {
			if (opts[i].className.indexOf("item") > -1) {
				checkBoxes.push(opts[i].getElementsByTagName("div")[0]);
			}
		}	
		
		var frame = 0;
		var timer;
		timer = window.setInterval(function() {
			var alpha = easeInOutCubic(frame++, 100, -100, 20); 
			for (var i = 0; i < checkBoxes.length; i++) {
				setAlpha(checkBoxes[i], alpha);
			}
			if (frame >= 20) {
				frame = 0;
				window.clearInterval(timer);
				timer = window.setInterval(function() {
					var padding = easeInOutCubic(frame++, 18, -18, 10); 
					for (var i = 0; i < checkBoxes.length; i++) {
						checkBoxes[i].parentNode.style.paddingLeft = padding + "px";
					}					
					if (frame == 10) {
						frame = 0;
						for (var i = 0; i < checkBoxes.length; i++) {
							var node = checkBoxes[i].parentNode;
							node.removeChild(checkBoxes[i]);
							checkBoxes[i] = node;
						}
						frame = 0;
						window.clearInterval(timer);
						var startHeights = [];
						var destHeights = [];
						for (var i = 0; i < checkBoxes.length; i++) {
							startHeights[i] = checkBoxes[i].offsetHeight;
							destHeights[i] = checkBoxes[i].offsetHeight + 15;
						}									
						
						timer = window.setInterval(function() {
							var height = easeInOutCubic(frame, srcHeight, dstHeight - srcHeight, 20);
							barometer.style.height = height + "px";
							for (var i = 0; i < checkBoxes.length; i++) {
								var newHeight = easeInOutCubic(frame, startHeights[i], destHeights[i] - startHeights[i], 20);
								checkBoxes[i].style.height = newHeight + "px";
							}					
							if (++frame == 20) {
								frame = 0;
								window.clearInterval(timer);
								var button = document.getElementById("geniesser-barometer-button");
								timer = window.setInterval(function() {
									alpha = easeInOutCubic(frame++, 100, -100, 10);
									setAlpha(button, alpha);
									if (frame == 10) {
										frame = 0;
										window.clearInterval(timer);												
										button.innerHTML = "Die Prozentwerte entsprechen dem Anteil der abgegebenen Stimmen.";
										timer = window.setInterval(function() {
											alpha = easeInOutCubic(frame++, 0, 100, 10);
											setAlpha(button, alpha);
											if (frame >= 10) {
												window.clearInterval(timer);	
												if (!percentages) {
													timer = window.setInterval(function() {
														if (percentages) {
															window.clearInterval(timer);
															showPercentages();
														}
													}, 100);
												} else {
													showPercentages();
												}
											}
										}, 10);
									}
								}, 10);
							}
						}, 10);		
					}
				}, 10);	
			}
		}, 10);
	}
	
	function submitVote() {
		if (!lastSelected) {
			alert("Bitte Treffen Sie eine Auswahl!");
			return;
		}
		var questionId = GENIESSER_BAROMETER.questionId;
		var answerId = GENIESSER_BAROMETER.answerIds[lastSelected.index];
		
		var barometer = document.getElementById("geniesser-barometer");
		var height = barometer.offsetHeight;
		barometer.style.height = height + "px";
		if (barometer.offsetHeight != height) {
			barometer.style.height = height - (barometer.offsetHeight - height) + "px";	
		}
		
		var opts = barometer.getElementsByTagName("div");
		for (var i = 0; i < opts.length; i++) {
			if (opts[i].className.indexOf("item") > -1) {
				opts[i].onclick = null;
			}
		}		
		
		var button = document.getElementById("geniesser-barometer-button");
		button.innerHTML = "Ihre Stimme wird übermittelt...";
		showResults();
		
		var xhr = getXHR();
		xhr.open("GET", "modules/geniesserbarometer/ajax.php?qid=" + questionId + "&aid=" + answerId);
		xhr.onreadystatechange = function() {
			if (xhr.readyState == 4 && xhr.status == 200) {
				percentages = xhr.responseText.split(/,/);
			}
		}
		xhr.send(null);
	}
		  
	function initBarometer(obj) {
		var opts = obj.getElementsByTagName("div");
		var index = 0;
		for (var i = 0; i < opts.length; i++) {
			if (opts[i].className == "item") {
				opts[i].onclick = itemClick;
				opts[i].index = index++;
			}
		}
		obj.getElementsByTagName("img")[0].onclick = submitVote;
	}
		  
	var barometer = document.getElementById("geniesser-barometer");
	if (barometer) {
		initBarometer(barometer);	
	}
})();