start-HTMLOutput.ps1


function get-NodeString
{
    param(
        [Parameter(Mandatory = $true)]
        $node,
        [Parameter(Mandatory = $true)]
        $outputType
    )

    $functionReturnString = ""

    if ($outputType -eq $functionExchangeOnlineType)
    {
        out-logfile -string "Calculating string for Exchange Online"

        if ($node.object.groupType -ne $null)
        {
            if ($node.object.IsMembershipDynamic -eq $true)
            {
                if ($reverseHierarchy -eq $FALSE)
                {
                    $functionReturnString = $node.object.displayName +" (ExchangeObjectID: "+$node.object.ExchangeObjectID+") ("+$node.object.recipientType+"/"+$node.object.recipientTypeDetails+"/"+$node.object.GroupType+") (DynamicMembership)"
                }
                else 
                {
                    $functionReturnString = $node.object.displayName +" (ExchangeObjectID: "+$node.object.ExchangeObjectID+") ("+$node.object.recipientType+"/"+$node.object.recipientTypeDetails+"/"+$node.object.GroupType+") (DynamicMembership) [Parent Group]"
                }
            }
            else 
            {
                if ($reverseHierarchy -eq $FALSE)
                {
                    $functionReturnString = $node.object.displayName +" (ExchangeObjectID: "+$node.object.ExchangeObjectID+") ("+$node.object.recipientType+"/"+$node.object.recipientTypeDetails+"/"+$node.object.GroupType+")"
                }
                else 
                {
                    $functionReturnString = $node.object.displayName +" (ExchangeObjectID: "+$node.object.ExchangeObjectID+") ("+$node.object.recipientType+"/"+$node.object.recipientTypeDetails+"/"+$node.object.GroupType+") [Parent Group]"
                }
            }
        }
        else 
        {
            $functionReturnString = $node.object.displayName +" (ExchangeObjectID: "+$node.object.ExchangeObjectID+") ("+$node.object.recipientType+"/"+$node.object.recipientTypeDetails+")"
        }
    }
    elseif ($outputType -eq $functionMSGraphType)
    {
        out-logfile -string "Calculating string for Microsoft Graph"

        if ($node.object.groupTypes -ne $NULL)
        {
            out-logfile -string "Group type is not NULL - calculate string for group"

            if ($reverseHierarchy -eq $FALSE)
            {
                out-logfile -string "Reverse hierarchy is set to false."

                $functionReturnString = $node.object.displayName +" (ObjectID: "+$node.object.id+") ("+$node.object.getType().name+") ("+$node.object.groupTypes+")"
            }
            else 
            {
                out-logfile -string "Reverse hierarchy is set to true."

                $functionReturnString = $node.object.displayName +" (ObjectID: "+$node.object.id+") ("+$node.object.getType().name+") ("+$node.object.groupTypes+") [Parent Group]"
            }
        }
        else 
        {
            if ($reverseHierarchy -eq $FALSE)
            {
                $functionReturnString = $node.object.displayName +" (ObjectID: "+$node.object.id+") ("+$node.object.getType().name+")"
            }
            else 
            {
                $functionReturnString = $node.object.displayName +" (ObjectID: "+$node.object.id+") ("+$node.object.getType().name+") [Parent Group]"
            }
        }
    }
    elseif ($outputType -eq $functionLDAPType)
    {
        out-logfile -string "Calculating string for LDAP"

        if ($reverseHierarchy -eq $FALSE)
        {
            $functionReturnString = $node.object.DisplayName +" (ObjectGUID:"+$node.object.objectGUID+") ("+$node.object.objectClass+")"
        }
        else 
        {
            if ($node.object.objectClass -eq "Group")
            {
                $functionReturnString = $node.object.DisplayName +" (ObjectGUID:"+$node.object.objectGUID+") ("+$node.object.objectClass+") [Parent Group]"
            }
            else 
            {
                $functionReturnString = $node.object.DisplayName +" (ObjectGUID:"+$node.object.objectGUID+") ("+$node.object.objectClass+")"
            }
        }
    }

    out-logfile -string $functionReturnString
    return $functionReturnString
}
function New-HTMLTreeChildNodes 
{
    param(
        [Parameter(Mandatory = $true)]
        $node,
        [Parameter(Mandatory = $true)]
        $outputType
    )

    $functionGraphUser = "MicrosoftGraphUser"
    $functionGraphGroup = "MicrosoftGraphGroup"
    $functionGraphContact = "MicrosoftGraphOrgContact"

    $functionExchangeGroup = "Group"
    $functionExchangeMailUniversalSecurityGroup = "MailUniversalSecurityGroup"
    $functionExchangeMailUniversalDistributionGroup = "MailUniversalDistributionGroup"
    $functionExchangeUserMailbox = "UserMailbox"
    $functionExchangeMailUser = "Mailuser"
    $functionExchangeGuestMailUser = "GuestMailUser"
    $functionExchangeMailContact = "MailContact"
    $functionExchangeGroupMailbox = "GroupMailbox"
    $functionExchangeDynamicGroup = "DynamicDistributionGroup"

    $functionLDAPGroup = "Group"
    $functionLDAPUser = "User"
    $functionLDAPContact = "Contact"
    $functionLDAPDynamicGroup = "msExchDynamicDistributionList"

    if ($outputType -eq $functionMSGraphType)
    {

        $sorted = New-Object System.Collections.Generic.List[pscustomobject]
        $node.Children | % { $sorted.Add($_) }
        
        $sorted = [System.Linq.Enumerable]::OrderBy($sorted, [Func[pscustomobject,string]]{ param($x) $x.Object.additionalproperties.'@odata.context' })
        $sorted = [System.Linq.Enumerable]::ThenBy($sorted, [Func[pscustomobject,string]]{ param($x) $x.Object.DisplayName })

        foreach ($child in $sorted)
        {
            $string = get-nodeString -node $child -outputType $functionMSGraphType
            out-logfile -string ("Prcessing HTML: "+$string)

            if ($child.object.getType().name -eq $functionGraphUser)
            {
                New-HTMLTreeNode -Title $string -children {New-HTMLTreeChildNodes -node $child -outputType $functionMSGraphType} -icon $functionUserPNGHTML
            }
            elseif ($child.object.getType().name -eq $functionGraphGroup)
            {
                New-HTMLTreeNode -Title $string -children {New-HTMLTreeChildNodes -node $child -outputType $functionMSGraphType} -icon $functionGroupPNGHTML
            }
            elseif ($child.object.getType().name -eq $functionGraphContact)
            {
                New-HTMLTreeNode -Title $string -children {New-HTMLTreeChildNodes -node $child -outputType $functionMSGraphType} -icon $functionContactPNGHTML
            }
        }
    }
    elseif ($outputType -eq $functionExchangeOnlineType)
    {
        $sorted = New-Object System.Collections.Generic.List[pscustomobject]
        $node.Children | % { $sorted.Add($_) }
     
        $sorted = [System.Linq.Enumerable]::OrderBy($sorted, [Func[pscustomobject,string]]{ param($x) $x.Object.RecipientTypeDetails })
        $sorted = [System.Linq.Enumerable]::ThenBy($sorted, [Func[pscustomobject,string]]{ param($x) $x.Object.DisplayName })

        foreach ($child in $sorted)
        {
            $string = get-nodeString -node $child -outputType $functionExchangeOnlineType
            out-logfile -string ("Prcessing HTML: "+$string)

            if ($child.object.recipientType -eq $functionExchangeGroup)
            {
                New-HTMLTreeNode -Title $string -children {New-HTMLTreeChildNodes -node $child -outputType $functionExchangeOnlineType} -icon $functionGroupPNGHTML
            }
            elseif ($child.object.recipientType -eq $functionExchangeMailUniversalSecurityGroup)
            {
                New-HTMLTreeNode -Title $string -children {New-HTMLTreeChildNodes -node $child -outputType $functionExchangeOnlineType} -icon $functionGroupPNGHTML
            }
            elseif ($child.object.recipientType -eq $functionExchangeDynamicGroup)
            {
                New-HTMLTreeNode -Title $string -children {New-HTMLTreeChildNodes -node $child -outputType $functionExchangeOnlineType} -icon $functionGroupPNGHTML
            }
            elseif ($child.object.recipientType -eq $functionExchangeMailUniversalDistributionGroup)
            {
                New-HTMLTreeNode -Title $string -children {New-HTMLTreeChildNodes -node $child -outputType $functionExchangeOnlineType} -icon $functionGroupPNGHTML
            }
            elseif ($child.object.recipientType -eq $functionExchangeGroupMailbox)
            {
                New-HTMLTreeNode -Title $string -children {New-HTMLTreeChildNodes -node $child -outputType $functionExchangeOnlineType} -icon $functionGroupPNGHTML
            }
            elseif ($child.object.recipientType -eq $functionExchangeGuestMailUser)
            {
                New-HTMLTreeNode -Title $string -children {New-HTMLTreeChildNodes -node $child -outputType $functionExchangeOnlineType} -icon $functionUserPNGHTML
            }
            elseif ($child.object.recipientType -eq $functionExchangeMailUser)
            {
                New-HTMLTreeNode -Title $string -children {New-HTMLTreeChildNodes -node $child -outputType $functionExchangeOnlineType} -icon $functionUserPNGHTML
            }
            elseif ($child.object.recipientType -eq $functionExchangeUserMailbox)
            {
                New-HTMLTreeNode -Title $string -children {New-HTMLTreeChildNodes -node $child -outputType $functionExchangeOnlineType} -icon $functionUserPNGHTML
            }
            elseif ($child.object.recipientType -eq $functionExchangeUser)
            {
                New-HTMLTreeNode -Title $string -children {New-HTMLTreeChildNodes -node $child -outputType $functionExchangeOnlineType} -icon $functionUserPNGHTML
            }
            elseif ($child.object.recipientType -eq $functionExchangeMailContact)
            {
                New-HTMLTreeNode -Title $string -children {New-HTMLTreeChildNodes -node $child -outputType $functionExchangeOnlineType} -icon $functionContactPNGHTML
            }
        }
    }
    elseif ($outputType -eq $functionLDAPType)
    {
        $sorted = New-Object System.Collections.Generic.List[pscustomobject]
        $node.Children | % { $sorted.Add($_) }
     
        $sorted = [System.Linq.Enumerable]::OrderBy($sorted, [Func[pscustomobject,string]]{ param($x) $x.Object.objectClass })
        $sorted = [System.Linq.Enumerable]::ThenBy($sorted, [Func[pscustomobject,string]]{ param($x) $x.Object.Name })

        foreach ($child in $sorted)
        {
            $string = get-nodeString -node $child -outputType $functionLDAPType
            out-logfile -string ("Prcessing HTML: "+$string)

            if ($child.object.objectClass -eq  $functionLDAPGroup)
            {
                New-HTMLTreeNode -Title $string -children {New-HTMLTreeChildNodes -node $child -outputType $functionLDAPType} -icon $functionGroupPNGHTML
            }
            elseif ($child.object.objectClass -eq  $functionLDAPDynamicGroup)
            {
                New-HTMLTreeNode -Title $string -children {New-HTMLTreeChildNodes -node $child -outputType $functionLDAPType} -icon $functionGroupPNGHTML
            }
            elseif ($child.object.objectClass -eq  $functionLDAPUser)
            {
                New-HTMLTreeNode -Title $string -children {New-HTMLTreeChildNodes -node $child -outputType $functionLDAPType} -icon $functionUserPNGHTML
            }
            elseif ($child.object.objectClass -eq  $functionLDAPContact)
            {
                New-HTMLTreeNode -Title $string -children {New-HTMLTreeChildNodes -node $child -outputType $functionLDAPType} -icon $functionContactPNGHTML
            }
        }
    }
}


function start-HTMLOutput
{
    param(
        [Parameter(Mandatory = $true)]
        $node,
        [Parameter(Mandatory = $true)]
        $outputType,
        [Parameter(Mandatory = $true)]
        $groupObjectID,
        [Parameter(Mandatory =$FALSE)]
        [boolean]$reverseHierarchy=$FALSE,
        [Parameter(Mandatory =$FALSE)]
        [boolean]$isHealthCheck=$FALSE
    )

    $functionMSGraphType = "MSGraph"
    $functionExchangeOnlineType = "ExchangeOnline"
    $functionLDAPType = "LDAP"

    $functionContactPNGHTML = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAMCAMAAABcOc2zAAAAIGNIUk0AAHomAACAhAAA+gAAAIDoAAB1MAAA6mAAADqYAAAXcJy6UTwAAADkUExURdPT08nJyczMzMrKyuzs7Pb29vn29vn39vf29vX19c3Nzf////X8/q/k8qLg8Or4/Pv7+/b19vj4+KTg7yq32yW22n7T6f3+/+fm5+bm5vT09IjX6yK12mHK5Pj9/vb29dHv917J5FLF4rbm8ufn5+jn6O3t7bzo9GvN5sLq9Nfx+HDP56Pg7/v+/+7t7vLy8ufx81TG4iC02mXL5SS22jm93tvz+ff29c7Nzdzt8UbB4CO12ia22zK63cnt9vj29u3s7fP19cjt9pLb7X3U6XzT6YzY7Lno8/b8/vz8+/n39/f397c048AAAAABYktHRAsf18TAAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAB3RJTUUH6AIdFDYNAvIJCQAAAKBJREFUCNddjscSgkAQRJcw4jImUBBMGNY1Y8IcMMf//x8BL5bv+KqruwkRxB8EQiQZIKbEKYUQWSIqYCKZSiNmADSdikSkmM0ZZh6pZdlyIRLFUqlcwQgIhIPVWr2BSFmT8TDhtNqdbq8/0F2XDwOhjsaTqenN5gv727FcrTfG1tvtfcbYIUwcT+fL9XZ/PDUtmpX4ywfwlejXm0vk//oHL48QM5PBxIEAAAAldEVYdGRhdGU6Y3JlYXRlADIwMjQtMDItMjlUMjA6NTQ6MDErMDA6MDASa647AAAAJXRFWHRkYXRlOm1vZGlmeQAyMDI0LTAyLTI5VDIwOjU0OjAxKzAwOjAwYzYWhwAAACh0RVh0ZGF0ZTp0aW1lc3RhbXAAMjAyNC0wMi0yOVQyMDo1NDoxMyswMDowMG8WJu8AAAAASUVORK5CYII="
    $functionGroupPNGHTML = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAANCAMAAACXZR4WAAAAIGNIUk0AAHomAACAhAAA+gAAAIDoAAB1MAAA6mAAADqYAAAXcJy6UTwAAAGVUExURf///+P5/nbi+DvW9Xfj+OT5/vT9/nPg9i/R8jDQ8jDQ8S7P8HTe9PX9/vj7/snw+TXJ6i3G6C3F6C3D5yvC5jXE5svw+LnZ80qf4Eed4K/V8rjo9Cu63im43Si33Ci22ye12iy22prW7SqN2wB10x+I2djq+Njx9zi01iKr0CSr0CSpzyGozTuy0qHS7Q1/1gB41Ad81b3c9JLS5SWixxybwxyawiWfxZjS5O31/ECa3wB20zmW3unz+8/1/XLg92PN52+/2G++2GrO54Tl+LHg9lal4kyg4czk9r7w+kXV8yvQ8l/c9tH1/NP1/WXd9i7R8izC7QyJ2ozB65HF7AN51CyP29Dm99/2+0/O6yrF6DfI6bDp9rXq9znJ6SzF6C7H6R2s4USe4EWc3wB21AB31F6q5I/Z7Cm43Ce33HjS6X7U6ie23BKP1wN51RSC10272SOr0Diz1Dqz1SSs0Ceg1T2Y3j6Z3z6Z3k2h4Smixx+dxB+exBycxFGz0uz2+/b6/vX6/UupySOVvCCUu2250/r9/qaz2UMAAAABYktHRACIBR1IAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAB3RJTUUH6AIdFDYNAvIJCQAAAMRJREFUCNdjYGBgYGRiZmZhZYADNnYOTi5uHl4GPj6IAL+AoJCwiKiYuISkFFhAWkZWTl5BUUlZRUVVDSSgrqGppa2jq6dvYGBoBFZibGJqZm5haWVtbWML4tvZOzg6Obu4Sri5uXsA+Z5e3j6+fv4BgUHBIaFh4QwRkVFC0TGxcfEJiUnJKalpDOkZGRmZWdmZGRk5uXnWKvkMBZpaWoVFxYVaWiWlZeUVlQxV1TU1NdUgorauvqGRj6GpGQZaWtuAdgAA0tUvmIxhubgAAAAldEVYdGRhdGU6Y3JlYXRlADIwMjQtMDItMjlUMjA6NTQ6MDErMDA6MDASa647AAAAJXRFWHRkYXRlOm1vZGlmeQAyMDI0LTAyLTI5VDIwOjU0OjAxKzAwOjAwYzYWhwAAACh0RVh0ZGF0ZTp0aW1lc3RhbXAAMjAyNC0wMi0yOVQyMDo1NDoxMyswMDowMG8WJu8AAAAASUVORK5CYII="
    $functionUserPNGHTML = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAQCAMAAAD+iNU2AAAAIGNIUk0AAHomAACAhAAA+gAAAIDoAAB1MAAA6mAAADqYAAAXcJy6UTwAAAGSUExURf///+/8/pLo+knZ9jbV9UjZ9pDo+u77/vX9/n7j+DPT9DDT9DHS9DDS8zLS83rh9vP8/rXt+TLN7y/M7i/L7S/K7C7J7C7J6zDI6rDp93/a8CjB5SzB5SvA5Cu/4yu+4iu+4Sa84HnV63nS6SS22yi22yi12ie12Se02Cez2COx1nPN5f7//6Xe7SSt0iSs0SSr0CSq0CSqzyOpziKnzaDa6u34+2C92B+gxiCfxh6exR6cw1y41Or2+vP9/5/k9Eq41zOixSebwTKgxEm11afl8/r+/9L1/Wff9zXV9W/g97zp9LDh77vo9G3f9zrW9nrj+OT5/tX1/E/W8i3P8C/P8UTU8r/w+9v3/b7w+0PU8i7P8S3P8WTb9Oj5/WvW7irE6C3F6Ivf8tn1+4ve8izF6ITc8fz+/7fn8zG83ym63ie53lPH5MHr9Si63jq/4crt9nDK4ySv1Caw1SWv1C+z1nPL43/Q5j6w0SGlyiKlyyinzCClykSz0yadwx6awSaew1qvzR6Suh2RuR+SuluwzTyKhB8AAAABYktHRACIBR1IAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAB3RJTUUH6AIdFDYOm/tYswAAAMFJREFUCNdjYAACRiZmFlY2dgYo4ODk4ubh5eMXgPIFhYRFRMXEJSShfClpGVk5eQVFJShfWUVVTV1DU0tbB8LX1dM3MDQyNjGFypuZW1hYWlnb2EL5dvYOjk7OLq5uEK67h6eXt4+vn39AIIgbFBwSGhYeERkVHRMbx8AgEJ+QmJiYlJySmpiYkJbOkJGZlZWVnZObk52VlZdfwFBYVFxcXFJaVloCossZKiqrQKAaTNbUMtTVI4MGhsamZgRoaQUAG1I6c6Lf74UAAAAldEVYdGRhdGU6Y3JlYXRlADIwMjQtMDItMjlUMjA6NTQ6MDErMDA6MDASa647AAAAJXRFWHRkYXRlOm1vZGlmeQAyMDI0LTAyLTI5VDIwOjU0OjAxKzAwOjAwYzYWhwAAACh0RVh0ZGF0ZTp0aW1lc3RhbXAAMjAyNC0wMi0yOVQyMDo1NDoxMyswMDowMG8WJu8AAAAASUVORK5CYII="


    $functionHTMLSuffix = "html"
    $functionHTMLLDAPSuffix  = "-LDAP.html"
    $functionHTMLLDAPReverseSuffix  = "-LDAPReverse.html"
    $functionHTMLGraphSuffix  = "-Graph.html"
    $functionHTMLGraphReverseSuffix  = "-GraphReverse.html"
    $functionExchangeSuffix  = "-Exchange.html"
    $functionExchangeReverseSuffix  = "-ExchangeReverse.html"

    if (($isHealthCheck -eq $TRUE) -and ($reverseHierarchy -eq $FALSE) -and ($outputType -eq $functionLDAPType))
    {
        $global:functionHTMLFile = $global:LogFile.replace(".log",$functionHTMLLDAPSuffix)   
    }
    elseif (($isHealthCheck -eq $TRUE) -and ($reverseHierarchy -eq $true) -and ($outputType -eq $functionLDAPType))
    {
        $global:functionHTMLFile = $global:LogFile.replace(".log",$functionHTMLLDAPReverseSuffix)   
    }
    elseif (($isHealthCheck -eq $TRUE) -and ($reverseHierarchy -eq $FALSE) -and ($outputType -eq $functionMSGraphType))
    {
        $global:functionHTMLFile = $global:LogFile.replace(".log",$functionHTMLGraphSuffix)   
    }
    elseif (($isHealthCheck -eq $TRUE) -and ($reverseHierarchy -eq $true) -and ($outputType -eq $functionMSGraphType))
    {
        $global:functionHTMLFile = $global:LogFile.replace(".log",$functionHTMLGraphReverseSuffix)   
    }
    elseif (($isHealthCheck -eq $TRUE) -and ($reverseHierarchy -eq $FALSE) -and ($outputType -eq $functionExchangeOnlineType))
    {
        $global:functionHTMLFile = $global:LogFile.replace(".log",$functionExchangeSuffix)   
    }
    elseif (($isHealthCheck -eq $TRUE) -and ($reverseHierarchy -eq $true) -and ($outputType -eq $functionExchangeOnlineType))
    {
        $global:functionHTMLFile = $global:LogFile.replace(".log",$functionExchangeReverseSuffix)   
    }
    else 
    {
        $global:functionHTMLFile = $global:LogFile.replace("log",$functionHTMLSuffix)    
    }
    

    if (($reverseHierarchy -eq $true) -and ($outputType -eq $functionExchangeOnlineType))
    {
        $headerString = ("***Exchange Based Group Hierarchy in REVERSE for: "+$groupObjectID+"***")
    }
    elseif (($reverseHierarchy -eq $true) -and ($outputType -eq $functionMSGraphType))
    {
        $headerString = ("***Graph Based Group Hierarchy in REVERSE for: "+$groupObjectID+"***")
    }
    elseif (($reverseHierarchy -eq $true) -and ($outputType -eq $functionLDAPType))
    {
        $headerString = ("***LDAP Based Group Hierarchy in REVERSE for: "+$groupObjectID+"***")
    }
    elseif ($outputType -eq $functionExchangeOnlineType)
    {
        $headerString = ("***Exchange Based Group Hierarchy for: "+$groupObjectID+"***")
    }
    elseif ($outputType -eq $functionMSGraphType)
    {
        $headerString = ("***Graph Based Group Hierarchy for: "+$groupObjectID+"***")
    }
    elseif ($outputType -eq $functionLDAPType)
    {
        $headerString = ("***LDAP Based Group Hierarchy for: "+$groupObjectID+"***")
    }

    out-logfile -string $global:functionHTMLFile
    out-logfile -string $outputType

    if ($isHealthCheck -eq $FALSE)
    {
        if ($outputType -eq $functionExchangeOnlineType)
        {
            out-logfile -string "Entering Exchange Online Type"

            $string = get-nodeString -node $node -outputType $functionExchangeOnlineType
            out-logfile -string ("Prcessing HTML: "+$string)

            New-HTML -TitleText $groupObjectID -FilePath $global:functionHTMLFile {
                New-HTMLHeader{
                    New-HTMLText -Text $headerString -FontSize 24 -Color White -BackGroundColor Black -Alignment center
                }
                new-htmlMain{
                    New-HTMLTableOption -DataStore JavaScript
                    new-htmlSection -HeaderText ("Group membership hierarchy for group object id: "+$groupObjectID){
                        New-HTMLTree -Checkbox none {
                            New-HTMLTreeChildCounter -Deep -HideZero -HideExpanded
                            New-HTMLTreeNode -title $string -children {New-HTMLTreeChildNodes -node $node -outputType $functionExchangeOnlineType} -icon $functionGroupPNGHTML
                        } -EnableChildCounter -AutoScroll -MinimumExpandLevel 1 -EnableQuickSearch
                    }-HeaderTextAlignment "Left" -HeaderTextSize "16" -HeaderTextColor "White" -HeaderBackGroundColor "Black"  -CanCollapse -BorderRadius 10px
                    new-htmlSection -HeaderText ("Group membership table for group object id: "+$groupObjectID){
                        new-htmlTable -DataTable ($global:exchangeObjects | select-object DisplayName,Alias,ExternalDirectoryObjectId,ExchangeObjectId,Identity,ID,Name,PrimarySmtpAddress,EmailAddresses,LegacyExchangeDN,externalEmailAddress,RecipientType,RecipientTypeDetails,GroupType,IsDirSynced | sort-object exchangeObjectID -Unique) -Filtering {
                        } -AutoSize
                    } -HeaderTextAlignment "Left" -HeaderTextSize "16" -HeaderTextColor "White" -HeaderBackGroundColor "Black"  -CanCollapse -BorderRadius 10px
                    new-htmlSection -HeaderText ("Group membership breakdown for group object id: "+$groupObjectID){
                        New-HTMLPanel {
                            New-HTMLChart -Gradient {
                                New-ChartDonut -Name 'Groups' -Value $global:groupCounter.count
                                New-ChartDonut -Name 'DynamicGroups' -Value $global:dynamicGroupCounter.count
                                new-ChartDonut -Name 'MailSecurityGroups' -value $global:mailUniversalSecurityGroupCounter.count
                                new-chartDonut -name 'MailDistributionGroups' -value $global:mailUniversalDistributionGroupCounter.count
                                new-chartDonut -name 'UnifiedGroups' -value $global:groupMailboxCounter.count
                                new-chartDonut -name 'UnifiedGroups-Dynamic' -value $global:groupMailboxDyanmicCounter.count
                            }
                        }
                        New-HTMLPanel {
                            New-HTMLChart -Gradient {
                                New-ChartDonut -Name 'Users' -Value $global:userCounter.count
                                New-ChartDonut -Name 'MailContacts' -Value $global:mailContactCounter.count
                                New-ChartDonut -Name 'GuestMailUsers' -Value $global:guestMailUserCounter.count
                                New-ChartDonut -Name 'MailUsers' -Value $global:mailUserCounter.count
                                New-ChartDonut -Name 'UserMailbox' -Value $global:userMailboxCounter.count
                                New-ChartDonut -Name 'RoomMailbox' -Value $global:roomMailboxCounter.count
                                New-ChartDonut -Name 'EqipmentMailbox' -Value $global:equipmentMailboxCounter.count
                                New-ChartDonut -Name 'SharedMailbox' -Value $global:sharedMailboxCounter.count
                            }
                        }
                        New-HTMLPanel {
                            New-HTMLChart -Gradient {
                                New-ChartDonut -Name 'Groups' -Value $global:groupCounter.count
                                New-ChartDonut -Name 'DynamicGroups' -Value $global:dynamicGroupCounter.count
                                new-ChartDonut -Name 'MailSecurityGroups' -value $global:mailUniversalSecurityGroupCounter.count
                                new-chartDonut -name 'MailDistributionGroups' -value $global:mailUniversalDistributionGroupCounter.count
                                new-chartDonut -name 'UnifiedGroups' -value $global:groupMailboxCounter.count
                                new-chartDonut -name 'UnifiedGroups-Dynamic' -value $global:groupMailboxDyanmicCounter.count
                                New-ChartDonut -Name 'Users' -Value $global:userCounter.count
                                New-ChartDonut -Name 'MailContacts' -Value $global:mailContactCounter.count
                                New-ChartDonut -Name 'GuestMailUsers' -Value $global:guestMailUserCounter.count
                                New-ChartDonut -Name 'MailUsers' -Value $global:mailUserCounter.count
                                New-ChartDonut -Name 'UserMailbox' -Value $global:userMailboxCounter.count
                                New-ChartDonut -Name 'RoomMailbox' -Value $global:roomMailboxCounter.count
                                New-ChartDonut -Name 'EqipmentMailbox' -Value $global:equipmentMailboxCounter.count
                                New-ChartDonut -Name 'SharedMailbox' -Value $global:sharedMailboxCounter.count
                            }
                        }
                    } -HeaderTextAlignment "Left" -HeaderTextSize "16" -HeaderTextColor "White" -HeaderBackGroundColor "Black"  -CanCollapse -BorderRadius 10px
                } 
                New-HTMLFooter {
                    New-HTMLText -Text "Date of this report $(Get-Date)" -FontSize 16 -Color White -BackGroundColor Black -Alignment center
                }
            } -Online -ShowHTML
        }
        elseif ($outputType -eq $functionMSGraphType)
        {
            out-logfile -string "Entering MS Graph Type"

            $string = get-nodeString -node $node -outputType $functionMSGraphType
            out-logfile -string ("Prcessing HTML: "+$string)

            New-HTML -TitleText $groupObjectID -FilePath $global:functionHTMLFile {
                New-HTMLHeader{
                    New-HTMLText -Text $headerString -FontSize 24 -Color White -BackGroundColor Black -Alignment center
                }
                New-HTMLMain{
                    New-HTMLTableOption -DataStore JavaScript
                    new-htmlSection -HeaderText ("Group membership hierarchy for group object id: "+$groupObjectID){
                        New-HTMLTree -Checkbox none {
                            New-HTMLHeading -HeadingText ('Group Expansion for: '+$groupObjectID) -Heading h1
                            New-HTMLTreeChildCounter -Deep -HideZero -HideExpanded
                            New-HTMLTreeNode -title $string -children {New-HTMLTreeChildNodes -node $node -outputType $functionMSGraphType} -icon $functionGroupPNGHTML
                        } -EnableChildCounter -AutoScroll -MinimumExpandLevel 1 -EnableQuickSearch
                    }-HeaderTextAlignment "Left" -HeaderTextSize "16" -HeaderTextColor "White" -HeaderBackGroundColor "Black"  -CanCollapse -BorderRadius 10px
                    new-htmlSection -HeaderText ("Group membership table for group object id: "+$groupObjectID){
                        new-htmlTable -DataTable ($global:msGraphObjects | select-object DisplayName,Id,Mail,MailEnabled,MailNickname,ProxyAddresses,GroupTypes,SecurityEnabled,MembershipRule | sort-object ID -Unique) -Filtering {
                        } -AutoSize
                    } -HeaderTextAlignment "Left" -HeaderTextSize "16" -HeaderTextColor "White" -HeaderBackGroundColor "Black"  -CanCollapse -BorderRadius 10px
                    new-htmlSection -HeaderText ("Group membership breakdown for group object id: "+$groupObjectID){
                        New-HTMLPanel {
                            New-HTMLChart -Gradient {
                                New-ChartDonut -Name 'Groups' -Value $global:msGraphGroupCount.count
                                New-ChartDonut -name 'DynamnicGroups' -value $global:msGraphGroupDynamicCount.Count
                            }
                        }
                        New-HTMLPanel {
                            New-HTMLChart -Gradient {
                                New-ChartDonut -Name 'Users' -Value $global:msGraphUserCount.count
                                new-ChartDonut -Name 'Contacts' -value $global:msGraphContactCount.count
                            }
                        }
                        New-HTMLPanel {
                            New-HTMLChart -Gradient {
                                New-ChartDonut -Name 'Groups' -Value $global:msGraphGroupCount.count
                                New-ChartDonut -name 'DynamnicGroups' -value $global:msGraphGroupDynamicCount.Count
                                New-ChartDonut -Name 'Users' -Value $global:msGraphUserCount.count
                                new-ChartDonut -Name 'Contacts' -value $global:msGraphContactCount.count
                            }
                        }
                    } -HeaderTextAlignment "Left" -HeaderTextSize "16" -HeaderTextColor "White" -HeaderBackGroundColor "Black"  -CanCollapse -BorderRadius 10px
                }
                New-HTMLFooter {
                    New-HTMLText -Text "Date of this report $(Get-Date)" -FontSize 16 -Color White -BackGroundColor Black -Alignment center
                }
            } -Online -ShowHTML
        }
        elseif ($outputType -eq $functionLDAPType)
        {
            out-logfile -string "Entering LDAP Type"

            $string = get-nodeString -node $node -outputType $functionLDAPType
            out-logfile -string ("Prcessing HTML: "+$string)

            New-HTML -TitleText $groupObjectID -FilePath $global:functionHTMLFile {
                New-HTMLHeader{
                    New-HTMLText -Text $headerString -FontSize 24 -Color White -BackGroundColor Black -Alignment center
                }
                new-htmlMain{
                    New-HTMLTableOption -DataStore JavaScript
                    new-htmlSection -HeaderText ("Group membership hierarchy for group object id: "+$groupObjectID){
                        New-HTMLTree -Checkbox none {
                            New-HTMLTreeChildCounter -Deep -HideZero -HideExpanded
                            New-HTMLTreeNode -title $string -children {New-HTMLTreeChildNodes -node $node -outputType $functionLDAPType} -icon $functionGroupPNGHTML
                        } -EnableChildCounter -AutoScroll -MinimumExpandLevel 1 -EnableQuickSearch
                    } -HeaderTextAlignment "Left" -HeaderTextSize "16" -HeaderTextColor "White" -HeaderBackGroundColor "Black"  -CanCollapse -BorderRadius 10px
                    new-htmlSection -HeaderText ("Group membership table for group object id: "+$groupObjectID){
                        new-htmlTable -DataTable (($global:ldapObjects | select-object DistinguishedName,CanonicalName,objectGUID,Name,DisplayName,groupType,mail,mailnickanme,proxyAddresses,targetAddress,legacyExchangeDN,'mS-DS-ConsistencyGuid','msDS-ExternalDirectoryObjectId',msExchRecipientDisplayType,msExchRecipientTypeDetails,msExchRemoteRecipientType,msExchMailboxGuid,msExchArchiveGUID) | sort-object distinguishedName -Unique) -Filtering {
                        } -AutoSize
                    } -HeaderTextAlignment "Left" -HeaderTextSize "16" -HeaderTextColor "White" -HeaderBackGroundColor "Black"  -CanCollapse -BorderRadius 10px
                    new-htmlSection -HeaderText ("Group membership breakdown for group object id: "+$groupObjectID){
                        New-HTMLPanel {
                            New-HTMLChart -Gradient {
                                New-ChartDonut -Name 'Groups' -Value $global:groupCounter.count
                                New-ChartDonut -Name 'DynamicGroups' -Value $global:dynamicGroupCounter.count
                            }
                        }
                        New-HTMLPanel {
                            New-HTMLChart -Gradient {
                                New-ChartDonut -Name 'Users' -Value $global:userCounter.count
                                New-ChartDonut -Name 'Contacts' -Value $global:contactCounter.count
                            }
                        }
                        New-HTMLPanel {
                            New-HTMLChart -Gradient {
                                New-ChartDonut -Name 'Users' -Value $global:userCounter.count
                                New-ChartDonut -Name 'Contacts' -Value $global:contactCounter.count
                                New-ChartDonut -Name 'Groups' -Value $global:groupCounter.count
                                New-ChartDonut -Name 'DynamicGroups' -Value $global:dynamicGroupCounter.count
                            }
                        }
                    } -HeaderTextAlignment "Left" -HeaderTextSize "16" -HeaderTextColor "White" -HeaderBackGroundColor "Black"  -CanCollapse -BorderRadius 10px
                    if ($reverseHierarchy -eq $FALSE)
                    {
                        new-htmlSection -HeaderText ("Parents (Reverse) or Chilren (Normal) Simplied Group List"){
                            new-htmlTable -DataTable $global:groupTracking -Filtering {
                            } -AutoSize
                        } -HeaderTextAlignment "Left" -HeaderTextSize "16" -HeaderTextColor "White" -HeaderBackGroundColor "Black"  -CanCollapse -BorderRadius 10px
                    }
                }
                New-HTMLFooter {
                    New-HTMLText -Text "Date of this report $(Get-Date)" -FontSize 16 -Color White -BackGroundColor Black -Alignment center
                }
            } -Online -ShowHTML 
        }
    }
    else 
    {
        if ($outputType -eq $functionExchangeOnlineType)
        {
            out-logfile -string "Entering Exchange Online Type"

            $string = get-nodeString -node $node -outputType $functionExchangeOnlineType
            out-logfile -string ("Prcessing HTML: "+$string)

            New-HTML -TitleText $groupObjectID -FilePath $global:functionHTMLFile {
                New-HTMLHeader{
                    New-HTMLText -Text $headerString -FontSize 24 -Color White -BackGroundColor Black -Alignment center
                }
                new-htmlMain{
                    New-HTMLTableOption -DataStore JavaScript
                    new-htmlSection -HeaderText ("Group membership hierarchy for group object id: "+$groupObjectID){
                        New-HTMLTree -Checkbox none {
                            New-HTMLTreeChildCounter -Deep -HideZero -HideExpanded
                            New-HTMLTreeNode -title $string -children {New-HTMLTreeChildNodes -node $node -outputType $functionExchangeOnlineType} -icon $functionGroupPNGHTML
                        } -EnableChildCounter -AutoScroll -MinimumExpandLevel 1 -EnableQuickSearch
                    }-HeaderTextAlignment "Left" -HeaderTextSize "16" -HeaderTextColor "White" -HeaderBackGroundColor "Black"  -CanCollapse -BorderRadius 10px -Collapsed
                    new-htmlSection -HeaderText ("Group membership table for group object id: "+$groupObjectID){
                        new-htmlTable -DataTable ($global:exchangeObjects | select-object DisplayName,Alias,ExternalDirectoryObjectId,ExchangeObjectId,Identity,ID,Name,PrimarySmtpAddress,EmailAddresses,LegacyExchangeDN,externalEmailAddress,RecipientType,RecipientTypeDetails,GroupType,IsDirSynced | sort-object exchangeObjectID -Unique) -Filtering {
                        } -AutoSize
                    } -HeaderTextAlignment "Left" -HeaderTextSize "16" -HeaderTextColor "White" -HeaderBackGroundColor "Black"  -CanCollapse -BorderRadius 10px -Collapsed
                    new-htmlSection -HeaderText ("Group membership breakdown for group object id: "+$groupObjectID){
                        New-HTMLPanel {
                            New-HTMLChart -Gradient {
                                New-ChartDonut -Name 'Groups' -Value $global:groupCounter.count
                                New-ChartDonut -Name 'DynamicGroups' -Value $global:dynamicGroupCounter.count
                                new-ChartDonut -Name 'MailSecurityGroups' -value $global:mailUniversalSecurityGroupCounter.count
                                new-chartDonut -name 'MailDistributionGroups' -value $global:mailUniversalDistributionGroupCounter.count
                                new-chartDonut -name 'UnifiedGroups' -value $global:groupMailboxCounter.count
                                new-chartDonut -name 'UnifiedGroups-Dynamic' -value $global:groupMailboxDyanmicCounter.count
                            }
                        }
                        New-HTMLPanel {
                            New-HTMLChart -Gradient {
                                New-ChartDonut -Name 'Users' -Value $global:userCounter.count
                                New-ChartDonut -Name 'MailContacts' -Value $global:mailContactCounter.count
                                New-ChartDonut -Name 'GuestMailUsers' -Value $global:guestMailUserCounter.count
                                New-ChartDonut -Name 'MailUsers' -Value $global:mailUserCounter.count
                                New-ChartDonut -Name 'UserMailbox' -Value $global:userMailboxCounter.count
                                New-ChartDonut -Name 'RoomMailbox' -Value $global:roomMailboxCounter.count
                                New-ChartDonut -Name 'EqipmentMailbox' -Value $global:equipmentMailboxCounter.count
                                New-ChartDonut -Name 'SharedMailbox' -Value $global:sharedMailboxCounter.count
                            }
                        }
                        New-HTMLPanel {
                            New-HTMLChart -Gradient {
                                New-ChartDonut -Name 'Groups' -Value $global:groupCounter.count
                                New-ChartDonut -Name 'DynamicGroups' -Value $global:dynamicGroupCounter.count
                                new-ChartDonut -Name 'MailSecurityGroups' -value $global:mailUniversalSecurityGroupCounter.count
                                new-chartDonut -name 'MailDistributionGroups' -value $global:mailUniversalDistributionGroupCounter.count
                                new-chartDonut -name 'UnifiedGroups' -value $global:groupMailboxCounter.count
                                new-chartDonut -name 'UnifiedGroups-Dynamic' -value $global:groupMailboxDyanmicCounter.count
                                New-ChartDonut -Name 'Users' -Value $global:userCounter.count
                                New-ChartDonut -Name 'MailContacts' -Value $global:mailContactCounter.count
                                New-ChartDonut -Name 'GuestMailUsers' -Value $global:guestMailUserCounter.count
                                New-ChartDonut -Name 'MailUsers' -Value $global:mailUserCounter.count
                                New-ChartDonut -Name 'UserMailbox' -Value $global:userMailboxCounter.count
                                New-ChartDonut -Name 'RoomMailbox' -Value $global:roomMailboxCounter.count
                                New-ChartDonut -Name 'EqipmentMailbox' -Value $global:equipmentMailboxCounter.count
                                New-ChartDonut -Name 'SharedMailbox' -Value $global:sharedMailboxCounter.count
                            }
                        }
                    } -HeaderTextAlignment "Left" -HeaderTextSize "16" -HeaderTextColor "White" -HeaderBackGroundColor "Black"  -CanCollapse -BorderRadius 10px -Collapsed
                } 
                New-HTMLFooter {
                    New-HTMLText -Text "Date of this report $(Get-Date)" -FontSize 16 -Color White -BackGroundColor Black -Alignment center
                }
            }-Online
        }
        elseif ($outputType -eq $functionMSGraphType)
        {
            out-logfile -string "Entering MS Graph Type"

            $string = get-nodeString -node $node -outputType $functionMSGraphType
            out-logfile -string ("Prcessing HTML: "+$string)

            New-HTML -TitleText $groupObjectID -FilePath $global:functionHTMLFile {
                New-HTMLHeader{
                    New-HTMLText -Text $headerString -FontSize 24 -Color White -BackGroundColor Black -Alignment center
                }
                New-HTMLMain{
                    New-HTMLTableOption -DataStore JavaScript
                    new-htmlSection -HeaderText ("Group membership hierarchy for group object id: "+$groupObjectID){
                        New-HTMLTree -Checkbox none {
                            New-HTMLHeading -HeadingText ('Group Expansion for: '+$groupObjectID) -Heading h1
                            New-HTMLTreeChildCounter -Deep -HideZero -HideExpanded
                            New-HTMLTreeNode -title $string -children {New-HTMLTreeChildNodes -node $node -outputType $functionMSGraphType} -icon $functionGroupPNGHTML
                        } -EnableChildCounter -AutoScroll -MinimumExpandLevel 1 -EnableQuickSearch
                    }-HeaderTextAlignment "Left" -HeaderTextSize "16" -HeaderTextColor "White" -HeaderBackGroundColor "Black"  -CanCollapse -BorderRadius 10px -Collapsed
                    new-htmlSection -HeaderText ("Group membership table for group object id: "+$groupObjectID){
                        new-htmlTable -DataTable ($global:msGraphObjects | select-object DisplayName,Id,Mail,MailEnabled,MailNickname,ProxyAddresses,GroupTypes,SecurityEnabled,MembershipRule | sort-object ID -Unique) -Filtering {
                        } -AutoSize
                    } -HeaderTextAlignment "Left" -HeaderTextSize "16" -HeaderTextColor "White" -HeaderBackGroundColor "Black"  -CanCollapse -BorderRadius 10px -Collapsed
                    new-htmlSection -HeaderText ("Group membership breakdown for group object id: "+$groupObjectID){
                        New-HTMLPanel {
                            New-HTMLChart -Gradient {
                                New-ChartDonut -Name 'Groups' -Value $global:msGraphGroupCount.count
                                New-ChartDonut -name 'DynamnicGroups' -value $global:msGraphGroupDynamicCount.Count
                            }
                        }
                        New-HTMLPanel {
                            New-HTMLChart -Gradient {
                                New-ChartDonut -Name 'Users' -Value $global:msGraphUserCount.count
                                new-ChartDonut -Name 'Contacts' -value $global:msGraphContactCount.count
                            }
                        }
                        New-HTMLPanel {
                            New-HTMLChart -Gradient {
                                New-ChartDonut -Name 'Groups' -Value $global:msGraphGroupCount.count
                                New-ChartDonut -name 'DynamnicGroups' -value $global:msGraphGroupDynamicCount.Count
                                New-ChartDonut -Name 'Users' -Value $global:msGraphUserCount.count
                                new-ChartDonut -Name 'Contacts' -value $global:msGraphContactCount.count
                            }
                        }
                    } -HeaderTextAlignment "Left" -HeaderTextSize "16" -HeaderTextColor "White" -HeaderBackGroundColor "Black"  -CanCollapse -BorderRadius 10px -Collapsed
                }
                New-HTMLFooter {
                    New-HTMLText -Text "Date of this report $(Get-Date)" -FontSize 16 -Color White -BackGroundColor Black -Alignment center
                }
            }-Online
        }
        elseif ($outputType -eq $functionLDAPType)
        {
            out-logfile -string "Entering LDAP Type"

            $string = get-nodeString -node $node -outputType $functionLDAPType
            out-logfile -string ("Prcessing HTML: "+$string)

            New-HTML -TitleText $groupObjectID -FilePath $global:functionHTMLFile {
                New-HTMLHeader{
                    New-HTMLText -Text $headerString -FontSize 24 -Color White -BackGroundColor Black -Alignment center
                }
                new-htmlMain{
                    New-HTMLTableOption -DataStore JavaScript
                    new-htmlSection -HeaderText ("Group membership hierarchy for group object id: "+$groupObjectID){
                        New-HTMLTree -Checkbox none {
                            New-HTMLTreeChildCounter -Deep -HideZero -HideExpanded
                            New-HTMLTreeNode -title $string -children {New-HTMLTreeChildNodes -node $node -outputType $functionLDAPType} -icon $functionGroupPNGHTML
                        } -EnableChildCounter -AutoScroll -MinimumExpandLevel 1 -EnableQuickSearch
                    } -HeaderTextAlignment "Left" -HeaderTextSize "16" -HeaderTextColor "White" -HeaderBackGroundColor "Black"  -CanCollapse -BorderRadius 10px -Collapsed
                    new-htmlSection -HeaderText ("Group membership table for group object id: "+$groupObjectID){
                        new-htmlTable -DataTable (($global:ldapObjects | select-object DistinguishedName,CanonicalName,objectGUID,Name,DisplayName,groupType,mail,mailnickanme,proxyAddresses,targetAddress,legacyExchangeDN,'mS-DS-ConsistencyGuid','msDS-ExternalDirectoryObjectId',msExchRecipientDisplayType,msExchRecipientTypeDetails,msExchRemoteRecipientType,msExchMailboxGuid,msExchArchiveGUID) | sort-object distinguishedName -Unique) -Filtering {
                        } -AutoSize
                    } -HeaderTextAlignment "Left" -HeaderTextSize "16" -HeaderTextColor "White" -HeaderBackGroundColor "Black"  -CanCollapse -BorderRadius 10px -Collapsed
                    new-htmlSection -HeaderText ("Group membership breakdown for group object id: "+$groupObjectID){
                        New-HTMLPanel {
                            New-HTMLChart -Gradient {
                                New-ChartDonut -Name 'Groups' -Value $global:groupCounter.count
                                New-ChartDonut -Name 'DynamicGroups' -Value $global:dynamicGroupCounter.count
                            }
                        }
                        New-HTMLPanel {
                            New-HTMLChart -Gradient {
                                New-ChartDonut -Name 'Users' -Value $global:userCounter.count
                                New-ChartDonut -Name 'Contacts' -Value $global:contactCounter.count
                            }
                        }
                        New-HTMLPanel {
                            New-HTMLChart -Gradient {
                                New-ChartDonut -Name 'Users' -Value $global:userCounter.count
                                New-ChartDonut -Name 'Contacts' -Value $global:contactCounter.count
                                New-ChartDonut -Name 'Groups' -Value $global:groupCounter.count
                                New-ChartDonut -Name 'DynamicGroups' -Value $global:dynamicGroupCounter.count
                            }
                        }
                    } -HeaderTextAlignment "Left" -HeaderTextSize "16" -HeaderTextColor "White" -HeaderBackGroundColor "Black"  -CanCollapse -BorderRadius 10px -Collapsed
                    new-htmlSection -HeaderText ("Parents (Reverse) or Chilren (Normal) Simplied Group List"){
                        new-htmlTable -DataTable $global:groupTracking -Filtering {
                        } -AutoSize
                    } -HeaderTextAlignment "Left" -HeaderTextSize "16" -HeaderTextColor "White" -HeaderBackGroundColor "Black"  -CanCollapse -BorderRadius 10px -Collapsed
                }
                New-HTMLFooter {
                    New-HTMLText -Text "Date of this report $(Get-Date)" -FontSize 16 -Color White -BackGroundColor Black -Alignment center
                }
            }-Online
        }
    }
}