function mAdd(strTargetDivName, strTriggerQuestion,  strAnswerValue)
{
	if (typeof(this["KeyArray"]) == 'undefined')
	{ 
	    this["KeyArray"] = {};    
	}
	var arrKeys = this["KeyArray"];
		
	if (typeof(arrKeys[strTargetDivName]) == 'undefined')
	{
		arrKeys[strTargetDivName] = {};
	}
	if (typeof(arrKeys[strTargetDivName][strTriggerQuestion]) == 'undefined')
	{
		arrKeys[strTargetDivName][strTriggerQuestion] = new Array();	
	}
	var cSize =(arrKeys[strTargetDivName][strTriggerQuestion].length);
	arrKeys[strTargetDivName][strTriggerQuestion][cSize] = strAnswerValue;	
}

function mReturnSwitchs(strTargetDivName)
{
	var arrKeys = this.KeyArray;	
	if (strTargetDivName in arrKeys)
	{
		return arrKeys[strTargetDivName];
	}
	return null;
}

function KeyDic(){
	this.Add = mAdd;	
	this.Switches = mReturnSwitchs;
}

var IDSwitchMultiValues = new KeyDic();
var IDSwitchValues = new KeyDic();
var NameSwitchValues = new KeyDic();
var NameSwitchMultiValues = new KeyDic();
var RandomGroups = new KeyDic();

function toggleElementByID(multi){
   
	var cSwitchValues;
	if (multi)
	{
	    cSwitchValues = IDSwitchMultiValues;
	}
	else
	{
	    cSwitchValues = IDSwitchValues;
	}
		
	for (var cDivID in cSwitchValues.KeyArray)
	{
		var cDiv = document.getElementById(cDivID);
		var ShowElement = null;		
		var cSwitchs = cSwitchValues.Switches(cDivID);
		if (cSwitchs != null)
		{			
			for(var cRadioName in cSwitchs)
			{
				var cRadioButs = document.getElementsByName(cRadioName);
				var cValue;
				var CriteriaMet = false;
				for (var i=0; i < cRadioButs.length; i++)
				{
				    if (cRadioButs[i].checked)
					{ 
					    cValue = cRadioButs[i].value;					    
					    for (var cAnswer = 0; cAnswer < cSwitchs[cRadioName].length; cAnswer ++)
				        {
					        if (cValue == cSwitchs[cRadioName][cAnswer])
					        {
						        CriteriaMet = true;
					        }					        
				        }     	
				    }
				    else
				    {
					    for (var cAnswer = 0; cAnswer < cSwitchs[cRadioName].length; cAnswer ++)
		                {
			                if ("" == cSwitchs[cRadioName][cAnswer])
			                {
				                CriteriaMet = true;
			                }
		                }				
					}	
				    			    
				}
							
				if (multi && (ShowElement == null || !CriteriaMet))
			    {
			        ShowElement = CriteriaMet;
			    }
			    else if (!multi && CriteriaMet)
			    {
			        ShowElement = true
			    } 			
			}						
		}

		if (cDiv)
		{
			if (ShowElement == true)
			{ 
				cDiv.style.display = '';
			}
			else
			{
				cDiv.style.display = 'none';
			}	
		}
		else if (getURLVar('NoSubmit') != '')
		{
			alert('Attempting to hide Invalid ElementID: ' + cDivID);
		}	
	} 	
}

function toggleElementByName(multi){	
	var cSwitchValues;
	if (multi)
	{
	    cSwitchValues = NameSwitchMultiValues;
	}
	else
	{
	    cSwitchValues = NameSwitchValues;
	}
	for (var cName in cSwitchValues.KeyArray)
	{
		var cDivs = document.getElementsByName(cName);
		for (var j = 0; j < cDivs.length; j++)
		{ 
		    var cDiv = cDivs.item(j)		    
		    var ShowElement = null;		
		    var cSwitchs = cSwitchValues.Switches(cName);
		    if (cSwitchs != null)
		    {			
			    for(var cRadioName in cSwitchs)
			    {
				    var cRadioButs = document.getElementsByName(cRadioName);
				    var cValue;
				    var CriteriaMet = false;
				    
				    for (var i=0; i < cRadioButs.length; i++)
				    {
					    
					    if (cRadioButs[i].checked)
					    { 
					        cValue = cRadioButs[i].value;
					        for (var cAnswer = 0; cAnswer < cSwitchs[cRadioName].length; cAnswer ++)
				            {
					            if (cValue == cSwitchs[cRadioName][cAnswer])
					            {
						            CriteriaMet = true;
					            }
				            }				      
					    }	
					    else
						{
							for (var cAnswer = 0; cAnswer < cSwitchs[cRadioName].length; cAnswer ++)
				            {
					            if ("" == cSwitchs[cRadioName][cAnswer])
					            {
						            CriteriaMet = true;
					            }
				            }				
						}		
				    }
				    if (multi && (ShowElement = null || !CriteriaMet))
				    {
				        ShowElement = CriteriaMet;
				    }
				    else if (!multi && CriteriaMet)
				    {
				        ShowElement = true
				    } 					    					
			    }						
		    }		   
		    	if (ShowElement == true)
			{ 
				cDiv.style.display = '';
			}
			else
			{
				cDiv.style.display = 'none';
			}				
		}	
	} 	
}

function radioShowsElementById(hideThisId, radioInputName){ //You can add as many values as you want to switch on as arguements.
	var i;
	
	for(i = 0; i<(radioShowsElementById.arguments.length-2); i++)
	{
		IDSwitchValues.Add(hideThisId, radioInputName, radioShowsElementById.arguments[i+2]);
	}	
	var elementToHide;
	elementToHide = document.getElementById(hideThisId);
	if (elementToHide)
	{
	elementToHide.style.display = 'none';
	}
	else if (getURLVar('NoSubmit') != '')
	{
		alert('Attempting to hide Invalid ElementID: ' + hideThisId);
	}
 
	var cRadio;
	cRadio = document.getElementsByName(radioInputName);
	if (navigator.appName.search(/icrosoft/) > -1){
		for (var i = 0; i < cRadio.length; i++){  cRadio.item(i).onclick = function(){toggleElementByID(true);toggleElementByID(false);}; }
	}else{
		for (var i = 0; i < cRadio.length; i++){  cRadio.item(i).onclick = function(){toggleElementByID(true);toggleElementByID(false);};}
	}
}

function radioMultiShowsElementById(hideThisId, radioInputName){ //You can add as many values as you want to switch on as arguements.
	var i;
	
	for(i = 0; i<(radioMultiShowsElementById.arguments.length-2); i++)
	{
		IDSwitchMultiValues.Add(hideThisId, radioInputName, radioMultiShowsElementById.arguments[i+2]);		
	}	
	var elementToHide;
	elementToHide = document.getElementById(hideThisId);
	elementToHide.style.display = 'none';
	var cRadio;
	cRadio = document.getElementsByName(radioInputName);
	if (navigator.appName.search(/icrosoft/) > -1){
		for (var i = 0; i < cRadio.length; i++){  cRadio.item(i).onclick = function(){toggleElementByID(true);toggleElementByID(false);}; }
	}else{
		for (var i = 0; i < cRadio.length; i++){  cRadio.item(i).onclick = function(){toggleElementByID(true);toggleElementByID(false);};}
	}
}

function LinkedMarkAll()
{
    var i;
    for(i = 0; i<(LinkedMarkAll.arguments.length-1); i = i + 2)
	{
		var LinkFrom = LinkedMarkAll.arguments[i];
		var LinkTo = LinkedMarkAll.arguments[i+1];
		
		IDSwitchValues.Add(LinkTo, LinkFrom,1);
		
		var elementToHide;
	    elementToHide = document.getElementById(LinkTo);	    
        
        elementToHide.style.display = 'none';
        var cRadio;
        cRadio = document.getElementsByName(LinkFrom);
        
        if (navigator.appName.search(/icrosoft/) > -1){
	        for (var k = 0; k < cRadio.length; k++){  cRadio.item(k).onclick = function() {toggleElementByID(true);toggleElementByID(false);}; }
        }else{
	        for (var k = 0; k < cRadio.length; k++){  cRadio.item(k).onclick = function() {toggleElementByID(true);toggleElementByID(false);}; }
        }	    
	}	 
}

function MarkAllRandomShow(RandomGroupID)
{
	var i; 
	for(i = 0; i<MarkAllRandomShow.arguments.length-1; i = i + 2)
	{
		var triggerName = MarkAllRandomShow.arguments[i+1];
		var IDlist = MarkAllRandomShow.arguments[i+2];
		
		var triggerCheck;
	    triggerCheck = document.getElementsByName(triggerName);
	   
	    if (navigator.appName.search(/icrosoft/) > -1){
		    for (var j = 0; j < triggerCheck.length; j++){ triggerCheck.item(j).onclick = function() {TriggerRandom(triggerName)};}
	    }else{
		    for (var j = 0; j < triggerCheck.length; j++){  triggerCheck.item(j).onclick = function() {TriggerRandom(triggerName)}; }
	    }     
		
		var k;		
		for (k = 0; k<IDlist.length; k++)
		{
		    var elementToHide;	        
	        //Hide the element.
	        elementToHide = document.getElementById(IDlist[k]);
		
	        if (elementToHide)
		{

	        	elementToHide.style.display = 'none';	        	        
	        	//Add to the random grouping
	        	RandomGroups.Add(RandomGroupID,triggerName,IDlist[k]);                
		}
		else if (getURLVar('NoSubmit') != '')
		{
			alert('Attempting to hide Invalid ElementID: ' + IDlist[k]);
		}
	    }
	
	}
}

function TriggerRandom(elementName)
{
    //Find the random group;
    var groupID = FindGroup(elementName);
    
    var choicesCount = 0;
    var choices = new Array();
    
    var cRandomGroup = RandomGroups.KeyArray[groupID];
    
    //Loop through the questions and see which are answered -- make a list.
    for (var kelement in cRandomGroup)
    {
        var cTrigger = document.getElementsByName(kelement);
        for (var j = 0; j < cTrigger.length; j++)
        { 
            if (cTrigger.item(j).checked == true)
            {
                choices[choicesCount] = kelement;
                choicesCount++;
            }
        }       
    }    
    
    //Randomly pick one of them.
    var itemtoshow = -1;      
    if (choices.length != 0)
    {
         itemtoshow = choices[Math.round((choices.length -1)*Math.random())];
    } 
    
   
    //Hide the elements that are not in that group.
    for (var kelement in cRandomGroup)
    {
        var cID; 
        for (cID = 0; cID < cRandomGroup[kelement].length; cID++)
        {
            var cItem = document.getElementById(cRandomGroup[kelement][cID]);            
            if (kelement != itemtoshow)
            {
                cItem.style.display = 'none';
            }            
        }
    }
    
    //Then Show the ones in that group. This needs to optimized later.
    for (var kelement in cRandomGroup)
    {
        var cID; 
        for (cID = 0; cID < cRandomGroup[kelement].length; cID++)
        {
            var cItem = document.getElementById(cRandomGroup[kelement][cID]);            
            if (kelement == itemtoshow)
            {
                cItem.style.display = '';
            }            
        }
    }
}

function FindGroup(elname)
{
    var kgroup;
    var kelement;
    
    for (var cGroup in RandomGroups.KeyArray)
    {
        for (var cElement in RandomGroups.KeyArray[cGroup])
        {
            if (cElement == elname) 
            {
                return cGroup;  
            }     
        }   
    }
}

function limitTextBox(iName, iLimit)
{
    var cTextboxs = document.getElementsByName(iName);
    for (var j = 0; j < cTextboxs.length; j++)
    { 
        cTextboxs.item(j).onkeydown = function(){limitText(iName,iLimit)};
    }
} 

function limitText(limitFieldName, limitNum) 
{
    var cTextboxs = document.getElementsByName(limitFieldName);
    for (var j = 0; j < cTextboxs.length; j++)
    { 
        var limitField = cTextboxs.item(j);
        if (limitField.value != null && limitField.value.length > limitNum) 
        {
	        limitField.value = limitField.value.substring(0, limitNum);
        } 
    }   
}

function MarkAllNoneOfAbove(NoneName)
{
       
    var i;
    var AList = "\""+NoneName+"\"";
	for(i = 0; i<MarkAllNoneOfAbove.arguments.length-1; i++)
	{
		var affectedName = MarkAllNoneOfAbove.arguments[i+1];
		AList += ",\""+affectedName+"\"";
	}	
	var command = "MarkAllNoneOfAboveGuts("+AList+");";	
	var triggerItems = document.getElementsByName(NoneName);
	for (var j = 0; j < triggerItems.length; j++){ triggerItems.item(j).onclick = function() {eval("MarkAllNoneOfAboveGuts("+AList+");");};}
   
}
function MarkAllNoneOfAboveGuts()
{
    var triggerItems = document.getElementsByName(MarkAllNoneOfAboveGuts.arguments[0]);
    if (triggerItems.length > 0)
    {
        var triggerBox = triggerItems[0];
        var i;
   	    for(i = 0; i<MarkAllNoneOfAboveGuts.arguments.length-1; i++)
	    {
		    var affectedName = MarkAllNoneOfAboveGuts.arguments[i+1];		   
		    var affectedItems = document.getElementsByName(affectedName);
    		
    		if (triggerBox.checked == true)
    		{
		        for (var j = 0; j < affectedItems.length; j++){ 
		            affectedItems.item(j).checked = false;
		            affectedItems.item(j).disabled = true;
		        }
		    }
		    else		    
		    {
		        for (var j = 0; j < affectedItems.length; j++){ 
		            affectedItems.item(j).disabled = false;
		        }
		    }    		
	    }
	}	
}

function LimitSelect(selectLimit)
{
       
    var i;
    var AList = "";
	for(i = 0; i<LimitSelect.arguments.length-1; i++)
	{
		var affectedName = LimitSelect.arguments[i+1];
		AList += ",\""+affectedName+"\"";
	}	
	var command = "LimitSelectGuts("+selectLimit+AList+");";	
	for(i = 0; i<LimitSelect.arguments.length-1; i++)
	{
		var triggerItems = document.getElementsByName(LimitSelect.arguments[i+1]);
	    for (var j = 0; j < triggerItems.length; j++){ triggerItems.item(j).onclick = function() {eval("LimitSelectGuts("+selectLimit+AList+");");};}
	}   
}

function LimitSelectGuts(selectLimit)
{
    var totalcount = 0;    
    for(i = 0; i<LimitSelectGuts.arguments.length-1; i++)
	{
		var triggerItems = document.getElementsByName(LimitSelectGuts.arguments[i+1]);
	    for (var j = 0; j < triggerItems.length; j++)
	    { 
	        if (triggerItems.item(j).checked == true)
	        {
	            totalcount++;	        
	        }	        
	    }	    
	} 
	
    for(i = 0; i<LimitSelectGuts.arguments.length-1; i++)
    {
	    var triggerItems = document.getElementsByName(LimitSelectGuts.arguments[i+1]);
        for (var j = 0; j < triggerItems.length; j++)
        { 
            if (totalcount >= selectLimit)
	        {
                triggerItems.item(j).disabled =	triggerItems.item(j).checked != true; 
            }
            else
            {
                triggerItems.item(j).disabled = false;
            }
        }        
    }		
}


function Ranking()
{
   	var k;
	for(k = 0; k<(Ranking.arguments.length); k++)
	{
		var AList= "\""+Ranking.arguments[k]+"\"";
 		var i;
		for(i = 0; i<Ranking.arguments.length; i++)
		{
			if (i!=k)
			{
			var affectedName = Ranking.arguments[i];
			AList += ",\""+affectedName+"\"";
			}
		}

		RankAssign(Ranking.arguments[k], AList);
	}
}

function RankAssign(tname, alist)
{
		var triggerItems = document.getElementsByName(tname);			
		for (var j = 0; j < triggerItems.length; j++)
		{ 
			var funccall = "RankingGuts("+alist+");";
			triggerItems.item(j).onclick = function() {eval(funccall);};
		}
}


function RankingGuts()
{
    var clickedItems = document.getElementsByName(RankingGuts.arguments[0]);
	for(var i = 0; i < clickedItems.length; i++)
	{
		var clicked = clickedItems[i];
		if (clicked.checked)
		{
			for(var j = 1; j <RankingGuts.arguments.length;j++)
			{
				var checkItems = document.getElementsByName(RankingGuts.arguments[j]);
				for (var k = 0; k<checkItems.length;k++)
				{
					var check = checkItems[k];
					if (clicked.value == check.value)
					{
						check.checked = false;
					}
				}
			}	
		}
	}	
}




function getURLVar(urlVarName) 
{
	//divide the URL in half at the '?' 
	var urlHalves = String(document.location).split('?');
	var urlVarValue = '';
	if(urlHalves[1]){
		//load all the name/value pairs into an array 
		var urlVars = urlHalves[1].split('&');
		//loop over the list, and find the specified url variable 
		for(i=0; i<=(urlVars.length); i++){
			if(urlVars[i]){
				//load the name/value pair into an array 
				var urlVarPair = urlVars[i].split('=');
				if (urlVarPair[0] && urlVarPair[0] == urlVarName) {
					//I found a variable that matches, load it's value into the return variable 
					urlVarValue = urlVarPair[1];
				}
			}
		}
	}
	return urlVarValue;   
}