<html><head>
    <!--
     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.
    -->
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Storm UI</title>
<link href="/css/bootstrap-3.3.1.min.css" rel="stylesheet" type="text/css">
<link href="/css/jquery.dataTables.1.10.4.min.css" rel="stylesheet" type="text/css">
<link href="/css/dataTables.bootstrap.css" rel="stylesheet" type="text/css">
<link href="/css/style.css?_ts=${packageTimestamp}" rel="stylesheet" type="text/css">
<script src="/js/jquery-1.11.1.min.js" type="text/javascript"></script>
<script src="/js/jquery.dataTables.1.10.4.min.js" type="text/javascript"></script>
<script src="/js/jquery.cookies.2.2.0.min.js" type="text/javascript"></script>
<script src="/js/jquery.mustache.js" type="text/javascript"></script>
<script src="/js/typeahead.jquery.min.js" type="text/javascript"></script>
<script src="/js/bootstrap-3.3.1.min.js" type="text/javascript"></script>
<script src="/js/jquery.blockUI.min.js" type="text/javascript"></script>
<script src="/js/url.min.js" type="text/javascript"></script>
<script src="/js/dataTables.bootstrap.min.js" type="text/javascript"></script>
<script src="/js/script.js?_ts=${packageTimestamp}" type="text/javascript"></script>
</head>
<body>
<div class="container-fluid">
  <div class="row">
    <div id="search-form"></div>
  </div>
  <div class="row">
    <div id="result"></div>
  </div>
  <div class="row">
    <div id="json-response-error" class="col-md-12"></div>
  </div>
  <div>
    <p id="page-rendered-at-timestamp"></p>
  </div>
</div>
</body>
<script type="text/javascript">

function jsError(other) {
    try {
      other();
    } catch (err) {
      getStatic("/templates/json-error-template.html", function(template) {
        $("#json-response-error").append(Mustache.render($(template).filter("#json-error-template").html(),{error: "JS Error", errorMessage: err}));
      });
    }
}

function elem_id_for_host(host) {
    return "search-results-"+host.replace(/\./g,"-");
}

$(document).ready(function() {
    var id = $.url("?id");
    var search = $.url("?search");
    var count = $.url("?count") || 2;
    var port = $.url("?port") || "*";
    var search_archived = $.url("?search-archived");

    $.ajaxSetup({
        "error":function(jqXHR,textStatus,response) {
            var errorJson = jQuery.parseJSON(jqXHR.responseText);
            getStatic("/templates/json-error-template.html", function(template) {
                $("#json-response-error").append(Mustache.render($(template).filter("#json-error-template").html(),errorJson));
            });
        }
    });

    getStatic("/templates/deep-search-result-page-template.html", function(template) {
        var checked;
        if (search_archived) {
            checked = "checked";
        }
        $.get("/api/v1/history/summary", function (response, status, jqXHR) {
            jsError(function() {
                var findIds = function findIds(query, cb) {
                    var found = [];
                    var re = new RegExp(query, 'i');
                    for (var j in response["topo-history"]) {
                        var id = response["topo-history"][j];
                        if (re.test(id)) {
                            found.push({ value: id });
                        }
                    }
                    cb(found);
                };

                $("#search-form").append(Mustache.render($(template).filter("#search-form-template").html(),{id: id, search: search, count:
                count, search_archived: checked, topologies: response["topo-history"]}));
                $('#search-id').typeahead({
                  hint: true,
                  highlight: true,
                  minLength: 1
                },
                {
                  name: 'ids',
                  displayKey: 'value',
                  source: findIds
                });
                $('#search-form [data-toggle="tooltip"]').tooltip();
            });
        });

        function render_file(file, host, logviewerPort, logviewerScheme, count, template) {
            jsError(function() {
                file.host = host;
                file.id = id;
                file.count = count;
                file.logviewerPort = logviewerPort;
                file.logviewerScheme = logviewerScheme;
                file.search_archived = search_archived;
                if (file.matches == 0) {
                   file.resultNotFound = true;
                }
                var searchTemplate = $(template).filter("#search-result-identified-template").html();
                var rendered = Mustache.render(searchTemplate, file);
                var elemId = elem_id_for_host(host);
                $("#"+elemId).remove();
                if (file.resultNotFound) {
                    // if no result found,
                    // and there is no "aResult" or "noResult" element exists,
                    // append "resultNotFound" element
                    if (!$("#aResult").length && !$("#noResult").length) {
                        $("#search-result-table > tbody").append(rendered);
                    }
                } else {
                  // if a result found, remove "noResult" element,
                  // and append the result
                  $("#noResult").remove();
                  $("#search-result-table > tbody").append(rendered);
                }
            });
        }


        var result = $("#result");
        if(search) {
            $.get("/api/v1/supervisor/summary", function(response, status, jqXHR) {
                jsError(function() {
                    for(var i in response.supervisors) {
                        response.supervisors[i].elemId = elem_id_for_host(response.supervisors[i].host);
                    }

                    result.append(Mustache.render($(template).filter("#search-result-files-template").html(),response));

                    var logviewerPort = response.logviewerPort;
                    var logviewerScheme = response.logviewerScheme;
                    var distinct_hosts = {};
                    for (var index in response.supervisors) {
                        distinct_hosts[response.supervisors[index].host] = true;
                    }

                    for (var host in distinct_hosts) {
                        var searchURL = logviewerScheme +
                         "://"+host+":"+logviewerPort+"/api/v1/deepSearch/"+id+"?search-string="+search+"&num-matches="+count+"&port="+port;
                        if(search_archived)
                            searchURL += "&search-archived=" + search_archived;

                        $.ajax({dataType: "json",
                                url: searchURL,
                                xhrFields: {
                                    withCredentials: true
                                },
                                success: $.proxy(function(data,status,jqXHR) {
                                    if(port == "*") {
                                        for(var by_port in data) {
                                            for(var i in data[by_port].matches) {
                                                render_file(data[by_port].matches[i], this.host, logviewerPort, logviewerScheme, count,
                                             template);
                                            }
                                        }
                                    }
                                    else {
                                        for(var i in data.matches) {
                                            render_file(data.matches[i], this.host, logviewerPort, logviewerScheme, count, template);
                                        }
                                    }
                                }, {host: host, id: id})
                               });
                    }
                });
            });
        }
    });
});

getPageRenderedTimestamp("page-rendered-at-timestamp");

</script>
</html>
