function Add-ToolFolder([System.String] $folder)
{
    $flattenedValue = Get-ExtenderPropertyValue
    
    $allFolders = New-Object "System.Collections.Generic.List``1[System.String]"
    
    if($flattenedValue.Length -gt 0)
    {
        $allFolders.AddRange($flattenedValue.Split(';'))
    }
    
    if( -not $allFolders.Contains($folder) )
    {
        $allFolders.Add($folder)
        
        $flattenedValue = [System.String]::Join(';', $allFolders.ToArray())
        Set-ExtenderPropertyValue($flattenedValue)
    }
}

function Remove-ToolFolder([System.String] $folder)
{
    $flattenedValue = Get-ExtenderPropertyValue
    
    $allFolders = New-Object "System.Collections.Generic.List``1[System.String]"
    
    if($flattenedValue.Length -gt 0)
    {
        $allFolders.AddRange($flattenedValue.Split(';'))
    }
    
    if( $allFolders.Remove($folder) )
    {
        $flattenedValue = [System.String]::Join(';', $allFolders.ToArray())
        Set-ExtenderPropertyValue($flattenedValue)
    }
}


function Get-ExtenderPropertyValue
{
    if( $dte.Solution.Globals.VariableExists("EnterpriseLibraryConfigurationToolBinariesPath") -and $dte.Solution.Globals.VariablePersists("EnterpriseLibraryConfigurationToolBinariesPath") )
    {
        return $dte.Solution.Globals.VariableValue("EnterpriseLibraryConfigurationToolBinariesPath")
    }

    
    return ""
}

function Set-ExtenderPropertyValue([System.String] $value)
{
    if( [System.String]::IsNullOrWhiteSpace($value) )
    {
        if( $dte.Solution.Globals.VariableExists("EnterpriseLibraryConfigurationToolBinariesPath") )
        {
            $dte.Solution.Globals.VariablePersists("EnterpriseLibraryConfigurationToolBinariesPath") = $False
        }
    }
    else
    {
        $dte.Solution.Globals.VariableValue("EnterpriseLibraryConfigurationToolBinariesPath") = $value
        $dte.Solution.Globals.VariablePersists("EnterpriseLibraryConfigurationToolBinariesPath") = $True
    }
}

function Get-RelativePath([System.String] $basePath, [System.String] $targetPath)
{
    # not a general purpose relative path calculation algorithm
    
    return ($targetPath.Substring($basePath.Length)).TrimStart([System.Io.Path]::DirectorySeparatorChar)
}

function Cleanup
{
}