<!DOCTYPE html>
<html>
    <head>
        <meta name="apple-mobile-web-app-capable" content="yes" />
        <meta name="viewport" content="user-scalable=no, width=device-width, initial-scale=1, maximum-scale=1"/>
        <meta charset="UTF-8">
        <meta name="theme-color" content="#4b75ff">
        <meta name="zoraxy.csrf.Token" content="{{.csrfToken}}">
        <link rel="icon" type="image/png" href="./favicon.png" />
        <title>Control Panel | Zoraxy</title>
        <link rel="stylesheet" href="script/semantic/semantic.min.css">
        <script src="script/jquery-3.6.0.min.js"></script>
        <script src="script/semantic/semantic.min.js"></script>
        <script src="script/tablesort.js"></script>
        <script src="script/countryCode.js"></script>
        <script src="script/chart.js"></script>
        <script src="script/utils.js"></script>
        <link rel="stylesheet" href="main.css">
        <link rel="stylesheet" href="darktheme.css">
    </head>
    <body>
        <script src="script/darktheme.js"></script>
        <div class="menubar">
            <div class="item">
                <img class="logo" src="img/logo.svg">
            </div>

            <div class="ui right floated buttons menutoggle" style="padding-top: 2px;">
                <button id="sidemenuBtn" class="ui basic icon button" onclick="$('.toolbar').fadeToggle('fast');"><i class="content icon"></i></button>
            </div>
            <div class="ui right floated buttons" style="padding-top: 2px; padding-right: 0.4em;">
                <button class="ui basic white icon button" onclick="logout();"><i class="sign-out icon"></i></button>
            </div>
            <div class="ui right floated buttons" style="padding-top: 2px; margin-right: 0.4em;">
                <button id="themeColorButton" class="ui icon button" onclick="toggleTheme();"><i class="sun icon"></i></button>
            </div>
        </div>
        <div class="wrapper">
            <div class="toolbar">
                <div id="mainmenu" class="ui secondary vertical menu">
                    <a class="item" tag="qstart">
                        <i class="simplistic magic icon"></i>Quick Start
                    </a>
                    <a class="item active" tag="status">
                        <i class="simplistic info circle icon"></i>Status
                    </a>
                    <a class="item" tag="setroot">
                        <i class="simplistic home icon"></i> Default Site
                    </a>
                    <div class="ui divider menudivider">Reverse Proxy</div>
                    <a class="item" tag="httprp">
                        <i class="simplistic sitemap icon"></i> HTTP Proxy
                    </a>
                    <a class="item" tag="vdir">
                        <i class="simplistic folder icon"></i> Virtual Directory
                    </a>
                    <a class="item" tag="rules">
                        <i class="simplistic plus square icon"></i> Create Proxy Rules
                    </a>
                    <a class="item" tag="streamproxy">
                        <i class="simplistic exchange icon"></i> Stream Proxy
                    </a>
                    <div class="ui divider menudivider">Access & Connections</div>
                    <a class="item" tag="redirectset">
                        <i class="simplistic level up alternate icon"></i> Redirection
                    </a>
                    <a class="item" tag="access">
                        <i class="simplistic ban icon"></i> Access Control
                    </a>
                    <a class="item" tag="gan">
                        <i class="simplistic globe icon"></i> Global Area Network
                    </a>
                    <div class="ui divider menudivider">Security</div>
                    <a class="item" tag="cert">
                        <i class="simplistic lock icon"></i> TLS / SSL certificates
                    </a>
                    <a class="item" tag="sso">
                        <i class="simplistic user circle icon"></i> SSO / Oauth
                    </a>
                    <div class="ui divider menudivider">Others</div>
                    <a class="item" tag="webserv">
                        <i class="simplistic globe icon"></i> Static Web Server
                    </a>
                    <a class="item" tag="utm">
                        <i class="simplistic time icon"></i> Uptime Monitor
                    </a>
                    <a class="item" tag="networktool">
                        <i class="simplistic terminal icon"></i> Network Tools
                    </a>
                    <a class="item" tag="stats">
                        <i class="simplistic database icon"></i> Statistical Analysis
                    </a>
                    <a class="item" tag="utils">
                        <i class="simplistic paperclip icon"></i> Utilities
                    </a>
                    <!-- Add more components here -->
                </div>
            </div>
            <div class="contentWindow">
                <!-- Quick Start -->
                <div id="qstart" class="functiontab" target="quickstart.html"></div>

                <!-- Status Tab -->
                <div id="status" class="functiontab" target="status.html" style="display: block ;">
                    <br><br><div class="ui active centered inline loader"></div>
                </div>

                <!-- Virtual Directory Tab -->
                <div id="vdir" class="functiontab" target="vdir.html"></div>

                <!-- Subdomain Proxy -->
                <div id="httprp" class="functiontab" target="httprp.html"></div>

                <!-- Create Rules -->
                <div id="rules" class="functiontab" target="rules.html"></div>

                <!-- Set proxy root -->
                <div id="setroot" class="functiontab" target="rproot.html"></div>

                <!-- Set TLS cert -->
                <div id="cert" class="functiontab" target="cert.html"></div>

                <!-- Redirections -->
                <div id="redirectset" class="functiontab" target="redirection.html"></div>

                <!-- Blacklist -->
                <div id="access" class="functiontab" target="access.html"></div>

                <!-- Global Area Networking -->
                <div id="gan" class="functiontab" target="gan.html"></div>

                <!-- SSO / Oauth services -->
                <div id="sso" class="functiontab" target="sso.html"></div>

                <!-- TCP Proxy -->
                <div id="streamproxy" class="functiontab" target="streamprox.html"></div>

                <!-- Web Server -->
                <div id="webserv" class="functiontab" target="webserv.html"></div>

                <!-- Up Time Monitor -->
                <div id="utm" class="functiontab" target="uptime.html"></div>

                <!-- Network Tools -->
                <div id="networktool" class="functiontab" target="networktools.html"></div>

                <!-- Statistic Tools -->
                <div id="stats" class="functiontab" target="stats.html"></div>

                <!-- Utilities -->
                <div id="utils" class="functiontab" target="utils.html"></div>
            </div>
            </div>
        </div>
        <div class="sideWrapper" style="display:none;">
            <div class="fadingBackground" onclick="hideSideWrapper();"></div>
            <div class="content">
                <div class="sideWrapperMenu"></div>
                <iframe src="snippet/placeholder.html"></iframe>
            </div>
        </div>
        <br><br>
        <div class="ui divider"></div>
        <div class="ui container" style="color: grey; font-size: 90%">
            <p><a href="https://zoraxy.aroz.org" target="_blank">Zoraxy</a> <span class="zrversion"></span> © 2021 - <span class="year"></span> tobychui. Licensed under AGPL</p>
        </div>
        
        <div id="messageBox" class="ui green floating big compact message">
            <p><i class="green check circle icon"></i> There are no messages</p>
        </div>
        
        <div id="confirmBox" style="display:none;">
            <div class="ui top attached progress">
                <div class="bar" style="width: 100%; min-width: 0px;"></div>
            </div>
            <div class="confirmBoxBody">
                <button class="ui red basic mini circular icon right floated button" style="margin-left: 0.4em;"><i class="ui times icon"></i></button>
                <button class="ui green basic mini circular icon right floated button"><i class="ui check icon"></i></button>
                <div class="questionToConfirm">Confirm Exit?</div>
            </div>
        </div>

        <div id="tourModal" class="nofocus" position="center">
            <h4 class="tourStepTitle">Welcome to Zoraxy Tour</h4>
            <p class="tourStepContent">This is a simplified tour to show some of what it can do.
                Use your keyboard or click the next button to get going.</p>
            <div class="ui divider"></div>
            <div class="ui equal width grid" align="center">
                <div class="column"><button onclick="previousTourStep();" class="ui basic small disabled button tourStepButtonBack">Back</button></div>
                <div class="column"><p style="margin-top: 0.4em">Steps <span class="tourStepCounter">1 / 9</span></p></div>
                <div class="column nextStepAvaible"><button onclick="nextTourStep();" class="ui basic right floated small button tourStepButtonNext">Next</button></div>
                <div class="column nextStepFinish"><button onclick="endTourFocus();" class="ui right floated small button tourStepButtonFinish">Finish</button></div>
            </div>
            <button onclick="endTourFocus();" class="ui circular small icon button tourCloseButton"><i class="ui times icon"></i></button>
        </div>
        <div id="tourModalOverlay" style="display:none;"></div>

        <br><br>
        <script>
            $(".year").text(new Date().getFullYear());
            /*
                Loader function

                Load all the components view from the 
                components/ directory into their corrisponding divs
            */
            let loadingComponents = 0;
            
            function initTabs(callback=undefined){
                $('.functiontab').each(function(){
                    let loadTarget = $(this).attr("target");
                    if (loadTarget != undefined){
                        $(this).load("./components/" + loadTarget, function(){
                            loadingComponents--;
                        });
                        loadingComponents++;
                    }else{
                        $(this).html(`<p>Unable to load components for this tab</p>`);
                    }
                })
                if (callback != undefined){
                    waitInit(callback);
                }
            }

            function waitInit(callback = undefined, retryCount = 0){
                if (loadingComponents > 0 && retryCount < 5){
                    setTimeout(function(){
                        waitInit(callback, retryCount++);
                    }, 300);
                }else if (loadingComponents == 0){
                    callback();
                }else{
                    alert("Missing component. Please check if your installation is complete.")
                }
            }

            initTabs(function(){
                initRPStaste();

                if (window.location.hash.length > 1){
                    let tabID = window.location.hash.substr(1);
                    openTabById(tabID);
                }else{
                    openTabById("status");
                }
                $(".ui.dropdown").dropdown();
                $(".ui.checkbox").checkbox();

                //Click on the current tab
                $("#mainmenu").find(".item").each(function(){
                    $(this).on("click", function(event){
                        let tabid = $(this).attr("tag");
                        openTabById(tabid);
                    });
                });

                //Initialize all table that is sortable
                $('table').tablesort();
            });

            function logout() {
                $.get("/api/auth/logout", function(response) {
                    if (response === "OK") {
                        setTimeout(function(){
                            window.location.href = "/login.html";
                        }, 300);
                    }
                });
            }

            function toggleTheme(){
                if ($("body").hasClass("darkTheme")){
                    setDarkTheme(false);
                    //Check if the snippet iframe is opened. If yes, set the dark theme to the iframe
                    if ($(".sideWrapper").is(":visible")){
                        $(".sideWrapper iframe")[0].contentWindow.setDarkTheme(false);
                    }
                }else{
                    setDarkTheme(true);
                    //Check if the snippet iframe is opened. If yes, set the dark theme to the iframe
                    if ($(".sideWrapper").is(":visible")){
                        $(".sideWrapper iframe")[0].contentWindow.setDarkTheme(true);
                    }
                    
                }
            }

            function getTabButtonById(targetTabId){
                let targetTabBtn = undefined;
                $("#mainmenu").find(".item").each(function(){
                    let tabid = $(this).attr("tag");
                    
                    if (tabid == targetTabId){
                        targetTabBtn = $(this);
                    }
                });

                return targetTabBtn;
            }

            //Select and open a tab by its tag id
            let tabSwitchEventBind = {}; //Bind event to tab switch by tabid
            function openTabById(tabID){
                let targetBtn = getTabButtonById(tabID);
                if (targetBtn == undefined){
                    alert("Invalid tabid given");
                    return;
                }
                if (window.innerWidth < 750){
                    //RWD mode, hide toolbar
                    $(".toolbar").fadeOut('fast');
                }

                $("#mainmenu").find(".item").removeClass("active");
                $(targetBtn).addClass("active");
                $(".functiontab").hide();
                $("#" + tabID).fadeIn('fast', function(){
                    setTimeout(function(){
                        if (tabSwitchEventBind[tabID]){
                            tabSwitchEventBind[tabID]();
                        }
                    },100)
                });
                $('html,body').animate({scrollTop: 0}, 'fast');
                window.location.hash = tabID;
            }

            $(window).on("resize", function(){
                if (window.innerWidth >= 750 && $(".toolbar").is(":visible") == false){
                    $(".toolbar").show();
                }
            });

            function msgbox(message, succ=true, delayDuration=3000){
                let icon = `<i class="ui info circle icon"></i>`;
                if (succ){
                    $("#messageBox").attr("class", "ui green floating compact message")
                    icon = `<i class="ui green circle check icon"></i>`;
                }else{
                    message = message.capitalize();
                    $("#messageBox").attr("class", "ui red floating compact message")
                    icon = `<i class="ui red circle times icon"></i>`;
                }
                $("#messageBox").html(`${icon} ${message}`);
                $("#messageBox").stop().finish().fadeIn("fast").delay(delayDuration).fadeOut("fast");
            }

            function confirmBox(question_to_confirm, callback, delaytime=15) {
                
                var progressBar = $("#confirmBox .bar");
                var questionElement = $("#confirmBox .questionToConfirm");
                
                //Just to make sure there are no animation runnings
                progressBar.stop();

                // Update the question to confirm
                questionElement.text(question_to_confirm);

                // Start the progress bar animation
                progressBar.css("width", "100%");
                progressBar.animate({ width: "0%", easing: "linear" }, delaytime * 1000, function() {
                    // Animation complete, invoke the callback with undefined
                    callback(undefined);

                    //Unset the event listener
                    $("#confirmBox .ui.green.button").off("click");

                    // Hide the confirm box
                    $("#confirmBox").hide();
                });

                // Bind click event to "Yes" button
                $("#confirmBox .ui.green.button").on("click", function() {
                    // Stop the progress bar animation
                    progressBar.stop();

                    // Invoke the callback with true
                    callback(true);

                    // Hide the confirm box
                    $("#confirmBox").hide();

                    //Unset the event listener
                    $("#confirmBox .ui.green.button").off("click");
                });

                // Bind click event to "No" button
                $("#confirmBox .ui.red.button").on("click", function() {
                    // Stop the progress bar animation
                    progressBar.stop();

                    // Invoke the callback with false
                    callback(false);

                    // Hide the confirm box
                    $("#confirmBox").hide();

                     //Unset the event listener
                    $("#confirmBox .ui.red.button").off("click");
                });

                // Show the confirm box
                $("#confirmBox").show().transition('jiggle');
            }

            /*
                Toggles for side wrapper
            */

            function showSideWrapper(scriptpath=""){
                if (scriptpath != ""){
                    $(".sideWrapper iframe").attr("src", scriptpath);
                }

                if ($(".sideWrapper .content").transition("is animating") || $(".sideWrapper .content").transition("is visible")){
                    return
                }
                $(".sideWrapper").show();
                $(".sideWrapper .fadingBackground").fadeIn("fast");
                $(".sideWrapper .content").transition('slide left in', 300);
                $("body").css("overflow", "hidden");
            }

            function hideSideWrapper(discardFrameContent = false){
                if (discardFrameContent){
                    $(".sideWrapper iframe").attr("src", "snippet/placeholder.html");
                }
                if ($(".sideWrapper .content").transition("is animating") || !$(".sideWrapper .content").transition("is visible")){
                    return
                }
                $(".sideWrapper .content").transition('slide left out', 300, function(){
                    $(".sideWrapper .fadingBackground").fadeOut("fast", function(){
                        $(".sideWrapper").hide(); 
                    });
                });
                $("body").css("overflow", "auto");
            }
        </script>
    </body>
</html>