
function OnServerSideTreeClick(e, tvTree)
{
    var ctlSource = window.event != window.undefined ? window.event.srcElement : e.target;

    // if the source is check box
    if(ctlSource.tagName.toLowerCase() == "input" && ctlSource.type == "checkbox")
    {
        var tblParentTable = GetParentByTagName("table", ctlSource);
        var ctlNextSibling = tblParentTable.nextSibling;
        var iSibilingColumnCount = ctlNextSibling.childNodes[1].rows[1].childNodes.length;
        var iParentColumnCount = tblParentTable.childNodes[1].rows[1].childNodes.length;
        if(iParentColumnCount!=iSibilingColumnCount)
        {
            while(iSibilingColumnCount>4)
            {
                //if node has children then check or uncheck children at all levels
                if(ctlNextSibling && ctlNextSibling.nodeType == 1 && ctlNextSibling.tagName.toLowerCase() == "table")
                    CheckUncheckChildren(tblParentTable.nextSibling, ctlSource.checked);
                tblParentTable =  ctlNextSibling;
                ctlNextSibling = tblParentTable.nextSibling;
                iSibilingColumnCount = ctlNextSibling.childNodes[1].rows[1].childNodes.length;
            }
        }
    
        //check or uncheck parents at all levels
        CheckUncheckParentServerSideTree(ctlSource, ctlSource.checked);
    }
}

function CheckUncheckParentServerSideTree(srcChild, check)
{
    var tblCurrentTable = GetParentByTagName("table", srcChild);
    var  tblPrevTable = tblCurrentTable.previousSibling;

    if(tblPrevTable.nodeType==1 && (IsSubNode(tblCurrentTable) || IsSubNode(tblPrevTable)))
    {
        var checkUncheckSwitch;

        if(check) //checkbox checked
        {
            var isAllSiblingsChecked = AreAllServerSideSiblingsChecked(srcChild);
            if(isAllSiblingsChecked)
                checkUncheckSwitch = true;
            else   
                return; //do not need to check parent if any(one or more) child not checked
        }
        else //checkbox unchecked
            checkUncheckSwitch = false;

        var inpElemsInParentTable = tblPrevTable.getElementsByTagName("input");
        if(inpElemsInParentTable.length > 0)
        {
            var parentNodeChkBox = inpElemsInParentTable[0];
            
                
            //do the same recursively
            if(IsSubNodes(tblCurrentTable, tblPrevTable))
                CheckUncheckParentServerSideTree(parentNodeChkBox,check);
            if(!IsSubNode(tblPrevTable))
                parentNodeChkBox.checked = check;
        }
        
        
        
    }
}

function IsSubNodes(Table1, Table2)
{
    if ( Table1.nodeType == Table2.nodeType)
    {
        var Table1ColumnCount = Table1.childNodes[1].rows[1].childNodes.length;
        var Table2ColumnCount = Table2.childNodes[1].rows[1].childNodes.length;

        return (Table1ColumnCount  == Table2ColumnCount)
    }
    return false;
}

function IsSubNode(Table)
{
    return (Table.childNodes[1].rows[1].childNodes.length== 5);
}

function AreAllServerSideSiblingsChecked(chkBox)
{
    var parentTable = GetParentByTagName("table", chkBox);
    var nextTable = parentTable.nextSibling;
    while ( IsSubNodes(parentTable, nextTable) )
    {
        parentTable = nextTable;
        var nextTable = parentTable.nextSibling;
    }
    var inpElemsInParentTable;
    
    while(IsSubNode(parentTable))
    {
        inpElemsInParentTable = parentTable.getElementsByTagName("input");
        if(inpElemsInParentTable.length > 0)
        {
            var parentNodeChkBox = inpElemsInParentTable[0];
            if(!parentNodeChkBox.checked)
                return false;
        }
        var parentTable = parentTable.previousSibling;
    }
    
    return true;
}


function OnTreeClick(e, tvTree)
{
    var ctlSource = window.event != window.undefined ? window.event.srcElement : e.target;

    // if the source is check box
    if(ctlSource.tagName.toLowerCase() == "input" && ctlSource.type == "checkbox")
    {
        var tblParentTable = GetParentByTagName("table", ctlSource);

        var ctlNextSibling = tblParentTable.nextSibling;

        //if node has children then check or uncheck children at all levels
        if(ctlNextSibling && ctlNextSibling.nodeType == 1 && ctlNextSibling.tagName.toLowerCase() == "div")
            CheckUncheckChildren(tblParentTable.nextSibling, ctlSource.checked);
    
        //check or uncheck parents at all levels
        CheckUncheckParents(ctlSource, ctlSource.checked);
    }
}

function CheckUncheckChildren(ctlChildContainer, bCheck)
{
    var arrCheckBoxes = ctlChildContainer.getElementsByTagName("input");
             
    for(var i = 0; i<arrCheckBoxes.length; ++i)  
        arrCheckBoxes[i].checked = bCheck;
}

function SetCategoryLabelText(strTreeID, strLabelID, nMaxLength,strAllCategoriesText)
{
    var tblParentTable = GetObject(strTreeID);

    if(tblParentTable == null)
        return;
    
    var arrCheckBoxes = tblParentTable.getElementsByTagName("input");

    var strCategory = "";
    for(var i = 0; i<arrCheckBoxes.length;++i)  
    {
        if(arrCheckBoxes[i].checked)
        {
            if(arrCheckBoxes[i].nextSibling == null)
                return;

            strCategory = strCategory + arrCheckBoxes[i].nextSibling.innerHTML + ";";
        }
    }

    if (strCategory.length > nMaxLength)
        strCategory = strCategory.substring(0, nMaxLength) + "...";
        
    if(strCategory != "")
        GetObject(strLabelID).innerHTML = "[" + strCategory + "]";
    else
        GetObject(strLabelID).innerHTML = strAllCategoriesText;
}

function DropTreeViewCheckboxes(strTreeID)
{
    var tblParentTable = GetObject(strTreeID);
    var arrCheckBoxes = tblParentTable.getElementsByTagName("input");

    for(var i = 0; i<arrCheckBoxes.length; ++i)
        arrCheckBoxes[i].checked = false;
}

function CheckUncheckParents(srcChild, check)
{
    var parentDiv = GetParentByTagName("div", srcChild);
    var parentNodeTable = parentDiv.previousSibling;
    if(parentNodeTable)
    {
        var checkUncheckSwitch;

        if(check) //checkbox checked
        {
            var isAllSiblingsChecked = AreAllSiblingsChecked( srcChild);
            if(isAllSiblingsChecked)
                checkUncheckSwitch = true;
            else   
                return; //do not need to check parent if any(one or more) child not checked
        }
        else //checkbox unchecked
            checkUncheckSwitch = false;

        var inpElemsInParentTable = parentNodeTable.getElementsByTagName("input");
        if(inpElemsInParentTable.length > 0)
        {
            var parentNodeChkBox = inpElemsInParentTable[0];
            parentNodeChkBox.checked = checkUncheckSwitch;
            //do the same recursively
            CheckUncheckParents( parentNodeChkBox, checkUncheckSwitch);
        }
    }
}

function AreAllSiblingsChecked(chkBox)
{
    var parentDiv = GetParentByTagName("div", chkBox);
    var childCount = parentDiv.childNodes.length;
    for(var i=0; i<childCount;++i)
    {
        if(parentDiv.childNodes[i].nodeType == 1) //check if the child node is an element node
        {
            if(parentDiv.childNodes[i].tagName.toLowerCase() == "table")
            {
                var prevChkBox = parentDiv.childNodes[i].getElementsByTagName("input")[0];
                //if any of sibling nodes are not checked, return false
                if(!prevChkBox.checked)
                    return false;
            }
        }
    }
    return true;
}

//utility function to get the container of an element by tagname
function GetParentByTagName(parentTagName, childElementObj)
{
    var parent = childElementObj.parentNode;
    while(parent.tagName.toLowerCase() != parentTagName.toLowerCase())
      parent = parent.parentNode;
    return parent;   
}




