var g_elementcache = {};
var g_elementcache_byId = {};
var g_parentElement = {};

function getHtmlIdOfItem(itemID, bAddBrackets)
{
	var sHtml = 'fld_' + itemID;
	
	if (bAddBrackets  &&  bAddBrackets == true)
	{
		sHtml = sHtml + '[]';
	}
	return sHtml;
}

function setFilters(aFilters)
{
	g_aFilters = aFilters;
}

function doFiltering()
{
	if (typeof dojo == 'object')
	{
		removeClassFilteredNodeAll();
	}
	else
	{
		for (var j = 0; j < g_aFilters.length; j++)
		{
			resetFilteredItem(g_aFilters[j][0], g_aFilters[j][1], g_aFilters[j][2], g_aFilters[j][3]);
		}
	}

	for (var j = 0; j < g_aFilters.length; j++)
	{
		doFilter(g_aFilters[j][0], g_aFilters[j][1], g_aFilters[j][2], g_aFilters[j][3]);
	}
	
	doneFiltering();
}

function doneFiltering()
{
	// other functions can hook on the event, that this function is called
}

function doFilter(itemID, valueToDisableOtherField, filter_itemID, valueInTempOnlineResults)
{
	var sHtmlID = 'fld_' + itemID;
	var aElems = esGetElementsByName(sHtmlID);
	
	// try if it is checkbox or radio-buttons
	for(var i=0; i<aElems.length; i++)
	{
		var elem = aElems[i];

		if (elem.checked == true && elem.disabled == false)
		{
			if (elem.type == 'radio')
			{
				var currentvalue = elem.value;
			}
			break;
		}
	}

	// try to get it by it's id
	// (after trying to get it by it's name as IE getElemetById() is not only returning
	//  an element with the correct id but may also return teh first element with the
	//  name equal to the id)
	if (currentvalue == undefined)
	{
		var elem = esGetElementById(sHtmlID);
		if (elem && elem.type != 'radio')
		{
			var currentvalue = elem.value;
		}
	}

	// if the formelement is not on the current page - use the value from temp-online-results
	if (currentvalue == undefined)
	{
		var currentvalue = valueInTempOnlineResults;
	}


	// check if a value is defined
	if (currentvalue)
	{
		// check if the item has the value that leads to disabling of target-item
		if (currentvalue == valueToDisableOtherField)
		{
			disableItem(filter_itemID);
		}
	}
	else
	{
		// check if the temporarily stored value of the sourceitem equals the value that should lead to disabling
		if (valueInTempOnlineResults != null && valueInTempOnlineResults != undefined && valueInTempOnlineResults == valueToDisableOtherField)
		{
			disableItem(filter_itemID);
		}
	}
	
}

function resetFilteredItem(itemID, value, filter_itemID)
{
	enableItem(filter_itemID);
}

function disableItem(itemID, bAddBrackets)
{
	var sHtmlName = getHtmlIdOfItem(itemID, bAddBrackets);
	var aElems = esGetElementsByName(sHtmlName);

	// take care for sliders
	var nodeSlider = esGetElementById('slider_' + sHtmlName);
	if (nodeSlider !== undefined && nodeSlider !== null)
	{
		dijit.byNode(nodeSlider).setAttribute('disabled', true);
	}
	
	// disable all elements, that have the appropriate name, as e.g. checkboxes consist of a visible and a hidden field
	if (aElems.length > 0)
	{
		for (var i = 0 ; i < aElems.length; i++)
		{
			if (bAddBrackets == true)
			{
				for (var j = 0; j < g_aFilters.length; j++)
				{
					if (aElems[i].value == g_aFilters[j][2])
					{
						aElems[i].disabled = true;
						addClassFilteredNode(aElems[i]);
					}
				}
			}
			else
			{
				aElems[i].disabled = true;
				addClassFilteredNode(aElems[i]);
			}
		}
	}
	else
	{
		var elem = esGetElementById('opt_' + itemID);
		if (elem !== null)
		{
			elem.disabled = true;
			addClassFilteredNode(elem);
		}
		else
		{
			// have a look for segmented_icr-fields
			var i = 1;
			while (elem = esGetElementById(sHtmlName + '_' + i)) {
				elem.disabled = true;
				addClassFilteredNode(elem);
				i++;
			}
		}
	}
	
}

function enableItem(itemID, bAddBrackets)
{
	var sHtmlName = getHtmlIdOfItem(itemID, bAddBrackets);

	// disable all elements, that have the appropriate name,
	// as e.g. checkboxes consist of a visible and a hidden field with the same name but different IDs
	var aElems = esGetElementsByName(sHtmlName);

	if (aElems.length > 0)
	{
		for(var i=0; i<aElems.length; i++)
		{
			elem = aElems[i];
			elem.disabled = false;
			removeClassFilteredNode(elem);
		}
	}
	else
	{
		if (bAddBrackets != true)
		{
			enableItem(itemID, true);
		}
		
		var elem = esGetElementById('opt_' + itemID);
		if (elem)
		{
			elem.disabled = false;
			removeClassFilteredNode(elem); 
		}
		else
		{
			// have a look for segmented_icr-fields
			var i = 1;
			while (elem = esGetElementById(sHtmlName + '_' + i)) {
				elem.disabled = false;
				removeClassFilteredNode(elem); 
				i++;
			}
		}
	}
	
	// take care for sliders
	var nodeSlider = esGetElementById('slider_' + sHtmlName);
	if (nodeSlider !== undefined && nodeSlider !== null)
	{
		dijit.byNode(nodeSlider).setAttribute('disabled', false);
	}
}


function addClassFilteredNode(nodeStart)
{
	var node = getParentnodeHavingClass(nodeStart, 'item', 'static'); 
	esAddClass(node, 'filteredNode');
}

function removeClassFilteredNode(nodeStart)
{
	var node = getParentnodeHavingClass(nodeStart, 'item', 'static'); 
	esRemoveClass(node, 'filteredNode');
}

function removeClassFilteredNodeAll()
{
	var nl = dojo.query('.item,.static');
	nl.removeClass('filteredNode');
	nl.removeClass('hidden');
	nl.removeClass('disabled');
	
	var nl = dojo.query('input,select,textarea');
	nl.removeClass('filteredNode');
	nl.attr('disabled', false);
}

// returns the first dom node, that has one of the searched classnames in it's class-attribute
function getParentnodeHavingClass_old(node, sSearchedClass, sSearchedClass2)
{
	if (node === undefined || node === null)
	{
		return false;
	}
	
	var sNodeId= node.id;
	
	// get elements from cache
	if (sNodeId === '' || !(sNodeId in g_parentElement))
	{
		g_parentElement[sNodeId] = false;
		if (node.className !== undefined)
		{
			var aNodeClasses = node.className.split(' ');
			for(var i=0; i < aNodeClasses.length; i++)
			{
				if (aNodeClasses[i] === sSearchedClass || (sSearchedClass2 !== undefined && aNodeClasses[i] === sSearchedClass2))
				{
					g_parentElement[sNodeId] = node;
					return node;
				}
			}
		}

		var nodeParent = node.parentNode;
		if (nodeParent !== undefined)
		{
			g_parentElement[sNodeId] = getParentnodeHavingClass(nodeParent, sSearchedClass, sSearchedClass2);
			return g_parentElement[sNodeId];
		}
		
	}
	
	return g_parentElement[sNodeId];
}

// returns the first dom node, that has one of the searched classnames in it's class-attribute
function getParentnodeHavingClass(node, sSearchedClass, sSearchedClass2)
{
	if (node === undefined)
	{
		return false;
	}
	
	if (node.className !== '')
	{
		var aNodeClasses = node.className.split(' ');
		for(var i=0; i < aNodeClasses.length; i++)
		{
			if (aNodeClasses[i] === sSearchedClass || (sSearchedClass2 !== undefined && aNodeClasses[i] === sSearchedClass2))
			{
				return node;
			}
		}
	}
	
	var nodeParent = node.parentNode;
	if (nodeParent !== undefined)
	{
		return getParentnodeHavingClass(nodeParent, sSearchedClass, sSearchedClass2);
	}
	
	return false;
}

function esAddClass(node, sClassName)
{
	if (node.className)
	{
		var aNodeClasses = node.className.split(' ');
		var nLen = aNodeClasses.length;
		for(var i=0; i < nLen; i++)
		{
			if (aNodeClasses[i] === sClassName)
			{
				return true;
			}
		}
		aNodeClasses.push(sClassName);
		node.className = aNodeClasses.join(' ');
	}
}

function esRemoveClass(node, sClassName)
{
	if (node.className)
	{
		var aNodeClasses = node.className.split(' ');
		var aNewNodeClasses = new Array();
		var nLen = aNodeClasses.length;
		for(var i=0; i < nLen; i++)
		{
			if (aNodeClasses[i] !== sClassName)
			{
				aNewNodeClasses.push(aNodeClasses[i]);
			}
		}
		node.className = aNewNodeClasses.join(' ');
	}
}

function esGetElementsByName(sName)
{
	// get elements from cache
	if (!(sName in g_elementcache))
	{
		g_elementcache[sName] = document.getElementsByName(sName);
	}
	return g_elementcache[sName];
}

function esGetElementById(sId)
{
	// get elements from elementcache for ids
	if (!(sId in g_elementcache_byId))
	{
		g_elementcache_byId[sId] = document.getElementById(sId);
	}
	return g_elementcache_byId[sId];
}

function esFormHasSliders()
{
	if (!(sId in g_elementcache_byId))
	{
		g_elementcache_byId[sId] = document.getElementById(sId);
	}
}

/* called via onload */
function initFilteringRoutines()
{
	appendOnChangeEventsForFiltering();
	doFiltering();
	showPreviewAndTempsaveButtons();
}

function showPreviewAndTempsaveButtons()
{
	var aBtns = document.getElementsByTagName("button");
	for(var i=0; i < aBtns.length; i++)
	{
		var sClass = aBtns[i].className;
		if (sClass.indexOf("printpreview") !== false)
		{
			sClass = sClass.replace(/hidden/g, '');
		}
		aBtns[i].className = sClass;
	}
}

function appendOnChangeEventsForFiltering()
{
	var isInternetExplorer = /*@cc_on!@*/false;
	
	for(var i=0; i<g_aFilters.length; i++)
	{
		var sHtmlName = getHtmlIdOfItem(g_aFilters[i][0]);
		var aElems = esGetElementsByName(sHtmlName);
		for(var j=0; j<aElems.length; j++)
		{
			elem = aElems[j];
			if (elem && elem.style)
			{
				if (elem.type=='radio' && isInternetExplorer == true)
				{
					// need to use onclick for radiobuttons in IE, as IE invokes onchange after radiobutton-looses the focus
					// that may be to late, if the radiobutton loses the focus in the same moment the user clicks on "next page"
					// and this page contains questions, that should be filtered completely... 
					elem.onclick = doFiltering;	
				}
				else
				{
					elem.onchange = doFiltering;
				}
			}
		}
	}
}

function goPage(nPage)
{
	var pagefield = esGetElementById('jumptopage');
	pagefield.value = nPage;

	var onlineform = esGetElementById('form_onlinesurvey');
	onlineform.submit();
}

function changeLanguage(nLangID)
{
	esGetElementById('nLangIDchange').value = 1;

	var languagefield = esGetElementById('nLangID');
	languagefield.value = nLangID;

	var onlineform = esGetElementById('form_onlinesurvey');
	onlineform.submit();
}

function prepareprintpreview()
{
	var printpreviewfield = esGetElementById('printpreview');
	printpreviewfield.value = 1;

	var onlineform = esGetElementById('form_onlinesurvey');
	onlineform.submit();
}

function showprintpreview()
{
	var printpreviewfield = esGetElementById('printpreview');
	printpreviewfield.value = 0;

	var currentURL = window.location.href;
	var printURL = currentURL + '&printpreview=2';
	var nWidth=800;
	var nHeight=800;

	if (window.innerHeight)
	{
		nHeight = window.innerHeight - 120;
	}
	if (window.innerWidth)
	{
		nWidth = window.innerWidth - 120;
	}
	window.open(printURL, 'printpreview', 'dependent=yes,left=10,top=10,location=no,menubar=yes,resizable=yes,scrollbars=yes,toolbar=no,width=' + nWidth.toString() + ',height=' + nHeight.toString());
}

function printForm()
{
	window.print();
}

function getPSWDField()
{
	var oUserPSWD = esGetElementById('user_tan');
	var oUserPIN = esGetElementById('user_pin');

	if (oUserPSWD)
	{
		return oUserPSWD;
	}

	if (oUserPIN)
	{
		return oUserPIN;
	}

	return false;
}

function isCorrectPSWD(field, nLength)
{
	var oUserPSWD = esGetElementById('user_tan');
	var oUserPIN = esGetElementById('user_pin');
	var sPSWD = '';

	var oPSWDfield = getPSWDField();

	if (oPSWDfield)
	{
		sPSWD = oPSWDfield.value;
	}

	if (oUserPSWD && oUserPSWD.value != undefined)
	{
		sPSWD = oUserPSWD.value;
	}

	if (sPSWD.length == nLength)
	{
		oPSWDfield.className = "legal_pswd";
		return true;
	}
	else
	{
		oPSWDfield.className = "illegal_pswd";
		return false;
	}
}

function savetemp()
{
	esGetElementById('tempsave').value = 1;
	esGetElementById('form_onlinesurvey').submit();
}

