var shc_HasNotEvaluated = 2
var shc_EvaluatedTrue = 1
var shc_EvaluatedFalse = 0

function ShowHideControl(controlToCheckID, controlToShowHideID, valueToVerify, evalFunction, showHideControlID, ControlToCheck_ParentSHCID, ControlToShowHide_ParentSHCID)
{
	this.EvaluationResult = shc_HasNotEvaluated;
	this.childSHCs = new Array();

    this.ControlToShowHide = null
    this.ControlToShowHideID = controlToShowHideID;
	this.ControlToCheck = null;
	this.ControlToCheckID = controlToCheckID;
	this.ValueToVerify = valueToVerify;
	this.EvaluationLogic = evalFunction;
	this.ID = showHideControlID;
	this.ControlToShowHide_ParentSHC = null;
	this.ControlToShowHide_ParentSHCID = ControlToShowHide_ParentSHCID;
	this.ControlToCheck_ParentSHC = null;
	this.ControlToCheck_ParentSHCID = ControlToCheck_ParentSHCID;
}
ShowHideControl.prototype.UpdateVisibility = ShowHideControl_UpdateVisibility;
ShowHideControl.prototype.EvaluateVisibility = ShowHideControl_EvaluateVisibility;
ShowHideControl.prototype.UpdateChildControls = ShowHideControl_UpdateChildControls;

function shc_GetSHCByID(shcid)
{
	var shc = null;

	for(var i = 0; i < arySHC.length; i++)
	{
		if(arySHC[i].ID == shcid)
		{
			shc = arySHC[i];
			break;
		}
	}
	
	return shc;
}

function ShowHideControl_UpdateVisibility()
{
	var isVisible = true;
	
	if(isVisible && this.ControlToShowHide_ParentSHC != null)
	    isVisible = this.ControlToShowHide_ParentSHC.EvaluateVisibility();
	
	if(isVisible && this.ControlToCheck_ParentSHC != null)
		isVisible = this.ControlToCheck_ParentSHC.EvaluateVisibility();

	if(isVisible && this.ControlToCheck != null)
		isVisible = this.EvaluationLogic(this);				

	if(isVisible)
		this.EvaluationResult = shc_EvaluatedTrue;
	else
		this.EvaluationResult = shc_EvaluatedFalse;

    shc_SetElementDisplay(this.ControlToShowHide, isVisible);
	this.UpdateChildControls();
	return isVisible;
}

function ShowHideControl_UpdateChildControls()
{
	for(var i = 0; i < this.childSHCs.length; i++)
		this.childSHCs[i].UpdateVisibility();
}

function ShowHideControl_EvaluateVisibility()
{
	if(this.EvaluationResult == shc_HasNotEvaluated)
		this.UpdateVisibility();

	return this.EvaluationResult == shc_EvaluatedTrue;
}

function shc_GetValueRecursive(objSubject)
{
    var returnValue = null;
    
    if(objSubject.type != null)
        switch(objSubject.type)
        {
            case "text":
            case "textarea":
                returnValue = objSubject.value;
            break;
            
            case "checkbox":
                if(objSubject.checked)
                    returnValue = "True";
            break;
            
            case "radio":
                if(objSubject.checked)
                    returnValue = objSubject.value;
            break;
            
            case "select-one":
            case "select-multiple":
                if(objSubject.selectedIndex != -1)
                    returnValue = objSubject.options[objSubject.selectedIndex].value;
                else
                    returnValue = "";
            break;                           
        }
    
    
    for(var i = 0; returnValue == null && i < objSubject.childNodes.length; i++)
    {
        if(objSubject.childNodes[i].nodeType != 3)
            returnValue = shc_GetValueRecursive(objSubject.childNodes[i]);
    }
    
    return returnValue;
}

function shc_IsNotEqual(shc)
{
    return !shc_IsEqual(shc);
}

function shc_IsEqual(shc)
{
	var val = shc_GetValueRecursive(shc.ControlToCheck);
	
	if(val == null && shc.ValueToVerify == "")
		return true;
	
    return shc.ValueToVerify == val;
}

function shc_SetElementDisplay(elmTarget, isVisible)
{
	if(elmTarget == null)
		return;

    if(isVisible)
    {
        elmTarget.style.display = "";
        elmTarget.style.visibility = "visible";
    }
    else
    {
        elmTarget.style.display = "none";
		elmTarget.style.visibility = "hidden";
    }
    
    shc_SetSelectDisplay(elmTarget, isVisible);
}

// This is an IE6 specific hack
function shc_SetSelectDisplay(elmParentContainer, isVisible)
{
	var aryDropDowns = elmParentContainer.getElementsByTagName("select");
	for(var i = 0; i < aryDropDowns.length; i++)
		if(!isVisible)
			aryDropDowns[i].style.display = "none";
		else
			aryDropDowns[i].style.display = "";		
}

function shc_RemoveNonClickElements(aryInputs)
{
	var cleanArray = new Array();
	
	for(var i = 0; i < aryInputs.length; i++)
		if(aryInputs[i].type == "checkbox" || aryInputs[i].type == "radio")
			cleanArray[cleanArray.length] = aryInputs[i];
	
	return cleanArray;
}

function shc_AddControlEvent(objSubject, eventFunction)
{
	if(objSubject == null)
		return;
	
    var aryInputs = document.getElementsByName(objSubject.id.replace(/_/gi, ":"))
    
    if(aryInputs.length == 0)
		aryInputs = document.getElementsByName(objSubject.name);
    
    aryInputs = shc_RemoveNonClickElements(aryInputs);
    if(aryInputs.length > 0 && (aryInputs[0].type == "checkbox" || aryInputs[0].type == "radio"))
    {
        for(var i = 0; i < aryInputs.length; i++)			
            shc_AttachEvent(aryInputs[i], "click", eventFunction);
        
    }
    else
    {
        shc_AttachEvent(objSubject, "change", eventFunction);
    }
}

function shc_AttachEvent(objSubject, eventName, eventFunction)
{
    if(objSubject.addEventListener)
        objSubject.addEventListener(eventName, eventFunction, false);
    else if(objSubject.attachEvent)
        objSubject.attachEvent("on" + eventName, eventFunction);
}

function shc_CheckObjectVisibility(objSubject)
{
	if(objSubject.attributes != null && objSubject.attributes["DependsOn"] != null)
		return shc_GetSHCByID(objSubject.attributes["DependsOn"].value).EvaluateVisibility();
		
	if(objSubject.parentNode != null)
		return shc_CheckObjectVisibility(objSubject.parentNode);
		
	return true;
}

function shc_Initialize()
{
    for(var i = 0; i < arySHC.length; i++)
    {                   
        arySHC[i].ControlToCheck = document.getElementById(arySHC[i].ControlToCheckID);
        arySHC[i].ControlToShowHide = document.getElementById(arySHC[i].ControlToShowHideID);
        
        if(arySHC[i].ControlToShowHide == null)
			alert(arySHC[i].ID + ".ControlToShowHide cannot be found on the client.  Verify that the control is rendered.");
        
        arySHC[i].ControlToCheck_ParentSHC = shc_GetSHCByID(arySHC[i].ControlToCheck_ParentSHCID);
        if(arySHC[i].ControlToCheck_ParentSHC != null)
            arySHC[i].ControlToCheck_ParentSHC.childSHCs[arySHC[i].ControlToCheck_ParentSHC.childSHCs.length] = arySHC[i];
            
        arySHC[i].ControlToShowHide_ParentSHC = shc_GetSHCByID(arySHC[i].ControlToShowHide_ParentSHCID);
        if(arySHC[i].ControlToShowHide_ParentSHC != null)
            arySHC[i].ControlToShowHide_ParentSHC.childSHCs[arySHC[i].ControlToShowHide_ParentSHC.childSHCs.length] = arySHC[i];
            
        shc_AddControlEvent(arySHC[i].ControlToCheck, new Function("arySHC[" + i + "].UpdateVisibility();"))
    }
    
    for(var i = 0; i < arySHC.length; i++)
        arySHC[i].EvaluateVisibility();
}