<!--

    Copyright (c) 2010, 2020 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

-->

<ui:event type="initPage">
    setResourceBundle(key="i18n" bundle="org.glassfish.admingui.core.Strings");
    getPluginIdFromViewId(viewId="#{facesContext.viewRoot.viewId}", pluginId="#{pluginId}");
</ui:event>

<sun:page>
    <sun:html lang="#{view.locale.getLanguage()}">
        <ui:event type="beforeCreate">
            setPartialRequest("false");
            initSessionAttributes();
            if ("!#{sessionScope.fieldLengths}") {
                // Reads a properties file located at:
                //   v3/admingui/common/src/main/resources/org/glassfish/common/FieldLengths.properties
                setResourceBundle(key="tmpLengths" bundle="org.glassfish.common.FieldLengths");

                // Passes the ResourceBundle (#{tmpLengths}) into Java code... the ResourceBundle will
                // need to be converted into a Map<String, String> (or maybe Map<String, Integer>?)
                // and will be stored in #{sessionScope.fieldLengths}
                getFieldLengths(bundle="#{tmpLengths}" result="#{sessionScope.fieldLengths}");
            }
            // Set expand / collapse preferences...
            getPreference(default="#{false}", root="glassfish/layout", key="hideLeft", value="#{sessionScope.hideLeft}");
            getPreference(default="#{false}", root="glassfish/layout", key="hideRight", value="#{sessionScope.hideRight}");
        </ui:event>
        <sun:head id="head" title="#{guiTitle}" javaScript="true" debug="false" parseOnLoad="false">
            <h:outputScript name="jsf.js" library="jakarta.faces" target="head" />
        <f:verbatim>
            <link rel="stylesheet" type="text/css" href="#{request.contextPath}/resources/yui/reset-fonts-grids.css"/>
            <link rel="stylesheet" type="text/css" href="#{request.contextPath}/resources/yui/assets/skins/sam/resize.css"/>
            <link rel="stylesheet" type="text/css" href="#{request.contextPath}/resources/yui/assets/skins/sam/layout.css"/>
            <link rel="stylesheet" type="text/css" href="#{request.contextPath}/resource/common/css/style.css"/>
            <script src="#{request.contextPath}/resources/yui/yahoo-dom-event.js"></script>
            <script src="#{request.contextPath}/resources/yui/dragdrop-min.js"></script>
            <script src="#{request.contextPath}/resources/yui/element-min.js"></script>
            <script src="#{request.contextPath}/resources/yui/connection-min.js"></script>
            <script src="#{request.contextPath}/resources/yui/resize-min.js"></script>
            <script src="#{request.contextPath}/resources/yui/layout-min.js"></script>
        </f:verbatim>

            <sun:script url="/resource/common/js/adminjsf.js" />
            
            <!-- comment out for now since the file style.css doesn't exist.
             <link rel="stylesheet" type="text/css" href="#{request.contextPath}/style.css" />
            -->
            <!insert name="guiTemplateExtraHead" />
            <!insert name="guiExtraHead" />

            <f:verbatim>
            <style type="text/css">
                .yui-skin-sam .yui-layout .yui-layout-unit-center div.yui-layout-bd {background-color: #FFF;}
                .yui-layout-unit-top .yui-layout-bd { background-color: #5b87a4; }
                .yui-skin-sam .yui-layout .yui-layout-unit-top div.yui-layout-bd { background-color: #5b87a4; }
                .yui-layout-hd h2 {background-position:center; background-image:url(#{request.contextPath}/theme/com/sun/webui/jsf/suntheme/images/masthead/masthead-background.jpg);}
                .yui-skin-sam .yui-layout { background-color: #ffffff;}
                .yui-skin-sam .yui-layout .yui-layout-clip { background-color:#FFFFFF;}

                .tagDiv {padding: 10px;}
                .tagDiv .tagList {padding: 10px;}
                .tagDiv .tagList li {padding: 3px;}
                .tagDiv .tagList a.tagLink:visited, .tagDiv .tagList a.tagLink:link, .tagDiv .tagList a.removeTag:visited, .tagDiv .tagList a.removeTag:link {color: #000099}
                .tagDiv .tagList a.tagLink:hover {color: #0000CC}
                .tagDiv .tagList a.removeTag {margin-left: 6px;padding: 1px 2px 1px 2px; text-decoration:none; background:#EEEEEE;border:1px solid #AAA;}
                .tagDiv .tagList a.removeTag:hover {color:red; font-weight:bold; text-decoration:none;}
                #yui-gen1 .yui-layout-hd { display: none; }
                /* regReminder CSS */
                .bulletList {font-weight: bold; font-size: 1.2em; font-style: italic; color: #FFFFFF;}
                .bulletList a {font-weight: normal;}
                .bulletList a:link, .bulletList a:visited {color: #b9d2e9;}
                .bulletList ul {padding-left: 0px; padding-bottom: 15px; margin-left: 90px;}
                .bulletList li {font-style: normal; font-size: .9em; letter-spacing: -1px; list-style: url('#{request.contextPath}/resource/images/regReminderBullets.png'); padding-bottom: 8px;}
                .please {color: #FFFFFF; font-size: 1.6em; font-weight: bold; padding-bottom: 10px;}
                .why {color: #b9d2e9; font-size: 1.3em; font-weight: bold; font-style: italic; padding-bottom: 8px;}
                .why a:link, .why a:visited {color: #b9d2e9;}

                .skip {
                     position: absolute;
                     left: -999em;
                     width: 990em;
                }
                #execResp {
                    visibility:hidden;
                    display:none;
                }
                
                /* clickjacking defense */
                body { display : none; }
            </style>
            </f:verbatim>
        </sun:head>

        <sun:body style="height:100%;" styleClass="yui-skin-sam" 
                  onLoad="admingui.ajax.processElement(window, document.getElementById('Masthead:statusPanel'), false);admingui.ajax.processElement(window, document.getElementById('leftNav'), false);admingui.ajax.processElement(window, document.getElementById('content'), false);document.getElementById('blank').style.display='none';#{guiOnLoad};#{guiTemplateOnLoad};">
"<div id="blank" style="position:fixed; top:0px; left:0px; height:100%; width:100%; background-color: #FFF; z-index:99999;">&nbsp;</div>
<f:verbatim>
    <div id="ajaxIndicator" style="visibility: hidden"></div>
    <div id="ajaxPanel" style="visibility: hidden" role="dialog" aria-describedby="ajaxPanelBody">
        <div class="modalBackground">
        </div>
        <div class="modalContainer">
            <div class="modal">
                <div class="modalTop"><a href="#" onclick="admingui.ajax.ajaxComplete(); return false" id="ajaxPanelClose">[X]</a></div>
                <div class="modalBody" id="ajaxPanelBody">
                    <p>$resource{i18n.msg.longRunningProcess}</p>
                </div>
            </div>
        </div>
    </div>
</f:verbatim>
"            <div class="yui-skin-sam"><div id="gfLayoutTop"><div class="header_main">
//                "<a class="skip" href="#navigation" alt="Skip to Navigation Menu" title="Skip to Navigation Menu">Skip to Navigation Menu</a>
                        <sun:form id="af" prependId="false">
                            <event id="restartCheck">
                                <ui:event type="beforeEncode">
                                    if ("!$session{supportCluster}") {
                                        gf.restRequest(endpoint="#{sessionScope.REST_URL}/_get-restart-required", method="get", result="#{requestScope.result}");
                                        setSessionAttribute(key="restartRequired", value="#{requestScope.result.data.extraProperties.entity.restartRequired}");
                                        setSessionAttribute(key="unprocessedChanges", value="#{requestScope.result.data.extraProperties.entity.unprocessedChanges}");
                                    }
                                    if("$session{supportCluster}") {
                                        setSessionAttribute(key="restartRequired" value="$boolean{false}");
                                    }
                                </ui:event>
                                <!-- Masthead Integration Point -->
                                <ui:event type="afterCreate">
                                    includeFirstIntegrationPoint(type="org.glassfish.admingui:masthead" root="$this{component}");
                                    includeFirstIntegrationPoint(type="org.glassfish.admingui:favicon" root="#{view}");
                                </ui:event>
                            </event>
                            <h:commandButton id="execButton" text="na" style="display:none;">
                                <ui:event type="command">
                                    <!-- Ok to use #{param} here -->
                                    gf.invokeHandler(handler="#{param.h}" args="#{param.a}" depth="#{param.d}" values="#{requestScope.execResp}");
                                </ui:event>
                            </h:commandButton>
                            <h:inputText id="execResp" value="#{requestScope.execResp}" />
                        </sun:form>
"                    </div></div>

"                <div id="gfLayoutLeft">
"               <a name="navigation"></a><a class="skip" href="#contentArea" alt="$resource{i18n.skipto.content}" title="$resource{i18n.skipto.content}">$resource{i18n.skipto.content}</a>
"                       <div id="leftNav">
                            <!insert name="guiLeftNav" />
"                       </div>
"               </div>

"                <div id="gfLayoutCenter" style="height:100%;">
                    <!-- Content -->
                    "<a name="contentArea"></a>
                    <sun:markup tag="div" id="content" style="height:100%;">
                        <!insert name="guiTemplateContent">
                            <!insert name="content">
"                                <h1>Please wait.... loading.</h1>
                            </insert>
                        </insert>
                    </sun:markup>
"                </div>

/*
                <!--

                  I am commenting out the tags panel for now... this functionality should go back into the UI at some point...
                //<ui:include src="/templates/tagsPanel.jsf" />
                -->

"                <div rendered="#{pageSession.rightContent[0] != null}" id="gfLayoutRight" position="right" width="250" gutter="5px" resize="true" header="#{pageSession.rightContent[0].content}" collapse="true">
                    <event>
                        <ui:event type="afterCreate">
                            // FIXME: Consider using a widget which allows multiple content types to share the right panel (i.e. accordian)
                            includeFirstIntegrationPoint(type="org.glassfish.admingui:rightPanel" root="$this{component}");
                            getIntegrationPoints(type="org.glassfish.admingui:rightPanelTitle" points="#{pageSession.rightContent}");
                        </ui:event>
                    </event>
"                </div>
*/
"            </div>

            <!--
                Add Tag Panel
                    <sc:panel id="addTagPanel" visible="false" modal="true" closable="true" fixedCenter="true">
                        <h3>Tag the Current Page</h3>
                        <sun:form id="tagForm">
                            <div style="padding: 10px;">Tag: <h:inputText id="tag" value="#{requestScope.tag}"/></div>
                            <h:inputHidden id="url" value="#{requestScope.url}"/>
                            <h:commandButton id="addTagButton" value="Add Tag" onclick="submitTagForm(this); return false;">
                                <ui:event type="command">
                        setAttribute(key="tagName" value="FIXME: Get Page Name");
                                    //saveTagInformation(tag="$attribute{tag}", name="$attribute{tagName}", url="#{requestScope.url}");
                                    setAttribute(key="tag" value="");
                                    setAttribute(key="tagName" value="");
                                </ui:event>
                            </h:commandButton>
                        </sun:form>
                    </sc:panel>
            -->

            <!--
            Search Tags Panel
                <sc:panel id="searchTagsPanel" visible="false" modal="true" closable="true" fixedCenter="true" width="300px">
                    <h3>Search Tags</h3>
                        <div style="width:40px; float: left">Tag:</div>
                        <sun:form id="tagSearch">
                            <h:inputText id="tag" value="#{requestScope.tag}"/>
                            <h:commandButton id="searchTagButton" value="Search" onclick="submitTagSearchForm(this); return false;">
                                <ui:event type="command">
                                    //searchTags(tag="$attribute{tag}", hits=>$attribute{tagSearchHits});
                                    setAttribute(key="tag" value="");
                                </ui:event>
                            </h:commandButton>
                        </sun:form>
                        <div style="height: 200px; overflow: auto;">
                            <h:dataTable id="hits" value="#{requestScope.tagSearchHits}" var="hit">
                                <h:column><a href="#{hit.url}">#{hit.name}</a></h:column>
                            </h:dataTable>
                        </div>
                </sc:panel>
            -->
        </sun:body>
    </sun:html>

    <!-- FIXME: this should be in adminjsf.js -->
"    <script type="text/javascript">
/*
        function submitTagForm(el) {
            YAHOO.util.Dom.get('tagForm:url').value = window.location;
            DynaFaces.fireAjaxTransaction(el,
            {
                execute: 'tagForm:tag,tagForm:name,tagForm:url,'+el.id,
                inputs: 'tagForm:tag,tagForm:name,tagForm:url,'+el.id,
                render: 'tagForm:tag,tagForm:name,tagForm:url,'+el.id,
                postReplace: function() {
                    YAHOO.util.Dom.get('tagForm:tag').value = '';
                    YAHOO.util.Dom.get('tagForm:name').value = '';
                    hidePanel('addTagPanel');
                }
            } );
        }
        function submitTagSearchForm(el) {
            DynaFaces.fireAjaxTransaction(el,
            {
                execute: 'hits,tagSearch:tag,'+el.id,
                inputs: 'hits,tagSearch:tag,'+el.id,
                render: 'hits',
                postReplace: function(zone, html) {
                    YAHOO.util.Dom.get('tagSearch:tag').value = '';
                }
            } );
        }

        <!--
        FIXME: I think this would be better implemented using Y!'s KeyListener:
        http://developer.yahoo.com/yui/examples/container/keylistener.html
        function showSearchPanel(e) {
            var result = true;
            if ((e.charCode == 102) &amp;&amp; (e.ctrlKey == true)) {
                showPanel('searchTagsPanel');
                if (e.preventDefault) {
                    e.preventDefault();
                }
                result = false;
            }
            return result;
        }
        YAHOO.util.Event.addListener(document, "keypress", showSearchPanel);
        -->
*/

<f:verbatim>
        admingui.help.pluginId = '#{pluginId}';

        var layout = new YAHOO.widget.Layout({
           units: [
               { position : 'top', body : 'gfLayoutTop', height : 115, scroll : false, gutter1 : '5px', resize : false, collapse : false},
               { position : 'left', body : 'gfLayoutLeft', width : 250, scroll : true, gutter1 : '5px', resize : true, header : '$resource{i18n.peTree}', collapse : true},
               { position : 'center', body : 'gfLayoutCenter', gutter1 : '5px', scroll : true}
           ]
        });
        layout.render();

        // Collapse panels if necessary
        YAHOO.util.Event.onDOMReady(function (ev) {
            var lu = layout.getUnitByPosition('left');
            if (lu) {
                lu.on('collapse', function(ev) {
                    admingui.util.setPreference("layout", "hideLeft", "true");
                });
                lu.on('expand', function(ev) {
                    admingui.util.setPreference("layout", "hideLeft", "false");
                });
                if (#{sessionScope.hideLeft}) {
                    lu.collapse();
                }
            }

            // Deal w/ the right frame
            lu = layout.getUnitByPosition('right');
            if (lu) {
                lu.on('collapse', function(ev) {
                    admingui.util.setPreference("layout", "hideRight", "true");
                });
                lu.on('expand', function(ev) {
                    admingui.util.setPreference("layout", "hideRight", "false");
                });
                if (#{sessionScope.hideRight}) {
                    lu.collapse();
                }
            }
        });
    </script>
    <script src="#{request.contextPath}/resource/js/cj.js"></script>
</f:verbatim>
</sun:page>
