﻿var classAttr = "class";
var checkAttr = "checked";
if ($.browser.msie) {
	classAttr = "className";
	checkAttr = "defaultChecked";
}

function renderVote(data) {
	clearVoteWindow();
	voteData.currentVote.voteId = data.voteId;
	voteData.currentVote.max_count = data.max_count;
	question = create('div', 'vote-question');
	question.innerHTML = data.question;
	optList = data.options;
	inpType = data.max_count > 1 ? 'checkbox' : 'radio'
	options = new Array();
	optionCnt = create('div', 'vote-middle');
	for (i in optList) {
		cnt = create('div', 'vote-item');
		if ($.browser.msie)
			btn = document.createElement("<input type='" + inpType
					+ "' class='opt' name='opt'/>");
		else
			btn = createInput(inpType, 'opt');
		btn.setAttribute('id', optList[i].id);
		btn.setAttribute('name', 'opt');
		if (data.firstShow == false && data.changeable == false)
			btn.setAttribute('readonly', 'readonly');
		if (optList[i].filled)
			btn.setAttribute(checkAttr, checkAttr);

		cnt.appendChild(btn);
		txt = create('span', '');
		txt.innerHTML = optList[i].text;
		cnt.appendChild(txt);
		optionCnt.appendChild(cnt);
	}
	btnSubmit = createInput('button', '', '');
	if (data.firstShow == false && data.changeable == false) {
		btnSubmit.setAttribute('disabled', 'true');
		voteWindow.appendChild(getResultsButton(data.voteId));
	}
	if (data.firstShow == false && data.changeable == true)
		btnSubmit.setAttribute('value', 'Módosítás');
	else
		btnSubmit.setAttribute('value', 'Szavazás');
	/* btnSubmit.setAttribute('onclick', 'sendVote()'); */

	btnSubmit.onclick = function() {
		sendVote();
	}

	optionCnt.appendChild(btnSubmit);
	voteWindow.appendChild(question);
	voteWindow.appendChild(optionCnt);
	voteWindow.appendChild(getFooter(false));

}

function getResultsButton(voteId) {
	btn = create('a', '');
	btn.setAttribute('href', 'javascript:void(0)');
	/* btn.setAttribute('onclick', 'loadResults(' + voteId + ')'); */

	btn.onclick = function() {
		loadResults(voteId);
	}

	btn.innerHTML = 'eredmény';
	return btn;
}

function sendVote() {

	var options = $(".opt");
	params = {
		'vote_id' :voteData.currentVote.voteId
	};
	var ansCount = 0;
	for (i in options) {
		if (options[i].checked) {
			params[options[i].id] = true;
			if (++ansCount > voteData.currentVote.max_count) {
				alert('Maximum ' + voteData.currentVote.max_count + ' választ adhatsz meg');
				return;
			}

		}
	}
	if (params.length - 1 > voteData.currentVote.max_count) {
		alert("Maximum " + this.max_count + " opcióra szavazhatsz");
		return;
	}
	if (params.length == 1) {
		alert('Nem jelöltél be egy opciót sem');
		return;
	}
	renderProgressBar('küldés');
	jQuery.getJSON(rootURL + "/vote/ajax/vote", params, function(data) {
		getResults(data, true)
	});
}

function getResults(data, renderOpenVotesButton) {
	clearVoteWindow();
	if (data.type != 'error') {
		question = create('div', 'vote-question');
		question.innerHTML = data.results.title;
	}
	if (data.type != undefined) {
		msg = create('div', data.type == 'error' ? 'invalid' : 'msg');
		msg.innerHTML = data.text;
	}
	resultCnt = undefined;
	if (data.type == 'valid') {
		resultCnt = create('div', 'vote-middle');
		optList = data.results.options;
		maxCount = 0;
		for (i in optList)
			maxCount += new Number(optList[i].count);
		/* console.log('maxCount: ' + maxCount); */
		for (i in optList) {
			txt = create('div');
			txt.innerHTML = optList[i].text + ' (' + optList[i].count + ')';
			bar = create('div', 'vote-result-bar');
			if (maxCount > 0) {
				bar.style.width = (new Number((optList[i].count / maxCount)
						* voteData.resultBarMaxWidth).toFixed(0))
						+ "px";
			} else {
				bar.style.width = "0px";
			}
			// console.log(optList[i].count+" -> "+bar.style.width);
			resultCnt.appendChild(txt);
			resultCnt.appendChild(bar);
		}
		maxCountTxt = create('div', '');
		maxCountTxt.innerHTML = 'Összesen: ' + maxCount + ' szavazat';
		resultCnt.appendChild(maxCountTxt);
	}

	if (msg != undefined)
		voteWindow.appendChild(msg);
	voteWindow.appendChild(question);

	if (resultCnt != undefined)
		voteWindow.appendChild(resultCnt);
	voteWindow.appendChild(getFooter(renderOpenVotesButton));
}

function getFooter(appendOpen) {
	cnt = create('div', 'vote-footer');
	if (appendOpen) {
		openVotesLink = create('a');
		openVotesLink.setAttribute('href', 'javascript:void(0)');

		openVotesLink.onclick = function() {
			loadOpenVotes();
		}

		openVotesLink.innerHTML = 'nyitott szavazások ';
		cnt.appendChild(openVotesLink);
	}
	closedVotesLink = create('a');
	closedVotesLink.setAttribute('href', 'javascript:void(0)');

	closedVotesLink.onclick = function() {
		loadClosedVotes();
	}

	closedVotesLink.innerHTML = 'lezárt szavazások';

	cnt.appendChild(closedVotesLink);
	return cnt;
}

function loadOpenVotes() {
	renderProgressBar('betöltés');
	jQuery.getJSON(rootURL + '/vote/ajax/getopenvotes', {}, renderOpenVotes);
}

function loadClosedVotes() {
	renderProgressBar('betöltés');
	jQuery
			.getJSON(rootURL + '/vote/ajax/getclosedvotes', {},
					renderClosedVotes);
}

function renderOpenVotes(data) {
	clearVoteWindow();
	question = create('div', 'vote-question');
	question.innerHTML = 'Nyitott szavazások';
	cnt = create('div', 'vote-middle');
	if (data.length == 0) {
		cnt.innerHTML = 'Jelenleg nincsenek nyitott szavazások';
	} else {
		for (i in data) {
			linkCnt = create('div', '');
			link = create('a', '');
			link.innerHTML = data[i].description;
			link.setAttribute('href', 'javascript:void(0)');
			/* link.setAttribute('onclick', 'loadVote(' + data[i].id + ')'); */

			// link.onclick="loadVote("+data[i].id+")";
			link.onclick = generateLoadVote(data[i].id);

			linkCnt.appendChild(link);
			cnt.appendChild(linkCnt);
		}
	}
	voteWindow.appendChild(question);
	voteWindow.appendChild(cnt);
	voteWindow.appendChild(getFooter(true));
}

function generateLoadVote(id) {
	return function() {
		loadVote(id);
	};
}

function generateLoadClosedVote(id) {
	return function() {
		loadResults(id);
	};
}

function loadVote(voteId) {
	renderProgressBar('betöltés');
	params = {
		id :voteId
	};
	jQuery.getJSON(rootURL + '/vote/ajax/getvote', params, renderVote);
}

function renderClosedVotes(data) {
	clearVoteWindow();
	question = create('div', 'vote-question');
	question.innerHTML = 'Lezárt szavazások';
	cnt = create('div', 'vote-middle');
	if (data.length == 0) {
		cnt.innerHTML = 'Jelenleg nincsenek lezárt szavazások';
	} else {
		for (i in data) {
			linkCnt = create('div', '');
			link = create('a', '');
			link.innerHTML = data[i].description;
			link.setAttribute('href', 'javascript:void(0)');
			/* link.setAttribute('onclick', 'loadVote(' + data[i].id + ')'); */

			// link.onclick="loadVote("+data[i].id+")";
			link.onclick = generateLoadClosedVote(data[i].id);

			linkCnt.appendChild(link);
			cnt.appendChild(linkCnt);
		}
	}
	voteWindow.appendChild(question);
	voteWindow.appendChild(cnt);
	voteWindow.appendChild(getFooter(true));
}

function loadResults(voteId) {
	renderProgressBar('betöltés');
	params = {
		id :voteId
	};
	jQuery.getJSON(rootURL + '/vote/ajax/getvoteresults', params,
			function(data) {
				getResults(data, true)
			});
}

function renderProgressBar(txt) {
	clearVoteWindow();
	pgBarCnt = create('div', '');
	pgBarCnt.setAttribute('id', 'vote-progressbar');
	voteData.animationCounter = 0;
	voteData.animationText = txt;
	voteData.voteAnimation = setInterval(animate, 400);
	voteWindow.appendChild(pgBarCnt);
}

function animate() {
	dots = '';
	for (i = 0; i < voteData.animationCounter; i++)
		dots += '.';
	if (++voteData.animationCounter == 4)
		voteData.animationCounter = 0;
	e('vote-progressbar').innerHTML = voteData.animationText + dots;
}

function clearVoteWindow() {
	if (voteData.voteAnimation)
		clearInterval(voteData.voteAnimation);
	while (voteWindow.lastChild) {
		voteWindow.removeChild(voteWindow.lastChild);
	}

}

function create(element, clazz) {
	var e = document.createElement(element);
	e.setAttribute(classAttr, clazz);
	return e;
}

function createInput(type, clazz) {
	var e = document.createElement('input');
	e.setAttribute('type', type);
	e.setAttribute(classAttr, clazz);
	return e;
}

function e(id) {
	return document.getElementById(id);
}
