<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Infra Manager REST API</title>
    <link rel="icon" type="image/png" href="swagger-ui/2.2.2/images/favicon-32x32.png" sizes="32x32" />
    <link rel="icon" type="image/png" href="swagger-ui/2.2.2/images/favicon-16x16.png" sizes="16x16" />
    <link href='swagger-ui/2.2.2/css/typography.css' media='screen' rel='stylesheet' type='text/css'/>
    <link href='swagger-ui/2.2.2/css/reset.css' media='screen' rel='stylesheet' type='text/css'/>
    <link href='swagger-ui/2.2.2/css/screen.css' media='screen' rel='stylesheet' type='text/css'/>
    <link href='swagger-ui/2.2.2/css/reset.css' media='print' rel='stylesheet' type='text/css'/>
    <link href='swagger-ui/2.2.2/css/print.css' media='print' rel='stylesheet' type='text/css'/>

    <script src='swagger-ui/2.2.2/lib/object-assign-pollyfill.js' type='text/javascript'></script>
    <script src='swagger-ui/2.2.2/lib/jquery-1.8.0.min.js' type='text/javascript'></script>
    <script src='swagger-ui/2.2.2/lib/jquery.slideto.min.js' type='text/javascript'></script>
    <script src='swagger-ui/2.2.2/lib/jquery.wiggle.min.js' type='text/javascript'></script>
    <script src='swagger-ui/2.2.2/lib/jquery.ba-bbq.min.js' type='text/javascript'></script>
    <script src='swagger-ui/2.2.2/lib/handlebars-4.0.5.js' type='text/javascript'></script>
    <script src='swagger-ui/2.2.2/lib/lodash.min.js' type='text/javascript'></script>
    <script src='swagger-ui/2.2.2/lib/backbone-min.js' type='text/javascript'></script>
    <script src='swagger-ui/2.2.2/swagger-ui.js' type='text/javascript'></script>
    <script src='swagger-ui/2.2.2/lib/highlight.9.1.0.pack.js' type='text/javascript'></script>
    <script src='swagger-ui/2.2.2/lib/highlight.9.1.0.pack_extended.js' type='text/javascript'></script>
    <script src='swagger-ui/2.2.2/lib/jsoneditor.min.js' type='text/javascript'></script>
    <script src='swagger-ui/2.2.2/lib/marked.js' type='text/javascript'></script>
    <script src='swagger-ui/2.2.2/lib/swagger-oauth.js' type='text/javascript'></script>

    <!-- Some basic translations -->
    <!-- <script src='lang/translator.js' type='text/javascript'></script> -->
    <!-- <script src='lang/ru.js' type='text/javascript'></script> -->
    <!-- <script src='lang/en.js' type='text/javascript'></script> -->

    <script type="text/javascript">
        $(function () {
            var url = window.location.search.match(/url=([^&]+)/);
            if (url && url.length > 1) {
                url = decodeURIComponent(url[1]);
            } else {
                var urlPrefix = location.protocol +'//'+ location.hostname+(location.port ? ':'+location.port: '');
                url = urlPrefix + "/api/v1/swagger.yaml";
            }

            hljs.configure({
                highlightSizeThreshold: 5000
            });

            // Pre load translate...
            if(window.SwaggerTranslator) {
                window.SwaggerTranslator.translate();
            }
            window.swaggerUi = new SwaggerUi({
                url: url,
                dom_id: "swagger-ui-container",
                supportedSubmitMethods: ['get', 'post', 'put', 'delete', 'patch'],
                onComplete: function(swaggerApi, swaggerUi){
                    if(typeof initOAuth == "function") {
                        initOAuth({
                            clientId: "your-client-id",
                            clientSecret: "your-client-secret-if-required",
                            realm: "your-realms",
                            appName: "your-app-name",
                            scopeSeparator: " ",
                            additionalQueryStringParams: {}
                        });
                    }

                    if(window.SwaggerTranslator) {
                        window.SwaggerTranslator.translate();
                    }
                },
                onFailure: function(data) {
                    log("Unable to Load SwaggerUI");
                },
                docExpansion: "none",
                jsonEditor: false,
                defaultModelRendering: 'schema',
                showRequestHeaders: false
            });

            function addApiKeyAuthorization(){
                var username = encodeURIComponent($('#input_username')[0].value);
                var password = encodeURIComponent($('#input_password')[0].value);
                if (username && username.trim() != "" && password && password != "") {
                    var apiKeyAuth = new SwaggerClient.PasswordAuthorization("Authorization", username, password);
                    window.swaggerUi.api.clientAuthorizations.add("key", apiKeyAuth);
                    log("added authorization header: " + 'Basic ' + btoa(username + ':' + password));
                }
            }

            $('#input_username, #input_password').change(addApiKeyAuthorization);

            window.swaggerUi.load();

            function log() {
                if ('console' in window) {
                    console.log.apply(console, arguments);
                }
            }
        });
    </script>
</head>

<body class="swagger-section">
<div id='header'>
    <div class="swagger-ui-wrap">
        <a id="logo" href="http://swagger.io">swagger</a>
        <form id='api_selector'>
            <div class='input'><input placeholder="http://example.com/api" id="input_baseUrl" name="baseUrl" type="text"/></div>
            <div class="input"><input placeholder="username" id="input_username" name="username" type="text" size="10"></div>
            <div class="input"><input placeholder="password" id="input_password" name="password" type="password" size="10"></div>
            <div class='input'><a id="explore" href="#">Explore</a></div>
        </form>
    </div>
</div>

<div id="message-bar" class="swagger-ui-wrap" data-sw-translate>&nbsp;</div>
<div id="swagger-ui-container" class="swagger-ui-wrap"></div>
</body>
</html>