<!--
  ~ Licensed to the Apache Software Foundation (ASF) under one
  ~ or more contributor license agreements.  See the NOTICE file
  ~ distributed with this work for additional information
  ~ regarding copyright ownership.  The ASF licenses this file
  ~ to you under the Apache License, Version 2.0 (the
  ~ "License"); you may not use this file except in compliance
  ~ with the License.  You may obtain a copy of the License at
  ~
  ~    http://www.apache.org/licenses/LICENSE-2.0
  ~
  ~ Unless required by applicable law or agreed to in writing,
  ~ software distributed under the License is distributed on an
  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  ~ KIND, either express or implied.  See the License for the
  ~ specific language governing permissions and limitations
  ~ under the License.
  -->

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:composite="http://java.sun.com/jsf/composite"
      xmlns:hx="http://myfaces.apache.org/html5/html"
      xmlns:fx="http://myfaces.apache.org/html5/core">

<composite:interface>
    <composite:facet name="content" required="false"/>
    <composite:attribute name="facetName" required="true" />
    <composite:attribute name="iconName" required="true" />
    <composite:attribute name="supportedMessage" required="false" default="This feature is supported by this browser." />
    <composite:attribute name="unsupportedMessage" required="false" default="This feature is not supported by this browser." />
    <composite:attribute name="style" required="false" />
    <composite:attribute name="support" required="true" type="java.lang.Boolean" />
</composite:interface>


<composite:implementation>
    <h:outputStylesheet target="head" library="style" name="browserSupport.css" id="browserSupportStyle" />

    <hx:div styleClass="browserSupportInfo" style="#{cc.attrs.style}">
        <fx:effects additionalStyleClassToActivate="expandedBrowserSupportInfo"
                    event="mouseover" deactivationEvents="mouseout" duration="1s"/>

        <h:graphicImage library="image/browser" name="#{cc.attrs.iconName}" alt="#{cc.attrs.iconName}" 
                        styleClass="#{(cc.attrs.support) ? ( (not empty cc.facets[cc.attrs.facetName]) ? 'emphasizedBrowserIcon supportedBrowserIcon' : 'supportedBrowserIcon') : ( (not empty cc.facets[cc.attrs.facetName]) ? 'emphasizedBrowserIcon' : 'unSupportedBrowserIcon')}" />
        <br/>
        <hx:div styleClass="browserInfoContent">
            <h:panelGroup rendered="#{not empty cc.facets[cc.attrs.facetName]}">
                <composite:renderFacet name="#{cc.attrs.facetName}" />
            </h:panelGroup>
            <h:outputText value="#{cc.attrs.supportedMessage}" rendered="#{empty cc.facets[cc.attrs.facetName] and cc.attrs.support}" />
            <h:outputText value="#{cc.attrs.unsupportedMessage}" rendered="#{empty cc.facets[cc.attrs.facetName] and not cc.attrs.support}" />

            <fx:effects delay="0.9s"/>
        </hx:div>
    </hx:div>

</composite:implementation>
</html>
