<!--

    Copyright (c) 1997, 2018 Oracle and/or its affiliates. All rights reserved.

    This program and the accompanying materials are made available under the
    terms of the Eclipse Public License v. 2.0, which is available at
    http://www.eclipse.org/legal/epl-2.0.

    This Source Code may also be made available under the following Secondary
    Licenses when the conditions for such availability set forth in the
    Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
    version 2 with the GNU Classpath Exception, which is available at
    https://www.gnu.org/software/classpath/license.html.

    SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0

-->

<!initPage
    setResourceBundle(key="i18n" bundle="org.glassfish.admingui.core.Strings");
    initProductInfoAttributes();
/>
<!-- WE MAY HAVE TO LOCALIZE THE PRODUCT IMAGE. CHECKING IN FOR NOW UNTIL LOGIN COMPONENT IS READY -->
<f:verbatim>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
    <title>$resource{i18n.loginPageTitle}</title>
</f:verbatim>
    <sun:themeLinks/>
    <sun:link url="/resource/css/css_ns6up.css" />
<f:verbatim>
    <style type="text/css">
        /* clickjacking defense */
        body { display : none; }
    </style>
</head>

<body id="body3" class="LogBdy" focus="loginform.j_username" style="background-color: #FFFFFF;">
    <div id="header"class="LogTopBnd" style="background: url('#{themeImages.LOGIN_GRADIENT_TOP}') repeat-x; height: 30px;"></div>
    <div class="middle" style="background-image: url(#{themeImages.LOGIN_GRADIENT_SIDES});background-repeat:repeat-x;background-position:left top; background-color: #D4DCE1;">
        <div class="plugincontent" style="width1: 1px; visibility: #{byPassLogin ? 'hidden' : 'visible'};">
</f:verbatim>
            <event>
                <!afterCreate
                    getClientId(component="$this{component}" clientId=>$attribute{loginId})
                    getUIComponent(clientId="#{loginId}"  component=>$attribute{component})
                    includeFirstIntegrationPoint(type="org.glassfish.admingui:loginform" root="#{component}");
                />
            </event>
<f:verbatim>
            <div id="error" class="AlrtTbl" style="width: 415px; position: fixed; top: 100px; margin: auto;">
                <div class="AlrtErrTxt">
                    <img src="#{request.contextPath}/theme/com/sun/webui/jsf/suntheme/images/alerts/error_large.gif" alt="Error" height="21" width="21" />
</f:verbatim>
                    <sun:label text="#{errorText}" text1="$resource{i18n.alert.AuthenticationFailed}">
                        <!beforeCreate
                            if (!#{errorText}) {
                                setAttribute(key="errorText" value="$resource{i18n.alert.AuthenticationFailed}");
                            }
                        />   
                    </sun:label>
<f:verbatim>
                </div>
                <div class="AlrtMsgTxt">
</f:verbatim>
                    <sun:label text="#{messageText}">
                        <!beforeCreate
                            if (!#{messageText}) {
                                setAttribute(key="messageText" value="$resource{i18n.alert.ReenterUsernamePassword}");
                            }
                        />   
                    </sun:label>
<f:verbatim>
                </div>
            </div>
            <script src="#{request.contextPath}/resource/js/cj.js"></script>
            <script type="text/javascript">
                var left = document.getElementById('body3').clientWidth;
                document.getElementById('error').style.left = (left/2-100) + 'px';
            </script>
        </div>
    </div>
    <div class="footer"
        style="background-image: url(#{themeImages.LOGIN_GRADIENT_BOTTOM});background-repeat:repeat-x;background-position:left top; color: #FFFFFF; background-color: #4A5C68">
        <div id="copyright" style="width: 720px; margin-left: auto; margin-right: auto; padding: 5px;">
            <span>$resource{i18n.copyright.shortMessage}</span>
        </div>
    </div>
</body>
</html>
</f:verbatim>
