//-----------------------------------------------------------------------------
// Globally used variables.
//-----------------------------------------------------------------------------
var codesAnswer = new Array(0);
var allCategories = new Array(0);
//=============================================================================
// Answer object holds code id and a possible reference to the open answer
//=============================================================================
function Answer(input) {
	this.checkbox = input;
	this.id = input.id;
	this.holder = document.getElementById(this.id + "-holder");
	this.orderColumn = findElementByClassName(this.holder, "odincategorymarkcolumn");
	this.codevalue = parseInt(this.checkbox.value);
	if (this.checkbox.className.indexOf("odincategorycheckopen") >= 0) {				
		this.openInput = document.getElementById(this.checkbox.id + "odinopenquestion");
	} else {
		this.openInput = null;	
	}
}
//-----------------------------------------------------------------------------
// Initialiser functions called from HTML page.
//-----------------------------------------------------------------------------
function initialiseCodesQuestion() {
	initialiseQuestion();
	var codelist = findElementByClassName(document.forms[0], "odincodelist")
	if (codelist && codelist.className.indexOf("multi") > 0) {
		questionConstraints.useJavascriptAnswer.value = "true";
	}
	fillAllCategories();
	fillCodesAnswer();
	if (odinbrowser && odinbrowser.isIE) {
		questionConstraints.questionForm.attachEvent("onsubmit", fillJavascriptAnswer);
		document.attachEvent("onkeydown", OdinOnCodesQuestionKeyDown);
	} else {
		questionConstraints.questionForm.onsubmit = fillJavascriptAnswer;
		document.addEventListener("keydown", OdinOnCodesQuestionKeyDown, false);
	}
}

function OdinOnCodesQuestionKeyDown(event) {
	if (window.event) {
		event = window.event;
	}
	if (event.keyCode == 13) {
		if (window.event) {
			event.returnValue = false;
			event.cancelBubble = true;
		} else {
			event.preventDefault();
			event.stopPropagation();
		}
		clickOK();
	}
}	

// all events that are called for a codes question's category
function OdinOnCategoryHolderMouseOut(event, sender) {
	var cls = sender.className;
	var re = new RegExp(" odincategory-hovered", "g");
	sender.className = cls.replace(re, "");
}
function OdinOnCategoryHolderMouseOver(event, sender) {
	var cls = sender.className;
	if (cls.indexOf("odincategory-hovered") < 0) {
		sender.className = cls + " odincategory-hovered";
	}
}
function OdinOnCategoryHolderDblClick(event, sender, id) {
	var cat = document.getElementById(id);
	if (cat.checked == null || cat.checked == false) {
		cat.checked = true;
	} else {
		cat.checked = false;
	}
	if (odinbrowser != null && odinbrowser.isIE) {
		cat.checked = !cat.checked;
	}
	var post = cat.checked;
	clickCategory(cat);
	if (event && event.stopPropagation) {
		event.stopPropagation();
		event.preventDefault();
	} else {
		event.returnValue = false;
		window.event.cancelBubble = true;
	}
	if (post) {
		clickOK();
	}
}
function OdinOnCategoryHolderClick(event, sender, id) {
	var cat = document.getElementById(id);
	if (cat.checked == null || cat.checked == false) {
		cat.checked = true;
	} else {
		cat.checked = false;
	}
	clickCategory(cat);
	if (event && event.stopPropagation) {
		event.stopPropagation();
		event.preventDefault();
	} else {
		event.returnValue = false;
		window.event.cancelBubble = true;
	}
}
function OdinOnCategoryClick(event, sender) {
	clickCategory(sender);
	if (event && event.stopPropagation) {
		event.stopPropagation();
	} else {
		window.event.cancelBubble = true;
	}
}
function OdinOnCategoryOpenClick(event, sender) {
	if (event && event.stopPropagation) {
		event.stopPropagation();
	} else {
		window.event.cancelBubble = true;
	}
}
function OdinOnCategoryOpenKeyUp(event, sender) {
	var openid = sender.id;
	var pos = openid.indexOf("odinopenquestion");
	if (pos >= 0) {
		var catid = openid.substring(0, pos);
		var cat = document.getElementById(catid);
		if (cat) {
			var text = sender.value;
			if (text && text != "") {
				if (cat.checked == false) {
					cat.checked = true;
					clickCategory(cat);
				}
			} else {
				if (cat.checked == true) {
					cat.checked = false;
					clickCategory(cat);
				}
			}
		}
	}
}
//----------------------------------------------------------------
// functions for working with codes questions
//----------------------------------------------------------------
function deselectNmul() {
	for (var i = 0; i < allCategories.length; ++i) {
		input = allCategories[i].checkbox;
		if (input.className.indexOf("odincategorychecknmul") >= 0 && input.checked == true) {
			input.checked = false;
			clickCategoryAndPerform(input, "false");
		}
	}
}
function deselectAllExcept(category) {
	for (var i = 0; i < allCategories.length; ++i) {
		input = allCategories[i].checkbox;
		if (input.id != category.id && (input.checked == true || input.className.indexOf("odincategorychecksingle") >= 0)) {
			input.checked = false;
			clickCategoryAndPerform(input, "false");
		}
	}
}
function clickCategory(code) {
	clickCategoryAndPerform(code, "true");
}
function clickCategoryAndPerform(code, performClick) {
	var clickedAnswer = findAnswer(parseInt(code.value))
	if (questionConstraints.useJavascriptAnswer.value == "true") {
		if (code.checked == true) {
			var found = false;
			for (var i = 0; i < codesAnswer.length; i++) {
				if (codesAnswer[i] == clickedAnswer) {
					found = true;
					break;
				}
			}
			if (found == false) {
				codesAnswer[codesAnswer.length] = clickedAnswer;
				if (questionConstraints.orderCategories && questionConstraints.orderCategories == true)  {
					codesAnswer[codesAnswer.length - 1].orderColumn.innerHTML = "&nbsp;&nbsp;[" + codesAnswer.length + "]";
					var cls = clickedAnswer.holder.className;
					clickedAnswer.holder.className = cls + " odincategory-ordered";
				}
			}
		} else {
			if (questionConstraints.orderCategories && questionConstraints.orderCategories == true)  {
				clickedAnswer.orderColumn.innerHTML = "";
				var cls = clickedAnswer.holder.className;
				var re = new RegExp("odincategory-ordered", "g");
				clickedAnswer.holder.className = cls.replace(re, "");
			}
			var oldAnswers = new Array(0);
			for (var i = 0; i < codesAnswer.length; ++i) {
				oldAnswers[oldAnswers.length] = codesAnswer[i];
			}
			codesAnswer = new Array(0);
			for (var i = 0; i < oldAnswers.length; i++) {
				if (oldAnswers[i].codevalue != parseInt(code.value)) {
					codesAnswer[codesAnswer.length] = oldAnswers[i];
					if (questionConstraints.orderCategories && questionConstraints.orderCategories == true)  {
						codesAnswer[codesAnswer.length - 1].orderColumn.innerHTML = "&nbsp;&nbsp;[" + codesAnswer.length + "]";
					}
				}
			}
		}
	} else {
		if (code.checked == true) {
			codesAnswer[0] = findAnswer(parseInt(code.value));
		}
	}
	if (!document.getElementById) {
		return true;
	}
	var cls = clickedAnswer.holder.className;
	if (code.checked == true) {
		if (cls.indexOf("odincategory-checked") < 0) {
			clickedAnswer.holder.className = cls + " odincategory-checked";
		}
	} else {
		var re = new RegExp("odincategory-checked", "g");
		clickedAnswer.holder.className = cls.replace(re, "");
	}
	if (performClick && performClick == "true") {
		if (code.checked == true) {
			if (code.className.indexOf("odincategorycheckmulti") >= 0) {
				deselectNmul();
			} else if (code.className.indexOf("odincategorychecknmul") >= 0 || code.className.indexOf("odincategorychecksingle") >= 0) {
				deselectAllExcept(code);
			}
			if (code.className.indexOf("odincategorycheckopen") >= 0) {
				clickedAnswer.openInput.focus();
			}
		}
	}
}
function fillJavascriptAnswer(event) {
	var javascriptAnswer = "";
	// if a questionnaire defined button is clicked, effectively clear all other answers.
	if (clickedButton.indexOf("QBUT") == -1) {
		for (var i = 0;i < codesAnswer.length; ++i) {
			javascriptAnswer += codesAnswer[i].codevalue + "\b";
			if (codesAnswer[i].openInput){
				if (clickedButton == "OK" && (!codesAnswer[i].openInput.value || codesAnswer[i].openInput.length == 0)) {
					// An open code is not filled.
					reportValidationError(8, null);
// will have to be enabled for if reporting validation errors is in place
//					codesAnswer[i].openInput.focus();
//					return false;
				}
				javascriptAnswer += codesAnswer[i].openInput.value + "\b";
			}
		}
		if (clickedButton == "OK" && javascriptAnswer.length == 0 && questionConstraints.allowNon != true) {
			// No answer is given, while one is expected
			reportValidationError(1, null);
// will have to be enabled for if reporting validation errors is in place
//			return false;
		}
	}
	questionConstraints.javascriptAnswer.value = javascriptAnswer;
	return true;
}
function fillCodesAnswer() {
	if (questionConstraints.javascriptAnswer.value.length == 0) {
		return true;
	}
	var oldAnswers = questionConstraints.javascriptAnswer.value.split("\b");
	var i = 0;
	codesAnswer = new Array(0);
	while (i < oldAnswers.length) {
		var answer = findAnswer(parseInt(oldAnswers[i]));
		if (answer) {
			if (answer.openInput) {
				++i;
			}
			clickCategoryAndPerform(answer.checkbox, "false");
		}
		++i;
	}
	questionConstraints.javascriptAnswer.value = "";
}
function fillAllCategories() {
	var inputs = document.getElementsByTagName("input");
	if (inputs) {
		for (var i = 0; i < inputs.length; ++i) {
			if (inputs[i].className && inputs[i].className.indexOf("odincategory") >= 0) {
				if (!(inputs[i].disabled == true) && !(inputs[i].className.indexOf("odincategory-hidden") >= 0)) {
					allCategories[allCategories.length] = new Answer(inputs[i]);
				}
			}
		}
	}
}
function findAnswer(code) {
	for (var i = 0; i < allCategories.length; ++i) {
		var answer = allCategories[i];
		if (answer.codevalue == code) {
			return answer;
		}
	}
	return null;
}
//-----------------------------------------------------------------------------
// A linked validation error text has been clicked
//-----------------------------------------------------------------------------
function validationErrorClick(error) {
}

