1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copyright 2013 the V8 project authors. All rights reserved.
2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Redistribution and use in source and binary forms, with or without
3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// modification, are permitted provided that the following conditions are
4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// met:
5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//
6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//     * Redistributions of source code must retain the above copyright
7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//       notice, this list of conditions and the following disclaimer.
8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//     * Redistributions in binary form must reproduce the above
9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//       copyright notice, this list of conditions and the following
10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//       disclaimer in the documentation and/or other materials provided
11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//       with the distribution.
12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//     * Neither the name of Google Inc. nor the names of its
13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//       contributors may be used to endorse or promote products derived
14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//       from this software without specific prior written permission.
15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//
16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar worker_scripts = [
29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  "../csvparser.js",
30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  "../splaytree.js",
31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  "../codemap.js",
32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  "../consarray.js",
33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  "../profile.js",
34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  "../profile_view.js",
35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  "../logreader.js",
36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  "../tickprocessor.js",
37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  "composer.js",
38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  "gnuplot-4.6.3-emscripten.js"
39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch];
40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction plotWorker() {
43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var worker = null;
44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  function initialize() {
46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ui.freeze();
47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    worker = new Worker("worker.js");
48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    running = false;
49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    worker.postMessage({ "call" : "load scripts",
51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         "args" : worker_scripts });
52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    worker.addEventListener("message", function(event) {
54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      var call = delegateList[event.data["call"]];
55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      call(event.data["args"]);
56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    });
57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  function scriptLoaded() {
60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ui.thaw();
61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Public methods.
64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  this.run = function(filename,
65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                      resx, resy,
66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                      distortion,
67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                      range_start, range_end) {
68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    var args = {
69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      'file'        : filename,
70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      'resx'        : resx,
71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      'resy'        : resy,
72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      'distortion'  : distortion,
73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      'range_start' : range_start,
74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      'range_end'   : range_end
75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    worker.postMessage({ 'call' : 'run', 'args' : args });
77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  this.reset = function() {
80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (worker) worker.terminate();
81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    initialize();
82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var delegateList = {
85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    "log"         : log,
86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    "error"       : logError,
87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    "displayplot" : displayplot,
88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    "displayprof" : displayprof,
89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    "range"       : setRange,
90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    "script"      : scriptLoaded,
91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    "reset"       : this.reset
92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
94b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction UIWrapper() {
97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var input_elements = ["range_start",
98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        "range_end",
99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        "distortion",
100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        "start",
101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        "file"];
102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var other_elements = ["log",
104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        "plot",
105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        "prof",
106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        "instructions",
107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        "credits",
108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        "toggledisplay"];
109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (var i in input_elements) {
111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    var id = input_elements[i];
112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    this[id] = document.getElementById(id);
113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (var i in other_elements) {
116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    var id = other_elements[i];
117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    this[id] = document.getElementById(id);
118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  this.freeze = function() {
121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    this.plot.style.webkitFilter = "grayscale(1)";
122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    this.prof.style.color = "#bbb";
123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (var i in input_elements) {
124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      this[input_elements[i]].disabled = true;
125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  this.thaw = function() {
129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    this.plot.style.webkitFilter = "";
130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    this.prof.style.color = "#000";
131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (var i in input_elements) {
132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      this[input_elements[i]].disabled = false;
133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  this.reset = function() {
137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    this.thaw();
138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    this.log.value = "";
139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    this.range_start.value = "automatic";
140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    this.range_end.value = "automatic";
141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    this.toggle("plot");
142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    this.plot.src = "";
143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    this.prof.value = "";
144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  this.toggle = function(mode) {
147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (mode) this.toggledisplay.next_mode = mode;
148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (this.toggledisplay.next_mode == "plot") {
149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      this.toggledisplay.next_mode = "prof";
150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      this.plot.style.display = "block";
151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      this.prof.style.display = "none";
152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      this.toggledisplay.innerHTML = "Show profile";
153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      this.toggledisplay.next_mode = "plot";
155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      this.plot.style.display = "none";
156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      this.prof.style.display = "block";
157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      this.toggledisplay.innerHTML = "Show plot";
158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  this.info = function(field) {
162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    var down_arrow = "\u25bc";
163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    var right_arrow = "\u25b6";
164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (field && this[field].style.display != "none") field = null;  // Toggle.
165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    this.credits.style.display = "none";
166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    this.instructions.style.display = "none";
167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (!field) return;
168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    this[field].style.display = "block";
169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction log(text) {
174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ui.log.value += text;
175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ui.log.scrollTop = ui.log.scrollHeight;
176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction logError(text) {
180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (ui.log.value.length > 0 &&
181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      ui.log.value[ui.log.value.length-1] != "\n") {
182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ui.log.value += "\n";
183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ui.log.value += "ERROR: " + text + "\n";
185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ui.log.scrollTop = ui.log.scrollHeight;
186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  error_logged = true;
187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction displayplot(args) {
191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (error_logged) {
192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    log("Plot failed.\n\n");
193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    log("Displaying plot. Total time: " +
195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        (Date.now() - timer) / 1000 + "ms.\n\n");
196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    var blob = new Blob([new Uint8Array(args.contents).buffer],
197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        { "type" : "image\/svg+xml" });
198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    window.URL = window.URL || window.webkitURL;
199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ui.plot.src = window.URL.createObjectURL(blob);
200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ui.thaw();
203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ui.toggle("plot");
204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction displayprof(args) {
208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (error_logged) return;
209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ui.prof.value = args;
210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  this.prof.style.color = "";
211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ui.toggle("prof");
212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction start(event) {
216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  error_logged = false;
217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ui.freeze();
218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  try {
220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    var file = getSelectedFile();
221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    var distortion = getDistortion();
222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    var range = getRange();
223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } catch (e) {
224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    logError(e.message);
225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    display();
226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return;
227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  timer = Date.now();
230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  worker.run(file, kResX, kResY, distortion, range[0], range[1]);
231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction getSelectedFile() {
235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var file = ui.file.files[0];
236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!file) throw Error("No valid file selected.");
237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return file;
238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction getDistortion() {
242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var input_distortion =
243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      parseInt(ui.distortion.value, 10);
244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (isNaN(input_distortion)) {
245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    input_distortion = ui.distortion.value = 4500;
246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return input_distortion / 1000000;
248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction getRange() {
252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var input_start =
253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      parseInt(ui.range_start.value, 10);
254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (isNaN(input_start)) input_start = undefined;
255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var input_end =
256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      parseInt(ui.range_end.value, 10);
257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (isNaN(input_end)) input_end = undefined;
258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return [input_start, input_end];
259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction setRange(args) {
263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ui.range_start.value = args.start.toFixed(1);
264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ui.range_end.value = args.end.toFixed(1);
265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction onload() {
269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  kResX = 1200;
270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  kResY = 600;
271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  error_logged = false;
272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ui = new UIWrapper();
273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ui.reset();
274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ui.info(null);
275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  worker = new plotWorker();
276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  worker.reset();
277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar kResX;
281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar kResY;
282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar error_logged;
283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar ui;
284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar worker;
285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar timer;
286