00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 if (typeof Debug == 'undefined')
00017 alert('ERROR: Debug is undefined! Must include Debug.js before DesktopIcons.js');
00018
00019 if (typeof SimpleContextMenu == 'undefined')
00020 Debug.log('ERROR: SimpleContextMenu is undefined! Must include SimpleContextMenu.js before DesktopIcons.js',Debug.HIGH_PRIORITY);
00021 if (typeof MultiSelectBox == 'undefined')
00022 Debug.log('ERROR: MultiSelectBox is undefined! Must include MultiSelectBox.js before DesktopIcons.js',Debug.HIGH_PRIORITY);
00023 if (typeof DesktopContent == 'undefined')
00024 Debug.log('ERROR: DesktopContent is undefined! Must include DesktopContent.js before DesktopIcons.js',Debug.HIGH_PRIORITY);
00025
00026
00027 if (typeof Desktop == 'undefined')
00028 Debug.log('ERROR: Desktop is undefined! Must include Desktop.js before DesktopIcons.js',Debug.HIGH_PRIORITY);
00029 else {
00030
00031
00034
00037 Desktop.createIcons = function(userPermissions, z) {
00038 if(false === (this instanceof Desktop.createIcons)) {
00039
00040
00041 return new Desktop.createIcons(userPermissions, z);
00042 }
00043
00044
00045
00046
00047
00048
00049
00050
00051 var _defaultIconsMargin = 50;
00052 var _defaultIconWidth = 64;
00053 var _defaultIconHeight = 64;
00054 var _defaultIconTextWidth = 90;
00055 var _defaultIconTextHeight = 32;
00056 var _permissions = 0;
00057
00058 var _iconsElement;
00059
00060 var _numOfIcons = 0;
00061
00062 var _deepClickTimer = 0;
00063
00064 var _folders = [{},[]];
00065
00066
00067
00068 var _openFolderPtr;
00069
00070 var _openFolderPath = "";
00071 var _openFolderElement;
00072
00073 var _iconNameToPathMap = {};
00074
00075
00076
00077
00078
00079 this.iconsElement;
00080 this.folders = _folders;
00081 this.deepClickTimer = _deepClickTimer;
00082 this.iconNameToPathMap = _iconNameToPathMap;
00083
00084
00085
00086
00087
00088
00089 var _redrawIcons = function() {
00090
00091 _iconsElement.style.left = Desktop.desktop.getDesktopContentX()+_defaultIconsMargin+"px";
00092 _iconsElement.style.top = Desktop.desktop.getDesktopContentY()+_defaultIconsMargin+"px";
00093 _iconsElement.style.width = Desktop.desktop.getDesktopContentWidth()-_defaultIconsMargin-_defaultIconsMargin+"px";
00094 _iconsElement.style.height = Desktop.desktop.getDesktopContentHeight()-_defaultIconsMargin-_defaultIconsMargin+"px";
00095
00096 }
00097
00098
00099
00100
00101
00102 this.redrawIcons = _redrawIcons;
00103
00104
00105 this.resetWithPermissions = function(permissions) {
00106 Debug.log("Desktop resetWithPermissions " + permissions,Debug.LOW_PRIORITY);
00107
00108 _permissions = permissions;
00110
00111
00112 if(!Desktop.isWizardMode())
00113 {
00114 Desktop.XMLHttpRequest("Request?RequestType=getDesktopIcons", "",
00115 iconRequestHandler);
00116 return;
00117 }
00118 else
00119 {
00120 Debug.log("OtsWizardConfiguration");
00121 Desktop.XMLHttpRequest("requestIcons", "sequence=" +
00122 Desktop.desktop.security, iconRequestHandler);
00123 if(!_permissions) _permissions = 1;
00124 return;
00125 }
00126
00127 }
00128
00129
00130
00131 var iconRequestHandler = function(req) {
00132
00133
00134 Desktop.desktop.icons.folders = [{},[]];
00135 Desktop.desktop.icons.iconNameToPathMap = {} ;
00136
00137 _iconsElement.innerHTML = "";
00138 _numOfIcons = 0;
00139
00140 var iconArray;
00141
00142 if(!Desktop.isWizardMode())
00143 {
00144 iconArray = Desktop.getXMLValue(req,"iconList");
00145
00146 iconArray = iconArray.split(",");
00147 }
00148 else
00149 {
00150 iconArray = req.responseText.split(",");
00151 }
00152
00153 Debug.log("icon Array split: " + iconArray);
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185 var numberOfIconFields = 7;
00186 for(var i=0;i<(iconArray.length);i+=numberOfIconFields)
00187 {
00188 if(_permissions >= iconArray[i+3])
00189 Desktop.desktop.icons.addIcon(iconArray[i],iconArray[i+1],iconArray[i+5],iconArray[i+2]|0,iconArray[i+4],iconArray[i+6]);
00190 }
00191
00192
00193 }
00194
00195
00196
00197 this.addIcon = function(subtext, altText, linkurl, uniqueWin, picfn, folderPath) {
00198
00199
00200
00201
00202
00203
00204 try
00205 {
00206 var i = linkurl.indexOf("urn:xdaq-application:lid=") + ("urn:xdaq-application:lid=").length;
00207 var isAllNumbers = true;
00208 for(i;i<linkurl.length;++i)
00209 {
00210
00211
00212 if(linkurl[i] < "0" || linkurl[i] > "9")
00213 {
00214 isAllNumbers = false;
00215 break;
00216 }
00217 }
00218 if(isAllNumbers)
00219 linkurl += "/";
00220 }
00221 catch(e)
00222 {
00223 Debug.log("An error occurred while trying to parse the window url. " +
00224 "The window path seems to be invalid: " + e, Debug.HIGH_PRIORITY);
00225 return;
00226 }
00227
00228 this.iconNameToPathMap[subtext] = [linkurl,uniqueWin];
00229
00230 var iconContainer = document.createElement("div");
00231 iconContainer.setAttribute("class", "DesktopIcons-iconContainer");
00232
00233 var link;
00234 var div;
00235
00236
00237
00238
00239
00240
00241
00242
00243 var folderSplit = folderPath.split('/');
00244 var rootFolderIndex;
00245 var folderPtr;
00246 var folders = this.folders;
00247 for(var i=0;i<folderSplit.length;++i)
00248 {
00249 if(folderSplit[i] == "") continue;
00250
00251 if(folderPtr === undefined)
00252 folderPtr = folders;
00253
00254
00255 if(folderPtr[0][folderSplit[i]] === undefined)
00256 {
00257
00258 folderPtr[0][folderSplit[i]] = [{},[]];
00259
00260 if(folderPtr == folders &&
00261 rootFolderIndex === undefined)
00262 rootFolderIndex = folderSplit[i];
00263 }
00264
00265 folderPtr = folderPtr[0][folderSplit[i]];
00266 }
00267
00268
00269 if(folderPtr !== undefined)
00270 {
00271 Debug.log("folderPtr.length = " + folderPtr.length);
00272
00273
00274 folderPtr[1].push([subtext, altText, linkurl, uniqueWin, picfn]);
00275 console.log(folders);
00276
00277
00278
00279 if(rootFolderIndex !== undefined)
00280 {
00281
00282 Debug.log("folderPath = " + folderPath);
00283 Debug.log("rootFolderIndex = " + rootFolderIndex);
00284
00285
00286 subtext = rootFolderIndex;
00287 altText = "F";
00288 linkurl = "folder";
00289 uniqueWin = 1;
00290 picfn = "icon-Folder.png";
00291 }
00292 else
00293 return;
00294 }
00295
00296
00297
00298
00299
00300
00301
00302 link = document.createElement("a");
00303 link.setAttribute("class", "DesktopIcons-iconLink");
00304 link.title = subtext;
00305
00306
00307 if(linkurl == "folder")
00308 {
00309 var iconsObj = this;
00310 link.addEventListener("click", function(e) {
00311 iconsObj.openFolder(
00312 e.clientX-this.parentNode.parentNode.offsetLeft,
00313 e.clientY-this.parentNode.parentNode.offsetTop,
00314 subtext);
00315 }, false);
00316 }
00317 else
00318 {
00319 link.addEventListener("click", function(e) {
00320 Desktop.desktop.addWindow(subtext,"",linkurl,uniqueWin);
00321 }, false);
00322 }
00323
00324 div = document.createElement("div");
00325 div.setAttribute("class", "DesktopIcons-iconDiv");
00326 div.style.width = _defaultIconWidth + "px";
00327 div.style.height = _defaultIconHeight + "px";
00328 div.style.marginLeft = (_defaultIconTextWidth-_defaultIconWidth-2)/2 + "px";
00329
00330
00331 if(picfn != "0" && picfn != "DEFAULT" && picfn != "")
00332 {
00333 if(picfn[0] != '/')
00334 div.style.backgroundImage = "url(/WebPath/images/iconImages/" + picfn+")";
00335 else
00336 div.style.backgroundImage = "url(" + picfn+")";
00337
00338 var div2 = document.createElement("div");
00339 div2.setAttribute("class", "DesktopIcons-iconDiv");
00340 div2.style.width = _defaultIconWidth + "px";
00341 div2.style.height = _defaultIconHeight + "px";
00342 div2.style.marginLeft = (-1) + "px";
00343 div2.style.marginTop = (-1) + "px";
00344 div.appendChild(div2);
00345 }
00346 else {
00347 div.innerHTML = "<table width='100%' height='100%'><td width='100%' height='100%' valign='middle' align='center'>"+
00348 altText+"</td></table>";
00349 }
00350
00351 link.appendChild(div);
00352 iconContainer.appendChild(link);
00353
00354
00355 link = document.createElement("a");
00356 link.setAttribute("class", "DesktopIcons-iconLink");
00357 link.title = subtext;
00358
00359 if(linkurl == "folder")
00360 {
00361 var iconsObj = this;
00362 link.addEventListener("click", function(e) {
00363 iconsObj.openFolder(
00364 e.clientX-this.parentNode.parentNode.offsetLeft,
00365 e.clientY-this.parentNode.parentNode.offsetTop,
00366 subtext);
00367 }, false);
00368 }
00369 else
00370 {
00371 link.addEventListener("click", function(e) {
00372 Desktop.desktop.addWindow(subtext,"",linkurl,uniqueWin);
00373 }, false);
00374 }
00375
00376
00377 div = document.createElement("div");
00378 div.setAttribute("class", "DesktopIcons-iconSubText");
00379 div.style.width = _defaultIconTextWidth + "px";
00380 div.style.height = _defaultIconTextHeight + "px";
00381 div.innerHTML = subtext;
00382
00383 link.appendChild(div);
00384 iconContainer.appendChild(link);
00385
00386 if(linkurl != "folder")
00387 {
00388
00389
00390
00391 iconContainer.addEventListener("mouseup", function(event) {
00392 if(_deepClickTimer)
00393 {
00394 window.clearTimeout(_deepClickTimer);
00395 _deepClickTimer = 0;
00396 }
00397 });
00398
00399 var deepClickHandler = function(event) {
00400 event.cancelBubble = true;
00401 event.preventDefault();
00402 _deepClickTimer = window.setTimeout(function() {
00403
00404 Debug.log("Create Icon Menu");
00405 var menuItems = [
00406 "Open and Maximize Window",
00407 "Open in New Browser Tab",
00408 "Open and Tile All Windows"
00409 ];
00410 var menuItemHandlers = [
00411 "Desktop.desktop.addWindow(\""+ subtext + "\",\"" + ""
00412 + "\",\"" + linkurl + "\","+uniqueWin+",2);",
00413 "Desktop.openNewBrowserTab(\""+ subtext + "\",\"" + ""
00414 + "\",\"" + linkurl + "\","+uniqueWin+");",
00415 "Desktop.desktop.addWindow(\""+ subtext + "\",\"" + ""
00416 + "\",\"" + linkurl + "\","+uniqueWin+",1);",
00417 ];
00418 Debug.log("createEditTableMenu()");
00419 SimpleContextMenu.createMenu(
00420 menuItems,
00421 menuItemHandlers,
00422 "DesktopIconContextMenu",
00423 event.pageX-1,event.pageY-1,
00424 Desktop.desktop.dashboard.getDefaultDashboardColor(),
00425 "white"
00426 );
00427
00428 },500);
00429
00430 };
00431
00432
00433
00434
00435
00436
00437
00438
00439 iconContainer.addEventListener("mousedown", deepClickHandler);
00440 }
00441
00442 _iconsElement.appendChild(iconContainer);
00443
00444 ++_numOfIcons;
00445
00446
00447 if(_numOfIcons > 1) {
00448 var cdArr = _iconsElement.getElementsByClassName("iconsClearDiv");
00449
00450 while(cdArr.length) cdArr[0].parentNode.removeChild(cdArr[0]);
00451
00452 var newLine = Math.ceil((-1 + Math.sqrt(_numOfIcons*8+1))/2);
00453 var newLineOff = newLine;
00454
00455 var currChild = _iconsElement.childNodes[0];
00456 for(var i=0;i<_numOfIcons;++i) {
00457 if(i == newLine) {
00458 div = document.createElement("div");
00459 div.setAttribute("id", "clearDiv");
00460 div.setAttribute("class", "iconsClearDiv");
00461 _iconsElement.insertBefore(div,currChild);
00462 newLine += --newLineOff;
00463 }
00464 currChild = currChild.nextSibling;
00465 }
00466 }
00467 }
00468
00469
00470
00471
00472
00473
00474
00475 this.openFolder = function(x,y,folderName) {
00476
00477 this.closeFolder();
00478
00479 var div = document.createElement("div");
00480 div.setAttribute("class", "DesktopIcons-folderDiv");
00481 div.style.padding = "0 5px 5px 12px";
00482 div.style.backgroundColor = DesktopContent.getDefaultWindowColor();
00483 div.style.position = "absolute";
00484 div.style.width = (300) + "px";
00485 div.style.left = (x) + "px";
00486 div.style.top = (y) + "px";
00487
00488 div.onmouseup = function(event) {event.stopPropagation();};
00489 this.iconsElement.appendChild(div);
00490 _openFolderElement = div;
00491
00492 div = document.createElement("div");
00493
00494 div.style.height = 250 + "px";
00495 div.style.position = "relative";
00496 _openFolderElement.appendChild(div);
00497 _openFolderElement = div;
00498
00499 this.openSubFolder(folderName);
00500 }
00501
00502
00503
00504 this.openSubFolder = function(folderName) {
00505
00506
00507
00508
00509 if(folderName.indexOf("../") >= 0)
00510 {
00511 var folderSplit = _openFolderPath.split('/');
00512 var fullDepth = 0;
00513
00514 for(var i=0;i<folderSplit.length;++i)
00515 if(folderSplit[i] != "") ++fullDepth;
00516 var backPathCount = 1;
00517 while(folderName.indexOf("../",backPathCount*3) >= 0) ++backPathCount;
00518
00519 Debug.log("fullDepth " + fullDepth);
00520 Debug.log("backPathCount " + backPathCount);
00521
00522 fullDepth -= backPathCount;
00523 _openFolderPtr = this.folders;
00524 _openFolderPath = "/";
00525
00526 for(var i=0,backPathCount=0;backPathCount<fullDepth && i<folderSplit.length;++i)
00527 if(folderSplit[i] != "")
00528 {
00529 _openFolderPtr = _openFolderPtr[0][folderSplit[i]];
00530 _openFolderPath += folderSplit[i] + "/";
00531 ++backPathCount;
00532 }
00533
00534 Debug.log("_openFolderPath " + _openFolderPath);
00535 Debug.log("folderName " + folderName);
00536 }
00537 else if(folderName != ".")
00538 {
00539 _openFolderPath += "/" + folderName;
00540 if(_openFolderPtr)
00541 _openFolderPtr = _openFolderPtr[0][folderName];
00542 else
00543 _openFolderPtr = this.folders[0][folderName];
00544 }
00545
00546 Debug.log("_openFolderPath = " + _openFolderPath);
00547 console.log(_openFolderPtr);
00548
00549 if(!_openFolderPtr) {Debug.log("Should never happen??!"); return;}
00550
00551
00552 var noMultiSelect = true;
00553 var maintainPreviousSelections = false;
00554
00555
00556 var vals = [];
00557 var keys = [];
00558 var types = [];
00559 var imgURLs = [];
00560
00561
00562
00563
00564
00565 var subfolders = Object.keys(_openFolderPtr[0]);
00566 for(var i=0;i<subfolders.length;++i)
00567 {
00568 vals.push(subfolders[i]);
00569 types.push("folder");
00570 keys.push(i);
00571 imgURLs.push("/WebPath/images/iconImages/" +
00572 "icon-Folder.png");
00573 }
00574
00575
00576 for(var i=0;i<_openFolderPtr[1].length;++i)
00577 {
00578 vals.push(_openFolderPtr[1][i][0]);
00579 types.push("icon");
00580 keys.push(i);
00581
00582 if(_openFolderPtr[1][i][4] != "0" &&
00583 _openFolderPtr[1][i][4] != "DEFAULT" &&
00584 _openFolderPtr[1][i][4] != "")
00585 {
00586 imgURLs.push("/WebPath/images/iconImages/" +
00587 _openFolderPtr[1][i][4]);
00588 }
00589 else
00590 imgURLs.push("=" + _openFolderPtr[1][i][1]);
00591 }
00592
00593
00594 var str = "";
00595 var pathSplit = _openFolderPath.split("/");
00596
00597 str += "/";
00598 var navPath;
00599
00600
00601 var folderDepth = 0;
00602 for(var i=0;i<pathSplit.length;++i)
00603 if(pathSplit[i] != "") ++folderDepth;
00604 Debug.log("folderDepth " + folderDepth);
00605
00606 var subfolderCount = 0;
00607 for(var i=0;i<pathSplit.length;++i)
00608 {
00609 if(pathSplit[i] == "") continue;
00610
00611 navPath = "";
00612 for(var j=0;j<folderDepth-i;++j)
00613 navPath += "../";
00614 if(navPath == "") navPath = ".";
00615
00616
00617 Debug.log("navPath " + navPath);
00618 ++subfolderCount;
00619
00620
00621 str += "<a href='#' onclick='Desktop.desktop.icons.openSubFolder(\"" +
00622 navPath + "\");'>" +
00623 pathSplit[i] + "</a>/";
00624 Debug.log(str);
00625
00626 }
00627
00628
00629
00630 MultiSelectBox.createSelectBox(_openFolderElement,
00631 "DesktopFolderMultiSelectBox",
00632 str,
00633 vals,keys,types,
00634 "Desktop.desktop.icons.clickFolderContents",
00635 noMultiSelect,0,imgURLs,
00636 "Desktop.desktop.icons.mouseDownFolderContents",
00637 "Desktop.desktop.icons.mouseUpFolderContents");
00638 MultiSelectBox.initMySelectBoxes(!maintainPreviousSelections);
00639 }
00640
00641
00642 this.closeFolder = function() {
00643
00644 try
00645 {
00646 if(_openFolderElement)
00647 _openFolderElement.parentNode.parentNode.removeChild(_openFolderElement.parentNode);
00648 }
00649 catch(e)
00650 {
00651 Debug.log("Ignoring close folder error: " + e);
00652 }
00653 _openFolderElement = 0;
00654 _openFolderPath = "";
00655 _openFolderPtr = undefined;
00656 }
00657
00658
00659 this.clickFolderContents = function(el) {
00660
00661 var i = MultiSelectBox.getSelectedIndex(el);
00662 var selArr = MultiSelectBox.getSelectionArray(el);
00663 var val = el.textContent;
00664 var type = el.getAttribute("type-value");
00665 var key = el.getAttribute("key-value")|0;
00666
00667
00668 MultiSelectBox.dbg("Chosen element index:",i,
00669 " value:",val,
00670 " key:",key,
00671 " type:",type);
00672
00673
00674
00675 if(type == "icon")
00676 {
00677 var target = _openFolderPtr[1][key];
00678
00679 Desktop.desktop.addWindow(target[0],"",target[2],target[3]);
00680
00681 }
00682 else
00683 this.openSubFolder(val);
00684 }
00685
00686
00687
00688 this.mouseUpFolderContents = function(el,event) {
00689 if(this.deepClickTimer)
00690 {
00691 window.clearTimeout(this.deepClickTimer);
00692 this.deepClickTimer = 0;
00693 }
00694 }
00695
00696
00697
00698
00699 this.mouseDownFolderContents = function(el,event) {
00700 var i = MultiSelectBox.getSelectedIndex(el);
00701 var selArr = MultiSelectBox.getSelectionArray(el);
00702 var val = el.textContent;
00703 var type = el.getAttribute("type-value");
00704 var key = el.getAttribute("key-value")|0;
00705
00706 MultiSelectBox.dbg("mouseDownFolderContents Chosen element index:",i,
00707 " value:",val,
00708 " key:",key,
00709 " type:",type);
00710
00711 if(type != "icon") return;
00712
00713
00714
00715 var target = _openFolderPtr[1][key];
00716
00717
00718
00719
00720
00721
00722
00723 event.cancelBubble = true;
00724 event.preventDefault();
00725 this.deepClickTimer = window.setTimeout(function() {
00726
00727 Debug.log("Create Icon Menu");
00728 var menuItems = [
00729 "Open and Maximize Window",
00730 "Open in New Browser Tab",
00731 "Open and Tile All Windows"
00732 ];
00733 var menuItemHandlers = [
00734 "Desktop.desktop.addWindow(\""+ target[0] + "\",\"" + ""
00735 + "\",\"" + target[2] + "\","+target[3]+",2);",
00736 "Desktop.openNewBrowserTab(\""+ target[0] + "\",\"" + ""
00737 + "\",\"" + target[2] + "\","+target[3]+");",
00738 "Desktop.desktop.addWindow(\""+ target[0] + "\",\"" + ""
00739 + "\",\"" + target[2] + "\","+target[3]+",1);",
00740 ];
00741 Debug.log("createEditTableMenu()");
00742 SimpleContextMenu.createMenu(
00743 menuItems,
00744 menuItemHandlers,
00745 "DesktopIconContextMenu",
00746 event.pageX-1,event.pageY-1,
00747 Desktop.desktop.dashboard.getDefaultDashboardColor(),
00748 "white"
00749 );
00750
00751 },500);
00752
00753 }
00754
00755
00756
00757
00758
00759 this.iconsElement = _iconsElement = document.createElement("div");
00760 this.iconsElement.setAttribute("class", "DesktopIcons");
00761 this.iconsElement.setAttribute("id", "DesktopIcons");
00762 this.iconsElement.style.position = "absolute";
00763 this.iconsElement.style.zIndex = z;
00764
00765
00766
00767 Debug.log("Desktop Icons created",Debug.LOW_PRIORITY);
00768 }
00769
00770 }
00771
00772
00773
00774
00775
00776
00777
00778
00779
00780