<!--
 * 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-dialog {{mainClass}} " style="width:{{width}}" role="document">
    <div class="modal-content">
        {{#if title}}
        <div class="modal-header">
            <a class="close">&times;</a>
            <h4 class="modal-title">
                    {{#if titleHtml}}
                        {{{tt title}}}
                      {{else}}
                        {{tt title}}
                      {{/if}}
                </h4>
        </div>
        {{/if}} {{#if contentWithFooter}} {{else}}
        <div class="modal-body">{{content}}</div>
        {{#if showFooter}}
        <div class="modal-footer">
            {{#if allowCancel}} {{#if cancelText}}
            <button type="button" class="btn btn-atlas cancel">{{tt cancelText}}</button>
            {{/if}} {{/if}}
            <button type="button" class="btn btn-atlas ok">{{tt okText}}</button>
        </div>
        {{/if}} {{/if}}
    </div>
</div>
