script.js 11.1 KB
Newer Older
J
Jason Park 已提交
1 2
$.ajaxSetup({cache: false, dataType: "text"});

J
Jason Park 已提交
3 4 5
$(document).on('click', 'a', function (e) {
    e.preventDefault();

J
Jason Park 已提交
6
    if (!window.open($(this).attr('href'), '_blank')) {
J
Jason Park 已提交
7 8 9 10
        alert('Please allow popups for this site');
    }
});

J
Jason Park 已提交
11 12
var tm = new TracerManager();

13 14 15 16 17
$('#btn_interval input').on('change', function () {
    tm.interval = Number.parseFloat($(this).val() * 1000);
    showInfoToast('Tracing interval has been set to ' + tm.interval / 1000 + ' second(s).');
});

J
Jason Park 已提交
18
var $module_container = $('.module_container');
J
Jason Park 已提交
19
ace.require("ace/ext/language_tools");
J
Jason Park 已提交
20 21
var initEditor = function (id) {
    var editor = ace.edit(id);
J
Jason Park 已提交
22 23 24 25 26
    editor.setOptions({
        enableBasicAutocompletion: true,
        enableSnippets: true,
        enableLiveAutocompletion: true
    });
J
Jason Park 已提交
27 28 29 30 31 32 33
    editor.setTheme("ace/theme/tomorrow_night_eighties");
    editor.session.setMode("ace/mode/javascript");
    editor.$blockScrolling = Infinity;
    return editor;
};
var dataEditor = initEditor('data');
var codeEditor = initEditor('code');
J
Jason Park 已提交
34
var lastDir = null;
J
Jason Park 已提交
35
dataEditor.on('change', function () {
J
Jason Park 已提交
36 37
    var data = dataEditor.getValue();
    if (lastDir) cachedFile[lastDir].data = data;
J
Jason Park 已提交
38
    try {
J
Jason Park 已提交
39
        tm.deallocateAll();
J
Jason Park 已提交
40
        eval(data);
J
Jason Park 已提交
41
    } catch (err) {
J
Jason Park 已提交
42 43
        console.error(err);
    } finally {
44
        tm.reset();
J
Jason Park 已提交
45
        tm.removeUnallocated();
J
Jason Park 已提交
46 47
    }
});
J
Jason Park 已提交
48 49 50 51
codeEditor.on('change', function () {
    var code = codeEditor.getValue();
    if (lastDir) cachedFile[lastDir].code = code;
});
J
Jason Park 已提交
52

J
Jason Park 已提交
53
var cachedFile = {};
J
Jason Park 已提交
54
var loading = false;
J
Jason Park 已提交
55
var loadFile = function (category, algorithm, file, explanation) {
J
Jason Park 已提交
56
    if (checkLoading()) return;
J
Jason Park 已提交
57 58
    $('#explanation').html(explanation);

J
Jason Park 已提交
59 60 61 62 63
    var dir = lastDir = './algorithm/' + category + '/' + algorithm + '/' + file + '/';
    if (cachedFile[dir] && cachedFile[dir].data !== undefined && cachedFile[dir].code !== undefined) {
        dataEditor.setValue(cachedFile[dir].data, -1);
        codeEditor.setValue(cachedFile[dir].code, -1);
    } else {
J
Jason Park 已提交
64
        loading = true;
J
Jason Park 已提交
65
        cachedFile[dir] = {};
J
Jason Park 已提交
66 67
        dataEditor.setValue('');
        codeEditor.setValue('');
J
Jason Park 已提交
68 69 70 71
        var onFail = function (jqXHR, textStatus, errorThrown) {
            loading = false;
            alert("AJAX call failed: " + textStatus + ", " + errorThrown);
        };
J
Jason Park 已提交
72
        $.get(dir + 'data.js', function (data) {
J
Jason Park 已提交
73
            cachedFile[dir].data = data;
J
Jason Park 已提交
74
            dataEditor.setValue(data, -1);
J
Jason Park 已提交
75

J
Jason Park 已提交
76 77 78
            $.get(dir + 'code.js', function (code) {
                cachedFile[dir].code = code;
                codeEditor.setValue(code, -1);
J
Jason Park 已提交
79 80 81 82 83 84 85
                loading = false;
            }).fail(onFail);
        }).fail(onFail);
    }
};
var checkLoading = function () {
    if (loading) {
J
Jason Park 已提交
86
        showErrorToast('Wait until it completes loading of previous file.');
J
Jason Park 已提交
87
        return true;
J
Jason Park 已提交
88
    }
J
Jason Park 已提交
89
    return false;
J
Jason Park 已提交
90 91
};
var loadAlgorithm = function (category, algorithm) {
J
Jason Park 已提交
92
    if (checkLoading()) return;
J
Jason Park 已提交
93 94
    $('#list > button').removeClass('active');
    $('[data-category="' + category + '"][data-algorithm="' + algorithm + '"]').addClass('active');
J
Jason Park 已提交
95
    $('#btn_desc').click();
J
Jason Park 已提交
96

J
Jason Park 已提交
97 98
    $('#category').html(list[category].name);
    $('#algorithm, #desc_title').html(list[category].list[algorithm]);
J
Jason Park 已提交
99
    $('#tab_desc > .wrapper').empty();
J
Jason Park 已提交
100 101
    $('.files_bar').empty();
    $('#explanation').html('');
J
Jason Park 已提交
102
    lastDir = null;
J
tree  
Jason Park 已提交
103
    dataEditor.setValue('');
J
Jason Park 已提交
104 105 106
    codeEditor.setValue('');

    var dir = './algorithm/' + category + '/' + algorithm + '/';
J
Jason Park 已提交
107
    $.getJSON(dir + 'desc.json', function (data) {
J
Jason Park 已提交
108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
        var files = data.files;
        delete data.files;

        var $container = $('#tab_desc > .wrapper');
        $container.empty();
        for (var key in data) {
            if (key) $container.append($('<h3>').html(key));
            var value = data[key];
            if (typeof value === "string") {
                $container.append($('<p>').html(value));
            } else if (Array.isArray(value)) {
                var $ul = $('<ul>');
                $container.append($ul);
                value.forEach(function (li) {
                    $ul.append($('<li>').html(li));
                });
            } else if (typeof value === "object") {
                var $ul = $('<ul>');
                $container.append($ul);
                for (var prop in value) {
                    $ul.append($('<li>').append($('<strong>').html(prop)).append(' ' + value[prop]));
                }
            }
        }

J
Jason Park 已提交
133 134
        $('.files_bar').empty();
        var init = false;
J
Jason Park 已提交
135
        for (var file in files) {
J
Jason Park 已提交
136 137 138 139 140 141 142 143 144 145 146
            (function (file, explanation) {
                var $file = $('<button>').append(file).click(function () {
                    loadFile(category, algorithm, file, explanation);
                    $('.files_bar > button').removeClass('active');
                    $(this).addClass('active');
                });
                $('.files_bar').append($file);
                if (!init) {
                    init = true;
                    $file.click();
                }
J
Jason Park 已提交
147
            })(file, files[file]);
J
Jason Park 已提交
148 149 150 151 152 153 154 155 156
        }
    });
};
var list = {};
$.getJSON('./algorithm/category.json', function (data) {
    list = data;
    var init = false;
    for (var category in list) {
        (function (category) {
J
Jason Park 已提交
157
            var $category = $('<button class="category">').append(list[category].name);
J
Jason Park 已提交
158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193
            $('#list').append($category);
            var subList = list[category].list;
            for (var algorithm in subList) {
                (function (category, subList, algorithm) {
                    var $algorithm = $('<button class="indent">')
                        .append(subList[algorithm])
                        .attr('data-algorithm', algorithm)
                        .attr('data-category', category)
                        .click(function () {
                            loadAlgorithm(category, algorithm);
                        });
                    $('#list').append($algorithm);
                    if (!init) {
                        init = true;
                        $algorithm.click();
                    }
                })(category, subList, algorithm);
            }
        })(category);
    }
});

var sidemenu_percent;
$('#navigation').click(function () {
    var $sidemenu = $('.sidemenu');
    var $workspace = $('.workspace');
    $sidemenu.toggleClass('active');
    $('.nav-dropdown').toggleClass('fa-caret-down fa-caret-up');
    if ($sidemenu.hasClass('active')) {
        $sidemenu.css('right', (100 - sidemenu_percent) + '%');
        $workspace.css('left', sidemenu_percent + '%');
    } else {
        sidemenu_percent = $workspace.position().left / $('body').width() * 100;
        $sidemenu.css('right', 0);
        $workspace.css('left', 0);
    }
194
    tm.resize();
J
Jason Park 已提交
195 196
});

J
Jason Park 已提交
197 198 199 200 201 202 203 204 205 206
var showErrorToast = function (err) {
    var $toast = $('<div class="toast error">').append(err);
    $('.toast_container').append($toast);
    setTimeout(function () {
        $toast.fadeOut(function () {
            $toast.remove();
        });
    }, 3000);
};

207 208 209 210 211 212 213 214 215 216
var showInfoToast = function (info) {
    var $toast = $('<div class="toast info">').append(info);
    $('.toast_container').append($toast);
    setTimeout(function () {
        $toast.fadeOut(function () {
            $toast.remove();
        });
    }, 3000);
};

J
Jason Park 已提交
217 218
$('#btn_run').click(function () {
    try {
J
Jason Park 已提交
219
        tm.deallocateAll();
J
Jason Park 已提交
220
        eval(dataEditor.getValue());
221
        tm.reset();
J
Jason Park 已提交
222
        eval(codeEditor.getValue());
223
        tm.visualize();
J
Jason Park 已提交
224
    } catch (err) {
225
        console.error(err);
J
Jason Park 已提交
226
        showErrorToast(err);
J
Jason Park 已提交
227 228
    } finally {
        tm.removeUnallocated();
J
Jason Park 已提交
229 230 231
    }
});
$('#btn_pause').click(function () {
J
Jason Park 已提交
232
    if (tm.isPause()) {
233
        tm.resumeStep();
J
Jason Park 已提交
234
    } else {
235
        tm.pauseStep();
J
Jason Park 已提交
236 237 238
    }
});
$('#btn_prev').click(function () {
239 240
    tm.pauseStep();
    tm.prevStep();
J
Jason Park 已提交
241 242
});
$('#btn_next').click(function () {
243 244
    tm.pauseStep();
    tm.nextStep();
J
Jason Park 已提交
245 246
});

J
Jason Park 已提交
247
$('#btn_desc').click(function () {
J
Jason Park 已提交
248
    $('.tab_container > .tab').removeClass('active');
J
Jason Park 已提交
249
    $('#tab_desc').addClass('active');
J
Jason Park 已提交
250 251 252 253 254 255 256 257 258 259
    $('.tab_bar > button').removeClass('active');
    $(this).addClass('active');
});
$('#btn_trace').click(function () {
    $('.tab_container > .tab').removeClass('active');
    $('#tab_trace').addClass('active');
    $('.tab_bar > button').removeClass('active');
    $(this).addClass('active');
});

J
Jason Park 已提交
260
$(window).resize(function () {
261
    tm.resize();
J
Jason Park 已提交
262
});
J
Jason Park 已提交
263 264 265 266

var dividers = [
    ['v', $('.sidemenu'), $('.workspace')],
    ['v', $('.viewer_container'), $('.editor_container')],
J
Jason Park 已提交
267
    ['h', $('.module_container'), $('.tab_container')],
J
Jason Park 已提交
268 269 270 271 272 273 274 275 276 277 278 279
    ['h', $('.data_container'), $('.code_container')]
];
for (var i = 0; i < dividers.length; i++) {
    var divider = dividers[i];
    (function (divider) {
        var vertical = divider[0] == 'v';
        var $first = divider[1];
        var $second = divider[2];
        var $parent = $first.parent();
        var thickness = 5;

        var $divider = $('<div class="divider">');
J
Jason Park 已提交
280
        var dragging = false;
J
Jason Park 已提交
281 282 283 284 285 286 287 288 289
        if (vertical) {
            $divider.addClass('vertical');
            var _left = -thickness / 2;
            $divider.css({
                top: 0,
                bottom: 0,
                left: _left,
                width: thickness
            });
J
Jason Park 已提交
290
            var x;
J
Jason Park 已提交
291 292 293 294 295 296 297 298 299 300 301 302
            $divider.mousedown(function (e) {
                x = e.pageX;
                dragging = true;
            });
            $(document).mousemove(function (e) {
                if (dragging) {
                    var new_left = $second.position().left + e.pageX - x;
                    var percent = new_left / $parent.width() * 100;
                    percent = Math.min(90, Math.max(10, percent));
                    $first.css('right', (100 - percent) + '%');
                    $second.css('left', percent + '%');
                    x = e.pageX;
303
                    tm.resize();
J
Jason Park 已提交
304 305 306 307 308 309 310 311 312 313 314 315 316 317
                }
            });
            $(document).mouseup(function (e) {
                dragging = false;
            });
        } else {
            $divider.addClass('horizontal');
            var _top = -thickness / 2;
            $divider.css({
                top: _top,
                height: thickness,
                left: 0,
                right: 0
            });
J
Jason Park 已提交
318
            var y;
J
Jason Park 已提交
319 320 321 322 323 324 325 326 327 328 329 330
            $divider.mousedown(function (e) {
                y = e.pageY;
                dragging = true;
            });
            $(document).mousemove(function (e) {
                if (dragging) {
                    var new_top = $second.position().top + e.pageY - y;
                    var percent = new_top / $parent.height() * 100;
                    percent = Math.min(90, Math.max(10, percent));
                    $first.css('bottom', (100 - percent) + '%');
                    $second.css('top', percent + '%');
                    y = e.pageY;
331
                    tm.resize();
J
Jason Park 已提交
332 333 334 335 336 337 338 339 340
                }
            });
            $(document).mouseup(function (e) {
                dragging = false;
            });
        }

        $second.append($divider);
    })(divider);
J
Jason Park 已提交
341 342 343
}

$module_container.mousedown(function (e) {
J
Jason Park 已提交
344
    tm.command('mousedown', e);
J
Jason Park 已提交
345 346
});
$module_container.mousemove(function (e) {
J
Jason Park 已提交
347
    tm.command('mousemove', e);
J
Jason Park 已提交
348 349
});
$(document).mouseup(function (e) {
J
Jason Park 已提交
350
    tm.command('mouseup', e);
J
Jason Park 已提交
351 352
});
$module_container.bind('DOMMouseScroll mousewheel', function (e) {
J
Jason Park 已提交
353
    tm.command('mousewheel', e);
J
Jason Park 已提交
354
});