/*
 * Copyright (c) 2008, 2009, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Oracle designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Oracle in the LICENSE file that accompanied this code.
 *
 * This code 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 General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */


/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//

IDD_DOWNLOAD_DIALOG DIALOGEX 0, 0, 340, 120
STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | 
    WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Additional Components Needed"
EXSTYLE WS_EX_APPWINDOW
FONT 8, "MS Sans Serif"
BEGIN
    LTEXT           "", IDC_DOWNLOAD_MASTHEAD, 0, 0, 340, 39
    LTEXT           "", IDC_MASTHEAD_TEXT, 60, 14, 200, 12
    CONTROL         "", IDC_STATIC,"Static", SS_BLACKFRAME | SS_SUNKEN,
                    0, 39, 340, 1
    LTEXT           "", IDC_DOWNLOAD_TEXT, 12, 60, 316, 20
    LTEXT           "", IDC_TIME_REMAINING, 12, 90, 316, 10
    CONTROL         "Progress1",1006,"msctls_progress32",PBS_SMOOTH,
                    12, 100, 265, 14
    PUSHBUTTON	    "Cancel",  2, 285, 100, 46, 14
END

/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//

#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO DISCARDABLE 
BEGIN
    105, DIALOG
    BEGIN
        LEFTMARGIN, 7
        RIGHTMARGIN, 236
        TOPMARGIN, 7
        BOTTOMMARGIN, 63
    END
END
#endif    // APSTUDIO_INVOKED


/////////////////////////////////////////////////////////////////////////////
//
// String Table
//

STRINGTABLE DISCARDABLE 
BEGIN
    IDS_DOWNLOAD_CANCEL_MESSAGE   "Canceling the installation of additional components which the application needs may cause the application to exit.\n\nAre you sure you want to cancel the installation of additional components?"
    IDS_DOWNLOAD_CANCEL_CAPTION   "Cancel - Additional Components"
    IDS_DOWNLOAD_CANCEL_INSTRUCTION   ""
    IDS_HTTP_INSTRUCTION_REQUEST_TIMEOUT      "Connection Timed Out"
    IDS_HTTP_INSTRUCTION_SERVER_NOT_REACHABLE "Unable to connect to the Internet"
    IDS_HTTP_INSTRUCTION_UNKNOWN_ERROR        "Server error (Error %s)"
    IDS_HTTP_INSTRUCTION_SERVICE_UNAVAIL      "Service Unavailable (Error %s)"
    IDS_HTTP_INSTRUCTION_FORBIDDEN            "Access Denied or Forbidden (Error %s)"
    IDS_HTTP_STATUS_OTHER                     "An error has occured during this request. Do you want to try the request again?"

// HTTP status code
    IDS_HTTP_STATUS_REQUEST_TIMEOUT "The server used to download the requested components is not responding and the connection has timed out. Do you want to try to connect again?"
    IDS_HTTP_STATUS_FORBIDDEN		"You do not have permission to access the server to download the components requested by the application. Retry your access to the server?"
    IDS_HTTP_STATUS_SERVER_ERROR	"An error occured on the server and it could not complete the request. Do you want to try the request again?"
    IDS_HTTP_STATUS_SERVICE_UNAVAIL	"The requested service is temporarily unavailable. Do you want to try the request again?"


    IDS_DOWNLOAD_STATUS_RETRY		"Server is currently busy, retry in %ld seconds ..."
  
    IDS_ERROR_CAPTION               "Java Installer"
    IDS_HOURSMINUTESECOND	    "Estimated time remaining: %d hours %d minutes %.0f seconds"
    IDS_HOURMINUTESECOND	    "Estimated time remaining: %d hour %d minutes %.0f seconds"
    IDS_MINUTESECOND 		    "Estimated time remaining: %d minutes %.0f seconds"
    IDS_SECOND                      "Estimated time remaining: %.0f seconds"
    IDS_DISK_FULL_ERROR_CAPTION     "Disk Full %s"
    IDS_DISK_FULL_ERROR             "There is not enough space on the disk to download the requested components. Clear space on the disk and then Retry."
    IDS_DISK_WRITE_ERROR_CAPTION    "Can't write to the disk %s"
    IDS_DISK_WRITE_ERROR            "An error occurred during writing to the disk. Please check that the disk is not write protected."
    IDS_HTTP_STATUS_SERVER_NOT_REACHABLE "Java cannot connect to the Internet. Please check that the Internet Connection settings are correct (these can be found in the Windows Control Panel under Internet Options > Connection) and that your firewall allows java.exe to access the Internet."

    IDS_DOWNLOAD_RETRY             "Download error"
    IDS_DOWNLOAD_RETRY_TEXT        "An error occurred during the download of some requested components. Do you want to try the download of these components again?"

    IDS_DOWNLOAD                   "Installing Additional Components"
    IDS_DOWNLOAD_UNPACKING         "Unpacking bundle"
    IDS_DOWNLOAD_TEXT              "The Java application will start when additional components that it requires are downloaded and installed."
    
    IDS_FILE_UPDATE_ERROR          "An error occurred while updating %s%s."
    IDS_FILE_DELETE_ERROR          "An error occurred while removing %s."
    IDS_JAVA_HOME_ERROR            "Unable to determine Java home directory."
    IDS_KERNEL_HOME_ERROR          "Unable to determine path to jkernel.dll."
    IDS_JBROKER_ERROR              "Unable to launch jbroker.exe."
    IDS_FATAL_ERROR                "Java was unable to download required components.  The program will now exit."
    IDS_ERROR_DOWNLOADING_BUNDLE_PROPERTIES "Java was unable to communicate with the download server.  The program will now exit."
    IDS_ERROR_MALFORMED_BUNDLE_PROPERTIES "Java encountered an error communicating with the download server.  The program will now exit."
    IDS_ERROR_MALFORMED_URL "Java was unable to download from the URL '%s'.  The program will now exit."
END
