Displaying Your Data With JS9
Loading a FITS File From Your Web Page
diff --git a/images/js9logo.png b/images/js9logo.png
new file mode 100644
index 00000000..c5594897
Binary files /dev/null and b/images/js9logo.png differ
diff --git a/js9-allinone.css b/js9-allinone.css
index 672aee10..f34a8472 100644
--- a/js9-allinone.css
+++ b/js9-allinone.css
@@ -1741,6 +1741,17 @@ div.JS9MenubarContainer-flat, div.JS9MenubarContainer-border {
background-color: lightblue;
}
+div.JS9Logo {
+ position: absolute;
+ right: 10px;
+ bottom: 10px;
+}
+
+img.JS9Logo {
+ width: 80;
+ height: 40;
+ border: 0px solid #d5d5d5;
+}
/* CSS for images loaded as part of the user-defined menubar */
div.JS9MenubarUserImage{
@@ -2319,6 +2330,16 @@ ul.js9demo {
margin-top: 0;
}
+.helpLogo{
+ position: absolute;
+ top: 15px;
+ right: 15px;
+}
+
+.helpContainer{
+ padding: 10px;
+}
+
/* to make wait cursor override other element cursors (e.g. fabric.js canvas) */
body.waiting, body.waiting * {
cursor: wait !important;
diff --git a/js9-allinone.js b/js9-allinone.js
index 34d8d3b4..1ec9f0e1 100644
--- a/js9-allinone.js
+++ b/js9-allinone.js
@@ -2786,10 +2786,10 @@ RAWID0:"raw0",RAWIDX:"alt",IDFMT:" (%s)",MINZOOM:.125,MAXZOOM:32,ADDZOOM:.1,CHR
a.BROWSER=function(){var a=navigator.platform,c=navigator.appName,d=navigator.userAgent,e,f=d.match(/(opera|chrome|safari|firefox|msie)\/?\s*(\.?\d+(\.\d+)*)/i);e=d.match(/version\/([\.\d]+)/i);f&&null!==e&&(f[2]=e[1]);f=f?[f[1],f[2],a]:[c,navigator.appVersion,"-?",a];f.push(/Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(d));return f}();a.PIXEL_RATIO=function(){var a=document.createElement("canvas").getContext("2d");return(window.devicePixelRatio||1)/(a.webkitBackingStorePixelRatio||a.mozBackingStorePixelRatio||
a.msBackingStorePixelRatio||a.oBackingStorePixelRatio||a.backingStorePixelRatio||1)}();a.globalOpts={helperType:"none",helperPort:2718,requireHelper:!1,allinoneHelper:!1,requireFits2Fits:!1,quietReturn:!1,useWasm:!0,allowFileWasm:!1,winType:"light",rgb:{active:!1,rim:null,gim:null,bim:null},defcolor:"#00FF00",pngisfits:!0,fits2fits:"never",fits2png:!1,prependJS9Dir:!0,dataDir:null,alerts:!0,valposTarget:null,valposWidth:"medium",internalValPos:!0,internalContrastBias:!0,containContrastBias:!1,wcsCrosshair:!1,
regionsToClipboard:!0,magnifierRegions:!0,pannerDirections:!0,htimeout:1E4,lhtimeout:1E4,ehtimeout:5E3,ehretries:10,xtimeout:18E4,extlist:"EVENTS STDEVT",imopts:"IMOPTS",imcmap:"IMCMAP",table:{xdim:4096,ydim:4096,bin:1},image:{xdim:4096,ydim:4096,bin:1},reproj:{xdim:4096,ydim:4096},reprojSwitches:"",binMode:"s",clearImageMemory:"heap",helperProtocol:location.protocol,reloadRefresh:!1,reloadRefreshReg:!0,panWithinDisplay:!1,svgBorder:!0,unremoveReg:100,maxMemory:75E7,corsURL:"params/loadcors.html",
-proxyURL:"params/loadproxy.html",loadProxy:!1,imsectionURL:"params/imsection.html",postMessage:!1,waitType:"spinner",spinColor:"#FF0000",spinOpacity:.35,resize:!0,resizeHandle:!0,resizeRedisplay:!0,cloneNewDisplay:!0,lightWinClose:"ask",regionDisplay:"lightwin",regionConfigSize:"medium",refreshDragDrop:!0,reduceMosaic:"js9",reduceRegcnts:!0,plot3d:{cube:"*:*:all",mode:"avg",areaunits:"pixels",color:"green"},copyWcsPosFormat:"$ra $dec $sys",floatPrecision:6,mouseActions:["display value/position","change contrast/bias",
-"pan the image"],touchActions:["display value/position","change contrast/bias","pan the image"],keyboardActions:{b:"toggle selected region: source/background",c:"toggle crosshair",d:"send selected region to back",e:"toggle selected region: include/exclude","M-e":"edit selected region",i:"refresh image",I:"display full image","M-i":"display selected cutouts","M-k":"toggle keyboard actions plugin",l:"toggle active shape layers","M-l":"new JS9 light window","M-m":"toggle mouse/touch plugin","M-o":"open local file",
-P:"paste regions from local clipboard",p:"paste regions to current position",u:"undo remove of region(s)","M-,":"toggle preferences plugin","M-p":"toggle preferences plugin",r:"copy selected region to clipboard",R:"copy all regions to clipboard",s:"select region",S:"select all regions","M-s":"toggle shape layers plugin","/":"copy wcs position to clipboard","?":"copy value and position to clipboard",0:"reset zoom","=":"zoom in","+":"zoom in","-":"zoom out","^":"raise region layer to top",">":"display next image",
-"<":"display previous image","delete":"remove selected region",leftArrow:"move region/position left",upArrow:"move region/position up",rightArrow:"move region/position right",downArrow:"move region/position down"},mousetouchZoom:!1,toolbarTooltips:!1,centerDivs:["JS9Menubar"],resizeDivs:["JS9Menubar","JS9Colorbar","JS9Toolbar"],pinchWait:8,pinchThresh:6,xeqPlugins:!0,extendedPlugins:!0,intensivePlugins:!1,dynamicSelect:"click",dynamicHighlight:!0,corsProxy:"https://js9.si.edu/cgi-bin/CORS-proxy.cgi",
+proxyURL:"params/loadproxy.html",loadProxy:!1,imsectionURL:"params/imsection.html",postMessage:!1,waitType:"spinner",spinColor:"#FF0000",spinOpacity:.35,resize:!0,resizeHandle:!0,resizeRedisplay:!0,cloneNewDisplay:!0,logoDisplay:!1,lightWinClose:"ask",regionDisplay:"lightwin",regionConfigSize:"medium",refreshDragDrop:!0,reduceMosaic:"js9",reduceRegcnts:!0,plot3d:{cube:"*:*:all",mode:"avg",areaunits:"pixels",color:"green"},copyWcsPosFormat:"$ra $dec $sys",floatPrecision:6,mouseActions:["display value/position",
+"change contrast/bias","pan the image"],touchActions:["display value/position","change contrast/bias","pan the image"],keyboardActions:{b:"toggle selected region: source/background",c:"toggle crosshair",d:"send selected region to back",e:"toggle selected region: include/exclude","M-e":"edit selected region",i:"refresh image",I:"display full image","M-i":"display selected cutouts","M-k":"toggle keyboard actions plugin",l:"toggle active shape layers","M-l":"new JS9 light window","M-m":"toggle mouse/touch plugin",
+"M-o":"open local file",P:"paste regions from local clipboard",p:"paste regions to current position",u:"undo remove of region(s)","M-,":"toggle preferences plugin","M-p":"toggle preferences plugin",r:"copy selected region to clipboard",R:"copy all regions to clipboard",s:"select region",S:"select all regions","M-s":"toggle shape layers plugin","/":"copy wcs position to clipboard","?":"copy value and position to clipboard",0:"reset zoom","=":"zoom in","+":"zoom in","-":"zoom out","^":"raise region layer to top",
+">":"display next image","<":"display previous image","delete":"remove selected region",leftArrow:"move region/position left",upArrow:"move region/position up",rightArrow:"move region/position right",downArrow:"move region/position down"},mousetouchZoom:!1,toolbarTooltips:!1,centerDivs:["JS9Menubar"],resizeDivs:["JS9Menubar","JS9Colorbar","JS9Toolbar"],pinchWait:8,pinchThresh:6,xeqPlugins:!0,extendedPlugins:!0,intensivePlugins:!1,dynamicSelect:"click",dynamicHighlight:!0,corsProxy:"https://js9.si.edu/cgi-bin/CORS-proxy.cgi",
simbadProxy:"https://js9.si.edu/cgi-bin/simbad-proxy.cgi",catalogs:{ras:["RA","_RAJ2000","RAJ2000"],decs:["Dec","_DEJ2000","DEJ2000"],shape:"circle",color:"yellow",width:7,height:7,radius:3.5,r1:5,r2:3.5,wcssys:"ICRS",skip:"#\n",save:!0,tooltip:"$xreg.data.ra $xreg.data.dec"},topColormaps:"grey heat cool viridis magma sls red green blue".split(" "),infoBox:"file object wcsfov wcscen wcspos impos physpos value regions progress".split(" "),infoBoxResize:!0,menuBar:"file edit view zoom scale color region wcs analysis help".split(" "),
menubarStyle:"classic",userMenus:!1,userMenuDivider:" ",imagesFileSubmenu:5,toolBar:"annulus box circle ellipse line polygon text linear log zoom+ zoom- zoom1".split(" "),syncOps:"colormap contrastbias pan regions scale wcs zoom".split(" "),syncReciprocate:!0,hiddenPluginDivs:[],separate:{layout:"auto",leftMargin:10,topMargin:10},imageTemplates:".fits,.fts,.png,.jpg,.jpeg,.fz",wcsUnits:{FK4:"sexagesimal",FK5:"sexagesimal",ICRS:"sexagesimal",galactic:"degrees",ecliptic:"degrees",linear:"degrees",
physical:"pixels",image:"pixels"},regionTemplates:".reg",sessionTemplates:".ses,.js9ses",colormapTemplates:".cmap",catalogTemplates:".cat,.tab",controlsMatchRegion:!1,internalColorPicker:!0,newWindowWidth:530,newWindowHeight:625,debug:0};a.desktopOpts={currentPath:!0,sessionPath:!0};a.imageOpts={inherit:!1,contrast:1,bias:.5,invert:!1,exp:1E3,colormap:"grey",scale:"linear",scaleclipping:"dataminmax",scalemin:Number.NaN,scalemax:Number.NaN,zscalecontrast:.25,zscalesamples:600,zscaleline:120,wcssys:"native",
@@ -3010,86 +3010,87 @@ return b};a.Image.prototype.wcs2imlen=function(b){var c,d=1;if(b){b=a.strtoscale
"lut";this.colors=c;break;case 4:this.type="sao";this.vertices=[c,d,e];break;default:a.error("colormap requires a colormap name and 1 or 3 array args")}this.source=a.inited?"user":"core";for(f=0;f
b;b++){g=this.vertices[b];
c=g.length;for(d=0;df);d++);d=0===d?g[0][1]:d===c?g[c-1][1]:(c=(g[d][1]-g[d-1][1])/(g[d][0]-g[d-1][0]))?c*(f-g[d-1][0])+g[d-1][1]:g[d][1];e[b]=255*d}break;case "lut":f=this.colors.length;b=Math.floor(b*f/d);0>b?(e[0]=255*this.colors[0][0],e[1]=255*this.colors[0][1],e[2]=255*this.colors[0][2]):b").addClass("JS9Container").css("z-index",a.ZINDEX).attr("tabindex","0").append(this.canvasjq).appendTo(this.divjq);a.globalOpts.resizeHandle&&window.hasOwnProperty("ResizeSensor")&&(this.divjq.css("resize",
-"both").css("overflow","hidden"),a.bugs.webkit_resize&&(this.owidth=parseInt(this.divjq.css("width"),10),this.oheight=parseInt(this.divjq.css("height"),10),this.divjq.css("width",this.width+a.RESIZEFUDGE).css("height",this.height+a.RESIZEFUDGE)),this.resizeSensor=new ResizeSensor(this.divjq,function(){var b=c.divjq.width(),e=c.divjq.height();a.bugs.webkit_resize&&(b-=a.RESIZEFUDGE,e-=a.RESIZEFUDGE);c.resize(b,e)}));this.context=this.canvas.getContext("2d");a.ANTIALIAS||(this.context.imageSmoothingEnabled=
-!1,this.context.webkitImageSmoothingEnabled=!1,this.context.msImageSmoothingEnabled=!1);this.tooltip=$("").attr("id","tooltip_"+this.id).addClass("JS9Tooltip").appendTo(this.divjq);this.image=null;this.pluginInstances={};this.layers={};this.initMessages();this.blendMode=!1;this.mouseActions=a.globalOpts.mouseActions.slice(0);this.touchActions=a.globalOpts.touchActions.slice(0);this.mousetouchZoom=a.globalOpts.mousetouchZoom;this.divjq.on("mouseenter",this,function(b){return a.mouseEnterCB(b)});
-this.divjq.on("mouseover",this,function(b){return a.mouseOverCB(b)});this.divjq.on("mousedown touchstart",this,function(b){return a.mouseDownCB(b)});this.divjq.on("mousemove touchmove",this,function(b){return a.mouseMoveCB(b)});this.divjq.on("mouseup touchend",this,function(b){return a.mouseUpCB(b)});this.divjq.on("mouseout",this,function(b){return a.mouseOutCB(b)});this.divjq.on("keypress",this,function(b){return a.keyPressCB(b)});this.divjq.on("keydown",this,function(b){return a.keyDownCB(b)});
-this.divjq.on("keyup",this,function(b){return a.keyUpCB(b)});this.divjq.on("wheel",this,function(b){return a.wheelCB(b)});this.divjq.on("dragenter",this,function(b){return a.dragenterCB(this.id,b)});this.divjq.on("dragover",this,function(b){return a.dragoverCB(this.id,b)});this.divjq.on("dragexit",this,function(b){return a.dragexitCB(this.id,b)});this.divjq.on("drop",this,function(b){return a.dragdropCB(this.id,b)});this.divjq.on("contextmenu",this,function(){return!1});this.addFileDialog("Load",
-a.globalOpts.imageTemplates);this.addFileDialog("RefreshImage",a.globalOpts.imageTemplates);this.addFileDialog("LoadRegions",a.globalOpts.regionTemplates);this.addFileDialog("LoadSession",a.globalOpts.sessionTemplates);this.addFileDialog("LoadColormap",a.globalOpts.colormapTemplates);this.addFileDialog("LoadCatalog",a.globalOpts.catalogTemplates);a.displays.push(this);a.DEBUG&&a.log("JS9 display: %s",this.id)};a.Display.prototype.addFileDialog=function(b,c){var d=this,e,f;b&&a.publics[b]&&(f="openLocal"+
-b+"-"+d.id,e=$("
").css("visibility","hidden").css("position","relative").css("top",-50).css("left",-50).appendTo(d.divjq),e=$("
").attr("type","file").attr("id",f).attr("multiple",!0).appendTo(e),c&&e.attr("accept",c),e.on("change",function(){var c;for(c=0;c
").addClass("JS9Container").css("z-index",a.MESSZINDEX).appendTo(this.divjq);
-this.infoArea=$("").addClass("JS9Message").appendTo(this.messageContainer);this.regionsArea=$("
").addClass("JS9Message").appendTo(this.messageContainer);this.progressArea=$("
").addClass("JS9Progress").addClass("JS9Message").appendTo(this.messageContainer);this.progressBar=$("
").addClass("JS9ProgressBar").attr("value",0).attr("max",100).attr("name","progress").appendTo(this.progressArea);try{this.messageContainer.draggable({start:function(b,c){this.oicb=a.globalOpts.internalContrastBias;
-a.globalOpts.internalContrastBias=!1},stop:function(b,c){a.globalOpts.internalContrastBias=this.oicb}})}catch(b){}return this};a.Display.prototype.displayPlugin=function(b){var c=this,d,e,f,g,h,k,l,n;if("string"===typeof b)for(d=0;d").attr("id",h).css("display","none").appendTo($(this.divjq)),$("").addClass(b.name).attr("id",l).attr("data-js9id",this.divjq.attr("id")).css("height","100%").css("width","100%").appendTo(f)),f=b.opts.winDims[0]||a.WIDTH,g=b.opts.winDims[1]||a.HEIGHT,k=b.opts.winResize?"1":"0",e=sprintf(e.format,f,g,k),f=b.opts.toolbarHTML&&0<=b.opts.toolbarHTML.search(/\$title/)?"":b.opts.winTitle||"",f+=
-sprintf(a.IDFMT,this.id),h=a.lightWin(d,"div",h,f,e),d=$("#"+d+" #"+l),n=a.instantiatePlugin(d,b,h),n.winHandle.onclose=function(){n.winHandle.hide();n.status="inactive";if(b.opts.onpluginclose)try{b.opts.onpluginclose.call(n,c.image)}catch(m){a.log("onplugincloseCB: %s [%s]\n%s",b.name,m.message,a.strace(m))}return!1},n.status="active",b.opts.onplugindisplay)try{b.opts.onplugindisplay.call(n,this.image)}catch(m){a.log("onplugindisplayCB: %s [%s]\n%s",b.name,m.message,a.strace(m))}}else if("inactive"===
-n.status){if(n.winHandle&&(n.winHandle.show(),n.status="active",b.opts.onplugindisplay))try{b.opts.onplugindisplay.call(n,this.image)}catch(m){a.log("onplugindisplayCB: %s [%s]\n%s",b.name,m.message,a.strace(m))}}else if("active"===n.status&&n.winHandle&&(n.winHandle.hide(),n.status="inactive",b.opts.onpluginclose))try{b.opts.onpluginclose.call(n,c.image)}catch(m){a.log("onplugincloseCB: %s [%s]\n%s",b.name,m.message,a.strace(m))}break;case "new":a.error("external window support for plugins not yet implemented")}};
-a.Display.prototype.resize=function(b,c,d){var e,f,g,h,k,l=function(a){a.left+=h;a.top+=k;a.setCoords()};a.globalOpts.resize||a.error("display resize not enabled");if(!b&&!c)return{width:this.width,height:this.height};if("full"===b){if(d=c,window.innerWidth&&(b=window.innerWidth),window.innerHeight)for(c=window.innerHeight,e=0;e
b||10>c)&&a.error("invalid dimension(s) passed to display resize");if(b===this.width&&c===this.height)return this;d=d||{};e=b;b=c;h=(e-this.width)/2;k=(b-this.height)/2;this.width=e;this.height=b;this.divjq.css("width",e);this.divjq.css("height",b);this.canvasjq.attr("width",e);this.canvasjq.attr("height",b);a.bugs.webkit_resize&&!this.resizing&&(this.owidth=
-Math.min(this.owidth,e),this.oheight=Math.min(this.oheight,b));0<=$.inArray("JS9Menubar",a.globalOpts.resizeDivs)&&(a.isNull(d.resizeMenubar)||d.resizeMenubar)&&(c=this.pluginInstances.JS9Menubar)&&$("#"+this.id+"Menubar").css("width",e);0<=$.inArray("JS9Toolbar",a.globalOpts.resizeDivs)&&(a.isNull(d.resizeToolbar)||d.resizeToolbar)&&(c=this.pluginInstances.JS9Toolbar)&&(c.divjq.attr("data-width",String(e)+"px"),a.Toolbar.init.call(c));0<=$.inArray("JS9Colorbar",a.globalOpts.resizeDivs)&&(a.isNull(d.resizeColorbar)||
-d.resizeColorbar)&&(c=this.pluginInstances.JS9Colorbar)&&(c.divjq.attr("data-width",String(e)+"px"),a.Colorbar.init.call(c));for(g in this.layers)this.layers.hasOwnProperty(g)&&(c=this.layers[g],"main"===c.dtype&&(c.divjq.css("width",e),c.divjq.css("height",b),c.canvasjq.attr("width",e),c.canvasjq.attr("height",b),c.canvas.setWidth(e),c.canvas.setHeight(b),c.canvas.calcOffset()));for(e=0;e=this.divjq.width()&&b.y+a.RESIZEDIST>=this.divjq.height()?!0:!1};a.Display.prototype.center=function(){var b,c,d=this.divjq,e,f;e=d.offset().top;var g=d.height(),h=$(window).height();f=d.offset().left;var d=d.width(),k=$(window).width();for(b=0;b ",b,m.width())),q.isactive&&(c+=sprintf("
",b,m.width())),c+=sprintf("
",b,m.width()-B,m.height()-B),u.isactive&&(c+=sprintf("",b,m.width()))),
-"auto"===g&&x+r*(z+.5)>window.innerWidth&&(w++,z=0),d=sprintf("width=%s,height=%s,top=%s,left=%s,resize=1,scolling=1",r,v,p+(v+k+l)*w,x+(r+h+n)*z),"auto"===g||"horizontal"===g?z++:"vertical"===g&&w++);return{id:b,html:c,winopts:d}},G=function(g){var h,k;h=f++;g.length>h?(h="number"===typeof g[h]?a.images[g[h]]:g[h])&&h.display===c?(h.displayImage("all"),void 0===d?(d=h.display.id,E(d,b),G(g)):(e="string"===typeof b.idbase?k=b.idbase+A++:d.replace(C,"")+"_sep"+a.uniqueID(),y[e]=h,$("#dhtmlwindowholder").arrive("#"+
-e,{onceOnly:!0},function(){k=$(this).attr("id");window.setTimeout(function(){y[k].moveToDisplay(k);G(g)},0)}),h=H(d,e),k&&(h.id=k),a.LoadWindow(null,{id:h.id},"light",h.html,h.winopts))):G(g):a.globalOpts.extendedPlugins&&c.image&&c.image.xeqPlugins("image","onseparatedisplay")};if("string"===typeof b)try{b=JSON.parse(b)}catch(F){a.error("can't parse separate opts: "+b,F)}b=b||{};G(b.images||a.images)};a.Display.prototype.nextImage=function(b){var c,d,e;b=b||1;if(this.image){e=this.image.pos;for(c=
-0;c=a.images.length&&(d=0),0>d&&(d=a.images.length-1),a.images[d].display!==this);d+=b);c!==d&&(b=a.images[d],b.displayImage("all"),b.refreshLayers(),b.display.clearMessage(),e&&(e=b.displayToImagePos(e),b.valpos=null,b.valpos=b.updateValpos(e,!0)));return this}};a.Display.prototype.loadSession=function(b,c){var d=this,e={},f,g,h=function(b){var c,f,h,k,l,n=function(){var c=this.canvas.getObjects();c&&"undefined"!==typeof c.length&&
-(b.layers[this.layerName].nshape=c.length+1);a.Fabric.updateChildren(this,null,"objects");b.refreshLayers()};l=e[b.file]||{};l.blend&&(b.blend=$.extend(!0,{},l.blend));l.wcsim&&(b.wcsim=a.lookupImage(l.wcsim));if(l.layers&&l.layers.length)for(c=0;cc.search(/\[struct stat="OK"/)&&(a.waiting(!1),k(),(d=c.match(/msg="(.*)"/))&&d[1]?a.error(d[1]+" (from "+b+")"):a.error(c||"unknown "+b+" failure"))},n=function(b,c){var d;c=c||{};d=$.extend(!0,{},c);!1!==c.waiting&&a.waiting(!0,h);d.display=h.id;a.checkNew(new a.Image(b,d));a.waiting(!1)},m=function(){var b;if(c.verbose||1 %s",h,r,x),h=a.reproject(h,x,z,u),l("mProjectPP",h));a.vfile(y,e);h=a.imgtbl(y,".",w,"");l("mImgtbl",h);a.vsize(w)||
-a.error("no FITS files were added to output table for mosaic");m("create mosaic: %s",A);h=a.madd(w,z,A,"");l("mAdd",h);k();y=$.extend(!0,{},a.fits.options,c);y.image={xdim:0,ydim:0};y.file=A;a.fits.handleFITSFile(A,y,n)},a.SPINOUT);return this};a.Command=function(b){for(var c in b)b.hasOwnProperty(c)&&(this[c]=b[c]);b.name||a.error("command has no name");b.get||b.set||a.error("command requires get and/or set routine");a.commands.push(this);1"+a.helper.pageid),b):sprintf("notConnected %s",a.helper.type)};a.Helper.prototype.connect=function(b){var c=a.globalOpts.ehretries,d=a.globalOpts.ehtimeout,e=this,f=function(b,c,d){e.connected=!1;e.helper=!1;e.ready=!0;$(document).trigger("JS9:helperReady",
-{type:"socket.io",status:"error"});c=c||"timeout";d&&"timeout"!==d||(d="or connection refused");d===c&&(c="");"error"===d&&(d="is the helper running?");a.globalOpts.requireHelper?a.error("helper connect error: "+c+" "+d):a.DEBUG&&a.log(sprintf("JS9 helper connect error: %s (%s)",c,d))},g=function(b){$.ajax({url:b,dataType:"script",timeout:a.globalOpts.htimeout,success:function(){var b={reconnection:!0,reconnectionDelay:1E3,reconnectionDelayMax:1E4,reconnectionAttempts:100,timeout:a.globalOpts.htimeout};
-"undefined"===typeof io?f(null,"socket io object is undefined",null):(e.socket=io.connect(e.url,b),e.socket.on("connect",function(){var b,c;e.connected=!0;e.helper=!0;c=[];for(b=0;b").addClass("JS9Container").css("z-index",0).appendTo(d);
-f.canvasjq=$("").addClass("JS9Layer").attr("id",e).attr("width",d.css("width")).attr("height",d.css("height")).appendTo(f.divjq);a.bugs.webkit_resize&&"main"===f.dtype&&f.canvasjq.attr("width",this.width).attr("height",this.height);f.canvas=new fabric.Canvas(f.canvasjq[0]);f.canvas.renderOnAddRemove=!1;f.canvas.preserveObjectStacking=!0;f.opts.movable?(f.opts.lockMovementX=!1,f.opts.lockMovementY=!1,f.opts.selectable=!0,f.opts.evented=!0):!1===f.opts.movable&&(f.opts.lockMovementX=!0,f.opts.lockMovementY=
-!0,f.opts.selectable=!1,f.opts.evented=!1);void 0===f.opts.changeable&&void 0!==f.opts.fixinplace&&(f.opts.changeable=!f.opts.fixinplace);f.opts.changeable?(f.opts.hasControls=!0,f.opts.hasRotatingPoint=!0,f.opts.hasBorders=!0,f.opts.lockMovementX=!1,f.opts.lockMovementY=!1,f.opts.lockRotation=!1,f.opts.lockScalingX=!1,f.opts.lockScalingY=!1,f.opts.lockUniScaling=!1,f.opts.selectable=!0,f.opts.evented=!0,f.opts.usekeyboard=!0):!1===f.opts.changeable&&(f.opts.hasControls=!1,f.opts.hasRotatingPoint=
-!1,f.opts.hasBorders=!1,f.opts.lockMovementX=!0,f.opts.lockMovementY=!0,f.opts.lockRotation=!0,f.opts.lockScalingX=!0,f.opts.lockScalingY=!0,f.opts.lockUniScaling=!0,f.opts.selectable=!1,f.opts.evented=!1,f.opts.usekeyboard=!1);f.opts.selectable&&(f.opts.canvas.selection=!0);if(f.opts.onmousedown||f.opts.onmouseup||f.opts.onmousemove||f.opts.tooltip||f.opts.onmouseover||f.opts.onmouseout){f.opts.evented=!0;if(f.opts.onmousedown)f.canvas.on("mouse:down",function(c){if(f.display.image&&c.target)"main"===
-f.dtype&&(f.display.image.clickInRegion=!0,f.display.image.clickInLayer=b),f.opts.onmousedown.call(this,f.display.image,c.target.pub,c.e,c.target);else if(this._selection=this.selection)this.selection=a.specialKey(c.e)});else f.canvas.on("mouse:down",function(b){if(this._selection=this.selection)this.selection=a.specialKey(b.e)});if(f.opts.onmouseup)f.canvas.on("mouse:up",function(a){f.display.image&&a.target&&f.opts.onmouseup.call(this,f.display.image,a.target.pub,a.e,a.target);this.selection=this._selection||
-this.selection});else f.canvas.on("mouse:up",function(){this.selection=this._selection||this.selection});if(f.opts.onmousemove)f.canvas.on("mouse:move",function(a){f.display.image&&a.target&&f.opts.onmousemove.call(this,f.display.image,a.target.pub,a.e,a.target)});if(f.opts.onmouseover)f.canvas.on("mouse:over",function(a){f.display.image&&a.target&&f.opts.onmouseover.call(this,f.display.image,a.target.pub,a.e,a.target)});if(f.opts.onmouseout)f.canvas.on("mouse:out",function(a){f.display.image&&a.target&&
-f.opts.onmouseout.call(this,f.display.image,a.target.pub,a.e,a.target)});f.opts.tooltip&&(f.canvas.on("mouse:over",function(b){f.display.image&&b.target&&a.tooltip(b.target.left+b.target.width+2,b.target.top+b.target.height+2,f.opts.tooltip,f.display.image,b.target.pub,b.e,b.target)}),f.canvas.on("mouse:out",function(b){f.display.image&&b.target&&a.tooltip(b.target.left,b.target.top,null,f.display.image,b.target.pub,b.e,b.target)}))}else f.canvas.on("mouse:down",function(b){if(this._selection=this.selection)this.selection=
-a.specialKey(b.e)}),f.canvas.on("mouse:up",function(){this.selection=this._selection||this.selection});"function"===typeof f.opts.ongroupcreate&&(f.opts.canvas.selection=!0,f.opts.selectable=!0,f.canvas.on("selection:created",function(a){var b=[],c=[];f.display.image&&a.target&&"group"===a.target.type&&(a.target.forEachObject(function(a){a.pub&&(c.push(a),b.push(a.pub))}),f.opts.ongroupcreate.call(this,f.display.image,b,a.e,c))}));f.canvas.on("object:modified",function(b){var c,d,e=[],g,h;if(b.target&&
-(c=b.target,a.Fabric.updateChildren(f,c,"deltas"),f.opts.sortOverlapping&&(c.setCoords(),f.canvas.forEachObject(function(a){a!==c&&c.intersectsWithObject(a)&&(1===fabric.major_version?(g=a.getWidth(),h=a.getHeight()):(g=a.getScaledWidth(),h=a.getScaledHeight()),e.push({obj:a,siz:g*h}))}),e.length)))for(1===fabric.major_version?(g=c.getWidth(),h=c.getHeight()):(g=c.getScaledWidth(),h=c.getScaledHeight()),e.push({obj:c,siz:g*h}),e.sort(function(a,b){return a.sizb.siz?1:0}),d=e.length,
-b=0;b$.inArray(d,k)&&c.addWithUpdate(d));if(e.params.children)for(d=0;d$.inArray(g,k)&&c.addWithUpdate(g);switch(e.type){case "polyline":case "polygon":a.Fabric.removePolygonAnchors(f,
-e)}}f.canvas.renderAll()}else h(f,c)});f.canvas.on("before:selection:cleared",function(a){a.target&&g(f,a.target)});if(f.divjq.closest(a.lightOpts[a.LIGHTWIN].drag).length)if(fabric.isTouchSupported)f.divjq.on("touchstart",function(){f.canvas.calcOffset()});else f.divjq.on("mouseenter",function(){f.canvas.calcOffset()});return f}};a.Fabric.showShapeLayer=function(b,c,d){var e=this,f=0,g,h,k,l;if(h=this.getShapeLayer(b)){d=d||{};l=h.canvas;k=this.display.layers[b];if(c){d.local||(h.show=!0);h.json&&
-h.show&&l.loadFromJSON(h.json,function(){var c,d,f;a.Fabric.updateChildren(h.dlayer,null,"objects");e.resize&&(l.getObjects().forEach(function(a){a.left+=e.resize.left;a.top+=e.resize.top;a.setCoords()}),l.calcOffset());e.layers[b].opts.panzoom?(e.binning.obin=e.binning.bin,e.rgb.sect.ozoom=e.rgb.sect.zoom,e.refreshShapes(b)):l.renderAll();l.selection=h.opts.canvas.selection;h.zindex=Math.abs(h.zindex);k.divjq.css("z-index",h.zindex);for(c in e.layers)e.layers.hasOwnProperty(c)&&b!==c&&e.layers[c].show&&
-(d=e.display.layers[c],d.divjq.css("z-index")f)&&(f=d.zindex,e=b));a=e}return a};a.Fabric._parseShapeOptions=function(b,c,
-d){var e,f,g,h,k,l,n={},m={};h="main"===this.display.layers[b].dtype?this.rgb.sect.zoom:1;if(c.remove)return{remove:c.remove};m.tags=[];delete c.parent;delete c.id;if(c.tags)if("string"===typeof c.tags)for(f=c.tags.toLowerCase().split(","),b=0;b").addClass("JS9Container").css("z-index",a.ZINDEX).attr("tabindex","0").append(this.canvasjq).appendTo(this.divjq);this.iconjq=$("").addClass("JS9Logo").css("display","none").css("z-index",
+a.ZINDEX+1).appendTo(this.divjq);this.iconimgjs=$("
").addClass("JS9Logo").attr("src",a.InstallDir("images/js9logo.png")).appendTo(this.iconjq);a.globalOpts.logoDisplay&&this.iconjq.css("display","block");a.globalOpts.resizeHandle&&window.hasOwnProperty("ResizeSensor")&&(this.divjq.css("resize","both").css("overflow","hidden"),a.bugs.webkit_resize&&(this.owidth=parseInt(this.divjq.css("width"),10),this.oheight=parseInt(this.divjq.css("height"),10),this.divjq.css("width",this.width+a.RESIZEFUDGE).css("height",
+this.height+a.RESIZEFUDGE)),this.resizeSensor=new ResizeSensor(this.divjq,function(){var b=c.divjq.width(),e=c.divjq.height();a.bugs.webkit_resize&&(b-=a.RESIZEFUDGE,e-=a.RESIZEFUDGE);c.resize(b,e)}));this.context=this.canvas.getContext("2d");a.ANTIALIAS||(this.context.imageSmoothingEnabled=!1,this.context.webkitImageSmoothingEnabled=!1,this.context.msImageSmoothingEnabled=!1);this.tooltip=$("
").attr("id","tooltip_"+this.id).addClass("JS9Tooltip").appendTo(this.divjq);this.image=null;this.pluginInstances=
+{};this.layers={};this.initMessages();this.blendMode=!1;this.mouseActions=a.globalOpts.mouseActions.slice(0);this.touchActions=a.globalOpts.touchActions.slice(0);this.mousetouchZoom=a.globalOpts.mousetouchZoom;this.divjq.on("mouseenter",this,function(b){return a.mouseEnterCB(b)});this.divjq.on("mouseover",this,function(b){return a.mouseOverCB(b)});this.divjq.on("mousedown touchstart",this,function(b){return a.mouseDownCB(b)});this.divjq.on("mousemove touchmove",this,function(b){return a.mouseMoveCB(b)});
+this.divjq.on("mouseup touchend",this,function(b){return a.mouseUpCB(b)});this.divjq.on("mouseout",this,function(b){return a.mouseOutCB(b)});this.divjq.on("keypress",this,function(b){return a.keyPressCB(b)});this.divjq.on("keydown",this,function(b){return a.keyDownCB(b)});this.divjq.on("keyup",this,function(b){return a.keyUpCB(b)});this.divjq.on("wheel",this,function(b){return a.wheelCB(b)});this.divjq.on("dragenter",this,function(b){return a.dragenterCB(this.id,b)});this.divjq.on("dragover",this,
+function(b){return a.dragoverCB(this.id,b)});this.divjq.on("dragexit",this,function(b){return a.dragexitCB(this.id,b)});this.divjq.on("drop",this,function(b){return a.dragdropCB(this.id,b)});this.divjq.on("contextmenu",this,function(){return!1});this.addFileDialog("Load",a.globalOpts.imageTemplates);this.addFileDialog("RefreshImage",a.globalOpts.imageTemplates);this.addFileDialog("LoadRegions",a.globalOpts.regionTemplates);this.addFileDialog("LoadSession",a.globalOpts.sessionTemplates);this.addFileDialog("LoadColormap",
+a.globalOpts.colormapTemplates);this.addFileDialog("LoadCatalog",a.globalOpts.catalogTemplates);a.displays.push(this);a.DEBUG&&a.log("JS9 display: %s",this.id)};a.Display.prototype.addFileDialog=function(b,c){var d=this,e,f;b&&a.publics[b]&&(f="openLocal"+b+"-"+d.id,e=$("
").css("visibility","hidden").css("position","relative").css("top",-50).css("left",-50).appendTo(d.divjq),e=$("
").attr("type","file").attr("id",f).attr("multiple",!0).appendTo(e),c&&e.attr("accept",c),e.on("change",function(){var c;
+for(c=0;c
").addClass("JS9Container").css("z-index",a.MESSZINDEX).appendTo(this.divjq);this.infoArea=$("").addClass("JS9Message").appendTo(this.messageContainer);this.regionsArea=$("
").addClass("JS9Message").appendTo(this.messageContainer);this.progressArea=$("
").addClass("JS9Progress").addClass("JS9Message").appendTo(this.messageContainer);
+this.progressBar=$("
").addClass("JS9ProgressBar").attr("value",0).attr("max",100).attr("name","progress").appendTo(this.progressArea);try{this.messageContainer.draggable({start:function(b,c){this.oicb=a.globalOpts.internalContrastBias;a.globalOpts.internalContrastBias=!1},stop:function(b,c){a.globalOpts.internalContrastBias=this.oicb}})}catch(b){}return this};a.Display.prototype.displayPlugin=function(b){var c=this,d,e,f,g,h,k,l,n;if("string"===typeof b)for(d=0;d").attr("id",h).css("display","none").appendTo($(this.divjq)),$("").addClass(b.name).attr("id",l).attr("data-js9id",this.divjq.attr("id")).css("height",
+"100%").css("width","100%").appendTo(f)),f=b.opts.winDims[0]||a.WIDTH,g=b.opts.winDims[1]||a.HEIGHT,k=b.opts.winResize?"1":"0",e=sprintf(e.format,f,g,k),f=b.opts.toolbarHTML&&0<=b.opts.toolbarHTML.search(/\$title/)?"":b.opts.winTitle||"",f+=sprintf(a.IDFMT,this.id),h=a.lightWin(d,"div",h,f,e),d=$("#"+d+" #"+l),n=a.instantiatePlugin(d,b,h),n.winHandle.onclose=function(){n.winHandle.hide();n.status="inactive";if(b.opts.onpluginclose)try{b.opts.onpluginclose.call(n,c.image)}catch(m){a.log("onplugincloseCB: %s [%s]\n%s",
+b.name,m.message,a.strace(m))}return!1},n.status="active",b.opts.onplugindisplay)try{b.opts.onplugindisplay.call(n,this.image)}catch(m){a.log("onplugindisplayCB: %s [%s]\n%s",b.name,m.message,a.strace(m))}}else if("inactive"===n.status){if(n.winHandle&&(n.winHandle.show(),n.status="active",b.opts.onplugindisplay))try{b.opts.onplugindisplay.call(n,this.image)}catch(m){a.log("onplugindisplayCB: %s [%s]\n%s",b.name,m.message,a.strace(m))}}else if("active"===n.status&&n.winHandle&&(n.winHandle.hide(),
+n.status="inactive",b.opts.onpluginclose))try{b.opts.onpluginclose.call(n,c.image)}catch(m){a.log("onplugincloseCB: %s [%s]\n%s",b.name,m.message,a.strace(m))}break;case "new":a.error("external window support for plugins not yet implemented")}};a.Display.prototype.resize=function(b,c,d){var e,f,g,h,k,l=function(a){a.left+=h;a.top+=k;a.setCoords()};a.globalOpts.resize||a.error("display resize not enabled");if(!b&&!c)return{width:this.width,height:this.height};if("full"===b){if(d=c,window.innerWidth&&
+(b=window.innerWidth),window.innerHeight)for(c=window.innerHeight,e=0;e
b||10>c)&&a.error("invalid dimension(s) passed to display resize");
+if(b===this.width&&c===this.height)return this;d=d||{};e=b;b=c;h=(e-this.width)/2;k=(b-this.height)/2;this.width=e;this.height=b;this.divjq.css("width",e);this.divjq.css("height",b);this.canvasjq.attr("width",e);this.canvasjq.attr("height",b);a.bugs.webkit_resize&&!this.resizing&&(this.owidth=Math.min(this.owidth,e),this.oheight=Math.min(this.oheight,b));0<=$.inArray("JS9Menubar",a.globalOpts.resizeDivs)&&(a.isNull(d.resizeMenubar)||d.resizeMenubar)&&(c=this.pluginInstances.JS9Menubar)&&$("#"+this.id+
+"Menubar").css("width",e);0<=$.inArray("JS9Toolbar",a.globalOpts.resizeDivs)&&(a.isNull(d.resizeToolbar)||d.resizeToolbar)&&(c=this.pluginInstances.JS9Toolbar)&&(c.divjq.attr("data-width",String(e)+"px"),a.Toolbar.init.call(c));0<=$.inArray("JS9Colorbar",a.globalOpts.resizeDivs)&&(a.isNull(d.resizeColorbar)||d.resizeColorbar)&&(c=this.pluginInstances.JS9Colorbar)&&(c.divjq.attr("data-width",String(e)+"px"),a.Colorbar.init.call(c));for(g in this.layers)this.layers.hasOwnProperty(g)&&(c=this.layers[g],
+"main"===c.dtype&&(c.divjq.css("width",e),c.divjq.css("height",b),c.canvasjq.attr("width",e),c.canvasjq.attr("height",b),c.canvas.setWidth(e),c.canvas.setHeight(b),c.canvas.calcOffset()));for(e=0;e=this.divjq.width()&&b.y+a.RESIZEDIST>=this.divjq.height()?!0:!1};a.Display.prototype.center=function(){var b,c,d=this.divjq,e,f;e=d.offset().top;
+var g=d.height(),h=$(window).height();f=d.offset().left;var d=d.width(),k=$(window).width();for(b=0;b ",b,m.width())),q.isactive&&(c+=sprintf("
",
+b,m.width())),c+=sprintf("
",b,m.width()-B,m.height()-B),u.isactive&&(c+=sprintf("",b,m.width()))),"auto"===g&&x+r*(z+.5)>window.innerWidth&&(w++,z=0),d=sprintf("width=%s,height=%s,top=%s,left=%s,resize=1,scolling=1",r,v,p+(v+k+l)*w,x+(r+h+n)*z),"auto"===g||"horizontal"===g?z++:"vertical"===g&&w++);return{id:b,html:c,winopts:d}},G=function(g){var h,
+k;h=f++;g.length>h?(h="number"===typeof g[h]?a.images[g[h]]:g[h])&&h.display===c?(h.displayImage("all"),void 0===d?(d=h.display.id,E(d,b),G(g)):(e="string"===typeof b.idbase?k=b.idbase+A++:d.replace(C,"")+"_sep"+a.uniqueID(),y[e]=h,$("#dhtmlwindowholder").arrive("#"+e,{onceOnly:!0},function(){k=$(this).attr("id");window.setTimeout(function(){y[k].moveToDisplay(k);G(g)},0)}),h=H(d,e),k&&(h.id=k),a.LoadWindow(null,{id:h.id},"light",h.html,h.winopts))):G(g):a.globalOpts.extendedPlugins&&c.image&&c.image.xeqPlugins("image",
+"onseparatedisplay")};if("string"===typeof b)try{b=JSON.parse(b)}catch(F){a.error("can't parse separate opts: "+b,F)}b=b||{};G(b.images||a.images)};a.Display.prototype.nextImage=function(b){var c,d,e;b=b||1;if(this.image){e=this.image.pos;for(c=0;c=a.images.length&&(d=0),0>d&&(d=a.images.length-1),a.images[d].display!==this);d+=b);c!==d&&(b=a.images[d],b.displayImage("all"),b.refreshLayers(),b.display.clearMessage(),e&&(e=b.displayToImagePos(e),
+b.valpos=null,b.valpos=b.updateValpos(e,!0)));return this}};a.Display.prototype.loadSession=function(b,c){var d=this,e={},f,g,h=function(b){var c,f,h,k,l,n=function(){var c=this.canvas.getObjects();c&&"undefined"!==typeof c.length&&(b.layers[this.layerName].nshape=c.length+1);a.Fabric.updateChildren(this,null,"objects");b.refreshLayers()};l=e[b.file]||{};l.blend&&(b.blend=$.extend(!0,{},l.blend));l.wcsim&&(b.wcsim=a.lookupImage(l.wcsim));if(l.layers&&l.layers.length)for(c=0;cc.search(/\[struct stat="OK"/)&&(a.waiting(!1),k(),(d=c.match(/msg="(.*)"/))&&d[1]?a.error(d[1]+
+" (from "+b+")"):a.error(c||"unknown "+b+" failure"))},n=function(b,c){var d;c=c||{};d=$.extend(!0,{},c);!1!==c.waiting&&a.waiting(!0,h);d.display=h.id;a.checkNew(new a.Image(b,d));a.waiting(!1)},m=function(){var b;if(c.verbose||1 %s",h,r,x),h=a.reproject(h,x,z,u),l("mProjectPP",h));a.vfile(y,e);h=a.imgtbl(y,".",w,"");l("mImgtbl",h);a.vsize(w)||a.error("no FITS files were added to output table for mosaic");m("create mosaic: %s",A);h=a.madd(w,z,A,"");l("mAdd",h);k();y=$.extend(!0,{},a.fits.options,c);y.image={xdim:0,ydim:0};y.file=A;a.fits.handleFITSFile(A,y,n)},a.SPINOUT);
+return this};a.Command=function(b){for(var c in b)b.hasOwnProperty(c)&&(this[c]=b[c]);b.name||a.error("command has no name");b.get||b.set||a.error("command requires get and/or set routine");a.commands.push(this);1"+a.helper.pageid),b):sprintf("notConnected %s",a.helper.type)};a.Helper.prototype.connect=function(b){var c=a.globalOpts.ehretries,d=a.globalOpts.ehtimeout,e=this,f=function(b,c,d){e.connected=!1;e.helper=!1;e.ready=!0;$(document).trigger("JS9:helperReady",{type:"socket.io",status:"error"});c=c||"timeout";d&&"timeout"!==d||(d="or connection refused");d===c&&(c="");"error"===d&&(d="is the helper running?");a.globalOpts.requireHelper?
+a.error("helper connect error: "+c+" "+d):a.DEBUG&&a.log(sprintf("JS9 helper connect error: %s (%s)",c,d))},g=function(b){$.ajax({url:b,dataType:"script",timeout:a.globalOpts.htimeout,success:function(){var b={reconnection:!0,reconnectionDelay:1E3,reconnectionDelayMax:1E4,reconnectionAttempts:100,timeout:a.globalOpts.htimeout};"undefined"===typeof io?f(null,"socket io object is undefined",null):(e.socket=io.connect(e.url,b),e.socket.on("connect",function(){var b,c;e.connected=!0;e.helper=!0;c=[];
+for(b=0;b").addClass("JS9Container").css("z-index",0).appendTo(d);f.canvasjq=$("").addClass("JS9Layer").attr("id",e).attr("width",d.css("width")).attr("height",
+d.css("height")).appendTo(f.divjq);a.bugs.webkit_resize&&"main"===f.dtype&&f.canvasjq.attr("width",this.width).attr("height",this.height);f.canvas=new fabric.Canvas(f.canvasjq[0]);f.canvas.renderOnAddRemove=!1;f.canvas.preserveObjectStacking=!0;f.opts.movable?(f.opts.lockMovementX=!1,f.opts.lockMovementY=!1,f.opts.selectable=!0,f.opts.evented=!0):!1===f.opts.movable&&(f.opts.lockMovementX=!0,f.opts.lockMovementY=!0,f.opts.selectable=!1,f.opts.evented=!1);void 0===f.opts.changeable&&void 0!==f.opts.fixinplace&&
+(f.opts.changeable=!f.opts.fixinplace);f.opts.changeable?(f.opts.hasControls=!0,f.opts.hasRotatingPoint=!0,f.opts.hasBorders=!0,f.opts.lockMovementX=!1,f.opts.lockMovementY=!1,f.opts.lockRotation=!1,f.opts.lockScalingX=!1,f.opts.lockScalingY=!1,f.opts.lockUniScaling=!1,f.opts.selectable=!0,f.opts.evented=!0,f.opts.usekeyboard=!0):!1===f.opts.changeable&&(f.opts.hasControls=!1,f.opts.hasRotatingPoint=!1,f.opts.hasBorders=!1,f.opts.lockMovementX=!0,f.opts.lockMovementY=!0,f.opts.lockRotation=!0,f.opts.lockScalingX=
+!0,f.opts.lockScalingY=!0,f.opts.lockUniScaling=!0,f.opts.selectable=!1,f.opts.evented=!1,f.opts.usekeyboard=!1);f.opts.selectable&&(f.opts.canvas.selection=!0);if(f.opts.onmousedown||f.opts.onmouseup||f.opts.onmousemove||f.opts.tooltip||f.opts.onmouseover||f.opts.onmouseout){f.opts.evented=!0;if(f.opts.onmousedown)f.canvas.on("mouse:down",function(c){if(f.display.image&&c.target)"main"===f.dtype&&(f.display.image.clickInRegion=!0,f.display.image.clickInLayer=b),f.opts.onmousedown.call(this,f.display.image,
+c.target.pub,c.e,c.target);else if(this._selection=this.selection)this.selection=a.specialKey(c.e)});else f.canvas.on("mouse:down",function(b){if(this._selection=this.selection)this.selection=a.specialKey(b.e)});if(f.opts.onmouseup)f.canvas.on("mouse:up",function(a){f.display.image&&a.target&&f.opts.onmouseup.call(this,f.display.image,a.target.pub,a.e,a.target);this.selection=this._selection||this.selection});else f.canvas.on("mouse:up",function(){this.selection=this._selection||this.selection});
+if(f.opts.onmousemove)f.canvas.on("mouse:move",function(a){f.display.image&&a.target&&f.opts.onmousemove.call(this,f.display.image,a.target.pub,a.e,a.target)});if(f.opts.onmouseover)f.canvas.on("mouse:over",function(a){f.display.image&&a.target&&f.opts.onmouseover.call(this,f.display.image,a.target.pub,a.e,a.target)});if(f.opts.onmouseout)f.canvas.on("mouse:out",function(a){f.display.image&&a.target&&f.opts.onmouseout.call(this,f.display.image,a.target.pub,a.e,a.target)});f.opts.tooltip&&(f.canvas.on("mouse:over",
+function(b){f.display.image&&b.target&&a.tooltip(b.target.left+b.target.width+2,b.target.top+b.target.height+2,f.opts.tooltip,f.display.image,b.target.pub,b.e,b.target)}),f.canvas.on("mouse:out",function(b){f.display.image&&b.target&&a.tooltip(b.target.left,b.target.top,null,f.display.image,b.target.pub,b.e,b.target)}))}else f.canvas.on("mouse:down",function(b){if(this._selection=this.selection)this.selection=a.specialKey(b.e)}),f.canvas.on("mouse:up",function(){this.selection=this._selection||this.selection});
+"function"===typeof f.opts.ongroupcreate&&(f.opts.canvas.selection=!0,f.opts.selectable=!0,f.canvas.on("selection:created",function(a){var b=[],c=[];f.display.image&&a.target&&"group"===a.target.type&&(a.target.forEachObject(function(a){a.pub&&(c.push(a),b.push(a.pub))}),f.opts.ongroupcreate.call(this,f.display.image,b,a.e,c))}));f.canvas.on("object:modified",function(b){var c,d,e=[],g,h;if(b.target&&(c=b.target,a.Fabric.updateChildren(f,c,"deltas"),f.opts.sortOverlapping&&(c.setCoords(),f.canvas.forEachObject(function(a){a!==
+c&&c.intersectsWithObject(a)&&(1===fabric.major_version?(g=a.getWidth(),h=a.getHeight()):(g=a.getScaledWidth(),h=a.getScaledHeight()),e.push({obj:a,siz:g*h}))}),e.length)))for(1===fabric.major_version?(g=c.getWidth(),h=c.getHeight()):(g=c.getScaledWidth(),h=c.getScaledHeight()),e.push({obj:c,siz:g*h}),e.sort(function(a,b){return a.sizb.siz?1:0}),d=e.length,b=0;b$.inArray(d,k)&&c.addWithUpdate(d));if(e.params.children)for(d=0;d$.inArray(g,k)&&c.addWithUpdate(g);switch(e.type){case "polyline":case "polygon":a.Fabric.removePolygonAnchors(f,e)}}f.canvas.renderAll()}else h(f,c)});f.canvas.on("before:selection:cleared",function(a){a.target&&
+g(f,a.target)});if(f.divjq.closest(a.lightOpts[a.LIGHTWIN].drag).length)if(fabric.isTouchSupported)f.divjq.on("touchstart",function(){f.canvas.calcOffset()});else f.divjq.on("mouseenter",function(){f.canvas.calcOffset()});return f}};a.Fabric.showShapeLayer=function(b,c,d){var e=this,f=0,g,h,k,l;if(h=this.getShapeLayer(b)){d=d||{};l=h.canvas;k=this.display.layers[b];if(c){d.local||(h.show=!0);h.json&&h.show&&l.loadFromJSON(h.json,function(){var c,d,f;a.Fabric.updateChildren(h.dlayer,null,"objects");
+e.resize&&(l.getObjects().forEach(function(a){a.left+=e.resize.left;a.top+=e.resize.top;a.setCoords()}),l.calcOffset());e.layers[b].opts.panzoom?(e.binning.obin=e.binning.bin,e.rgb.sect.ozoom=e.rgb.sect.zoom,e.refreshShapes(b)):l.renderAll();l.selection=h.opts.canvas.selection;h.zindex=Math.abs(h.zindex);k.divjq.css("z-index",h.zindex);for(c in e.layers)e.layers.hasOwnProperty(c)&&b!==c&&e.layers[c].show&&(d=e.display.layers[c],d.divjq.css("z-index")f)&&(f=d.zindex,e=b));a=e}return a};a.Fabric._parseShapeOptions=function(b,c,d){var e,f,g,h,k,l,n={},m={};h="main"===this.display.layers[b].dtype?this.rgb.sect.zoom:1;if(c.remove)return{remove:c.remove};m.tags=[];delete c.parent;delete c.id;
+if(c.tags)if("string"===typeof c.tags)for(f=c.tags.toLowerCase().split(","),b=0;b").attr("id","dhtmlwindowholder").appendTo($(document.body)).append(". "),dhtmlwindow.imagefiles=a.inline?[a.inline["images/min.gif"],a.inline["images/close.gif"],a.inline["images/restore.gif"],a.inline["images/resize.gif"]]:a.allinone?[a.allinone.min,a.allinone.close,a.allinone.restore,a.allinone.resize]:[a.InstallDir("images/min.gif"),a.InstallDir("images/close.gif"),a.InstallDir("images/restore.gif"),a.InstallDir("images/resize.gif")],
window.hasOwnProperty("Jupyter")&&$("#dhtmlwindowholder").arrive("input",function(){a.jupyterFocus($(this).parent())}));a.globalOpts.plotLibrary=a.globalOpts.plotLibrary||"flot";"plotly"!==a.globalOpts.plotLibrary||window.hasOwnProperty("Plotly")||(a.globalOpts.plotLibrary="flot");window.hasOwnProperty("JS9Prefs")&&"object"===typeof JS9Prefs?a.mergePrefs(JS9Prefs):a.PREFSFILE&&(a.loadPrefs(a.InstallDir(a.PREFSFILE),1),a.loadPrefs(a.PREFSFILE,0));a.hasOwnProperty("Regions")&&$.extend(!0,a.Regions.opts,
a.regionOpts);delete a.regionOpts;a.hasOwnProperty("Catalogs")&&$.extend(!0,a.Catalogs.opts,a.catalogOpts);delete a.catalogOpts;a.hasOwnProperty("Crosshair")&&$.extend(!0,a.Crosshair.opts,a.crosshairOpts);delete a.crosshairOpts;a.hasOwnProperty("Grid")&&$.extend(!0,a.Grid.opts,a.gridOpts);delete a.gridOpts;a.hasOwnProperty("Module")&&$.extend(!0,Module,a.emscriptenOpts);delete a.emscriptenOpts;a.globalOpts.resize||(a.globalOpts.resizeHandle=!1);void 0!==a.analOpts.prependJS9Dir&&(a.globalOpts.prependJS9Dir=
-a.analOpts.prependJS9Dir,delete a.analOpts.prependJS9Dir);void 0!==a.analOpts.dataDir&&(a.globalOpts.dataDir=a.analOpts.dataDir,delete a.analOpts.dataDir);a.BROWSER[3]&&(a.globalOpts.resizeHandle=!1);if(window.hasOwnProperty("localStorage")){try{b=localStorage.getItem("images")}catch(c){b=null}if(b){try{a.userOpts.images=JSON.parse(b)}catch(c){}a.userOpts.images&&$.extend(!0,a.imageOpts,a.userOpts.images)}try{b=localStorage.getItem("regions")}catch(c){b=null}if(b){try{a.userOpts.regions=JSON.parse(b)}catch(c){}a.userOpts.regions&&
-$.extend(!0,a.Regions.opts,a.userOpts.regions)}try{b=localStorage.getItem("fits")}catch(c){b=null}if(b)try{a.userOpts.fits=JSON.parse(b)}catch(c){}try{b=localStorage.getItem("displays")}catch(c){b=null}if(b){try{a.userOpts.displays=JSON.parse(b)}catch(c){}a.userOpts.displays&&$.extend(!0,a.globalOpts,a.userOpts.displays)}}a.DEBUG=a.DEBUG||a.globalOpts.debug||0;$("div.JS9").each(function(){a.checkNew(new a.Display($(this)))});if(window.Worker&&!a.allinone)try{a.worker=new a.WebWorker(a.InstallDir(a.WORKERFILE))}catch(c){}a.allinone?
-a.initFITS():a.initEmscripten();a.helper=new a.Helper;window.addEventListener("message",function(b){var c,e=b.data;b=b.origin||b.originalEvent.origin;"null"===b&&(b="unknown");if(a.globalOpts.postMessage){if("string"===typeof e)try{c=JSON.parse(e)}catch(f){a.error("can't parse msg: "+e,f)}else"object"===typeof e?c=e:a.error("invalid msg from postMessage");a.msgHandler(c,function(a,b,d,e){e=e||{};parent.postMessage({cmd:c.cmd,res:{name:e.name,rtype:e.rtype,rdata:a,stdout:a,stderr:b,errcode:d}},"*")})}else a.DEBUG&&
-(b=sprintf("JS9 ignoring postMessage, origin: %s",b),b="string"===typeof e?b+sprintf(" data: %s",e):"object"===typeof e?b+sprintf(" obj: %s",JSON.stringify(Object.keys(e))):b+sprintf(" typeof: %s",typeof e),a.log(b))},!1);window.hasOwnProperty("ImageFilters")&&(a.ImageFilters=ImageFilters);a.initColormaps();a.initCommands();a.initAnalysis();a.RegisterPlugin(a.MouseTouch.CLASS,a.MouseTouch.NAME,a.MouseTouch.init,{menuItem:"Mouse/Touch",onplugindisplay:a.MouseTouch.init,help:"help/mousetouch.html",
-winTitle:"Mouse/Touch Actions",winResize:!0,winDims:[a.MouseTouch.WIDTH,a.MouseTouch.HEIGHT]});a.RegisterPlugin(a.Regions.CLASS,a.Regions.NAME,a.Regions.init,{divArgs:["regions"],winDims:[0,0]});a.RegisterPlugin(a.Crosshair.CLASS,a.Crosshair.NAME,a.Crosshair.init,{onmousemove:a.Crosshair.display,onkeyboardaction:a.Crosshair.keyaction,onkeyup:a.Crosshair.keyup,onimageload:a.Crosshair.create,winDims:[0,0]});a.RegisterPlugin(a.Grid.CLASS,a.Grid.NAME,a.Grid.init,{onsetpan:a.Grid.regrid,onsetzoom:a.Grid.regrid,
-onsetwcssys:a.Grid.regrid,onsetwcsunits:a.Grid.regrid,onimageload:a.Grid.regrid,onupdateprefs:a.Grid.regrid,winDims:[0,0]});a.RegisterPlugin(a.Dysel.CLASS,a.Dysel.NAME,a.Dysel.init,{onimageload:a.Dysel.imageload,onimageclose:a.Dysel.imageclose,winDims:[0,0]});a.instantiatePlugins();a.plugins.sort(function(a,b){var c=a.opts.menuItem,d=b.opts.menuItem;return c?!d||cd?1:0:1});$(document).scrollTop(0);a.inited=!0;$(document).trigger("JS9:init")};a.parsePublicArgs=function(a){var b=null;a=Array.prototype.slice.call(a);
-var d=a[a.length-1];d&&"object"===typeof d&&d.hasOwnProperty("display")&&1===Object.keys(d).length&&(b=d.display,a.pop());return{argv:a,display:b}};a.mkPublic=function(b,c){"string"===typeof c?a.Image.prototype[c]?(a[b]=function(){var b;b=a.parsePublicArgs(arguments);var e=a.getImage(b.display);if(e)return b=e[c].apply(e,b.argv),b===e||b===e.display?a.globalOpts.quietReturn?"":"OK":b},a.publics[b]=a[b]):a.error("unknown image function for mkPublic: "+c):"function"===typeof c?(a[b]=c,a.publics[b]=
-a[b]):a.error("unsupported type for mkPublic: "+typeof c)};a.mkPublic("CloseImage","closeImage");a.mkPublic("DisplayImage","displayImage");a.mkPublic("DisplayExtension","displayExtension");a.mkPublic("DisplaySlice","displaySlice");a.mkPublic("DisplaySection","displaySection");a.mkPublic("BlendImage","blendImage");a.mkPublic("GetColormap","getColormap");a.mkPublic("SetColormap","setColormap");a.mkPublic("GetZoom","getZoom");a.mkPublic("SetZoom","setZoom");a.mkPublic("GetPan","getPan");a.mkPublic("SetPan",
-"setPan");a.mkPublic("AlignPanZoom","alignPanZoom");a.mkPublic("GetScale","getScale");a.mkPublic("SetScale","setScale");a.mkPublic("GetParam","getParam");a.mkPublic("SetParam","setParam");a.mkPublic("GetValPos","updateValpos");a.mkPublic("ImageToDisplayPos","imageToDisplayPos");a.mkPublic("DisplayToImagePos","displayToImagePos");a.mkPublic("ImageToLogicalPos","imageToLogicalPos");a.mkPublic("LogicalToImagePos","logicalToImagePos");a.mkPublic("GetWCSUnits","getWCSUnits");a.mkPublic("SetWCSUnits","setWCSUnits");
-a.mkPublic("GetWCS","getWCS");a.mkPublic("SetWCS","setWCS");a.mkPublic("GetWCSSys","getWCSSys");a.mkPublic("SetWCSSys","setWCSSys");a.mkPublic("ShowShapeLayer","showShapeLayer");a.mkPublic("ActiveShapeLayer","activeShapeLayer");a.mkPublic("ToggleShapeLayers","toggleShapeLayers");a.mkPublic("AddShapes","addShapes");a.mkPublic("RemoveShapes","removeShapes");a.mkPublic("GetShapes","getShapes");a.mkPublic("ChangeShapes","changeShapes");a.mkPublic("DisplayCoordGrid","displayCoordGrid");a.mkPublic("Print",
-"print");a.mkPublic("SavePNG","savePNG");a.mkPublic("SaveJPEG","saveJPEG");a.mkPublic("SaveFITS","saveFITS");a.mkPublic("UploadFITSFile","uploadFITSFile");a.mkPublic("CountsInRegions","countsInRegions");a.mkPublic("RadialProfile","radialProfile");a.mkPublic("Plot3D","plot3d");a.mkPublic("RunAnalysis","runAnalysis");a.mkPublic("RawDataLayer","rawDataLayer");a.mkPublic("GaussBlurData","gaussBlurData");a.mkPublic("ImarithData","imarithData");a.mkPublic("RotateData","rotateData");a.mkPublic("ReprojectData",
-"reprojectData");a.mkPublic("ShiftData","shiftData");a.mkPublic("FilterRGBImage","filterRGBImage");a.mkPublic("MoveToDisplay","moveToDisplay");a.mkPublic("LookupImage",function(b){var c=a.parsePublicArgs(arguments);return a.lookupImage(c.argv[0],c.display)});a.mkPublic("LookupDisplay",function(b,c){var d=a.parsePublicArgs(arguments);return a.lookupDisplay(d.argv[0]||d.display,d.argv[1])});a.mkPublic("RenameDisplay",function(b,c){var d;d=a.parsePublicArgs(arguments);switch(d.argv.length){case 0:return;
-case 1:c=d.display;b=d.argv[0];break;default:c=d.argv[0],b=d.argv[1]}(d=a.lookupDisplay(c))&&d.id&&(c=d.id,d.oid||(d.oid=c),d.id=b,a.helper.send("renameDisplay",{odisplay:c,ndisplay:d.id}))});a.mkPublic("CloseDisplay",function(b){var c,d;c=a.parsePublicArgs(arguments);b=a.lookupDisplay(c.argv[0]||c.display);for(c=a.images.length-1;0<=c;c--)d=a.images[c],d.display===b&&d.closeImage()});a.mkPublic("AddColormap",function(b,c,d,e,f){var g,h;g=a.parsePublicArgs(arguments);var k=function(b,c){var d,e;"object"!==
-typeof b&&a.error("invalid colormap object for JS9.AddColormap()");$.isArray(b)||(b=[b]);for(d=0;dd;d++)e=c[g[d]],"string"===typeof e&&(e=a.LookupImage(e)),
-e&&e.setColormap(f[d]);"true"===b?b=!0:"false"===b&&(b=!1);a.globalOpts.rgb.active=!!b;a.DisplayImage({display:h.display});return a.globalOpts.rgb.active});a.mkPublic("GetRGBMode",function(){return{active:a.globalOpts.rgb.active,rid:a.globalOpts.rgb.rim?a.globalOpts.rgb.rim.id:null,gid:a.globalOpts.rgb.gim?a.globalOpts.rgb.gim.id:null,bid:a.globalOpts.rgb.bim?a.globalOpts.rgb.bim.id:null}});a.mkPublic("SetValPos",function(b){var c=null,d=a.parsePublicArgs(arguments),e=a.getImage(d.display);e&&(b=
-d.argv[0],c=e.params.valpos,e.params.valpos=b);return c});a.mkPublic("SetImageInherit",function(b){var c=null,d=a.parsePublicArgs(arguments),e=a.getImage(d.display);e&&(b=d.argv[0],c=e.params.inherit,e.params.inherit=b);return c});a.mkPublic("GetImageInherit",function(){var b=null,c=a.parsePublicArgs(arguments);if(c=a.getImage(c.display))b=c.params.inherit;return b});a.mkPublic("Load",function(b,c){var d,e,f,g;f=a.parsePublicArgs(arguments);e="fits";b=f.argv[0];c=f.argv[1];if(b){f=f.display?f.display:
-0");!f||0<$("#"+c.clone+"Menubar").length&&!f.pluginInstances.JS9Menubar.isDynamic?e+=sprintf("",b):d&&(z-=40);e+=sprintf("
",b);!f||0<$("#"+c.clone+"Colorbar").length&&!f.pluginInstances.JS9Colorbar.isDynamic?
-(g=f&&f.pluginInstances.JS9Colorbar?sprintf("data-showTicks='%s'",f.pluginInstances.JS9Colorbar.showTicks):"",e+=sprintf("",b,g),f&&f.pluginInstances.JS9Colorbar&&!f.pluginInstances.JS9Colorbar.showTicks&&(z-=15)):d&&(z-=44);return d?(a.Dysel.retrievePlugins().length&&(w+=2,z+=2),{html:e,winopts:y[1]+String(w)+y[3]+String(z)+y[5]}):e};b=n.argv[0];c=n.argv[1];d=n.argv[2];e=n.argv[3];f=n.argv[4];if("object"===typeof c)c=
-$.extend(!0,{},c);else if("string"===typeof c)try{c=JSON.parse(c)}catch(C){c={}}else c={};d=d||"light";n=(d||"")+"win";switch(d){case "light":return c.id?(h=c.id,delete c.id):h=n+a.uniqueID(),l="d"+h,e?f=f||x.imageWin:(t=m(h,c,x.imageWin),e=t.html,f=f||t.winopts),t=sprintf("JS9 Display"+a.IDFMT,h),q=a.lightWin(l,"inline",e,t,f),q.onclose=function(){var b,c,d=[];for(b=0;b",{value:a.displays[b].id,text:a.displays[b].id}))}),l=a.lightWin(r,v,p,"Closing a light window",x.lcloseWin),$(l).data("dispid",h),$(l).data("winid",q),!1}},k=new a.Display(h),k.winid=q,a.helper.send("addDisplay",{display:h}),a.instantiatePlugins(),
-c.display=h,b&&a.Load(b,c),h;case "new":c.id?(h=c.id,delete c.id):h=n+a.uniqueID();f=f||sprintf("width=%s, height=%s",a.globalOpts.newWindowWidth,a.globalOpts.newWindowHeight);n=document.getElementsByTagName("head")[0].innerHTML;n=n.replace(/src=['"].*astroemw?\.js['"]/,"");n.match(/src=["'].*js9\.js/)||n.match(/src=["'].*js9\.min\.js/)||(n+=sprintf('<%s type="text/javascript" src="js9.min.js">%s>',"script","script"));m=e||m(h,c);e=sprintf("%s%s\n",m);window.isElectron&&(t="data:text/html,