corrade-nucleus-nucleons – Rev 20

Subversion Repositories:
Rev:
<!DOCTYPE html>

<html lang="en">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
    <meta name="description" content="Corrade Nucleon">
    <meta name="author" content="Wizardry and Steamworks">
    <link rel="icon" href="favicon.ico">

    <title>Corrade Nucleus - LSL Scripting Environment</title>

    <!-- Bootstrap core CSS -->
    <link href="/node_modules/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet" type="text/css">
    <!-- Corrade Nucleus Fonts -->
    <link href="/css/nucleus/fonts.css" rel="stylesheet" type="text/css">
    <!-- Customized Nucleus style. -->
    <link href="/css/nucleus/nucleus.css" rel="stylesheet" type="text/css">
    <!-- Script Kiddie style. -->
    <link href="/script-kiddie/css/style.css" rel="stylesheet" type="text/css">
    
    <!-- Bootstrap Toggle -->
    <link href="/script-kiddie/node_modules/bootstrap-toggle/css/bootstrap-toggle.min.css" rel="stylesheet" type="text/css">
    
</script>
</head>

<body>
    <!-- Dialog Modal -->
    <div id="avatar-select" class="modal fade bs-example-modal-lg" role="dialog">
        <div class="modal-dialog modal-lg">
            <!-- Modal content-->

            <div class="modal-content">
                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal">&times;</button>

                    <h1 id="title" class="modal-title">Avatar Selection</h1>
                </div>

                <form id="avatar-select-form" class="form-inline" data-toggle="validator" onSubmit="event.preventDefault();">
                    <div id="content" class="modal-body">
                        <p>Please enter the avatar firstname and lastname to send the script to.</p>
                        <div class="form-group has-feedback">
                            <label for="avatar-firstname">First Name</label>
                            <input id="avatar-firstname" type="text" class="form-control" aria-describedby="basic-addon1" required>
                            <label for="avatar-lastname">Last Name</label>
                            <input id="avatar-lastname" type="text" class="form-control" aria-describedby="basic-addon1" required>
                        </div>
                    </div>
                    <div class="modal-footer">
                        <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
                        <button id="send-script" type="submit" class="btn btn-primary">Confirm</button>
                    </div>
                </form>
            </div>
        </div>
    </div>
    
    <div class="container">
        <div class="jumbotron">
        <h1>Corrade Script Kiddie</h1>
        <p class="lead">Script Kiddie is an LSL editor using Corrade as a backend for developing scripts.</p>
        <img src="script-kiddie/img/script-kiddie.png"></div>
        
        <!-- <div id="drag-1" class="draggable">
          <p> You can drag one element </p>
        </div> -->

      <div id="editor-panel" class="panel panel-default draggable movable">
          <div class="panel-heading">
            <form id="script-tools" data-toggle="validator" onSubmit="event.preventDefault();">
                <div class="form-group">
                      <button id="compile-script" class="btn btn-default check-image checkButton" type="button" title="Compile script.">Compile</button>
                      <button id="tidy-script" class="btn btn-default" type="button" title="Tidy source-code.">Cleanup</button>
                 
                </div>
                <div class="form-group has-feedback">
                      <div class="input-group">
                          <span class="input-group-btn">
                              <input id="store-script" type="checkbox" data-toggle="toggle" data-on="Store" data-off="No Store" data-onstyle="success" disabled="disabled">
                          </span>
                          <input id="script-name" type="text" class="form-control" placeholder="Script Name" aria-describedby="basic-addon1" required>
                          <span class="input-group-addon">-</span>
                          <input id="script-UUID" type="text" class="form-control" aria-describedby="basic-addon2" size="36">
                          <span class="input-group-btn">
                              <button id="give-script" class="btn btn-default" type="button" title="Give script." disabled="disabled">Give</button>
                          </span>
                      </div>
                </div>
            </form>
          </div>
          <div class="panel-body" id="editorpanel">  
              <div id="editor" style="height: 500px;">default
{
    state_entry()
    {
        llSay(0, "Hello, Avatar!");
    }

    touch_start(integer total_number)
    {
        llSay(0, "Touched.");
    }
}
</div>
          </div>
      </div>
      
      <div id="error-panel" class="panel panel-default draggable movable">
          <div class="panel-heading">
              <p>Compilation Errors</p>
          </div>
          <div class="panel-body" id="errorpanel">
              <div id="errors">
                  <textarea id="message" class="form-control" rows="5" style="min-width: 100%; max-width: 100%; font-family: monospace; display: none;" readonly></textarea>
              </div>
          </div>
      </div>
      
    </div> <!-- /container -->
    
    <footer class="footer">
        <p>&copy; 2017 Wizardry and Steamworks</p>
    </footer>

    <!-- jQuery -->
    <script src="/node_modules/jquery/dist/jquery.min.js" type="text/javascript"></script>
    <!-- Bootstrap Javascript -->
    <script src="/node_modules/bootstrap/dist/js/bootstrap.min.js" type="text/javascript"></script>
    <!-- Bootstrap Validator -->
    <script src="/node_modules/bootstrap-validator/dist/validator.min.js" type="text/javascript"></script>
    <!-- Bootstrap Toggle -->
    <script src="/script-kiddie/node_modules/bootstrap-toggle/js/bootstrap-toggle.min.js" type="text/javascript"></script>
    <!-- ACE -->
    <script src="/script-kiddie/node_modules/ace-builds/src-min-noconflict/ace.js"  type="text/javascript"></script>
    <script src="/script-kiddie/node_modules/ace-builds/src-min-noconflict/ext-language_tools.js" type="text/javascript"></script>
    <!-- Beautify.JS -->
    <script src="/script-kiddie/node_modules/js-beautify/js/lib/beautify.js" type="text/javascript"></script>
    <!-- Velocity -->
    <script src="/script-kiddie/node_modules/velocity-animate/velocity.min.js" type="text/javascript"></script>
    <!-- Interact JS -->
    <script src="/script-kiddie/node_modules/interactjs/dist/interact.min.js" type="text/javascript"></script>
    <!-- Wizardry and Steamworks JavaScript Includes -->
    <script src="/node_modules/was/dist/was.min.js" type="text/javascript"></script>
    <script>
    $(document).ready(() => {
        // Auto-complete.
        ace.require("ace/ext/language_tools");
        
        // Create the editor.
        var editor = ace.edit("editor");
        editor.setTheme("ace/theme/twilight");
        editor.getSession().setMode("ace/mode/lsl");
        editor.setOptions({
            enableBasicAutocompletion: true,
            enableSnippets: false,
            enableLiveAutocompletion: true
        });
        
        // Get the script from the storage.
        var storeScriptText = localStorage.getItem('nucleus-script-kiddie-script-body');
        if (typeof storeScriptText == "string")
            editor.getSession().setValue(storeScriptText);
        
        function compile(lsl, callback) {
            // Set the editor to read-only.
            editor.setReadOnly(true);
            
            // Set the button image.
            $('#compile-script').removeClass("check-image");
            $('#compile-script').removeClass("checkButton");
            
            $('#compile-script').removeClass("cross-image");
            $('#compile-script').removeClass("crossButton");
            
            $('#compile-script').addClass("activity-image");
            $('#compile-script').addClass("activityButton");
            
            $.ajax({
                type: 'POST',
                url: '/',
                data: {
                    command: 'compilescript',
                    data: lsl
                },
                dataType: 'json'
            }).done(function(response) {
                var success = response.success === "True";
                // Set the editor to read-enabled.
                editor.setReadOnly(false);
                
                if(success) {
                    // Set the button image.
                    $('#compile-script').removeClass("activity-image");
                    $('#compile-script').removeClass("activityButton");
                
                    $('#compile-script').addClass("check-image");
                    $('#compile-script').addClass("checkButton");
                    
                    $("#message").velocity("slideUp", {
                        duration: 1000
                    });
                    callback(success);
                    return;
                }
                
                // Move panel to top.
                $('#error-panel').css('z-index', getTopWindowIndex() + 1);
                $('#error-panel').css('position', 'relative');
                
                // Set the button image.
                $('#compile-script').removeClass("activity-image");
                $('#compile-script').removeClass("activityButton");
                
                $('#compile-script').addClass("cross-image");
                $('#compile-script').addClass("crossButton");
                
                $("#message").velocity("slideDown", {
                    duration: 1000
                });
                
                $('#message').val(wasCSVToArray(response.data).join(''));
                callback(success);
            });
        }
        
        function store(lsl, callback) {
            $.ajax({
                type: 'POST',
                url: '/',
                data: {
                    command: 'updatescript',
                    create: true,
                    type: 'agent',
                    entity: 'text',
                    item: $('#script-UUID').val(),
                    target: $('#script-name').val(),
                    data: lsl
                },
                dataType: 'json'
            }).done(function(response) {
                var success = response.success === "True";
                if(success) {
                    // Get the response data and item UUID.
                    var data = wasCSVToArray(response.data);
                    var UUID = data[data.indexOf('item') + 1];
                    
                    // Set the inventory UUID of the saved script.
                    $('#script-UUID').val(UUID);
                    
                    localStorage.setItem('nucleus-script-kiddie-script-UUID', UUID);
                }
                callback(success);
            });
        }
        
        // Add compiling with Ctrl-S
        editor.commands.addCommand({
            name: 'Compile',
            bindKey: {
                win: 'Ctrl-S', 
                mac: 'Command-S'
            },
            exec: editor => {
                var data = editor.getSession().getValue();
                // Store locally on save.
                localStorage.setItem('nucleus-script-kiddie-script-body', data);
                
                compile(data, (success) => {
                    // Script did not compile so do not store.
                    if(!success)
                        return;
                    
                    // Storing is not enabled so return.
                    if($('#store-script').prop('checked') !== true)
                        return;
                    
                    store(data, (success) => {
                        // Script was stored successfully.
                        //alert("Script stored succssfully.");
                    });
                });
                
            },
            readOnly: false // false if this command should not apply in readOnly mode
        });
        
        // Add click listener for compile button.
        $('#compile-script').on('click', function (e) {
            if($('#compile-script').hasClass("activity-image"))
                return;
            
            var data = editor.getSession().getValue();
            compile(data, (success) => {});
            if($('#store-script').prop('checked') === true)
                store(data);
        });
        
        // Add click listener for tidy button.
        $('#tidy-script').on('click', function (e) {
            if($('#compile-script').hasClass("activity-image"))
                return;
            
            // Code cleanup parameters.
            editor.setValue(
                js_beautify(
                    editor.getSession().getValue(), 
                    {
                        "indent_size": 4,
                        "indent_char": " ",
                        "indent_with_tabs": false,
                        "eol": "\n",
                        "end_with_newline": true,
                        "indent_level": 0,
                        "preserve_newlines": true,
                        "max_preserve_newlines": 10,
                        "space_in_paren": false,
                        "space_in_empty_paren": false,
                        "jslint_happy": false,
                        "space_after_anon_function": false,
                        "brace_style": "expand",
                        "break_chained_methods": false,
                        "keep_array_indentation": false,
                        "unescape_strings": false,
                        "wrap_line_length": 0,
                        "e4x": false,
                        "comma_first": false,
                        "operator_position": "before-newline"
                    }
                )
            );
        });
        
        function give(firstname, lastname, callback) {
            $.ajax({
                type: 'POST',
                url: '/',
                data: {
                    command: 'give',
                    entity: 'avatar',
                    item: $('#script-UUID').val(),
                    firstname: firstname,
                    lastname: lastname,
                    permissions: 'c--mvt------------c--mvtc--mvt'
                },
                dataType: 'json'
            }).done(function(response) {
                callback(response);
            });
        }
        
        // Add click listener for give button.
        $('#give-script').on('click', function (e) {
            if($('#compile-script').hasClass("activity-image"))
                return;
            
                // Show the popup.
                $('#avatar-select').modal('show');
        });
        
        // Add click listener to modal confirmation.
        $('#send-script').on('click', function(e) {
                // Hide the popup.
                $('#avatar-select').modal('hide');
            
            // Disable give button.
            $('#give-script').attr('disabled', true);
            give($('#avatar-firstname').val(), $('#avatar-lastname').val(), (response) => {
                // Enable give button.
                $('#give-script').attr('disabled', false);
            });
        })
        
        // Save script on change.
        editor.getSession().on('change', function(e) {
            localStorage.setItem('nucleus-script-kiddie-script-body', editor.getSession().getValue());
        });
        
        // Move windows to top on click.
        $('.draggable').click(function() {
            $(this).css('z-index', getTopWindowIndex() + 1);
        });
        
        // target elements with the "draggable" class
        interact('.draggable')
            .draggable({
                // enable inertial throwing
                inertia: true,
                // keep the element within the area of it's parent
                /*restrict: {
                    // Let the user move the windows freely.
                    restriction: "self",
                    endOnly: true//,
                    //elementRect: { top: 0, left: 0, bottom: 1, right: 1 }
                },*/
                
                // enable autoScroll
                autoScroll: true,
                
                onmove: dragMoveListener,
                onend: function (event) {
                    event.target.style.opacity = 1;
                },
                onstart: function(event) {
                    // Move windows to top on drag.
                    event.target.style.zIndex = getTopWindowIndex() + 1;
                    event.target.style.opacity = 0.5;
                }
            })
            .allowFrom('.panel-heading')
            .ignoreFrom('a, input, button, textarea');
        
        function getTopWindowIndex() {
            return Math.max.apply(null, 
                $.map($('.draggable'), function(e, n) {
                    if ($(e).css('position') != 'static')
                        return parseInt($(e).css('z-index')) || 1;
                })
            );
        }

        function dragMoveListener (event) {
            var target = event.target,
              // keep the dragged position in the data-x/data-y attributes
              x = (parseFloat(target.getAttribute('data-x')) || 0) + event.dx,
              y = (parseFloat(target.getAttribute('data-y')) || 0) + event.dy;

            // translate the element
            target.style.webkitTransform =
              target.style.transform =
              'translate(' + x + 'px, ' + y + 'px)';

            // update the posiion attributes
            target.setAttribute('data-x', x);
            target.setAttribute('data-y', y);
        }

        // this is used later in the resizing and gesture demos
        window.dragMoveListener = dragMoveListener;
        
        // Get the item name from the storage.
        var storeScriptUUID = localStorage.getItem('nucleus-script-kiddie-script-UUID');
        if (typeof storeScriptUUID == "string")
            $('#script-UUID').val(storeScriptUUID);
        
        // Get the item name from the storage.
        var storeScriptName = localStorage.getItem('nucleus-script-kiddie-script-name');
        if (typeof storeScriptName == "string")
            $('#script-name').val(storeScriptName);
        
        // Store script name on modification.
        var scriptNameTimerID;    
        $('#script-name').on('input',function(e){
            var value = $(this).val();
            if($(this).data('lastval')!= value){

                $(this).data('lastval',value);
                clearTimeout(scriptNameTimerID);

                scriptNameTimerID = setTimeout(function() {
                    localStorage.setItem('nucleus-script-kiddie-script-name', value);
                },500);
            };
        });
        
        // Enable storing of script only if the form validates.
        $('#script-tools').on('validated.bs.validator', function (e) {
            if($('#script-tools').has('.has-error').length !== 0) {
                $('#store-script').bootstrapToggle('off');
                $('#store-script').bootstrapToggle('disable');
                return;
            }
            $('#store-script').bootstrapToggle('enable');
        });
        
        $('#store-script').change(function() {
            switch($('#store-script').prop('checked'))
            {
                case true:
                    // Disable script name and UUID.
                    $('#script-name').attr('disabled', true);
                    $('#script-UUID').attr('disabled', true);
                    
                    var data = editor.getSession().getValue();
                    // Store locally on save.
                    localStorage.setItem('nucleus-script-kiddie-script-body', data);
                    
                    $('#give-script').attr('disabled', true);
                    compile(data, (success) => {
                        store(data, (success) => {
                            // Script was stored successfully.
                            // Enable the give button.
                            $('#give-script').attr('disabled', false);
                        });
                    });
                    break;
                default:
                    // Enable script name and UUID.
                    $('#script-name').attr('disabled', false);
                    $('#script-UUID').attr('disabled', false);
                    
                    // Disable the give button.
                    $('#give-script').attr('disabled', true);
                    break;
            }
        });
        
    });
    </script>
</body>
</html>