otsdaq_utilities  v2_04_01
DesktopDashboard.js
1 //=====================================================================================
2 //
3 // Created Dec, 2012
4 // by Ryan Rivera ((rrivera at fnal.gov))
5 //
6 // DesktopDashboard.js
7 //
8 // This is the desktop code for the user interface for ots. ots is the DAQ
9 // and control software for the Fermi Strips Telescope.
10 //
11 // The desktop consists of a dashboard and an arbitrary amount of windows
12 //
13 //=====================================================================================
14 
15 
16 if (typeof Debug == 'undefined')
17  console.log('ERROR: Debug is undefined! Must include Debug.js before Desktop.js');
18 
19 if (typeof Desktop == 'undefined')
20  console.log('ERROR: Desktop is undefined! Must include Desktop.js before DesktopDashboard.js');
21 else {
22 
23 
26  //define Desktop.createDashboard to return dashboard class
29  Desktop.createDashboard = function(z) {
30  if(false === (this instanceof Desktop.createDashboard)) {
31  //here to correct if called as "var v = Desktop.createDesktop();"
32  // instead of "var v = new Desktop.createDesktop();"
33  return new Desktop.createDashboard(z);
34  }
35 
36 
37 
38  //------------------------------------------------------------------
39  //list of members functions ----------------------
40  //------------------------------------------------------------------
41  //private:
42  //public:
43  //displayConnectionStatus(connected) //bool connected
44 
45 
46 
47 
48 
49 
50  //------------------------------------------------------------------
51  //create private members variables ----------------------
52  //------------------------------------------------------------------
53  var _defaultDashboardColor = "rgb(0,40,85)";
54 
55 
56 
57  //all units in pixels unless otherwise specified
58 
59  var _defaultDashboardHeight = 41;
60  var _defaultWindowDashboardWidth = 200;
61  var _defaultWindowDashboardMinWidth = 50;
62 
63  var _windowDashboardWidth = _defaultWindowDashboardWidth;
64 
65  Debug.log("window.parent.window.location.hash=" + window.parent.window.location.hash,
66  Debug.MED_PRIORITY);
67  var _displayWindowDashboard = //default window dashboard view
68  window.parent.window.location.hash[1]?
69  (window.parent.window.location.hash[1] | 0):1;
70  var _windowDashboard,_topBar,_showDesktopBtn,_fullScreenBtn,_fullScreenRefreshBtn;
71 
72  var _windowDashboardWindowCSSRule; //e.g. _var.style.width = "100px"
73 
74  var _layoutDropDownDisplayed = false;
75  var _layoutMenuItems = [];
76  var numOfUserLayouts = 5;
77  var numOfSystemLayouts = 5;
78  for(var i=0;i<numOfSystemLayouts;++i)
79  _layoutMenuItems.push("System Preset-" + (i+1));
80  _layoutMenuItems.push("---");
81  for(var i=0;i<numOfUserLayouts;++i)
82  _layoutMenuItems.push("User Preset-" + (i+1));
83 
84  var _dashboardElement, _dashboardColorPostbox;
85 
86  var _deepClickTimer = 0;
87  //------------------------------------------------------------------
88  //create public members variables ----------------------
89  //------------------------------------------------------------------
90  this.dashboardElement;
91 
92 
93 
94  //------------------------------------------------------------------
95  //create PRIVATE members functions ----------------------
96  //------------------------------------------------------------------
97  var _toggleWindowDashboard = function(event,setValue) {
98 
99  if(setValue !== undefined)
100  _displayWindowDashboard = setValue;
101  else //toggle
102  _displayWindowDashboard = !_displayWindowDashboard;
103 
104  var newURL = window.parent.window.location.pathname +
105  window.parent.window.location.search +
106  "#"+
107  (_displayWindowDashboard?"1":"0");
108 
109  //update browser url so refresh will give same desktop experience
110  if(!Desktop.isWizardMode())
111  window.parent.window.history.replaceState('ots', 'ots', newURL);
112  else
113  window.parent.window.history.replaceState('ots wiz', 'ots wiz', newURL);
114 
115  _windowDashboard.style.display = _displayWindowDashboard?"inline":"none";
116  Desktop.desktop.redrawDesktop();
117  }
118 
119  //_refreshTitle() ~~~
120  // private function to refresh title name based on dashboard size
121  // clip text if too long
122  var _refreshTitle = function() {
123 
124  var el,winIndex;
125  var hdrW = _windowDashboardWidth - 14; //2*7px padding
126  for(var i=0;i<Desktop.desktop.getNumberOfWindows();++i) {
127  el = document.getElementById('DesktopDashboard-windowDashboard-win'+i);
128  winIndex = document.getElementById('DesktopDashboard-windowDashboard-winIndex'+i).innerHTML;
129  el.innerHTML = Desktop.desktop.getWindowNameByIndex(winIndex) +
130  (Desktop.desktop.getWindowSubNameByIndex(winIndex)==""?"":" - ") +
131  Desktop.desktop.getWindowSubNameByIndex(winIndex);
132  while(el.scrollWidth > hdrW && el.innerHTML.length > 4)
133  el.innerHTML = el.innerHTML.substr(0,el.innerHTML.length-4)+"...";
134 
135  el.innerHTML += "<div class='hiddenDiv' " + //add hidden window index back in for future use
136  "id='DesktopDashboard-windowDashboard-winIndex"+i+"'>"+ winIndex + "</div>";
137  }
138  }
139 
140  var _redrawDashboard = function() {
141 
142  _topBar.style.left = Desktop.desktop.getDesktopX()+"px";
143  _topBar.style.top = Desktop.desktop.getDesktopY()+"px";
144  _topBar.style.width = Desktop.desktop.getDesktopWidth()+"px";
145  _topBar.style.height = _defaultDashboardHeight+"px";
146 
147  _windowDashboard.style.left = Desktop.desktop.getDesktopX()+"px";
148  _windowDashboard.style.top = Desktop.desktop.getDesktopY()+_defaultDashboardHeight+"px";
149  _windowDashboard.style.width = _windowDashboardWidth+"px";
150  _windowDashboardWindowCSSRule.style.width = (_windowDashboardWidth-34)+"px"; //2*7px padding, 2*10px margin
151  _refreshTitle();
152  _windowDashboard.style.height = Desktop.desktop.getDesktopHeight()-(Desktop.desktop.getDesktopY()+_defaultDashboardHeight)+"px";
153 
154  }
155 
156  //get CSS style rule fpr dasboard window boxes
157  var _getDashboardWindowWidthCSSRule = function() {
158 
159  var i,j;
160  for(i=0;i<document.styleSheets.length;++i) {
161  Debug.log(document.styleSheets[i].href);
162  if(document.styleSheets[i].href && document.styleSheets[i].href.split('/').pop() ==
163  "Desktop.css") {
164  for(j=0;j<document.styleSheets[i].cssRules.length;++j) {
165  if(document.styleSheets[i].cssRules[j].selectorText ==
166  "#Desktop .DesktopDashboard-windowDashboard-win")
167  return document.styleSheets[i].cssRules[j]; //success!!
168  }
169  break; //failed
170  }
171  }
172  if(i == document.styleSheets.length) Debug.log("FAIL -- Could not locate CSS Rule for Dashboard Window.",Debug.HIGH_PRIORITY);
173  return 0;
174  }
175 
176 
177  //tile the desktop windows in various ways
178  var _windowOrganizeMode = -1;
179  var _windowOrganizeModeTimeout = 0;
180  var _windowDashboardOrganize = function() {
181 
182  //reset mode after 10 seconds
183  clearTimeout(_windowOrganizeModeTimeout);
184  _windowOrganizeModeTimeout = setTimeout(function() {_windowOrganizeMode = -1; Debug.log("Reseting _windowOrganizeMode.");},10000);
185 
186 
187  var win;
188 
189  var dx = Desktop.desktop.getDesktopContentX(), dy = Desktop.desktop.getDesktopContentY(),
190  dw = Desktop.desktop.getDesktopContentWidth(), dh = Desktop.desktop.getDesktopContentHeight();
191  var xx, yy;
192 
193  var numOfWindows = Desktop.desktop.getNumberOfWindows();
194 
195  //cycle through different modes where the various windows get a bigger spot
196  if(++_windowOrganizeMode < 0 || _windowOrganizeMode > numOfWindows)
197  _windowOrganizeMode = 0; //wrap-around
198 
199  //for all modes, except 0, add a spot
200  // and allow that window to use the first two spots
201  if(_windowOrganizeMode && numOfWindows > 1)
202  ++numOfWindows;
203 
204  if(1) //tile code
205  {
206  var rows = 1;
207  var ww = Math.floor(dw/numOfWindows);
208  var wh = dh;
209 
210  while(ww*2 < wh) {
211  //Debug.log("Desktop Dashboard Organize " + ww + " , " + wh,Debug.LOW_PRIORITY);
212  ww = Math.floor(dw/Math.ceil(numOfWindows/++rows)); wh = Math.floor(dh/rows);
213  } //have too much height, so add row
214  xx = dx; yy = dy;
215  //Debug.log("Desktop Dashboard Organize " + ww + " , " + wh,Debug.LOW_PRIORITY);
216  var cols = Math.ceil(numOfWindows/rows);
217  Debug.log("Desktop Dashboard Organize r" + rows + " , c" + cols,Debug.LOW_PRIORITY);
218 
219 
220  //we know size, now place windows
221 
222  //first the bigger one
223  var ic = 0; //counter for new row
224  if(_windowOrganizeMode && numOfWindows > 1)
225  {
226  var i = _windowOrganizeMode-1; //target window index
227 
228  win = Desktop.desktop.getWindowByIndex(
229  document.getElementById('DesktopDashboard-windowDashboard-winIndex'+i).innerHTML);
230 
231  if(win.isMinimized()) win.unminimize();
232  if(win.isMaximized()) win.unmaximize();
233 
234  //make double wide
235  win.setWindowSizeAndPosition(xx,yy,ww*2,wh);
236 
237  xx += ww*2;
238  ic+=2;
239  if((ic)%cols==0){xx = dx; yy += wh;} //start new row
240  // Debug.log("Desktop Dashboard Organize i:" + i + " - " + (ic)%cols + " - "
241  // + xx + " , " + yy + " :: "
242  // + ww*2 + " , " + wh,Debug.LOW_PRIORITY);
243  }
244 
245  //now the other windows
246  for(var i=0;i<Desktop.desktop.getNumberOfWindows();++i) {
247 
248  if(_windowOrganizeMode && numOfWindows > 1 && i == _windowOrganizeMode-1) continue; //skip the window already placed
249 
250  win = Desktop.desktop.getWindowByIndex(
251  document.getElementById('DesktopDashboard-windowDashboard-winIndex'+i).innerHTML);
252 
253  if(win.isMinimized()) win.unminimize();
254  if(win.isMaximized()) win.unmaximize();
255 
256  //if last window fill remaining space rows*cols > numOfWindows
257  if(i == Desktop.desktop.getNumberOfWindows()-1)
258  win.setWindowSizeAndPosition(xx,yy,ww*(1 + (rows*cols - numOfWindows)),wh);
259  else
260  win.setWindowSizeAndPosition(xx,yy,ww,wh);
261 
262  xx += ww;
263  if((++ic)%cols==0){xx = dx; yy += wh;} //start new row
264  // Debug.log("Desktop Dashboard Organize i:" + i + " - " + (ic)%cols + " - "
265  // + xx + " , " + yy + " :: "
266  // + ww + " , " + wh,Debug.LOW_PRIORITY);
267  }
268  Desktop.desktop.redrawDashboardWindowButtons();
269  }
270 
271  Debug.log("Desktop Dashboard Organize Mode: " + _windowOrganizeMode,Debug.LOW_PRIORITY);
272  }
273 
274  var _windowDashboardMinimizeAll = function() {
275  var win;
276  for(var i=0;i<Desktop.desktop.getNumberOfWindows();++i) {
277  win = Desktop.desktop.getWindowByIndex(i);
278  win.minimize(); if(!win.isMinimized()) win.minimize(); //minimize twice, in case was mazimized
279 
280  }
281  }
282 
283  var _windowDashboardRestoreAll = function() {
284  var win;
285  for(var i=0;i<Desktop.desktop.getNumberOfWindows();++i) {
286  win = Desktop.desktop.getWindowByIndex(i);
287  win.unminimize();
288  if (win.isMaximized())
289  Desktop.desktop.setForeWindow(win);
290 
291  }
292  //Desktop.desktop.setForeWindow(Desktop.desktop.getWindowByIndex(0));
293  }
294 
295 
296  var _windowDashboardToggleWindows = function () {
297 
298 
299  // if (Desktop.desktop.getForeWindow() &&
300  // Desktop.desktop.getForeWindow().isMinimized())
301  // _windowDashboardRestoreAll();
302  //else
303  // _windowDashboardMinimizeAll();
304 
305  if(_showDesktopBtn.innerHTML.indexOf(">Show Desktop</a>") !== -1)
306  _windowDashboardMinimizeAll();
307  else
308  _windowDashboardRestoreAll();
309 
310  Desktop.desktop.redrawDashboardWindowButtons();
311 
312 // _showDesktopBtn.innerHTML = "<a href='#' title='Click to toggle minimize/restore all windows'>" +
313 // ((Desktop.desktop.getForeWindow() &&
314 // Desktop.desktop.getForeWindow().isMinimized())?"Restore Windows":"Show Desktop") + "</a>";
315  }
316 
317  var _windowDashboardRefresh = function() {
318  updateWindows();
319  Debug.log("Window refreshed.");
320  }
321 
322  //_windowDashboardLayoutsDropDown ~
323  // toggles default layout drop down menu
324  var _windowDashboardLayoutsDropDown = function() {
325  _layoutDropDownDisplayed = !_layoutDropDownDisplayed;
326  Debug.log("Desktop _windowDashboardDefaultsDropDown " +
327  _layoutDropDownDisplayed,Debug.LOW_PRIORITY);
328 
329  var el;
330  //remove drop down if already present
331  el = document.getElementById("DesktopDashboard-defaults-dropdown");
332  if(el) { //should not be any DesktopDashboard-defaults-dropdown div so delete
333 
334  Debug.log("found DesktopDashboard-defaults-dropdown div and deleted",Debug.LOW_PRIORITY);
335  el.parentNode.removeChild(el);
336  }
337  if(!_layoutDropDownDisplayed) return; //do not create if closing
338 
339  //create default dropdown menu element
340  el = document.createElement("div");
341  el.setAttribute("id", "DesktopDashboard-defaults-dropdown");
342  el.style.backgroundColor = _defaultDashboardColor;
343  var str = "";
344  for(var i=0;i<_layoutMenuItems.length;++i)
345  if(_layoutMenuItems[i] == "---") //horizontal line
346  str += "<center><hr width='75%' style='border:1px solid; margin-top:5px'/></center>";
347  else {
348  str += "<a href='#' onmouseup='Desktop.desktop.dashboard.windowDashboardLayoutsDropDown(); "
349  + "Desktop.desktop.defaultLayoutSelect("+i+"); return false;'>"
350  + _layoutMenuItems[i] + "</a>";
351 
352  str += "<a onclick='Desktop.openNewBrowserTab(" +
353  "\"Desktop.openLayout(" + i + ")\",\"\"," +
354  "\"\",0 /*unique*/);' " + //end onclick
355  "title='Click to open the layout in a new tab' " +
356  ">"
357  str += "<img style='width:11px;margin-left:10px;' " +
358  "src='/WebPath/images/dashboardImages/icon-New-Tab.png'>";
359  str += "</a>";
360 
361  if(i<_layoutMenuItems.length-1)
362  str += "<br/>";
363  }
364 
365  el.innerHTML = str;
366  _dashboardElement.appendChild(el);
367  }
368 
369  //------------------------------------------------------------------
370  //create PUBLIC members functions ----------------------
371  //------------------------------------------------------------------
372  this.getDashboardHeight = function() { return _defaultDashboardHeight;}
373  this.getDashboardWidth = function() { return _displayWindowDashboard?_windowDashboardWidth:0;}
374  this.setDashboardWidth = function(w) { if(w > _defaultWindowDashboardMinWidth) _windowDashboardWidth = w; Desktop.desktop.redrawDesktop();}
375 
376  this.toggleWindowDashboard = _toggleWindowDashboard;
377  this.redrawDashboard = _redrawDashboard;
378  this.windowDashboardLayoutsDropDown = _windowDashboardLayoutsDropDown;
379  this.windowDashboardOrganize = _windowDashboardOrganize;
380 
381  this.updateWindows = function() {
382 
383  _windowDashboard.innerHTML = "";
384 
385  var mySortArrId = [];
386  var mySortArrIndex = [];
387  for(var i=0;i<Desktop.desktop.getNumberOfWindows();++i) {
388  mySortArrId.push(Desktop.desktop.getWindowByIndex(i).getWindowId());
389  mySortArrIndex.push(i);
390  }
391 
392  //sort by id
393  for(var i=0;i<mySortArrId.length-1;++i) {
394  var min = i;
395  for(var j=i+1;j<mySortArrId.length;++j)
396  if(mySortArrId[j] < mySortArrId[min])
397  min = j;
398 
399  //have min, swap to i
400  var tmp;
401  tmp = mySortArrId[i];
402  mySortArrId[i] = mySortArrId[min];
403  mySortArrId[min] = tmp;
404  tmp = mySortArrIndex[i];
405  mySortArrIndex[i] = mySortArrIndex[min];
406  mySortArrIndex[min] = tmp;
407  }
408 
409  //have sorted by id, create window buttons for dashboard
410  var tmpClassStr, defClassStr = "DesktopDashboard-windowDashboard-win";
411 
412  for(var i=0;i<Desktop.desktop.getNumberOfWindows();++i) {
413 
414  tmpClassStr = defClassStr + //if foreground window, append class
415  ((mySortArrIndex[i] == Desktop.desktop.getNumberOfWindows()-1)?
416  " DesktopDashboard-windowDashboard-foreWin":"");
417  _windowDashboard.innerHTML +=
418  "<div " +
419  "onmouseup='Desktop.desktop.dashboard.handleDashboardWinMouseUp(event," +
420  //"onmouseup='Desktop.desktop.clickedWindowDashboard(" +
421  mySortArrId[i] + ");' " +
422  "onmousedown='Desktop.desktop.dashboard.handleDashboardWinMouseDown(event," +
423  //"onmouseup='Desktop.desktop.clickedWindowDashboard(" +
424  mySortArrId[i] + ");' " +
425  //"onmousedown='Desktop.handleWindowButtonDown(event);' " + //eat window button down event
426  "class='" + tmpClassStr + "' " +
427  "id='DesktopDashboard-windowDashboard-win"+i+"'>" +
428  Desktop.desktop.getWindowNameByIndex(mySortArrIndex[i]) + " - " +
429  Desktop.desktop.getWindowSubNameByIndex(mySortArrIndex[i]) +
430  "<div class='hiddenDiv' " +
431  "id='DesktopDashboard-windowDashboard-winIndex"+i+"'>"+ mySortArrIndex[i] +
432  "</div>" +
433  "</div>\n";
434  }
435 
436  _refreshTitle();
437  }
438 
439  this.redrawFullScreenButton = function() {
440  _fullScreenBtn.innerHTML = "<a href='#' title='Click to toggle full screen mode for current window'>" +
441  ((Desktop.desktop.getForeWindow() &&
442  Desktop.desktop.getForeWindow().isMaximized())?
443  "Exit Full Screen":"Full Screen") + "</a>";
444 
445  }
446 
447  this.redrawRefreshButton = function() {
448  _fullScreenRefreshBtn.innerHTML = "<a href='#' style='font-size:16px' title='Click to reload the desktop and all windows'> ↻ </a>";
449  _fullScreenRefreshBtn.style.height = "16px";
450  _fullScreenRefreshBtn.style.padding = "3px 10px 7px 10px";
451  }
452 
453  this.redrawShowDesktopButton = function() {
454  _showDesktopBtn.innerHTML = "<a href='#' title='Click to toggle minimize/restore all windows'>" +
455  ((Desktop.desktop.getForeWindow() &&
456  Desktop.desktop.getForeWindow().isMinimized())?
457  "Restore Windows":"Show Desktop") + "</a>";
458  //Debug.log("Desktop.desktop.getForeWindow().isMinimized() " + Desktop.desktop.getForeWindow().isMinimized());
459  }
460 
461  this.getDefaultDashboardColor = function() { return _defaultDashboardColor; }
462 
463  this.setDefaultDashboardColor = function(color) {
464  _defaultDashboardColor = color;
465  _dashboardColorPostbox.innerHTML = _defaultDashboardColor; //set to color string
466 
467  _topBar.style.backgroundColor = _defaultDashboardColor;
468  _windowDashboard.style.backgroundColor = _defaultDashboardColor;
469  }
470 
471  var _oldUserNameWithLock = "";
472  this.displayUserLock = function(usernameWithLock, el) {
473  if(!el)
474  el = document.getElementById("DesktopDashboard-userWithLock");
475 
476  var user = Desktop.desktop.login.getUsername();
477  var data = "";
478  data += "lock=" + ((!usernameWithLock || usernameWithLock == "")?"1":"0") + "&";
479  data += "username=" + user;
480 
481  var jsReq =
482  "Desktop.XMLHttpRequest(\"" +
483  "Request?RequestType=setUserWithLock&accounts=1\"," +
484  "\"" + data + "\",Desktop.desktop.dashboard.handleSetUserWithLock)";
485 
486  if(!usernameWithLock || usernameWithLock == "")
487  {
488  //nobody has lock
489  var str = "";
490  str += "<a href='javascript:" + jsReq + "'" +
491  "title='Click to lockout the system and take the ots Lock'>";
492  str += "<img " +
493  "src='/WebPath/images/dashboardImages/icon-Settings-Unlock.png'>";
494  str += "</a>";
495  el.innerHTML = str;
496  _oldUserNameWithLock = "";
497  el.style.display = "block";
498  return;
499  }
500 
501  if(_oldUserNameWithLock == usernameWithLock &&
502  el.style.display == "block")
503  return; //no need to re-write element
504 
505  var str = "";
506  if(usernameWithLock != user) //not user so cant unlock
507  str = "<img src='/WebPath/images/dashboardImages/icon-Settings-LockDisabled.png' " +
508  "title='User " +
509  usernameWithLock + " has the ots Lock'>";
510  else //this is user so can unlock
511  {
512  str += "<a href='javascript:" + jsReq + "' " +
513  "title='Click to unlock the system and release the ots Lock'>";
514  str += "<img " +
515  "src='/WebPath/images/dashboardImages/icon-Settings-Lock.png'>";
516  str += "</a>";
517  }
518 
519  el.innerHTML = str;
520  el.style.display = "block";
521 
522  _oldUserNameWithLock = usernameWithLock;
523  }
524 
525  this.handleSetUserWithLock = function(req) {
526  Debug.log(req);
527  //extract alert from server
528  var serverAlert = Desktop.getXMLValue(req,"server_alert");
529  if(serverAlert) Debug.log("Message from Server: " + serverAlert, Debug.HIGH_PRIORITY);
530 
531  Desktop.desktop.dashboard.displayUserLock(
532  Desktop.getXMLValue(req,"username_with_lock"));
533 
534  Desktop.desktop.resetDesktop(); //soft reset attempt
535  }
536 
537 
538  //displayConnectionStatus ~~
539  // bool connected
540  this.displayConnectionStatus = function(connected) {
541  var el = document.getElementById("DesktopDashboard-serverConnectionStatus");
542 
543  if(connected)
544  {
545  el.style.display = "none";
546  el.innerHTML = "";
547  }
548  else
549  {
550  el.innerHTML = "*** <a onclick='Desktop.desktop.resetDesktop();//soft reset attempt' " +
551  "style='cursor:pointer; color:rgb(255,150,0);'>Disconnected</a> ***";
552  el.style.display = "block";
553 
554  //hide user with lock icon (because it usually looks bad when disconnected)
555  document.getElementById("DesktopDashboard-userWithLock").style.display = "none";
556  }
557  }
558 
559  //handleDashboardWinMouseUp ~~
560  this.handleDashboardWinMouseUp = function(event, winId) {
561  if(_deepClickTimer)
562  {
563  window.clearTimeout(_deepClickTimer);
564  _deepClickTimer = 0;
565  }
566  Desktop.desktop.clickedWindowDashboard(winId);
567  }
568 
569  //handleDashboardWinMouseDown ~~
570  this.handleDashboardWinMouseDown = function(event, winId) {
571  event.cancelBubble = true; //prevent default behavior
572  event.preventDefault();
573  _deepClickTimer = window.setTimeout(function() {
574 
575  var targetWin = Desktop.desktop.getWindowById(winId);
576  Debug.log("Create Dashboard Window Menu " +
577  targetWin.isMaximized() + "-" + targetWin.isMinimized());
578 
579  var menuItems = [
580  targetWin.isMaximized()?
581  "Restore Window":"Maximize Window",
582  targetWin.isMinimized()?
583  "Restore Window":"Minimize Window",
584  "Close Window"
585  ];
586  var menuItemHandlers = [
587  "Desktop.desktop.maximizeWindowById("+ winId + ")",
588  "Desktop.desktop.minimizeWindowById("+ winId + ")",
589  "Desktop.desktop.closeWindowById("+ winId + ")",
590  ];
591  Debug.log("createEditTableMenu()");
592  SimpleContextMenu.createMenu(
593  menuItems,
594  menuItemHandlers,
595  "DesktopIconContextMenu", //element ID
596  event.pageX-1,event.pageY-1, //top left position
597  Desktop.desktop.dashboard.getDefaultDashboardColor(), //primary color
598  "white" //secondary color
599  );
600 
601  },500); //end timeout handler
602  }
603 
604  //------------------------------------------------------------------
605  //handle class construction ----------------------
606  //------------------------------------------------------------------
607 
608  this.dashboardElement = _dashboardElement = document.createElement("div");
609  this.dashboardElement.setAttribute("class", "DesktopDashboard");
610  this.dashboardElement.setAttribute("id", "DesktopDashboard");
611 
612  //create top bar
613  _topBar = document.createElement("div");
614  _topBar.setAttribute("class", "DesktopDashboard-topBar");
615  _topBar.style.position = "absolute";
616  _topBar.style.zIndex = z;
617  _topBar.style.backgroundColor = _defaultDashboardColor;
618 
619  var tmpBtn = document.createElement("div");
620  tmpBtn.setAttribute("class", "DesktopDashboard-button DesktopDashboard-button-left");
621  tmpBtn.innerHTML = "<a href='#' title='Click to toggle side Window Bar'>" +
622  "<img id='dashboard_bi_arrow' src='/WebPath/images/dashboardImages/icon-Bi-arrow-gray.png'></a>";
623  tmpBtn.onmouseup = _toggleWindowDashboard;
624  _topBar.appendChild(tmpBtn);
625 
626  tmpBtn = document.createElement("div");
627  tmpBtn.setAttribute("class", "DesktopDashboard-button DesktopDashboard-button-left");
628  tmpBtn.innerHTML = "<a href='#' title='Click to open default window layouts'>Layouts</a>";
629  tmpBtn.onmouseup = _windowDashboardLayoutsDropDown;
630  _topBar.appendChild(tmpBtn);
631 
632  tmpBtn = document.createElement("div");
633  tmpBtn.setAttribute("class", "DesktopDashboard-button DesktopDashboard-button-left");
634  tmpBtn.innerHTML = "<a href='#' title='Click to automatically arrange and tile windows'>Tile</a>";
635  tmpBtn.onmouseup = _windowDashboardOrganize;
636  _topBar.appendChild(tmpBtn);
637 
638  _showDesktopBtn = document.createElement("div");
639  _showDesktopBtn.setAttribute("class", "DesktopDashboard-button DesktopDashboard-button-left");
640  _showDesktopBtn.innerHTML = "<a href='#' title='Click to toggle minimize/restore all windows'>Show Desktop</a>";
641  _showDesktopBtn.onmouseup = _windowDashboardToggleWindows;
642  _topBar.appendChild(_showDesktopBtn);
643 
644  _fullScreenBtn = document.createElement("div");
645  _fullScreenBtn.setAttribute("class", "DesktopDashboard-button DesktopDashboard-button-left");
646  this.redrawFullScreenButton();
647  _fullScreenBtn.onmouseup = Desktop.desktop.toggleFullScreen;
648  _topBar.appendChild(_fullScreenBtn);
649 
650  _fullScreenRefreshBtn = document.createElement("div");
651  _fullScreenRefreshBtn.setAttribute("class", "DesktopDashboard-button DesktopDashboard-button-left");
652  this.redrawRefreshButton();
653  _fullScreenRefreshBtn.onmouseup = Desktop.handleFullScreenWindowRefresh;
654  _topBar.appendChild(_fullScreenRefreshBtn);
655 
656  //user with lock on far right.. because it is the highest priority for user to see
657  tmpBtn = document.createElement("div");
658  tmpBtn.setAttribute("class", "DesktopDashboard-button-right");
659  tmpBtn.setAttribute("id", "DesktopDashboard-serverConnectionStatus");
660  tmpBtn.setAttribute("title", "Click to attempt to reconnect the server. You could also try refreshing the page, or if the problem persists contact the ots admins.");
661  tmpBtn.style.display = "none";
662  tmpBtn.style.color = "rgb(255,150,0)";
663  _topBar.appendChild(tmpBtn);
664 
665  //user with lock on far right.. because it is the highest priority for user to see
666  tmpBtn = document.createElement("div");
667  tmpBtn.setAttribute("class", "DesktopDashboard-button-right");
668  tmpBtn.setAttribute("id", "DesktopDashboard-userWithLock");
669  tmpBtn.style.display = "none";
670  tmpBtn.style.marginTop = "4px";
671  _topBar.appendChild(tmpBtn);
672 
673  tmpBtn = document.createElement("div");
674  tmpBtn.setAttribute("class", "DesktopDashboard-button-right");
675  tmpBtn.innerHTML = "<a target='_blank' href='" +
676  "https://cdcvs.fnal.gov/redmine/projects/otsdaq/wiki/Otsdaq_User_Manual" +
677  " 'title='Click to open ots documentation in a new tab' ><img src='/WebPath/images/dashboardImages/icon-Help.png'></a>";
678  _topBar.appendChild(tmpBtn);
679 
680  if(Desktop.desktop.security == Desktop.SECURITY_TYPE_DIGEST_ACCESS ||
681  Desktop.desktop.security == Desktop.SECURITY_TYPE_NONE) //dont show features if in wizard mode
682  {
683  tmpBtn = document.createElement("div");
684  tmpBtn.setAttribute("class", "DesktopDashboard-button-right DesktopDashboard-user-account DesktopDashboard-user-logout");
685  tmpBtn.innerHTML = "<a href='#' title='Click to sign out of your account'>Sign out</a>";
686  tmpBtn.onmouseup = Desktop.logout;
687  _topBar.appendChild(tmpBtn);
688 
689  tmpBtn = document.createElement("div");
690  tmpBtn.setAttribute("class", "DesktopDashboard-button-right");
691  tmpBtn.setAttribute("id", "DesktopDashboard-settings-icon");
692  tmpBtn.innerHTML = "<a href='Javascript:var win = Desktop.desktop.addWindow(\"Settings\",Desktop.desktop.login.getUsername()," +
693  "\"/WebPath/html/UserSettings.html\",true);' title='Click to open settings window'><img src='/WebPath/images/dashboardImages/icon-Settings.png'></a>";
694  _topBar.appendChild(tmpBtn);
695 
696  tmpBtn = document.createElement("div");
697  tmpBtn.setAttribute("class", "DesktopDashboard-user-account");
698  tmpBtn.setAttribute("id", "DesktopDashboard-user-displayName");
699  tmpBtn.innerHTML = "";
700  _topBar.appendChild(tmpBtn);
701  }
702  else
703  Debug.log("Desktop Dashboard is in Wizard mode",Debug.LOW_PRIORITY);
704 
705  this.dashboardElement.appendChild(_topBar);
706  Debug.log("Desktop Dashboard Top Bar created",Debug.LOW_PRIORITY);
707 
708  //create window dashboard
709  _windowDashboard = document.createElement("div");
710  _windowDashboard.setAttribute("id", "DesktopDashboard-windowDashboard");
711  _windowDashboard.style.position = "absolute";
712  _windowDashboard.style.zIndex = z;
713  _windowDashboard.style.backgroundColor = _defaultDashboardColor;
714  _toggleWindowDashboard(0,_displayWindowDashboard); //set initial value
715  this.updateWindows();
716  this.dashboardElement.appendChild(_windowDashboard);
717 
718 
719  _dashboardColorPostbox = document.createElement("div");
720  _dashboardColorPostbox.setAttribute("id", "DesktopContent-dashboardColorPostbox");
721  _dashboardColorPostbox.style.display = "none";
722  _dashboardColorPostbox.innerHTML = _defaultDashboardColor; //init to color string
723  this.dashboardElement.appendChild(_dashboardColorPostbox);
724 
725 
726  //add mouse handlers
727  _windowDashboard.onmousemove = Desktop.handleWindowMouseMove;
728  _windowDashboard.onmousedown = Desktop.handleWindowMouseDown;
729  _windowDashboard.onmouseup = Desktop.handleWindowMouseUp;
730 
731  _windowDashboardWindowCSSRule = _getDashboardWindowWidthCSSRule(); //get CSS rule for the dashboard window divs
732 
733  Debug.log("Desktop Window Dashboard created",Debug.LOW_PRIORITY);
734 
735  Debug.log("Desktop Dashboard created",Debug.LOW_PRIORITY);
736  }
737 
738 }
739 
740 
741 
742 
743 
744 
745 
746 
747 
748