{{!
* 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.
}}


<div class="modal-backdrop"></div>
<div {{bindAttr class=":modal view.showFooter:with-footer:no-footer"}} id="modal" tabindex="-1" role="dialog" aria-labelledby="modal-label" aria-hidden="true">
  <div class="modal-header">
    {{#if view.showCloseButton}}
      <a class="close" {{action onClose target="view"}}>x</a>
    {{/if}}
    <h3 id="modal-label">
      {{#if view.headerClass}}
        {{view view.headerClass}}
      {{else}}
        {{view.header}}
      {{/if}}
    </h3>
  </div>
  <div {{bindAttr class=":modal-body view.isHideBodyScroll:hidden-scroll"}}>
    {{#if view.bodyClass}}
      {{view view.bodyClass}}
    {{else}}
      {{#if view.encodeBody}}
        {{view.body}}
      {{else}}
        {{{view.body}}}
      {{/if}}
    {{/if}}
  </div>
  {{#if view.showFooter}}
    {{#if view.footerClass}}
      {{view view.footerClass}}
    {{else}}
      <div class="modal-footer">
        {{#if view.third}}
          <button {{bindAttr disabled="view.disableThird" class=":btn view.thirdClass" id="view.thirdId"}} {{action onThird target="view"}}>{{view.third}}</button>
        {{/if}}
        {{#if view.secondary}}
          <button {{bindAttr disabled="view.disableSecondary" class=":btn view.secondaryClass" id="view.secondaryId"}} {{action onSecondary target="view"}}>{{view.secondary}}</button>
        {{/if}}
        {{#if view.primary}}
          <button {{bindAttr disabled="view.disablePrimary" class=":btn view.primaryClass" id="view.primaryId"}} {{action onPrimary target="view"}}>{{view.primary}}</button>
        {{/if}}
      </div>
    {{/if}}
  {{/if}}
</div>
