function otherTextChange(lc, txt, isMulti)
{
	var sel = document.getElementById(lc);
	txt = document.getElementById(txt);
	
	var selection = validate_getSelection(lc, true);
	
	if (txt.value == "")
		validate_setSelected(lc, "", false);
	else
	{
		if (!isMulti)
			validate_clearSelection(lc);
			
		validate_setSelected(lc, "", true);
	}
}

function selectOtherChange(lc, txt, isMulti)
{
	sel = document.getElementById(lc);
	txt = document.getElementById(txt);
	
	var selection = validate_getSelection(lc, true);
	if (!isMulti)
	{
		if (!validate_isValueSelected(lc, ""))
			txt.value = "";
		else
			txt.focus();
	}
}

function validateSelect(ctrl, args, qnum, lc, txt, mand, multi)
{
	var selected = validate_isSelected(lc);
	var txt = document.getElementById(txt);
	txt = txt == null ? "" : txt.value;
	
	if (mand && !selected && txt == "")
		return setError(ctrl, args, "Please answer question "+qnum+".");
	
	if (!multi && selected && txt != "")
		return setError(ctrl, args, "Please enter only one answer for question "+qnum + ".");
}

function setError(ctrl, args, message) 
{
	args.IsValid = false;
	ctrl.errormessage = message;
	return false;
}
	
function validate_isSelected(lc) 
{
	return validate_getSelection(lc, false).length != 0;
}

function validate_isValueSelected(lc, value) 
{
	var items = validate_getSelectItems(lc);
	var prop = validate_getSelectProperty(lc);
	
	for (var i=0; i<items.length; i++)
		if (items[i].value == value)
			return items[i][prop];
	
	return false;
}

function validateSelect_isSelected(lc)
{
	return validate_getSelection(lc, false).length != 0;
}

function validate_setSelected(lc, value, selected)
{
	var items = validate_getSelectItems(lc);
	var prop = validate_getSelectProperty(lc);
	
	for (var i=0; i<items.length; i++)
		if (items[i].value == value)
			items[i][prop] = selected;	
}

function validate_clearSelection(lc)
{
	var items = validate_getSelectItems(lc);
	var prop = validate_getSelectProperty(lc);
	
	for (var i=0; i<items.length; i++)
		items[i][prop] = false;
}

function validate_getSelection(lc, includeEmpty) 
{
	var al = new Array();
	
	var items = validate_getSelectItems(lc);
	var prop = validate_getSelectProperty(lc);

	for (var i=0; i<items.length; i++)
		if (items[i][prop] && items[i].value != "")
			al[al.length] = items[i].value;
			
	return al;
}

function validate_getSelectItems(lc)
{
	var sel = document.getElementById(lc);
	if (typeof(sel.options) != "undefined")
		return sel.options;
		
	var al = new Array();
	for (var i=0; i<1000; i++)
	{
		sel = document.getElementById(lc + '_' + i);
		if (sel == null) return al;
		al[al.length] = sel;
	}	
}

function validate_getSelectProperty(lc)
{
	var sel = document.getElementById(lc);
	if (typeof(sel.options) != "undefined")
		return "selected";
		
	return "checked";	
}

function validateDate(ctrl, args, qnumber, mand, day, month, year, hour, minute, ampm)
{
	day = document.getElementById(day).value;
	month = validate_getSelection(month, true);
	month = month.length == 0 ? "" : month[0];
	year = document.getElementById(year).value;
	hour = hour == null ? null : document.getElementById(hour).value;
	minute = minute == null ? null : document.getElementById(minute).value;
	ampm = ampm == null ? null : validate_getSelection(ampm, true)[0];
	
	var hourDisplayed = hour != null;
	
	var entered = day != "" || month != "" || year != "" || (hour != null && hour != "") || (minute != null && minute != "");
	if (mand && !entered)
		return setError(ctrl, args, "Please answer question" + qnumber + ".");
	
	if (!entered) return;
	
	if (year.length != 0 && year.length != 4) 
		return setError(ctrl, args, "Question " + qnumber + " - please enter a 4-digit year.");
	
	year = Number(year == "" ? "abc" : year);
	month = Number(month == "" ? "abc" : month) - 1; // Javascript months start from 0
	day = Number(day == "" ? "abc" : day);
	hour = hour == null ? 0 : Number(hour == "" ? "abc" : hour);
	minute = minute == null ? 0 : Number(minute == "" ? "abc" : minute);
	var am = ampm != "pm";
	hour = hour == 12 && am ? 0 : (hour != 12 && !am ? hour + 12 : hour);

	if (isNaN(year) || isNaN(month) || isNaN(day) || isNaN(hour) || isNaN(minute))
		return setError(ctrl, args, "Question " + qnumber + " contains an invalid date"+(hourDisplayed ? " or time" : "")+".");
}
