function DefineExtensions(&$Context)
{
    $Extensions = array();
    $CurrExtensions = array();
    $CurrentExtensions = @file($Context->Configuration["APPLICATION_PATH"] . 'conf/extensions.php');
    if (!$CurrentExtensions) {
        $Context->WarningCollector->Add($Context->GetDefinition('ErrReadFileExtensions') . $Context->Configuration["APPLICATION_PATH"] . 'conf/extensions.php');
    } else {
        foreach ($CurrentExtensions as $ExLine) {
            if (substr($ExLine, 0, 7) == 'include') {
                $CurrExtensions[] = substr(trim($ExLine), 43, -15);
            }
        }
    }
    // Examine Extensions directory
    $FolderHandle = @opendir($Context->Configuration["EXTENSIONS_PATH"]);
    if (!$FolderHandle) {
        $Context->WarningCollector->Add(str_replace("//1", $Context->Configuration["EXTENSIONS_PATH"], $Context->GetDefinition('ErrOpenDirectoryExtensions')));
        return false;
    } else {
        // Loop through each Extension folder
        while (false !== ($Item = readdir($FolderHandle))) {
            $Extension = $Context->ObjectFactory->NewObject($Context, 'Extension');
            $RecordItem = true;
            // skip directories and hidden files
            if (strlen($Item) < 1 || !is_dir($Context->Configuration["EXTENSIONS_PATH"] . $Item) || !file_exists($Context->Configuration["EXTENSIONS_PATH"] . $Item . '/default.php')) {
                continue;
            }
            // Retrieve Extension properties
            $Lines = @file($Context->Configuration["EXTENSIONS_PATH"] . $Item . '/default.php');
            if (!$Lines) {
                $Context->WarningCollector->Add($Context->GetDefinition('ErrReadExtensionDefinition') . " {$Item}");
            } else {
                // We only examine the first 30 lines of the file
                $Header = array_slice($Lines, 0, 30);
                $Extension->FileName = $Item . "/default.php";
                foreach ($Header as $CurrentLine) {
                    @(list($key, $val) = @explode(': ', trim($CurrentLine), 2));
                    switch ($key) {
                        case 'Extension Name':
                            $Extension->Name = FormatStringForDisplay($val);
                            break;
                        case 'Extension Url':
                            $Extension->Url = FormatStringForDisplay($val);
                            break;
                        case 'Description':
                            $Extension->Description = FormatStringForDisplay($val);
                            break;
                        case 'Version':
                            $Extension->Version = FormatStringForDisplay($val);
                            break;
                        case 'Author':
                            $Extension->Author = FormatStringForDisplay($val);
                            break;
                        case 'Author Url':
                            $Extension->AuthorUrl = FormatStringForDisplay($val);
                            break;
                        default:
                            // nothing
                    }
                }
                if ($Extension->IsValid()) {
                    $Extension->Enabled = in_array($Item, $CurrExtensions);
                    $Extensions[FormatExtensionKey($Extension->Name)] = $Extension;
                }
            }
        }
        ksort($Extensions);
        return $Extensions;
    }
}
function DefineExtensions(&$Context, $update = false)
{
    $Extensions = array();
    $CurrExtensions = array();
    $CurrentExtensions = @file($Context->Configuration["APPLICATION_PATH"] . 'conf/extensions.php');
    if (!$CurrentExtensions) {
        $Context->WarningCollector->Add($Context->GetDefinition('ErrReadFileExtensions') . $Context->Configuration["APPLICATION_PATH"] . 'conf/extensions.php');
    } else {
        foreach ($CurrentExtensions as $ExLine) {
            if (substr($ExLine, 0, 7) == 'include') {
                $CurrExtensions[] = substr(trim($ExLine), 43, -15);
            }
        }
    }
    // Examine Extensions directory
    $FolderHandle = @opendir($Context->Configuration["EXTENSIONS_PATH"]);
    if (!$FolderHandle) {
        $Context->WarningCollector->Add(str_replace("//1", $Context->Configuration["EXTENSIONS_PATH"], $Context->GetDefinition('ErrOpenDirectoryExtensions')));
        return false;
    } else {
        // Loop through each Extension folder
        while (false !== ($Item = readdir($FolderHandle))) {
            $Extension = $Context->ObjectFactory->NewObject($Context, 'Extension');
            $RecordItem = true;
            // Skip directories and hidden files
            if (strlen($Item) < 1 || !is_dir($Context->Configuration["EXTENSIONS_PATH"] . $Item) || !file_exists($Context->Configuration["EXTENSIONS_PATH"] . $Item . '/default.php')) {
                continue;
            }
            // Retrieve Extension properties
            $Lines = @file($Context->Configuration["EXTENSIONS_PATH"] . $Item . '/default.php');
            if (!$Lines) {
                $Context->WarningCollector->Add($Context->GetDefinition('ErrReadExtensionDefinition') . " {$Item}");
            } else {
                // We only examine the first 30 lines of the file
                $Header = array_slice($Lines, 0, 30);
                $Extension->FileName = $Item . "/default.php";
                foreach ($Header as $CurrentLine) {
                    @(list($key, $val) = @explode(': ', trim($CurrentLine), 2));
                    switch ($key) {
                        case 'Extension Name':
                            $Extension->Name = FormatStringForDisplay($val);
                            break;
                        case 'Extension Url':
                            $Extension->Url = FormatStringForDisplay($val);
                            break;
                        case 'Description':
                            $Extension->Description = FormatStringForDisplay($val);
                            break;
                        case 'Version':
                            $Extension->Version = FormatStringForDisplay($val);
                            break;
                        case 'Author':
                            $Extension->Author = FormatStringForDisplay($val);
                            break;
                        case 'Author Url':
                            $Extension->AuthorUrl = FormatStringForDisplay($val);
                            break;
                        default:
                            // Nothing
                    }
                }
                if ($Extension->IsValid()) {
                    $isOfficial = false;
                    // Loop through the list of official extensions so we know to exclude them from update checking
                    $OfficialExtensionsArray = explode(';', $Context->Configuration['OFFICIAL_EXTENSIONS']);
                    foreach ($OfficialExtensionsArray as $OfficialExtension) {
                        if ($Extension->Name == $OfficialExtension) {
                            $isOfficial = true;
                        }
                    }
                    // If the user is on the "Updates & Reminders" page
                    if ($update == true) {
                        // If this isn't an official extension, add it to the list of extensions to be checked for updates
                        if ($isOfficial == false) {
                            $Extension->Enabled = in_array($Item, $CurrExtensions);
                            $Extensions[FormatExtensionKey($Extension->Name)] = $Extension;
                        }
                        // If the user is on the Extensions page
                    } else {
                        $Extension->Enabled = in_array($Item, $CurrExtensions);
                        $Extensions[FormatExtensionKey($Extension->Name)] = $Extension;
                        if ($isOfficial == true) {
                            $Extension->Official = 1;
                        }
                    }
                }
            }
        }
        uksort($Extensions, "strnatcasecmp");
        return $Extensions;
    }
}