/* Tool guide logic */

var ToolGuide = function() {
	// -------------------------
	// *** Private variables ***
	// -------------------------
	var _detailsNode;
	var _compareNode;
	var _form;
	var _criteria = new Object();
	
	// -----------------------
	// *** Private methods ***
	// -----------------------

	// Build hash from current form data
	var getHashFromForm = function() {
		var args = _form.serialize().split("&");

		var argshash = new Array();
		for(var i = 0; i < args.length; i++) {
			if(args[i].substr(0, 2) != "__") {
				argshash.push(encodeURIComponent(args[i]));
			}
		}

		return argshash.join("-");
	};

	// Extract args from hash and update form	
	var getArgsFromHash = function(hash) {
		var args = new Array();

		var formvars = _form.serialize().split("&");
		for(var i = 0; i < formvars.length; i++) {
			if(formvars[i].substr(0,2) == "__")
				args.push(formvars[i]);
		}
		
		var hashvars = hash.split("-");
		for(var i = 0; i < hashvars.length; i++) {
			var arg = decodeURIComponent(hashvars[i]);
			var argparts = arg.split("=");
			if(argparts.length == 2) {
				setFormValue(argparts[0], argparts[1], _criteria[argparts[0]]);
			}
			args.push(arg);
		}
		
		return args.join("&");
	};

	var historyCallback = function(hash) {
		if(hash == "") {
			if(typeof(ToolGuideAnimator) == "object")
				ToolGuideAnimator.hideAll();
			else
				hideAll();
			return;
		}

		var args = getArgsFromHash(hash);
		args += "&ajax=true";
		
		$("#tg_loading").show();

		if(typeof(ToolGuideAnimator) == "object" && typeof(ToolGuideAnimator.onBeforeRequest) == "function")
			ToolGuideAnimator.onBeforeRequest();
		else
			onBeforeRequest();

		$.ajax({
			type: "GET",
			url: location.pathname + location.search,
			data: args,
			dataType: "json",
			success: function(result) {
				if(typeof(ToolGuideAnimator) == "object")
					ToolGuideAnimator.animateResult(result);
				else
					showResult(result);

				$("#tg_loading").hide();
			}
		});
	};

	var hideAll = function() {
		$("#tg_result").fadeOut("slow");
	};

	var onBeforeRequest = function() {
		$("#tg_result").fadeOut("fast");
	};
	
	var showResult = function(result) {
		if(result.products.length > 0) {
			$("#tg_noresult").fadeOut("slow");
			renderResult(result);
		}
		else {
			$("#tg_noresult").fadeIn("slow");
		}
	};

	var renderResult = function(result) {
		var outputdiv = $("#tg_result");
		outputdiv.empty();

		var templatediv;
		var techdatadiv;
		if(result.mode == "full") {
			templatediv = $("#tg_template_detailed");
			techdatadiv = $("div.tg_techdata", templatediv);
		}
		else {
			templatediv = $("#tg_template_compact");
		}

		$.each(result.products, function(i, item) {

			var clone = templatediv.clone().removeAttr("id");
			clone.find(".tg_name").text(item.name);
			
			if (i % 2 == 1)
				clone.addClass("tg_alt");
			
			var imgurl = item.img;
			if(imgurl != null && imgurl.length > 0)
				clone.find(".tg_img").attr("src", imgurl).attr("title", item.name);
			else
				clone.find(".tg_img").remove();

			clone.find("a").attr("href", _detailsNode + "?pid=" + item.pid + "&nid=" + item.nid);

			if(item.attrs) {
				var tdlocation = $(".tg_techdata", clone);
				$.each(item.attrs, function(j, techdata) {
					var tddiv = techdatadiv.clone();
					$(".tg_tdname", tddiv).text(techdata.name + ":");
					$(".tg_tdval", tddiv).text(techdata.values);
					if(j % 2 == 1)
						tddiv.addClass("tg_alt");
					tddiv.insertBefore(tdlocation);
				});
				tdlocation.remove();
			}

			clone.show();
			outputdiv.append(clone);

		});
		outputdiv.fadeIn("slow");
	};
		
	var setFormValue = function(hiddenid, value, type) {
		value = value.replace(/%3B/g, ";");	// IE6 fix
		value = value.replace(/\+/g, " ");	// IE fix

		switch (type) {
			case "DoubleSliderCriterion":
				setSliderState(hiddenid, value);
				break;
			case "AttributeSteppingSliderCriterion":
				setSteppingSliderState(hiddenid, value);
				break;
			case "CheckBoxCriterion":
				setCheckBoxToChecked(hiddenid, value);
				break;
			case "RadioListCriterion":
				setCheckBoxToChecked(hiddenid, value);
				break;
			case "OnOffListCriterion":
				setOnOffListItemValue(hiddenid, value);
				break;
			case "CheckListCriterion":
				setCheckListItemsToChecked(hiddenid, value);
				break;
			case "OnOffSwitchCriterion":
				setOnOffSwitchValue(hiddenid, value);
				break;
		}
	};

	return {
	// -----------------------
	// *** Public fields ***
	// -----------------------
	resultCountFormat : "",

	// -----------------------
	// *** Public methods ***
	// -----------------------

	getCompareNode : function() {
		return _compareNode;
	},
	
	getDetailsNode : function() {
		return _detailsNode;
	},

	doSubmitForm : function(form) {
		var hash = getHashFromForm();
		$.history.load(hash);
	},
	
	init : function(detailsNode, compareNode, showResultOnInitialLoad) {
		$().ajaxError(function(evt, request, options, error) {
			$("#tg_loading").hide();
			if(request.status != 200)
				alert("Unexpected error: " + request.status + " " + request.statusText);
			else
				alert("An unexpected server error has occured.");
		});

		_detailsNode = detailsNode;
		_compareNode = compareNode;
		
		_form = $("form:has(div.ToolGuide)");
		
		// Hookup click events
		$("div.Criterion div.Checkbox :checkbox").click(function() {
			ToolGuide.doSubmitForm(this.form);
		});

		$("div.Criterion div.RadioList :radio").click(function() {
			ToolGuide.doSubmitForm(this.form);
		});
		
		$.history.init(historyCallback);
		
		if(showResultOnInitialLoad && location.hash == "")
			ToolGuide.doSubmitForm(_form);
	},

	onFormSubmit : function(e) {
		doSubmitForm(e.target);
		return false;
	},
	
	registerCriterion : function(name, type) {
		_criteria[name] = type;
	},
	
	reset : function() {
		location.href = location.pathname + location.search;
	}

// ToolGuide end
}}();

/************************/
/*** Custom criterion ***/
/************************/

function checkDependencies(identifier, selected) {
	for (var h in dep) {
		var opt = dep[h];
		
		if (identifier != "" && opt["depIdentifier"] == identifier) {
			if ((opt["depEvaluation"] == "WhenSelected" && selected == true)
					|| (opt["depEvaluation"] == "WhenUnselected" && selected == false)) {
				document.getElementById(opt["hiddenId"]).disabled = true;
				document.getElementById(opt["hiddenId"]).checked = opt["depResult"] == "SelectedAndDisabled";
				document.getElementById(opt["hiddenId"] + "_label").className = "OptionLabel Disabled";
			}
			else {
				document.getElementById(opt["hiddenId"]).disabled = false;
				document.getElementById(opt["hiddenId"] + "_label").className = "OptionLabel";
			}
		}
	}
}

function ensureSolo(hiddenId, parentHiddenId) {
	var inputs = document.getElementsByTagName("input");
	
	for (var i = 0; i < inputs.length; i++)
		if (inputs[i].value == parentHiddenId && inputs[i].id != hiddenId && inputs[i].type.toLowerCase() == "radio")
			inputs[i].checked = false;
	
	for (var h in dep) {
		var opt = dep[h];
		
		checkDependencies(opt["identifier"], document.getElementById(opt["hiddenId"]).checked);
	}
	
	ToolGuide.doSubmitForm(document.forms[0]);
}

/***************/
/*** Sliders ***/
/***************/

//Take care of IE flicker
if (navigator.appName == "Microsoft Internet Explorer")
	document.execCommand("BackgroundImageCache", false, true);

var indicatorOnDisplay = false;
var isStep = false;
var adjustment;
var slidingObject = null;
var rangeObject = null;
var indicatorObject = null;
var slidingHiddenId = "";
var slidingHandle = "";
var originalMouseMoveHandler;
var originalMouseUpHandler;
var originalSelectHandler;
var originalDragHandler;
var parentOffset = 0;
var min, max;
var minIndex, maxIndex;
var SLIDER_WIDTH = 253;
var HANDLE_WIDTH = 13;
var SLIDER_WIDTH_NETTO = SLIDER_WIDTH - HANDLE_WIDTH;
var rulerStart, rulerEnd;
var leftLabel, rightLabel;
var unit = "mm";
var initialized = new Object();
var asslValues = new Object();
var units = new Object();

if (navigator.appName == "Microsoft Internet Explorer")
	adjustment = 2;		// IE
else if (navigator.appVersion.indexOf("Safari") != -1)
	adjustment = -15;	// Safari
else
	adjustment = -6;	// Firefox and Opera

function setSliderState(hiddenId, value) {
	var rulerStart = parseInt(document.getElementById("pixels_" + hiddenId).getAttribute("rulerStart"));
	var rulerEnd = parseInt(document.getElementById("pixels_" + hiddenId).getAttribute("rulerEnd"));
	
	var pxMin = translateToPixels(parseInt(value.split(";")[0]), rulerEnd, rulerStart);
	var pxMax = translateToPixels(parseInt(value.split(";")[1]), rulerEnd, rulerStart);
	
	var valueMin = parseFloat(value.split(";")[0]);
	var valueMax = parseFloat(value.split(";")[1]);	
	var minHandle = document.getElementById("minHandle_" + hiddenId);
	var maxHandle = document.getElementById("maxHandle_" + hiddenId);
	var unit = units[hiddenId];
	
	rangeObject = document.getElementById("range_" + hiddenId);
	leftLabel = document.getElementById("leftLabel_" + hiddenId);
	rightLabel = document.getElementById("rightLabel_" + hiddenId);
	
	minHandle.style.left = pxMin + "px";
	maxHandle.style.left = pxMax + "px";
	
	rangeObject.style.left = pxMin + "px"
	rangeObject.style.width = (pxMax - pxMin + 1) + "px";
	
	leftLabel.innerHTML = valueMin + " " + unit;
	rightLabel.innerHTML = valueMax + " " + unit;
	
	// Adjust label positions
	
	leftLabelMargin = pxMin + 6;
	rightLabelMargin = SLIDER_WIDTH - pxMax - 6;
	
	while (leftLabelMargin + rightLabelMargin + leftLabel.offsetWidth + rightLabel.offsetWidth > SLIDER_WIDTH - 10) {
		leftLabelMargin -= leftLabelMargin > 6 ? 1 : 0;
		rightLabelMargin -= rightLabelMargin > 7 ? 1 : 0;
	}
	
	leftLabel.style.marginLeft = leftLabelMargin + "px";
	rightLabel.style.marginRight = rightLabelMargin + "px";
	
	document.getElementById("pixels_" + hiddenId).value = pxMin + ";" + pxMax;
	document.getElementById(hiddenId).value = valueMin + ";" + valueMax;
	initialized[hiddenId] = true;
}

function setSteppingSliderState(hiddenId, value) {
	var valueMin = parseInt(value.split(";")[0]);
	var valueMax = parseInt(value.split(";")[1]);	
	var minHandle = document.getElementById("minHandle_" + hiddenId);
	var maxHandle = document.getElementById("maxHandle_" + hiddenId);
	var pxMin = translateSteppingIndexToPixels(valueMin, asslValues[hiddenId].length - 1);
	var pxMax = translateSteppingIndexToPixels(valueMax, asslValues[hiddenId].length - 1);
	
	rangeObject = document.getElementById("range_" + hiddenId);
	
	minHandle.style.left = pxMin + "px";
	maxHandle.style.left = pxMax + "px";
	
	rangeObject.style.left = pxMin + "px"
	rangeObject.style.width = (pxMax - pxMin + 1) + "px";
	
	document.getElementById("pixels_" + hiddenId).value = pxMin + ";" + pxMax;
	document.getElementById(hiddenId).value = valueMin + ";" + valueMax;
	
	initialized[hiddenId] = true;
}

function translateToValue(pixels) {
	var range = rulerEnd - rulerStart;
	var result = pixels / (SLIDER_WIDTH - HANDLE_WIDTH) * range + rulerStart;
	
	return result.toFixed(0);
}

function translateToPixels(value, rulerEnd, rulerStart) {
	var range = rulerEnd - rulerStart;

	return (value - rulerStart) / range * (SLIDER_WIDTH - HANDLE_WIDTH);
}

function translateToSteppingIndex(pixels, stepCount) {
	var u = SLIDER_WIDTH_NETTO / (stepCount - 1);
	var index = Math.round(pixels / u);
	
	index = Math.min(index, stepCount - 1);
	index = Math.max(index, 0);
	
	return index;
}

function translateSteppingIndexToPixels(index, stepCount) {
	var u = SLIDER_WIDTH_NETTO / stepCount;
	var left = index * u;

	//left = Math.round(left / u) * u;
	return left;
}

function displayIndicator(handle, hiddenId, whichHandle) {
	if (slidingObject != null) return;
	
	if (initialized[hiddenId] != true) {
		document.getElementById("pixels_" + hiddenId).value = document.getElementById("initial_" + hiddenId).value
		document.getElementById(hiddenId).value = "0;" + (asslValues[hiddenId].length - 1);
	}
	
	indicatorOnDisplay = true;
	indicatorObject = document.getElementById("indicator_" + hiddenId);
	var handlePosition = document.getElementById("pixels_" + hiddenId).value.split(";")[whichHandle == "min" ? 0 : 1];
	var currentStepIndex = document.getElementById(hiddenId).value.split(";")[whichHandle == "min" ? 0 : 1];
	
	indicatorObject.innerHTML = asslValues[hiddenId][currentStepIndex];
	
	var indicatorPosition = Math.max(handlePosition - indicatorObject.offsetWidth / 2 + HANDLE_WIDTH / 2, 0);
	indicatorPosition = Math.min(indicatorPosition, SLIDER_WIDTH - indicatorObject.offsetWidth);
	indicatorObject.style.left = indicatorPosition + "px";
	
	setTimeout("doDisplayIndicator();", 400);
}

function doDisplayIndicator() {
	if (indicatorOnDisplay == true) indicatorObject.style.visibility = "visible";
}

function hideIndicator(hiddenId) {
	indicatorObject = null;
	indicatorOnDisplay = false;
	var indicatorObject = document.getElementById("indicator_" + hiddenId);
	indicatorObject.style.visibility = "hidden";
}

/**
 * Handles the mouse move event when sliding
 * 
 * @author          JOKN
 */
function document_mouseMove(e) {
	if (slidingObject == null) return;
	if (e == null) e = window.event; //Explorer-specific
	var left = e.clientX - parentOffset;
	var leftLabelMargin, rightLabelMargin;
	
	if (left < -adjustment) left = -adjustment;
	if (left > SLIDER_WIDTH - HANDLE_WIDTH - adjustment) left = SLIDER_WIDTH - HANDLE_WIDTH - adjustment;
	if (slidingHandle == "min" && left >= max - adjustment) left = max - adjustment;
	if (slidingHandle == "max" && left <= min - adjustment) left = min - adjustment;
	
	left += adjustment;
	
	if (isStep) {
		var u = SLIDER_WIDTH_NETTO / (asslValues[slidingHiddenId].length - 1);
		var currentStepIndex = translateToSteppingIndex(left, asslValues[slidingHiddenId].length);
		
		// Never cross the other handle
		
		if (slidingHandle == "min") currentStepIndex = Math.min(currentStepIndex, translateToSteppingIndex(max, asslValues[slidingHiddenId].length));
		if (slidingHandle == "max") currentStepIndex = Math.max(currentStepIndex, translateToSteppingIndex(min, asslValues[slidingHiddenId].length));
		
		// Simulate the snapping effect
		
		left = Math.round(left / u) * u;
	}
	
	if (slidingHandle == "min" && !isNaN(left)) min = left;
	if (slidingHandle == "max" && !isNaN(left)) max = left;
	
	// Adjust handle position
	
	slidingObject.style.left = left + "px";
	
	// Adjust range fill
	
	rangeObject.style.left = min + "px";
	rangeObject.style.width = (max - min + 1) + "px";
	
	if (!isStep) {
		
		// Set label contents
		
		leftLabel.innerHTML = translateToValue(min) + " " + unit;
		rightLabel.innerHTML = translateToValue(max) + " " + unit;
		
		// Adjust label positions
		
		leftLabelMargin = min + 6;
		rightLabelMargin = SLIDER_WIDTH - max - 6;
		
		while (leftLabelMargin + rightLabelMargin + leftLabel.offsetWidth + rightLabel.offsetWidth > SLIDER_WIDTH - 10) {
			leftLabelMargin -= leftLabelMargin > 6 ? 1 : 0;
			rightLabelMargin -= rightLabelMargin > 7 ? 1 : 0;
		}
		
		leftLabel.style.marginLeft = leftLabelMargin + "px";
		rightLabel.style.marginRight = rightLabelMargin + "px";
	}
	else {
		indicatorObject.innerHTML = asslValues[slidingHiddenId][currentStepIndex];
		
		var indicatorPosition = Math.max(left - indicatorObject.offsetWidth / 2 + HANDLE_WIDTH / 2, 0);
		indicatorPosition = Math.min(indicatorPosition, SLIDER_WIDTH - indicatorObject.offsetWidth);
		indicatorObject.style.left = indicatorPosition + "px";
		indicatorObject.style.visibility = "visible";
	}
}

function document_mouseUp(e) {
	if (slidingObject == null) return;
	if (e == null) e = window.event; //Explorer-specific
	
	if (isStep)
		endStepping();
	else
		endSlide();
}

/**
 * Makes the handle follow the cursor
 * 
 * @param objHandle What element to move
 * @param hiddenId	So that the position is reported back to the server
 * @author          JOKN
 */
function beginSlide(objHandle, hiddenId, whichHandle, rulerStart, rulerEnd, unit) {
	//Set objects
	slidingObject = objHandle;
	slidingHiddenId = hiddenId;
	slidingHandle = whichHandle;
	rangeObject = document.getElementById("range_" + hiddenId);
	leftLabel = document.getElementById("leftLabel_" + hiddenId);
	rightLabel = document.getElementById("rightLabel_" + hiddenId);
	this.rulerStart = parseInt(rulerStart);
	this.rulerEnd = parseInt(rulerEnd);
	this.unit = unit;
	
	// Calculate offset
	
	var obj = objHandle.parentNode;
	var leftMargin = 0;
	
	if (navigator.appName == "Microsoft Internet Explorer") {
		leftMargin = parseInt(obj.currentStyle.marginLeft)
		if (isNaN(leftMargin)) leftMargin = 0;
	}
	
	parentOffset += obj.offsetLeft - leftMargin;
	
	// If IE, add offset for parent tables
	
	var insideTable = false;
	
	while (obj != document.body) {
		if (obj.nodeName.toLowerCase() == "table") {
			insideTable = true;
			break;
		}
		
		obj = obj.parentNode;
	}
	
	obj = objHandle.parentNode;
	
	if (navigator.appName == "Microsoft Internet Explorer" && insideTable == true) {
		while (obj != document.body) {
			leftMargin = parseInt(obj.currentStyle.marginLeft)
			if (isNaN(leftMargin)) leftMargin = 0;
			
			parentOffset += obj.offsetLeft - leftMargin;
			
			obj = obj.parentNode;
		}
	}
	else if (navigator.appName == "Microsoft Internet Explorer" && insideTable == false) {
		adjustment = -8;
	}
	
	// Initialize values
	
	if (initialized[hiddenId] != true)
		document.getElementById("pixels_" + slidingHiddenId).value = document.getElementById("initial_" + slidingHiddenId).value
	
	var values = document.getElementById("pixels_" + slidingHiddenId).value.split(";");
		
	min = parseInt(values[0]);
	max = parseInt(values[1]);
	
	initialized[hiddenId] = true;
	
	//Set handlers
	originalMouseMoveHandler = document.documentElement.onmousemove;
	originalMouseUpHandler = document.documentElement.onmouseup;
	originalSelectHandler = document.onselectstart;
	originalDragHandler = document.ondragstart;
	document.documentElement.onmousemove = document_mouseMove;
	document.documentElement.onmouseup = document_mouseUp;
	document.onselectstart = function() { return false; }
	document.ondragstart = function() { return false; }
}

/**
 * Makes the handle stop following the cursor
 * 
 * @author          JOKN
 */
function endSlide() {
	document.getElementById(slidingHiddenId).value = translateToValue(min) + ";" + translateToValue(max);
	document.getElementById("pixels_" + slidingHiddenId).value = min + ";" + max;

	document.documentElement.onmousemove = originalMouseMoveHandler;
	document.documentElement.onmouseup = originalMouseUpHandler;
	document.onselectstart = originalSelectHandler;
	document.ondragstart = originalDragHandler;
	
	bringHandleToFront(slidingObject, slidingHiddenId);
	
	slidingObject = null;
	slidingHiddenId = "";
	parentOffset = 0;
	
	ToolGuide.doSubmitForm(document.forms[0]);
}

function bringHandleToFront(objHandle, hiddenId) {
	var minHandle = document.getElementById("minHandle_" + hiddenId);
	var maxHandle = document.getElementById("maxHandle_" + hiddenId);
	
	minHandle.style.zIndex = 1;
	maxHandle.style.zIndex = 1;
	
	objHandle.style.zIndex = 2;
}

function beginStepping(objHandle, hiddenId, whichHandle) {
	//Set objects
	isStep = true;
	slidingObject = objHandle;
	slidingHiddenId = hiddenId;
	slidingHandle = whichHandle;
	rangeObject = document.getElementById("range_" + hiddenId);
	indicatorObject = document.getElementById("indicator_" + hiddenId);
	leftLabel = document.getElementById("leftLabel_" + hiddenId);
	rightLabel = document.getElementById("rightLabel_" + hiddenId);
	this.rulerStart = parseInt(rulerStart);
	this.rulerEnd = parseInt(rulerEnd);
	this.unit = unit;
	
	// Calculate offset
	
	var obj = objHandle.parentNode;
	var leftMargin = 0;
	
	if (navigator.appName == "Microsoft Internet Explorer") {
		leftMargin = parseInt(obj.currentStyle.marginLeft)
		if (isNaN(leftMargin)) leftMargin = 0;
	}
	
	parentOffset += obj.offsetLeft - leftMargin;
	
	// If IE, add offset for parent tables
	
	var insideTable = false;
	
	while (obj != document.body) {
		if (obj.nodeName.toLowerCase() == "table") {
			insideTable = true;
			break;
		}
		
		obj = obj.parentNode;
	}
	
	obj = objHandle.parentNode;
	
	if (navigator.appName == "Microsoft Internet Explorer" && insideTable == true) {
		while (obj != document.body) {
			leftMargin = parseInt(obj.currentStyle.marginLeft)
			if (isNaN(leftMargin)) leftMargin = 0;
			
			parentOffset += obj.offsetLeft - leftMargin;
			
			obj = obj.parentNode;
		}
	}
	else if (navigator.appName == "Microsoft Internet Explorer" && insideTable == false) {
		adjustment = -8;
	}
	
	//Initialize values	
	if (initialized[hiddenId] != true) {
		document.getElementById("pixels_" + slidingHiddenId).value = document.getElementById("initial_" + slidingHiddenId).value
		document.getElementById(slidingHiddenId).value = "0;" + (asslValues[slidingHiddenId].length - 1);
	}
	
	var values = document.getElementById("pixels_" + slidingHiddenId).value.split(";");
		
	min = parseInt(values[0]);
	max = parseInt(values[1]);
	
	initialized[hiddenId] = true;
	
	//Set handlers
	originalMouseMoveHandler = document.documentElement.onmousemove;
	originalMouseUpHandler = document.documentElement.onmouseup;
	originalSelectHandler = document.onselectstart;
	originalDragHandler = document.ondragstart;
	document.documentElement.onmousemove = document_mouseMove;
	document.documentElement.onmouseup = document_mouseUp;
	document.onselectstart = function() { return false; }
	document.ondragstart = function() { return false; }
}

function endStepping() {
	document.getElementById(slidingHiddenId).value = translateToSteppingIndex(min, asslValues[slidingHiddenId].length) + ";" + translateToSteppingIndex(max, asslValues[slidingHiddenId].length);
	document.getElementById("pixels_" + slidingHiddenId).value = min + ";" + max;
	
	document.documentElement.onmousemove = originalMouseMoveHandler;
	document.documentElement.onmouseup = originalMouseUpHandler;
	document.onselectstart = originalSelectHandler;
	document.ondragstart = originalDragHandler;
	
	bringHandleToFront(slidingObject, slidingHiddenId);
	
	isStep = false;
	slidingObject = null;
	slidingHiddenId = "";
	parentOffset = 0;
	
	indicatorObject.style.visibility = "hidden";
	ToolGuide.doSubmitForm(document.forms[0]);
}


/*********************/
/**** On-off list ****/
/*********************/

var classNamePrefixes = new Array("On", "Off");

function toggleOnOffItem(which, hiddenElementId, spanElement) {
	var element = document.getElementById(hiddenElementId);
	var values = element.value.split(";");
	
	values[which] = !(values[which] == "true" ? true : false);
	spanElement.className = classNamePrefixes[which] + (values[which] ? "Active" : "Passive");
	element.value = values[0] + ";" + values[1];
	
	// If both boxes are now checked, clear the other one
	if (element.value == "true;true") {
		var otherElement = document.getElementById((which == 0 ? "off" : "on") + "_" + hiddenElementId);
		
		values[which == 0 ? 1 : 0] = !values[which];	
		otherElement.className = classNamePrefixes[which == 0 ? 1 : 0] + (values[which] ? "Passive" : "Active");
		
		element.value = values[0] + ";" + values[1];
	}
	
	ToolGuide.doSubmitForm(document.forms[0]);
}

function setOnOffListItemValue(hiddenIdPlusIndex, value) {
	var element = document.getElementById(hiddenIdPlusIndex);
	var onElement = document.getElementById("on_" + hiddenIdPlusIndex);
	var offElement = document.getElementById("off_" + hiddenIdPlusIndex);
	
	if (element == null || onElement == null || offElement == null) return;
	
	element.value = value;
	var values = value.split(";");
	
	onElement.className = "On" + (values[0] == "true" ? "Active" : "Passive");
	offElement.className = "Off" + (values[1] == "true" ? "Active" : "Passive");
}

/*********************/
/*** On-off switch ***/
/*********************/

function radio_onClick(radioObject, hiddenId) {
	ToolGuide.doSubmitForm(document.forms[0]);
}

function setOnOffSwitchValue(hiddenId, value) {
	document.getElementById(value.toLowerCase() + "_" + hiddenId).checked = true;
}

/*********************/
/***** Check list ****/
/*********************/

function toggleCheckBox(hiddenElementId, index) {
	var element = document.getElementById(hiddenElementId);
	var values = element.value.split(";");
	var spanElement = document.getElementById("check_" + hiddenElementId + "_" + index);
	
	values[index] = !(values[index] == "true" ? true : false);
	spanElement.className = "On" + (values[index] ? "Active" : "Passive");
	element.value = values.join(";");
	
	ToolGuide.doSubmitForm(document.forms[0]);
}

function setCheckListItemsToChecked(hiddenId, value) {
	document.getElementById(hiddenId).value = value;
	var values = value.split(";");
	
	for (var i = 0; i < values.length; i++) {
		var e = document.getElementById("check_" + hiddenId + "_" + i);
		
		if (e != null) e.className = "On" + (values[i] == "true" ? "Active" : "Passive")
	}
}

/*********************/
/***** Check box *****/
/*********************/

function setCheckBoxToChecked(hiddenid, value) {
	var ch = document.getElementsByName(hiddenid);
	
	for (var i = 0; i < ch.length; i++) {
		if (ch[i].value == value) {
			ch[i].checked = true;
			break;
		}
	}
}
