<!--
 * 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="position-relative">
    <div class="tableOverlay"></div>
    <!-- Not for table Loader its only for initial loading -->
    <div class="fontLoader" style="z-index:999">
        <i class="fa fa-refresh fa-spin-custom"></i>
    </div>
    <div class="ellipsis-with-margin" style="display: none;"><span class="searchResult" style=" font-size: 16px;"></span></div>
    <div class="searchTable">
        <div class="no-data" style="display: none;">
            <div class="position-relative thick-border">
                <div style="padding-top: 20px; " class="table-responsive tableBorder">
                    <table class="table table-hover backgrid table-quickMenu">
                        <tbody>
                            <tr class="empty">
                                <td colspan="16"><span>No Records found!</span></td>
                            </tr>
                        </tbody>
                    </table>
                </div>
            </div>
        </div>
        <div class="pagination-box clearfix row" style="display: none;{{#unless isSearchTab}}margin-top: 0px;{{/unless}}">
            <div class="form-group filter-box col-md-12" {{#if isSearchTab}} style="position: absolute;right: 0;top: -44px; padding: 0;width:auto" {{/if}}>
                <div class="pull-right inline-content-fr no-padding-left">
                    <div class="inline" data-id="colManager"></div>
                    {{#if isSearchTab}}
                    {{#if entityCreate}}
                    <div class="inline"><button class="btn btn-action btn-sm" data-id="createEntity"><i class="fa fa-plus"></i>&nbsp;Create Entity</button></div>
                    {{/if}}
                    {{#if isSearchTab}}
                    <button type="button" data-id="downloadSearchResult" class="btn btn-action btn-sm" title="Download Search Results">
                        <i class="fa fa-download" aria-hidden="true"></i>&nbsp;&nbsp;Download
                    </button>
                    {{/if}}
                    <div class="inline"><button title="Save as custom filter" class="btn btn-action btn-sm" data-id="saveFilter"><i class="fa fa-save"></i>&nbsp;Save Filter</button></div>
                    {{/if}}
                    <div class="inline">
                        <a href="javascript:void(0)" class="multiSelectTag assignTag btn btn-action btn-sm" style="display:none" title="Assign Classification" data-id="addAssignTag"><i class="fa fa-plus"></i>&nbsp;Classification</a>
                    </div>
                    {{#unless isGlossaryView}}
                    <div class="inline">
                        <a href="javascript:void(0)" class="multiSelectTerm assignTerm btn btn-action btn-sm" style="display:none" title="Assign Term" data-id="addAssignTerm"><i class="fa fa-plus"></i>&nbsp;Term</a>
                    </div>
                    {{/unless}}
                    <div class="action-box pull-right inline-content-fr">
                        <div class="inline" data-id="containerCheckBox" style="display: none;">
                            <label class="checkbox-inline btn" for="historicalentities">
                                <input type="checkbox" data-id="checkDeletedEntity" data-value="includeDE" id="historicalentities" />
                                <b>Show historical entities</b></label>
                        </div>
                        <div class="inline exclude-subclassifications" data-id="containerCheckBox" style="display: none;">
                            <label class="checkbox-inline btn" for="subclassifications">
                                <input type="checkbox" data-id="checkSubClassification" data-value="excludeSC" id="subclassifications" />
                                <b>Exclude sub-classifications</b></label>
                        </div>
                        <div class="inline exclude-subtypes" data-id="containerCheckBox" style="display: none;">
                            <label class="checkbox-inline btn" for="subtypes">
                                <input type="checkbox" data-id="checkSubType" data-value="excludeST" id="subtypes" />
                                <b>Exclude sub-types</b></label>
                        </div>
                    </div>
                </div>
            </div>
            <div id="r_searchResultTableLayoutView" class="col-sm-12"></div>
            <div class="pagination-box searach-result-pagination col-sm-12 no-padding" style="display: none">
                <div class="col-sm-4">
                    <span class="labelShowRecord pull-left" data-id="pageRecordText"> </span>
                </div>
                <div class="col-sm-8">
                    <div class="inline-content-fr">
                        <div class="backgrid-paginator inline">
                            <ul class="" data-id="paginationDiv" style="display:none">
                                <li>
                                    <button type="button" data-id="previousData" title="Previous" disabled="true">
                                        <i class="fa fa-angle-left" aria-hidden="true"></i>
                                    </button>
                                </li>
                                <li class="active">
                                    <a href="javascript:void(0)" data-id="activePage"></a>
                                </li>
                                <li>
                                    <button type="button" data-id="nextData" title="Next">
                                        <i class="fa fa-angle-right" aria-hidden="true"></i>
                                    </button>
                                </li>
                            </ul>
                        </div>
                        <div class="inline col-sm-4" data-id="paginationDiv">
                            <div class="input-group" data-id="goToPageDiv">
                                <input type="text" class="form-control number-input" data-id="gotoPage" placeholder="Goto Page" />
                                <span class="input-group-btn">
                                    <button class="btn btn-default" type="button" data-id="gotoPagebtn" title="Goto Page" disabled="disabled">
                                        Go!
                                    </button>
                                </span>
                            </div>
                        </div>
                        <div class="inline">
                            <div class="inline-content">
                                <span class="control-label-sm inline ">Page Limit :</span>
                                <div class="inline" style="width: 80px;">
                                    <select data-id="showPage" multiple="multiple" class="form-control"> </select>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
<div class="text-center" data-id="columnEmptyInfo" style="display: none;">
    <h4>Please select one/more column to see the data</h4>
</div>