/*
 * English resources for the Internet control panel applet
 *
 * Copyright 2010 Detlef Riekenberg
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 *
 */

#include "inetcpl.h"

LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT

/* "General" propsheet */
IDD_GENERAL DIALOG  0, 0, 320, 220
STYLE WS_CAPTION | WS_CHILD | WS_DISABLED
FONT 8, "MS Shell Dlg"
CAPTION "General"
BEGIN

    GROUPBOX    " Home page ", IDC_STATIC, 4, 4, 312, 52
    LTEXT       "You can choose the address that will be used as your home page.",
                IDC_STATIC, 58, 10, 252, 10
    EDITTEXT    IDC_HOME_EDIT, 58, 22, 252, 12, WS_VISIBLE | ES_AUTOHSCROLL
    PUSHBUTTON  "&Current page", IDC_HOME_CURRENT, 58, 36, 80, 14
    PUSHBUTTON  "&Default page", IDC_HOME_DEFAULT, 144, 36, 80, 14
    PUSHBUTTON  "&Blank page", IDC_HOME_BLANK, 230, 36, 80, 14
    GROUPBOX    " Browsing history ", IDC_STATIC, 4, 60, 312, 46
    LTEXT       "You can delete cached pages, cookies and other data.",
                IDC_STATIC, 58, 72, 252, 10
    PUSHBUTTON  "Delete &files...", IDC_HISTORY_DELETE, 144, 86, 80, 14
    PUSHBUTTON  "&Settings...", IDC_HISTORY_SETTINGS, 230, 86, 80, 14

END

/* "Delete browsing history" dialog */
IDD_DELETE_HISTORY DIALOG  0, 0, 250, 250
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
FONT 8, "MS Shell Dlg"
CAPTION "Delete browsing history"
BEGIN

    AUTOCHECKBOX   "Temporary internet files\nCached copies of webpages, images and certificates.",
                    IDC_DELETE_TEMP_FILES, 10, 8, 230, 30, BS_TOP | BS_MULTILINE
    AUTOCHECKBOX   "Cookies\nFiles saved on your computer by websites, which store things like user preferences and login information.",
                    IDC_DELETE_COOKIES, 10, 38, 230, 30, BS_TOP | BS_MULTILINE
    AUTOCHECKBOX   "History\nList of websites you have accessed.",
                    IDC_DELETE_HISTORY, 10, 68, 230, 30, BS_TOP | BS_MULTILINE
    AUTOCHECKBOX   "Form data\nUsernames and other information you have entered into forms.",
                    IDC_DELETE_FORM_DATA, 10, 98, 230, 30, BS_TOP | BS_MULTILINE
    AUTOCHECKBOX   "Passwords\nSaved passwords you have entered into forms.",
                    IDC_DELETE_PASSWORDS, 10, 128, 230, 30, BS_TOP | BS_MULTILINE
    DEFPUSHBUTTON  "Cancel", IDCANCEL, 185, 230, 60, 15, WS_GROUP
    PUSHBUTTON     "Delete", IDOK, 120, 230, 60, 15, WS_GROUP

END

/* "Security" propsheet */
IDD_SECURITY DIALOG  0, 0, 320, 220
STYLE WS_CAPTION | WS_CHILD | WS_DISABLED
FONT 8, "MS Shell Dlg"
CAPTION "Security"
BEGIN

    CONTROL     "Listview", IDC_SEC_LISTVIEW, "SysListView32",
                LVS_ICON | LVS_ALIGNLEFT | LVS_AUTOARRANGE | LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_VSCROLL,
                4, 4, 312, 58
    LTEXT       "", IDC_SEC_ZONE_INFO, 4, 68, 312, 20
    GROUPBOX    "", IDC_SEC_GROUP, 4, 88, 312, 126
    CONTROL     "trackbar", IDC_SEC_TRACKBAR, "msctls_trackbar32",
                TBS_VERT | TBS_AUTOTICKS | TBS_BOTH | TBS_REVERSED, 8, 98, 32, 100
    LTEXT       "", IDC_SEC_LEVEL, 48, 102, 180, 12
    LTEXT       "", IDC_SEC_LEVEL_INFO, 48, 114, 260, 80
END

/* "Content" propsheet */
IDD_CONTENT DIALOG  0, 0, 320, 220
STYLE WS_CAPTION | WS_CHILD | WS_DISABLED
FONT 8, "MS Shell Dlg"
CAPTION "Content"
BEGIN

    GROUPBOX    " Certificates ", IDC_STATIC, 4, 4, 312, 50
    LTEXT       "Certificates are used for your personal identification and to identify certificate authorities and publishers.",
                IDC_STATIC, 58, 14, 252, 18
    PUSHBUTTON  "Certificates...", IDC_CERT, 146, 34, 80, 14
    PUSHBUTTON	"Publishers...", IDC_CERT_PUBLISHER, 230, 34, 80, 14

END
