/*
 * Copyright 2010 Nenad Vujic
 *                Paul Vriens
 * Copyright 2010 Đorđe Vasiljević
 *
 * 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 "comctl32.h"

#pragma code_page(65001)

LANGUAGE LANG_SERBIAN, SUBLANG_SERBIAN_LATIN

IDD_PROPSHEET DIALOG 0, 0, 220, 140
STYLE DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
CAPTION "Svojstva za %s"
FONT 8, "MS Shell Dlg"
BEGIN
  DEFPUSHBUTTON "U redu",     IDOK,4,122,50,14, WS_TABSTOP | WS_GROUP
  PUSHBUTTON    "Otkaži", IDCANCEL,58,122,50,14
  PUSHBUTTON    "&Primeni", IDC_APPLY_BUTTON,112,122,50,14,WS_DISABLED
  PUSHBUTTON    "Pomoć",   IDHELP,166,122,50,14,WS_TABSTOP|WS_GROUP
  CONTROL       "Jezičak",    IDC_TABCONTROL,"SysTabControl32",WS_CLIPSIBLINGS|WS_GROUP|WS_TABSTOP|TCS_MULTILINE,4,4,212,114
END


IDD_WIZARD DIALOG 0, 0, 290, 159
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
CAPTION "Vodič"
FONT 8, "MS Shell Dlg"
BEGIN
  PUSHBUTTON    "< &Nazad", IDC_BACK_BUTTON,71,138,50,14
  DEFPUSHBUTTON "&Napred >", IDC_NEXT_BUTTON,121,138,50,14
  DEFPUSHBUTTON "Kraj",  IDC_FINISH_BUTTON,121,138,50,14
  PUSHBUTTON    "Otkaži",  IDCANCEL,178,138,50,14
  PUSHBUTTON    "Pomoć",    IDHELP,235,138,50,14,WS_GROUP
  LTEXT         "",        IDC_SUNKEN_LINE,7,129,278,1,SS_SUNKEN
  CONTROL       "Jezičak",     IDC_TABCONTROL,"SysTabControl32",WS_CLIPSIBLINGS | WS_DISABLED,7,7,258,5
  LTEXT	        "",        IDC_SUNKEN_LINEHEADER,0,35,290,1,SS_LEFT | SS_SUNKEN | WS_CHILD | WS_VISIBLE
END


IDD_TBCUSTOMIZE DIALOG 10, 20, 357, 125
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Prilagodi alatnicu"
FONT 8, "MS Shell Dlg"
BEGIN
  DEFPUSHBUTTON "&Zatvori",     IDCANCEL,308,6,44,14
  PUSHBUTTON    "&Poništi",     IDC_RESET_BTN,308,23,44,14
  PUSHBUTTON    "&Pomoć",      IDC_HELP_BTN,308,40,44,14
  PUSHBUTTON    "Pomeri na&gore",   IDC_MOVEUP_BTN,308,74,44,14
  PUSHBUTTON    "Pomeri na&dole", IDC_MOVEDN_BTN,308,91,44,14
  LTEXT         "&Dostupni dugmići:", -1,4,5,84,10
  LISTBOX       IDC_AVAILBTN_LBOX,4,17,120,100, LBS_NOTIFY | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP
  PUSHBUTTON    "&Dodaj ->",    IDOK, 131, 42, 44, 14
  PUSHBUTTON    "<- &Ukloni", IDC_REMOVE_BTN,131,62,44,14
  LTEXT         "&Dugmići na alatnici:", -1,182,5,78,10
  LISTBOX       IDC_TOOLBARBTN_LBOX, 182,17,120,100,LBS_NOTIFY | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP
END

STRINGTABLE
{
    IDS_CLOSE    "Zatvori"
}

STRINGTABLE
{
    IDM_TODAY    "Danas:"
    IDM_GOTODAY  "Pređi na današnji dan"
}

STRINGTABLE
{
    IDS_SEPARATOR "Razdvajač"
}

STRINGTABLE
{
    HKY_NONE "Ništa"
}

LANGUAGE LANG_SERBIAN, SUBLANG_SERBIAN_CYRILLIC

IDD_PROPSHEET DIALOG 0, 0, 220, 140
STYLE DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
CAPTION "Својства за %s"
FONT 8, "MS Shell Dlg"
BEGIN
  DEFPUSHBUTTON "У реду",     IDOK,4,122,50,14, WS_TABSTOP | WS_GROUP
  PUSHBUTTON    "Откажи", IDCANCEL,58,122,50,14
  PUSHBUTTON    "&Примени", IDC_APPLY_BUTTON,112,122,50,14,WS_DISABLED
  PUSHBUTTON    "Помоћ",   IDHELP,166,122,50,14,WS_TABSTOP|WS_GROUP
  CONTROL       "Језичак",    IDC_TABCONTROL,"SysTabControl32",WS_CLIPSIBLINGS|WS_GROUP|WS_TABSTOP|TCS_MULTILINE,4,4,212,114
END


IDD_WIZARD DIALOG 0, 0, 290, 159
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
CAPTION "Водич"
FONT 8, "MS Shell Dlg"
BEGIN
  PUSHBUTTON    "< &Назад", IDC_BACK_BUTTON,71,138,50,14
  DEFPUSHBUTTON "&Напред >", IDC_NEXT_BUTTON,121,138,50,14
  DEFPUSHBUTTON "Крај",  IDC_FINISH_BUTTON,121,138,50,14
  PUSHBUTTON    "Откажи",  IDCANCEL,178,138,50,14
  PUSHBUTTON    "Помоћ",    IDHELP,235,138,50,14,WS_GROUP
  LTEXT         "",        IDC_SUNKEN_LINE,7,129,278,1,SS_SUNKEN
  CONTROL       "Језичак",     IDC_TABCONTROL,"SysTabControl32",WS_CLIPSIBLINGS | WS_DISABLED,7,7,258,5
  LTEXT	        "",        IDC_SUNKEN_LINEHEADER,0,35,290,1,SS_LEFT | SS_SUNKEN | WS_CHILD | WS_VISIBLE
END


IDD_TBCUSTOMIZE DIALOG 10, 20, 357, 125
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Прилагоди алатницу"
FONT 8, "MS Shell Dlg"
BEGIN
  DEFPUSHBUTTON "&Затвори",     IDCANCEL,308,6,44,14
  PUSHBUTTON    "&Поништи",     IDC_RESET_BTN,308,23,44,14
  PUSHBUTTON    "&Помоћ",      IDC_HELP_BTN,308,40,44,14
  PUSHBUTTON    "Помери на&горе",   IDC_MOVEUP_BTN,308,74,44,14
  PUSHBUTTON    "Помери на&доле", IDC_MOVEDN_BTN,308,91,44,14
  LTEXT         "&Доступни дугмићи:", -1,4,5,84,10
  LISTBOX       IDC_AVAILBTN_LBOX,4,17,120,100, LBS_NOTIFY | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP
  PUSHBUTTON    "&Додај ->",    IDOK, 131, 42, 44, 14
  PUSHBUTTON    "<- &Уклони", IDC_REMOVE_BTN,131,62,44,14
  LTEXT         "&Дугмићи на алатници:", -1,182,5,78,10
  LISTBOX       IDC_TOOLBARBTN_LBOX, 182,17,120,100,LBS_NOTIFY | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP
END

STRINGTABLE
{
    IDS_CLOSE    "Затвори"
}

STRINGTABLE
{
    IDM_TODAY    "Данас:"
    IDM_GOTODAY  "Пређи на данашњи дан"
}

STRINGTABLE
{
    IDS_SEPARATOR "Раздвајач"
}

STRINGTABLE
{
    HKY_NONE "Ништа"
}
