/*
 * Internet control panel applet
 *
 * Copyright 2010-2011 Aurimas Fišeras <aurimas@gmail.com>
 *
 * 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"

/* UTF-8 */
#pragma code_page(65001)

LANGUAGE LANG_LITHUANIAN, SUBLANG_NEUTRAL

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

    GROUPBOX    " Pradžios tinklalapis ", IDC_STATIC, 4, 4, 312, 56
    LTEXT       "Galite pasirinkti adresą, kuris bus naudojamas kaip jūsų pradžios tinklalapis.",
                IDC_STATIC, 58, 14, 252, 10
    EDITTEXT    IDC_HOME_EDIT, 58, 26, 252, 12, WS_VISIBLE | ES_AUTOHSCROLL
    PUSHBUTTON  "&Dabartinis puslapis", IDC_HOME_CURRENT, 58, 40, 80, 14
    PUSHBUTTON  "&Numatytasis puslapis", IDC_HOME_DEFAULT, 144, 40, 80, 14
    PUSHBUTTON  "&Tuščias puslapis", IDC_HOME_BLANK, 230, 40, 80, 14
    GROUPBOX    " Naršymo istorija ", IDC_STATIC, 4, 60, 312, 46
    LTEXT       "Jūs galite pašalinti puslapius podėlyje, slapukus ir kitus duomenis.",
                IDC_STATIC, 58, 72, 252, 10
    PUSHBUTTON  "Šalinti &failus...", IDC_HISTORY_DELETE, 144, 86, 80, 14
    PUSHBUTTON  "Nuo&statos...", 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 "Šalinti naršymo istoriją"
BEGIN

    AUTOCHECKBOX   "Laikini interneto failai\nTinklalapių kopijos podėlyje, paveikslai, liudijimai.",
                    IDC_DELETE_TEMP_FILES, 10, 8, 230, 30, BS_TOP | BS_MULTILINE
    AUTOCHECKBOX   "Slapukai\nTinklalapių kompiuteryje išsaugoti failai, kuriuose saugomi naudotojų nustatymai ir prisijungimo informacija.",
                    IDC_DELETE_COOKIES, 10, 38, 230, 30, BS_TOP | BS_MULTILINE
    AUTOCHECKBOX   "Istorija\nTinklalapių, kuriuos naršėte, sąrašas.",
                    IDC_DELETE_HISTORY, 10, 68, 230, 30, BS_TOP | BS_MULTILINE
    AUTOCHECKBOX   "Formų duomenys\nNaudotojų vardai ir kita informacija, kurią įvedėte į formas.",
                    IDC_DELETE_FORM_DATA, 10, 98, 230, 30, BS_TOP | BS_MULTILINE
    AUTOCHECKBOX   "Slaptažodžiai\nIšsaugoti slaptažodžiai, kuriuos įvedėte į formas.",
                    IDC_DELETE_PASSWORDS, 10, 128, 230, 30, BS_TOP | BS_MULTILINE
    DEFPUSHBUTTON  "Atsisakyti", IDCANCEL, 185, 230, 60, 15, WS_GROUP
    PUSHBUTTON     "Šalinti", 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 "Saugumas"
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 "Turinys"
BEGIN

    GROUPBOX    " Liudijimai ", IDC_STATIC, 4, 4, 312, 50
    LTEXT       "Liudijimai yra naudojami jūsų tapatumo nustatymui ir liudijimo įstaigų bei publikuotojų tapatumui nustatyti.",
                IDC_STATIC, 58, 14, 252, 18
    PUSHBUTTON  "Liudijimai...", IDC_CERT, 146, 34, 80, 14
    PUSHBUTTON	"Publikuotojai...", IDC_CERT_PUBLISHER, 230, 34, 80, 14

END
