7 if (JSROOT.H(
'root') != null) {
8 JSROOT.H(
'root').clear();
9 JSROOT.DelHList(
'root');
11 $(
'#browser').
get(0).innerHTML =
'';
14 function guiLayout() {
15 var res =
'collapsible';
16 var selects = document.getElementById(
"layout");
18 res = selects.options[selects.selectedIndex].text;
22 function setGuiLayout(value) {
23 var selects = document.getElementById(
"layout");
26 for (var i in selects.options) {
27 var s = selects.options[i].text;
28 if (typeof s ==
'undefined')
continue;
29 if ((s == value) || (s.replace(/ /g,
"") == value)) {
30 selects.selectedIndex = i;
36 function BuildNoBrowserGUI(online) {
39 var running_request = {};
43 filename = JSROOT.GetUrlOption(
"file");
44 var filesdir = JSROOT.GetUrlOption(
"path");
45 if (filesdir!=null) filename = filesdir + filename;
48 var itemname = JSROOT.GetUrlOption(
"item");
49 if (itemname) itemsarr.push(itemname);
50 var opt = JSROOT.GetUrlOption(
"opt");
51 if (opt) optionsarr.push(opt);
53 var items = JSROOT.GetUrlOption(
"items");
55 items = JSON.parse(items);
56 for (var i in items) itemsarr.push(items[i]);
59 var opts = JSROOT.GetUrlOption(
"opts");
61 opts = JSON.parse(opts);
62 for (var i in opts) optionsarr.push(opts[i]);
66 var layout = JSROOT.GetUrlOption(
"layout");
67 if (layout==
"") layout = null;
69 var monitor = JSROOT.GetUrlOption(
"monitoring");
70 if (monitor ==
"") monitor = 3000;
else
71 if (monitor != null) monitor = parseInt(monitor);
73 var divid = online ?
"onlineGUI" :
"simpleGUI";
77 $(
'html').css(
'height',
'100%');
78 $(
'body').css(
'min-height',
'100%').css(
'margin',
'0px').css(
"overflow",
"hidden");
80 $(
'#'+divid).css(
"position",
"absolute")
86 var objpainter = null;
89 function file_error(str) {
90 if ((objpainter == null) && (mdi==null))
91 $(
'#'+divid).append(
"<h4>" + str +
"</h4>");
94 if ((filename == null) && !online) {
95 return file_error(
'filename not specified');
98 if (itemsarr.length == 0) {
99 return file_error(
'itemname not specified');
102 var title = online ?
"Online" : (
"File: " + filename);
103 if (itemsarr.length == 1) title +=
" item: " + itemsarr[0];
104 else title +=
" items: " + itemsarr.toString();
105 document.title = title;
107 function draw_object(indx, obj) {
108 document.body.style.cursor =
'wait';
110 file_error(
"object " + itemsarr[indx] +
" not found");
113 var frame = mdi.FindFrame(itemsarr[indx],
true);
114 mdi.ActivateFrame(frame);
115 JSROOT.redraw($(frame).attr(
'id'), obj, optionsarr[indx]);
117 objpainter = JSROOT.redraw(divid, obj, optionsarr[indx]);
119 document.body.style.cursor =
'auto';
120 running_request[indx] =
false;
123 function read_object(file, indx) {
125 if (itemsarr[indx]==
"StreamerInfo")
126 draw_object(indx, file.fStreamerInfos);
128 file.ReadObject(itemsarr[indx],
function(obj) {
129 draw_object(indx, obj);
133 function request_object(indx) {
135 if (running_request[indx])
return;
137 running_request[indx] =
true;
139 var url = itemsarr[indx] +
"/root.json.gz?compact=3";
141 var itemreq = JSROOT.NewHttpRequest(url,
'object',
function(obj) {
142 if ((obj != null) && (itemsarr[indx] ===
"StreamerInfo")
143 && (obj[
'_typename'] ===
'TList'))
144 obj[
'_typename'] =
'TStreamerInfoList';
146 draw_object(indx, obj);
152 function read_all_objects() {
155 for (var i in itemsarr)
160 for (var i in itemsarr)
161 if (running_request[i]) {
162 console.log(
"Request for item " + itemsarr[i] +
" still running");
166 new JSROOT.TFile(filename,
function(file) {
167 if (file==null)
return file_error(
"file " + filename +
" cannot be opened");
169 for (var i in itemsarr) {
170 running_request[i] =
true;
171 read_object(file, i);
176 if (itemsarr.length > 1) {
177 if ((layout==null) || (layout==
'collapsible') || (layout ==
"")) {
178 var divx = 2; divy = 1;
179 while (divx*divy < itemsarr.length) {
180 if (divy<divx) divy++;
else divx++;
182 layout =
'grid' + divx +
'x' + divy;
186 mdi =
new JSROOT.TabsDisplay(divid);
188 mdi =
new JSROOT.GridDisplay(divid, layout);
191 for (var i in itemsarr)
192 mdi.CreateFrame(itemsarr[i]);
198 setInterval(read_all_objects, monitor);
200 JSROOT.RegisterForResize(
function() {
if (objpainter) objpainter.CheckResize();
if (mdi) mdi.CheckResize(); });
203 function ReadFile(filename, checkitem) {
204 var navigator_version = navigator.appVersion;
205 if (typeof ActiveXObject ==
"function") {
207 if ((navigator_version.indexOf(
"MSIE 8") != -1) ||
208 (navigator_version.indexOf(
"MSIE 7") != -1)) {
209 alert(
"You need at least MS Internet Explorer version 9.0. Note you can also use any other web browser");
215 if ((navigator_version.indexOf(
"Windows NT") == -1) &&
216 (navigator_version.indexOf(
"Safari") != -1) &&
217 (navigator_version.indexOf(
"Version/5.1.7") != -1)) {
218 alert(
"There are know issues with Safari 5.1.7 on MacOS X. It may become unresponsive or even hangs. You can use any other web browser");
223 if (filename==null) {
224 filename = $(
"#urlToLoad").val();
227 $(
"#urlToLoad").val(filename);
229 if (filename.length == 0)
return;
235 var itemname = JSROOT.GetUrlOption(
"item");
236 if (itemname) itemsarr.push(itemname);
237 var items = JSROOT.GetUrlOption(
"items");
239 items = JSON.parse(items);
240 for (var i in items) itemsarr.push(items[i]);
243 layout = JSROOT.GetUrlOption(
"layout");
244 if (layout==
"") layout = null;
246 var opt = JSROOT.GetUrlOption(
"opt");
247 if (opt) optionsarr.push(opt);
248 var opts = JSROOT.GetUrlOption(
"opts");
250 opts = JSON.parse(opts);
251 for (var i in opts) optionsarr.push(opts[i]);
256 layout = guiLayout();
258 setGuiLayout(layout);
260 var painter =
new JSROOT.HierarchyPainter(
'root',
'browser');
262 painter.SetDisplay(layout,
'right-div');
264 painter.OpenRootFile(filename,
function() {
265 painter.displayAll(itemsarr, optionsarr);
269 function ProcessResize(direct)
271 if (direct) document.body.style.cursor =
'wait';
273 JSROOT.H(
'root').CheckResize();
275 if (direct) document.body.style.cursor =
'auto';
278 function AddInteractions() {
281 var drag_move = d3.behavior.drag()
283 .on(
"dragstart",
function() {
284 d3.event.sourceEvent.preventDefault();
288 .on(
"drag",
function() {
289 d3.event.sourceEvent.preventDefault();
290 drag_sum += d3.event.dx;
292 d3.event.sourceEvent.stopPropagation();
294 .on(
"dragend",
function() {
295 d3.event.sourceEvent.preventDefault();
298 var width = d3.select(
"#left-div").style(
'width');
299 width = (parseInt(width.substr(0, width.length - 2)) + Number(drag_sum)).toString() +
"px";
300 d3.select(
"#left-div").style(
'width', width);
302 var left = d3.select(
"#separator-div").style(
'left');
303 left = parseInt(left.substr(0, left.length - 2)) + Number(drag_sum);
304 d3.select(
"#separator-div").style(
'left',left.toString() +
"px");
305 d3.select(
"#right-div").style(
'left',(left+6).toString() +
"px");
310 d3.select(
"#separator-div").call(drag_move);
312 JSROOT.RegisterForResize(ProcessResize);
316 document.getElementById(
"layout").onchange =
function() {
317 if (JSROOT.H(
'root'))
318 JSROOT.H(
'root').SetDisplay(guiLayout(),
"right-div");
323 function BuildOnlineGUI() {
324 var myDiv = $(
'#onlineGUI');
326 alert(
"You have to define a div with id='onlineGUI'!");
330 JSROOT.Painter.readStyleFromURL();
332 if (JSROOT.GetUrlOption(
"nobrowser")!=null)
333 return BuildNoBrowserGUI(
true);
335 var guiCode =
"<div id='overlay'><font face='Verdana' size='1px'> JSROOT version " + JSROOT.version +
" </font></div>"
337 guiCode +=
'<div id="left-div" class="column"><br/>'
338 +
' <h1><font face="Verdana" size="4">ROOT online server</font></h1>'
339 +
' Hierarchy in <a href="h.json">json</a> and <a href="h.xml">xml</a> format<br/><br/>'
340 +
' <input type="checkbox" name="monitoring" id="monitoring"/> Monitoring '
341 +
' <select style="padding:2px; margin-left:10px; margin-top:5px;" id="layout">'
342 +
' <option>collapsible</option><option>grid 2x2</option><option>grid 3x3</option><option>grid 4x4</option><option>tabs</option>'
344 +
' <div id="browser"></div>'
346 +
'<div id="separator-div" class="column"></div>'
347 +
'<div id="right-div" class="column"></div>';
349 $(
'#onlineGUI').empty();
350 $(
'#onlineGUI').append(guiCode);
352 var layout = JSROOT.GetUrlOption(
"layout");
353 if ((layout==
"") || (layout==null))
354 layout = guiLayout();
356 setGuiLayout(layout);
358 var monitor = JSROOT.GetUrlOption(
"monitoring");
360 var itemsarr = [], optionsarr = [];
361 var itemname = JSROOT.GetUrlOption(
"item");
362 if (itemname) itemsarr.push(itemname);
363 var items = JSROOT.GetUrlOption(
"items");
365 items = JSON.parse(items);
366 for (var i in items) itemsarr.push(items[i]);
369 var opt = JSROOT.GetUrlOption(
"opt");
370 if (opt) optionsarr.push(opt);
371 var opts = JSROOT.GetUrlOption(
"opts");
373 opts = JSON.parse(opts);
374 for (var i in opts) optionsarr.push(opts[i]);
377 var h =
new JSROOT.HierarchyPainter(
"root",
"browser");
379 h.SetDisplay(layout,
'right-div');
381 h.EnableMonitoring(monitor!=null);
383 .prop(
'checked', monitor!=null)
385 h.EnableMonitoring(this.checked);
386 if (this.checked) h.updateAll();
389 h.OpenOnline(
"",
function() {
390 h.displayAll(itemsarr, optionsarr);
393 setInterval(
function() {
if (h.IsMonitoring()) h.updateAll(); }, h.MonitoringInterval());
398 function BuildSimpleGUI() {
400 if (document.getElementById(
'onlineGUI'))
return BuildOnlineGUI();
402 var myDiv = $(
'#simpleGUI');
405 JSROOT.Painter.readStyleFromURL();
407 if (JSROOT.GetUrlOption(
"nobrowser")!=null)
408 return BuildNoBrowserGUI(
false);
410 var files = JSROOT.GetUrlOption(
"files");
411 if (files==null) files = myDiv.attr(
"files");
412 var filesdir = JSROOT.GetUrlOption(
"path");
413 if (filesdir==null) filesdir = myDiv.attr(
"path");
415 if (files==null) files =
"files/hsimple.root";
416 if (filesdir==null) filesdir =
"";
417 var arrFiles = files.split(
';');
419 var guiCode =
"<div id='overlay'><font face='Verdana' size='1px'> JSROOT version " + JSROOT.version +
" </font></div>"
421 guiCode +=
"<div id='left-div' class='column'>\n"
422 +
"<h1><font face='Verdana' size='4'>Read a ROOT file with Javascript</font></h1>\n"
423 +
"<p><b>Select a ROOT file to read, or enter a url (*): </b><br/>\n"
424 +
'<small><sub>*: Other URLs might not work because of cross site scripting protection, see e.g. <a href="https://developer.mozilla.org/en/http_access_control">developer.mozilla.org/http_access_control</a> on how to avoid it.</sub></small></p>'
426 +
'<div style="margin-left:10px;">'
427 +
'<input type="text" name="state" value="" size="30" id="urlToLoad"/><br/>'
428 +
'<select name="s" size="1" '
429 +
'onchange="document.ex.state.value = document.ex.s.options[document.ex.s.selectedIndex].value;document.ex.s.selectedIndex=0;document.ex.s.value=\'\'">'
430 +
'<option value = " " selected = "selected"> </option>';
431 for (var i=0; i<arrFiles.length; i++) {
432 guiCode +=
'<option value = "' + filesdir + arrFiles[i] +
'">' + arrFiles[i] +
'</option>';
434 guiCode +=
'</select>'
436 +
'<input style="padding:2px; margin-left:10px; margin-top:5px;"'
437 +
' onclick="ReadFile()" type="button" title="Read the Selected File" value="Load"/>'
438 +
'<input style="padding:2px; margin-left:10px;"'
439 +
' onclick="ResetUI()" type="button" title="Clear All" value="Reset"/>'
440 +
'<select style="padding:2px; margin-left:10px; margin-top:5px;" id="layout">'
441 +
' <option>collapsible</option><option>grid 2x2</option><option>grid 3x3</option><option>grid 4x4</option><option>tabs</option>'
445 +
'<div id="browser"></div>'
447 +
'<div id="separator-div" class="column"></div>'
448 +
'<div id="right-div" class="column"></div>';
450 $(
'#simpleGUI').empty();
451 $(
'#simpleGUI').append(guiCode);
456 var filename = JSROOT.GetUrlOption(
"file");
457 if ((typeof filename ==
'string') && (filename.length>0))
458 ReadFile(filename,
true);